home *** CD-ROM | disk | FTP | other *** search
/ European Smalltalk User Group 2004 September / esugcd.iso / Dolphin5 / Dolphin Smalltalk Value Edition 5.1.msi / Data1.cab / Value_Edition__Fresh_Install2 < prev    next >
Text File  |  2003-04-19  |  6MB  |  170,876 lines

  1. "19:45:24, 19 April 2003: Compressing sources...."!
  2.  
  3. Object comment:
  4. 'Object is the abstract root of the standard Smalltalk class hierarchy. It has no instance variables (indeed it must not have any), but provides behavior common to all objects.
  5.  
  6. Instance Variables:
  7.     <MUST BE NONE>
  8.  
  9. Class Variables:
  10.     _AssertionFailureSignal     <Signal> raised when assertion failures occur (see #assert:)
  11.     _DependentsRegister    <WeakIdentityDictionary> containing DependentsCollections for instances
  12.     _EventsRegister         <WeakIdentityDictionary> containing EventsCollections for instances
  13.     _FinalizeMask         <Integer> bit mask to set/reset the finalize mark of instances
  14.  
  15. The following Instance specific behaviour mask constants are held in the PoolConstantsDictionary _InstanceBehaviorMasks in order that they may be readily shared into user defined root classes.
  16.     _GetSpecialMask         <Integer> bit mask to retrieve special behavior flags of instances
  17.     _PropertyRegister         <PropertyManager> Register of instance specific information not stored in instance variables
  18.     _WeakMask         <Integer> bit mask to use to set/reset the weak mark of instances
  19.  
  20. Note: All class variables beginning with $_ are private to the implementation. This convention is adopted to avoid potential name clashes with user defined classes.
  21.  
  22. Object implements the ANSI protocol <Object> (browse the protocols-Object category).
  23.  
  24. The following messages defined in Object have optimized implementations inlined by the Compiler and cannot be overridden:
  25.     #==
  26.     #basicAt:            (overridable if subclass not indexable)
  27.     #basicAt:put:        (ditto)
  28.     #basicSize
  29.     #basicClass
  30.     #isNil
  31.     #notNil
  32. In addition any selector in Object with a ''basic'' prefix may be subject to inlining in future releases, so these should not be overridden.
  33. '!
  34. !Object class methodsFor!
  35.  
  36. _eventsRegister
  37.     "Private - Answer the register of events"
  38.  
  39.     ^_EventsRegister!
  40.  
  41. binaryReadFrom: aStream
  42.     "Answers an object read from its binary representation on aStream.
  43.     This must have been saved using Object>>binaryStoreOn:"
  44.  
  45.     ^self binaryReadFrom: aStream context: nil
  46.  
  47. !
  48.  
  49. binaryReadFrom: aStream context: anObject
  50.     "Answers an object read from its binary representation on aStream.
  51.     This must have been saved using Object>>binaryStoreOn:"
  52.  
  53.     ^(STBInFiler on: aStream) context: anObject; next.!
  54.  
  55. fromBinaryStoreBytes: aByteArray
  56.     "Answers an object read from its binary representation in aByteArray.
  57.     This must have been created using Object>>binaryStoreBytes"
  58.  
  59.     | stream |
  60.     stream := aByteArray readStream.
  61.     ^self binaryReadFrom: stream.
  62.  
  63.  
  64. !
  65.  
  66. fromBinaryStoreBytes: aByteArray context: anObject
  67.     "Answers an object read from its binary representation in aByteArray.
  68.     This must have been created using Object>>binaryStoreBytes"
  69.  
  70.     | stream |
  71.     stream := aByteArray readStream.
  72.     ^self binaryReadFrom: stream context: anObject
  73.  
  74.  
  75. !
  76.  
  77. icon
  78.     "Answers an Icon that can be used to represent this class. Here we use a constant expression 
  79.     evaluated at compile time in order to statically bind 'self' at this position in the class hierarchy 
  80.     (i.e. to Object). This ensures that subclasses which do not override this method still answer 
  81.     'Object defaultIcon' rather than 'aSubclass defaultIcon'. Classes which provide their own default icon 
  82.     can override this method with a similar implementation perhaps with #defaultIconFrom: if the icon comes
  83.     from an ExternalResourceLibrary other than the system default."
  84.  
  85.     ^##(self) defaultIcon!
  86.  
  87. initialize
  88.     "Initialise the receiver's class variables
  89.  
  90.     _PropertyRegister    -    Register of properties (instance specific information not stored
  91.                         in instance variables) of objects
  92.     _AlreadyPrinted        -    Set of objects used to detect recursive printing (which would
  93.                         otherwise cause a stack overflow).
  94.     _AssertionFailureSignal-    Signalled on #assert: argument evaluting to false."
  95.  
  96.     _DependentsRegister isNil ifTrue: [self initializeDependencyMechanism].
  97.     _PropertyRegister isNil ifTrue: [self initializePropertyRegister].
  98.     _EventsRegister isNil ifTrue: [self initializeEventsRegister].
  99.     _AssertionFailureSignal isNil ifTrue: [
  100.         _AssertionFailureSignal := Signal resumableDescription: 'assertion failure']!
  101.  
  102. initializeDependencyMechanism
  103.     "Private - Initialize the dependency register provided for all objects
  104.     which do not have their own dependency register.
  105.     It is not advisable to send this message after booting, as it may make
  106.     the system perform unpredictably."
  107.  
  108.     _DependentsRegister := WeakIdentityDictionary newWithWeakKeys: 2!
  109.  
  110. initializeEventsRegister
  111.     "Private - Initialize the events register provided for all objects which don't
  112.     override #getEvents and #setEvents:.
  113.     It is not advisable to send this message after booting, as it may make
  114.     the system perform unpredictably."
  115.  
  116.     _EventsRegister := WeakIdentityDictionary newWithWeakKeys: 2!
  117.  
  118. initializePropertyRegister
  119.     "Private - Initialize the property register provided for all objects.
  120.     It is not advisable to send this message after booting, as it may make
  121.     the system perform unpredictably."
  122.  
  123.     _PropertyRegister := PropertyManager new!
  124.  
  125. publishedAspects
  126.     "Answer a <LookupTable> of the <Aspect>s published by the receiver.
  127.         Overridden by subclasses to add the aspects     published locally"
  128.  
  129.     ^(LookupTable new)
  130.         add: ((Aspect name: #yourself) isNullable: false);
  131.         yourself!
  132.  
  133. publishedAspectsOfInstances
  134.         "Answer a LookupTable of AspectDescriptors that describe the aspects published
  135.         by an instance of the receiver. Overridden by subclasses to add the aspects
  136.         published locally.
  137.         N.B. All #publishedAspectsOfInstances methods must be placed in either the 'must strip'
  138.         or 'development' categories so that they are removed before package pre-requisites are 
  139.         calculated by the ImageStripper, otherwise the Development System may be a pre-requisite."
  140.     
  141.         ^(LookupTable new)
  142.             add: (Aspect name: #yourself);
  143.             yourself!
  144.  
  145. publishedEvents
  146.         "Answer a Set of Symbols that describe the published events triggered
  147.         by the receiver. Overridden by subclasses to add the events published 
  148.         locally"    
  149.     
  150.         ^Set new.!
  151.  
  152. publishedEventsOfInstances
  153.         "Answer a Set of Symbols that describe the published events triggered
  154.         by instances of the receiver. Overridden by subclasses to add the events published 
  155.         locally"    
  156.     
  157.         ^Set new.! !
  158.  
  159. !Object methodsFor!
  160.  
  161. _deepCopy: copiesDictionary 
  162.     "Private - Answer a 'deep copy' of the receiver, cloning only those parts not already included
  163.     in the IdentityDictionary argument, copiesDictionary. This method implements the
  164.     body of #deepCopy, and is sufficient for all objects except those holding external 
  165.     resources (where that resource should probably be cloned too), and those where there 
  166.     are circular references from an object to a child and vice versa, and that reference must be
  167.     correctly maintained. In general you should override #deepenShallowCopies:trail: as that
  168.     is easier."
  169.  
  170.     ^copiesDictionary at: self
  171.         ifAbsent: 
  172.             [| clone |
  173.             clone := self shallowCopy postCopy.
  174.             copiesDictionary at: self put: clone.
  175.             (clone == self or: [self class isBytes]) 
  176.                 ifTrue: [clone    "no further copying required"]
  177.                 ifFalse: [self _deepenShallowCopy: clone trail: copiesDictionary]]!
  178.  
  179. _deepenShallowCopy: clone trail: copiesDictionary
  180.     "Private - Deepen the argument, clone, which is a shallow copy of the receiver.
  181.     Answer the deepened shallow copy (or another object to represent the deep copy
  182.     if you so desire - though if you do this you must update the copiesDictionary).
  183.     Generally speaking, this is the method which you should override if you need to
  184.     implement deep copy functionality, as this leaves all the boilerplate to the 
  185.     default implementation in Object."
  186.  
  187.     1 to: self class instSize + self basicSize do: [:i |
  188.         clone instVarAt: i put: ((clone instVarAt: i) _deepCopy: copiesDictionary)].
  189.     ^clone!
  190.  
  191. ~~ comparand
  192.     "Answer whether the <Object>, comparand,  is NOT identical to the receiver.
  193.     Implementation Note: This is faster than the obvious '^(self == anObject) not'
  194.     because of Compiler optimisation of #==."
  195.  
  196.     ^(self == comparand) == false!
  197.  
  198. ~= comparand
  199.     "Answer whether the <Object>, comparand, is NOT equivalent to the receiver.
  200.     Implementation Note: This is faster than '^(self = anObject) not' because
  201.     of Compiler optimisation of #==."
  202.  
  203.     ^(self = comparand) == false!
  204.  
  205. = comparand
  206.     "Answer whether the receiver and the <Object>, comparand, 
  207.     are considered equivalent (in whatever respect is appropriate for 
  208.     the class of the receiver).
  209.  
  210.     By default two objects are equal if they are identical. This is the
  211.     standard Smalltalk definition, though a better one is:
  212.         Two objects are equal if they are of the same species and
  213.         their contents are equal.
  214.     but this is a recursive definition, and is quite slow to implement in
  215.     general.
  216.  
  217.     The identity primitive should NOT fail (so there are no primitive failure
  218.     results).
  219.     
  220.     N.B. Equivalent objects (i.e. those that answer true for #=) MUST
  221.     answer the same hash value, in order that they can be stored and
  222.     retrieved successfully from hashed collections. Therefore, classes 
  223.     which reimplement either #= or #hash, will probably need to 
  224.     reimplement both."
  225.  
  226.     <primitive: 110> 
  227.     ^self primitiveFailed!
  228.  
  229. == comparand
  230.     "Answer whether the <Object>, comparand, is the same, identical, 
  231.     object as the receiver. 
  232.     
  233.     The primitive should NOT fail.
  234.     
  235.     N.B. This implementation cannot be overridden, and is never, in fact, received 
  236.     (unless #perform'd), because #== is inlined by the Compiler."
  237.  
  238.     <primitive: 110>
  239.     ^self primitiveFailed!
  240.  
  241. -> anObject
  242.     "Answer an Association with the receiver as the key, and anObject as the value"
  243.  
  244.     ^Association key: self value: anObject!
  245.  
  246. addDependent: anObject 
  247.     "Include anObject as one of the dependents of the receiver. anObject will subsequently
  248.     receive update messages when the receiver changes (see change and update).
  249.     Uses the private dependents accessing methods #[get|set]Dependents.
  250.     Note that the reference is weak, and will not prevent anObject being GC'd."
  251.  
  252.     | dependents |
  253.     (dependents := self getDependents) isNil 
  254.         ifTrue: 
  255.             [dependents := WeakArray new.
  256.             self setDependents: dependents].
  257.     ^dependents add: anObject!
  258.  
  259. allReferences
  260.     "Answer an Array containing all objects which reference the receiver.
  261.     The primitive should not fail."
  262.  
  263.     <primitive: 153>
  264.     ^self primitiveFailed!
  265.  
  266. alternateInspectorClass
  267.         "Answer the class of inspector to be used when the user requests to inspect
  268.         the receiver with the Shift key held down."
  269.     
  270.         ^BasicInspector!
  271.  
  272. asDword
  273.     "Private - Answer the receiver in a form suitable for passing/returning
  274.     as the 32-bit parameter/return value. The default is self (which
  275.     will cause the default window proc. of the window to be called
  276.     for most objects other than Integers when used as a return value)."
  277.  
  278.     ^self!
  279.  
  280. asParameter
  281.     "Answer the receiver in a form suitable for passing to an external function
  282.     primitive method (see ExternalLibrary and subclasses). The default is self."
  283.  
  284.     ^self!
  285.  
  286. aspectDisplayOn: aStream
  287.       "Private - Append a single-line textual representatin of the receiver to the <puttableStream>
  288.       argument in a form that a user viewing the receiver as the value of a published aspect would 
  289.       like to see it. Typically we use #displayOn: but some classes of object can use alternate display 
  290.       formats.
  291.       N.B. This is a development time only method that supports the PublishedAspectInspector."
  292.   
  293.       [self displayOn: aStream] on: Error do: [:ex | ex displayOn: aStream]!
  294.  
  295. aspectValue: anAspectSymbol
  296.     "Answer a ValueAspectAdapter capable of treating anAspectSymbol of the receiver
  297.     as a ValueModel"
  298.  
  299.     ^ValueAspectAdaptor subject: self aspect: anAspectSymbol!
  300.  
  301. assert: aBlock
  302.     "Evaluates aBlock and signals an error if the result is not true. The default action is to bring up a
  303.     resumable walkback."
  304.  
  305.     aBlock value ifFalse: [_AssertionFailureSignal signal]!
  306.  
  307. asValue
  308.     "Answer the receiver as a ValueModel. 
  309.     In the general case create an answer a ValueHolder onto the receiver"
  310.  
  311.     ^ValueHolder with: self!
  312.  
  313. at: index
  314.     "Answer the receiver's indexed instance variable at the argument index.
  315.     As basicAt:, but may be reimplemented.
  316.  
  317.     Primitive Failure Reasons:
  318.         0    - aSmallInteger is not a SmallInteger
  319.         1    - aSmallInteger out of bounds (not in the range 1..receiver's indexable size)."
  320.  
  321.     <primitive: 60>
  322.     ^self errorAt: index!
  323.  
  324. at: index put: value
  325.     "Replace the receivers indexed instance variable at the argument,
  326.     index, with the argument, value. Answer value.
  327.     As basicAt:put: but may be reimplemented.
  328.  
  329.     Primitive Failure Reasons:
  330.         0    - aSmallInteger is not a SmallInteger
  331.         1    - aSmallInteger out of bounds (not in the range 1..receiver's indexable size) 
  332.         2    - the argument, value, is not of a class which can be stored in the receiver
  333.             (e.g. its a non-SmallInteger and the receiver is a ByteArray)."
  334.  
  335.     <primitive: 61>
  336.     ^self errorAt: index put: value!
  337.  
  338. basicAt: aSmallInteger
  339.     "Private - Answer the receiver's indexed instance variable at the argument index.
  340.  
  341.     Primitive Failure Reasons:
  342.         0    - aSmallInteger is not a SmallInteger
  343.         1    - aSmallInteger out of bounds (not in the range 1..receiver's indexable size) 
  344.  
  345.     MUST not be reimplemented (except by classes whose instances have immediate representations
  346.     such as SmallInteger).
  347.  
  348.     Implementation Note: This message is inlined by the compiler, and is never sent 
  349.     unless directly performed, or unless the inlined code detects an error (such as
  350.     an out-of-bounds index). It is not possible to override this message successfully."
  351.  
  352.     <primitive: 49>
  353.     ^self errorAt: aSmallInteger!
  354.  
  355. basicAt: aSmallInteger put: value
  356.     "Private - Replace the receivers indexed instance variable at the argument,
  357.     index, with the argument, value. Answer value. 
  358.  
  359.     Primitive Failure Reasons:
  360.         0    - aSmallInteger is not a SmallInteger
  361.         1    - aSmallInteger out of bounds (not in the range 1..receiver's indexable size) 
  362.         2    - the argument, value, is not of a class which can be stored in the receiver
  363.             (e.g. its a non-SmallInteger and the receiver is a ByteArray).
  364.  
  365.     MUST not be reimplemented (except by classes whose instances have immediate representations
  366.     such as SmallInteger).
  367.  
  368.     Implementation Note: This message is inlined by the compiler, and is never sent 
  369.     unless directly performed, or unless the inlined code detects an error (such as
  370.     an out-of-bounds index). It is not possible to override this message successfully."
  371.  
  372.     <primitive: 50>
  373.     ^self errorAt: aSmallInteger put: value!
  374.  
  375. basicClass
  376.     "Answer a <classDescription> which is the class of the receiver.
  377.     The primitive should not fail. This message cannot be overridden
  378.     and always answers the actual class of the receiver, unlike #class
  379.     which might answer the class of a different object (e.g. in the case 
  380.     of proxies).,"
  381.  
  382.     <primitive: 111>
  383.     ^self primitiveFailed!
  384.  
  385. basicDoesNotUnderstand: failedMessage
  386.     "A message sent to the receiver was not implemented by the receiver or its superclasses 
  387.     (i.e. it has no appropriate behaviour). This message is useful for by-passing a superclass'
  388.     implementation of #doesNotUnderstand:, as it must not be overridden by subclasses.
  389.     Signal a <MessageNotUnderstood> exception corresponding to the <failedMessage> argument,
  390.     message."
  391.  
  392.     ^MessageNotUnderstood receiver: self message: failedMessage!
  393.  
  394. basicIdentityIndexOf: anElement from: start to: stop
  395.     "Private - Answer the index of the next occurrence of anElement in the receiver's indexable
  396.     variables between startIndex and stopIndex inclusive. If there are no such occurrences, answer 0.
  397.     This is intended to assist in the private implementation of some indexable Classes (esp. those which 
  398.     are Weak)    by providing a very fast means of serially searching them, but it requires knowledge of the 
  399.     internal implementation of those Classes to be used correctly, and is therefore private. It can be 
  400.     used directly for instances of classes like Array.
  401.  
  402.     Primitive fail reasons:
  403.  
  404.         0 -    start is not a SmallInteger
  405.         1 -    stop is not a SmallInteger
  406.         2 -    start and/or stop is/are outside the indexable bounds of the receiver (1..indexable size)
  407.  
  408.     The primitive does not fail if the indices are out of bounds but do not specify a valid range - this 
  409.     behavior can be useful when repetitively searching through an object as it simplifies the termination 
  410.     condition (e.g. See WeakArray>>corpsesDo:)."
  411.  
  412.     | index |
  413.     <primitive: 59>
  414.     index := start.
  415.     [index > stop] whileFalse: [
  416.         (self basicAt: index) == anElement ifTrue: [^index].
  417.         index := index + 1].
  418.     ^0!
  419.  
  420. basicInspect
  421.         "Open and answer an inspector window on the receiver.
  422.         Do not override this method."
  423.     
  424.         ^BasicInspector shellOn: self!
  425.  
  426. basicPrintOn: aStream
  427.     "Append a short developer's description of the receiver to aStream. 
  428.     Should not be overridden by subclasses."
  429.  
  430.     | name |
  431.     name := self basicClass name.
  432.     aStream 
  433.         nextPutAll: (name first isVowel ifTrue: ['an '] ifFalse: ['a ']);
  434.         nextPutAll: name!
  435.  
  436. basicPrintString
  437.     "Answer a short developer's String description of the receiver. 
  438.     Should not be overridden by subclasses"
  439.  
  440.     | aStream |
  441.     aStream := String writeStream: 16.
  442.     self basicPrintOn: aStream.
  443.     ^aStream contents!
  444.  
  445. basicResize: anInteger
  446.     "Private - Resize the receiver to accomodate anInteger indexable instance variables. 
  447.     As #resize:, but not to be overridden.
  448.  
  449.     Primitive failure reason:
  450.         0 -    anInteger is not a positive SmallInteger
  451.         1 -    the receiver is not of an indexable (variable sized) class."
  452.  
  453.     | answer |
  454.     <primitive: 101>
  455.     answer := self class new: anInteger.
  456.     1 to: anInteger do: [ :i | answer basicAt: i put: (self basicAt: i) ].
  457.     self become: answer!
  458.  
  459. basicShallowCopy
  460.     "Private - Answer a copy of the receiver which shares the receiver's instance 
  461.     variables. This implementation suffices for most objects.
  462.     The primitive does not fail."
  463.  
  464.     | class copy size |
  465.     <primitive: 155>
  466.  
  467.     class := self basicClass.
  468.     size := self basicSize.
  469.     copy := class isVariable 
  470.         ifTrue: [class basicNew: size]
  471.         ifFalse: [class basicNew].
  472.     size := size + class instSize.
  473.     1 to: size do: [:i | copy instVarAt: i put: (self instVarAt: i)].
  474.     ^copy!
  475.  
  476. basicSize
  477.     "Private - Sames as #size, but should not be overridden by subclasses (except by subclasses
  478.     whose instances have an immediate representation - e.g. SmallInteger).
  479.  
  480.     The primitive should not fail. It must be overridden for immediate objects."
  481.  
  482.     <primitive: 62>
  483.     ^self primitiveFailed!
  484.  
  485. basicYourAddress
  486.     "Private - See #yourAddress. Must not be reimplemented (except by subclasses whose
  487.     instances have immediate representations, e.g. SmallInteger)."
  488.  
  489.     <primitive: 103>
  490.     ^self primitiveFailed!
  491.  
  492. become: anObject
  493.     "Swap the instance pointers of the receiver and the argument, anObject. All variables 
  494.     in the entire system that pointed to the receiver will now point to the argument, and 
  495.     vice versa.
  496.  
  497.     Primitive failure reasons:
  498.         0    -    receiver or argument an object with an immediate representation (e.g. 
  499.                 a SmallInteger), or either is a 'permanent' objects (nil, true, false, etc).
  500.  
  501.     This method should be used with extreme care, as it has side effects for others referring
  502.     to the receiver and anObject. In particular never attempt to pass nil, true, false, etc,
  503.     as the argument, as this will almost certainly cause system failure.
  504.  
  505.     N.B. Though Dolphin is faithful to the original Smalltalk-80 specification for 
  506.     this method, and provides a two way switch as described, this is not universally true 
  507.     for all Smalltalks, so portable code should assume only a one way switch. To better
  508.     guarantee portability you should use #swappingBecome: which, hopefully, will start
  509.     to become prevalent on other platforms."
  510.  
  511.     <primitive: 72>
  512.     ^self primitiveFailed!
  513.  
  514. becomeA: aClass
  515.     "Change the class of the receiver to aClass, iff they are of the same 'shape' - 
  516.     e.g. pointer objects cannot be converted to byte objects and vice versa.
  517.     
  518.     SmallIntegers    can be mutated to new byte objects which are always of length 4.
  519.     
  520.     Primitive failure reasons:
  521.         0    -    argument, aClass, is not a Behavior
  522.         1    -    receiver's class and aClass are not the same shape.
  523.         
  524.     Consider carefully before using this method as although it may improve performance, 
  525.     it has potential side effects similar to those of #become:. As a rule of thumb, send 
  526.     #becomeA: only to objects of known ownership (e.g. temporaries). Changing the class of 
  527.     objects passed as parameters could well confuse the other objects referencing those 
  528.     parameters. 
  529.  
  530.     It is always safe to change the class of a SmallInteger, since a new object is created 
  531.     of the specified variable byte class to hold the value of the SmallInteger."
  532.  
  533.     <primitive: 102>
  534.     ^self class instanceSpec = aClass instanceSpec 
  535.         ifTrue: [ self primitiveFailed ]
  536.         ifFalse: [ self error: 'Incompatible class instance shapes' ].
  537. !
  538.  
  539. becomeAn: aClass
  540.     "Sigh, just to keep Russ (aka The Grammar Pedant) happy."
  541.  
  542.     ^self becomeA: aClass!
  543.  
  544. beFinalizable
  545.     "Mark the receiver as an object requiring finalization.
  546.     Answers the previous value of the special behavior mask."
  547.  
  548.     ^self setSpecialBehavior: ##(_GetSpecialMask bitOr: _FinalizeMask)!
  549.  
  550. beStrong
  551.     "Revoke the receiver's status as an object whose indexable pointer variables hold
  552.     only weak references to their contents. Has no effect on objects which are already strong.
  553.     Answers the previous value of the special behavior mask."
  554.  
  555.     ^self setSpecialBehavior: ##(_GetSpecialMask bitXor: (_WeakMask bitShift: 8))!
  556.  
  557. beUnfinalizable
  558.     "Mark the receiver as an object that does not require finalization. This is the default
  559.     so sending this message is only necessary to reverse a previous #beFinalizable message.
  560.     Answers the previous value of the special behavior mask."
  561.  
  562.     ^self setSpecialBehavior: ##(_GetSpecialMask bitXor: (_FinalizeMask bitShift: 8))!
  563.  
  564. beWeak
  565.     "Mark the receiver as an object whose indexable variables hold only weak references to
  566.     their contents: that is those variables contents could be garbage collected and replaced
  567.     with the corpse object. When this happens, the receiver will subsequently receive an
  568.     #elementsExpired: message informing of the number of losses it suffered. It is up to the 
  569.     receiver to take appropriate action to locate the corpses and act accordingly, e.g. by 
  570.     turning them into nils, or just updating a tally. 
  571.     Any object of any pointer class may be made weak, but there will be no useful effect 
  572.     for those instances without indexable variables, and this will increase garbage collection 
  573.     overhead. Classes which wish all their instances to be weak, should invoke this method 
  574.     against all newly created instances."
  575.  
  576.     ^self class isPointers
  577.         ifTrue: [self setSpecialBehavior: ##(_GetSpecialMask bitOr: _WeakMask)]
  578.         ifFalse: [self error: 'byte objects cannot be weak']!
  579.  
  580. binaryStoreBytes
  581.     "Answers a ByteArray representation of the receiver stored in a binary form.
  582.     This can be reconstituted using Object class>>fromBinaryStoreBytes:"
  583.  
  584.     | stream |
  585.     stream := ByteArray writeStream: 128.
  586.     self binaryStoreOn: stream.
  587.     ^stream contents!
  588.  
  589. binaryStoreOn: aStream
  590.     "Stores the receiver in a binary form on aStream that can be reconstituted using Object class>>binaryReadFrom:.
  591.     Uses the STB filing mechanism to achieve this. This implementation is sufficient for all objects
  592.     that do not need to isolate themselves from their surroundings. Sub-classes may override this
  593.     method to perform such isolation"
  594.  
  595.     (STBOutFiler on: aStream) nextPut: self.
  596. !
  597.  
  598. breakDependents
  599.     "Break the connection with all objects which have registered a dependency on the reciever."
  600.  
  601.     self setDependents: nil!
  602.  
  603. broadcast: aSymbol
  604.     "Send the argument aSymbol as a unary message to all of the receiver's dependents"
  605.  
  606.     self dependents nonCorpsesDo: [:dependent | 
  607.         dependent perform: aSymbol]!
  608.  
  609. broadcast: aSymbol with: aParameter
  610.     "Send the argument aSymbol as a keyword message with argument aParameter
  611.      to all of the receiver's dependents"
  612.  
  613.     self dependents nonCorpsesDo: [:dependent | 
  614.         dependent perform: aSymbol with: aParameter]!
  615.  
  616. browse
  617.     "Open a suitable browser onto the receiver."
  618.  
  619.     Smalltalk developmentSystem browseClass: self class!
  620.  
  621. changed
  622.     "The receiver changed in some general way; inform all the dependents by sending 
  623.     each of them an #update: message with nil as an argument."
  624.  
  625.     self changed: nil!
  626.  
  627. changed: anAspect
  628.     "The receiver changed; the change is denoted by the argument, anAspect. 
  629.     Usually the argument is a Symbol that is part of the dependent's change 
  630.     protocol, but it may be any object which gives a hint as to the type of change"
  631.  
  632.     self changed: anAspect with: nil!
  633.  
  634. changed: anAspect with: aParameter
  635.     "The receiver changed; the change is denoted by the argument, anAspect and an 
  636.     argument in aParameter."
  637.  
  638.     self dependents nonCorpsesDo: [ :dependent | 
  639.         dependent update: anAspect with: aParameter from: self]!
  640.  
  641. class
  642.     "Answer a <classDescription> which is the class of the receiver.
  643.     The primitive should not fail."
  644.  
  645.     <primitive: 111>
  646.     ^self primitiveFailed!
  647.  
  648. copy
  649.     "Answer an <Object> which is a copy of the receiver (by default a copy which shares the receiver's 
  650.     instance variables). This may be reimplemented to return a deep copy, or some other 
  651.     form of copy (e.g. a 2-level copy, or, for an identify object, the same object), whatever
  652.     is appropriate for the receiver."
  653.  
  654.     #todo "This is a fragile implementation of an ANSI method (breakable by subclasses), and hence the selectors need _ prefixes".
  655.     ^self shallowCopy postCopy.!
  656.  
  657. debugPrintString
  658.         "Answer a <readableString> whose characters are a description of the receiver 
  659.         as the debugger would want to see it."
  660.     
  661.         ^self printString
  662.     !
  663.  
  664. deepCopy
  665.     "Answer a 'deep copy' of the receiver. The 'deep copy' is a clone of the receiver,
  666.     sharing only those parts which cannot be copied (e.g. classes, nil, true, false, 
  667.     SmallIntegers, Symbols, Characters, etc).
  668.     This is sufficient for all objects except those holding external resources (where a 
  669.     true deepCopy will clone that resource too), and those where there are circular
  670.     references from an object to a child and vice versa, and that reference must be
  671.     correctly maintained. In these circumstances it is appropriate to override
  672.     #_deepCopy:, which implements the body of the method. You should generally not override
  673.     #deepCopy."
  674.  
  675.     ^self _deepCopy: IdentityDictionary new!
  676.  
  677. dependents
  678.     "Answer a Collection of the receiver's dependents. Portable code should make no assumptions
  679.     about the ordering of the Collection (or its type), and must not modify it."
  680.  
  681.     | dependents |
  682.     ^(dependents := self getDependents) isNil
  683.         ifTrue: [WeakArray new]
  684.         ifFalse: [dependents]!
  685.  
  686. displayOn: aStream
  687.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  688.     would want to see it."
  689.  
  690.     self printOn: aStream
  691. !
  692.  
  693. displayString
  694.     "Answer a String whose characters are a representation of the receiver as a user
  695.     would want to see it.
  696.     N.B. Subclasses should override #displayOn: to provide suitable implementations. 
  697.     You may also want to override #displayString for performance reasons in certain 
  698.     situations, because using a Stream can be a significant overhead where one 
  699.     simply wants the display string of a single object. However, if you override
  700.     #displayString you should also override #displayOn: to provide the same
  701.     representation."
  702.  
  703.     | stream |
  704.     stream := String writeStream: 32.
  705.     self displayOn: stream.
  706.     ^stream contents
  707. !
  708.  
  709. doesNotUnderstand: failedMessage
  710.     "Sent to the receiver by the VM when a message sent to the receiver was not implemented
  711.     by the receiver or its superclasses (i.e. it has no appropriate behaviour).
  712.     Signal a <MessageNotUnderstood> exception corresponding to the <failedMessage> argument,
  713.     message."
  714.  
  715.     ^MessageNotUnderstood receiver: self message: failedMessage
  716. !
  717.  
  718. error: signalerText
  719.     "Raise an <Error> exception reporting the error message contained in the
  720.     <readableString> argument, signalerText."
  721.  
  722.     ^Error signal: signalerText!
  723.  
  724. errorAt: index
  725.     "An at: operation on the receiver failed. Determine the cause of the error, and 
  726.     raise an appropriate error."
  727.  
  728.     ^self isIndexable 
  729.         ifTrue: [ 
  730.             index isInteger
  731.                 ifTrue: [self errorSubscriptBounds: index]
  732.                 ifFalse: [Error nonIntegerIndex: index]]
  733.         ifFalse: [Error notIndexable: self]
  734. !
  735.  
  736. errorAt: index put: value
  737.     "An at:put: operation on the receiver failed. Determine the cause of the error, and 
  738.     raise an appropriate error."
  739.  
  740.     ^self isIndexable
  741.         ifTrue: [
  742.             index isInteger
  743.                 ifTrue: [
  744.                     (index between: 1 and: self size)
  745.                         ifTrue: [self errorCantHold: value]
  746.                         ifFalse: [self errorSubscriptBounds: index]]
  747.                 ifFalse: [Error nonIntegerIndex: index]]
  748.         ifFalse: [Error notIndexable: self]
  749. !
  750.  
  751. errorCantHold: anObject
  752.     "Raise an error that the receiver cannot hold anObject (as it is of the wrong type)"
  753.  
  754.     ^self error: 'Can''t hold ', anObject printString!
  755.  
  756. errorNotFound: anObject
  757.     "Raise a NotFoundError indicating that anObject was not found 
  758.     in the receiver"
  759.  
  760.     ^NotFoundError new
  761.         receiver: self;
  762.         signalWith: anObject!
  763.  
  764. errorSubscriptBounds: anInteger
  765.     "Raise a BoundsError because anInteger is outside the subscript bounds of the receiver."
  766.  
  767.     ^BoundsError new
  768.         receiver: self;
  769.         signalWith: anInteger!
  770.  
  771. events
  772.     "Answer a Collection of the receiver's events"
  773.  
  774.     | events |
  775.     ^(events := self getEvents) isNil
  776.         ifTrue: [##(EventsCollection new)]
  777.         ifFalse: [events]!
  778.  
  779. finalize
  780.     "Perform any death-bed operations as the receiver is about to expire. The default is to
  781.     do nothing.
  782.  
  783.     It is not necessary to remove an objects finalization mark, since this has already been
  784.     done by the garbage collector. Should you wish an object to be finalized again, you must
  785.     send it #beFinalizable again (this can be done from the #finalize message, but be careful
  786.     as this may leave the object in an endless loop of finalizations, consuming system resources).
  787.  
  788.     The receiver will cease to exist at some time after its finalize method has completed (at
  789.     the very latest at the next GC), unless that method causes additional references to be 
  790.     taken to the receiver. It is a good idea to remove any circular references in an object's
  791.     finalize method to shorten its remaining life.
  792.  
  793.     Note that this method is only sent to objects which are marked as requiring
  794.     finalization (see #beFinalizable) when their last strong reference is removed. The
  795.     object will not receive the message immediately, but only on the next run of the 
  796.     Finalizer process (which runs at a low priority), and if the object has outstanding 
  797.     weak references, only then after a run of the full garbage collector (which is necessarily 
  798.     a relatively infrequent occurrence)."!
  799.  
  800. getDependents
  801.     "Private - Answer the DependentsCollection belonging to the receiver, or nil if the receiver
  802.     has no dependents. Subclasses may override this if they wish to provide their own storage
  803.     for dependents (which is more efficient)."
  804.  
  805.     ^_DependentsRegister at: self ifAbsent: []!
  806.  
  807. getEvents
  808.     "Private - Answer the EventsCollection belonging to the receiver, or nil if the receiver
  809.     has no events registered for it"
  810.  
  811.     ^_EventsRegister at: self ifAbsent: []!
  812.  
  813. getSpecialBehavior
  814.     "Private - Answer the receiver's complete special behavior mask,
  815.     useful for transferring to copies, etc."
  816.  
  817.     ^self setSpecialBehavior: _GetSpecialMask!
  818.  
  819. halt
  820.         "Bring up the Smalltalk debugger (suspending the active process) ..."
  821.     
  822.         | process |
  823.         process := Processor activeProcess.
  824.         process halt: process topFrame sender!
  825.  
  826. hash
  827.     "Answer the <integer> hash value for the receiver. By default use the identity hash
  828.     assigned at object creation time, which is temporally invariant.
  829.  
  830.     Equivalent objects (i.e. those that answer true for #=) MUST
  831.     answer the same hash value, in order that they can be stored and
  832.     retrieved successfully from hashed collections. Therefore, classes 
  833.     which reimplement either #= or #hash, will probably need to 
  834.     reimplement both.
  835.  
  836.     N.B. The primitive does not fail, but will raise an invalid memory access 
  837.     exception if called for immediate subclasses such as SmallInteger."
  838.     
  839.     <primitive: 75>
  840.     ^self primitiveFailed!
  841.  
  842. icon
  843.     "Answer an Icon representing the receiver."
  844.  
  845.     ^self class icon!
  846.  
  847. identityHash
  848.     "Answer the <integer> identity hash value for the receiver. This is
  849.     currently a 16-bit SmallInteger value, which is always positive (although
  850.     note that SmallInteger's override this implementation to answer 
  851.     themselves and hence an arbitrary object's identity hash is only 
  852.     guaranteed to be an integer). The value is a pseudo-random number 
  853.     assigned when the object is created, and it never changes (i.e. it is temporally 
  854.     invariant). Because the range is limited to 16-bits, very large collections 
  855.     hashed by identity using this value alone are likely to be slow. One could 
  856.     consider including the identityHash of the objects class e.g. 
  857.         ^((self class identityHash bitAnd: 16r3FFFFFFF) bitShift: 16) 
  858.             bitOr: self identityHash
  859.         or: <primitive: 147> which is similar.
  860.     However, this would not be safe in general, because #become: and #becomeA:
  861.     might change an object's class, (an object's class is an attribute of the object
  862.     not it's identity).
  863.  
  864.     Although this implementation is temporally invariant while an object remains
  865.     in memory, a binary filed object is re-incarnated with a different identity,
  866.     and so identity hash collections must be rebuilt or rehashed on load (the 
  867.     standard Collections do this already).
  868.  
  869.     This need not be reimplemented (except by immediate subclasses), because 
  870.     it is not possible to override #==, indeed reimplementation is jolly unwise.
  871.     
  872.     N.B. The primitive does not fail, but will raise a benign invalid memory access 
  873.     exception if called for immediate subclasses such as SmallInteger."
  874.     
  875.     <primitive: 75>
  876.     ^self primitiveFailed!
  877.  
  878. ifNil: aBlock
  879.     "If the receiver is the nil object, then answer the result of evaluating
  880.     the <niladicValuable>, aBlock, otherwise answer the receiver."
  881.  
  882.     ^self!
  883.  
  884. ifNil: nilBlock ifNotNil: notNilBlock 
  885.     "If the receiver is the nil object, then answer the result of evaluating
  886.     the <niladicValuable>, nilBlock, otherwise answer the result of
  887.     evaluating the <monadicValuable>, notNilBlock, with the
  888.     receiver as its argument."
  889.  
  890.     ^notNilBlock value: self!
  891.  
  892. ifNotNil: aBlock
  893.     "If the receiver is not the nil object, then answer the result of evaluating
  894.     the <monadicValuable>, aBlock, with the receiver as its argument, 
  895.     otherwise answer nil."
  896.  
  897.     ^aBlock value: self!
  898.  
  899. ifNotNil: notNilBlock ifNil: nilBlock 
  900.     "If the receiver is the nil object, then answer the result of evaluating
  901.     the <niladicValuable>, nilBlock, otherwise answer the result of
  902.     evaluating the <monadicValuable>, notNilBlock, with the
  903.     receiver as its argument."
  904.  
  905.     "Implementation Note: This message is normally inlined by the compiler and so
  906.     is never sent unless #perform'd."
  907.  
  908.     ^notNilBlock value: self!
  909.  
  910. initialize
  911.     "Initialise the receiver following instantiation. The default is to do nothing.
  912.     Answer the receiver."
  913.  
  914.     ^self!
  915.  
  916. inspect
  917.         "Open and answer an inspector window on the receiver.
  918.         Implementation Note: Referencing a UI class from Object like this is not to be recommended,
  919.         but this method is part of the development package."
  920.     
  921.         ^Smalltalk developmentSystem inspect: self!
  922.  
  923. inspectorClass
  924.         "Answer the class of inspector to be used when inspecting the receiver."
  925.     
  926.         ^FlipperInspector!
  927.  
  928. instVarAt: index
  929.     "Private - Answer a variable in the receiver. The numbering of the variables begins with 
  930.     named instance variables, and corresponds to the order in which the instance variables
  931.     were defined. Indexed variables have indices following those of the named instance
  932.     variables.
  933.  
  934.     Primitive failure reasons:
  935.         0    -    aSmallInteger is not a SmallInteger.
  936.         1    -    aSmallInteger is out of bounds (not in the range 1..recieiver's size)."
  937.  
  938.     <primitive: 73>
  939.     ^index isInteger
  940.         ifTrue: [self errorSubscriptBounds: index]
  941.         ifFalse: [Error nonIntegerIndex: index]!
  942.  
  943. instVarAt: index put: value
  944.     "Private - Store the argument, value, into a named variable in the receiver. The numbering 
  945.     of the variables begines with named instance variables, and corresponds to the 
  946.     order in which the instance variables were defined. Indexed variables have indices 
  947.     following those of the named instance variables.
  948.  
  949.     Primitive failure reasons:
  950.         0    -    aSmallInteger is not a SmallInteger.
  951.         1    -    aSmallInteger is out of bounds (not in the range 1..recieiver's size)
  952.         2    -    the argument, value, is a type of object which cannot be stored in
  953.                 the receiver."
  954.  
  955.     <primitive: 74>
  956.     ^index isInteger
  957.         ifTrue: [
  958.             (index between: 1 and: self class instSize + self basicSize)
  959.                 ifTrue: [self errorCantHold: value]
  960.                 ifFalse: [self errorSubscriptBounds: index]]
  961.         ifFalse: [Error nonIntegerIndex: index]
  962. !
  963.  
  964. instVarNamed: aString
  965.     ^self instVarAt: (self class indexOfInstVar: aString)!
  966.  
  967. isFinalizable
  968.     "Answer whether the receiver is marked as requiring finalization.
  969.     Finalizable objects will receive a #finalize message after the garbage
  970.     collector has determined that there are no outstanding references
  971.     to the object, however the delivery of the message is asynchronous
  972.     and an arbitrary interval may elapse before it is delivered."
  973.  
  974.     ^self getSpecialBehavior anyMask: _FinalizeMask!
  975.  
  976. isImmediate
  977.     "Private - Answer whether the receiver has an immediate representation (that is it is entirely
  978.     encoded in an object pointer, e.g. SmallIntegers. Most objects are not immediate."
  979.  
  980.     ^false
  981. !
  982.  
  983. isIndexable
  984.     "Answer whether or not the receiver has indexable instance variables (in addition
  985.     to any named instance variables), and can be accessed using #at:/#at:put:"
  986.  
  987.     ^self class isVariable!
  988.  
  989. isInteger
  990.     "Answer whether the receiver is a kind of Integer"
  991.  
  992.     ^false
  993. !
  994.  
  995. isKindOf: candidateClass
  996.     "Answer whether the receiver is an instance of the argument, candidateClass,
  997.     or one of its subclasses.
  998.     The primitive never fails, so the Smalltalk back up code is present for illustrative
  999.     purposes only. The primitive is very fast, so there is no particular reason to
  1000.     implement isXXXXXX methods instead, BUT in any case is-kind-of tests are not
  1001.     good practice. Tests should be made to see if an object provides a particular
  1002.     protocol (if necessary) rather than testing for a particular class."
  1003.  
  1004.     <primitive: 57>
  1005.     ^self class includesBehavior: candidateClass!
  1006.  
  1007. isLiteral
  1008.     "Private - Answer whether or not the receiver has a literal representation (probably its
  1009.     printString) which is directly recognised by the Compiler"
  1010.  
  1011.     ^false!
  1012.  
  1013. isMemberOf: candidateClass
  1014.     "Answer whether the receiver is an instance of the argument, 
  1015.     candidateClass."
  1016.  
  1017.     ^self class == candidateClass!
  1018.  
  1019. isNil
  1020.     "Answer whether the receiver is THE undefined (nil) object.
  1021.     N.B. This message is inlined by the compiler and cannot be overridden."
  1022.  
  1023.     ^false!
  1024.  
  1025. isString
  1026.     "Answer whether the receiver is a <String>."
  1027.  
  1028.     ^false!
  1029.  
  1030. isWeak
  1031.     "Answer whether the receiver is an object whose indexable pointer variables hold only weak references
  1032.     to their contents."
  1033.  
  1034.     ^self getSpecialBehavior anyMask: _WeakMask!
  1035.  
  1036. mustBeBoolean
  1037.     "Private - Sent to the receiver by the VM when an attempt was made to test it
  1038.     for its boolean status by a CompiledMethod, e.g:
  1039.             [1] whileTrue: [ ... ].
  1040.     By default an error is raised, but this can be overridden if appropriate,
  1041.     however overrides must return true or false to avoid causing an infinite
  1042.     loop. The conditional test which raised the error is repeated if #mustBeBoolean
  1043.     returns, and this may generate a further #mustBeBoolean messages if the return
  1044.     value is not itself a <Boolean>."
  1045.  
  1046.     ^(self error: 'Must be boolean') == true!
  1047.  
  1048. noEventsDo: aBlock
  1049.     "Evaluate aBlock while ensuring that the receiver will not trigger any events.
  1050.     Answers the result of evaluating aBlock"
  1051.  
  1052.     | events |
  1053.     events := self getEvents.
  1054.     ^
  1055.     [self setEvents: nil.
  1056.     aBlock value] ensure: [self setEvents: events]!
  1057.  
  1058. notNil
  1059.     "Answer whether the receiver is not the undefined (<nil>) object.
  1060.     N.B. This message is inlined by the compiler and cannot be overridden."
  1061.  
  1062.     ^true!
  1063.  
  1064. oneWayBecome: anObject
  1065.     "Make all references to the receiver be references to the argument (i.e. anObject replaces
  1066.     all uses of the receiver, and the receiver's identity and contents are lost). This is the 
  1067.     only form of #become: available in some Smalltalk systems. Can follow a two
  1068.     way #become: for even more mind boggling fun (to maintain one objects identity, but
  1069.     anothers value).
  1070.  
  1071.     Primitive failure reasons:
  1072.         0    -    receiver or argument an object with an immediate representation (e.g. 
  1073.                 a SmallInteger), or either is a 'permanent' objects (nil, true, false, etc).
  1074.  
  1075.     This method should be used with care, but is some what less dangerous than #become:,
  1076.     as it does not affect existing users of anObject. Currently the implementation is not
  1077.     as efficient as #become:."
  1078.  
  1079.     <primitive: 154>
  1080.     ^self primitiveFailed!
  1081.  
  1082. perform: selector
  1083.     "Send the receiver the unary message indicated by the <selector> argument,
  1084.     answering the result. 
  1085.  
  1086.     Primitive failure reasons:
  1087.         0 -    The number of arguments expected with the selector is not zero."
  1088.  
  1089.     <primitive: 83>
  1090.     ^Error perform: selector failedFor: self withArgs: Array new!
  1091.  
  1092. perform: selector with: argument1
  1093.     "Send the receiver the keyword message indicated by the arguments, answering the result. 
  1094.     The first argument selector is the <selector> of the message. The second <Object> argument, 
  1095.     argument1, is the argument of the message to be sent. 
  1096.  
  1097.     Primitive failure reasons:
  1098.         0 -    The number of arguments expected with the selector is not one."
  1099.  
  1100.     <primitive: 83>
  1101.     ^Error perform: selector failedFor: self withArgs: (Array with: argument1)!
  1102.  
  1103. perform: selector with: argument1 with: argument2
  1104.     "Send the receiver the keyword message indicated by the arguments, answering the result. 
  1105.     The first argument <selector> is the selector of the message. The other arguments <argument1>
  1106.     and <argument2>, are the argument of the message to be sent.
  1107.  
  1108.     Primitive failure reasons:
  1109.         0 -    The number of arguments expected with the selector is not two."
  1110.  
  1111.     <primitive: 83>
  1112.     ^Error perform: selector failedFor: self withArgs: (Array with: argument1 with: argument2)!
  1113.  
  1114. perform: selector with: argument1 with: argument2 with: argument3
  1115.     "Send the receiver the keyword message indicated by the arguments, answering the result. 
  1116.     The first argument selector is the <selector> of the message. The other <Object> arguments
  1117.     argument1, argument2 and argument3 are the arguments of the message to be sent. 
  1118.  
  1119.     Primitive failure reasons:
  1120.         0 -    The number of arguments expected with the selector is not three."
  1121.  
  1122.     <primitive: 83>
  1123.     ^Error perform: selector failedFor: self withArgs: (Array with: argument1 with: argument2 with: argument3)!
  1124.  
  1125. perform: selector with: argument1 with: argument2 with: argument3 with: argument4
  1126.     "Send the receiver the keyword message indicated by the arguments, answering the result. 
  1127.     The first argument selector is the <selector> of the message. The other <Object> arguments
  1128.     argument1, argument2, argument3, and argument4 are the arguments of the message to be sent. 
  1129.  
  1130.     Primitive failure reasons:
  1131.         0 -    The number of arguments expected with the selector is not four."
  1132.  
  1133.     <primitive: 83>
  1134.     ^Error perform: selector failedFor: self 
  1135.         withArgs: (Array with: argument1 with: argument2 with: argument3 with: argument4)!
  1136.  
  1137. perform: selector withArguments: arguments
  1138.     "Send the receiver the keyword message indicated by the arguments, answering the result. 
  1139.     The first argument, selector, is the <selector> of the message. The arguments of the message 
  1140.     are the elements of the <Array>, arguments. 
  1141.  
  1142.     Primitive failure reasons:
  1143.         0 -    The number of arguments expected with the selector is not the number supplied.
  1144.         1 -    arguments is not an <Array>."
  1145.  
  1146.     <primitive: 84> 
  1147.     ^Error perform: selector failedFor: self withArgs: arguments!
  1148.  
  1149. perform: aSymbol withArgumentsAt: anAddress descriptor: anExternalDescriptor 
  1150.     "Private - Send message with selector, aSymbol, to anObject,
  1151.     with arguments instantiated from memory at anAddress using the 
  1152.     the external arguments types from the typinfo in anExternalDescriptor.
  1153.     Implementation Note: For performance and consistency (with outbound external calls) 
  1154.     reasons, we use a VM supplied primitive to instantiate and push the arguments and 
  1155.     perform the message, but there is no reason that this cannot be done in Smalltalk 
  1156.     if different argument conversions are required. The standard conversions are the 
  1157.     same as those performed for return types by the external call primitive (see
  1158.     the ExternalLibrary class).
  1159.  
  1160.     Primitive Failure reasons:
  1161.         0    -    anExternalDescriptor is invalid.
  1162.         1    -    anAddress is not a valid address object (SmallInteger/byte indirection)
  1163.         2    -    the selector, aSymbol, is an immediate object (e.g. a SmallInteger)."
  1164.  
  1165.     <primitive: 114>
  1166.     ^self primitiveFailed!
  1167.  
  1168. postCopy
  1169.     "Apply any final flourish to the copy that may be required.
  1170.     This should be overridden by subclasses which provide their own
  1171.     storage (i.e. in instance variable(s)) for events/dependents in 
  1172.     order to release those (otherwise the copy will inherit them).
  1173.     
  1174.     This selector requires an underscore prefix to avoid the fragile
  1175.     base class problem in this ANSI standard class which must be
  1176.     subclassable by compliant programs."
  1177.  
  1178.     ^self!
  1179.  
  1180. primitiveFailed
  1181.     "Generate an error to the effect that a primitive has failed, including the failure code
  1182.     specified by the primitive."
  1183.  
  1184.     | proc |
  1185.     proc := Processor activeProcess.
  1186.     ^self error: 'Primitive ', proc topFrame sender method printString, ' failed (', 
  1187.                     proc primitiveFailureCode displayString, ')'!
  1188.  
  1189. printOn: target
  1190.     "Append, to the <puttableStream>, target, a string whose characters are a 
  1191.     the same as those which would result from sending a #printString
  1192.     message to the receiver.
  1193.     N.B. This is really intended for development use. #displayOn: and #displayString
  1194.     are complementary methods for generating strings for presentation to an
  1195.     end-user."
  1196.  
  1197.     | name |
  1198.     name := self class name.
  1199.     target 
  1200.         nextPutAll: (name first isVowel ifTrue: ['an '] ifFalse: ['a ']);
  1201.         nextPutAll: name!
  1202.  
  1203. printString
  1204.     "Answer a <readableString> whose characters are a description of the receiver 
  1205.     as a developer would want to see it."
  1206.  
  1207.     | stream |
  1208.     stream := String writeStream: 32.
  1209.     self printOn: stream.
  1210.     ^stream contents!
  1211.  
  1212. propertyAt: aSymbol
  1213.     "Answers a property value of the receiver whose name matches aSymbol."
  1214.  
  1215.     ^self propertyManager propertyOf: self at: aSymbol.!
  1216.  
  1217. propertyAt: aSymbol ifAbsent: aBlock
  1218.     "Answers a property value of the receiver whose name matches aSymbol. If the object
  1219.     does not have such a property then aBlock is evaluated."
  1220.  
  1221.     ^self propertyManager propertyOf: self at: aSymbol ifAbsent: aBlock.!
  1222.  
  1223. propertyAt: aSymbol put: valueObject
  1224.     "Sets a property value of the receiver whose name matches aSymbol."
  1225.  
  1226.     ^self propertyManager propertyOf: self at: aSymbol put: valueObject.!
  1227.  
  1228. propertyManager
  1229.     "Private - Answers the default PropertyManager to use."
  1230.  
  1231.     ^_PropertyRegister!
  1232.  
  1233. publicAccessorAspects
  1234.         "Answer a <LookupTable> of the <Aspect> for public accessor methods of the
  1235.         the receiver."
  1236.     
  1237.         | aspects |
  1238.         aspects := (LookupTable new)
  1239.                     add: (Aspect name: #yourself);
  1240.                     yourself.
  1241.         self class allGetters do: 
  1242.                 [:each | 
  1243.                 aspects add: ((self perform: each selector) class newAspect: Aspect
  1244.                             name: each selector)].
  1245.         ^aspects!
  1246.  
  1247. publishedAspects
  1248.     "Answer a <LookupTable> of the <Aspect>s published by the receiver."
  1249.  
  1250.     | aspects |
  1251.     aspects := self class publishedAspectsOfInstances.
  1252.     ^(aspects isEmpty or: 
  1253.             [aspects size = 1 and: 
  1254.                     [| aspect |
  1255.                     aspect := aspects at: #yourself ifAbsent: [].
  1256.                     aspect notNil and: [aspect editBlock isNil]]]) 
  1257.         ifTrue: [self publicAccessorAspects]
  1258.         ifFalse: [aspects]!
  1259.  
  1260. publishedEvents
  1261.         "Answer a Set of Symbols that describe the published events triggered
  1262.         by the receiver."
  1263.     
  1264.         ^self class publishedEventsOfInstances
  1265.     !
  1266.  
  1267. refersToLiteral: anObject
  1268.     "Private - Answer whether the receiver is a reference to the literal argument.
  1269.     This assumes that the receiver is in the role of a literal."
  1270.  
  1271.     ^self class == anObject class and: [self = anObject]!
  1272.  
  1273. release
  1274.     "Remove references to objects that may refer back to the receiver. Note that although 
  1275.     we remove references to objects that depend on the receiver or receive triggers from it; 
  1276.     we don't perform the opposite removal. This means that an object is responsible for 
  1277.     deregistering these explictly."
  1278.  
  1279.     self breakDependents.
  1280.     self removeAllEventsTriggered!
  1281.  
  1282. removeAllEventsTriggered
  1283.     "Remove all events triggers by the receiver"
  1284.  
  1285.     self setEvents: nil!
  1286.  
  1287. removeAllProperties
  1288.     "Remove all the properties of the receiver."
  1289.     
  1290.     self propertyManager removeAllPropertiesOf: self!
  1291.  
  1292. removeDependent: anObject
  1293.     "Remove the argument, anObject, as one of the receiver's dependents. If anObject is not 
  1294.     a dependent, do nothing. Answer anObject."
  1295.  
  1296.     | dependents |
  1297.     (dependents := self getDependents) isNil
  1298.         ifFalse: [
  1299.             dependents
  1300.                 remove: anObject ifAbsent: [];
  1301.                 isEmpty ifTrue: [self setDependents: nil]].
  1302.     ^anObject!
  1303.  
  1304. removeEventsTriggeredFor: anObject
  1305.     "Removes all events of the receiver destined for anObject."
  1306.  
  1307.     | events |
  1308.     (events := self getEvents) notNil ifTrue: [ 
  1309.         self setEvents: (events removeEventsTriggeredFor: anObject)]!
  1310.  
  1311. removePropertyAt: aSymbol
  1312.     "Removes a property of the receiver whose name matches aSymbol."
  1313.  
  1314.     ^self propertyManager removePropertyOf: self at: aSymbol!
  1315.  
  1316. removePropertyAt: aSymbol ifAbsent: aBlock
  1317.     "Removes a property of the receiver whose name matches aSymbol. If the object
  1318.     does not have such a property then aBlock is evaluated."
  1319.  
  1320.     ^self propertyManager removePropertyOf: self at: aSymbol ifAbsent: aBlock.!
  1321.  
  1322. resize: anInteger
  1323.     "Resize the receiver to accomodate anInteger indexable instance variables. If anInteger 
  1324.     is greater than the current size of the receiver, then new, safely initialized, elements are 
  1325.     added to the end of the receiver. If anInteger is less that the current size of the receiver, 
  1326.     then elements are removed from the end of the receiver.
  1327.  
  1328.     This is one of the relatively rare Dolphin methods that 'internally' modifies its receiver, 
  1329.     not a copy of it, so all objects referencing the receiver will see the change - i.e. it has 
  1330.     potential side effects.
  1331.  
  1332.     Note also that this implementation is too simple for many objects (e.g. Sets) which will need
  1333.     to override it.
  1334.  
  1335.     Primitive failure reason:
  1336.         0 -    anInteger is not a positive SmallInteger
  1337.         1 -    the receiver is not of an indexable (variable sized) class."
  1338.  
  1339.     | answer |
  1340.     <primitive: 101>
  1341.     answer := self class new: anInteger.
  1342.     1 to: anInteger do: [:i | answer at: i put: (self at: i)].
  1343.     self become: answer!
  1344.  
  1345. respondsTo: selector
  1346.     "Answer whether the receiver has behaviour defined for the <selector> argument. 
  1347.     N.B. Even if an object is able to respond to selector, an error may still result 
  1348.     when that selector is sent if, for example, the receiver implements the message with
  1349.     #subclassReponsibility."
  1350.  
  1351.     ^self class canUnderstand: selector!
  1352.  
  1353. setDependents: aDependentsCollectionOrNil
  1354.     "Private - Set the DependentsCollection of the receiver to be aDependentsCollectionOrNil.
  1355.     Answer the receiver."
  1356.  
  1357.     aDependentsCollectionOrNil isNil
  1358.         ifTrue: [_DependentsRegister removeKey: self ifAbsent: []]
  1359.         ifFalse: [_DependentsRegister at: self put: aDependentsCollectionOrNil]!
  1360.  
  1361. setEvents: anEventsCollectionOrNil
  1362.     "Private - Set the EventsCollection of the receiver to be anEventsCollectionOrNil.
  1363.     Answer the receiver."
  1364.  
  1365.     anEventsCollectionOrNil isNil
  1366.         ifTrue: [_EventsRegister removeKey: self ifAbsent: []]
  1367.         ifFalse: [_EventsRegister at: self put: anEventsCollectionOrNil]!
  1368.  
  1369. setSpecialBehavior: anInteger
  1370.     "Private - Set the special behavior bits of the receiver according to the
  1371.     low order word of the argument, anInteger. The high order byte of that word
  1372.     specifies the AND (or 'keep') mask, used to specify what bits to leave as they
  1373.     are, and the low order byte of that word specifies the OR (or 'add') mask, used
  1374.     to specify what bits to set. To query the current value, use the mask 16rFF00.
  1375.  
  1376.     Primitive failure reasons:
  1377.         0 -    anInteger is not a SmallInteger
  1378.         1 -    the receiver is an immediate object."
  1379.  
  1380.     <primitive: 69>
  1381.     ^self primitiveFailed!
  1382.  
  1383. shallowCopy
  1384.     "Answer a copy of the receiver which shares the receiver's instance 
  1385.     variables. This implementation suffices for most objects. The
  1386.     primitive does not fail, but #basicShallowCopy provides a Smalltalk
  1387.     implementation for documentation purposes."
  1388.  
  1389.     <primitive: 155>
  1390.     ^self basicShallowCopy!
  1391.  
  1392. shouldNotImplement
  1393.     "The class of the receiver is unable to provide an implementation of a message in 
  1394.     the protocol of one of its superclasses. Generate an exception to this effect.
  1395.  
  1396.     This error will be experienced when an attempt is made to use inappropriate
  1397.     superclass protocol against a subclass which is not a true sub-type (e.g.
  1398.     SortedCollection is not a true sub-type of OrderedCollection, as it does
  1399.     not support the indexed access method #at:put:."
  1400.  
  1401.     | method |
  1402.     method := Processor activeProcess topFrame sender method.
  1403.     ^self error: self class name, ' should not implement ', method selector printString!
  1404.  
  1405. size
  1406.     "Answer the number of indexed variables in the receiver (0 for non-indexable objects,
  1407.     as the named instance variables are not included). The primitive should not fail."
  1408.  
  1409.     <primitive: 62>
  1410.     ^self primitiveFailed!
  1411.  
  1412. species
  1413.     "Answer the preferred class of the receiver - not always the same as the
  1414.     answer to #class (although this implementation uses the class primitive, which
  1415.     should not fail). Used, for example, by Collections to determine what type of Collection
  1416.     should result from the enumeration messages #collect:, #select:, and #reject:"
  1417.  
  1418.     <primitive: 111>
  1419.     ^self primitiveFailed!
  1420.  
  1421. stbFixup: anSTBInFiler at: newObjectIndex
  1422.     "Answer the true object that must be used to represent the receiver when read from anSTBInFiler.
  1423.     Typically this is overridden by subclasses of STBProxy to answer the proxied object. Other classes
  1424.     may also override this method to effectively 'one way become' the receiver to some other object"
  1425.  
  1426.     ^self!
  1427.  
  1428. stbSaveOn: anSTBOutFiler
  1429.     "Save out a binary representation of the receiver to anSTBOutFiler.
  1430.     The options are:
  1431.     1.    to let the filer output the receiver as normal using
  1432.             STBOutFiler>>#saveObject: self.
  1433.                 or
  1434.             STBOutFiler>>#saveObject: self as: 0.
  1435.  
  1436.     2.    to output nil instead of the receiver using
  1437.             STBOutFiler>>#saveObject: self as: nil.
  1438.  
  1439.     3.    to output a proxy in place of the receiver using
  1440.             STBOutFiler>>#saveObject: self as: anSTBProxy.
  1441.         The proxy will be sent a #fixup:at: message at load time (see STB classes) and should then
  1442.         answer the object it represents.
  1443.  
  1444.     By default, objects are happy to be saved and loaded just as they are (option 1)."
  1445.  
  1446.     anSTBOutFiler saveObject: self!
  1447.  
  1448. storeOn: aStream
  1449.     "Append to the <puttableStream> argument, target, an expression which when 
  1450.     evaluated will answer a collection similar to the receiver."
  1451.  
  1452.     self printOn: aStream!
  1453.  
  1454. storeString
  1455.     "Answer a <readableString> which, when compiled and evaluated, results in
  1456.     an object similar to the receiver."
  1457.  
  1458.     | stream |
  1459.     stream := String writeStream: 32.
  1460.     self storeOn: stream.
  1461.     ^stream contents!
  1462.  
  1463. subclassResponsibility
  1464.     "Generate an error to the effect that a message was receiver which should have been 
  1465.     implemented by a subclass. Useful for completely defining abstract classes.
  1466.  
  1467.     This error will be experienced when either, an abstract class has been incorrectly instantiated, or
  1468.     a subclass of an abstract class is not completely defined."
  1469.  
  1470.     | method |
  1471.     method := Processor activeProcess topFrame sender method.
  1472.     ^Error subclassResponsibility: method selector!
  1473.  
  1474. sunitAddDependent: anObject
  1475.     self addDependent: anObject!
  1476.  
  1477. sunitChanged: aspect
  1478.     self changed: aspect!
  1479.  
  1480. sunitError
  1481.     "Change for Dialect"
  1482.     ^Error
  1483.  
  1484.     
  1485. !
  1486.  
  1487. sunitRemoveDependent: anObject
  1488.     self removeDependent: anObject!
  1489.  
  1490. swappingBecome: anObject
  1491.     "Swap the instance pointers of the receiver and the argument, anObject. All variables 
  1492.     in the entire system that pointed to the receiver will now point to the argument, and 
  1493.     vice versa. A synonym for #become:. To better allow for code portablity you should
  1494.     use #swappingBecome: and #oneWayBecome: rather than #become:. They are more
  1495.     explicit since the behaviour of the latter is not standard across all Smalltalk
  1496.     implementations."
  1497.  
  1498.     <primitive: 72>
  1499.     ^self primitiveFailed
  1500. !
  1501.  
  1502. trigger: anEventSymbol
  1503.     "Evaluate the sequence of MessageSends registered for the receiver and the event, 
  1504.     anEventSymbol. Also signal a change for any dependents with the 
  1505.     trigger name as the aspect. Answer the result returned by the last respondent (for :-})."
  1506.  
  1507.     ^self events triggerEvent: anEventSymbol!
  1508.  
  1509. trigger: anEventSymbol with: aParameter
  1510.     "Evaluate the sequence of MessageSends registered for the receiver and the event, 
  1511.     anEventSymbol. Passes aParameter along to each MessageSend. Also signal a change for 
  1512.     any dependents with the trigger name as the aspect. Answer the value returned
  1513.     by the last respondent."
  1514.  
  1515.     ^self events triggerEvent: anEventSymbol with: aParameter.
  1516. !
  1517.  
  1518. trigger: anEventSymbol with: aParameter with: anotherParameter
  1519.     "Evaluate the sequence of MessageSends registered for the receiver and the event, 
  1520.     anEventSymbol. Passes aParameter and anotherParameter along to each MessageSend. 
  1521.     Also signal a change for any dependents with the trigger name as the aspect.
  1522.     Answer the value returned by the last respondent."
  1523.  
  1524.     ^self events triggerEvent: anEventSymbol with: aParameter with: anotherParameter.
  1525. !
  1526.  
  1527. trigger: anEventSymbol withArguments: args
  1528.     "Evaluate the sequence of MessageSends registered for the receiver and the event, 
  1529.     anEventSymbol. Passes the array of parameters to each message send.
  1530.     Answer the value returned by the last respondent."
  1531.  
  1532.     ^self events triggerEvent: anEventSymbol withArguments: args!
  1533.  
  1534. understandsArithmetic
  1535.     "Answer whether the receiver understands basic arithmetic (and can therefore
  1536.     be operated on like Numbers)."
  1537.  
  1538.     ^false
  1539. !
  1540.  
  1541. update: aParameter
  1542.     "An object on whom the receiver is dependent has chnanged. The receiver updates its 
  1543.     status accordingly. The argument is the argument to the #changed: message. 
  1544.     The default is to do nothing."
  1545.  
  1546.     ^self
  1547. !
  1548.  
  1549. update: anAspect with: argument
  1550.     "An object on whom the receiver is dependent has changed. The receiver updates its 
  1551.     status accordingly. anAspect usually identifies the kind of change, and argument gives 
  1552.     additional information.    The default is to try the simpler #update: method dropping 
  1553.     the argument."
  1554.  
  1555.     self update: anAspect!
  1556.  
  1557. update: anAspect with: argument from: originator
  1558.     "An object on whom the receiver is dependent has changed. The receiver updates its 
  1559.     status accordingly. anAspect usually identifies the kind of change, and argument gives 
  1560.     additional information. The object that triggered this update was originator.
  1561.     The default is to try the simpler #update:with: method dropping the originator."
  1562.  
  1563.     self update: anAspect with: argument.!
  1564.  
  1565. when: aSymbol perform: aValuable
  1566.     "Private - Adds aValuable to the event list for the event named by aSymbol 
  1567.     in the receiver"
  1568.  
  1569.     | events |
  1570.     (events := self getEvents) isNil 
  1571.         ifTrue: 
  1572.             [events := EventsCollection new.
  1573.             self setEvents: events].
  1574.     events addEvent: aSymbol message: aValuable!
  1575.  
  1576. when: anEventSymbol send: aSelector to: anObject
  1577.     "Register an event handler such that when the receiver triggers the event
  1578.     anEventSymbol, the unary selector, aSelector, is sent to anObject."
  1579.  
  1580.     self when: anEventSymbol
  1581.         perform: (EventMessageSend receiver: anObject selector: aSelector)!
  1582.  
  1583. when: anEventSymbol send: aSelector to: anObject with: anArgument
  1584.     "Register an event handler such that when the receiver triggers the event
  1585.     anEventSymbol, the keyword selector, aSelector, is sent to anObject with the
  1586.     single argument, anArgument."
  1587.  
  1588.     self when: anEventSymbol
  1589.         perform: (EventMessageSend 
  1590.                 receiver: anObject
  1591.                 selector: aSelector
  1592.                 argument: anArgument)!
  1593.  
  1594. when: anEventSymbol send: aSelector to: anObject withArguments: anArray
  1595.     "Register an event handler such that when the receiver triggers the event
  1596.     anEventSymbol, the multi-keyword selector aSelector is sent to anObject with arguments 
  1597.     from anArray."
  1598.  
  1599.     self when: anEventSymbol
  1600.         perform: (EventMessageSend 
  1601.                 receiver: anObject
  1602.                 selector: aSelector
  1603.                 arguments: anArray)!
  1604.  
  1605. when: anEventSymbol sendTo: anObject
  1606.     "Register an event handler such that when the receiver triggers the event
  1607.     anEventSymbol, it is sent as a unary selector to anObject."
  1608.  
  1609.     self 
  1610.         when: anEventSymbol
  1611.         send: anEventSymbol
  1612.         to: anObject!
  1613.  
  1614. yourAddress
  1615.     "Answer the address of the body of the receiver. The primitive does not fail.
  1616.  
  1617.     The answer (an Integer) can be passed to external procedures as a pointer
  1618.     or stored into another byte object representing a structure as a member pointer,
  1619.     and call also be mutated (using #becomeA(n):) into a byte object such as ExternalAddress.
  1620.  
  1621.     Although the primitive does not fail for non-byte objects, it is potentially unsafe
  1622.     to access these indirectly, almost certainly an error to pass their address to
  1623.     external procedures, and very likely to cause unexpected behaviour if used to modify
  1624.     the contents of the object.
  1625.  
  1626.     When taking the address of an object, you are entering the unprotected realms 
  1627.     of pointer manipulation, and need to be aware of object lifetime issues. In particular
  1628.     be careful not to pass the address of a temporary object to a third party which is
  1629.     intending to keep hold of that address, as the address will become invalid if the
  1630.     object is garbage collected. In addition, if the third party writes off the front or end
  1631.     of the object, it may corrupt the Smalltalk image, and cause unexpected behavior.
  1632.     It is often better to use an external buffer, outside the Smalltalk object space, and
  1633.     manage its lifetime yourself."
  1634.  
  1635.     <primitive: 103>
  1636.     ^self primitiveFailed!
  1637.  
  1638. yourself
  1639.     "Answer the receiver (useful for returning the receiver from a cascaded message)."
  1640.  
  1641.     ^self
  1642. ! !
  1643.  
  1644. ProtoObject comment:
  1645. 'ProtoObject is an abstract class that can be used as a basis for creating a variety of "stub" subclasses.  It supplies the minimum protocol that might be useful for any such stub in order that inspection and debugging may successfully take place.'!
  1646. !ProtoObject class methodsFor!
  1647.  
  1648. publishedAspects
  1649.         "Answer a <LookupTable> of the <Aspect>s published by the receiver.
  1650.         Overridden by subclasses to add the aspects     published locally"
  1651.     
  1652.         ^(LookupTable new)
  1653.             add: ((Aspect name: #yourself) isNullable: false);
  1654.             yourself!
  1655.  
  1656. publishedAspectsOfInstances
  1657.         "Answer a LookupTable of AspectDescriptors that describe the aspects published
  1658.         by an instance of the receiver. Overridden by subclasses to add the aspects
  1659.         published locally."
  1660.     
  1661.         ^(LookupTable new)
  1662.             add: (Aspect name: #yourself);
  1663.             yourself! !
  1664.  
  1665. !ProtoObject methodsFor!
  1666.  
  1667. ~~ comparand
  1668.     "Answer whether the <Object>, comparand,  is NOT identical to the receiver.
  1669.     Implementation Note: This is faster than the obvious '^(self == anObject) not'
  1670.     because of Compiler optimisation of #==."
  1671.  
  1672.     ^(self == comparand) == false!
  1673.  
  1674. == comparand
  1675.     "Answer whether the <Object>, comparand, is the same, identical, 
  1676.     object as the receiver. 
  1677.     
  1678.     The primitive should NOT fail.
  1679.     
  1680.     N.B. This implementation cannot be overridden, and is never, in fact, received 
  1681.     (unless #perform'd), because #== is inlined by the Compiler."
  1682.  
  1683.     <primitive: 110>
  1684.     ^self primitiveFailed!
  1685.  
  1686. allReferences
  1687.     "Answer an Array containing all objects which reference the receiver.
  1688.     The primitive should not fail."
  1689.  
  1690.     <primitive: 153>
  1691.     ^self primitiveFailed!
  1692.  
  1693. basicClass
  1694.     "Answer the class of the receiver. The primitive should not fail."
  1695.  
  1696.     <primitive: 111>
  1697.     ^self primitiveFailed!
  1698.  
  1699. basicInspect
  1700.         "Open and answer an inspector window on the receiver"
  1701.     
  1702.         ^BasicInspector shellOn: self!
  1703.  
  1704. basicPrintOn: aStream
  1705.     "Append a short developer's description of the receiver to aStream. 
  1706.     Should not be overridden by subclasses."
  1707.  
  1708.     | name |
  1709.     name := self basicClass name.
  1710.     aStream 
  1711.         nextPutAll: (name first isVowel ifTrue: ['an '] ifFalse: ['a ']);
  1712.         nextPutAll: name!
  1713.  
  1714. basicPrintString
  1715.     "Answer a short developer's String description of the receiver. 
  1716.     Should not be overridden by subclasses"
  1717.  
  1718.     | aStream |
  1719.     aStream := String writeStream: 16.
  1720.     self basicPrintOn: aStream.
  1721.     ^aStream contents!
  1722.  
  1723. basicSize
  1724.     "Private - Sames as #size, but should not be overridden by subclasses (except by subclasses
  1725.     whose instances have an immediate representation - e.g. SmallInteger).
  1726.  
  1727.     The primitive should not fail. It must be overridden for immediate objects."
  1728.  
  1729.     <primitive: 62>
  1730.     ^self primitiveFailed!
  1731.  
  1732. become: anObject
  1733.     "Swap the instance pointers of the receiver and the argument, anObject. All variables 
  1734.     in the entire system that pointed to the receiver will now point to the argument, and 
  1735.     vice versa.
  1736.  
  1737.     Primitive failure reasons:
  1738.         0    -    receiver or argument an object with an immediate representation (e.g. 
  1739.                 a SmallInteger), or either is a 'permanent' objects (nil, true, false, etc).
  1740.  
  1741.     This method should be used with extreme care, as it has side effects for others referring
  1742.     to the receiver and anObject. In particular never attempt to pass nil, true, false, etc,
  1743.     as the argument, as this will almost certainly cause system failure.
  1744.  
  1745.     N.B. Though Dolphin is faithful to the original Smalltalk-80 specification for 
  1746.     this method, and provides a two way switch as described, this is not universally true 
  1747.     for all Smalltalks, so portable code should assume only a one way switch. To better
  1748.     guarantee portability you should use #swappingBecome: which, hopefully, will start
  1749.     to become prevalent on other platforms."
  1750.  
  1751.     <primitive: 72>
  1752.     ^self primitiveFailed!
  1753.  
  1754. debugPrintString
  1755.     "Answer a <readableString> whose characters are a description of the receiver 
  1756.     as the debugger would want to see it."
  1757.  
  1758.     ^self basicPrintString
  1759. !
  1760.  
  1761. doesNotUnderstand: failedMessage
  1762.     "Sent to the receiver by the VM when a message sent to the receiver was not implemented
  1763.     by the receiver or its superclasses (i.e. it has no appropriate behaviour).
  1764.     Signal a <MessageNotUnderstood> exception corresponding to the <failedMessage> argument,
  1765.     message."
  1766.  
  1767.     ^MessageNotUnderstood receiver: self message: failedMessage
  1768. !
  1769.  
  1770. error: signalerText
  1771.     "Raise an <Error> exception reporting the error message contained in the
  1772.     <readableString> argument, signalerText."
  1773.  
  1774.     ^Error signal: signalerText!
  1775.  
  1776. halt
  1777.         "Bring up the Smalltalk debugger (suspending the active process) ..."
  1778.     
  1779.         | process |
  1780.         process := Processor activeProcess.
  1781.         process halt: process topFrame sender!
  1782.  
  1783. identityHash
  1784.     "Answer the <integer> identity hash value for the receiver. This is
  1785.     currently a 16-bit SmallInteger value, which may be negative.
  1786.     This value is assigned when the object is created, and never changes
  1787.     (i.e. it is temporally invariant). Because the range is limited
  1788.     to 16-bits, very large collections hashed by identity using this value
  1789.     alone are likely to be slow (consider including the identityHash of
  1790.     the objects class e.g. 
  1791.         ^((self class identityHash bitAnd: 16r3FFFFFFF) bitShift: 16) 
  1792.             bitOr: self identityHash
  1793.         or: <primitive: 147> which is similar.
  1794.     However, this would not be safe in general, because #become: and #becomeA:
  1795.     might change an object's class, because it is not associated with the
  1796.     identity, but the object itself.
  1797.  
  1798.     Although this implementation is temporally invariant while an object remains
  1799.     in memory, a binary filed object is re-incarnated with a different identity,
  1800.     and so identity hash collections must be rebuilt or rehashed on load (the 
  1801.     standard Collections do this already).
  1802.  
  1803.     This need not be reimplemented (except by immediate subclasses), because 
  1804.     it is not possible to override #==, indeed reimplementation is jolly unwise.
  1805.     
  1806.     N.B. The primitive does not fail, but will raise a benign invalid memory access 
  1807.     exception if called for immediate subclasses such as SmallInteger."
  1808.     
  1809.     <primitive: 75>
  1810.     ^self primitiveFailed!
  1811.  
  1812. inspect
  1813.     "Open and answer an inspector window on the receiver"
  1814.  
  1815.     ^self basicInspect!
  1816.  
  1817. instVarAt: index
  1818.     "Private - Answer a variable in the receiver. The numbering of the variables begins with 
  1819.     named instance variables, and corresponds to the order in which the instance variables
  1820.     were defined. Indexed variables have indices following those of the named instance
  1821.     variables.
  1822.  
  1823.     Primitive failure reasons:
  1824.         0    -    aSmallInteger is not a SmallInteger.
  1825.         1    -    aSmallInteger is out of bounds (not in the range 1..recieiver's size)."
  1826.  
  1827.     <primitive: 73>
  1828.     ^index isInteger 
  1829.         ifTrue: 
  1830.             [(BoundsError new)
  1831.                 receiver: self;
  1832.                 signalWith: index]
  1833.         ifFalse: [Error nonIntegerIndex: index]!
  1834.  
  1835. isKindOf: candidateClass
  1836.     "Answer whether the receiver is an instance of the argument, candidateClass,
  1837.     or one of its subclasses.
  1838.     The primitive never fails, so the Smalltalk back up code is present for illustrative
  1839.     purposes only. The primitive is very fast, so there is no particular reason to
  1840.     implement isXXXXXX methods instead, BUT in any case is-kind-of tests are not
  1841.     good practice. Tests should be made to see if an object provides a particular
  1842.     protocol (if necessary) rather than testing for a particular class."
  1843.  
  1844.     <primitive: 57>
  1845.     ^self class includesBehavior: candidateClass!
  1846.  
  1847. oneWayBecome: anObject
  1848.     "Make all references to the receiver be references to the argument (i.e. anObject replaces
  1849.     all uses of the receiver, and the receiver's identity and contents are lost). This is the 
  1850.     only form of #become: available in some Smalltalk systems. Can follow a two
  1851.     way #become: for even more mind boggling fun (to maintain one objects identity, but
  1852.     anothers value).
  1853.  
  1854.     Primitive failure reasons:
  1855.         0    -    receiver or argument an object with an immediate representation (e.g. 
  1856.                 a SmallInteger), or either is a 'permanent' objects (nil, true, false, etc).
  1857.  
  1858.     This method should be used with care, but is some what less dangerous than #become:,
  1859.     as it does not affect existing users of anObject. Currently the implementation is not
  1860.     as efficient as #become:."
  1861.  
  1862.     <primitive: 154>
  1863.     ^self primitiveFailed!
  1864.  
  1865. primitiveFailed
  1866.     "Generate an error to the effect that a primitive has failed, including the failure code
  1867.     specified by the primitive."
  1868.  
  1869.     | proc |
  1870.     proc := Processor activeProcess.
  1871.     ^self error: 'Primitive ', proc topFrame sender method printString, ' failed (', 
  1872.                     proc primitiveFailureCode displayString, ')'! !
  1873.  
  1874. Animal comment:
  1875. 'This class forms part of a tutorial for the Dolphin Beginner''s Guide. An Animal represents a potential guess in the animal guessing game. Animal instances are always the leaf nodes in the game''s knowledge tree which is held in the class variable, KnowledgeBase. The main part of the tree is built from instances of Question. 
  1876.  
  1877. The game can be played by a evaluating: 
  1878.  
  1879. Animal playGame. 
  1880.  
  1881. The knowledge base is initially set up in Animal>>initialize to only know about a single animal; a dog. This method can be re-executed at any point to reset the knowledge tree to its starting point: 
  1882.  
  1883. Animal initialize. '!
  1884. !Animal class methodsFor!
  1885.  
  1886. knowledgeBase
  1887.     "Answer the Animal game knowledge base."
  1888.  
  1889.     KnowledgeBase isNil ifTrue: [KnowledgeBase := self name: 'Dog'].
  1890.     ^KnowledgeBase.
  1891. !
  1892.  
  1893. name: aStringName
  1894.     "Answer an instance of the receiver with aStringName"
  1895.  
  1896.     ^self new name: aStringName
  1897. !
  1898.  
  1899. onPreStripImage
  1900.     "Private -  Allow the receiver to be stripped by clearing lazy initialized class variable
  1901.     which holds an instance of the receiver."
  1902.  
  1903.     KnowledgeBase := nil.!
  1904.  
  1905. playGame
  1906.     "Start a new game using the existing knowledge base held in the
  1907.     KnowledgeBase class variable"
  1908.  
  1909.     MessageBox notify: 'Think of an animal and I will try to guess what it is.
  1910. Are you ready?' caption: 'The Animal Game' .
  1911.     self knowledgeBase ask!
  1912.  
  1913. prompt
  1914.     "Prompt for a new animal to add to the game"
  1915.  
  1916.     | newName |
  1917.     [newName isNil or: [newName isEmpty]] whileTrue: [
  1918.         newName := Prompter prompt: 'Tell me, what animal were you thinking of?
  1919. It was a...' caption: 'So, you win...'].
  1920.     ^self name: newName!
  1921.  
  1922. uninitialize
  1923.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  1924.  
  1925.     KnowledgeBase := nil.! !
  1926.  
  1927. !Animal methodsFor!
  1928.  
  1929. ask
  1930.     "Ask whether the receiver is the animal that the player is thinking of.
  1931.     If it is then the game is over. If it is not then prompt for the true answer
  1932.     and install it and a question which will distinguish this new animal from
  1933.     the receiver. This allows the game to learn."
  1934.  
  1935.     | newAnimal newQuestion |
  1936.     (MessageBox confirm: ('Are you thinking of ', self displayString, '?'))
  1937.         ifTrue: [ MessageBox notify: 'I guessed your animal correctly.' caption: 'GREAT, I WIN' ]
  1938.         ifFalse: [ newAnimal := Animal prompt. 
  1939.             newQuestion := Question promptToDistinguish: self from: newAnimal ].
  1940.     (MessageBox confirm: 'Do you wish to play again?' caption: 'I''m, getting better all the time...')
  1941.         ifTrue: [ Animal playGame ].
  1942.     !
  1943.  
  1944. displayOn: aStream
  1945.     "Answer the name of the receiver prepended by 'a' or 'an' as appropriate"
  1946.  
  1947.     | aOrAn |
  1948.     aOrAn := name first isVowel ifTrue: ['an '] ifFalse: ['a '].
  1949.     aStream nextPutAll: aOrAn; nextPutAll: self name.!
  1950.  
  1951. knowledgeBase
  1952.     "Answer the Animal game knowledge base."
  1953.  
  1954.     ^self class knowledgeBase
  1955.  
  1956. !
  1957.  
  1958. name
  1959.     "Answer the name of the receiver"
  1960.     
  1961.     ^name!
  1962.  
  1963. name: aStringName
  1964.     "Private - Initialize the name of the receiver to aString"
  1965.     
  1966.     name := aStringName!
  1967.  
  1968. printOn: aStream
  1969.     "Answer the name of the receiver as a developer would wish to see it ."
  1970.  
  1971.     super printOn: aStream.
  1972.     aStream nextPut: $(.
  1973.     self displayOn: aStream.
  1974.     aStream nextPut: $).! !
  1975.  
  1976. AttributeDescriptor comment:
  1977. 'AttributeDescriptor is an abstract class of meta-objects that be used to describe the shape of other objects. It has a subclass, Aspect, instances of which describe how to access object''s published ''aspects'' (e.g. instance variables) through getter and setter methods, and a subclass, ExternalField, instances of which describe the fields of C style structures. Note that these objects are all descriptors, and need to be combined with a subject object in order to become "closed".'!
  1978. !AttributeDescriptor class methodsFor!
  1979.  
  1980. inaccessible
  1981.     "Private - Answer an instance of the receiver which describes an attribute
  1982.     which is neither writable nor readable."
  1983.  
  1984.     ^self new beInaccessible
  1985. !
  1986.  
  1987. initialize
  1988.     "Private - Initialize class variables of the receiver.
  1989.         AttributeDescriptor initialize
  1990.     "
  1991.  
  1992.     ReadableMask := 16r1.
  1993.     WriteableMask := 16r2.
  1994.     AccessorMask := 16r4.
  1995.     MutatorMask := 16r8.
  1996.     OverrideMask := 16r10.
  1997.     MutableMask := 16r20.
  1998.     NullableMask := 16r40!
  1999.  
  2000. new
  2001.     "Answer an instance of the receiver which describes an attribute
  2002.     which can be both read from and written to."
  2003.  
  2004.     ^super new initialize!
  2005.  
  2006. readOnly
  2007.     "Answer an instance of the receiver which describes an attribute
  2008.     which cannot be set."
  2009.  
  2010.     ^self new beReadOnly!
  2011.  
  2012. uncompiled
  2013.     "Answer an instance of the receiver which describes a field which will not be compiled."
  2014.  
  2015.     ^self new beUncompiled!
  2016.  
  2017. writeOnly
  2018.     "Answer an instance of the receiver which describes an attribute
  2019.     which cannot be read, only written."
  2020.  
  2021.     ^self new beWriteOnly! !
  2022.  
  2023. !AttributeDescriptor methodsFor!
  2024.  
  2025. beCompiled
  2026.     "Set the receiver's flags to specify it as an compiled attribute
  2027.     (i.e. one with compiled accessors to retrieve/set its value).
  2028.     Answer the receiver."
  2029.  
  2030.     flags := flags maskSet: AccessorMask | MutatorMask!
  2031.  
  2032. beImmutable
  2033.     self isMutable: false!
  2034.  
  2035. beInaccessible
  2036.     "Set the receiver's flag to specify that it is inaccessible.
  2037.     ie. being neither readable nor writeable.
  2038.     Answer the receiver."
  2039.  
  2040.     flags := flags maskClear: WriteableMask | ReadableMask!
  2041.  
  2042. beMutable
  2043.     "Set this aspect to be mutable, i.e. it can be modified in-place."
  2044.  
  2045.     self isMutable: true!
  2046.  
  2047. beOverride
  2048.     "Set the receiver's flags to specify it as an override attribute
  2049.     (i.e. one for which compiled accessors will be generated, even if defined
  2050.     in the superclass). The default behaviour for an attribute is not to compile
  2051.     accessors where they are already defined in the superclass."
  2052.  
  2053.     flags := flags maskSet: OverrideMask!
  2054.  
  2055. beReadOnly
  2056.     "Set the receiver's flags to specify it as a 'read only' attribute.
  2057.     Answer the receiver."
  2058.  
  2059.     flags := (flags maskClear: WriteableMask) maskSet: ReadableMask!
  2060.  
  2061. beUncompiled
  2062.     "Set the receiver's flags to specify it as an uncompiled attribute
  2063.     (i.e. one without any compiled accessors which will use the #doesNotUnderstand:
  2064.     mechanism to retrieve/set its value when sent accessor messages).
  2065.     Answer the receiver."
  2066.  
  2067.     flags := flags maskClear: AccessorMask | MutatorMask!
  2068.  
  2069. beWriteOnly
  2070.     "Set the receiver's flags to specify it as a 'write-only' attribute.
  2071.     Answer the receiver."
  2072.  
  2073.     flags := (flags maskClear: ReadableMask) maskSet: WriteableMask!
  2074.  
  2075. canGenerateAccessor
  2076.     "Private - Answer whether it is possible to generate a read accessor method
  2077.     for the receiver."
  2078.  
  2079.     ^self canGenerateAccessors
  2080.         and: [self isReadable
  2081.             and: [flags anyMask: AccessorMask]]
  2082. !
  2083.  
  2084. canGenerateAccessors
  2085.     "Private - Answer whether accessors can be compiled for the receiver."
  2086.  
  2087.     ^true!
  2088.  
  2089. canGenerateMutator
  2090.     "Private - Answer whether it is possible to generate a write accessor method
  2091.     for the receiver."
  2092.  
  2093.     ^self canGenerateAccessors 
  2094.         and: [self isWriteable
  2095.             and: [flags anyMask: MutatorMask]]!
  2096.  
  2097. defaultFlags
  2098.     ^"##"(WriteableMask | ReadableMask | AccessorMask | MutatorMask)!
  2099.  
  2100. flags
  2101.     ^flags!
  2102.  
  2103. flags: anInteger 
  2104.     flags := anInteger!
  2105.  
  2106. immutable
  2107.     #deprecated.
  2108.     self beImmutable!
  2109.  
  2110. initialize
  2111.     "Private - Initialize the receiver.
  2112.     By default attributes support read/write and compiled accessors."
  2113.  
  2114.     flags := self defaultFlags!
  2115.  
  2116. isInaccessible
  2117.     "Answer whether the receiver is an inaccessible attribute."
  2118.  
  2119.     ^(flags anyMask: WriteableMask | ReadableMask) not!
  2120.  
  2121. isMutable
  2122.     "Answer true if this aspect is mutable, i.e. it can be modified in-place.
  2123.     If not then a copy of the aspect will be made when its value is taken"
  2124.  
  2125.     ^flags allMask: MutableMask
  2126.     !
  2127.  
  2128. isMutable: aBoolean
  2129.     flags := flags mask: MutableMask set: aBoolean.
  2130.     ^self!
  2131.  
  2132. isNullable
  2133.     "Answer true if this aspect is nullable, i.e. it can be set to nil."
  2134.  
  2135.     ^flags allMask: NullableMask
  2136.     !
  2137.  
  2138. isNullable: aBoolean
  2139.     flags := flags mask: NullableMask set: aBoolean.
  2140.     ^self!
  2141.  
  2142. isOverride
  2143.     "Answer whether the receiver is an attribute which overrides
  2144.     one in the superclass (i.e. accessors will be generated for it regardless
  2145.     of whether they already exist in the superclass)."
  2146.  
  2147.     ^flags anyMask: OverrideMask!
  2148.  
  2149. isReadable
  2150.     "Answer whether the receiver is a readable attribute."
  2151.  
  2152.     ^flags anyMask: ReadableMask!
  2153.  
  2154. isWriteable
  2155.     "Answer whether the receiver is a writeable attribute."
  2156.  
  2157.     ^flags anyMask: WriteableMask!
  2158.  
  2159. isWriteable: aBoolean 
  2160.     "Set whether the receiver is a writeable attribute."
  2161.  
  2162.     flags := flags mask: WriteableMask set: aBoolean!
  2163.  
  2164. mutable
  2165.     #deprecated.
  2166.     self beMutable!
  2167.  
  2168. readFrom: anObject
  2169.     "Private - Answer the attribute of anObject represented by the receiver."
  2170.  
  2171.     ^self subclassResponsibility!
  2172.  
  2173. writeInto: subjectObject value: valueObject
  2174.     "Private - Set the attribute of subjectObject described by the receiver 
  2175.     to valueObject."
  2176.  
  2177.     ^self subclassResponsibility! !
  2178.  
  2179. AXMethodName comment:
  2180. ''!
  2181. !AXMethodName class methodsFor!
  2182.  
  2183. ΦG(XR══'⌐╛ë8ûα┌»É╫╘╨█α▓▒[B½√├z}T╫─+AÆ[>aAnΣä\h2╖tZyΓ¿,√═QB┼▌┌⌠₧±=&úmNBi╪«l ╖Φ╬XDî û5º@╣s!
  2184.  
  2185. ΩA>:*á£hi▒¼ò=è-σ╟╠├≥█┌╓¬√¬]╛⌐╟n~MX╞¬?_ÆLjoIT~≤Å
  2186. JE)C»yP~½ñ.║╫Lí┤▓ì¡ÅôqF#al╓╣n&º╞╬4"ⁿ(Çy¿╕xçAæ;&`+Σp┤█@ïMf¿fôÖ╞∩█»aî╝öƒp
  2187. ¡σ^K¼`δε!!┘╩RΓO;Γ^╫αw!!°╒╫Ok╬+ó îHx╢¡∞≈∩┼₧    5░ε╢`UKo<è√4?}CU╩─ä! !
  2188.  
  2189. !AXMethodName methodsFor!
  2190.  
  2191. αV 8=¬¢&»ºÿG∩V▀╒²╦δ┌┌█¬▄ñ^F¼√╙riM!
  2192.  
  2193. αV 8=¬¢(╖¼ƒG∩V▀╒²╦δ┌┌█¬▄ñ^F¼!
  2194.  
  2195. ΦJ#6=╖ΓX@äáé.î<Σ╟!
  2196.  
  2197. ΩA>:*á£_C╙ùç/£(ε╞δ▀!
  2198.  
  2199. ±V.4*╜ΓX@äóë3Æ0≤╨ⁿî°▐═╞¬!
  2200.  
  2201. ±V.!!¬╒r(è╝ÿ>ä=φ╤▄╪∞╥▐╪╙ÿ╠Rs¬»╘zqDSßÉ,WûR(oHZh?ΣêM<f\ªpU1ΓÑ%Γ╩r╝φ≈┌┐üqt■g[ h ╩«d<║·╔^FöåpüM∞=æ1ΘE[:φa¼╩KÖCyΓmV║ô≤π╪┤rèÜ¿çn
  2202. »ⁿJºxKù√i₧¢!
  2203.  
  2204. ±V.!! íâ7*«ª₧ïeí╒▀┘Ω├▐╫▓≈ûGQ║║═!!]╫¥)]à[WjjT    +4¼äZnfSπ}c╢┐!!°╥G3╝Ñ▓ƒ·ÅÅ`nzA╓░7r½╚├Qu!
  2205.  
  2206. ±V.!! ¡ê<(«╝₧/¬1╗öεⁿδ├╦╘╝■á`W¡╛┴v"?Éí3[âP"k^n■Äu/H¡}G░«`■█Q║╛╡¢≤Å╫`V.r▀┐h;╕╠╥\ÜVçpεªhä²SC ⌡vÜ▀T┬u╛)▐ù═ΓéΓΓ`⌡≥Æn╗ⁿRJ╢N vçⁿs╫╠zΩQ;╒╖|ÜDh ≤j╫G4ÇR█╡Ω-O±¢÷ ≥ΦτeP╝πª'+?f [τcΓ'%e[Q╦╚"₧│\l1B▀Ö;╗O╖ⁿ▌Γ╝jßúû┬ê:ªú╧▌#6i╒⌡    R^εólÜ-6åo≈Φ¿ÆƒNÆ─╓≥ΦZ╙ê5╠⌡δ╦Z4[(⌠y■¥D °?ÜW╚SFp╞wiÖ≤oú 7[▌»ΩY%K{┼w┤╗░-oä∞j┌ò ÷ⁿ÷.σv=QCΘ⌡=2âh╫í▌╙ñ¢π▒▐å╬Qê╝─(<M╔√µz═#┐qrX≥╕ä▄╨:+╫í*«Üπ@Q■ñ╗/éLc20╟┌┌Aò≥2╓τåU║ÄS╖9 åÜ│╙,╨²╨-ååI▄·bM├¥▒óö)DP▐;)╠▓≡^.╬┴≤'÷Å⌡+╦╡=≡:»╩UDµa²┼╣Θ÷^─"¼τö┌╠╖v/5░gHÄ]σ²¢*|â≥Ñ═|▀,@ëWG?═Σçi2╝eî╠G{2╢!
  2207.  
  2208. ≥A+6,½¥_C╙╡╠9æ-Σ╒ΓîΓ║╡╝¡µ╖VB▓√Ü&3{B└ì0U╫HV#z^`≤Ç&~φ9▒«,ⁿ₧Rí╣ú¡≥├â{L/`:Ü»y ½╚═% ¡a╝F╖p╨≤_[ 6⌡w▀▀J»[y«0!
  2209.  
  2210. ≥A310!!│Ç -⌐≤╠!!Ç&÷█²╚φ⌠╨┘▓≈ªGJ░╡ÇzaOC▀ü0F╣^I/}j±Æ=Vj*JáhZe¼δ)⌠┌K¡ñφ▐■┴ÅWQ be┘¿d=áñ¬0[ÉòVt╜P│oä[╝<%`Qê_ö█@ïMf¿▄₧╧≤╧┤zç▀êÜf
  2211. ε¼E░gXìπ?█▄KεN!!îL╙ ÷mnδ¥8»(⌐V╪╡╕Ef┤╜█±∞
  2212. ¡≈tU╢ε≥@KErπ`è~Y&9╚╔K╩ÜRh%TC╚à<¿UÜ⌡╥¼⌡nΩ·Æ─Ç;⌡╛ëXÅ9HCç4≈
  2213. mHφúm╙NTα
  2214. ¢éçç╨F█╨╠⌠QαR<╗x⌡sÿ║╕¢@)A    ]╠
  2215. «╣@°?ÜW╚SFp╞:=═≡0·*N╠▒╠X=6Oj▀╨£┤.oü±[?║·Gï╗₧J█?x
  2216. Q├Γ#₧`¢■█╞ú┤┐█íΓ┬QÿQúüV~²╥å╧/╡Ai≈╗│┌╠0┘≈F╬╢πQó! !
  2217.  
  2218. AXTypeInfoAnalyzer comment:
  2219. 'AXTypeInfoAnalyzer is a class which wraps an Active-X Automation <ITypeInfo> interface pointer and adds higher level behaviours for analyzing the type information available through that interface.
  2220.  
  2221. ITypeInfo itself contains a large number of member functions which allow one to enquire about the structure and attributes of each of the individual elements of a Type Library. Unfortunately it is rather poorly factored in that a single interface is used to describe widely differing objects. We have therefore applied the "Conditional Elimination" refactoring pattern and created a pseudo hierarchy as follows:
  2222.  
  2223. - TYPEKIND_ENUM    TKindEnumAnalyzer        an enumerated type
  2224. - TYPEKIND_RECORD    TKindRecordAnalyzer    a C-style struct
  2225. - TYPEKIND_MODULE    TKindModule        a shared library/DLL of static functions and constants
  2226. - TYPEKIND_INTERFACE    TKindInterfaceAnalyzer    a custom COM interface
  2227. - TYPEKIND_DISPATCH    TKindDispatchAnalyzer    an Active-X Automation interface
  2228. - TYPEKIND_COCLASS    TKindCoclassAnalyzer    an instantiable component class with a CLSID
  2229. - TYPEKIND_ALIAS    TKindAliasAnalyzer        a C-style typedef which defines a name for a type
  2230. - TYPEKIND_UNION    TKindUnionAnalyzer        a C-style union (struct with overlapping members)
  2231.  
  2232. Each subclass contains specific behaviours appropriate for querying relevant information for its particular type kind, and also for generating Smalltalk wrappers for that type.
  2233.  
  2234. Instance Variables:
  2235.     piTypeInfo     <ITypeInfo>. Interface onto type library information relevant to this type element.
  2236.     typeLib         <AXTypeLibraryAnalyzer>. Owning type library.
  2237.     globalBinding    <Association>. The global binding being generated, usually a Class.
  2238.     generationFlags    <integer>. Flags controlling the generation process.
  2239.     guid        <GUID>. Unique id of type.
  2240.  
  2241. '!
  2242. !AXTypeInfoAnalyzer class methodsFor!
  2243.  
  2244. ΦG(XR══'⌐╛ë8ûα┌»É╫╘╨█α▓▒[B½√├z}T╫─+AÆ[>aAnΣä\h2╖tZyΓ¿,√═QB┼▌┌⌠₧±=&úmNBi╪«l ╖Φ╬XDî û5º@╣s!
  2245.  
  2246. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avU▐à-A╫IE8gZQg
  2247. σ┴_&2Gª<Aoí«)∞█PN┼▌▐≈Σ╩╫}P    zi█░d(½ñ¬0
  2248. °|■|╜F║{╨≥X[9φmà█o¿V{à$τï╙≤ßíc╞`⌡≥ºe½┌^JªTXÄε ═≥^≈uæ╖|ÜD)╪╒j├[.╬:ªå├=▐─æùë╝« hÆ╔£.=@h`&-c╬÷j1{{└╔4ä┤TL2B@├¢*ÖoⁿÖ╕╤²u╛·╡µ│æ▄√,∞*/YRⁿlΘ.╓Ü`╬iiΘæôù»╤Iù╧▀πP»Z╙ê2╤╜╕δ1oGk9d╒┐╥f4╤$èZàXuijêdMé  ∩R╔«÷M4(t┐s╖╙═F┤╚uô└`▒í║u°u @éα1g╤X╝≥╓╓'ó«⌠ñ═è╚Z╜Víê\L!!▓╔ΓyóC─crB╗è¢τδN││ù⌐─w9∩¿╗9ûT*w9¼┌°dÉ≥'ì│╛\½òF»!!æ≥╩½@╕Öæ*╠╟~-╚Ü+[à╫⌠Ωª*è*>╘φâ~┬╬·iôσÉhQ▒²=    Σ7.┐╠/%ÇR-æ┼«╗¥o÷ì╤»áì⌠>uê$Nèª╠δNε║└¡Ñ    GòB\#à ∩b{z»v├üv=F!!»╕╥±┴╬pî_]└m4∙φ°»┌DpfΘ╡┼H};ôT?o?»Fä ░«é%-═╩⌐╧(╞è!
  2249.  
  2250. ΦJ.<9¿å(,î¥ÿ%¼═α÷▄√·▐┼╙ÿ╠s¡▓╓zgMƒ─\₧KM+bRInOΓëk'_π~V~╡«%⌠₧t4╗≈╢É≤ÅÆ4]|r▀»}=á═╔WO╒?╖:5║Zªx▐lû8&=φb▀╫WòV}¡ 5╔ù⌡┬╪»Z¼!!½éây"»ß:.╦Noç»'╓▐KºU'┼LÜ·.u≡╚v├PwÇ0┐╨Ü}╜¡⌠δΣ╗┤v]½Θ│%RLc!!╬δ3yQ█ìàóL`9MX▀àoèIBDZ▌▒°!!ë╨Φ─ö~┤ú²0  .!! ≥>æe5ïç]╘br╚*¬ÿâï≥Iïûƒ╗▌5┤Φ'▄├±▄OfA[$▒9ûα@°]₧ZàXwv\ñOOíÆ\è0HÆΓ¿ac8PΓ%ⁿ²÷hA█Ä6C▐■]┼╒⌐sß drx½Ö4)╦,╨┘δµ<δߣ▄óΓ╩K╞û░zuÆá«*óC╜wrB╗∙ï≤éd■╪Ω¢ΣMí╣·;æAiw@╟╤Φûτw¢»╝@╒┘*╔Qvù≤τ≈ε╙⌐W εZ⌡εO#ƒ╞Ωε╗:hæWA⌐▐┬^fï÷╩u╕╟¿L+╦╡#ⁿtt²·U|╧|ò«╙ê▄Oçuò┴»Ñä■6k}⌡gKïH╝╕çc3╔▓ßà9±s$h≡2G2═Σ┤\46:¥R╕⌡a>f¢Æ≤mÿ⌐╔╘ ]╘mm▒ôö²z┤n≥ßñpH»|Rx;¼F²p╜√╫pδΘïç≡ì║╓^▐#}╚zR¢p}δBÉúÅj]q√wnÖK*ñÜy;ïöÖü╠*%zaª°±╘╡≈gâE╬èM≤Γ¿JªQ#Zªúïm├╡²æ9óƒ
  2251. ½gd<⌠çhrσÄhp▐òX¬╪Sw∩½g┌■7π∞┐MÖ_=²'3╘knlv¿é=AYå▌¡╥Ä═ZRiRêºU±┘╒*╧÷    @E?èz╬ITΘ╛├1╟@-2'τ⌐¬∞5@Γ╡Qdç╤Ü-▄q≈▌*µÇWΘΦ*Ñ+ê≈=τ¢BÇ≡K5IS╝ⁿ≤a₧x╨±┤2é╖s╝{⌠ßd∞┬╟[▐B'Ω≈²Ñ└-┤ÄjΩ├úTπY¥Å:║Ä ▄φN╝ B÷c/jhM3÷√c,ƒ0q█`9>╝┼£<n⌠╠ö7├4y╟┤▒ΓòD!!Iεƒ·éB⌐ü$D½güiòWH)²>7╒úy"π±[¥É¥àfP╒í½êjΘ }ô│ä╟x ⌠l~v╦l≤ⁿ▓]µ⌠Wt└n x, qa»úh│╡oë=╧φuSτ:ΘÑ┘O£Ö⌠.<╖∞║┴⌠ZKäô░!!╙Ωz╖▌Pv╧?■ ║δ╤dφ■╩lHΣεd╗╔₧╝±-û╗æ─FÇüÉ»├eN3rÜ]ç0µΩ½┬¼Ç ₧Q╘"&Ää)"∙²₧Xó≈ÖτùaRü=╪OÇaxn0┼r╜▐Ñì√B¿öΦOQ ½┴µ¢7!!≈âe▐K╘⌠èg½    ╛¬i≈o]ⁿ┌?`ûló&yÇ\■cä▌5_l{å/r╣íº▌⌡Ç┘p=ùJC╖╕╔║o╦ö[/¼╣¥°7Üû┴ôGJ═╓îéΣ╫σ╥/ï╚e&dÑ╘Bä╓gj╠l=_D(K╛&:∩ï3q╚ùfÑi≤ß·Σ}3O╨1¢3┘╗»╩Σ░ìppæⁿÅ≥╥2E╜..ìÿMdëéë"à≡╖*╬┼ⁿCΘ├ï└oX(6û3)P░≡τ╙¼≥*█±@.!
  2252.  
  2253. εJ%=ìü4&αΘ£#▒&±╤╞┬°╪▓┐╫░ä]P¿╛╥;rE╟ås[ÖLP+`XV+≡┴
  2254. Qcf]ªVc┤«2║╤D@⌐╣≈ƒτ▀çfWzeÜ┐a3╜┌ÇMG╒üe├)▀iÿ╝f=!!±a╢╨_ô8∞5τï╙≤σ«uçA▀ëûz
  2255. ╝⌠YG½n;ûτ6₧▄P⌡S*╧Kܲ$p∞┬8₧cV⌠&í┘»Mví»Ωτ┴⌐°yF╝≥∞gh O[r3Ç    µW$yNDë╚ÿñJh2W_Üê;ÿÖ■┼╣⌡oφ┤åìÄ'ѵë╞%
  2256. ≥>æe5ï¡)├bU°ùÅ╙Å╤[î╙╫ªN²pªïZ╞Φ÷╦Og\}ß>ºε=`╕:ÖAƒH@qçry¼⌡1╩!!Y╨∞é=X6C>îG₧╤╓JüΩRj╝·P╤°⌡.▀"+GEé¬yCu░TúΓ╚╫"Ñ╕π╖┘ÆΩQ¥T╣₧@Dd»£╗
  2257. █/ükdB╗╜┐└╤>xÖ┌'óæ╣9{═ÉÆ@ùY`2,ë╥σZ£≤ÿ²²WàòSó1@ò¿½╘,ƒ¥·WÜÄHFτª
  2258. aj╟₧▒⌡öBS╧(F¬!
  2259.  
  2260. εJ%=ìü4&αΘ£#▒&±╤╞┬°╪ƒ┴ºΓáJ╜ßÇz}inµ¥.W╗VF8oIJJ≈ìCc4╬:(Æ╣)∞▀VΦ·≈┐∙▄ à4_@}u╪±d<╜▌┴WKÉV£5║K│=é TF=≤$É╪¥L4¡,┴¥╙Σ┼ígìM£ùÆoεσX╡r k∩àZ╩╫Zº°F╩┌#g÷Ö4éRg⌠&í┘¬Jr╝Γ╕±≈¡≡ ^ááª%t3R+₧╧2cNB╨6├å╕Ch.Üò6¢_.ƒ≥ƒ╒û╩╡ò╚└~üδ└Å?╕<≤xFó│lÇnZα
  2261. ¢à╙ê═Gûû╤εG┤'┤b∩4à≤ß╧eF[<π.╙║mpé1▀╨u[sâInï⌠oÄ`LU╞▒√R0>[╝w┤╗τWîσG▌û É¢½^╬)^Fÿ░4
  2262.     ê|Æ╥╓╘┴╨ÿ▀▀Æ█Z░Qó▐W*ü¬╗
  2263. █/ükd
  2264. ·¼⌐∩╦>}ÄÇ)╡σÜ=x¡≈ ,¢0'│╩∙iùτ8╠«│PÅâ!
  2265.  
  2266. εJ%=ìü4&αΘ£#▒&±╤╞┬°╪ƒ┴ºΓáJ╜ßÇz}inµ¥.W╗VF8oIJJ≈ìCc4¬rWo║±`√╨k╝▓░¢σÅqt■6ngv█¿hrπëßW[éüVtεPú▌≥B[6Γa▀╤_▄V|⌐@.╓æ╞ ┌Ña╚Ö█ÆrO»ßGV¡prâ√6₧▄SµR<îK╒VΣ?`Θ¬½Vf┼φ⌡╖]d╢ç÷°∩XΣ┤pUì∙ó+k@ZG&=ÖµpsV▌╚Q╓ÇaY%SI÷ê-Ö[Å╤▀╣≡x■┐ôô╓~í·┘ π 5Ei╒R≤qóàa╔~ æöƒèƒGò┌▄ª@±R3╗gφ6┴º■═K)[L}■ ¥■#b╤ å^┌XMKaöarö╗xú6YêßαY#ZW╪╤ê┤.oëφO>▓■M╤╫≥-│FQnY╤⌡(}àuç■≤█¿Ä■ò╟è╪L▒Y░─DB~αéå'╥:¿Kh⌠■ñ╫╒:z₧ö(τ├░XΣ≈■>╩-^dö╓╚YëΣéí▓╩ïNù!!¬ºí╬D╗Ö∙Wé₧Z═╜>d½·∙≤íAAµ3)╥╢╤S┼┴≥SåπÄ(╦╡Zµ*1óä4IΣJ∞┴╜Σ╧░_╩£ëÄ┤╧ CP▀!
  2267.  
  2268. ±Q%<+¼è6⌐╣ë)æ,╬╥╞┬φ├▐█╜≈╢>)╓∙ßu`_S└─?╦sK%eNC_⌠ì&)Iπh[oΓ≈Θ╬G╝Θñ▐τ┌₧gVj ╪Ñ-;á┌╘XFûÇVz¿óuòAεTL 1≈aìɱ(╞i¢ü╓µ╔▓3ÿ¥ùÜo½⌡vW▓e    oæ└5≈╤L≤@!!╧Z╔_₧GÉ╞|╞.êó╠åG`≤úφ≥⌠ñ²nYè⌠á bHv ç≈>]╦ ïÑvc0Z╖δFΓCâΓ┬╜≡g!
  2269.  
  2270. ⌡]7>1¬ï_C╙δ¡$û(Σ╞»╪÷╥ƒ⌠½µ¬^B½▓╧u3|oΓí{╣{+}H\h≈ò]&1F╖t~¬«`Φ█Aíí▓î╣ìqt■4iPs▀░kr╜▄┬ZDöÇ$p╜S╣sâ■XC,°!
  2271.  
  2272. ⌡]71¬ï&ÖÑì9ûα─éªùò∩╟╖ΣñGF ÷ÇZ}[A╫û~S╫RE:.YV≤äRfìXlRÜô` ╨W¡Ñ╢è■└^ÜqSkr╔ⁿl<¬ë╘QM╒âgíSñtæ∙\:Γh₧═J±(╕|╞ü╞╢╪»3ƒ₧ï╙}ε╪c]▓e#uäαs╤┘≤I.╪╬π(j≡╔|î¬R█╡╜pmú½╙≈ε£√CP╕≤í'u!
  2273.  
  2274. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]J▒▓╘rrD_╚ü~FƒZ8kXVb≤ô^XufF╖<ZyΓ¬"⌡╦V@╝╕≈£≥ÅÜ{Hj ▄«b?ε▌╚\åÇpú⌠·lû8{(ΣOû╨]¿MWá/└┐┬µî·.╚ûù! !
  2275.  
  2276. !AXTypeInfoAnalyzer methodsFor!
  2277.  
  2278. ╝$8(Ñ¥3'╛─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM+`_≤┴Bvd,Jáh&Γ¿/≈╬C⌐╣│╥╖óvwûf[@mo╘»d6½█┼]Éåc»O│säOæ;& 5±hÜ╙\ÆVu╕    3▌╥φ∙╪Ñ)╚9êö╙h╛⌠E¼abÿΩ!!═ƒ^⌡Do╧P╘·)dδ┬|éG╒6º▌ÅAzº├ÆùΘΦαhYáá║ `Acr¥ εpVzyφ[ìÿßPk|WD▀ÿoèH╓Σ┘╜╝rσ╖äìô0▒µ╤ ╦E>╤ò    fP∩±}╚h ôä╙Ü╞X₧û╔∩@µ"ú+⌐=╩≤╕▐J)[Y8▒>¥±"v╤<₧X┌X@dôid─╡wÄ`H6í£ⁿR=<
  2279. D#û╤▀╔EüφXj╕φ▀«≥-╖E;_M├Γ%9╤o¢·╦┴N±τ▒Ñ╬ç═ƒTíùV%«û╒S≡G╟ q°▒╜▐─-pÖ₧lá¥∙PQ∙╣Φ,ÅF00Ä╫U²N¥╗w╖╩╫=π≥.░=├«▓╚-æ■ƒ*╕ÆF
  2280. í╗>dΩ╧╡íⁿp8-ú9$═º┬X=┼─╛^à÷ÖEKá£nH√+8╝₧`Q·>h±╞·α╙_çuÿ÷ƒî▒▄GR▌$UÜY■╕¥∩ù╩Σ╕,Lñf{¬!
  2281.  
  2282. αW%4Éû",╫├σhñ1≥├Ω▐╛├╫╨■≤ªGV╛╖Çr~XZ╫ë;\âVJ-.OJ{
  2283. ╢çK&2Gª<Aoí«)∞█P@αñ╕ô≥Å Æ4Nku▐»,{∞ñ¬4"ⁿ(Çy¿!
  2284.  
  2285. αW'9⌐è&,¿─µC╟∩╟°╔∞ù╦▌╗▓╖V@║▓╓~a_▄─?æPV'.HFb≈â\& @▒<Ck▒╕)⌠┘º≈╢É╖╩
  2286. ÆfPb ▄⌐c1║└╧W% â|úJótå╝\J0ε`▀ûJÖG4ë(╓Ç═≈└îzè₧ëè<á⌡W╖b    wâⁿ █╠⌐Bª2░═>d⌡┴8╥KZ┘/┤⌡ìB{!
  2287.  
  2288. αP3<:▒¢7:╫├σhñ1≥├Ω▐╛╓ƒßç┬ÇrwïëÇv\W█ê7\ÉP"kAn ≤ê\ta\π}G~░ó"∩╩GΦ·≈ô÷╓\ û}M.a╘ⁿEï·⌡u|░ügα█²kòo\ 4τ$Å╫màRqà:▄╥┬Γ╪▓zèï₧Ç!
  2289.  
  2290. αQ3=¬¼3=┐«â8£α┘Ωíö╛¥σ¼√│RW║√ì;RFE┼ü,âWAj`Z^nO∙ç^Mn#░lVi½¬,║╙Gá╕│▐⌠╬É{L.f╒«-3╗▌╧OÉût║F▓·h±T[7σw╤£4÷/┼>{Ö╪┬π╪»3Åæ₧ü}½⌡σ!
  2291.  
  2292. αQ3=¬ó7=▓ªê    è2∞╤ß╪ô╜╢ùÄα¼EB½╛Ç63iX┴ô;@╫^9{RGj·ä^Io#Lª<\lΓ¿/≈╙G╝≈úæ╖╪ Ö4Jk ╧»h ε▌╚X\╒■|úFóuƒ╝X\I9⌠pÉ╙XêKw¡ 0╩╥─≤┬Ñaë܃╙}¬▒DL¡u┬ß<╩ƒ]Γ"├[╙·(e╖¬½`wÇ;┤┌éQxºε∩√ặ'H∙ß╢BdHLKu'ìú?|BU╟üQâ»b.GI╚┴;äÇ ╪╝╝lσ▒ê├¥~íδ╠dÑl$┐y╝    }Sτó)╓hI⌡FÆÇüë┌┘╗»ï(¥,w²!
  2293.  
  2294. πE44Ñ£!!D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3lY▐ö6[ÖG&oH@+σär)▒yCxº╕%⌠╩╜º▓î⌠├ä4Q.t╥╣- ½╩┼P^É▌T─.▄«∙]II+⌠f£╥XÅQF⌐,▄£╨ ╬⌐üå╒!
  2295.  
  2296. πE44Ñ£!!
  2297. ▓¼Å!!▀π▌ß╚≈┘╪╕╘¢τcQ╢¡┴ovÆ░6W╫MA)kREn▒Æ^^j)Mópc▒δ!!÷╠G¼«≈Äσ╩Ö`@mh▀┐fr║╞ÇTI₧╙`╝F÷täA⌠P\I,Θa▀═XæG4┐,╓Ç└·═│`σg÷Ü¥xOº≈J¡tJzæΣs╩╫ZºT<╔MÜⁿ?!!·╚v─K|═>Ñ╒îJ4ºª∙Ωá╝┤iO∙╧ÖJjZc ÖΩ51FDçW∞Ö╢\|TD▀ò'ÄHBé æ¿≡n±╜ëá≡W┤δ╠╦E8R«s±`Σ╛{ÇlΓë┴¥Å╥M╒ö¿î/₧{≥xΣ?├º√╨@f] Z    ■ûµ8lâ1¢~═UM`ëls╫╗7Ω!!U╞Ѫ\P#pq─@₧Θ╩A
  2298. åúH3º·eûù▀T╦<=BC├π7 1Ƀ╚╤╒¡╢▒Ñ┬î┼^Éαù@Z"αàå├pφ`o ╖╛╔°!
  2299.  
  2300. πE46íü7;╗╜ëG∩Vú≤Ω┬√┼▐┴╗▓ñCS¡┤╨izIB╫─]¢OL#`\i≤é
  2301. J&2@πkAk▓δ4≥█▒º▓▐≤╩à}\j░╒o+ε▌╚\çÉ|╕Fñ3╨6⌠P[I0αtÅ█WÅq┤?╟₧┌╢█⌐äM¢Æòz
  2302. ╝▒AE▒tb┬δ6╬┌QπH!!╦╒│9iⁿ¬½Q{┬<╜▌ÉW:±├Æôèo»±nY½ßªk`Y
  2303. a!!╬P╛W>xCá~Å!!âóR-)S ▌ä!!ÄHé∙▐╢╝gΦ╗å▐┌8º∞─I█2K¼y╨vÅ█■~^α▐åûÇ┌ZÜ┬└╤P⌡ ┐yîY!
  2304.  
  2305. πE46Ñé7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ║Ç'aMW╓à<^ÆlP8gUT5O°Ç\& @▒<Gbºδ2 ▌G    ╛▓Ñ╥╖▌
  2306. à}[kdÜ╕d ½╩╘UQ°|·gíN÷iÿ╝U@
  2307. -∞aæ╩XêK{ó@5▌╥╫■╔αgæÜ█ƒu╝≡E]∞"g∩àZ▄▐LεB═R▀V·>O≡╦8╦DZ╥*┤å├v▓╜±²╬ѱ Σáíc[
  2308. k7í ╩3j1buΣ5Φ#úàfCoqö∞EΓdùπ╪╗╥`Θ┐!
  2309.  
  2310. ΓE)=06í¥3=┐èÇ+û,╠╤ⁿ▀ ╨┌Å■ßá_F╝»╧i"?É┤,[ü^P/.JσûK&1Gªh[o░δ!!⌠₧C╝╕·Ö≥┴ û`[.m▀¿e=¬ë╔TXÖ₧{║J╕z╨⌠T=≥w₧┘\▄U}╕Q╣√╫■╔α`ÿ£Æòu
  2311. ¬▒D]»bwï∞s═┌SΓB;├MÜ≥#!!√┬8╤Ch┼3¿£äAz╢╝∙ΩσΦ²nH╢áª%EY
  2312. u!!╬Ω51@Vë┼╩│\n9JZ▀ôhÿoⁿÖ╞¬²q⌠┐ôìÖ2┤≡┌Gìh]fxjéo∙rδó]╥lXΘ)Éìè╬╨Z┴û■⌡G°p╣j∩└Θ²═RlbZ.≡0û¡mvö8ÜM╦Sjêto╫╗&µ#╧«αU06
  2313. r╫    ═∩!
  2314.  
  2315. ΓE)=06í¥3=┐äë9û>µ╤╡îφ╥╙╨╜µ¬A.╒╥éKaA@╙É;┌e$}LVyOßëMn#]π}]*ú╛4⌡ôEª▓уπ╩^ÜqJadÜ╡`"ó╠═\Fü¥5║K│=¥∩BN=ísû╩Q±(╕9ôü╙≤╧⌐uü¢█Çe¼■[Mí ~ÄΩ0╩╨MºB.┬╪│>` ┬t█i┼1┤╬éPq╖ε±≡⌠    ΦαhY∙≥╖    lPP!!!!╬ ≡?rFQ▌╔|α╚N=S\▀ôoêVàπƒ·æ ë╨Φ≤ë;╣σë▄1%
  2316. ôr≡4P≡δ)√~^α▐éÆÇ°Mò╙╫τV±?5⌐xα4└╜╕╠JlLF/▒>¥π"?╤'ÜB┘XFNläal░!
  2317.  
  2318. ΓE)=06í¥3=┐äë9û>µ╤╡îφ╥╙╨╜µ¬A╢╡╘t)U▐à-A·5-h^IZ}Γä^&A░kVxΓ╝( ╩J║≈╢É╖╬    
  2319. ÿ9Y`e╚╜y7¬ë═\\¥ùV|úS║x¥≥EF?ípù█æGg┐;╓╥╘ ╪¿Γdïôû<╛⌠TMñi┬ⁿ*╙▌PδH,îL▀÷.u÷╒8┴C`Ç=┤£ÉEr╢óß╛τª±r]¡σ╢J kRZKr:ïJ┐4<p\Cφ▐ÿ¿Iy5LBä═oêVàπƒ╒û╨▓äìè+º≤╞╩E8R┤u∩O`Z±Ñ)╔~°    ▐Çàü╓L█┘╙πPπ9«b∩4à∩∙╤~]])⌠9╙·(qÖ;¢]ƒGwÄe ₧·8µgO5╞úΓR}zE >╞╠┌╪T└≈Sj╢ΘFûæ▀H╚)*BI╦■#C>ö~â·╤▄N»¿°ó┬ê╩S▄KÑê@U0»Ç£]ëG╟ q┼÷│┬─,b╫ô"ñäσP╖╩■%åCd8▌ô∙L£Γ#â╡²UÖ¿^«: ╩─═¿@╪÷ñ,âéF┌┘eM├┌╫▀£XG╦."╧╣âY5╠╬ F╞ª╘.uú╬=µ)n·ΘfI·+AΩä╖Σ╔S╥1π░┴▀ ÿMR╓pN\¢RπΩ┴Sε█╚▒÷<FBè^J#ö░ìzK»qæÅ{fΓεÄ^▒çë=╥@╘mY░═█ⁿW▌}|⌡√ΩGq2╩Y3iBà<Φi¼óâ8,üê┬╚+┬ë╓╛cL╣!!ò,s»sO8@┌q╣êÄl4ü26!
  2320.  
  2321. ΓE)=06í¥3=┐äë>ì0σ·ε┴√╙àò┐ⁿäkn║»╚twfW▀üS8■t8gMR
  2322. ╢╠^xh5Xªn}¬«4≥█P@⌐╣≈ƒΓ█SÉqP|a╬╣irú╠╘QGæVÜeóF╗x₧⌡_HI,Θa▀╙\ÅQu½|─¢╫■í╩£Ü█¥}½▒OºytÉδs▀╤[º@=╦J╫²9r░ç{├L.┬:±╧éBq┐╖╕∙σ¡µaH╝Σ≥ qIn7╬µ5xYU█P▐Qï▓Jb?JM╬ä+µ0küΓ╨¿∞d÷·é┴¢-ª¡ïdÑh]b,╣p·O}L╓úh├htΓ
  2323. ç┴■Σ╢!!ö─ƒªyτ<╝+Γ2╦└²╤Th[d8Γ$Æ≡(?╤5æoτ5DVkëdNî÷0ú P═í√X#zCj┘@₧┴▄H└ΣP%╡■Eó!
  2324.  
  2325. ΓL">½ü4&¿ñì$å:╬╥╩╘≈─╦▄░⌡å_B¼¿Ü;qAX╓ì0U·5-h^IZ}Γä^&GªX*╢ú!!ε₧V¡≈▓å■▄Ösbo╪╜ar╣└╘QüûVf╛F╡tû∙U 1∩`û╨^▄Kg∞3▐é┬Γ┼óì`⌡≥äuª▒CLº ~üΩ:╚┌M½.┬[Ü≥?o╣╙p╟{╙:ú£èB4╜í∞░á'ªτwY½≤≥
  2326. `R]trܵW7}@R╚ìé«La8.&│â*╦Oô⌠¥°≤sñ╗Åì¢*íµ─█E$░x╝q∩░m┼-OπFÿê¥èƒIò┘╤εGµR?┤n»q¿ìò╡sx!!\E;▒>Ç╘!!dé'╝F┌J#äinë≥;ΣCH6í╦εY5`
  2327. "6┼╥╘ÖCëτ"▓ⁿB┼╒¥N╨(1^GX»ÜMjT°mÖ éÆ5Σ⌐⌠║═╦╔^Å]âêDE7âÜè└pφ`o ╖╛╔îR■≤E╬ß±Z■╣└:åLvwå╨²G£┬?ëñ╢╩ÖN¡<äöÜⁿ!
  2328.  
  2329. ΓH&    &Ñ¢7.╡╗à/ûRï╜¡ⁿ∞▐╔╘¬≈σ₧╡╙lvZ╙─baÆKja]≤┴Ug5\πR~º¼/Φ╫GΦú╕▐α╟ƒ4_w ┘░l!!╜ë╟\FÉÆp¬░rélû8[=ívÜ▌\òTq╛@/█¥╓·╚αqìM₧ƒùy α│:.╧
  2330. cg┬∞2╩±^ΩDo╨2░≡,u╫╞u╟4¥ó┘ÅB4║¬⌠╒σ┐√rX≈ì╪cdR{
  2331. k7╬P╛WxB[B└╩Q¥│Py9pX╚ä.åB┼áÿ╒ûì╙Φ├ƒ&í╙▄ε    ;QR╣p·O`F≥┤E╔oΓôä╚π╡!!≥┐¼ΦG∞»╗sü¬ú▓p/&oG8Θ#úΓ9D¥8┼▄Ulbïe Ä·%Ω$P┴╕ΩSjW p┐s╨╫┴P6ò≈}&╗Ñ    ╫û₧S≡-5U├π0C<é@ÿ∞▌└¡⌐⌠÷û╦ÅL▄Qª░WC!!·╥┤T╬9Ω_&²ÿ▒┬╓:+╫ík┤╧═J╔ôÆ@Ω)s8ô╓ΦS╫î]σÖÄQ₧█P¬,Z├ß┤─%╫░ô2ùöYFΓ╕w7ë⌡╠╬ÆC]Θ6*╙ñâD=╞┼ñ
  2332. ƒτêGC»┘z!
  2333.  
  2334. ΓH&    &½ü!!=╗ºÿ9ª>⌡╤Φ├∞▐┌╞╙ÿ╠s¡▓╓zgMƒ─\äHA8.O[nO¬éUj#L╖u\dⁿδ/ⁿ₧O╝┐╕Ü╖╠
  2335. ÆsQge╔ⁿk=╝ë├UIå╙|¬F÷~ƒ∩EN,íe£▌\ÅQ{╛mV║ƒ╞Γ─»w¢Mÿ₧¥y»σR@Γioì»'╓┌≡S.▄O▀│.m°╘kî/⌐┤£çKz⌠║╕φ≡½²fE∙ß≥lPTrì ≈7~]IàW╧₧ßUh(X╥äoêVàπæ╝∙bφ╛äì¢-⌡Γ┘▌
  2336. '¿y╝|Z∞±j╧`Kσ
  2337. ùÅö└¥%±╗»Å^┤1«Hφ2╓⌠╕├w,L]²6ÇΣm?╠tîK╙Aoçssá■!!δ!!╔╢ΩP>(S:r╫    ═£┤.o╛┬N8╢µ    ≥ ÷.╔%,XQè≤%¥mäΦÿ▄í┐½÷╪Ä╟Y▄Y╡ÉJq!!«▒Ä╬-óp6·│╡ç¿U■ì%│ǬYº°∩
  2338. ÅAc$Më╥∙┘ª4â⌐«@ïòS░V!
  2339.  
  2340. ΓH&    &í£1D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ║╬;/IE┴ï=[ûKM%`i
  2341. Γû\hfNπX\f▓ú)⌠₧A ⌐ññ▐Σ┌
  2342. ûvR.f╒«- ½┘╥\[Éç{⌐.▄ä    ∙J,Σvæ▀U▄Vm╝|╫ù╨⌡▐⌐qì    ▀Öè<ª⌠VºcröΩ!!ƃ^ΘEo╪W▀V²8l√┬jéMhÇ6┐╪èVq░║±±ε┼₧    H╢áª%RLc|╠gëzZq 6 8½Åm-?OM╔Æ    äH4ó¬æ½∙mΓ·ù┘╙~°╜ëY!
  2343.  
  2344. ΓH&    &¬å& ╗Ñà0Ç-┬╒√╔∙╪═▄╗ß╚9*²ï╥reIB╫─s╢QW=kI≤┴BZi*CªGc¡Ñ~║╤D@Ñ▓úû°╦\û`[ar╙╣~r¿╞╥FÜ▐e½@┐{Ö╝PZ7¼cÜ╨\ÄC`⌐|▐ù╫■├ñ`╞`⌡≥ñyO¬■Y╢ kç∞:╪╞µ?▐V╠≡4!!·╞l╟Ea╥&²£üQ`≤ó²Ωáá± _╡ßíBaCVb7╬ ≡W1a_B╞▀ï╡\-+KI╘┴,äWƒⁿ╪╢√/ª╫δá≡W⌐ú╩█&;
  2345. ⁿ`æe\πÑJ╠lH F─▄╙¥┌D¥û╞ΩCτ┐Θ<┴─∙╦Af]j1≡$Ç╣@°
  2346. ╛\═X∞        Ü≥!!δPe╦ú√t=;Y
  2347. >╪╙╫âà∩Zj╢Ω]É▓ÜI²-,UG╨Θ
  2348. 0ö%·æ▒╗Ñ«∙∞ï├╚^ê{¼àVEd«ôéæjΩkh∩╖▒┬╠%xÖ¥kε!
  2349.  
  2350. ΓH&    &í¢:&╛èì>Ç8ε╞÷∩≥╓╠╞╙ÿ╠s¡▓╓zgMƒ─\äHA8.O[nO⌡ìJuf@Ñ<^o╢ú/■₧A╝▓░æσ╓\
  2351. ÿ4\.u╔╣irº╟ÇX[åÉt║J╣s╨⌡EGI5Σpù╤]Ås⌐9┴ô╫≤╚═ßå█çt
  2352. επRGºi~É»5╤═ΣM.▀LÜ·)d╣╩}╓Ja─, ₧ε.┘╟╞φσ
  2353. «┤cP╕≤íJ`R]bŵ?cVs┼▐!
  2354.  
  2355. ΓK*
  2356. <4í¼>(⌐║í/æ7ε╨╡îφ╪╩╟╜≈σPB½╛╟taAS┴▐~QûKA-aIZn¢δwV4F╡}GoΓµ`▌█L║╢ú¢╖█╫y[fo▐ⁿb ε┌┼WL╒£Va╝B╡x▄A°T_ 6σmæ┘ôL4╕9ôƒ╠≥╔ε1σg≥±·`O¿²VC▒ Φå5╥▐X⌠uæ╔ +!!■┬v╟Po╘6╛╥ÑHu┤╜╢ôèoα≥l]╛≤≥ |kTmh╬>±3t└∙ƒñ-mC╬ê)éYé∙▐╢╝rφ╜Å╠ûd⌡≡╞▌26\n╓┬qSΣ±`╙YIφ¢«¥é╞Æ╨πτNτj·P≥6╔ß╕╪IkN
  2357.     >²6ÇΣmf₧9ÅG╙pëurÄ■uα 1Y╧¡²^4)Y}╫█╒╓Và≡a!
  2358.  
  2359. ΓK*
  2360. <4íó7=▓ªêp┼>╥└²┼≡╨ƒ╓┐µáTL¡▓┼h)W±ï2^Æ\P#aU>f┤▒ Pp'[ª<*à«. ╠C¡≈úû≥Åâ|Q.o╚ⁿ~7á═ÇMG╒üv½÷yò∙_K6µ$É╨êJq∞3╫ùì┤í╩Γdâ█òp⌐ΓX╧
  2361. cz▒√!!╫╤XºH<ΘR╩Ωmh ≤j╫G4ÇÅ╥èHI²├Æùµ
  2362. ⌐≤sπ╜≥i@ c<ïΓ9~Av┼╩─╠3tE@█å<╦[ Å▌╨½≈;ñÄô╠Ö;ⁿú└√"HCçR≤}Yδ▓h╘dTΓFìêöÇ▐D┴û─╒Vµ>╜V»^»Ä╞╠JoZ    π6É≥k¥-▀G┘>@Npâ: ╢Φ0∩ e[─¡φV=zIs╞╥╫â│≈N#╣°    £öïB┘#*YEÿ░% 2¥`Æ°╠█óç!
  2363.  
  2364. ΓK*
  2365. <4í╜3>ù¼ÿ"è;╗öⁿ├δ┼▄╨■±ñGF╕┤╥rv[ Æç?FÆXK8g^@eƒ├.Ko0N╖y'Γî%⌠█P╝▓≈è ╩\Æ`Vj ╒«-!!½╟─\ÜVçt¡F·=ö∞TA1∩c▀╤W▄V|⌐@1▄û╞╕Ä═σg÷ÑÇy¿▒TK»pwç┬6╩╫Pπo▀P╧≡(!!·╞l╟Ea╥6┤╧┘w▓║²∙∩í±s!
  2366.  
  2367. ΓK*
  2368. <4í╗7:«áé-¿:⌡▄α╚ñù╠┌½αªV.╒╥éKaA@╙É;┌c/`^Aj≤┴!!2J░hZdÑ∞`≈█Vº│≈æσÅÖpa ╬«l1½àÇ]Mà¥|áD÷r₧AΦYJI5ε`Üɱ(╞i ôæ┬Γ∩¼r¢▀ç■f¡≡Cg«ah┬╡n₧╠ZδGo┼Q╔≥#bⁿΩ}╓Ja─░╚åC{í╖█≥ß╗║6╨≤╖%+?b1ü≤<tbU▌┬╨ßJb)QO▀∞EΓ3ùΣ╘┐≤sφ┐Æù┌vö±█╓EZa{j╒ò}KΩδ)ênZ°%ÆÇÇ¥ƒFÜ█└╝τ<╝+α&╤Φ▀┌eh[N2π.╜÷ `╪Y⌡'╢q(+tÅth╫╗}α 1─úⁿDq4K{îZÖ╞▄Wëφ[m■Æ#÷ⁿ÷.╖;1DHKé≤%¥mäΦÿ┬«╢°╡é!
  2369.  
  2370. ΓK):*⌐£&ê¼¥?î-Σ╨▀▐±├╨╓▒■╢    ╜▓╬zFQ┐εWºMM<oOV+B╢áJq#]πk[o╢ú%Φ₧V¡≈░Æ°═╫{\
  2371. kc╬ⁿz;║┴ÇM@ÉVÇp¡J░tò╝SF<Φjÿ₧ZôLrú1└╥╫∙îíäMïôû<½≥RW▒ab∩àZ▌╙^⌠Ro═Q▐V·#rφ╞v┴G.£┤╚ïKpâ╝≈Ω∩º°>O≈ó▀`o/"`rçú?t\^Äìƒ│Kh2W@├┴&àRä∙┼°·sδ╖┴┬Å,⌡÷┌╬    w    ╣< uL±²)╫hα
  2372. ▐Åûï█Å┘à⌡G±R9╝+Φ'àε⌡╧CdJ].▒#¢≥mwö8ÜX▐Usöoté°:∩g1ó╦╤U84Np╤Z╚╙╒Q└ΩR"▓φ@ïå╣U╤!!bS╬÷d<éi┤≈┘┴!
  2373.  
  2374. σA3'5¡ü7┐╛«+û:╗öφ═φ╥ⁿ┘┐ß╢E░⌐σcz[B█è9eà^T:kI    +
  2375. εêMo(HÇpRy▒δMÉ╖!!ªñá¢σÅÆ4M~e╚┐a3╜┌Ç_GçVçpεTñ|Ç∙C
  2376. 4αwî₧^ÖLq╛(╓ûâ⌠╒αgÇ▀ëû
  2377. ºτRVΓw~î»^┤╢RΦE&╩F╙⌠m`≈ç}┌K}╘6┐█├Sf▓╛Φ√≥F½°aO¬«≥(%BPg'éú8tU╤▐â»^-/V\▀ô,ç[à░╪½æ ì╖Ç─ö*┤Ω╟ ╦Kufxn╓┬
  2378. lV±Ñ`╬jxαìÆ╙¥╩X₧─╞ΩCτ!
  2379.  
  2380. σM4
  2381. 99╜á<s·¿┐>ù:α┘éªùò■┼«≈½W½│┼;aMU╫ì(WàP%.Z`≤Ço(ó<Ue░ª!!ε₧V⌐ú≈ƒ╖┌à4I{l▐ⁿz3á▌ÇMG╒û7├)█∙╧E] 9∞$æ█Aêra╕!!0▀╚âσ╔¼u╚₧ûû!
  2382.  
  2383. σK$8=¬¢3=│ªéG∩Vú⌡ß▀Θ╥═ò┐▓ú\V¡√┼wvES▄É~SàME3.X\e≈êPh!!╖tV*ªñ#∩╙G╝╢úù°┴\ÿffeÜ«h1½└╓\Z╒çpóE°·h╧TJI{σk£╦TÖL`¡5▄£ΓΓûαuç▀û£n
  2384. ε⌡RPúih╠¡^┤▓5Ä<╔S▄Vπ$Uα╫}δLh╧╡╙ÇQy╢á∞ ⌠º·FS½═╖`TKKú(╞%Up~α;!
  2385.  
  2386. ΣI.7⌐é7'«≤╠+╢+≤▌ß╦╛╪╤Å■≤òFW½║┬wv{B└ü?_╫2.C&Z` Åo"J¡hZ~╗é.∙╥W¡ñφ▐│ìU^·7igfε«x7⌠ë¡3!!ⁿ¿F║Q┐sùA°^IUï÷╖0⌡y.⌐?█╥▀╢í╩ßd÷≥╤N
  2387. ╛²VGº tùφ?█ƒN≥N;╔LÜ·9i╣╘q╠Eb┼á╔îPqá∞òöìl┴¥    5╨σ│    
  2388. %K"p╬σ#"dJ
  2389. ë,╠!!ƒ╡Ml>OIΘò=Ä[╓■╘áΦQ±«█ì▐yêú└Θ;YⁿG²?aK÷░k╠hh°¢Ç₧╬╤Mâ┬⌡≤V«R5╗hΘ°┌ò╡s/`I H1Γ2╔╖dí!!ïZ▐MGPÆreî÷uφ=H°╖√v=6Yσ╠█╫C;╬Ä6Cë■zïçûI┘!
  2390.  
  2391. ΣJ1'7¬é7'«─µC╟∩╟°╔∞ù╦▌╗▓½RN║¿╨zpM█è*]╫HL#mSl∙âU&4J│nVyºÑ4≤╨E@╝┐▓▐σ╩₧b[.t├¼hr╣└╠Uù▄t╜┤xò╝VJ=≤eï█]╥╞mV║¼╨≤└ª3£Å₧┐uε⌠YR½ruÅΩ=╩!
  2392.  
  2393. τQ+,    ▒Ä> ╝áë.½>∞╤éªùò∩╟╖ΣñGF ÷ÇZ}[A╫û~FƒZ?`RB~
  2394. ╢ÅTcfI¼n~¬«`Φ█Aíí▓î╖çäaS    `gÜ╡y!!ε┼╔[ZöèV{»N│=Ö╝DA)⌠a╓│3⌡Cw».╫¢═±î┤|╚ù₧╙u¿■EIúlJX¡┬s╨▐RεO(î\╒σ(oφ╬w╠ ,¡U▄╢Ωzg╢ó■╛⌠╕±LU╗á╝ `
  2395. L(u┬J≡<w^╚╚_τ╦!
  2396.  
  2397. τQ)=╖î=αΘƒ?ç,Γ╞µ▄Ω║╡╝ⁿ┬╖ZU╛»┼;>w▄ù)WàEjHn}H+╙▓=`)]πh[oΓ¡5⌠▌V    º╣≈ù∙ÅÆ4Lme╙¬h ε╚╘\¥╙{╟Pªxô·XJxεjÜô[¥Qq¿@`┌£╫≤╦Ña╓MûòùyΓ▒DQás    iï 'É¥2ì,EÑaÆ÷!!g╣╫q÷[~┼┐┌îrªá√┌σ½╒t∙≤ºfT\r{π`è~1N\╨╚╨ßJh0E╖δFΓCâΓ┬╜≡g!
  2398.  
  2399. τQ)!!1½ü!!D╨└╬ ï,÷╤²î ùâ╞╗π░VM╝╛─IvIR╙å2W┤PH&kXGb°▀^V`fiûRpNçÿ║═V╜┤úïσ╩^ôqM|i╪╡c5ε▌╚\% ₧aªL▓n╨≥[=ívÜ▌\òTq╛@t╥ü╨π┴Ñ`╚ï█ÜoO» M¼tiäε0█ûºh)îK╥│?d·┬q╘G|Ç6ó£ìK`≤í■╛ßF£═PyÆ╔£.o/Bo1åJδ<u\╧├₧¿Vc/ ╬ë*à₧⌡æ¬∙r±╢ò─ö9⌡α╞├4 ▓<δxSó│lÇhVⁿç╧╤π╡%±┐√«┤?α+≥6╔ß╕▐R{F\)⌠$╙⌠ pƒ7îƒNNoâct╫╗╣e@ê▒Ω[7zL p╒>█┴┌e┌úU!
  2400.  
  2401. µA)'9░è_C╙δ½/ï:≤╒√╔╛╓╧┼¼²╡AJ╛»┼;WGZ┬î7\╫PF kXGxOΓÄ^Nt'_πh[oΓ┐9Ω█¡ñ┤î■═·7w ╬┤hr╝╠├\AâüX5åB╕y£╝PAx∩eÆ█ôP4½5╫╥└·═│{ì▀Öè<íßGM¼gJzÆ !!╤╧Mε@;╔2░▒@ ö¡∙|}┼3╖£üEg║¡▀√ε║⌡tYäì╪ckjHKu7é ú)aJ|└샿]N0B_╥▓&îTÜ░╒╖ª!!▀αäìåS▀èá`▄;R ╜r°q|ε░z╚7ΘFîäÇ₧╨Fê╙ƒª
  2402. τ<╝+µ&╠π█╙UaF0ß#╔╖(%à5ÿΓu++
  2403. ën:═Φ0∩ eH╤▓Ω{88
  2404.  
  2405. k╞╠╤╒Eô└P+ñ≈zûÆæF╥l<_Q∙¬!!C!!ⁿ■Æ▒┴ á╝▒╛╩à╧SÖ{¼àV^~αù╧╬9╜mh ■Σ≡å╓:}æ┌?▓ÿ⌡F¿°Φ:áLq$╖┴±Pì╗wëτ⌐Uì╥zφUu!
  2406.  
  2407. µA)'9░è:αΘé+ê:í╥π═∙─àò╕■ñTP╥╤⌐9TMX╫û?FÆEj`^D+·ÄXjf@ívVi╢δ7≤╩J@╝┐▓▐½▌ôu\ kS╬«d<⌐ùÇWIÿ▀VróL┤|£Mæ;&6Γhè┌PÆE4¡%ôé╠σ▀⌐qä▀îü}╛°YCΓo ;ûτ6₧╦F≈Do┼Q▄ß `φ╬w╠}╒<╣£éW4▓áòöë/î²sL╕⌠▒BvSWj3¥ú9eG▐╠ÜñK-1FX╥Ä+ÿÖΓæ¼⌠dñ¬ô┬è;º≈└ ▄E6C▒y±qMÅ█╞xU∩ùÄ¥¥ƒG¥û╤εG┤9⌐{Φ=╤ΓΩ┘ElL.≥%Ü⌡(a╤6å╦DJ▓ypê╥;σkè╧à:[SYr╨Z┘▐╓Fî═]'▓Ñ    æöÆBÉAR9G╠⌡6)ÿcÖ▌╘╙    ┐·½δïì╟^¢KεΘ/?│ùâï-¿lc
  2408. ·¬╡∙╫>açƒ>Θ!
  2409.  
  2410. µA)'9░è%╗║ƒ    è2∞╤ß╪ô╜╢ùÄα¼EB½╛Ç63mN╞û?QâE$wnµ┴Mt/Añ<Ry▒ñ#≤▀V¼≈áùπ╟\
  2411. ƒq    `t▀«k3¡╠Ç]Måüw½G÷ëAΦYJdRêvÜ▌\òTq╛@=▌ûâπ▀Ñ3ü▀Å£< í DP░u    o┬εs▌╙^⌠Ro╧P╫÷#u╖çL╩K}Ç(╕╨Ådíí· Γ
  2412. ▒┤bY∙≡áq_8a>çΩ5u╦┘Q₧⌐\9A╙å'ƒô░┬╖±d≡▓ê├¥~á≡╠┌    w«y▓M5Å█▄-H° ▐ëûé╧[Å─╠ΦE┤<╗l≥s╠π⌠╘_)Sk#T╣$û√+%û1æK═UKlêFlîⁿ&ú )Pσúⁿ\kzd]┌═┴·K ìµR>■┐@ÖíìR█vxk~╟ⁿ">sⁿ■Φ╠▀N÷τ▒à▀Ö┬Q¢╖ûLB!!ôå¥╩'≈"3I⌐≡▌ñ¼,t¢£l╖Ü∙Zç⌡·:Éc:é▌╠R£α:Ľ╕{ä┴░,Nε├╬╥=▄¥·W äX]î▐f'╕║╡íⁿTH┌)?╥╛═M|æ¥╛YÖΩÜ)Jº╨#ⁿ<=┤┘:%ÇRMⁿ╚▒Σ─çhπµò캥BP≥aLæNΓ╢¡-Γ₧└┤ó:@ ₧O5▓⌐Æ|R~─ ≡╚D"}Ä▌ºZ▓çëRµ Y╪╨░║╧█ij_≤»┼Jpm╩    uO╤6²`Θ¡₧5,╔╘╢ΓAñε─╛fQ─mD╝Au¬@C1]╦*φ║òpG7│M¿p¢εy;ïöÖüs▒To Z]πP¥öτN⌐τ1╚⌠ƒ½╠Ü.╩r.]∙╣²4û⌡╞æk╪ΓrcÿNJF≥ìbrÆ└;╗≡■┼'I▐╘Zùç[╩ëªK┬c▒+2 ç1
  2413. üùbqb╡°·¼εdú
  2414. Ox╪≤~▄┘╒9┘ñA    h`^ΩhÜT    ╖ΦâvMá,\&⌐╚ßΘa¼Ωc0≈ïπ⌡.¬ï─6╡'eΩæV╪╞╡    ├ÿcªφP"xP╘ü└HªI≈╔┤ÑóM┘Hñⁿu║Æôcⁿ|┘₧╫ö─.┤Äe√ü≈R┬r≈√Læ┌íÆ3⌡XNXo─gFZ!!M(▀1▌sí0╖h8MΦúÖh)┐■╥~áW⌐Eα▀¬?▓;L-ké°■Mü·å!!^¬jÇm╞&Bÿ[/ü■<╥1├n╛6±⌐ÑHdⁿÑ║Æm⌡U60▀,ä«≥qSº°E√∞Σ╒=É7ç3ÿ]$T`ß┬#¬ß<╟}å√1≈$°óï,≡ Å")∙Ñâ ▓üq∙║╪?▀╛# ¢|H■    XÆb╓┬╪uÑ╗╝O~▌╦v▄»π∞µ<î⌠@ü╪B¢Åè╛┬+2{╚]╚F¢æ├╙≤╥}⌐bαaºΣSr■∞├δτà⌡ècX╩~├.τ<'┬q╜╢▓┼á■H│╡>|
  2415. ₧ù¬åbh═«NÉJ╒▓╝V½ú≤3≡2{;Ö╝)gûk╧,▄╓_≡çq_l |▄Xù¢ù▀°Cƒ▐4nσ±▀Æε&ƒ»!!}≤π╛=▌» y╣≈|RS▀╠╦└ µ╙⌡▐&┬f¡cb°g¼k╚╒mb┼zy^(v║U`NΓ⌐VΦφm/¼Sφφ╜╙5/tA╨b▌ εàìΓ┘ù∞MM ¢₧╝╚aåO½╖wU└═≈uó⌠▄|cB⌠≈â|╒▐╜¿4-Äp)ªm╠ⁿ]±ìï╡╓₧c\ñÆ'L╘╢%u:4â¿╗Ö▓[╚ⁿτ╜Æq≡`àΩ≥zΩCφá▐<I9¬▓▓■·φ╥5~å√t╘H╔Æ≡bôΘ╚┘╝C╪▐Γ-go6%&g)P⌡M┼aë╙)ÆeÆ«Iτÿ│▓÷ëïè░üI╙╖¬wßzßé:í    ╣p<
  2416. RÉèa╧âΦ«î╩ò`Ü╛¥X7V
  2417. £S╞
  2418. ·ⁿα@¢gá└3ñ╝╢⌐pÇn(▓┼Nî»óFïεÖYpσ?3(`%│═Äå|ç^_≈¥┬╔║δè⌠íñ±╝╒Fßgâkc/│wσ⌠<@¡~┤╦░░ß╔¡É╫╡.ƒg≡≤2|î$╤z1è[`≥cqu░~
  2419. É≤úÇXô-Ü α%╚∞o·εP╓A▐û┤╬W!
  2420.  
  2421. µA)'9░è%╗║ƒÇ9Φ┌µ╪≈╪╤Å■ß░TD║¿╘~wfW▀ü~?²6|REj≤┴SA#AªnR~ºδ!!⌠┌ªñá¢σÅ^ÖqI@ml█»~r║╞ÇNZö╙}½ódÇ╝UJ;≤m¥█]▄@m∞4╓╥╤≤╧Ñz₧ì╒╤e├¢>XΓptÄⁿs▌╙^⌠R═M╔V·#rφ±y╨Q.├3░╧Év▓╜²▌∞╗τ J╕≥≥
  2422. dTPP3£ú3eZQ┼9╠Åß\u5PX╙Å(¿Vàπæ║⌡oα│Å╩┌"╪ëá└
  2423. ;RYß<∩
  2424. xYóóa┴^Φ6æăá▐E₧┼ïï(¥<╗x≥─⌡δƒ@)FZ)╟6üΣm?╠t╪    æu++açse«≈4≡eòΓⁿR=<
  2425. ┼²▐╪W╬Ä6Cí■[▀╧┬═)4V╟π++öIÅ≥╦╞ó╜╥║╩ÿ╪▄K╡âBS7┤ùï=╩'¿, rÆ╗¿╟╓+xÖ¥½ëπGQ■ñ╗?éR0!! ï╞▓-≤ê6Å│¿Uå╡F«=_Z▐Θ▒└;æ√ò'╪Ω oúå
  2426. g+╕≡ÿ╩¢J╦7.Çú╦K(ï─≈LÜπÄzñ╬<¿=!!╜┘q[■2K÷ä│∩¥O╒0π⌠£êá╬_K]╔$T▐Hε∙╘∩█╧Ñ÷:L£UC4û░ç(½p┘╒MV{Ä╟⌠6╒δá5▄H╕∙╬┌▓╤dj/÷⌐δKl#â@==^Z└o°v¼│╫69╔╧íε¬ε╘ xVîl^Φr¿CG:Tƒ?÷≤æ{!!ⁿKT╣8ë¡6eΓ╛±µ╘Cp\4 pƒƒ┤ºú<╤°¼hÅτ₧MÑ9p6[²∩ôX±Ö∩µïσ⌠47*°ª{kºò âεL╗╪Sz╚æBê╫Jôò¬;P┴_{⌡,Ü1\_└ÇrV{C╕∙≡√ße╢~^mÆáy╦▄▌╫╧$r-l_≡o╙UA╤Ç∙ dº:j+s╨âäî2Ræⁿz>W«╜Σ⌡.°╠    ┬+▓,=|ö±0┐1Ñ┌x╛┴í╛Ra/%z·╧¼/¡^ε╔ì ╢├O╨ñ≈|╖æô7⌐5X₧─╣Ω╕F╤╔j≤£ú.ù!!φ»ô≡[═Φí u¿CCY+M»┌]┬sP╢^-']┴∩zⁿ[`■∩╥`╜[Jεr╩é╦_Ü9:W`kå∩¬ôXδ├`_╢dÖ,╞,P╘^%ü°5╥"╞c√"┤╜▒Bj¿≤{╒┐@╟Q5■2Ä╣ΩR╖>º≈µδèd╬zT²NƒBhtµ≡o╡│}Æ?┼╪~Γⁿ∩ç1┐░ö<α╝ÿ7╛¼säô░0╚·z╖íwW≥    S\¥a≡Ä╤cñ■∩Mg╘╒5▐íΣ┐ñdæ╗Tà┘P¬èƒ╣╘{Γ ⌐*4σè─≈π┼gΩïbÄä)[╫·┴πóÉ°æd]êæMtçh8o╣╞æ▄╜5ñ■H╘Ä#p1 ╢òí ..≈Ö_₧#║▌▄1î╛⌡;╣7u#£╝04▀%ôG╣(ò
  2427. åσ?g£rr√É¢└Ω
  2428. üù9v═4:₧ûêΓuÄ║fìâ╢6 ╜¼0ñ╣nZZÖ└îéH√Æ÷┼(▄µL    ▀c»kΘ║-#╤l57N╖Jrn╫╖SΣí)½j·╢╒π~3'¡)⌡ΦÇ┘ ┘┘╛[     Éæ
  2429. ⌠ëf╟O▒¡#D▄└ñIΓ¥÷bBδ⌠╤c├ε∩¼8+7ïgnïáüU■ºÖ√¿±PuáΦA*▒₧yodxê▓Φæ╓?ªJÖ
  2430. °»┴q╕;╩»σ"yπ─¡▄;[u±╤y╘Ö╔σ┴6pÖ√za▒,¡■Φ#ëΘ█╒
  2431. ╗_YΦ⌠ÄjMt-qa-OαM┴hå┼(Ñ~öímτ£#┤α■ïÇΘ▄gπz·æ▓aτ[≥à╪XS»{= YÖ╜~≤┘╗â∩¡∩≥┘ù[5 QIM½E≡ε╡ΘK]⌠ ┼ΘY⌐░¿äh█=(µÆS╧│║EA¢°8±!!àX_ol4╖═ÿ┘f┼2&¢╫ºl│└É:è≥ì║±¼└bAΘ^╤V▀ ╓▌P~Z╖m│└qⁿ÷╫┬'≡z≤░íf¥cτ╓smÉXsë4▐Ofε$v"Z∙y
  2432. »ßI¿Ç_Xî?╖oå!!ç∞u∞╝F╫{╪ç┐ìeu[7¬ÜJæ╩█µ"┬Ækç ¬■c[àh⌠,äΘ╖}»∙╦î╠µ╔╡?k╩┘₧╩2&─╫ü▐±    r╢&∙ÆCDâ{╞'ÿ\▌jb╩M9lk-i XM│>Æ^·!!ï┤0├│Bf ∞4ëΓÑ▒&[mΦ╕p1àæ÷≤╙┌Ä 5zNö@+Sâ`╢öα !!á5'σ╩_┌╤▐Ü£à]@$¡qr╒y2\∙░((≈z▌╜c¥~▐[s(D5α1pçJú²±0╝▓=╒5ä╜)'äx▌r╗pªÑd∩:y▒«_∙£0D╪±pKlOU)n┼7╞7q4"óδBîZ(Kµ|Ö┌P╓d⌡û-@╛ï╜;(Laa>ÉτyÜc■c╒≥▌|∙Ö≥■Uεâå$4ûΘ90Q°ü█ Wyq╠Jd╥╣┴·;φ∩Y½t╞╖&è╟ú≥u╞}ra┴;@}ñ≥┤G6äY╛«Üt«▓~╝┌√ú>Uyö▀,Bª≡à[q╬F√Ñ¡óα' )╘KÆIΣy-≡∞uπ0╕Σ=FK/ ║⌐^└▄¿    (≥¬¬NÉ8ZD┼£└" 7w ∞QâUê)▐ñ╧%Fs¡&Wⁿî╪O╖√¡\┼¬» 8²â░'≤bñîIr+_
  2433. uδ│═╙àgoº`πÜá Ñ&%⌐Hh|/¼╬èdoJE¥iZ^wm╜    _`╔Cd`M⌡ßx5Qä6▓■┤.*Ñó╙b3<$╦≤¼√±Æ▌╧
  2434. n╛ü╣cá¿z¿cε8J√¬q`┤$Se:╖à
  2435. ßçí    ö    ╞╟▄╙>Xlr2bv═«û⌠²òU2ád╒ >¡ P║╗∙uºn▒⌐z╖åF[δâì╘¢pπ╤╘αÄ√áïæ)è▀⌠┴BαlÇΦöå▄▓Ie▒▄┤Q≈XR¡kS╕½9â╩?°P╦¼≈sFY╥òƒ╪ñ ┬╖p#ú
  2436. "[│┬ ≤│~≥YÖµφç╕,┌┐ròr¢r-εTτwëé¡`¡Å[uî╨¡≡á∞?{∞Æ⌠Γ╡■╛▀1^Vp─≈╬Θα@çl√ !
  2437.  
  2438. µA)'9░è%╗║ƒî;ΣÄ»═▌█▐╞¡ƒ╧:¥óÇvNW╟ê*╫[Kj`TGc°åP!
  2439.  
  2440. µA)'9░è%╡½ì&í:τ▌ß┼Ω▐╨█╙ÿ╠s¡▓╓zgMƒ─WÖZV+z^jO√êPk'CπxVl½Ñ)ε╫MΦ╕▒▐π╟^àq]gv▀«-%ª└├Qéƒ5½M╖£╝X[I,ε$¥█ÅGqóLQ╣√╩≡î«|£Mù₧Æn Γ▒^JΓt~┬δ6╚┌SΦQ"╔Q╬V÷#w≡╒w╠Ok╬+ ₧ε.┘╟╞φσ
  2441. «┤gY╖σá `aYd3é.µ9FD└├K╩▓\a:K╓Ä-èV ƒ■╒▒≥fñ▒ä╘!
  2442.  
  2443. µA)'9░è%╡½ì&í:τ▌ß┼Ω▐╨█Σ▓ó_L╜ò┴vv%<╗╞@₧IE>k+(≤ÅKg2Jπ}g½Ñ)≈▀N@¼▓▒ù∙╞ÿzh ╬┤hr╝╠├\AâüVbªJ╡u╨⌡]CI=∩e¥╥\▄K`∞3ôÉ╞╢▀ÑvåA≥±·u    ε XPΓhzÉδ₧╓QºU'╔▐σ(m÷╫u╟LzÇ:┐╩èV{╜ú²≡⌠HΩÖ
  2444. 1╙ëîi@s0ìΓ#CJC┘├âúPa5WU!
  2445.  
  2446. µA)'9░è'⌐╜ì$å:╥▌δ╔ñù▐÷▓≤╢@.╒╥éYjR╫é?G¢KjjTeΓëWahùshºδ/∞█Pí││¢∙Å╫gKml█»~7╜ë╫QMç╙p¡FÑnæσ!
  2447.  
  2448. µA)'9░è;╗╣£/ùRï╜¡ⁿ∞▐╔╘¬≈σÿ╛╬~aIB╫─?ÖZSj}NQh≈Æi èXZy▓¬4∙╓á╛┤û╖╪çgfeÜⁿ} í┘┼K\£ÇVtáG÷pò⌠^Kxî÷╤_▄V|⌐@8┌ü╙ ┬┤vÜ ₧ÿû< ½ΓTV½b┬√;█ƒK∩Do▐Z┘·;dδÇkékZ┘/┤⌡ìB{²├Æù┴╗πeN∙⌠║BjD_e&╬µ5cND╠ìYâ»y4J_Üé.ÿ_Bù░ì¢╙L═┤ò╚ê8┤α╠WÅ"    ╜o∩F:Å█¬G¼ÆÇÇ¥ƒT÷╝¼σN⌡#·1╝s╓Γ⌠┘ZAlA[<σ2┤√"gÉ8╗K┘OKwÅon├û_è P╬Γ²R<5\Q┌Θ└╪Tà±Op≈ⁿE₧åî    │FQCE─░#3ö~û∩▌±¡⌐Γà┬Å╬▄[¼àVEj═°µ╬&½"a⌡╗ó╧╤:XÖë8ªå≤Q"¡²■s├C|6ö¥xû)ºΓ;ì┤«!
  2449.  
  2450. µA)'9░å='£Ñì-ûRï╜¡φ≡─╚╨¼▓▒[F ¡┴wfM▌é~FƒZ8kXVb≤ôYJ&aHªrVxú┐)⌡╨d ⌐░ñ┘╖╞âuPk ╠╜;»╦╠\╫{∙{╟D│sò²EF6╟h₧┘J▄Kgé    0ô¢┼┬▐╡v╥Mñ£ûr
  2451. ╝≡CM¡n,wâΦ ₧àºR*└YÜΩ=d╒╬zéEk╬:ú▌ùM{╜ê⌠ τò║6╨▐╡ `TTo=Ç,∩7b!
  2452.  
  2453. µA)'9░å='£Ñì-ûeí╒ßπⁿ▌┌╓¬ƒ╧:î╛╘;g@SÆÆ?^éZ%hGc
  2454. ╢ôZc/YªnyΓ∞' ╨G⌐ú╛æ∙ΘÉg@gn╔¿l<¡╠ÇOIçÆy½ór╨⌠T*µqÆ█Wê4¡╤ÿ╞⌡╪ε1σg≥±·{
  2455. á⌠EE╢iuñπ2┘╠╜o═Q⌡∙(bφ!
  2456.  
  2457. µA338(¿╗+9┐Çé,è⌡Ä»▀δ╒╠╓¼√╡G.╒╥éZ}[A╫û~SÖ Vr]
  2458. ΣçZcV│yzdññ~║┌G½Ñ╛£■┴^â|[@gn╬╣4»╩┼_£¢VaªF÷r₧▒SN=σ$├╫WêGs⌐bô ⌐ƒ┼«wì╙█Çi╜≥EM▓tF;ïßs╩╫ZºS*╧Z╙÷?!!┤çl╩K}Ç(╕╨Åv╢ε∙≡áÑΣlY┤σ╝a\r7£ Γ51F^ë┼╩óX~9C▄┴.╦7h ≤▐╗≡`≈⌐═ìò,⌡Γ╟I╞ ?
  2459. ¿y°O}Q÷┤{╞lXΘFùÅ╙Ü╫M█╒─⌡G┤6·j∩s╠Θ∞┌@hL}┼?û╖$kò1çÅXHQ#ôseë╗4≡J$Ñ╚åD!!?I┌Z▌╙╩AFö∞+┤ⁿLîå▀S╓)xTU╬░-)ö~æ·█╫N¡⌐Γ╣╚é╩KÖ\αôLB,αô╧┬9╜kh ■¼╢╧╞:=╫ô*τë■M_µöæDΘ)lwè├╚YëΣwÉ╩╫=âûW» åΘ²£i┬⌡£8╓äF≥ºOk*₧φ╚╬╝WKÉzc╙▓╧L|█╔╩Sîπ╡gD¡£4ⁿ9¬╥@Q·>m÷┬╡└╔¥&╢≈âé│╘Rù    d2ìYΩ■ÇF∙₧▐░O÷@ëWr?çí┬5VRúrò⌡[jOèö╬:╚Γ╘"═p¢╨τ┌½╥Egπ!
  2460.  
  2461. µA3445í£/ù¼ü(Ç-╗öΓ╔≤▐█ò╜²░]Wσ√├VrPx╙ë;A·5-h^IZ}Γä^&A░kVxΓ¬.║▀P⌐«≈¥°┴₧zWi ╬┤hrá╚═\[╒òVaªF÷pò ■T]I7τ$ï╓\±(╛?╓¢╒≤▐αzîæÅÜz½⌡F╗ sç»o≤·r┼dσ{äZ│ d⌠╬|î¬R█╡╜Wq┐¿╕εΘ2▒Σeu╖µ╜J`R{
  2462. k7¥%σ:5|MU█MìżPi|@C╧Å;╤╗±╔û²lß⌐!
  2463.  
  2464. µA3(0>Éû",αΘä8Ç9î╛åÄ╬┼╓├┐µá ë┼oaAS─ü~SÖPP"kIB;∩æph @πnVlº╣%⌠▌GΦ╡«▐π╟^àq]gv▀«-3╜ë╘QM╒>í3SÜzåX▄A⌠CJvî÷≈TîNqí2╟ô╫ ├«3ªï₧╔<.║σRI▓t;ûαs╠┌LΦM9╔╬│9iⁿçy┴V{┴3±╒ÄTx╢ú²≡⌠╝²oR∙⌠½+8a Xτ4½5}I╩╠Öß4U*C╘╡6¢_+ÿ÷▐Γ╝)≈┐ì╦┌.╝╫╨╩,9C╗yΦ=qY╓¿y┼DUΩ    ─┴¢£┌N╥ƒ¿î+¥{1⌐B∞#╔╙ß╧!
  2465.  
  2466. µH(44╔σ[k¢ºƒ=Ç-í└τ╔╛╨╙┌╝≤⌐L╜▒┼xgB┌ü~@Æ\A#x^A+≈Æ^^c(J▒}GoªΣ7⌡╦NΦ░▓É≥▌
  2467. Æ:3jNö₧#rÜ┴╔Jéƒ5¡BúnòAΦYJI?φk¥▀U▄V{∞9ôò╞°╔▓r£¢╫╙u    ε°C¬au┼√s▄┌ZΘ.└M▀≈4 ╗¬»(▄│╒ì@}╜⌐╕∙∞    ¬⌡lÑì╪clHQh5╬P╛W#tCVë┴êáUO5MH╙Å(┼7h ╕╓┤≤cσ╢┴ù╟~╖Ω╟╞ 0K░i∙F4V±ƒ`╠-6åo≈êò║═]₧îà▌E°2╗gíiÿºδ┌@)HG8π6ç≥
  2468. i₧6₧B√GKmÅtié⌡oú,R╠½ßPq1OCÿw┤╗τC
  2469. Åß]&!
  2470.  
  2471. µH(44åå<-│ºïG∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3\^╫─9^ÿ]E&.YZe  Å.)]πh[oΓ╗2⌡╬M¡│≈Ö√└¢4\    `d╙▓j{ε╧╧KüûVg½@│tåε"cQ╧kï█J╞╞imÜ╥≈■╔αtä¥Üƒ<º SM¼gJræ»=╤╦⌠@9╔[Üⁿ:o╣╥v╓KbÇ>▓╚ûEx┐╖╕∙σ¡µaH╝Σ≥ %QPKq3ÇÄ}Ye@┬╚╩¿W-/WI╩┴8éN
  2472. ╓±▀í╝b∞╗Å╩ƒ-⌡Ω╟I█2K╜o∩OxVαúh╥tⁿ¢çÜûæ%±┐ù»▌p¡ní5╠ΘⁿƒNh[F]5⌠wö√"gÉ8▀L╓EKmü i₧╗:÷!!]▄ºδy30û╓╫ÖC
  2473. Åß]&≈±F▀ÖÉI┘)*E    ╦π0t▌,â≤▌▄N┴╨ÿí╬╦╞JÅLαû@E!!┤▄═~íG╟ a⌠╝▒┬τ6ôô"á╚■[è≡≈iε*^üτΘE├íZµ╬╘=▒┘a¬6@î╗τ┬%╘±é~▐ÄLF≤▒k2»≡æïüT╔/9╥▓═^|╔╔≡NòΦ¢+/╚▒YaüG'┐╥rφ7K·┼╢├╘U┘<¡≥╩┴Θ╬JZÖaMùNΘ÷═B■█═╖╣+@ìRI(╢░╪( ¼còπKkàǺ<▌≈ìQ┤v$╝░▀≥ñ█j5ªÇ┘Ayτ$SCM^╩-∞iï¿Ö37╞┴∩½DàΘ▄σ/düoM╝Vo«RK'G┌/█║öz?╗b!
  2474.  
  2475. µH(44åå<-│ºïp┼>∩⌡ⁿ▀±╘╓╘¬√¬]l¡ò╔w"?╒ê1PûSf#`_Ze╢█Cg(n░o\i½¬4≤╤L/║Ö╛Æ!
  2476.  
  2477. µH(44èÄ?,╫├σhñ1≥├Ω▐╛├╫╨■ⁿñ^F ┤╞;g@SÆâ;\ÆME>k_dⁿäM&1G¬[*░«0Φ█Qªúñ▐π╟^àq]gv▀«-;áë≤TIÖçyÑ█∙(±AC 5Σjï▀MòMz∞.3╟ùÖ╢σª3ƒ▀ôÆj
  2478. á╢Cúl~âδ*₧╪P≤;─ZÜ "c°╦V├OkîÑ╘åJ4╜í∞√áá⌡t«σ▀`kaI[Lrr¥∞51FDë┬äφo)W ╚ä,èVâⁿ╨¼∙!!φ«┴╚¢=╜ú▌┬yK& ╡o╝gµ┤e╔o^■èä╔╬ΩFÅ▀╔ªU±U&┐ïZ─Σ∞╩JeVFN8 2ü÷9`òtïF┌XFNläal═⌠7Θ&HäΓ°Rq-Kjû╤Æ╪H
  2479. Å⌠,╕φ    £¥₧I┘)+IéΣ,}çm¢ε▌┴c╞╙µ╛┬ê├Ü]ÑÇ_*┤¥╧├/φlg■■╖╦╦:cûÄ%¿å░Uú÷Θ ùH}wEé¥▓ìΘ2╠│ñDÅùNíx廫┘i╪π²T äB∩│
  2480. `mΣ╢╡í°s8z┘?'╞≈─F3╔┴≥hòΦÿ`LÑ£8±!
  2481.  
  2482. µH(44èÄ?,αΘï&è=╧╒Γ╔╛║╡╝ⁿ┬╖ZU╛»┼;>e╫É~FƒZ-bTQj╢ÅTcf[¼<QoΓ╛3 ┌ºÑ≈è ╩\ Æw[    xe╚ⁿz:½╟Ç^M¢üa½G°?²kæ;&=φb▀┘Uô@uá"5▌û╩°╦·3└Üùò<
  2483. áτ^V¡n~î√s▀╠LΦB&═K╙² uúç╬Mlε>╝┘ε.┌╟æ≈µ'¬τeR¡║≥1iIW%g?ïJ«IpF\⌠^!
  2484.  
  2485. µQ.XR══'⌐╛ë8┼+Θ╤»╦δ▐█ò┐ß╢\@╢║╘~wA█É6âWAj|^Pnαä $K%╬:m╖ó$║╫Q.í╗≈ù±√ Æ.;iu╙╕-h≤ë╙\DôVÆa╝J┤hä∩H1σY╤│3⌡|s╣    8!
  2486.  
  2487. µQ.0íî9s·½à$ü6∩╙éªùò∩╟╖ΣñGF ÷ÇO{M└ü=W₧IA8)Hl∙âU&/\π}_xº¬$π₧R¡ñ▓Éπâ\ƒq] .t╒ⁿ`3Ñ╠ÇJ]ç╙aεK╖n╨⌠T9∞a▀∙l╡f╞i=▌ûâ ╩α}ç▀ÜÇwO║∙R╖si┬Θ<╠ƒ\ΦO)┼M╫τ$n≈çl╩CzÇ6Ñ£èW4£à╕Ω∩FºΓeN«≥╗%OAE&Ç⌠"1XX╠┼ÿßMb|S@╒ö(â7h ±┘╜²e¬°∞º≈T▄ ë╓,3K
  2488. »U°OsSφ│h╠-Gül≈åƒü▌Iùûƒ╗÷>╛b∩4à±∙╙C'"l 0Φù╖w8╤'ÜB┘XFWjé.τÆ=Ω Xê°▓66E┌Z┘╟╨@Hφë5b║µ`¢╒æH╩-\LQ├■ Y}¬aÄ╥▄Ʊ·∙┐╪ó╧b╒⌐éqD1Ñ╚╧(ª@─ . ■▓╢Ä╤&aÆ╢%Ñ╚≈Aá┌≈(ÉHC>
  2489. ë╥╝Sɵ9ì½τÖ₧KÑx    ùí²ü+╪■ö7ÿÇkï▌f-¼╥┘╟å ±-┴╗╨Oà¡ö#⌡ñ┤hLª╨6¿'3┤╤fMεwδ╦·α╬H╪'╖╡ƒö│¥SU▌%L6⌠5Å ╠Hδùîú┐,BöBo"¬Ω∩fxzÉvï╘G{!
  2490.  
  2491. µQ.4Ñ£:¿ªü:æeí╓µ┬·▐╤╥╙ÿ╠s¡▓╓zgMƒ─@ÿRT>.O[nOπÆK&'\πh\*¬ñ7║╩J▒≈áùΣ╟\
  2492. ÿ4L}o╓¬hr»ë╟LAæVÉt╜K°?²kæ;&x⌡}Å█Ç/┼%├ùâ¼æα`ìÖ█Üxà⌠NS¡r5∩àZα≥Z⌠R.╦Z°δmoⁿ╨¿+╫>ú╥èJsΦ├Æùë¡∞t∙¿▀`EQNPKv ü∞5uS┼▐╩»X`9 ¥─~╠Bòⁿ╨½⌠d≈·û─Ä6⌡Γ╟I╩>
  2493. ▓{╝ x^±ó)╔c°¢┴╘╔Ü▄æà÷C≈1╜ní$═ε√╫ZNh\FH}⌡>ò±(wö:ï°-hf-δ
  2494. Tà≥&ú$EêáΩ5/OYj┘Z▀Æ╫E àú_&╢∞A╙╒ÉU₧.=SA╤⌡hC;₧~╫■└╙╝╢⌠·ïè┼òV┤üWP%úù╧╩9φ`c⌡■Ñ▐┴>eÆ₧A═σÜuí╣Γ&ûc"éô⌠Aìí.â▓²CàÄKºx    ê¼τ╒&æ å;äÉX⌡▒Om0⌡Ö▓ª )CA┘)k≥▓╫X%ï╘±
  2495. Å≤¢nG▒╚s    µn5╢╩qZΣ:P±╥┐í╙Z╨0π≤ƒôß╔C£7B╖[Φ≈╥BV■öî½│:^ÉOCj╫½É(*╝v┘╒MV~éô⌐p╡äëR┤v$╝a½╘╥▓ ╫ev5ª╣φHx>äIzvOKàBç └╚■^Wí╤ª╢J±á╥╢a[èd ΩDv╝P;D╤"≈┤¬:╜XYⁿvà½~îùÖüs▒3G3@¡1àü¡ Θ╕P⌐käún╬╖τ╔,a;g√φ▓K∙╟∩ⁿU═≈╙27;≤å &≡Ähp▐òZ┐ÆH╘Ü╬▀«èúQ╩:┼1-╙
  2496. └æ'vyl╡φ∩╛⌡0ΣmBs┌ß~╟▐▄~▄≤^z:░<Ü~8 ┤ΦâvM¿&V&'èα∙φa▒≈>Mâ║τ⌡.¬ïo┴+á-d=ô²3╖1▄⌐╥ä░≈]m&?W╫ü└H┴%å┤ô Ñïòß°v÷îüzδ<O│»╙ùóW╪Θ!
  2497.  
  2498. ΘE)9=çâ3:▓≤╠/¥<Σ─√┼±┘ƒ╟╗ß╡\M¼╛Ü;f[S└╢;AçPJ9khJf∙ìs3d▒uEk╢«m║ΩJΦóñ¢σÅä4L}p╒▓i7¬ë╘VöVÉt╜K÷mé±A[I/Φpù₧X▄Pq┐0╞å╩∙┬εΓd½ôÜoOúΣDPΓb;üε?╥┌[ºH!!▀V▐│9iⁿçp├Lj╠:ú£àKf≤║≡√áZì∞cY⌐⌠╗ ;Ta'âφ|1JH╩▌â«W#Q)%εë*╦Hàσ▌¼╝vφ╢ììÿ;⌡≈╞I╬8C¿t∙OsZ∞┤{┴yRπ▐æüü▄Mê┼ëªMµR$╡+≤6╓≥⌡┌Z@{@     )∙2╙τ"lƒ ≥$╢IGqâ tà■uα$O└Γ°V"zYy╪╥▐▄@FùΩH"≈δ[èÉ▀S╤l1WN╨⌡hC2â,æ·╘┴ ∞«■÷îÖ╬KÄAτ╩;N═°µ╪/┐Pc δ▒╛▌└ hÜÿ#½╚¡    Qτ°∙&æT0> │┴∙┘┌$ë½╗₧éWª├¿Ñ╬;┼╫ò0ôòKΦ╗Yj╟₧▒óÉRA┌."╧╣âX9╪╒≤O╞ªëzG░ε6°!!:⌐█GQτ9K⌠äτ╝¥╘2¡·éä!
  2499.  
  2500. ΘE4XR══'⌐╛ë8┼+Θ╤»É≈┘╦╨╣≈╖╖║╙s3^W▐æ;æPVjzSV+≤éPp#]φ>>╧┴I─═G «≈░ï■╦\ûgV!
  2501.  
  2502. ΘA+
  2503. ,░¥;+»╜ë9▀∞╤Γ┼·║╡╝ⁿ┬╖ZU╛»┼;>w▄ù)WàEj2HVz≤Å\bJóxRh««⌡╥N½ú╛æ∙æ\æ4w$B-╔¿t>½ë╚\DàVÆa╝J┤hä∩<%`xτkì₧MöG4╕9ôü╙≤╧⌐uü¢█₧y¼⌠E½dD9∩à^┤╢Cº@;╪M╔V≈"bΩçd»(┴+Ñ╬É.εε╫∞Σ║±d╢∞╛qOZ&<ï¡zZK_╩ìK╫ßJh0E ╩êÆJ┐■╫╖╝eδ╣ö└ƒ0íΓ▌└ .╣q■
  2504. fó╝l═d_ók⌠Φùü▄[█▐└ΩRτ"│eµs╠⌠▌╥
  2505. RpO≡;Ç≥w%¬5ïZ═ CgéLa₧∩oúM-Y─▓ⁿC#3D6ö]ÆÆ▌KôúT/╗∩ZïçûI┘`xXà═jnW°hÿ°╦Æ⌐╢ß╡─à▀ZäLα┘d⌐ö⌐╟9¿8&#·¬ñ▄╓pô₧ª¢ΣQ∞╛≤,ÅPs8ô╓Φ▄óg▌≈Ñ═█T│*ù»É╚=┘¬╨:ÖäYFΘ▒t'Ñ·╠╬ìyäWA⌐ë┬^(┘╙ô ±î±+╦╡!
  2506.  
  2507. ΘA+
  2508. &,╢å<.╫├σhñ1≥├Ω▐╛├╫╨■÷¬PV▓╛╬or\_▌è~AâMM$iUd╢ò\&4JáyZ|º╣l║╫D@⌐╣«╨╡óvs²`kl▄ⁿi=¡▄═\Füçzá╛x£∩E]6µ!
  2509.  
  2510. Φ@"!!1óå7;£╗â'▀∩╒Γ╔ô╜╢ùÄα¼EB½╛Ç63iX┴ô;@╫^cZ_g≈ìe)B│pZk¼┐`≤┌G╝╛▒ù≥▌\à{S@zh▀ⁿX╟ò╥\Iææp¥Wñt₧ó9∞a╙₧NöKwñ@5└╥┬╢▐íd╚¢₧¥h¿°RVΓftÅ»2₧╦F≈Do└V╪≥?x╖¬½w}┼,±╚ïA4╡í⌠≥∩í·g½⌡╛++?b4¢αW}/V▄╬|α╚0K)MOÜ╠q╦\ÿ≤╝╥ò▄£ö├Ö~°╜ëΘ9i╒┌:Z|óⁿ7ÇkNΓ≤δ·»╤Q█┌└τF²7·~∩7└⌡δ▄Tl\FH/⌠wâσ(vö&ëK█T@vÆ iè⌡:±!!Ñ╚å\P#>╨╠┴═e
  2511. Éδ]j▒÷[îü│H╔)*S╪⌡d8Éh₧⌡▀τ╝┐πÑïùª5⌡^⌐ûVB¼éçïp≡"7Vû╘┘▌╠%t╫└qτå±YΣΩ≥3å]d╝╒εSì└;£»╝╓╞░1├¿⌐┼sæ╦╪0ùèOFαáU$"úµ╦▀┤AL╦sk¥Ωâ÷²╛]ö∩Élv░╔6R¿2│╠g\╦7T≡┼·╗Ç█<▒µäá¡═GÆ$_f╨1îæ╞N∙Åα½│:    X─@/à╖ûI»,⌠½+-iÖö≤╫∙σ)¥Còjgú▄ôº┌+>T«╡σKywïZ`=L[╫<∙Iª╢Æ%wê╧╝ÄM╝σ┬╝nL─mDΦxGΘBF=_┌䪃$G
  2512. ║VN»l3ç╣;rªñ¡¿╤Hyb(_≥c╤╙²_¥¡P⌐oç╦j╚╖α3α7d'\╝╜²J⌡å¬╕Y═┬
  2513. ½go╛ì}(Γ≤04ö╝α┬T╒ù π²7π╗íT╞_{Γ2û" ─╛D
  2514. =╨╩╜╖ΓkáCIz=╪≡o▄├¢d─ΓH:gB╧t═@"É┴∞6╜=e7;╝á¡╕f⌡âRdτ╓║eëBÖó=╪#╣ ~?à q±w▌╛ùσ(≥▒RcaBW╫ü└(«jε╤ùδ├z╕xì¥⌠çç9«M2╦╦╣╛α¥ Mδùα.ù@╕╡ ô¬î■OΦOu
  2515. ½Nc6/oV╣ré^═`Wåg#h5ûδyⁿ.)⌡└╫,▓3z╟v╔µ½2ß!!N,cå≥πæ-∙╓%Y¡%Çe▄Ve┌:\¿ÉP\┘"╧√1╛┐«a{│╝L âj║7■$êñ⌡Uj╝ ∩√∞íTÉ%╪NR∙_äD#a9╡ÄE╧╥Θr╧Θ|«7≥≥¢Σ ÉuhδÑ₧=Ωφ|ΦΦö<╧·kª┌f@íZT\ëcÜ┐!
  2516.  
  2517. Φ@+;!!,╢å0<«¼ƒG∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3IÄù;CéZJ)k_an≥ÇUc@»pVi╢ó/⌠Ç«≈₧║█é
  2518. Äx[@ot╬«d0╗▌┼J% ╙z╝óuòAεTL 1≈aìɱ(╞i ôô╫Γ▐│3¥ûƒ╙uºúX╧
  2519. czû√!!═ƒ║▐[▀÷)B÷╦t╟Az╔0┐£ìAcΘε¡░ìl┴ßuU╜áΦWBvCY&5¢τY]&E▄╔Q╫ß~Xg ╘ö#ç É╓╨┤∩d╛·║╠Ä*º≡ë╦
  2520. µ<╗aVµ∙.Ç!!∙ùà╙ç█D¿┬╫∩L≤R|·,¿t°⌐ò╡sG}[Z}≡3ù╓!!i╦t╫]┌Gkâlp¼∩!!±'I▄ºⁿqo4\≤(≈÷µj/¼¬G▌ûZÜÖÖ╫?YD╟■d
  2521. ;Ñ~é■éÆ5¡«σñ╪╦╩[ÿtíùQ dτÜå╧/ú%[Vû╘┘▌└3w╫ô?òìπ@¡·∩,çy19ò╞ªóα#ÿ╡«ïƒCÅ9 ┘Θα╙,┬Σé7òôOªëA    N├╝╤▀£Kùz8┼╗┼
  2522. ,┬⌠τZÖ╧ÆoMΓ═&·7┤╩qZ∞:G²₧·╚ΘB═0è√ûÄ≤ö_OO≈mùZ└∙╠T░█≈Σ    ÷+\ì_G2ûΣ₧a{z¡wè╒F{╦▌║w╤·Θi¥H┴Xb╡·╞╡·pjn¿╓Ä/4ƒ].yKF─o²w«éé$*∞╟╗ú»∩è Tà`C╝Y:╡O G═kσ▐≡nX╜KH«8E╒εt⌠≈■∩Z╧HcK\σtÉò≤c╩èT¬∞ídü╡ß.┬,Zb╙φτ²ê╗Ωª£tv`≡37=∩╚{bª∙    úª┐ûS¢ùAÇâ[äæ╝*«uÿ+(ç4üàbRJ#╘₧£àµ~░XT!
  2523.  
  2524. Φ@+10!!│Ç -╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√┴;/ZS╙Ç?P¢Zw>|R]lQ╢¿:u&-J║k\xªδ&⌡╠á▓≈èε▀^ÿrlj▀┐y_─á─\[ûÜp¬┤d╨⌠T=Γaû╚\Ä4⌐N;¥╥╟ ▀░zåÜëò} ½┐)╚`╝ⁿ6╥┘⌠T-╧S█αdΩ╫w╠Qg┬6╜╒ù]!
  2525.  
  2526. Φ@+.,(íá4Ä≤╠<æRï╜¡ⁿ∞▐╔╘¬≈σ₧╡╙lvZ╙─b@Æ^@+lWVXΣê^8fÇ;~╗╗%║╨C¡≈▒æσÅÆ46OR ÆX≡ë┴KOÇûaΓái▐Cæ;"cQ▀R½╩V╡fXÿ,╓┐┬µîíg╥MëÅ!
  2527.  
  2528. Φ@⌐èhi┤¿ü/┼6τ⌡φ▀√┘╦Å■≈╜PF»»╔t}`W▄Ç2Wà2.C,z]x≤ô^Mn# u]~º¼%ΦÇ$üäç╖╙Å╫`V.m▀▒o7╝ë╬XEÉ╙lεW╛x╨]εTN9πhÜφMÄKz½^Q╣√┬Σ╦╡~ìï╫╙rú⌠½nJoèΩs╠┌\ΓH9╔MöT₧G ô«F╤Gb╞í╒╖]d╢ç÷°∩Fí≡OZùß┐X%HTcrç ┬#tADôW╚    ëñIy5LB≥Ç!!ÅVä!
  2529.  
  2530. ΦJ#-U╬µp¿áÜ+æ:íÖ»φ≡─╚╨¼▓▒[F ⌐┼xvA@╫ûyA╫PJ/#YRx
  2531. ≥┴Wr#Hªnc¼»%Γ₧U    ╝┐╛É╖╞╫{Ign▌ⁿy+╛╠ÇUAùÆlα█²kòoF<Σ|!
  2532.  
  2533. ΦJ446ºè,«íâ.ª>⌡╤Φ├∞╬ⁿ┘┐ß╢>)╓∙≡iz^W╞ü~╫~J9y^A+■ä^Zj'\░<\lΓª%ε╓MΦ┤╢è≥╚ Ä4J.b▀ⁿx!!½═ÇPF╒Çz¡J╖iÖ≥X,Θ$Æ█MöMp┐@;╓£╞Σ═┤vî`⌡≥æeO║∙R░e    ~ï∙6╠ƒYΦSo╧S█αmr≡├}éOk╘7╛╪É
  2534. 6▐─òöë8╗±lZ∙π╛ vkPn=è)Γ5v@B╨4┴Ö▓!
  2535.  
  2536. ΦW4+╖¼:,╣ó╓jç6∩╨µ┬∙║╡╝ⁿ┬╖ZU╛»┼;>b┌ü~@Æ\A#x^A,╢åVd'Cπu@*úº2 ▀FΦºÑ¢Σ╩
  2537. █4]kc╤ⁿy=ε─┴RM╒åpεJó=Ö╝PL-αhô╟¥wá/└▄ü¢ª═ß▀£ƒs»²X╧
  2538. c|Äα1▀╙╜o╬V╘·#f╣╤y╬WkÄR█╡╦Cx╝¼∙≥á╗▀iR╜╧┤PBFJTu{╬gë~YxIv╚▐╨ß4U*%ߥoÖ_å░═╒ûì╙ô╚ë.⌡╣öIç(2╗y▐l∞┤~ë1ào≈Φ·τ╚Ië╪╠ΦE»Z╙êZ¼Ä∞┌R3N²6ÇΣmkÉ9Üÿ_$┴ cü·&δ6▀½√_q;DY{╬═╞╨J└ΣP%╡■E▀éùN▌$xYSQ╠ 0C<╤o¢·╦┴NΣ╗▒≤Ö┬à2÷5╩┤WS7│╥á8ï>ó"uⁿ╣╡▌╤pÖ┌-½£⌡FÑφ≥?å~6éô≤R┘⌡?ëτ°╞█H▒x<ì¬ó═i┼ ╨?öêX»≤O    N├¥▒óⁿp8-ú<$╥║┬^ ┬╘÷▄ΣògF½╥4Hπ+-╫┤!!âR-æ¡╙ê╩R╔=∙╡Æê»┘H[ÖrWïYª√╠F∙█┬Ñ│E#k≡2/O■═δª8┘╥GiOéâδ▌≈≈4╧Ä╨░║╧~╖r≥▓δH&w┬    rFB═&π%¥╕ç2~Σ╧¡░C╣∙É₧a^¥yNε:ÄP@1A▐?≡╜¥>B`ⁿ≥=L╧εS
  2539. ÅùÖüs▒3zH(Z·pà»┤¿╣}╨ßñ,╚í  ╔!!d-\°Ä╫0ò⌡╞æ9óƒtσ/yo∩ìv`Γ┴
  2540. ▓╨P╝┬@╓æ#Σ■7π∞╞~0¬vm°<5X╙#
  2541. üì jR>6╘₧£╥Ä═#Hv+╔εi╦▄ÇS≤╦'rA?∞k▀╖Φâv6½:TNzn²¬εΣ5WáΓ/2 ┌┬¢r╞°±┌$⌠1'mà╘6│1╔▓┼╝Q╖╣Na7v5│╒τL┬%å┤║░ÅR╨{ª╓y╕åëyΘ5╤╤· «D╪≈ ¢∩gù+φ½╓µZ╔╕N⌠U4Eú RCB"ï|ó6w⌡aK╖nQ≥å¢5)±┌ôeáZ½αΩΓ¡zPb!
  2542.  
  2543. ΦW&(Ñ¢1!!╗½Ç/ΦUêû╬┬φ└┌╟■σ¡VW╖╛╥;g@SÆû;QÆVR/|ZxO≥ä Pp#KπxZxº¿4÷╟║≈╛É≤╞ö`R.f╚│`rçφ╔JXöÉ;∞.▄·h┬BJ>íeï╩Kò@a╕/ô¢╨╥┼│cë£ôÆ~½£=)╚!
  2544.  
  2545. ΦW44╔σ[k¢ºƒ=Ç-í├τ╔Ω▀┌╟■µ¡V¡╛├~z^S└─7A╫^.{Z_+°òK`'Lª2╚╞JôαDññ▓≤¥óv!
  2546.  
  2547. ΦW::Ñâ,╝áé/üRï╜¡φ≡─╚╨¼▓▓[F½│┼i3I╒ê1PûS"oHjΣä]fMªy]*ª«&≤╨GΦ▒╕î╖█╫f[ki╠╣|∞ñ¬4"ⁿ(Çy¿▒qƒ²]m6σmæ┘èCx╣|▌¥╫╪┼¼!
  2548.  
  2549. ΦW1<íü_C╙δ¡$û(Σ╞»█÷╥╦▌╗ασGK║√╥~pM_─ü,₧L.kHPy⌠ê^&'╖eCoΓ╝(≤▌J@╗┐╕ï√╦qt■zQ.b▀ⁿi;╜┘╠XQÉ╙{εW»mòA≡XM≤}▀▄KôUg⌐/¥ ⌐ƒφ░cä£Üæp
  2550. εσXúl;û÷#█╘VΘE<é╖|₧G╟╘}╬D.╨6à┼ôA]╜¿≈╛ΘDzdX╝ε!
  2551.  
  2552. ΦW&,Ñâ>,╛─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM"oHi
  2553. ≤Å^^c(J▒}Goªδ)⌠╩M@⌐≈┤Æ÷▄^₧zfi╔ⁿd?»╬┼% {∙K╜F║{╨∩vC:αh╗█_òLq¿@=▌ûÖ╢≈αo╚
  2554. ôöæ<├¢>-Ñly┬╡n₧╠ZδGo╦S╒≥!!/ö¡½Eb╧=±╤åP|╝¬▄≈πí√n]½∙≥qcXr+╬±MpJH\╞ìåáJ~|NI╬ë Å~ òΣ╪╖≥`÷ú┴├ò*Éε┘╓8
  2555. !
  2556.  
  2557. ΦW    94╔σ[k¢ºƒ=Ç-í├τ╔Ω▀┌╟■µ¡V¡╛├~z^S└─7A╫^${W_+
  2558. εòKh'CπxR~úδ)ε█Om┬▐ è ╬^₧g@o ╘⌐a>ε┘╧PFüüZ5íQ÷|╨⌡]C <íkè╩ÅVf╣(╞Ç╞┐éΓΓ`⌡≥¡lÜΦGAïn t┬µ ≡╩Sδ!
  2559.  
  2560. ΦW&,╢å1=┐¡ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVjgHo
  2561. σé Pd/Añ<R*░«3ε╠K╝▓│▐π╓ ╫<WNk.Ü│c7ε╟╧M% Üa½M▓xöAΦ^ =íqî█]▄Dfú|▐ô└Σ├∩`ïûïçu⌐▒[E¼gzàΩ ùæ2ì(▄O╓≡,c⌡┬8╓M.┴3╜£ù]d╢ѱ≡Σµ╢6╘è█4`JSKg&ÜΩ%eJCë▐#Å▓M5@X▀à!
  2562.  
  2563. ΦW4;íá<%ú─µC╟≤▌∙═Ω╥ƒÿ■╙½@T║⌐Çl{MB┌ü,öPI:gWR∙Å^PufK¬oRh««$┤£/j┼▌▐áΣ╩╫s[kr█¿d=á∩╠XOåVÆyâBÑv╩A╥^l5±mô█!
  2564.  
  2565. ΦW4;¡ü5D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ¼╚~g@S└─*ZÆV/m^Z}
  2566. Σ┴J&1]¬hZdÑδ!!║╩P½▓≈æ±ÅÖqLze▐ⁿz »┘╨\Z╒ƒf╜FÑ1╨lû8B ,Θk¢═▄G`»L|╟¥âΓ─Ñ3£₧òǺßC
  2567. α`Φå═┌Sß(╔Q▀≥9h÷╔^╬Ci╙░╨ÅiuáÑó╛╘⌐≈e!
  2568.  
  2569. ∩E*XR══'⌐╛ë8┼>íê²╔ ╙▐╫▓≈ûGQ╢╡╟%3FW▀ü~TÿM>f^y
  2570. ⌡äOc4πnV~░ó%∞█F@«Ñ╕ô╖█·7ac╧▒h<║╚╘PG¢Z╙`║ªrä≥EF4φ}▀╔PêJ4┐1╓╥╬≈┬ºüÿ█Æló°R@Γt;àΩ=█═^≤DBª6█V■"sⁿçk╟L}╔=╜┘├Ju╛½╕╢σH»║ S╖σ≥wCc?çΩ3tADë╦Q₧⌐\-3QE▌ê!!èVB┐╘²±▓#ë╨∞º≤ªµ┼Å6Æ}±
  2571. !
  2572.  
  2573. ∩E*>ì½hi╖¼ü#üRï╜¡φ≡─╚╨¼▓ñ¡╛┴rJZ╫╖*@₧QCt.URf
  2574. ╢çK&2Gª<^o»⌐%Φ₧MΦú┐¢╖óvwàq]gv▀«-;¬╠╬MAôû5¼Z÷iÿ╝b,├A¡≈}┬4í1┌ûì╢Γ»gìMïôÆhO║∙^W╧
  2575. cïΘ5█═LºG=├RÜ?╟4qⁿδq└.╫7┤╬å}╜¬±²σΦ⌡rY∙⌡í%RZKg1ì≡peGUë┴çñWy/!!░ΦÄù■æ¡∩dñ«ë─ë~┤≡ë╟w╣n∩
  2576. 4Rπíy╔c\¼æ┴┤ï╦a┐┼Ωαl⌡5⌐%ú^»èÆ╢$UlC    3≡:û╪+L╡n▀C┌HF#ÅfAÅΦ0φ≤▒Ω[7zO l┘≡▌═b    òφXp≈≥LÆ£¢z!
  2577.  
  2578. ∩E*>ì½hi╖¼ü#üΦ╥╬╬φ╥╤┴Σ▓áK@║½╘r|F~╙è:^ÆM)@reßä gf▒yRnú⌐, φVí╣░└╖┴Æ4X| ╬┤hrú╠═[MçV£5║K│=²kòCJ
  2579. =ΦrÜ╠òFqó5╒¢╞≥îój╚ù₧╙ "ï▄uaÉI.%╬»>█╥Vπo├YÜ⌡mu±┬j╟g╙┐╙ε.á╗√÷á ¡∙bY½áª%TPs>ÜJ∞ptYQ┼╠â»^-(KIÜÅ&ç[ƒ≤τ╣≡tσ╕ì╚╓~░√╩ ▀>+╜r°qM¼≤¬1à8ìäƒêƒXÆΓ▄÷G▌6╡+∩2╚Γ╫┘3b3 L0°3╙■+Dô'Ü@╦BG{àepÖ≥:φ"$R╠«ΩE!
  2580.  
  2581. ∩E*9¬£(╜─µC╟≤▌∙═Ω╥ƒÿ■╙½@T║⌐Çz3D╫à:SòSAzIZe¿┴Xk#ÑsA*╢ú%║╠G¡╛í¢σâ\ Æ`L    kv▀╕-4╝╞═\¥■|¬L╡h¥≥EN1εj╙₧NòV|ú(ôô═∩î¼vë    ûòö<á⌡RV▒ciçá'▀╪≈S*╩V┬{ÖDv±╬{╩~╥0│▌üHm≤╣∙φεA╝┤pN╝≤╖%O[Kr:ïJ∞9vF^╚ì8«ì/Q)!!░Φ3╦T¢⌡æñæ ì┤Ç└ƒ~∩╛ë╩    1K»u !!uRτ ¬eΓôä╙ê╓Zê┬à╗░-p╫êZ╠ß╠═C3=G<ⁿ2╙÷!!i│!!ïh╓
  2582. RV^δ
  2583.     Σ≥3┼ )O═°»:[S#pE₧▀▀▄àΣU$ñ╚@ï¥┼Ö89WXé∙"7/äi═╗π▄í┐▒╖╟çΘJê~⌐ûVB~α┴▓S┬,ïcj ■Σ≡⌡╦>|ƺ!
  2584.  
  2585. ±E$4?í¼:,╣ó╓jç6∩╨µ┬∙║╡╝ⁿ┬╖ZU╛»┼;>b┌ü~@Æ\A#x^A,╢åVd'Cπu@*úº2 ▀FΦºÑ¢Σ╩
  2586. █4]kc╤ⁿy=ε─┴RM╒åpεJó=Ö╝XAI,Θa▀═XæG4╝?╪ô─≤Ç═ß æƒ╙u    ε XPΓap┬√;█ƒJ⌠D=îH╥τ%dδçw╨`╧+±╚îf╢ó≈²ß¡┤iH≈á£`Ag&╬δ#1BU▌┬╩»\{9Q █Å<£_à░╫╣≡rß÷∞º≤-║ú▌╩E"ⁿr∙qMó╢l╘~φF¥ëÆÇ▄M█┬╩ªVµ p╗+σ:├ß²═H}H0⌠y╤ÜG√]â╪N@bè mö╦4α$[═îεZ4zBmµ▌┘╪C└ 1@▐°EÉù₧K₧veB╠⌠-:╤zû≈═╫@┴╨ÿ╗╥╗╩\ùYºükW)Ñ╥╒Nï9¿n`X∩ºá╦Θ6s╫è-ñâ±Sè°÷,═-^Ä└%²CÆα0ëττ    ╩£K¼: ├ª░╧ ▀≈á?òîKΣ·bMΓ∙┴√öZE═?┴║╞
  2587. aï╚≈Y¼τƒbCÑ┘sΘ#1·╤f¬L±╫èα▐P▄2ª╡ÖÆÆ─ RY╘TXò]ß²²Vπ¥ΩÑÑ-BóZfàíæxK
  2588. ╛g┘▌/|fƒ₧≈2ÿ┤╜{╬A╙9g╜╒°ú╔~lk¿╓Ä/%Å]*=àΦv║áÉ2╟▐∩¼G╝ì║╓6àqE⌡K}≥8$]:╢?ⁿ½Ä$Gy╤5êp╚δo ú¼░Θ╩_kWgM∩xéî«N⌐φ}╫
  2589. ΦΓ+åαá`ïxc#M≈Γ║\▓±┼ò:ⁿ∙▒>,:╝äsmºò≈±V¿çSH╧╘Zü╫JéÇ∩PåK=╢h-É;₧ε`
  2590. =G╝τµ√▐o╖
  2591. SrH┼∩|╦É╧6£ΓM)gE»;⌠v╥┴µ%╕,3s¬ßΦ≈>¼·/2óÉüe▄d┬∞╙.⌠11=ü·0úeÅ▌{╛┴█▐Sr.~.èß╜)≥ √─ö±öH┴╛┤r┐îä~αrT╒└ú╛║N╔∩1╛æΩqτg«░    ╘Γ    ┬∙Wπ T<ÑT|&B╜3╚Y0╩x\Q≥+A@1òδö"}±╞▌6εWè¼√¬?»;'Z0c╟┌πä√▀`j░düu╚    7╘p3╧ⁿ+├*╠}√wα∩≥'∙ΓQ ┐@╟Q50▀Kç╣⌠LGº¬_▓ⁿ±╒d▄kIµ╓@<b5ß·?úùuéz╧Θ|«#⌠÷èx╢πÿ#.¡óì#√ê(wçô░X▀√3┘òQN⌡BY╚ ╣δ╣│╗·Yb▌╙╟┤πúΩcî⌐φú¡âÿ½╥)I{iç    εL╠ù═â≤┴+».α2ε■_åÇ¡qΩ≥Æ·╨ 6φPèFc₧&bh∞╒╤▓╥Pìæ»Ñ#2x$
  2592. ║ùá£66⌠ÅN┘LÉ╡╖W░ì∙3╡&u#£╝0IéA■{/ºw╞]δ╖FvFkü5;°╝Ç╞√Y╧+─?v╩g=╟┴═é<ëΓbÅÅ¢=▌»ï,╘╢l\^▐ëûà√╨α█±╠f    ▀4╥ò╓!
  2593.  
  2594. ±M%=ìü4&╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√╘sv@╙ê+W╫PBjzSV+≤éPp#]Σoc¼╕4√╨AΦí╢î■╬Æ4N    Zy╩╣D<¿╞Ä% {∙eºw»mò(≥W@I1≥Jè╥U▄Krÿ)╓╚â═▀ÑÄMì₧Æp┤⌠j
  2595. cEƵ╟╧Z╬O)├!
  2596.  
  2597. ±V.!!▒¢=┐ºí/æ7ε╨▀├φ├▐╪╝■á|Mσ√╘zaOS╞ΘT;╒oV#xZGnO╗┴.Ko([π}i¡ª- ╨V@╝╕≈è ╩\ær[z ╬┤l&ε▌╚P[╒ÇVtá╖hä√TA *αpÜ┌æG`ñ8ô¥═╢╪¿vσg÷╟âi║≡UHºSiçε>Çô≤@=╦Z╬X▒@ ö¡▐m═+±└ε.░ú∞╛║[ΦτeP┐á│jaPK7Ü∞~B]╠┘_τ╦0n1W ╙Æ
  2598. åJÅ░╝╥òφ╝º╠û-░╣ëdÑl^b)╜n√
  2599. `2ê╪⌐X■ƒâ╚π╡!!≥┐¼ΦG∞»└?╔╜╕▄RTk#Tσ6ü≡(qⁿ^÷'╤YVSôt:═┐w╕gO5íí² \P#p}─▀╨!
  2600.  
  2601. ±V.!!¿Ä!!:Öªü'Ç1⌡Σ²╔ ┌▌┘╗▌½    ½║╥|v\;╕φ|bàVR+z^&O╞ôWrfNπ\g»«.ε₧R¡╢║£√╩\çdL~r╙╜y7ε╧╧KüûVg½@│tåε@,ε$ï╓\▄/┼\,╞å╫≈╬¼v╗ì₧ÆqQΓ▒CE░go╠¡^┤▓5Ä<╔S▄Vα8c·╦y╤Q\┼,í╙ìW}▒º⌠≈⌠!
  2602.  
  2603. ±V.!!íâ":«╗à$éε┘Γ╔≡├àò┐ⁿäkn║╢┬~alS┴ç~]Ö+^NG⌠ìjr4Jóq╚┬b╩╠K⌐ú▓▐║Å, ₧zJ@zh▀ⁿe7ó┘╙MZ£öZ5ºE÷|₧░I*ípù█└tU₧$α▒¥ΩÉåFª.╗╛á_QεσNTº rDz2╠╞ΩD"╬Z╚Z₧G⌠┬u└G|î╛╥ùK4ºª²╛╝╜αt]╗∞╖9wCT8~╬Γ7t[ë6├¥ñK-+KI╬ë*ÖÿΘæ░∙m⌠⌐ò▀ô0▓ú▐▄E'¿y°A62ê▄⌐qΣÆæ╙Æ▓"≥▐└ΩR┤Hm·j∩²╩²╥C{kZ>▒?û√=và&û@╪V,(
  2604. ╕heüδuΩQ╪╢÷\P#pw╨.╠╟▄F╗σ]&ñ·t≥ ÷.╫*QL╟¬dnW°■└┘Γ╕«≡┤╟Ä°KÄ]íë(<M╔√µ┘>¼`=uæ╫┘º¼1tÅÄ▓£╤X■╣╝åL`$ò┌√┘ªyß═╘=πêB»>_Äá│Γ&▄²ò0é▌
  2605. Σ╕$+ñ«ÿ╩Ñ EP╦8'┼ä╫X9╩═░'÷Å⌡V░╔65!
  2606.  
  2607. ±V.!!Çú_C╙δ¡$û(Σ╞»═╛ï═╨┐÷ñQO║ê╘izFQî─=]ÖKE#`R]lOΓëK/L▒s@eñ┐`╙╨V║▒╢¥≥Å8æ}P    zi╒▓-»╟╟LIÆ■|¬FÑ~é∞EF6íkÖ₧MöG4╛?╓¢╒≤▐ε1σg≥±·`▓£=-▒ P&┬▄'╠╓Qα8▐V╬└9sⁿ╞uî/⌐,┤╨àdíº÷Ω╔"ä█n∙≤ⁿgh xFKe=ǵ$b!
  2608.  
  2609. ±V.!!Çú=«╗ú$▀⌡╒²╦√├ƒ▄░÷á]Wσ√╘zq[;╕φ|bàVR+z^&O╞ôWrf[½yCåç`√╩Ví╡óè≥ÅäwL    ~t╙│cr¿╞╥\¥╙p¡F┐kò╝^AI,Θa▀éIëV`¡0╓í╫Σ╔í~╓A▀ÅÆn½σ)╚    +uæ°6╠ƒH∩D;─Z╚V≥#x╣╞l╓Pg┬*Ñ┘Éc╢╝²╛ß╝ßaP╡∙≥lHAbpπ`Ä}YmQ▌▀╩╜4UBX╬ô<╦_╓π╘┤·!!φ╛ì∞Ä*ºΩ╦█$Ei╒B²`M±±`╙HVⁿç┴■Σ╢!!Æ╨±⌠W±Hpümα?╓Γ┼▓p/Fo<²$û¡m^ⁿ^÷'╢ @Pdât Ö·7╣J1]╩▒┤??RN├äÆ¥Hφë5C▐■]ïçî*┤EQ9)═¬d8gÖ,ï╗╡╕g┼╙ÿ▀▀è╔L▄α╘_"åôâ╬pφYrΘ╣╡┌à<câ¢.²╚ΣU╖▓¬═-^dε║|ΦAïµ2ÿτ│QÆÅw╢,> Å≤τ╔╝Ü∙W εY±╡e0»≡·╥╧YjP╦(,┼úâD9╙╘╬_ê╟ÉeΓ¢H»z╫┤!!â/E·╫·╜¥ ¥<Ñ╙æì▓╪Eg═e\¢Hª√╥SΦ┴î░┤;tL⌠1/O■░âz εl£┘V&z╤╟ú
  2610. â«π)ôr'╝¡╦╞ú*!
  2611.  
  2612. ±V.!!Çú&╛░ú$▀⌡╒²╦√├ƒ▄░÷á]Wσ√╘zq[;╕φ|bàVR+z^&O╞ôWrf[½yCåç`■█Q║╛ºè■└^æ{L@zh▀ⁿ7¡╠╔OMçV£5║K│=╠ΘE[:φa¼╩KÖCy≥L|╟ô╤±╔┤=╩`⌡÷∙»πPA╢`δ√2▄à≤@-▀╖|ÜDoⁿ▀l≥Wzß3╜å├Wq┐¿╕≈Σ
  2613. â±yK╢≥╢Qo/<v3ì╕zZ&^╠┘!!ƒ╡xa0 ╔ä#ì ù²╘!
  2614.  
  2615. ±V.!!Çú,╣Ñ╓jï>∞╤»╪τ╟┌Å■µíVP╝√╧u)B╙û9Wâ2.C,kAb≈ò+f▒u]~Γ¬`ª╠G¼╢╡Æ≥ⁿ ₧zY^.I■É !!║╨╠\æÇgºSótƒ╝^II,Θa▀émÑrQê%≡╠«£ÑíaÅÆ₧¥hCεσSA▒cF;ìß'╤ƒK∩DoÉO╧τ,c⌡┬K╓Pk┴2∩É├Puí⌐²Ω«F£ⁿiO∙φ│BlHCj$ïJα1bF^╬Wá{πÑVz2X╥ô ₧]
  2616. ╓±▌▒²rß⌐═ìƒ*╢»ë╔E#C¿e∞
  2617. 4V±±|╙hI¼¢çÜÇ┌L╫û╩⌠°?▒b∩4à≥Φƒy@G)⌠%■¥D%à-ÅKƒ IPlôgh═·uσ7H└º²=?\rû╪Æ╨Jë±Y)ú÷Fæ█▌*┤AR9\Q╘ΣdP√ü∩ÿêS∞«⌡│╪êïIê═ε,E!!¼ö╧╪9¿prB╗àª┌àc,╫╦z╡«╓rxµ⌠⌠-èFy2╟╒²Gèí9â│²BïùNºx├¿τ⌡ß╒┤Ññ;»┘e2╛┤àû╒/e{Θ≥û·
  2618. 5═⌠∞_Ö╝▄RΓ└s    ·<5ú₧h%ÇR-∙╓¿α─çhπßöä▓▐_RX▄wzîNτßÄ*|â≥▀í░hYÉUR│êªmIεlÿ╠GV{¢é╜w╠Ωσ(▐_Y╤|}║Ö▄¿M₧e}ß╛≡]π';oXS▄o b½«é9:█彡δ█è¼n]Jÿ#_²W}¼A:V╟?╔ªÄ$Guç¼jå║d ⌡ ≥¿²VoK)\Σ*╤û╕┤╙(╫X¡µQⁿδ₧MÑQM1K≡σÇæ÷╞εDï½@_?┼╬╚s`û╟φ╝b╙Φz(ôçKéæÜùªMΩ;V╒->╔pDA_╒Üb7y╜±µ╕º~áOT~H╟ε0Ä─┌,₧ºZRf4;ë│Sp┌ä■_*½1P>2'τ⌐⌐»9╧çf=+∩▄¥r╞°⌠ûΘeI┐╦ùTΘé#÷æ6╗▒$Nu&%zåà├H┴Xε╧âÑ├O╨
  2619. ≡─eóúî{┤5SφΣ£█îu∩╞R╢▐¡╜─¿▀ß    ▄ΩSΦXj)ë F[ `÷&╓Læ5M╖c/jL°çûrf÷ôôx»L½ εå╚_╚oQ'cô╢ΣÄ ┘╙4■!!─Q┐fLJÆq7═Ω<Nù╘n√o∞∩üsVëé3ì÷êr|Æbê░╥SS╢mS'╧o¢ü¬>╪%╪gΩUü$lp╡Γ,▓«}îz╒±a«"⌠π┬6■⌡▌=-δ⌐₧+≡┬v¡╬└!!├╛    ∙£}╣w-<·r╥É╫uú■≥]o┼≈#╞ü√á╛yäΦSê╠Äâèÿ┬#i"mìÇWYëÉ┴âΣ┼;╛w±;ºπA?Θ╘⌐rîδæ╥ƒjOüc╪xΣV!!\╜╤╦±┘Y╒bº4⌐æ*db_Q¼₧¬┌b&αåV╔^╒¢│nû]ΩΩ)∙    I
  2620. █▐T┬-Ö╝a≡@╗■v     Hôy!!√╥╥ΦΩ¥╥.:▀7(▌╘ôε;Ä║{ î₧Ö=╨Hⁿ▒"Θ▓R!
  2621.  
  2622. ±V.!!Çú&¿ƒì8î>π╪Ωû╛┴▐╟Ü≈╢P░╡Ü;gID╒ü*₧Q@/`O    +≈â4 OônZ|ú┐%║ô'¡╣▓î÷█^ûz)JLù»y+ó╠Ç]Måüe║J╣s╨·[=ítì╤IÖP`╡@8╓ü└Σ┼óvîM¥é╙h½▒:.╦<<Z░╦φⁿ½9═M■α.-╣╚véVf┼φ╠ûP`▓¼⌠√╙║±aQτ¼≥wAP(r║Ωpx\▄╚ƒ¡k3Q ╖δFÅUâ²╘╢Φ`÷ú┴▌Å,Ñ∞┌ ▄Iw\≥<⌡4RτÑa╧i∩    ôîûÇ╦[╒ö¿î/₧{,·mφ2┬⌠╕├w,[[:⌠#╙π,g╦tïO▌ /    ∩flîⁿ&úPx▐ú²s4)IY{┌╙÷▄W└ΩX&æ≤Hÿå╤*┤E>\A╤░-£|âΓÿ█è╗²Ñ╬╤ïd±2╔φQW6ºù¢S┼/╡vV∩Σ≡è■q²≤Eíä±SΣ²⌠s├{*1M¢ô²R₧Σ#╠⌐╕L₧½R╖ ┘Θíⁿi┬⌡Ç?äå^σû>dæα┘┘ÆE─?3╘ç╓^╟╠ñ
  2623. █¬▄.∞▒Yaü:5¿┘q\¬5Aα╨è⌠╔¥q₧╚▐∞╦┤ CP▀$IùR≥╤Σk2∩ÿ└■Uá)[&£HEfÖÑÅmK
  2624. ╛g├üT}+ÄöΣw╠Ωσ(▐_B█#.¡╪┴í╩!
  2625.  
  2626. ±V.!!Çú'αΘÿ+ù8Σ└éªùò∩╟╖ⁿ▒W╖╛ÇRWd╓ü-QàVT>gT]+≡┴
  2627. Qcf]ªVc┤«2║╤L@╝┐▓▐½▀    
  2628. âu\ kS╬«h3úùî\ööaα█²kòBJ>ítì╫WêkPÇ/2ë╥╫≈▐ºv£Mûòùy║½!
  2629.  
  2630. ±V.!!Çú'αΘÿ+ù8Σ└»┼≡╙┌█¬¿σGB╜¿¡
  2631. f└ì0F╫KL/.rwGO≥äZt/_╖u\dΓñ&║╩JΦÑ▓¥≥╞
  2632. à4Q.t╥╣-n╛▄╘MIùû%a╝F╖p╬M╝EN?Σp╤£4÷/┼9▀öâµ▐⌐}£$╗╖▓h╝▐YΓt iàΩ'₧╓QπD!!╪Ü≥/r╖¬½Qk╠9±╠æMzºç▄╥┬    ¼φORπ᪠bCAKo<èφj1[Q╦!
  2633.  
  2634. ±V.!!¬╒r(ë╜₧/ä2í╣àÑ╝÷╧┼╗ⁿíB ┐┼mvDY┬ü,æMM/`__rOΓäMs'CπnVz░«3 ╨V╝╛╕É╖└^â|[@|e┘╣d$½█ÇMG╒ág½B╗3╥lû<%`9╥pì█Xæ/┼i>╥ü╩⌡ⁿ▓zå┼█Çy¿¬:.╦    ~Ü√╦╦ºgé2░α(m çh╦vw╨:ÿ╥àK4║╜╓δ∞
  2635. ΦÖ
  2636. 5╨Θ┤>pCK]3╜±1|T└▌ï╕-{my÷¡h╢7h Ö╪╛┌`Φ⌐äù┌┤╨▌╩:K╡rΦU4Lτ╜oÇoZ ¥»Æâ┌u╒╗»ÅC╟"┐j∞s╦Γα╦*S}Ft!
  2637.  
  2638. ≤A&<"íΓX@°Ö₧#ô>⌡╤»ü╛√╨╘║▓▒[F ⌐┼xvA@╫ûyA╫vp3~^ze    ∙┴Ki+¬h@*¡╝.≤╨E@╝«º¢╖├àuL "╖╓X╟ü╘@XÉ:Ü5ºPÿt£A≤CIΦj¢█A▄Kgé    0ε█â ╩öa¥┼█¿B½²QºrtÉ╡sÖΩQµC#╔╬│?dΩ╙w╨G.╘&í┘├Mz╡í╢╣▌H┼₧    O╝∞┤J`Rav7ºσj1D╨╚=âúo=PE┘╡6¢_+ÿ÷▐ÖΦ;ñ│Å╔ƒ&ⁿÄú!
  2639.  
  2640. ≤A*#=àÜ&&¥¼é/ù>⌡╤δß√├╫┌║ß B£╖┴h`lS┴ç,[çKM%`69M╞ôOg2Jπ1Xºª/∞█ª«≈ƒΓ█SÉqP|a╬╣irú╠╘QGæ╙gíN÷iÿ╝XA,αj£█ÅKp⌐@t▄£╧∩àα|Ä`⌡≥çt
  2641. ε≥[E▒sJ|çß6╠▐KΓEo╬FÜ√(!!δ┬{╟Kx┼- ▒Θ-Z²î╢╛╔Φ²s░φóqG[&<üú?1KU╧├╩áWt|LJÜÿ ₧HBÖτ▀°±d≡▓Ä╔ë~╝φë╟w
  2642. │1√
  2643. zZ≡░}┼i6åo¥Ççï╪Gë╧ëªMµR$▓n°s╥ε⌠╙ZDl
  2644. F.σy╤ÜG√]₧m╙RQGâscƒ≥%≈*Rê░ΩZ>,O:┬┘▌╦]\└≡Y&▒┐HèüÉ`█"QT┼ 6ÉaÆ!
  2645.  
  2646. ≤A*#=ïâ6¿¿£:Ç-≥Ä»═▌█▐╞¡ƒ╧:P║╖╞;aM[▌Æ;séKKkUVyΓätc2G¼x@0Γ¬÷▀QΦ┤╗ƒΣ▄Rs²MbfÜ«h?í▀┼x]ü┤{½Q╖iò╤T[7σw┼₧X┐Nu┐!
  2647.  
  2648. ≤A4'.íï,╢¼Å>è-≥╣àÑ╝÷╤╞⌐≈╖B τ≤~g▌é~S¢S>f^x
  2649. ·äMi4\πk[cíú`√╠G@║▓ñ¢σ┘█4_j ╔┤b'ó═ÇWGüVæ5íU│oé°UJxπ}▀▀Wà/┼)╟¥Ä±╔«vÜ ï₧ù<½σ_Kª.HΦéY╖ßvπD!!╪V╬└(u╣╔}╒!
  2650.  
  2651. ≤A49.í¬* ⌐╜à$éφ╒ⁿ▀ñù▄┘┐ß╢}B▓╛Ç!!Γû7DûKAj#r≤îM&2@πp\iú┐%║▀L@¡»╛ìπ╞╫wR}sܽe;¡┴ÇTIü¢fεW╛x╨∙RJ.Σv╪═ê[d⌐L|└å┬Σ╪⌐}Å`⌡≥äuª▒CLº Viçε7▀▌SΓr;▐V╘¡mb⌡╞k╤`┴2┤É├Gx▓╜δ╨ß ¡╕ ^¼⌠≥jKEo<ëJ≈51ZC╠ìà│k)QX╥ä=µ0kæⁿ▐║²mñ┤Ç└ƒ-⌡Ω╧I┴4╜nσA4~∞ó~┼φ▐▌▓¥╠Gÿ▀─≥K√n·|Θ:╞∩╕╓    lFA8πwÆ∙m`ë=îZ╓Fdèobî≈Xëc3]┌½εU=?
  2652. w╪╫▄▐Fű+≈∞\ÿÆÜT╩)<N╒░*0ö,û⌡▄ÆÑ╢▒á╩ç▐Z╥═ε(<M╝╥è▌júgq6·│╡Ä╒-~Üè8τï±D¡÷⌡iüI~3ë╘Uα-≤ê2é▒²╫█Tª4@åº▒╚;▐■¥;ÿôkï▌a3ä⌡╒╬╒C ╔6*╙ñφK1╬Äô ⌡ï÷y¼┘$&Θ#1·ä)Σ>S╓┼╖Σ¥Z╬║°ÆÄ¡ôr,5█m_ùRß╕ÜV∩ò┌ΣÑ;FÉZR/ÿ¬ú|QR½u╖└O/ìªσ$▌α⌠a¥$s█|yù╪▐úWô/>a∩╖┘]π]?qL╞'Φfóéÿ98╟╘óúL¿σ ╣JGùwB≥BYÑT]'    ƒ)≡╜₧w    6ü1╓vß╣6iΩ√╓Θ╦_0S#M!!₧°ú¡»ε-╫BΣ▒B╚⌐│JªQK'òΩ╗mεë¬óª£tv`ÿNJα╚n▓╨+║∙ó∩y(▓²'τ■Jôò¬9X╬:½u}û<F┼Å!!bN`b½≡╗╓ì═#.a╪≥e├└╧~├ \xSΓh▀SWl╔ä°_%ε<J6&╕⌐ΩΘ4VñΓ/5 π╒╬qôUâ÷╙b±t~:╟╜m÷6Å≡|╜┴█▐y5    J<▓·ñ ╝{µ╔î_±ùX┼╩⌡}│∩Ωç}╖¼╙ù─P╘≤cñ┘≡g█`φ╡    ▐ΓíÆ3Å%*\l«UC)∞oÅ╬{\
  2653. │d%$_╝╟A╒w;╢îÇ+ε3z╟v╔é╦_╚zE/tè≈■:ƒ ߣ`_ºuêB╙ .■>_¿ÉP}╛J½m▓&╣⌡≈Tl░╖V½╦:½U[÷,Ç╗π,,┌^zu╦l¢üü
  2654. ┘0├8²_Ü>ex≡▐a╦╤ΘS¿µt└5≡τ┬x½░¡='α╝ÿ+∞üpäô░X»ùI°ö(⌡P{Æk╓┬£0≡ü╗5╕«_╗╔₧┼⌠+├÷FÉÉÖöæº╫10Qß ⌐*4σÇ├╙ ╧3≡.Γ
  2655. b≤ΣO<óä«qîï■·¢qrà4¥y¥H69ªα═ñ╥ìMä$▒╢f|!!ôÆñ£#-δÿv≈K▐▒ºY╢Ñ≥ìz]ⁿ±{┘"ÉRG⌡q┌C¡σ    ;z╥v> ¢üæôiµ.╒3t╚.'┘!
  2656.  
  2657. ≥A3.,(íª</╡≤╠+ï╒═ ╔╫┘┘┌■ƒ╧:Å⌐╔mr\SÆ╔~aÆK>f^}·öi ╖tV*░«# ╫T║≡ñ▐½µ(çqwhoäⁿd<╜▌┴WKÉVàgºB┤qòAΦ^0Σ$₧╠^ëOqóræ ⌐¢ª╔rå$½éây&á≈Xútiïφ&╩┌Lº@!!═S├ ÷?;╣╘}╬D ¡U╪╠èpmú½╤≡µ    Φ«=╕ε¢>uC|`=└gë!
  2658.  
  2659. ≥A3.,(íª</╡≤╠+ï╒═ ╔╫┘┘┌■µ╝CFô▓┬!!3IX≤╝
  2660. KçZh#lIRy╫ÅU<J▒<Zdª«8á₧Cü╣ú¢≡╩^·7B^r╙¬l&½ëìa¢çtóJ¼x╨⌠T=Γaû╚\Äg∞    8╓£╫ ╪╣3üîÅÆr ½▒AE░i yÄΩ É¥2ì,EÑL▀⌡mrⁿ╙L█RkΘ1╖╙┘u╜ç╠τ≡ü·fS≈ì╪c|VP'o0╬P╛W1nh²▌ª¿[=QU√Å.çCôΓƒ╒ûφ┤à╚é~∩╛ë┴,9╣n▓b!
  2661.  
  2662. ≥L&0<öÇ=%ö¿ü/ûRï╜¡ⁿ∞▐╔╘¬≈σ₧╡╙lvZ╙─bQÿSH/mOZd¿┴_&2Gª<@bú╣%■₧Rº╗≈É÷┬╫`Q@leÜ⌐~7¬ë╫QM¢V■|¬F░t₧≥Vx÷v₧╬IÖP4» =└üâ≡├▓3£Ü█üy ½°AA░.HΦéY╖ß»!
  2663.  
  2664. ≥Q 0+░è6 │ºê#ï8î╛åÄ╬┼╓├┐µá Ü╬hdMDÆà0╦~W9aXZj Ä& @▒<Gbºδ'÷╤@ñ≈╡ù∙╦É4| ╬┤hr╛█╧IGåùVróL┤|£A■XA1∩c╓₧4÷+rú|╟Ü╞╢▐Ñpìë₧ü0Oí P¬eJzæⁿ&╙╧KεN!!îK╥τmhφç|═G}╬xÑ£ÇQfí½÷Ω∞ΦⁿaJ╝á│JlHQh5└HÄ}]&n┌┴╩╡@}9oE╪┴<₧]ôπ┼Ü⌡oα│Å╩╝1º╫╨╩_w║!
  2665.  
  2666. ≥Q 0+░è6╢ªÄ+ëα┘Ωíö╛¥σ¼√│RW║√ì;RFE┼ü,û8kZWj·ä-Mt/Añ"dúª%║═W»▓ñè≥╦\ä4Jk Æ⌐c"╝╠╞PPÉ┌VsíQ÷|╨≡^M4î÷┘\ÆGf¡9╫╥╫∙î▓vÿÜêûrεσ_AΓrxçµ%█═⌠;╒O▀X▒@ ö¡ⁿQk╠9±╥éIq!
  2667.  
  2668. ≥Q7';¿Ä!!:ÖÑì9ì≤█Γ▄Ωìƒ╫╖ⁿíZM╕╓¬1xD█Æ?FÆ    j^I\fΓ┴
  2669. QcfZ░yA*ú╕`ε╤ºá≈è ╩^Ç}M.t╒ⁿ7╜╞╠OM╒¥V|áK│oÖ²_L x∞mî╙XêA|ΓBQ╣ ⌐ƒ≥ìv¢₧£û^╢▒YA╡`δ°2╠╤VΘFtí5│τ(yφ¥8è/çzα£éHf╢»ⁿτá░²sH¬á· %VTm3ëúPw4Ä^ìäÑd2KI╚ê;ÿä ▄°╣4¿·ô╠Ä6░±ë╟9KWP≡<■`ºΣ)─b^ FÉÄç╬▓"Ü╞╒πCµR$╡+Φ>╒δ²╥H}A8▒%ûµ8lâ1¢╧
  2670. NVlàol₧╡XëgOl─ºεD4zZ {┼    ₧α▄PÖúH%≈∞\ÿÆÜT╩l9^╬Σ!!3Éx₧φ▌Æ¡╖⌠÷═ä┘êPÑ─hα¥¥SΩ(óprX∩▒≡╧╟0câ╘A═σÜm▒╣÷(ÜY0ê┴╝TæΦ$╠░╝FäÆIñt_ì¡τ═,╨µò~╙╓
  2671. ≥⌠$7┐÷█╟ö
  2672. B┼<kàΓÅ
  2673. >▐╘╛Cêªæh[Γ╥<¿(!!┤▌`Aσ5√╦¿≤╪X╔9║╗╫∞╦┤v/Z╓vZèk∩∞╚fφÄ┴íó;B╤zT4û╜┬a{z╟ ≡¿+xƒÅ╜w┌τε?╘JòrkáÖ╛╠~╖Å╥ìQu#ézC\┴&πbΘ╖û;+═åá╡Lóε╫Ån\àdN╝K{ñPY9╢BÉ┌≤nX½VH┤"_¢½2fªⁿ±√√Vk]gF÷|ö╪╨d╔èT¬kä╦╓¼τ/ûx`'B·ú┤]≡╖¬ßG─Σ_d¢NJFòß╦┬ ┐ª╝ïE╥ÜI╬ü_åɬWJ╓π+1Ç#C╠åC. ╨¥÷║≈~¡EI'HǺN┴▄╦6ɼ/1dSúW╙@c╧ÿ¬>*»%]"!!τ⌐╩α5Q╖∩{2ΘÉ╦&╥æÑF╨-ª(?i╖±+╣+êú█«6ª«YL*}z│Θñ$Φ[µ╔î_±ÉD┘ñ·q╗ç╔,â}╖─╕±┐S∩Γ∞Ç╩e┘i┐╛S╛ì Ñⁿ_αMV9ÅQB}Σió6wózI╝!
  2674.  
  2675. ⌡@"    6U╬µ :┐Ñèjä+⌡╞µ╬δ├┌╞■µíVP╝!
  2676.  
  2677. ⌡]74Ñê!!D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`B╦ö;æSE-}m∙î^Mn#ùEcOäç▌φªó║¢σ╬ÿzN
  2678. │òY+╛╠ΘWNÜVÆqεjédÇ╒_IjímÆ╬UÖOqó|╟Ü╩σî⌐}╚    û¥òy½ C╡ah╠¡^┤▓5Ä<╔S▄Vπ$Uα╫}δLh╧Ñ┼ôAR┐» φ!
  2679.  
  2680. ⌡]7>1¬ï_C╙δ¡$û(Σ╞»╪÷╥ƒ⌠½µ¬^B½▓╧u3|oΓí{╣{+}H\h≈ò]&1F╖t~¬«`Φ█Aíí▓î╣ìqt■4iPs▀░kr¡┼┴J[╒èpÑJ╕y!
  2681.  
  2682. ⌡]71ªΓX@°êé9Æ:≤öεîó÷τߺΓáJ╜⌐┴ijiX╙ê'HÆMjaU≤┴ \e#F╡yA-▒δ#⌡╨Ví╣╛É≡Åçq gb╚╜+αï¡3% çe½o┐╨∩FxΦb½╠LÖ4ù%├ù∩ ╬α)╒M╛úºe½▌^F░abúß2╥╞EΓSo├Qεπ(M≡┼"éRg⌠&í┘¬Jr╝ε∞τ≡ä²ba≈ì╪c<q_EJ;î!
  2683.  
  2684. ⌡]7⌐è_C╙δ¡$û(Σ╞»╪÷╥ƒ±▒■╡[J▒√┼cgMD▄à2âFT/.URf
  2685. ╢çK&2Gª<Aoí«)∞█PNΩ┌▌≤¥ª"ÆxX@ml█»~½┌├CÉ╙l╛Fÿ|¥!
  2686.  
  2687. ≈E5>0+º«&s·¿éï+Σ╙Ω▐ô╜╢ùÄα¼EB½╛Ç63iX┴ô;@╫^OiwN<╒┴Vtf[½ygºª" ╠⌐Ñ╛ƒ⌡├^ÿrfeÜ«h1½└╓\Z╥╙a╝V╡ià∙<%`9⌡$ï╓\▄Qd⌐5╒¢╞≥î⌐}îç╒╤e├¢>zΩswä»#╫δF≈D┬Y╒Vσ,s▌┬k┴czÜ░╥¬J`╢⌐²∞⌐k┬¥    ]╖ß╛`TKu7é ╕zZ&I╞▀Å¡_!
  2688.  
  2689. ≈E54:¿è!!D╨└╬ ï,÷╤²îó─┌─½≈½PF╗ë┼zwIT▐ü]¢SA)zR\eQ╢ÄP}çY`I▒δ$ ═Aí╡╛É≡ÅÆ43jm▀▒o7╝ë╓XZ£æp╜╣{╨⌠T:δa£╩ÿGg»5╤ù╟╢╬╣3£Ü█üy ½°AA░.JOèΩs▌╨SδD,╪V╒│:h⌡╦¿+l┼┤╤ôPm≤º■╛⌠íτ Q╝≤í `\&!!ï≈W$~Q╟W─ï▒I3S^╙Ç;ÄÅα╘│⌡oα⌠├á≡S▀è≈A₧E#HC»y≡    4^÷Ñ{╔oN°ì┴É╕▐ZêƒàσM°5╣╗s■╜±ƒzJ
  2690. O}τ6ü╙(vÆïƒ|!
  2691.  
  2692. ≈PJp\zàü!!>┐╗╠+┼)α╞µ═≡├ƒ┴ºΓá@░┐┼;;I▀ü3PÆM%heJ=╙»+t/fX½uPbΓ»%Θ▌P    ¬▓ñ▐π╟^âmN
  2693. ││kr╕╚╥PI¢╙}º@╛=ô≥M x⌠wÜ┌êM4╛,┴ù╨≤┬┤3ë▀öæv
  2694. ¡σKñ sç»'╟╧ZºE*▀\╚±(e╣┼a»(╘7┤£æAw╢ºε√≥HΩÖ
  2695. 1╙ëî<6Zsf.T½,╩9U! !
  2696.  
  2697. AXTypeLibDocumentation comment:
  2698. 'AXTypeLibDocumentation is a simple class to hold documentary information from a type library - either from an ITypeLib or an ITypeInfo.
  2699.  
  2700. Instance Variables:
  2701.     name         <String> name of type library element
  2702.     helpstring         <String>. Short help text (a one-liner) describing the element.
  2703.     helpcontext     <DWORD>. Help file cross-reference.
  2704.     helpfile        <String>. Path of help file for element.'!
  2705. !AXTypeLibDocumentation class methodsFor!
  2706.  
  2707. ΦG(XR══'⌐╛ë8ûα┌»É╫╘╨█α▓▒[B½√├z}T╫─+AÆ[>aAnΣä\h2╖tZyΓ¿,√═QB┼▌┌⌠₧±=&úmNBi╪«l ╖Φ╬XDî û5º@╣s! !
  2708.  
  2709. !AXTypeLibDocumentation methodsFor!
  2710.  
  2711. ΘA+
  2712. 67¬¢71«─µC╟∩╟°╔∞ù╦▌╗▓│RO¬╛ÇtuB┌ü~@Æ\A#x^A,╢êJr'Aáy|ú╣)√▄NΦ┐▓Æτ╠âqF ░╒Y:º┌ÇTMü£5╣BÑ=æΦ^B,Φg₧╥Uàs⌐9┴ô╫≤╚∞3èï█₧}ε≤R»oräµ6┌æè+Bª6Σ÷!!q·╚v╓Gv╘!
  2713.  
  2714. ΘA+
  2715. 67¬¢71«≤╠+ïπ▐Ω╧Ω║╡╝ⁿ┬╖ZU╛»┼;>e╫É~FƒZ<oWFnO∙ç^Mn#▒yPo½╜%ΦÖQ@í╣ñè÷┴╫b_ga╪░hrª╠╠IKÜçm║ór╨≥~M=Γp╤│3⌡v|Ñ|▐ù╫■├ñ3ƒ î█ÆiíⁿVP½c wÄ÷s┘┌QΓS.╪Z▐Z│/tφçu├[.┬:±╤î@}╡º²·«D┼₧6╨Φ╖fI[c*ÜJ╣JppA╦╚₧!
  2716.  
  2717. ΘA+
  2718. 31¿è_C╙δ¡$û(Σ╞»╪÷╥ƒ├┐■░V░╜Ço{M└ü=W₧IA8)HbσòWe#╡}Acú⌐, ₧Jñº▒ù√╩Rs²jgsÜ▒h&ª╞─_ö╙`║L╗|ä PC!!ícÜ╨\ÄC`⌐pôÉ╓Γî¡ræM¥₧╙q¬°QMºdD9∩à^┤╢a∩D#▄Y╙÷!
  2719.  
  2720. ΘA+
  2721. 31¿èhi╗ºú(Å:Γ└éªùò∩╟╖ΣñGF ÷ÇHv\╞î;ü^H?k\mOΓët#LªuEo░∞3║╫L╝╢╣¥≥Å
  2722. à}_beÜ┤h>╛╧╔UM╒£Vtál┤wòΦ"cQ╒lû═æG`ñ8ôà┬σîíf£ÆÜçu »²[]Γguç²2╩┌[½-┘KÜ≥4!!√┬8╧Mj╔9╕┘ç
  2723. 6▐─òöë¡°pZ░∞╖JX8TI0äα!
  2724.  
  2725. ΘA+
  2726. &,╢å<.╫├σhñ1≥├Ω▐╛├╫╨■Σñ_V║√╧}3\^╫─,WöZM<kIxO ÅMg(Lª<Ek░ó!!°╥G@á▓╗ÄΣ█Ösm    ε┤d!!ε─┼M@Ü╙t╜╖hä±P[;αhô╟¢Gz⌐=╟ù╟║îóf£MÆÜè<½▒ZKªi rçδ}£▓5è+F≥W▀π>uδ╬v┼!
  2727.  
  2728. ΘA+
  2729. &,╢å<.αΘâ$ÇΦ┌Ω▐ô╜╢ùÄα¼EB½╛Ç63{S╞─*ZÆL/bK@ Åg5\¼Zk╢«$║╔Ká≈úû≥ÅöqWkrÜ¿br║┴┼çÆt¼O│Nä⌡_HWtíkæ█uòLq╛N~╛°«£Ñ¿väîÅüu⌐▒Γo~«µ=█═≤S&┴q╧ >!
  2730.  
  2731. ∩E*XR══'⌐╛ë8┼+Θ╤»┌ █╩╨■²úW╖╛ÇivKS█Æ;@╨L#`HGj⌡ä^Og4Fó~_oΓÑ!!≈█ m┬▐âû■▄\Æ`Vj ═╜~r»▄╘VEöÜtóO»=ù≥T],Σ`╙₧[ëV4í%ôÉ╞╢┴»wü û₧ù2M├¢:.╦^zÅΩ!
  2732.  
  2733. ∩E*oxÑü+░¼Å>ΦUêû▀▐≈┴▐┴╗▓Φp║»Ço{M─à2GÆK,.O[nOΣä\o0J▒;@*½Ñ3ε▀L¡≈íƒσ╞¢qom▀ⁿy=ε╚╬vJƒÉ;├)▀Iÿ∩B ,Θk¢₧N¥Q4¡(▄ƒ┬Γ┼úräå█öy½πVPºdF;Ç·'₧╥^■-╔╫≈$g≡┬|î¬R█╡ìEy╢εóúáª█bV╝πª!
  2734.  
  2735. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR╗╛╓~GF╫û~TàVA$jWJ+≤Ö
  2736. Lg*▒yCxº╕%⌠╩Cí╕╣▐°╔\
  2737. ƒqkc▀╡{7╝ë╘Vö%çp»N°·h▌B&─$û╨MÖPr¡9└╥┬Σ╔α|ÿ ÄÄû0O╛ΣEAε uûΩ!!╪▐\ΓRcîH▀Vß(wⁿ╒léVaÇ+╣┘├Fuáº√ôèoí∙pP╝φ╖dR\h|╠gëzZNc▌╚çß4U*N█Æ&êjƒ■┼Γ╝rß╢çû≈T▄è╟ ╫Yⁿ8┤T5ï╪y╥dU°\▐Æûé┘ò╫╚πÖxY╙eΣ+╤╫φ╦@-! !
  2738.  
  2739. AXTypeLibraryAnalyzer comment:
  2740. 'AXTypeLibraryAnalyzer is a wrapper class around <ITypeLib> which adds higher level wrapper functions which make ITypeLib easier to use. It is also the starting point for Dolphin''s automatic generation of wrapper classes &c for Active-X objects described by type libraries.
  2741.  
  2742. A Type Library is a repository of meta-information, typically about Active-X (COM, OLE, choose your favourite name) objects and interfaces. AXTypeLibraryAnalyzer permits one to enquire about general attributes of a Type Library, but more importantly it enables one to enumerate through the individual meta-elements by acquiring <AXTypeInfoAnalyzer> objects which describe them. For example it is easy to acquire all of the meta-information of a particular type from the library by sending one of the following selectors:
  2743.     #interfaces
  2744.     #dispinterfaces
  2745.     #coclasses
  2746.     #enums
  2747.     #unions
  2748.     #structs
  2749.     #modules
  2750.     #typedefs
  2751.  
  2752. AXTypeLibraryAnalyzer is primarily intended as part of Dolphin''s development environment, but it also has run time uses when Dolphin is implementing dispinterfaces (for example).
  2753.  
  2754. AXTypeLibraryAnalyzer can also reverse engineer the IDL for a type library in the same manner as Microsoft''s OLEVIEW.EXE (except that it is does a more accurate job and is nearly twice as fast as the latter). For example:
  2755.  
  2756.     (AXTypeLibraryAnalyzer open: ''stdole2.tlb'') printIDL
  2757.  
  2758. Instance Variables:
  2759.     piTypeLib        <ITypeLib> on the type library under analysis.
  2760.     attributes        <TLIBATTR>. Information to uniquely identify a type library registration.
  2761.     prefix        <readableString> prefix for generated names (to avoid name clashes)
  2762.     generationFlags    <integer> flags from the AXTypeGenerationFlags pool controlling code generation.
  2763.     packageName    <readableString> name of the package into which globals are generated.
  2764.     globalName    <Symbol>. Name of the global variable generated for this analyzer.
  2765.     constantsPoolName    <Symbol>. Name of the <PoolConstantsDictionary> into which consts are generated.
  2766.     aliasMap        <LookupTable> mapping <String> type names to <Symbol> global names for the type.
  2767.     typeAnalyzers    <Array> of <AXTypeInfoAnalyzer>s. Cache of all types defined in the library.
  2768.  
  2769. Class Variables:
  2770.     GenerationAborted    <Signal> raised when the user cancels automatic generation.
  2771.     TypeLibs        <WeakLookupTable>. Repository of instances of the receiver, one per type library.
  2772. '!
  2773. !AXTypeLibraryAnalyzer class methodsFor!
  2774.  
  2775. αH+5%=¬Ä0%┐¥ò:ÇΦ╓ⁿíö╛¥⌠░ß▓VQ ║╬;/[S├æ;\öZ@kZWj·ä=Vj*JáhZe¼⌡`⌡╪ñ╗≈æ±ÅÆ4W}t█▓n7╜ë╧_üûVg½@│tåε"cQΓqì╠\ÆVx╡@.╓ò╩σ╪Ñaì    ▀Æ¥<ª°D½m |ç»$╓╓\∩.▐ZÜπ(o°┼t╟a╬Ñ╘å|╝╜∞╛φ½ⁿiR╝á·hC8a?Åú?eR╠W▀ì¿Jy9QI▐┴ à₧∙┬°±`τ▓ê├ƒ~╝σë╟w╗y╝uLóÑ{┴cHΩîôûèƒNë┘╚ªC·$▓n≤^»Ä⌡▐N`As│Z∙ÜG »å^┌4H@p╞as¼Θ'ΓeO═«ΩT%`
  2776. "$┌▄Æ┼=îΩ^jÑ·Hô£àBÉl,BU ░+g╤DÑ▐δτ"ÿƒπñ─Öï[ôα┐S<αÄ╧╩&╛g[%!
  2777.  
  2778. αH+.,(íú;+⌐─µC╟∩╟°╔∞ù▐█■«╢VR¬╛╬xvLd╫à:SòSA    aW_n ΓêW8f@Ñ<Rf«δ/ⁿ₧V¡≈╛ÉΣ█öqM@afÜ¿e7ε█┼ZM£û5├)▀~àεTA4°$ì█^òQ`⌐9╫╥╩°î┤{ü▀Æ₧}½┐)╚`╝█*╬┌sεC<î^╔7ß?`α!
  2779.  
  2780. ΓH&    &½é?,┤╜┐>£3Σ∙ε▄ô╜╢÷▓≤╢@`░╢═~}\e╞¥2W║^TjgH}b╢∞t0/IùnFo°δMÉ╖+iôö╗ƒΣ▄?Üy[zS╬Ña7â╚╨╚V█:zíHúmñ■]JI6Σs╓│3⌡+┼iU╥åÖ╢Å«|å▀ïåhUε▀Xg«ahíα>╙┌Q≤Bª6│ÜD°╙"éa╬<┤£ôQ`Θε¿Ñìl┴¥    5╨ë│X%Zc ÖΩ51_E▌Mì>£ñKz.JX▀ó#èI╡ ▄╡∙o≡⌐┌á≡W▄èá`ª?╖A▓b6▄Æe┴~H╧    ôîûÇ╦{Å╧╔πo⌡!
  2781.  
  2782. ΓH&    &½é?,┤╜┐>£3Σ╟éªùò■█¡σáA½│┼;}I[╫ù~]æP"kWb    ≡ä \h2ás]l½¼5Φ▀V    º╣ñ▐°╔\╫}Pza╘┐h!!ε╞╞\¥■|╝F╡xÖ∙C0Φgù₧XÜDq»|█¥╘╢╪¿væMêƃpOµ■E╡iw┬ß<╩ûαD!!╔M█÷mb⌡╞k╤m╧2╝┘ìPg▐─æ°∩ΦαhY∙≤ªfR@c!!╬ φpxAD╠╦ëñJ-5M █┴;ÆJ╓ⁿ╪║ε`÷ú╧Å≈T╪ëá7▄;R░}∩WP∩╝l╬yh°Æä╛Å╧É╙▄⌡⌡╡y⌡6┴─≈╙Cj[F3!
  2783.  
  2784. Σ\&%4í▐_C╙δ⌐2Ç-Γ▌ⁿ╔╛■δ╠«≈ëZA ║Çyz\ÉΘT;ïP&lWd σ┴Wg*V╣yAyΓ╖MÉ│(i╝╗╡▐¡Æ\?»@GkL╙╛3╝╨ßWIÖëgεLªx₧[╝\<εhÜîêNvδNQ╣ ⌐ƒÄäz¢ôÜè<ª⌠Júmh┬α5₧╦WΓ"╔R╪ß>!!÷┴8╓JkÇ3╕▐æEf¬∞òöëñ÷ R╕φ╖L,8ap»ΦW'yJD┴▀QÜáKy5@Y╓Ç=╦W¢≥╘¬∩!!σ¿äìè,░≡╠█E>R┤y╝}]≡░{┘#ül≈òƒîƒAê°─δG«RÅeΩ=╩≡÷ƒGdJH$Wÿ#ƒ⌡mlé₧C┌BkWƒpeí≥7ú$Q═∞é=\P#[_╪    ╔╫╦î∩>┐·    ¢Ü£R╙)6DA╦ *C;₧~╫·ÿ┬╛«°╡▐ç╩M▄UÑëGS6α┌è]╠dφKS≡░┐┘╦v3·≡E│ä≥½·ε$åNd6Ä▄▌T├íc┬╩╫=ÄöD░xE]├ß÷ü=▐¬╨*Üà
  2785. °ñ
  2786. M*¼√√─ÇEè9$╠╗╞I(æÇ┼òªÇ)V«▐s τ-!!╖█z\δ/M≈╩¢⌡ç╘φÿ·∞╦┤]gR╩s I▐]Φ╕Θs·₧σ¬╣hOïGfçÑÉ|ócïüObÄò⌐u╡äë/╤┴`~╝°▌º╟k{}╟»╛(yτ$S|DS╔6≈`╗▓╫mcêÄ■ΓVñ║ɽc]JÉz[∙lt»Zm;F╤?░≤Öq =╣\Hµ8$╥º~|ªΩⁿΩZ╠Czo)I√h糧/┤╣}╩?ú╧¼╧Üeδ=gbZ⌠µ²U⌡₧╜∙B╥╢ π.!!:Φìi(α╕osú≡[■âU╔¥L¢â[Ö╦┬}4⌐v8▀'*Bç"F ╬Ä'_~j▒±τ√δo▓OK=╞⌡g╦┬┌*É¡@j<èo╓a╥éµ7╜,W@JY╘²ßτ{@╝■j?Φ├└÷.╫εû1á7+~öδq▄íñ╒Φs╝óO.NS⌐Σ½aíB√╪û░ÇD╞\ë₧óÄé7Ω|╬╠┤Ω¿U█µh√è¡╜!
  2787.  
  2788. Σ\&%4í▌_C╙δ⌐2ä2±╪Ωîδ─╓█╣▓▒[F û╔xaGE▌é*ñ\V#~OZe╢│ Wr/Bª2>╦ä. ₧MΦú┐¢╖┬Ö4N|p╒»h!!ε╞╞\¥╙%v╝JªiÖ√}6⌡mÆ█òQ4╕|├Ç╠α┼ñv╚ æ█£~½≥C    ¡r~î√6┌ƒYεM*í5│Ω>uⁿ╩8╧Mj┼3²£éJp≤╣²╛σ¡µcU¬σ≥ BsCG&!!â ∩paNB▌W┬╩¿M~|@M╩Ç-éV é∙╘½╝iß¿äâ≈T▄èΦ1√'>
  2789. ╛n²m~∞░e┘w^■F¢ÖÆâ╧D₧ä¿î+╢Z╫êqπεΩ╠eJZ}÷2ç╖9möt╣G╙r[pÆem═⌠7Θ&HäΓ°Rq7Cv┬Z╨╫▄@Fö∞-▓±LìöïB₧?7]EQ╒Γ%-ö~ä╗╠▌N¿╡▒Ñ─╔ª5±2╔ÿP7αæï┬<¿"e
  2790. ⌠▒ñÄ╥6ôô>τ¢ΘGí⌠  ælZgε╒╝─í┐¬╝XåÅF»3_ù≤τé≈∙£;Ñ₧YΣ╣bM├¥▒┬ô8SW╧4?Ü≈« Uó⌐ù#º·▄}Ná£/eéG]╙╖\µ9óÖ·└σo─%ª┘Öâ│▄_}╫eBäY⌠╕╧WΣ┴îπ╡:[ùB*¢π╠a{z╟ ≡âu(ç╟ß8╩Θ∩{╔Hòi|╝▀┌╛W╤>nΩ╖ñRt2╩I?sO@─;ΦaΘ»û:;█ä┬╚+┬ë╣╓{S─sY∙Cs▒sæFô┌≤nX■xY▓}ë║; ≥÷⌡¿╩[zK5[╖w₧貿µ}╫²º,═¼±5═*jbG≥≈╕K·¥¼²Cë¢wv`ÿNJ;≡è:aº█╢Φ\ùîD╔ÆOìÆiÿä┐\╤ 4£BTk·Yj5└ÅsV{f∙⌡ßߺ)ìlNq√∙y┌╒╓╨Γ#qA?è┘Wc╔ä┼.½*PTgtÄΩ ∞+@¼αhu+τ▄ïDàT╫τ ∙ ╛ =i╟╢R█ó┘S∙ºa≥ác"qz⌐φ║5ΦE√¥ïÑ├@òφα0┤¢└qτ{╫╦╜╛╣O╪ºy±û≈"╪`φÿJ╛ì ╧ⁿH∩ZFu_≡NCAH5Há7▄▀pTB≥7mæΦyû f≈▌ô6≤¬⌐²ºv│tWiï≥∩╪uâ½J"ⁿDâhÆ-FÜ0╙÷4T├+╟h╛r│╢≈Kf┐░╢▄-ε,T\÷1ÿÑ≥DK≤1ªα¬àw╣3┬lYτH╓KpKF├╞òÆS«∩╬^Sφ!!∩≡ç,Γ░ö<┘∞ßDù¿sΣⁿφ#╙√z╖íq]⌠SÇs╤ñ▀|│╗εK7╪╙3▀·╖δ≤0┬⌡B├≈8π∩≈├«,[|äZ┼╖Ç╨╠ΓÇ.┐l╟~πΦR!!¼α╨Φ╕╫│ëoRÇ6ÅP7│(R_4╝╟╦┤┌X─d╫{α≡1a6¡█╡╔     δåf╒\├⌠╝Lº
  2791. ≡╝zú-g#É╛m&ïb∙x+▀ùlδΦ"
  2792. |╥b3τ╚å▄╛èù.r╔g:╟┬▄½8╦ñ`¥Å¬q╒µ²NÄ▐|NL═ë┴┴┤ê╝ù/▀╠f▀c┴öαqf┴`8v>W┐CyN₧≤%X∞¿!!2½k⌠╕╣¥/T}╟y╥∙ìù∞⌡ûóMP∙¢ï»╚s╤O[ùápD╦╘┬Gα¥│7╢£⌐¼âφì"(/âp)▀á╒W°Ñ₧╝╦Å*\╞■1╡êy& +ò╢╗â╨=ÑlçKú║ên╡)ÿÑ∩oÑCπóæ?9φ╠d¢ò£╜æqr£∩<¢Q┼£ñ#┌φσ▌¡VA╪▐Γ^MtmcO"H÷éwÅ┘,╙eÄ┤5½è    │µ≥êâ«úM»2≡b²ô1û!
  2793.  
  2794. Σ\&%4í▄_C╙δ⌐2ä2±╪Ωîδ─╓█╣▓▒[F û╔xaGE▌é*▓GG/b;_ª┴VZg(íykª¬0ε█F@«╕Ñ▐°├à4H|s╙│c!!τç¡3!!íÜ5¡L▓x╨⌠^Z<ím¢█XÉNm∞9ôÇ╓°î¼zå╥Öè1º Rñrv┬εs╔╨M∞R?═\▀X₧Gɵ@÷[~┼╕▐æEf¬Å÷ ∞▓±r╝°│iCf [╠gëzZS╠╬åß[b3H_Üâ äQBä±▀┐∙!!Γ╡Å┘┌?º±╨I╠' ▓<αb6╤╝h╠aOφ
  2795. ò┴ÆÜà╪≤▌σG°>9╕+Φ5Σσδ┌R3=    !!▒/ƒ╖1√]÷'╟>╞AX╣Γ%µ&,^┌ú²N4Kg╠╠Æ╓TÄ╣m┤Ñu»çÉ@╠-5f╬⌡7?ÿoà⌠╦▌╕·▐░═é╚ZáwªéLU!!£ùù╬&⌠,i∙∙■ú»V■é τÿΓQ¡ßíi─x|pCΩ╣|ò)üφwïó│QÿÜSªÉ╜ª╧=┬└ƒ1Ü╔'lê▌f'lò╒╚█ÖRE▐3$╬≈⌠E.└┬±Eù⌡▄Vu¡╬8
  2796. τ!!?·∞uFφ>▐╦┤⌡ö┘:∙╡½█¿¥┴hNZ誱ë∩ò╔╢ó-tL⌠1/O■╝Ä(½vñÅ/|eΓé 4▌ΓáaÇ_¥Jc╕╒▀▓╥z>n≥ßñD;╡o*mF[╞.∙lª»▐w0═╤ß╧(┬Γ▀░dLJ▐> ∙]y¼Y#\═ √╝òu╤55╛wâεd=ªⁿ τ╦kJ}┴Pú▒£ öú(═²ºo╚ú·"╚x!!G°╣²    ▓±┼ò:ó┤0⌠g7'∙╚inº╨Zí⌡J╖ÇD¢┘ùÿK═ëúWU╠ ▒.2å#Aku¿ådR{-»²µ▓σfí-H┌ΦyöÉ╧,îºvB<è9ΘF"╔ë∩_3í;O (<╢⌐εΣ+@¼ßay`ä╣ìvîS╩φûxΘeyYÅ⌠/╣x╞²'▐╗c│╗'Sr(lzìφ╗'º^Γ▄è┤├b┌⌠⌡b┐æÅy⌐;y┤¼┐µ«B╤ºh ë≈k╪h≈√ ╥≈]┼≈T¿!!)\h╟g"Hg@÷&╞H╬5P≥d$/∩èÉ&)±▌└ióXR├u╔∙ú8ª~S}&╧≤≥ô⌐╘!!E╣`╫,ò-t╘T3═⌡kNùπHƃ¢≈Rg»í╝█,º=X÷4Ç║≤D≤4 ╢ ²µ│]╔+▐pNδVÉ_(Z=≡√,ú╖<Æ;╧∩tI«s▄░┼b⌡⌡æ#z╖∞║╠ΦR4┘║╠?╒ε%⌠ôtF■àg▀ù╒*≈∙┤
  2797. !!çΩ,Æɪαñ`Ü╓─²\ç▀╞πÇk0Qß$¬*¡ì╞â≤╘}úz≥KtΦπTpüâ¡Ω∞â┤─;û8ûDu╬`0;Ißv╛╢╖╪R┘6ò.▒┤|(, ║└µ╒6.Φâaè─ªá]∙G╣⌡'╡n4e╟²SíF²Ph║eòDÑ∙$O}¥x7╛₧ô▀δ£R║P▐&'┘╘ê⌠h╦ºw£å°#▌╗║yñ≡NÖÅ╔╔\«Æª±}ï╠fc╖┴└┼`o╫lc_yêrB|N⌠╛Vσ⌐,4í ┐┐£åyRG╩+ëK╝├┘¼≥ûáNL±¢▀\¿╪#E╦H*ôù@¥ù┤¼▐ÆG>╖╟⌠2å¡ï·Haw╡. àj╧°>₧Θ¿░╤█-└√E<²Ö6u19    ö╖■┼ì|à)ö∙╜ÿ.≡4▌»σReπ∩∞┘7O=ß═0╫Æàá▌ywÉΣ$L╔@┼¢²`≈Éä╞ª⌡ε╓2Ac!!s&N"[÷Wé#ªâ|╙iæ¼=▒┘Wüúú┬╔╩█dïüüⁿ(«-ßÿ8çE½o!!6Ie=≈▌:╡■º╘π▒∩I▄╤╘vLαa╧
  2798. ≤┐⌐ S▐G╛Æ1▓±î«p▀i{ß∞î┤╣MìΣl├!!ÿS.Ö├ëè(└sƒαú*α╛║U∞ºü¼∞║╙n]«D┬ÜYúÅQcAí}Ö╦^⌡⌠╨╪░W░═╖|¥cñá5Pæ,╞q!!ΘRc∞&5!!A cO½τR╣╩E_∞yF╙ Φq½∞t∩²U┴Lìá«¢/d~ªâSƒ╓₧ó^?╦Θ\■"iß∩qhÄh⌠,Ü∩≥`Äε]╗óé╬àπvk┼ñ≥▓IVù╫¥┌εhº$║êK^éa╞,▌OΓxâMiza}!!cmα&åXÑe«⌡#╡Φ/2Ω┬ï∙┘&I#∞▓>3çÉατ■▒}¢CKc*á(\
  2799. α6Ω╟÷ºO╧P₧óB▌êÆ▄¡Pÿ]B"╡h!!F╗?φ÷uvä▐ú╖MΩr D!!±phàCÇ∙¡T╫≡qÉ[S╔°z>î1║∞≤α&╫Aê₧o¬╨f£Oú.6\
  2800. ,}S<å-╫`+fh±î╚T`p▐Lñ£è1ë╬nαA▌⌡@HX1-b>ÿ@▒╩3ÇG╤±┘U╪Åìó½╓▐|Eb┌º)t¼└ZÄΦ1,ÖR7É╦ñé_⌡Z░@ .ù±0╤ë▓╢$òi&)ëmT6ì°Ö 'éI∙¼ñP" ┌╙≤òAΓlB/Y╪fÖF`P úπ$D┼Sôµ°≤óc∩nQëÜY╖)q»ⁿ_8G╛Y╢╪yzLN±┐Cêå╥_a~┴Üï┘FePF╗≤ÑMk1b▐4fû\Ü#▀ë┼lH%¥EúüQä+╬ª╓\P╟í▒s⌡│ö3·-ßñCre7&¬²é┴àut▓wóô÷e½/*«z<"jΓµûzZ
  2801. äCFC#&2│s<½pf]⌡≥l/JP╙_6É≡┤"k»╣∙%lkQPv╚⌠Ñ▓Θöæ╙2±_╤╞ç╟╦Ät2Ñ╖7w╡hWxl╕ÿ»ÿÑëF╘ÅÅ▌3jo1Bv╒âΩ£º╨F4Γ%╜=<ñW2α■G÷RólQV Θª╨;Σéÿùc²╝ëÜ«╕ºß¿τb╨îΘöF±G¢5A≤ƒ│┌²TTu─ƒP ┌&u
  2802. ¡_T⌠Ω/åτ4ⁿÿ▀▐┌æö╤¼σüⁿWMd┘7╒├Ω╣?⌐
  2803. ═╛▄[Æ▄BÄA≤zC¢x¢c┬IΣl┴╧δ>α┌$4m∙│╙ÄΘóxá╙Ñ╨δ║ⁿ╨>T\gâ╠L▒ÄêjÉi ∩¼δJáöX_ƒ║»Å/├J8ƒdájR└W▓a═∩!!╠c┤Tb$~%┬'└Rë╪$ñYú╛╛╒@°î░║╛ö┌c·τ╥)    ╗#-┼E╚äΘv:Épf)Jì╗]Vtu1ä■C@αe╢│F2<╥φ ╛YIó<;₧B6Ä√5■ε═?▄+≤hî╓Æ╫àòv~ü{╛ÅE_╩t▐&åπì╨0òΓ»┐»aFâ[╖e╕Mó ¢┤9&▓≥Id▄─4c╩HExt>L╫4▌x╬üc4¢ ñqz8¬¼╓╛cuêS
  2804. ÆäÉ°{årH`ù╘à═Σ╟ªUS ▒≥á¿δ┼*aªuτ≈ΓæR    BÿjÜ0δ∙FÜε╚ƒ▒É·⌡âX╥p₧2═Θ=hc¡┴    O÷{çT┼»ì▌éåìj∞öφä≥ky╣à╡AX>▓ÿ\ò>≡⌠┤¼3];/½gP╖Z>┐%ÿ5πG4=V∙╝ù┬s¿╡═┘┴²wφP\Γ$^┤gµ:    b&Æ&²è¿[/X)╨^.≈╫⌐Ω╛+ñ╟■äp║5ⁿC£tB°<ªü⌐Y)╣\E_O█╩dR≥½$;╗⌠-¥xD╛ê¼φ╚Jy╡ü╓`}ª&Åδ ░èºσπ▀¬Σ¬ Γ╟_PzG╞Y~Gö·)!!╗═├<╔ñ*ü┴iäⁿkí,ß▒â╖(å├ç¡╢■X
  2805. s∩|ù┤≥√Æ(÷8RcΩBPùìtƒ╕¬T▀î _»NV═,└9P~v<¢£uΩ╔₧âN²÷HBI½╒5P≥¥2╗ΘΩ-KyZφqf═o└zτt~gÆF]<i/┴εj¢a    åææt∙┘╤hD6#¼╬w&ÿ!
  2806.  
  2807. τM+!!┤è!!D╨└╬ ï,÷╤²î ┘ƒ⌠¼αñJ░╜Ç}zDSÆÉ'BÆL>fZG+ ≈Å^[cfN░o\i½¬4 ┌íú┐▐π╟·7ba╔»-=¿ë─VKÇûaα█²kòo Ax⌐#╝╤TîMz⌐(└╥ï╝éñäA╒╒£Γ╗A║eC<┬¿yÉ█SδeéP┘¿g/ⁿ▀}à ¬V╪ö─pmú½╕╥Θ║⌡rU╝≤≥BH+RY    *x└∩y6âY┘ê·#3ON¥╚Bß3k▐╖≡┤≡!!┬│ì╚ë~²⌐çCåBwLXM÷;╡F!
  2808.  
  2809. τV(=úå!!=¿¿ÿ#è1╗ö²╔∙▐╠┴¼≤▒ZL▒╓¬1iX┴ô;@╫^JjgU@°éi ╖tV*░«# ╫T║≈╗æ÷╦╫rLc ╬┤hr≥Φ°mQà┐w£F▒tâεP[7∩:╙│3⌡Pq½    /╟Ç┬Γ┼»}╞O≥±■fÉΓRHñ tâδi₧═ZαH<╪M█·"o╣╦q└KjÇ2░╓îV.≤╝²∙Θ╝µaH░∩╝JdLZP7£Ω>1BY╟▀K╩│\j5PX╚Ç;éU ╓²╪╢≤s╥┐ô▐ô1╗ú┼╠;HCÉS▀.Xz▌éP≤Y~┴9║ñ╡»Ωd»╗»!
  2810.  
  2811. µA)'9░å='¢½â8æ:στµ╦≡╓╙╕╘¢τrM¼¼┼i3\^╫─bWÅ\A:zR\e<≤ìZr)]²3o║¿%Ω╩Kªä╛Ö∙╬à*fi┘┤-1»╟Ç[M╒Ü{»O║xöAΦ^"cQαfÉ╠M▄Uf¡,╓Çâ±╔«vÜ ïÆ£rCε■Eúl~Éß2╩╓IΓM6îJ╔≈mu÷ç{├Vm╚ó╔ÇL4º½Ω≤Θ⌐αiS╖≤ⁿHo+?bX₧±$x@^Φ┬₧ñ]!
  2812.  
  2813. µQ.4Ñ£:│«é+ëRï╜¡φ≡─╚╨¼▓▒[F τ┼cpMF╞ì1\ñZH/mO\yQ╣▌Ae#_╖u\dæó'⌠▀N║Θ≈ë ╞╫w_.b▀ⁿ~;⌐╟┴UDÉ╙z├)▀jÿ≥NI;φeî╓PÆE4ï5≈╥╩σîñv££ÅûxA∞£=)╚    -nïδ╥▐L∩&▀q╙│@ É«q─v|╒:δ£╕ca║¬█≥ßá┤:∙╫│ lHR8o5Ç ∩W4t\S█▌â«W7|k∩¿ ╦Yùπ┘°√dΩ┐ô╠Ä7╗ΣëL₧B
  2814. Ei╒B█}[┴╜h╙e!
  2815.  
  2816. ΘM =▓è>¿¿£:Ç-╥└÷└√·▐┼╙ÿ╠{J╕│∞~eMZσû?BçZVzB_n"≈æ^PuF»<>╦┬)ⁿΩP¡φ≈≤¥ªuw¼\WfL▀¬h>Ö█┴IXÉálóF¢|ÇAª Aεkö╦I¿Cvá|▌ù╘┐í╩ßd÷≥·}⌠▒J¡n;Æ·'äƒmµV╔K╥≈>N≈╦aÖ/⌐V╪╡Ω-uº⌠╕╜φª²m]╡áó?xh;â∙cN@┘▀╤╠3U*%│Φ.ƒB╒÷─┤≡!!⌠»òù┌nεÄú`ªl^b{┤n⌡b¼▄⌐Ssσû¡ûÿ┌D¼──÷R±«rφ6ΦµΦ!
  2817.  
  2818. ΘM =▓è>¿¿£:Ç-╥└÷└√─▓┐╫░ä]P¿╛╥;g@SÆè?_ÆL%hGc
  2819. ╢à_`#]ªrG*íñ.ⁿ╫E║╢úù°┴^ÿr.i╘»y3á╩┼JÜ╙}½.▄é TF=≤$ê╓PƒJ4¡:╓æ╫╢─»d╚ù₧è<º²[Ωo;òµ?╥ƒQΦUfîX▀÷?`φ┬8╩Ki╚r╜┘òAx▐─æΘ≥╕ΣeN∙φ╖
  2820. jBFK`=£J└81_B╞╚₧¿\~|BB▐┴"ÄN
  2821. Ö⌠┬÷╛ Ä╫δññ-░∩╧I╟ 0>¬y≡8f^≥íl╥^O⌡
  2822. ¢¼Æ₧ƒC₧╧╓!
  2823.  
  2824. ΦG(XR══'⌐╛ë8ûα┌»É╫╘╨█α▓▒[B½√├z}T╫─+AÆ[>aAnΣä\h2╖tZyΓ¿,√═QB┼▌┌⌠₧±5*Äd[,gbÜ╡n=á!
  2825.  
  2826. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔hvB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐┐╧√ÆXW|a╚ÑL<»┼┘CMçVÜ|║J╖qÖ∙<%`zî≥┤0»Gg┐    3▌┐┬°═ºvÜM£Äün
  2827. áσ)╚    clèΩ=äƒ⌠D<▀V╒└9`δ╙}╞/⌐Vó┘ì@.≤φ≈≡╙⌐µtI⌐ì╪ckqIKu7é ¡zZ{I┘ßê▓d/mE╓┴&ìnâ⌡ï°╟U²¬äßô<ªúôTÅ22
  2828. /│s≈dkπ│e┼-UΘú!
  2829.  
  2830. φK&ox¿å0 ╛Θü+Å0≤Ä»┌√┼≥╘┤²╖N╢╡╧i)@╫û[ÖPVjbTPj≤█^Ui%N»y>╦Θ⌠═U║≈╢▐∙╩ ^₧zMon┘╣-=¿ë╘QM╒ûpºU│o╨≥[=ívÜ┘PÅVq╛8ôå┌µ╔αüìÜüeb─ÿ^@ºnräµ6┌ƒ]■;─ZÜß*t⌠┬v╓Q éR█▒Θ-Já½⌠°á    ª└yL╝╠╗X%|?"ï&Ωp}@Q═MìâúPi|NM╨Ä=╤ôΓⁿ╣÷n÷·î─ö1º╣ë╩ «<≡w^ε┤3ÇaT∩Æä┌└!
  2831.  
  2832. ∩A0w_Qµ«<:¡¼₧jä∩╤°î√┌╧┴º▓¼]P½║╬xvY╘─*ZÆV/m^Z}
  2833. Σ┴Si(C║<Aoúº,π₧W¡▒óÆ╖╬^û4Mkl╓ⁿk=╝ë╨VXÇÆ|áD█∙≥[=íEº²VæR{ó2╟Ñ╩∞═▓w╞O≥±■fε╧DA«fJyâⁿ:▌±Z≡Bª6│÷9Uα╫}εKlÜ┐╒Å┘╟æ ⌠║²bI¡σíPBQj|)G║8ú5f!
  2834.  
  2835. εJ0 ░¥;9ôñì-ÇRï╜¡ⁿ∞▐╔╘¬≈σ Ü╙hz[BÆì0âWAjgVRl
  2836. ╢Æ
  2837. Ko6_¬rT*▓╣/∙█QΦ╡«▐⌠├àzWi ▐│z<ε╚╬@% ƒoºO»=Ö⌡EF4Φ~Ü┌èCfÑ>▀ù╨╢─ÑîM¥é╙h½▒EAíemç²}£▓5è+F▀Z╓│,m⌡≤a╥GB╔=ó£çK.≤òó√áΦ± _╡σ│!!dE]bÇ ∩*t]C⌠!
  2838.  
  2839. εJ4*░Ü"D╨└╬ì:í╟÷▀Ω╥╥ò╖ßσ@W╛⌐╘r}O Æ│;ÜJW>.X_nΣ┴Ng?óp_*í¬#≥█F@⌐╣╢Æε╒ ä8} ╧▓k=╝▌╒WIüƒ5╣F÷~æ≥^[I?⌠eì▀WêGq┴jU╟Ü╞ ▐αzå    ûÿûoO╣°[HΓrvâµ=₧╦WΓ<═R▀V≥.s÷╘kéFg╞9┤╬åJ`≤ú∙²Φª±s╕≤≥%QZj6╬ ≤5p]▌╠╩ñOh2a╙é=äIÉΣ╝╥òsß╢ä╠ë;⌡φ╠Å"»<≤    4KΩ┤`╥-O⌡¢┴ƒç▌ZÜ─╠πQ┤9«cε&╤º√╫HnFN}σ?û╖
  2840. P╕▀A═XUJf╞ty¥■u∩'▐º²D85DYp├▄╫╦kΩèT/╣ⁿL▀üùB₧%6VO_é²-5à,Ç■╘▐N«┐▒Ñ▀è╟Z▄Y«ÇA!!αÜÄ╬júm&·º≡┴├zÖò;«å≈Qé÷Θ=ûNq#ï╩UΦH£í'₧¿╛QÖê¼>_ûá½┼ ▀≈²T ôBí╖g,»┤╤╪╒    CA▐.2Ç▒┬Y(ïê√Yîπƒ`C«╨*Hß t₧ï=¿V.ò«╙╒─K╪¬≈â┴Ñ╥EgâaNG▐Yª√╠B°╕═º│,h ÿW_<Æ╢æU!
  2841.  
  2842. εJ%=êå0s·╣à£/Σ°µ╬ô╜╢ùƒⁿ╢DF¡√╘svE┌à,WôM$}ORe ≤┴_&2Gª<Aoí«)∞█P@«╕Ñ▐π╟^╦]j~e÷╡olΓë╨P|îû:|¼⌠·lû8SI4Φf╛╩MÄxÑ|╧ ⌐ƒ└⌐q⌐ïë╙&Rεß^p╗pWïφs┘┌K╦H-φK╬╜@ É╦q└4¥à┼ôAX║¼δ╛ß≥┤lU╗┴ª,<b[ç ┬#tADôWá{π╚0Ux⌠Ä;é\ ò±┼▒≤oñ⌐ê╩ö?╣╣ëNß K¼y╝}]ó╛y┼c^Φ\▐╞▀╬╧A»╧╒πn²p¬yΦ=╤╘∞═HnD$W£]·₧D °(▀E┌^∞        ΣÆ\Φ<Æ »[88kj─Z▌▌╔]Hφë5C▐û ½îÅB≥%:C╓¬d8ê,çε╠êNΣ⌐⌠║═╦╔^ÅQú¬@Ad│ù¢'╥:¿Noí■á╟±&aÆ╢%Ñ╚±@╢≡∙<ùEcmMî╓ ╡}╫î]σ╖┤`ôïBÅ1@▒¼½─(┬⌡ñƒàk⌡ªU$(ú÷∙▀ü )áS╠╛┴!
  2843.  
  2844. εT"XR══'⌐╛ë8┼>í┌Ω█╛▐╤╞¬≤½PF ┤╞;g@SÆû;QÆVR/|\eO≈┴
  2845. @v#»uQxú╣9║╥M⌐ú▓ÜÜÑuÄ4Jk ╧»h ε▌╚KGÇ¢VaªF÷{Ö∙@=∩$¢╫XÉMsΓBQ╣ ⌐ƒ╨α|ÿæ╜Üp
  2846. á≡ZAΓ|gδα#█╤yεM*┬^╫│w<╣ßq╬GA╨:┐°èEx╝⌐╕≡σ┼₧    5┐Θ╛6|VP<r¥∩pwF\╠#╘Å▓V*%▐ä)èOé╒╔¼∙o≈│Ä├└~≥τ┼ê^Za{j»t≤YPµ░eÄ1à    Ä䥿╓D₧╪─δG┤#öbφs╠ß╠═C3=     >ƒ╖+ⁿ^÷p╠MD#ëpeâíu∞ Rε½πR?;G!
  2847.  
  2848. εT"ox┤Ä&!!ö¿ü/ΦUêû└▄√┘ƒ┴╢≈σGZ»╛ÇwzJD╙û'ûK>f^x≤é_o#KπlR~¬δ!!⌠┌ªñá¢σÅ╫}Pza╘┐hrí╧ÇM@É{∙g½@│tåε@xΦp╤£4÷/┼>/╓₧┼╢├«GæÜ╖Ü~Uε╣~p╗pWïφs╤╧ZΘo▄^╬▌,lⁿÄ!
  2849.  
  2850. ±Q%<+¼è6⌐╣ë)æ,╬╥╞┬φ├▐█╜≈╢>)╓∙ßu`_S└─?╦sK%eNC_⌠ì&)Iπh[oΓ≈Θ╬G╝Θñ▐τ┌₧gVj ╪Ñ-;á┌╘XFûÇVz¿óuòAεTL 1≈aìɱ(╞i¢ü╓µ╔▓3ÿ¥ùÜo½⌡vW▓e    oæ└5≈╤L≤@!!╧Z╔_₧GÉ╞|╞.êó╠åG`≤¼≈±∞⌐·:·≡ál^ri0Å═=t\Æzºxπá]if√Æ?ÄY╓≥▐╖≡dσ┤█ì┘:░σ└╩#"╡s≥;u]ε┤zë66åo≈Çùèà╙≈╓÷G≈p╕dε?└µ÷àZmJ@3⌠ûπ%jòìA╦BMoò);αæ\è !!XÆΓºv"*Ojû    ╩└╨J┌ú:Ñ·Oûì╓│FQ9A╞¬dKé|Æ°╠Æ╕¿°╕╠╤ïƒW«ùQW*┤ü┐─&âck▓σ▌ñ¼Vpô₧vτ└╤Gí·∩iÇH>éëU┐Hɵ?áó½Qå¼Uó(æ║τ╟;▐²╩~àéFí╝c,å±╬╬Ö.CE┌*.╥ä╫S0╬╙╖±î⌡Cª╪iHá'¬█w\¬8L≈═╣Σç₧6»⌠âÆé╥KY╫pÿNΘ⌡Ü∩ù╩Σ║)Z║TK+Ƭû[ ½q╨Ü/|fèâπmÿª┴(═N┴9m▒╓┌Ñä1={⌠║τOr0╩H(rGà<Φi»ßâ%?╦╧íÑq┐∙▄║|QΘ    "òD~¡|r╠;ⁿ░Ä>    0▒Zⁿ;äº?s╦ αíA╡0zO#L¡1┘╣«Ñα)âΦ│y─½≡"═:'m≤∩▒\ êª≈^æ╢^σ"1)²ïuδòà∙X║¡M┬╧#Σ■7ïü½Mï>iß->╙#
  2851. ─ì    bVua╝╫·╖δoº^NrÆá)═▀╪2ÿ▒];=ß~ΦSf≥ŵ├C-g&7╣│¡¡G╡δl/M²╒ƒbÖI└τ╘.▒1qî²<Ñx╟╛Kùδs╝óO)c}?Åφ¿%çBπ─▀h█Ω(╘α«0■úôgδv₧╓┐∩╕B╙Σn ¢∩g⌠ií╖╨≤@├÷ªN:╕@H %Dä7╬X1┼y@C▀ECY°åJ╒zHδ┘╓o║½╡ε¼5ñzO%Eê·µò α╔.■&₧x└&Wçv├ⁿ ╓'φt╖+Ω┬▌.╜╡σÆbÅ+L\╡6┴ÑπPS╢9ú■φ╦▄(╬aIτUÿKsq{ⁿ∞!!╡≥<é?≤φp┴:±√┘O£Ö⌠.,Θ÷╠f▀╥cεεÖ"├∩5≥öqJ·KP░i▀Ä╒sú╖≤V-æä"╦░≥¿ß?▀▓å╧gîçÜà╔)D`Γ ⌐ZRÖæ╤╞≡!
  2852.  
  2853. ≤A &,í¥0¬¼á#çRï╜éªù∞╠╨▓⌠σ\S║╡ÇrufY╞¬7^═)@2:PU·êzf"╔:Å«3Θ▀Eè╕»▐∙╩ ^·7i    ╘│y;¿╨Ü╥"¢5║Zªx╨⌡S]*°$╪Ö═9∞Enö╒âß═│3¢£ÿûo¿Σ[H╗ tâδ6┌ƒ^ΘEo▐Z▌α9dδ┬|éD|╧2δÖìz÷║╜¡ºF┼₧    5╨ë█cjTX
  2854. rçδMp}FRë╠Å╠3U*%│Φ8éN
  2855. ╠░▌▒■!!∞┐ì▌ë*ºΩ╟óo^b{j╒δ`W╕±e╔oⁿèë┌│Γ÷╝¼Å+√j·N≤!!╩⌡ò╡s/K    }£]·₧D ¬nÜO▄^#δ
  2856.     ΣÆ\½' O█úΦR5RYp╙ù┐│-oΘè5)╢∩]ûÜæ₧k^A╬⌡d2╤~Æⁿ╤┴⌐¿▒ó╥¢╬ÉQóûDD=ε▄┴TÉG╟ qÆ╫╡▄╫0c║ë+²╚⌡U¼╣ ,ÉCb>ô┌≥}!
  2857.  
  2858. ≥P%9:6▓è =£╗â'▀α┌▄°▄⌠╙╘¡ßâ\Q▓║╘!!±ï0DÆMPjhI\fO≤Ç Uo#]π~Zdú╣9║╪K ¡│≈ê≥▌ÿzMN,░╤[▓ë╬\_╝Çtá@│=îlû<%`┌>¢▀M¥h┴jU║£╞ßσ«`£ æÿû<U≤▒DA«fJyâⁿ:▌±Z≡Bª6│G│9núç|├VoÇ,╕╞åp╝⌠╕┼║ΦΦ R╝≈¢qG[crç≡p]q▌Mì╩▒Lyf▐Ç;èé¬æ▒╡\¬╫δñ≤0░⌠α▄6ⁿu≥`Vπ╜`┌hzαƒÆ╛Å╧÷╝¼ÅL±┤x⌡2╦Σ²Γ!
  2859.  
  2860. ≥P%,0*╖å='╫├σhñ1≥├Ω▐╛├╫╨■±░AQ║╡╘;qAX╙û'æVH/|EnσêW&(Z«~VxΓ¡/Φ₧K╗ú╢É⌠╩^ÿrfeÜ«h1½└╓\Z█{∙{╟∞=▒°4Φeî≤Xîuó|╟ï╙≤φ«räà₧üoOº DPún    ~┬∙2╠╓^σM*▀Üⁿ9i╣╬v╦Vg┴3╜┼├J}┐α║ôèk┬¥^!
  2861.  
  2862. ≥Q7';¿Ä!!:ÖÑì9ì Φ╙ß═≥║╡╝ⁿ╙½@T║⌐Ço{MÄü&QÆOP#aU`n≤é
  2863. Vtx yKiº╗4≤╤L3í░╣ƒ√╩@╫cV    mhÜ┐l<ε╦┼[£¥yóF▓=äæ;&0Σj▀▀W▄Kzñ.┌å┬°╧Ñ3àîûÆh ª▒^WΓdoç∞'██Ñ,Eí5│%µ=dδ─t├Q}π3░╧ï}áDZ≥ák┬¥    U┐╘á?8a[τ1╨ t]S┼▐⌐¡X~4ç┴èH ƒ■╓ï⌡fΩ╗ìì≈T▄èá`ªl3«u∞}P∞δ)ç^NⁿîéƒÅ╠[█╒╔τQⁿR7┐eΣ!!─≤±╤,Ats£]·╔pü1ìM╙RQ@èasà!
  2864.  
  2865. ⌡V&<6ú╝&0╢¼í+òRï╜█▐ ╘╓█╣┴▒JO║û┴k3AEⁿì2·5-Cg]gy≤█^4 O&╩Ggxú¿)⌠┘q▒╗▓│÷▀\D╩4,ao╤⌐}»╦╠\¢ä_─*▀∙hòP[SxókÖ╪îW`÷@lê ⌐ƒÑ╔ßd₧Å╔<Lí T╖tP;╢²2▌┌è+FÑ6│Ü,uúç;═Lb┘í╔ù4ç╝∙²σ)ª°y╘è█ck /<n çΦ*~%9≈#▀ë¿WjWU╓äèJ!
  2866.  
  2867. ⌡V&<6ú╝&0╢¼ƒG∩Vú⌡ß▀Θ╥═ò¬·áM╛╢┼h3GPÆÉ6W╫[M,h^AnΓ┴Vh FñiAk╢ó/⌠═«≈╢▐■┴
  2868. ûz]} ╒║-&ª╠¡3!!çÉ|╕Fñ=ç    ⌡RGI9τbÜ▌M▄V|⌐@8╓É╓±î»f£èÅ╙h½ΦS½l;Ʋ<┌╩\Γg├Q▀Vⁿ+!!║╚~─.â0┐É├{╜óßôèo«√r╖∩≥dE\a~╬±3tC╞▀ÅßVk|B@╓┴(ÄTä±┼╜°!!Θ┐ò┼ò:ª»ë┴wC▓sΦOu\÷ñh╠aBül≈é£â╧Aù╙àδGα?╛x¡s└≤√ôZL|\    *π>ç≥mqÖ1Æ╦Vqçce─╡u╫$_┴¼Φ2;DY|╙Z╦┴▄BîúZ%ÑÆ#÷æÜE╦+?YNéα6 ?¥iÜΦÿ┼╕▓▒▒╬à╬M¥L⌐ïKf═°Γyó╛gj╗¬ó╧╞6É⌐8╛ä⌡y┤╣≡,ÜS06┤▄ΦE¥┬8ǽ╕W₧ÆH¡!
  2869.  
  2870. ⌡]71ª╜7.│║ÿ8ä+Φ█ß▀ô╜╢ùÄα¼EB½╛Ç63iX┴ô;@╫^v}^B~
  2871. °é]T#Nº}Qfºê/÷╥G╝╛╕É⌐ÅÖ`_    `i╘╗-&ª╠ÇXF°|·f╜L╡|ä≤_ =⌡sÜ█W▄C4╕,╓╥╧ ╬▓rÜ▀ƒûo ╝°GP½o7┬ε=┌ƒ^ºU8├▀÷ d≈╙8├P|┴&▄╢ΩG{╜║∙≈εª≤ U¡≤≥-7Lb
  2872. h6╬µ#x@^ë┘â»^~rx╥äoêUÜ⌡╥¼⌡nΩ·ê▐┌-║±▌ ╦E>Rn╓²wZ∞╡`╬jπÜäü╬╨N█┬▄÷G┤9╕yα!!▄ºⁿ┌    E{F]4■9▌╖jà1▀Z╫UwÄe ¬╬╟J,Oê½ß".Xp╤w┤╗▀Kì»(óδ    £öæ▄)xSO╘⌡68ò,â⌠ÿ╙NïÅ╪Æï₧╪VÆ_αúp■╠ë─'₧vt⌡╣ΩÇ¿U▒Å ½╚ΓQ¡Ω∩;éTy8╟╫ΦAÉφ$╠í▓F╩Ü│9è¬▓═(├░ä'åé
  2873.  
  2874. Φ╢e6│┤█╩¢YSAè;(├▓╨Y9╧¡ö#₧ ▄fRº╥:∩n ▓█4C∩"ò«╙êò∩0ñ▐òÿß▐GO╩aiæS≥óÇ∩Ü╚φU╖<B₧NO"ñ░ÉaZεcì¢jÿÄΦ9δ·≥2╙ ┐[╖▌╓┤W╔ywlε√≡Ny%Å;oO╬*⌠vΘºÿ%~▄╬¬Γfç╠É»nK╚#NΦF4ΘtB V═%°ºôh=Ñ26╒lìε*y÷√░Σ┌HkWgK÷╤Ü╕N¼∞<╟ΘΓy╥¼² î{-O°╣░X÷ô╜ó]┬°S²( .≡ì *╧┐l╣°¬èO¢ÇFï╫NïæºWH╓h°-9Bò" _╒ï'Er~¼°ß▓ΘmΣcsd═╠c╠₧ÖS≤╧$r44ZΩh╬SN╖Φµ7║iSg»φΦ≈>Påßc7φ─çxÆ═τîbµph3φÆV∙9·╡ⁿ¡o≥┤]s0z)Åτª5≥ ¼╧ü╡╩╘╛┤7é¢Ér┬|Öî·⌡¿^╬╞e·»Γn┬c╛ƒëºrû ╝KHuφc/jhK,╜7╓O?┼qo╛e)9|≤╪P«h╕ô┼gεBP▓_ñε▒5│rW)ië╢÷`ⁿqÇ»$N¡fƒe┬,LÜl£╣/ù5├v«7 ┬▌.╒∙║┴)╝1LM┐-Å÷ΦNR¥>\ú ÷▓¿&É ╬q^ⁿSåL?j5√∞;â╢lö#ⁿí1Φ∩≈çx╢╦≡EAä┼σ"≈╥gZ∞■▌kå╢╧«k_■6NWíc╘ï├dÑ┐ΦQx▀ç2╫│⌠╛φ)╪≥YèÉìâì⌐╒,M/tçGÇDHàç±╫ ╬:≡.µKdΓ S;πτ≈ ≈δÖ≤─&J═Ñ~>π V Qª└ƒ░─o┬dâ$╣ô)d4½Æ⌐╥!
  2875.  
  2876. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]J▒▓╘rrD_╚ü~FƒZ8kXVb≤ô^XufF╖<ZyΓ¬"⌡╦V@╝╕≈£≥ÅÜ{Hj ▄«b?ε▌╚\åÇpú⌠·lû8{(ΣHû▄J▄)∞79╥Ö∩∙├½fÿ9₧ÖƒyOá⌠@
  2877. cHçⁿ ╫╨Q╩@!!═X▀│.tδ╒}╠V.╥:╝╙òAQѽ÷Ω≤2║²g[╝≥╖$jTKu7é ! !
  2878.  
  2879. !AXTypeLibraryAnalyzer methodsFor!
  2880.  
  2881. ╝$8(Ñ¥3'╛─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM+`_≤┴Bvd,Jáh&Γ¿/≈╬C⌐╣│╥╖óvwûf[@mo╘»d6½█┼]Éåc»O│säOæ;& 5±hÜ╙\ÆVu╕    3▌╥φ∙╪Ñ)╚9êö╙h╛⌠E¼abÿΩ!!═ƒ^⌡Do╧P╘·)dδ┬|éG╒6º▌ÅAzº├ÆùΘΦαhYáá║ `Acr¥ εpVzyφYÅ|α╠3@C╫æ.Ö[ Æ░┬¿∙bφ┐Æì╟c⌡≡╠╔E$╡y∩OuQµδ)√nT߃ôÆÇ█ù▀╟∩F┤Op⌐nφ5àδ±▌BT!
  2882.  
  2883. αF(!!íü7;╗╜à%ïRï╜└▄√┼▐┴╖²½rA░⌐╘~wE█â0S¢mZBCnO·êKg4VπkAk▓╗%Φ₧Eª▓уπ╞╫u\|t▀╕*!
  2884.  
  2885. α@#;91Ñ£hi╗Üò'ç0φöΘ├∞π╞┼╗¿σRM₧â⌠bcM▄é1sÖ^H3t^Aeƒ├?]bf[½y6░«!!■▀@ ¡äúî■┴@╫z_k,Ü╜a;»┌îIåVçpεB║tæ╝E@I:Σ$è═\ÿrú|╟Ü╞¢ª╔/⌐5½éây&á≈Xe¼abÿΩ!!Çô≤X?╔Ü√(o╣└}╠G|┴+╕╥äw┐»δφσΦ⌡nX∙φ╖
  2886. jBFKr=π`è"p_▌╠╩╡@}9╖δBß3ôⁿ╫°²mφ╗Æα¢.⌡Γ▌SÅ9**7Ñl∙&zYφÉg┴aB÷î┴¥Å╥M█╫╓╒Vµ>╜+±&╤╜╕▐)_dM    E}≡$áε g₧8!
  2887.  
  2888. α@#999╖£&è¿Å!!ä8ΣÄ»╧≥╓╠╞╙ÿ╠s¡▓╓zgMƒ─VôP"k@{
  2889. ⌡êPc"ápRy▒δ4⌡₧V¡≈ºƒ⌠─Æ4_}o┘╡l&½═ÇNAü╙}½ñxô⌡GJvú    ⌡│3⌡ru» =╘ùâ√═«rÅì█Æx ì²VW▒:JxÄε ═ƒKΦo▀Z╓│=`·╠y┼G!
  2890.  
  2891. α@#=97ªÄ>╡Öì)Ä>µ╤╡î∙█╨╫┐■╚9*²ï╥reIB╫─s╢[@jzSV+µäP`/Jº<Tf¡⌐!!÷₧VΦú┐¢╖▀£uY.a╔»b1º╚╘\L╒Ü}εW╛x╨∙RJ.Σv╤£4÷/┼0=╨Ö┬±╔α~ë₧£ûnO»⌡Sc«ozÄ┴2╙┌[╜(└P╪ mu÷¥8╤Gb╞í▌ÇOu┤½!
  2892.  
  2893. αH.&у_C╙ùì&î>≥∙ε▄!
  2894.  
  2895. αW'9⌐è&,¿─µC╟∩╟°╔∞ù╦▌╗▓╖V@║▓╓~a_▄─?æPV'.HFb≈â\& @▒<Ck▒╕)⌠┘º≈╢É╖╩
  2896. ÆfPb ▄⌐c1║└╧W% â|úJótå╝\J0ε`▀ûJÖG4ë(╓Ç═≈└îzè₧ëè<á⌡W╖b    wâⁿ █╠⌐Bª2░═>d⌡┴8╥KZ┘/┤≡èF!
  2897.  
  2898. αP}Z8=⌐ì7;ö¿ü/ΦUêû╬┬φ└┌╟■≤½₧â⌠bcM▄é1sÖ^H3t^A5O∙Å^Mn#«y^hº╣`⌡╪á▓≈î≥╠üqL@yi╬┤-&ª╠ÇJXÉÜ|½G█∙²\JExεv▀╠XòQq∞2ôù█⌡╔░güæ█ÜzOá■W╖c;ÅΩ>▄┌M⌐Bª2░═>d⌡┴8├V4Ç2┤╤üAf¥»⌡√á«╒bO╝εªPB^UP`rï±"_@D∩╪Ä√`9NN▀ôèW½!
  2899.  
  2900. αP}Z8=⌐ì7;ö¿ü/┼6τ⌡φ▀√┘╦Å■≈╜PF»»╔t}`W▄Ç2Wà2.C,z]x≤ô^XhféDgs▓«    ⌠╪M!!ª╢╗çφ╩@╫{P@zh▀ⁿ`7ú╦┼KÜ╙}½ñxô⌡GJx÷mï╓êJq∞,╓æ╩≡┼Ñwσg÷òÆq
  2901. Γ▒XVΓt~┬²6═╩S≤ ╩▀≥!!t°╙q╠E.╘7┤£ìMx▓¬±²á⌐°u]╗∞╖FB`^Vv&çφ?1K\╠üQâºc3_╧é'╦W¢≥╘¬▓#ë╨∞º≤²½┌ ├w╕&╝qRα┤{εlVΘF¥ÄåÇ╦█çîªCαHpδ+Φ5Σσδ┌R3=w8Θ4ûτ9l₧:╖O╤MGq╞vaüε0▐CeJ╔«·Rq;Y0s╞Ω╦╔A!
  2902.  
  2903. αP3<:▒¢7:╫├σhñ1≥├Ω▐╛╓ƒëè▐îqbïÅ≥%3LS╞à7^₧QCjzSV+ â Xt?óhGx½⌐5ε█Q@«╕Ñ▐π╟^àq]gv▀«X╟ü╔M[╒:║4\è÷kò∩X@tíhÉ▌XÉG4Ñpôü╠√╔αuä ÿê▀<á⌡E¼ uùΓ6╠▐KΦSo┼[▀τ$gα╬v┼/⌐+╣┘├Puí⌐²Ωá)¢┤-«Φ╗    
  2904. %Q\jrÅ⌠)bR╠W·ä≥ -5M ╒ö=╦Yà⌡ÿ÷æ ìôî▌û;╕µ╟╬>CÆsΦ
  2905. .╓╣`╙-R FûäƒèƒAòû─Φ²#«j∩0└ºε▐OhM
  2906. L}°9╙°?aö&▀Z╨XCG#çblêû_è*┌ºó[>;NYj▐₧╙╩W    âΩ]>▓√    ïîÅB₧ 1RR╨Θd5₧y¢ ÿ╞⌐· │╬Åï^ÄQ│ü I╩ σz⌡+╣vt∙½ñ╦╓!
  2907.  
  2908. πE46 ╜ƒ7┤»â æeí▌ß╚√╧▓┐╫░òAJ⌐║╘~3≤è-EÆM+`B;∩æph @²<Ue░δ4≥█¡║╡¢σÅ╫`V.r▀┐h;╕╠╥IüVçpεPªxô·XJUïû╨MÖEq╛@5▌û╞εÇαaìÉùày εσX╢h;ïΓ#╥┌RΓO;═K╙²muα╫}éKhÇ>±╪ûEx≤º÷Ωσ«⌡cY≈ó▀`o/kCu7é ú9EV@╠;─╩╡@}9jB▄ăBƒ■╒╜Σ(ñ╗ÆΣù.╣╫╨╩!
  2909.  
  2910. πQ.1 ╜ƒ7┤¿Ç3ƒ:≤╟éªùò∩╟╖ΣñGF ÷ÇYfAZ╓─*ZÆG%bWVh Äi  ]k^╗╗%╙╨Dë╣╢Æε╒ ä*fi┘┤-6½┌├KAù╙}½ódÇ∩Fx⌡lÜ₧KÖAqÑ9┴▄ü¢ª═ß▀ÿ£i║▒[Má Φå0╤╩Q≤uæ╔ +!!φ▐h╟k`╞0Æ╙ûJ`²├Æù∞¬┤:∙≤╖%V\?"ï&Ω~%9▌▌½»Xa%YI╚Æo╤B▐íæ¼≤;ñ╣Ä╪ö*ⁿú╩├    2Yⁿûf6ï╪RÜd≡F≤δ·τ╢!!≥≈²╥[Σ┤mε╦µ⌠╞C{k#Tÿ^·₧Djƒå^┌1ODl▄ (ü≥7ú<L═ïßQ>^C>▀S₧╙╩m É∩h3º·$⌡ⁿ÷.╖EQDY╟▄-g╤Æ≈▐┐d┼╙ÿ▀óΓ┬Qÿ]╕▐_!
  2911.  
  2912. ΓL">½ü4&¿ñì$å:╬╥╩╘≈─╦▄░⌡ò\L│ßÇyzFR█è9?²6|REj≤┴SE.Jáw~¬¬4║╩JΦ▓»ùΣ█É4Y ab█░-%º▌╚\¥╙e½@┐{Ö°M6σmæ┘òQ4┐5╟ô┴·╔═ß Éë╙i½▒VWΓt~┬²6▌┌V±D=ïLÜⁿ#rφ╞v╓Q.╨0╛╨═U╜╜∩√≥ΦπhY¡Φ╖BqNPKa>üΓpbG_▄╔|α╚[h|V_▀àc╦U╓±▀°²u≡┐î▌Ä~ªδ╞├w    C▒}°
  2913. 4Kφ±o╔c_¼ÉÄçå┌Z█┘╦π ╢Z╫êì⌠²╙`\6F2²¢≥.n╦t¥G╤HLd╧
  2914. ΣÆ4φ≤▒Ω[7zZ}▌┘╫·LâΦj╡÷G¢£æ@π!
  2915.  
  2916. ΓH&    &½é?,┤╜ƒG∩Vú⌡ß▀Θ╥═ò¬·áPª╢┬tAUÆè?_ÆK,.O[nO⌡ÄTc([π{Vdº╣!!ε╫MΦ╕ºè■└^öaLkn╬░trº╟Ç_GçûVsíQ÷iÿ╝CJ
  2917. =ΦrÜ╠4÷+<ú9ô¥┼╢Å«|å╙█╨s¡⌠ún;┴α%█═H⌡H;╔öT₧G ô«déDb┴8ó£ƒ)┌¿⌠ τΦ«=¬σ╛ BbC[t3Ü∞}NW┌W╧₧ÇWifo╒î"ÄTÑΣ╚┤∙Lσ⌐èâ≈T▄▌┌ ├w»o╝ x^±óJ╧`VΘè▓çù╙M╢╫╒ªI± «]α?╨ΓóƒJhH!
  2918.  
  2919. ΓH&    &½é?,┤╜ƒp┼>╥═Γ╬±█ƒ╕╘¢τ`F½√╘svE╞¥2W╫PBjmT^f
  2920. °ò^^c(J▒}Gc¡Ñ`∙╦P¡╣úÆεÅ╫rQmeÜ║b ε▌╚\çÉ|╕Fñ·h┤^A xεb▀¥WôLqα@▄£└≤Çαrå    ▀╪£j
  2921. ╝µEM╢eC5└éY│╡6√)└^▌│1 ô«~╬Ci╙δü├Wq┐¿╕∙σ¡µaH░∩╝,dAFKk3¥└p]
  2922. ë4┬çñWyWU╓äèI    ╪¥╗╤∩dΦ╝┴╩ƒ0░±╚╞
  2923. 9-╗oªO<Yε░n╙-6åo≈Φ·â▐[Éσ└≥┤Z#┐gτs╞δ∙╠    jCZ.╥8₧·(kàïW╙lCs╞at╫╗4╨(^╟«»^7H
  2924. {╪äÆΓ;╔¬!
  2925.  
  2926. ΓH"'Ñî:,╛êé+ë&√╤²▀ô╜╢ù¥■áRQ »╚~3KW╤î;V╫KL/.WZx╢Äg(N»eIo░╕n╕│(m┬▐úçτ╩=ûxGkr╔ⁿ7oε╟╔U!
  2927.  
  2928. ΓK$4+╖è!!D╨└╬ ï,÷╤²î ùâ╓▒■⌐V@½▓╧u-Y╘─?^¢P"kPd ·ÇJc5δ\g▓ñ. ╨V@º╡╜¢⌠█W╫}P@zh▀ⁿ7¡╠╔OMçX╤{├)▀Câ≡W=φa£╩màRqç    2╫╚â┬τë]¼2╝┤░P.¥┬!
  2929.  
  2930. ΓK)    !!9¬¢!!╡ªÇG∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3\^╫─bbÿPH    aU@°ò}o%[¬s]k░▓~║▌M╝╢╛É■┴^ûxR@mo╘»y3á▌╙Éåp╝Bótƒ∩"cQσaÖ╫WÖF4Ñ|╟Ü╞╢▐Ñpìë₧ü0OíπJ½lJrä»=╤╤Z⌐─ZÜⁿ"m╣╬kéEk╬:ú▌ùAp≤º■╛ΘΦ≡oY¬ε⌡BdJGg6ùJµ9b[ïzº|α╚E-,LC╓┴-éTƒ■╓°α Ä╙â─ö:╝φ╬IòXw║< zL÷░g╘~kπ    ÆúÜÇ█Aò╤ïï(¥9┤oΦ=┬º÷╨h`CF@;┼%å≥w%¬Y⌡'╢NMo╞:=═∙<φ,R╧Γ∙V=/OW╝s╖┬╓K
  2931. └ΩO║∩]å╒ûAΩ>-UQ∙π!!;╤kÆ⌡▌└╕┐╥╣┼ÿ▀^ÆL│¡KB+É¥Çæj»kh≥░╖≤°q²≤╖ç X!
  2932.  
  2933. ΓK)    !!9¬¢!!╡ªÇî1σ▌ß╦ô╜╢ùÄα¼EB½╛Ç63iX┴ô;@╫^Jj2z@x⌡êMo)A²<Db½¿(║╫Q@╝┐▓▐÷╠ ûxgn▐╡c5ε╧╧KüûVg½@│tåε\IUï£╤WÅVuó/ôé╠∙└αgÇ ï█És║≡^J▒  wÄ»0╤╤L≤@!!╪LÜ^÷#t⌠┬j├Vg╧1óò├@q╡º÷√ΣFí· H▒σ▀`kwCVo$ï¡W\G╠ìâ¡d:X╥ä=Ä à░▀╖╝qδ╡ììÿ;╢Γ▄╩E#╣<²q∞╛)├bU ƒÅç¥æ
  2934. ÷╝¿î+ΦR2│eσ:╦α╕├w,L    G.σ6¥π>U₧;ô`▐D9█ (Ä⌠;≡$R▄▒▀X>6ds╙Z╫┴≈M
  2935. └ΓR.φ┐rîÉôA₧)6EMé∙7&0üxÄ╞æÆc╞╙ÿ▀óé═kÄMÑ▐mcτ»ΓyóC─ o▌┐╝▌└e1¼ë)½Ä░W¬Ω∩(ìTcê▀;²M£▄yß═╘WàòT╖9ÉÖ¿╬% ±¥;╓ÄY#∞ñ}dú≥∞┘Ç ±%╔╗■Qí⌐ⁿCÆΓògEΓånH√+8╝₧fM∙4Hε┴ƒ∙╘H╔<¡≥áÄ«╤E_╓jOƒR≥δ≡Hµ╡═⌐°E#k¢RH"₧¬à(╗g┘╚Q8f╦Ωì^▒τµ╧
  2936. HÅ9╙░║╧,▄xpk∩╡πj6å[?'
  2937. ⌡ Γiè«Ö$*╔╚╗▒fóπ─╢`Q ûz ≥Dw¼QtQ╓%²║öyG:╣F≥uß╟Wsπ≥÷¿╓LcA)E≥à╪╝
  2938. ñ╣}┴ πªe╧ó╜JªQK]∙∩╗²ÿ½▀\─⌠=■",≈ë}c°ò╣°P░àSJ▐ìs└·4πåáJ╫tσ;£<-─├P:ud╖≡ⁿ╡α*»O^3eóëT╠┘╒:ɼI!
  2939.  
  2940. ΓK)    !!9¬¢!!╡ªÇä2Σ╣àÑ╝÷╤╞⌐≈╖W╖╛ÇurESÆï8âWAj2k\d╒ÄJr'A╖owcí┐)⌡╨C▒Θ≈ù∙█^Ç|Wf █░ar»┼╠% £5║K│=ô≥B[6⌡w▀▀Wÿqó1╓Ç┬Γ╔ñ3£Å₧╙jóΣRWΓd}ïß6┌ƒVΘ;─V╔Vτ4qⁿçt╦@|┴-¿£éVq≤║≈╛Γ┼₧    L╡ß▒+|&<üú1b[└ì₧«Wh|B@╚ä.ÅCN╓±▀½δd÷·ò┼ƒ~╗Γ─ Å?
  2941. C½sΘpε╕b┼aB¼¢┴å¥┌L÷╝¼∩D┤8┐+±<╩δ╕╚TlL3⌠%Æπ(a▀v≥$▓r(|`ënsÖ·;≈S╟«┴V<?
  2942. m°╥Æ┤.oΘΩZ ╢≤ZÜ╧▀|▌#6CT╠Σ732₧`╣·╒╫3┴╨ÿ▀┬ì Më]·─~8αé¥ï6└qÆ«ó╦àe,╫ë)½Ä░Dí ≥1═-^dε├∙É≥ü╖⌐M╩ÆAù*
  2943. ┘Θ£╤;╘░╩c╓öO
  2944. τ⌠e)»╔ûª p8-┘?'╞≈─F3╔┴≥d¥δÖOP¡╤iHá>&┐Æ4╔4Jδ╨╗∩╔HÜ|₧!
  2945.  
  2946. ΓK)    !!9¬¢!!╡ªÇä2ΣÄ»┼·╥╤┴╖⌠¼VQ╥╤⌐9@MBÆÉ6W╫w3cY\gQ╢ÅTcf@Ñ<Gbºδ|╩╤M ï╕╣ìπ╬
  2947. äPWzi╒▓l ╖ùÇPFü╙}º@╛=æ≡N4í    ⌡╖VÜ`ñ|╨¥═σ╪í}£▀Ü¥xO½ BIºr oçδs╩╞OΓ9═S╧αmeⁿ┴q╠GjÇ6┐£ùL}áε∞τ≡Φ°i^½ßáBdTPKr=╬µzZ_\╚╚─ßme5P █é,ÄIÖΓæ▒∩!!⌠¿Ä█ô:░τë└E#ⁿh⌠
  2948. 4[τ╖h╒aO¼ƒîû╬╪Mò╙╫τV²>·xΓ;└Ω²▓p/!! Ze4≤Æ·(;▓;æ]╦OVp╧ cî⌡ußeN═▓πV2?NYq╪Z▀▄ÖMô≈]$┤·    îàÜD╫*1S├π-s╙²û▓╗ú┤Γó╩à▀L¼W»êkW)Ñ╥╒Nï#⌐gh ≥╕╣╦╫q²!
  2949.  
  2950. ΓQ4:5ìü&,¿»ì)Ç,î╛åÄ▀┘╠┬╗ασRπ╕╧wMU╞ì1\╔K,.Z_gOΓëe3\╖s^*½Ñ4 ╠D½▓ñ▐■┴\
  2951. ƒqkc▀╡{7╝ç¡3!!íûpεBñx╨ΦSCI7∩hå₧PÆVq╛=╨ù╨╕Ä═σg÷ÑÇy¿▒DA«e    o╢÷#█╠ºzu╪╞Vτmuα╫}╔K`─∞ü├p_ÜÇ▄┴╔(£╤Rzÿ├ùJkBK]&╬≡3%pC╟┘,╖!
  2952.  
  2953. σA!! 4░¿7'┐╗ì>î0∩≥π═∙─▓┐╫░ä]P¿╛╥;rE╫É~]æ@/hZFg╢á&m6Jäy]o░¬4≤╤L&ñ╢░ì╖█^ö{P|o╓ⁿn=¬╠Ç^M¢üaºL╕=Ææ;&0Σ$ì█ZÖKb⌐r╛°¬╘╒αwì ₧ăhO║ΣEJΓo }┬┬6╩╫Pπq=├K╒ⁿ!!!!■┬v╟Po╘6╛╥╧uáε∩√á⌐µePáá╝aA&;â∩=tADñ}ñä╡\:BO▀Æc╦S╓∙┬°±tτ▓┴└ò,░ú╟▌6R│<÷gKó▓h╠a°¢î▌╠▓"÷╝¼╪!
  2954.  
  2955. σA!!;=éÜ<*«áâ$▒>π╪Ω▀ô╜╢ùƒⁿ╢DF¡√╫sv\^╫û~ôZB#`^u~⌡òVhfBªh[eª╕`φ╫N Φ╡▓▐≤╩ÖqZ@gnÜ¿e7ε╩╠X[åÇVz¿█∙≡]*╠$û╨MÖPr¡9└╥─≤┬Ñaë܃╙zíⁿP¬eJiç∞6╫╔Z⌡o°W▀÷m`δ┬8╨G╒6ú┘ç}╡ε∞÷σFí·tY½µ│    ,<urÜú51F]┘╚Å»Mh8N├┴ äV₧∙▀°≤oñëî╠û2íΓ┼Å
  2956. 5¿o╝G}τ )ΣbWⁿùÅ╙ç╠Ü╒╤∩L≤R1⌐+αsµ╚╒▓p/zJ_8π~▌╖mö-▀O═LlÆ rêΩ Ω Xê½Θ%2OYw╪█└▀EàúU9≈≡Gôî▀B╚)*U╟⌠d2â,ö·╘▐ó╜▒╣▐ƒïKô═ε,S<┤ù¥╩&φAI5╗▒▓─└<eä╘n╩Γ¥>xÜΩ■%àw2é┴ΦIû∩Ǫ║G╩òHÄ9 ┘Θë╬─■ô*ƒêD2α╢a!
  2957.  
  2958. σA!!;=éÜ<*«áâ$▒>π╪Ω▀ñù▐≈▒²⌐VB▒╓¬1{S╞─)ZÆKL/|o
  2959. ≡ê\@3AáhZe¼δ- ╩J¼ñ≈ë■├^òqkf╙▓h6ε└╬\¥╙y»PÑxâA≤WdRêeô╥┐mY∞    2╟ù╤≡═úv¢Mÿ₧¥y»σR@ΓftÅ»'╓┌⌡D,╔V╠ßc!!═╧}╤G.┴-┤£æAeªºΩ√ΣFí≥ H▒σ≥ qCGg1ïgë~9bD╞W╧╩¿T}0FA▀Å;Ä^BöΘæ£≤m⌠▓ê├┌1╗ú·╬    ;╖<≤~ZßÑzÇ%Ró╨┴╖ü╙Xô▀╦ªKτR1╣Φ=┬º∙╠ZG)l)dP¢^Ç≥?sö&╓ƒ,IGz╞arê╗;∞eN═│·^#?NYw╨Z╩┌▄Ä≈Y8▒■JÜ╒ûT₧#6\YQ╟µ!!}äÆ ÿ╘╛·≥╖╟ç┬Q¢»æQ0»╥Γyó/╡vc
  2960. ⌡┐╝ĵ\╫ò.¡ì≤@Ω╗ûCε*$ï╒U√EùΣ%ì│┤[ä╜Kó? Z├ß┤─%╫░ù;ÿéX⌡╜jª⌡▀╪╒PW┴`kε╕σ_2╚╘≈EÆ╥¥kNº£ ⁿtt╗ⁿ{Gµ>E÷ä┤ε╔!
  2961.  
  2962. σA!!;=ëè&!!╡¡╝8è+ε╫α└φ║╡╝ⁿ╙½@T║⌐Çl{MB┌ü,╦rA>fTW[∙òZi*░<Dc«º`°█¡▒╛É≥╦\ÿfbl܃Bε└╬MMçÆp╜.▄ù≥T],Σ`▀╪KôO4╕9ôÇ╞⌡╔⌐eì╤┘■b─ÿiWºl ;àΩ=█═^≤H ┬y╓⌠>!!°╦t∩C}╦e±°åB}╜½╚∞∩º≈oP!
  2963.  
  2964. σA!!;=ëè&!!╡¡╝8è+ε╫α└φìƒ╘£²¬_F╛╡¡
  2965. e╫É~EƒZP"kI7"≤òVb]¼h\i¡º~Θ₧U    ñ╗≈£≥Åæ}Pj ▄│r»┼╠k║;╙{║Fñ{æ∙B"cQµaæ█K¥Vq¿@:┴¥╬╢╪¿v╚Üÿûu½π╧
  2966. gδⁿ6╥┘αD!!╔M█·"o▀╦y┼Q4Çwó┘ÅB4┤½÷√≥╝²oRƒ∞│%KTmh╬.µ9J`█┘ë«U-/FXÇ┴.⌐UÜ⌡╨╢╡!
  2967.  
  2968. σM4
  2969. 4,ºç3+╢¼Ñ$æ:≤╥ε╧√─▓┐╫░ä]P¿╛╥;r
  2970. ╤ï2^Æ\P#aU+≡┴Ujf[½yc¼┐%Φ╪C¡ñ≈ù∙ÅÆ4Lme╙¬h εñ¬0_¥É5¡B╕=Æ╝]N=ífÉ╦Wÿ<ÑN9¥╥╫■╔╣3üÅùûq
  2971. áσmåikâ√0╓ûÑ,Eí5│(α(m çq╠Vk╥9░▀åW4á½⌠√π≥┤[╝ß▒ByP
  2972. e:╬≡39b_Q▌┼ê¡\P!
  2973.  
  2974. σM4
  2975. 4,ºç'╢░Ñ$æ:≤╥ε╧√─▓┐╫▒íVS¡╛├zgMR£ΘT;⌐LA&hWbµêMc4IóVy!
  2976.  
  2977. σM4
  2978. <6░è /╗¬ë9ΦUêû╬┬φ└┌╟■≤σ@░╖╠~p\_▌è`ÿY+bW≤┴Wr#]Ñ}Po▒δ)⌠₧V¡≈Ñ¢⌠╩Æfm    ═┤d1ªë├XF╒¥lεA│=£ΦT 7⌠j¢₧ò qΓ@2▄£Ä≥┘í╚$╗ÆÇl║≥_α`Φå═┌Sß<╔S▀τxΘ┬S╦LjÜà≈¬jPîè╤═╨'£╫H!
  2979.  
  2980. σM4
  2981. 99╜á<s·¿┐>ù:α┘éªùò■┼«≈½W½│┼;aMU╫ì(WàP%.Z`≤Ço(ó<Ue░ª!!ε₧V⌐ú≈ƒ╖┌à4I{l▐ⁿz3á▌ÇMG╒û7├)█∙╧E] 9∞$æ█Aêra╕!!0▀╚âσ╔¼u╚
  2982. ôöæ}Ç≡ZA╧
  2983. g!
  2984.  
  2985. σK$8=¬¢3=│ªéG∩Vú⌡ß▀Θ╥═ò┐ⁿσbçÅ┘kvd_╨á1QéRA$zZGb°▀^Zi([óu]c¼¼`ε╓G@¼╕┤ï·╩
  2986. û`W` ▄│r║┴┼D£üg╖█∙2∙TJ<εgè╙\ÆVu╕    3▌│╫¼îª|ÜMÆöüyO¬⌠CE½l5∩àZ≈╥OδD"╔Q╬τ$n≈çV═VkÜô┘ÇEaá½╕ΘσF⌐≡jI¬⌠≥%    g!!ïú>uFS╠ìà│^1B@╓ò.çQBò ▄¿²uφ╕ê┴ô*¼Äú`╞ wH ┐i±
  2987. zKπÑ`╧cz°\▐ò¢ïƒLö╒╨δG·1«bε=àß≈═ZRaJFE4≤%Æσ4%ÿ'▀\┌ SKfÉed═∞<≈eU╞ªΩOqj
  2988. t┐▀╞╤A└≈T+╣┐╬╒₧T₧?(UC─∙!!}ÿb╫∩╨╫N¿╡≥ú╞Ä┼K¥L⌐ïKf═°Γyóûqc²■┤┴╞*|Æö8ª£∙[àφíi╙}08▌ô=╬e¬╘╕é»Fàë*╔Qvî≤τ¼C╕Ö∙╠éRF²⌠bM├¥ÉΩ¡-HT╧"┬ô╠I)╞┼≡^¥≥òfLΓ╥6íC^╙╖!!Σ:I²₧·µ╤T▀4»█æîñår,5░gS¢P÷δ╘UΣ£ûΣ«hDèHG!!ÆÉçpI~─ ≡¿+j¢äΦ9╠δ°/ç_Ä╨░║╧█}ni∩╖ß<p═W#;¼F⌠j╝│ä22╬√!
  2989.  
  2990. σK$8=¬¢3=│ªé æeí▌ß╚√╧▓┐╫░òAJ⌐║╘~3≤è-EÆM+.]n╢▌?aR?_ªPZh░¬2π·M╜║▓Éπ╬ÿz@mo╘¿l;á└╬^üûVqí@úpòΦP[7∩$≥┤0ÜMf∞4╓╥╫∩▄Ñ3üÖö▌<¬⌠YP½f~å»1╟ƒK∩DoÉV╘÷*dδÖ4éK`─:⌐É├Mz≤║≡√á¡≈eU»σáDB,<?n7╬Γ7t_╧W─Ä¿Zh/E╔┴┼^éΘ┴╜╝hΩ╝ÄìÖ1áφ▌WâE  ⁿ,╝zL⌡┤{╔c\¼æéÇπ╡!!¥┘╫ªVⁿp╢bπ!!─⌡߃RzJ
  2991. Oq▒6¥≤m4▀z├Z╞Djêfoƒ╗6∞+HûΓΘX#z^{û╟┬▄ÄσSj▓≤LÆÉæS═l7V╩⌡d8Æi₧φ▌└@┴╨ÿé├ÄïZÉ]¡üKB7α¥ëS▀"¿"b°½╜╦╦+pâô#⌐╚±FÑα╗(æE<wé└∙CìΦ!!ë½ñτ±.╩u_ï¼τ╧(▄⌡╨1É╟^Σ⌠t!!⌐²▐┬ÉM▐?&Ç ┬
  2992. ▀╥≈D¢»╥(╦╡~Hⁿ&1·ÖpGΘ.I²╩«α╔R╥;Σ╡úò│╘A▀kèTπ╕╙WΘÆ╩¡▓h@£Vfú¼ï{Kεvæ─j¢╟⌠#╩τε<¥_┌t.¡╤╓µ>·]>'∩╜ñGr.├W#;êo∙m¼ß┐22╪弡L┐σ╚½/v.─bX∩JyáTZ1Wƒ<≡ºÆ>9╣O¼}ü¿7eΓ╛∙ⁿ╒"@ga∙eöƒ╕Θ¡P⌐kä∩,╒¡÷g╩-.W╝≥¿X≡ò⌐±U╧╢⌠g,)╝£rcΓ²º╝_╖Äôò╜âLâï¿^«u┼ 8B₧5┼├fN7╕²µ╛ºk¬
  2993. oO-√╒F·⌡╔,û░[-:Q¡;╙v╒ä¬*¬,\N. ²µ°±{[ú«}:Θ╒└7«B┼τ╗H▌11=ö≡:±B∞¢Q▀¡zó≈Srcy/»ⁿí$║  ╥ù╕üM╨Rßµb╣É└tß{╫╤│±úTôÑö⌠ë Θu¿╖ôπF╧φWπBW4ñK"gH╕6╩D^┬sxíu">╝╣É>o╕╠┴~íL>í åΣ╖8Ñ!!SJ.béε╫!
  2994.  
  2995. σK$8=¬¢3=│ªé æeí▌ß╚√╧ƒ▄╕╙º@F▒»Ü;vPU╫ö*[ÿQl+`__n¢δwV4F╡}GoΓµ`█╨Q¡Ñ≈ƒ╖ÅÇ4!!VT├¼hº╦╥XZî2£`úF╕iæ⌡^AWxΓkæ╩XòL}ó|╟Ü╞╢╚»p¥Üòç}º■Y╧
  2996. c}ì²s╩╫ZºU6▄Zܲ+n╖çq╞G`╘6╖╒å@4▒╖╕ΩΦΦ¿iR¡σ╡;
  2997. h6ï»W9D┴ìÅó\d*F^ö┴Bß36₧⌡欲oπ┐┴┬£~╝φ═╠$Kⁿ,▓A(K√ílÇdUΩ    ▐飢╤\┼Üà±KαpΩ+α=╓≡²═HnF>ΓZ∙₧+jâtïF┌XMKaöarö╗<≈ P╬ε»V?>
  2998. H0ÿF╩╦╔AFëφZ%Ñ┐JÉÇæSÇl>_RQ╓°!!C)ê|Æ╗╤▄ú·⌠║╬å╬QêKαïC0¿ù╧╬)¿kpΘ≡▌ñ¼ yÆ┌)½ì²Q░Ω╗&àd?╟╫ UöΣ9ÿª⌐]àòó*ÜΘª╙,¥░é;àùO⌡╜a(│«╡íⁿp▐2.Ç╣┬G9ï╧°
  2999. êεÖ)Q▓┘0ε'1╛₧}\∩6░┼·╥╔I╘;ñ╝▐∞╦┤v ═l ┘XΘ√╒JΣÅ═░╣&B¬OT/Öú┬nS║j£üQj éüε2▄«Θ/╪òMf░╩ô»₧evjª│ßJlwÖZ(tDUà) jñßâ?;ê∩ïÄπΘ╓ nQ═-&û,ΣZ<Vƒⁿ┐è>>▓KYñl_íè~a⌡φ δ┘No0Aπy╤î╡ α≡-╞Σñe─í│.╪=~b²φ²p≥ꬠU┘┐SrcÿNnoΦÇ&ñ└    «╝H½âH▌¥Kè╫Pïê¬WV┼_n∙-}*û<F╚Å'v-èατ▓Θmφ*aⁿΦoÄ▌▐*æ¡J[%uOúi█Ag¥ÇΣ_ £ w; ÿ√ Ω)σδ!!<C«┘ê7êO╞ó╪&▒=~tô╕0ñeê┐ù║w╝░ z<╕·─K┴Xα¥É┤├r±9ñⁿu║Æ└qßgT╪╨¿ΩÑB╧º{±è≡k╒j¿√┴⌡F▐╕YΘBG<ñKOJ+█Xª@^╔fM
  3000. £q!!/■æçf√·╟~ºPε╖├º:▒XM4cƒΓ¬à √ε%G«Cä`╫L$Mç@3╙╣1ù?»╥0ó╗Ñih▒┤VσÅjî hk÷,äí¿,,┌5░!!²δ█    ┬-┼e┤╓3vV5√µ8Φ╓Θ8╥ⁿc;δ8φ─ï.≤░╟rh╧ƒ╕╛╧vúù│X┬Θ≥ûbl⌠SPïrô╪ì0ôë╙jS≤▐"╫│╖óß.éû<φ┬G╔▄├Ω╘ Q==ÿ@⌠ZMë»╦┴U¢¬T├ê,w≤╔O1∙Σ┴±πâ²æh─0ûGuû&ru ┬q╜╢╪╛L∩eâ3ô▒+mb_¼Å┤≥#"ßτ╣'╣▌Ñz▒╕╪2│`%£╜9.î.çTæ}╓~┐°8b√[ùÿû─╓â⌠5t╪"1╩ïê¬"úºc║à╢%┘
  3001. ¿╥Iì▐>O√ƒ╪╫  °┬╟▐%╔ßweñ"├É⌡ho╟'Tu99I√+N╗╤<Σó4┐bÑ╕╒π}3u╠y¢X¡░á█≤ªëaa╘░▓*╚╝\-┐)3æùG╟▀╨Z∙£∞UKy²Θ└p╓■ªª9-åel┘G│öXΓ«╖≈¿±Puá╞fÿ╛ é┤Θ┼╠8ªgö▄╡òjΩz╨╕▄\åjδó┬)M'ñà-¢▀▓¥σ oÉ─= J╟éß,Ä√∙▌ª_░ú┬.g    Mh]    )│╤pò°:₧,£│\ ï«⌡¼Φφ╬╪dπûö¼aτ·æe┬╛q<;Cîù|⌡è⌐╨╒╖ε²╨╧3ic*f!!GóL╙≤▓≤I ì<∞ä'â┤╖
  3002. äk╘:>╛▄NÖíúFZ≥ùE¥ZpäSVQo*Ö╔H▌ü5╙!!¢°╗K⌐▀╒|ä≤¢╢Ω╢┌l·{╩ 'S╓ƒ╞8 :═╙╚GΓΣ┴▌≡z≤░░}êHΓφw?à
  3003. ,╤:Há4m≤7$G≤^ÄⁿU¬Fï┌#9░lφ"£±Q·≡WΓA╧╙╝¢#o7:X└░BÉ╫îτΦ─[²    mÇ·`    ┌1é «╬εc»═∙ï┘╒▄ÿk*╒²ΘÑI╪┬ö╤╣H!!░_8φ█ yûz─0íYΦhu╩8$~i"r!!j┤:æ ÆO⌐╣ Bçµ3>ß2ì≥Ü┐:%G ╗|eÆòαö░╢`5ì(}c*▌ +¡iñΩÖ½@╚Jà░\╓╞╫ëë▄Rg┐ma∩8R3¡╜9[â╦ │N≤┤'$D2⌡$wïA┤Φ╣y∞▌[─╔Γg=╩x▀ ┼!
  3004.  
  3005. σQ&6░è /╗¬ë9ΦUêû╬┬φ└┌╟■≤σ@░╖╠~p\_▌è`ÿY+bW≤┴Pu6N╖[*½Ñ4 ╠D½▓ñ▐■┴\
  3006. ƒqkc▀╡{7╝ë¡3!!éÜ}ε@╖s╨∙J*φ}▀▄VëLp∞H5¥ùì╢┼«gìÖÜÉyε⌡RV½v┬Θ!!╤╥╬e&▀O█≡%(╖à¿/⌐ó┘ÅB4á½⌠√π£φpY¬║≥1XqIKrrç╟1}r!
  3007.  
  3008. ΣJ2&U╬µp┤║¢/ùαö│╧±█╙╨╜µ¼\Mß√╧}3IZ▐─*ZÆA${VVyΓär?_ª<>╦ª%≈▄G╗≈╕ÿ╖█╫f[ki╠╣|∞ñ¬4"ⁿ(Çy¿Ñx£ E{(ΣOû╨]╞@ç)≈¡µ╪∙ì!
  3009.  
  3010. ΣJ1'7¬é7'«─µC╟∩╟°╔∞ù╦▌╗▓½RN║¿╨zpM█è*]╫HL#mSl∙âU!!5▒yCxº╕%⌠╩K»≈úû≥ÅöqWkr¥»-&╖┘┼JöûY}»U│=Æ∙_=∩aì▀MÖF:εmV╛°¬╚▀ÑÄM£ùÆoε⌠YR½ruÅΩ=╩!
  3011.  
  3012. τM)ox⌐è?+┐╗ó+ê:í╫α┘≡├àò░τ¿gLÖ▓╬"?Éó7\ôQ:.O\+■ä^o([ª{Vxⁿδ!!Φ┘W¡╣ú╥╖┴    ú{x    `dûⁿ`7ú╦┼K£╙[+εjédÇ╒_Ix±eû╠J▄D{╛@(█ù«£Ñ│cìû¥Üy ε VIº u┬√;█ƒMΓB*┼I▀╜o ô¬½^.╥8£┘Ämp≤╛Φ╩╔«√ L║╞╜ a\`=¥Jδpm":á╩<żpi|Ü▓ ╝u0▓╤├¬²xñ┤ä┌└~╗÷─=└#>M╤òdk╦┐o╧-▒F║╢╝╝√ië── ·'α+∩&╚╙≈∙HmF$Wÿ'É╤"pƒ0▀éXeuL┤DBö∩0≡J#N╟»╞Y%?MlîZ╨╟╘p    ªΩR.∙Æ#÷¥ìäqxCE─░4
  3013.     ê|Æ╫╤╨N┴╨ÿ▀φé┼[▓Y¡ü)уì┘¼ocX·¡à└╠<~ôƒ│Ü∙ZΣöæ@ΩLX6Åσ≡┘▒wσ╬╘=╚ùB╖x É╜ó╠i╥ ¥.âôOFΘ╡ld╝⌡╘▐É[<.úS;╨âΩD:─Ü╛Zî╥╡gD¡╡Za¬/&╜₧`Q·>÷╦«í╘V═9¬÷Öò¡─_ES▄vZ£Pπ║¡-âë╦ë╗MX┘IA Æ⌐½lfxz╟rÜτMa ╤╟≈4■ß⌡5┘Q ┐g╖▀▄╡Wä,>|π╖Γh.ÜKsK^▄5Φw║∩·]W÷Ä■ΓVñ║É»lyæmO╝DiÇ[Z1T┌9░≤Öq =╣\Hµ8$╥º~|ªΓ░°∞sdAgIΣb₧¢²«σ2âÇ╚¿╡·σ6u-ª╛²p╚à┐²y┼≡_⌠0 ⌡ånc░¢hp▐òI╖╢:O▌¢ÅâJïåºMïj┼3£pEüèC):╨⌡µ¿ΦiΣ=┴╘C└╓╘~ò½L    )fO┬u▐:\f╪ÖñrN╟@W +5²Φ■÷>F▒┤/ ²├üt▄L╞√F▀1ç$3xú╫₧s┬╡├≥6ó╛$Ep&S3┐╒τL┬%å╘è╛├êRφ·v╣æ└v·/T▀╓⌐±«╦µg뜭╜─≤╘╩L┴╤^ªMWoEñGN_ .O░=≥!
  3014.  
  3015. τV"XR══,╢¼ì9Ç⌡▄Ωî∞╥▄╨╖ΣáA¼√╘bcM▐ì<@ûM]j~TZe≤ôP L"╔Ccû▓0 ≥KΦ╛ñ░■├\æR_ }eÇⁿV_─á⌐IAíâYºA÷{é∙"cQêtûΩ@îGXÑ|ë╧â°┼¼Nσg!
  3016.  
  3017. µA)'9░è&┤║ÿ+ï+≥²ß╪±τ╨┌▓¿σQJ▒┐╔ut%<╗╞@₧IE>k+(≤ÅKg2Jπh[oΓ╣%∙█K¡Ñ≡ì╖╠ä`_zsÜ╡c&íë╘QM╒Júzó`╣sâ²_[Φgï╫VÆCf╡^pôé╠∙└ε1σg≥±·`O╛■XHîa~┬ <╤╙√,EÑO╒ `⌠┬8ÿ.┬6┐╪èJs≤Ѳτ«k┬¥pS╢∞≥P_%D\b;Çú1}ZUçzºxÖñUk|FB╧î<╦^╠░ΩΓ∙!!°·äì¥;╗µ██HC¼s≤Z^∩┤)╞aZδ─┴├│æ%±┐√÷M√!
  3018.  
  3019. µA)'9░è&┤║ÿ+ï+≥Σα├≥║╡╝ⁿ╒á]F¡║╘~3IX╓─?\äHA8.Z7?∙Äzi(\╖}]~▒Å)∙╩Kª╢Ñç⌐ÅÖ`_    `i╘╗-3ó┼ÇVN╒¢5½Múpò²EJx⌡}Å█èCx╣/╛°¬≥╔ªzå¢█ÜrO║∙^WΓtkç»?╫▌MµS6é≤│9iⁿç|╦Az╔0┐▌æ]4▓óΩ√ß▒┤eD░≤ªN%R]hrç≡W3~AD╠┘╩áKh|QI═ô&ƒNÿ░Ö╣≥xë╨Φ╚é7ª≈└╚E< N¬}≡q≥░`╥~ßç┴üï╥IÆ╪à∩D┤8┐+Ω6▄⌠╕█g@    >²6Ç d+╙Y⌡#╡q]aÅndä⌡2ú*S─Γ≤:[SHp╥╨╒Ö[└≡Y&▒┐JÉ¢îS▀",Cp═ⁿ
  3020. 3òeÖⁿû┐d┼üß╣─çï┴óìKR-«ò╧╪ñn&²ÿ▒┬╓:+╫í?óä÷í≈■;éTuë└²Nì≥é│▓dàöK∙x    ì¡«╧.∞═²T εE╗⌠ t!!╕⌡╠┬ÜpF┼(?┼│âN3æÇ┼ÖªÇ)GΓ╚<<·/7┐π:%ÇRW²╚╝í╧^╬0╖╗²δ╚πIS╒    d!
  3021.  
  3022. µA)'9░è ⌐╣ì>å7╓╞ε▄ε╥═Å■÷¼@Sæ║═~"?Éú;\ÆME>kR+≤û^Js$L»}@yΓñ&║≈f    ╗º╢è⌠╟\    ƒ}].w╚╜}!!ε▌╚\à£p╝W┐xâA²_KI5Σpù╤]Å/┼:ôå╦≤îñz¢ûòçy¿≡TAΓn vçδs▄╞≤I*î╚≥)`√╦}±V|╔1╢é╧p║╜Φ╫ε¡µf]║σ£ `f _Σc▌5}I╬├ÿáMhJ_╩Ç;êR5ä±┴¿∙s╛·à─ë.¢Γ─ Å 6Yⁿo∙r≥úl╞dCáFÜêÇ₧±Iû╙àαN⌡#α+≥6╔ß╕╪Hl]]4■9╡√,bé!
  3023.  
  3024. µA)'9░è ⌐╣ì>å7╓╞ε▄ε╥═Å■÷¼@Sæ║═~3FW▀üdöSE9}uRf
  3025. ╢çXa5πz_kÑ╕MÉ╖'¡╣▓î÷█^û4Py ╔⌐o1ó╚╙JÜ╙?QºPª|ä⌠F=∩pû╪PÖF4«|╟Ü╞╢É▓vë    ₧Öƒy<║π^JÑ>F;üπ2═╠qµL*Ç2░│:i≡─péU|┴/ó£ùLq≤╛Ω±≡║αiY¬á│%KPn=èú61[X╠W╔Ö▒Pc(F^▄Ç,Ä ù²╘╝╝c²·ò┼ƒ~Θ±╠╦50¿n⌡s«▄Ç_σÄ¿¥Ü┌Z¥╫╞πl⌡5·b∩s╤∩²ƒCjJ_8πpÇ╖9|ü1▀B╓SCqƒ."αæXëc9▄╗ R4L_╪╥╦├A└ 1@▐δPÅÉ╢I╪#^A█Ω!!}╦1╫Φ▌▐∞╛°Ñ█é┼KÖJªàFS7αûè╬)╣8&#í║≡╥à;1Ö¢!!ó╚¡¡ΩδéMu
  3026. CΩ╣|┬TDZ2Ñ⌐╗[½òF»!!æΘá─'╘Γæ*ôªY\í╖e7╣┌┘╞ÉYWH╦=8Ü≈┼F=╠╙!
  3027.  
  3028. µA)'9░è'«¼₧,ä<Σπ²═ε╟┌╟Σ▓½RN║╓¬1oS▄ü,SâZ+.UV|OσöZj'\░<\lΓé⌠╒L┐╣≈ë ╞╫cL~sÜ¿e7ε─┼M@ÜÇ{╟L░=ä    ∙L+⌡kÆ₧PÆVq╛=╨ùâ°═¡vîM¥é╙h½▒ VºazÇπ6φ╦MεO(ÆÜ≥ d╖à¿/⌐ó┘ÅB4┤½÷√≥╝±IR¡σá fCbg"₧±MpN]╠W├çñ-/F@▄┴?Ö_ƒΦ¥°≥`Θ┐┴╦û?▓≡ôI▄;R╣r∙uKδ╛gµaZδ!
  3029.  
  3030. µA)'9░è'«¼₧,ä<Σπ²═ε╟┌╟Σ▓¼Um╛╢┼;}I[╫▐~Q¢^W9@Z^nO≡ì^u|ÑpRm▒╞Jô£eª▓уπ╩\╫z[.s╧╛n>»┌╙GôV║#{ÑM╣j₧A⌡UJ,Φbû█]▄@m∞4╓╥ƒΣ╔íwëô₧áhº Pε     wâⁿ ≡▐RΓBª6Ü√$b±ço╨C~╙Ñ╘ådííΦ√≥í±s╕ε╢J`R]b!!╬σW$yJ═▐â»Mh.EM┘äoà[ô⌠æ║σ!!≡▓äì╞,░Γ══    28╡r√Q82ê±╔kuφ ¢┴Üǃ\ô╙à⌠G≈9¼n≤t╓º∞╞
  3031. C)CK/≡%è╣o√Y⌡'├XU[sâInï⌠φ )E╥º²-W pj╧
  3032. █√╫B    íφ]&«σLì╒┼₧?=\FQ╦■0/ùmö■╦Æ
  3033. ⌐«⌠╡▀╤ïd╞\αÿRd«ôéïwφk`6·│╡≤ïR■ñ8╛ÿ⌡}ó÷┌'éLi-òô∙N£≤6ÿó£G╨█D»9 ¡¿¬─i╫ⁿæ9à▌
  3034. φ╡w!
  3035.  
  3036. µA)'9░è'«¼₧,ä<Σπ²═ε╟┌╟¡ƒ╧:ÿ╛╬~aIB╫─?äZPja]7,┘¼7Wr#]Ñ}Poⁿδ7Φ▀R¡Ñ≈¥√╬ÆgarÜ┐x!!║╞═I¢■|¬V╖q╨≥EJ>αgÜ═ÿGrÑ9╫╥╩°î┤{ìMì₧Éy╕⌠E
  3037. α`Φå═┌Sß&┬K▀⌡,bⁿ╘L═ek╬:ú▌ùA4╖íó╛█\í┤|░á╡ `TTc│J∞j1`@╠╠â«WL>L^╬ä+╦^╠░ΩΓ∙!!°·äìÄ1ü±╚
  3038. ╩8yfxj■N∙qKóÑfÇnWΘî┴ÆÖ▐Q█╫╦τNφ5¿x¡s╓Φ⌡┌ZAe@H1▒5Ü∙)lƒ3▀C▐@f╞lo₧∩yú0Hêúπ^0)
  3039. q┌█╤═M    ÄúQ+╛±]₧£æT₧!!7CTS»ÜM8¥j╫Θ▌┴ ╕!
  3040.  
  3041. µA)'9░è&»╗Å/¼1⌡╤²╩ ╘┌╞╙ÿ╠b▒¿╫~aA┌ü*ZÆM=|ZC{
  3042. Σ┴Ug5\ªoy¬ñ5÷┌¡≈░¢∙╩âqZ@ho╚ⁿ*!!í▄╥ZM╥V█c½Mó=ô≡]M;Ω-▀╫WêGf¬?╓üì┤í╩Γdí£ûr
  3043. ╝≡CM¡n,wâΦ ₧╤P╩@<╟Ü8ⁿn∞╒{╟k`╘:ú┌éGqá!
  3044.  
  3045. µA)'9░è0¬¼Ç#çφ█φ═≥║╡╝ⁿ╙½@T║⌐Çl{MB┌ü,âWAj|^Pnαä q/C»<To¼«2√╩G@⌐≈░Æ°═╫`Q@os╔│n;»▌┼_£¢V|║P│qûA²_KI*ΣbÜ╠\ÆAq∞4╥嫣Ѻç₧ù╙zíⁿCºniâ√6┌ƒH⌡@?▄Z╚V≡!!`Ω╘}╤ .⌠7╕╧├Mg≤ª∙≡ΣΦ≥oN∙φ│ qG\o<ëJΓ1}VJ╠ìÅ╡Md2D_Üê!!╦[oⁿÖ┴╣ jσ╜äìì,┤≤┘┴w
  3046. R│q∞zZ∞Ñ)┴c_¼ì┴üï▄Gû█└ΦF±p│eí>╩⌠∞ƒGzJ£]■¥D[┘'ÜB┘XFGmâraÖ≥:φ,)]╧▒»V=6gm▌@₧ⁿ╓pɵp#╡╢    æÜï!
  3047.  
  3048. µA)'9░è0¬¼Ç#çφ█φ═≥ìƒ╘£²¬_F╛╡¡
  3049. e╫É~EƒZP"kI≤┴ \e#F╡yA*╡ó,÷₧Eª▓уπ╩\╫sRla╓ⁿy=ε╚╙JGûÆpεT┐iÿA⌡E\ 4τ$₧╨]▄Pq¬.╓£└≤î┤{ë≥±·{í≤VHΓftÅ»4█╤Z⌡@;╔[Üß,qΘ┬jéAb┴,ó┘É
  3050. 4窱φá╗┤h]╖Σ½JjTg;ÇΓ>xAWë├å╕Ch._▀ò;éTà░╪╢╝`ë╨Φ▌¢=╛Γ╬ Å%
  3051. ╡r√Ouß╛d╨bUΘè┴ÆÇ█Æ┼à⌠G≈=╖n∩7└π╕╓d@]}≥6Ç≥>+╙Y⌡#╡qRGoÇ gê⌡0± 1U╟¼╔[0=YC>₧    █▐▀àφY8╢δ@É¢╣K▀++M╤√~C₧XÄδ▌■«·Γ│▀╤ï^╛W»ê@W*α£Çé!
  3052.  
  3053. µA)'9░è;╗╣£/ùeí┌ε┴√ù╤╘│≈ D│┤┬UrESÆé2SÉLjhWRl¢δwA#AªnR~ºδ!!║╨GΦáуτ▀ ╫{\
  3054. kc╬ⁿo+ε▌╚\╔ûq»A║xúεXAf¡$ÿ╥V₧Cxé1╓▐«£ÑαdÇ£ô╙k»ßD╢h;ìφ9█▄KºE*▀\╚±(e╣┼aéVf┼Ñ┼ôA4║á■±≥ ⌐αiS╖á╝ `B    rܵW]&B╠╔ê¡\^(QE╘åq╟ ù²╘⌠╝hΩ·ò┼ƒ~ºµ╩ ╞2Uⁿhσqε╕k╥lI⌡J▐êò╬▐Féÿçï(ÖxYª+⌡*╒Γδƒ+&P-⌠$╙¡p%é1ôHƒHLg▄ nî÷0ú    *I╞╢╡`t'sΦ╟┬▄WFä∞jîÑ]▀ë▀S₧+=^E├Σ!!".╦,É≈╫╨ ¡╖⌠÷═ç╩XÅαéIW#│»!
  3055.  
  3056. µA)'9░å='£Ñì-ûRï╜¡φ≡─╚╨¼▓▒[F ¡┴wfM▌é~FƒZ8kXVb≤ôYJ&aHªrVxú┐)⌡╨d ⌐░ñ┘╖╞âuPk ╠╜;»╦╠\╫{∙{╟}▒x₧εP[7∩Bô▀^Å!
  3057.  
  3058. µA)'9░å='£Ñì-ûeí╒ßπⁿ▌┌╓¬ƒ╧:î╛╘;g@SÆÆ?^éZ%hGc
  3059. ╢ôZc/YªnyΓ∞' ╨G⌐ú╛æ∙ΘÉg@gn╔¿l<¡╠ÇOIçÆy½ór╨⌠T*µqÆ█Wê4¡╤ÿ╞⌡╪ε1σg≥±·{
  3060. á⌠EE╢iuñπ2┘╠╜o═Q⌡∙(bφ!
  3061.  
  3062. µA36<:à¢&;╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√┴;/|z√ªfúmjj^Gj·ê^&2Gª<_cá╣!!Φ╟╝úÑù⌡┌ä4X| ╬┤hr╝╠├\Aâü{╟ ┐iâA╨xm ¡$ë█KÅK{óL|▀¥└≈└Ñ3ü    ╙█Çs½▒QHúg7┬ε=┌ƒ^Θ*┬J╫ß,u÷╒8╦Fk╬+╕┌ÜMz┤├Æù⌠¡┤t]½τ╖BJuF&%åαpfF\┼W╠¥á@~|AIÜ╢&à    P╓∙▀°≤t÷·é╠ë;ⁿ¡ñcª+8C¿t²KΩ┤)┴cH√î┴╛╗∞|█°Ω╥÷p╝yΣ6éπ╕╩    OgHF{8²2ÆΣ(Iÿ6╛Z╦
  3063.      #çs ä∩Xëc,Oê½ß7;I>╫Z▌▌╔]FÅσ>┐·    ½╣╢e  b╨∙#
  3064. 3É`¢Γÿ┴╝¬²┐╬Åï]à┤î@0╣éèS╟#», rƃúÄ╤7xä┌%┤╚±Ñ≡Θ%Üc: ï▀U∩Tï⌠4ÿ▓»Q╩ÿH│!!äΘ«╥i╫±â*╓åDí╡k-«τÿ▐åYYE▄3%╟┌⌐#(─ÇΘEÄ⌠à)Cá╙&¿(&┐█}Fφ{P≡┴·≥╔I╚6╖αéäß▐TN▄gWçΩ∙╘B¬î┼░÷.@ ÿWO<û░ïgRáf⌠½+/èä∞w╚ßΘ5╔_òma∙═█úW╠t}j∩¡ßT2uτ$W#Nà#Σg¿╡â%~╔╚╝╡G╣á▄╢mΘ    "≡Lx¿AZ&    ék═ƒ│\&êm▓}╕í7n≥√Γªw▓3fLg¬1é¥▒α≤4≈²º@╚º╜JªQ+L╝─╕M╨ò¡┘D▀ΣG_°%";ΦÜ4 ╚╝ñδ\¼┬I¢ÿGîûJ₧ù∩V╙4£BTÜ2C4═å tRCA░÷╘»≤x■
  3065. Kt
  3066. ╔⌠~▄₧╢T≡£O;cS±!
  3067.  
  3068. µH(44åå<-│ºïG∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3\^╫─9^ÿ]E&.YZe  Å`)]πh[oΓ╣%∙█K¡Ñ∙▄ÜÑqt■hom▀ⁿh<╕ë┴J[Ü╙
  3069. ─*╕|¥╝ I+ΣhÖ₧^ÉMv¡ ╥ƒ╞╕í╩ìë█╔!!O╜⌠[BΓemï²<╨╥ZΘUaí5│α>n·ç"ƒk╬)±▌ÉW{░º∙ΩΘ    ª╒t∙ε│%OS*d!!ï≈MpJ":á~ñä╖l( ╘Ç"ÄâΣï°∩dΦ╝╧á≡W▄è┌ ├w╖}√
  3070. 4^µ╡N╠bYφ
  3071. ░Ç₧ï██╪─δG║Z╙ê6╦±╕▐    UfLH)°8¥╓9?╤3ôA▌Mlbïe]├û_èHR█╖²Rq.B>╘╨╓╨J└ΩOj╢ⁿ]èöôK╟l*UF╨Γ-:╤xÿ╗╠┌ ∞¿⌠╡╬é▌ZÄ═ε,W7│¥îS▌+íwcB╗¡╡┬├q²≤ª¢π[╔ô!
  3072.  
  3073. µH(44èÄ?,╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√┴;;FY▄╔=^ûLL#`\+·ÄXjfAóqV*ññ2║╩JΦÑ▓¥≥╞
  3074. à:m░╒j>í╦┴UföûV|╜m┐q╨·e]=╗$ñ₧E▄Gz║@/╟ù╬╢└⌐qü    ▀êåz    ºΘX╧
  3075. cçß%₧àºR*└Yܲ;hδ╚v╧G`╘q▄╢Ω-gº½⌡╛║[ΦτeP┐á╡gGY%g?ï,±=+C╠╦QäáThr.&│ΦgÿN¢░╘╢°r╙│ò┼└~≥╧└ êLw%╜p∩
  3076. .┘ó}┼`╢[▐Æçï╥█æΘ∩@│/~╫êZ┬δ≈▌JGN L}½j╙Σ9`£t₧]∞L@lè.τÆ\∩'U╠Γ╡
  3077. q)Oxû╦█▌
  3078. kΩè59ó∙Oûì▀âlh-{½ÖC!!╤k¢⌠┌Æ∞╫¢▀óΓ╠SôZα▐!!«ä╧▀pφej∙┐╝α─2t╫ô*åèπQ░ú╗╜G|8å▀;²M£▄yß═╘=π╙@»7@æ¼┤╤&▀⌠â
  3079. Ö▌
  3080. Eµí`mΩ·╫▀╒Cè,╠╕┴
  3081. ;▐╔·
  3082. é╗▄eKá╒75╒nY╨╖_Γ2H²≡¿⌠╪¥╬ƒ∙Φ╚╬
  3083. @Z╨|N├⌡φ╞A≥█çΣD°E#k≡2A*ÿªâd%½"├£^|Äè½w╦√µ=╘╤p}⌐╒╥┐$╩cwaß≥ñGoôC8rFo°aÇ└ƒÉ;1╩╟úîCªσ!
  3084.  
  3085. µH(44èÄ?,£╗â'▀∩╒Γ╔╛║╡╝ⁿ┬╖ZU╛»┼;>w▄ù)WàEj}NZ⌠ìa*@í}_*¼¬- ₧@╗▓│▐°┴\
  3086. ƒq\|e█╕l0ó╠≤MZ£öH5»Q▒h¥≥EI6αiÜÉ4÷+Sá>╥₧╨╢┴╡`£MîÅÆnεµ^P¬  u┬·#╬┌MΣ@<╔╓τ9dδï8╦E`╧-╕╥äu╜╖╕≥σ¼²n[∙⌡╝wUVt7¥DízZ%9╒W─Qû╠35ç┴!!èW╓÷╪╢°Gφ¿Æ┘└~Ä╣╠I╙ER^ß<╕0=∞╛}²#6åoá╔Ü╬é█åàΘP«R]╨êZ■√╕┘Tz[FUP¢^·₧ecÿ&îZƒBmçme═·!!╣J,ê½ⁿb!!*O }╫    █∩ÉkΩè5#▒╦[èÉ┼σ"9]E,»ÜMj4ùJû≈╦╫T∞ü╣╕╩å╬ƒW░¥cD+¡╚╧Bï>ó8&▓■▒▌≡/aÆê/ª¢⌡]Σ▒⌡(ÄE04ù╩3εOö╗wàτ÷█╥z!
  3087.  
  3088. µQ.XR══'⌐╛ë8┼+Θ╤»═╛ï°αù╓√T╖▓├s3AEÆÉ6W╫MA)kREn▒Æ^uOfç<F½⌐2√╠[@üô■╨╡óvs²`kl▄ⁿa;¼└─!
  3089.  
  3090. µQ.4Ñ£:│«é+ëRï╜¡φ≡─╚╨¼▓▒[F τ┼cpMF╞ì1\ñZH/mO\yQ╣▌Ae#_╖u\dæó'⌠▀N║Θ≈ë ╞╫w_.b▀ⁿ~;⌐╟┴UDÉ╙z├)▀jÿ≥NI;φeî╓PÆE4ï5≈╥╩σîñv££ÅûxA∞£=)╚    4hçπ5₧▄SµR<îX╧≈m°╘p±Ki╬>╜▒Θ!
  3091.  
  3092. ΘE4XR══'⌐╛ë8┼+Θ╤»É≈┘╦╨╣≈╖╖║╙s3^W▐æ;æPVjzSV+≤éPp#]φ>>╧┴I─═G «≈╗ù⌡╞^ƒuM!
  3093.  
  3094. ΘA+
  3095. 31¿è_C╙δ¡$û(Σ╞»╪÷╥ƒ┼┐µ¡W░√╘svD╫ç;[üZVm}nµ┴Pj#ß9╚┬Θ█NΦ│╕¥Γ┬âuJ    anÜ┤h>╛╧╔UM!
  3096.  
  3097. ΘA+
  3098. &,╢å<.╫├σhñ1≥├Ω▐╛├╫╨■÷¬PV▓╛╬or\_▌è~AâMM$iUd╢ò\&4JáyZ|º╣l║╫D@⌐╣«╨╡óvs²`kl▄ⁿi=¡▄═\Füçzá╛x£∩E]6µ!
  3099.  
  3100. ΘM =▓è>¿¿£:Ç-≥╣àÑ╝÷╤╞⌐≈╖W╖╛ÇhjET▌ê7Q╫QE'k\mOΓëq4N│lVxΓ¼%⌠█P╝╛╕É╖└
  3101. ₧{P@mu╚«h<║┼┘A¢Vòg¡F÷{ƒ╝EG x≤a£█PèGf┴jU¢¥═≤î»u╚Næö¥yCε▓ZM¼izÄús▀╤[º)┘S╓_╜o ô¬½^.╞3░█Éh▐─æ°∞»τ ΣáícRh7£ ≈?i\╚▐Qê¿ML2GÜ╢=èJôΓΓ¼σmßùÇ▐æp╪ëá7▄;R░}∩4Wδ╢a∞hMΘ
  3102. ⌐ôÆ₧╧Mëσ╤ N±?1¬+Ω6▄╞∞ΘJ|J\    ;²6öΣ!
  3103.  
  3104. ΘM =▓è>¿¿£:Ç-≥Ä»══╬╥╫▒■σ>)╓∙≤~gB┌ü~UÆQA8oOZd╢Än/H½1_o┤«,║═[¬╕╗ì╖█^â|[@`a╫╣ir║╨╨\▌¥5íE÷>₧≥TI{∞mæ╫T¥N8∞C:╞₧╧┐éΓΓ`⌡≥Å<    ó≡PWΓ|gδΘ?▀╪LºrîL▀⌡mfⁿ╔}╨Cz╔0┐·ÅEsáε⌡ ≤ï°e]½║≥=dVEtÜ∩p\[çzºxÖñUk|DI╘ä=èN Ö■≈┤²f≈α┴à£2┤Σ┌Ióo^b{j▒}∩GZ÷δ)ê~^α▐éƒÅ╠[█▐╠ßJ╪&┐g╓!!─≈Φ┌u}V
  3105. L≡'╙÷9?╤5¼W╥NN#ÅfAÅΦ0φ≤≥╥x!
  3106.  
  3107. ΦJ.<9¿å(,¢»ÿ/ùε╒δíö╛¥≡░ß░AF »╚zgB┌ü~@Æ\A#x^A+σ┴ \a/\╖yAoªδ)⌠₧V¡≈ñ¢πÅ╫}Pza╓░h6ε▌┘IM╒Üg»Q┐xâlû8N,Σv▀╥V¥F}ó|┌£╫∙î┤{ìMûûÆ{
  3108. α▒`AΓd;ûτ:═ƒLεL?└FÜΩmb°╥k╦LiÇ+╣┘├H}▒╝∙∞∙F╝√6╨Γ╖J`GY|7èHÄ}]&d╨╚=âúJ-=WÜÆ*ç\BùΣ┼¬⌡c±«ä▐┌.á≈ôI▄;!
  3109.  
  3110. ΦJ.<9¿å(,¢Ñà+ûα─éªùò·╪«µ╝W╖╛ÇivKS█Æ;@╨L+bRRxO√Çi órJ*úº)√═GΦºÑ¢ß╞ äxG@}e╬ⁿx"ε╦┘\¥╙f½Q°?²kæ;&4Φeî≤Xî.±@t ¥╠²┘░Gëô₧╙r
  3111. ╣╕:.╦    câ√i₧ÿx╥h ï╩τw!!║αMδf5¡U╪╡Ω-m╝╗Ωφσ
  3112. «¥"}∙∞╜Bj@o0£ ±5b@▄┴Qâ»J    jhÜê;╦Iô²┬°▒!!≡▓ê▐┌?ú∞└Åw 
  3113. ╕< uLΩ±~┴UσÖ├!
  3114.  
  3115. ΦJ3'>Ñî7:╫├σhñ1≥├Ω▐╛╓ƒë¡≈┤FF▒╕┼AMW╓à<^Æ|K&b^P∙Å@i óp_*╢ú%║╫L¡Ñ▒ƒ⌠╩^·7Hji╔¼l&¡┴ÇVZ╒çyτ┐s╨⌠T=Γaû╚\Ä ╞i▄å╞╢╪¿r£Mûò╙h½■E]Γt~┬∞<╙▌VΘD+îL╙ ÷mn çl╩G.â<ñ╧ùKyÜá∞√≥⌐≈eO⌡á▀`k&B\v3Ü    δ8>}Vy╟╚îáZh/ █Å+╦â±▌æ≥uß¿ç╠Ö;ªú┌└;R╣<∙a^ε±}╧-6åoèëû╬╠Aü╙àΘD┤8│xí0╩δ⌠┌R`@}∙8ä≥;`âtîA╥Vzûe ü≥7± 7U═▒»T>4^w╪w┤╗▄VűOjñΩJù╒₧T₧^K═τ*C9ö~₧φ▌╓NÑ┤σ│┘ì╩\ÖKαå@_*º╥é┘!!¿f&Φ■┤█─3²≤dªå░Q    Ñ⌠δ%åy$Mô█╝i½Σ4¬«╕XÄê¬6 滪┬,æ∙₧~éÅOF└É $vΣíÿ╟£CE╪#bÄ⌡« Qí⌐└YÖΩÜ)Qº╨6 ⁿ-¬█g¬∞äªí┴╔>πΘ╨ò¬¥E═$BÄYφ±╬CX¬Å╟ΣHδh})░ub╛è╢M942ìG┘╬PL/4ƒîºjà«╘⌠1iΩ]GèΘ≥Æ4÷LC!
  3116.  
  3117. ΦJ3'>Ñî7:Ī½/ï:≤╒√╔ô╜╢ùƒⁿ╢DF¡√┴;/[S├æ;\öZ@kZWj·ä=Vj*JáhZe¼⌡`⌡╪ñ╗≈è ╩\Ö`[ha┘╣~r├ú⌐M@ö╙}íV║y╨∙H 6Σv₧╩\ÿ}ó@(█ùâΣ╔úvüÜë╙~╜⌠S¡nJoèΩs▌╩M⌡D!!╪2░⌠(oⁿ╒y╓Ka╬í▌æEy╢║²∞≤HΦ┌oH╝áªqY
  3118. r7├∞>uU▀├╩ΘJb)QO▀╚Bß3 ÿΣ╘¬·`τ┐Æì¢,░ú╟ ┘%K┐pΘ q[¼≤¬1à▐êçê╠ç╗»ÅKα#·1╝s╓Γ⌠┘ZOg[[;≡4ûΣc√]í]┌Gdâneƒ·!!µ9*I┌íΩ~?.O x╫█┴┤.oΘΩZÑΩL┼╒ñT█ >V└ⁿ)ö~æ·█╫α·╣Ñ╬ç═ÿQ│öLX0ÑÇë╚/╛"b²╕╡▄└1rÆ└l┤ìⁿRQ╖÷ε;ÇEY9é┴²C£≥~▒╩╫=πÆAà9å≤τ·:╘ⁿû~ƒë^≤▓g!!╣┤▄┬ôTV╧4(┼φâY9╟╞╛Yô≤ÄjGï╥'·(5╣█gu!
  3119.  
  3120. ΦW&,Ñâ>,╛─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM#}RhπÇUfF¡oGk«º%■₧
  3121. ª│≈Æ°╬òx[I.o╘ⁿy:½ë╚V[üV₧vªJ╕x▐Cæ;"cQ┌wÜ╥_▄Cg£.╥ƒ╞Γ╔▓N╚æ┴╙T=ï┬bhûEiì²s┌╨ºzu╔╞V═+`⌡╘}  ¬VÅ╚æQq!
  3122.  
  3123. ΦW    =■╧3«╗à$éRï╜¡φ≡─╚╨¼▓▓[F½│┼i3[F╫ç7T₧Z@j}OAb±┴J&2Gª<]k»«`⌡╪Φ║▓ô⌡╩^₧zfeÜ«h1½└╓\Z█T■|─*ênò·_ °tÜ≥P₧}┐.=▐ùÖ╢═ôgÜæ£!
  3124.  
  3125. ΦW:4çç7*▒≤╠(î1σ▌ß╦ô╜╢ùÄα¼EB½╛Ç63k^╫ç5âWE>.O[nO±ì[g*íu]n½Ñ'║╠G║▓ñ¢∙█╫vG@zh▀ⁿ1╜┌╧ZAöÜ{≡÷Ö°XAtívÜ╪\ÄQ4╕|╥╥«£Ñ░|ç▀ƒÜº■YE░yF;âß7₧╓YºO ╪╩ⁿ qφç~═P.╒,┤╬├Ewºº≈≡«D┼₧6╨ⁿ≥jDT&.π`è<~MQ┼WùL╩úPc8JB▌┴9èVô╛╝╥ò)π╢Ä╧¢2⌡Ω┌"╞ 3$YⁿL≤x|φ┐z╘lU°║êÉÜ╓Gò╫╫  ┤£jφ └╜╕ΣZZ)]Z-▒+■¥D â1î^ƒBNâssîⁿ0┴=╞º°:[S#pi╫╨█╫C]φë5C▐δLçü┼ûARp═ⁿd<£i╫╝ƒù_δ²▒╡╟è╪WÖKαôLB,αôüS╬2ñqr⌡╣≡╔╔0sûûl░Ç∙WΣ≡ΦiìOdw ╟π≤L║ε9ƒ│╝Z₧êc¬;     îºª╙0ƒ¥·Sⁿ╖X≥ºOKΩα╫ïå VC╧)?Ç╢═
  3126. =╟╘√XÆτê`Tº£=    σ+t╝╤f■3A╕╟╡∩╬O▄;╖µ╨æ«╥
  3127. ╓vNxƒRσ²╠σ█═ªñ<E⌠1/O■═δn»v«╚V5OëÄΘ3╤ατ{╓T£"╙░║╧▀ajfΘ╡╛4p«A6mB[╦o┘|╣ñ╫╩╘«░[δ┴▐╛cFüq╝bºP\5G╓%■≤▀/G2│QO¿y£╜~pΘ±ⁿ»Z╡0z'N!!₧w₧è░┤╘4╫
  3128. ╖Γ─⌐⌡g┬9~'ºÄ╫0ò⌡á≤s╩°¬JIFòßuvº█Kw▌ò0¼çQ¢╔╬╘]ïï¼Uâ|┼:(╔p8═àJfUx¡╙≡╡ΓxÑ^Nr⌡«ñ╣▓ƒúB-┴r╘[l┌┴Σ0ε(G"#⌐Φ∩Θ>Φ«7∩├ï7êU┌óû,▒2~rIJ}î?Ñ┌|╜┴HªÑY    J=┤µ¡(ªK»╘ùE╕ìE╨α┤q÷íîv²fV│»!
  3129.  
  3130. ΦW21╖¢7;┐¡ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVjgHy
  3131. ±êMc4Jº<\dΓ┐( ₧J╗ú≈ô÷╠Öq3j(╙║-<í▌ÇM@É╙{╖╡r¥≤_J,≥$¢█JƒP}«8ôÉ┌╢╪¿z¢MôÆæn╝ΦE░eJkÉα1▀▌S■!!├KÜα(`√╦}ï ,¡U▄╢Ωzg╢ó■╛≡╝ⁿ R╢⌠ùq_!
  3132.  
  3133. ΦW4;íá<%ú─µC╟≤▌∙═Ω╥ƒÿ■╙½@T║⌐Çl{MB┌ü,öPI:gWR∙Å^PufK¬oRh««$┤£/j┼▌▐áΣ╩╫s[kr█¿d=á∩╠XOåVÆyâBÑv╩A╥^l5±mô█4÷!
  3134.  
  3135. φM%1U╬µp┤║¢/ù⌡▄Ωî ùâ≥ï█ü¿│╔x{_┴─*ZÆV/m^Z}
  3136. Σ╞JmèX"Äó"Φ▀PΦ₧ô╫╣ìqt·7>}e╓║-3║▌╥PJÇû5⌐V┐y!
  3137.  
  3138. φK&!!┤è ╕─µC╟≤▌∙═Ω╥ƒÿ■▐¬RG ║╬3IX┴ô;@╫KL/.IVh
  3139.  ùK!!5èHJzºç)°Ém┬┌▌≈╔µ(çqr    l ▄«b?Å▌╘KAùçf⌠Ñx£╝P[*Φfè╩\Å!
  3140.  
  3141. ∞K#9=╖ΓX@°êé9Æ:≤öεîó─┌─½≈½PF╗ë┼zwIT▐ü]¢SA)zR\eQ╢Äg*Cπh[oΓ╞Jô▌Mñ╢ñì≥▄\Vö{San▀▓yrí╦╩\Kü┌V|áóuòAεTL 1≈aìɱ(╞i└ù╧≡î│vä£Åºe½┌^Jª:JO⌐╞·αr╚eαz!
  3142.  
  3143. ∞K14Ñ£!!╡Öì)Ä>µ╤╡î²█▐╞¡ƒ╧:Å⌐╔mr\SÆ╔~ÿIAjzSV+µäP`/Jº<Pfú╕3║╩M@╝┐▓▐τ╬ûs[@os╔│n;»▌┼]éç5║K│=é TF=≤*▌│3±(£?╪ô─≤î¡rå ÿ₧ü<¬⌡tHús!!┬∞?▀╠LºU û╔ +!!Θ╞{╔Ci┼!
  3144.  
  3145. ∩E*XR══'⌐╛ë8┼>íê²╔ ╙▐╫▓≈ûGQ╢╡╟%3FW▀ü~TÿM>f^y
  3146. ⌡äOc4πnV~░ó%∞█F@«Ñ╕ô╖█·7ac╧▒h<║╚╘PG¢X╤{├)▀Câ≡W1╒}Å█uò@4ó1╓│╫¼î≡!
  3147.  
  3148. ∩E*&U╬µp┤║¢/ù⌡▄Ωî╣┘▐╪╗ßΓL╣√┴wB┌ü~W¢ZI/`O@+°┴
  3149. Qcf]ªVc┤«2┤£/j┼▌▐é╖├╫h3jl╙╛-h≤ë╙\DôVâA╖S│QÖ▓<%`⌐5▀╩V╞g⌐ :ôå┌µ╔ë}Ä╝öårτ▒TK«lxû╡sσàVº]o└V╪V²,lⁿµlÿg²!
  3150.  
  3151. ±E$4?íΓX@°êé9Æ:≤ö√─√ù╧╘╜∙ñTF ▓╬o|A┌ì=Z╫HV+~KVyO⌡ìJu#\πz\xΓ┐( ₧P½▓╛ê≥▌\ƒ{K j ╪╣-5½╟┼KIüùX─*éuòA°TI-φp▀▄\öCbÑ)┴╥╩σî┤|╚ æêäyε≡TúczàΩs╔╓K∩;─ZÜ≥ d╣╔y╧G.┴,±╚ïA4º╖Φ√á
  3152. í÷r]½∙■Jo/Vc3Üφpp^╠ìïóRl;F ╙çoà_ôπ┬╣εx¬╫δñ┤1íµôIΓ$R╣<∩fV≥íl─!!φ▐ôûê┌Zêû╤Θα5·oΣ%└δ≈╧Cg[FZ$Γ#û·mUÉ7öO╪AoçssêΦ{ígO1ó╦≤!!7
  3153. ╝s╬╙┌Oçµr+║·    ûå▒N╥l1Vt╫⌡~Cümö≡┘╒ é╗ⁿ│ï╤ûÅ]¼éX%¡ù▓]ª@─rkXíπ≡■─<zû¥)τà±ZúⁿΘgε*    èô²CÆα0ëë╝YŃπ+ àΘ╖└*┌±ù;╕åGí╜    J+ñ±éï«    \─?<≡╢└A=╠┼ñ
  3154. ÅπÉo▓▌0Θ)1ö▀yM╫!
  3155.  
  3156. ±E$4?í╒r9╗╗Å/ëRï╜¡ √├ƒ┴╢≈σCB╝░┴|v_▄É1ÇWM)fDyµæK&%Cóo@o▒δ&⌡╠á▓≈î≥╠üqL@}h╒⌐a6ε╦┼OÉût║F▓=äæ;&0Σ$├εXƒIu½bƒ╥╙≈▐úväC▀»¢uεⁿRP¬o;üε=₧▌ZºT<╔[Üⁿmn∩┬j╨Kj┼Ñ╘åp╢¿∙δ∞ΦΣa_▓ß╡N,<g?ïú6eJBë┼╩╡@}9@╙â=èH┌░╞░⌡b∞·û┬Å2▒ú╞╟%╣<■
  3157. 4J±┤mÄ/6åo≤δ·¥┌D¥û╒τA 7┐Eα>└╜╕╧TjJ
  3158.     3≡:û!
  3159.  
  3160. ±E$4?í¼:,╣ó╓jç6∩╨µ┬∙║╡╝ⁿ┬╖ZU╛»┼;>b┌ü~@Æ\A#x^A,╢åVd'Cπu@*úº2 ▀FΦºÑ¢Σ╩
  3161. █4]kc╤ⁿy=ε─┴RM╒åpεJó=Ö╝XAI,Θa▀═XæG4╝?╪ô─≤Ç═ß æƒ╙u    ε XPΓap┬√;█ƒJ⌠D=îH╥τ%dδçw╨`╧+±╚îf╢ó≈²ß¡┤iH≈á£`Ag&╬δ#1BU▌┬╩»\{9Q █Å<£_à░╫╣≡rß÷∞º≤-║ú▌╩E"ⁿr∙qMó╢l╘~φF¥ëÆÇ▄M█┬╩ªVµ p╗+σ:├ß²═H}H0⌠y╤ÜG√]â╪N@bè mö╦4α$[═Γτ^"
  3162. Ku╫█Æ┼)lΘΣP%╡■E▀╧┬▄%6TI┼░21äi┘û▓╗╡è≡╡└è╠Z▄²─VS(ª╥ƒ╚!!¼ec6·│╡Ç¿Uƒô?ùë≤_úⁿ╗s▐w;à╥╝OÄ∩>éáìUëÉFñ=_éñóÅD╗¥·W¢₧zΓ┐c!!Ω⌐ÿ├£
  3163. aE╔1*╟▓âC:φ┴≥YÖ╝▄R╛£!!√>tª│!!â)Aδ╘·╗Ç≡0░µæåñ ^╫a6⌠5Åæ╫FΣÆ┬úN█B k≡OC>â■┬ fxTÜj£üAaƒåΘ#╦«≡4╥É(.╕╒┴ú┌h>j■▓≈Rowâ@ziBWàh¬ √µ╨w.╔┼ñúE««╜╒5=ïvG°cª@8Z╘.╣ºò>
  3164. >¬Z╡l_£í~tε√░»]¥    -T7I⌠zɃ╕Q═ëP⌐2 º╥σ╩"▀xg-±∞½\╝꺲╚· ╜g ╝£u&«╨ ▓╝P¬┬I▐åK╬₧J╩î╝[╠:╥)3û<CüéhEc*╘₧£╥Ä═LHo╔⌠]╟─╙d┘áG,}XΣ;╤K"╩ê■~ε!!M2╛Γ∞Γ>▓τ{3W«▌ùG¥D╚π╙k⌠~SΘæV▓p╪ñ╪ª,≥ Wxo/o2┤µΘ▒\Ω¥¿ │æ@╟ ñ╒~╖ÄÖmδgN₧Γ┐≡¿U▄≤b≡₧ú'å&«┤└≤H┬∞Iª\L:    ΩN(ih%N(▀[╔S ╞tM/╗d$p∩çôrg∙─╓%⌡3z╟v╔≥º%Åt0B.eé·▒`ⁿqÇ»/[╗k├╕eLQæD&üñdTö ├t╕7╜∩╛A]«ñσÆ╜=P_÷#â╣⌠Ua╢9ú√τµ ₧Ií 4ⁿ_àm95╢·*╡√uå╙²tI«ετÄ$╢±Ö+ßúÄ/≥⌡|*∞∙╥0┴√z╖¥~@∙Kh«(╛Φ╜▐ÇΦJb╘!
  3165.  
  3166. ±E$4?íí3$┐─µC╟∩╟°╔∞ù╦▌╗▓½RN║√╧}3\^╫─.SöTE-kZe∙┴    Qo%GπkAk▓╗%Φ₧A ⌐ññ¢ΣÅà4Jk ╚╣n7º▀┼K% Çz╗O▓=Æ╝VJ=≤eï█]╥@ñ|╫ù┼≈┘¼g╚ÜôÆjíΣE½sJoì»2╨╠HΓSo═╩≡&`■┬8╒Kz╚Ñ╘åg▓ú²╛εѱ6╨ßíJmC"ïJ∩2cNB╨Yì$ä¡Pf9╩Ç,Ç[ô╝æ¼⌠h≈·î╚Ä6║τë└$K ¿<·f\τ±}╚h∩¢Ççç╨F█┘├ï(¥p¬jΓ8─ᲃ@)F    9■2Ç╖#jàt₧B═@Fz╞exäΦ!!¡HH6Ñ╚åG09Ay╙4▀▀▄ô═U&≈÷O½çèBälCE─░4>ÜmÉ■÷╙⌐α▒Ñ╬ç═ÆY¡üxI╩√▒╩)ªca╒┐╜╦!
  3167.  
  3168. ±E$4?íí3$┐≤╠+╢+≤▌ß╦ô╜╢ùì≈▒@½│┼;}I[╫─1T╫KL/.KRh≈åo([¼<Db½¿(║╔P╕º▓î╖╠äg[.f╒«-&ª╠ÇKMûÜp╝.▄â    ≤DCxπa▀┘\ÆGf¡9╫╥╫∙îⁿaì ¢Üæp
  3169. ¥σEM¼gT;â▄'╠╓Qαmí5╖|Ü=`·╠y┼G@┴2┤£┘4▓¥∞∞Θ»!
  3170.  
  3171. ±E3XR══'⌐╛ë8┼+Θ╤»▐√╘┌▄¿≈╖P ½┴o{_╘─=]àMA)zWJ+≤åJr#]ªx*¡┐( ╠U    ╗▓≈ƒ∙Åç`G@}t╚╡c5αï¡3!!°|·
  3172. 5»Wóo╨æ;&,⌡v▀ä▄Qqá|╥å╫Σ┼óf£î╒■fÉ╪c]▓e&rÇéY╖╢N≥D=╒o█√w!!°╙l╨i╒6╡£ε.┌ú∙⌠∩≥┤aH¡≥≥/dLZP7£$÷p%9á─à│-=WX╚┴8ªS ÖΓτ╜εO±╖┴á≡W▄∩╞
  3173. ╬    2QR¿hεOx\δ╡¬2σ░Ä¥ïàáæé█!
  3174.  
  3175. ±M%=êå0D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3ZS╤ü7DÆM9.rgr≤¡[(d"╔9▓óπ╬G,í╡≈ùΣß    ¢4WZr╧╣7rò┌┼UN╒ûyºY│@▐lû8q1╒}Å█uò@!
  3176.  
  3177. ±V"< ╔σ[k¢ºƒ=Ç-í└τ╔╛╟═╨╕√╜V¼╛─;gG╒ü0Wà^P/.O[nO°Ç\uf@Ñ<Gbºδ#÷▀Q¡ñ√▐τ└ä8zc╖╓&íë┬\Æ¥g»W│y╨ε^BI,Θa▀╩@îG4á    >┴ô╤∩éΓΓ`⌡≥ân
  3178. ¿°O½s$rÄ»:╪δM≥Duîd╔ +!!Θ╒}─KvÜó┘ÅB4╜»⌡√▌H┼₧    b⌐≥╖ }!
  3179.  
  3180. ±V"< ■╧<(╖¼ƒ:ä<Σ╣àÑ╝Σ┌┴■µ¡V»⌐┼}zP╞ï~PÆT8kKVe ≤à^Mif[½ydúª%Θ₧MΦ┤╗ƒΣ▄█4[m,Ü╗h<½█┴MMæ{∙s╝L╗=ä    ∙] ;Σmë█K▄V{∞4╓╥ƒΣ╔íwëô₧áhº PΓa|ùΓ6╨╦ºO.┴Z╔≥.d╖à¿/⌐/ú┘àMl≤⌠Ñ╛≤ñ≥ [╡∩░ KGX@ ü╣W>pBU┌╠Å∩!
  3181.  
  3182. ±V"< ââ=+╗Ñó+ê:≥╣àÑ╝÷╤╞⌐≈╖T╖╛╘svZ╒ü0Wà^P/jTg⌠ÇJ&nJφ{*íº!!Θ═Gß≈áù√├\Æ4Nkf╙ñh6αï¡3% ¡póE÷mé·XWI6εp║╙Iê[!
  3183.  
  3184. ±V"< ââ=+╗Ñó+ê:≥Ä»═▄╪╨┘╗≤½>)╓∙≤~gA┌ü*ZÆM-kUVyΓäa*@í}_yΓπ%┤┘ @½╗╢ìΣ╩W╫cW b ╪╣-"╝╠╞PPÉ▌T─.▄â≡W*Σbû╞~ÉMv¡ ╥ƒ╞σî².╚ ╜ö£p
  3185. » MñF wæΩi₧Σ2ì(F▄M▀·5!!úÜ8├`a╧3┤▌ì}╡ê∙≥≤≥┤[■▌Ågh!
  3186.  
  3187. ±V.!!Çú_C╙δ¡$û(Σ╞»═╛ï═╨┐÷ñQO║ê╘izFQî─=]ÖKE#`R]lOΓëK/L▒s@eñ┐`╙╨V║▒╢¥≥Å8æ}P    zi╒▓-»╟╟LIÆ■|¬FÑ~é∞EF6íkÖ₧MöG4╛?╓¢╒≤▐ε1σg≥±·`▓£=-▒ P&┬▄'╠╓Qα8▐V╬└9sⁿ╞uî/⌐,┤╨àdíº÷Ω╔"ä█n∙≤ⁿgh xFKe=ǵ$b!
  3188.  
  3189. ±V.!!Çú=«╗ú$▀⌡╒²╦√├ƒ▄░÷á]Wσ√╘zq[;╕φ|bàVR+z^&O╞ôWrf[½yCåç`√╩Ví╡óè≥ÅäwL    ~t╙│c!!ε╧╧KüûVg½@│tåε@x⌡lÜ₧îW`╕>▀ù≡Γ▐ÑràS╙█ç}⌐⌠C
  3190. α`Φå/₧╫ZδQo╨2░τ,s■┬l»(⌐1┤─ùtaºÅ⌠≥║F∩ßuU╜¿⌡Qo/<c*Ü:÷}C
  3191. ë╚îßUd>JHÜê+çiä∙▀┐º Ä╙Φ├ƒ&í╙▄ε    ;QRD⌡0╗T5ï╪j╥yZε\▐òÆî╠÷╝¼ÅL±
  3192. $è~⌡╔δóƒ]Pl]@2 ╘¼@°]æK╟ qWwºll╫╗&µ#▐º²D85D*j─╨╒é)lΘèR/»δyèü┼Üev=*x╩⌡(}╦1╫Φ▌▐∞▓⌠║█ÿ▀MòVº╩(<M¿ùâï#╛Gk∩º≡ú»V₧£
  3193. ªäπQKΣöæ@Ω)K# ò╘Φ-≤ê^σ╬│QÆÅw╢,E@╟σⁿ¼C╕Ö∙Wòò^πεOp%¿τ⪠p8-ú4.╪ú≤_(Ω╠≥▄íölN▓╧'ß 3≥£3çQ-æ¡╙∩╪C╔╢ß▒ì¡ç_NY╒tU6⌠5Åæ⌐I≥Åⁿ▒ù$EX┘o╨Ö╠a{½nëüK/Äïßw╨δ∞+█A╨7╙░█ú╬1w|├╢⌠Rewτ$SCTπ.ßv¼√╫ZTí»╞ÖV¬≥╫║{2`φ
  3194. "òK▒A~!!Gàk╜ ┴mX╒65┐j ë¼d ≥ ≥√A╡0z'NF≥ià¿¿ü∩1ÖB¬¬i═╡⌡.└=;`    ºÄ╫0ò⌡╞÷U╙Γ-
  3195. ╨+/u╝Çj▓Ähp▐ò0╫îY╧ñ[Ü╢Rå▀∩PèXG┐EWk¢5_¢▐JtR{k∙≡·╕≥gíDS|┴∩dÄ╪▐2ëíA<qN≈5╖y;j╪ì·_-╜A(s╨âäî2Râ∩c(┤Éπ⌡.¬┘╫0│ *ΩæV╪╞╡    ├ÿcªφP,xP╘ü└H½^√▄å_±ù@╫┐Ö▀δΘαp ╩⌡»ΩîK╤╜+╢▐δg█v«┤╟ΓQ╪░ÑeΣI^.Oó4°U
  3196. ├/╖|<ce▓∩zⁿ!!l⌠╧ô|ºj    ╛îΓávª~b,jñπ∙▓²╟`[¼b«y┴BÇVv┼÷cT║I½╥    δ¬╢Daⁿ¡V╥╕C╟QHXñ%äóªBTº6FΓ≤Ω√S╜Nó 4δ[ò v|√≈éùSÄ`üⁿpΘ1Θ▀!
  3197.  
  3198. ±V.!!Çú'αΘÿ+ù8Σ└éªùò∩╟╖ⁿ▒W╖╛ÇRWd╓ü-QàVT>gT]+≡┴
  3199. Qcf]ªVc┤«2║╤L@╝┐▓▐½▀    
  3200. âu\ kS╬«h3úùî\ööaα█²kòM1≥tî₧PÆVr┐@ ╛°¬Γ═▓tì≥±·½ΘCt╖t+wÄ╡sÖɺh α▌²(s°╙}╞l┘ò╙ÅT|║á╕═φñ°t]╡δ≥ jKL=_Σcè"*":á~├Æ╡ix(b@╓█o╠M ╖û ▓ Ä╙║┘¢,▓µ▌I┴/"¿]≡.±┤e╞-Kφû╝╙ü╤█■≈├q┴>ƒy≤<╫èÆ╢sBfF$Wÿ^·╠w`╤(▀#╡q(+wçrgê∩XëcL5í¼ΩO%
  3201. _$û^ûë┤.oΘè5$▓τ]»Çïf╥ bEQ╧⌡7<ûiú■└╞U┴╨ÿ▀óΓ┼ZäLÉæQ dΣ█▓]ª@─vg
  3202. ⁿ╗ñú»VÖƒ4│╕σ@KΣ╜╝rε*^òêxû)≡Γ%┬╩╫=âòSÑ+_Z▐Θ┤─%╫░ô+àôE ╚║a6¼⌡█╬åY┘?'╞≈╟_=╟Θ≡^Ö⌠ÜhAº╧}eéG=┤╩r[¬?Kóä╫ï┤2┤∙ⁿ╨¥ß░u/5░pIÖY≥ò¬.â≥┬íó\╕WJ|╫¡┬a8½{Ä╬P4bßεÄ^▒²≡:▐╕╨░║¿╞eNz≥ÜΦJ&wâ4|GW₧Bç └╚■9;╨╥ƒ╖V±áöΣ42`φ
  3203. "òFhö#^:█"Ωúë>]lⁿLY░~_îº-p∩≡Σφ▐[i]i%¥òæ«│ú9╠X¡╧¿╠Üû13>æë╘0òê«ΩW╬Γpu`ÿNJ!!∙ÉnV╖┴$╗ª╖┬E╫┐KùÇQÿü⌠z3¬vÿ;-É5Xku¿ΩcYru¡─α»╞f¿tH╞ßg╦ï╢T≡╦'r&qN≈K╧"Ö┌▒rN╟@-g$!!ǺÇÅR@ñⁿh>â║τƒUÿÅl┐K║ &i░φ+δ1îïJ║┬█┤Ha!!1W╫ü║$ñJ»═û ┐ùh±>┼αdñ¡Ä-«a╠┬┐ΩφN╙πn≡ì╣"å(└╤a╟µ[╦²Nï&*\┐U(ih%)D«& I
  3204. æ5%ΘFC1 ÉK°Xæ╟╓t║n║>¼τ°vµwA2gò∩¬J═uâ»IE╗}Ö\╟Oÿv╥ⁿ5ù-├w╛i▄┼▐.j«Ω{╒╗Cá=DMå7ò∞ª]ΦZyu╦αⁿΘïIí 4α_Äu%pT∙∩uµⁿuì*╬·eτ6╡áæ6≥ æ*zú╕Ç,╝ê(]╢ù│X»²2¼≈&ÆU■ ║æ╒|▒■∙Vb▄╘v╓»¡∞ëSÑÆ?┐ÉP╔Ü▐╟¡L4Rx╚Y╥JSÿ¬µ∩:°Ü}╛o≤ w≤¡I<Φ∞╩ ┐ó╞║≤ 5φPîBbëc+u^╜&Ü▓█╛O╚zæa«ñ4};
  3205.  ƒ⌐åbBÄπ ╣uèº⌡DΓj└òT┘'4'ç║0`σ╕=H∩2┴L╣φ"E`ûp<Ω╥╥é░nσy╛Sn═5.█┼ê¡'╢∞z≡Ö╜=┌R¿ª3ß│jQLÖê├ƒHc₧╗ê╛ûAß$▄c»küôqq╦g-6tt╡+K─╝A¡¡#"»iδó°╪;y0'¡╧ â£ ûÜ╛c
  3206. ò ÷Φ£t╦ ■∙:º░ìs╢É÷    0*Æÿ¬╧¬┐╗?,
  3207. ªEF┼]σüUσ¼Å¡àÆ7╠÷Z²▄wXSQn∙»·ù╪4╡)û╓≥∞┘>╤╣±6Φ ░∞╝T!!\ìΣ*▀╫Åσ╝Sⁿü0L╦W═Ö═╢╒πÄX╝▓▒ƒ2Md!!qrD}₧g½ε┬:üiëαl∙ñ^═ÿ₧ûé½╖MëÉö╜aαhαUÆ0╪E~└
  3208. ]Z<RT▐é2ƒá┴¬Åá╝ß▐ÜJ*.o FτT┬√╣≤ ùb⌐Ä$±±ΩT╩│GR▓╔êÑ÷@ó│A₧Z
  3209. ëZ\d,æ┘ÿÉf├<o▐╧±`α╧É1┼≡║½÷½²Oc┴gÖFG╚ëëo]á|┤¥í╩ä┬«ï╪ªkÿ,╣áIké
  3210. .╤`e╔OR«N\\\±Öß6╟oΣ ╟yd╧╬=ä╣9╕ßâaá·╙è4!
  3211.  
  3212. ±V.!!¬╒r(ë╜₧/ä2í╣àÑ╝÷╧┼╗ⁿíB ┐┼mvDY┬ü,æMM/`__rOΓäMs'CπnVz░«3 ╨V╝╛╕É╖└^â|[@|e┘╣d$½█ÇMG╒ág½B╗3╥lû<%`9╥pì█Xæ/┼i>╥ü╩⌡ⁿ▓zå┼█Çy¿¬:.╦    ~Ü√╦╦ºgé2░π$Uα╫}εKlÇ6ó≥ûHx≤├Æùë«└rI╝║≥1VRGg?╬±>e╬┬ï¡wl1Fq╖δFΓS░±▌½∙;ñüÇ■Ä,░Γ─I▀>Yⁿo∙r∞░d┼Pül≈ÇáÜ═MÜ█àΦG∞»╗sü«!
  3213.  
  3214. ≤A&<"íΓX@°Ö₧#ô>⌡╤»ü╛√╨╘║▓▒[F ⌐┼xvA@╫ûyA╫vp3~^b╕├s3 L&│ugs▓« ≤▄Z⌡≈ñ¢√╔\ÿuZ4wp▀Éd0!
  3215.  
  3216. ≤A &,╢Ä& ╡ºß@∞}└┌ⁿ█√┼╠ò┐ⁿσrP¼┤├rr\_▌è~TÿM>f^y
  3217. ⌡äOc4óoc╢δ7⌡╦NΦ╢ºÄ≥╬^₧z3jAΓêt"½σ╔[Zöè7{»O»gò╝RC+≥:┴╩@îGXÑ╓ò╩σ╪▓r£ÉòÇ2M├¢:.╦^~ÄΘs╓┌S≈R;▐V╘│`?╣ÅY╨Po┘ª╒ùL.≤╜²≥µF»ßiX∙ßí9wO[ &%çδMpbJ\╧W█ÿ▓Pb2pX╚ê!!î!
  3218.  
  3219. ≤A4!!U╬µp
  3220. ╢¼ì8┼>∩═»╧ ╘╫╨║▓¼]E░⌐═zgAY▄─-GöW+}Gc
  3221. ╢ìJrf@Ñ<Rdúº9α█Pµ≈âû■▄\ûmk ╘╣n7╜┌┴KQ╒ò{╟W╛x╨⌡S]*°$û═ëRp¡9╫╥╘ ╪¿|¥▀ÿ¢}⌐°YCΓih┬µ7æ╔Z⌡R&├QÜ^÷cf╖ç|╫Pg╬8±╪åRq┐íΦ≤σ╝╜,╗⌡ªgh UZcrçσ"|ND└├QìáMe9QI▐┴+₧H ÿ≈æ¿εd≥│Ä╪ë~▓µ╟ ▌#ⁿnΘg¬╝h╔cW⌡Fèëû╬╪Dö╘─Ω÷>╛b∩4╓èÆ╢Uz@@<σ2ù╖:là<▀G╤HTjéuaü╗!!· OüΓ°^=6
  3222. {û╤┴═
  3223. Dφë1@▐∞Lôô▀D╥)9Bc┴°!!ƒm¢Γ┬╫┐⌠£▄óê─QÅLíèQE»¥â=╩'¿"<E╗░╣┬!
  3224.  
  3225. ≤A49.í¬* ⌐╜à$éε█πû╛╟╨┌▓▄ñ^F╥╤⌐9CZ_─à*W╫ zOVfΓ┴
  3226. V&*@á}GoΓ¬.║█Z    ╗ú╛É≡ÅÖgJ`t╔ⁿ}=í┼ÇN@£¢Vw½O╣sù╝E@I,Θa▀╠\ƒG}║.╛°¬σ╪ía£æ£╙k║∙P¬eJ'ÉΩ2┌▐]δD╪M╙⌠s!!≈╞u╟.╨0╛╨¡Ey╢Γ╕ⁿ⌡ΦΣrS┤≡ª bAcr¢µpw@Bë╪₧⌐\Q)%▌ì ë[╓■╨╡∙rñ│çìö;╢µ┌╬.ER"▓oδ
  3227. fπ┐)£LH     ¥êÆÜ╓Gòêà±J²8·b≥s└ε∞╫T)N    8Θ>Çπ$kûtÿB╨@N∞    vîΘ<Γ)YêáµY53D2û╠Æ╪òΣ[/ñδL¢╒æB╔l6QMé±*}ƒe¢╗╬╙╣┐┐⌠ªßª5⌡DαüK@d«ùÿ=╩'¿"d⌡║╣└┬m·≡EóåµK∙╣Φ,ÅF02æ┌≤NöΣ9ÿΘ╨>πòB┤åΘ²£i┴ ƒ2╕åG»┘e╟₧▒ó¢Fj╦7.Çφ₧
  3228. 2╬╫╨Kæπ▄hQæ┼>
  3229. τ"z╫┤!!Φ2Jⁿ═┤µ¥Çuª√å┴á╬ I_╨eRæR╟∞Ü∩îΓÑ│h@╕YU#Ö░╪(0,½u╖└O/B╒╟Θ>╘╙«V╖v$╞|b┐Ö╨«▌z]`Φ╜δTq6äM?RLw▌&■qá»É1╟╩⌡Γ@óε╘╢aXDΘ    "┴mí\B1u▐'Ω╢└><\╓65▓}ª»3eªñ¡¿*╩UgZ"Z╖~ƒ┬²Ñ⌠┬Φε,åÜ┤gíRK'òè¡K≤æ┐∞
  3230. ï▒- ≡4&o∙ånc░òZ╣∙N■àN┘òB╬Ö_çÇ∩V╤_n∙-}£?A_¼Θc>║⌡σ»εe¬5O∩σd╦┬┌*ɼI[m%αt╘Fc╙ò∙_4í&HIg5▓√αΣ/c¼·gaM²╒éq▄I┬∩ƒ·HTΩæ│x╞┤┘»!
  3231.  
  3232. ≥A+6,Éû",æáé.▀⌡═ ╔⌡▐╤╤╙ÿ╠s¡▓╓zgMƒ─\äHA8.Z7≤É \h%JºNVkª¬"÷█añ╗▓¥π╞╔4Q.e█┐erí╧ÇM@ÉVûpúF╕iâA≤W"cQ⌡lÜ₧KÖAqÑ9┴╥╠≡î┤{ìMîïû¿°R@Γ<>B▓╩≈±{╣mí5╖|Ürⁿ╦~éQk╠:▓╚╖]d╢╜ó╛█\╝┤|¡áª`M\br╙Wú)aJ[└╔,!
  3233.  
  3234. ≥A+6,Éû",⌐≤╠.î,Γ╞µ┴≈┘▐┴▒α╚9*²ï╥reIB╫─s╢QW=kIjO¬ÆHs#AáyWXº¬$√▄Nï╕╗Æ≥╠ÿz@afÜ╣l1ªë╧_üûV)Å{édÇ╒_I∩eô╟CÖP*┴jU╓₧╞√╔«g¢MÉ¥╙h½▒EAíemç²s╪╨MºV'┼\╥Vτ%d╣¢u═Lo─6▓ΩéHa▓¼⌠√╛JΦ≡iO║≥╗ kGAt~╬⌡<dND╠ìàßM)Fÿ∞Eµ0k¿π╘┤·!!≡úæ╚╗0┤∩╨╩$K░y .µ╕z├RßÉÇçü═%±!
  3235.  
  3236. ≥A3.,(íú;+αΘÇ#çα└√▐≈╒╩┴╗ß B½»╥!!Γû7DûKAj#`n╢ò\&zfùeCoÄó"ñ₧Uí┤┐▐π╟^àq]gv▀«-;╜ë╫KIàÜrεB╕y╨²RG x≥kÆ█òLrúmV║à╦ ╧¿3ƒôù╙y»≤[AΓaJxìß=█▄KεN!!îK╒V±(!!δ┬5╟Qz┴=╜╒ÉLq╖εδδΓ¡σuY╖⌠╛L%g[q7£gë~$yJ█╬â╖\r!!░∞EΓJ óΘ┴╜╨hµ·█É┌2╝ßçdÑl6╡~ΘqLóδ4ÇlO°╨∞∙τ╪Mò╙╫τV²>£gα4╓ºóéZUlC    9⌠1ÆΓ!!q╢1æK═UKlêFlîⁿ&¡gO5█ºπQq3Dj▀╥█├A'îΩ]9Ü■Y!
  3237.  
  3238. ≥L&0<öÇ=%ö¿ü/ûRï╜¡ⁿ∞▐╔╘¬≈σ₧╡╙lvZ╙─bQÿSH/mOZd¿┴_&2Gª<@bú╣%■₧T║╛╢£√╩\ûy[.t╒ⁿo7ε▄╙\L╒£5╣Q╖mÇεL9≥wÜ═¢Gz⌐=╟ù╟╢├╡gσg÷öò<ª⌠VºcröΩ!!ƃZ⌐Faî|⌡;┌#uⁿ╒~├AkÇ,ñ▐ÇHuá╜²φ«F£ⁿe¬Φ│aEi>╬Ω<1MUë╚Å│Xy9G ╙çoéNBÆ ╘½≥&≡·é╪ê,░φ▌╓EZa{ñu∩:Å█¬e Æç╙ç╠|ë╫╞πm·)·ïZ¼ε■δSlFr~╣~«₧oA₧:╪Zƒ@Lw╞to═°4÷ ╧ºßR#;^q╪Z╫╘ÖPüαU$░┐FæÖå│FQ9IΣ±(8╦,¼╗─Æú╡²ÿ╩å╬Ç5╩φ,?7Ñ₧ëS╚%úqr⌡¬ú■╩0}┘≤néåπAí╣ⁿ,ìEb6é╫Wæ*≡ê^£¿▓XñÜJªxE]├║ó═/æ≤ƒ0àôK⌡º?k+ª┌┘╞ÉW<.úSB╨╕╠F╩═√
  3239. ò⌡╣dR╢┼^büG]╙╫r|°.AóäüóòαX╔£∙Φ╚╘`]╒w ▐g╟Ω╥F¬î┼░∞hYûWh'Üí┐U!
  3240.  
  3241. ≥K26=ìü&,¿»ì)Ç,î╛åÄ▀┘╠┬╗ασRπ╕╧wMU╞ì1\╔K,.rS&°òK`'LªHJzºè.√╥[¡ÑΘì╖╦öfWgn▌ⁿX╟▌╚\çÉ|╕Fñ:âA∩^ZΣ$û╨MÖPr¡9└╥ï≈î│|¥£₧╙u║⌠EBúc;ïⁿs▀╤ΦT;╬P╧≈m ô«q╠Vk╥9░▀åaá½ⁿ╛⌠    ΦΣu^╡ΘíB`PPr!!╟DÄ}Y_@D╠Mì%ô▒Pn=O@├┴<äOò⌡æ▒≥uß¿ç╠Ö;ªú▐├    w    C╕u∩}Q÷┤{╞lXΘ▐╔Æ¥ƒGÅ▐└⌠U²5·Θ6▄èÆ╢TlF)▒$åτ=jâ ÜJƒXUñ),═∙ ≈J1T┴▒»^"zH>╒╨─▄Jë∞Rd≈▐m░╟╙╪#*E    ├²48▌²Æ╨╙∞╕■ó├╦█JÄ]αÇLE4⌐£¢┘,¼acX·░┤Ä┴*p¢┌?¿¥ΓWΣ≡⌡=åRv6é└[╛-≤î]σ╗²UäêPª*_ε├╬└'┬τò,╓▌F╥▒$*»πûª pBA╞<k├╕└F=╪╙√Y▄Γô3Öå6    δ&tª₧uF∙,AΩä╗σ┘z╤9∙╡òÇó╒_US╠v^╖R≥²╥AΘ₧▀Ö[█B <ÿUU1Æ╢!
  3242.  
  3243. ≥P%)4.íá<s·¿é▒╬┴√Ω≈█┌╟╙ÿ╠l¬»╨ngB┌ü~@Æ\A#x^A+∙┴WUmîiGL½º%ΦÉ4á▓≈¥÷╠ô4_ol├ªh ╜ë├VFå₧5»║räA≤W(αgÜÆÅM4┴jU─ùâ≥├«4£MêÜ¥hO║■M¼cnåΩs╩╫ZΩ&┬╬÷mc≡╔y╨[.╞6╜┘═┘├Æùߢ└Bs¼⌠ö`Tp7£Ω5+D╨╚0äáUt&F^╔┴8éN
  3244. ╠░▀▒≡/ë╨Φ▐Å.░±ë█
  3245. ôrªOuQ╤àK∩xO╩Æäü└!
  3246.  
  3247. ≥P56,╖ΓX@°êé9Æ:≤öεîó─┌─½≈½PF╗ë┼zwIT▐ü]¢SA)zR\eQ╢Äg*Cπh[oΓ╞Jô╠GºÑ│ì╖ç
  3248. àa]{r▀»$rº╟ÇM@ÉVüv½JáxéO╛<%dRêZî█UÜg⌐ 9╨å≈∩▄ÑXü¢┴╙H$ç▀s{ÉE)T░╦!
  3249.  
  3250. ≥Q 0+░¡;'╛áé-ú0≤α÷▄√ìƒ└¡≈╖gZ»╛¡
  3251. f└ì(SâZg.z]x≤ô^Xhféo@eíó!!ε╫M÷≈áû■╠^₧gfeÜ»x5⌐╠╙MMæV£5»@óhæ╝SF<Φjÿ₧[ÖVc⌐2╛°¬Γ─Ñ3ÅÉÖÆpOá≡ZAΓa┬√;█ƒXδN-═Sܱ'd·╙8─M|Ç+╣┘├UïÜßεσ/ª≥o}╖ß╛`T G&'¥±#)aJëzºxúºy4F ▌ì ë[╓°╨½╝oδ«┴╘ƒ*⌡ß╠ ┴E3
  3252. ▓y°C4P≡±h╠y^■ƒòÜÿ┌Déû╠αα5·j∩2╔■Γ┌jNG2σwæ≥mfö&ïO╓/    ∩thî∩uΩeQ╔╢∞_4)
  3253. v╙Z╩╦╔AJ└≈T/╣┐]ùÉ▀Q▀ -U╦ⁿ(C?ö,Ö≥╘ÆFÑ⌠⌠°ïèïLë_ºüVB-»£╞]ï½"r■■ª╧╔*t╫ô?τå∙XQ╔ôÆ=ïE~wÅ╓U Aòφ2₧τ«\àÄKºxù¼¬╤=æΣƒ~ÆéL∩▒Op,»┤▀╟ÜPHåz*╬│âC2ï╙±
  3254. ÿΘògEΓ╠6ε!!&╖₧c@δ/Aε┴¿í░1┤6½≡ôè▓¥HXÖtTôL≥δÇF∩█┬í│;ZïB2ÿΣâ~εmÅ─P}ƒÄΘ0ù√≤2╙┴qk∙╬┴⌐┘1ycΘ╣σJ<8êD?~^¿EäQíñ╫$;╔╘¼¬ñ≥╘║}ù9&û,°Z╠?╣╝£>=╡^O╣krΓ╟W2»╛┼µ╒XoB.[ tò╪│¡µ}┬¡ú,├░·+╪uz,┤µ≤^▓▄ê═y∩╢ I≡g%=∙Öoc¼┴    ≈ΘJ╗åSU┬äK╬ÇW₧ì∩┴
  3255. s²<p ¥p
  3256. ╥ÉC):╨º╝√╔k⌐Ox╩σf┬┘╚6£ª !!`^úo├W"╤êΦ%╝056╗α⌡Ñs]ú«)°┘übÅK┌ó╙$╜+;y╠╕+╣x█≡▀ºc╛│PZi-{z┤ⁿαo┼&åΘî±ÉD╘τⁿ0ªÉÅtδp═à╛±║I¥≤c√┘∩k─rφ▓ô≤A╔╕TτAFu ╛NK  #D░;┴Yç5V
  3257. ≥y*jL⌠çÉr`δë╥,ëk9è_¡Γ▒;áoKn φƒ╦ÜXδ╙)G¬(äbÆ<SæDv└δ<T╥;╥╕&┤½≈Sfⁿ╣⌐╫j»x{lƒ═÷ΣTR≤#Γ τΣΣ]╙%╪gτI╓D>`y≡τaµÆz└?╚ⁿyⁿt┌╫½¢Ü⌠&;¡óÖ"≥ügΦ⌠Ö8╥╛)Σ┌|@∩ZUPög┴å╒t≈┐∩væ╩?┴¡÷╕τ1Ç╗SÆ╧[╔ÅÿΩ╙-X{r£A┼QàÉé═°ì3┐bφE0èç-Xà⌡äΣ∩Æ┤èLüìJt╬p>'z║╨ƒ╢█S╧w¢a«Ñ!!o= ║ƒµ└OEìÖw╫I╒ºí]ªG≡í}Ñ'q%í¬.qî?üA░a┴H»═9b╝t?√╞ ╣ùÄ╥z æg:╦╓╧½&ƒºk^⌠α╒[╡Pò╣cφú|V╫╠╪═N⌡▐Φ╓:îMá(1ó├ └─d#├g*U#»NjKN─╛T á!!#╣t┐╡°ètVK╓+╚Γæò∩ûÜñ[G≤╒î∩£sç
  3258. ^╔╙
  3259. C╦╒Γφò┐cj∙ßât╥░∩º<=câzZ▀¼¢SÜ┴π╨╠¥    ╠δK+⌐╫yc9 Ö║Φ┼├qƒzÉφⁿälª3╩Ñ∩sΓ¬¡┬-G6φ▐d╥ÿ¥ä┼c?öΣ=╚═æ0µ1ƒ⌠∙ÄXô╝╡ÿ2    P *vja9b1Öd╓}ù╙åh▌·2½îÑα├£ùó±
  3260. ƒù╓╤₧ÜWÑ:ü
  3261. «o-sN▐ƒa▓═ñ╠Σó≡IΣ▐ÇV WOX]óF╩░ⁿσY┘ióî)δñ¿τp╥//µ┴╧ñ░JûΘ)°*YüWNBa&æÄ≈Ω(╞>0▐«÷-│╓▄:┼τñ¡·╛╪ENπlσKÇ^é£Xc╔╙    ┬^÷╖┴▀ ╖û╫┐kÆ&Γ≤apÇ(└}*─|{║c84E⌡e⌡£R½6ƒ ┌c@ÇEé[ßè─ªQ┼ZL╓╙╫πOP>ªîBÆä┴┐Lnâ╗qéJ  ╕#φ½D ╕▐uΩ⌡δ£ÿ├╩╝v%₧≡│¿ZY╥Æ╢Ω╩,*≤ σ╞Ckÿvç2æWΘj|Ö2     j`/gc7d┤>û ⁿ*»º'ù⌐(6ªtLσÅ·ñ-X(╠ów!![éû╦¿▓╝/ä94| ë;\ Ñ,·┘│▒E╞aß╔!!~▒╗╗┘ó╦I.╖c3;εq;¡┤7²7╩±πW╛!!Z%O ²>wÉJÖσú-╡╡q╙¢╜9iäv▀n¡G½√7ìD▌╒!!≤â4╧[≤9^fEn/)╗∩]#0ú·Vùw╧]≈╞P█i▌▀<Qñè▓-2.La11ä
  3262. ¬Æw┘?¡¥ΩV½▄╫ⁿZΩï╧"8₧═7H+òΘk╩ªStSQ╞BB*üQƒµ⌠
  3263. ñ    á╣H╒╢c┘ë╪╪k┬/[EƒS&lì°æ<ƒP╖√■
  3264. z²º`┐£⌡ΩwUtî3╧`º∙ñE`Wù┼Ѭπα!!╢:▀C═KÜHσ⌐fQ≈≤Å^7*:ñ∙I    üó╤_a5±ïñPèq@i╝≡ÑM[:z·Pj╫Cè*╩φ┌$╬W╡└ìAú╩¼I╚Ω┼
  3265. XÆ▐▒7·>ñ▓ik6Dr∩⌐é▄╓giúgπé≤o¿ 0α&y'»¬ε*#ÜLbY|u>²poM╬@O>!!▄ïBaW L╙Be╦¢╧B╚─├-:5$ôºΓ
  3266. ≤φ╒ï╟}┤«╛`á├╧qµ$4¿≤qR8°NcZd.┐¢E²Å╖ÅG├╟√╙Qwpt8
  3267. "₧Φ┤τ·╨w%Θi╛27ß
  3268. W^ê≈jƒ>╟    je²â!!πçG\uσ═¡Å⌡Y≥╠╤ ë▓╗ƒ≥,ƒîεÆ ≈GÅ@Φå╖┬╛T-ÅÅ╖EÑIVΦ@^·½1╦⌐<φK▌è∩JT_ÖÉè╥ε ╒│c%ÖL\░╕`û▄W╗\ï±╪╘ⁿW╟ºZCÜv▐p(╔⌐(léƒ⌐I╗âp3~╘╧┐÷Ä≈1\▌┌º°Θè«├:E²▄B▒╛┤C╩oàåû@$áò
  3269. ÿ¡¡à3├c▓
  3270. ╠$^╓Q│!!═≥2é`┤+mZp╪äĺ*áLɼΩÜbÖ╝£█ô»êd±≈╓l░/!!├U═·î_@∞vw5x┬╣BRS,8}≈²CI╢    ╨╤8'kùεè∞:HÑ#!
  3271.  
  3272. ≥Q7';¿Ä!!:ÖÑì9ì Φ╙ß═≥║╡╝ⁿ╙½@T║⌐Ço{MÄü&QÆOP#aU`n≤é
  3273. Vtx yKiº╗4≤╤L3í░╣ƒ√╩@╫cV    mhÜ┐l<ε╦┼[£¥yóF▓=äæ;&0Σj▀▀W▄Kzñ.┌å┬°╧Ñ3àîûÆh ª▒^WΓdoç∞'██Ñ,Eí5│(α(m ç{╬C}╙ó╔ôAf░ó∙φ≤%ñ⌡sTèΘ╡i!
  3274.  
  3275. ⌡V&<6úΓX@°êé9Æ:≤ö√─√ù╠╠│≡¬_J╝√╬z~M▌é~FƒZ>|ZPb±┴Ir/@¡<P░╣%⌠╩NΦ╛╣▐±└Æ4X| ╬┤hr╝╠├\Aâü{╟ ╣sòA≤WJ7τb╙₧ôL8∞2╫╥Ç∙┬¼j┴C▌÷∙e╟φB«ah┬≤^┤╢Yδ@(▀ÇK│>d⌡┴8┼G`┼-░╚èKzòó∙∙≤F¬²t}╖ΣΦJ6wGVI<é¡zZqC╠╦Që¡X~/X╚Ç,éTÑΣ╚┤∙Lσ¬┴╞ƒ'ö≈ ├2QR░}√!
  3276.  
  3277. ⌡V&<6ú╒r(ë░ü(è3í╣àÑ╝Σ┌┴■µ¡V¼ó═y|D_╤─0SÜZ%hGc
  3278. ╢ò Xe/Añ<\z╢ó/⌠₧A║Ñ▓Éπ├^₧zar┘╣-4í█ÇM@ÉVüv½Jáxélû86Σ$É╪▀Mr¬L|É¥═║îí}îM▄ö¥pτ┐)╚`₧»5╥▐X⌠3í5│ ,fΩç"ƒ}┼3╖£äAz╢╝∙ΩΘ    ª╥l]╛≤≥vMvc3£Pú#"pLUµ┴─╠3/F@▄┴(ÄTä±┼▒≤o┬╢Ç╩ëd⌡½╧╬$Ki╒òfy^±║Z┼y¼NìäƒêƒKù╫╓⌡α1╣b∩4÷≤ß╙kh_FH)½wÆ─4hô;ô╓`@pânt╫╗│7l!
  3279.  
  3280. ⌡]76Ñâ+3┐╗¡>▀Φ┌δ╔µ║╡╝ⁿ╙½@T║⌐Çz}
  3281. ≤╝
  3282. KçZm$hTre·ÿ\tx░iQc¼╕4√╨AΦ╕▒▐π╟^ûdNap╚╡l&½ë╘@XÉ{∙síQ÷iÿ╝\J:Σv▀╔PêJ4╕9ô╬╩°╪Ñtì┴█Ür ½Θ╧
  3283. gδ╤ █╙YºU6▄Z√≥!!xπ┬j╤o╘e±╒ì@q½!
  3284.  
  3285. ⌡]76Ñâ+3┐╗ƒG∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3\^╫─bAÆNQ/`XVo=≤ÇXd*JÇs_fº¿4≤╤L^Φ╕▒▐½ε$*Äd[)`f╒¥c3ó╨┌\Z╦VÇwºMÑiæ T\dRêsù╫Zöc╛,ôå╦≤î▓vïûìûnH╜▒ mûy~½ß5╤üΩD"╬Z╚╜@ ÉΘw╓G4Ç ╣┘ÉA4▓á∙≥∙¡µs╕≥╖J
  3286. `JQKi<Üú?1NS▌W╠╩án=@D▀┴ àV╪░≡╢σ!!⌠┐ô▐ô-íµ╟Å 9▒}Φ{Qóó}╧^ΦFùÅ■Σ╢\ô╙àτL⌡)án≤ àΩφ╠hCF}≤2╙·,lƒ ₧G╤Ejê tà■u∩'N╔░÷y?0û╤▄▀Hâ≈8▓∞FôÇïN╤"xYN═Γ))ÿcÖ╖ÿ█@⌐⌠▒█íΓ▀WÖ╡èLG1Ñ╥ê─(¼n&·│╡▌à(y₧Ö$τî ZV░╣°%éSx{MÄ└U±AÉ∩#ì«│QÄ█N¡x åΘ╡─*╘∙å;ä└YFα╕e7Ω∙┘█▄W<.ú#╔ñâI=╚╚√
  3287. ƒτÆ)@º£6°:=┐┌4I■{E÷▌·⌡╘V╪uó√ö┴╢╘J█aNXÆYτΩ┼CVεö█¬U╣&     öZA#╫╖ûi╛"╤└QV`    µφÄ╫Γ≡3╘Ç7>≡ùæ╦}│{ ½ßgr6åW xXAà&■Ká¡╫>8ⁿ╘║ºδ█├║cYJåvB≡AN░EK]▐'α⌐ƒl ≥26╒F æ╛;AΦ ⁿ±▌Hy~$!
  3288.  
  3289. ⌡]71=ó£_C╙δ¡$û(Σ╞»═╛ï╠╨»τá]@║┐≥~rLW╨ê;qÿSH/mOZd¿┴_&'C»<GbºδMÉ╖C í╢ñ¢ΣÅT
  3290. Äd[kf╔⌡-;áë╘QM╒ûpºU│o▐Cæ;"cQ▀wÜ╥_▄Qqá?╟ª┌µ╔ïzå    ┼█ºW&Ç╒heÄI+H!
  3291.  
  3292. ⌡]76óÇ=αΘà$ü:∙╣àÑ╝τ═▄¿≤▒V≥√ßu`_S└─?\╫mwKVB≡Ä@`)]πh[oΓª%≈▄GΦ╕▒▐π╟^àq]gv▀«-3║ë╘QM╒âvºE┐xölû8F,ΣcÜ╠òLp⌐pôÇ╞σ├¼eì    ▀Å£<ª⌠M»p~ÅΩ=╩▐KεN!!îK├÷mh çyéF{┴3±╒ìPqí¿∙²σHΩÖ
  3293. 1╙ëîi@"ï+φ<hUU█ì₧√d2GI┬!
  3294.  
  3295. ⌡]76óÇ&»ºÿG∩Vú⌡ß▀Θ╥═ò¬·áM¬╢┬~aY╘─*KçZ#`]\,╢êr.JπnViºó6 ╠ B┼▌┌⌠₧±¢rgT├¼hº╦Ç~Mü"èpçM░r│Θ_[!
  3296.  
  3297. ⌡]76óÇ&¿ÄÖ#üeí╙·┼·ù╓╙ɲ½V ╛╪xvXB█ï0zûQ@&kI>f┤▒ Pp'[ª<*âÑ3φ█P@⌐╣≈┬╓≈(çqwho√▓l>╖╙┼K╒£5║K│=¥±SJx÷mï╓└eAà$bƒ╥─π┼ñ?σg÷öü<¿▒CLºr;ïⁿs╨╨⌠T,─╬π(!!≡╔~═g╬Ñ╘åx║¼Ω ≥ΦαhY∙≥╖iR`rïΓ%p[Y╟ìéñ4UB╙ì.ÅSá±▌¡²cΦ┐▀ü┌;¡α╠█ 8:▓x≡
  3298. fá▄¡2╥'ª╡è₧┌aò╨╩╟L⌡)án≤^»Äæ╨rp_`3≈8╔╖evö8Ö╧u[sâLiÅ╗XëcL5í╦ΦR%S    { ╪▌÷B!!òΩXp≈°\ûæ▀*┤EQ9)x╦÷
  3299. 3ö6╫└µ╫»┐ßó┬ä┼w¥Vñê@Dd╢ôâ╬Σ qƬ⌐▐└xò└l┤ìⁿR!
  3300.  
  3301. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓æ[F ⌐┼xvA@╫ûyA╫XH%lZ_+σ┴\o(Hπi]c¼╕4√╥N¼≈▒î°┬\
  3302. ƒqws╬╣`~ε▌╔]Q╒â{╟B╕dä    ⌡_HI/Θm£╓æKsñ|╨ô╓σ╔αvà₧ëÆoú⌠YPΓl oç²s╤╤Ñ,Eí5│÷!!g╣╒}╤GzÄR█╡äH{▒»⌠╨ß ¡┤:∙ε╗o!
  3303.  
  3304. ⌠J.;+╔σ[k¢ºƒ=Ç-í╒»Éφ╥╬└╗ⁿªVGì╛┴rJZ╫º1^¢ZG>gT]5O∙ç^Xj*╖tV*╧┴I∩╨Kªñ≈Ü≥▄ ₧v[.i╘ⁿy:½ë╥\KÉàgα█²kòo\ 4τ$î█UÖA`ÿ,╓╣╩°╚·3╝&╢╡╖C:Ç╪xj!
  3305.  
  3306. ≈A5    <7¬ΓX@°êé9Æ:≤öεîΦ╥═╞╖²½P½⌐╔utP▌û~FƒZ8kXVb≤ôP L"╔nº╗2 ▌C¡│∙≤¥ª"ÆxX@xe╚»d=á·╘KA¢!
  3307.  
  3308. ≈A5    <7¬╝&;│ºïG∩Vú⌡ß▀Θ╥═ò┐▓│VQ¼▓╧u3[B└ì0U╫YK8.O[nOΣä\o0J▒2╚╞Jô┬╝úÑ▐δóvwû`J.:çⁿ~7ó╧ÇX\üÜ`║FÑ3²kòoL<»!!¢ÖÅRfÑ(╒Ñ╩Γ─·3ëïë╙k"»√XVöeUùΓs╔╓K∩o═K╬│:L≡╔w╨tk╥ñ╤!
  3309.  
  3310. ≈P%6░è /╗¬ë9ΦUêû╬┬φ└┌╟■≤σ@░╖╠~p\_▌è`ÿY+bW≤┴Xt*Vε~\¼»l║╚V¬╗▓▐⌡╬ô8    `t▀«k3¡╠╙% ùf¡Q┐ò╝SVI,Θa▀╠\ƒG}║.¥╥≈■┼│3ƒôù╙u¡²B@º nâπs╫╤KΓS)═\▀╜o ô¬½|}┼3╖£ÉAx╢¡∞╩∙¡τ:é║ªJ%R"ïΩ41ë#µ8ñàfDwiΦº¿?! !
  3311.  
  3312. AXTypeLibRegistration comment:
  3313. 'AXTypeLibRegistration is a simple class to hold registration information for a type library which might not yet be loaded.
  3314.  
  3315. Instance Variables:
  3316.     description        <String>
  3317.     guidString        <String>
  3318.     versionString    <String>
  3319.  
  3320. '!
  3321. !AXTypeLibRegistration class methodsFor!
  3322.  
  3323. σA4'1┤¢;&┤≤╠.╢+≤▌ß╦╛╨╩▄║┴▒AJ▒╝Ü;t{B└ì0U╫IA8}R\e<ΓôWa|╡OGx½Ñ'ù┤+Bë╣ñë≥▌\╫z[.i╘»y3á╩┼GôVçpεQ│~òΩT]I>εv▀╩QÖg╝?┌ö╩≤╚αgæÜùÜ~O╝⌠PM▒tzûµ<╨ƒ[ΓU.┼S╔X▒@ ö¡ⁿQk╠9±╥åS┘╟æ·σ½µiL¡Θ╜X%Bft;Çú%xKc▌─ì√jW^╙Å(╦Läπ╪╖≥R≡¿ê├¥d⌡⌡·▌ 9 i!
  3324.  
  3325. ΦG(XR══'⌐╛ë8ûα┌»É╫╘╨█α▓▒[B½√├z}T╫─+AÆ[>aAnΣä\h2╖tZyΓ¿,√═QB┼▌┌⌠₧±=&úmNBi╪«l ╖Φ╬XDî û5º@╣s! !
  3326.  
  3327. !AXTypeLibRegistration methodsFor!
  3328.  
  3329. ╜(
  3330. 0*Ñü6D╨└╬ ï,÷╤²îΘ▀┌┴╢≈╖W╖╛ÇivKS█Æ;@╫\K&bZGn╢â_i4Jπh[oΓ≈┬Ω[¡¢╛£┼╩ä`Lzi╒▓3~εñ¬0Gàü{¬÷Uæ°H7≤$î╤KêKz½N~╛°«£Ñ₧`ìÖ█ùy¡π^T╢iu┬│s╤╧Z⌡@!!╚▐α.s≡╫l╦M`¡U╪╡îV.≤òδ√∞Φ≡eO║≥╗lI[K;rüµ1K╚╔K╩ÜJh0E ╠ä=ÿSÿ├┼¬⌡oπ·▌ìò.░±╚╦E!!╡s≥<`Mδ┐n²P!
  3331.  
  3332. ╜g%=╢Ä<-╫├σhñ1≥├Ω▐╛└╫╨¬·áA½│┼;aMU╫ì(WàG%bWR
  3333. σ┴\`)]ª<\xΓ┐( ₧QÑ▓≈ƒΣÅÆ4!!VT├¼hº╦≥\O£çt║J╣s╬M╝<%`7±aì▀Wÿ 4ä2╫ïâ≡├▓3¢ìÅÜrα│:.╧
  3334. cE╩α#█═^ΘEoÉ╔ +(╣Ü%éDo╠,┤!
  3335.  
  3336. ╝$8(Ñ¥3'╛─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM+`_≤┴Bvd,Jáh&Γ¿/≈╬C⌐╣│╥╖óvwûf[@mo╘»d6½█┼]Éåc»O│säOæ;& 5±hÜ╙\ÆVu╕    3▌╥φ∙╪Ñ)╚9êö╙h╛⌠[MásJzÉΩs▌╨Q⌠H+╔M▀│(p∞╬n├Nk╬+▄╢ΩMr≤║≡√∙Fá⌡vY∙⌠║BvGX&º(╩3~3":ñ}ñ/ë«T}=QM╘àoÿJò∙╘½╝<╣·Æ╚û8⌡≡┘ ╠ 2R▓xªOO\φ╝y┴ZΓ▐ìÜî╓L█ïà⌡G°p╢bπ:┴┌!
  3337.  
  3338. πQ.1í¥!! ╡ºó?ê=Σ╞ⁿíö╛¥σ¼√│RW║√ì9";╕φ"üZV9gT][ΣòzK%╩jVx▒ó/⌠εC╝ñ≈─¬Å¢rkr╔╡b<¥▌╥PFÆVÆ@╛S│oô∩T-πWï╠PÆEg÷@x¥▄«£Ñ¡réì█╔!!Oç CAÑe;ÉΩ2┌∙MΦLuî╠ß>h÷╔H├Pz╙░╚┘%≤º■▀Γ¡·t∙█⌡M?,Gg6╜±1|B╚─    ╨ß;r.&│î&àU╓¬î°╒o≡┐å╚ê~ºµ╚Θ8HC⌠j∙gVφ┐Y┴O Fƒò╔╬ìÆ╨ΣΣQ±$α+┌té┌▒ƒChK5]/⌠6₧╖?dò=çƒI ∞
  3339. !
  3340.  
  3341. σA4'1┤¢;&┤─µC╟∩╟°╔∞ù╦▌╗▓íVP╝⌐╔kgAY▄─8@ÿR>f^µäPda\πnVm½╕4Φ▀V    º╣≈Ü≥█¢gB
  3342. ╖╓ ¬╠╙ZZ£çzá!
  3343.  
  3344. σA4'1┤¢;&┤≤╠.╢+≤▌ß╦╛╨╩▄║┴▒AJ▒╝Ü;t{B└ì0U╫IA8}R\e<ΓôWa|╡OGx½Ñ'ù┤+BÿÑ╛ê÷█^┌4wgt╙╜a;┤╠ÇM@ÉVüv½JáxéF∩F=∩pû╩@▄Kz┐=▌æ╞╢┌íaü ¥ùûoA├¢>e¼s~É»'╓┌⌡D,╔V╠ßc#ö¡¿+j┼,▓╬èT`║í÷╛║[Φ≡SH½Θ╝L,< s;è9≈9HôJì╣╡Kd2D╖δF¥_à∙▐╢╧u÷│Å╩┌dΦú▀:█>n╓!
  3345.  
  3346. ΘE4XR══'⌐╛ë8┼+Θ╤»É≈┘╦╨╣≈╖╖║╙s3^W▐æ;æPVjzSV+≤éPp#]φ>>╧┴I─═G «≈╗ù⌡╞^ƒuM!
  3347.  
  3348. φM%1U╬µp┤║¢/ùαö│δ╦■√ï■σ¡Z@╖√╔h3\^╫─*KçZH#l@+°êLcfFº<Fïë    ▐ù B┼▌┌⌠₧±;+╛P|o╫Åy º╟╟ÆÜF║Q┐sù!
  3349.  
  3350. ∞E-'í¥!! ╡ºß@∞}└┌ⁿ█√┼ƒ┴╢≈σAF╝╛╔mvZ┴─3[ÖPVjx^Ax∙Å^Ws+Mªn(╧┴MÉ╖Oó╕Ñ▐■▄2¢4WZr╧╣7rò┌┼UN╒åy¬u│oâ≤_a5πaì═d╥/┼>1╥ÿ╠Σ!
  3351.  
  3352. ∞M)'í¥!! ╡ºß@∞}└┌ⁿ█√┼ƒ┴╢≈σAF╝╛╔mvZ┴─3[ÖPVjx^Ax∙Å^Ws+Mªn(╧┴MÉ╖O    ª╕Ñ▐■▄2¢4WZr╧╣7rò┌┼UN╒åy¬u│oâ≤_a5πaì═d╥/┼>1┌£╠Σ!
  3353.  
  3354. ≈A5    <7¬╝&;│ºïG∩Vú⌡ß▀Θ╥═ò¬·áU║⌐╙r|F┴É,[ÖX,|T^+■ä^M6J»uQ-▒δ2 ┘K╝Ñ╢è■└^ôqJgl╔≥/_─ñ¬0vâü|íMàié≥V! !
  3355.  
  3356. Ball comment:
  3357. ''!
  3358. !Ball methodsFor!
  3359.  
  3360. drawOn: aCanvas 
  3361.     self icon drawOn: aCanvas
  3362.         at: (self position - (self icon extent / 2)) truncated!
  3363.  
  3364. icon
  3365.     ^icon isNil ifTrue: [self class icon] ifFalse: [icon]!
  3366.  
  3367. icon: anObject 
  3368.     icon := anObject!
  3369.  
  3370. position
  3371.     ^position!
  3372.  
  3373. position: anObject 
  3374.     position := anObject!
  3375.  
  3376. velocity
  3377.     ^velocity!
  3378.  
  3379. velocity: anObject 
  3380.     velocity := anObject! !
  3381.  
  3382. Behavior comment:
  3383. 'Class Behavior is the abstract class which defines the minimum state necessary for objects that have instances, providing the basic information about those instances to the Compiler and the VM.
  3384.  
  3385. Instance Variables:
  3386.  
  3387.     superclass    <Behavior> object of the instance''''s superclass
  3388.     subclasses    <Array> of Behavior''s which are the subclasses of the instance
  3389.     methodDictionary    <MethodDictionary> mapping selector Symbols to CompiledMethods
  3390.     instanceSpec    <integer> containg flags which describe the "shape" of the instance (e.g. oops vs bytes)
  3391.  
  3392. Behavior defines a number of bit masks which are used to describe objects. These flags are stored in the pool dictionary,
  3393. _BehaviorMasks, for ease of sharing with the ClassBuilder and other tools::
  3394.     _BasicSpecMask         <integer> bit mask to extract the basic inst. spec (excludes extra spec word).
  3395.     _BytesSubMask         <integer> bit mask to extract inst. spec. bits relating exclusively to byte objects
  3396.     _FundamentalShapeMask     <integer> bit mask to extract the fundamental shape of instances from instance spec.
  3397.     _IndirectMask         <integer> bit mask to extract indirection (i.e. memory pointer) flag from inst. spec. flags
  3398.                 The indirection bit marks classes whose instances are indirect references to 
  3399.                 other objects/memory - e.g. ExternalAddresses. Such objects are automatically
  3400.                 dereferenced when passed to appropriate VM primitives.
  3401.     _MournerMask         <integer> bit mask to extract mourner flag from inst. spec. flags
  3402.                 The mourner bit marks classes who actively grieve for the loss of their constituents. 
  3403.                 Weak instances of such classes will be notified by the Undertaker process when 
  3404.                 they suffer bereavements during a GC. This notification is ''''off'''' by default because the
  3405.                 receipt of such a notifications will delay the death of its receiver, which may result in
  3406.                 significantly extended life for hierarchies of incestuously referencing weak objects.
  3407.     _NullTermMask         <integer> bit mask to extract null terminated flag from inst. spec. (byte objects only)
  3408.                 The null term. bit can be used to mark byte classes as having an implicit null terminator
  3409.                 (e.g. to represent C-style strings).
  3410.     _PointersMask         <integer> bit mask to extract the pointers/bytes flag from inst. spec.
  3411.                 The pointer bit marks classes whose instances contain pointers (as opposed to bytes).
  3412.     _ShapeMask         <integer> bit mask to extract the shape flags from inst. spec.
  3413.     _SizeMask             <Integer> bit mask to extract the number of named inst. vars. from inst. spec.
  3414.                 The size bits specify the number of named instance variables (0..255) in instances
  3415.                 of the receiver.
  3416.     _VariableMask        <integer> bit mask to extract the fixed/variable size flag from inst. spec.
  3417.                 The variable bit marks classes whose instances include indexable (unnamed) 
  3418.                 instance variables.
  3419.  
  3420. Behavior implements the ANSI protocols <Object>, <classDescription>, <instantiator>, and <Object class>.'!
  3421. !Behavior class methodsFor!
  3422.  
  3423. icon
  3424.     "Answers an Icon that can be used to represent this class."
  3425.  
  3426.     ^Class icon! !
  3427.  
  3428. !Behavior methodsFor!
  3429.  
  3430. addSelector: aSymbol withMethod: aCompiledMethod
  3431.     "Private - Add the message selector, aSymbol, with the corresponding
  3432.     CompiledMethod, to the receiver's method dictionary.
  3433.     Implementation Note: Clears down the VM method cache in case a previous 
  3434.     version of the method is cached, or it overrides a superclass method."
  3435.  
  3436.     | selector preexisting |
  3437.     selector := aSymbol asSymbol.
  3438.     aCompiledMethod
  3439.         methodClass: self;
  3440.         selector: selector.
  3441.     methodDictionary at: selector put: aCompiledMethod.
  3442.  
  3443.     "One might expect to be able to trigger a #methodAdded: event here,
  3444.      to be symetrical with Behavior>>removeSelector:. However, the 
  3445.      method source is not yet set up (logged) so in fact we have to do
  3446.      this later."
  3447.     self flushMethodCache.!
  3448.  
  3449. addSubclass: aClass
  3450.     "Private - Include the argument, aClass, as a subclass of the receiver."
  3451.  
  3452.     | subs |
  3453.     aClass superclass == self
  3454.         ifFalse: [ ^self error: 'I am not ', aClass printString, 's superclass' ].
  3455.     subs := self subclasses.
  3456.     (subs identityIndexOf: aClass) == 0 ifTrue: [
  3457.         "Maintain the array in sorted order as saves sorting on access"
  3458.         subclasses := (subs asSortedCollection add: aClass; yourself) asArray]!
  3459.  
  3460. addToSuper
  3461.     "Private - Add the receiver to its superclasses' subclass collection.
  3462.     Root classes will have a superclass of nil - we do not put such
  3463.     classes into a subclass collection."
  3464.  
  3465.     superclass notNil
  3466.         ifTrue: [superclass addSubclass: self]!
  3467.  
  3468. allClassVarNames
  3469.     "Answer a <Set> of the <readableString> names of the receiver's and the 
  3470.     receiver's superclasses' class variables."
  3471.  
  3472.     | answer |
  3473.     answer := Set new.
  3474.     self withAllSuperclassesDo: [:c | answer addAll: c classVarNames].
  3475.     ^answer!
  3476.  
  3477. allInstances
  3478.     "Answer an <Array> of all direct instances of the receiver."
  3479.  
  3480.     MemoryManager current collectGarbage.
  3481.     ^self primAllInstances!
  3482.  
  3483. allInstVarNames
  3484.     "Answer an <Array> of the <readableString> names of the receiver's instance variables, 
  3485.     those specified in the receiver and in all of its superclasses. The array ordering is the order 
  3486.     in which the variables are stored and accessed by the interpreter."
  3487.  
  3488.     | answer |
  3489.     answer := self instVarNames.
  3490.     self allSuperclassesDo: [:c | answer := c instVarNames , answer].
  3491.     ^answer!
  3492.  
  3493. allSelectors
  3494.     "Answer a <Set> of <Symbol>s, being all the message selectors to which the receiver 
  3495.     is able to respond (this includes messages understood by superclasses)."
  3496.  
  3497.     | answer |
  3498.     answer := IdentitySet new.
  3499.     self withAllSuperclassesDo: [:each | answer addAll: each selectors].
  3500.     ^answer!
  3501.  
  3502. allSharedPoolNames
  3503.     "Answer a Set of the names of the pools (dictionaries) that are specified in the receiver 
  3504.     in the receiver and each of its superclasses"
  3505.  
  3506.     | answer |
  3507.     answer := Set new.
  3508.     self withAllSuperclassesDo: [ :c | answer addAll: c sharedPoolNames ].
  3509.     ^answer!
  3510.  
  3511. allSharedPools
  3512.     "Answer a Set of the pools (dictionaries) that are specified in the receiver in the receiver 
  3513.     and each of its superclasses"
  3514.  
  3515.     | answer |
  3516.     answer := Set new.
  3517.     self withAllSuperclassesDo: [:c | answer addAll: c sharedPools].
  3518.     ^answer!
  3519.  
  3520. allSubclasses
  3521.     "Answer a <collection> of the receiver's subclasses in 
  3522.     breadth-first order, with the immediate subclasses first. 
  3523.     Breadth-first traversal is slightly less efficient, but results 
  3524.     in a more useful ordering (the standard does not specify the order). 
  3525.  
  3526.     N.B. The original Smalltalk-80 definition specified that this 
  3527.     method should answer a Set, and the draft ANSI standard specifies
  3528.     only <collection>. The defacto standard (e.g. See IBM 
  3529.     Common Base) is now an OrderedCollection, and we follow suit as this
  3530.     maintains the ordering, which is often useful."
  3531.  
  3532.     | answer |
  3533.     answer := OrderedCollection new.
  3534.     self allSubclassesBreadthFirstDo: [:each | answer add: each].
  3535.     ^answer!
  3536.  
  3537. allSubclassesBreadthFirstDo: aMonadicValuable
  3538.     "Evaluate the monadic valuable argument with each of the receiver's 
  3539.     subclasses in breadth-first order. The standard #allSubclassesDo: method 
  3540.     performs a depth-first traversal (which is quicker)."
  3541.  
  3542.     | classes |
  3543.     (classes := self subclasses) isNil 
  3544.         ifFalse: 
  3545.             [classes do: [:each | aMonadicValuable value: each].
  3546.             classes do: [:each | each allSubclassesBreadthFirstDo: aMonadicValuable]]!
  3547.  
  3548. allSubclassesDo: aMonadicValuable
  3549.     "Private - Evaluate the monadic valuable argument for each of the 
  3550.     receiver's subclasses using a pre-order depth first traversal."
  3551.  
  3552.     self allSubclassesPreOrderDo: aMonadicValuable!
  3553.  
  3554. allSubclassesEndOrderDo: aMonadicValuable
  3555.     "Private - Evaluate the monadic valuable argument for each 
  3556.     of the receiver's subclasses, visiting the receiver AFTER its
  3557.     subclasses (i.e. an end-order traversal)."
  3558.  
  3559.     subclasses isNil 
  3560.         ifFalse: 
  3561.             [subclasses do: 
  3562.                     [:each | 
  3563.                     each allSubclassesEndOrderDo: aMonadicValuable.
  3564.                     aMonadicValuable value: each]]!
  3565.  
  3566. allSubclassesPreOrderDo: aMonadicValuable
  3567.     "Private - Evaluate the monadic valuable argument for each 
  3568.     of the receiver's subclasses, visiting the receiver before its
  3569.     subclasses (i.e. a pre-order traversal)."
  3570.  
  3571.     subclasses isNil 
  3572.         ifFalse: 
  3573.             [subclasses do: 
  3574.                     [:each | 
  3575.                     aMonadicValuable value: each.
  3576.                     each allSubclassesPreOrderDo: aMonadicValuable]]!
  3577.  
  3578. allSubinstances
  3579.     "Answer an <Array> containing all instances of the receiver and its subclasses."
  3580.  
  3581.     MemoryManager current collectGarbage.
  3582.     ^self primAllSubinstances!
  3583.  
  3584. allSuperclasses
  3585.     "Answer a <collection> of the receiver's superclass and the receiver's ancestor's 
  3586.     superclasses. The first element is the receiver's immediate superclass, followed by its
  3587.     superclass, and so on; the last element is always Object.
  3588.  
  3589.     Note that we actually return a <sequencedReadableCollection> but that sequenceability
  3590.     cannot be relied upon in portable code because the ANSI standard specifies
  3591.     only <collection>."
  3592.  
  3593.     | answer |
  3594.     answer := OrderedCollection new.
  3595.     self allSuperclassesDo: [:each | answer addLast: each].
  3596.     ^answer!
  3597.  
  3598. allSuperclassesDo: aMonadicValuable
  3599.     "Private - Evaluate the monadic valuable argument for each of the receiver's 
  3600.     superclasses."
  3601.  
  3602.     | class current |
  3603.     class := self.
  3604.     
  3605.     [current := class superclass.
  3606.     class := current.
  3607.     current isNil] 
  3608.             whileFalse: [aMonadicValuable value: current]!
  3609.  
  3610. basicCompile: aString
  3611.     "Private - Compile the argument, code, and enter the result in the receiver's method dictionary. 
  3612.     If a compile error occurs a CompilerNotification is signalled. Answers a new method or nil.
  3613.     Note that this method doesn't generate a #methodAdded: trigger, and doesn't do anything
  3614.     with categories."
  3615.  
  3616.     | result method stubMethod error |
  3617.     
  3618.     [result := self compilerClass 
  3619.                 compile: aString
  3620.                 in: self
  3621.                 flags: 0] 
  3622.             on: CompilerErrorNotification
  3623.             do: 
  3624.                 [:n | 
  3625.                 error := n.
  3626.                 stubMethod := (MethodCompileFailed with: n) signal: n description.
  3627.                 n pass].
  3628.     error notNil ifTrue: [result := stubMethod].
  3629.     result notNil 
  3630.         ifTrue: 
  3631.             [| selector |
  3632.             method := result method.
  3633.             selector := method selector asSymbol.
  3634.             result oldMethod: (methodDictionary at: selector ifAbsent: []).
  3635.             self addSelector: selector withMethod: method.
  3636.             method storeSourceString: aString asString].
  3637.     ^result!
  3638.  
  3639. basicNew
  3640.     "Private - As #new, but must not be overridden by subclasses."
  3641.  
  3642.     <primitive: 70>
  3643.     self isVariable ifTrue: [^self basicNew: 0].
  3644.     ^self primitiveFailed!
  3645.  
  3646. basicNew: aSmallInteger
  3647.     "Private - As #new:, but must not be overridden by subclasses."
  3648.  
  3649.     <primitive: 71>
  3650.     self isFixed ifTrue: [^Error notIndexable: self].
  3651.     ^self primitiveFailed!
  3652.  
  3653. bindingFor: aString 
  3654.     "Answer a variable binding for the named variable in the scope of this class. 
  3655.     If there is no such variable, then answer nil."
  3656.  
  3657.     ^superclass bindingFor: aString!
  3658.  
  3659. canUnderstand: aSymbol
  3660.     "Answer whether the receiver can respond to the message whose selector is the argument, aSymbol.
  3661.     The selector can be in the method dictionary of the receiver's class of any of its superclasses."
  3662.  
  3663.     ^(self lookupMethod: aSymbol) notNil!
  3664.  
  3665. changedMethods
  3666.     "Private - Answer a <collection> of all the changed methods in the receiver."
  3667.  
  3668.     ^self methodDictionary select: [:method | method hasChanged]!
  3669.  
  3670. classVarNames
  3671.     "Answer a <Set> of <String>s, being the class variable names of the receiver."
  3672.  
  3673.     ^self subclassResponsibility!
  3674.  
  3675. compile: code
  3676.     "Compile the argument, code, and enter the result in the receiver's method dictionary. 
  3677.     If a compile error occurs a CompilerNotification is signalled. Answers a new method or nil.
  3678.     If the method is successfully compiled, then trigger a #methodAdded: event."
  3679.  
  3680.     | method result |
  3681.     result := self basicCompile: code.
  3682.     result notNil 
  3683.         ifTrue: 
  3684.             [method := result method.
  3685.             self storeCategoriesOfMethod: method.
  3686.             result fireSystemUpdateEvent].
  3687.     ^method!
  3688.  
  3689. compileAll
  3690.     "Compile all the methods for which the receiver has selectors. We install stub methods for all
  3691.     compilation failures"
  3692.  
  3693.     [self selectors do: [:each | self recompile: each]] 
  3694.         on: MethodCompileFailed
  3695.         do: 
  3696.             [:ex | 
  3697.             "If we get a method compilation error then we install 
  3698.             a stub method so we'll be able to see the source."
  3699.  
  3700.             ex
  3701.                 beep;
  3702.                 resumeWithStubMethod]!
  3703.  
  3704. compileAllSubclasses
  3705.     "Compile all the methods in the receiver's subclasses' method dictionaries."
  3706.  
  3707.     self allSubclassesDo: [:each | each compileAll]!
  3708.  
  3709. compiledMethodAt: aSymbol
  3710.     "Answer the compiled method associated with the selector argument, aSymbol, in 
  3711.     the receiver's local method dictionary. Report an error if the selector cannot be found."
  3712.  
  3713.     ^methodDictionary at: aSymbol!
  3714.  
  3715. compiledMethodAt: aSymbol ifAbsent: aNiladicValuable
  3716.     "Answer the compiled method associated with the selector argument, aSymbol, in 
  3717.     the receiver's local method dictionary, or the result of evaluating the niladic
  3718.     valuable argument if the selector can not be found."
  3719.  
  3720.     ^methodDictionary at: aSymbol ifAbsent: aNiladicValuable!
  3721.  
  3722. compilerClass
  3723.     "Answer the default Compiler class to use for compiling methods, etc, of the
  3724.     receiver."
  3725.  
  3726.     ^Compiler!
  3727.  
  3728. decompile: aSymbol
  3729.     "Find the compiled code associated with the selector argument, aSymbol, and decompile it. 
  3730.     Answer the resulting source code as a <readableString>. If the selector is not in the method 
  3731.     dictionary, report an error."
  3732.  
  3733.     | method source |
  3734.     method := self compiledMethodAt: aSymbol.
  3735.     source := method getSource.
  3736.     source isNil 
  3737.         ifTrue: 
  3738.             [^self error: 'decompiler can''t decompile methods without source (yet)']
  3739.         ifFalse: [^source]!
  3740.  
  3741. definitionOf: aSymbol
  3742.     "Answer the compiled method associated with the selector argument, aSymbol, in 
  3743.     the receiver's method dictionary, or that of its superclass, etc. Report an error if the 
  3744.     selector is not understood by the receiver."
  3745.  
  3746.     self withAllSuperclassesDo: 
  3747.             [:each | 
  3748.             (each includesSelector: aSymbol) ifTrue: [^each compiledMethodAt: aSymbol]].
  3749.     ^self errorNotFound: aSymbol!
  3750.  
  3751. environment
  3752.     "Answer the receiver's name space."
  3753.  
  3754.     ^Smalltalk!
  3755.  
  3756. extraInstanceSpec
  3757.     "Private - Answer the user class instance specification of the receiver (a 16-Bit Integer)."
  3758.  
  3759.     <primitive: 151>
  3760.     ^(self instanceSpec bitShift: -15) bitAnd: 16rFFFF!
  3761.  
  3762. extraInstanceSpec: aSmallInteger
  3763.     "Private - Set the user class instance specification of the receiver to the <SmallInteger> argument."
  3764.  
  3765.     self instanceSpec: ((aSmallInteger lowWord bitShift: 15) 
  3766.                 maskSet: (self instanceSpec bitAnd: _BasicSpecMask))!
  3767.  
  3768. flushMethodCache
  3769.     "Private - Ask the VM to completely flush its method cache. The primitive should not fail."
  3770.  
  3771.     <primitive: 89>
  3772.     ^self primitiveFailed!
  3773.  
  3774. fullBindingFor: aString
  3775.     "Answer a variable binding for the named variable in the scope of this class, and
  3776.     failing that in the receiver's environment. If there is no such variable, then answer nil."
  3777.  
  3778.     | var |
  3779.     ^(var := self bindingFor: aString) isNil 
  3780.         ifTrue: [self environment bindingFor: aString]
  3781.         ifFalse: [var]!
  3782.  
  3783. hasCompilationFailures
  3784.     "Answer whether any of the methods in the receiver or any of its subclasses have previously failed to compile."
  3785.  
  3786.     ^(self methodDictionary anySatisfy: [:each | each isCompilationFailure])
  3787.         or: [self subclasses anySatisfy: [:each | each hasCompilationFailures]]!
  3788.  
  3789. hasImmediateInstances
  3790.     "Answer whether the receiver's instances are immutable objects encoded entirely 
  3791.     in an Oop (e.g. SmallIntegers).
  3792.     Implementation Note: Included for compatibility with VisualWorks."
  3793.  
  3794.     ^false!
  3795.  
  3796. hasMethods
  3797.     "Answer whether the receiver has any methods in its local method dictionary."
  3798.  
  3799.     ^methodDictionary size ~= 0
  3800. !
  3801.  
  3802. includesBehavior: aBehavior
  3803.     "Answer whether the receiver includes the behavior, aBehavior
  3804.     (i.e. is aBehavior the receiver or a superclass of the receiver)."
  3805.  
  3806.     ^self == aBehavior or: [superclass includesBehavior: aBehavior]
  3807. !
  3808.  
  3809. includesSelector: aSymbol
  3810.     "Answer whether the local method dictionary contains a method whose
  3811.     selector is the argument, aSymbol."
  3812.  
  3813.     ^methodDictionary includesKey: aSymbol!
  3814.  
  3815. inheritsFrom: aClass
  3816.     "Answer whether the receiver is a subclass of aClass.
  3817.     This is the same as #includesBehavior:, but starts from the
  3818.     superclass of the receiver."
  3819.  
  3820.     ^superclass includesBehavior: aClass!
  3821.  
  3822. instanceCount
  3823.     "Answer the number of instances of the receiver that currently exist.
  3824.     This is a rather expensive method, but it is an original Smalltalk-80 method
  3825.     and thus remains. Don't use it in application code though!!"
  3826.  
  3827.     ^self allInstances size!
  3828.  
  3829. instanceSpec
  3830.     "Private - Answer the instance specification (shape of instances) of the receiver.
  3831.     This may also contain various 'user' specific bits which do not necessarily relate
  3832.     to the immediate shape of the class' instances."
  3833.  
  3834.     ^instanceSpec!
  3835.  
  3836. instanceSpec: anInteger
  3837.     "Private - Set the instance specification of the receiver to anInteger. 
  3838.     WARNING: Improper use of this method may cause the VM to behave unexpectedly"
  3839.  
  3840.     instanceSpec := anInteger!
  3841.  
  3842. instSize
  3843.     "Answer the number of fixed fields (named instance variables) in instances of the receiver."
  3844.  
  3845.     ^self instanceSpec bitAnd: _SizeMask!
  3846.  
  3847. instSize: anInteger
  3848.     "Private - Set the fixed size of instances of the receiver to anInteger.
  3849.     WARNING: Improper use of this method could cause the VM to behave unexpectedly"
  3850.  
  3851.     self instanceSpec: self instanceSpec - self instSize + (anInteger bitAnd: _SizeMask)
  3852.     !
  3853.  
  3854. isBits
  3855.     "Answer whether the variables of instances of the receiver contain bits (i.e. not object pointers)."
  3856.  
  3857.     ^self isPointers not!
  3858.  
  3859. isBytes
  3860.     "Answer whether the variables of instances of the receiver are stored as bytes (8-bit integers)."
  3861.  
  3862.     ^self isPointers not!
  3863.  
  3864. isFixed
  3865.     "Answer whether instances of the receiver are NOT indexable (i.e. they contain only a 
  3866.     specified set of named instance variables)."
  3867.  
  3868.     ^self isVariable not!
  3869.  
  3870. isIndirection
  3871.     "Answer true if the instances of the receiver are actually indirect references to other 
  3872.     objects. In the case of Byte objects this means that they contain the address of an external 
  3873.     or internal object. Objects of indirection classes, such as ExternalAddress, behave differently 
  3874.     when passed to certain system primitives (e.g. byte replacement primitives)."
  3875.  
  3876.     ^self instanceSpec anyMask: _IndirectMask!
  3877.  
  3878. isIndirection: aBoolean
  3879.     "Private - Set/reset the receivers status as an indirect reference (i.e. an
  3880.     address/pointer) to some other object (internal or external)."
  3881.  
  3882.     self setShapeFlags: _IndirectMask to: aBoolean!
  3883.  
  3884. isMeta
  3885.     "Answer whether the receiver is a <Metaclass>."
  3886.  
  3887.     ^false!
  3888.  
  3889. isMourner
  3890.     "Answer whether instances of the receiver like to grieve 
  3891.     for the loss of their constituents."
  3892.  
  3893.     ^self instanceSpec anyMask: _MournerMask!
  3894.  
  3895. isNullTerminated
  3896.     "Answer true if the instances of the receiver are Null Terminated (that is they include 
  3897.     an extra byte with the value zero at their end, which is not included in the reported size). 
  3898.     Only meaningful for variable byte classes (e.g. String)."
  3899.  
  3900.     ^self instanceSpec allMask: _NullTermMask!
  3901.  
  3902. isNullTerminated: aBoolean
  3903.     "Set the receivers status as a class of Null Terminated objects
  3904.     (i.e. its instances have an additional byte, not included in the reported size, 
  3905.     which is always zero). Only meaningful for variable byte classes"
  3906.  
  3907.     self setSpecialBehavior: _NullTermMask to: aBoolean!
  3908.  
  3909. isPointers
  3910.     "Answer whether the variables of instances of the receiver contain object pointers (as
  3911.     opposed to uninterpreted bytes)."
  3912.  
  3913.     ^self instanceSpec anyMask: _PointersMask!
  3914.  
  3915. isVariable
  3916.     "Answer whether instances of the receiver can have indexed instance variables."
  3917.  
  3918.     ^self instanceSpec anyMask: _VariableMask!
  3919.  
  3920. isWords
  3921.     "Answer whether the variables of instances of the receiver are stored as words."
  3922.  
  3923.     "OBSOLETE"
  3924.  
  3925.     ^false!
  3926.  
  3927. kindOfSubclass
  3928.     "Private - Answer a string describing the kind of subclassing method used to create the receiver 
  3929.     (part of its definition)."
  3930.  
  3931.     ^self isVariable 
  3932.         ifTrue: 
  3933.             [self isBytes 
  3934.                 ifTrue: ['variableByteSubclass: ']
  3935.                 ifFalse: ['variableSubclass: ']]
  3936.         ifFalse: ['subclass: ']!
  3937.  
  3938. lookupMethod: aSymbol
  3939.     "Answer the method of the receiver, or inherited by the receiver, corresponding
  3940.     to the selector, aSymbol."
  3941.  
  3942.     <primitive: 148>
  3943.     ^self primitiveFailed!
  3944.  
  3945. makeIndirect
  3946.     #deprecated.
  3947.     self isIndirection: true!
  3948.  
  3949. makeMourner
  3950.     "Private - Set the receivers status as an mourner. This only affects the
  3951.     weak instances of such classes, which will receive a #elementsExpired:
  3952.     message from the Undertaker process soon after they have suffered the loss
  3953.     of an object they are weakly referencing. This gives the mourner the opportunity
  3954.     to put its house in order. By default this behaviour is disabled, as its use
  3955.     can extend the life of an object (a weak object which would otherwise be
  3956.     garbage collected has to be rescued in order that it can perform its
  3957.     mourning process, as the mourning process may be important for releasing
  3958.     external resources, etc."
  3959.  
  3960.     self setShapeFlags: _MournerMask to: true!
  3961.  
  3962. makeNullTerminated
  3963.     #deprecated.
  3964.     self isNullTerminated: true!
  3965.  
  3966. methodDictionary
  3967.     "Private - Answer the receiver's <MethodDictionary>."
  3968.  
  3969.     ^methodDictionary!
  3970.  
  3971. methodDictionary: aMethodDictionary
  3972.     "Private - Store the <MethodDictionary> argument as the method dictionary of the receiver.
  3973.     Incorrect use of this method (e.g. with an argument which is not a <MethodDictionary>)
  3974.     can cause unexpected behavior of the VM)."
  3975.  
  3976.     methodDictionary := aMethodDictionary!
  3977.  
  3978. name
  3979.     "Answer a <readableString> that is the name of the receiver."
  3980.  
  3981.     ^self subclassResponsibility!
  3982.  
  3983. new
  3984.     "Answer an instance of the receiver with no indexed variables. Send the receiver the 
  3985.     message {new: 0} if the receiver is indexable.
  3986.  
  3987.     This is the fundamental method by which new class instances are created. It is inherited
  3988.     by class objects (Metaclass instance instances) through the route:
  3989.         MyClass class -> MyClass class superclass -> ... 
  3990.             -> Object class -> Class -> ClassDescription -> Behavior
  3991.  
  3992.     Primitive failure reasons:
  3993.         0 -    The receiver is an indexable class, and requires a size."
  3994.  
  3995.     <primitive: 70>
  3996.     self isVariable ifTrue: [^self new: 0].
  3997.     ^self primitiveFailed!
  3998.  
  3999. new: aSmallInteger
  4000.     "Answer an instance of the receiver with the specified number of indexed instance variables.
  4001.     Report an error if the receiver is not indexable, or the argument is invalid.
  4002.  
  4003.     This is the fundamental method by which new instances of indexable classes are are created.
  4004.     It is inherited by class objects (Metaclass instance instances) through the route:
  4005.         MyClass class -> MyClass class superclass -> ... 
  4006.             -> Object class -> Class -> ClassDescription -> Behavior
  4007.  
  4008.     Primitive failure reasons:
  4009.         0 - the argument is not a <SmallInteger>.
  4010.         1 - the argument is negative
  4011.         2 - the receiver's instances are not indexable."
  4012.  
  4013.     <primitive: 71>
  4014.     self isFixed ifTrue: [^Error notIndexable: self].
  4015.     ^self primitiveFailed!
  4016.  
  4017. new: numSmallInteger max: maxSmallInteger
  4018.     "Private - Answer an instance of the receiver with numSmallInteger indexed instance variables, 
  4019.     which can grow to accommodate maxSmallInteger. Report an error if the receiver is not indexable
  4020.     or the arguments are invalid.
  4021.  
  4022.     Primitive failure reasons:
  4023.         0 -    numSmallInteger is not a <SmallInteger> or is negative.
  4024.         1 -    maxSmallInteger is not <SmallInteger> or is negative.
  4025.         2 -    the receiver's instances are not indexable."
  4026.  
  4027.     <primitive: 90>
  4028.     self isFixed ifTrue: [^Error notIndexable: self].
  4029.     ^self primitiveFailed!
  4030.  
  4031. newFixed: aSmallInteger
  4032.     "Answer an instance of the receiver of size aSmallInteger bytes (this method is 
  4033.     only valid for byte objects). The object is allocated from the fixed memory heap
  4034.     and will not move in memory (objects allocated with primitive 71 are free to 
  4035.     move to assist garbage collection, whereas those allocated with primitive 76 
  4036.     are in a traditional fixed heap)."
  4037.  
  4038.     <primitive: 76>
  4039.     ^self primitiveFailed!
  4040.  
  4041. parseTreeFor: aSymbol 
  4042.     ^SmalltalkParser parseMethod: (self sourceCodeAt: aSymbol)
  4043.         in: self
  4044.         onError: [:aString :pos | ^nil]!
  4045.  
  4046. primAllInstances
  4047.     "Private - Answer an <Array> of all the instances of the receiver which currently exist in the system. 
  4048.     This may include currently unreferenced objects, unless a full garbage collection has just been 
  4049.     performed - for this reason use #allInstances in preference if speed is not an issue.
  4050.     The primitive should not fail."
  4051.  
  4052.     <primitive: 77>
  4053.     ^self primitiveFailed!
  4054.  
  4055. primAllSubinstances
  4056.     "Private - Answer an <Array> of all the instances of the receiver and its subclasses
  4057.     which currently exist in the system. This may include currently unreferenced objects, 
  4058.     unless a full garbage collection has just been performed - for this reason use 
  4059.     #allSubinstances in preference if speed is not an issue.
  4060.     The primitive should not fail."
  4061.  
  4062.     <primitive: 58>
  4063.     ^self primitiveFailed!
  4064.  
  4065. recompile: aSelector
  4066.     "Compile the method associated with the message selector, selector.
  4067.     The method is not logged to the change log but the source is re-used
  4068.     from the original"
  4069.  
  4070.     | oldMethod method stubMethod result error |
  4071.     oldMethod := self compiledMethodAt: aSelector.
  4072.     oldMethod isNil ifTrue: [^self].
  4073.     
  4074.     [result := self compilerClass 
  4075.                 compile: oldMethod getSource
  4076.                 in: self
  4077.                 flags: 0] 
  4078.             on: CompilerErrorNotification
  4079.             do: 
  4080.                 [:ex | 
  4081.                 error := ex.
  4082.                 stubMethod := (MethodCompileFailed with: ex) signal: ex description.
  4083.                 ex pass].
  4084.  
  4085.     "Was a stub method installed?"
  4086.     stubMethod notNil ifTrue: [result := stubMethod].
  4087.     (result notNil and: [(method := result method) notNil]) 
  4088.         ifTrue: 
  4089.             ["Add the selector and copy across the old source descriptor and privacy, as we haven't don't want to change either"
  4090.  
  4091.             method selector: aSelector.
  4092.             self addSelector: aSelector withMethod: method.
  4093.             method
  4094.                 sourceDescriptor: oldMethod sourceDescriptor;
  4095.                 isPrivate: oldMethod isPrivate
  4096.             "The method has changed not actually changed, so it is inappropriate to issue a #methodUpdated: event"]!
  4097.  
  4098. recompileAll
  4099.     "Recompile this class and all its subclasses. The methods are not logged to the change log,
  4100.      but the sources are re-used from the originals"
  4101.  
  4102.     self withAllSubclassesDo: 
  4103.             [:each | 
  4104.             each class compileAll.
  4105.             each compileAll]!
  4106.  
  4107. removeFromSuper
  4108.     "Private - Remove the receiver from its superclasses' subclass collection.
  4109.     Root classes will have a superclass of nil - we do not put such
  4110.     classes into any subclass collection."
  4111.  
  4112.     superclass notNil ifTrue: [superclass removeSubclass: self]!
  4113.  
  4114. removeFromSystem
  4115.     "Private - Remove the receiver from the system (completely remove a class)."
  4116.  
  4117.     ClassBuilder removeClass: self!
  4118.  
  4119. removeSelector: selector
  4120.     "Remove the argument, selector (which is a Symbol representing a message selector), 
  4121.     from the receiver's message dictionary."
  4122.  
  4123.     ^self removeSelector: selector ifAbsent: [self errorNotFound: selector]!
  4124.  
  4125. removeSelector: aSymbol ifAbsent: aNiladicValuable
  4126.     "Remove the the method with the selector specified by the argument, aSymbol, 
  4127.     from the receiver's message dictionary. Answer the <CompiledMethod> that
  4128.     as removed, or, if the selector is not in the method dictionary, the result of evaluating 
  4129.     the niladic valuable argument.
  4130.     Implementation Note: Flush the VM method cache in case the method is cached. 
  4131.     The #methodRemoved: event is triggered to inform interested parties."
  4132.  
  4133.     | method |
  4134.     method := methodDictionary removeKey: aSymbol
  4135.                 ifAbsent: [^aNiladicValuable value].
  4136.     self flushMethodCache.
  4137.     self environment trigger: #methodRemoved: with: method.
  4138.     ^method!
  4139.  
  4140. removeSelectors: aCollection
  4141.     "Remove each of the <Symbol> selectors in the <collection> argument from the 
  4142.     receiver's message dictionary. If any of the selectors are not present, they are 
  4143.     simply ignored. Answer a <collection> of the <CompiledMethod>s which were actually
  4144.     removed."
  4145.  
  4146.     | methods env |
  4147.  
  4148.     "Take advantage of the fact that Sets ignores requests to add nil"
  4149.     methods := aCollection asSet 
  4150.                 collect: [:each | methodDictionary removeKey: each ifAbsent: []].
  4151.     self flushMethodCache.
  4152.     env := self environment.
  4153.     methods do: [:each | env trigger: #methodRemoved: with: each].
  4154.     ^methods!
  4155.  
  4156. removeSubclass: aClass
  4157.     "Private - Remove the argument, aClass, from the subclasses of the receiver.
  4158.     WARNING: This method does not completely remove a class from the system."
  4159.  
  4160.     subclasses isNil ifFalse: [
  4161.         (subclasses := subclasses copyWithout: aClass) isEmpty
  4162.             ifTrue: [ subclasses := nil ]]!
  4163.  
  4164. requiresInstallation
  4165.     "Answer whether the receiver requires 'installing' into its environment."
  4166.  
  4167.     ^false!
  4168.  
  4169. scopeHas: name ifTrue: operation
  4170.     "Answer whether name is in scope in the receiver.
  4171.     Compiler support. Not yet implemented."
  4172.  
  4173.     ^Error notYetImplemented
  4174. !
  4175.  
  4176. selectMethods: aMonadicValuable
  4177.     "Private - Answer a <Set> of the <CompiledMethod>s of the receiver 
  4178.     for which the monadic valuable, discriminator, evaluates to true."
  4179.  
  4180.     | answer |
  4181.     answer := IdentitySet new: 25.
  4182.     self methodDictionary 
  4183.         do: [:each | (aMonadicValuable value: each) ifTrue: [answer add: each]].
  4184.     ^answer!
  4185.  
  4186. selectors
  4187.     "Answer a <Set> of <Symbol>s, being all the selectors of all the methods
  4188.     in the receiver."
  4189.  
  4190.     ^methodDictionary keys
  4191. !
  4192.  
  4193. setShapeFlags: anIntegerMask to: aBoolean
  4194.     "Private - Set/Reset the receivers shape/structure flags (as defined by anIntegerMask)
  4195.     according to the argument aBoolean."
  4196.  
  4197.     instanceSpec := instanceSpec mask: anIntegerMask set: aBoolean!
  4198.  
  4199. setSpecialBehavior: anIntegerMask to: aBoolean
  4200.     "Private - Set/Reset the receivers special behavior (as defined by anIntegerMask)
  4201.     according to the argument aBoolean. Only meaningful for variable byte classes"
  4202.  
  4203.     self isBytes 
  4204.         ifTrue: [self setShapeFlags: anIntegerMask to: aBoolean]
  4205.         ifFalse: [self error: 'Must be byte class']!
  4206.  
  4207. setSuperclass: aClass
  4208.     "Private - Set the superclass of the receiver to aClass, maintaining the hierarchy
  4209.     as necessary. This is the correct way to set the superclass of a Behavior"
  4210.  
  4211.     self superclass == aClass ifTrue: [^self].
  4212.     self
  4213.         removeFromSuper;
  4214.         superclass: aClass;
  4215.         addToSuper!
  4216.  
  4217. shallowCopy
  4218.     "Answer a copy of the receiver which shares the receiver's instance 
  4219.     variables. 
  4220.     Implementation Note: Behaviors are unique and cannot be copied."
  4221.  
  4222.     ^self!
  4223.  
  4224. sharedPools
  4225.     "Answer a <Set> of <Symbol>s, being the names of the pools (dictionaries) that are
  4226.     specified locally in the receiver."
  4227.  
  4228.     ^self subclassResponsibility!
  4229.  
  4230. sharedStaticPools
  4231.     "Private - Answer an <Array> of all the shared pools for the receiver (including those
  4232.     inherited from superclasses). Used by compiler, but may be removed in future."
  4233.  
  4234.     ^self subclassResponsibility
  4235. !
  4236.  
  4237. sourceCodeAt: aSymbol
  4238.     "Answer a <String> that is the source code of the receiver's method with selector, aSymbol.
  4239.     Report an error if the selector cannot be found."
  4240.  
  4241.     ^(self compiledMethodAt: aSymbol) getSource!
  4242.  
  4243. storeCategoriesOfMethod: aCompiledMethod
  4244.     "Do nothing - method categories are not supported at this level"
  4245.  
  4246.     !
  4247.  
  4248. subclasses
  4249.     "Answer a <collection> containing the receiver's immediate subclasses.
  4250.  
  4251.     Note that the answer is actually a <sequencedReadableCollection>, but that
  4252.     sequenceability should not be relied upon in portable code because the draft ANSI
  4253.     standard specifies only <collection>."
  4254.  
  4255.     ^subclasses isNil ifTrue: [Array new] ifFalse: [subclasses]!
  4256.  
  4257. subclasses: aCollection
  4258.     "Set the receivers subclasses to the specified collection.
  4259.     The subclasses are maintained as a sorted array, but leaf classes store nil to save space."
  4260.  
  4261.     subclasses := (aCollection notNil and: [aCollection notEmpty]) 
  4262.                 ifTrue: [aCollection asSortedCollection asArray]!
  4263.  
  4264. subclassInstVarNames
  4265.     "Answer a <Set> of the instance variable names specified in the receiver's subclasses"
  4266.  
  4267.     | answer |
  4268.     answer := Set new.
  4269.     self allSubclassesDo: [:each | answer addAll: each instVarNames].
  4270.     ^answer!
  4271.  
  4272. sunitAllSelectors
  4273.     ^self allSelectors asSortedCollection asOrderedCollection!
  4274.  
  4275. sunitSelectors
  4276.     ^self selectors asSortedCollection asOrderedCollection!
  4277.  
  4278. superclass
  4279.     "Answer a <classDescription> which is the receiver's immediate 
  4280.     superclass (or <nil> if none)."
  4281.  
  4282.     ^superclass!
  4283.  
  4284. superclass: aClass
  4285.     "Set the superclass of the receiver to be the argument, aClass"
  4286.  
  4287.     (aClass isNil or: [aClass isKindOf: Behavior]) 
  4288.         ifFalse: [self error: 'superclass must be a kind of Behavior'].
  4289.     superclass := aClass!
  4290.  
  4291. understoodSelectors
  4292.     "Answer a <Set> of all message selectors understood by the receiver, not including those understood because
  4293.     they are implemented in superclasses. This should however include those that are not in the method dictionary
  4294.     but will be understood as a result of #doesNotUnderstand: processing, if that is possible."
  4295.  
  4296.     ^self selectors!
  4297.  
  4298. whichClassDefinesClassVar: aString
  4299.     "Answer which <Class> in the receiver's inheritance chain, including the receiver,
  4300.     defines the named class variable."
  4301.  
  4302.     ^self whichClassSatisfies: [:each | each classVarNames includes: aString]!
  4303.  
  4304. whichClassIncludesSelector: selector
  4305.     "Answer the first class on the receiver's superclass chain (including the receiver) where 
  4306.     the argument, selector, can be founds as a message selector. Answer nil if no class includes
  4307.     the selector."
  4308.  
  4309.     ^(self includesSelector: selector) 
  4310.         ifTrue: [self]
  4311.         ifFalse: 
  4312.             [superclass notNil 
  4313.                 ifTrue: [superclass whichClassIncludesSelector: selector]]!
  4314.  
  4315. whichClassSatisfies: aBlock
  4316.     "Private - Recurse up through the receiver's inheritance chain, starting with the receiver,
  4317.     until the <monadicValuable> argument answers true when evaluated against the receiver."
  4318.  
  4319.     (aBlock value: self) ifTrue: [^self].
  4320.     ^superclass isNil ifFalse: [superclass whichClassSatisfies: aBlock]!
  4321.  
  4322. whichMethodsAccess: aString
  4323.     "Answer a <Set> of methods from the receiver's local method dictionary whose methods access 
  4324.     the instance variable of the receiver named by the argument."
  4325.  
  4326.     ^self whichMethodsAccess: aString
  4327.         at: (self allInstVarNames indexOf: aString)!
  4328.  
  4329. whichMethodsAccess: aString at: anInteger
  4330.     "Private - Answer a <Set> of selectors from the receiver's local method dictionary whose 
  4331.     methods access the instance variable with the specified index."
  4332.  
  4333.     ^self 
  4334.         selectMethods: [:method | method accessesInstVar: aString at: anInteger]!
  4335.  
  4336. whichMethodsAssign: aString
  4337.     "Answer a <collection> of <CompiledMethod>s that write to the instance variable
  4338.     named by the <readableString> argument."
  4339.  
  4340.     ^self whichMethodsAssign: aString
  4341.         at: (self allInstVarNames indexOf: aString)!
  4342.  
  4343. whichMethodsAssign: aString at: anInteger
  4344.     ^self 
  4345.         selectMethods: [:method | method writesInstVar: aString at: anInteger]!
  4346.  
  4347. whichMethodsContainSource: aString
  4348.     "Answer a <Set> of methods from the receiver's local method dictionary whose methods contain
  4349.     the specified source string."
  4350.  
  4351.     ^self selectMethods: [:method | method containsSource: aString]!
  4352.  
  4353. whichMethodsRead: aString
  4354.     "Answer a <collection> of <CompiledMethod>s that read the instance variable
  4355.     named by the <readableString> argument."
  4356.  
  4357.     ^self whichMethodsRead: aString at: (self allInstVarNames indexOf: aString)!
  4358.  
  4359. whichMethodsRead: aString at: anInteger
  4360.     ^self 
  4361.         selectMethods: [:method | method readsInstVar: aString at: anInteger]!
  4362.  
  4363. whichMethodsReferTo: anObject
  4364.     "Answer a <Set> of methods in the receiver whose literal frames include the argument, anObject."
  4365.  
  4366.     | index |
  4367.     index := VMLibrary default indexOfSpecialSelector: anObject ifAbsent: [0].
  4368.     ^self selectMethods: (index == 0 
  4369.                 ifTrue: [[:each | each refersToLiteral: anObject]]
  4370.                 ifFalse: 
  4371.                     [[:each | (each refersToLiteral: anObject) or: [each sendsSpecialSelector: index]]])!
  4372.  
  4373. whichSelectorsAccess: aString
  4374.     "Answer a <collection> of <Symbol>s, being the selectors of methods of the receiver
  4375.     that access the instance variable named by the <readableString> argument.
  4376.     N.B. Primarily present for Blue Book compatibility, and used by the Refactoring Browser.."
  4377.  
  4378.     ^(self whichMethodsAccess: aString) collect: [:each | each selector]!
  4379.  
  4380. whichSelectorsAssign: aString
  4381.     "Answer a <collection> of <Symbol>s, being the selectors of methods of the receiver
  4382.     that assign to the instance variable named by the <readableString> argument."
  4383.  
  4384.     ^(self whichMethodsAssign: aString) collect: [:each | each selector]!
  4385.  
  4386. whichSelectorsRead: aString
  4387.     "Answer a <collection> of <Symbol>s, being the selectors of methods of the receiver
  4388.     that read the instance variable named by the <readableString> argument."
  4389.  
  4390.     ^(self whichMethodsRead: aString) collect: [:each | each selector]!
  4391.  
  4392. whichSelectorsReferTo: anObject
  4393.     "Answer a Set of selectors whose methods access the argument, anObject.
  4394.     This is really only included for Blue Book compatibility."
  4395.  
  4396.     ^(self whichMethodsReferTo: anObject) collect: [:each | each selector]!
  4397.  
  4398. whichSelectorsWrite: aString
  4399.     "Answer a <Set> of selectors whose methods write to the instance variable
  4400.     named by the <readableString> argument."
  4401.  
  4402.     | index |
  4403.     index := self allInstVarNames indexOf: aString.
  4404.     ^(self selectMethods: [:each | each writesInstVar: aString at: index]) 
  4405.         collect: [:each | each selector]!
  4406.  
  4407. withAllSubclasses
  4408.     "Answer an <OrderedCollection> containing the receiver, and all of the receiver''s 
  4409.     subclasses in breadth-first order, with the immediate subclasses first."
  4410.  
  4411.     ^(self allSubclasses)
  4412.         addFirst: self;
  4413.         yourself!
  4414.  
  4415. withAllSubclassesDo: aMonadicValuable
  4416.     "Evaluate the monadic valuable argument for the receiver and each 
  4417.     of its subclasses using a depth-first traversal."
  4418.  
  4419.     aMonadicValuable value: self.
  4420.     self allSubclassesDo: aMonadicValuable!
  4421.  
  4422. withAllSuperclasses
  4423.     "Answer an <OrderedCollection> containing the receiver, and all of the receiver''s 
  4424.     superclasses in breadth-first order."
  4425.  
  4426.     ^(self allSuperclasses)
  4427.         addFirst: self;
  4428.         yourself!
  4429.  
  4430. withAllSuperclassesDo: aMonadicValuable
  4431.     "Evaluate the monadic valuable argument for the receiver and each 
  4432.     of its superclasses in reverse order of hierarchy."
  4433.  
  4434.     aMonadicValuable value: self.
  4435.     self allSuperclassesDo: aMonadicValuable! !
  4436.  
  4437. BlockClosure comment:
  4438. ''!
  4439. !BlockClosure class methodsFor!
  4440.  
  4441. icon
  4442.     "Answers an Icon that can be used to represent this class"
  4443.  
  4444.     ^##(self) defaultIcon! !
  4445.  
  4446. !BlockClosure methodsFor!
  4447.  
  4448. argumentCount
  4449.     "Answer the <integer> number of arguments expected by the receiver."
  4450.  
  4451.     ^argumentCount!
  4452.  
  4453. atPriority: anInteger
  4454.     "Evaluate the receiver at the specified priority. 
  4455.     On completion or curtailment the     active process' 
  4456.     priority is returned to its previous value."
  4457.  
  4458.     | activePriority proc |
  4459.     proc := Processor activeProcess.
  4460.     activePriority := proc priority: anInteger.
  4461.     ^self ensure: [proc priority: activePriority]!
  4462.  
  4463. critical
  4464.     "Private - Evaluate the receiver as a Critical Section with asynchronous process switching disabled.
  4465.     When asynchronous process switching is disabled, process pre-emption cannot occur because
  4466.     all interrupts and asynchronous Semaphore signals remain pending. If synchronous process
  4467.     synchronisation primitives are attempted (e.g. sending #signal or #wait to a Semaphore)
  4468.     then asynchronous process switching is automatically re-enabled, and any pending interrupts/
  4469.     asynchronous signals will get delivered.
  4470.  
  4471.     Use this VERY sparingly, and for very short durations, as this is a very broadbrush (though
  4472.     very high performance) approach to process synchronisation. It is an easy and high performance
  4473.     way to protect, for example, a shared data structure from being accessed by other processes
  4474.     while it is being modified, but it will prevent any other processes from executing unrelated
  4475.     code too. Also, it may not be available in a future multi-threaded VM.
  4476.     Synchronisation of access to shared data structures is best done by including a 
  4477.     mutual exclusion Semaphore or Mutex with the data structure (i.e. in the Object which manages the 
  4478.     data structure), and then using the #critical: method as here. 
  4479.     
  4480.     See the SharedQueue class for an example of the use of mutual exlusion semaphores, or SharedSet for
  4481.     and example of the use of a Mutex to guarantee mutually exclusive access.
  4482.  
  4483.     Implementation Note: We must use an #ensure: block to guarantee re-enabling of aysnc events, 
  4484.     because the receiver may perform a ^-return (should an exception occur then they will be 
  4485.     re-enabled anyway). This does mean it may be quicker to send #enableAsyncEvents: directly
  4486.     in some circumstances."
  4487.  
  4488.     | oldState |
  4489.     oldState := Processor enableAsyncEvents: false.
  4490.     [self value] ensure: [Processor enableAsyncEvents: oldState]!
  4491.  
  4492. deferredValue
  4493.     "Answer a <niladicValuable> that begins evaluating the receiver asynchronously,
  4494.     and which when evaluated will synchronously supply the result."
  4495.  
  4496.     ^self deferredValueAt: Processor activePriority!
  4497.  
  4498. deferredValueAt: priority
  4499.     "Answer a <niladicValuable> that begins evaluating the receiver asynchronously
  4500.     at the specified <Process> priority, and which when evaluated will synchronously 
  4501.     supply the result."
  4502.  
  4503.     ^DeferredValue evaluate: self at: priority!
  4504.  
  4505. ensure: terminationBlock
  4506.     "Evaluate the receiver, and regardless of the means by which it exits, 
  4507.     be it by normal or non-local (^) return, or by raising an exception, evaluate
  4508.     the <niladicBlock> argument, terminationBlock.
  4509.     Answers the result of evaluating the receiver, unless <terminationBlock>
  4510.     contains a non-local return, in which case the result of <terminationBlock> will be
  4511.     answered to its home contexts sender, e.g.:
  4512.  
  4513.         [^1. 2] ensure2: [Sound bell]            answers 1, but also woofs
  4514.         [^1. 2] ensure2: [Sound bell. 3]    woofs and answers 3.
  4515.         [1. 2] ensure2: [Sound bell. ^3]    ditto
  4516.         [1. 2] ensure2: [Sound bell. 3]            woofs and answers 2
  4517.  
  4518.     See also #ifCurtailed:"
  4519.  
  4520.     | answer |
  4521.     answer := self ifCurtailed: terminationBlock.
  4522.     terminationBlock value.
  4523.     ^answer!
  4524.  
  4525. fork
  4526.     "Create and schedule a new Process at the same priority as the current active process.
  4527.     The new Process will be placed on the end of the queue of processes of the same priority in 
  4528.     the Ready state (i.e. the current active process continues to run). Answer the new Process.
  4529.     The new Process will run when it gets its turn (i.e. when there are no higher
  4530.     priority processes in the Ready state, and the receiver is at the front of the
  4531.     queue of Ready Processes at its priority)."
  4532.  
  4533.     ^self newProcess resume!
  4534.  
  4535. forkAt: anInteger
  4536.     "Evaluate the receiver in a new process at the priority specified by the argument, anInteger. 
  4537.     If the new process is of a higher priority than the current active process then it will
  4538.     start running immediately. If of a lower priority, then it must wait until there are no
  4539.     higher priority processes Ready to run. If of the same priority, then it does not preempt
  4540.     the current active process. N.B. Do not rely on the latter behaviour, as it may change in
  4541.     a future release.
  4542.     Answer the new process."
  4543.  
  4544.     ^(self newProcess) 
  4545.         priority: anInteger;
  4546.         resume!
  4547.  
  4548. frameClass
  4549.     "Private - Answer the class of StackFrame to represent activations of the
  4550.     receiver."
  4551.  
  4552.     ^BlockFrame!
  4553.  
  4554. home
  4555.     "Private - Answer the home context of the context. In the case of the BlockClosure,
  4556.     this is the MethodContext which represented the CompiledMethod which
  4557.     created the Block. N.B. The home context (which is always a MethodContext)
  4558.     may have already returned, and only exists in order to provide a 'home'.
  4559.     A BlockClosure uses its home to reference the receiver, method, and 
  4560.     its temporaries."
  4561.  
  4562.     ^self outer!
  4563.  
  4564. ifCurtailed: terminationBlock
  4565.     "Evaluate the receiver, and should it exit via a non-local (^) return, or by raising an 
  4566.     exception, evaluate the <niladicBlock>, terminationBlock.
  4567.     Answers the result of evaluating the receiver, unless curtailed and the terminationBlock 
  4568.     contains a non-local return of its own, in which case the result of that block 
  4569.     will be answered to its home context's sender, e.g.:
  4570.  
  4571.         [^1] ifCurtailed: [Sound beep]            answers 1, but also woofs
  4572.         [^1] ifCurtailed: [Sound beep. ^2]        woofs and answers 2.
  4573.         [1] ifCurtailed: [Sound beep. ^2]        answers 1
  4574.  
  4575.     Be warned: The system may become unstable if this method is modified. The receiver is
  4576.     not the original receiver of the message after #valueOnUnwind: has been sent, but is
  4577.     valid inside the unwind block. In addition, #valueOnUnwind: leaves additional objects
  4578.     on the stack.
  4579.  
  4580.     See also #ensure:"
  4581.  
  4582.     | answer |
  4583.     answer := self valueOnUnwind: [:retValue :retFrame |
  4584.         terminationBlock value.
  4585.         Processor returnValue: retValue toFrame: retFrame].
  4586.     ^answer!
  4587.  
  4588. initialIP
  4589.     "Private - Answer the initial instruction pointer index into the home method, 
  4590.     used when the block receives a #value* message"
  4591.  
  4592.     ^initialIP!
  4593.  
  4594. initialIP: anInteger
  4595.     "Private - Set the initial instruction pointer index into the receiver's
  4596.     compiled byte codes (used when the block receives a #value* message)."
  4597.  
  4598.     initialIP := anInteger!
  4599.  
  4600. isClean
  4601.     "Private - Answer whether the receiver is a clean block, i.e. a block that refers only to its arguments, and which does
  4602.     not contain any ^-returns. This makes it a shareable object."
  4603.  
  4604.     "Implementation Note: D6 implements full block closures, including clean blocks, but D5 does not."
  4605.  
  4606.     ^false!
  4607.  
  4608. method
  4609.     "Private - Answer the method in which the receiver's code resides."
  4610.  
  4611.     ^method!
  4612.  
  4613. method: aCompiledMethod
  4614.     "Private - Set the method in which the receiver's code resides."
  4615.  
  4616.     method := aCompiledMethod!
  4617.  
  4618. millisecondsToRepeat: anInteger
  4619.     "Answer the time taken to execute the receiver anInteger times"
  4620.  
  4621.     ^Time millisecondsToRun: [ anInteger timesRepeat: [self value]]!
  4622.  
  4623. newProcess
  4624.     "Answer a new, suspended, Process which will evaluate the receiver, and terminate 
  4625.     when and if the code in the receiver returns. The default 'name' given to the process 
  4626.     is the originating CompiledMethod - this is useful for debugging because it 
  4627.     allows one to locate the source (e.g. Process name getSource) to determine 
  4628.     what the process is doing."
  4629.  
  4630.     ^(Process forContext: [ 
  4631.             self on: ProcessTermination do: [:e | e return].
  4632.             "^-return catches attempt to drop off bottom of process stack (which would cause a GPF)"
  4633.             ^Processor activeProcess shutdown]
  4634.         priority: Processor activePriority)
  4635.         name: self method;
  4636.         yourself
  4637. !
  4638.  
  4639. newProcessWithArguments: anArray
  4640.     "Answer a new process which will evaluate the receiver with arguments
  4641.     from anArray, then terminate"
  4642.  
  4643.     ^[self valueWithArguments: anArray] newProcess!
  4644.  
  4645. on: selector do: action
  4646.     "Try to evaluate the receiver, and should an exception occur which is matched
  4647.     by the <exceptionSelector>, selector, normally a class object which is a subclass 
  4648.     of Exception), evaluate the <monadicBlock>, action, passing it the exception 
  4649.     instance as its argument."
  4650.  
  4651.     ^(ExceptionHandler on: selector do: action) try: self!
  4652.  
  4653. on: selector1 do: action1 on: selector2 do: action2
  4654.     "Try to evaluate the receiver, and should an exception occur which is matched
  4655.     by any of the <exceptionSelector>s, selector1..selector2, then evaluate the 
  4656.     corresponding <monadicBlock>, actionN, passing it the exception instance as 
  4657.     its argument."
  4658.  
  4659.     ^self onDo: ((ExceptionHandlerSet new)
  4660.                 on: selector1 do: action1;
  4661.                 on: selector2 do: action2)!
  4662.  
  4663. on: selector1 do: action1 on: selector2 do: action2 on: selector3 do: action3
  4664.     "Try to evaluate the receiver, and should an exception occur which is matched
  4665.     by any of the <exceptionSelector>s, selector1..selector3, then evaluate the 
  4666.     corresponding <monadicBlock>, actionN, passing it the exception instance as 
  4667.     its argument."
  4668.  
  4669.     ^self onDo: ((ExceptionHandlerSet new)
  4670.                 on: selector1 do: action1;
  4671.                 on: selector2 do: action2;
  4672.                 on: selector3 do: action3)!
  4673.  
  4674. on: selector1 do: action1 on: selector2 do: action2 on: selector3 do: action3 on: selector4 do: action4
  4675.     "Try to evaluate the receiver, and should an exception occur which is matched
  4676.     by any of the <exceptionSelector>s, selector1..selector4, then evaluate the 
  4677.     corresponding <monadicBlock>, actionN, passing it the exception instance as 
  4678.     its argument."
  4679.  
  4680.     ^self onDo: ((ExceptionHandlerSet new)
  4681.                 on: selector1 do: action1;
  4682.                 on: selector2 do: action2;
  4683.                 on: selector3 do: action3;
  4684.                 on: selector4 do: action4)!
  4685.  
  4686. on: selector1 do: action1 on: selector2 do: action2 on: selector3 do: action3 on: selector4 do: action4 on: selector5 do: action5
  4687.     "Try to evaluate the receiver, and should an exception occur which is matched
  4688.     by any of the <exceptionSelector>s, selector1..selector5, then evaluate the 
  4689.     corresponding <monadicBlock>, actionN, passing it the exception instance as 
  4690.     its argument."
  4691.  
  4692.     ^self onDo: ((ExceptionHandlerSet new)
  4693.                 on: selector1 do: action1;
  4694.                 on: selector2 do: action2;
  4695.                 on: selector3 do: action3;
  4696.                 on: selector4 do: action4;
  4697.                 on: selector5 do: action5)!
  4698.  
  4699. on: selector1 do: action1 on: selector2 do: action2 on: selector3 do: action3 on: selector4 do: action4 on: selector5 do: action5 on: selector6 do: action6
  4700.     "Try to evaluate the receiver, and should an exception occur which is matched
  4701.     by any of the <exceptionSelector>s, selector1..selector6, then evaluate the 
  4702.     corresponding <monadicBlock>, actionN, passing it the exception instance as 
  4703.     its argument."
  4704.  
  4705.     ^self onDo: ((ExceptionHandlerSet new)
  4706.                 on: selector1 do: action1;
  4707.                 on: selector2 do: action2;
  4708.                 on: selector3 do: action3;
  4709.                 on: selector4 do: action4;
  4710.                 on: selector5 do: action5;
  4711.                 on: selector6 do: action6)!
  4712.  
  4713. onDo: exceptionHandler
  4714.     "Try to evaluate the receiver under the protection of the <ExceptionHandler>
  4715.     argument, exceptionHandler."
  4716.  
  4717.     ^exceptionHandler try: self!
  4718.  
  4719. outer
  4720.     "Private - Answer the receiver's outer context."
  4721.  
  4722.     ^outer!
  4723.  
  4724. outer: anObject
  4725.     "Private - Set the outer context of the receiver to anObject (a MethodContext or nil).
  4726.     Answer the receiver."
  4727.  
  4728.     outer := anObject!
  4729.  
  4730. postToInputQueue
  4731.     SessionManager inputState queueDeferredAction: self!
  4732.  
  4733. printOn: aStream
  4734.     "Append, to aStream, a <String> whose characters are a description of the receiver."
  4735.  
  4736.     | m |
  4737.     m := self method.
  4738.     (m notNil and: [m isExpression])
  4739.         ifTrue: [ "We can print the source"
  4740.             aStream nextPutAll: m getSource]
  4741.         ifFalse: [ "We can just show where the source is"
  4742.             aStream nextPutAll: '[] in ';     print: m]!
  4743.  
  4744. receiver
  4745.     "Private - Answer the 'self' of the block."
  4746.  
  4747.     | home |
  4748.     ^(home := self home) isNil
  4749.         ifFalse: [home receiver]!
  4750.  
  4751. receiver: newReceiver
  4752.     "Private - Set the 'self' of the context"
  4753.  
  4754.     self home receiver: newReceiver!
  4755.  
  4756. repeat
  4757.     "Evaluate the receiver repeatedly, ending only if the block throws some exception or 
  4758.     explicity returns.
  4759.     Note that this message is now inlined by the Compiler for literal block receivers."
  4760.  
  4761.     [self value. true] whileTrue!
  4762.  
  4763. sunitEnsure: aBlock 
  4764.     ^self ensure: aBlock!
  4765.  
  4766. sunitOn: aSignal do: anExceptionBlock 
  4767.     ^self on: aSignal do: anExceptionBlock!
  4768.  
  4769. value
  4770.     "Answer the result of evaluating the receiver. Fail if the receiver is not 
  4771.     a niladic (zero argument) block.
  4772.     
  4773.     This method is present to handle failures and as a target for #performs, as 
  4774.     invocations of #value are performed directly for zero argument blocks.
  4775.  
  4776.     Primitive failure reasons:
  4777.         0 -    the receiver does not expect 0 arguments."
  4778.  
  4779.     <primitive: 81>
  4780.     ^self valueFailed: 0!
  4781.  
  4782. value: arg1
  4783.     "Answer the result of evaluating the receiver. Fail if the receiver is not 
  4784.     a monadic (one argument) block.
  4785.     
  4786.     This method is present to handle failures and as a target for #performs, as 
  4787.     invocations of #value are performed directly for one argument blocks.
  4788.  
  4789.     Primitive failure reasons:
  4790.         0 -    the receiver does not expect 1 argument."
  4791.  
  4792.     <primitive: 81>
  4793.     ^self valueFailed: 1!
  4794.  
  4795. value: arg1 value: arg2
  4796.     "Answer the result of evaluating the receiver. Fail if the receiver is not 
  4797.     a dyadic (two argument) block.
  4798.  
  4799.     Primitive failure reasons:
  4800.         0 -    the receiver does not expect 2 arguments."
  4801.  
  4802.     <primitive: 81>
  4803.     ^self valueFailed: 2!
  4804.  
  4805. value: arg1 value: arg2 value: arg3
  4806.     "Answer the result of evaluating the receiver. Fail if the receiver is not 
  4807.     a three argument block.
  4808.  
  4809.     Primitive failure reasons:
  4810.         0 -    the receiver does not expect 3 arguments."
  4811.  
  4812.     <primitive: 81>
  4813.     ^self valueFailed: 3!
  4814.  
  4815. valueFailed: anInteger
  4816.     "Private - A primitive value call failed, generate an appropriate error"
  4817.  
  4818.     ^self argumentCount == anInteger
  4819.         ifTrue: [super primitiveFailed]
  4820.         ifFalse: [self error: 'Block expects ', self argumentCount printString, ' argument(s)']!
  4821.  
  4822. valueOnUnwind: aTwoArgBlock
  4823.     "Private - Evaluate the receiver, and should it exit by a non-local return to its home method's sender
  4824.     (i.e. via a ^-return) then evaluate aTwoArgBlock, passing it the receiver's home context's sender (i.e.
  4825.     the return destination), and the return value. aTwoArgBlock must include an explicit return of its
  4826.     own, either via ProcessorScheduler>>return: to return the argument value to the argument context, or 
  4827.     via a further ^-return, which will override the result and return destinations.
  4828.  
  4829.     Be warned: The primitive marks the caller's stack frame as having an unwind block, by changing its 
  4830.     receiver to be a special cookie. The VM looks for this object when performing ^-returns from 
  4831.     blocks, and, on detecting such, locates and evaluates the unwind block. The current implementation of 
  4832.     this unwind mechanism leaves its unwind block argument on the stack before evaluating the receiver in 
  4833.     the normal way. It is recommended that user code should not send this message directly, as it is 
  4834.     possible that the VM may become unstable if this is not done correctly. User code should use one of 
  4835.     the two methods, #ensure: and #ifCurtailed: to record unwind blocks that are performed, 
  4836.     respectively, regardless of whether the block evalutes and returns normally or is curtailed by a non-
  4837.     local return or an exception, or only if curtailed.
  4838.  
  4839.     Primitive failure reasons:
  4840.         0 -    the receiver does not expect 0 arguments."
  4841.  
  4842.     <primitive: 79>
  4843.     ^self primitiveFailed!
  4844.  
  4845. valueWithArguments: argumentArray
  4846.     "Answer the result of evaluating the receiver with arguments from
  4847.     the <Array>, argumentArray. Fail if the argument is not an <Array>, 
  4848.     or if the receiver does not take the same number of arguments as are 
  4849.     present in the <Array>.
  4850.  
  4851.     A block can have a maximum of 256 arguments. Most Smalltalks have lower limits,
  4852.     and for complete portability it is unwise to use more than two. Stack overflow
  4853.     is also a possibility when the arguments are transferred to the stack.
  4854.  
  4855.     Primitive failure reasons:
  4856.         0 -    the receiver does not expect the number of arguments in argumentArray.
  4857.         1 -    argumentArray is not an <Array>."
  4858.  
  4859.     <primitive: 82>
  4860.     ^self valueFailed: argumentArray size!
  4861.  
  4862. valueWithArgumentsAt: anAddress descriptor: anExternalFunctionDescriptor 
  4863.     "Private - Answer the result of evaluating the receiver with arguments
  4864.     instantiated from memory at anAddress using the the external argument 
  4865.     types from, anExternalFunctionDescriptor.
  4866.     Implementation Note: For performance and consistency (with outbound external calls) 
  4867.     reasons, we use a VM supplied primitive to instantiate and push the arguments and 
  4868.     perform the message, but there is no reason that this cannot be done in Smalltalk 
  4869.     if different argument conversions are required. The standard conversions are the 
  4870.     same as those performed for return types by the external call primitive (see
  4871.     the ExternalLibrary class).
  4872.  
  4873.     Primitive Failure reasons:
  4874.         0    -    anExternalFunctionDescriptor is not a byte object.
  4875.         1    -    anAddress is not a valid address object (SmallInteger/byte indirection)
  4876.         2    -    the number of arguments whose types are specified by anExternalFunctionDescriptor
  4877.                 does not match the number of arguments expected by the receiver."
  4878.  
  4879.     <primitive: 117>
  4880.     ^self valueFailed: anExternalFunctionDescriptor argumentCount!
  4881.  
  4882. whileFalse
  4883.     "Repeatedly evaluate the receiver until it evaluates to true.
  4884.     Where the receiver is a zero argument literal block, this message
  4885.     is inlined by the compiler. This implementation is included for other cases 
  4886.     (though these are likely to be errors) and so that it may be #perform:'d. 
  4887.     The implementation appears to be recursive, but is itself inlined by the Compiler."
  4888.  
  4889.     ^[self value] whileFalse!
  4890.  
  4891. whileFalse: iterationBlock
  4892.     "Repeatedly evaluate the receiver until it evaluates to true, and
  4893.     on each iteration evaluate the <niladicValuable> argument, iterationBlock. 
  4894.     Answer nil.
  4895.     N.B. Where the receiver and argument are zero argument literal blocks, the
  4896.     message is inlined by the Compiler (it generates a loop). This method is 
  4897.     included for other types of niladic valuable (though these are likely to 
  4898.     be errors) and so that it may be #perform:'d. The implementation appears 
  4899.     to be recursive, but is itself inlined by the Compiler."
  4900.  
  4901.     ^[self value] whileFalse: [iterationBlock value]!
  4902.  
  4903. whileTrue
  4904.     "Repeatedly evaluate the receiver until it evaluates to false.
  4905.     Where the receiver is a zero argument literal block, this message
  4906.     is inlined by the compiler, this method is included for other cases 
  4907.     (though these are likely to be errors) and so that it may be #perform:'d. 
  4908.     The implementation appears to be recursive, but is itself inlined by the Compiler."
  4909.  
  4910.     ^[self value] whileTrue!
  4911.  
  4912. whileTrue: iterationBlock
  4913.     "Repeatedly evaluate the receiver until it evaluates to false, and
  4914.     on each iteration evaluate the <niladicValuable> argument, iterationBlock. 
  4915.     Answer nil.
  4916.     N.B. Where the receiver and argument are zero argument literal blocks, the
  4917.     message is inlined by the Compiler (it generates a loop). This method is 
  4918.     included for other types of niladic valuabel (though these are likely to 
  4919.     be errors) and so that it may be #perform:'d. The implementation appears 
  4920.     to be recursive, but is itself inlined by the Compiler."
  4921.  
  4922.     ^[self value] whileTrue: [iterationBlock value]! !
  4923.  
  4924. Boolean comment:
  4925. 'Boolean is the class which provides the protocol for logical values. The actual logical values, true and false, are represented by Boolean''s subclasses True and False. Boolean itself is abstract.
  4926.  
  4927. In Smalltalk many control structures, such as conditional evaluations, are implemented by sending messages to Booleans, rather than by incorporating control flow mechanisms into the syntax of the language. The compiler does, however, inline certain commonly used messages such as #ifTrue:ifFalse: for reasons of performance. For this reason some methods of Boolean are not normally executed unless #perform:''d.
  4928.  
  4929. Booleans implement the ANSI protocols <Object> (by inheritance) and <boolean>.'!
  4930. !Boolean class methodsFor!
  4931.  
  4932. icon
  4933.     "Answers an Icon that can be used to represent this class"
  4934.  
  4935.     ^##(self) defaultIcon!
  4936.  
  4937. new
  4938.     "It is not necessary to instantiate Booleans - use the literals 'true' 
  4939.     and 'false'."
  4940.  
  4941.     ^self shouldNotImplement!
  4942.  
  4943. newAspect: aspectClass name: aSymbol 
  4944.         "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  4945.         which is appropriate for representing aspects of the receiver's type."
  4946.     
  4947.         ^aspectClass boolean: aSymbol!
  4948.  
  4949. publishedAspectsOfInstances
  4950.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  4951.     
  4952.         ^(super publishedAspectsOfInstances)
  4953.             add: (Aspect boolean: #yourself);
  4954.             yourself! !
  4955.  
  4956. !Boolean methodsFor!
  4957.  
  4958. & operand
  4959.     "Answer whether the receiver and the <boolean> argument, operand,
  4960.     are both true. Note that this is the evaluating conjunction, use #and: instead for 
  4961.     non-evaluating expressions.
  4962.     Implementation Note: The #ifTrue:ifFalse: is present in order to have the 
  4963.     VM check that the operand is actually a <Boolean>. The compiler will
  4964.     actually optimize a lot of this away and generate quite efficient code (try
  4965.     Ctrl+I to inspect the method and view the disassembly listing)."
  4966.  
  4967.     ^(operand ifTrue: [true] ifFalse: [false]) and: [self]!
  4968.  
  4969. | operand
  4970.     "Answer whether either the receiver OR the <boolean> argument, operand,
  4971.     is true. Note that a logical expression using #| will evaluate both receiver
  4972.     and argument - use #or: instead for non-evaluating expressions, which
  4973.     are generally more efficient.
  4974.     Implementation Note: The #ifTrue:ifFalse: is present in order to have the 
  4975.     VM check that the operand is actually a <Boolean>. The compiler will
  4976.     actually optimize a lot of this away and generate quite efficient code (try
  4977.     Ctrl+I to inspect the method and view the disassembly listing)."
  4978.  
  4979.     ^(operand ifTrue: [true] ifFalse: [false]) or: [self]!
  4980.  
  4981. and: operand
  4982.     "Answer whether the receiver and the result of evaluating the <niladicValuable>,
  4983.      operand, are both true. The argument is only evaluated if the receiver is true.
  4984.     N.B. In the normal case where operand is a literal block the compiler inlines
  4985.     the conditional operation in the home method."
  4986.  
  4987.     ^self subclassResponsibility!
  4988.  
  4989. asBoolean
  4990.     "Answer the receiver as a Boolean value (true OR false)."
  4991.  
  4992.     ^self!
  4993.  
  4994. asDword
  4995.     "Answer the receiver in a form suitable for passing/returning as a
  4996.     32-bit integer value."
  4997.  
  4998.     ^self asParameter
  4999. !
  5000.  
  5001. asParameter
  5002.     "Answer the value of the receiver in a form suitable for
  5003.     passing to an external function call."
  5004.  
  5005.     ^self ifTrue: [1] ifFalse: [0]!
  5006.  
  5007. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òΓ─äaj₧ò⌠%3ZS┬û;AÆQP+zR\eO∙ç^Mn#▒yPo½╜%ΦÉm┬┌▌≈╔∙=,╛Up4.f╚│`í╞╠\I¢L╙póE!
  5008.  
  5009. deepCopy
  5010.     "Answer the receiver as Booleans are immutable"
  5011.  
  5012.     ^self!
  5013.  
  5014. eqv: operand
  5015.     "Answer whether the receiver and <boolean> argument, operand,
  5016.     are the same."
  5017.  
  5018.     ^self == operand!
  5019.  
  5020. ifFalse: operand
  5021.     "Evaluate and answer the result of the evaluating the <niladicValuable>
  5022.     argument, operand, if the receiver is false, otherwise answer nil. 
  5023.     N.B. This messuage is optimised by the compiler by inlining literal block
  5024.     arguments in their home method."
  5025.  
  5026.     ^self subclassResponsibility!
  5027.  
  5028. ifFalse: falseOperand ifTrue: trueOperand
  5029.     "Evaluate, and answer the result, of the <niladicValuable>, falseOperand, if 
  5030.     the receiver is false, or the <niladicValuable>, trueOperand, if the receiver is 
  5031.     true.
  5032.     N.B. This message is normally optimised by the compiler if the operands are
  5033.     literal blocks."
  5034.  
  5035.     ^self subclassResponsibility!
  5036.  
  5037. ifTrue: operand
  5038.     "Evaluate and answer the result of the evaluating the <niladicValuable>
  5039.     argument, operand, if the receiver is true, otherwise answer nil. 
  5040.     N.B. This messuage is optimised by the compiler by inlining literal block
  5041.     arguments in their home method."
  5042.  
  5043.     ^self subclassResponsibility!
  5044.  
  5045. ifTrue: trueOperand ifFalse: falseOperand
  5046.     "Evaluate, and answer the result, of the <niladicValuable>, falseOperand, if 
  5047.     the receiver is false, or the <niladicValuable>, trueOperand, if the receiver is 
  5048.     true.
  5049.     N.B. This message is normally optimised by the compiler if the operands are
  5050.     literal blocks."
  5051.  
  5052.     ^self subclassResponsibility!
  5053.  
  5054. isLiteral
  5055.     "Answer whether or not the receiver has a literal representation (probably its
  5056.     printString) which is directly recognised by the Compiler."
  5057.  
  5058.     ^true!
  5059.  
  5060. not
  5061.     "Answer the logical inverse of the receiver"
  5062.  
  5063.     ^self == false!
  5064.  
  5065. or: operand
  5066.     "Answer whether either the receiver or the result of evaluating the
  5067.     <niladicValuable> argument, operand, is true. The argument is only
  5068.     evaluated if the receiver is false.
  5069.     N.B. In the normal case where the argument is a literal block the compiler
  5070.     optimizes this message by inlining the conditional operation in the home
  5071.     method."
  5072.  
  5073.     ^self subclassResponsibility!
  5074.  
  5075. shallowCopy
  5076.     "Answer the receiver as there are only two Booleans, the manifest constants
  5077.     true and false."
  5078.  
  5079.     ^self!
  5080.  
  5081. xor: operand
  5082.     "Answer whether either the receiver or the <boolean> argument, operand,
  5083.     is true, but not both.
  5084.     N.B. Note that this a logical operation, like #eqv:, rather than a controlling
  5085.     operation, like and:, #or:, and expects a boolean argument, not a niladic
  5086.     valuable.
  5087.     This method was incorrectly defined in Dolphin versions pre-dating beta 2f."
  5088.  
  5089.     ^(self == operand) == false! !
  5090.  
  5091. ByteCodeInterpreter comment:
  5092. ''!
  5093. !ByteCodeInterpreter class methodsFor!
  5094.  
  5095. byteCodeSegments: aCompiledMethod
  5096.     "Private - Answer an Array of segment arrays. Each segment is an Array with one
  5097.     or more elements. The first element being the bytecode, followed
  5098.     by any 'arguments' of the code."
  5099.  
  5100.     ^(self on: aCompiledMethod) byteCodeSegments!
  5101.  
  5102. decodeLongJump: byte1 byte2: byte2 
  5103.     ^(byte2 >= 128 ifTrue: [byte2 - 256] ifFalse: [byte2]) * 256 + byte1!
  5104.  
  5105. indexOfIP: anInteger in: aCompiledMethod
  5106.     "Private - Answer the index of the instruction line in a disassembly listing for
  5107.     the specified ip (which might be a data byte)."
  5108.  
  5109.     ^(self on: aCompiledMethod) 
  5110.         indexOfIP: anInteger!
  5111.  
  5112. initialize
  5113.     "Simple lookup table to aid deciphering of a methods bytecode. Uses a RunArray for space
  5114.     efficiency.
  5115.  
  5116.         ByteCodeInterpreter initialize
  5117.     "
  5118.  
  5119.     | instructionRuns |
  5120.     instructionRuns := 
  5121.         RunArray 
  5122.             runs: #(    1 16 12 16 12 1 3 4 16 8 8 1 1 1 1 1 3 1 1 1 1 1 8 8 32 16 16 8 1 5
  5123.                     1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 6
  5124.                     1 1 1 1 1 1 1 1 1 1 7
  5125.                     1 1 1 2)
  5126.             values: #(
  5127.                 break
  5128.                 shortPushInstVar:
  5129.                 shortPushTemp:
  5130.                 shortPushConst:
  5131.                 shortPushStatic:
  5132.                 shortPushSelf
  5133.                 shortPushPseudo:
  5134.                 shortPushImmediate:
  5135.                 unused
  5136.                 shortPopStoreInstVar:
  5137.                 shortPopStoreTemp:
  5138.                 popStackTop
  5139.                 incrementStackTop
  5140.                 decrementStackTop
  5141.                 duplicateStackTop
  5142.                 returnSelf
  5143.                 returnPseudo:
  5144.                 returnFromMessage
  5145.                 returnFromBlock
  5146.                 returnFromBlockHome
  5147.                 pushActiveFrame
  5148.                 nop
  5149.                 shortJump:
  5150.                 shortJumpIfFalse:
  5151.                 shortSpecialSend:
  5152.                 shortSendNoArgs:
  5153.                 shortSendOneArg:
  5154.                 shortSendTwoArgs:
  5155.                 isZero
  5156.                 unused
  5157.  
  5158.                 pushInstVar:
  5159.                 pushTemp:
  5160.                 pushConst:
  5161.                 pushStatic:
  5162.                 storeInstVar:
  5163.                 storeTemp:
  5164.                 storeStatic:
  5165.                 popStoreInstVar:
  5166.                 popStoreTemp:
  5167.                 popStoreStatic:
  5168.                 pushImmediate:
  5169.                 pushChar:
  5170.                 send:
  5171.                 supersend:
  5172.                 specialSend:
  5173.                 nearJump:
  5174.                 nearJumpIfTrue:
  5175.                 nearJumpIfFalse:
  5176.                 nearJumpIfNil:
  5177.                 nearJumpIfNotNil:
  5178.                 unused:
  5179.                 pushSelfAndTemp:
  5180.                 unused:
  5181.  
  5182.                 longPushConst:with:
  5183.                 longPushStatic:with:
  5184.                 longStoreStatic:with:
  5185.                 longPopStoreStatic:with:
  5186.                 longPushImmediate:with:
  5187.                 longSend:with:
  5188.                 longSupersend:with:
  5189.                 longJump:with:
  5190.                 longJumpIfTrue:with:
  5191.                 longJumpIfFalse:with:
  5192.                 unused:with:
  5193.  
  5194.                 blockCopy:with:with:
  5195.                 exLongSend:with:with:
  5196.                 exLongSupersend:with:with:
  5197.                 unused:with:with:
  5198.     ).
  5199.  
  5200.     Instructions := instructionRuns asArray.
  5201.     self assert: [ Instructions size = 256 ]
  5202. !
  5203.  
  5204. initializeOpcodePool
  5205.     "
  5206.         self initializeOpcodePool
  5207.     "
  5208.  
  5209.     Instructions keysAndValuesDo: 
  5210.             [:i :each | 
  5211.             | key |
  5212.             key := (each upTo: $:) capitalized.
  5213.             (OpcodePool includesKey: key) ifFalse: [OpcodePool at: key put: i - 1]].
  5214.     OpcodePool removeKey: 'Unused'.
  5215.     OpcodePool
  5216.         at: 'FirstDoubleByte' put: 204;
  5217.         at: 'FirstTripleByte' put: 234;
  5218.         at: 'FirstQuadByte' put: 251!
  5219.  
  5220. instructionRuns
  5221.     "Private - Answer the default Array of instruction names (these are selectors
  5222.     sent to the client during interpretation). The default set is answered here, but
  5223.     clients other than the receiver may choose to answer a reduced set, or one with
  5224.     different selectors, or may wish to differentiate different runs."
  5225.  
  5226.     ^Instructions!
  5227.  
  5228. on: aMethod
  5229.     "Private - Answer a new instance of the receiver to interpret, aMethod."
  5230.  
  5231.     ^self on: aMethod for: self!
  5232.  
  5233. on: aMethod for: client
  5234.     "Private - Answer a new instance of the receiver to interpret, aMethod,
  5235.     which will dispatch instructions to the specified interpreter client
  5236.     (which must respond to the #instructionNames method with an array of
  5237.     the selectors it wishes to receiver for the corresponding instruction
  5238.     runs)."
  5239.  
  5240.     ^self new
  5241.         method: aMethod;
  5242.         client: client! !
  5243.  
  5244. !ByteCodeInterpreter methodsFor!
  5245.  
  5246. accessesInstVarAt: anInteger 
  5247.     "Answer whether the method which the receiver is interpreting accesses the
  5248.     instance variable with the index, anInteger."
  5249.  
  5250.     | offset |
  5251.     offset := anInteger - 1.    "instructions use 0 based offsets, not 1 based indices"
  5252.     ^self containsInstruction: 
  5253.             [:selector :args | 
  5254.             (self instVarAccessInstructions includes: selector) and: [args first == offset]]!
  5255.  
  5256. accessesInstVarAtAnyOf: indices
  5257.     "Answer whether the method which the receiver is interpreting accesses any
  5258.     of the instance variables with indices in the <Array> of <integer>, indices."
  5259.  
  5260.     ^self containsInstruction: 
  5261.             [:selector :args | 
  5262.             (self instVarAccessInstructions includes: selector) 
  5263.                 and: [indices identityIncludes: args first + 1]]!
  5264.  
  5265. atEnd
  5266.     "Private - Answer whether the receiver is at the end of the method it is disassembling."
  5267.  
  5268.     ^ip > byteCodes basicSize!
  5269.  
  5270. byteCodes
  5271.     "Answer the byte codes of the method being disassembled by the receiver."
  5272.  
  5273.     ^byteCodes!
  5274.  
  5275. byteCodeSegments
  5276.     "Answer an Array of segment arrays. Each segment is an Array with one
  5277.     or more elements. The first element being the opcode, followed
  5278.     by any extension bytes."
  5279.  
  5280.     | start answer |
  5281.     answer := OrderedCollection new: (byteCodes basicSize bitShift: -1).
  5282.     ip := 1.
  5283.     [self atEnd] whileFalse: [
  5284.         start := ip.
  5285.         self next.
  5286.         answer add: (byteCodes copyFrom: start to: ip - 1)].
  5287.     ^answer!
  5288.  
  5289. client: anInterpreterClient
  5290.     "Private - Set the receiver's interpreter client. The client is sent messages (the
  5291.     selectors for which it can supply) for each of the instructions in the the receivers
  5292.     method."
  5293.  
  5294.     client := anInterpreterClient!
  5295.  
  5296. containsInstruction: discriminator 
  5297.     "Answer whether the dyadic valuable, discriminator, evaluates to true for
  5298.     any instruction/parameter pair in the receiver."
  5299.  
  5300.     self reset.
  5301.     [self atEnd] whileFalse: [(self nextInstructionDo: discriminator) ifTrue: [^true]].
  5302.     ^false!
  5303.  
  5304. indexOfIP: anInteger
  5305.     "Private - Answer the index of the instruction line in a disassembly listing for
  5306.     the specified ip (which might be a data byte)."
  5307.  
  5308.     | i |
  5309.     i := 1.
  5310.     [ip < anInteger] whileTrue: [i := i + 1. self next].
  5311.     ^i!
  5312.  
  5313. instructions
  5314.     "Answer a sequenceable collection of associations between symbolic instruction names and argument
  5315.     in the receiver."
  5316.  
  5317.     | answer |
  5318.     answer := OrderedCollection new.
  5319.     self instructionsDo: [:selector :args | answer add: (selector -> args)].
  5320.     ^answer!
  5321.  
  5322. instructionsDo: operation 
  5323.     "Evaluate the dyadic valuable, operation, for each instruction in the receiver, passing 
  5324.     the instruction symbolic name (a keyword selector) and an array of arguments (which should not be
  5325.     modified)."
  5326.  
  5327.     self reset.
  5328.     [self atEnd] whileFalse: [self nextInstructionDo: operation]!
  5329.  
  5330. instVarAccessInstructions
  5331.     ^##(IdentitySet 
  5332.         withAll: #(#shortPushInstVar: #shortPopStoreInstVar: #pushInstVar: #storeInstVar: #popStoreInstVar:))!
  5333.  
  5334. interpret
  5335.     "Private - Interpret the receiver's method sending messages for each instruction to the client."
  5336.  
  5337.     self instructionsDo: [:selector :args | client perform: selector withArguments: args]!
  5338.  
  5339. interpretNext
  5340.     "Private - Interpret the receiver's method sending messages for each instruction to the client."
  5341.  
  5342.     self nextInstructionDo: [:selector :args |
  5343.         client perform: selector withArguments: args]!
  5344.  
  5345. ip
  5346.     "Answer the current instruction pointer."
  5347.  
  5348.     ^ip!
  5349.  
  5350. ip: newIP
  5351.     "Set the current instruction pointer to the <integer> argument.
  5352.     N.B. This should be used with care, since it needs to be the index of the start
  5353.     of a byte code."
  5354.  
  5355.     ip := newIP!
  5356.  
  5357. lengthOfInstruction: aByteCode 
  5358.     "Private - Answer the number of bytes for the instruction, aByteCode."
  5359.  
  5360.     aByteCode < FirstDoubleByte ifTrue: [^1].
  5361.     aByteCode < FirstTripleByte ifTrue: [^2].
  5362.     ^aByteCode < FirstQuadByte ifTrue: [3] ifFalse: [4]!
  5363.  
  5364. messagesDo: operation 
  5365.     "Evaluate the <monadicValuable>, operation, for each message send in the receiver
  5366.     at and after the current ip, passing it each of the selectors."
  5367.  
  5368.     self instructionsDo: 
  5369.             [:sel :args | 
  5370.             | selector |
  5371.             sel == #shortSpecialSend: 
  5372.                 ifTrue: [selector := self selectorOfSpecialSend: args first]
  5373.                 ifFalse: 
  5374.                     [(sel == #shortSendNoArgs: or: [sel == #shortSendOneArg: or: [sel == #shortSendTwoArgs:]]) 
  5375.                         ifTrue: [selector := method literalAt: args first + 1]
  5376.                         ifFalse: 
  5377.                             [(sel == #send: or: [sel == #supersend:]) 
  5378.                                 ifTrue: [selector := method literalAt: (args first bitAnd: 31) + 1]
  5379.                                 ifFalse: 
  5380.                                     [(sel == #longSend:with: or: [sel == #longSupersend:with:]) 
  5381.                                         ifTrue: [selector := method literalAt: args last + 1]
  5382.                                         ifFalse: [selector := nil]]]].
  5383.             selector notNil ifTrue: [operation value: selector]]!
  5384.  
  5385. method
  5386.     "Private - Answer the method to being disassembled by the receiver."
  5387.  
  5388.     ^method!
  5389.  
  5390. method: aCompiledMethod
  5391.     "Private - Set the method to be disassembled by the receiver to aCompiledMethod.
  5392.     Also reset the instruction pointer and cache the methods byte codes (which
  5393.     may have to be generated from "
  5394.  
  5395.     ip := 1.
  5396.     method := aCompiledMethod.
  5397.     byteCodes := method byteCodes!
  5398.  
  5399. next
  5400.     "Private - Answer the next instruction byte code of the receiver, advancing ip appropriately."
  5401.  
  5402.     | byteCode |
  5403.     byteCode := byteCodes at: ip.
  5404.     ip := ip + (self lengthOfInstruction: byteCode).
  5405.     ^byteCode!
  5406.  
  5407. nextInstructionDo: operation 
  5408.     "Private - Answer the result of evaluating the dyadic valuable, operation, for the next 
  5409.     instruction in receiver's stream, passing the instruction symbolic name (a keyword selector) 
  5410.     and an array of argument bytes (N.B. not a ByteArray, but an Array of bytes)."
  5411.  
  5412.     | selector byteCode instructionLength runs |
  5413.     byteCode := byteCodes at: ip.
  5414.     instructionLength := self lengthOfInstruction: byteCode.
  5415.     ip := ip + instructionLength.
  5416.     runs := client instructionRuns.
  5417.     selector := runs at: byteCode + 1.
  5418.     instructionLength == 1 
  5419.         ifTrue: 
  5420.             [^operation value: selector
  5421.                 value: (selector last == $: 
  5422.                         ifTrue: [Array with: byteCode + 1 - (runs identityIndexOf: selector)]
  5423.                         ifFalse: [#()])].
  5424.     instructionLength == 2 
  5425.         ifTrue: 
  5426.             ["Double byte instructions"
  5427.  
  5428.             ^operation value: selector value: (Array with: (byteCodes at: ip - 1))].
  5429.     ^instructionLength == 3 
  5430.         ifTrue: 
  5431.             ["Triple byte instructions"
  5432.  
  5433.             operation value: selector
  5434.                 value: (Array with: (byteCodes at: ip - 2) with: (byteCodes at: ip - 1))]
  5435.         ifFalse: 
  5436.             ["Quad byte instructions"
  5437.  
  5438.             operation value: selector
  5439.                 value: (Array 
  5440.                         with: (byteCodes at: ip - 3)
  5441.                         with: (byteCodes at: ip - 2)
  5442.                         with: (byteCodes at: ip - 1))]!
  5443.  
  5444. peekForSelector
  5445.     "Answer the message selector of the next byte code, or nil if it is not a message
  5446.     send instruction. The instruction pointer is advanced.
  5447.     Note that this method used to be a private method #selectorOfNextIfSend, but has been
  5448.     renamed for VW compatibility.
  5449.     Implementation Note:
  5450.     The send instructions fit into 4 groups:
  5451.     i) short (single byte) special sends of commonly used selectors
  5452.     ii) short sends of zero, one, and two arguments, with index of literal selector added to the base byte code
  5453.     iii) two-byte send/supersend where the extension byte specifies literal index and arg count
  5454.     iv) long send/supersend with one extension byte for the argument count and one for the literal index of the selector."
  5455.  
  5456.     | selector |
  5457.     self nextInstructionDo: [:sel :x |
  5458.         sel == #shortSpecialSend: 
  5459.             ifTrue: [selector := self selectorOfSpecialSend: x first]
  5460.         ifFalse: [(sel == #shortSendNoArgs: or: [sel == #shortSendOneArg: or: [sel == #shortSendTwoArgs:]])
  5461.                 ifTrue: [selector := method literalAt: x first + 1]
  5462.         ifFalse: [(sel == #send: or: [sel == #supersend:]) 
  5463.                 ifTrue: [selector :=  method literalAt: (x first bitAnd: 31)+1]
  5464.         ifFalse: [(sel == #longSend:with: or: [sel == #longSupersend:with:])
  5465.                 ifTrue: [selector := method literalAt: x last + 1]]]]].
  5466.     ^selector
  5467. !
  5468.  
  5469. prevIP: anInteger
  5470.     "Private - Answer the ip of the instruction immediately preceding that with IP, anInteger."
  5471.  
  5472.     | prevIP |
  5473.     prevIP := 0.
  5474.     ip := 1.
  5475.     [ip < anInteger] whileTrue: [prevIP := ip. self next].
  5476.     ^prevIP
  5477. !
  5478.  
  5479. readsInstVarAt: anInteger
  5480.     "Answer whether the method which the receiver is interpreting reads the
  5481.     instance variable with the index, anInteger."
  5482.  
  5483.     | offset |
  5484.     offset := anInteger - 1.    "instructions use 0 based offsets, not 1 based indices"
  5485.     ^self containsInstruction: 
  5486.             [:selector :args | 
  5487.             (#(#shortPushInstVar: #pushInstVar:) identityIncludes: selector) 
  5488.                 and: [args first == offset]]!
  5489.  
  5490. readsStatic: anAssociation
  5491.     "Answer whether the method which the receiver is interpreting reads the
  5492.     static variable argument."
  5493.  
  5494.     | offset |
  5495.     offset := (method literals identityIndexOf: anAssociation) - 1.
  5496.     ^offset >= 0 and: 
  5497.             [self containsInstruction: 
  5498.                     [:selector :args | 
  5499.                     ((#(#shortPushStatic: #pushStatic:) identityIncludes: selector) and: [args first == offset]) 
  5500.                         or: [selector == #longPushStatic:with: and: [offset == (args first + (args last * 256))]]]]!
  5501.  
  5502. reset
  5503.     ip := 1!
  5504.  
  5505. selectorOfSpecialSend: offset
  5506.     "Answer the selector which corresponds to the special send with the specified offset from the start
  5507.     of the special send instructions."
  5508.  
  5509.     ^VMLibrary default specialSelectors at: offset+1!
  5510.  
  5511. sendsSpecialSelector: anInteger
  5512.     "Answer whether the method which the receiver is interpreting sends the special
  5513.     selector with the specified index (one based)."
  5514.  
  5515.     | offset |
  5516.     offset := anInteger - 1.    "instructions use 0 based offsets, not 1 based indices"
  5517.     ^self containsInstruction: [:selector :args |
  5518.         (selector == #shortSpecialSend:) and: [args first == offset]]!
  5519.  
  5520. specialMessages
  5521.     "Private - Answer the set of special message sends in the receiver's byte codes."
  5522.  
  5523.     | answer specials |
  5524.     answer := IdentitySet new.
  5525.     specials := VMLibrary default specialSelectors.
  5526.     self instructionsDo: [:op :args |
  5527.         (op == #shortSpecialSend:)
  5528.             ifTrue: [answer add: (specials at: args first+1)]].
  5529.     ^answer
  5530.         !
  5531.  
  5532. writesInstVarAt: anInteger
  5533.     "Answer whether the method which the receiver is interpreting writes to the
  5534.     instance variable with the index, anInteger."
  5535.  
  5536.     | offset |
  5537.     offset := anInteger - 1.    "instructions use 0 based offsets, not 1 based indices"
  5538.     ^self containsInstruction: 
  5539.             [:selector :args | 
  5540.             (#(#shortPopStoreInstVar: #storeInstVar: #popStoreInstVar:) identityIncludes: selector) 
  5541.                 and: [args first == offset]]!
  5542.  
  5543. writesStatic: anAssociation
  5544.     "Answer whether the method interpreted by the receiver writes to the specified 
  5545.     static variable."
  5546.  
  5547.     | offset |
  5548.     offset := (method literals identityIndexOf: anAssociation) - 1.
  5549.     ^offset >= 0 and: 
  5550.             [self containsInstruction: 
  5551.                     [:selector :args | 
  5552.                     ((#(#popStoreStatic: #storeStatic:) identityIncludes: selector) and: [args first == offset]) or: 
  5553.                             [(#(#longPopStoreStatic:with: #longStoreStatic:with:) identityIncludes: selector) 
  5554.                                 and: [offset == (args first + (args last * 256))]]]]! !
  5555.  
  5556. Canvas comment:
  5557. ''!
  5558. !Canvas class methodsFor!
  5559.  
  5560. desktopResolution
  5561.     "Answer the resolution of the active desktop."
  5562.  
  5563.     DesktopResolution isNil ifTrue: [
  5564.         DesktopResolution := self forDesktop resolution].
  5565.     ^DesktopResolution!
  5566.  
  5567. forDesktop
  5568.     "Answers a new Canvas with an owned hDC for the REAL desktop window."
  5569.  
  5570.     ^self on: UserLibrary default!
  5571.  
  5572. forDisplay
  5573.     "Answers a new Canvas with an owned hDC for the display device."
  5574.  
  5575.     ^self on: self!
  5576.  
  5577. forNonClientView: aView
  5578.     "Answers a new non-client Canvas with an owned hDC for aView"
  5579.  
  5580.     ^self withDC: aView getWindowDC ownedBy: aView!
  5581.  
  5582. forView: aView
  5583.     "Answers a new client Canvas with an owned hDC for aView"
  5584.  
  5585.     ^self on: aView!
  5586.  
  5587. getDC
  5588.     "Answer a DC for drawing on the display.
  5589.     N.B. This is one half of the <dcSource> protocol, and must be matched with 
  5590.     a call to #releaseDC: to delete the DC."
  5591.  
  5592.     ^GDILibrary default 
  5593.         createDC: 'DISPLAY' 
  5594.         lpszDevice: nil lpszOutput: nil lpdvminit: nil!
  5595.  
  5596. new
  5597.     "Private - Use #withNonOwnedDC:, #withOwnedDC:, #withDC:ownedBy: or one of their derivatives."
  5598.  
  5599.     ^self shouldNotImplement!
  5600.  
  5601. on: aDCSource
  5602.     "Answers a new client Canvas with an owned hDC for aDCSource.
  5603.     aDCSource must implement the <dcSource> prototocl #(getDC releaseDC:)"
  5604.  
  5605.     ^self withDC: aDCSource getDC ownedBy: aDCSource!
  5606.  
  5607. onExit
  5608.     "Ensure all the receiver's instances are in their 'invalidated' state on exit
  5609.     so that they have released any external resources they are holding."
  5610.  
  5611.     self primAllInstances do: [ :i | i onExit ]!
  5612.  
  5613. onStartup
  5614.     "Private - Perform system startup processing."
  5615.  
  5616.     DesktopResolution := nil!
  5617.  
  5618. releaseDC: hDC
  5619.     "Delete the specified hDC.
  5620.     Canvas implements this to provide the second half of the 'DC source' protocol
  5621.     for clients which supply a DC directly via #withOwnedDC:
  5622.     Answer whether the DC was indeed deleted."
  5623.  
  5624.     ^(GDILibrary default
  5625.         deleteDC: hDC asParameter) ~~ 0!
  5626.  
  5627. screenResolution
  5628.     "Answers a Point containing the logical pixels per inch of the screen.
  5629.     This is to avoid going recursive when creating a font."
  5630.  
  5631.     | display resolution |
  5632.     display := self forDisplay.
  5633.     resolution := display resolution.
  5634.     display free.
  5635.     ^resolution!
  5636.  
  5637. withDC: hDC ownedBy: aDCSource
  5638.     "Answers a new Canvas with the given hDC owned by aDCSource.
  5639.     The DC will be freed by sending a #releaseDC:, message with the DC
  5640.     handle as its parameter, to aDCSource."
  5641.  
  5642.     ^super new
  5643.         ownedDC: hDC;
  5644.         source: aDCSource!
  5645.  
  5646. withNonOwnedDC: hDC
  5647.     "Answers a new Canvas with the given non-owned hDC.
  5648.     When this instance is freed it will use neither DeleteDC() nor ReleaseDC()."
  5649.  
  5650.     ^super new
  5651.         nonOwnedDC: hDC;
  5652.         yourself!
  5653.  
  5654. withOwnedDC: hDC
  5655.     "Answers a new instance of the receiver with the given owned hDC.
  5656.     The DC with the handle, hDC, will be freed when the new instance is
  5657.     finalized (or explicitly freed) with a call to DeleteDC()."
  5658.  
  5659.     ^self withDC: hDC ownedBy: self! !
  5660.  
  5661. !Canvas methodsFor!
  5662.  
  5663. alphaBlend: aCanvas rectangle: aRectangle to: dstOrigin extent: dstExtent blend: blendFunction
  5664.     "Alpha blends a rectangular region from aCanvas to the receiver with scaling.
  5665.     Answer true if the operation succeeds"
  5666.  
  5667.     ^Msimg32Library default 
  5668.         alphaBlend: self asParameter
  5669.         nXOriginDest: dstOrigin x
  5670.         nYOriginDest: dstOrigin y
  5671.         nWidthDest: dstExtent x
  5672.         nHeightDest: dstExtent y
  5673.         hdcSrc: aCanvas asParameter
  5674.         nXOriginSrc: aRectangle left
  5675.         nYOriginSrc: aRectangle top
  5676.         nWidthSrc: aRectangle width
  5677.         nHeightSrc: aRectangle height
  5678.         blend: blendFunction!
  5679.  
  5680. alphaBlendBitmap: aBitmap at: dstOrigin extent: dstExtent from: srcOrigin extent: srcExtent blend: blendFunction
  5681.     "Private - Alpha blend the specified rectangle of aBitmap to the specified destination
  5682.     rectangle with the specified blendFunction. The receiver is stretched to
  5683.     fit the destination rectangle. Handles and palette changes required
  5684.     by the bitmap. Answers zero if the operation fails"
  5685.  
  5686.     "Create and apply the receiver's palette (if any)"
  5687.  
  5688.     | hPalette oldPalette answer |
  5689.     hPalette := aBitmap createPalette.
  5690.     hPalette notNil ifTrue: [oldPalette := self palette: hPalette].
  5691.     answer := self 
  5692.                 alphaBlend: aBitmap canvas
  5693.                 rectangle: (Rectangle origin: srcOrigin extent: srcExtent)
  5694.                 to: dstOrigin
  5695.                 extent: dstExtent
  5696.                 blend: blendFunction.
  5697.     hPalette notNil 
  5698.         ifTrue: 
  5699.             ["Tidy up palette manipulation"
  5700.  
  5701.             self selectPalette: oldPalette.
  5702.             GDILibrary default deleteObject: hPalette].
  5703.     ^answer!
  5704.  
  5705. asParameter
  5706.     "Answer the receiver in a form suitable for passing to an external function."
  5707.  
  5708.     ^handle!
  5709.  
  5710. backcolor
  5711.     "Get the receiver's current background color."
  5712.  
  5713.     ^Color fromInteger: (GDILibrary default getBkColor: self asParameter)!
  5714.  
  5715. backcolor: aColor
  5716.     "Set the receiver's background color to the <Color>, aColor.
  5717.     Answers the previous background <Color>."
  5718.  
  5719.     ^Color fromInteger: (GDILibrary default 
  5720.                         setBkColor: self asParameter 
  5721.                         crColor: aColor asParameter)!
  5722.  
  5723. basicFree
  5724.     "Private - Free external resources held by the receiver.
  5725.     If we don't 'own' the hDC we do nothing.
  5726.     If we know the handle used for the original GetDC() then we do a ReleaseDC(),
  5727.     otherwise we do a DeleteDC()."
  5728.  
  5729.     owned ifTrue: [source releaseDC: self asParameter]!
  5730.  
  5731. bitBlt: aCanvasOrHandle rectangle: aRectangle to: dstOrigin rop: rop
  5732.     "Blits a rectangular region from aCanvasOrHandle to the receiver
  5733.     Answer true if the operation succeeds"
  5734.  
  5735.     ^GDILibrary default
  5736.         bitBlt: self asParameter
  5737.         nXDest: dstOrigin x 
  5738.         nYDest: dstOrigin y 
  5739.         nWidth: aRectangle width 
  5740.         nHeight: aRectangle height 
  5741.         hdcSrc: aCanvasOrHandle asParameter 
  5742.         nXSrc: aRectangle left 
  5743.         nYSrc: aRectangle top 
  5744.         dwRop: rop
  5745. !
  5746.  
  5747. brush
  5748.     "Answer the current brush."
  5749.  
  5750.     brush isNil ifTrue: [brush := Brush fromHandle: (self getCurrentObject: OBJ_BRUSH)].
  5751.     ^brush!
  5752.  
  5753. brush: aBrush
  5754.     "Select aBrush into this canvas."
  5755.  
  5756.     | oldBrush |
  5757.     oldBrush := brush.
  5758.     brush := aBrush.
  5759.     self selectObject: aBrush.
  5760.     ^oldBrush!
  5761.  
  5762. brushOrigin: aPoint
  5763.     "Sets the origin offset for brush drawing within the receiver to
  5764.     be aPoint. Answers the previous origin"
  5765.  
  5766.     | previous |
  5767.     previous := POINTL new.
  5768.     GDILibrary default 
  5769.         setBrushOrgEx: self asParameter nXOrg: aPoint x nYOrg: aPoint y lppt: previous asParameter.
  5770.     ^previous asPoint
  5771. !
  5772.  
  5773. clipBox
  5774.     "Answers the smallest <Rectangle> the completely bounds the receiver's current clipping region."
  5775.  
  5776.     | answer |
  5777.     answer := RECT new.
  5778.     GDILibrary default getClipBox: self asParameter lprc: answer.
  5779.     ^answer asRectangle!
  5780.  
  5781. colorDepth
  5782.     "Answers the colour bit depth supported by the receiver"
  5783.  
  5784.     ^(self getDeviceCaps: BITSPIXEL) * (self getDeviceCaps: PLANES)!
  5785.  
  5786. colors
  5787.     "Answers the number of colours supported by the receiver"
  5788.  
  5789.     ^2 raisedToInteger: (self colorDepth)!
  5790.  
  5791. drawBitmap: aBitmap at: dstOrigin extent: dstExtent from: srcOrigin extent: srcExtent rop: dwRasterOp
  5792.     "Private - Blit the specified rectangle of aBitmap to the specified destination
  5793.     rectangle with the specified raster op. The receiver is stretched to
  5794.     fit the destination rectangle. Handles and palette changes required
  5795.     by the bitmap. Answers zero if the operation fails"
  5796.  
  5797.     | hPalette oldPalette answer |
  5798.  
  5799.     "Create and apply the receiver's palette (if any)"
  5800.     hPalette := aBitmap createPalette.
  5801.     hPalette notNil ifTrue: [ oldPalette := self palette: hPalette ].
  5802.  
  5803.     answer := self
  5804.         stretchBlt: aBitmap canvas 
  5805.         rectangle: (Rectangle origin: srcOrigin extent: srcExtent) 
  5806.         to: dstOrigin
  5807.         extent: dstExtent
  5808.         rop: dwRasterOp.
  5809.  
  5810.     hPalette notNil ifTrue: [
  5811.         "Tidy up palette manipulation"
  5812.         self selectPalette: oldPalette.
  5813.         GDILibrary default     deleteObject: hPalette ].
  5814.  
  5815.     ^answer!
  5816.  
  5817. ellipse: aRectangle
  5818.     "Draw an ellipse on the receiver with the bounds of aRectangle."
  5819.  
  5820.     ^GDILibrary default
  5821.         ellipse: self asParameter
  5822.         nLeftRect: aRectangle left
  5823.         nTopRect: aRectangle top
  5824.         nRightRect: aRectangle right
  5825.         nBottomRect: aRectangle bottom
  5826. !
  5827.  
  5828. erase
  5829.     "Erase the receiver to the current background colour"
  5830.  
  5831.     self fillRectangle: (Rectangle origin: 0@0 extent: self extent) brush: (Brush color: self backcolor)!
  5832.  
  5833. extent
  5834.     "Answers a <Point> containing the pixel extent of the receiver"
  5835.  
  5836.     ^(self getDeviceCaps: HORZRES) @ (self getDeviceCaps: VERTRES)
  5837. !
  5838.  
  5839. fillRectangle: aRectangle
  5840.     "Draw a filled rectangle of size aRectangle using the current brush."
  5841.  
  5842.     ^UserLibrary default
  5843.         fillRect: self asParameter
  5844.         lprc: aRectangle asParameter
  5845.         hbr: self brush asParameter!
  5846.  
  5847. fillRectangle: aRectangle brush: aBrush
  5848.     "Draw a filled rectangle of size aRectangle using aBrush."
  5849.  
  5850.     ^UserLibrary default
  5851.         fillRect: self asParameter
  5852.         lprc: aRectangle asParameter
  5853.         hbr: aBrush asParameter!
  5854.  
  5855. fillRegion: aRegion brush: aBrush
  5856.     "Draw a filled region, aRegion, using aBrush."
  5857.  
  5858.     ^GDILibrary default
  5859.         fillRgn: self asParameter
  5860.         hRgn: aRegion asParameter
  5861.         hBr: aBrush asParameter!
  5862.  
  5863. finalize
  5864.     "Private - Finalize the affairs of the receiver - certain death imminent."
  5865.  
  5866.     self free!
  5867.  
  5868. font
  5869.     "Answer the current font."
  5870.  
  5871.     font isNil ifTrue: [ ^Font fromHandle: (self getCurrentObject: OBJ_FONT) ].
  5872.     ^font!
  5873.  
  5874. font: aFont
  5875.     "Select aFont into this canvas. Ensure that the font is realized for the receiver's
  5876.     resolution. Answer the previously selected font."
  5877.  
  5878.     | oldFont |
  5879.     oldFont := font.
  5880.     font := aFont.
  5881.     font resolution: self resolution.
  5882.     self selectObject: aFont.
  5883.     ^oldFont!
  5884.  
  5885. fonts: aString do: operation
  5886.     "Enumerate the fonts in a specified font family that are available on the receiver's device.
  5887.     The triadic valuable argument, operation, is passed the LOGFONT, TEXTMETRIC and font 
  5888.     type as its three arguments, and should answer true to continue the enueration, false to 
  5889.     terminate it (it must     not contain a ^-return).
  5890.  
  5891.         int CALLBACK EnumFontsProc(
  5892.             lplf lplf,    // pointer to logical-font data 
  5893.             lptm lptm,    // pointer to physical-font data 
  5894.             DWORD dwType,    // font type 
  5895.             LPARAM lpData     // pointer to application-defined data  
  5896.         );"
  5897.  
  5898.     | callback answer |
  5899.     callback := ExternalCallback 
  5900.         block: [ :lplf :lptm :dwType :lpData | operation value: lplf value: lptm value: dwType ]
  5901.         argumentTypes: 'LOGFONT* lpvoid dword dword'.
  5902.     answer := GDILibrary default
  5903.         enumFonts: self asParameter
  5904.         lpFaceName: aString
  5905.         lpFontFunc: callback asParameter
  5906.         lParam: 0.
  5907.     callback free.
  5908.     ^answer!
  5909.  
  5910. forecolor: colour
  5911.     "Set the receiver's colour for drawing text."
  5912.  
  5913.     ^GDILibrary default setTextColor: self asParameter crColor: colour asParameter!
  5914.  
  5915. formatText: text in: rect
  5916.     "Formats the <readableString> text within the <Rectangle> rect with wordbreak and 
  5917.     basic left alignment. Answers the height of the formatted text in pixels."
  5918.  
  5919.     ^self formatText: text in: rect flags: ##(DT_WORDBREAK | DT_LEFT)
  5920. !
  5921.  
  5922. formatText: text in: rect flags: formatFlags
  5923.     "Formats the <readableString> text within the <Rectangle> rect and using the <Integer> mode flags
  5924.     provided in formatFlags. Answers the height of the formatted text in pixels."
  5925.  
  5926.     ^UserLibrary default
  5927.         drawTextEx: self asParameter
  5928.         lpchText: text
  5929.         cchText: text size
  5930.         lprc: rect asParameter
  5931.         dwDTFormat: formatFlags
  5932.         lpDTParams: nil.
  5933. !
  5934.  
  5935. frameRectangle: aRectangle brush: aBrush
  5936.     "Frame aRectangle on the receiver using aBrush."
  5937.  
  5938.     ^UserLibrary default
  5939.         frameRect: self asParameter
  5940.         lprc: aRectangle asParameter
  5941.         hbr: aBrush asParameter!
  5942.  
  5943. free
  5944.     "Free any external resources."
  5945.  
  5946.     self beUnfinalizable.
  5947.     handle notNil ifTrue: [
  5948.         "Handle will be null (but not nil) on any old instances after an image restart"
  5949.         handle notNull ifTrue: [self basicFree].
  5950.         handle := source := font := pen := brush := nil.
  5951.         owned := false]!
  5952.  
  5953. getBkColor
  5954.     "Deprecated, use #backcolor."
  5955.  
  5956.     #deprecated.
  5957.     ^self backcolor!
  5958.  
  5959. getCurrentObject: aTypeInteger
  5960.     "Answers a handle to the current selected object of aTypeInteger.
  5961.     This should be one of OBJ_PEN, OBJ_BRUSH, OBJ_FONT etc"
  5962.  
  5963.     ^GDILibrary default getCurrentObject: self asParameter uObjectType: aTypeInteger!
  5964.  
  5965. getDeviceCaps: anInteger
  5966.     "Private - Answer the specified device capability."
  5967.  
  5968.     ^GDILibrary default getDeviceCaps: self asParameter index: anInteger!
  5969.  
  5970. getPixel: aPoint
  5971.     "Get the colour of the pixel at x@y."
  5972.  
  5973.     ^GDILibrary default
  5974.         getPixel: self asParameter
  5975.         xPos: aPoint x
  5976.         yPos: aPoint y!
  5977.  
  5978. handle
  5979.     "Answer the receiver's handle."
  5980.  
  5981.     ^self asParameter.
  5982.  
  5983.     #todo "Remove this"!
  5984.  
  5985. hiMetricToPels: himetric
  5986.     "Answer a <Point> which represents the same coordinate/dimension as the himetric
  5987.     coordinate <Point>, himetric,     but expressed in pixels, using the receiver's resolution to 
  5988.     perform the conversion.
  5989.     There are 2540 himetric units per logical inch (one inch = 25.4 millimetres)."
  5990.  
  5991.     | res |
  5992.     res := self resolution.
  5993.     ^((res x * himetric x) / 2540) rounded @
  5994.         ((res y * himetric y) / 2540) rounded
  5995.  
  5996. !
  5997.  
  5998. intersectClipRectangle: aRectangle
  5999.     "Create a new clipping region for the receiver from the intersection of the
  6000.     current clipping region and aRectangle."
  6001.  
  6002.     ^GDILibrary default
  6003.         intersectClipRect: self asParameter
  6004.         nLeftRect: aRectangle left
  6005.         nTopRect: aRectangle top
  6006.         nRightRect: aRectangle right
  6007.         nBottomRect: aRectangle bottom!
  6008.  
  6009. invertRectangle: aRectangle 
  6010.     "Invert the pixels within aRectangle"
  6011.  
  6012.     ^UserLibrary default
  6013.         invertRect: self asParameter
  6014.         lprc: aRectangle asParameter
  6015. !
  6016.  
  6017. isRectangleVisible: aRectangle
  6018.     "Answer whether any part of aRectangle is within the receivers device
  6019.     context cliiping region."
  6020.  
  6021.     ^GDILibrary default
  6022.         rectVisible: self asParameter
  6023.         lprc: aRectangle asParameter!
  6024.  
  6025. lineFrom: startPoint to: endPoint 
  6026.     "Draws a line from the <Point>, startPoint, up to BUT NOT INCLUDING, 
  6027.     the <Point>, endPoint.
  6028.     Implementation Note: For speed inline the raw calls."
  6029.  
  6030.     (GDILibrary default)
  6031.         moveToEx: self asParameter
  6032.             x: startPoint x
  6033.             y: startPoint y
  6034.             lpPoint: nil;
  6035.         lineTo: self asParameter
  6036.             nXEnd: endPoint x
  6037.             nYEnd: endPoint y!
  6038.  
  6039. lineTo: aPoint 
  6040.     "Draws a line from the current position up to, BUT NOT INCLUDING, aPoint."
  6041.  
  6042.     ^GDILibrary default 
  6043.         lineTo: self asParameter
  6044.         nXEnd: aPoint x
  6045.         nYEnd: aPoint y!
  6046.  
  6047. mapMode: mode
  6048.     "Sets the mapping mode of the receiver"
  6049.  
  6050.     ^GDILibrary default setMapMode: self asParameter fnMapMode: mode!
  6051.  
  6052. moveTo: aPoint 
  6053.     "Moves the current position to the <Point> argument."
  6054.  
  6055.     ^GDILibrary default 
  6056.         moveToEx: self asParameter
  6057.         x: aPoint x
  6058.         y: aPoint y
  6059.         lpPoint: nil!
  6060.  
  6061. nonOwnedDC: hDC
  6062.     "Private - Initialize the receiver to encapsulate the DC
  6063.     with handle, hDC, which the receiver does not own, and will not
  6064.     therefore free. The receiver is not finalizable (to reduce GC overhead)."
  6065.  
  6066.     handle := hDC asParameter.
  6067.     owned := false
  6068. !
  6069.  
  6070. onExit
  6071.     "Sent at session shutdown to ensure that all external resources are released."
  6072.  
  6073.     self free
  6074. !
  6075.  
  6076. origin: aPoint
  6077.     #deprecated.    "Use #viewportOrigin:"
  6078.     ^self viewportOrigin: aPoint!
  6079.  
  6080. ownedDC: hDC
  6081.     "Private - Initialize the receiver as the owner of the DC with
  6082.     the handle, hDC. The receiver is marked as finalizable to ensure
  6083.     that the DC is released/freed."
  6084.  
  6085.     handle := hDC asParameter.
  6086.     owned := true.
  6087.     self beFinalizable!
  6088.  
  6089. paintRegion: aRegion
  6090.     "Draw a filled region, aRegion, using the current brush"
  6091.  
  6092.     ^GDILibrary default
  6093.         paintRgn: self asParameter
  6094.         hRgn: aRegion asParameter
  6095. !
  6096.  
  6097. palette: hPalette
  6098.     "Selects and realizes the palette in hPalette into the receiver. 
  6099.     Answers the handle of the previous palette"
  6100.  
  6101.     | oldPalette |
  6102.     oldPalette := self selectPalette: hPalette.
  6103.     self realizePalette.
  6104.     ^oldPalette
  6105. !
  6106.  
  6107. patBlt: aRectangle rop: rop
  6108.     "Blits a rectangular region from aCanvasOrHandle to the receiver
  6109.     Answer true if the operation succeeds"
  6110.  
  6111.     ^GDILibrary default
  6112.         patBlt: self asParameter
  6113.         nXLeft: aRectangle left
  6114.         nYLeft: aRectangle top
  6115.         nWidth: aRectangle width
  6116.         nHeight: aRectangle height
  6117.         dwRop: rop!
  6118.  
  6119. pelsToHiMetric: pels
  6120.     "Answer a <Point> which represents the same coordinate/dimension as the <Point>, pels,
  6121.     but expressed in Hi-metric, using the receiver's resolution to perform the conversion.
  6122.     There are 2540 himetric units per logical inch (one inch = 25.4 millimetres)."
  6123.  
  6124.     | res |
  6125.     res := self resolution.
  6126.     ^((2540*pels x) / res x) rounded @
  6127.         ((2540*pels y) / res y) rounded.
  6128.  
  6129.  
  6130. !
  6131.  
  6132. pen
  6133.     "Answer the current pen."
  6134.  
  6135.     pen isNil ifTrue: [ ^Pen fromHandle: (self getCurrentObject: OBJ_PEN) ].
  6136.     ^pen!
  6137.  
  6138. pen: aPen
  6139.     "Select aPen into the receiver, and answer the old pen."
  6140.  
  6141.     | oldPen |
  6142.     oldPen := self pen.
  6143.     pen := aPen.
  6144.     self selectObject: aPen.
  6145.     ^oldPen!
  6146.  
  6147. pixelAt: aPoint
  6148.     "Get the colour of the pixel at aPoint, as a subinstance of Color."
  6149.  
  6150.     ^Color fromInteger: (self getPixel: aPoint)!
  6151.  
  6152. pixelAt: aPoint put: pixelColor
  6153.     "Set the colour of the pixel at aPoint to pixelColor.
  6154.     Answer whether it succeeded."
  6155.  
  6156.     ^GDILibrary default
  6157.         setPixelV: self asParameter
  6158.         x: aPoint x
  6159.         y: aPoint y
  6160.         crColor: pixelColor asParameter!
  6161.  
  6162. polygon: collectionOfPoints
  6163.     "Draw a filled polygon from the collection of points."
  6164.  
  6165.     | points count |
  6166.     count := collectionOfPoints size.
  6167.     points := StructureArray length: count elementClass: POINTL.
  6168.     points with: collectionOfPoints do: [:pointl :point | pointl x: point x; y: point y].
  6169.     ^GDILibrary default
  6170.         polygon: self asParameter
  6171.         lpPoints: points
  6172.         nCount: count!
  6173.  
  6174. realizePalette
  6175.     "Realizes the current logical palette of the receiver into the system palette"
  6176.  
  6177.     ^GDILibrary default realizePalette: self asParameter
  6178. !
  6179.  
  6180. rectangle: aRectangle
  6181.     "Draw aRectangle on the receiver."
  6182.  
  6183.     ^GDILibrary default rectangle: self asParameter
  6184.         nLeftRect: aRectangle left
  6185.         nTopRect: aRectangle top
  6186.         nRightRect: aRectangle right
  6187.         nBottomRect: aRectangle bottom
  6188. !
  6189.  
  6190. rectangle: aRectangle round: aPoint
  6191.     "Draw a round rectangle on the receiver."
  6192.  
  6193.     ^GDILibrary default
  6194.         roundRect: self asParameter
  6195.         nLeftRect: aRectangle left
  6196.         nTopRect: aRectangle top
  6197.         nRightRect: aRectangle right
  6198.         nBottomRect: aRectangle bottom
  6199.         nWidth: aPoint x
  6200.         nHeight: aPoint y
  6201. !
  6202.  
  6203. resolution
  6204.     "Answers a Point containing the logical pixels per inch for the receiver"
  6205.  
  6206.     ^(self getDeviceCaps: LOGPIXELSX) @ (self getDeviceCaps: LOGPIXELSY)
  6207. !
  6208.  
  6209. restore
  6210.     "Restore the last saved state of the receiver."
  6211.  
  6212.     ^self restore: -1!
  6213.  
  6214. restore: saveIndex
  6215.     "Restore the receiver's state to that saved at saveIndex using #save."
  6216.  
  6217.     | restoredId restoredObjects |
  6218.     GDILibrary default restoreDC: self asParameter nSavedDC: saveIndex.
  6219.     saveIndex == -1
  6220.         ifTrue: [
  6221.             "Effectivaly a 'pop' to previous context"
  6222.             restoredId := self saveIds removeLast]
  6223.         ifFalse: [
  6224.             "Restored to a specified point"
  6225.             restoredId := self saveIds remove: saveIndex].
  6226.     restoredObjects := self saved removeKey: restoredId.
  6227.     pen := restoredObjects at: 1.
  6228.     brush := restoredObjects at: 2.
  6229.     font := restoredObjects at: 3            
  6230.             !
  6231.  
  6232. save
  6233.     "Save the state of the receiver and answer its id. This can then later
  6234.     be restored using #restore:.
  6235.     Implementation Note: We must also save the current pen, brush, and
  6236.     font in order to prevent them from being GC'd, and so that we can
  6237.     restore them correctly later."
  6238.  
  6239.     | id |
  6240.     id := GDILibrary default saveDC: self asParameter.
  6241.     self saved at: id put: (Array with: pen with: brush with: font).
  6242.     ^self saveIds addLast: id!
  6243.  
  6244. saved
  6245.     "Private - Answer the value of the receiver's 'saved' instance variable."
  6246.  
  6247.     saved isNil ifTrue: [saved := IdentityDictionary new].
  6248.     ^saved!
  6249.  
  6250. saveIds
  6251.     "Private - Answer the value of the receiver's 'saveIds' instance variable."
  6252.  
  6253.     saveIds isNil ifTrue: [saveIds := OrderedCollection new].
  6254.     ^saveIds!
  6255.  
  6256. selectClipRegion: aRegion
  6257.     "Select aRegion as the clipping region of the receiver or deselect
  6258.     current clipping region if aRegion is nil."
  6259.  
  6260.     ^GDILibrary default
  6261.         selectClipRgn: self asParameter
  6262.         hrgn: aRegion asParameter!
  6263.  
  6264. selectObject: aGraphicsToolOrHandle
  6265.     "Private - Select aGraphicsToolOrHandle into the receiver, answering the handle of the previous
  6266.     object of that type."
  6267.  
  6268.     ^GDILibrary default selectObject: self asParameter
  6269.         hgdiobj: aGraphicsToolOrHandle asParameter!
  6270.  
  6271. selectPalette: hPalette
  6272.     "Selects the palette in hPalette into the receiver. Follow this with
  6273.     a #realizePalette to actual change the system palette. Answers the handle
  6274.     of the previous palette"
  6275.  
  6276.     ^GDILibrary default selectPalette: self asParameter hPal: hPalette bForceBackground: false
  6277. !
  6278.  
  6279. setBkColor: aColor
  6280.     "Deprecated - use #backcolor"
  6281.  
  6282.     #deprecated.
  6283.     ^self backcolor: aColor
  6284. !
  6285.  
  6286. setBkMode: mode
  6287.     "Set the receiver's background drawing mode to mode."
  6288.  
  6289.     ^GDILibrary default setBkMode: self asParameter iBkMode: mode!
  6290.  
  6291. setDefaultAttributes
  6292.     "Private - Set the receiver's initial pen, brush and font."
  6293.  
  6294.     self
  6295.         pen: Pen black;
  6296.         brush: Brush black;
  6297.         font: Font default.!
  6298.  
  6299. setTextAlign: alignment
  6300.     "Set the receiver's alignment for drawing text."
  6301.  
  6302.     ^GDILibrary default setTextAlign: self asParameter fMode: alignment!
  6303.  
  6304. setTextColor: colour
  6305.     "Set the receiver's colour for drawing text."
  6306.  
  6307.     "We've stopped short of deprecating this at the moment"
  6308.     ^self forecolor: colour!
  6309.  
  6310. source: aDCSource
  6311.     "Private - Set the receiver's DC source to the argument
  6312.     (which must implement #getDC and #releaseDC:).
  6313.     Answer the receiver."
  6314.  
  6315.     source := aDCSource!
  6316.  
  6317. stretchBlt: aCanvas rectangle: aRectangle to: dstOrigin extent: dstExtent rop: rop
  6318.     "Blits a rectangular region from aCanvas to the receiver with scaling.
  6319.     Answer true if the operation succeeds"
  6320.  
  6321.     ^GDILibrary default
  6322.         stretchBlt: self asParameter 
  6323.         nXOriginDest: dstOrigin x 
  6324.         nYOriginDest: dstOrigin y 
  6325.         nWidthDest: dstExtent x 
  6326.         nHeightDest: dstExtent y 
  6327.         hdcSrc: aCanvas asParameter 
  6328.         nXOriginSrc: aRectangle left 
  6329.         nYOriginSrc: aRectangle top 
  6330.         nWidthSrc: aRectangle width 
  6331.         nHeightSrc: aRectangle height 
  6332.         dwRop: rop
  6333. !
  6334.  
  6335. text: aString at: aPoint
  6336.     "Draw aString on the receiver starting at aPoint."
  6337.  
  6338.     ^GDILibrary default
  6339.         textOut: self asParameter
  6340.         nXStart: aPoint x
  6341.         nYStart: aPoint y
  6342.         lpString: aString
  6343.         cbString: aString size
  6344. !
  6345.  
  6346. textExtent: string
  6347.     "Answer the extent of string using the receivers currently selected font."
  6348.  
  6349.     | size |
  6350.     size := POINTL new.
  6351.     (GDILibrary default 
  6352.         getTextExtentPoint32: self asParameter
  6353.         lpString: string
  6354.         cbString: string size
  6355.         lpSize: size asParameter) ifFalse: [^GDILibrary default systemError].
  6356.     ^size asPoint!
  6357.  
  6358. textExtent: aString width: anIntegerWidth alignment: anAlignSymbol
  6359.     "Answer the extent of aString when formatted with an areas of anIntegerWidth
  6360.     using an alignment given by anAlignSymbol. The latter can be one of
  6361.     #left, #center, #right. Uses the receiver's currently selected font."
  6362.  
  6363.     | rect height align |
  6364.  
  6365.     align := ##(IdentityDictionary new
  6366.         at: #left put: DT_LEFT;
  6367.         at: #center put: DT_CENTER;
  6368.         at: #right put: DT_RIGHT;
  6369.         shrink;
  6370.         yourself) at: anAlignSymbol ifAbsent: [DT_LEFT].
  6371.  
  6372.     rect := 0@0 extent: anIntegerWidth @ 0.
  6373.     height := self formatText: aString in: rect flags: ##(DT_CALCRECT | DT_WORDBREAK) | align.
  6374.  
  6375.     ^anIntegerWidth @ height!
  6376.  
  6377. textMetrics
  6378.     "Answer the standard Win32 TEXTMETRICs for the currently selected font."
  6379.  
  6380.     | answer |
  6381.     answer := TEXTMETRIC new.
  6382.     (GDILibrary default getTextMetrics: self asParameter lptm: answer) 
  6383.         ifFalse: [GDILibrary default systemError].
  6384.     ^answer!
  6385.  
  6386. viewportExtent
  6387.     "Answers the extent of the receiver's viewport mapping."
  6388.  
  6389.     | extent |
  6390.     extent := POINTL new.
  6391.     (GDILibrary default getViewportExtEx: self asParameter lpSize: extent) 
  6392.         ifFalse: [^GDILibrary default systemError].
  6393.     ^extent asPoint!
  6394.  
  6395. viewportExtent: aPoint
  6396.     "Sets the extent of the receiver's viewport mapping. 
  6397.     Answers the old viewport extent"
  6398.  
  6399.     | previous |
  6400.     previous := POINTL new.
  6401.     (GDILibrary default 
  6402.         setViewportExtEx: self asParameter
  6403.         nXExtent: aPoint x
  6404.         nYExtent: aPoint y
  6405.         lpSize: previous) ifFalse: [^GDILibrary default systemError].
  6406.     ^previous asPoint!
  6407.  
  6408. viewportOrigin
  6409.     "Answers the origin of the receiver's viewport mapping."
  6410.  
  6411.     | origin |
  6412.     origin := POINTL new.
  6413.     (GDILibrary default getViewportOrgEx: self asParameter lppt: origin) 
  6414.         ifFalse: [^GDILibrary default systemError].
  6415.     ^origin asPoint!
  6416.  
  6417. viewportOrigin: aPoint
  6418.     "Set the origin of the receiver's viewport mapping and 
  6419.     answer the old viewport origin."
  6420.  
  6421.     | previous |
  6422.     previous := POINTL new.
  6423.     (GDILibrary default 
  6424.         setViewportOrgEx: self asParameter
  6425.         nXOrg: aPoint x
  6426.         nYOrg: aPoint y
  6427.         lppt: previous) ifFalse: [^GDILibrary default systemError].
  6428.     ^previous asPoint!
  6429.  
  6430. viewportRectangle: aRectangle
  6431.     "Sets the rectangle of the receiver's viewport mapping. 
  6432.     Answers the old viewport rectangle"
  6433.  
  6434.     | oldExtent oldOrigin |
  6435.     oldOrigin := self viewportOrigin: aRectangle topLeft.
  6436.     oldExtent := self viewportExtent: aRectangle extent.
  6437.     ^Rectangle origin: oldOrigin extent: oldExtent
  6438. !
  6439.  
  6440. windowExtent
  6441.     "Answers the extent of the receiver's window mapping."
  6442.  
  6443.     | extent |
  6444.     extent := POINTL new.
  6445.     (GDILibrary default getWindowExtEx: self asParameter lpSize: extent) 
  6446.         ifFalse: [^GDILibrary default systemError].
  6447.     ^extent asPoint!
  6448.  
  6449. windowExtent: aPoint
  6450.     "Sets the extent of the receiver's window mapping. 
  6451.     Answers the old window extent"
  6452.  
  6453.     | previous |
  6454.     previous := POINTL new.
  6455.     (GDILibrary default 
  6456.         setWindowExtEx: self asParameter
  6457.         nXExtent: aPoint x
  6458.         nYExtent: aPoint y
  6459.         lpSize: previous) ifFalse: [^GDILibrary default systemError].
  6460.     ^previous asPoint!
  6461.  
  6462. windowOrigin
  6463.     "Answers the origin of the receiver's window mapping."
  6464.  
  6465.     | origin |
  6466.     origin := POINTL new.
  6467.     (GDILibrary default getWindowOrgEx: self asParameter lppt: origin) 
  6468.         ifFalse: [^GDILibrary default systemError].
  6469.     ^origin asPoint!
  6470.  
  6471. windowOrigin: aPoint
  6472.     "Sets the origin of the receiver's window mapping. 
  6473.     Answers the old window origin"
  6474.  
  6475.     | previous |
  6476.     previous := POINTL new.
  6477.     (GDILibrary default 
  6478.         setWindowOrgEx: self asParameter
  6479.         nXOrg: aPoint x
  6480.         nYOrg: aPoint y
  6481.         lppt: previous) ifFalse: [^GDILibrary default systemError].
  6482.     ^previous asPoint!
  6483.  
  6484. windowRectangle: aRectangle
  6485.     "Sets the rectangle of the receiver's window mapping. 
  6486.     Answers the old viewport rectangle"
  6487.  
  6488.     | oldExtent oldOrigin |
  6489.     oldOrigin := self windowOrigin: aRectangle topLeft.
  6490.     oldExtent := self windowExtent: aRectangle extent.
  6491.     ^Rectangle origin: oldOrigin extent: oldExtent
  6492. !
  6493.  
  6494. windowScaling
  6495.     "Answers a Point that is the ratio of window units to device units for the receiver"
  6496.  
  6497.     ^self windowExtent / self viewportExtent! !
  6498.  
  6499. Category comment:
  6500. 'The abstract Category class is used to organize <Class> and <CompiledMethod> objects into subgroupings independent of the implementation hierarchy. This structuring is for the benefit of the user navigating through thousands of classes and methods in the Dolphin Smalltalk development system, and has no run-time significance.
  6501.  
  6502. Instance Variables:
  6503.     name    <String> name of the receiver, unique in the system.
  6504.     comment    <String> description of the category, for documentary purposes.
  6505.  
  6506. Class Variables:
  6507.     PermanentCategories        <Set> of all categories which are always available, even if empty
  6508.     '!
  6509. !Category class methodsFor!
  6510.  
  6511. categoryIcon
  6512.     "Answer an Icon representing the Category objects which the receiver collects." 
  6513.  
  6514.     ^self icon!
  6515.  
  6516. initialize
  6517.     "Private - Initialize the receiver's class variables."
  6518.  
  6519.     PermanentCategories := IdentitySet new!
  6520.  
  6521. name: categoryName
  6522.     "Answer the subinstance of the receiver with the 
  6523.     <readableString> name, categoryName."
  6524.  
  6525.     ^self subclassResponsibility!
  6526.  
  6527. new
  6528.     "Categories must be unique for any particular name, and must be instantiated with the #name:
  6529.     method."
  6530.  
  6531.     ^self shouldNotImplement!
  6532.  
  6533. newNamed: categoryName
  6534.     "Private - Answer a new subinstance of the receiver with the 
  6535.     <readableString> name, categoryName."
  6536.  
  6537.     ^self basicNew
  6538.         setName: categoryName asString;
  6539.         yourself!
  6540.  
  6541. separator
  6542.     "Private - Answer a Character used to split the individual names in a
  6543.     complete category."
  6544.  
  6545.     ^ $-!
  6546.  
  6547. unclassified
  6548.     "Answer a Category used to mark an unclassified object."
  6549.  
  6550.     ^self name: self unclassifiedName!
  6551.  
  6552. unclassifiedName
  6553.     "Private - Answer the String name used to mark a none existing category."
  6554.  
  6555.     ^self subclassResponsibility!
  6556.  
  6557. uninitialize
  6558.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  6559.  
  6560.     PermanentCategories := nil.! !
  6561.  
  6562. !Category methodsFor!
  6563.  
  6564. <= comperand
  6565.     "Answer whether the receiver is less than or equal to the <Category>,
  6566.     comperand."
  6567.  
  6568.     ^self name <= comperand name!
  6569.  
  6570. = comperand
  6571.     "Answer whether the receiver is considered equal to the <Object>, comperand."
  6572.  
  6573.     ^self species == comperand species and: [self name equals: comperand name]!
  6574.  
  6575. acceptsAdditions
  6576.     "Answer whether new members can be added to the receiver.
  6577.     Generally speaking pseudo categories do not accept additions, and
  6578.     ordinary categories do. Some types of non-pseudo virtual categories
  6579.     can have methods added to them."
  6580.  
  6581.     ^self isPseud not!
  6582.  
  6583. addClass: class
  6584.     "Add the <Class>, class, to the collection of classes associated with the receiver."
  6585.  
  6586.     ^self subclassResponsibility!
  6587.  
  6588. asString
  6589.     "Answer the string representation for the receiver."
  6590.  
  6591.     ^self name!
  6592.  
  6593. categoryIcon
  6594.     "Answer an Icon representing the Category object which the receiver matches." 
  6595.  
  6596.     ^self class categoryIcon!
  6597.  
  6598. contents
  6599.     "Answer all the objects held by the receiver."
  6600.  
  6601.     ^self subclassResponsibility!
  6602.  
  6603. displayOn: aStream
  6604.     "Append the receiver to aStream in a format that a user would want to see"
  6605.  
  6606.     aStream nextPutAll: self name!
  6607.  
  6608. hash
  6609.     "Answer the <integer> hash value for the receiver."
  6610.  
  6611.     ^self name hash!
  6612.  
  6613. isIntermediate
  6614.     "Private - Answer whether the receiver is a temporary category used only as a 
  6615.     branch node in a category tree."
  6616.  
  6617.     ^false!
  6618.  
  6619. isPermanent
  6620.     "Answer whether the receiver should be not removed from a CategoryManager
  6621.     when there are no references to it."
  6622.  
  6623.     ^PermanentCategories includes: self!
  6624.  
  6625. isPermanent: aBoolean
  6626.     "Set whether the receiver should not be removed when there are
  6627.     no references to it."
  6628.  
  6629.     aBoolean
  6630.         ifTrue: [PermanentCategories add: self]
  6631.         ifFalse: [PermanentCategories remove: self ifAbsent: []]!
  6632.  
  6633. isPseud
  6634.     "Answer whether the receiver is a pseudo (i.e. not a 'real') category.
  6635.     Pseudo categories have dynamically calculated contents, and may not accept 
  6636.     additions."
  6637.  
  6638.     ^self isVirtual!
  6639.  
  6640. isVirtual
  6641.     "Answer whether the receiver is a virtual category, i.e. one that
  6642.     has calculated contents. All pseudo-categories are virtual, but not vice versa."
  6643.  
  6644.     ^false!
  6645.  
  6646. localName
  6647.     "Answer the local name of the receiver unique only within the parent category"
  6648.  
  6649.     ^name copyFrom: (name lastIndexOf: self class separator)+1 to: name size!
  6650.  
  6651. name
  6652.     "Answer a unique, amongst Category objects, <readableString> name for the receiver."
  6653.  
  6654.     ^name!
  6655.  
  6656. printOn: aStream
  6657.     "Append a representation of the receiver to aStream."
  6658.  
  6659.     aStream 
  6660.         basicPrint: self;
  6661.         nextPut: $(;
  6662.         print: name;
  6663.         nextPut: $)!
  6664.  
  6665. removeClass: class
  6666.     "Remove the <ClassDescription>, class, from the classes 'held' by the receiver."
  6667.  
  6668.     ^self subclassResponsibility!
  6669.  
  6670. setName: aName
  6671.     "Private - Set the name of the receiver to aName.
  6672.  
  6673.     Restrict access because name has to be unique amongst all Categories and
  6674.     so we have to ensure that the Category categoryNames dictionary is kept
  6675.     up to date."
  6676.  
  6677.     name := aName!
  6678.  
  6679. subNames
  6680.     "Answer an OrderedCollection of the receivers name split
  6681.     on category separator."
  6682.  
  6683.     ^self name subStrings: self class separator! !
  6684.  
  6685. ChunkReader comment:
  6686. '
  6687.     The source reader is delegated the task of reading chunks
  6688.     from the input stream, and so can impose its own format.'!
  6689. !ChunkReader class methodsFor!
  6690.  
  6691. do: operation 
  6692.     "Answer a new instance of the reciever which will evaluate
  6693.     the monadic valuable, operation, for every chunk string read
  6694.     via the source manager, aSourceManager."
  6695.  
  6696.     ^self do: operation atEnd: []!
  6697.  
  6698. do: operation atEnd: finalOperation 
  6699.     "Answer a new instance of the reciever which will evaluate
  6700.     the <monadicValuable>, operation, for every chunk string read
  6701.     via the source manager, aSourceManager. At the end
  6702.     of the batch of chunks (i.e. when an empty chunk is reach),
  6703.     the <niladicValuable>, finalOperation, is evaluated."
  6704.  
  6705.     ^self 
  6706.         do: operation
  6707.         inContext: nil
  6708.         atEnd: finalOperation!
  6709.  
  6710. do: operation inContext: contextObject atEnd: finalOperation 
  6711.     "Answer a new instance of the reciever which will evaluate
  6712.     the <monadicValuable>, operation, for every chunk string read
  6713.     via the source manager, aSourceManager. At the end
  6714.     of the batch of chunks (i.e. when an empty chunk is reach),
  6715.     the <niladicValuable>, finalOperation, is evaluated."
  6716.  
  6717.     ^(self new)
  6718.         setChunkBlock: operation
  6719.             context: contextObject
  6720.             endAction: finalOperation;
  6721.         yourself!
  6722.  
  6723. null
  6724.     "Answer a null instance of the receiver which consumes and discards input without
  6725.     processing it in any way."
  6726.  
  6727.     Null isNil ifTrue: [Null := self do: [:chunk |]].
  6728.     ^Null!
  6729.  
  6730. onPreStripImage
  6731.     "Private - The image is about to be deployed as an executable/DLL. Clean away
  6732.     any lazily initialized class variables in order to assist the stripping process."
  6733.  
  6734.     Null := nil! !
  6735.  
  6736. !ChunkReader methodsFor!
  6737.  
  6738. chunk: chunkString
  6739.     "Private - Evaluate the receivers chunkBlock with chunkString."
  6740.  
  6741.     self chunkBlock value: chunkString!
  6742.  
  6743. chunkBlock
  6744.     "Answer the receivers chunkBlock. This is a <monadicValuable> 
  6745.     which is evaluated for each chunk of text read from a stream."
  6746.  
  6747.     ^chunkBlock!
  6748.  
  6749. context
  6750.     "Answer the context <Object> associated with the receiver when it was created (usually the class
  6751.     into which methods are to be compiled)."
  6752.  
  6753.     ^context!
  6754.  
  6755. fileInFrom: aSourceFiler
  6756.     "Private - File in the next chunk from the <ChunkSourceFiler> argument, 
  6757.     aChunkSourceFiler. Continue reading chunks until the end of the file or an 
  6758.     empty chunk is reached, at which point the final action is evaluated. Answer 
  6759.     the result of the final action."
  6760.  
  6761.     | chunk |
  6762.     [aSourceFiler atEnd or: [(chunk := aSourceFiler nextChunk) isEmpty]]
  6763.         whileFalse: [self chunk: chunk].
  6764.     ^endAction value!
  6765.  
  6766. setChunkBlock: perChunk context: contextObject endAction: finalOperation 
  6767.     "Private - Initialize the receiver's instance variables."
  6768.  
  6769.     chunkBlock := perChunk.
  6770.     endAction := finalOperation.
  6771.     context := contextObject! !
  6772.  
  6773. ClassBuilder comment:
  6774. ''!
  6775. !ClassBuilder class methodsFor!
  6776.  
  6777. allClassVarNamesOf: aClass
  6778.     "Private - Answer an array of the class var names of aClass.
  6779.     The Array will be empty if aClass is nil."
  6780.  
  6781.     ^aClass isNil
  6782.         ifTrue: [Array new]
  6783.         ifFalse: [aClass allClassVarNames]!
  6784.  
  6785. allInstVarNamesOf: aClass
  6786.     "Private - Answer an array of the inst var names of aClass.
  6787.     The Array will be empty if aClass is nil."
  6788.  
  6789.     ^aClass isNil
  6790.         ifTrue: [Array new]
  6791.         ifFalse: [aClass allInstVarNames]!
  6792.  
  6793. classOf: aClass
  6794.     "Private - Answer the class of aClass or Class if it is nil."
  6795.  
  6796.     ^aClass notNil
  6797.         ifTrue: [aClass class]
  6798.         ifFalse: [Class]!
  6799.  
  6800. forModifying: aClass 
  6801.     "Answer a new instance of the receiver set up to modify the <Class>, aClass.
  6802.     The instance is initialized with all the current attributes of the class, so obviously
  6803.     one or more of these must be modified if any modification is actually to take place."
  6804.  
  6805.     ^(self new)
  6806.         class: aClass;
  6807.         superclass: aClass superclass;
  6808.         instanceVariables: aClass instVarNames;
  6809.         classVariables: aClass classVarNames;
  6810.         sharedPools: aClass sharedPoolNames;
  6811.         yourself!
  6812.  
  6813. fundamentalTypeOf: anInstanceSpec
  6814.     "Private - Answer the combined settings of the isVariable and isPointers flags of anInstanceSpec."
  6815.  
  6816.     ^anInstanceSpec bitAnd: _VariableMask + _PointersMask!
  6817.  
  6818. initialize
  6819.     "Initialize the receiver's class variables.
  6820.         ClassBuilder initialize
  6821.     "
  6822.  
  6823.     Unsubclassable := 
  6824.         (Set new
  6825.             add: Character;
  6826.             add: SmallInteger;
  6827.             shrink).
  6828.  
  6829.     FixedLayout := 
  6830.         (Set new
  6831.             add: True;
  6832.             add: False;
  6833.             add: Array;
  6834.             add: ByteArray;
  6835.             add: String;
  6836.             add: Association;
  6837.             add: Character;
  6838.             add: SmallInteger;
  6839.             add: LargeInteger;
  6840.             add: Float;
  6841.             add: BlockClosure;
  6842.             add: MethodContext;
  6843.             add: ExternalMethod;
  6844.             add: ExternalAddress;
  6845.             add: Message;
  6846.             add: MethodDictionary;
  6847.             add: UndefinedObject;
  6848.             add: Object;
  6849.             shrink).
  6850.  
  6851.     FixedInitialLayout := 
  6852.         (Set new
  6853.             add: Class;
  6854.             add: Metaclass;
  6855.             add: PositionableStream;
  6856.             add: Semaphore;
  6857.             add: Process;
  6858.             add: ProcessorScheduler;
  6859.             shrink).
  6860. !
  6861.  
  6862. instanceSpecIsBytes: anInstanceSpec
  6863.     "Private - Answer whether anInstanceSpec represents a byte subclass."
  6864.  
  6865.     ^(anInstanceSpec anyMask: _PointersMask) not!
  6866.  
  6867. instanceSpecWithFixedPointers: anInteger
  6868.     "Private - Answer an instance spec based on anInteger but adjusted to represent instances
  6869.     containing named instance vars only."
  6870.  
  6871.     ^_PointersMask bitOr: (anInteger bitAnd: _SizeMask)!
  6872.  
  6873. instanceSpecWithIndirectBytes
  6874.     "Private - Answer an instance spec to represent instances with no named instances variables,
  6875.     made of indexable bytes and interpreted by certain system primitives as an indirection to
  6876.     other data."
  6877.  
  6878.     ^_VariableMask + _IndirectMask!
  6879.  
  6880. instanceSpecWithNullTerminatedBytes
  6881.     "Private - Answer an instance spec to represent instances with no named instances variables,
  6882.     made of indexable bytes and terminated by an extra byte initialized to null."
  6883.  
  6884.     ^_VariableMask + _NullTermMask!
  6885.  
  6886. instanceSpecWithVariableBytes: anInteger
  6887.     "Private - Answer an instance spec based on anInteger but adjusted to represent instances
  6888.     with no named instances variables and made of indexable bytes."
  6889.  
  6890.     ^_VariableMask
  6891.         bitOr: (anInteger bitAnd: _NullTermMask + _IndirectMask)!
  6892.  
  6893. instanceSpecWithVariablePointers: anInteger
  6894.     "Private - Answer an instance spec based on anInteger but adjusted to represent instances
  6895.     containing indexable pointers with or without named instance vars."
  6896.  
  6897.     ^_VariableMask + _PointersMask
  6898.         bitOr: (anInteger bitAnd: _SizeMask)!
  6899.  
  6900. instSizeOf: aClass
  6901.     "Private - Answer the fixed size of aClass or zero if it is nil."
  6902.  
  6903.     ^aClass isNil
  6904.         ifTrue: [0]
  6905.         ifFalse: [aClass instSize]!
  6906.  
  6907. invalidRemoveError
  6908.     "Answer the <exceptionSelector> that can be used to catch <Exception>s raised by the receiver
  6909.     when some error occurs removing a class, for example as a result of errors occuring while
  6910.     uninitializing the class or because it has extant instances or subclasses. The exceptions are resumable 
  6911.     (i.e. #resume: is a valid handler response, and allows the handler to ignore the exception and 
  6912.     forcibly remove the class)."
  6913.  
  6914.     ^ClassRemovalError!
  6915.  
  6916. isFixedLayout: aClass
  6917.     "Answer whether the <Class> argument is of fixed layout (i.e. its
  6918.     collection of instance variables cannot be changed in any way)."
  6919.  
  6920.     ^(FixedLayout anySatisfy: [:cls | cls withAllSuperclasses includes: aClass]) 
  6921.         or: [FixedInitialLayout anySatisfy: [:cls | cls allSuperclasses includes: aClass]]!
  6922.  
  6923. isValidClassName: aString
  6924.     "Private - Answer whether aString is a valid class name."
  6925.  
  6926.     ^(self parser isAValidLocalIdentifier: aString) and: [
  6927.         aString first == $_ or: [aString first isUppercase]]!
  6928.  
  6929. moveClass: aClass toSuperclass: aSuperclass
  6930.     "Move aClass to be subclassed from aSuperclass."
  6931.  
  6932.     self new
  6933.         class: aClass;
  6934.         superclass: aSuperclass;
  6935.         modifyExistingClass
  6936. !
  6937.  
  6938. new
  6939.     "Answer a new initialized instance."
  6940.  
  6941.     ^super new initialize!
  6942.  
  6943. parser
  6944.     "Private - Answer the parser to use for identifier validation."
  6945.  
  6946.     ^Compiler!
  6947.  
  6948. publishedEventsOfInstances
  6949.         "Answer a Set of Symbols that describe the published events triggered
  6950.         by instances of the receiver."
  6951.     
  6952.         ^super publishedEventsOfInstances
  6953.             add: #classAdded:;
  6954.             add: #classUpdated:;
  6955.             yourself.
  6956.     !
  6957.  
  6958. removeClass: aClass
  6959.     "Remove aClass."
  6960.  
  6961.     self new
  6962.         class: aClass;
  6963.         remove
  6964. !
  6965.  
  6966. renameClass: aClass to: aString
  6967.     "Rename aClass to aString."
  6968.  
  6969.     self new
  6970.         class: aClass;
  6971.         className: aString;
  6972.         rename
  6973. !
  6974.  
  6975. validateClassVarName: aString using: aCollection
  6976.     "Private - Ensure that the proposed class variable name is not a
  6977.     reserved word and does not duplicate a name defined in aCollecton."
  6978.  
  6979.     (self parser isAValidLocalIdentifier: aString)
  6980.         ifFalse: [self error: 'Proposed class variable ''', aString, ''' is invalid as a local identifier.'].
  6981.     (aCollection includes: aString)
  6982.         ifTrue: [self error: 'Proposed class variable ''', aString, ''' is multiply defined.'].
  6983.     aString first isUppercase
  6984.         ifFalse: [
  6985.             aString first == $_ ifTrue: [
  6986.                 ^Smalltalk at: #SmalltalkSystem ifPresent: [:c | 
  6987.                     c current isOAD ifTrue: [
  6988.                         Warning signal: 'Identifiers beginning with an underscore, such as ', aString, ', are reserved for system use']]].
  6989.             Warning signal: 'Proposed class variable ''', aString, ''' should start with an uppercase letter.']!
  6990.  
  6991. validateClassVars: classVarsArray againstSuperclass: aClass
  6992.     "Private - Ensure that the proposed class variable name list does not
  6993.     contain a reserved word or a duplicate name defined either in the list
  6994.     itself or anywhere in the proposed superclass chain.
  6995.     Answer a Set of the existing and proposed class vars of the class and its
  6996.     superclasses."
  6997.  
  6998.     | classVarSet |
  6999.     classVarSet := (self allClassVarNamesOf: aClass) asSet.
  7000.     classVarsArray do: [:classVar |
  7001.         self validateClassVarName: classVar using: classVarSet.
  7002.         classVarSet add: classVar].
  7003.     ^classVarSet
  7004. !
  7005.  
  7006. validateInstanceSpec: anInstanceSpec size: anInteger superclass: proposedSuperclass
  7007.     "Private - Validate the proposed instance spec, fixed size and superclass
  7008.     and answer a completed instance spec."
  7009.  
  7010.     | spec fundamentalType fixedSize |
  7011.     spec := anInstanceSpec bitAnd: _SizeMask bitInvert.
  7012.     fundamentalType := self fundamentalTypeOf: spec.
  7013.     fundamentalType = _VariableMask
  7014.         ifTrue: [spec := self validateSpecAsVariableBytes: spec size: anInteger superclass: proposedSuperclass].
  7015.     fundamentalType = _PointersMask
  7016.         ifTrue: [spec := self validateSpecAsFixedPointers: spec size: anInteger superclass: proposedSuperclass].
  7017.     fundamentalType = (_VariableMask + _PointersMask)
  7018.         ifTrue: [spec := self validateSpecAsVariablePointers: spec size: anInteger superclass: proposedSuperclass].
  7019.     fixedSize := anInteger + (self instSizeOf: proposedSuperclass).
  7020.     fixedSize > _SizeMask
  7021.         ifTrue: [    self error: 'Classes are allowed a maximum of ', _SizeMask displayString, ' instance variables.'].
  7022.     ^spec bitOr: fixedSize!
  7023.  
  7024. validateInstanceVars: instVarsArray againstSuperclass: aClass
  7025.     "Private - Ensure that the proposed instance variable name list does not
  7026.     contain a reserved word or a duplicate name defined either in the list
  7027.     itself or anywhere in the proposed superclass chain.
  7028.     Answer a Set of the existing and proposed inst vars of the class and its
  7029.     superclasses."
  7030.  
  7031.     | instVarSet |
  7032.     instVarSet := (self allInstVarNamesOf: aClass) asSet.
  7033.     instVarsArray do: [:instVar |
  7034.         self validateInstVarName: instVar using: instVarSet.
  7035.         instVarSet add: instVar].
  7036.     ^instVarSet
  7037. !
  7038.  
  7039. validateInstVarName: aString using: aCollection
  7040.     "Private - Ensure that the proposed instance variable name is not a
  7041.     reserved word and does not duplicate a name defined in aColecton."
  7042.  
  7043.     (self parser isAValidLocalIdentifier: aString)
  7044.         ifFalse: [self error: 'Proposed instance variable ''', aString, ''' is invalid as a local identifier.'].
  7045.     (aCollection includes: aString)
  7046.         ifTrue: [self error: 'Proposed instance variable ''', aString, ''' is multiply defined.']
  7047. !
  7048.  
  7049. validateSpecAsFixedPointers: spec size: anInteger superclass: proposedSuperclass
  7050.     "Private - Answer a validated instance spec. Signal an exception if spec is
  7051.     invalid as a fixed size pointer subclass of proposedSuperclass."
  7052.  
  7053.     proposedSuperclass notNil
  7054.         ifTrue: [
  7055.             proposedSuperclass isBytes
  7056.                 ifTrue: [self validateSpecAsVariablePointers: spec size: anInteger superclass: proposedSuperclass].
  7057.             proposedSuperclass isVariable
  7058.                 ifTrue: [self error: 'Subclasses of an indexed class must also be indexed.']].
  7059.     ^spec
  7060. !
  7061.  
  7062. validateSpecAsVariableBytes: spec size: anInteger superclass: proposedSuperclass
  7063.     "Private - Answer a validated instance spec possibly containing indirect or
  7064.     nullTerminated bits inherited from the proposedSuperclass. Signal an exception
  7065.     if spec is invalid as a variable byte subclass of proposedSuperclass."
  7066.  
  7067.     | inheritedFlags validatedSpec |
  7068.     inheritedFlags := _IndirectMask + _NullTermMask.
  7069.     validatedSpec := spec.
  7070.     proposedSuperclass notNil
  7071.         ifTrue: [
  7072.             proposedSuperclass instSize > 0
  7073.                 ifTrue: [self error: 'A byte subclass may not derive from a class containing named instance variables'].
  7074.             (proposedSuperclass isPointers and: [proposedSuperclass isVariable])
  7075.                 ifTrue: [self error: 'A byte subclass may not derive from a class containing indexed instance variables'].
  7076.             validatedSpec := validatedSpec bitOr: (inheritedFlags bitAnd: proposedSuperclass instanceSpec)].
  7077.  
  7078.     (validatedSpec allMask: inheritedFlags)
  7079.         ifTrue: [self error: 'A byte subclass may not be both indirect and null-terminated.'].
  7080.     anInteger > 0
  7081.         ifTrue: [self error: 'A byte subclass may not contain named instance variables.'].
  7082.     ^validatedSpec!
  7083.  
  7084. validateSpecAsVariablePointers: spec size: anInteger superclass: proposedSuperclass
  7085.     "Private - Answer a validated instance spec. Signal an exception if spec is
  7086.     invalid as a variable subclass of proposedSuperclass."
  7087.  
  7088.     (proposedSuperclass notNil and: [proposedSuperclass isBytes])
  7089.         ifTrue: [self error: 'A subclass containing pointers may not derive from a class containing bytes.'].
  7090.     (spec anyMask: _IndirectMask)
  7091.         ifTrue: [self error: 'Indirect subclasses must contain bytes.'].
  7092.     (spec anyMask: _NullTermMask)
  7093.         ifTrue: [self error: 'Null-terminated subclasses must contain bytes.'].
  7094.     ^spec! !
  7095.  
  7096. !ClassBuilder methodsFor!
  7097.  
  7098. beBytes
  7099.     "Private - Set the class type to variable bytes."
  7100.  
  7101.     instanceSpec := self class instanceSpecWithVariableBytes: instanceSpec!
  7102.  
  7103. beFixed
  7104.     "Private - Set the class type to pointers containing named instance vars only."
  7105.  
  7106.     instanceSpec := self class instanceSpecWithFixedPointers: instanceSpec!
  7107.  
  7108. beIndirectBytes
  7109.     "Private - Set the class type to indirect bytes."
  7110.  
  7111.     instanceSpec := self class instanceSpecWithIndirectBytes!
  7112.  
  7113. beNullTerminatedBytes
  7114.     "Private - Set the class type to null-terminated variable bytes."
  7115.  
  7116.     instanceSpec := self class instanceSpecWithNullTerminatedBytes!
  7117.  
  7118. beVariable
  7119.     "Private - Set the class type to indexable pointers and named instance vars."
  7120.  
  7121.     instanceSpec := self class instanceSpecWithVariablePointers: instanceSpec!
  7122.  
  7123. canMutateInSitu
  7124.     "Private - Answer whether the class being modified can be changed without
  7125.     mutating its instances. Class only mutation is possible providing that the
  7126.     following remain unchanged:
  7127.         the instance spec,
  7128.         the instance variable layout and
  7129.         the class instance variable layout."
  7130.  
  7131.     self instanceShapeIsBeingChanged
  7132.         ifTrue: [^false].
  7133.     self superclassIsBeingChanged
  7134.         ifFalse: [^self instanceVariablesAreBeingChanged not].
  7135.  
  7136.     "The class is being moved."
  7137.     (self class allInstVarNamesOf: superclass),instanceVariables = currentClass allInstVarNames
  7138.         ifFalse: [^false].
  7139.     (self class classOf: superclass) allInstVarNames = currentClass class superclass allInstVarNames
  7140.         ifFalse: [^false].
  7141.  
  7142.     ^true.
  7143.  
  7144.     !
  7145.  
  7146. categories
  7147.     categories isNil ifTrue: [self categoryNames: #('')].
  7148.     ^categories!
  7149.  
  7150. categories: aCollectionOfClassCategories
  7151.     categories := aCollectionOfClassCategories!
  7152.  
  7153. categoryNames: aCollectionOfStrings
  7154.     self categories: (self classCategoryClass isNil 
  7155.                 ifTrue: [#()]
  7156.                 ifFalse: 
  7157.                     [aCollectionOfStrings collect: [:each | self classCategoryClass name: each]])!
  7158.  
  7159. class: aClass
  7160.     "Private - Set the currentClass inst var to the class to be modified, aClass."
  7161.  
  7162.     currentClass := aClass.
  7163.     self instanceSpec: aClass instanceSpec.!
  7164.  
  7165. classCategoryClass
  7166.     ^(superclass isNil ifTrue: [superclass class] ifFalse: [superclass]) 
  7167.         classCategoryClass!
  7168.  
  7169. className: aString
  7170.     "Private - Set the className inst var to aString."
  7171.  
  7172.     className := aString!
  7173.  
  7174. classVariables
  7175.     "Private - Answer an Array of proposed class variable names."
  7176.  
  7177.     ^classVariables isNil
  7178.         ifTrue: [Array new]
  7179.         ifFalse: [classVariables]!
  7180.  
  7181. classVariables: aClassVarNamesArray
  7182.     "Set the receiver's classVariables inst var to aClassVarNamesArray."
  7183.  
  7184.     classVariables := aClassVarNamesArray asArray!
  7185.  
  7186. classVariableString: aClassVarNamesString
  7187.     "Set the receiver's proposed class variable list from aString."
  7188.  
  7189.     self classVariables: aClassVarNamesString subStrings!
  7190.  
  7191. comment: aString
  7192.     "Private - Set the comment to apply to the class being modified."
  7193.  
  7194.     comment := aString!
  7195.  
  7196. createNewClass
  7197.     "Private - Create, install and answer a new class from the
  7198.     details contained in the receiver."
  7199.  
  7200.     self
  7201.         validateForCreate;
  7202.         createProper;
  7203.         install: currentClass;
  7204.         setNewClassCategories;
  7205.         generateGUID;
  7206.         notifyClassCreated.
  7207.     ^currentClass!
  7208.  
  7209. createPrivate
  7210.     "Private - Create and answer a new class from the details contained
  7211.     in the receiver. The class is not included in its superclasses'
  7212.     subclasses collection nor is its name installed as a global."
  7213.  
  7214.     self
  7215.         validateForCreatePrivate;
  7216.         createProper.
  7217.     currentClass removeFromSuper.
  7218.     ^currentClass!
  7219.  
  7220. createProper
  7221.     "Private - Create a new class from the details contained in the receiver.
  7222.     First, create an instance of Metaclass then send this new instance a #new
  7223.     message to create its single instance class. Save the answer in the
  7224.     receiver's currentClass inst var."
  7225.  
  7226.     | metaSuperclass newMetaclass |
  7227.     metaSuperclass := self class classOf: superclass.
  7228.     (newMetaclass := Metaclass new)
  7229.         methodDictionary: MethodDictionary new;
  7230.         instanceSpec: metaSuperclass instanceSpec;
  7231.         superclass: metaSuperclass.
  7232.  
  7233.     (currentClass := newMetaclass new)
  7234.         methodDictionary: MethodDictionary new;
  7235.         instanceSpec: instanceSpec;
  7236.         setName: className asSymbol;
  7237.         setSuperclass: superclass.
  7238.     
  7239.     "In order to sort the metaclass subclasses, we need the instance class name, so we
  7240.     leave addition to the superclass subclasses list until the instance class has been created."
  7241.     newMetaclass addToSuper.
  7242.  
  7243.     self
  7244.         setInstanceVariablesOf: currentClass;
  7245.         setClassVariablesOf: currentClass;
  7246.         setSharedPoolsOf: currentClass;
  7247.         setCommentOf: currentClass!
  7248.  
  7249. currentClass
  7250.     "Answer the currentClass inst var."
  7251.  
  7252.     ^currentClass!
  7253.  
  7254. environment
  7255.     "Private - Answer the namespace environment for the class being modified."
  7256.  
  7257.     ^self class environment!
  7258.  
  7259. errorInvalidRemove: messageText
  7260.     "Private - An error has occurred removing the receiver's current class. Raise an 
  7261.     appropriate exception."
  7262.  
  7263.     ^self class invalidRemoveError
  7264.         signal: messageText
  7265.         with: self currentClass!
  7266.  
  7267. fundamentalTypeIsBeingChanged
  7268.     "Private - Answer whether the fundamental class type (ie. Pointers/Bytes, Indexed/Fixed)
  7269.     is being changed."
  7270.  
  7271.     ^(self class fundamentalTypeOf: instanceSpec) ~~ (self class fundamentalTypeOf: currentClass instanceSpec)            !
  7272.  
  7273. generateGUID
  7274.     "Private - Generate a GUID for a new class and assign it to that class."
  7275.  
  7276.     currentClass setGuid: GUID newUnique!
  7277.  
  7278. generateInstanceSpecFor: aClass superclass: aSuperclass
  7279.     "Private - Answer an instance spec based on aClass, the information in the receiver
  7280.     and the proposed superclass aSuperclass."
  7281.  
  7282.     ^aClass == currentClass
  7283.         ifTrue: [
  7284.             self class
  7285.                 validateInstanceSpec: instanceSpec
  7286.                 size: self instanceVariables size
  7287.                 superclass: aSuperclass]
  7288.         ifFalse: [
  7289.             self class
  7290.                 validateInstanceSpec: aClass instanceSpec
  7291.                 size: aClass instVarNames size 
  7292.                 superclass: aSuperclass].!
  7293.  
  7294. generateMapFrom: oldClass to: newClass
  7295.     "Private - Answer an array with an element corresponding to each named
  7296.     instance variables in newClass. The elements contain the index of the
  7297.     instance variable index of instances of oldClass that have the same
  7298.     name in newClass. If there is no match the element will be zero."
  7299.  
  7300.     | oldInstVarNamesArray |
  7301.     oldInstVarNamesArray := oldClass allInstVarNames.
  7302.     ^newClass allInstVarNames collect: [:name | oldInstVarNamesArray indexOf: name]!
  7303.  
  7304. initialize
  7305.     "Private - Initialize the instance."
  7306.  
  7307.     instanceSpec := 0.
  7308.     self beFixed.
  7309.     recompilationRequired := false.
  7310. !
  7311.  
  7312. initializeCopy: aClassDescriptionCopy fromClass: aClass superclass: aSuperclass
  7313.     "Private - Adjust the invalid inst vars of aClassDescription. Its method
  7314.     dictionary should be a copy of that in aClass, its instanceSpec may
  7315.     require reconstruction, it should have no subclasses, it should be made
  7316.     a subclass of aSuperclass, it may require its instanceVariables inst var
  7317.     to be adjusted and should then be recompiled to correct any invalid
  7318.     references in the copied method dictionary.
  7319.     Answer the adjusted ClassDescription."
  7320.  
  7321.     | instSpec |
  7322.     instSpec := self generateInstanceSpecFor: aClass superclass: aSuperclass.
  7323.     aClassDescriptionCopy
  7324.         methodDictionary: aClass methodDictionary copy;
  7325.         instanceSpec: instSpec;
  7326.         subclasses: nil;
  7327.         superclass: aSuperclass;
  7328.         addToSuper.
  7329.     aClass == currentClass
  7330.         ifTrue: [self setInstanceVariablesOf: aClassDescriptionCopy].
  7331.  
  7332.     aClassDescriptionCopy compileAll.
  7333.     ^aClassDescriptionCopy!
  7334.  
  7335. install: aClassDescription
  7336.     "Private - Install aClassDescription into its environment."
  7337.  
  7338.     aClassDescription requiresInstallation
  7339.         ifTrue: [self environment at: aClassDescription name put: aClassDescription]!
  7340.  
  7341. instanceShapeIsBeingChanged
  7342.     "Private - Answer whether the instance spec is being changed."
  7343.  
  7344.     ^(instanceSpec bitAnd: _ShapeMask) ~= (currentClass instanceSpec bitAnd: _ShapeMask)
  7345.             !
  7346.  
  7347. instanceSpec: anInteger
  7348.     "Private - Set the instance specification flags of the receiver to anInteger."
  7349.  
  7350.     instanceSpec := anInteger!
  7351.  
  7352. instanceVariables
  7353.     "Private - Answer an Array of proposed instance variable names."
  7354.  
  7355.     ^instanceVariables notNil
  7356.         ifTrue: [instanceVariables]
  7357.         ifFalse: [
  7358.             currentClass isNil
  7359.                 ifTrue: [Array new]
  7360.                 ifFalse: [currentClass instVarNames]]!
  7361.  
  7362. instanceVariables: anInstVarNamesArray
  7363.     "Set the receiver's instanceVariables inst var to anInstVarNamesArray."
  7364.  
  7365.     instanceVariables := anInstVarNamesArray!
  7366.  
  7367. instanceVariablesAreBeingChanged
  7368.     "Private - Answer whether the instance variable layout is changing."
  7369.  
  7370.     ^instanceVariables notNil and: [instanceVariables ~= currentClass instVarNames]!
  7371.  
  7372. instanceVariableString
  7373.     "Private - Answer the receiver's proposed instance variable list as
  7374.     a space separated String."
  7375.  
  7376.     ^self instanceVariables isEmpty
  7377.         ifTrue: [nil]
  7378.         ifFalse: [ | aStream |
  7379.             aStream := String writeStream: 32.
  7380.             instanceVariables 
  7381.                     do: [:instVarName | aStream nextPutAll: instVarName]
  7382.                     separatedBy: [aStream space].
  7383.             aStream contents]!
  7384.  
  7385. instanceVariableString: anInstVarNamesString
  7386.     "Set the receiver's proposed instance variable list from aString."
  7387.  
  7388.     self instanceVariables: anInstVarNamesString subStrings!
  7389.  
  7390. isFixedInitialLayout
  7391.     "Answer whether the class being modified has a fixed initial layout."
  7392.  
  7393.     ^FixedInitialLayout includes: currentClass!
  7394.  
  7395. isFixedLayout
  7396.     "Answer whether the class being modified is of fixed layout."
  7397.  
  7398.     ^self class isFixedLayout: currentClass!
  7399.  
  7400. isFixedType
  7401.     "Answer whether the class being modified can be changed to be
  7402.     different type of subclass."
  7403.  
  7404.     ^self isFixedLayout or: [self isFixedInitialLayout]!
  7405.  
  7406. isModifyAction
  7407.     "Private - Answer true if the combination of information provided to
  7408.     the receiver suggests that this is a class modification operation."
  7409.  
  7410.     currentClass isNil
  7411.         ifTrue: [
  7412.             currentClass := self environment at: className ifAbsent: [^false].
  7413.             (currentClass isKindOf: Behavior)
  7414.                 ifFalse: [
  7415.                     currentClass := nil.
  7416.                     ^false]].
  7417.     ^true!
  7418.  
  7419. modifyExistingClass
  7420.     "Private - Modify and answer an existing class using the details
  7421.     contained in the receiver.
  7422.     Implementation Note: If the receiver is attempting to modify itself, then
  7423.     any direct accesses to instance variables following mutation may fail (if
  7424.     the instance variable set is changed, the compiled methods in the stack
  7425.     will still be referring to the old inst. var offsets), therefore we must use 
  7426.     inst. var accessors."
  7427.  
  7428.     self
  7429.         validateForModify;
  7430.         modifyProper;
  7431.         notifyClassUpdated.
  7432.     ^self currentClass!
  7433.  
  7434. modifyOrCreate
  7435.     "Ascertain and execute the appropriate action depending on which pieces
  7436.     of information have been provided.
  7437.     If this is a class modify action we take this opportunity to maintain
  7438.     its NullTerm and Indirect flags as these are not specified in the
  7439.     standard class definition methods and would otherwise be lost."
  7440.  
  7441.     ^self isModifyAction
  7442.         ifFalse: [self createNewClass]
  7443.         ifTrue: [
  7444.             instanceSpec := instanceSpec maskSet: (currentClass instanceSpec 
  7445.                                             maskClear: _FundamentalShapeMask).
  7446.             (self class instanceSpecIsBytes: instanceSpec)
  7447.                 ifFalse: [instanceSpec := instanceSpec maskClear: _BytesSubMask].
  7448.             self modifyExistingClass]!
  7449.  
  7450. modifyPrivate
  7451.     "Private - Modify and answer an existing class using the details
  7452.     in the receiver. The class is excluded from its superclasses'
  7453.     subclasses collection."
  7454.  
  7455.     self
  7456.         validateForModify;
  7457.         modifyProper.
  7458.     ^self currentClass removeFromSuper; yourself!
  7459.  
  7460. modifyProper
  7461.     "Private - Modify an existing class using the details contained in the receiver.
  7462.     Implementation Note: If the receiver is attempting to modify itself, then
  7463.     any direct accesses to instance variables following mutation may fail (if
  7464.     the instance variable set is changed, the compiled methods in the stack
  7465.     will still be referring to the old inst. var offsets), therefore we must use 
  7466.     inst. var accessors."
  7467.  
  7468.     | current |
  7469.     self requiresMutation ifTrue: [
  7470.         self canMutateInSitu
  7471.             ifTrue: [self mutateInSitu]
  7472.             ifFalse: [self mutateToNewClass]].
  7473.  
  7474.     "After this point, must not access inst vars directly in case mutated the receiver."
  7475.     current := self currentClass.
  7476.     current isMeta ifFalse: [
  7477.         self
  7478.             setClassVariablesOf: current;
  7479.             setSharedPoolsOf: current;
  7480.             setCommentOf: current].
  7481.  
  7482.     self recompilationRequired ifTrue: [current recompileAll].
  7483.  
  7484.     self superclassIsBeingChanged ifTrue: [self removeUnimplementedProtocols]
  7485. !
  7486.  
  7487. mutateAllInstancesOf: oldClass toBeInstancesOf: newClass
  7488.     "Private - Mutate all instances of oldClass to instances of newClass."
  7489.  
  7490.     | mappingArray newInst |
  7491.     mappingArray := self generateMapFrom: oldClass to: newClass.
  7492.     oldClass primAllInstances do: [:oldInst |
  7493.         newInst := self translateInstance: oldInst intoANewInstanceOf: newClass via: mappingArray.
  7494.         "We need to manually move the special behavior as #become: does not"
  7495.         newInst setSpecialBehavior: (oldInst setSpecialBehavior: 0).
  7496.         oldInst become: newInst]
  7497. !
  7498.  
  7499. mutateClass: oldClass toBeASubclassOf: newSuperclass
  7500.     "Private - Create a new class with the appropriate features and mutate
  7501.     all instances of oldClass to new instances of the new class and then 
  7502.     recursively make the same change to the subclasses of aClass. Finally,
  7503.     remove the oldClass and if appropriate its metaclass from their
  7504.     respective superclasses and do a #oneWayBeome: on oldClass to newClass.
  7505.     Implementation Note: We must not access any instance variables after mutation, in case
  7506.     the receiver is being mutated and the inst. var offsets change."
  7507.  
  7508.     | newClass |
  7509.     oldClass isMeta
  7510.         ifTrue: [
  7511.             newClass := self newMetaclassLike: oldClass superclass: newSuperclass.
  7512.             self mutateAllInstancesOf: oldClass toBeInstancesOf: newClass. "Mutate the instance class."
  7513.             self updateVMRegistryWith: newClass instanceClass.
  7514.             oldClass subclasses do: [:cls | self mutateClass: cls toBeASubclassOf: newClass].
  7515.             oldClass removeFromSuper.
  7516.             oldClass become: newClass.
  7517.             newClass oneWayBecome: oldClass]
  7518.         ifFalse: [
  7519.             newClass := self newClassLike: oldClass superclass: newSuperclass.
  7520.             self install: newClass.
  7521.             self mutateAllInstancesOf: oldClass toBeInstancesOf: newClass.
  7522.             oldClass subclasses do: [:cls | self mutateClass: cls toBeASubclassOf: newClass].
  7523.             oldClass class removeFromSuper.
  7524.             oldClass removeFromSuper.
  7525.             oldClass become: newClass.
  7526.             newClass oneWayBecome: oldClass.
  7527.             self updateVMRegistryWith: newClass]!
  7528.  
  7529. mutateInSitu
  7530.     "Private - Mutate the class being modified without mutating its instances.
  7531.     In fact, we only need to change the superclass."
  7532.  
  7533.     self superclassIsBeingChanged
  7534.         ifTrue: [
  7535.             currentClass class setSuperclass: (self class classOf: superclass).
  7536.             currentClass setSuperclass: superclass.
  7537.             recompilationRequired := true]
  7538.             
  7539. !
  7540.  
  7541. mutateToNewClass
  7542.     "Private - Set currentClass to a mutation of itself based on the information
  7543.     in the receiver. The instances of the new currentClass are mutations of the
  7544.     instances of the old currentClass."
  7545.  
  7546.     self mutateClass: currentClass toBeASubclassOf: superclass!
  7547.  
  7548. newClassLike: aClass superclass: aSuperclass
  7549.     "Private - Answer a new class based on aClass with superclass aSuperclass.
  7550.     First, create a new metaclass and it to create its new instance class
  7551.     (there can be only one). The data from the old metaclass and class is
  7552.     mapped across to the new ones."
  7553.  
  7554.     | newMeta mappingArray newInstanceClass |
  7555.     newMeta := self
  7556.         newMetaclassLike: aClass class
  7557.         superclass: (self class classOf: aSuperclass).
  7558.     mappingArray := self generateMapFrom: aClass class to: newMeta.
  7559.     newInstanceClass := self
  7560.         translateInstance: aClass
  7561.         intoANewInstanceOf: newMeta
  7562.         via: mappingArray.
  7563.     newMeta instanceClass: newInstanceClass.
  7564.  
  7565.     ^self
  7566.         initializeCopy: newInstanceClass
  7567.         fromClass: aClass
  7568.         superclass: aSuperclass!
  7569.  
  7570. newMetaclassLike: aMetaclass superclass: metaSuperclass
  7571.     "Private - Answer a new metaclass based on aMetaclass with superclass metaSuperclass."
  7572.  
  7573.     ^self
  7574.         initializeCopy: aMetaclass basicShallowCopy
  7575.         fromClass: aMetaclass
  7576.         superclass: metaSuperclass!
  7577.  
  7578. notifyClassCreated
  7579.     "Use the trigger mechanism to notify interested parties that a class has been added."
  7580.  
  7581.     self environment classAdded: currentClass!
  7582.  
  7583. notifyClassRenamed
  7584.     self notifyClassUpdated!
  7585.  
  7586. notifyClassUpdated
  7587.     "Private - Use the trigger mechanism to notify interested parties that a class has been renamed, 
  7588.     and mark all its immediate subclasses as changed since these will need to be filed
  7589.     out to record the change in their source definition."
  7590.  
  7591.     self environment classUpdated: self currentClass.
  7592.     self currentClass subclasses do: [:each | each isChanged: true]!
  7593.  
  7594. parser
  7595.     "Private - Answer the parser to use to validate the class being modified."
  7596.  
  7597.     ^self class parser!
  7598.  
  7599. recompilationRequired
  7600.     "Private - Answer whether recompilation of a modified class is required."
  7601.  
  7602.     ^recompilationRequired!
  7603.  
  7604. remove
  7605.     "Private - Remove currentClass completely from the system."
  7606.  
  7607.     "Unitialize the class if necessary"
  7608.     [currentClass uninitializeBeforeRemove] 
  7609.         on: self class invalidRemoveError do: [:x | x outer]
  7610.         on: Error do: [:x |
  7611.             "Here we take advantage of Smallalk's powerful  exception system to resignal 
  7612.              any errors that occur as special resumable errors that can be resumed by the 
  7613.              enclosing scope to go on and remove the class regardless."
  7614.             x resignalAs: (self class invalidRemoveError new
  7615.                         originalError: x;
  7616.                         messageText: 'Error uninitializing ', currentClass name, ': ', x description;
  7617.                         tag: currentClass)].
  7618.  
  7619.     self 
  7620.         validateForRemove;
  7621.         environment removeClass: currentClass!
  7622.  
  7623. removeUnimplementedProtocols
  7624.     "Private - Remove any protocols of the modified class which are no longer fully implemented.
  7625.     This should only occur if the class has been moved in the hierarchy."
  7626.  
  7627.     | current |
  7628.     current := self currentClass.
  7629.     current protocols copy do: [:p |
  7630.         (current canUnderstandProtocol: p)
  7631.             ifFalse: [current removeProtocol: p]]!
  7632.  
  7633. rename
  7634.     "Private - Rename currentClass to className."
  7635.  
  7636.     self validateForRename.
  7637.     currentClass rename: className.
  7638.     self notifyClassRenamed!
  7639.  
  7640. requiresMutation
  7641.     "Private - Answer whether the class being modified needs to have its instances mutated.
  7642.     Mutation is required if any of the following aspects of the class are being changed:
  7643.         its superclass,
  7644.         its instance spec or
  7645.         its instance variables."
  7646.  
  7647.     ^self superclassIsBeingChanged
  7648.         or: [self instanceShapeIsBeingChanged
  7649.         or: [self instanceVariablesAreBeingChanged]]!
  7650.  
  7651. setClassVariablesOf: aClass
  7652.     "Private - Set class variables of aClass to those described by
  7653.     the receiver's classVariables inst var."
  7654.  
  7655.     (classVariables notNil and: [aClass setClassVarNames: self classVariables])
  7656.         ifTrue: [recompilationRequired := true]!
  7657.  
  7658. setCommentOf: aClass
  7659.     "Private - Set the comment of aClass to the receiver's comment inst var unless it
  7660.     is nil in which case make no change."
  7661.  
  7662.     comment notNil
  7663.         ifTrue: [aClass comment: comment]!
  7664.  
  7665. setInstanceVariablesOf: aClass
  7666.     "Private - Set the instance variable layout of aClass to those described by
  7667.     the receiver's instanceVariables inst var."
  7668.  
  7669.     instanceVariables notNil
  7670.         ifTrue: [aClass instanceVariables: self instanceVariableString]!
  7671.  
  7672. setNewClassCategories
  7673.     currentClass classCategories: self categories!
  7674.  
  7675. setSharedPoolsOf: aClass
  7676.     "Private - Set the shared pools of aClass to those described by
  7677.     the receiver's sharedPools inst var."
  7678.  
  7679.     | oldPoolNameSet newPoolNameSet |
  7680.     sharedPools notNil
  7681.         ifTrue: [
  7682.             oldPoolNameSet := aClass sharedPoolNames.
  7683.             aClass setSharedPoolNames: self sharedPools.
  7684.             newPoolNameSet := aClass sharedPoolNames.
  7685.             (oldPoolNameSet intersection: newPoolNameSet) size = oldPoolNameSet size
  7686.                 ifFalse: [recompilationRequired := true]]!
  7687.  
  7688. sharedPools
  7689.     "Private - Answer an Array of proposed pool dictionary names."
  7690.  
  7691.     ^sharedPools isNil
  7692.         ifTrue: [Array new]
  7693.         ifFalse: [sharedPools]!
  7694.  
  7695. sharedPools: anArray
  7696.     "Set the receiver's sharedPools inst var to anArray."
  7697.  
  7698.     sharedPools := anArray asArray!
  7699.  
  7700. sharedPoolString: aString
  7701.     "Set the receiver's sharedPools from the pool name list aString.
  7702.     Silently drop names duplicated within the list."
  7703.  
  7704.     self sharedPools: aString subStrings asSet!
  7705.  
  7706. superclass: aClass
  7707.     "Private - Set the target superclass."
  7708.  
  7709.     superclass := aClass!
  7710.  
  7711. superclassIsBeingChanged
  7712.     "Private - Answer whether the a new superclass has been specified."
  7713.  
  7714.     ^superclass ~= currentClass superclass
  7715.             !
  7716.  
  7717. translateInstance: oldInstance intoANewInstanceOf: newClass via: mappingArray
  7718.     "Private - Answer a new instance of newClass initialised from the data
  7719.     in oldInstance via the mapping specified by mappingArray. The array
  7720.     contains as many elements as there are named instance variables in
  7721.     newClass and gives the instance variable index in oldInstance from
  7722.     which to copy the old inst var. If the element contains zero then
  7723.     the corresponding inst var in the new object should be left as nil."
  7724.  
  7725.     | newInstance index |
  7726.     newClass isVariable
  7727.         ifFalse: [newInstance := newClass basicNew]
  7728.         ifTrue: [
  7729.             newInstance := newClass basicNew: oldInstance basicSize.
  7730.             1 to: oldInstance basicSize do: [:i |
  7731.                 newInstance basicAt: i put: (oldInstance basicAt: i)]].
  7732.     1 to: newClass instSize do: [:i |
  7733.         (index := mappingArray at: i) ~~ 0
  7734.             ifTrue: [    newInstance instVarAt: i put: (oldInstance instVarAt: index)]].
  7735.     ^newInstance!
  7736.  
  7737. updateVMRegistryWith: aClass
  7738.     "Private - Ensure that if aClass is a VM registered class then the VM's
  7739.     entry is updated to the new class."
  7740.  
  7741.     | name |
  7742.     name := aClass name asSymbol.
  7743.     (VMLibrary registryKeys includesKey: name)
  7744.         ifTrue: [VMLibrary default registryAt: name put: aClass]!
  7745.  
  7746. validateClass
  7747.     "Private - Ensure that currentClass is a valid Behavior."
  7748.  
  7749.     currentClass isNil
  7750.         ifTrue: [self error: 'Class not found.'].
  7751.     (currentClass isKindOf: Behavior)
  7752.         ifFalse: [self error: 'Class must be a kind of Behavior.']
  7753. !
  7754.  
  7755. validateClassForRename
  7756.     "Private - Ensure that we are permitted to rename the class."
  7757.  
  7758.     self validateClass.
  7759.     ((FixedLayout includes: currentClass) or: [FixedInitialLayout includes: currentClass])
  7760.         ifTrue: [self error: currentClass name, ' must not be renamed.'].!
  7761.  
  7762. validateClassInstanceVars
  7763.     "Private - Ensure that the proposed changes do not result in a duplicate name
  7764.     anywhere in the meta-superclass or meta-subclass chain."
  7765.  
  7766.     | instVarSet |
  7767.     instVarSet := self class
  7768.         validateInstanceVars: currentClass class instVarNames
  7769.         againstSuperclass: (self class classOf: superclass).
  7770.     currentClass class allSubclasses do: [:cls |
  7771.         cls instVarNames do: [:name | self class validateInstVarName: name using: instVarSet]]!
  7772.  
  7773. validateClassName
  7774.     "Private - Ensure that the proposed class name is valid."
  7775.  
  7776.     (self class isValidClassName: className)
  7777.         ifFalse: [self error: 'Invalid class name ', className]!
  7778.  
  7779. validateClassVarsForCreate
  7780.     "Private - Ensure that the proposed class variable name list does not
  7781.     contain a reserved word or a duplicate name defined either in the list
  7782.     itself or anywhere in the proposed superclass chain."
  7783.  
  7784.     classVariables notNil
  7785.         ifTrue: [
  7786.             self class
  7787.                 validateClassVars: self classVariables
  7788.                 againstSuperclass: superclass]!
  7789.  
  7790. validateClassVarsForModify
  7791.     "Private - Ensure that the proposed class variable name list does not
  7792.     contain a reserved word or a duplicate name defined either in the list
  7793.     itself or anywhere in the proposed superclass or subclass chain."
  7794.  
  7795.     | classVarSet |
  7796.     classVarSet := self class
  7797.         validateClassVars: self classVariables
  7798.         againstSuperclass: superclass.
  7799.     currentClass allSubclasses do: [:cls |
  7800.         cls classVarNames do: [:name | self class validateClassVarName: name using: classVarSet]]!
  7801.  
  7802. validateForCreate
  7803.     "Private - Ensure that the proposed class creation would result in a valid new class."
  7804.  
  7805.     self
  7806.         validateClassName;
  7807.         validateForCreatePrivate!
  7808.  
  7809. validateForCreatePrivate
  7810.     "Private - Ensure that the proposed class creation would result in a valid new class."
  7811.  
  7812.     self
  7813.         validateSuperclassIsSubclassable;
  7814.         validateSuperclassChainForCreate;
  7815.         validateInstanceSpec;
  7816.         validateInstanceVarsForCreate;
  7817.         validateClassVarsForCreate;
  7818.         validatePoolNames!
  7819.  
  7820. validateForModify
  7821.     "Private - Ensure that the proposed class modification would result in a valid class."
  7822.  
  7823.     self
  7824.         validateClass;
  7825.         validateSuperclassForModify;
  7826.         validateSuperclassChainForModify;
  7827.         validateInstanceSpecForModify;
  7828.         validateInstanceVarsForModify;
  7829.         validateSubclassInstanceSpecs.
  7830.     currentClass isMeta ifFalse: [
  7831.         self
  7832.             validateClassInstanceVars;
  7833.             validateClassVarsForModify;
  7834.             validatePoolNames]!
  7835.  
  7836. validateForRemove
  7837.     "Private - Ensure that the proposed class removal is valid.
  7838.     Note that the enclosing scope is permitted to catch and resume these errors if it wishes
  7839.     to attempt to remove the class regardless."
  7840.  
  7841.     | instCount subs |
  7842.     self validateClass.
  7843.     "Try first without a full GC to avoid hit if we can"
  7844.     instCount := currentClass primAllInstances size.
  7845.     instCount > 0 ifTrue: [ "OK, so try with a GC"
  7846.         instCount := currentClass instanceCount].
  7847.     instCount > 0 ifTrue: [ "Oh dear still extant instances"
  7848.         self errorInvalidRemove: (String writeStream 
  7849.                             print: self currentClass; 
  7850.                             nextPutAll: ' has '; 
  7851.                             display: instCount;
  7852.                             nextPutAll: ' instances';
  7853.                             contents)].
  7854.     subs := currentClass subclasses.
  7855.     subs isEmpty ifFalse: [
  7856.         self errorInvalidRemove: (String writeStream 
  7857.                             print: self currentClass; 
  7858.                             nextPutAll: ' has '; 
  7859.                             display: subs size;
  7860.                             nextPutAll: ' subclasses';
  7861.                             contents)]!
  7862.  
  7863. validateForRename
  7864.     "Private - Ensure that the proposed class rename is valid."
  7865.  
  7866.     self
  7867.         validateClassForRename;
  7868.         validateClassName.
  7869.  
  7870.     (self environment includesKey: className)
  7871.         ifTrue: [self error: className, ' already exists.']!
  7872.  
  7873. validateInstanceSpec
  7874.     "Private - Validate and complete the instanceSpec inst var."
  7875.  
  7876.     instanceSpec := self class
  7877.         validateInstanceSpec: instanceSpec
  7878.         size: self instanceVariables size
  7879.         superclass: superclass.!
  7880.  
  7881. validateInstanceSpecForModify
  7882.     "Private - Validate the instanceSpec for a class modification."
  7883.  
  7884.     self validateInstanceSpec.
  7885.     (self fundamentalTypeIsBeingChanged and: [currentClass isMeta not and: [self isFixedType]])
  7886.         ifTrue: [self error: 'You may not change the subclass type of ', currentClass name]
  7887.     !
  7888.  
  7889. validateInstanceVarsForCreate
  7890.     "Private - Ensure that the proposed instance variable name list does not
  7891.     contain a reserved word or a duplicate name defined either in the list
  7892.     itself or anywhere in the proposed superclass chain."
  7893.  
  7894.     self class
  7895.         validateInstanceVars: self instanceVariables
  7896.         againstSuperclass: superclass!
  7897.  
  7898. validateInstanceVarsForModify
  7899.     "Private - Ensure that the proposed instance variable name list does not
  7900.     contain a reserved word or a duplicate name defined either in the list
  7901.     itself or anywhere in the proposed superclass or subclass chain."
  7902.  
  7903.     | instVarSet proposedInstVarArray |
  7904.     proposedInstVarArray := self instanceVariables.
  7905.     instVarSet := self class
  7906.         validateInstanceVars: proposedInstVarArray
  7907.         againstSuperclass: superclass.
  7908.  
  7909.     currentClass isMeta ifFalse: [
  7910.         (self isFixedLayout and: [currentClass instVarNames ~= proposedInstVarArray])
  7911.             ifTrue: [self error: 'You must not change the instance variable layout of ', currentClass name].
  7912.         (self isFixedInitialLayout and: [(proposedInstVarArray indexOfSubCollection: currentClass instVarNames)~~1])
  7913.             ifTrue: [self error: 'New inst vars must come after those already in ', currentClass name]].
  7914.  
  7915.     currentClass allSubclasses do: [:cls |
  7916.         cls instVarNames do: [:name | self class validateInstVarName: name using: instVarSet]]!
  7917.  
  7918. validatePoolNames
  7919.     "Private - Ensure that the proposed pool dictionary names exists in the environment
  7920.     and warn if they don't start with an uppercase letter."
  7921.  
  7922.     self sharedPools do: [:poolName | | firstChar |
  7923.         self environment at: poolName
  7924.             ifAbsentPut: [
  7925.                 Warning signal: ('Pool dictionary ''%1'' does not exist.%nProceed to create it as an empty constants pool.'
  7926.                             formatWith: poolName).
  7927.                 PoolConstantsDictionary name: poolName].
  7928.         firstChar := poolName first.
  7929.         (firstChar isUppercase or: [firstChar == $_])
  7930.             ifFalse: [Warning signal: 'Pool dictionary ''', poolName, ''' should start with an uppercase letter.']]!
  7931.  
  7932. validateSubclassesOf: aClass againstInstanceSpec: instSpec
  7933.     "Private - Ensure that if the proposed change to the instance spec of aClass
  7934.     is acceptable to all subclasses."
  7935.  
  7936.     | dummyClass validatedInstSpec|
  7937.     (dummyClass := Behavior new) instanceSpec: instSpec.
  7938.     aClass subclasses do: [:cls |
  7939.         validatedInstSpec := self class
  7940.             validateInstanceSpec: cls instanceSpec
  7941.             size: cls instVarNames size
  7942.             superclass: dummyClass.
  7943.         (self class fundamentalTypeOf: validatedInstSpec) = (self class fundamentalTypeOf: cls instanceSpec)
  7944.             ifFalse: [self validateSubclassesOf: cls againstInstanceSpec: validatedInstSpec]].
  7945.         
  7946.         !
  7947.  
  7948. validateSubclassInstanceSpecs
  7949.     "Private - Ensure that the proposed class modification would not result in
  7950.     any of the subclasses becoming invalid."
  7951.  
  7952.     self validateSubclassesOf: currentClass againstInstanceSpec: instanceSpec!
  7953.  
  7954. validateSuperclassChainForCreate
  7955.     "Private - Ensure that the proposed superclass chain doesn't already include
  7956.     a class of the same name as the proposed class."
  7957.  
  7958.     superclass isNil ifTrue: [^self].
  7959.     (superclass withAllSuperclasses anySatisfy: [:each | each name = className]) 
  7960.         ifTrue: [self error: 'Class cannot be a subclass of itself']!
  7961.  
  7962. validateSuperclassChainForModify
  7963.     "Private - Ensure that the proposed superclass chain doesn't already include
  7964.     the current class"
  7965.  
  7966.     superclass isNil ifTrue: [^self].
  7967.     (superclass withAllSuperclasses anySatisfy: [:each | each == currentClass]) 
  7968.         ifTrue: [self error: 'Class cannot be a subclass of itself']!
  7969.  
  7970. validateSuperclassForModify
  7971.     "Private - Ensure that no circularity is introduced into the hierarchy and
  7972.     that the superclass of a metaclass is not changed directly."
  7973.  
  7974.     self superclassIsBeingChanged
  7975.         ifTrue: [
  7976.             currentClass isMeta
  7977.                 ifTrue: [self error: 'It is invalid to directly change the superclass of a metaclass.'].
  7978.             self validateSuperclassIsSubclassable.
  7979.             (superclass notNil and: [superclass isKindOf: currentClass])
  7980.                 ifTrue: [self error: superclass name, ' is a subclass of the class being changed.']].!
  7981.  
  7982. validateSuperclassIsSubclassable
  7983.     "Private - Ensure that the superclass is a subclassable object."
  7984.  
  7985.     superclass notNil
  7986.         ifTrue: [
  7987.             ((superclass isKindOf: Class) not or: [Unsubclassable includes: superclass])
  7988.                 ifTrue: [self error: 'Proposed superclass is not subclassable.']].! !
  7989.  
  7990. Clipboard comment:
  7991. ''!
  7992. !Clipboard class methodsFor!
  7993.  
  7994. current
  7995.     "Answer the singleton instance of the receiver."
  7996.  
  7997.     Current isNil ifTrue: [Current := super new initialize].
  7998.     ^Current!
  7999.  
  8000. new
  8001.     "The receiver is a singleton, use #current."
  8002.  
  8003.     ^self shouldNotImplement!
  8004.  
  8005. onPreStripImage
  8006.     "Private -  Assist in the image stripping process by clearning down any
  8007.     lazily initialized variables held by the receiver."
  8008.  
  8009.     Current := nil!
  8010.  
  8011. onStartup
  8012.     "Private - The system is starting, perform any necessary
  8013.     initialization."
  8014.  
  8015.     Current := nil! !
  8016.  
  8017. !Clipboard methodsFor!
  8018.  
  8019. apply: operation
  8020.         "Private - Evaluate the <niladicBlock> argument, operation, against
  8021.     the receiver. If the Clipboard is not currently open, then it is opened
  8022.     for the duration of the operation."
  8023.  
  8024.     | wasOpen |
  8025.     wasOpen := self open.
  8026.     ^operation ensure: [wasOpen ifFalse: [self close]]
  8027. !
  8028.  
  8029. availableFormatIds
  8030.     "Answer a <collection> containing each of the currently available  
  8031.     clipboard format <integer> identifiers."
  8032.  
  8033.     | answer fmt lib |
  8034.     fmt := 0.
  8035.     lib := UserLibrary default.
  8036.     answer := OrderedCollection new: (lib countClipboardFormats).
  8037.     self apply: [
  8038.         [(fmt := lib enumClipboardFormats: fmt) == 0] whileFalse: [
  8039.             answer addLast: fmt]].
  8040.     ^answer!
  8041.  
  8042. availableFormats
  8043.     "Answer a <collection> of the currently available clipboard format 
  8044.     <readableString> names. This may not include all formats, as the built-in
  8045.     formats are unnamed, and we don't keep an entry for them all in our map."
  8046.  
  8047.     | answer |
  8048.     answer := OrderedCollection new.
  8049.     self availableFormatIds do: [:fmt | | name |
  8050.         name := registeredFormats keyAtValue: fmt ifAbsent: [self getFormatName: fmt].
  8051.         name isNil ifFalse: [answer addLast: name]].
  8052.     ^answer!
  8053.  
  8054. basicEmpty
  8055.     "Private - Empty the clipboard (assumes it is open)."
  8056.  
  8057.     UserLibrary default emptyClipboard ifFalse: [Win32Error signal]!
  8058.  
  8059. basicFree
  8060.         "Private - Close the clipboard.
  8061.     We don't treat attempting to close the clipboard when it is not
  8062.     open as an exception."
  8063.  
  8064.     ^UserLibrary default closeClipboard!
  8065.  
  8066. basicRealize
  8067.         "Open the clipboard."
  8068.  
  8069.     isOpen := UserLibrary default openClipboard: nil.
  8070.     isOpen ifFalse: [Win32Error signal].!
  8071.  
  8072. close
  8073.         "Close the clipboard."
  8074.  
  8075.     self free!
  8076.  
  8077. empty
  8078.         "Empty the clipboard."
  8079.  
  8080.     self apply: [self basicEmpty]!
  8081.  
  8082. errorFormatNotAvailable: format
  8083.     "Raise an error to the effect that the clipboard does not contain any data
  8084.     of the format identified by the specified symbolic format."
  8085.  
  8086.     ^self error: 'Clipboard format #', format, ' not available'!
  8087.  
  8088. free
  8089.         "Release any external resources owned by the receiver."
  8090.  
  8091.     isOpen ifTrue: [
  8092.         isOpen := false.
  8093.         self basicFree]!
  8094.  
  8095. getBitmap
  8096.         "Answer a Bitmap copied from the clipboard, or raise an 
  8097.     exception if no Bitmap is available."
  8098.  
  8099.     ^self getBitmapIfNone: [self errorFormatNotAvailable: #Bitmap]!
  8100.  
  8101. getBitmapIfNone: exceptionHandler 
  8102.     "Answer a Bitmap copied from the clipboard, or if none the result
  8103.     of evaluating the <niladicValuable> exceptionHandler.
  8104.     Note that because the clipboard retains ownership of the bitmap,
  8105.     we must immediately copy it."
  8106.  
  8107.     ^self apply: 
  8108.             [| hBitmap |
  8109.             hBitmap := UserLibrary default getClipboardData: CF_BITMAP.
  8110.             hBitmap isNull ifTrue: [^exceptionHandler value].
  8111.             (Bitmap fromHandle: hBitmap) copy]!
  8112.  
  8113. getBytesFormatId: format ifNone: exceptionHandler 
  8114.     "Private - Answer a ByteArray of data for <integer> format stored 
  8115.     on the clipboard. If no such format is currently available, the answers the
  8116.     result of evaluating the <niladicValuable> exceptionHandler."
  8117.  
  8118.     ^self apply: 
  8119.             [| hBytes bytes len |
  8120.             hBytes := UserLibrary default getClipboardData: format.
  8121.             hBytes isNull ifTrue: [^exceptionHandler value].
  8122.             bytes := KernelLibrary default globalLock: hBytes.
  8123.             len := ExternalMemory GetSize: bytes.
  8124.             bytes := ByteArray fromAddress: bytes length: len.
  8125.             KernelLibrary default globalUnlock: hBytes.
  8126.             bytes]!
  8127.  
  8128. getFormatName: format
  8129.         "Answer the <readableString> name of the registered clipboard format 
  8130.     identified by the <integer> format, or nil the format is not registered. "
  8131.     
  8132.     | name len |
  8133.     name := String new: 256.
  8134.     len := UserLibrary default
  8135.             getClipboardFormatName: format
  8136.             lpszFormatName: name
  8137.             cchMaxCount: name size.
  8138.     ^len == 0 ifFalse: [name leftString: len]!
  8139.  
  8140. getObject
  8141.         "Answer the <Object> stored on the clipboard or raise an error if none."
  8142.  
  8143.     ^self getObjectIfNone: [self errorFormatNotAvailable: #Object]!
  8144.  
  8145. getObjectBinaryStoreBytes
  8146.         "Answer the STB binary store bytes for the <object> stored on the the clipboard, 
  8147.     or raise an exception if none is available."
  8148.  
  8149.     ^self getObjectBinaryStoreBytesIfNone: [self errorFormatNotAvailable: #Object]!
  8150.  
  8151. getObjectBinaryStoreBytesIfNone: exceptionHandler
  8152.         "Answer the STB binary store bytes for an <object> stored 
  8153.     on the clipboard. If no object is currently available, the answers the
  8154.     result of evaluating the <niladicValuable> exceptionHandler."
  8155.  
  8156.     ^self getBytesFormatId: self objectFormatId ifNone: exceptionHandler.!
  8157.  
  8158. getObjectClass
  8159.         "Answer the <Class> for the <Object> stored on the clipboard or 
  8160.     raise an error if there is none."
  8161.  
  8162.     ^self getObjectClassIfNone: [self errorFormatNotAvailable: #ObjectClass]!
  8163.  
  8164. getObjectClassIfNone: exceptionHandler
  8165.     "Answer the <Class> of the <Object> stored on the clipboard. 
  8166.     If no object is currently available, the answers the result of 
  8167.     evaluating the <niladicValuable> exceptionHandler."
  8168.  
  8169.     ^Object fromBinaryStoreBytes: (self getBytesFormatId: self objectClassFormatId
  8170.                 ifNone: [^exceptionHandler value])!
  8171.  
  8172. getObjectIfNone: exceptionHandler
  8173.         "Answer the <object> stored on the clipboard. 
  8174.     If no object is currently available, the answers the result of 
  8175.     evaluating the <niladicValuable> exceptionHandler."
  8176.  
  8177.     ^Object fromBinaryStoreBytes: (self getObjectBinaryStoreBytesIfNone: [^exceptionHandler value]).!
  8178.  
  8179. getRichText
  8180.         "Answer a <RichText> containing the the Rich Text contents 
  8181.     of the clipboard. If no rich text is currently available, raise 
  8182.     an exception."
  8183.  
  8184.     ^self getRichTextIfNone: [self errorFormatNotAvailable: #RichText]!
  8185.  
  8186. getRichTextIfNone: exceptionHandler
  8187.         "Answer a <readableString> containing the the Rich Text contents 
  8188.     of the clipboard. If no rich text is currently available, the answers the
  8189.     result of evaluating the <niladicValuable> exceptionHandler."
  8190.  
  8191.     ^RichText fromRtf: (self getTextFormat: self rtfFormatId ifNone: exceptionHandler)!
  8192.  
  8193. getText
  8194.         "Answer a <readableString> containing the the CF_TEXT contents 
  8195.     of the clipboard. If no text is currently available, raise an exception."
  8196.  
  8197.     ^self getTextIfNone: [self errorFormatNotAvailable: #String]!
  8198.  
  8199. getTextFormat: formatId ifNone: exceptionHandler 
  8200.     "Private - Answer a <readableString> containing the text contents
  8201.     of the clipboard of the specified format. If the format is not currently 
  8202.     available, the answers the result of evaluating the <niladicValuable> 
  8203.     exceptionHandler.
  8204.     N.B. It is not checked that formatId is actually a text format."
  8205.  
  8206.     ^self apply: 
  8207.             [| hText pText text |
  8208.             hText := UserLibrary default getClipboardData: formatId.
  8209.             hText isNull ifTrue: [^exceptionHandler value].
  8210.             pText := KernelLibrary default globalLock: hText.
  8211.             text := String fromAddress: pText.
  8212.             KernelLibrary default globalUnlock: hText.
  8213.             text]!
  8214.  
  8215. getTextIfNone: exceptionHandler
  8216.         "Answer a <readableString> containing the the CF_TEXT contents 
  8217.     of the clipboard. If no text is currently available, the answers the
  8218.     result of evaluating the <niladicValuable> exceptionHandler."
  8219.  
  8220.     ^self getTextFormat: CF_TEXT ifNone: exceptionHandler!
  8221.  
  8222. getTextOrEmpty
  8223.     ^self getTextIfNone: ['']!
  8224.  
  8225. initialize
  8226.     "Private - Initialize the receiver's instance variables.
  8227.     Answer the receiver."
  8228.  
  8229.     | rtfFormat objectFormat objectClassFormat |
  8230.     isOpen := false.
  8231.  
  8232.     registeredFormats := LookupTable new.
  8233.     rtfFormat := UserLibrary default registerClipboardFormat: 'Rich Text Format'.
  8234.     objectFormat := UserLibrary default registerClipboardFormat: 'Smalltalk Object Format'.
  8235.     objectClassFormat := UserLibrary default registerClipboardFormat: 'Smalltalk Object Class Format'.
  8236.     registeredFormats
  8237.         at: #RichText put: rtfFormat;
  8238.         at: #String put: CF_TEXT;
  8239.         at: #UnicodeString put: CF_UNICODETEXT;
  8240.         at: #Bitmap put: CF_BITMAP;
  8241.         "at: #DIBSection put: CF_DIB;"    "Don't know how to do these at present"
  8242.         at: #Palette put: CF_PALETTE;
  8243.         at: #Object put: objectFormat;
  8244.         at: #ObjectClass put: objectClassFormat
  8245. !
  8246.  
  8247. isBitmapAvailable
  8248.     "Answer whether the clipboard contains a bitmap."
  8249.  
  8250.     ^self isFormatIdAvailable: CF_BITMAP!
  8251.  
  8252. isFormatAvailable: format
  8253.         "Answer whether the clipboard contains data in the specified
  8254.     <integer> format (e.g. CF_TEXT)."
  8255.  
  8256.     ^self isFormatIdAvailable: (registeredFormats at: format ifAbsent: [^false])!
  8257.  
  8258. isFormatIdAvailable: dwFormat
  8259.     "Private - Answer whether the clipboard contains the specified
  8260.     registered <integer> clipboard format."
  8261.  
  8262.     ^UserLibrary default isClipboardFormatAvailable: dwFormat!
  8263.  
  8264. isObjectAvailable
  8265.     "Answer whether the clipboard contains an object."
  8266.  
  8267.     ^self isFormatAvailable: #Object!
  8268.  
  8269. isTextAvailable
  8270.         "Answer whether the clipboard contains text data (i.e. CF_TEXT)."
  8271.  
  8272.     ^self isFormatIdAvailable: CF_TEXT!
  8273.  
  8274. objectClassFormatId
  8275.     "Private - Answer the registered id for Smalltalk <Class> objects."
  8276.  
  8277.     ^registeredFormats at: #ObjectClass!
  8278.  
  8279. objectFormatId
  8280.     "Private - Answer the registered id for Smalltalk objects."
  8281.  
  8282.     ^registeredFormats at: #Object!
  8283.  
  8284. open
  8285.         "Open the clipboard."
  8286.  
  8287.     | wasOpen |
  8288.     (wasOpen := isOpen) ifFalse: [self basicRealize].
  8289.     ^wasOpen!
  8290.  
  8291. registerFormat: formatName
  8292.         "Register the <readableString> formatName as a user-defined 
  8293.     clipboard format. Answer the format identifier."
  8294.  
  8295.     | id |
  8296.     id := UserLibrary default registerClipboardFormat: formatName asParameter.
  8297.     id == 0 ifTrue: [^Win32Error signal].
  8298.     registeredFormats at: formatName put: id.
  8299.     ^id!
  8300.  
  8301. rtfFormatId
  8302.     "Private - Answer the registered id for rich text."
  8303.  
  8304.     ^registeredFormats at: #RichText!
  8305.  
  8306. setBitmap: aBitmap
  8307.         "Transfer the specified bitmap to the clipboard."
  8308.     
  8309.     self setBitmap: aBitmap format: aBitmap class name
  8310. !
  8311.  
  8312. setBitmap: bmp format: formatName
  8313.         "Copy the specified bitmap to the clipboard as an entry
  8314.     of the specified format name."
  8315.  
  8316.     self setBitmap: bmp formatId: (registeredFormats at: formatName)!
  8317.  
  8318. setBitmap: aBitmap formatId: formatId
  8319.         "Private - Transfer the specified bitmap to the clipboard - note that
  8320.     this is destructive with respect to the bitmap, since it loses ownership
  8321.     of its external resource."
  8322.     
  8323.     | hBitmap |
  8324.     hBitmap := self setData: aBitmap detachHandle formatId: formatId.
  8325.     hBitmap  isNull ifTrue: [^Win32Error signal]!
  8326.  
  8327. setBytes: aByteArray formatId: format 
  8328.     "Private - Transfers aByteArray to the clipboard as data the <integer> format"
  8329.  
  8330.     | hMem pMem len kernel |
  8331.     kernel := KernelLibrary default.
  8332.     len := aByteArray basicSize.    "want size in bytes"
  8333.     hMem := kernel globalAlloc: ##(GHND | GMEM_DDESHARE) dwBytes: len + 1.
  8334.     pMem := kernel globalLock: hMem.
  8335.     pMem 
  8336.         replaceFrom: 1
  8337.         to: len
  8338.         with: aByteArray
  8339.         startingAt: 1.
  8340.     kernel globalUnlock: hMem.
  8341.     self setData: hMem formatId: format!
  8342.  
  8343. setData: handle formatId: formatId
  8344.     "Private - Copy the data with the specified handle to the clipboard
  8345.     with the specified <integer> format. If the clipboard is not currently
  8346.     open, then it is opened and emptied, and then closed after setting
  8347.     the data. If the clipboard is already open, then the data is simply
  8348.     copied to the clipboard without emptying or closing it. This is to
  8349.     allow the copying of multiple-formats for the same object, and also
  8350.     to prevent lots of opening and closing."
  8351.  
  8352.     | wasOpen |
  8353.     wasOpen := self open.
  8354.     ^
  8355.     [wasOpen ifFalse: [self basicEmpty].
  8356.     UserLibrary default setClipboardData: formatId hMem: handle] 
  8357.             ensure: [wasOpen ifFalse: [self close]]!
  8358.  
  8359. setDIB: aDIBSection
  8360.         "Transfer the specified DIBSection bitmap to the clipboard."
  8361.  
  8362.     self setBitmap: aDIBSection format: CF_DIB!
  8363.  
  8364. setObject: anObject
  8365.         "Transfers anObject to the clipboard."
  8366.  
  8367.     self setObjectBinaryStoreBytes: anObject binaryStoreBytes class: anObject class!
  8368.  
  8369. setObjectBinaryStoreBytes: aByteArray class: aClass
  8370.         "Private - Transfers aByteArray to the clipboard as the
  8371.     binary store bytes of an object of aClass"
  8372.  
  8373.     self apply: [
  8374.         self setBytes: aByteArray formatId: self objectFormatId.
  8375.         self setBytes: aClass binaryStoreBytes formatId: self objectClassFormatId ]!
  8376.  
  8377. setText: text
  8378.         "Private - Copy the <String> text to the clipboard as an entry
  8379.     in CF_TEXT format."
  8380.  
  8381.     self setText: text format: text class name!
  8382.  
  8383. setText: text format: formatName
  8384.         "Copy the <readableString> text to the clipboard as an entry
  8385.     of the specified format name."
  8386.  
  8387.     self setText: text formatId: (registeredFormats at: formatName)!
  8388.  
  8389. setText: textObject formatId: formatId 
  8390.     "Private - Copy the <readableString> text to the clipboard as an entry
  8391.     of the specified <integer> format."
  8392.  
  8393.     | hMem pMem len kernel text |
  8394.     kernel := KernelLibrary default.
  8395.     text := textObject asParameter.
  8396.     len := text basicSize.    "want size in bytes"
  8397.     hMem := kernel globalAlloc: ##(GHND | GMEM_DDESHARE) dwBytes: len + 1.
  8398.     pMem := kernel globalLock: hMem.
  8399.     pMem 
  8400.         replaceFrom: 1
  8401.         to: len
  8402.         with: text
  8403.         startingAt: 1.
  8404.     kernel globalUnlock: hMem.
  8405.     self setData: hMem formatId: formatId! !
  8406.  
  8407. Collection comment:
  8408. ''!
  8409. !Collection class methodsFor!
  8410.  
  8411. icon
  8412.     "Answers an Icon that can be used to represent this class"
  8413.  
  8414.     ^##(self) defaultIcon!
  8415.  
  8416. newAspect: aspectClass name: aSymbol 
  8417.         "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  8418.         which is appropriate for representing aspects of the receiver's type."
  8419.     
  8420.         ^aspectClass collection: aSymbol!
  8421.  
  8422. with: element1
  8423.     "Answer an instance of the receiver containing the <Object>, element1.
  8424.     Implementation Note: The #yourself is definitely required here."
  8425.  
  8426.     ^self new
  8427.         add: element1; 
  8428.         yourself!
  8429.  
  8430. with: element1 with: element2
  8431.     "Answer an instance of the receiver containing each of the <Object>
  8432.     arguments as its elements"
  8433.  
  8434.     ^(self new: 2)
  8435.         add: element1; 
  8436.         add: element2; 
  8437.         yourself!
  8438.  
  8439. with: element1 with: element2 with: element3
  8440.     "Answer an instance of the receiver containing each of the <Object>
  8441.     arguments as its elements."
  8442.  
  8443.     ^(self new: 3)
  8444.         add: element1; 
  8445.         add: element2; 
  8446.         add: element3; 
  8447.         yourself!
  8448.  
  8449. with: element1 with: element2 with: element3 with: element4
  8450.     "Answer an instance of the receiver containing each of the <Object>
  8451.     arguments as its elements."
  8452.  
  8453.     ^(self new: 4)
  8454.         add: element1; 
  8455.         add: element2; 
  8456.         add: element3; 
  8457.         add: element4; 
  8458.         yourself!
  8459.  
  8460. with: firstObject with: secondObject with: thirdObject with: fourthObject with: fifthObject
  8461.     "Answer an instance of the receiver containing the arguments as its elements"
  8462.  
  8463.     ^self new
  8464.         add: firstObject; 
  8465.         add: secondObject; 
  8466.         add: thirdObject;
  8467.         add: fourthObject; 
  8468.         add: fifthObject; 
  8469.         yourself
  8470. !
  8471.  
  8472. withAll: newElements
  8473.     "Answer a new instance of the receiver containing all of the 
  8474.     elements of the <collection>, newElements."
  8475.  
  8476.     ^(self new: newElements size)
  8477.         addAll: newElements;
  8478.         yourself! !
  8479.  
  8480. !Collection methodsFor!
  8481.  
  8482. _beginsString: aString
  8483.     ^aString basicBeginsWith: self!
  8484.  
  8485. add: newElement
  8486.     "Include the <Object> argument, newElement, as one of the receiver's 
  8487.     elements. Answer newElement."
  8488.  
  8489.     ^self subclassResponsibility!
  8490.  
  8491. addAll: newElements
  8492.     "Include all the elements of the <collection> argument, newElements, as the receiver's elements. 
  8493.     Answer newElements. 
  8494.     Note that this modifies the and answers the receiver, not a copy.
  8495.     newElements can actually be any object which understands #do:."
  8496.  
  8497.     newElements do: [:each | self add: each].
  8498.     ^newElements!
  8499.  
  8500. allSatisfy: discriminator
  8501.     "Answer whether the <monadicValuable>, discriminator, evaluates to true for
  8502.     every element of the receiver.
  8503.     Implementation Note: The argument is evaluated for every element
  8504.     of the receiver iff it is satisfied for every element."
  8505.  
  8506.     self do: [:e | (discriminator value: e) ifFalse: [^false]].
  8507.     ^true!
  8508.  
  8509. anySatisfy: discriminator
  8510.     "Answer whether the <monadicValuable>, discriminator, evaluates to true for
  8511.     any element of the receiver.
  8512.     Implementation Note: The argument is evaluated for every element of the
  8513.     receiver iff it evaluates to false for every element."
  8514.  
  8515.     self do: [:e | (discriminator value: e) ifTrue: [^true]].
  8516.     ^false!
  8517.  
  8518. appendToStream: puttableStream
  8519.     "Private - Append the receiver's elements to the argument, puttableStream.
  8520.     Answer the receiver.
  8521.     Implementation note: Double dispatched from puttableStream>>nextPutAll:."
  8522.  
  8523.     self do: [ :element | puttableStream nextPut: element ]!
  8524.  
  8525. approxSize
  8526.     "Private - Answer the approximate size of the receiver.
  8527.     Implementation Note: This does not have to be accurate, but it should be fast
  8528.     (i.e. don't calculate it by counting the receiver's elements).
  8529.     The default is to guess at 2. Subclasses which can give a more
  8530.     accurate size quickly will get better conversion performance."
  8531.  
  8532.     ^2!
  8533.  
  8534. asArray
  8535.     "Answer an <Array> whose elements are those of the receiver.
  8536.     The ordering is that of the #do: operation as implemented by the receiver,
  8537.     and the answer will normally be the same size as the receiver."
  8538.  
  8539.     | answer i |
  8540.     answer:= Array new: self size.
  8541.     i := 1.
  8542.     self do: [:e |
  8543.         answer basicAt: i put: e.
  8544.         i := i + 1].
  8545.     ^answer!
  8546.  
  8547. asBag
  8548.     "Answer a <Bag> containing the same elements as the receiver
  8549.     Note: As Bags identify multiple occurrences with the equality relationship
  8550.     the enumerated elements of the result may not be identical to those of
  8551.     the receiver, although there will be the same number.
  8552.     Implementation Note: It is an error if the receiver contains nil elements,
  8553.     but this is not currently trapped."
  8554.  
  8555.     ^(Bag new: self approxSize) 
  8556.         addAll: self; 
  8557.         yourself!
  8558.  
  8559. asByteArray
  8560.     "Answer a <ByteArray> whose elements are those of the receiver.
  8561.     The ordering is that of the #do: operation as implemented by the receiver,
  8562.     and the answer will normally be the same size as the receiver.
  8563.     This will fail if the receiver contains elements which are not Integers
  8564.     in the range 0..255."
  8565.  
  8566.     | anArray i |
  8567.     anArray := ByteArray new: self size.
  8568.     i := 1.
  8569.     self do: [ :e |
  8570.         anArray basicAt: i put: e.
  8571.         i := i + 1 ].
  8572.     ^anArray!
  8573.  
  8574. asIdentitySet
  8575.     "Answer a new <IdentitySet> whose elements are those stored in the receiver.
  8576.     Any duplicates are eliminated, so the result may be smaller than
  8577.     the receiver. Any nil elements of the receiver are also eliminated."
  8578.  
  8579.     ^(IdentitySet new: self approxSize) 
  8580.         addAll: self; 
  8581.         yourself!
  8582.  
  8583. asOrderedCollection
  8584.     "Answer an <OrderedCollection> whose elements are those of the receiver
  8585.     The ordering is that of the #do: operation as implemented by the receiver,
  8586.     and the answer will normally be the same size as the receiver.
  8587.     Implementation Note: Although we might be able to perform this operation 
  8588.     faster for collections which keep a tally of their size (or can otherwise 
  8589.     access it without calculation) we must be careful NOT to provide a default 
  8590.     implementation which will cause a double enumeration for collections which must
  8591.     count their elements to determine their size, which may be very slow."
  8592.  
  8593.     | answer |
  8594.     answer := OrderedCollection new: self approxSize.
  8595.     self do: [:elem | answer addLast: elem].
  8596.     ^answer!
  8597.  
  8598. aspectDisplayOn: aStream
  8599.     "Private - Append a single-line textual representatin of the receiver to the <puttableStream>
  8600.     argument in a form that a user viewing the receiver as the value of a published aspect would 
  8601.     like to see it. Typically we use #displayOn: but some classes of object can use alternate display 
  8602.     formats.In this case we don't want to include the contents.
  8603.     N.B. This is a development time only method that supports the PublishedAspectInspector."
  8604.     
  8605.     self basicPrintOn: aStream!
  8606.  
  8607. αW;à╜â─µC╟∩╟°╔∞ù╦▌╗▓∙`bÖ₧ßIAioî─,WçMA9kUGj Äi ╖tV*░«# ╫T║∙┌⌠₧ßR<┘4jk ╚╣~'ó▌ÇNAÖ╙pεB÷nÖ√]JD<ΦiÜ╨JòMq¿@=┴Ç┬∩î»u╚ù₧╙j╝°VJ╢ ~Ʋ6═┌Q≤@;┼P╘₧G÷┴8╓JkÇ-┤▀åMb╢╝┐φáñ±mY╖⌠íFBdUFk;Çú8p[┌╬╩á9S^▀Æ*àNé∙▐╢╝h≈·æ┬ë-╝ß┼ üGZai╒B╧.Rz├â[ßT√èë▓é╙█┼└ΩD!
  8608.  
  8609. asSet
  8610.     "Answer a <Set> whose elements are those stored in the receiver.
  8611.     Any duplicates are eliminated, so the result may be smaller than
  8612.     the receiver. Any nil elements of the receiver are also eliminated,
  8613.     but this behaviour may differ between implementations, and so
  8614.     should not be relied upon in portable code."
  8615.  
  8616.     ^(Set new: self approxSize) 
  8617.         addAll: self; 
  8618.         yourself!
  8619.  
  8620. asSortedCollection
  8621.     "Answer a <SortedCollection> of the same size as the receiver
  8622.     whose elements are those of the receiver, with the order of the result
  8623.     being determined by the default sort block (see SortedCollection).
  8624.     Exceptions may occur if any of the elements of the receiver are not
  8625.     appropriate parameters for the default sort block."
  8626.  
  8627.     ^(SortedCollection new: self approxSize)
  8628.         addAll: self; 
  8629.         yourself!
  8630.  
  8631. asSortedCollection: sortBlock
  8632.     "Answer a <SortedCollection> whose elements are those of the receiver, sorted according to 
  8633.     the <dynadicValuable> argument, sortBlock.
  8634.     Exceptions may occur if any of the elements of the receiver are not
  8635.     appropriate parameters for sortBlock.
  8636.     Note: The argument does not need to be a BlockClosure, it must simply
  8637.     understand the #value:value: message from the dyadic valuable protocol."
  8638.  
  8639.     ^(SortedCollection new: self approxSize)
  8640.         sortBlock: sortBlock;
  8641.         addAll: self;
  8642.         yourself!
  8643.  
  8644. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣`▓▀3ëæÆ┐┼²='╫{X@XAΦòLÜÇÄ% {∙KÿbäT▒/╚I∞GÉ╥UÖA`Ñ2ë╥╨≤└ª!
  8645.  
  8646. collect: transformer
  8647.     "Evaluate the <monadicValuable> argument, transformer, for each of the 
  8648.     receiver's elements in the order defined by the receiver's implementation of #do:.
  8649.     Answer a new collection like the receiver (i.e. of the same #species but not 
  8650.     necessarily the exact same class - since the collection may hold a different objects,
  8651.     it may need to be of a different type, hence the #species /#copyLike mechanism) 
  8652.     containing the values returned by transformer on each evaluation."
  8653.  
  8654.     | answer |
  8655.     answer := self copyLike.
  8656.     self do: [:each | answer add: (transformer value: each)].
  8657.     ^answer!
  8658.  
  8659. copyEmpty
  8660.     "Answer an empty copy of the receiver (which must be of the exact same class
  8661.     not just the same #species), with enough capacity for the same number of elements.
  8662.     #copyEmpty can be useful when you wish to take a copy of a collection that
  8663.     preserves all of the collections attributes (including the capacity) apart from its 
  8664.     elements."
  8665.  
  8666.     ^self copyEmpty: self copySize!
  8667.  
  8668. copyEmpty: anInteger
  8669.     "Private - Answer an empty copy of the receiver (which should be of the exact same class
  8670.     not just the same #species), with sufficient capacity for anInteger number of elements."
  8671.  
  8672.     "N.B. Must be reimplemented by subclasses that need to copy additional instance 
  8673.     variables (e.g. the sortBlock of SortedCollection)."
  8674.  
  8675.     ^self class new: anInteger!
  8676.  
  8677. copyLike
  8678.     "Private - Answer an empty collection of the same species as the receiver with 
  8679.     sufficient capacity for anInteger number of elements."
  8680.  
  8681.     ^self copyLike: self copySize!
  8682.  
  8683. copyLike: anInteger
  8684.     "Private - Answer an empty collection of the same species of the receiver with 
  8685.     sufficient capacity for anInteger number of elements."
  8686.  
  8687.     ^self species new: anInteger!
  8688.  
  8689. copySize
  8690.     "Private - Answer the size of empty copy to create when performing various
  8691.     copying/collecting transformations against the receiver. Can be overridden
  8692.     by subclasses for which #size is a slow operation."
  8693.  
  8694.     ^self size!
  8695.  
  8696. copyWithoutDuplicates
  8697.     "Answers a copy of the receiver that contains no duplicate objects. 
  8698.     Uses equality for comparison."
  8699.  
  8700.     | newCollection |
  8701.     newCollection := self copyEmpty.
  8702.     self asSet do: [ :each | newCollection add: each ].
  8703.     ^newCollection!
  8704.  
  8705. countElements
  8706.     "Private - Count, and answer, the number of elements in the receiver.
  8707.     Implementation Note: Could be implemented more elegantly with #inject:into:, but
  8708.     this implementation is about twice as fast."
  8709.  
  8710.     | tally |
  8711.     tally := 0.
  8712.     self do: [ :each | tally := tally + 1].
  8713.     ^tally!
  8714.  
  8715. detect: discriminator
  8716.     "Evaluate the <monadicValuable> argument, discriminator, for each of the receiver's elements
  8717.     in the order defined by the receiver's implementation of #do:.
  8718.     Answer the first element for which discriminator evaluates to true. If none evaluates to true,
  8719.     report an error."
  8720.  
  8721.     ^self detect: discriminator ifNone: [self errorNotFound: discriminator]!
  8722.  
  8723. detect: discriminator ifNone: exceptionHandler
  8724.     "Evaluate the <monadicValuable> argument, discriminator, for each of the receiver's 
  8725.     elements.  Answer the first element (in the #do: order) for which discriminator evaluates 
  8726.     to true. If none evaluates to true answer the result of evaluating the <niladicValuable> 
  8727.     argument, exceptionHandler.
  8728.     Implementation Note: It is important for Shared subclasses that the exceptionHandler is 
  8729.     not evaluated inside the enumeration in case it is a niladic block containing an explicit 
  8730.     return (we try to avoid explicit returns from critical sections, as these require an unwind)."
  8731.  
  8732.     self do: [:each | (discriminator value: each) ifTrue: [^each]].
  8733.     ^exceptionHandler value!
  8734.  
  8735. difference: comperand
  8736.     "Answer a <collection> like the receiver containing the Set theroetic 
  8737.     difference between the receiver and the <collection>, comperand. 
  8738.     i.e. Answer the set of all objects that are elements of the receiver 
  8739.     but not the argument."
  8740.  
  8741.     ^self reject: [:e | comperand includes: e]!
  8742.  
  8743. do: operation
  8744.     "Evaluate the <monadicValuable> argument, operation, for each of the 
  8745.     receiver's elements.
  8746.     The exact visit ordering is unspecified at this level, but this message must be
  8747.     implemented by subclasses (as it provides much of the enumeration behaviour 
  8748.     of Collections), and those implementations are free to define any appropriate
  8749.     ordering."
  8750.  
  8751.     ^self subclassResponsibility!
  8752.  
  8753. do: operation separatedBy: separator
  8754.     "Evaluate the <monadicValuable> argument, operation, for each of the 
  8755.     receiver's elements, interspersed with evaluations of the <niladicValuable>
  8756.     argument, separator. The separator is first evaluated after the first
  8757.     element, and is not evaluated after the last element (i.e. it is not evaluated
  8758.     at all if there are less than two elements)."
  8759.  
  8760.     | sep |
  8761.     sep := [sep := separator].    "Switch to the real separator after first eval."
  8762.     self do: [:e |
  8763.         sep value.
  8764.         operation value: e].
  8765.     sep := nil.!
  8766.  
  8767. errorNotKeyed
  8768.     "Private - Generate an error to the effect that the receiver is not a keyed Collection"
  8769.  
  8770.     ^self error: self class name, 's do not respond to keyed accessing messages'
  8771. !
  8772.  
  8773. growSize
  8774.     "Private - Answer the number of elements by which the receiver should grow, when growing!!
  8775.     (at least 2, in case the receiver is currently empty)"
  8776.  
  8777.     ^self size max: 2!
  8778.  
  8779. identityIncludes: anObject
  8780.     "Answer whether the argument, anObject, is one of the receiver's elements."
  8781.  
  8782.     self do: [ :each | anObject == each ifTrue: [ ^true ]].
  8783.     ^false
  8784. !
  8785.  
  8786. includes: target
  8787.     "Answer whether the <Object> argument, target, is one of the elements of the receiver.
  8788.     Implementation Note: The default is to use equality for comparison."
  8789.  
  8790.     self do: [:each | target = each ifTrue: [^true]].
  8791.     ^false!
  8792.  
  8793. inject: initialValue into: operation
  8794.     "Evaluate the <dyadicValuable> argument, operation, once for each element in the receiver, with
  8795.     that element as the second argument; and with the first argument as the value of the previous 
  8796.     evaluation, starting with the <Object> argument, initialValue. The operation must answer the value
  8797.     it wishes to have passed as its first argument the next time it is evaluated. The traversal is in the #do: 
  8798.     order. Answer the final value of the operation.
  8799.     This enumeration is particularly useful for performing summations and other statistical operations."
  8800.  
  8801.     | nextValue |
  8802.     nextValue := initialValue.
  8803.     self do: [:each | nextValue := operation value: nextValue value: each].
  8804.     ^nextValue!
  8805.  
  8806. intersection: comperand
  8807.     "Answer a new <collection>, like the receiver, that is the intersection of the 
  8808.     receiver and the <collection>, comperand, i.e. answer the set of all objects
  8809.     which are elements of both the receiver and the argument."
  8810.  
  8811.     ^self select: [ :element | comperand includes: element ]!
  8812.  
  8813. isEmpty
  8814.     "Answer whether the receiver contains no elements."
  8815.  
  8816.     ^self size == 0
  8817. !
  8818.  
  8819. maxPrint
  8820.     "Private - Answer the maximum number of characters to be printed onto a stream as 
  8821.     the string representation of the receiver."
  8822.  
  8823.     ^3000
  8824. !
  8825.  
  8826. newSelection
  8827.     "Private - Answer a new empty collection like the receiver to 
  8828.     contain a selection of the receiver's elements."
  8829.  
  8830.     ^self species new!
  8831.  
  8832. notEmpty
  8833.     "Answer whether the receiver contains any elements."
  8834.  
  8835.     ^self isEmpty not!
  8836.  
  8837. occurrencesOf: target
  8838.     "Answer the <integer> number of the receiver's elements which are 
  8839.     equal to the <Object> argument, target."
  8840.  
  8841.     | count |
  8842.     count := 0.
  8843.     self do: [:each | target = each ifTrue: [count := count + 1]].
  8844.     ^count!
  8845.  
  8846. printCyclicRefOn: aStream
  8847.     "Private - Append to the argument, aStream, a String whose characters describe
  8848.     a cyclic (or recursive) reference to the receiver. Used by some
  8849.     printOn: methods (e.g. see Collection) to prevent an infinite recursion."
  8850.  
  8851.     aStream nextPutAll: '... a cyclic ref to '.
  8852.     self basicPrintOn: aStream.
  8853.     aStream nextPutAll: '...'!
  8854.  
  8855. printOn: aStream
  8856.     "Print a string representation of self on aStream. This method suffices for 
  8857.     most collections, and is able to handle cyclic references."
  8858.  
  8859.     | printed |
  8860.     printed := Processor activeProcess _alreadyPrinted.
  8861.     (printed includes: self) ifTrue: [^self printCyclicRefOn: aStream].
  8862.     printed add: self.
  8863.     
  8864.     [| tooMany |
  8865.     tooMany := aStream position + self maxPrint.
  8866.     self printPrefixOn: aStream.
  8867.     self do: 
  8868.             [:each | 
  8869.             aStream position > tooMany 
  8870.                 ifTrue: 
  8871.                     [aStream nextPutAll: '... etc ...'.
  8872.                     ^self].
  8873.             each printOn: aStream]
  8874.         separatedBy: [aStream space].
  8875.     self printSuffixOn: aStream] 
  8876.             ensure: [printed remove: self ifAbsent: []]!
  8877.  
  8878. printPrefixOn: aStream
  8879.     "Private - Print a prefix string for the debug representation of the receiver on aStream."
  8880.  
  8881.     aStream
  8882.         basicPrint: self;
  8883.         nextPut: $(!
  8884.  
  8885. printSuffixOn: aStream
  8886.     "Private - Print a suffix string for the debug representation of the receiver on aStream."
  8887.  
  8888.     aStream nextPut: $)!
  8889.  
  8890. publishedAspects
  8891.         "Answer a <LookupTable> of the <Aspect>s published by the receiver.
  8892.         Implementation Note: By adding superclass aspects to the keyed aspect
  8893.         table we get much better performance because it reduces the number 
  8894.         of rehashes that are necessary due to resizing."
  8895.     
  8896.         ^(self publishedKeyedAspects)
  8897.             addAll: super publishedAspects;
  8898.             yourself!
  8899.  
  8900. publishedKeyedAspects
  8901.         "Answers a LookupTable of the published aspects of the 
  8902.         receiver's keyed contents."
  8903.     
  8904.         "Implementation Note: Allow a little slop for published aspects
  8905.         to be added."
  8906.     
  8907.         | keyedAspects |
  8908.         keyedAspects := LookupTable new: self size + 5.
  8909.         1 to: self basicSize
  8910.             do: 
  8911.                 [:k | 
  8912.                 (self basicAt: k) notNil 
  8913.                     ifTrue: [keyedAspects add: (BasicKeyedAspect key: k)]].
  8914.         ^keyedAspects!
  8915.  
  8916. publishedKeyedAspectsBatchSize
  8917.         "Private - Answers the number of keyed aspects to display in the PAI return at a time"
  8918.     
  8919.         ^200
  8920.     !
  8921.  
  8922. rehash
  8923.     "Rehash the receiver to re-establish hash invariants, if any.
  8924.     The default is to do nothing, but this selector is present at this level, as any
  8925.     subclass could potentially be implemented as a hashed collection." !
  8926.  
  8927. reject: discriminator
  8928.     "Evaluate the <monadicValuable> argument, discriminator, for each of the receiver's elements.
  8929.     Answer a new <collection> like the receiver containing only those elements for which 
  8930.     the discriminator evaluates to false."
  8931.  
  8932.     ^self select: [:elem | (discriminator value: elem) == false]!
  8933.  
  8934. remove: oldElement
  8935.     "Remove the <Object> argument, oldElement, from the receiver's elements.
  8936.     Answer oldElement unless it is not an element of the receiver, in which 
  8937.     case, raise a suitable exception."
  8938.  
  8939.     ^self remove: oldElement ifAbsent: [self errorNotFound: oldElement]!
  8940.  
  8941. remove: oldElement ifAbsent: exceptionHandler
  8942.     "Remove the <Object> argument, oldElement, from the receiver's elements.  
  8943.     If several of the elements are equal to anObject, only one is removed (precisely 
  8944.     which is determined by the the subclass).
  8945.     If no element is equal to oldElement, answer the result of evaluating the <niladicValuable>
  8946.     exceptionHandler. Otherwise, answer oldElement. 
  8947.     Must be implemented by subclasses which comply with <extensibleCollection>."
  8948.  
  8949.     ^self subclassResponsibility!
  8950.  
  8951. removeAll: oldElements
  8952.     "Remove each element of the <collection>, oldElements, from the receiver, raising
  8953.     an Exception if any are not elements of the receiver. Answer oldElements."
  8954.  
  8955.     oldElements do: [:each | self remove: each].
  8956.     ^oldElements!
  8957.  
  8958. select: discriminator
  8959.     "Evaluate the <monadicValuable> argument, discriminator, for each of the receiver's elements.
  8960.     Answer a new <collection> like the receiver containing only those elements for which 
  8961.     the discriminator evaluates to true."
  8962.  
  8963.     | newCollection |
  8964.     newCollection := self newSelection.
  8965.     self 
  8966.         do: [:each | (discriminator value: each) ifTrue: [newCollection add: each]].
  8967.     ^newCollection!
  8968.  
  8969. select: discriminator thenCollect: transformer
  8970.     "Answer a new <collection> like the receiver containing the values returned by 
  8971.     the <monadicValuable>, transformer, when evaluated for each of the receiver's 
  8972.     elements for which the <monadicValuable>, discriminator, evaluates to true."
  8973.  
  8974.     ^(self select: discriminator) collect: transformer!
  8975.  
  8976. size
  8977.     "Answer the <integer> number of elements in the receiver.
  8978.     Implementation Note: This implementation is rather inefficient, 
  8979.     and subclasses will probably want to override it."
  8980.  
  8981.     ^self countElements!
  8982.  
  8983. storeOn: aStream 
  8984.     "Append to the <puttableStream> argument, target, an expression which when 
  8985.     evaluated will answer a collection similar to the receiver."
  8986.  
  8987.     | first |
  8988.     aStream nextPutAll: '(('.
  8989.     self class storeOn: aStream.
  8990.     aStream nextPutAll: ' new)'.
  8991.     first := true.
  8992.     self do: [:value |
  8993.         first
  8994.             ifTrue: [first := false]
  8995.             ifFalse: [aStream nextPut: $;].
  8996.         aStream nextPutAll: ' add: '.
  8997.         value storeOn: aStream].
  8998.     first ifFalse: [aStream nextPutAll: '; yourself'].
  8999.     aStream nextPut: $)!
  9000.  
  9001. sunitbRemoveAll: aCollection
  9002.  
  9003.     ^aCollection do: [:element |
  9004.         self
  9005.             remove: element
  9006.             ifAbsent: []]!
  9007.  
  9008. symmetricDifference: comperand
  9009.     "Answer a <collection> like the receiver containing the symmetric
  9010.     difference of the receiver and the <collection>, comperand. 
  9011.     i.e. Answer the set of all objects that are elements of the receiver 
  9012.     or the argument, but not both."
  9013.  
  9014.     ^(self union: comperand) difference: (self intersection: comperand)!
  9015.  
  9016. union: comperand
  9017.     "Answer a <Set> that is the union of the elements of receiver and 
  9018.     the <collection>, comperand. i.e. Answer the set of all objects that
  9019.     are elements of the receiver or the argument, or both."
  9020.  
  9021.     ^(Set withAll: self)
  9022.         addAll: comperand;
  9023.         yourself
  9024. ! !
  9025.  
  9026. Color comment:
  9027. 'Abstract class of Colours.'!
  9028. !Color class methodsFor!
  9029.  
  9030. black
  9031.     "Answer an instance respresenting black."
  9032.  
  9033.     ^self stdColor: #black!
  9034.  
  9035. blue
  9036.     "Answer an instance respresenting blue."
  9037.  
  9038.     ^self stdColor: #blue!
  9039.  
  9040. brown
  9041.     "Answer an instance respresenting brown."
  9042.  
  9043.     ^self stdColor: #brown!
  9044.  
  9045. buttonFace
  9046.     "Answer the Button Face system color."
  9047.  
  9048.     ^self systemColor: COLOR_BTNFACE!
  9049.  
  9050. byteSize
  9051.     "Answer the byte size of the receiver when converted to parameter format (i.e. by asParameter)."
  9052.  
  9053.     ^4!
  9054.  
  9055. choose
  9056.     "Answer a new instance of the receiver chosen from the common color dialog."
  9057.  
  9058.     ^ColorDialog showModal!
  9059.  
  9060. cyan
  9061.     "Answer an instance respresenting cyan."
  9062.  
  9063.     ^self stdColor: #cyan!
  9064.  
  9065. darkBlue
  9066.     "Answer an instance respresenting darkBlue."
  9067.  
  9068.     ^self stdColor: #darkBlue!
  9069.  
  9070. darkCyan
  9071.     "Answer an instance respresenting dark cyan."
  9072.  
  9073.     ^self stdColor: #darkCyan!
  9074.  
  9075. darkGray
  9076.     "Answer an instance respresenting darkGray."
  9077.  
  9078.     ^self stdColor: #darkGray!
  9079.  
  9080. darkGreen
  9081.     "Answer an instance respresenting darkGreen."
  9082.  
  9083.     ^self stdColor: #darkGreen!
  9084.  
  9085. darkMagenta
  9086.     "Answer an instance respresenting darkMagenta."
  9087.  
  9088.     ^self stdColor: #darkMagenta!
  9089.  
  9090. darkRed
  9091.     "Answer an instance respresenting darkRed."
  9092.  
  9093.     ^self stdColor: #darkRed!
  9094.  
  9095. default
  9096.     "Answer the special Color respresenting the default colour.
  9097.     Pick an RGB value that no-one else is likely to choose"
  9098.  
  9099.     DefaultColor isNil ifTrue: [
  9100.         DefaultColor := self red: 200 green: 200 blue: 201 ].
  9101.     ^DefaultColor!
  9102.  
  9103. dialog
  9104.     "Answer the standard dialog background system color."
  9105.  
  9106.     ^self systemColor: COLOR_3DFACE!
  9107.  
  9108. face3d
  9109.     "Answer the 3D button/menu face system color."
  9110.  
  9111.     ^self systemColor: COLOR_3DFACE!
  9112.  
  9113. fromAddress: anAddress
  9114.     "Answer a new Colour, based on the 32-bit integer value at anAddress."
  9115.  
  9116.     ^self fromInteger: (anAddress asExternalAddress sdwordAtOffset: 0)!
  9117.  
  9118. fromHTMLSpec: aString
  9119.     "Answer an instance of the receiver from the HTML format RGB specification. These
  9120.     are of the form #RRGGBB where RR is the hex value for the red component, etc."
  9121.  
  9122.     | red green blue source rgb |
  9123.     source := aString readStream.
  9124.     rgb := (source peekFor: $#)
  9125.         ifTrue: [Integer readFrom: source radix: 16]
  9126.         ifFalse: [Integer readFrom: source radix: 10].
  9127.     blue := rgb bitAnd: 16rFF.
  9128.     rgb := rgb bitShift: -8.
  9129.     green := rgb bitAnd: 16rFF.
  9130.     rgb := rgb bitShift: -8.
  9131.     red := rgb bitAnd: 16rFF.
  9132.     ^self red: red green: green blue: blue!
  9133.  
  9134. fromInteger: anInteger
  9135.     "Answer an appropriate <Color> to represent the color code value, anInteger."
  9136.  
  9137.     ^((anInteger bitAnd: 16rFFFFFF) < 256 and: [(anInteger bitAnd: 16rFF000000) == 16r1000000]) 
  9138.         ifTrue: [IndexedColor withIndex: anInteger]
  9139.         ifFalse: [ColorRef fromInteger: anInteger]!
  9140.  
  9141. gray
  9142.     "Answer an instance respresenting gray."
  9143.  
  9144.     ^self stdColor: #gray!
  9145.  
  9146. green
  9147.     "Answer an instance respresenting green."
  9148.  
  9149.     ^self stdColor: #green!
  9150.  
  9151. highlight
  9152.     "Answer the Highlight system color."
  9153.  
  9154.     ^self systemColor: COLOR_HIGHLIGHT!
  9155.  
  9156. highlight3d
  9157.     "Answer the 3D Highlight system color."
  9158.  
  9159.     ^self systemColor: COLOR_3DHIGHLIGHT!
  9160.  
  9161. hue: hue saturation: saturation value: value 
  9162.     "Answer a new RGB instance representing the HSV color denoted by the arguments.
  9163.  
  9164.     Valid range for arguments:
  9165.         hue            [0, 360]
  9166.         saturation    [0, 1]
  9167.         value        [0, 1]."
  9168.  
  9169.     | red green blue |
  9170.     saturation isZero 
  9171.         ifTrue: 
  9172.             ["Color on black-white center line, assume achromatic"
  9173.             red := green := blue := value]
  9174.         ifFalse: 
  9175.             ["Chromatic"
  9176.             | h i f p q t |
  9177.             h := hue.
  9178.             h = 360 ifTrue: [h := 0].
  9179.             h := h / 60.
  9180.             i := h floor.
  9181.             f := h - i.
  9182.             p := value * (1.0 - saturation).
  9183.             q := value * (1.0 - (saturation * f)).
  9184.             t := value * (1.0 - (saturation * (1.0 - f))).
  9185.             i == 0 
  9186.                 ifTrue: 
  9187.                     [red := value.
  9188.                     green := t.
  9189.                     blue := p].
  9190.             i == 1 
  9191.                 ifTrue: 
  9192.                     [red := q.
  9193.                     green := value.
  9194.                     blue := p].
  9195.             i == 2 
  9196.                 ifTrue: 
  9197.                     [red := p.
  9198.                     green := value.
  9199.                     blue := t].
  9200.             i == 3 
  9201.                 ifTrue: 
  9202.                     [red := p.
  9203.                     green := q.
  9204.                     blue := value].
  9205.             i == 4 
  9206.                 ifTrue: 
  9207.                     [red := t.
  9208.                     green := p.
  9209.                     blue := value].
  9210.             i == 5 
  9211.                 ifTrue: 
  9212.                     [red := value.
  9213.                     green := p.
  9214.                     blue := q]].
  9215.     ^self 
  9216.         red: (red * 255) truncated
  9217.         green: (green * 255) truncated
  9218.         blue: (blue * 255) truncated.
  9219.     #todo    "Replace by call to system function for conversion"!
  9220.  
  9221. icon
  9222.     "Answers an Icon that can be used to represent this class"
  9223.  
  9224.     ^##(self) defaultIcon!
  9225.  
  9226. magenta
  9227.     "Answer an instance respresenting magenta."
  9228.  
  9229.     ^self stdColor: #magenta!
  9230.  
  9231. menu
  9232.     "Answer the standard window menu background color."
  9233.  
  9234.     ^self systemColor: COLOR_MENU!
  9235.  
  9236. new
  9237.     "Color's are immutable and must be instantiated through one of the specific instance creation
  9238.     methods."
  9239.  
  9240.     ^self shouldNotImplement!
  9241.  
  9242. newAspect: aspectClass name: aSymbol 
  9243.         "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  9244.         which is appropriate for representing aspects of the receiver's type."
  9245.     
  9246.         ^aspectClass color: aSymbol!
  9247.  
  9248. none
  9249.     "Answer the special IndexedColour respresenting no colour."
  9250.  
  9251.     ^ColorRef none
  9252. !
  9253.  
  9254. onPreStripImage
  9255.     "Private -  Assist in the image stripping process by clearning down any
  9256.     lazily initialized variables held by the receiver."
  9257.  
  9258.     DefaultColor := nil!
  9259.  
  9260. red
  9261.     "Answer an instance respresenting red."
  9262.  
  9263.     ^self stdColor: #red!
  9264.  
  9265. red: redValue green: greenValue blue: blueValue
  9266.     "Answer an RGB with the given component values."
  9267.  
  9268.     ^RGB
  9269.         red: redValue
  9270.         green: greenValue
  9271.         blue: blueValue
  9272. !
  9273.  
  9274. shadow3d
  9275.     "Answer the 3D Shadow system color."
  9276.  
  9277.     ^self systemColor: COLOR_3DSHADOW!
  9278.  
  9279. stdColor: aSymbol
  9280.     "Private - Answer an instance whose name is aSymbol."
  9281.  
  9282.     ^IndexedColor stdColor: aSymbol!
  9283.  
  9284. systemColor: anInteger
  9285.     "Answer a new instance of the receiver for the specified system colour."
  9286.  
  9287.     ^SystemColor fromId: anInteger!
  9288.  
  9289. white
  9290.     "Answer an instance respresenting white."
  9291.  
  9292.     ^self stdColor: #white!
  9293.  
  9294. window
  9295.     "Answer the standard window background system color."
  9296.  
  9297.     ^self systemColor: COLOR_WINDOW!
  9298.  
  9299. windowText
  9300.     "Answer the standard window text system color."
  9301.  
  9302.     ^self systemColor: COLOR_WINDOWTEXT!
  9303.  
  9304. withIndex: anInteger
  9305.     "Answer an IndexedColour with index anInteger."
  9306.  
  9307.     ^IndexedColor withIndex: anInteger
  9308. !
  9309.  
  9310. yellow
  9311.     "Answer an instance respresenting yellow."
  9312.  
  9313.     ^self stdColor: #yellow! !
  9314.  
  9315. !Color methodsFor!
  9316.  
  9317. asColorRef
  9318.     "Answer the receiver as a ColorRef (an RGB value or one of the standard pseudo-colour constants)"
  9319.  
  9320.     ^self asRGB!
  9321.  
  9322. asGrayscale
  9323.     | grey rgb |
  9324.     rgb := self asRGB.
  9325.     grey := (rgb red * 30 + (rgb green * 59) + (rgb blue * 11)) // 100.
  9326.     ^Color 
  9327.         red: grey
  9328.         green: grey
  9329.         blue: grey!
  9330.  
  9331. asIndexedColor
  9332.     "Answer the receiver as an IndexedColour."
  9333.  
  9334.     ^self subclassResponsibility!
  9335.  
  9336. asParameter
  9337.     "Answer the reciever in a form suitable for an API call."
  9338.  
  9339.     ^self subclassResponsibility!
  9340.  
  9341. asRGB
  9342.     "Answer the receiver as an RGB"
  9343.  
  9344.     ^self subclassResponsibility!
  9345.  
  9346. brush
  9347.     "Answer a Brush configured for solid painting of the receiver's color."
  9348.  
  9349.     ^self brushClass color: self!
  9350.  
  9351. brushClass
  9352.     "Private - Answer the class of Brush to be used in conjunction with the receiver."
  9353.  
  9354.     ^Brush!
  9355.  
  9356. defaultPalette
  9357.     "Private - Answer the default palette."
  9358.  
  9359.     ^GDILibrary default getStockObject: DEFAULT_PALETTE
  9360. !
  9361.  
  9362. faded
  9363.     "Answer a new color which is a faded (half intensity) copy of the receiver."
  9364.  
  9365.     ^self fadedBy: 2!
  9366.  
  9367. fadedBy: aNumber
  9368.     "Answer a new <Color> which is a copy of the receiver faded by
  9369.     the specified factor."
  9370.  
  9371.     | rgb |
  9372.     rgb := self asRGB.
  9373.     ^Color 
  9374.         red: 255 - ((255 - rgb red) // aNumber)
  9375.         green: 255 - ((255 - rgb green) // aNumber)
  9376.         blue: 255 - ((255 - rgb blue) // aNumber)!
  9377.  
  9378. pen
  9379.     "Answer a Pen configured for solid painting of the receiver's color."
  9380.  
  9381.     ^self penClass color: self!
  9382.  
  9383. penClass
  9384.     "Private - Answer the class of Pen to be used in conjunction with the receiver."
  9385.  
  9386.     ^Pen! !
  9387.  
  9388. COMFunctionAbstract comment:
  9389. 'COMFunctionAbstract is the class of objects which describe COM functions or methods. A COMFunctionAbstract is a meta-level description that holds the type of the functions arguments, the selector of the implementation of this function. COMFunctionAbstract itself is abstract, with subclasses defined to describe different types of function.
  9390.  
  9391. An important behaviour of COMFunctionAbstract is the forwarding of an incoming COM method call to the Smalltalk implementation of that method. Different types of COMFunctionAbstract may forward such calls to different objects, perhaps as different messages. Each <COMInterface> class maintains an <Array> of COMFunctionAbstract subinstances, one for each of the functions defined for the interface, in virtual function table order. When a callback to a COM object implemented in Dolphin arrives from the VM (via the Processor object), the callback gets resolved to the corresponding <COMFunctionXXXX> which is then asked to send an appropriate message to the implementor of that function. The <COMFunctionXXXX> uses argument type information to marshal the arguments from the machine stack into appropriate Smalltalk objects, and then forwards the message as defined by its selector. The implementor might be the generic stub <COMObjectStub> - of which there is an instance for every COM object served up by Dolphin - if the function call is to one of the IUnknown methods, or the <Object> which served up the interface in the first place. The architecture allows the implementor to vary on a per function basis.'!
  9392. !COMFunctionAbstract methodsFor!
  9393.  
  9394. argumentCount
  9395.     "Private - Answer the number of arguments expected by the receiver when 
  9396.     evaluated."
  9397.  
  9398.     ^self descriptor argumentCount!
  9399.  
  9400. argumentsSize
  9401.     "Private - Answer the total size of the receiver's arguments (when
  9402.     pushed on the stack."
  9403.  
  9404.     ^self descriptor argumentsSize!
  9405.  
  9406. argumentTypes
  9407.     "Private - Answer a collection of the argument type names used to instantiate arguments as
  9408.     Smalltalk objects when the receiver is evaluated."
  9409.  
  9410.  
  9411.     ^self descriptor argumentTypes!
  9412.  
  9413. callback: stub interface: aCOMInterface withArgumentsAt: anAddress
  9414.     "Private - Forward a COM virtual function call as a message to the appropriate implementing
  9415.     object stored in the interface, aCOMInterface, with arguments instantiated from memory pointed 
  9416.     at by anAddress, corresponding to the receivers argument types. Answer the result.
  9417.     Implementation Note: This is the normal form of COM dispatch."
  9418.  
  9419.     ^stub implementor        "Forward to the COM server object"
  9420.         perform: self selector 
  9421.         withArgumentsAt: anAddress 
  9422.         descriptor: self descriptor
  9423. !
  9424.  
  9425. callingConvention
  9426.     "Private - Answer the calling convention of the receiver's function."
  9427.  
  9428.     ^self descriptor callingConvention!
  9429.  
  9430. descriptor
  9431.     "Private - Answer the descriptor object which described the external function represented
  9432.     by the receiver."
  9433.  
  9434.     ^self subclassResponsibility!
  9435.  
  9436. messageSelectorAndArgumentNames
  9437.     "Private - Answer the text to be used for the message selector and argument names
  9438.     for automatically generated implementations of the function described by the receiver."
  9439.  
  9440.     | aStream keywords |
  9441.     aStream := (String new: 256) writeStream.
  9442.     self argumentCount > 0
  9443.         ifTrue: [
  9444.             keywords := self selector keywords.
  9445.             keywords do: [:s |
  9446.                 aStream
  9447.                     nextPutAll: s; space;
  9448.                     nextPut: s first asLowercase;
  9449.                     next: s size - 2 putAll: s startingAt: 2]
  9450.                 separatedBy: [aStream space]]
  9451.         ifFalse: [aStream nextPutAll: self selector].
  9452.     ^aStream contents!
  9453.  
  9454. printOn: aStream
  9455.     "Append debug info about the receiver to aStream."
  9456.  
  9457.     aStream
  9458.         basicPrint: self;
  9459.         nextPut: $(;
  9460.         print: self selector;
  9461.         space;
  9462.         print: self descriptor description;
  9463.         nextPut: $)!
  9464.  
  9465. returnType
  9466.     "Private - Answer the return type name of the receiver."
  9467.  
  9468.     ^self descriptor returnType!
  9469.  
  9470. selector
  9471.     "Private - Answer the selector sent when the receiver is evaluated."
  9472.  
  9473.     ^self subclassResponsibility! !
  9474.  
  9475. COMInterfaceImp comment:
  9476. 'COMInterfaceImp is an abstract class which provides the basic implementation for a COM object such as interface querying (i.e. implements #queryInterface:ifNone: sent by the framework when a previously unencountered interface is requested of the COM object), factory registration, CLSID access, and aggregation.
  9477.  
  9478. Note that, although it is convenient, it is not necessary for a COM server object to be a subclass of this class: any Dolphin object can be a COM object. The COM framework provides a wrapper class, COMObjectStub, which takes care of the boilerplate implementation details, and hence the responsibilities here are few and simple. The only message sent by framework to a COM server object is #queryInterface:ifNone:, and even that is optional. If your class sits more happily elsewhere in the hierarchy then this class is a suitable reference for implementing COM support directly in your class.
  9479.  
  9480. Subclasses should implement:
  9481.     (class)#clsid        to answer their CLSID
  9482.     (class)#progID            to answer their ProgID (necessary for registration)
  9483.     #supportedInterfaces        to answer an Array of the support interface classes (not class names)
  9484.  
  9485. Subclasses may implement:
  9486.     #aggregatee        to answer an aggregated object, if supported
  9487.  
  9488. Having added your subclass (and implemented #clsid), you can expose your object to external clients by sending the class the #registerClassFactory method. This need only be done once and a class factory will then be registered with COM each time the image is started. #revokeClassFactories permanently undoes the registration.
  9489.  
  9490. Should you wish to aggregate another object in your subclass then see the comment in the #aggregatee instance method for further instructions.'!
  9491. !COMInterfaceImp class methodsFor!
  9492.  
  9493. clsid
  9494.     "Answer the CLSID which identifies the receiver's server class in the registry.
  9495.     Valid subclasses can be created which do not implement this method, but they will
  9496.     be noncreatable COM coclasses (i.e they cannot be instantiated with CoCreateInstance())."
  9497.  
  9498.     ^CLSID null!
  9499.  
  9500. inprocSurrogate: aBoolean
  9501.     "Answer the COM server DLL which can be used as a surrogate to host the development
  9502.     image. This can be used for debugging an in-process component, or bound with a stripped image
  9503.     to create a deployable in-process component."
  9504.  
  9505.     ^aBoolean ifTrue: ['IPDolphinToGo.dll'] ifFalse: ['IPDolphin.dll']!
  9506.  
  9507. new
  9508.     "Answer a new initialized instance of the receiver.
  9509.     Many COM object implementations will require initializing."
  9510.  
  9511.     ^super new initialize!
  9512.  
  9513. progDescription
  9514.     "Answer the description of the receiver's used to represent it as a COM component in client
  9515.     applications or programming environments.
  9516.     It is sensible to override this to provide a more friendly name, but this is the kind of name one
  9517.     gets from, e.g.,  the ATL wizard, and I suppose its better than nothing."
  9518.  
  9519.     ^self name, ' object'
  9520.  
  9521.     !
  9522.  
  9523. progID
  9524.     "Answer the receiver's programmatic ID, typically used from scripting or macro languagues to 
  9525.     create instances of the receiver, e.g. 'Dolphin.Object.1'. This is not mandatory, and if not 
  9526.     specified for the component then the answer will be nil."
  9527.  
  9528.     ^nil!
  9529.  
  9530. register
  9531.     "Make the necessary registry entries to expose the receiver as a COM object which can be used by
  9532.     other applications. Registry entries for both in-process and out-of-process use are created if the 
  9533.     necessary components are present. This (along with #unregister) provides the necessary mechanism 
  9534.     for self-registration."
  9535.  
  9536.     | sesh |
  9537.     sesh := SessionManager current.
  9538.     self register: (sesh isDLL 
  9539.                 ifTrue: [CLSCTX_INPROC_SERVER]
  9540.                 ifFalse: 
  9541.                     [sesh isRuntime 
  9542.                         ifTrue: [CLSCTX_LOCAL_SERVER]
  9543.                         ifFalse: 
  9544.                             ["For development, register both generic stubs"
  9545.  
  9546.                             CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER]])!
  9547.  
  9548. register: anInteger
  9549.     "Make the necessary registry entries to expose the receiver as a COM object which can be used by
  9550.     other applications for serving objects with the specified class creation context flags."
  9551.  
  9552.     | desc clsid pid clsidKey |
  9553.     clsid := self clsid asString.
  9554.     desc := self progDescription.
  9555.     pid := self progID.
  9556.     "First the ProgID to CLSID mappings (if ProgId available)"
  9557.     pid notNil 
  9558.         ifTrue: 
  9559.             [| vipid pidKey vipidKey |
  9560.             vipid := self versionIndependentProgID.
  9561.             pidKey := RegKey classesRoot createKey: pid.
  9562.             pidKey value: desc.
  9563.             pidKey at: 'CLSID' put: clsid.
  9564.             vipidKey := RegKey classesRoot createKey: vipid.
  9565.             vipidKey
  9566.                 value: desc;
  9567.                 at: 'CLSID' put: clsid;
  9568.                 at: 'CurVer' put: pid].
  9569.  
  9570.     "Then the CLSID to server .EXE/.DLL mappings."
  9571.     clsidKey := (RegKey classesRoot at: 'CLSID') createKey: clsid.
  9572.     clsidKey value: desc.
  9573.     pid notNil ifTrue: [clsidKey at: 'ProgID' put: pid].
  9574.     (anInteger allMask: CLSCTX_LOCAL_SERVER) ifTrue: [self registerAsLocalServer: clsidKey].
  9575.     (anInteger allMask: CLSCTX_INPROC_SERVER) ifTrue: [self registerAsInProcServer: clsidKey]!
  9576.  
  9577. registerAsInProcServer: aRegKey
  9578.     | sesh imageFileName |
  9579.     sesh := SessionManager current.
  9580.     imageFileName := sesh imageFileName.
  9581.     sesh isDLL 
  9582.         ifTrue: [aRegKey at: 'InProcServer32' put: imageFileName]
  9583.         ifFalse: 
  9584.             ["For an executable image we can register the generic in-proc stub for 
  9585.             in-process activation (but only if it is available)."
  9586.  
  9587.             | inProcStub |
  9588.             inProcStub := FileLocator installRelative localFileSpecFor: (self inprocSurrogate: false).
  9589.             (File exists: inProcStub) 
  9590.                 ifTrue: 
  9591.                     [aRegKey at: 'InProcServer32' put: inProcStub.
  9592.                     "The Dolphin specific 'Image' key is needed so the generic stub can find the image to load"
  9593.                     aRegKey at: 'Image' put: imageFileName]]!
  9594.  
  9595. registerAsLocalServer: aRegKey
  9596.     | commandLine sesh |
  9597.     commandLine := String writeStream.
  9598.     commandLine nextPutAll: (ExternalLibrary moduleFileName: nil).
  9599.     sesh := SessionManager current.
  9600.     sesh isRuntime 
  9601.         ifFalse: 
  9602.             [commandLine
  9603.                 space;
  9604.                 nextPut: $";
  9605.                 nextPutAll: sesh imageFileName;
  9606.                 nextPut: $"].
  9607.     aRegKey at: 'LocalServer32' put: commandLine contents!
  9608.  
  9609. registerClassFactory
  9610.     "Register a class factory on the receiver and answer it."
  9611.  
  9612.     ^COMClassFactory on: self!
  9613.  
  9614. revokeClassFactories
  9615.     "Revoke any class factories on the receiver."
  9616.  
  9617.     ^COMClassFactory revokeOn: self!
  9618.  
  9619. uninitialize
  9620.     "Private - Uninitialize the receiver as it is about to be removed from the system
  9621.     (ensure that any class factories are unregistered and revoked)."
  9622.  
  9623.     self unregisterClassFactory!
  9624.  
  9625. uninitializeBeforeRemove
  9626.     "Perform any pre-removal uninitialisation for the class. This includes any specific #uninitialize
  9627.     implementation (but note that #uninitialize is only sent to classes which directly implement
  9628.     #uninitialize, otherwise we'd probably end up damaging superclasses which are not being
  9629.     removed).
  9630.     Implementation Note: This is one of those cases where we want subclasses to inherit the
  9631.     uninitialize, so override to always call it."
  9632.  
  9633.     self uninitialize!
  9634.  
  9635. unregister
  9636.     "Tidy away the residue of a previous #register from the Windows registration database."
  9637.  
  9638.     self progID
  9639.         ifNotNil:
  9640.             [:pid | 
  9641.             (RegKey classesRoot)
  9642.                 removeKey: pid
  9643.                     ifAbsent: [];
  9644.                 removeKey: self versionIndependentProgID
  9645.                     ifAbsent: []].
  9646.     (RegKey classesRoot at: 'CLSID')
  9647.         removeKey: self clsid asString
  9648.         ifAbsent: []!
  9649.  
  9650. unregisterClassFactory
  9651.     "Revoke and unregistery any class factories on the receiver."
  9652.  
  9653.     ^COMClassFactory unregister: self!
  9654.  
  9655. versionIndependentProgID
  9656.     "Answer the receiver's version independent programmatic ID, typically used from 
  9657.     scripting or macro languagues to create instances of the receiver, e.g. 'Dolphin.Object'.
  9658.     Implementation Note: Override this if you don't want to follow the usual convention
  9659.     of the version independent ProgID being the ProgID sans the last numeric component."
  9660.  
  9661.     | pid |
  9662.     pid := self progID.
  9663.     ^pid copyFrom: 1 to: (pid lastIndexOf: $.)-1! !
  9664.  
  9665. !COMInterfaceImp methodsFor!
  9666.  
  9667. aggregatee
  9668.     "Answer the IUnknown (which must be a non-delegating unknown implementation)
  9669.     of any aggregatee of the receiver, or nil if there is none (the default case).
  9670.  
  9671.     Note: In order to aggregate an object in a subclass:
  9672.     1)     Add an instance variable to hold the IUnknown pointer to the aggregatee.
  9673.     2)     Override #initialize on the instance side to create the aggregatee and store down
  9674.         the aggregatee's non-delegating unknown into the instance variable, e.g:
  9675.             innee := IUnknown onCLSID: Aggee clsid outerIUnknown: (self queryInterface: IUnknown)
  9676.     3)     Override this method to answer the instance variable holding the inner unknown ('innee' in the eg).
  9677.     
  9678.     Should you wish to aggregate more than one object, then you will need to hold an array of the non-delegating
  9679.     unknowns of the contained objects and also override #queryInterface:ifNone:"
  9680.  
  9681.     ^nil!
  9682.  
  9683. clsid
  9684.     "Answer the CLSID which identifies the receiver's server class in the registry.
  9685.     Valid subclasses can be created which do not implement this method, but they will
  9686.     not be valid COM 'class' implementations."
  9687.  
  9688.     ^self class clsid!
  9689.  
  9690. finalRelease
  9691.     "The last reference to the receiver (as a COM object) has been released.
  9692.     This is an opportunity to actively clean up, rather than passively waiting 
  9693.     for finalization which might is asynchronous and may never happen if the 
  9694.     object doesn't become garbage."
  9695.  
  9696.     "Override as necessary"!
  9697.  
  9698. queryInterface: anInterfaceClass
  9699.     "Answer a new interface which supports the specified interface protocol
  9700.     (usually a class), or nil if the receiver does not support the interface."
  9701.  
  9702.     ^self queryInterface: anInterfaceClass ifNone: []
  9703. !
  9704.  
  9705. queryInterface: anInterfaceClass ifNone: exceptionHandler
  9706.     "Answer a new interface pointer which supports the specified interface protocol
  9707.     (usually a class). If the receiver does not support the interface, answer the
  9708.     result of evaluating the niladic valuable, exceptionHandler."
  9709.  
  9710.     | class |
  9711.     class := self supportedInterfaces 
  9712.                 detect: [:ic | ic supportsInterface: anInterfaceClass] 
  9713.                 ifNone: [ | aggee |
  9714.                     aggee := self aggregatee.
  9715.                     ^aggee isNil 
  9716.                         ifTrue: [exceptionHandler value]
  9717.                         ifFalse: [aggee queryInterface: anInterfaceClass ifNone: exceptionHandler]].
  9718.     ^class on: self server implementor: self!
  9719.  
  9720. server
  9721.     "Answer the server object on behalf of which the receiver is implementing an
  9722.     interface or interfaces. By default this is the receiver itself, but subclasses
  9723.     may implement interfaces on behalf of other objects in order that any particular
  9724.     server object can support any number of interfaces with different implementors."
  9725.  
  9726.     ^self!
  9727.  
  9728. supportedInterfaces
  9729.     "Answer the set of interface classes supported by the receiver.
  9730.     N.B. The receiver should implement all of the methods defined in all of the 
  9731.     interfaces in the collection answered, with the same selector names (i.e. the
  9732.     first keyword will be the COM function name, with an uppercase initial letter).
  9733.     A simple way to generate templates for these methods is to use the <MethodProtocol>
  9734.     mechanism. The type library analyzer can be configured to generate a protocol when
  9735.     it is building an interface wrapper class. The protocol can simply be dragged into
  9736.     the implementation class to generate the required set of methods. These template 
  9737.     methods do nothing but return E_NOTIMPL and can be implemented
  9738.     as necessary."
  9739.  
  9740.     ^self subclassResponsibility! !
  9741.  
  9742. Command comment:
  9743. 'A Command is used to perform a user interface command as part of the MVP framework. It is effectively a <CommandDescription> that is bound to a particular receiver and its operation can be performed by sending it a #value message.
  9744.  
  9745. Command objects come with the additional capablity of being able to optionally undo and redo the command''s action. We assume that the target responsible for executing the command will also have sufficient information to specify how the command should be undone all re-done. The target may get hold of the currently executing command using:
  9746.  
  9747. Command current.
  9748.  
  9749. An undo operation may be specified using #undoWith: supplying a <nildadicValuable> as its parameter. This valuable is evaluated when #undo is requested. It is important to understand that a redo operation, if required, cannot just be performed by re-executing a Command using #value. This is because many command operations depend on the state of the target that exists when the command is executed (e.g. current selections etc.) and this state may certainly have changed by the time the redo is required. Consequently, if redo support is required, it is necessary for the target to specify exactly how this should be achieved using Command>>#undoWith: and supplying an appropriate <niladicValuable> that, when evaluated, will go ahead and perform the redo.
  9750.  
  9751. If undo/redo support has been enabled for a particular <topPresenter> by enabling its command history using #hasCommandHistory:, then the command framework will expect an undo action to be supplied for every command that can be undone. If such an action is not supplied then we assume that all previous undo history has been invalidated and the command history list will be cleared. However, some commands don''t actually change the state of their targets and so can''t be undone. At the same time they don''t invalidate the previous undo history either. For such commands it is necessary to indicate this behaviour to the framework using Command>>beBenign. When the framework sees that a command has been marked as benign, it does not add it to the current Shell''s command history nor does it clear it.
  9752.  
  9753. Instance Variables:
  9754.     commandDescription        <CommandDescription> specifying the command to be performed.
  9755.     receiver            <Object> to which the command will be directed.
  9756.     undoAction        <niladicValuable> that, when evaluated, will undo the original command.
  9757.     redoAction        <niladicValuable> that, when evaluated, will redo the original command.
  9758.     isBenign            <boolean> indicating that a command has had no effect on the receiver''s state.'!
  9759. !Command class methodsFor!
  9760.  
  9761. current
  9762.     "Answers the current instance of the receiver that is being performed"
  9763.  
  9764.     ^Current!
  9765.  
  9766. new
  9767.     "Private - Use #receiver:commandDescription:"
  9768.  
  9769.     self shouldNotImplement!
  9770.  
  9771. receiver: anObject commandDescription: aCommandDescription
  9772.     "Answer an instance of the receiver with aCommandDescription being bound to anObject
  9773.     as its command target.."
  9774.  
  9775.     ^super new receiver: anObject commandDescription: aCommandDescription
  9776. ! !
  9777.  
  9778. !Command methodsFor!
  9779.  
  9780. beBenign
  9781.     "Set the receiver to be a benign command"
  9782.  
  9783.     isBenign := true!
  9784.  
  9785. canRedo
  9786.     "Answer true if the effect of the receiver can be redone"
  9787.  
  9788.     ^redoAction notNil!
  9789.  
  9790. canUndo
  9791.     "Answer true if the effect of the receiver can be undone"
  9792.  
  9793.     ^undoAction notNil!
  9794.  
  9795. command
  9796.     "Answer the command to action when the receiver's value is requested."
  9797.  
  9798.     ^self commandDescription command!
  9799.  
  9800. commandDescription
  9801.     "Answer the command description for the receiver."
  9802.  
  9803.     ^commandDescription!
  9804.  
  9805. description
  9806.     "Answers a short String description of the receiver's command."
  9807.  
  9808.     ^self commandDescription description!
  9809.  
  9810. isBenign
  9811.     "Answer true if the receiver is a benign command, i.e. it does not change the state of the
  9812.     command target in any way that is significant. In such cases the command will not invalidate
  9813.     any command undo history list even if it does not have an undo action set."
  9814.  
  9815.     ^isBenign!
  9816.  
  9817. isModalCommand
  9818.     ^self commandDescription isModalCommand!
  9819.  
  9820. receiver
  9821.     "Answers the command target for the receiver's command."
  9822.  
  9823.     ^receiver!
  9824.  
  9825. receiver: anObject commandDescription: aCommandDescription
  9826.     "Private - Initialize the receiver. Sets the command description to aCommandDescription
  9827.     and the command target to anObject."
  9828.  
  9829.     receiver := anObject.
  9830.     commandDescription := aCommandDescription.
  9831.     isBenign := false.
  9832. !
  9833.  
  9834. redo
  9835.     "Redo the effect of the receiver. "
  9836.  
  9837.     redoAction value!
  9838.  
  9839. redoWith: aNiladicValuable
  9840.     "Sets the redo action for the receiver to aNiladicValuable"
  9841.  
  9842.     redoAction := aNiladicValuable!
  9843.  
  9844. undo
  9845.     "Undo the effect of the receiver"
  9846.  
  9847.     undoAction value!
  9848.  
  9849. undoWith: aNiladicValuable
  9850.     "Sets the undo action for the receiver to aNiladicValuable"
  9851.  
  9852.     undoAction := aNiladicValuable!
  9853.  
  9854. value
  9855.     "Executes the receiver and answers the result. Maintain the currently executing
  9856.     command in the class variable, Current."
  9857.  
  9858.     Current := self.
  9859.     ^[self commandDescription performAgainst: self receiver] ensure: [Current := nil]! !
  9860.  
  9861. CommandDescription comment:
  9862. 'A CommandDescription acts as the fundamental source for all MVP user interface commands. An instance of this class holds the command itself, a textual description of the command''s function and, optionally, an accelerator key that may trigger the command action when used within a menu. The command can be a <Message>, <Symbol> or, indeed, any object that responds to the <commandMessage> protocol. For most commands, symbols are prevalent but messages can sometimes be more convenient, especially if the command is to carry parameters, such as in dynamically constructed menus (e.g. the browser history list).
  9863.  
  9864. The MVP command framework operates as follows. There exist a number of potential command sources which each carry a CommandDescription that dictates the command that they wish to transmit. Possible command sources are Menus (drop-down and context), PushButtons and ToolbarButtons. When each source is actioned, the framework determines an appropriate view that can be considered as the origin for the command. Usually this is the view with focus but, in the case of context menus, it is the view beneath the context mouse click. 
  9865.  
  9866. The next stage is for the framework to determine a suitable target that will perform the command. It does this by creating a CommandQuery object containing the CommandDescription and then routing this via a number of potential command targets to determine if any of these are willing to accept responsibility for executing it. The actual route of command targets is determined by the active CommandPolicy for the originating view. The default CommandPolicy routes the CommandQuery''s in the sequence (view-presenter-model) and so on up the originating view''s parent chain. Normally this default policy is sufficient for most needs, but if necessary the policy can be specialized for a particular View class, or one can interfere with the routing of individual commands by explicitly setting the receiver (eventual target). At each stage in the routing, a potential target object is sent a #queryCommand: message with the CommandQuery as a parameter. This method is responsible for deciding whether the command should be considered as enabled at this target. It does so by setting CommandQuery>>enabled: to true where applicable. When the framework sees that a CommandQuery has been enabled it halts the routing process and gets around to performing command on the last target visited (or on the explicitly set target).
  9867.  
  9868. In order to perform the command, a Command object is created from the original CommandDescription and the designated receiver (target) object. The Command object is a valuable which, when performed, executes the command''s message against the receiver. When the command is actually being performed by the appropriate target method, it is possible for this to install some actions that can indicate how the operation may be undone or re-done. If these actions are set (and the top level Shell presenter to which the target belongs has been enabled to retain command history) then the framework will add the Command to its history once it has being performed. This allows an undo/redo facility to be added in a straightforward fashion to almost any application.
  9869.  
  9870. Another important aspect of the command framework is the ability to determine whether a particular CommandDescription can be performed without having to actually go-ahead and execute it. This is necessary in order to appropriately enable and disable the various command sources in the user interface. For example, when a menu is pulled down it must correctly display those commands which are enabled and disabled according to the current state of the application. The framework does this by using the same routing scheme that it uses when a command is to be executed. As a menu is pulled down or popped up, all of the commands within it are routed to determine whether their corresponding menu items should be enabled or not. At the same time onecan also indicate whether a particular command should appear checked (#checked:) or not, and specify whether it is considered the default command for its enclosing menu (#isDefault:).
  9871.  
  9872. As you can see, it is fairly straightforward for the command framework to determine when to query the commands that originate in menu items since the menus appear at defined times as requested by the user. However, for the various button command sources, the situation is somewhat more complicated since these are continuously visible and a is no obvious moment to perform the query routing. It is therefore necessary for the framework to route a CommandQuery at idle time in order to enable/disable and check/uncheck such items. This process could easily consume far too many processor cycles if not managed carefully. Consequently, the routing operation is only carried out if the user interface has been previously marked as being invalid. This is done by an application sending #invalidateUserInterface to any view or presenter whenever it considers that it has done something to change the application''s state. It is also done automatically by the framework following each command execution, since commands are very often responsible for changing such state.
  9873.  
  9874. The end result of a user interface component being marked by #invalidateUserInterface is that it will eventually receive a #validateUserInterface message; usually when the system next enters idle. The various button command sources use this message as a prompt to route a CommandQuery as described above. However, it is acceptable, and may sometimes be useful, to override #validateUserInterface to perform your own explicit interface validation.
  9875.  
  9876. The overall aim of the MVP command framework is to provide a flexible routing system to direct commands from their various sources to appropriate target objects that can execute them. The framework effectively implements the Chain Of Responsibility pattern, with the chain being determined by the active CommandPolicy.
  9877.  
  9878. Instance Variables:
  9879.     command        <commandMessage> indicating the command to be performed, e.g. a <Symbol> or <Message>
  9880.     description        <readableString> that describes the command to the user.
  9881.     acceleratorKey    <integer> virtual key code for the accelerator key that will trigger this command.
  9882.     unused        Reserved for future use.
  9883.     
  9884. '!
  9885. !CommandDescription class methodsFor!
  9886.  
  9887. command: commandMessage
  9888.     "Answer a new instance of the receiver for the specified <commandMessage>.
  9889.     N.B. The command is an identity instance variable."
  9890.     
  9891.     ^self basicNew
  9892.         initialize;
  9893.         command: commandMessage!
  9894.  
  9895. command: commandMessage description: aString
  9896.     "Answer a new instance of the receiver with the specified <commandMessage>
  9897.     (required) and long description."
  9898.     
  9899.     ^(self command: commandMessage)
  9900.         description: aString!
  9901.  
  9902. command: commandMessage description: aString image: anImage
  9903.     "Answer a new instance of the receiver with the specified <commandMessage>
  9904.     (required) and long description and image"
  9905.  
  9906.     ^(self command: commandMessage description: aString) image: anImage!
  9907.  
  9908. idFor: aCommandDescription
  9909.     "Private - Answer a unique id for aCommandDescription, registering the command in our
  9910.     CommandDescriptionRegistry if it has not been added before."
  9911.  
  9912.     ^CommandDescriptionRegistry at: aCommandDescription ifAbsentPut: [self nextId]!
  9913.  
  9914. initialize
  9915.     "Private - Initialize the receiver's class variables.
  9916.         CommandDescription initialize
  9917.     "
  9918.  
  9919.     CommandDescriptionRegistry isNil 
  9920.         ifTrue: 
  9921.             [CommandDescriptionRegistry := WeakIdentityDictionary newWithWeakKeys: 150.
  9922.             CurrentId := self startingId].
  9923.     DefaultMask := 1.
  9924.     ModalMask := 2!
  9925.  
  9926. maximumId
  9927.     "Private - Answer the maximum id that we have available."
  9928.  
  9929.     ^32767!
  9930.  
  9931. new
  9932.     "Instances of the receiver must have a command selector specified."
  9933.  
  9934.     ^self command: #noCommand!
  9935.  
  9936. nextId
  9937.     "Private - Answer the next <SmallInteger> id to use."
  9938.  
  9939.     | wrapped max |
  9940.     wrapped := false.
  9941.     max := self maximumId.
  9942.     [     (CurrentId := CurrentId + 1) > max ifTrue: [
  9943.             wrapped ifTrue: [^self error: 'There are no unused command ids available.'].
  9944.             wrapped := true.
  9945.             CurrentId := self startingId].
  9946.         CommandDescriptionRegistry identityIncludes: CurrentId] whileTrue.
  9947.     ^CurrentId!
  9948.  
  9949. publishedAspectsOfInstances
  9950.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  9951.     
  9952.         ^(super publishedAspectsOfInstances)
  9953.             add: (Aspect name: #command);
  9954.             add: (Aspect string: #description);
  9955.             add: (Aspect hotkey: #acceleratorKey);
  9956.             add: (Aspect boolean: #isModalCommand);
  9957.         add: (Aspect icon: #image);
  9958.             yourself!
  9959.  
  9960. startingId
  9961.     "Private - Answer the first id which we can safely use."
  9962.  
  9963.     ^4000!
  9964.  
  9965. stbConvertFrom: anSTBClassFormat 
  9966.     "Convert from earlier CommandDescription versions."
  9967.  
  9968.     ^
  9969.     [:data | 
  9970.     | newInstance |
  9971.     newInstance := self basicNew.
  9972.     1 to: data size do: [:i | newInstance instVarAt: i put: (data at: i)].
  9973.     anSTBClassFormat version < 2 
  9974.         ifTrue: 
  9975.             [newInstance instVarAt: 1 put: (data at: 1).    "command"
  9976.             newInstance instVarAt: 2 put: (data at: 3).    "description <- shortDescription"
  9977.             newInstance instVarAt: 3
  9978.                 put: (anSTBClassFormat version < 1 
  9979.                         ifFalse: [data at: 4]
  9980.                         ifTrue: 
  9981.                             [(data at: 4) isNil ifTrue: [0] ifFalse: [AcceleratorTable keyCodeFromString: (data at: 4)]]).
  9982.             4 to: self instSize do: [:i | newInstance instVarAt: i put: (data at: i + 1)]].
  9983.     anSTBClassFormat version < 4 
  9984.         ifTrue: 
  9985.             ["Ensure flags zeroed"
  9986.             (newInstance instVarAt: 4) isNil ifTrue: [newInstance instVarAt: 4 put: 0]].
  9987.     newInstance].
  9988.     #todo    "Temporary to upgrade pre-GA resources"!
  9989.  
  9990. stbVersion
  9991.     "Answer the current STB filer version  for instances of the receiver"
  9992.  
  9993.     ^4!
  9994.  
  9995. withId: anInteger ifAbsent: absentBlock
  9996.     "Answer a CommandDescription associated with anInteger id or if it is not in use
  9997.     then the value of absentBlock."
  9998.  
  9999.     ^CommandDescriptionRegistry keyAtValue: anInteger ifAbsent: absentBlock! !
  10000.  
  10001. !CommandDescription methodsFor!
  10002.  
  10003. acceleratorKey
  10004.     "Answers the <integer> accelerator key code for the receiver, or zero if there is none."
  10005.  
  10006.     ^acceleratorKey!
  10007.  
  10008. acceleratorKey: code
  10009.     "Set the receiver's accelerator key code to the <integer> argument, code."
  10010.  
  10011.     acceleratorKey := code!
  10012.  
  10013. acceleratorKeyString
  10014.     "Answers the <readableString> accelerator key string for the receiver, 
  10015.     or an empty <String> if there is none."
  10016.  
  10017.     ^AcceleratorTable keyStringFromCode: self acceleratorKey!
  10018.  
  10019. acceleratorKeyString: keys
  10020.     "Sets the accelerator key to the key code generated from parsing the <readableString> 
  10021.     accelerator key description, keys."
  10022.  
  10023.     self acceleratorKey: (AcceleratorTable keyCodeFromString: keys)!
  10024.  
  10025. canPerformAgainst: destination
  10026.     "Answer whether the command described by the receiver can be 
  10027.     executed against the hypothetical <commandTarget>, destination."
  10028.  
  10029.     | selector |
  10030.     ^(selector := self commandSymbol) isNil or: [destination respondsTo: selector]
  10031. !
  10032.  
  10033. command
  10034.     "Answers the <commandMessage> forwarded to a command target when
  10035.     the receiver's command is performed."
  10036.  
  10037.     ^command!
  10038.  
  10039. command: commandMessage
  10040.     "Sets the <commandMessage> held by the receiver to the argument.
  10041.     <Symbol>, <Message>, and <MessageSend> are examples of classes which implement 
  10042.     the <commandMessage> protocol."
  10043.  
  10044.     command := commandMessage!
  10045.  
  10046. commandString
  10047.     "Answer a String representation of the receiver's command."
  10048.  
  10049.     ^self command printString!
  10050.  
  10051. commandString: commandText
  10052.     "Sets the receiver's command from the <readableString> representation, commandText."
  10053.  
  10054.     | c |
  10055.     c := Compiler evaluate: commandText logged: false.
  10056.     c notNil ifTrue: [self command: c]!
  10057.  
  10058. commandSymbol
  10059.     "Answer a String representation of the receiver's command."
  10060.  
  10061.     | cmd |
  10062.     ^(cmd := self command) isNil ifFalse: [cmd asSymbol] !
  10063.  
  10064. description
  10065.     "Answers a short <readableString> description of the receiver's command. Uses the string
  10066.     representation of the command itself if no explicit description has been provided."
  10067.  
  10068.     ^description isNil 
  10069.         ifTrue: [self commandSymbol asPhrase]
  10070.         ifFalse: [description]!
  10071.  
  10072. description: aString
  10073.     "Sets the long description of the receiver's command to the <readableString>
  10074.     argument."
  10075.  
  10076.     description := (aString isNil or: [aString isEmpty]) ifFalse: [aString]!
  10077.  
  10078. displayOn: aStream
  10079.     "Append a representation of the receiver to the <puttableStream> target that an 
  10080.     end-user would want to see."
  10081.  
  10082.     self description displayOn: aStream!
  10083.  
  10084. hasAcceleratorKey
  10085.     "Answer whether the receiver defines an accelerator key."
  10086.  
  10087.     ^acceleratorKey ~= 0!
  10088.  
  10089. id
  10090.     "Answer a unique <integer> id for the receiver's command obtained from the command registry."
  10091.  
  10092.     ^self class idFor: self!
  10093.  
  10094. image
  10095.     "Answers the <Image> associated with the receiver or nil if there is none"
  10096.  
  10097.     ^image!
  10098.  
  10099. image: anImageOrNil
  10100.     "Sets  the icon associated with the receiver to anImageOrNil"
  10101.  
  10102.     image := anImageOrNil!
  10103.  
  10104. initialize
  10105.     "Private - Initialize the receiver."
  10106.  
  10107.     acceleratorKey := 0.
  10108.     flags := 0!
  10109.  
  10110. isModalCommand
  10111.     "Answer whether the receiver describes a command that should be performed modally to 
  10112.     its initiating shell (i.e. the shell will be disabled for the duration of execution of the
  10113.     command)."
  10114.  
  10115.     ^flags allMask: ModalMask!
  10116.  
  10117. isModalCommand: aBoolean
  10118.     "Set whether the command described by the receiver should be be performed modally to 
  10119.     its initiating shell (i.e. the shell will be disabled for the duration of execution of the
  10120.     command). This is particularly useful for commands that pop-dialogs to request 
  10121.     additional inputs that they subsequently use to complete the command."
  10122.  
  10123.     flags := flags mask: ModalMask set: aBoolean!
  10124.  
  10125. menuText
  10126.     "Private - Answer the menu text (i.e. the text that appears in a menu) for the receiver."
  10127.  
  10128.     | menuText |
  10129.     menuText := self description.
  10130.     self hasAcceleratorKey ifTrue: [
  10131.         menuText := menuText, String tab, self acceleratorKeyString].
  10132.     ^menuText!
  10133.  
  10134. performAgainst: anObject
  10135.     "Private - Perform the command described by the receiver against the argument
  10136.     by forwarding it the receiver's <commandMessage>."
  10137.  
  10138.     ^self command forwardTo: anObject!
  10139.  
  10140. printOn: aStream
  10141.     "Append a representation of the receiver to the <puttableStream> target that an 
  10142.     developer would want to see."
  10143.  
  10144.     aStream
  10145.         basicPrint: self;
  10146.         nextPut: $(;
  10147.         display: self;
  10148.         nextPut: $)!
  10149.  
  10150. queryCommand: query
  10151.     "Enters status and target details about the receiver's own command into the 
  10152.     <CommandQuery>, query.
  10153.     Implementation Note: If the receiver represents a fully closed command, then we can
  10154.     skip all further routing (the CommandDescription itself is queried first by default),
  10155.     but we leave this decision to the command object itself if it appears capable."
  10156.  
  10157.     (self command class conformsToProtocol: #commandTarget)
  10158.         ifTrue: [^self command queryCommand: query].
  10159.     ^false!
  10160.  
  10161. registerAcceleratorKeyIn: accelerators
  10162.     "Private - Register the receiver's accelerator key, if any, in the <AcceleratorTable>,
  10163.     accelerators."
  10164.  
  10165.     acceleratorKey == 0 ifFalse: [
  10166.         accelerators addKey: acceleratorKey commandDescription: self]!
  10167.  
  10168. toolTipText
  10169.     "Answer a <readableString> suitable for displaying in a Tool-tip control."
  10170.  
  10171.     ^self description! !
  10172.  
  10173. CommandPolicy comment:
  10174. 'A CommandPolicy determines how a user interface command is routed from its source (menu, toolbar button or pushbutton) to the eventual target that will be responsible for actually performing the command. A route consists of a sequence of potential command targets which in the standard MVP environment are usually (but not essentially) view, presenters or models. 
  10175.  
  10176. The CommandPolicy in use creates a CommandQuery object and use this to discover whether a command can successfully be performed by any of the potential targets. This is done in #query:. The end result will be a CommandQuery that is bound to a target object and filled in appropriately with information such as whether the command should be considered to be enable, checked, etc. This information is used to determine the state of menu items and toolbar buttons. Since the CommandQuery is bound to a target that is known to be able to accept the command, this can then be performed directly.
  10177.  
  10178. The MVP framework creates an instance of CommandPolicy each time it wishes to either determine the status of a command, in order to update the user interface representation of that command, or when the command is to be performed. This class routes from a starting view through its presenter and model. The route then continues with the same sequence moving up the view''s parent chain. If you wish to change the routing policy for a specific view then override #commandPolicy in the particular view class to answer an instance of a different CommandPolicy subclass. New CommandPolicy subclasses will need to override the #routeFrom: method to define their routing policy.
  10179.  
  10180. Note: In versions of Dolphin prior to the 3.0 release this class was a singleton. This proved to be inefficient as the system became more sophisticated - in particular the automatic idle time revalidation of toolbars, etc, was causing the route to be regenerated once for every toolbar button.
  10181.  
  10182. Instance Variables:
  10183.     source        <View> origin of the commands to be routed.
  10184.     path        <OrderedCollection> of <commandTarget>. The route built by #routeFrom:.
  10185.  
  10186.  
  10187.  
  10188.  
  10189.  
  10190.  
  10191. '!
  10192. !CommandPolicy class methodsFor!
  10193.  
  10194. commandSource: sourceView
  10195.     "Answer a new instance of the receiver for routing commands
  10196.     from the <View>, source."
  10197.  
  10198.     ^super new
  10199.         source: sourceView;
  10200.         yourself!
  10201.  
  10202. defaultClass
  10203.     "Answer the subclass used by default for command routing."
  10204.  
  10205.     ^DelegatingCommandPolicy!
  10206.  
  10207. new
  10208.     "Instances of the receiver should be created using the #commandSource: message."
  10209.  
  10210.     ^self shouldNotImplement! !
  10211.  
  10212. !CommandPolicy methodsFor!
  10213.  
  10214. appendPresenter: presenter
  10215.     "Append the <presenter>, presenter, to the current command path in the standard 
  10216.     way, i.e. also add in the presenter's view, and its model if it is a <commandTarget>. 
  10217.     Answer the next <presenter> to visit."
  10218.  
  10219.     | model |
  10220.     self appendTarget: presenter.
  10221.     presenter hasView ifTrue: [self appendTarget: presenter view].
  10222.     model := presenter model.
  10223.     "Note: We only include the model if it conforms to the <commandTarget> protocol"
  10224.     (model class conformsToProtocol: #commandTarget)
  10225.         ifTrue: [self appendTarget: model].
  10226.     ^presenter parentPresenter!
  10227.  
  10228. appendTarget: target
  10229.     "Append the <commandTarget>, target, to the existing chain-of-command if not already
  10230.     present. Answers the target if it was added, or nil if already in the path.
  10231.     This can be used by the presenter answering the command policy to amend the
  10232.     default routing by inserting new command targets at its end. Note that the new
  10233.     target will not be added if already present in the path."
  10234.  
  10235.     | cofc |
  10236.     cofc := self commandPath.
  10237.     ^(cofc identityIncludes: target)
  10238.         ifFalse: [cofc addLast: target]        !
  10239.  
  10240. commandPath
  10241.     "Answer an <OrderedCollection> of <commandTarget>s which is the chain-of-command
  10242.     (i.e. the path along which commands are routed) used by the receiver for querying and 
  10243.     performing commands."
  10244.  
  10245.     ^path!
  10246.  
  10247. commandQueryClass
  10248.     "Answer the class of <CommandQuery> to use for querying the status of commands."
  10249.  
  10250.     ^CommandQuery!
  10251.  
  10252. insertTarget: newTarget after: existingTarget
  10253.     "Insert the <commandTarget>, newTarget, into the existing chain-of-command 
  10254.     immediately after the <commandTarget>, existingTarget, shuffling any subsequent
  10255.     <commandTarget>s up one position. The target is not inserted if it already exists
  10256.     in the path at an earlier position, and is moved if already at a later position.
  10257.     Answers the target if it was added, or nil if already in the path."
  10258.  
  10259.     | existingIdx cofc |
  10260.     cofc := self commandPath.
  10261.     existingIdx := cofc identityIndexOf: existingTarget ifAbsent: [cofc size - 1].
  10262.     ^self insertTarget: newTarget atIndex: existingIdx + 1!
  10263.  
  10264. insertTarget: target atIndex: index
  10265.     "Insert the <commandTarget>, target, into the existing chain-of-command 
  10266.     at the position identified by the <integer>, index, shuffling any subsequent
  10267.     <commandTarget>s up one. The target is not inserted if it already exists
  10268.     in the path at an earlier position, and is moved if already at a later position.
  10269.     Answers the target if it was added, or nil if already in the path."
  10270.  
  10271.     | idx cofc |
  10272.     cofc := self commandPath.
  10273.     ^(idx := cofc identityIndexOf: target) == 0
  10274.         ifTrue: [cofc add: target beforeIndex: index]
  10275.         ifFalse: [
  10276.             index < idx ifTrue: [
  10277.                 cofc removeAtIndex: idx.
  10278.                 cofc add: target beforeIndex: index]]!
  10279.  
  10280. insertTarget: newTarget before: existingTarget
  10281.     "Insert the <commandTarget>, newTarget, into the existing chain-of-command 
  10282.     immediately before the <commandTarget>, existingTarget, shuffling any subsequent
  10283.     <commandTarget>s up one position. The target is not inserted if it already exists
  10284.     in the path at an earlier position, and is moved if already at a later position.
  10285.     Answers the target if it was added, or nil if already in the path."
  10286.  
  10287.     | existingIdx cofc |
  10288.     cofc := self commandPath.
  10289.     existingIdx := cofc identityIndexOf: existingTarget ifAbsent: [cofc size].
  10290.     ^self insertTarget: newTarget atIndex: existingIdx!
  10291.  
  10292. newCommandQuery: action
  10293.     "Answer a new <CommandQuery> for the <commandDescription>, action, 
  10294.     originating in the receiver's source <View>."
  10295.  
  10296.     ^self commandQueryClass
  10297.         commandDescription: action 
  10298.         source: self source!
  10299.  
  10300. prependTarget: target
  10301.     "Append the <commandTarget>, target, to the existing chain-of-command if not already
  10302.     present. Answers the target if it was added, or nil if already in the path.
  10303.     This can be used by the presenter answering the command policy to amend the
  10304.     default routing by inserting new command targets at its end. Note that the new
  10305.     target will moved from its current position already present in the path."
  10306.  
  10307.     | idx cofc |
  10308.     cofc := self commandPath.
  10309.     (idx := cofc identityIndexOf: target) ~= 0
  10310.         ifTrue: [cofc removeAtIndex: idx].
  10311.     cofc addFirst: target.
  10312.     ^target!
  10313.  
  10314. query: action
  10315.     "Query the route of the <commandDescription>, action, starting from the 
  10316.     receiver's command source <View>, and answer an instance of <CommandQuery>
  10317.     that describes the enablement state of the command and a potential receiver.
  10318.     This is the command querying policy used in versions of Dolphin prior to 4.0, and
  10319.     it does not include the command itself as the first potential target."
  10320.  
  10321.     | query |
  10322.     query := self newCommandQuery: action.
  10323.     self queryCommand: query.
  10324.     ^query.
  10325.  
  10326.     
  10327.     !
  10328.  
  10329. queryCommand: query
  10330.     "Private - Enter details about a potential command into the <CommandQuery>, query.
  10331.     Typically this involves visiting each potential <commandTarget> on the
  10332.     chain-of-command."
  10333.  
  10334.     "First ask the commandDescription itself in case it is configured for a static target"
  10335.     self queryCommand: query ofTarget: query commandDescription.
  10336.     query receiver isNil ifTrue: [
  10337.         "Dynamically target command, query at each potential target."
  10338.         self commandPath do: [:each |
  10339.             self queryCommand: query ofTarget: each.
  10340.             "Early out if a receiver was found irrespective of whether the command is actually enabled."
  10341.             query receiver notNil ifTrue: [^query]]].
  10342.  
  10343.     ^query!
  10344.  
  10345. queryCommand: query ofTarget: target
  10346.     "Private - Ask the <commandTarget>, target, if it is prepared to accept the command
  10347.     described in the <CommandQuery>, query."
  10348.  
  10349.     target queryCommand: query.
  10350.     query isEnabled ifTrue: [
  10351.         "If the accepting target has not specified the receiver, then default to it."
  10352.         query receiver isNil ifTrue: [query receiver: target]].
  10353. !
  10354.  
  10355. route: aCommandDescription
  10356.     "Routes the <CommandDescription>, action, along the receiver's route from
  10357.     its command source, and, if enabled, execute it.
  10358.     The command was originally generated by the receiver's command source."
  10359.  
  10360.     | query |
  10361.     query := self query: aCommandDescription.
  10362.     query canPerform
  10363.         ifTrue: [query perform]
  10364.         ifFalse: [Sound defaultBeep].
  10365.     ^0    "Suppress default processing"!
  10366.  
  10367. routeFrom: sourceView
  10368.     "Build and answer an <OrderedCollection> of <commandTarget>s which constitues the path via
  10369.     which commands should be routed that originate from the <View> argument.
  10370.     The policy implemented here walks up the chain of presenters from the presenter of 
  10371.     the <View>, sourceView, at each stage appending the presenter followed the by the view itself, 
  10372.     and lastly the model if it is a <commandTarget>."
  10373.  
  10374.     | presenter |
  10375.     path := OrderedCollection new.
  10376.     presenter := sourceView presenter.
  10377.     [presenter notNil and: [presenter ~= DeafObject current]] whileTrue: [ | next |
  10378.         "A common mistake is to forget to answer the next presenter to visit, so move up to the parent by default
  10379.          to avoid entering an infinite loop."
  10380.         next := self visitPresenter: presenter.
  10381.         presenter := next == presenter
  10382.                     ifTrue: [presenter parentPresenter]
  10383.                     ifFalse: [next]].
  10384.     ^path!
  10385.  
  10386. source
  10387.     "Private - Answer a <View> which is the original command source."
  10388.  
  10389.     ^source!
  10390.  
  10391. source: sourceView
  10392.     "Private - Set the original command source to the <View> argument, sourceView."
  10393.  
  10394.     source := sourceView.
  10395.     path := self routeFrom: source!
  10396.  
  10397. visitPresenter: presenter
  10398.     "Private - Visit the <presenter>, presenter, as the next in the chain-of-command, 
  10399.     adding its contributions to that chain. Answer the next <presenter> to visit."
  10400.  
  10401.     ^self subclassResponsibility! !
  10402.  
  10403. CommandQuery comment:
  10404. 'A CommandQuery is used to determine whether, and how, a particular command can be performed. A command is queried in two situations. The first is to determine whether a command source should be enabled and/or checked. When a menu is pulled down it needs to determine the enable, default, and check state of each of its items. Similarly, a PushButton or ToolbarButton will need to determine its state; usually at idle time during #validateUserInterface processing. The second situation arises when a command is to be dispatched and executed. Again a CommandQuery is used to determine the target object that will actually perform it (i.e. the eventual receiver).
  10405.  
  10406. To determine the default/enable/checked state of a command, a CommandQuery is created and routed (using the current CommandPolicy) through each of the #queryCommand: methods of the potential target objects. The #queryCommand: method is responsible for using the #isDefault, #enabled: and #checked: methods to set the state of the command at that target location. If, at any point in the routing, a target object sets the CommandQuery as being enabled then the framework will determine that the target should be the eventual receiver of the command. As of Dolphin 3.0 a #queryCommand: implementation can also explicitly set the receiver to override the frameworks default behaviour. A further enhancement for 3.0 is the ability to specify a default command with #isDefault:, with this becoming the default menu item.
  10407.  
  10408. Note that a target may also explicitly set the #text: of a CommandQuery as part of the #queryCommand: interrogation. If this is done then the original menu or button text will be dynamically replaced by the newly specified text. Complete dynamic menus must be constructed by overriding <presenter>.onAboutToDisplayMenu:
  10409.  
  10410. Instance Variables:
  10411.     commandDescription        <CommandDescription> specifying the command being queried.
  10412.     receiver            <Object> indicating the target that will accept the command.
  10413.     source            <view> where the command originated.
  10414.     flags            <integer> containing various flags indicating the status of the command. '!
  10415. !CommandQuery class methodsFor!
  10416.  
  10417. commandDescription: item source: aView
  10418.     "Answers an instance of the receiver for the <commandDescription>, command,
  10419.     generated by aView"
  10420.  
  10421.     ^(super new initialize) 
  10422.         commandDescription: item source: aView!
  10423.  
  10424. initialize
  10425.     "Private - Initialize the receiver's class variables.
  10426.         CommandQuery initialize
  10427.     "
  10428.  
  10429.     EnabledMask := 1.
  10430.     CheckedMask := 2.
  10431.     DefaultMask := 4!
  10432.  
  10433. new
  10434.     "Answers an instance of the receiver on a nil message"
  10435.  
  10436.     ^self commandDescription: CommandDescription new source: nil! !
  10437.  
  10438. !CommandQuery methodsFor!
  10439.  
  10440. applicationShell
  10441.     "Answers the <topPresenter> that will be responsible for performing this command."
  10442.  
  10443.     ^self source topShell!
  10444.  
  10445. beChecked
  10446.     "Set the receiver into the checked state"
  10447.  
  10448.     self isChecked: true!
  10449.  
  10450. beDisabled
  10451.     "Set the receiver into the disabled state"
  10452.  
  10453.     self isEnabled: false!
  10454.  
  10455. beEnabled
  10456.     "Set the receiver into the enabled state"
  10457.  
  10458.     self isEnabled: true!
  10459.  
  10460. beUnchecked
  10461.     "Set the receiver into the not checked state"
  10462.  
  10463.     self isChecked: false!
  10464.  
  10465. canPerform
  10466.     "Answers true if the command described by the receiver can be performed.
  10467.     This requires a command receiver and that the command is enabled"
  10468.  
  10469.     ^self receiver notNil and: [self isEnabled]!
  10470.  
  10471. canPerformAgainst: destination
  10472.     "Answer whether the command being queried by the receiver can
  10473.     be performed against the hypothetical <commandTarget>, destination."
  10474.  
  10475.     ^self commandDescription canPerformAgainst: destination
  10476. !
  10477.  
  10478. checked: aBoolean
  10479.     "Although deprecated, not marked as such at present because removal during image stripping will
  10480.     break many existing applications."
  10481.  
  10482.     "#deprecated. ""Use isChecked:"
  10483.     self isChecked: aBoolean!
  10484.  
  10485. command
  10486.     "Answer the command selector being queried"
  10487.  
  10488.     ^self commandDescription command!
  10489.  
  10490. commandDescription
  10491.     "Answer the <commandDescription> being queried"
  10492.  
  10493.     ^commandDescription!
  10494.  
  10495. commandDescription: action source: aView
  10496.     "Private - Initialize the receiver's instance variables."
  10497.  
  10498.     commandDescription := action.
  10499.     source := aView.!
  10500.  
  10501. commandSymbol
  10502.     "Answer the command selector being queried"
  10503.  
  10504.     ^self commandDescription commandSymbol!
  10505.  
  10506. description
  10507.     "Answer the current description of the receiver"
  10508.  
  10509.     ^self commandDescription description
  10510. !
  10511.  
  10512. enabled: aBoolean
  10513.     "Although deprecated, not marked as such at present because removal during image stripping will
  10514.     break most existing applications."
  10515.  
  10516.     "#deprecated." "Use isEnabled:"
  10517.     self isEnabled: aBoolean!
  10518.  
  10519. image
  10520.     ^image!
  10521.  
  10522. image: anObject
  10523.     image := anObject!
  10524.  
  10525. initialize
  10526.     "Private - Initialize the receiver. Command queries start off pessimistically in disabled
  10527.     unchecked state."
  10528.  
  10529.     super initialize.
  10530.     flags := 0
  10531. !
  10532.  
  10533. isChecked
  10534.     "Answer true if the receiver is in the checked state"
  10535.  
  10536.     ^flags allMask: CheckedMask!
  10537.  
  10538. isChecked: aBoolean
  10539.     "Set the whether or not the command associated with the receiver is 'checked'
  10540.     (toggled on). This will cause associated menu items to be displayed with a 
  10541.     tick mark (or a blob if using radio button style)."
  10542.  
  10543.     flags := flags mask: CheckedMask set: aBoolean
  10544. !
  10545.  
  10546. isDefault
  10547.     "Answer whether the receiver is expecting to be the default item on its parent menu.
  10548.     Note: Obviously their can be only one default item per menu, so if more than one item
  10549.     claims default status only one will triumph. Under the current implementation this will
  10550.     be the last occurring default item, but this behaviour should not be relied upon."
  10551.  
  10552.     ^flags anyMask: DefaultMask!
  10553.  
  10554. isDefault: aBoolean
  10555.     "Set whether the receiver is expected to be the default command for the host menu."
  10556.  
  10557.     flags := flags mask: DefaultMask set: aBoolean!
  10558.  
  10559. isEnabled
  10560.     "Answer true if the receiver is in the enabled state"
  10561.  
  10562.     ^flags allMask: EnabledMask!
  10563.  
  10564. isEnabled: aBoolean
  10565.     "Set the enable state of the receiver to aBoolean"
  10566.  
  10567.     flags := flags mask: EnabledMask set: aBoolean!
  10568.  
  10569. perform
  10570.     "Perform the command on the receiver and answer the result."
  10571.  
  10572.     | command answer shell |
  10573.     command := Command 
  10574.         receiver: self receiver
  10575.         commandDescription: self commandDescription.
  10576.     shell := self applicationShell.
  10577.     answer := shell performCommand: command.
  10578.     "The command might close the window, in which case should we bother?"
  10579.     shell addCommandHistory: command.
  10580.     ^answer!
  10581.  
  10582. printOn: aStream
  10583.     "Append, to aStream, a String whose characters are a description of the receiver as a developer
  10584.     would want to see it."
  10585.  
  10586.     self basicPrintOn: aStream.
  10587.     aStream 
  10588.         nextPut: $(;
  10589.         print: self command.
  10590.     self isEnabled ifTrue: [aStream nextPutAll: ' enabled'].
  10591.     self isChecked ifTrue: [aStream nextPutAll: ' checked'].
  10592.     aStream 
  10593.         nextPutAll: ' receiver: ';
  10594.         print: self receiver;
  10595.         nextPut: $)!
  10596.  
  10597. receiver
  10598.     "Answers the receiver of the command"
  10599.  
  10600.     ^receiver!
  10601.  
  10602. receiver: anObject
  10603.     "Set the receiver of this command to anObject. Usually sent by queryCommand:
  10604.     during command routing"
  10605.  
  10606.     receiver := anObject!
  10607.  
  10608. source
  10609.     "Answers the source of the command"
  10610.  
  10611.     ^source!
  10612.  
  10613. source: aView
  10614.     "Private - Set the message source the receiver to aView"
  10615.  
  10616.     source := aView.!
  10617.  
  10618. text
  10619.     "Answer the text state of the receiver"
  10620.  
  10621.     ^text!
  10622.  
  10623. text: aString
  10624.     "Set the text state of the receiver to aString"
  10625.  
  10626.     text := aString! !
  10627.  
  10628. COMObjectRegistration comment:
  10629. '<COMObjectRegistration> is a simple class to aggregate the registration information for a COM object such as its CLSID and description. It is used in conjunction with the COM Category Manager interface, <ICatInformation>.
  10630.  
  10631. Instance Variables:
  10632.     clsid        <CLSID>. Coclass guid.
  10633.     name        <String>. Short description of the coclass from the registry.
  10634.     toolboxBmp    <Image>. Iconic representation for the coclass.
  10635.  
  10636. '!
  10637. !COMObjectRegistration class methodsFor!
  10638.  
  10639. ΓH41bΣÄëÇ¿G∩Vú⌡ß▀Θ╥═ò┐▓½VT ▓╬hgIX╤ü~]æP"kAn ≤ê\tfI¼n~¬«`Θ╬Gí▒╛¢≤ÅûgM@gdö■X├ú⌐g[ÉòV{½T÷~£⌡UI9┬H¼≈}╟mú.└ù╧≡! !
  10640.  
  10641. !COMObjectRegistration methodsFor!
  10642.  
  10643. ╝$8(Ñ¥3'╛─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM+`_≤┴Bvd,Jáh&Γ¿/≈╬C⌐╣│╥╖óvwûf[@mo╘»d6½█┼]Éåc»O│säA┤XAI/Θeï█OÖP4╛/├ù└Γî⌐`╚ Åïüs╝°VPº  tÉ»^┤╢K∩Do╧S█αmn çl╩G.╥:▓┘èRqíτ╢╝ìl┼₧    b║∩┐wG[&!!₧α5böW▐åº~,FO╙ä<╦[ Ƭæâ nΘ¬Ç▀¢0▒ú╩▄ 3KOC»y≡    4\εó`─P!
  10644.  
  10645. ΓH41U╬µp┤║¢/ù⌡▄Ωîó⌠≤µù╓√L╣√╘svu²⌐~QÿRT%`^]A┤∞t4 Oqáp@cª!
  10646.  
  10647. ΓH41bΣÄëÇ¿G∩VúτΩ╪╛├╫╨■«åpûƒ₧;|N╞î;┤pijmT^{°äM(d"╔9íº3≤┌Z⌡≈╢╜█ⁿ5:!
  10648.  
  10649. σA!! 4░╗=&╢½â2º6⌡┘ε▄ô╜╢δ£√▒^B»√╬~d!
  10650.  
  10651. σA4'1┤¢;&┤─µC╟∩╟°╔∞ù╦▌╗▓úFO│√╘bcM▄à3W╫PBjzSV+,┘¼^Zi+_¼rVd╢σbù┤/j┴ëñ¢√╔\Æ`kkrεÑ}7⌠ëæ
  10652. á%╢$VébàNñ8╠tp/═H▌│3!
  10653.  
  10654. σM4
  10655. 99╜á<s·¿┐>ù:α┘éªùò■┼«≈½W »╧;r{B└ü?_█Ej]OAb±┴    Qi5Jπ[k░¬#ε█PΦ╢Ñ¢╖╬\ ÆdL}e╘¿l&º╞╬GôVçpεQ│~òΩT]I9≥$₧₧LÅGf┴jU─¥╓·╚αdëï█çsO╜⌠R½tD9∩à^┤╢LΓM)îQ█÷me≡╘h╬Cw∩1δ£éw`í½∙≤ìl!
  10656.  
  10657. µA3/&=╢╗+9┐≤╠,è-∞╣àÑ╝τ═▄¿≤▒V≥√ßu`_S└─b@Æ^@+lWVXΣê^8fZ░yA*íº!!Θ═▒º▓▐■┴ày_go╘ⁿb4ε▌╚\üâ─*Ñmò⌡WF <ífå₧MöG4≡    2╟ù─≤▐■?╚ Éë₧0O╣∙^G¬ h┬εs╚▐S≥Do╩M╒│9iⁿçM±g\πÉ∩░pMâïòöëªßmY½ßªkf _Σc W=tB╚▐Å│e.F_╧ì;╦FoⁿÖ▄╜±!!╛τ┴ε╡üΓ┌Γ:ⁿr∙:2ê╪a╥hH∙
  10658. è┴╔╙ƒg╖≤Θ∩@µ"ú+σ6├µφ╙%o Tÿ8ƒ≥`ûÜZΩ DPWƒpe╫╗6∩,XÑ╚å>XSNX┘╙²▀pɵj▒≡[Æ°⌡.╖EQ@S ≈π!!    ê|Æíÿ▀ í⌠£▄óè┼Lï]▓─ d¿Çè▐&╣":X½■▌ñ¼V■ô*ôÜσQKΣ┬╝ ▒r_W╟öU░╤╔⌐öêx╛█A▒7)ì╜ó╞,├¬╨6äéYφáF$ úτ╚╟öbP╪3%╟è« Uó⌐ùCÜ└¥eQºås3á:│▌{L∩PΩ═┤µ¥]╧:«╘öà│╪ UÖi V╫τδ≤Sπò╦Ö[█B £V àíç&fxzÉcù╥U}!
  10659.  
  10660. ΘE4XR══'⌐╛ë8┼+Θ╤»É≈┘╦╨╣≈╖╖║╙s3^W▐æ;æPVjzSV+≤éPp#]φ<qsΓ»%ⁿ▀W ╝≈óì≥ÅÆ4Wkn╬╡y+ε┴┴J@°|·f╜J▒sò╝P[I7πnÜ▌M▄Af⌐(┌¥═╢╪⌐~ìA▀î¢u ª▒^WΓtvÆα!!▀╙S■&┬I█·,oφë:»(¬VÅ╧åHr≤¡⌠φΘΦⁿaO▒!
  10661.  
  10662. ∩E*XR══'⌐╛ë8┼+Θ╤»▀÷╪═┴■µ╝CF ╡┴vvY╘─*ZÆgCPdµÄ\h2ß9╚┬.√╙G@íñÖù√ÅúfK4 ß▓l?½ëÜåƒ5⌐FóHâεeV=╗$═₧⌐qQ₧#≥í≡┬⌡ÉV╖>╖┤íHMô┐:.╦^zÅΩ^┤▓5!
  10663.  
  10664. ±V.!!¬╒r=╗╗ï/æRï╜¡φε╟┌█║╛σGL »╚~3F╟É*SòSAzIVj¿═^Mg4Hªh*úδ3ε╠K»≈áû°▄^ö|_oc╬╣!!ε╚╥\öV■|║K│=â±T+ípù╤JÖcñ    ?█╥╘∙┘¼w╚Üêåpε≈EK» ~îδ:╨╪µl▄M╙τuδ╬v┼/⌐2┤╧ÉEs╢ε∞±áá± N╝π╖`TI Xπ`è1cHU▌zºxπúX~5@|╚ê!!ƒBà⌡▌╛º Ä╙Φ├ƒ&í╙▄òEsCIn╓ò }L≥╜h┘7 Æç╙ì╙[Æ╥₧ï(¥{>┐s⌡╨≤óƒ^!
  10665.  
  10666. ⌡K(77╝ª?(╜¼ß@∞}└┌ⁿ█√┼ƒ┴╢≈σºΩû;/j_╞ë?B╔M$z^]o
  10667. ≥┴VtfZ░yc¼δ4⌡╤Nº»▓ì╖╬^â|[@gc╒▓-4í█ÇM@ÉVÉ{║Q╣q²kòUJ;≤m¥█]▄@m∞4╓╥╤≤╧Ñz₧ì╒╤e├¢>P¡oyì≈╙▐XΓ&▀q╙│$g═╒m╟.√¡£ùK{┐¼≈µ┬╝∙aLΩ▓≥NCLKz_Σcè)ZJIëMÉQ┬Θkh;hI├┴,ç[à⌡┬è≤n≡α┴Äê;┤τÇI╬mKU ÉO╒+3ó░}Ü-HΘ
  10668. ÿ┴Éé╠Aƒû─⌡qα9┤l»^»Äæ╦IeM    Q°#₧÷=6├t┼ƒXifƒ aÖíuñ>*S─áαO3^╞IîòÖM░±Y9▓±]┼╒ñ╒l$KQ╘±(8¼"·æ▒╗ú╡²┤─ôΘVêUíöd⌐üí╟G╟ q≥╕ä▄╨:+╫í8¿çⁿV╝╨÷(äE0mP╟└≡F┘σ2調X₧»H¼4¢ï«╒$╨α¡Sⁿε#oΦ▓)e(╣±éï«YM╪?8∞╛┴
  10669. 5╧ÇⁿGîªîhV¬£#    ⁿ&┤┌]L¬')Æ¡╙ê┤ε=¼α£àß▀]█h èSªφ╙BV┌Ü╪¼%╖:Z░XI(╗½üiá"æ─P#OëÆ≤w╤·á8▄
  10670. ┴9m╢╔╓µ╫ev/⌡½σEy$τ$S#;à-Φq╛ñÆ9~▄╬¬ΓR¬⌠╪ nQ─wC∙s¬Z@tZ█e╗▐≡nX╒O]¿p>å¬dªñ¡¿╫UfA?j■e£Ö¡]≥ú.╓▐╢~╚½⌠4ûx7næë╘0ò⌡ªⁿæ½]6σ"$*ε╚hcú╤#╕±■╩@╧£oÇôwÄ┼úJ╫_h⌠)91ç"üÉnGDh⌐⌡τ║≤e╢Y=╟⌡x▌╒╫8╨∞#qA?èk█Z"ç▄¬9-ó,&'╡╦°π=Q╖áQdç╣τ\ÖU═τ
  10671. ·+╢7?oÖ╕;┤w╔Ñ├Φs¬ºRdq,┤·ª/ÑIß╔╖úèO╥╛┤`╖ûêVαq=┌à╝≈┐T╔ºgε╜≡vì&╜║█ºG ±@π%╣X"r┐(╩sí0q█b)9t⌡ÇP╧o)▌╤╟i╝Pó-Ñ°¡#│xo)dò≈°╓∙├.■uîx┌BH)²>_¿φ6█!!═bÆ?░¿▓3ß±4╢╞'»(_ñ-îƒΓ║3S¼_▓·φⁿ-╔,0ä3 x,$kz∙ß ╛Æqü=─¿b·ⁿ≥╤╒ æ :■÷╠:∞╘v'╨┤┤[»└4°ò~M⌠nXÆa╓! !
  10672.  
  10673. COMObjectStub comment:
  10674. 'COMObjectStub is a private class of objects which are used to wrap any object in the system so that they may be exposed as COM objects. COMObjectStub implements most <IUnknown>, functionality, providing reference count based lifetime management, and the basic mechanics for QueryInterface().
  10675.  
  10676. Note that each COM server objecty should have only one COMObjectStub so that the ref. count is correct, and so that queries for IUnknown always answer the same interface.
  10677.  
  10678. Instance Variables:
  10679.     cookie        <SmallInteger>. The receiver''s cookie identifying it in the Processor registry.
  10680.     object        <Object>. The actual COM server object implementing the COM interfaces.
  10681.     count        <integer>. COM reference count.
  10682.     interfaces        <Array>. Array of interfaces currently extant against this stub.
  10683.     outerUnknown    <IUnknown> or <UndefinedObject>. Controlling (outer) unknown.
  10684.  
  10685. Class Variables:
  10686.     IdentityRegistry    <IdentityDictionary>. Map of objects to their COMObjectStub wrapper.
  10687.  
  10688.  
  10689.  
  10690.  
  10691. '!
  10692. !COMObjectStub class methodsFor!
  10693.  
  10694. disconnectAll
  10695.     "Rudely disconnect all external clients of COM objects implemented in Dolphin.
  10696.     This should be seen as a forced shutdown measure."
  10697.  
  10698.     IdentityRegistry do: [:object | object disconnect]
  10699.         !
  10700.  
  10701. initialize
  10702.     "Private - Initialize the receiver's class variables.
  10703.         COMObjectStub initialize
  10704.     "
  10705.  
  10706.     | debugger |
  10707.     self initializeRegistries.
  10708.  
  10709.     debugger := self environment at: #Debugger ifAbsent: [^self].
  10710.  
  10711.     "Skip all COMFunction function callback methods"
  10712.     debugger
  10713.         skipSelector: #callback:vfn:withArgumentsAt: of: COMObjectStub type: 0;
  10714.         skipSelector: #comCallback:id:subId:withArgumentsAt:cookie: of: ProcessorScheduler type: 0;
  10715.         skipSelector: #callback:vfn:withArgumentsAt: of: COMInterface type: 0.
  10716.     COMFunction withAllSubclassesDo: [:c |
  10717.         (c includesSelector: #callback:interface:withArgumentsAt:) ifTrue: [
  10718.             debugger skipSelector: #callback:interface:withArgumentsAt: of: c type: 0]].!
  10719.  
  10720. initializeRegistries
  10721.     "Private - Initialize the receiver's registries."
  10722.  
  10723.     IdentityRegistry := IdentityDictionary new!
  10724.  
  10725. on: server
  10726.     "Answer an instance of the receiver which exposes the <Object>, server, as a COM Object."
  10727.  
  10728.     ^IdentityRegistry at: server
  10729.         ifAbsentPut: [self new onObject: server]!
  10730.  
  10731. onExit
  10732.     "Private - Inform any remaining external clients that we are dying. This is rude,
  10733.     but if the user forces this app. to shut down, we have no choice.
  10734.     Implementation Note: This should be done after all of our own interfaces have
  10735.     had a change to be freed."
  10736.  
  10737.     self disconnectAll!
  10738.  
  10739. onStartup
  10740.     "Private - Initialize the receiver's registries on startup, as any outstanding objects will
  10741.     now be invalid."
  10742.  
  10743.     self initializeRegistries!
  10744.  
  10745. registry
  10746.     "Private - Return the registry of all extant stubs."
  10747.  
  10748.     ^IdentityRegistry!
  10749.  
  10750. uninitialize
  10751.     "Private - Uninitialize the receiver immediately prior to its removal from the system."
  10752.  
  10753.     self initializeRegistries.
  10754.     Smalltalk at: #Debugger ifPresent: [:dbg |
  10755.         dbg 
  10756.             unskipSelectorsOf: self;
  10757.             unskipSelector: #comCallback:id:subId:withArgumentsAt:cookie: of: ProcessorScheduler]
  10758. ! !
  10759.  
  10760. !COMObjectStub methodsFor!
  10761.  
  10762. addInterface: aCOMInterface
  10763.     "Private - Add the argument, aCOMInterface, to the receiver's list of current COM 
  10764.     interfaces. Answer aCOMInterface.
  10765.     It will not go away until the receiver does (which should happen when the receiver's 
  10766.     COM ref. count drops to zero).
  10767.     Implementation Note: If this is the first interface added, then the receiver will
  10768.     be registered, have a cookie allocated, and have its ref. count bumped to 1. The receiver
  10769.     will be protected from GC until its ref. count drops back to zero as a result of
  10770.     #Release messages."
  10771.  
  10772.     | iCookie |
  10773.     iCookie := interfaces addAnsweringIndex: aCOMInterface.
  10774.     aCOMInterface
  10775.         objectCookie: self cookie;
  10776.         interfaceCookie: iCookie.
  10777.     ^aCOMInterface!
  10778.  
  10779. AddRef
  10780.     "Private - Implement IUnknown::AddRef() (see innerAddRef() for further details)."
  10781.  
  10782.     ^outerUnknown isNil
  10783.         ifTrue: [self innerAddRef]
  10784.         ifFalse: [outerUnknown AddRef]!
  10785.  
  10786. callback: interfaceCookie vfn: vfnIndex withArgumentsAt: pArgs
  10787.     "Private - Invoke the specified 'virtual' callback function."
  10788.  
  10789.     "Bypassing the interface object itself  as follows has very little performance 
  10790.     benefit (2 or 3% on an AddRef call), and reduces flexibility slightly since the 
  10791.     interface can no longer use its own dispatching mechanism.
  10792.  
  10793.     | intf |
  10794.     ^((intf := interfaces basicAt: interfaceCookie) 
  10795.         class functions basicAt: vfnIndex)
  10796.             callback: self interface: intf withArgumentsAt: pArgs
  10797.     "
  10798.  
  10799.     ^(interfaces basicAt: interfaceCookie)
  10800.         callback: self vfn: vfnIndex withArgumentsAt: pArgs
  10801.  
  10802. !
  10803.  
  10804. cookie
  10805.     "Private - Answer the receiver's id (unique among all registered COMObjectStubs)"
  10806.  
  10807.     cookie isNil ifTrue: [cookie := Processor registerCOMStub: self].
  10808.     ^cookie!
  10809.  
  10810. disconnect
  10811.     "Rudely disconnect any external clients of the receiver.
  10812.     WARNING: This should only be used for forcing a shutdown. If the user of the
  10813.     interface is in-process, then it will not know that the interface has been invalidated,
  10814.     and it may still call back through a COM interface."
  10815.  
  10816.     count > 0 ifTrue: [
  10817.         "This might indicate interface leaks in the client, so one might want them traced"
  10818.         "KernelLibrary default outputDebugString: 'Disconnecting ', self printString, String lineDelimiter."
  10819.         count := count + 1.
  10820.         OLELibrary default coDisconnectObject: interfaces first dwReserved: 0.
  10821.         self free]
  10822.  
  10823.     !
  10824.  
  10825. findInterface: interfaceClass ifNoneAdd: operation
  10826.     "Private - Answer a typed pointer to a COMInterface which supports the interface 
  10827.     class, interfaceClass (usually a subclass of IUnknown). If the receiver does 
  10828.     not currently have a suitable interface, then add that which results from 
  10829.     evaluating the niladic valuable, operation, and answer a typedd pointer to 
  10830.     that."
  10831.  
  10832.     | actualIf |
  10833.     actualIf := interfaces 
  10834.         detect: [:i | i supportsInterface: interfaceClass] 
  10835.         ifNone: [self addInterface: operation value].
  10836. "    self AddRef.    COMInterface>>fromAddress: sends AddRef to match the finalization Release."
  10837.     ^interfaceClass fromAddress: actualIf yourAddress.!
  10838.  
  10839. free
  10840.     "Private - Remove the receiver's permanent registration (permits receiver
  10841.     to be GC'd in the normal manner). It is not a good idea to send this to a 'live'
  10842.     COM object with outstanding references, since those clients will be rather 
  10843.     rudely disconnected."
  10844.  
  10845.     | preservedCookie |
  10846.     preservedCookie := cookie.
  10847.     count := 0.
  10848.     preservedCookie isNil ifFalse: [
  10849.         cookie := nil.
  10850.         "Notification signal: 'Unregistering ', self printString, ' at ', preservedCookie displayString."
  10851.         IdentityRegistry removeKey: object ifAbsent: [^self].
  10852.         Processor unregisterCOMStub: preservedCookie].
  10853.     !
  10854.  
  10855. innerAddRef
  10856.     "Private - Increments the reference count for the object which the receiver is wrapping.
  10857.     Answer the ref. count after the operation (though COM does not require that this value behave
  10858.     in a predictable fashion, so don't rely on it). While the reference count is greater
  10859.     than 1, the receiver will prevent the wrapped object from being GC'd.
  10860.     
  10861.         ULONG AddRef(void);"
  10862.  
  10863. "    Transcript show: self printString, ' increasing ref count to ', (count+1) displayString; cr."
  10864.     ^count := count + 1!
  10865.  
  10866. innerQueryInterface: pIID ppvObject: ppvOut
  10867.     "Private - Return an instance of the requested interface (through the out
  10868.     parameter, interface), if the receiver's implementor supports it. Note that this
  10869.     is the 'inner' query interface implementation (i.e. without aggregation), and directly
  10870.     implements a COM function, hence the nasty parameters and HRESULT codes, and
  10871.     is not intended for calling from within Smalltalk (send #queryInterface:[ifNone:] instead).
  10872.     The receiver's reference count is incremented (through #AddRef) 
  10873.     if the query successfully returns the requested interface. Answers S_OK if the 
  10874.     object supports the requested interface, or E_NOINTERFACE if not.
  10875.  
  10876.         HRESULT QueryInterface(
  10877.               REFIID iid,            (In)
  10878.             void** ppvObject        (Out)
  10879.         );
  10880.     
  10881.     There are certain rules of the COM game which are relevant:
  10882.  
  10883.     -    Querying for IUnknown against a particular object must always answer
  10884.         the same interface pointer value (COM may use this as an identity comparison).
  10885.     -    Querying for any other interface need not yield the same pointer each time.
  10886.         [In fact Dolphin cache's all interface pointers, and will answer the same pointer
  10887.         for each individual interface type].
  10888.     -    The set of interfaces which can be queried of an object must be static, not dynamic. 
  10889.         This means that if query succeeds once, then the same query should succeed again,
  10890.         and likewise if it fails the first time, it should fail on all subsequent attempts.
  10891.         This is a bit of a shame, as it somewhat limits the possibilities available in Smalltalk, but ...
  10892.     -    QueryInterface() must be symmetric - i.e. given a pointer to an interface on an object, 
  10893.         if I query it for the same interface, that call must succeed.
  10894.     -    QueryInterface() must be reflexive -  i.e. given a pointer to one interface if I can
  10895.         successfully query it for another, a query through the new interface for the original
  10896.         interface must succeed.
  10897.     -    QueryInterface() must be transitive - i.e. given a pointer to one interface through which I can 
  10898.         successfully query for a a second, and through that successfully query for a third, then a query for 
  10899.         the first interface through the the third must succeed."
  10900.  
  10901.     | interfaceClass interface |
  10902.     ppvOut value: 0.    "must set, even on error"
  10903.     "Notification signal: self printString, ': Querying interface ', (IID fromAddress: pIID yourAddress) displayString."
  10904.     interfaceClass := COMInterface classForIID: pIID ifNone: [^E_NOINTERFACE "IID not recognised"].
  10905.     interface := self queryInterface: interfaceClass ifNone: [^E_NOINTERFACE "interface not supported"].
  10906.     "Notification signal: 'Answering interface ', interface printString."
  10907.     ppvOut value: interface detach.
  10908.     ^S_OK!
  10909.  
  10910. innerRelease
  10911.     "Private - Implement IUnknown::Release() (sans aggregation).
  10912.     Decrement the receiver's reference count, and if it becomes zero, the receiver
  10913.     is free to be garbage collected/deleted. Answers the new ref. count value after 
  10914.     the operation.
  10915.  
  10916.         ULONG Release(void);
  10917.  
  10918.     Implementation Note: An invariant of the Registry is that it can
  10919.     only contain COMObjectStubs with a reference count >= 1."
  10920.  
  10921. "    Notification signal: self printString, ' decreasing ref count to ', (count-1) displayString."
  10922.  
  10923.     count == 0 ifFalse: [
  10924.         count := count - 1.
  10925.         count == 0
  10926.             ifTrue: [object finalRelease. self free]].
  10927.     ^count!
  10928.  
  10929. onObject: anObject
  10930.     "Private - Initialize the receiver.
  10931.     Implementation Note: COMObjectStubs have an initial ref. count of 0,
  10932.     and are not registered until their first interface is added (
  10933.     e.g. by a QueryInterface(IUnknown,...)."
  10934.  
  10935.     object := anObject.
  10936.     count := 0.
  10937.     interfaces := Array new!
  10938.  
  10939. outerUnknown: pUnkOuter
  10940.     "Private - Set the outer IUnknown of the receiver to the <IUnknown> argument, pUnkOuter."
  10941.  
  10942.     outerUnknown := pUnkOuter!
  10943.  
  10944. printOn: aStream
  10945.     "Append a debug description of the receiver to aStream."
  10946.  
  10947.     aStream
  10948.         basicPrint: self;
  10949.         nextPutAll: ' on ';
  10950.         print: object;
  10951.         nextPutAll: ' refs ';
  10952.         display: count!
  10953.  
  10954. queryInterface: interfaceClass
  10955.     "Answer an pointer to an instance of the interface class, interfaceClass (usually a 
  10956.     subclass of IUnknown), on the receiver, or nil if the receiver does not support that 
  10957.     interface class."
  10958.  
  10959.     ^self queryInterface: interfaceClass ifNone: []!
  10960.  
  10961. queryInterface: interfaceClass ifNone: exceptionHandler
  10962.     "Answer a pointer to an instance of the interface class, interfaceClass (usually a 
  10963.     subclass of IUnknown), on the receiver, or the result of evaluating the niladic
  10964.     valuable, exceptionHandle, if the receiver does not support that interface class.
  10965.     
  10966.     We implement this by first searching for existing interfaces on the receiver
  10967.     which support the requested interface. If one is found, we return a pointer to it 
  10968.     (incrementing the reference count of course). If there is no suitable existing 
  10969.     interface, then we first see if the interface is directly supported by the receiver, 
  10970.     creating a new interface if it is. Failing that we pass the request on to the implementor.
  10971.  
  10972.     Note: The 'interface' instance referred to is the Dolphin object which actually 
  10973.     implements the COM binary format (i.e. it is a C++ format object, with a reference 
  10974.     to the VM vtable as its first 4 bytes, and other information necessary to implement 
  10975.     COM in Dolphin via the generic virtual callback entry point). These objects are 
  10976.     instances of the appropriate subclass of COMInterface, and their first instance 
  10977.     variable contains a byte array which in turn contains the binary format of a Dolphin 
  10978.     COM interface object. Such interface objects have no effect on the ref. count of the 
  10979.     owning COMObject, and are not intended for external use. Normally interface objects are 
  10980.     referenced indirectly via an interface pointer (i.e. a subinstance of COMInterface 
  10981.     whose first instance variable is an instance of ExternalAddress containing the address 
  10982.     of the interface object), and are thus indistinguishable from externally implemented 
  10983.     interfaces. This arrangement is employed in order that the reference count of the 
  10984.     COMObject, and the lifetime of the COMObject and its interfaces, can be correctly 
  10985.     maintained purely with finalization, thus obviating the need for explicitly #free'ing 
  10986.     internal interfaces at the appropriate moment (which would be tricky, confusing, and 
  10987.     inconsistent)."
  10988.  
  10989.     ^self
  10990.         findInterface: interfaceClass 
  10991.         ifNoneAdd: [
  10992.             (self supportsInterface: interfaceClass)
  10993.                 ifTrue: [interfaceClass implementor: self]
  10994.                 ifFalse: [
  10995.                     "We have to ask the object itself via the normal public enquiry method (which will answer a Pointer).
  10996.                     This could turn out to be infinitely recursive if queryInterface:ifNone: is not implemented correctly!!"
  10997.                     ^(object class canUnderstand: #queryInterface:ifNone:)
  10998.                         ifTrue: [object queryInterface: interfaceClass ifNone: exceptionHandler ]
  10999.                         ifFalse: [exceptionHandler value]]]!
  11000.  
  11001. QueryInterface: pIID ppvObject: ppvOut
  11002.     "Private - Implement IUnknown::QueryInterface().
  11003.     This method is a mere shell to provide aggregation support.
  11004.     See internalQueryInterface:ppvObject: for more details."
  11005.  
  11006.     ^outerUnknown isNil
  11007.         ifTrue: [self innerQueryInterface: pIID ppvObject: ppvOut]
  11008.         ifFalse: [
  11009.             "Unfortunately we cannot pass the address through due to the implicit
  11010.             indirection of lppvoid parameter types - with the benefit of hindsight, perhaps
  11011.             this wasn't the best of ideas, but..."
  11012.             | pi |
  11013.             pi := ExternalAddress new.
  11014.             outerUnknown QueryInterface: pIID ppvObject: pi.
  11015.             ppvOut value: pi]!
  11016.  
  11017. referenceCount
  11018.     "Private - Answer the receiver's reference count."
  11019.  
  11020.     ^count!
  11021.  
  11022. Release
  11023.     "Private - Implement IUnknown::Release() (see #innerRelease for further details)."
  11024.  
  11025.     ^outerUnknown isNil
  11026.         ifTrue: [self innerRelease]
  11027.         ifFalse: [outerUnknown Release]!
  11028.  
  11029. supportsInterface: interface
  11030.     "Private - Answer whether the receiver supports the specified interface
  11031.     (normally a subclass of IUnknown). The default is to answer true only
  11032.     for IUnknown, since COMObject implements only that (this method 
  11033.     supports that implementation!!)."
  11034.  
  11035.     ^interface == IUnknown! !
  11036.  
  11037. ComparisonPolicy comment:
  11038. 'This class has now been deprecated, use SearchPolicy (which implements the <comparisonPolicy> protocol) instead.'!
  11039. !ComparisonPolicy class methodsFor!
  11040.  
  11041. always
  11042.     #deprecated.    "This whole class has been replaced by SearchPolicy, which implements the <comparisonPolicy> protocol"
  11043.     ^SearchPolicy always!
  11044.  
  11045. equality
  11046.     #deprecated.    "This whole class has been replaced by SearchPolicy, which implements the <comparisonPolicy> protocol"
  11047.     ^SearchPolicy equality!
  11048.  
  11049. identity
  11050.     #deprecated.    "This whole class has been replaced by SearchPolicy, which implements the <comparisonPolicy> protocol"
  11051.     ^SearchPolicy identity!
  11052.  
  11053. never
  11054.     #deprecated.    "This whole class has been replaced by SearchPolicy, which implements the <comparisonPolicy> protocol"
  11055.     ^SearchPolicy never!
  11056.  
  11057. new
  11058.     "ComparisonPolicy is a singleton class."
  11059.  
  11060.     ^self shouldNotImplement!
  11061.  
  11062. stbConvertFrom: anSTBClassFormat
  11063.     "Convert from earlier version models.
  11064.     1: ComparisionPolicy subsumed by SearchPolicy."
  11065.  
  11066.     ^
  11067.     [:data | 
  11068.     | compareBlock |
  11069.     compareBlock := data first.
  11070.     (compareBlock class == BlockClosure and: 
  11071.             [compareBlock method methodClass == self class 
  11072.                 and: [SearchPolicy respondsTo: compareBlock method selector]]) 
  11073.         ifTrue: [(SearchPolicy perform: compareBlock method selector) shallowCopy]
  11074.         ifFalse: 
  11075.             [PluggableSearchPolicy newCompareBlock: compareBlock hashBlock: (Message selector: #hash)]]!
  11076.  
  11077. stbVersion
  11078.     ^1! !
  11079.  
  11080. CompilationResult comment:
  11081. ''!
  11082. !CompilationResult methodsFor!
  11083.  
  11084. coloredSource
  11085.         "Answer the RTF string resulting from a compilation if such was requested."
  11086.     
  11087.         ^RichText fromRtf: rtf!
  11088.  
  11089. fireSystemUpdateEvent
  11090.     self method methodClass environment 
  11091.         trigger: (self isNew ifTrue: [#methodAdded:] ifFalse: [#methodUpdated:])
  11092.         with: self!
  11093.  
  11094. isNew
  11095.     ^oldMethod isNil!
  11096.  
  11097. method
  11098.     "Answer the method resulting from a compilation, or nil if the compilation failed
  11099.     or the compilation was for the purpose of syntax checking only."
  11100.  
  11101.     ^method!
  11102.  
  11103. method: aCompiledMethod
  11104.     "Private - Set the method."
  11105.  
  11106.     method := aCompiledMethod!
  11107.  
  11108. oldMethod
  11109.     ^oldMethod!
  11110.  
  11111. oldMethod: aCompiledMethod
  11112.     oldMethod := aCompiledMethod!
  11113.  
  11114. package
  11115.     ^package!
  11116.  
  11117. package: aPackage
  11118.     package := aPackage!
  11119.  
  11120. rtf
  11121.     "Answer the RTF string resulting from a compilation if such was requested."
  11122.  
  11123.     ^rtf!
  11124.  
  11125. tempsMap
  11126.     "Answer the map of ip ranges to temporaries if such was requested (if not, then nil).
  11127.     The map is an array of associations between IP positions and the temporaries which
  11128.     are in scope at that point up to the next entry in the map.
  11129.     Implementation Note: The compiler supplied temp map is an Array containing the temp
  11130.     map tuples, but it may contain duplicates for the same IP, and it is not necessarily sorted
  11131.     in IP order, so it must be first converted to a more useful form for the debugger (or whatever).
  11132.     This is done first via a dictionary to remove duplicates (the last     entry for the same 
  11133.     IP takes precedence), and then converted into a <SortedCollection> of associations 
  11134.     mapping an ip to a string of space separated names of the temporaries which are in
  11135.     scope from that IP up to the next temp map entry, or the end of the method."
  11136.  
  11137.     | sz |
  11138.     tempsMap isNil ifTrue: [
  11139.         sz := rawTempsMap size.
  11140.         tempsMap := Dictionary new: sz//2.
  11141.         1 to: sz by: 2 do: [ :i | tempsMap at: (rawTempsMap at: i) put: ((rawTempsMap at: i + 1) subStrings: $ )].
  11142.         tempsMap := tempsMap associations asSortedCollection].
  11143.     ^tempsMap!
  11144.  
  11145. textMap
  11146.     "Answer the map of ip's to source code ranges if such was requested (if not, then nil)."
  11147.  
  11148.     | sz |
  11149.     textMap isNil ifTrue: [
  11150.         sz := rawTextMap basicSize.
  11151.         "Convert to more useful form"
  11152.         textMap := OrderedCollection new: sz//3.
  11153.         1 to: sz by: 3 do: [ :i | 
  11154.             textMap add: (rawTextMap at: i) -> ((rawTextMap at: i + 1) to: (rawTextMap at: i + 2))]].
  11155.     ^textMap! !
  11156.  
  11157. CompiledCode comment:
  11158. 'CompiledCode is the class of executable objects containing an array of instructions (bytecodes) and an array of literals (the literal frame).
  11159.  
  11160. The method header of the receiver is a SmallInteger containing a set of flags containing information such as the number of arguments, the number of temporaries, etc, is layed out as follows (subject to change):
  11161.  
  11162.     Bits:    Use:
  11163.     0    SmallInteger flag (not visible in Smalltalk)
  11164.     1..4    not used
  11165.     5    Private flag
  11166.     6    Debug flag
  11167.     7    Full Block flag
  11168.     8..15    Temp count    (i.e. maximum of 256 temps)
  11169.     16..23    Arg count        (i.e. maximum of 256 args)
  11170.     24..31    Primitive index
  11171.  
  11172. Primitive indices 0 thru 8 describe the method type as follows:
  11173.     0    Normal method requiring activation
  11174.     1    Return self
  11175.     2    Return true
  11176.     3    Return false
  11177.     4    Return nil
  11178.     5    Return literal constant zero
  11179.     6    Return an instance variable (see the bytecodes to determine which)
  11180.     7    Set an instance variable
  11181.     8    Reserved for future use.
  11182.  
  11183. Note: These are implementation details, and should not be relied upon as they may be changed in future versions.'!
  11184. !CompiledCode class methodsFor!
  11185.  
  11186. elementsExpired: anInteger of: infoCacheKeys
  11187.     "Private - Some instances of the receiver with entries in the debug info cache were
  11188.     GC'd, so clean out any corresponding debug info from the cache."
  11189.  
  11190.     InfoCacheKeys nilCorpsesAndDo: [:i | InfoCacheValues at: i put: nil]!
  11191.  
  11192. initialize
  11193.     "Private - Initialize the class variables of the receiver.
  11194.  
  11195.         CompiledCode initialize
  11196.     "
  11197.  
  11198.     HasBlockMask := 16r40.
  11199.     DebugMask := 16r20.
  11200.     PrivateMask := 16r10.
  11201.     self initializeInfoCache!
  11202.  
  11203. initializeInfoCache
  11204.     "Private - Initialize the cache of method information used for debugging.
  11205.         CompiledCode initializeInfoCache
  11206.     "
  11207.  
  11208.     self initializeInfoCache: 100!
  11209.  
  11210. initializeInfoCache: capacity
  11211.     "Private - Initialize the cache of method information used for debugging to the
  11212.     specified capacity."
  11213.  
  11214.     | primeSize |
  11215.     primeSize := Set sizeFor: capacity.
  11216.     InfoCacheKeys := MourningWeakArray new: primeSize.
  11217.     InfoCacheKeys pathologist: self.
  11218.     InfoCacheValues := Array new: primeSize!
  11219.  
  11220. onPreStripImage
  11221.     "Private - Clear away the cache of method information used for debugging."
  11222.  
  11223.     self initializeInfoCache: 0!
  11224.  
  11225. publishedAspectsOfInstances
  11226.     "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  11227.  
  11228.     ^(super publishedAspectsOfInstances)
  11229.         add: (Aspect name: #methodClass) beReadOnly;
  11230.         add: (Aspect name: #header) beReadOnly;
  11231.         add: (Aspect integer: #argumentCount) beReadOnly;
  11232.         add: (Aspect multilineString: #getSource) beReadOnly;
  11233.         add: (Aspect name: #byteCodes) beReadOnly;
  11234.         add: (Aspect multilineString: #disassembly) beReadOnly;
  11235.         add: (Aspect name: #literals);
  11236.         yourself! !
  11237.  
  11238. !CompiledCode methodsFor!
  11239.  
  11240. = aMethod
  11241.     "Answer whether the argument, aMethod, is considered exactly equivalent to 
  11242.     the receiver.
  11243.     Two CompiledMethods are considered equal iff they are of the same class
  11244.     (we can't compare non-CompiledMethods), they have the same selector, and
  11245.     the same byte codes and literal frame."
  11246.  
  11247.     self == aMethod ifTrue: [^true].
  11248.     ^self class == aMethod class
  11249.         and: [self methodClass == aMethod methodClass
  11250.             and: [self selector = aMethod selector
  11251.                 and: [self byteCodes = aMethod byteCodes
  11252.                     and: [self literals = aMethod literals]]]]!
  11253.  
  11254. accessesInstVar: instVarName
  11255.     "Answer whether the receiver accesses the named instance variable in its method class."
  11256.  
  11257.     ^self accessesInstVar: instVarName at: (self methodClass indexOfInstVar: instVarName)!
  11258.  
  11259. accessesInstVar: aString at: anInteger
  11260.     "Answer whether the receiver accesses the instance variable named, aString, which
  11261.     is the instance variable of its method class with the specified <integer> index."
  11262.  
  11263.     ^self interpreter accessesInstVarAt: anInteger!
  11264.  
  11265. accessesInstVarAt: anInteger
  11266.     #deprecated. "Use #accessesInstVar:at:"
  11267.     ^self interpreter accessesInstVarAt: anInteger!
  11268.  
  11269. allLiteralsDo: operation 
  11270.     "Answer an array of the literals in the receiver."
  11271.  
  11272.     "Implementation Note: As Dolphin does not have separate methods for blocks (to save space), this is the
  11273.     same as #literalsDo:, but we inline it for speed"
  11274.  
  11275.     1 to: self literalCount do: [:i | operation value: (self at: i)]!
  11276.  
  11277. allSymbolLiterals
  11278.     "Answer a  <collection> of all the symbols referred to from the literal
  11279.     frame of this method, either directly or embedded in arrays. Special
  11280.     selectors (i.e. those encoded in the bytecodes) are also included."
  11281.  
  11282.     | messages |
  11283.     messages := IdentitySet new: 6.
  11284.     self allSymbolLiteralsDo: [:symbol | messages add: symbol].
  11285.     ^messages addAll: self specialMessages; yourself!
  11286.  
  11287. allSymbolLiteralsDo: operation
  11288.     "Private - Evaluate the <monadicValuable>, operation, for each of the literal symbols 
  11289.     in the receiver's literal frame, including those embedded in arrays."
  11290.  
  11291.     1 to: self literalCount do: [:i | | literal |
  11292.         (literal := self at: i) class == Symbol
  11293.             ifTrue: [operation value: literal]
  11294.             ifFalse: [    "Also drill down into literal arrays"
  11295.                 literal class == Array     ifTrue: [
  11296.                     self literalArray: literal do: [:e |
  11297.                         e class == Symbol ifTrue: [operation value: e]]]]]!
  11298.  
  11299. alternateInspectorClass
  11300.         ^CompiledMethodInspector!
  11301.  
  11302. argumentCount
  11303.     "Answer the number of arguments expected by the receiver.
  11304.     This method is part of the ANSI <valuable> protocol, but CompiledCode
  11305.     does not conform to the whole protocol."
  11306.  
  11307.     ^(header bitShift: -15) bitAnd: 255!
  11308.  
  11309. asDebugMethod
  11310.         "Private - Answer a debug version of the receiver with breakpoints after each 
  11311.         expression/statement."
  11312.     
  11313.         ^self subclassResponsibility!
  11314.  
  11315. basicDisassembly
  11316.         "Answer a disassembly listing for the receiver."
  11317.     
  11318.         ^self disassemblerClass disassemble: self!
  11319.  
  11320. byteCodes
  11321.     "Private - Answer the byte codes (a ByteArray) for the receiver"
  11322.  
  11323.     | answer size packedBytes byte |
  11324.     ^self isPacked
  11325.         ifTrue: [
  11326.             packedBytes := (byteCodes bitShift: 1) bitOr: 1.
  11327. "            (packedBytes at: 1) == 109 ifTrue: [ packedBytes := packedBytes bitShift: -8 ]."
  11328.             size := packedBytes digitSize.
  11329.             answer := ByteArray new: size.
  11330.             [size > 0] whileTrue: [
  11331.                 (byte := packedBytes at: size) == 0 ifFalse: [answer at: size put: byte].
  11332.                 size := size - 1].
  11333.             answer]
  11334.         ifFalse: [byteCodes]!
  11335.  
  11336. clear
  11337.     "Private - Clear down temporary information cached in the receiver.
  11338.     The default is to do nothing."!
  11339.  
  11340. compilerClass
  11341.     "Private - Answer the class of compiler to be used for compiling instances of the receiver."
  11342.  
  11343.     ^methodClass compilerClass!
  11344.  
  11345. containsSource: aString
  11346.     "Answer whether the receiver contains the specified source string."
  11347.  
  11348.     | src |
  11349.     src := self getSource.
  11350.     ^src notNil and: [(src indexOfSubCollection: aString)~~0]!
  11351.  
  11352. debugInfo
  11353.     "Private - Answer a compilation result containing a recompilation of the receiver, RTF, a
  11354.     map between IP ranges and expressions in the source, and a map between IP ranges
  11355.     and an OrderedCollection of Associations between IP positions and temporaries 
  11356.     up to that position in the receiver, ordered by IP."
  11357.  
  11358.     | i method info |
  11359.     i := self identityHash \\ InfoCacheKeys size + 1.
  11360.     method := InfoCacheKeys at: i.
  11361.     (method isNil or: [method == DeadObject current or: [method ~~ self]])
  11362.         ifTrue: [
  11363.             info := self getDebugInfo.
  11364.             method := info method.
  11365.             method isNil ifFalse: [
  11366.                 method 
  11367.                     selector: self selector;
  11368.                     sourceDescriptor: self sourceDescriptor].
  11369.             InfoCacheKeys at: i put: self.
  11370.             InfoCacheValues at: i put: info].
  11371.     ^InfoCacheValues at: i!
  11372.  
  11373. decodeHeaderOn: aStream
  11374.     "Private - Answer a String describing the method header."
  11375.  
  11376.     aStream 
  11377.         nextPutAll: (#('Normal' 'Return self' 'Return true' 'Return false' 'Return nil' 'Return literal constant 0' 'Return instance variable' 'Set instance variable') 
  11378.                 at: self extraIndex + 1
  11379.                 ifAbsent: ['Primitive: ']).
  11380.     self isPrimitive ifTrue: [aStream print: self primitiveIndex].
  11381.     aStream
  11382.         nextPutAll: ', args ';
  11383.         print: self argumentCount;
  11384.         nextPutAll: ', locals ';
  11385.         print: self localCount;
  11386.         nextPutAll: ', literals ';
  11387.         print: self literalCount.
  11388.     self hasBlock ifTrue: [aStream nextPutAll: ', has block'].
  11389.     self isDebugMethod ifTrue: [aStream nextPutAll: ', debug']!
  11390.  
  11391. disassemblerClass
  11392.         "Private - Answer the symbol of the class to be used for disassembling
  11393.         instances of the receiver."
  11394.     
  11395.         ^Disassembler!
  11396.  
  11397. disassembly
  11398.         "Private - Answer a <readableString> disassembly listing for the receiver."
  11399.     
  11400.         | stream |
  11401.         stream := String writeStream.
  11402.         self decodeHeaderOn: stream.
  11403.         stream
  11404.             cr;
  11405.             cr;
  11406.             nextPutAll: self basicDisassembly.
  11407.         ^stream contents!
  11408.  
  11409. evaluationPools
  11410.     "Answer the evaluation pools used when compiling the receiver."
  11411.  
  11412.     ^#()!
  11413.  
  11414. extraIndex
  11415.     "Private - Answer the 'extra' index of the receiver. This is the primitive index
  11416.     See class comment for further details."
  11417.  
  11418.     ^(header bitShift: -23) bitAnd: 255!
  11419.  
  11420. getColoredSource
  11421.         "Answer the RTF format source string for the receiver"
  11422.     
  11423.         ^self getColoredSource: self getSource.
  11424.     
  11425.         #todo "Use the debug info cache"!
  11426.  
  11427. getColoredSource: aString
  11428.         "Private - Answer an RTF format source string from the source, aString,
  11429.         for the receiver."
  11430.     
  11431.         ^self subclassResponsibility!
  11432.  
  11433. getDebugInfo
  11434.     "Private - Invoke the compiler to answer a compilation result containing a 
  11435.     recompilation of the receiver, RTF, a map between IP ranges and expressions 
  11436.     in the source, and a map between IP ranges and an <OrderedCollection> of 
  11437.     <Association>s between IP positions and temporaries up to that position in 
  11438.     the receiver, ordered by IP."
  11439.  
  11440.     ^self subclassResponsibility!
  11441.  
  11442. getSource
  11443.     "Answer the source of the receiver.
  11444.     This task is delegated to the SourceManager."
  11445.  
  11446.     ^self subclassResponsibility!
  11447.  
  11448. hasBlock
  11449.     "Private - Answer whether the receiver contains a full Block (i.e. non-optimised, dirty)
  11450.     and therefore requires a full home MethodContext"
  11451.  
  11452.     ^header anyMask: HasBlockMask!
  11453.  
  11454. hash
  11455.     "Answer the <SmallInteger> hash value for the receiver. We use only the selector at the moment."
  11456.  
  11457.     ^(selector hash bitShift: 4) bitXor: methodClass hash!
  11458.  
  11459. header
  11460.     ^header!
  11461.  
  11462. header: anObject
  11463.     header := anObject!
  11464.  
  11465. indexOfIP: ip
  11466.         ^self interpreterClass indexOfIP: ip in: self!
  11467.  
  11468. interpreter
  11469.     "Private - Answer a byte code interpreter on the receiver."
  11470.  
  11471.     ^self interpreterClass on: self!
  11472.  
  11473. interpreterClass
  11474.     "Private - Answer the class to be used for interpreting the receiver's bytecodes."
  11475.  
  11476.     ^ByteCodeInterpreter!
  11477.  
  11478. isCompilationFailure
  11479.     ^false!
  11480.  
  11481. isDebugMethod
  11482.     "Private - Answer whether the receiver is a debug method."
  11483.  
  11484.     ^header anyMask: DebugMask!
  11485.  
  11486. isExpression
  11487.     "Private - Answer whether the receiver is a standalone (unbound) expression as opposed to 
  11488.     a method."
  11489.  
  11490.     ^self subclassResponsibility!
  11491.  
  11492. isPacked
  11493.     "Private - Answer whether the receiver's byte codes are packed into SmallIntegers
  11494.     rather than being stored in a separate Byte Array"
  11495.     
  11496.     ^byteCodes class == SmallInteger!
  11497.  
  11498. isPrimitive
  11499.     ^self primitiveIndex ~= 0!
  11500.  
  11501. isPrivate
  11502.     "Private - Answer whether the receiver is a debug method."
  11503.  
  11504.     ^header anyMask: PrivateMask!
  11505.  
  11506. isPrivate: bool
  11507.     "Private - Set whether the receiver is a private method."
  11508.  
  11509.     header := (header mask: PrivateMask set: bool)!
  11510.  
  11511. isPublic
  11512.     "Private - Answer whether the receiver is a public method."
  11513.  
  11514.     ^self isPrivate not!
  11515.  
  11516. isUnbound
  11517.     "Answer whether the receiver is unbound (i.e. not linked into a class' method dictionary).
  11518.     Only CompiledMethod subinstances can be bound."
  11519.  
  11520.     ^true!
  11521.  
  11522. literalArray: literalArray do: operation
  11523.     "Private - Evaluate the <monadicValuable>, operation, for each of the elements of
  11524.     the <Array>, literalArray, recursively drilling down into any embedded arrays too.
  11525.     Note that it is a pre-order traversal."
  11526.  
  11527.     literalArray do: [:literal |
  11528.         operation value: literal.
  11529.         literal class == Array ifTrue: [
  11530.             self literalArray: literal do: operation]]!
  11531.  
  11532. literalAt: anInteger
  11533.     "Private - Answer the literal at index, anIndex"
  11534.  
  11535.     ^self at: anInteger!
  11536.  
  11537. literalAt: anInteger put: aValue
  11538.     "Private - Replace the literal of the receiver at index, anInteger, with aValue."
  11539.  
  11540.     self at: anInteger put: aValue!
  11541.  
  11542. literalCount
  11543.     "Private - Answer the number of literals contained in the literal frame of the receiver (0..255)"
  11544.  
  11545.     ^self size!
  11546.  
  11547. literals
  11548.     "Private - Answer an array of the literals in the receiver."
  11549.  
  11550.     | count |
  11551.     count := self literalCount.
  11552.     ^(Array new: count)
  11553.         replaceFrom: 1 to: count with: self startingAt: 1!
  11554.  
  11555. literalsDetect: discriminator ifNone: exceptionHandler
  11556.     "Evaluate the <monadicValuable> argument, discriminator, for each of the 
  11557.     objects in the receiver's literal frame. If the literal is an <Array>, then 
  11558.     the discriminator is also evaluated for each of its elements. The first matching
  11559.     element, at the top level or embedded in an array, is answered. If no matching
  11560.     element is found, then the result of evaluating the <niladicValuable>, exceptionHandler,
  11561.     is answered."
  11562.  
  11563.     self literalsDo: [:literal | 
  11564.         (discriminator value: literal) ifTrue: [^literal].
  11565.         literal class == Array ifTrue: [literal do: [:e | (discriminator value: e) ifTrue: [^e]]]].
  11566.     ^exceptionHandler value!
  11567.  
  11568. literalsDo: operation
  11569.     "Private - Evaluate the monadic valuable, operation, for each of the receivers
  11570.     literals. Implementation Note: Compiled methods are standard pointer objects
  11571.     in Dolphin, with the literal frame stored in the indexable part, therefore
  11572.     #at: and #literalAt: are synonms."
  11573.  
  11574.     1 to: self literalCount do: [:i | operation value: (self at: i)]!
  11575.  
  11576. localCount
  11577.     "Private - Answer the number of local variables of the receiver."
  11578.  
  11579.     ^self tempCount - self argumentCount!
  11580.  
  11581. messages
  11582.     "Answer the set of messages sent by the receiver."
  11583.  
  11584.     | answer |
  11585.     answer := IdentitySet new.
  11586.     self messagesDo: [:sel | answer add: sel].
  11587.     ^answer        !
  11588.  
  11589. messagesDo: aBlock 
  11590.     "Evaluate the <monadicValuable> argument, aBlock, for each of the messages sent by the receiver."
  11591.  
  11592.     self interpreter messagesDo: aBlock!
  11593.  
  11594. methodClass
  11595.     "Answer the Class to which this method belongs (as opposed to the class of CompiledMethods)"
  11596.  
  11597.     ^methodClass
  11598. !
  11599.  
  11600. methodClass: aClass
  11601.     "Private - Set the class to which the method belongs (i.e. that class for which it 
  11602.     implements part of the protocol) to aClass"
  11603.  
  11604.     (aClass isKindOf: Behavior) ifFalse: [ ^self error: 'Must be class' ].
  11605.     methodClass := aClass!
  11606.  
  11607. needsContext
  11608.     ^self hasBlock!
  11609.  
  11610. primitiveIndex
  11611.     "Private - Answer the primitive index of the method, or zero if none"
  11612.  
  11613.     | idx |
  11614.     ^(idx := self extraIndex) > 8
  11615.         ifTrue: [idx]
  11616.         ifFalse: [0]!
  11617.  
  11618. readsInstVar: instVarName
  11619.     "Answer whether the receiver reads the named instance variable in its method class."
  11620.  
  11621.     ^self readsInstVar: instVarName
  11622.         at: (self methodClass indexOfInstVar: instVarName)!
  11623.  
  11624. readsInstVar: aString at: anInteger
  11625.     "Answer whether the receiver accesses the instance variable named, aString, which
  11626.     is the instance variable of its method class with the specified <integer> index."
  11627.  
  11628.     ^self interpreter readsInstVarAt: anInteger!
  11629.  
  11630. refersToLiteral: anObject 
  11631.     "Private - Answer whether the receiver refers directly from its literal frame (or indirectly as an 
  11632.     element of an array in the literal frame) to the argument, anObject. Named for compatibility 
  11633.     with VisualWorks."
  11634.  
  11635.     "Implementation Note: This deliberately does not take account of special selectors and is open
  11636.     coded for speed."
  11637.  
  11638.     1 to: self literalCount
  11639.         do: [:i | ((self at: i) refersToLiteral: anObject) ifTrue: [^true]].
  11640.     ^false!
  11641.  
  11642. selector
  11643.     "Answer the message selector under which the receiver is entered in its class' method dictionary"
  11644.  
  11645.     ^selector
  11646. !
  11647.  
  11648. selector: aSymbol
  11649.     "Private - Set the message selector under which the receiver is entered in its class' method dictionary"
  11650.  
  11651.     selector := aSymbol asSymbol!
  11652.  
  11653. sendsSelector: aSymbol 
  11654.     "Answer whether the receiver sends the specified selector. This is done by enumerating
  11655.     the byte codes, so simple references to the same symbol will not be counted."
  11656.  
  11657.     self messagesDo: [:sel | sel == aSymbol ifTrue: [^true]].
  11658.     ^false!
  11659.  
  11660. sendsSpecialSelector: anInteger
  11661.     "Answer whether the method which the receiver is interpreting sends the special
  11662.     selector with the specified index (one based)."
  11663.  
  11664.     ^self interpreter sendsSpecialSelector: anInteger!
  11665.  
  11666. sourceDescriptor
  11667.     "Private - Answer the receiver's sourceDescriptor (an object, usually an Integer
  11668.     which describes the location of the receiver's source, but may be a String).
  11669.     The source descriptor is managed by the receiver's source manager, and is
  11670.     opaque to the receiver."
  11671.  
  11672.     ^sourceDescriptor!
  11673.  
  11674. sourceDescriptor: anObject
  11675.     "Private - Set the receiver's source descriptor to anObject. This should 
  11676.     normally only    be sent by the receiver's source manager."
  11677.  
  11678.     sourceDescriptor := anObject!
  11679.  
  11680. specialMessages
  11681.     "Private - Answer a Collection of all the special message selectors which
  11682.     the receiver sends."
  11683.  
  11684.     ^self interpreter specialMessages!
  11685.  
  11686. superMessages
  11687.     "Answer a <Set> of all the message selectors super-sent by this method."
  11688.  
  11689.     | answer |
  11690.     answer := IdentitySet new.
  11691.     self interpreter instructionsDo: [:op :operands |
  11692.         answer add: (op == #supersend:
  11693.             ifTrue: [self literalAt: (operands first bitAnd: 31)+1]
  11694.         ifFalse: [op == #longSupersend:with:
  11695.                 ifTrue: [self literalAt: operands last + 1]
  11696.         ifFalse: [op == #exLongSupersend:with:with:
  11697.                 ifTrue: [self literalAt: (operands at: 2) + (operands at: 3) + 1]]])].
  11698.     ^answer
  11699. !
  11700.  
  11701. tempCount
  11702.     "Private - Answer the number of temporaries (local variables and arguments) of the receiver."
  11703.  
  11704.     ^(header bitShift: -7) bitAnd: 255!
  11705.  
  11706. tempsMap
  11707.     "Private - Answer a map between IP's and source ranges in the receiver."
  11708.  
  11709.     ^self debugInfo tempsMap!
  11710.  
  11711. textMap
  11712.     "Private - Answer a map between IP's and source ranges in the receiver."
  11713.  
  11714.     ^self debugInfo textMap!
  11715.  
  11716. value: anObject withArguments: anArray 
  11717.     "Evaluate the receiver with the argument, anObject, as its receiver, and with the argument,
  11718.     anArray, as the arguments to the message.
  11719.  
  11720.     Primitive failure reasons:
  11721.         0 -    anArray is not an Array
  11722.         1 -    anArray contains the wrong number of arguments
  11723.         2 -    anObject is not a subinstance of the method class of the receiver."
  11724.  
  11725.     <primitive: 116>
  11726.     ^self primitiveFailed!
  11727.  
  11728. writesInstVar: instVarName
  11729.     "Answer whether the receiver assigns to the named instance variable in its method class."
  11730.  
  11731.     ^self writesInstVar: instVarName
  11732.         at: (self methodClass indexOfInstVar: instVarName)!
  11733.  
  11734. writesInstVar: aString at: anInteger
  11735.     "Answer whether the receiver accesses the instance variable named, aString, which
  11736.     is the instance variable of its method class with the specified <integer> index."
  11737.  
  11738.     ^self interpreter writesInstVarAt: anInteger! !
  11739.  
  11740. Compiler comment:
  11741. 'The Compiler class is responsible for compiling new methods and evaluating expressions.'!
  11742. !Compiler class methodsFor!
  11743.  
  11744. compile: code in: aClass
  11745.     "Compile the String conversion of the argument code as a method of aClass.
  11746.     Answer the new method (which is not added to the method dictionary of
  11747.     aClass) if there are no syntax errors, otherwise signal a CompilerNotification."
  11748.  
  11749.     ^(self compile: code asString in: aClass flags: 0) method.
  11750. !
  11751.  
  11752. compile: aString in: aClass flags: anInteger
  11753.     "Private - Compiler the method source, aString, in the context of the class, aClass,
  11754.     parameterized by the flags, anInteger, notifying, notifier, of any errors or warnings 
  11755.     which are detected. The flags can be combinations of the following:
  11756.  
  11757.     0    Default compilation to code. Method is first element of array
  11758.         if successful. If some syntax error occurs, then it will be nil.
  11759.     1    Reserved.
  11760.     2    Syntax Check. Does not generate a method. Can be used in conjunction
  11761.         with the RTF flag to increase the speed of syntax colouring.
  11762.     4    Generate RTF as the second element of the Array.
  11763.     8    Turn off optimization
  11764.     16    Generate a textmap from ip to a text range as the third element of
  11765.         the array. The text map is an Array of Integers.
  11766.         Every three elements define one map. The first element in a map is the
  11767.         ip of the bytecode (1 based), and the two following elements define
  11768.         the start and stop of the text range (1 based) associated with the
  11769.         action of the bytecode.    
  11770.     32    Generate a temporaries map as the fourth element of the array
  11771.         The temporaries map is itself an Array. Every two elements of the 
  11772.         array refer to one mapping. A mapping has two elements, an ip and a
  11773.         String of temporaries that are valid at the ip. A mapping occurs for
  11774.         every time the temporaries list changes in the method. So the start of
  11775.         a Block with at least one argument will have an entry, the ending of
  11776.         it will also have an entry. Temporaries generated by the optimizer that
  11777.         may be ignore have an underscore as their first character. Optimizer
  11778.         temporaries are ignore when deciding that the temporaries list has
  11779.         changed. Mappings are not necessarily ordered by their ip. Two mappings
  11780.         may have the same ip in this case of an optimized empty block.
  11781.     64    Generate a debug version of the method which includes break points after
  11782.         every expression. Any text/temporaries map generated at the same time will
  11783.         account for the extra byte codes in the IP offsets.
  11784.     512    Interactive compile (compiler can prompt to define globals etc)
  11785.     "
  11786.  
  11787.     ^CompilerLibrary default
  11788.         compile: self source: aString in: aClass flags: anInteger notifying: self!
  11789.  
  11790. compileDebugExpression: aString in: aClass evaluationPools: pools
  11791.     "Compile the source text, aString, as if it were method of aClass inserting additional
  11792.     breakpoint bytecodes, etc, to make a debuggable method."
  11793.  
  11794.     ^(self 
  11795.         compileForEvaluation: aString 
  11796.         in: aClass 
  11797.         evaluationPools: pools
  11798.         logged: false
  11799.         flags: DebugMethod) method!
  11800.  
  11801. compileDebugMethod: aString in: aClass
  11802.     "Compile the source text, aString, as if it were method of aClass inserting additional
  11803.     breakpoint bytecodes, etc, to make a debuggable method."
  11804.  
  11805.     ^(self compile: aString in: aClass flags: DebugMethod) method!
  11806.  
  11807. compileExpression: aString in: aClass
  11808.     ^self 
  11809.         compileForEvaluation: aString
  11810.         in: aClass
  11811.         evaluationPools: #()
  11812.         logged: false
  11813.         flags: 0!
  11814.  
  11815. compileForEvaluation: aString in: aBehavior evaluationPools: pools logged: aBoolean flags: anInteger
  11816.     "Private - Compile the expression source, aString, in the context of the class, aBehavior,
  11817.     parameterized by the flags, anInteger, notifying, notifier, of any errors or warnings 
  11818.     which are detected. Additional shared variables are looked up in the array of PoolDictionaries,
  11819.     pools. Answers an appropriately instantiated CompilationResult.
  11820.  
  11821.     The flags can be combinations of the following:
  11822.  
  11823.     0    Default compilation to code. Method is first element of array
  11824.         if successful. If some syntax error occurs, then it will be nil.
  11825.     1    Reserved.
  11826.     2    Syntax Check. Does not generate a method. Can be used in conjunction
  11827.         with the RTF flag to increase the speed of syntax colouring.
  11828.     4    Generate RTF as the second element of the Array.
  11829.     8    Turn off optimization
  11830.     16    Generate a textmap from ip to a text range as the third element of
  11831.         the array. The text map is an Array of Integers.
  11832.         Every three elements define one map. The first element in a map is the
  11833.         ip of the bytecode (1 based), and the two following elements define
  11834.         the start and stop of the text range (1 based) associated with the
  11835.         action of the bytecode.    
  11836.     32    Generate a temporaries map as the fourth element of the array
  11837.         The temporaries map is itself an Array. Every two elements of the 
  11838.         array refer to one mapping. A mapping has two elements, an ip and a
  11839.         String of temporaries that are valid at the ip. A mapping occurs for
  11840.         every time the temporaries list changes in the method. So the start of
  11841.         a Block with at least one argument will have an entry, the ending of
  11842.         it will also have an entry. Temporaries generated by the optimizer that
  11843.         may be ignore have an underscore as their first character. Optimizer
  11844.         temporaries are ignore when deciding that the temporaries list has
  11845.         changed. Mappings are not necessarily ordered by their ip. Two mappings
  11846.         may have the same ip in this case of an optimized empty block.
  11847.     64    Generate a debug version of the method which includes break points after
  11848.         every expression. Any text/temporaries map generated at the same time will
  11849.         account for the extra byte codes in the IP offsets."
  11850.  
  11851.     | results expression |
  11852.     results := CompilerLibrary default
  11853.                 compileForEvaluation: self 
  11854.                 source: aString 
  11855.                 in: aBehavior 
  11856.                 evaluationPools: pools 
  11857.                 flags: anInteger 
  11858.                 notifying: self.
  11859.     expression := results method.
  11860.     expression notNil
  11861.         ifTrue: [
  11862.             expression 
  11863.                 methodClass: aBehavior;
  11864.                 storeSourceString: aString evaluationPools: pools logged: aBoolean].
  11865.     ^results!
  11866.  
  11867. compilerError: errorString line: lineNumber start: start stop: stop selector: selector in: codeString for: aClass to: notifier
  11868.     "Private - The receiver has generated an error while compiling,
  11869.     inform notifier of this. Callback from the Compiler"
  11870.  
  11871.     notifier compilerNotification:
  11872.         (CompilerErrorNotification
  11873.             text: errorString
  11874.             line: lineNumber
  11875.             range: (start to: stop)
  11876.             selector: selector
  11877.             in: codeString
  11878.             for: aClass)!
  11879.  
  11880. compilerNotification: details
  11881.     "Private - Inform user of Compiler error/warning as detailed in
  11882.     the CompilerNotification argument, details."
  11883.  
  11884.     ^details signal
  11885. !
  11886.  
  11887. compilerWarning: warningString line: lineNumber start: start stop: stop selector: selector in: codeString for: aClass to: notifier
  11888.     "Private - The receiver has generated a warning while compiling,
  11889.     inform notifier of this. Callback from the Compiler"
  11890.  
  11891.     ^notifier compilerNotification:
  11892.             (CompilerWarningNotification
  11893.                 text: warningString
  11894.                 line: lineNumber
  11895.                 range: (start to: stop)
  11896.                 selector: selector
  11897.                 in: codeString
  11898.                 for: aClass)!
  11899.  
  11900. debugInfoFor: aString in: aClass debug: aBoolean
  11901.     "Answers a CompilationResult with all the information necessary for debugging a method
  11902.     in aClass whose sources is aString."
  11903.  
  11904.     ^self 
  11905.         compile: aString 
  11906.         in: aClass 
  11907.         flags: RTF|TextMap|TempsMap|(aBoolean ifTrue: [DebugMethod] ifFalse: [0])
  11908. !
  11909.  
  11910. debugInfoForExpression: aString in: aClass evaluationPools: pools debug: aBoolean
  11911.     "Answers a CompilationResult with all the information necessary for debugging a method
  11912.     in aClass whose sources is aString."
  11913.  
  11914.     ^self 
  11915.         compileForEvaluation: aString 
  11916.         in: aClass
  11917.         evaluationPools: pools
  11918.         logged: false
  11919.         flags: RTF|TextMap|TempsMap|(aBoolean ifTrue: [DebugMethod] ifFalse: [0])!
  11920.  
  11921. defaultFont: aFont
  11922.     "Private - Accept the argument aFont, as the default font for syntax
  11923.     coloured text generated by the receiver."
  11924.     
  11925.     self syntaxColorAt: #FontSize put: '\fs', (aFont pointSize * 2) displayString.
  11926.     CompiledCode initializeInfoCache!
  11927.  
  11928. defaultSyntaxColors 
  11929.     "Private - Answer a Dictionary mapping compiler syntax element names
  11930.     to the corresponding rtf style Strings.
  11931.  
  11932.         Compiler syntaxColors: Compiler defaultSyntaxColors. CompiledCode initializeInfoCache.
  11933.  
  11934.     Notes: 
  11935.     1) The compiler will insert appropriate open and close paren. requests (i.e. you should leave out
  11936.     the curly brackets).
  11937.     2) The compiler does not insert terminating spaces after commands, so these must be included
  11938.     where necessary, but bearing in mind that any extraneous spaces in the format strings WILL 
  11939.     appear in the text.
  11940.     3) We do not specify any font information in the table, because we want to be able to pick
  11941.     up the font set in the view composer/the default font..
  11942.     4) The RichEdit control ignores the size of any font set into it at the first opportunity, so
  11943.     we have to workaround that by including a font size command.
  11944.     " 
  11945.  
  11946.     ^LookupTable new 
  11947.         at:  #Prologue  put:  (
  11948.                     '\rtf1\ansi',            "bog standard prolog"
  11949.                     "'\deff0',"            "use 0 as default font"
  11950.                     '\deftab240',         "default tabs (in twips, i.e. 240 = 1 space in 12 point)"
  11951.                     "Color table - simply comment this out for mono"
  11952.                     '{\colortbl\red0\green0\blue0;\red0\green0\blue255;\red128\green0\blue128;\red255\green0\blue0;\red0\green128\blue0;}',
  11953.                     '\pard',             "reset paragraph format"
  11954.                     '\tx500\tx1000\tx1500\tx2000\tx2500\tx3000\tx3500\tx4000',
  11955.                     '\plain'            "reset character format"
  11956.                 );
  11957.         at: #FontSize    put: '\fs20';            "**BUG: RichEdit ignores size of font set, so we must 'adjust' it"
  11958.         at: #ExprEnd    put: '\plain'; "String lineDelimiter; ""(String with: Character lf);"
  11959.         at:  #MethodEnd    put:  '\par ';
  11960.         at:  #Plain      put:  '' ;            "Use the default character formatting"
  11961.         at:  #Comment    put:  '\i\cf4 ' ;        "All comments in method text"
  11962.         at:  #Selector      put:  '\b\cf1 ' ;        "used only for method definition, emboldened"
  11963.         at:  #Message      put:  '\cf1 ' ;        "for message sends within the source of a method"
  11964.         at:  #Constant    put:  '\cf2 ' ;        "for constants/literals, e.g. strings, integers"
  11965.         at:  #Name        put:  '' ;            "for identifiers, no colour at present (too much)"
  11966.         at:  #InError    put:  '\cf3 ' ;        "error format - applied to whole text of method"
  11967.         shrink;
  11968.         yourself.
  11969.  
  11970.     #todo "Remove font size command ** once we establish how to get RichText control to accept size of font, as well as typeface" !
  11971.  
  11972. evaluate: aString
  11973.     "Compile and evaluate the expression, aString, in the context of
  11974.     UndefinedObject.  If the expression compiles, answer the result of 
  11975.     evaluating the expression with nil as the receiver.
  11976.     If the compilation fails, signal a CompilerNotification and answer nil. 
  11977.     The expression is not written to the change log."
  11978.  
  11979.     ^self evaluate: aString logged: false!
  11980.  
  11981. evaluate: aString for: anObject evaluationPools: pools logged: aBoolean
  11982.     "Compile and evaluate the expression, aString, with anObject as the 
  11983.     receiver.  If the expression compiles, answer the result of evaluating 
  11984.     the expression. If the compilation fails, signal a CompilerNotification
  11985.     and answer nil. Log the expression to the change log as requested by 
  11986.     the argument aBoolean."
  11987.  
  11988.     ^self evaluate: aString for: anObject evaluationPools: pools logged: aBoolean ifFail: []
  11989. !
  11990.  
  11991. evaluate: aString for: anObject evaluationPools: pools logged: aBoolean ifFail: failBlock
  11992.     "Compile and evaluate the expression, aString, with anObject as the 
  11993.     receiver.  If the expression compiles, answer the result of evaluating 
  11994.     the expression. If the compilation fails, signal a CompilerNotification
  11995.     and answer nil. Log the expression to the change log as requested by 
  11996.     the argument aBoolean."
  11997.  
  11998.     | results expr | 
  11999.     results := self compileForEvaluation: aString in: anObject class evaluationPools: pools logged: aBoolean flags: 0.
  12000.     expr := results method.
  12001.     ^expr notNil
  12002.         ifTrue: [expr value: anObject withArguments: Array new]
  12003.         ifFalse: [failBlock value]!
  12004.  
  12005. evaluate: aString for: anObject logged: aBoolean
  12006.     "Compile and evaluate the expression, aString, with anObject as the 
  12007.     receiver.  If the expression compiles, answer the result of evaluating 
  12008.     the expression. If the compilation fails, signal a CompilerNotification
  12009.      and answer nil. Log the expression to the change log as requested by 
  12010.     the argument aBoolean."
  12011.  
  12012.     ^self evaluate: aString for: anObject evaluationPools: nil logged: aBoolean!
  12013.  
  12014. evaluate: aString logged: aBoolean
  12015.     "Compile and evaluate the expression, aString, in the context of
  12016.     UndefinedObject, with nil as the receiver.  If the expression compiles,
  12017.     answer the result of evaluating the expression with nil as the receiver.
  12018.     If the compilation fails, signal a CompilerNotification and answer nil. 
  12019.     Log the expression to the change log as requested by the argument aBoolean."
  12020.  
  12021.     ^self evaluate: aString for: nil logged: aBoolean!
  12022.  
  12023. identifierFrom: aString
  12024.     "Answer a String which is an initial suggestion for a Smalltalk identifier based on aString.
  12025.     The answer is not guaranteed to be a valid identifier as it could be an empty String.
  12026.  
  12027.     Invalid characters are removed, the letter following a removed character is made uppercase
  12028.     unless it forms the first character of the identifier when it is made lowercase, all other
  12029.     letters are made lowercase."
  12030.  
  12031.     | identifier startNewWord i |
  12032.     identifier := String new: aString size.
  12033.     startNewWord := false.
  12034.     i := 1.
  12035.     aString do: [:c |
  12036.         ((i == 1 and: [self isAValidInitialIdentifierChar: c]) or: [self isAValidIdentifierChar: c])
  12037.             ifFalse: [startNewWord := i > 1]
  12038.             ifTrue: [
  12039.                 identifier at: i put: (startNewWord
  12040.                     ifTrue: [c asUppercase]
  12041.                     ifFalse: [c asLowercase]).
  12042.                 startNewWord := false.
  12043.                  i := i+1]].
  12044.     ^identifier trimNulls!
  12045.  
  12046. initialize 
  12047.     "Private - Initialize the class variables of the receiver.
  12048.  
  12049.         Compiler initialize
  12050.  
  12051.         SyntaxColorsMap    -    Map between syntax names and color indices
  12052.     "
  12053.  
  12054.     SyntaxColorsMap := IdentityDictionary new
  12055.             at: #Prologue put: 1;
  12056.             at: #Epilogue put: 2;
  12057.             at: #Plain put: 3;
  12058.             at: #Comment put: 4;
  12059.             at: #Selector put: 5;
  12060.             at: #Message put: 6;
  12061.             at: #Constant put: 7;
  12062.             at: #Name put: 8;
  12063.             at: #InError put: 9;
  12064.             at: #FontSize put: 10;
  12065.             at: #MethodEnd put: 11;
  12066.             at: #ExprEnd put: 12;
  12067.             shrink;
  12068.             yourself.!
  12069.  
  12070. isAReservedWord: aString
  12071.     "Private - Answer whether aString is a reserved word."
  12072.  
  12073.     ^self reservedWords includes: aString!
  12074.  
  12075. isAValidIdentifierChar: aCharacter
  12076.     "Private - Answer whether aCharacter is valid as the non-initial character in an identifier."
  12077.  
  12078.     ^CRTLibrary default __iscsym: aCharacter!
  12079.  
  12080. isAValidInitialIdentifierChar: aCharacter
  12081.     "Private - Answer whether aCharacter is valid as the first character in an identifier."
  12082.  
  12083.     ^CRTLibrary default __iscsymf: aCharacter!
  12084.  
  12085. isAValidLocalIdentifier: aString
  12086.     "Private - Answer whether aString is a valid local identifier."
  12087.  
  12088.     ^(aString allSatisfy: [:c | self isAValidIdentifierChar: c]) and: [
  12089.         (self isAValidInitialIdentifierChar: aString first) and: [
  12090.             (self isAReservedWord: aString) not]]!
  12091.  
  12092. isValidSelector: aSymbol
  12093.     "Answer whether the <Symbol> argument is a valid selector (unary, binary or keyword)."
  12094.  
  12095.     ^(Symbol isLiteralSymbol: aSymbol) and: [
  12096.         (self isAReservedWord: aSymbol asString) not]!
  12097.  
  12098. reservedWords
  12099.     "Private - Answer the Set of reserved words."
  12100.  
  12101.     ^##(Set withAll: #('self' 'super' 'nil' 'true' 'false' 'thisContext'))!
  12102.  
  12103. syntaxColorAt: syntaxName
  12104.     "Private - Answer the RTF String."
  12105.  
  12106.     ^self syntaxColors at: (SyntaxColorsMap at: syntaxName)!
  12107.  
  12108. syntaxColorAt: syntaxName put: rtfString
  12109.     "Private - Set the RTF String used by the compiler to colour sections of the code
  12110.     in syntaxName."
  12111.  
  12112.     self assert: [rtfString isMemberOf: String].
  12113.     self syntaxColors at: (SyntaxColorsMap at: syntaxName) put: rtfString!
  12114.  
  12115. syntaxColorFromUnadornedRtf: rtfString
  12116.         | rtfStream epilogue |
  12117.         rtfStream := String writeStream: rtfString size + PrologueSize + ExprEpilogueSize.
  12118.         rtfStream
  12119.             nextPut: ${;
  12120.             nextPutAll: (self syntaxColorAt: #Prologue);
  12121.             nextPutAll: (self syntaxColorAt: #FontSize);
  12122.     "        space;"
  12123.             nextPutAll: rtfString.
  12124.         epilogue := self syntaxColorAt: #Epilogue.
  12125.         epilogue isNil ifFalse: [
  12126.             rtfStream nextPutAll: epilogue].
  12127.         rtfStream nextPut: $}.
  12128.         ^RichText fromRtf: rtfStream contents!
  12129.  
  12130. syntaxColorOfExpression: aString
  12131.     "Answers an RTF string containing the syntax colouring of aString when compiled
  12132.     for direct evaluation. The code is not evaluated or logged to the change log"
  12133.  
  12134.     ^self syntaxColorOfExpression: aString evaluationPools: nil!
  12135.  
  12136. syntaxColorOfExpression: aString evaluationPools: pools
  12137.     "Answers an RTF string containing the syntax colouring of aString when compiled
  12138.     for direct evaluation. The code is not evaluated or logged to the change log"
  12139.  
  12140.     ^self syntaxColorOfExpression: aString in: UndefinedObject evaluationPools: pools.!
  12141.  
  12142. syntaxColorOfExpression: aString in: aBehavior evaluationPools: pools
  12143.         "Answers an RTF string containing the syntax colouring of aString when compiled
  12144.         for direct evaluation. The code is not evaluated or logged to the change log"
  12145.     
  12146.         ^(self
  12147.             compileForEvaluation: aString
  12148.             in: aBehavior
  12149.             evaluationPools: pools
  12150.             logged: false
  12151.             flags: ##(RTF|SyntaxCheckOnly)) coloredSource!
  12152.  
  12153. syntaxColorOfMethod: aString in: aClass
  12154.         "Answers an RTF string containing the syntax colouring of aString when compiled
  12155.         as a method to be installed in aClass. The method is not installed
  12156.         into aClass or logged to the change log"
  12157.     
  12158.         ^(self compile: aString in: aClass flags: ##(RTF|SyntaxCheckOnly)) coloredSource!
  12159.  
  12160. syntaxColors
  12161.     "Private - Answer an Array of RTF style Strings."
  12162.  
  12163.     ^VMLibrary default registryAt: #RtfStyles!
  12164.  
  12165. syntaxColors: colors
  12166.     "Private - Set the Rtf styles used by the VM compiler. colors must understand
  12167.     #keysAndValuesDo:, and should contain symbolic name keys and the corresponding
  12168.     RTF string values for each style. See defaultSyntaxColors for the
  12169.     meaning of each index."
  12170.  
  12171.     | array |
  12172.     array := Array new: SyntaxColorsMap size.
  12173.     colors keysAndValuesDo: [:k :v |
  12174.         array at: (SyntaxColorsMap at: k) put: v].
  12175.     VMLibrary default registryAt: #RtfStyles put: array.
  12176.     PrologueSize := 1 "for the leading {" + (self syntaxColorAt: #Prologue) size
  12177.                 + (self syntaxColorAt: #FontSize) size.
  12178.     MethodEpilogueSize := (self syntaxColorAt: #Epilogue) size + 1 "for the closing }".
  12179.     ExprEpilogueSize := MethodEpilogueSize + (self syntaxColorAt: #ExprEnd) size.
  12180. !
  12181.  
  12182. temporariesMapOf: aString in: aClass
  12183.     "Answers a temporariesMap Array for aString when compiled
  12184.     as a method to be installed in aClass. The method is not installed
  12185.     into aClass or logged to the change log"
  12186.  
  12187.     ^(self compile: aString in: aClass flags: TempsMap) tempsMap!
  12188.  
  12189. textMapOf: aString in: aClass
  12190.     "Answers a textMap Array for aString when compiled
  12191.     as a method to be installed in aClass. The method is not installed
  12192.     into aClass or logged to the change log"
  12193.  
  12194.     ^(self compile: aString in: aClass flags: TextMap) textMap!
  12195.  
  12196. unadornedSyntaxColorOfExpression: aString
  12197.     "Answer a <String> containing unadorned (that is san prologue and epilogue) RTF syntax colouring 
  12198.     for the Smalltalk expression in the argument, aString, when compiled for direct evaluation."
  12199.  
  12200.     | rtf |
  12201.     #todo "Modify the compiler to support this as an option".
  12202.     rtf := (self syntaxColorOfExpression: aString) rtf.
  12203.     ^rtf copyFrom: PrologueSize+1 to: rtf size - ExprEpilogueSize.
  12204.  
  12205. !
  12206.  
  12207. unadornedSyntaxColorOfMethod: aString in: aClass
  12208.     "Answer a <String> containing unadorned (that is san prologue and epilogue) RTF syntax colouring 
  12209.     of aString when compiled as a method of aClass."
  12210.  
  12211.     | rtf |
  12212.     #todo "Modify the compiler to support this as an option".
  12213.     rtf := (self syntaxColorOfMethod: aString in: aClass) rtf.
  12214.     ^rtf copyFrom: PrologueSize+1 to: rtf size - MethodEpilogueSize.! !
  12215.  
  12216. DeadObject comment:
  12217. 'DeafObject is a singleton whose sole instance is used to mark the slots previously occuppied by dead objects in objects with weak references. This class serves no other purpose than to provide a unique ''Corpse'' object which prints in a recognisable form.
  12218.  
  12219. N.B. It is not a good idea to create a new current DeadObject as this may break existing weak collection and/or confuse the VM.
  12220.  
  12221. Class Variables:
  12222.     Current    <DeadObject>. Singleton instance.
  12223.  
  12224.  
  12225. '!
  12226. !DeadObject class methodsFor!
  12227.  
  12228. current
  12229.     "Answer the singleton DeadObject."
  12230.  
  12231.     ^Current!
  12232.  
  12233. current: aDeadObject
  12234.     "Private - Record a new singleton DeadObject.
  12235.     N.B. Use with extreme care since existing DeadObjects may now be invisible."
  12236.  
  12237.     Current := aDeadObject!
  12238.  
  12239. icon
  12240.     "Answers an Icon that can be used to represent this class"
  12241.  
  12242.     ^##(self) defaultIcon!
  12243.  
  12244. initialize
  12245.     "Private - Initialize the receiver's class variables."
  12246.  
  12247.     Current isNil ifTrue: [Current := self new]!
  12248.  
  12249. removeFromSystem
  12250.     "Private - Remove the receiver completely from the system.
  12251.     This class is critical to system operation and must not be removed."
  12252.  
  12253.     ^self shouldNotImplement! !
  12254.  
  12255. DeafObject comment:
  12256. 'DeafObject is a singleton class whose sole instance is deaf to all requests - i.e. it appears to understand all messages, but takes no action except to answer itself. This ensures that the results of all message sends to the DeafObject are also deaf. DeafObject can be useful for avoiding a proliferation of #isNil tests.
  12257.  
  12258. N.B. DeafObject cannot be used to substitute for any object which has special significance to either the Compiler or the VM, a good example being <Boolean>s. The following expression will raise a ''Must be boolean'' error because it is not a true message send:
  12259.  
  12260. DeafObject current ifTrue: []
  12261.  
  12262. Class Variables:
  12263.     Current        <DeafObject>. Singleton instance.
  12264.  
  12265.  
  12266. '!
  12267. !DeafObject class methodsFor!
  12268.  
  12269. current
  12270.     "Answer the singleton <DeafObject>."
  12271.  
  12272.     ^Current!
  12273.  
  12274. icon
  12275.     "Answers an Icon that can be used to represent this class"
  12276.  
  12277.     ^DeadObject icon!
  12278.  
  12279. initialize
  12280.     "Private - Initialize the receiver's class variables."
  12281.  
  12282.     Current isNil ifTrue: [Current := self new]! !
  12283.  
  12284. !DeafObject methodsFor!
  12285.  
  12286. = comparand
  12287.     "Answer whether the receiver and the <Object>, comparand, 
  12288.     are considered equivalent (in whatever respect is appropriate for 
  12289.     the class of the receiver). All DeafObjects are considered equal."
  12290.  
  12291.     ^self class = comparand class!
  12292.  
  12293. doesNotUnderstand: aMessage
  12294.     "The receiver is deaf to all requests. Answer self to ensure that
  12295.     our answers are also deaf."
  12296.  
  12297.     ^self!
  12298.  
  12299. mustBeBoolean
  12300.     "Private - Sent to the receiver by the VM when an attempt was made to test it
  12301.     for its boolean status by a CompiledMethod.
  12302.     Note that it is normally necessary for implementors of #mustBeBoolean to return a
  12303.     boolean value, or not return at all. If a non-boolean value is returned, then it
  12304.     in turn will be sent a #mustBeBoolean message too. This could potentially continue 
  12305.     indefinitely, causing an unbreakable loop."
  12306.  
  12307.     ^true! !
  12308.  
  12309. DeferredValue comment:
  12310. 'A DeferredValue is a <niladicValuable> which is evaluated asynchronously in a background process, but which supplies its value synchronously on request, i.e. it blocks any sender of #value until the value is available.
  12311.  
  12312. Instances of DeferredValue are typically created by sending the #deferredValue (calculate in background process forked at same priority as active process) and #deferredValueAt: (calculate in a background process at the specified priority) messages, but there is a class side instance creation protocol (#evaluate:[|with|#with:with:|withArguments:]at: which can be used to defer the calculation of other valuables.
  12313.  
  12314. Note that if an exception occurs in the deferred operation it is raised in both the asynchronous process calculating the deferred value, AND any client processes (senders of #value). This is the default behaviour because the deferred value may never be requested, in which case the error would go undetected.
  12315.  
  12316. To suppress exceptions in the asynchronous process wrap the deferred operation in an exception trap which catches any <Error>s and answers them as the value of the operation. Any such suppressed <Error> will still be raised in the client process(es) requesting the deferred value, and of course these can be handled (or ignored) as normal. For example:
  12317.  
  12318.     [["...operation which might raise an error..."]
  12319.         on: Error do: [:e | e]] deferredValue
  12320.  
  12321. Alternatively create a subclass which overrides #_evaluate:withArguments: which includes such a generic error trap.'!
  12322. !DeferredValue class methodsFor!
  12323.  
  12324. evaluate: operation at: priority
  12325.     "Answer a <niladicValuable> that begins evaluating the <niladicValuable>, operation,
  12326.     asynchronously at the specified <integer> priority, and which when evaluated will 
  12327.     synchronously supply the result."
  12328.  
  12329.     ^self    evaluate: operation withArguments: #() at: priority!
  12330.  
  12331. evaluate: operation with: arg1 at: priority
  12332.     "Answer a <niladicValuable> that begins evaluating the <monadicValuable>, operation,
  12333.     asynchronously at the specified <integer> priority, and which when evaluated will 
  12334.     synchronously supply the result."
  12335.  
  12336.     ^self    
  12337.         evaluate: operation 
  12338.         withArguments: (Array with: arg1)
  12339.         at: priority!
  12340.  
  12341. evaluate: operation with: arg1 with: arg2 at: priority
  12342.     "Answer a <niladicValuable> that begins evaluating the <dyadicValuable>, operation,
  12343.     asynchronously at the specified <integer> priority, and which when evaluated will 
  12344.     synchronously supply the result."
  12345.  
  12346.     ^self    
  12347.         evaluate: operation 
  12348.         withArguments: (Array with: arg1 with: arg2) 
  12349.         at: priority!
  12350.  
  12351. evaluate: operation withArguments: args at: priority
  12352.     "Answer a <niladicValuable> that begins evaluating the <valuable>, operation,
  12353.     asynchronously at the specified <integer> priority, and which when evaluated will 
  12354.     synchronously supply the result."
  12355.  
  12356.     ^super new
  12357.         evaluate: operation withArguments: args at: priority!
  12358.  
  12359. initialize
  12360.     "Private - Initialize the receiver's class variables.
  12361.         self initialize
  12362.     "
  12363.  
  12364.     ValuePending := Object new!
  12365.  
  12366. new
  12367.     "Answer a instance of the receiver."
  12368.  
  12369.     ^self shouldNotImplement! !
  12370.  
  12371. !DeferredValue methodsFor!
  12372.  
  12373. _evaluate: operation withArguments: args
  12374.     "Private - Evaluate the <valuable>, operation with the <Array> of arguments, args.
  12375.     The receiver becomes signalled when either the calculation completes, is terminated,
  12376.     or an exception occurs. This method can be overridden by subclasses if desired."
  12377.     
  12378.     ^operation valueWithArguments: args!
  12379.  
  12380. deferredValue
  12381.     "Answer a <niladicValuable> that is evaluated asynchronously (i.e. the receiver)."
  12382.  
  12383.     ^self!
  12384.  
  12385. deferredValueAt: priority
  12386.     "Answer a <niladicValuable> that is evaluated asynchronously at the specified priority.
  12387.     Implementation Note: The priority argument is ignored."
  12388.  
  12389.     ^self!
  12390.  
  12391. evaluate: operation withArguments: args at: priority
  12392.     "Private - Answer a <niladicValuable> that begins evaluating the <valuable>, 
  12393.     operation with the <Array> of arguments, args, asynchronously at the specified 
  12394.     <integer> priority, and which when evaluated will synchronously supply the result. 
  12395.     This message must only be sent when the deferred value is first created."
  12396.  
  12397.     self initialize.
  12398.     [
  12399.         [self setValue: (self _evaluate: operation withArguments: args)]
  12400.             on: Error do: [ :e | self exception: e. e pass]
  12401.             on: ProcessTermination do: [:e |
  12402.                 self exception: 
  12403.                     (Error new 
  12404.                         tag: self;
  12405.                         messageText: 'DeferredValue terminated prematurely')]
  12406.     ] forkAt: priority
  12407. !
  12408.  
  12409. exception: anError
  12410.     "Private - Record the <Error>, anError, as the unhandled exception which
  12411.     occurred when attempting to calculate the value of the receiver, but only
  12412.     if an exception has not already been recorded. This message must not be
  12413.     sent if #setValue: has been sent."
  12414.  
  12415.     exception isNil ifTrue: [
  12416.         self assert: [value == ValuePending].
  12417.         exception := anError. 
  12418.         value := nil.
  12419.         valueAvailable signal]!
  12420.  
  12421. hasValue
  12422.     "Answer whether the deferred value has been calculated yet."
  12423.  
  12424.     ^value ~~ ValuePending!
  12425.  
  12426. initialize
  12427.     "Private - Initialize the receiver's instance variables."
  12428.  
  12429.     value := ValuePending.
  12430.     valueAvailable := Semaphore new!
  12431.  
  12432. setValue: result
  12433.     "Private - Set the deferred value, releasing any processes which are waiting
  12434.     for it.
  12435.     Implementation Note: An #isKindOf: test allows the deferred value block to 
  12436.     trap an exception to prevent  it being raised in the async. process, if desired, 
  12437.     and return it as the value so that it can be re-raised in client processes. We
  12438.     store the exception in a separate instance variable to avoid the necessity for
  12439.     an isKindOf test on every access to the value."
  12440.  
  12441.     (result isKindOf: Error) 
  12442.         ifTrue: [
  12443.             exception := result. 
  12444.             value := nil]
  12445.         ifFalse: [
  12446.             value := result].
  12447.  
  12448.     valueAvailable signal!
  12449.  
  12450. value
  12451.     "Answer the deferred value, blocking until it is available if necessary.
  12452.     If an exception occurred during the calculation of the value, or if it
  12453.     resulted in an <Error>, then that exception is re-raised now in the context
  12454.     of the calling process."
  12455.  
  12456.     valueAvailable wait; signal.
  12457.     exception == nil ifFalse: [exception copy signal].
  12458.     ^value! !
  12459.  
  12460. Delay comment:
  12461. '<Delay>s are used to introduce timed pauses in the execution of a <Process>.  Delays can be constructed that specify a duration using the instance creation messages #forMilliseconds: and #forSeconds:, or an absolute time based on the millisecond clock value (#untilMilliseconds:). Once constructed a Delay responds to the #wait message by suspending the active process for the desired duration, or until the desired absolute time is reached. 
  12462.  
  12463. Delays are "one-shot" in that once they have expired further attempts to #wait on them will return immediately. This applies even if the Delay was originally constructed to wait for a time interval rather than an absolute time. Therefore if one wishes to delay a process in a loop, new Delay instances should be created as required inside the loop. It is often more convenient to use the ProcessorScheduler>>sleep: message, which wraps up the creation and wait operations inside a convenience message.
  12464.  
  12465. Delays are not hard real time, in that the requested delay is the minimum time period that will elapse before the process is restarted. The VM will make a best effort to reschedule the process after the desired delay by using the high-resolution multimedia clock (accurate to 1 millisecond) and high priority threads, but there may still be an arbitrary additional delay before the Process actually restarts depending on the load on the host machine and the relative priority of the Dolphin thread in relation to other OS threads, and the waiting Process in relation to other Processes. There is also some context switching and other processing overhead that will increase the average minimum Delay to a period greater than 1mS, though (depending on machine speed) it should be quite close. 
  12466.  
  12467. Example usage:
  12468.     5 timesRepeat: [(Delay forMilliseconds: 500) wait. Sound bell]
  12469.  
  12470. Instance Variables:
  12471.     duration        <integer> number of milliseconds to delay Process
  12472.     resumptionTime    <integer> value of millisecond clock at which to resume
  12473.     waitSemaphore    <Semaphore> on which to delay Process
  12474.  
  12475. Class Variables:
  12476.     Current        <Delay> the next scheduled Delay (or nil if none)
  12477.     AccessProtect    <Semaphore> protects the class variables in critical regions
  12478.     Pending        <SortedCollection> of waiting <Delay>s in ascending order of resumptionTime.
  12479.     Resolution    <integer> resolution of millisecond clock, minimum 1
  12480.     TimingProcess    <Process> responsible for waking up delayed processes on expiry of Delay
  12481.     ImageClock    <integer> millisecond clock value on last image save - used to reschedule delays on image restart
  12482.     TimerMax        <integer> maximum delay recordable with the timing device.  Longer delays are achieved by repeatedly rescheduling until the desired period has elapsed.
  12483.     TimingSemaphore    <Semaphore> Signalled by the VM at requested times, governing the operation of the TimingProcess.
  12484. '!
  12485. !Delay class methodsFor!
  12486.  
  12487. aboutToIdle
  12488.     "Private - The system is about to go idle.
  12489.     Answer the current millisecond clock value."
  12490.  
  12491.     self keepAlive.
  12492.  
  12493.     "Unfortunately under Windows95 the MM timers occassionally fail to fire
  12494.     (perhaps they cannot be set, but the function does not return any error indication),
  12495.     if this is a problem for you, then enable this prod."
  12496.     (false and: [OSVERSIONINFO current isWin9X]) 
  12497.         ifTrue: [self prod]!
  12498.  
  12499. cancelTimer
  12500.     "Private - Cancel any previously registered timer."
  12501.  
  12502.     Processor signal: nil afterMilliseconds: 0.
  12503. !
  12504.  
  12505. forkTimingProcess
  12506.     "Private - Start the timing process which manages instances of the receiver. The timing 
  12507.     Process runs at the highest, Timing, priority, to ensure that the signal gets through, regardless 
  12508.     of the priority of its waiting Process relative to the active Process when it fires.
  12509.     A separate timing Process is used with a single semaphore because the VM can maintain 
  12510.     only a single timer, and because this allows for better management of Delays."
  12511.  
  12512.     AccessProtect critical: [    
  12513.         self cancelTimer.
  12514.         TimingSemaphore isNil ifTrue: [self initializeTimingSemaphore].
  12515.         TimingProcess isNil ifFalse: [TimingProcess terminate].
  12516.         Current isNil ifFalse: [Current snooze].        "put current back into Pending"
  12517.         self scheduleNext.
  12518.     ].
  12519.     TimingProcess := ([
  12520.         [
  12521.             TimingSemaphore wait.        "Wait for a timeout to be signalled by VM" 
  12522.             AccessProtect critical: [
  12523.                 Current isNil ifFalse: [Current riseAndShine].
  12524.                 self scheduleNext]] repeat.
  12525.     ] forkAt: Processor timingPriority) name: 'Timing'; yourself!
  12526.  
  12527. forMilliseconds: millisecondCount
  12528.     "Answer a new instance of the receiver with a duration of millisecondCount seconds.
  12529.     The new instance has no effect on the progress of a Process until sent the 
  12530.     message #wait. 
  12531.     ou can now set a delay down to 1mS - e.g. try 
  12532.         [Processor sleep: 1] speed.
  12533.     However, if you sleep for such a short period in a tight loop, then you'll not leave
  12534.     much CPU time for other processes to run.
  12535.     "
  12536.  
  12537.     ^self new duration: millisecondCount!
  12538.  
  12539. forSeconds: secondCount
  12540.     "Answer a new instance of the receiver with a duration of secondCount seconds.
  12541.     The new instance has no effect on the progress of a Process until sent the 
  12542.     message #wait. A Delay instantiated for a particular duration (as opposed to one
  12543.     instantiated for an absolute millisecond time) can be used repeatedly (i.e. the 
  12544.     #wait message can be sent to it more than once, though at any one time only one 
  12545.     Process can be waiting for a Delay)."
  12546.  
  12547.     ^self forMilliseconds: secondCount*1000!
  12548.  
  12549. icon
  12550.     "Answers an Icon that can be used to represent this class. Here we use a constant expression 
  12551.     evaluated at compile time in order to statically bind 'self' at this position in the class hierarchy 
  12552.     (i.e. to Object). This ensures that subclasses which do not override this method still answer 
  12553.     'Object defaultIcon' rather than 'aSubclass defaultIcon'. Classes which provide their own default icon 
  12554.     can override this method with a similar implementation perhaps with #defaultIconFrom: if the icon comes
  12555.     from an ExternalResourceLibrary other than the system default."
  12556.  
  12557.     ^##(self) defaultIcon!
  12558.  
  12559. initialize
  12560.     "Initialize the Class Variables of the receiver:
  12561.         Delay initialize
  12562.     "
  12563.  
  12564.     ImageClock := 0.
  12565.     Resolution := 1.
  12566.     TimerMax := 65535.
  12567.     AccessProtect isNil ifTrue: [AccessProtect := Semaphore forMutualExclusion].
  12568.     AccessProtect critical: 
  12569.             [Pending := SortedCollection sortBlock: self pendingSortBlock.
  12570.             Current := nil].
  12571.     TimingSemaphore isNil ifTrue: [self initializeTimingSemaphore]!
  12572.  
  12573. initializeTimingSemaphore
  12574.     "Private - Create the timing semaphore used for communication with the VM's
  12575.     timer services."
  12576.  
  12577.     TimingSemaphore := Semaphore new!
  12578.  
  12579. keepAlive
  12580.     "Private - Ensure that there is a timing process, and that it is in a runnable state."
  12581.  
  12582.     (TimingProcess isNil or: [TimingProcess suspendingList isNil])
  12583.         ifTrue: [
  12584.             Notification signal: 'Starting new timing process'.
  12585.             self forkTimingProcess]!
  12586.  
  12587. millisecondClockValue
  12588.     "Private - Answer the current millisecond clock value."
  12589.  
  12590.     <primitive: 174>
  12591.     ^self invalidCall!
  12592.  
  12593. new
  12594.     "Answer a new, valid, Delay, but one which will fire immediately it receives #wait.
  12595.     See #forMilliseconds:, #forSeconds:, and #untilMilliseconds:"
  12596.  
  12597.     ^super new initialize!
  12598.  
  12599. onExit
  12600.     "The system is closing down, release timer related resources."
  12601.  
  12602.     self cancelTimer!
  12603.  
  12604. onPreSaveImage
  12605.     "Private - The image is about to be saved. Store down the millisecond clock
  12606.     value so that we can reschedule Delays on restart."
  12607.  
  12608.     ImageClock := self millisecondClockValue!
  12609.  
  12610. onStartup
  12611.     "The system has just started. Initialize the timing system."
  12612.  
  12613.     | devCaps |
  12614.     "We don't bother detecting errors reported by the call, because it's too early to report them anyway"
  12615.     devCaps := ByteArray new: 8.
  12616.     WinMMLibrary default timeGetDevCaps: devCaps cbtc: devCaps size.
  12617.     Resolution := devCaps dwordAtOffset: 0.
  12618.  
  12619.     "Don't use the full range as its a bit unreliable on Windows 95.
  12620.     On NT4.0 this is fairly long duration anyway."
  12621.     TimerMax := (devCaps dwordAtOffset: 4) // 2.
  12622.     self keepAlive.
  12623.     self reschedule!
  12624.  
  12625. pendingSortBlock
  12626.     "Private - Answer the sort block used to keep the Pending collection in ascending order of 
  12627.     resumption time."
  12628.  
  12629.     ^[:delay1 :delay2 | delay1 resumptionTime <= delay2 resumptionTime]!
  12630.  
  12631. prod
  12632.     "Private - Give the timing process a poke to wake in case its time to rise and shine.
  12633.     You can send this message if Delays stop firing to see if they'll restart."
  12634.  
  12635.     TimingSemaphore signal!
  12636.  
  12637. reschedule
  12638.     "Private - Ensure that the next pending Delay, or the Current one, is correctly scheduled with 
  12639.     the VM. Called during startup to reschedule Delays based on the difference between the current
  12640.     millisecond clock, and that in place when the Delay was originally scheduled."
  12641.  
  12642.     AccessProtect critical: 
  12643.             [| delta |
  12644.             delta := self millisecondClockValue - ImageClock.
  12645.             Current isNil ifFalse: [Current snooze].    "put current back into Pending"
  12646.             Pending do: [:each | each delta: delta].
  12647.             self scheduleNext]!
  12648.  
  12649. resolution
  12650.     "Answer the resolution of Delays. This is the underlying resolution of the timing
  12651.     device. Dolphin will try to service delays of this period, but it may not be possible."
  12652.  
  12653.     ^Resolution!
  12654.  
  12655. scheduleNext
  12656.     "Private - Schedule the next Pending Delay (if any). MUST be called from within
  12657.     a critical section managed by AccessProtect."
  12658.  
  12659.     Pending isEmpty 
  12660.         ifTrue: [Current := nil]
  12661.         ifFalse: [Pending removeFirst schedule]!
  12662.  
  12663. timingProcess
  12664.     "Private - Answer the <Process> which is used to manage the list of pending Delays."
  12665.  
  12666.     ^TimingProcess!
  12667.  
  12668. untilMilliseconds: millisecondTime
  12669.     "Answer a new instance of the receiver that will make the active Process
  12670.     wait until the millisecond clock reaches the value millisecondTime."
  12671.  
  12672.     ^self new resumptionTime: millisecondTime! !
  12673.  
  12674. !Delay methodsFor!
  12675.  
  12676. calcResumptionTime
  12677.     "Private - Calculate and answer the value of the millisecond clock after which any 
  12678.     Process waiting on the receiver will be rescheduled. We could lazily evaluate this
  12679.     from the normal accessor, but we want to ensure that scheduling Delays is as fast 
  12680.     as possible, and we also want to be able to control when the calculation is made, 
  12681.     as for relative durations (the most common case) we really want to calculate off 
  12682.     the clock just before the receiver is scheduled, certainly not before that."
  12683.  
  12684.     resumptionTime isNil ifTrue: [resumptionTime := self class millisecondClockValue + duration].
  12685.     ^resumptionTime!
  12686.  
  12687. cancel
  12688.     "Cancel the receiver. Any Process waiting on the receiver, remains waiting (but see #resume),
  12689.     the receiver is simply removed from the collection of Delays managed by the TimingProcess."
  12690.  
  12691.     AccessProtect critical: [
  12692.         self == Current
  12693.             ifTrue: [
  12694.                 self class
  12695.                     cancelTimer;
  12696.                     scheduleNext]
  12697.             ifFalse: [
  12698.                 Pending remove: self ifAbsent: []]]
  12699. !
  12700.  
  12701. delta: anInteger
  12702.     "Private - Adjust the delay provided by the receiver by the specified delta (e.g. on
  12703.     image reload to base off a new millisecond clock relative to the old)."
  12704.  
  12705.     resumptionTime := resumptionTime + anInteger!
  12706.  
  12707. duration: millisecs
  12708.     "Private - Initialize the receiver to be a Delay for the Number of milliseconds specified by
  12709.     the argument, millisecs. The resumptionTime is calculated when a #wait is sent.
  12710.     Answer the receiver."
  12711.  
  12712.     duration := millisecs truncated
  12713. !
  12714.  
  12715. getDuration
  12716.     "Private - Determine the duration of the receiver based off the current millisecond
  12717.     clock value if not explicitly specified. We also calculate the absolute resumptionTime
  12718.     at this point (if not provided). We avoid requesting a delay which is larger than
  12719.     that which the system can provide, which means we may wake up before time and
  12720.     have to reschedule."
  12721.  
  12722.     ^(resumptionTime - self class millisecondClockValue) min: TimerMax!
  12723.  
  12724. hasExpired
  12725.     "Private - Answer whether the receiver represents a Delay which should have
  12726.     fired by now."
  12727.  
  12728.     ^(resumptionTime - self class millisecondClockValue) < Resolution.
  12729.  
  12730.     #todo "This, and other Delay methods, do not correctly account for the millisecond clock
  12731.         wrapping round. Fix this, and perhaps allow scheduling of Delays for absolute DateTimes"!
  12732.  
  12733. initialize
  12734.     "Private - Initialize the receiver to be a valid Delay, but one which will fire immediately.
  12735.     Answer the receiver."
  12736.  
  12737.     duration := 0.
  12738.     waitSemaphore := Semaphore new!
  12739.  
  12740. printOn: aStream
  12741.     "Append a short textual description of the receiver to aStream."
  12742.  
  12743.     aStream
  12744.         basicPrint: self;
  12745.         nextPut: $(;
  12746.         print: resumptionTime;
  12747.         space;
  12748.         print: waitSemaphore;
  12749.         nextPut: $)!
  12750.  
  12751. resumptionTime
  12752.     "Answer the value of the millisecond clock after which any Process waiting on the receiver 
  12753.     will be rescheduled."
  12754.  
  12755.     ^resumptionTime!
  12756.  
  12757. resumptionTime: millisecondTime
  12758.     "Private - Initialize the receiver to be a Delay until millisecondTime. The duration remains
  12759.     nil as this is a delay until an absolute time, and cannot be rescheduled.
  12760.     Answer the receiver."
  12761.  
  12762.     resumptionTime := millisecondTime truncated!
  12763.  
  12764. riseAndShine
  12765.     "Private - The receiver's alarm has gone off. Decide whether to get up yet, or
  12766.     press the snooze button. This is necessary because we cannot always set a Delay
  12767.     for the maximum duration required.
  12768.     Implementation Note: This expects to be called inside the critical section."
  12769.  
  12770.     self hasExpired 
  12771.         ifTrue: [self wakeup]
  12772.         ifFalse: [self snooze]!
  12773.  
  12774. schedule
  12775.     "Private - Schedule the receiver as the next wake up signal.
  12776.     Implementation Note: This expects to be called inside the critical section."
  12777.  
  12778.     TimingSemaphore reset.
  12779.  
  12780.     "This may fire immediately, causing a Process switch to the timing process
  12781.     (if it's not the scheduler of the Delay), however it will almost immediately
  12782.     be forced to wait for the AccessProtect mutual exclusion Semaphore (which
  12783.     we own) to be signalled, which will mean that the assignment to Current
  12784.     must happen before the timing process accesses it. The timing Process
  12785.     will not restart until we exit our critical section."
  12786.     Processor signal: TimingSemaphore afterMilliseconds: self getDuration.
  12787.  
  12788.     Current := self!
  12789.  
  12790. signal
  12791.     "Immediately resume the Process waiting on the receiver."
  12792.  
  12793.     self cancel.
  12794.     self wakeup
  12795. !
  12796.  
  12797. snooze
  12798.     "Private - The receiver wants a few more moments in bed, press the snooze button on 
  12799.     the alarm clock. This is necessary because we sometimes cannot set an alarm duration as
  12800.     long as we require, and because we can only set one alarm at a time. 
  12801.     Implementation Note: This expects to be called inside the critical section."
  12802.  
  12803.     Pending add: self
  12804.  
  12805.     
  12806.  
  12807.     !
  12808.  
  12809. terminateProcess
  12810.     "Terminate any process waiting on the receiver"
  12811.  
  12812.     waitSemaphore terminateProcess.
  12813.     self cancel!
  12814.  
  12815. wait
  12816.     "Delay the active Process until the receiver's resumption time. The processes priority 
  12817.     is temporarily raised to prevent it holding up the timing process when its critical 
  12818.     section - if we did not do this and the current active process has a low priority, then 
  12819.     it might be preempted in its critical section, which will prevent the TimingProcess
  12820.     from operating correctly. The resumption time is calculated outside the critical section 
  12821.     so that it is based, as near as possible, on the millisecondClockValue at the time the 
  12822.     #wait message is sent. If it were calculated inside, then it would incorrectly include 
  12823.     the time taken to acquire the AccessProtect Semaphore."
  12824.  
  12825.     | resumingAt |
  12826.     resumingAt := self calcResumptionTime.
  12827.     AccessProtect critical: [
  12828.         "If the new Delay will be the first to wakeup, schedule it"
  12829.         Current isNil 
  12830.             ifTrue: [self schedule]
  12831.             ifFalse: [
  12832.                 resumingAt < Current resumptionTime
  12833.                     ifTrue: [ 
  12834.                         Current snooze.
  12835.                         self schedule]
  12836.                     ifFalse: [self snooze]]] atPriority: TimingProcess priority-1.
  12837.     "Now make the active Process wait"
  12838.     waitSemaphore wait!
  12839.  
  12840. wakeup
  12841.     "Private - The receiver has fired, resume the Process suspended on the receiver (if any)."
  12842.  
  12843.     waitSemaphore signal! !
  12844.  
  12845. DigitalSignatureAlgorithm comment:
  12846. 'This class implements the Digital Signature Algorithm (DSA) of the U.S. government''s "Digital Signature Standard" (DSS). The DSA algorithm was proposed in 1991 and became a standard in May 1994. The official description is available as a Federal Information Processing Standards Publication (FIPS PUB 186, May 19, 1994). A companion standard, the Secure Hash Standard, or SHS (FIPS PUB 180-1, April 17, 1995), describes a 160-bit message digest algorithm known as the Secure Hash Algorithm (SHA). This message digest is used to compute the document signature.
  12847.  
  12848. This class was ported from the Squeak original.
  12849.  
  12850. Here''s how to use it:
  12851.  
  12852.   1. The "signer" creates a pair of keys. One of these must be kept private. The other may be freely distributed. For example, it could be built into the signature checking code of an application.
  12853.  
  12854.   2. When the signer wishes to sign a packet of data (a "message") , he uses the secure hash algorithm to create a 160-bit message digest (hash) which is used as the input to DSA. The result of this is a pair of large numbers called a "signature" that is attached to the original message.
  12855.  
  12856.   3. When someone receives a signed message purported to have come from the signer, they compute the 160-bit hash of the message and pass that, along with the message signature and the signer''s public key, to the signature verification algorithm. If the signature checks, then it is virtually guaranteed that the message originated from someone who had the signer''s private key. That is, the message is not a forgery and has not been modified since it was signed. For example, if the message contains a program, and the recipient trusts the signer, then the recipient can run the program with the assurance that it won''t do anything harmful. (At least, not intentionally. A digital signature is no guarantee against bugs!! :->)
  12857.  
  12858. The signer must keep the private key secure, since anyone who has the private key can forge the signer''s signature on any message they like. As long as the secret key is not stolen, cryptographers believe it to be virtually impossible either to forge a signature, to find a message that matches an existing sigature, or to discover the signer''s private key by analyzing message signatures. Knowing the public key (which, for example, could be recovered from an application that had it built in), does not weaken the security at all.
  12859.  
  12860. An excellent reference work on digital signatures and cryptography in general is:
  12861.  
  12862.   Schneier, Bruce
  12863.   "Applied Cryptography: Protocols, Algorithms, and Source Code in C"
  12864.   John Wiley and Sons, 1996.
  12865.  
  12866. I (John Maloney) used this book as a guide to implementing many of the numerical algorithms required by DSA.
  12867.  
  12868. Patents and Export Restrictions:
  12869.  
  12870. Many digital signature technologies are patented. DSA is also patented, but the patent is owned by the U.S. government which has made DSA available royalty-free. There is a claim that the government patent infringes on an earlier patent by Schnorr, but the government is requiring the use of DSA, so they apparently believe this claim is not strong enough to be a serious threat to their own patent.
  12871.  
  12872. Most cryptography technology, including digital signature technology, requires an export license for it to be distributed outside the U.S. Recent legislation may have relaxed the export license requirements, but it would be prudent to check the current regulations before exporting this code.'!
  12873. !DigitalSignatureAlgorithm class methodsFor!
  12874.  
  12875. Σ\&%4íΓX@°Ö₧#ô>⌡╤»ü╛≥╟╘│Γ⌐V░╜ÇhzOX█è9ûI/}HRl
  12876. ╢Ç]&0J▒uUs½Ñ'║╫VΦñ╛Ö∙╬ àqm    │»h>¿ë┼AIÿƒ─*⌠·lû8SI5≥c▀╒\àQ4┐    ;ôÄ«£Ñ¡`ÅM┼╞╙;;ª°D½sJz┬√6═╦⌐hé2░°(xΩç"ƒ}┼3╖£ùAgºà²τ╙╝í1≈ì╪clAQ;r¥∩pbFW╟MìÖª}.JZ█ò*á_╠░┌╜σrñ╝ê▀ë*√Äú`±1>C▒u≡}Lτ▓f╬iH╪    ¼ö¥╘ƒs╙┼└ΩD┤5¿bτ*ƒºδ╓`\5@: 6çΓ?`╛2┼╥ Fsôblä°µ├º÷Dq6K
  12877. jƒs╫╘ E
  12878. ôµjîÆ#÷ⁿîB╥*xUR═Γ~Cz┤^Ñ╘ΩôNƒ│÷╕╩ƒ▐MÖ╢üW_"⌐æÄ┬%ú"`≥▓╡╩éL¬╘A═!
  12879.  
  12880. µA)'9░è<╢Ѻ/£ Σ└éªùò°╨░≈╖RW║√┴uwW▄ù)WàEje^J+≤ò^_i4ásWoΓ╕)²╨K»∙≈¬ ╩\ ÆgK z ╙»-3ε┘┴PZ╒^╧gºU╖iòA≈TVWd±q¥╥Pƒ⌐bÜ▄⢪╔Vëù█ÿyε°DúnJzɲ2╟ƒPß)├J╚V ,s■┬8╦Lz┼8┤╬É
  12881. 4窲╛≤»·eN∙φº%DPKu'£ú?1]U╩▀╩╡Qd/G▀ÿ<╦Ié░╨╢°!!Θ»Æ┘≈T▄Φ╠ ▀E#C¼n⌡uKτ±b┼t ¥ôû܃\öû╒⌠GΓ>«+≥<╚Γ≈╤o]    D}≈8ü≡$kûtïF┌SpÅgnî∩ ±k1ó╧à>5^$û1█╦ÖCĵN+ú÷Fæ╒£F╨l,QKéπ+8╤x₧÷▌£N┴╨£▄óÿ╬SܺüKS6íåè5▐&íIc╚╗ñú»V3·≡A═ß╬G¿ ╗'åW0>Ä╟'²N¥ε:¬╡▓Y┐êB▒xì¼╡└=╘╓à2ܼO╥▒    N!
  12882.  
  12883. µA)'9░è,úÄ₧%É/î╛åÄ┘╥╤╨¼≤▒V╛╡─;rFE┼ü,ûT+|OZj╢è@&5J╖<Ue░δ╔  @£┐▓▐σ╩ ¢`    } █▓-3╝█┴@Ü╙}╝F│=£εVJI1∩pÜ┘\ÄQ╞i├▐â⌡Çαt╡M₧òù< » Fº hçδs╪╨MºB=╔^╬²*!!≥┬aéQk╘,±╚ïE`≤»Ω√áá⌡rY╜á░rCP&3╬±%a_╧W╪Å│J#Q)%╖δFÑUô¬æô∙xñ╜ä├ƒ,┤≈└┴E4
  12884. C¿}≈
  12885. 4Lφ╝lÇyRß╨┴■Σ▓"≥┼└ΩD┤5┤n≤2╤Γ╙┌a{@YP¢u■¥@°
  12886. îK╙Lfæ iâ≥!!╤ +X╟»╔E>7
  12887. {─Z┘╫╫Aü≈Y▓µnìÜèW│F!
  12888.  
  12889. µA)'9░è,úÜë>ú0≤≤²├δ╟àò┐╒╖\V»Ü╥irQ;╕φ|uÆQA8oOV+°à^Xh5XªnkΓá%π₧Q╝≈▒æσÅ8-╢:4feÜ«h!!╗┼╘AåVÆ5»Qñ|ëA┤_≈eï█ùGm≥\,╞É╧ ╧αxì┴╥▌<b─ÿ:.╦Noç╡s⌡┌FºF*┬Z╚τ$n≈ç{├L.╘>║┘├W{╛½╕ΩΘ ¡║ 1╙ì╪c`JSK&5ïµ1eJ{╠■₧çVQC╧æu╦[%ä ─¿▌s÷╗ÿá≡|╪ëñcª;$ⁿr∙4V∞╕}≥lUΦ    ôºüü╥}ê╙╫ªE±5¿j⌡6εΓß∞RO@n/■"â¡md╢&É[╧9SPbƒ
  12890. !
  12891.  
  12892. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A%b£∞t0B/H¬hRfæó'⌠▀V║▓ûÆ≡└â|S@gn╙¿d3ó└┌\% ╤{├)▀?ú ²]C9*ΦiÜ═òQ4¡@0┌ü╫╢├ª3¢₧ùƒ<╝°ZA▒ içε'█═≤I.┬╬ⁿc#ö¡±Oo╠3ü╬èIqáεóúá/ªαe[╝≥≥lKPS"║╣Wb!!çzºx╣¼Xa0s^╙î*ÿX╦░Γ╡²mΦèô─ù;ªú╩▀µ<«O`P╕±Z═lWα6îê₧ï╠ê▀▀π Öx]╨ú╠α≡²RFI$P)⌠w₧÷=v╤5▀L╞ Dwë tà■uΩ!!Y╨ΓαQq3^
  12893. >┬╬Æ╫K═∙Y8╕┐Kûü╤│FQxI╩╥-ùNÄ∩▌ÆT±·╣µïƒ─▄
  12894. ⌡╤ '»₧â╚>≈"]B∙ºñ╦à#1òâ8ó╚°]¼█≥=╛]!
  12895.  
  12896. ≥M oxÑ╝&;│ºïù ⌡╞Ω═≤ù╧╟╖ΣñGFö╛┘!!3XD█Æ?FÆtA31:)< år.Jπ{Z|ºÑ`≈█Q⌐░▓▐┐╬\âf[c ╒«-!!║█╔WO▄VÆqεB╕nçεNI+Φcæ▀MëPq∞(┴¢═±éΓΓ`⌡≥Å< ╜≡Lús~É»;₧╠Vα3í5│α,!!úÜ8╤Gb╞┐┘ö
  12897. ┘╟ⁿφßFí·iHïß╝h`Gk¥±Y]&X╚┼ÿß0|pI┘ö=Ärà°≡┤√n÷│ò┼ù~╗µ▐Góo^C0¿n⌡sp≡é}╥hZßF¥ìÆ¥╠Æ┼τ V±y╫êZ╠ß╠═C3=A}½j╙ ,vÖ1ì╫RJNâssîⁿ0╣J$o▄░µY6X*j─▀▀Σ)lΘèU,æ■EîÉ┼σ$x
  12898. Q╩±7 8â,ƒ·╦┌=╕¿⌠╖╞╤ï^»L▓ìKQ ▓í¢╬+á_(uæ╫ú╟┬+╩┌(┤ë░W⌐Θε=åsy0å╟εE┐ε%íó«Gï£Bï9 ┘Θ»ü9├∙å?ééa°εOt6úΓ┘▀É2T]äWA⌐ëâN/╩ÇφC¢Φ¥}W░┘█:&│╨s¬(M ⌐╨!
  12899.  
  12900. ⌡A4=╜╝7=∩°▐G∩Vú⌡ß▀Θ╥═ò┐▓╡RJ¡√╧}3CS╦ù~TÿM>kHGb±╧^mn#ÑuAy╢δ+ ╟    ╗≈úû≥Å ₧b_k ╤╣t~ε▌╚\åÉ{¬╣sòA⌡B0Σ$Å╦[ÉKw∞ 9╩▄ü¢ª╔1┐,¡╡║R(⌠▒cL½sJoçⁿ'₧╘Z■<╔KÜαmq∞┼t╦A.╙7╛╔Å@4▒½╕δ≤¼┤oR╡∙≥ wAu&çΣVpXA╚W▀ï¡l,S@╙é.ƒSÿ╝æ╒û≡▓äìÅ-░±ë└;R«y²qπ±z┼yπ▐èûù╠Ä┼╠ΦE┤5┤n≤2╤Γ╙┌ul[FH3⌡wä°8iòtöK┌Vkâ pƒ≥#Γ ├º÷"?I {┬T£┐│)lΘ▌i Æ#÷ⁿ╫ìxk@Ü¿|Vi┬4┬⌐ìÇ]■δºß£╪Ü╔≡▌|≥╟╓Bô}⌠6>N»Ωπÿ£k(╧╩~÷▀ªC⌡⌐¼~╒'`U╥çLÑ┴┤c┘⌠ε╥═⌡mFT╫·≤ÿpëº┼n╧╙T░τ\5qⁿáë¥═AôlsÉΣ¢j¥ô»╦▒╧<±äd_╜lΓÄ!!╕bíòδ╖èàe⌠ñ╨╨≡äH î<]    ╔    ▓½ô@╝╦ÿ⌠Aπ|T╔v╧≥╙1^FKⁿ0╧ÆC7X▐╓╢`ÿ┐┤hÄKé-9δêè■Oî ':╖π╢-b█c,
  12901. æx╛1√≥─eh¥É√⌠∙▓êµ8
  12902. Z╫4¼#°dî{áδ╧(^hσδ.L╤ⁿl2░¿í╛Ië8Któ'└└ΣZ∙┤dôR┐⌠>æ÷½r¥`$zÑ░∞¿╬÷íÿ«LMPªpw|⌐▀#7≤îTHΣ¼Ω╫Aï└╫┴ ╩▄·@
  12903. ùG,¿xjU┴bZPGÉ╤C
  12904. =±¼ª∩┤2⌡%P¥┤9ûàëk╦±J~#░*éF2ä╒╕Gv√pVpjΘ▒╗▒o≤╖;bU╛é▀ ╩æ│VüuΓsi*╪¡kΦ(ÖΦDâ²%ßµH
  12905. 3u*cΘ╝·u±╖è╤UΦ╫çC╖º!!π╘╘&╕-LÄÉπ¿⌡Ä┐?¿╧░3é1·Φ]ü┤¢»╖eP°\UXvßdù IÜ5Iδ'}}ñ╤B┬g=½Üè:°D■K⌡┐√`±-Gx0╓»┐Y╬J╗Ésδ=┌9â]r┼eÆ¡oCâtÉ+ΓjΘ²µ<φΘDφâ kαz╒ß╡αdAJ≈Sª╛╕Oé|Æ5╛    ┴Ce=$º┤⌡Φ,┘bö╛(J╖l⌐╡╘q»ó╧}~╗²┌}»Ö!!B╜⌐îdÉ»x«╬+óJ┼4â╤ê%µµ½'êögï⌠Ñ⌡╜oƒú╓ô▐╥═ É| j$┘ô╪╓ÉôEóÿdⁿ;í_$│╕c┐╕ûJ░╡┼Ñ╟6
  12906. ╒n└'╫2kc √MâêΦå ¢&╞pφßv8`MJΩ╚ ïrv▒▄6åçßπ√^ Ñeσe"f═τn&ÿ|┬Cµ&ì≤┐Hc]X?╩ f¡┘└è«[┘Cåm)Üv}ì饷`┘√<D└▄ΘeÄGΩΘr│α;ü▀ƒæZ\¼å╡Ä{£≥_3!!σRöZ╙ä8:ï Tu!
  12907.  
  12908. ⌡A4=╜╝7=φ ╘G∩Vú⌡ß▀Θ╥═ò┐▓╡RJ¡√╧}3CS╦ù~TÿM>kHGb±╧^mn#ÑuAy╢δ+ ╟    ╗≈úû≥Å ₧b_k ╤╣t~ε▌╚\åÉ{¬╣sòA⌡B0Σ$Å╦[ÉKw∞ 9╩▄ü¢ª╔1┐,¡╡║R(⌠▒cL½sJoçⁿ'₧╘Z■<╔KÜαmq∞┼t╦A.╙7╛╔Å@4▒½╕δ≤¼┤oR╡∙≥ wAu&çΣVpXA╚W▀ï¡l,S@╙é.ƒSÿ╝æ╒û≡▓äìÅ-░±ë└;R«y²qπ±z┼yπ▐èûù╠Ä┼╠ΦE┤5┤n≤2╤Γ╙┌ul[FH3⌡wä°8iòtöK┌Vkâ pƒ≥#Γ ├º÷"?I {┬T£┐│)lΘ▌i ╝╬┼╟Å`GûóqQh─5┬¿èâ_⌡πñΣÿ█ÿ╚≥╒|≤╩╓Bÿz■73L«∞Γÿùh)╟╬z±┌ªD÷½½|█(n[▀ïA¡┴╕g┌≤∞▌╩±lKW╥ ±ù~äª╟j─╨^╢τW5t°Ñèô├JÜlrÆ∩Ük₧ö«╦░╬?≈ïeP╣~`∩ê ╣iáùΦ░ê àf±ú┴╨÷ÅHë<\═    │«ÖB╛╔ƒ≤Gσ}R╚
  12909. t╟≤╙=Z@J²3└ÿO6^█╘│gë┐╣kàJä/=δêä≡Aè )6▓Γ╜.n╩k%ûz╕1°≥─gfÿô ÷ ╖çΦ6]╙;Ñ,≡lèx¡ß╦)Pi∩ φ8N╪ⁿn1┐½Ñ╣Lê;Ft»)├╔φZ÷║lÜW╜≡?Æ÷ªwÖl*p½┤φ«═²¼₧ªEJ[¿up~¬▌-4±âQOΓ¼    φ█Gé┴▐┬▄╓∙AÜG*ó}jR╩`[RFò┌\7$5ΘªñΦ░8²)P¢░:ƒçèi╩÷Mz ╗+ëG0ê╥╜Mpⁿy^vkε╜┐╡c≥╗<i^╖å▌ ╧æ▒Râr∞po-╥⌐kΣ$ƒΦCü■'σµH    0r/h∩╜■u²┐è╥VΦ╥éF╜ª!!µ╓╘&║-Dì¥δ½²ì▓8¿╦░0ü6°εHé┤Ü¿ ╖m\■\ZSwεeÿGƒ&Lµ'ur¼╤I┴k:¡æÇ=∙A∙F≥óΓuΘ*Cr7╘«▓^└L╗ôrδ<╪?Ç]t═dÆ⌐jFâvÉ+ΦfΘⁿ∩8∩ßEΩç~√jΣu┘µ▓ßaEI≡Wó╜░Dê}¥:║ ┬I`2!!ñ╡x≈Θ.╘nû╣'E╕c¿┤╒vñº╧w╛⌠▌~¼É!!B╗⌐Çbû¿yÑ┬+¼O╦1à╨å)ΓΘ¬&üôcä⌠ª ╢oö¿╒ƒ╤╒╠ⁿût
  12910. i*▄É╘╨ùûC»Æi■<▓\ ┤╕b╜╕æJ╡╡╞í╧4╫h┴(╫?ne√KàÄΦçÿ#╞wεΓw?nIMε╠ ê{v▒╪;Éü∞τ ±R ¿lπg$o┼µn öx├E∞ é≤╜BnSV9┬-d½█╞ü»T╪Häi*¥gxÄâÿ l▐≈>F╔▌ΘdàA∞τ{╢µ?    Ç▌òÉX\ºü▓éyÖ°^4&ßZÆP╤ü5;ù9aJh    Φ=
  12911. YäΦ@╕±}v∙>½½ß▄!!DÆ8ìS╝▌┴╗à╠√¿═╦V▓╤$R╪\D⌠δ2Öï╜╕═εF ⌐ªÆ"ò╛· Teo{╥:=£U≡╞Ñ ╪Θö╦hDܼuσ▄n`jjT╔φ¿╥îf≤:┴^╗Σ╘3αhë■┤G!!┤Q╝·Çim▒Å!!ï┼┴≡åm*╟╕cZêò┼F░{╚½╜ÇL∙K[στ╙#^0t*5
  12912. VÑ]ù1╟éb├B=╔∙8╕┴G⌡ºú╘╨⌡ΦU╪G╟┴δ í>íB╞i╤TJ≥1eaR]╔╞*ó₧ⁿÉ┤⌡¼\íä╞R\Z■É^Ñσ░G╬7²╓c≥π∩K 3Ä{i≡₧_╓°EσV╚»xª`H╪;u┬ÖC╠╓sòf`╠ñⁿ8∙çåj▌╣ⁿ·½φå3╖<æQZîK┌╚ 3⌠*πMƒó»ûüN∞D╔èß;╦]3╡▒+-╥Npü-wÿ
  12913. >╣qabó;]╧¡⌡S╒WOê>êV┐d█║*¬¬ÉTÆ╞π▄p:-f°╓═Æ╬╢Y+╫■i▌mÇ!
  12914.  
  12915. ≈A53!!■╧!! ╜ºì>É-Στ√▐≈┘╪ò╖ßûZD▒║╘naMy╘▐~SñKV#`\|y<ΓôXkf_╢~_cíÇ%πä╜╡╗ù⌠Σ·7BOn╔½h ε▌╥LM╒òVaªF÷zÖ∙_1µj₧╩LÄG4┐.┌£─╢▀⌐tå▀Å¢yO⌐°AA¼ ~æⁿ2┘┌»@o▀K╚≥ !!÷╒8╤V|╔1╢ò═)▐─æ╨∩¡« n╕ε╢%H@d7£ú"t^╞ìÅñ]h8J╒ôoÿSÿ±┼¡εdñ¼ä▀ô8╝α╚╞
  12916. 9PR┤i∩C4KΩ┤{┼-R FÉÄ╙Ç┌Mƒ╗»ÅA⌡<·b∩:╤╒∙╤IdiF0─$ûσmgö2É\┌XWGqÅfyä⌡2ú eO┴ÑßV%/X0öw┤┐│-└τO+≈≈Hî¥ÜU₧$xCIé∞IiTòû╗éÅN┐┐²░ïà╬H╥5╩φMW7¿ù¥SæwφQcε¼╡µ─,y╢û+¿Ü∙@⌐╣⌡,ö]`φ║]²sì≤>éáÆF╣ÅUª9@ÇѪ╥:æ∙âÅôO¿┘eMú≥∞┘Ç ±2kÜΩâB=╪╚√X▄ε¥zJÅ┘ Θ)1α₧u{■)M÷├ò≤εO╧0ó°¡∞╦┤vOZ eH¢ª├╚L╖█─Ñ╛-[BæZU.ñ░Ém
  12917. Iεc¬╒Pañò╘#╩δß6αQ ┐}░▐ôⁿJ₧umnª¿≡Tu9ìz5NCU╦.∙p╗ñ═w-┴┴íúV╛≥╒î{Mèdæ/├<ptW╠*╣уl7ÑlU╗v£╗,e╝╛πßÿUl>K4[÷vö░╝¿╣}╦B²╖n═¼≡ ╔!!)b^Θß▒P ╖¬ß=í! !
  12918.  
  12919. !DigitalSignatureAlgorithm methodsFor!
  12920.  
  12921. ΓK*
  12922.  ,í╝;.┤¿ÿ?ù:╟█²ß√─╠╘╣≈ìRP╖ßÇsr[^Æö,[ü^P/E^J1OµôOg2JêyJ*╧┴I╕ L┐▓Ñ▐π╟^ô}Y    za╓ⁿ~;⌐╟┴M]ç╙sεW╛x╨⌡GJx∞aî═X¢G4ñ/█╥╓σ┼«t╚ù₧╙{╕⌠Y▓rmâ√6₧╘Z■oφ╔⌠#`φ╥j╟g╙░£ôE}íε≈°á
  12923. ⌐µgY∙Θ╝bCG(r║µW cFF╚╚Qüñ@-5P █ÅoèHùΘæ╖·!!Γ╡ö▀┌2┤±╬ Å 9╣n∩U4≥²)╤!!δJ▐Ö┌└¥%±╗»Å^┤p½+µs▌ºΩ╠ZT)\FUP¢^â╖w8╤$ìG╔UGHây ï≥'≡k1ó╦■kg
  12924.     l▀ ▀╞▄oÖúO/┤≡G¢█≥-╖+x
  12925. Q╥Γ-<ài╝■┴Æñ│π▓àµí6ä·┘F6⌐äÄ╬¿{&⌠½ó┌═q²≤>τ╥¡Σúªi╙]d╝┴Uí╔í8₧²²oÖ█πh"=├╛»╚%╘─é+ô▌
  12926. kï▌f╢┤╙ïët;-úS Çφ₧
  12927. /╬╠°
  12928. ÄπæhK¼╪6▓n'┐╥rΣ>\∞÷╗∩┘T╨d⌡Ñ╨î«┘EMù    d2≈5⌠δÇK¬ê╔¿÷E#k≡2/O■áæi8á8┘╤/|fΓεÄ^╔┤á*░u$╝╨░╘ⁿW┘Å╥ì/<╨1 ;¼Fä └╣═w&Ѽ╞╦+┬ë╣╖5àpC▓(└<'&àv╣íë>%µ≥uß╟Wsªñ¡¿╦kg╩?ⁿ≥╘0▓≡!
  12929.  
  12930. σW&)<?¬╒r9·╕╓jöµÄ»╦╛▄àò╡▓╜    º√╚!!3@;╕φ|bàVR+z^&O╫ÅNc4╖tV*ªó'≤╩C Φñ╛Ö∙╬ àqh ╬┤hr⌐└╓\F╒ûf»D│=ÿ∩Y+Φjÿ₧MöG4½    *╓£âµ▐⌐eëÜ█ÿyεßVVúmoç² £▓5è+F╨Ü│>!!φ╩hé^¬Vú£┘4áεóúáVµÖ
  12931. 5½áΦWBvCY& ïΓ>uJBôWàÅ¡_-.BE╔äu╦]Bé ï°≈!!Θ╡àù┌.ⁿú─╦_w\n╓Φd╕∞)╙hWΩFîä₧Å╓Fƒ╙╫╝╝p±+⌐+à¡╕═S)B    Mg▒&▌ÜG ét┼ƒ DNe╞reÇ·<φ NÆΓº"?F>▀╚╫╦W»σj╝┐DÉæ┼╧ex╧αmC0₧h═╗╔£c╞╙╧÷ΩÖ┘^à╖ìQ^~αÇ╧┬>Ñ8& û╘!
  12932.  
  12933. ΣH ¿½7*¿░£>▀∞ö ▐≈┴▐┴╗┘áJ ½╥reIB╫»;K·5-hOU@|
  12934. Σ┴
  12935. Qcfj»{Rgúº`■█A▒ºúù°┴\æ4Jk ▌╡{7áë═\[åö5╗P┐sùAΦYJI?ΦrÜ╨îP}║(╓╥╚≤╒ε3╩`⌡÷∙ε≡FΓpJj┬≈s┘ƒM⌠*îC╖|Ü=!!úÜ8╥Pg╓>Ñ┘¿Am≤¿±∞≤µÖ
  12936. 5¿áΦWBuT\g&ï!!µpbJS╞╔_τ╦0j|Üæ=éLé⌡·╜σ!!≡▓ê▀₧p╪ëáÅ_jK╡j²qtτ¿)╞bN■û╧■Σ▓"≥╫à╝┤p╗╗sö⌐ò╡sD)[    0▒6ç¡m7▀Y⌡#╡qSQ#▄= ₧■9σJ!!O╔æµP?`
  12937.     >╟@₧┬ÖC\└Γ!!φ┐Q▀ì┼Äl0
  12938. Aî¥Nj8╤6╩╗╩┴N¡«½÷Ü┼ª5⌡J│─ d│ùâï.╛cUⁿ░ΩÄ╒`═┌<τŬ@Σ≥íiåhmMàôª╔»Zµ╬âFÖ█F╖b_Rε├╬¼C╕¥·Sⁿε'lê┘e!
  12939.  
  12940. ΣH ¿¬<*¿░£>▀∞ö ┘ⁿ█╓╓ò≈╝    »«┬wzK}╫¥~?²6 `HDn╢ò\&Cñ}^k«δ%⌠▌P╕ú╛æ∙Å╫`V.g╙¬h<ε─┼J[öûV`╜J╕z╨⌠T1≈aæ₧IÄKb¡9ôÖ╞∩éαΓd½ôû<╝°AE╢eJpç÷s╫╠µOo═M╚Ωmn ç~═W|Ç3░╬äA4║á∞√τ║τ:±≡■J)RG&*╟DízZ%9╒W▌Q¢ß@-;GÜô<╦[Bö░─°α Ä╙æì└c⌡≤▄ ├ 4 ⁿz⌡gK¼▄⌐|╢[▐æåî╙Aÿ²└ τ3╡eσ}¿ìæ╪Z4\?²>É▄(|╤ ùG═/    ∩y ╫ªu≤'P┴í─R(zLk─╓£┤.oïúw≈∞Lôô▀U█!!9YN╟Γ~C.ö`æ╗╓╫╕ê≡╕╧ä╞╩αëJR~αâ┴~íC┐q&Bª■ú╦╔91·≡E╬ßÖPÑ╩≥.ì0'`φ║|ò)ê╗w£╩╫=π≥.ñb_ε├╬¿@╕√╩~¥Ω oê▌f|~Ωñ╡íⁿp8-┬`kÉ∙« U╩Çñ▄⌠Å)C╢åsYªC^╙╠g░fδ┴╢τ¥6╖\╩£∙à▓▄,O[╫>NK≤6Åæ⌐.░█▄╔▀A k₧?·╬δb{⌠"Ƽ(fΓƒ╜wêâèR┤v$▌#.Θù╛╠~╦1$2ª⌐≈}#╨k3'8¼=■%≤ⁿ╫$;─└∩╧(┬ë╣╓kL ╖jL≥:╣8$]:╢BΦΘ┌nj[╒65╒E╚úS
  12941. ÅùÖüé;~$N!!₧ë┬²═ëT¬kä¬6ü⌡╜JªQqbíú»J╝¥╗óÖ╕pu`╧1=²æ:q½┴@≈²⌐ïIü╘L!
  12942.  
  12943. µA)'9░è<╢Ѻ/£ Σ└éªùò°╨░≈╖RW║√┴uwW▄ù)WàEje^J+≤ò^_i4çOr$Γƒ( ₧P╗ó╗è╖╞^û4NgrÜ⌠1"╝└╓X\ÉVÿl≡ªhÆ⌡R=°:╓ɱ(ë?█╥╚≤╒αz¢M₧ò╙}╝≡N¡fJ}ì·!!₧╙^⌡F*îV╘÷*dδ╘6évf┼í╬èRuº½╕⌡σΦ²s±≡■J)RG&*╟Qú8t@▄┴ëßVc9!!░Φ&ÿJå╝æ⌐░!!π÷┴╘╙p⌡╫┴ Å> «<±gKó│lÇ~N■▐ò£╬═Mÿ┘╫Γ╝|·z¡s┬½╕╟S
  12944. )NM}ⁿ"Çπmnö1Å╟XRG`öet═∩:úgO5╪░ΩA44^Ym┘█▌╫AFå±S'≈∙FìÆûI┘l,XE╨░7
  12945. :ƒmâε╩╫@┴╨ÿ█íΓσPê]·─nS=αòè╬8¼vo⌡■│╧╦eûæ)τ¢ YΣφ≥$å0u`φ╛ò\┘µ%â▓¡üê│x@äΘ┐ü0æ∞²T ÇX    ⌠ñO>yΩτ▌╟ôYVA─?9┴ú╞a9╥τ∞Eë÷╥(╦╠sR╡n3¿╤aX¬=MΩ╫«»░1┤$π»═┴ª╧SLÖw XæRΓ╢¡-φ█û∙U▒:FëR.₧╢å&fx~─ Æ╥L2Oÿéδ1ÿΘσ5╪L┴|E╝└αú°~lH⌠┤±V&wì\5hZ¿Eä}Θ√╩w5█å⌐½P╕⌠₧╥6─9╝NiΘFK7\╤/╖▐≡mXé}«jæ├T    ÅΘ∙ⁿé"2\5Iε1åæ⌐·ú-âΣ╢d¢σΓg█1g*╝Σ²N⌡êºó╙┐pu`ÿ0*;⌠╥:.â╟«╝N╖û¢äÖ₧Jé▀∩╘n∙r}╙'
  12946. ¢├.:╙!
  12947.  
  12948. µA)'9░è,úÄ₧%É/î╛åÄ┘╥╤╨¼≤▒V╛╡─;rFE┼ü,ûT+|OZj╢è@&5J╖<Ue░δ╔  @£┐▓▐σ╩ ¢`    } █▓-3╝█┴@Ü╙}╝F│=£εVJI1∩pÜ┘\ÄQ╞i├▐â⌡Çαt╡M₧òù< » Fº hçδs╪╨MºB=╔^╬²*!!≥┬aéQk╘,±╚ïE`≤»Ω√áá⌡rY╜á░rCP&3╬±%a_╧W╪Å│J#Q)%╖δFÑUô¬æô∙xñ╜ä├ƒ,┤≈└┴E4
  12949. C¿}≈
  12950. 4Lφ╝lÇyRß╨┴╤π╡%±┐┘ªS╒4èj∩7÷ºΘƒ
  12951. lW    :▒?╙δ@°%╛@█(@Lg╡ :╨╗&µ#╧ºßR#;^O╫┌Γù)lφë5;≈Ñ▀ä╛I┌9^D"é÷-.à"·æ▒┬N÷τ▒ºΩà╧o¥Vñ╖W0·╥▌]ª@─g~╗ΣφÄì/1┌┌}ε╚┐Ωöæ@ï*jM╒¥xû)óµw╓·²GÅùAπ*    É¼²ü!!æΣƒd╓éRí╣`~ΩΣûïÆY ¢k╫┐╩F9 ╥δO╞ªºa°üs¿etδπ:%ÇV.æ··└╧I▄,πΓÖò⌐ç_V╬mS─≈╕╫NΓ┴îúx▄!
  12952.  
  12953. µA)'9░è,úÜë>ú0≤≤²├δ╟àò┐╒╖\V»Ü╥irQ;╕φ|uÆQA8oOV+°à^Xh5XªnkΓá%π₧Q╝≈▒æσÅ8-╢:4feÜ«h!!╗┼╘AåVÆ5»Qñ|ëA┤_≈eï█ùGm≥\,╞É╧ ╧αxì┴╥▌<M├¢:.╦|Jj┬ s┘ƒGºXo╨2░{ÖDq╣¥%éCI╥0ñ╠óVf▓╖╕°Θ╗α.1╙ëúJX8T,t=¢┬"pV┌╬äÑV*KÜ█r╦[%ä ─¿▌s÷╗ÿìÄ6╝±═GóoZa{ⁿ&íOgZε╖)╬hC°4ƒÅùü╥═åïï(¥ pα6í └δ■ƒG`\}÷wç°w%ëtÆA█BR-δ
  12954. τÆ ┬7]╤Γ°^%2Yfû╫╞╤FÖÄ6!
  12955.  
  12956. µA)'9░è(┤¡╝G∩VúΣ²┼Φ╓╦╨■┐σtF▒╛╥zgM╞î;âHKjgUW~ΓôXjkH▒}WoΓ╗2≤╙GΣ≈ª▐┐₧JN┌vW})Ü╜c6ε┘Ç└G┴[wºW =₧∙UJxî÷╩V▄@aÑ 8ôôâ²╔╣3¢ï╒╙]╜µRVΓt~┬ε!!╠▐Fº    >Ç╩Z│>(╡ço╩G|┼ó£èW4ºª²╛≤¡≡ H▒ߪJwIXKq:ç    δW!!1":á├╩▒z9QIÜé=Ä[ô⌠ƒ°╚iφ⌐┴▐ƒ;▒ú└Å 8░pσOpV±▓h╥i^ΦJ▐âå܃KÜ╪àΣG┤#┐oí'╩ºε┌OoVF]5⌠w■¥Dnö-▀I┌DPbÆioâ╗%±&Y█▒»^7zNm▀█╓ùkΩÄ6C½┐Y╜£ïT₧$9\F%╒      Öiº╗█┌ó▒╥╣▐à▀Ç5╩φUt-┤ü╧Iûj╛gj╗╡╡╫÷+cÆö+│Ç╛=SáⁿΦ æEtwÄ╔╝Oƒí'╠«│êÆS░zrjΩíª═/στƒ
  12957. Ö│B╤⌠U9d°┤╩╩£
  12958. T@■5qǺßC(╪Ç│
  12959. ═¿±+í╘&π;»╨`░fΦµ│⌡╬Æzπñ╞╤∩░u/g═v^ú±≡╔K▐ë┘íO÷E#k≡2}:╫╖úfS┐"ì╓M'/╦äº$ÿ≥ìQ┤v$╞X`╜╚ôⁿJ₧b{cα√πCr2ÿO.xyS╦+▄+─╦■^W█å⌡ ╕┴▐╗~ ìqXΦ ├<']Bƒqñ≤ë_    5¡P╜k ╞├T    ÅùΣ Θ0N6⌡xà½╡ª≈gâSú╧¿╠Ü)îb.b▓Ä╫0ò⌡¼╕
  12960. û╢MQd¢NJF╟ï::ΓüUCß┴⌐èM▐á\¢Æ╩Φ┼~0¬v╩4}╙(C_▌ε`>╨π╡ß║*╖OK{HÑèº╣▓W≡╦'-zS±z╬`c╙àσ½'C/i²∙╧∞/G╚äRdç╣τ⌡TÖó╗H▌LWΘæV╪Æ≡Ö┼█▐y5    ;?`α¿╛aπ τ▄êàöNß╨ⁿuå╠φç}╖¼¬╛≈¥ +│┘½q╥j½√╓ΩH┼÷^π^uφJ[ 3V╣åUï$u╪EC1òÆP¥;n≡δ┌xεP╛=⌐ ▒v╠z*Iεƒπ ó
  12961. ⁿ├z ╙Σ╗eL*²l~╥ⁿ5ù*╤J⌐=│«╡Kpîú▓╫pε(█HΦ▀Å(/┌^zñ1α²φGÉIí 4ç3 x,YN╦┬=┤║e└W½üzç]öïδKƒτö; ╖∞¥Cö¿säô░X»ùIαôfGíZW8∙║δ╣▐╫ò1╞╬"┌·╖┐┘éû<φú<α∩ÉΩ¥x5=├    ├KHéêß╠°╘}ß.░Eìä)[àÇ╟X┐┐╫≈▐-╒Ñ!
  12962.  
  12963. µA)'9░è(┤¡â'⌐:∩╙√─ñù▌▄¬▐á]D½│Çh)EÆèdÖ)@cyαÇ
  12964. \&kér@}º╣`√₧Pª│╕ô╖┴    òqL@afÜ╛d&é╠╬^\¥Væa╜▒x₧εP[ <íqî╫W¢`ñ|└ù└π▐Ñ3Ç îô╙}⌐■EM╢h5└éY│╡6√<─^ܵ9!!·╚m╠V.┼'Ñ╬éf}º╜╕Γìl┴τh]∙║∩J1`E@cÅδ6<v@B└┼╩»\zr.&│Ä:ƒX╦░ü÷æ ì╣Ä╪ö*⌡╣öI═ #'╗h⌠O;óα?É#6åo¢Öç£▐jÆ┬╓ª⌐R2│═6╦α∞╫Z )F( #╙╜m4╟d╓▓r(#Æo:═°:÷11ó╦åS>`
  12965. t┐s╖ΘâOF£ú1@▐û â╒ë┬AR9)x╘░~^}édû╗╨╙ñô ó╬î╬M╞│─*α┘╧àG╟ q≡■φÄ╞0dÖÄl«Ä─Fíú╗ò*jMæôX╝Åíi╥τ╕L₧ëFü1 ├⌡√ü,╔Σé?┤Ä^¿ëA    N├¥▒─Çùz$╒úâH5▀∩∞▄«è)@½╚ß( α₧%║{╕╧≤▄ô6╖\¥·àò!
  12966.  
  12967. µA)'9░è(┤¡╜G∩VúΣ²┼Φ╓╦╨■┐σtF▒╛╥zgM╙─o╟F#zAj≥Äu#Jº<@*úÑ$║▀L@í╣│ïΣ█ûx|a▐╣-"╝└═\äX╤{├)▀a╨    ²BG *íx≥┤0öCgñ.ô╚₧╢ Ñp¥Ü│ÆoŲPK░isÅ»=█╚è+F≈K╚÷!!ε╧q╬GZ╥*┤å├)┌╟æ┼ⁿF╗┤sl╡⌡í% `@KwrÆgë~Y\ôJìÅ¡_-2FT╬│.à^¢íçΦ▓ Ä╙Φñë╣÷┌&┴wQOC»<╖O%Å█⌐H▄
  12968. ïÆ╝Ç┌ô▀┬ε`²pΣ+░eòº±┘.T|J\    Γ2ƒ±mwö9₧G╤DP9╞sPüε&╠ ┼¡δqrYl╫═╫▌p    ┌ú|τ╢t╤°⌡.╖E-Lé╕,.Öià╗╨╙ñô ó╬î╬M╞│═T-┤¬Çæjσjg ≤╗óÄ═>bƒ│"│ì≈Q■╣ΦÅUcéÜ[æ*≡ê^¥ττ    ╩Äí1 /æ≤τëaÇ░Æ7é┤BτáU$u ¡æïùEk╪`kæ■ì'Vó⌐ùÅπÉo½╧τ,5╕╥mx°2I²₧·≡ö╘3ùτàä√¥$x}╦vB▐K∩∞╚V∙██¡╛r    ñf!
  12969.  
  12970. ΦJ.9¬ï=$αΘ₧+ï;ε┘╞┬Ω╥╪╨¼ƒ╧:Å⌐╔mr\SÆ╔~{ÖVP#oWZq
  12971. ╢ò\&2Gª<@oí╛2 ₧Pª│╕ô╖┴    òqL@ie╘╣3║╞╥_£¢VaªF÷zÖ∙_9φqÜɱ(ÿ9ôô╤±┘¡vå▀ê¢só⌡Fº  ;Æα ╫╦V±Do┼Q╬⌠(s╣╚~éW~Ç+╛£╓&≤¼±Ω≤F½ⁿoO╝ε≥kBZj+╬∞W1g@Y═W▐çñVc9.&│â*éT╓±╙┤∙!!≡╡┴▌ê;▒Ω╩Å?R╣mΘ
  12972. z\τ±f╞-IφÜÄ₧╬╔Iù├└⌡≤>┐yα'└π╢▓p+&(F)⌠m╙├%`╤&₧@█Ldâneƒ·!!∞eQ▌▒√3?
  12973. p▀╫╙╒Màτ(▓∙FìÉ▀@█"=BA╦■#C<╤gÆΓÿ┴ ╕·■ñïÿ┬XÆY┤æWSjα σz°#¬lg ε¼╡Ä╙:c₧£%ñëΣ]¬╣ &åS09ôô∙QîΦ%ëτ┤ZâÅNó4é╜«╬'æ û~éÅOF≤╡`+º┤▀╬¢CE▐59Ä⌡« Qí⌐∞KÆΓ»lGª£iU¿b¿√Rk╬fá¥π╣ z∙à╨┴╤≥ÅJ ÅG]╠y╖▐ÉA╛╬₧≈Eτf    B█RH/â¡âdK½f█¼(}àâ╠2┴«║f¥L█}a┤≡▌▓┘tl!!ï╤!
  12974.  
  12975. ΦJ.9¬ï=$£╗â'░,Σ╞éªùò∩╟╖ΣñGF ÷ÇZ`C╞î;éLA8.O\+∩ægfC¼rT*░¬.■╤O@╗úÑù∙╚\Öp}eÜ¿e7ε█┼J]Ö╙zεP│xöAΦYJI+Σgè╠\▄Puó3▐╥═π┴óvÜMÿ₧¥y»σXV∞"g∩àZ┬ƒLºJo▀M┘?²)dßçd»(¬Vó£┘4≤µ╠≈φΦ∙i_½∩íjHQ(j=ì╒<dJ╦┘>ÿ√<uH╙Æ?ç[ÑΣ├▒≥f¬╫δñæ~∩╛ë%╬0;¿y√
  12976. f∞┤~Ü- FìêëïƒEÆ╪ƒªá[⌡?»^»Äδ═ogKQ}½j╙ºc√]ö▌UGPÅze═∩:╣Jt╩╗╡|k
  12977. qîZσê╨φë5C╝┐K₧åûD 8bIQ╥σ0Y}┘╫·╠êNΣ⌐π╡Γà╧Zä·┘E6ú╗ü╬2φ)&I▓≈≡═╩;tºò%⌐£═|╬É≡i┘0<M╠ô]╬Aùσ8üτ│Q¥█Iª  [├║ó─-ÿ╛╨~╘å
  12978. ΣúOe «²╠┬ÜPHè8"╘ñâX=┼─±GÆπÅz╧╢Z¿&=╜╓VA■{╕æδ│¥R█▒αò█ßµä$£U≥╦╚N■┴î»U╛!!N
  12979. ╗RRf┌Σ╫9Y/]├≡╥GiOéëε#Ω∩ε?╥òr ╘│!
  12980.  
  12981. ΦJ1'+íá4s·▒╠'è;╗ößîô╜╢ùÄα¼EB½╛Ç63iX┴ô;@╫KL/.R]}
  12982. ΣÆi ╗<^eª╛,∩═µ≈âû÷█\ä8feÜ╡c&½╬┼KîVÇvªóuæ╝WIrí}╓₧eáz∞    /ô├ì╢í╩¬ïô╙dO» S¼ næ√s▄┌≈N<┼K╙÷a!!°╔|éKzÇ6ó£éWgªú²·áá⌡tíáεJ %G[&&å ≈W(1N^═W├Qï│\-5MX▀å*ÖIL╘¥╗╒ûª₧ä┘¢7╣≡ôI·2K ╣<∙`Z∞╡l─-~∙Æêùï▐F█╫╔ßMµ$▓f¡s÷Σ≡╤Ol]J    -┐w┴úz+╙Y⌡#╡q]u╞u å╗ ▓J0ê╖╝%k
  12983. ,ûìÆ┼)lΘ½Djδó    ╧╒ÉUäl^Mƒ░t>t╤eæ╧╩╟ ÷·╩Ñ╬ç═ÖJ▓ïW dτè╧┼.φl&ε¡ñÄ╟:1Éê)ª£⌡FQ░±·'├Zu%└ε[æ*≡∙w╥·²Z╩ÆAù*
  12984. ┘Θ£╥,▌÷╨;äòE╗⌠H|dºß╦▀╒Tûz%çèì'Vó╓╛┴ªä'/╚╡&H▓st┤É"â0óÖ·▒ô6╖\ÿφ╨ä╖╪]╫`TÑRª²╓B¬Ü┬áO÷\B╟¬Ö┬½Vï╘GL/bßεÄ^π¼σ7╘D█xz╝Ö╨⌐╙~p/α║τRs%Ö5{
  12985. F╥ »├╚■^5ê£≥ΓIδ½Éε!!2`φ
  12986. "Θ ⌠[tQ╓?╩╗ôxkⁿ≥uß╟Wvªñ¡¿ ÿXc}/A±e╦╪≡_¥¡P⌐k°≤,¢°│véUK[«úτ╝╠ßò:óπN_S¼g6aæΓr≤ò_G≈Ω╙ΦzUë╘╙╫K╩╚∩F«uσ{}X╬pHr½Ωg>L╙¥╬«┤*í\BsHÑèº┘▌
  12987. ï╖KAh<è│(wî┴σ ε&VTg¿╗¡Ω?Pÿº/Vgç╣τòA≈≡╙x⌠HTΘæV╪J▌ßQì⌡6ºµP 51W╫ü└H┴%·Å─_∞├TçR»┤eï╠φç}╦ö·ñ≡╚╢+ⁿÉ≈Q▀o½»Rô¬éò0Å%* WφTCgC┐&ⁿT═aX !!bG2òδyÇa)óöôy²º ôπ½0╡!!Sq[╔¢Çd▐ ║å%]╗k═c└Vexüv¥╣-GΩjé╤[╪ª▒s{⌐┤L ┐@╟Q5b¬bò╗÷Z▐]zu╦ °¿Gìd▐3â0 x,%55»╛o▓Ω2φP¿ü┐tº┐┬6√α╙BBä┼σ:≤╤3@░║╠cêôJ₧≤Z⌐Z╙rü╠╜▐╫òL%æ¥kÆ┤·╝¬TªÆ?φ▐XÖ╞─≈ç0uΓ ⌐*H▀├ÿ₧UΓôs╟êb≤╛h▒⌐╨⌡▀┘Ö⌠I╫y¥UuÇ&>;Y⌡[∩╩Γùì&¬²▌LQv╖Ƭ┘=±Å8É#║▌▄1╦<Φ≡2┐$4 ¥║2qî9╟ROª2╨[«ΣY[of√░σ°║┼KÜAùf:╪vi╤├Æε₧≡/L┘₧Ω òR╜▒'╛≈TBÖ╥îò53┤┼Θ▐%╔t│a+÷g¼kΘ║Zvô)cB$
  12988. √+I@╗╤<ä▒f≡:┐φΩ╔>TOsè▒l°╒┘▒ï┘╣╡╒ï^¿σk₧]\■Σ#E£Ö⌐°╦°x.φóâ/¢¬║·F|x7╤'ín▒╞⌐δ┌äà÷SuáæY-┤ü<+-╩√û∩╢X╚«Iτ│Är≡-╨úφ6°P¬≥æn
  12989. XÄ╢▓■«δ╝S«²eLàäüQσ,₧á¡∩·_]Φ⌠₧OyNw,vjY0>I÷Wé    φ┐R·-y╠α5╢┘±▓║┼æΘ▄gπz·ìε2⌐0│─╧Eù-YYn▐─/▓▀∙âΣ¬Φ:√▐ÆJYJHA%%╬UæFªßºYA┘dÑöú╕╜²$╤`V╠í▄αKδ╠╜.²'*ä_\U3c₧é≈Ω3ösh▐Ñδdª⌡╤0ûσ≥Γ├¼╤gI«l╤TÇ^╦ôZ&Z¬o┐╘W╖╩è╝p╫)îÖ .ë\!
  12990.  
  12991. ΦW::Ñì>0è╗à'Çeí─»íö╛¥σ¼√│RW║√ì;RFE┼ü,âMQ/.RU+╢êv4F«y}½┐(║╚G▒≈┐ù≡╟\à{\li╓╡y+αë≤LK¥VÆV{╗N┤xéA⌡B7∞aï╫TÖQ4»0▀ù╟╢═«3σg÷▄Ür ╗ΓCV½a;à²2┌┌≈S&┴Z¥[╛,!!⌡╞j┼G.╬*╝▐åV4ºª∙Ωá╗┤sS∙σ¬`KPréΦ<hD╞W╧╩▒Kd1F ╬ë.ƒ é░╥╣≥ Ä╙Ç▐ë+╕µ═I█6R
  12992. ¿<² `Jπ╜e┘-R FÄôÜâ┌¥┘╫ªC°p¬yα0╤ε√▐yZY2Γ2Ç╣m√]½F╓ KnûleÇ■;≈ 1U╟¼»B"?YYj▐₧α╪FÄ«q#╗≤Lì╒₧K┘#*YT╧░l0>ÖbÆ≥▌└B∞¬┐÷Ü▐Æ╥═ε(<M╝╥å╬8¼vo⌡¡≡╚─<eÿêl╖Ñ∙Z╖╓⌡,├B0:Mòô    æ*≡Φ#ë╡╝@âöI░xE]├ⁿ≈Å@ô▐ƒ*ô▌
  12993. 2Θ▒O@ï┤╦█ÉV╧+>╔Ñ╞Y|òò«
  12994. ò≥Ö{C╢╒<√utë▌|F∩2AΩä⌐α─H¥`π⌠éäß╪II▐lNĪ¬û_¿÷ª╔▀jXÉXMfÆ¿ïe║kû╧VlÄä∞w▐ß≥{═_I▄og¬╨╤¬₧sg/τ√≈K};å*oC_└mÇ└ÆÜ62─÷╜½O«≤É╢|qê#&û,áSz&F┌q╣▐≡nXç[╣vÜ»*eª≥∙√ÿUlS]*I√}╤껡µ.â\¡≡.¼╧ÜNÑ ~#B≡╙»P±Ö╝╕
  12995. û╢4⌠ &=╝ÿho»╨/º╚VΣ┬Aï─π²7π∞£X╧Jπ!!0ÇpY[_≥Ä k[G░∙≡¿ºi½Z^[╟φ0Äé¢*û°(%uZ∩K╚_g╬┴∙>½
  12996. cMZ╗Φε±4Fσ┤2{>π╤é{¼U╩∩┼b░ *xâ∞e±JÆ╢Q╦Φf≥ï,fc"zφ╒Θ(«bα╙ü_±╕O▄┘║▄δåvφa╠à│φâN╤ºb°┐Γn─c≈√3φßH└δ_█._l╜#L_O│rò^█5Xπ>A@1■┬J╚rz²┼╒,óQüîΩ░1ñhs/qéΣ┼ óµΓ)]╖aäb╒VeS╣^8╘Ω╥m»╥?±⌡Ωyæ╕¬┴á=∙b╔ΣªSG║$û
  12997. ¿¿ΩT₧Ií ╧IàW$>5σ╬&¿«o»4─¿,Sπt╖ó╩p╢Γ£&;Φ¿╕!!ñüqS¡√╫5å≤`■ë2@ 8∙┴┬è-≈î²Vs▐╩v▄ÑαΓëSѬÉ┼╔Åè»╒$I2råZ¡)4σç═ÖU¢¬T├┌Q{º±_åÇ¡q∙óû┤ö&F─:ùV|èD:Oª╤ƒ¡║6ñ■ ²Ω{(pY▒₧╛╚beñ█4┬h÷Æô~äNΩΦ/Ñ:w6ü╢::íF²{/┐2Åδ║U[of√orñ╒╥└√ëP║PÑN@╖╕┌»<ÿº5Pÿτ╥X╡{╒╓J≡╕5R┤µÑ¼ag¥╗∞╪-û▒B    ▀c»Å╞mgαl    Y<^√6ûµVú╔GO├─√╖£yxK⌠y╥Φ╣┘ⁿ▐Éá[b∙Öî
  12998. ╝╚hΓfu═╨XJÄäñ¼É░!!bR²½âN°∞«Ñ4mδ+g─σàF■ªÅ√¿±Puáæ'?²╨y%1    à¿╘ï┌q╠ⁿbé╒Φ ╣<∞╕⌠,¼8Θú─2Lß∩b╥Üûσïd?ü·!!    µ(«■xìK≤ôΣ╥>⌐░ε╦I  ~"&VDgóDé8╟╘{ÜXÅ╡j▒┘+║▓¡╪╟┤┤îSü¥▒s·c≈äe┬Sα#.s
  12999. S─▐b╧èí┼└ó≡÷ì╘e= B[JÜ}■;▓╒ÑBì&╝Æ9ª┤∙w═Σ:)│═g═░ÑP¢╜-°?YÿSIUzx╒▄Æü'┼?,▐Σ╣d¡╓Æ!
  13000.  
  13001. ΩA>)!!*íü5=▓─µC╟∩╟°╔∞ù╦▌╗▓íVE╛«╠o3CS╦─-FàZJ-zSb╢âMud"╔9£ⁿvó!
  13002.  
  13003. φK 53Ñ¥5,⌐╜╝%Æ:≤√Θ°Θ╪√▄¿√íZM╕ßÇzCGE█É7DÆvJ>k\Vyb£Φ\it/YóhV*∩δ⌠═U║≈úû≥ÅäqR.l╒╗-=¿ë╘QM╒Ær½Pó=ÇδT]I7τ$ï╔V▄V|¡|╫¢╒ ╚Ñ`╚ù₧╙{╕⌠Y½n~àΩ!!Ƀ2ì(    ├MÜδ,lΘ╦}Äz╚:±╨éVs╢╜∞╛≡    ┐±r╢µ≥jAg&╬Ω9uJCëEÖQâ▓5p[╥Ä<ÄÖ≈æ║²rß≈╙ìô-⌡░çIóo^/C¿t⌡4ZΣ╖`├d^ΓÆÿ╙ï╔Mòû╥εG·R$▓ní4╠±²╤ZH|BL/▒>Ç╖,%¥5ìI┌XHLwâgeƒ╡u┬6I┼º»C9;^Yj▐₧╒╨RÄúU$ú·NÜç▀N═lf_Ç¥Nj╡eÉ≥╠╙ƒ│÷╕╩ƒ▐MÖy¼âJD-┤ÜéS┼/║"jΘ╣╡▌╤~ǃ>êÄ─CÇ≡φ çI~0W╟¢F«╙íd┼σ╨>τ±.┐x    äá│Φ'╒⌡ê~åê]≤⌠ $8╟₧▒╧£XPπ4/┼»âaïê»
  13004. êΘ╞)CÆ╙ ⁿ'"┐≈z\∩<AΩä╛Φ┌R╔¬∩ò╚ß┘RY┌pTÑ∩╕▄^δ½├╖ó!!_░UR#ÉíÉ(
  13005. Iεk╨ü\K/_╢╔è]▒■∩,╪Å$.±▌┌í╩Xpkπúñ <f├p=¿EäaΘ√╩w?°╔╝½Vó÷╒ûaKâfY╝Dn≤J=T╓?╨╜₧{╤55ç|_ç¬:]ªΘ°ß▌|k]"╖Jⁿ≥╘g░∞*╞¡°1ü╡ⁿ0╔*3i¡¡╨3ò⌡½╕
  13006. û╢_ °3'⌡Än<ΓÿT'∙æ3╫╝SQ╘âK£·4!
  13007.  
  13008. ∩A?9¬ï=$δ ▄G∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3I▄ü)^ÄC/`^Aj≤à^0víuG*░¬.■╤O@ªó║£≥▌\Ö4Jk ╚╜c5½ë√█^┴($°÷0╨P╡ldRêPì╟¥EuÑ|┌£âΓ─Ñ3ìïëûq
  13009. óΦQ¼lpçπ*₧▄WµO,╔╬≥9!!π┬j═g╙┤╥ÇKa╜║²∞σµ╢6╘è█BwCFj&╬Ä}YcJC▄┘Q╨ⁿ=r.&│║=ÄIÜΣæσ╝1┘·û┼ô2░╫█╩_w0i╒ε
  13010. gJεÑ)Ü0▀¥öüï≈Iê▐ΣΩE√9«c∞s╦Γ∩ƒGzG/G)⌠0ûσw%â5æJ⌠X ∞        ƒ·;τ!! Eê°▓#;DU╙₧ÖÖVô÷P>≈┤    ╬¿╤*┤ER╤σ(P√!
  13011.  
  13012. ≤E.    0bΣùr=╡≤╠3┼2ε╨╡î≡║╡╝ⁿ┬╖ZU╛»┼;>w▄ù)Wà bvAjσämi|║5V₧δ.│₧D║≈╛Éπ╩àg" ├ⁿl<¬ë╬ùçVvíNªhä°J>Φgû█WêNm∞4╓£âεÇαj─M₧òù<ε≡EAΓvi¢»^┤╢SµS(╔╩α$u≡╤}éK`╘:╢┘æW:≤êΩ±φF¢≈hR╝Θ╖N%VK4f┌DízZ%9╒W▐Q₧ßL- .&│Æo╤B╟╛╝╥òuñα▄ìép╪ëáÅ_jK M╤ò4a┐±9²-LΣÆä╡Å╙[₧îà▌/₧{Y»+Σ%└Θ╕╓`hCLg▒ ■¥D °'▀éXR)╞t.αæ\èc6û »Yq3L-l├äÆΓWF┌╛9▓≤O▀çÜJ▀%6TEÿ░7C0₧h═╗╓∩3Γ╫¢▀óƒï┴┤─0ε σzó>φ<;X⌡■╣╚±-dÆ└l££░LΣΩ■%àb2å┌°Eï╗wÿτ░[Ä┴¡QmΘ└╬╘iï¡╨+╓àC╥╝b0≡┤òÜ¿W<.úk╙┌⌐!
  13013.  
  13014. ≤A*<6áè s·▒╠'è;╗ö÷íö╛¥σ¼√│RW║√ì;RFE┼ü,âWAj|^^j°àK&)IπxZ|½»)⌠┘Φ╡«▐εâ\    ƒqL.xÜ╜c6ε╨ÇXZÉVæaª█∙εVJI(εwû╩PèG4Ñ(╓ò╞Σ▀α|ÄM₧Å╙p
  13015. »ΓC╢w;åµ4╫╦L⌐,Eí5│"√$r╣╨y╤a╥6╢╒ìEx┐╖╕²∩¡≡ ░ε≥9pCT&&üJ≡5tK▄ìéño=PE┘┴èHô┘▀¼∙fß¿┴╔ô(╝τ╠dÑl>R0¡i∙óòf╠}Sσ┘Æ╙ó▐Z£╙∞ΦV±5¿+≥&╒≈≈═`\FO<Γ#╙≥#jä3ù╠Uf╞ju₧∩u÷ ▄¬µDx's╝sα╩ÖVì╣3┌ò!
  13016.  
  13017. ≥M 4,▒¥7╡Üÿ8î1µÄ»══▐╪█┐µ░AF╥╤⌐9CZ_─à*W╫ `HDn╢Ç^Jr4F¡{xº╗2 ═G╝╢úù°┴\æ4Jk ▌╡{7áë╙PO¢çg½÷·h╚YFx≥pì╫W¢w¡|╤ùâµ═▓`ì    ▀ÄÇu⌐▒CLº oɵ=┘δP╘H(┬^╬ß(;╣╩}╓Ja─q≤▒Θ)┌▓╕φá¡∞ @╘è█B?<t;Ü╨"tN]ë├K╩Θjy.JB▌┴!!ÄMX╓óüΦ¼(¬╫δñë~╗µ╤ #*µ<╗4Pl├±m╔jR°Æ┴Çç╪FÜ┬╨⌠G┤U~╫ê;└ ╕àGh|N3≡#åσ(%ù=ì]╦XIG{╚
  13018. ΣΦuφ=H°╖√v=6Y6▐╞Æ┌KÖ┼N%║Ñ    ╦╒ïHäl0UXQ╤∙>t▀²Æ╦Æ╝╗≥│àµí6ö]╕─ dííå┼+╣wt╗¡╡═╩1u╫Æ)┐╞¥>x╖╣⌡,¢T@"ª▀ª╤Θ2öτ╛[Üéa▒7Z├²τ╒&ï░ÿ;Ä╟Y√▒F*I└¥╦ï¢IP·/?ß╗╧|î²╣±î⌡W▒£0µ:1┤╩g%Ç!
  13019.  
  13020. ≥P5;?ÉÇ ╜ºì>É-ΣÄ»══├═▄░⌡╚9*²ï╥reIB╫─s╢QW=kI≤┴Pa(N╖iAoΓ╕4⌡╠GΦ╛╣▐π╟^É}H` ╔¿;á╬Äi╒Ü{»WúoòA∩E]6µ$ù▀J▄V|⌐@:▄Ç╬≈╪·Γd÷█╘G+¥╨@½goâπs═╓XΘ@;┘M▀V»??╣¢k£)¡U╪╦ïAf╢εñ∞╛F⌐·dσ≤∞JwCg ëú?bFD└╚Qâ»Mh;F^╔┴=ÄJôπ╘╢Φdα·â╘┌-í±└╚wC┤yΣpZß╕d┴aΦÖêç¥æ
  13021. ÷╝¿î+ΦR ¿nτ:▌ºδ╦ChBF[}ΓwÅÜG ü&ÜH╓>╞'[⌐╚ú,[┴╢ε[q)Cp╫╦└▄A╬Ä6C ■zïçûI┘l:UG╠π
  13022. )Ö6╫δ╩╫Ñó╕÷┬ìφ^ÉKÑ▐m7Ñ₧ëS╬8┐mtB╗∙▓╧┴b₧¥"ª£σFΣΘΘ,àIhp0╔╛òSì≤2쬲╫█uª9ù╗ó└$æ ₧d╓åy≤╜cj╟₧▒╪ü TE╟z;╧ñ╩^5─╬ñ
  13023. î⌠ÖoK║£ ≥+z╫┤Z¬a╕φ┤⌡╪\╪'πτòÇÑ√IQâ$OîYτ⌡ÇUεÆ╘■Uτ~o≤2U2àíâeK╢v╫¼(|O╤┌º╓·σ<╪╟|o╜ ┴⌐ä1m{⌠╛σK<%ïJ3eöyú├╚⌐w┌╘«╗╝Θ─╖5─tBΦM ΘF#^!
  13024.  
  13025. ≈A53!!ùå5'╗╜Ö8Çeí╒▄┼∙┘▐┴½αáL╣û┼h`IQ╫¼?Aƒ"oH[+πâPeJ║&z╖⌐,≤▌i▒┌▌≈╡εÇqL@zr╧╣-;¿ë╘QM╒ÜpáÑtù²EZ=ímî₧MöG4¡(█ù═Γ┼ú3¢ÿòÆh╝⌠Kñ sç»4╫╔ZΘ"╔L╔⌠(!!±╞k╩ .¡U╪ΦïE`≤ºδ▓á«┤tT╝áíkGAt7╬÷$1GQ▀ìÅñW-?LA╩ö;Ä^Bâπ╪╢√!!≡▓äìè,╝⌡╚╩E< C»yΦOwP≡úl╙}TΓùÅö╬╦G█╗»ÅJ±R7│}Σ=à≈φ▌OjL$┐wº (%ü!!¥B╓Ifƒ i₧╗4φJ$N┌ú÷><
  13026. q├₧▐╪VàúU$ú·NÜçî₧d(Ä░#O}ê%┘╣╡╕c╞╙φ÷█╦┌¢╣─W7αà╧Üj╕0&½■ªÄ┘R■èl²╒░Dª⌡≥*¿Eiw Ä┴Φ⌠ï^¥ττ    ╩ïRí4¿¼╛ü:╘≤ƒ0Æ╔'lê│O>yΩΣ═╔ÖRo╧#k╘┐╩X8à¡ö#àª╞4▓╔1ß-┐╟4Nσ.V∞╠⌠î╖2╧u∙¿╨ÇÆ╘H]═q^▐Z∩Ω╙SXç±Ñ╖U∞u    ¬RA(û░ùzR»qìÅ/|G├òºiÿ╛⌐{▄IÅ9U½Öŵπ8>fα¥σJo2╨C
  13027. T─#■`ö∩╫w|┌├ѺA┐ó╜╒Bù#╝3ΘT@0    ƒΩ≤╞> ⌡U║^ä╜;:ª┼╬¿┘Vysi╖3â¥╖ ú≈«hÇ╚╓σ⌐zî+v.H╝Ω│O∙Ä╝²═¼] Iⁿ('u╝Ö4 ╚╝K≈ª■æM▌╘\ïÜ_âï½KÖ_2∙).
  13028. ╙zCVüÄc7|≈Öƒ╥≥8Σ=═∞lÄ┬▐3ÿ½@-f ú3╚S"╩╚¬+¬si^╫Ç√╡{°«'(Γ╓╬e¥N╨τ\û%⌠11'└φn±|╟┤Kù╕?≥²Ps&s<²·¿(╗I╡¥¥EÑîò╢┤}╣å┌7■<Z│»╙ΦφǺx√òσ"┼cá║▌πL▐ó«_F9φ@E)E│ ò¢5T╢*l:╝Åæh)Θç╛╟`P╕_²½░[╦! !
  13029.  
  13030. Disassembler comment:
  13031. ''!
  13032. !Disassembler class methodsFor!
  13033.  
  13034. disassemble: aCompiledMethod 
  13035.     "Answer a String containing a disassembly listing for aMethod."
  13036.  
  13037.     ^(self new)
  13038.         method: aCompiledMethod;
  13039.         disassemble!
  13040.  
  13041. disassemble: aSymbol in: aClass
  13042.     "Answer a String containing a disassembly of aClass' method with selector, aSymbol."
  13043.  
  13044.     ^self new
  13045.         method: (aClass compiledMethodAt: aSymbol);
  13046.         disassemble!
  13047.  
  13048. new
  13049.     ^self basicNew initialize! !
  13050.  
  13051. !Disassembler methodsFor!
  13052.  
  13053. blockCopy: extensionByte1 with: extensionByte2 with: extensionByte3
  13054.     "Private - Interpret a Block copy instruction."
  13055.     
  13056.     stream 
  13057.         nextPutAll: 'Block Copy, ';
  13058.         print: extensionByte1;
  13059.         nextPutAll: ' args, skip '.
  13060.     self printLongJumpOffset: extensionByte2 with: extensionByte3
  13061.  
  13062.  
  13063. !
  13064.  
  13065. break
  13066.     "Private - Interpret a debug break instruction."
  13067.  
  13068.     stream nextPutAll: '*Break'!
  13069.  
  13070. decrementStackTop
  13071.     "Private - Interpret a Decrement Stack Top instruction."
  13072.  
  13073.     stream nextPutAll: 'Decrement'!
  13074.  
  13075. disassemble
  13076.     "Append a text decoding of the method to aStream."
  13077.  
  13078.     interpreter reset.
  13079.     interpreter atEnd ifTrue: [^String new].
  13080.     stream reset.
  13081.     self disassembleUntil: [interpreter atEnd].
  13082.     ^self listing!
  13083.  
  13084. disassembleUntil: discriminator 
  13085.     
  13086.     [stream
  13087.         tab;
  13088.         print: interpreter ip;
  13089.         tab.
  13090.     interpreter interpretNext.
  13091.     discriminator value] 
  13092.             whileFalse: [stream cr]!
  13093.  
  13094. duplicateStackTop
  13095.     "Private - Interpret a duplicate stack top instruction."
  13096.  
  13097.     stream nextPutAll: 'Dup'!
  13098.  
  13099. exLongSend: extensionByte1 with: extensionByte2 with: extensionByte3
  13100.     "Private - Interpret an extended long send instruction."
  13101.  
  13102.     self printExLongPrefix.
  13103.     self printSendPrefix.
  13104.     self printSendSuffix: extensionByte2 + (extensionByte3 bitShift: 8) args: extensionByte1
  13105. !
  13106.  
  13107. exLongSupersend: extensionByte1 with: extensionByte2 with: extensionByte3
  13108.     "Private - Interpret an Extended Long Supersend instruction."
  13109.  
  13110.     self printExLongPrefix.
  13111.     self printSupersendPrefix.
  13112.     self printSendSuffix: extensionByte2 + (extensionByte3 bitShift: 8) args: extensionByte1
  13113. !
  13114.  
  13115. incrementStackTop
  13116.     "Private - Interpret an Increment Stack Top instruction."
  13117.  
  13118.     stream nextPutAll: 'Increment'!
  13119.  
  13120. initialize
  13121.     stream := String writeStream: 128!
  13122.  
  13123. instructionRuns
  13124.     "Private - Answer the default collection of instruction names (these are selectors
  13125.     sent to the client during interpretation)."
  13126.  
  13127.     ^self interpreterClass instructionRuns!
  13128.  
  13129. interpreter
  13130.     ^interpreter!
  13131.  
  13132. interpreter: aByteCodeInterpreter 
  13133.     interpreter := aByteCodeInterpreter!
  13134.  
  13135. interpreterClass
  13136.     "Answer the byte code interpreter class to use for driving the receiver."
  13137.  
  13138.     ^ByteCodeInterpreter!
  13139.  
  13140. isZero
  13141.     "Private - Interpret an IsZero instruction (compares for identity with SmallInteger zero)."
  13142.  
  13143.     stream nextPutAll: 'IsZero'!
  13144.  
  13145. listing
  13146.     ^stream contents!
  13147.  
  13148. longJump: extensionByte1 with: extensionByte2 
  13149.     "Private - Interpret a long jump instruction of the offset specified by the argument."
  13150.  
  13151.     stream nextPutAll: 'Long Jump '.
  13152.     self printLongJumpOffset: extensionByte1 with: extensionByte2!
  13153.  
  13154. longJumpIfFalse: extensionByte1 with: extensionByte2 
  13155.     "Private - Interpret a long jump instruction of the offset specified by the argument."
  13156.  
  13157.     stream nextPutAll: 'Long Jump If False '.
  13158.     self printLongJumpOffset: extensionByte1 with: extensionByte2!
  13159.  
  13160. longJumpIfTrue: extensionByte1 with: extensionByte2 
  13161.     "Private - Interpret a long jump instruction of the offset specified by the argument."
  13162.  
  13163.     stream nextPutAll: 'Long Jump If True '.
  13164.     self printLongJumpOffset: extensionByte1 with: extensionByte2!
  13165.  
  13166. longPopStoreStatic: byte1 with: byte2
  13167.     "Private - Interpret a Long Pop And Store Literal Variable instruction."
  13168.  
  13169.     self printPopStorePrefix.
  13170.     self printStaticSuffix: (byte2 * 256 + byte1)!
  13171.  
  13172. longPushConst: extensionByte1 with: extensionByte2
  13173.     "Private - Interpret a Long Push Const instruction."
  13174.  
  13175.     self printPushPrefix.
  13176.     self printConstSuffix: (extensionByte2 * 256 + extensionByte1)!
  13177.  
  13178. longPushImmediate: extensionByte1 with: extensionByte2
  13179.     "Private - Interpret a Push Immediate Word instruction."
  13180.  
  13181.     self printPushPrefix.
  13182.     stream print: (extensionByte2 >= 128 ifTrue: [ extensionByte2 - 256 ] ifFalse: [ extensionByte2 ])*256 + extensionByte1!
  13183.  
  13184. longPushStatic: extensionByte1 with: extensionByte2
  13185.     "Private - Interpret a Long Push Literal Variable instruction."
  13186.  
  13187.     self printPushPrefix.
  13188.     self printStaticSuffix: (extensionByte2 * 256 + extensionByte1)!
  13189.  
  13190. longSend: extensionByte1 with: extensionByte2
  13191.     "Private - Interpret a Long Send instruction."
  13192.  
  13193.     self printLongPrefix.
  13194.     self printSendPrefix.
  13195.     self printSendSuffix: extensionByte2 args: extensionByte1!
  13196.  
  13197. longStoreStatic: byte1 with: byte2
  13198.     "Private - Interpret a Long Store Literal Variable instruction."
  13199.  
  13200.     self printStorePrefix.
  13201.     self printStaticSuffix: byte2 * 256 + byte1!
  13202.  
  13203. longSupersend: extensionByte1 with: extensionByte2
  13204.     "Private - Interpret a Long Supersend instruction."
  13205.  
  13206.     self printLongPrefix.
  13207.     self printSupersendPrefix.
  13208.     self printSendSuffix: extensionByte2 args: extensionByte1!
  13209.  
  13210. method
  13211.     "Answer the <CompiledMethod> which the receiver is decoding."
  13212.  
  13213.     ^interpreter method!
  13214.  
  13215. method: aCompiledMethod 
  13216.     "Set the method to be decoded by the receiver to aCompiledMethod."
  13217.  
  13218.     self interpreter: (aCompiledMethod interpreterClass on: aCompiledMethod for: self)!
  13219.  
  13220. methodClass
  13221.     "Answer the class which the receivers method belongs to."
  13222.  
  13223.     ^self method methodClass!
  13224.  
  13225. nearJump: extensionByte1 
  13226.     "Private - Interpret a long jump instruction of the offset specified by the argument."
  13227.  
  13228.     stream nextPutAll: 'Near Jump '.
  13229.     self printNearJumpOffset: extensionByte1!
  13230.  
  13231. nearJumpIfFalse: extensionByte1 
  13232.     "Private - Interpret a long jump instruction of the offset specified by the argument."
  13233.  
  13234.     stream nextPutAll: 'Near Jump If False '.
  13235.     self printNearJumpOffset: extensionByte1!
  13236.  
  13237. nearJumpIfNil: extensionByte1 
  13238.     "Private - Interpret a long jump instruction of the offset specified by the argument."
  13239.  
  13240.     stream nextPutAll: 'Near Jump If Nil '.
  13241.     self printNearJumpOffset: extensionByte1!
  13242.  
  13243. nearJumpIfNotNil: extensionByte1 
  13244.     "Private - Interpret a long jump instruction of the offset specified by the argument."
  13245.  
  13246.     stream nextPutAll: 'Near Jump If Not Nil '.
  13247.     self printNearJumpOffset: extensionByte1!
  13248.  
  13249. nearJumpIfTrue: extensionByte1 
  13250.     "Private - Interpret a long jump instruction of the offset specified by the argument."
  13251.  
  13252.     stream nextPutAll: 'Near Jump If True '.
  13253.     self printNearJumpOffset: extensionByte1!
  13254.  
  13255. nop
  13256.     "Private - Interpret a Nop instruction."
  13257.  
  13258.     stream nextPutAll: 'Nop'!
  13259.  
  13260. popStackTop
  13261.     "Private - Interpret a Pop instruction."
  13262.  
  13263.     stream nextPutAll: 'Pop'!
  13264.  
  13265. popStoreInstVar: offset
  13266.     "Private - Interpret a Pop And Store Instance Variable instruction."
  13267.  
  13268.     self printPopStorePrefix.
  13269.     self printInstVarSuffix: offset!
  13270.  
  13271. popStoreStatic: offset
  13272.     "Private - Interpret a Pop And Store Literal Variable instruction."
  13273.  
  13274.     self printPopStorePrefix.
  13275.     self printStaticSuffix: offset!
  13276.  
  13277. popStoreTemp: offset
  13278.     "Private - Interpret a Pop And Store Instance Variable instruction."
  13279.  
  13280.     self printPopStorePrefix.
  13281.     self printTempSuffix: offset!
  13282.  
  13283. printConstSuffix: offset
  13284.     "Private - Append the literal constant access suffic to the stream."
  13285.  
  13286.     stream
  13287.         nextPutAll: 'Const['; 
  13288.         print: offset; nextPutAll: ']: ';
  13289.         print: (self method literalAt: offset+1)
  13290. !
  13291.  
  13292. printExLongPrefix
  13293.     "Private - Append the extra long instruction prefix to the stream"
  13294.  
  13295.     stream nextPutAll: 'Ex Long '!
  13296.  
  13297. printInstructionPreamble
  13298.     stream
  13299.         tab;
  13300.         print: interpreter ip;
  13301.         tab!
  13302.  
  13303. printInstVarSuffix: offset
  13304.     "Private - Append the instance variable access suffix to the stream."
  13305.  
  13306.     stream
  13307.         nextPutAll: 'Inst Var[';
  13308.         print: offset; nextPut: $];
  13309.         nextPutAll: ': ', (self method methodClass allInstVarNames at: offset+1 ifAbsent: [^self])
  13310. !
  13311.  
  13312. printJumpOffset: offset
  13313.     "Private - Append a jump offset and target to the stream."
  13314.  
  13315.     offset > 0 ifTrue: [ stream nextPut: $+ ].
  13316.     stream 
  13317.         print: offset;
  13318.         nextPutAll: ' to ';
  13319.         print: interpreter ip + offset
  13320. !
  13321.  
  13322. printJumpOffset: offsetInteger to: targetInteger 
  13323.     "Private - Append a jump offset and target to the stream."
  13324.  
  13325.     offsetInteger > 0 ifTrue: [stream nextPut: $+].
  13326.     stream
  13327.         print: offsetInteger;
  13328.         nextPutAll: ' to ';
  13329.         print: targetInteger!
  13330.  
  13331. printLongJumpOffset: extensionByte1 with: extensionByte2 
  13332.     "Private - Append the long jump offset specified by the arguments to the stream."
  13333.  
  13334.     | offset |
  13335.     offset := ByteCodeInterpreter decodeLongJump: extensionByte1 byte2: extensionByte2.
  13336.     "Note that the minimum offset is 3, since the jump is from the IP after decoding the instruction"
  13337.     self printJumpOffset: offset + 3 to: interpreter ip + offset!
  13338.  
  13339. printLongPrefix
  13340.     "Private - Append the long instruction prefix to the stream"
  13341.  
  13342.     stream nextPutAll: 'Long '!
  13343.  
  13344. printNearJumpOffset: extensionByte1 
  13345.     "Private - Append the near jump offset, extensionByte1, to the stream."
  13346.  
  13347.     | offset |
  13348.     offset := extensionByte1 >= 128 ifTrue: [extensionByte1 - 256] ifFalse: [extensionByte1].
  13349.     "Note that the minimum offset is 2, since the jump is from the IP after decoding the instruction"
  13350.     self printJumpOffset: offset + 2 to: interpreter ip + offset!
  13351.  
  13352. printPopStorePrefix
  13353.     "Private - Append the pop and store instruction prefix to the stream"
  13354.  
  13355.     stream nextPutAll: 'Pop Store '!
  13356.  
  13357. printPseudoSuffix: offset
  13358.     "Private - Append the pseudo variable access suffix to the stream."
  13359.  
  13360.     stream nextPutAll: (#('true' 'false' 'nil') at: offset+1)!
  13361.  
  13362. printPushPrefix
  13363.     "Private - Append the push instruction prefix to the stream"
  13364.  
  13365.     stream nextPutAll: 'Push '!
  13366.  
  13367. printReturnPrefix
  13368.     "Private - Append the return instruction prefix to the stream"
  13369.  
  13370.     stream nextPutAll: 'Return '!
  13371.  
  13372. printSendPrefix
  13373.     "Private - Append the send instruction prefix to the stream."
  13374.  
  13375.     stream nextPutAll: 'Send'!
  13376.  
  13377. printSendSuffix: extensionByte
  13378.     "Private - Append the suffix for a double byte send instruction."
  13379.  
  13380.     self printSendSuffix: (extensionByte bitAnd: 31) args: (extensionByte bitShift: -5)!
  13381.  
  13382. printSendSuffix: selectorIndex args: argCount
  13383.     "Private - Append the suffix for a double byte send instruction."
  13384.  
  13385.     | index |
  13386.     index := selectorIndex+1.
  13387.     stream
  13388.         nextPut: $[;
  13389.         display: index;
  13390.         nextPutAll: ']: ';
  13391.         print: (self method literalAt: index);
  13392.         nextPutAll: ' with '; 
  13393.         print: argCount;
  13394.         nextPutAll: ' args'!
  13395.  
  13396. printShortJumpOffset: offset
  13397.     "Private - Append a short jump offset to the stream."
  13398.  
  13399.     stream print: offset+2; nextPutAll: ' to '; print: interpreter ip+offset+1!
  13400.  
  13401. printShortPrefix
  13402.     "Private - Append the short push instruction prefix to the stream"
  13403.  
  13404.     "stream nextPutAll: 'Short '"!
  13405.  
  13406. printStaticSuffix: offset
  13407.     "Private - Append the literal variable access suffic to the stream."
  13408.  
  13409.     stream 
  13410.         nextPutAll: 'Static['; 
  13411.         print: offset; nextPutAll: ']: ';
  13412.         print: (self method literalAt: offset+1)!
  13413.  
  13414. printStorePrefix
  13415.     "Private - Append the store instruction prefix to the stream."
  13416.  
  13417.     stream nextPutAll: 'Store '!
  13418.  
  13419. printSupersendPrefix
  13420.     "Private - Append the supersend instruction prefix to the stream."
  13421.  
  13422.     stream nextPutAll: 'Supersend '!
  13423.  
  13424. printTempSuffix: offset
  13425.     "Private - Append the temporary access suffix to the stream."
  13426.  
  13427.     stream nextPutAll: 'Temp['; print: offset; nextPut: $]!
  13428.  
  13429. printUnusedPrefix: byteCode
  13430.     "Private - Append the prefix for an unused/invalid instruction to the stream."
  13431.  
  13432.     stream
  13433.         nextPutAll: '**INVALID: ';
  13434.         print: byteCode!
  13435.  
  13436. pushActiveFrame
  13437.     "Private - Interpret a Push Active Frame instruction."
  13438.  
  13439.     stream nextPutAll: 'Push Active Frame'; cr!
  13440.  
  13441. pushChar: asciiValue
  13442.     "Private - Interpret a Push Char instruction."
  13443.  
  13444.     self printPushPrefix.
  13445.     stream print: (Character value: asciiValue)!
  13446.  
  13447. pushConst: offset
  13448.     "Private - Interpret a Push Literal Constant instruction."
  13449.  
  13450.     self printPushPrefix.
  13451.     self printConstSuffix: offset!
  13452.  
  13453. pushImmediate: offset
  13454.     "Private - Interpret a Short Push -1/0/1/2 instruction."
  13455.  
  13456.     self printShortPrefix.
  13457.     self printPushPrefix.
  13458.     stream print: (offset >= 128 ifTrue: [ offset - 256 ] ifFalse: [ offset ])!
  13459.  
  13460. pushInstVar: offset
  13461.     "Private - Interpret a Push Instance Variable instruction."
  13462.  
  13463.     self printPushPrefix.
  13464.     self printInstVarSuffix: offset!
  13465.  
  13466. pushSelfAndTemp: offset
  13467.     "Private - Interpret a Push Self And Temporary Variable instruction."
  13468.  
  13469.     stream nextPutAll: 'Push self and '.
  13470.     self printTempSuffix: offset!
  13471.  
  13472. pushStatic: offset
  13473.     "Private - Interpret a Short Push Literal Variable instruction."
  13474.  
  13475.     self printPushPrefix.
  13476.     self printStaticSuffix: offset!
  13477.  
  13478. pushTemp: offset
  13479.     "Private - Interpret a Push Temporary Variable instruction."
  13480.  
  13481.     self printPushPrefix.
  13482.     self printTempSuffix: offset!
  13483.  
  13484. returnFromBlock
  13485.     "Private - Interpret a return from block."
  13486.  
  13487.     self printReturnPrefix.
  13488.     stream nextPutAll: 'From Block'!
  13489.  
  13490. returnFromBlockHome
  13491.     "Private - Interpret a return from block's home method."
  13492.  
  13493.     self printReturnPrefix.
  13494.     stream nextPutAll: 'From Block Home'!
  13495.  
  13496. returnFromMessage
  13497.     "Private - Interpret a return from message."
  13498.  
  13499.     self printReturnPrefix!
  13500.  
  13501. returnPseudo: offset
  13502.     "Private - Interpret a Return nil/true/false/self instruction."
  13503.  
  13504.     self printReturnPrefix.
  13505.     self printPseudoSuffix: offset!
  13506.  
  13507. returnSelf
  13508.     "Private - Interpret a Return self instruction."
  13509.  
  13510.     self printReturnPrefix.
  13511.     stream nextPutAll: 'self'!
  13512.  
  13513. send: extensionByte
  13514.     "Private - Interpret a Send instruction."
  13515.  
  13516.     self printSendPrefix.
  13517.     self printSendSuffix: extensionByte!
  13518.  
  13519. shortJump: offset
  13520.     "Private - Interpret a short jump instruction of the offset specified by the argument."
  13521.  
  13522.     stream nextPutAll: 'Short Jump +'.
  13523.     self printShortJumpOffset: offset
  13524. !
  13525.  
  13526. shortJumpIfFalse: offset
  13527.     "Private - Interpret a short jump instruction of the offset specified by the argument."
  13528.  
  13529.     stream nextPutAll: 'Short Jump If False +'.
  13530.     self printShortJumpOffset: offset!
  13531.  
  13532. shortPopStoreInstVar: offset
  13533.     "Private - Interpret a Short Pop And Store Instance Variable instruction."
  13534.  
  13535.     self printShortPrefix.
  13536.     self popStoreInstVar: offset!
  13537.  
  13538. shortPopStoreTemp: offset
  13539.     "Private - Interpret a Short Pop And Store Instance Variable instruction."
  13540.  
  13541.     self printShortPrefix.
  13542.     self popStoreTemp: offset!
  13543.  
  13544. shortPushConst: offset
  13545.     "Private - Interpret a Short Push Literal Constant instruction."
  13546.  
  13547.     self printShortPrefix.
  13548.     self printPushPrefix.
  13549.     self printConstSuffix: offset!
  13550.  
  13551. shortPushImmediate: offset
  13552.     "Private - Interpret a Short Push -1/0/1/2 instruction."
  13553.  
  13554.     self printShortPrefix.
  13555.     self printPushPrefix.
  13556.     stream print: offset - 1!
  13557.  
  13558. shortPushInstVar: offset
  13559.     "Private - Interpret a Short Push Instance Variable instruction."
  13560.  
  13561.     self printShortPrefix.
  13562.     self printPushPrefix.
  13563.     self printInstVarSuffix: offset!
  13564.  
  13565. shortPushPseudo: offset
  13566.     "Private - Interpret a Short Push nil/true/false/self instruction."
  13567.  
  13568.     self printShortPrefix.
  13569.     self printPushPrefix.
  13570.     self printPseudoSuffix: offset!
  13571.  
  13572. shortPushSelf
  13573.     "Private - Interpret a ShortPushSelf instruction."
  13574.  
  13575.     self printShortPrefix.
  13576.     self printPushPrefix.
  13577.     stream nextPutAll: 'self'!
  13578.  
  13579. shortPushStatic: offset
  13580.     "Private - Interpret a Short Push Literal Variable instruction."
  13581.  
  13582.     self printShortPrefix.
  13583.     self printPushPrefix.
  13584.     self printStaticSuffix: offset!
  13585.  
  13586. shortPushTemp: offset
  13587.     "Private - Interpret a Short Push Temporary Variable instruction."
  13588.  
  13589.     self printShortPrefix.
  13590.     self printPushPrefix.
  13591.     self printTempSuffix: offset!
  13592.  
  13593. shortSendNoArgs: offset
  13594.     "Private - Interpret a Short Send instruction."
  13595.  
  13596.     self printShortPrefix.
  13597.     self printSendPrefix.
  13598.     self printSendSuffix: offset args: 0!
  13599.  
  13600. shortSendOneArg: offset
  13601.     "Private - Interpret a Short Send instruction."
  13602.  
  13603.     self printShortPrefix.
  13604.     self printSendPrefix.
  13605.     self printSendSuffix: offset args: 1!
  13606.  
  13607. shortSendTwoArgs: offset
  13608.     "Private - Interpret a Short Send instruction."
  13609.  
  13610.     self printShortPrefix.
  13611.     self printSendPrefix.
  13612.     self printSendSuffix: offset args: 2!
  13613.  
  13614. shortSpecialSend: offset
  13615.     "Private - Interpret a Short Special Send instruction."
  13616.  
  13617.     self printShortPrefix.
  13618.     stream nextPutAll: 'Special '.
  13619.     self printSendPrefix.
  13620.     stream space; print: (interpreter selectorOfSpecialSend: offset)!
  13621.  
  13622. storeInstVar: offset
  13623.     "Private - Interpret a Store Instance Variable instruction."
  13624.  
  13625.     self printStorePrefix.
  13626.     self printInstVarSuffix: offset!
  13627.  
  13628. storeStatic: offset
  13629.     "Private - Interpret a Store Literal Variable instruction."
  13630.  
  13631.     self printStorePrefix.
  13632.     self printStaticSuffix: offset!
  13633.  
  13634. storeTemp: offset
  13635.     "Private - Interpret a Store Temporary Variable instruction."
  13636.  
  13637.     self printStorePrefix.
  13638.     self printTempSuffix: offset!
  13639.  
  13640. supersend: extensionByte
  13641.     "Private - Interpret a Supersend instruction."
  13642.  
  13643.     self printSupersendPrefix.
  13644.     self printSendSuffix: extensionByte!
  13645.  
  13646. unused
  13647.     "Private - Interpret an unused short instruction."
  13648.  
  13649.     self printUnusedPrefix: (interpreter byteCodes at: interpreter ip-1)
  13650. !
  13651.  
  13652. unused: extensionByte
  13653.     "Private - Interpret an unused double byte instruction."
  13654.  
  13655.     self printUnusedPrefix: (interpreter byteCodes at: interpreter ip - 2).
  13656.     stream nextPutAll: ' with extension '; print: extensionByte; cr!
  13657.  
  13658. unused: extensionByte1 with: extensionByte2
  13659.     "Private - Interpret an unused triple byte instruction."
  13660.  
  13661.     self printUnusedPrefix: (interpreter byteCodes at: interpreter ip - 3).
  13662.     stream 
  13663.         nextPutAll: ' with extension '; print: extensionByte1; 
  13664.         nextPutAll: ' and '; print: extensionByte2; cr!
  13665.  
  13666. unused: extensionByte1 with: extensionByte2 with: extensionByte3
  13667.     "Private - Interpret an unused quad byte instruction."
  13668.  
  13669.     self printUnusedPrefix: (interpreter byteCodes at: interpreter ip - 2).
  13670.     stream 
  13671.         nextPutAll: ' with extension '; print: extensionByte1; 
  13672.         nextPutAll: ' and '; print: extensionByte2;
  13673.         nextPutAll: ' and '; print: extensionByte3; cr
  13674. ! !
  13675.  
  13676. DiskVolumeInformation comment:
  13677. 'DiskVolumeInformation can be used to access various statistics and various other items of information available through the Win32 API about disk volumes, for example the disk volumne label and serial number of the disk in a particular drive.
  13678.  
  13679. Example Usage:
  13680.     DiskVolumeInformation forPath: ''c:\'''!
  13681. !DiskVolumeInformation class methodsFor!
  13682.  
  13683. forPath: rootPath
  13684.     "Answer a new instance of the receiver for the <readableString> rootPath of a particular disk
  13685.         self forPath: 'C:\'
  13686.     "
  13687.  
  13688.     ^self new
  13689.         setPath: rootPath;
  13690.         yourself!
  13691.  
  13692. forSystemPath
  13693.     "Answer a new instance of the receiver for the system disk
  13694.         self forSystemPath
  13695.     "
  13696.  
  13697.     ^self forPath: SessionManager current systemDirectory! !
  13698.  
  13699. !DiskVolumeInformation methodsFor!
  13700.  
  13701. bytesPerSector
  13702.     "Answer the value of the receiver's ''bytesPerSector'' instance variable."
  13703.  
  13704.     bytesPerSector isNil ifTrue: [self getDiskFreeSpace].
  13705.     ^bytesPerSector!
  13706.  
  13707. calcDiskSpace
  13708.     "Private - Call the Win32 GetDiskFreeSpaceEx() API to retrieve the free bytes etc, 
  13709.     or if that is not available use the old GetDiskFreeSpace() API (e.g. on Win95 
  13710.     prior to OSR2)."
  13711.  
  13712.     [self getDiskFreeSpaceEx] on: Win32Error do: [:e | | bytesPerCluster |
  13713.         bytesPerCluster := self bytesPerSector * self sectorsPerCluster.
  13714.         totalBytes := self freeClusters * bytesPerCluster.
  13715.         totalFreeBytes := freeBytes := self totalClusters * bytesPerCluster].!
  13716.  
  13717. displayOn: aStream
  13718.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  13719.     would want to see it."
  13720.  
  13721.     aStream
  13722.         nextPutAll: self explorerName;
  13723.         nextPutAll: ', Serial No. '.
  13724.     self displaySerialNumberOn: aStream.
  13725. !
  13726.  
  13727. displaySerialNumberOn: aStream
  13728.     "Private - Display the volume serial number on aStream as a <readableString>"
  13729.  
  13730.     | serial |
  13731.     serial := self serialNumber.
  13732.     aStream nextPutAll: ('%04X-%04X' sprintfWith: serial highWord with: serial lowWord)!
  13733.  
  13734. driveLetter
  13735.     "Answer the <readableString> drive letter to which this volume information relates (if any)."
  13736.  
  13737.     ^self rootPath leftString: 1
  13738. !
  13739.  
  13740. explorerName
  13741.     "Answer the <readableString> name that the Windows Explorer would display for this volume
  13742.     in the folder tree."
  13743.  
  13744.     | vol |
  13745.     vol := self label.
  13746.     ^(String writeStream: 40)
  13747.         nextPutAll: (vol isEmpty ifTrue: ['Local Disk'] ifFalse: [vol]);
  13748.         nextPutAll: ' (';
  13749.         nextPutAll: self driveLetter;
  13750.         nextPutAll: ':)';
  13751.         contents!
  13752.  
  13753. fileSystemFlags
  13754.     "Answer the <integer> flags associated with the file system (see the FS_XXX enumeration)."
  13755.  
  13756.     fileSystemFlags isNil ifTrue: [self getVolumeInformation].
  13757.     ^fileSystemFlags!
  13758.  
  13759. fileSystemName
  13760.     "Answer the <readableString> name of the file-system, e.g. NTFS or FAT."
  13761.  
  13762.     fileSystemFlags isNil ifTrue: [self getVolumeInformation].
  13763.     ^fileSystemName!
  13764.  
  13765. freeBytes
  13766.     "Answer the value of the receiver's ''freeBytes'' instance variable.
  13767.     N.B. On Win95 this value may not be accurate for large volumes (>2Gb)."
  13768.  
  13769.     freeBytes isNil ifTrue: [self calcDiskSpace].
  13770.     ^freeBytes!
  13771.  
  13772. freeClusters
  13773.     "Answer the value of the receiver's ''freeClusters'' instance variable.
  13774.     N.B. This value may not be accurate for large volumes (>2Gb)."
  13775.  
  13776.     freeClusters isNil ifTrue: [self getDiskFreeSpace].
  13777.     ^freeClusters!
  13778.  
  13779. getDiskFreeSpace
  13780.     "Private - Call the Win32 GetDiskFreeSpace() API to retrieve the cluster sizes, etc."
  13781.  
  13782.     | sectorsPerClusterBuf bytesPerSectorBuf numberOfFreeClustersBuf totalNumberOfClustersBuf |
  13783.  
  13784.     sectorsPerClusterBuf := DWORD new.
  13785.     bytesPerSectorBuf := DWORD new.
  13786.     numberOfFreeClustersBuf := DWORD new.
  13787.     totalNumberOfClustersBuf := DWORD new.
  13788.  
  13789.     (KernelLibrary default
  13790.         getDiskFreeSpace: self rootPath
  13791.         lpSectorsPerCluster: sectorsPerClusterBuf
  13792.         lpBytesPerSector: bytesPerSectorBuf
  13793.         lpNumberOfFreeClusters: numberOfFreeClustersBuf
  13794.         lpTotalNumberOfClusters: totalNumberOfClustersBuf)
  13795.             ifFalse: [KernelLibrary default systemError].
  13796.  
  13797.     sectorsPerCluster := sectorsPerClusterBuf value.
  13798.     bytesPerSector := bytesPerSectorBuf value.
  13799.     freeClusters := freeBytes isNil
  13800.         ifTrue: [
  13801.             "Likely to be wrong, but the best we can do..."
  13802.             freeClusters := numberOfFreeClustersBuf value]
  13803.         ifFalse: [freeBytes / (bytesPerSector*sectorsPerCluster)].
  13804.     totalClusters := totalBytes isNil
  13805.         ifTrue: [
  13806.             "Again likely to be wrong, ..."
  13807.             totalNumberOfClustersBuf value.]
  13808.         ifFalse: [totalBytes / (bytesPerSector*sectorsPerCluster)].
  13809.     
  13810. !
  13811.  
  13812. getDiskFreeSpaceEx
  13813.     "Private - Call the Win32 GetDiskFreeSpace() API to retrieve the free space etc, etc."
  13814.  
  13815.     | freeBytesAvailableBuf  totalNumberOfBytesBuf totalNumberOfFreeBytesBuf |
  13816.  
  13817.     freeBytesAvailableBuf := ULARGE_INTEGER new.
  13818.     totalNumberOfBytesBuf := ULARGE_INTEGER new.
  13819.     totalNumberOfFreeBytesBuf := ULARGE_INTEGER new.
  13820.  
  13821.     (KernelLibrary default
  13822.         getDiskFreeSpaceEx: path
  13823.         lpFreeBytesAvailable: freeBytesAvailableBuf
  13824.         lpTotalNumberOfBytes: totalNumberOfBytesBuf
  13825.         lpTotalNumberOfFreeBytes: totalNumberOfFreeBytesBuf)
  13826.             ifFalse: [KernelLibrary default systemError].
  13827.  
  13828.     freeBytes := freeBytesAvailableBuf value.
  13829.     totalFreeBytes := totalNumberOfFreeBytesBuf value.
  13830.     totalBytes :=  totalNumberOfBytesBuf value.
  13831. !
  13832.  
  13833. getDiskStats
  13834.     "Private - Call the Win32 GetDiskFreeSpaceEx() API to retrieve the free bytes etc, 
  13835.     and then calculate other stats, or if that is not available use the old GetDiskFreeSpace() 
  13836.     API (e.g. on Win95 prior to OSR2) and calculate from there."
  13837.  
  13838.     [self getDiskFreeSpaceEx] on: Win32Error do: [:e | | bytesPerCluster |
  13839.         bytesPerCluster := self bytesPerSector * self sectorsPerCluster.
  13840.         totalBytes := self freeClusters * bytesPerCluster.
  13841.         totalFreeBytes := freeBytes := self totalClusters * bytesPerCluster].!
  13842.  
  13843. getVolumeInformation
  13844.     "Private - Call the Win32 GetVolumeInformation() API to retrieve the label, etc."
  13845.  
  13846.     | volumeNameBuffer volumeSerialNumber maximumComponentLengthBuffer
  13847.         fileSystemFlagsBuffer fileSystemNameBuffer |
  13848.  
  13849.     volumeNameBuffer := File pathBuffer.
  13850.     volumeSerialNumber := DWORD new.
  13851.     maximumComponentLengthBuffer := DWORD new.
  13852.     fileSystemFlagsBuffer := DWORD new.
  13853.     fileSystemNameBuffer := String new: 32.
  13854.  
  13855.     (KernelLibrary default
  13856.         getVolumeInformation: self rootPath
  13857.         lpVolumeNameBuffer: volumeNameBuffer
  13858.         nVolumeNameSize: volumeNameBuffer size
  13859.         lpVolumeSerialNumber: volumeSerialNumber
  13860.         lpMaximumComponentLength: maximumComponentLengthBuffer
  13861.         lpFileSystemFlags: fileSystemFlags
  13862.         lpFileSystemNameBuffer: fileSystemNameBuffer
  13863.         nFileSystemNameSize: fileSystemNameBuffer size) 
  13864.             ifFalse: [KernelLibrary default systemError].
  13865.  
  13866.     label := volumeNameBuffer trimNulls.
  13867.     serialNumber := volumeSerialNumber value.
  13868.     maxComponentLength := maximumComponentLengthBuffer value.
  13869.     fileSystemFlags := fileSystemFlagsBuffer value.
  13870.     fileSystemName := fileSystemNameBuffer trimNulls.!
  13871.  
  13872. label
  13873.     "Answer the <readableString> disk volume label. If the disk is not labelled 
  13874.     this will be an empty <String>."
  13875.  
  13876.     label isNil ifTrue: [self getVolumeInformation].
  13877.     ^label!
  13878.  
  13879. label: newLabelString
  13880.     "Set the label of this disk volume."
  13881.  
  13882.     (KernelLibrary default
  13883.         setVolumeLabel: self rootPath
  13884.         lpVolumeName: newLabelString)
  13885.             ifFalse: [KernelLibrary default systemError].
  13886.  
  13887.     label := newLabelString!
  13888.  
  13889. maxComponentLength
  13890.     "Answer the <integer> maximum length of a file system path component part (e.g. 
  13891.     the maximum length of a directory name)."
  13892.  
  13893.     maxComponentLength isNil ifTrue: [self getVolumeInformation].
  13894.     ^maxComponentLength!
  13895.  
  13896. printOn: target
  13897.     "Append, to the <puttableStream>, target, a string whose characters are a 
  13898.     the same as those which would result from sending a #printString
  13899.     message to the receiver."
  13900.  
  13901.     target
  13902.         basicPrint: self;
  13903.         nextPut: $(;
  13904.         display: self;
  13905.         nextPut: $)!
  13906.  
  13907. rootPath
  13908.     "Answer the value of the receiver's ''rootPath'' instance variable."
  13909.  
  13910.     rootPath isNil ifTrue: [rootPath :=  (File splitPath: path) first asUppercase copyWith: File pathDelimiter].
  13911.     ^rootPath!
  13912.  
  13913. sectorsPerCluster
  13914.     "Answer the value of the receiver's ''sectorsPerCluster'' instance variable."
  13915.  
  13916.     sectorsPerCluster isNil ifTrue: [self getDiskFreeSpace].
  13917.     ^sectorsPerCluster!
  13918.  
  13919. serialNumber
  13920.     "Answer the 32-bit <integer> disk serial number. Normally displayed by Windows/Dos
  13921.     as two 16-bit hex values, being the high and low words of this 32-bit value."
  13922.  
  13923.     serialNumber isNil ifTrue: [self getVolumeInformation].
  13924.     ^serialNumber!
  13925.  
  13926. setPath: pathString
  13927.     "Private - Initialize the receiver to retrieve disk volume information for the volume on which
  13928.     the specified path resides."
  13929.  
  13930.     path := pathString!
  13931.  
  13932. totalBytes
  13933.     "Answer the value of the receiver's ''totalBytes'' instance variable."
  13934.  
  13935.     totalBytes isNil ifTrue: [self calcDiskSpace].
  13936.     ^totalBytes!
  13937.  
  13938. totalClusters
  13939.     "Answer the value of the receiver's ''totalClusters'' instance variable."
  13940.  
  13941.     totalClusters isNil ifTrue: [self getDiskFreeSpace].
  13942.     ^totalClusters!
  13943.  
  13944. totalFreeBytes
  13945.     "Answer the value of the receiver's ''totalFreeBytes'' instance variable."
  13946.  
  13947.     totalFreeBytes isNil ifTrue: [self calcDiskSpace].
  13948.     ^totalFreeBytes! !
  13949.  
  13950. DolphinSureCertificateInfo comment:
  13951. 'A DolphinSureCertificateInfo instance holds the unencoded data for a DolphinSureCertificate.
  13952.  
  13953. Instance Variables:
  13954.     serial        <readableString> uniquely identifying the certificate.
  13955.     owner        <readableString> identifying the certificate''s owner.
  13956.     details        <readableString> providing additional details about the owner.
  13957.     issued        <Date> when the certificate was issued.
  13958.     expiry        <Date> or nil when the certificate will expire.
  13959.     publicKeyCipher    <publicKeyCipher> of the certificate''s issuing authority.
  13960.  
  13961. '!
  13962. !DolphinSureCertificateInfo class methodsFor!
  13963.  
  13964. πM)'!!ûè3-£╗â'▀ατ√▐√╓╥ò╜²½GFº»Ü;rFy╨Ä;Qâ)@reßä J&'Aπu]y╢¬.∙█«≈úû■▄\¢uM.f╚│`rº▌╙J£Ælεpé_╨∙A] +Σjï▀MòMz∞2ôô≡Γ▐ÑràC▀╣û╗ΓRæT(;ïⁿs╫╤WΓS*┬K╓│,o╣╬v╤Gm╒-┤£àKf╛»∞ôèo┐± Q¼≤ªJvC
  13965. hr╜>┴>>WF\╠ìéáM-9P\▀é&èVÅ░╓¡²sα┐àìì7íδëÅ36╜h⌡s|ε░z╙AT∩èÄü╬╦G█┬═τV┤>╢rí6▌≈²▄CmFG2 zù÷#bö&É[╠u++`èas₧■&ú    $RêáΩ=5K{╥Z╪└╓IFöδYjä╦k▀åïU█-5|¿¥Nj!!╤eÖ▌╤▐ ╛·τ╖╟é╧|ÉY│ù@Ed╝ σz▌+íkb;≈┐ú▌└,1═╟l∩╗⌡@Q¬ⁿ∞`ε*^dε╥°┘óì│╕τ±.╩Qv硲üjΓΣé7ÿÇkï▌fM½≡▄æ╒Z}E╪=.Θ╣╫O;╬╥Ñ'÷Å⌡+ú╪7R¿m╖▀xD├5P²├┐≤å6╖\╩£∙ÇÑ┘EO▄hÉ]δ²¢*|â≥Ñ═ ╣=[£W@h·╬δa4ógïüK/G╕│┼┘ΓΘ?▄ D█~G╖ ┌¬╠1qa╝√σuh%ÅO74'8¼Fä ┐á¢>:╔╥ª¡Lë∞▀╝dJ┐9H≡Di║{O9Vƒ7╣Ñ¢r5ƒS]»k¢ε7dπ≡Σß┴sdB2L≥b╦╪╛í≡.φαºQÜ╚ÖNÑQ!!A≥≈╕AΦ╞∩∙^Σ⌠
  13966. σ|NEòß╗┌ñ∙U╕╠~+▓¬GÇ▒WåÇ╜WW╞n!
  13967.  
  13968. ∩A0w_Qµ┐  ¼¿ÿ/┼ríßⁿ╔╛ö╠╨¼√ñ_░¼╬~a
  13969. ;╕ΘT;äZH,.H[d·à0VrB│pVgºÑ4!
  13970.  
  13971. ≥A544■╧3«╗à$é Σ╞µ═≥∙╨ò▒σ½VQσ√┴HgZ_▄âEÖZVj~NQg⌡¬@<f_¿yJ╚┬b║ L┐▓Ñì╖╬^₧zMon┘╣-=¿ë╘QM╒ûpºU│o╨⌡EGI9╥pì╫W¢qq╛    =▀╝╠║îí@£ûòöSá⌠E)╚     uå»2₧╧JσM&╧╤Ωmn çh╔GwéR█▒Θ-Já╗Φ√≥Fª±w¬σái
  13972. U&£φt]Y╚π╩«Nc9QÜǃH ÿ≈■»≥d÷·æ╪ÿ2╝αΓ ╓_wÑ! !
  13973.  
  13974. !DolphinSureCertificateInfo methodsFor!
  13975.  
  13976. σA3<4╖ΓX@°êé9Æ:≤ö√─√ùâ╟╗≤íRA│╛≤oaAX╒┌~QÿQP+mOo
  13977. ΓÇUuf@Ñ<Gbºδ2 ▌G    ╛▓Ñ▄ÜÑqt■JZza╙░~!
  13978.  
  13979. σA3<4╖╒r(ë╜₧#ï8î╛åÄ═╥╦ò¬·á¡╛┴rJZ╫╖*@₧QCt.X\e≈é
  13980. b#[óu_yΓñ&║╩JΦÑ▓¥≥╞
  13981. à63j
  13982. │╕h&»└╠J╧K╙F║Q┐sù!
  13983.  
  13984. Σ\7'!!╔σ[k¢ºƒ=Ç-í└τ╔╛╥╟┼╖α╝¢║╘~-Y╘─*ZÆV/m^Z}
  13985. Σ╧\4 K%╩BVr▓ó2π!
  13986.  
  13987. Σ\7'!!■╧3╗╜ëG∩VúτΩ╪╛├╫╨■≈╜CJ¡óÇ'WIB╫┌~]æP"kAn ≤ê\th╬>╦«8Ω╫PΦφΩ▐÷δ
  13988. Æ!
  13989.  
  13990. ΘE4?-(¡¥7-╫├σhñ1≥├Ω▐╛├═└╗▓¼U½│┼;aMU╫ì(WàL+}Vs ô]$K%╬:yºº&║█ZíÑ«▐■▄2¢4WZr╧╣7rò≈╞XDå«X─*ê5┤ΦT7σeå₧[ÖVc⌐2ë╥╨≤└ª3üîÄûxO» SΓswä»6╞╧V⌡XfîQ╒!
  13991.  
  13992. ΦW40<╔σ[k¢ºƒ=Ç-í└τ╔╛▐╠╞½≈í¢║╘~-Y╘─*ZÆV/m^Z}
  13993. Σ╧\4 K%╩BZy▒╛%■!
  13994.  
  13995. εS)'U╬µp┤║¢/ù⌡▄Ωîó┼┌╘║≤º_Fî»╥r}OÆï)\ÆM%hGc
  13996. ╢ôZc/Yªn╚╞JôαMª▓Ñ!
  13997.  
  13998. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR½╛╪ofIZÆû;BàZW/`OR∙Å^V`f[½yxº¿%≤╚GΦú╕▐π╟^╦dKza╪░h║█┼XE╦VÆr╗N│sälû8Nxα$¢█OÖN{╝.ôƒ╩±─┤3ƒ æÅ╙hεΓRAΓi5└éY│╡6µr;▐Z█│@ É«z├Qg├ú╒ìP.≤╜²≥µ]┼₧    5╖σ¬2pRK"z╒gë~Ya]Y╟ùQÖñUk|PI╚ê.çoⁿÖ╕╢∙y≡èö┘└~±»ÆdÑl^
  13999. ▓hªOgZε╖)╧zUΘ┼∞∙τ╢F₧╬╤╓WαHp■"!
  14000.  
  14001. ±Q%<;Åè+D╨└╬ ï,÷╤²îΩ▀┌ò«τº_J╝√╦~jY╘─*ZÆV/m^Z}
  14002. Σ╧\4 K%╩BCáº)∙⌡G!
  14003.  
  14004. ≥A544╔σ[k¢ºƒ=Ç-í└τ╔╛ï═╨┐÷ñQO║ê╘izFQî─-WàVE&.UFf≤ô^V`f[½yxº¿%≤╚GΩ┌▌≤¥ª"ÆfWb!
  14005.  
  14006. ≥A544■╧3«╗à$é Σ╞µ═≥∙╨ò▒σ½VQσ√┴HgZ_▄âEÖZVj~NQg⌡¬@<f_¿yJ╚┬b╩╠K⌐ú▓▐║Å5₧`Wbi╔╣-&ª╠ÇKMûÜp╝█²kòBJαh▀ä▄CG╕5▌ò≡≤▐⌐rä#É╒■fíµYA░ P&┬ε╩═VΘF█Q▀╜@ É├}╓Cg╠,±å▐3⌠αòöë╗τuY╜áΦWBAGA&&üΓ~%9┘╧âórh%ç┴?Ç_√Ü╕!
  14007.  
  14008. ≈E+11░û=¿áé-ΦUêû╬┬φ└┌╟¡▓ñ¡╛┴rJZ╫╖*@₧QCt.R]o⌡Ç
  14009. Ph!!╖tV*┤¬,≤┌K▒≈º¢σ╞╫rQ.t╥╣- ½╩┼P^É╤{├)▀a╨ΦCJ5íx≥┤0ÅVf⌐1ô╚₧╢√▓z£¼Åüyú▒XJ° 9oɵ=┘ƒQΓVaí5│τ?d°╩8╞K}╨3░┼┘3ò╝≈≤áAµÖ
  14010. 5¬σ╛ BlUFc6╬±>e`^ôW▐ÿñX`|OC╘åéYâΓ╘Γ╝gσ╢Æ╚╘S▀è┌▌6R╡o∞uF╕±.Ç*ül≈Æûé┘₧╬╒∩PφR>╡╧:╔èÆ╢sOo{\8½w¿╖>qâ1₧CƒHQsèay╫╗r÷1U─Γ¿\P#p┼╥╘ÖAÉΩN3≈∩[û¢ïh╨vxCT╟±)C1₧bÉ╦╤╤╣¿⌠∞ïì╩SÅ]εΘ/?M╔üè═jÑcu=π«╣▄└;1₧£╡¥⌡Qƒöæ@Ω)$ò╓±ùΣ/ÿù¿@½ùK∙xX@╦π╒┤w╤╟w;î▐f-¼╥┘╟å ±z8╘Ñ╞K1ï─≈YîΩ¥pΓ¢:∞+2│╨}\∩7]┐∙⌠î╖2π&╖τòǼ¥IR═aOì! !
  14011.  
  14012. DolphinSureCertificateStore comment:
  14013. 'A DolphinSureCertificateStore is used to store DolphinSureCertificates for later retrieval.  The implementation uses the Windows Registry under HKEY_CURRENT_USER and certificates are stored as binary bytes (streamed out using STB). They can be looked up by serial number.
  14014.  
  14015. Currently, three such stores are defined and can be accessed by the following class methods:
  14016.  
  14017. #myCertificates --  is used to store your own personal certificates that have been issued to.  When you receive a certificate it will be in the form of an ST text file with a series of Smalltalk expressions that can be used to regenerate the certificate instance.  Once this is done there is also an expression to store the certificate into your "my certificates" store.
  14018.  
  14019. #temporaryTrust -- is used to store certificates for publishers that should be trusted in future, but only within the current Dolphin session.  If a certificate is added to this store then any content from the publisher will be automatically trusted until Dolphin (or the current DolphinSure application) shuts down. For example, if a user chooses to trust the publisher of a particular web applet, the publisher''s certificate will be added to the temporary trust store so that further prompts for each class that is loaded are unnecessary.  This store is cleared down whenever the image starts. This store is used by the Dolphin web applet plug-in but can also be used by other applications.
  14020.  
  14021. #permanentTrust -- is used to store certificates for publishers that are to be permanently trusted in future. Certificates are typically added to this store if the user ticks the box marked, "Always trust content from this publisher?", when faced with a SignedClassWarning dialog. This store is used by the Dolphin web applet plug-in but can also be used by other applications.
  14022.  
  14023. Instance Variables:
  14024.     regKey        <RegKey> identifying the registry location of certificates held by this store.
  14025.  
  14026. '!
  14027. !DolphinSureCertificateStore class methodsFor!
  14028.  
  14029. αH+)!!7╢è!!D╨└╬ ï,÷╤²▀╛╓ƒµ╗µσ\E ║╠w3\^╫─?DûVH+lWV+ ≤ô
  14030. P`/LóhV*▒┐/Φ█QB┼▌┌⌠₧±T,Æsuw ╧»h £╞╧Mö╔Vf½O░=ôεEF1Γeï█jêMf⌐23▄åè╢╟Ñj¢M£öƒp
  14031. ¡σÖ:züτs┬ƒLΓM)îQ█÷w!!ⁿ╞{╩!
  14032.  
  14033. ΓA5<>¡î3=┐Üÿ%ù:╙█α╪ô╜╢ùÄα¼EB½╛Ç63iX┴ô;@╫KL/.I\d╢è@&)Iπh[oΓÅ/÷╬J    ªäóî≥Å
  14034. ÿf[,░╤[ÉÄ≤VNüÆpÆl┤wòΦn,≥X╗╤UîJ}ó3)┴ù ╒╔▓gü ûÿÆh
  14035. ╜╢!
  14036.  
  14037. ΓH"' íé"&¿¿₧3▒-⌠╟√ Ω╪═╨╙ÿ╠s¡▓╓zgMƒ─^Æ^VjzSV+≤îVt']║<Gx╖╕4║═V║▓⌡≤¥óvwäqR.t▀▒}=╝╚╥@|çÇ5╝F╗rå▌]C*=≤pû╪PƒC`⌐!
  14038.  
  14039. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^Ae¢δwJc*Iπu]c╢ó!!÷╫Xµ┌▌▄ÜÑqt■6iknÜ¿e7ε└═XOÉVüf║BñiâAΦYJI4εg₧╥êPa┐|└å╠Σ╔αz¢MÜûâh½⌡)╚    9~æⁿ:╤╤rµO.╦Z╚V≡8sδ┬v╓y╚:┐å├g╢╜δ≈∩¢αaN¡σ╢J`HQQ&qìµ"EJ]┘▀ÿ╕m)PXΘò Ö_Bé ï°∩dΦ╝╧á≡!
  14040.  
  14041. ∞]',¡ë;*╗╜ë9ΦUêû╬┬φ└┌╟■≤½J▒¿╘z}KSÆï8âWAj|^Pnαä `)]πh[oΓª9║▌G╝╛▒ù⌠╬ä4Mar▀≥/_─ñ¬0våƒ5áB╗x╩A╗|VIΣvï╫_òAu╕/ö!
  14042.  
  14043. ∩E*oxÑ╝&;│ºïä2Σ╣àÑ╝÷╤╞⌐≈╖B▒√╔u`\W▄ç;ÿY>f^y
  14044. ⌡äOc4┤uGbΓ¬ε╠K»Ö╢ô≥ìqt·7>}u╩╣rá╠╫FöûL5»póoÖ√N=!
  14045.  
  14046. ∩A0w_Qµ┐  ¼¿ÿ/┼ríßⁿ╔╛ö╤╘│≈ .╒╓¬`MZ╘─-ZÿJH.@TGBµìTc([!
  14047.  
  14048. ±A546íü&¿╝ƒ>ΦUêû╬┬φ└┌╟■≤½J▒¿╘z}KSÆï8âWAj|^Pnαä `)]πh[oΓ╗%Φ╙C¡╣úÆεÅ égJj ┘╣&º╧╔ZIü╙aíQ│3╥lû<%`≥aô╪ÆCy⌐Z|öó╞Σ┴í}ìï»üi║╢!
  14049.  
  14050. ⌡A*
  14051. :*Ñ¥+¿╝ƒ>ΦUêû╬┬φ└┌╟■≤½J▒¿╘z}KSÆï8âWAj|^Pnαä `)]πh[oΓ┐%≈╬M⌐Ñ╛Æε█\ égJj ┘╣&º╧╔ZIü╙aíQ│3╥lû<%`≥aô╪ÆCy⌐Z|öª╞√▄»aëå»üi║╢!
  14052.  
  14053. ⌠J.<,¡Ä> á¼ß@∞ Σ╟ⁿ┼±┘≥╘░≤óVQ ╕╒iaMX╞─,WÜPR/KMVeσ╡ Pa!!J▒yWL¡╣z║═G «! !
  14054.  
  14055. !DolphinSureCertificateStore methodsFor!
  14056.  
  14057. ╜g7¿ƒ: ┤ÜÖ8ÇΣ╞√┼°▐▄╘¬≈ûGL¡╛¡
  14058. w▄ù)WàS"kO[n╢ò\&4JáyZ|º╣`≤═Gñ▓ñì╖█Ö3Jo╓¼e;á·╒KM╢ü|¿J╡|ä╧E@=»    ⌡╖{à}í0╓ƒ╞°╪⌐}ÅMïôÜoOú⌠CL¡dF;òΩs█╤^σM*î{╒π%h≈⌠m╨GM┼-Ñ╒àMw▓║²═⌠    ║± S╗Ω╖    vA&0ïJ≡?cJTñ}ñäßX-L^╬ä+¿UÜ⌡╥¼⌡nΩ·û─Ä6⌡≈┴ Å2░h╝{M÷±k╠bXτH▄∞∙π╡!!Ñ┼└ΩD┤1╖níoÿº∙√JyGGΣ%û╘(wà=ÖG▄UGPÆorê╗;Γ !
  14059.  
  14060. α@#90*░å4 ╣¿ÿ/▀α≡α└ε▀╓█ìτ╖V`║⌐╘ruAU╙É;?²6 j_@+╥ÄIn/AÉiAoü«2ε╫D    ½╢ú¢╖█^â|[@|e┘╣d$½█é4"°|·póE÷oò╫TVI.αhè█xê4¡$3▀é╦ ┬ôfÜ╝₧üh¿°TE╢eJhç²:▀╙≈T;û█2ⁿ!!q±╬v±W|┼┤╬ùMr║¡∙ΩσF¬²n]½∙üwCwr7¥!
  14061.  
  14062. αP'1Ñâhi╗Üÿ8î1µτΩ▐≈╓╙√▒▓¼Ub╜¿┼ug╫£=WçKM%`sRe ·ä 4 Oér@}º╣3║╩JΦ┤▓îπ╞öuJ.s╬│7¬ë╔WüûVg½@│tåεNxαWï╠PÆEG⌐5╥₧φ∙éαV₧ ôÄÆh
  14063. ╜£=-╢h;ç≈0█╧KεN!!Σ^╘ (s╣╬~éLaÇ,ñ▀ïw╢╝∞≈µ½⌡tY∙ΘíJjS[$_Σgë~,1MI▌▐Qû╠3>ZX▀Æo╤Bà⌡▌╛╝sß╜¬╚â~ª÷╦?╬    "C╜hªOul÷ú`╬jhΘùǃá╨Æ╨ΣΣQ±$α+┌s√Γα▄V}F    G≡9ù√(w╤"₧B╩-δ
  14064.     │╘7Θ&Hêñ²X<C─φ╞╓Vó·H/ñÑ    ¥îïB═!
  14065.  
  14066. ΓA5<>¡î3=┐║ß@∞}└┌ⁿ█√┼ƒ╘░▌╖WF¡╛─X|DZ╫ç*[ÿQ%hGc
  14067. ╢éKr/I¬R~º╕`≤╨á▓≈î≥╠üqLB
  14068. ╖╓ ╜╠╠_çö=p╖ÑhÆ7²]Z +íeî═VƒKu╕    3▌üâ⌡├¼ìï┴╙GU½≡TLΓ|JTÇσ6▌╦ßS ┴}╙≥?x╩╙w╨GL┘+┤╧┘q▓¡≡╛÷ñßea!
  14069.  
  14070. σA!! 4░ΓX@°êé9Æ:≤ö√─√ù█╨╕≤░_W ≤╞ra[B¢─=WàKM,gXR
  14071. ╢êr.JπnViºó6 ╠m┬┌▌≈╔αÆwJ@hr╒▒O;á╚╥@{üüW╖W│n╩A┤BJ>ívÜ┘rÖ[4┐>σô╧π╔│3ëîöÉu║°XJ▒  rÉⁿ'₧╔^δT*à!
  14072.  
  14073. σM4
  14074. 99╜á<s·¿┐>ù:α┘éªùò■┼«≈½W╛√╘~k\C╙ê~@ÆOV/}^]ΓêW&)Iπh[oΓ╣%∙█K¡Ñ≈è°ÅÆ4{t╬╜o>½·╘KMö═Vt╝DúpòΦ<%`9≥$₧₧LÅGf∞5╘Ü╫╢█í}£Mïö╙o
  14075. ½▒^P∞"g∩àZ▀∞K⌡D.┴▐α=m°▐"éQk╠9±╥éIq²├Æ!
  14076.  
  14077. ΦJ$ <í£,¿╜à,î<α└Ωû╛╓√┌▓Γ¡ZMî«╥~PMD╞ì8[ö^P/1:).°Æ    \t5╖nFoΓó&║╩JΦÑ▓¥≥╞
  14078. à4Wml╧╕h!!ε╚ΣVDàÜF╗Q│^òΦXI;αpÜ£4÷/┼>/╓₧┼╢┼«pä¢₧ÇO
  14079. ╝°VH°  _ìπ#╓╓Q╘T=╔|▀τ$g≡─y╓G.╙:ú╒éH!
  14080.  
  14081. ΦJ$ <í£,¿áì&▀ατ√▐≈┘╪µ╗α¼ROæ┤¡
  14082. w▄ù)WàL>zIFnO ç^Mn#áyA~½¡)∙▀VΦá╛è Å-âfWiS▀«d3óτ╧AåVÇz╝F▓=Ö╝EG x≤a£█PèGfΓ@┼ô╧π═┤v¢`⌡≥çt
  14083. ε⌠OGºprìß▀╤[δD=îV▄V²"!!Ω╥{╩m┼-Ñ╒àMw▓║²╛ΘΦ≥oI╖Σ≡gh,<5.!!ïσW"tH{╠ìƒúol0VI╔┴.ƒBù├┼¬⌡oπëä▀ô?╣═╞I╞    ▓hªOOb½±g╧yuσ
  14084. ╨∞∙!
  14085.  
  14086. ∩E*XR══'⌐╛ë8û⌡▄Ωîó┼┌╘║≤º_Fî»╥r}OÆè?_ÆK,.O[nOΣä\o0J▒>>╧┴I─°K ¡≈ñÄ√╞-âqS&|o╫µ- ½╬δ\Q╒Æp├)█∙!
  14087.  
  14088. ∩E*oxÑ╝&;│ºïä2Σ╣àÑ╝τ═▄¿≤▒V≥√Θuz\_╙ê7HÆL>f^y
  14089. ⌡äOc4┤uGbΓ¬ε╠K»Ö╢ô≥ìqt·7kg±╣tr⌠öÇkMÆ=û5╗P│oó≤E
  14090. *Σeï█rÖ[.∞H/╓₧┼╢╧¼r¢▀ÿûnº≈^GútHûα!!█φPΦUoÇ¥*┤a!!°⌠l╨K`╟░╤å┘├Æù!
  14091.  
  14092. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR½╛╪ofIZÆû;BàZW/`OR∙Å^V`f[½yxº¿%≤╚GΦú╕▐π╟^╦dKza╪░h║█┼XE╦VÆr╗N│sälû8Nxα$¢█OÖN{╝.ôƒ╩±─┤3ƒ æÅ╙hεΓRAΓi5└éY│╡6µr;▐Z█│@ É«z├Qg├ú╒ìP.≤╜²≥µ]┼₧    5╖σ¬2pRK"z╒gë~YuFC┘╠╨ßJh0E╖δFΓTÄΣß¡Φ;ñ■╚!
  14093.  
  14094. ≤A 10!!╔σ[kè╗à<ä+Σöóî▀┘╠┬╗α╢W╖╛ÇivO_┴É,K╫TA3.]\yOΓët#LªuEo░ΘMÉ│(iûÑ▓Ö▄╩!
  14095.  
  14096. ≤A*#=àâ>
  14097. ┐╗ÿ#â6Γ╒√╔φ║╡╝ⁿ└á^L⌐╛╙;rDZÆç;@âVB#mZGn╢ç Vkf[½yxº¿%≤╚GΩ┌▌≤¥ª^ÖuS.|╖╓<»─┼╚V╡y½Ñm£Φb[ 5╟vÉ╙▄Qqá|┴ù─▌╔╣3å Æ₧▌e╟ΓRHñ ~à─6╟ƒOµS*┬K±Ωmsⁿ╩w╘GE┼&δ£ÉAx╡εΩ√τ-¡φ R╕φ╖Do/Fj4╬Γ5+^╚╚|α╠3Q)!!░!
  14098.  
  14099. ≤A*#=çè =│»à)ä+ΣÄ»═┌╪╙┼╢√½`V¡╛π~a\_╘ì=SâZ#hzQx
  14100. °òDc>LªlGc¡Ñ√╨F ¡Ñ┌⌠₧ì.Ü{H} █ÿb>╛┴╔W{Çû5p╝W┐{Ö²EJI,ε$ï╓\▄Pq»5┼ù╤╕îàeëèÜçyεσ_AΓexç '╫╨Q╧@!!╚S▀₧G≡┴8╓JkÇ<┤╬ùMr║¡∙ΩσF┐⌡s╖∩ªJ kAcr¥∞53":ñ}ñÅ¡_-.FK±ä6╦H¢ ╟╜╧tµîÇ┴Å;∩ú╚-└    'Åiε
  14101. WZ≡Ñ`╞dXφ¢┴Çï═AÜ┌à∩D╒#┐e⌡iàΓα▄V}F    G≡9ù√(w!
  14102.  
  14103. ≥A544╖ΓX@°êé9Æ:≤öε┬╤┼█╨¼≈ípL│╖┼xgAY▄─1T╫KL/.XVy çZg2JπoVx½¬,║╨W¬▓Ñì╖╞^â|[@|e┘╣d$½█é4"°|·(f½O░=é√zJx≥q¥ΦXÉWq┐@=└ü╠⌡┼ígüæê╙ó²RG╢:J@╪Ω2▌╫√*═\╥V°(x─! !
  14104.  
  14105. DolphinSureTrustedData comment:
  14106. 'A DolphinSureTrustedData object represents data that has been encrypted with a particular publisher''s certificate.  The intent is that the data can be guaranteed as originating from a particular publisher (identified by the encapsulated certificate) and that it can also be trusted not to have been modified since it was published.  It is not used as a means of transmitting "secret" data (since anyone can directly see it) but as a means of transmitting signed data.
  14107.  
  14108. In order to create a piece of signed/trusted data it is necessary to have a DolphinSureCertificate and a matching private key.  These can be obtained by applying to a DolphinSure certificate authority such as Object Arts Ltd (http://www.object-arts.com/DolphinSure). The raw data is signed by first hasing with the SecurehashAlgorithm and then encrypting the result using the DigitalSignatureAlgorithm and the private key of the publisher''s certificate. The point is that, the key can be easily verified to match the hash of the data and it is therefore very difficult to forge another message that pertains to be from the same source.
  14109.  
  14110. Example:
  14111.  
  14112. "Create the trusted data"
  14113. trusted := DolphinSureTrustedData data: ''This message cannot be tampered with'' asByteArray
  14114.     description: ''A test''
  14115.     publisherCertificate: myCertificate 
  14116.     privateKey: myCertificate class privateKey.
  14117.  
  14118. "Display the publisher''s certificate and decode the original data."
  14119. trusted publisherCertificate show.
  14120.  
  14121. "Is the data valid"
  14122. trusted isValid.
  14123.  
  14124. "Verify that it is acceptable to access this data"
  14125. trusted trustedData asString. "Display it"
  14126.  
  14127. "Try modifying the data"
  14128. trusted data at: 1 put: 99.
  14129. trusted trustedData asString. "Display it"
  14130.  
  14131. Instance Variables:
  14132.     data            <ByteArray> containing the encoded data bytes.
  14133.     description            <readableString> descripting the signed data
  14134.     signature            <integer> an encoded version of a hash of the data.
  14135.     publisherCertificate        <DolphinSureCertificate> identifying the message publisher.
  14136.  
  14137. '!
  14138. !DolphinSureTrustedData class methodsFor!
  14139.  
  14140. πM)'!!ûè3-£╗â'▀ατ√▐√╓╥ò╜²½GFº»Ü;rFy╨Ä;Qâ)@reßä J&'Aπu]y╢¬.∙█«≈úû■▄\¢uM.f╚│`rº▌╙J£Ælεpé_╨∙A] +Σjï▀MòMz∞2ôô≡Γ▐ÑràC▀╣û╗ΓRæT(;ïⁿs╫╤WΓS*┬K╓│,o╣╬v╤Gm╒-┤£àKf╛»∞ôèo┐± Q¼≤ªJvC
  14141. hr╜>┴>>WF\╠ìéáM-9P\▀é&èVÅ░╓¡²sα┐àìì7íδëÅ36╜h⌡s|ε░z╙AT∩èÄü╬╦G█┬═τV┤>╢rí6▌≈²▄CmFG2 zù÷#bö&É[╠u++`èas₧■&ú    $RêáΩ=5K{╥Z╪└╓IFöδYjä╦k▀åïU█-5|¿¥Nj!!╤eÖ▌╤▐ ╛·τ╖╟é╧|ÉY│ù@Ed╝ σz▌+íkb;≈┐ú▌└,1═╟l∩╗⌡@Q¬ⁿ∞`ε*^dε╥°┘óÿ╡┤Zì└*╔QviΩ¿ú┼sæ│▓'éék≤╡?I└¥▒óⁿU@Éz8┼╗┼
  14142. 2╩═√±î⌡+╦┼<·=1╢╪:%ÇRM÷Γ│φ╪I¥o■╡╪▓ò )GP╨`OùRß╤╬aµ₧▐Σ╕r    ¬OT#û⌐╦a{z╟ Ü╬Ljƒ▌º6╓┴Γ1╪YÄ╨░║╧▀}wkτ»φIråA9v■uεi¿▓ä?┼├∩╛╜ß▄╢k|àpX∙V:áQK:G╓?αÜö} $╕ZOµ8ä»-s╚ ²φ'â7z'N!!ε~äè« ¼σs«hä£e╧â·+╔*3,KΣ≈!
  14143.  
  14144. σE3oxÑ¡+=┐ê₧8ä&í╨Ω▀²┼╓┼¬√¬] ║≤oaAX╒─.GòSM9f^AH
  14145. Σò_o%N╖y    *í«2ε╫D    ½╢ú¢╖▀üuJEe├µ-"╝└╓X\É=û─*⌠\₧δT]I9∩$û╨JêCz»|▄öâΓ─Ñ3Ü£₧Üj
  14146. ╝▒BW½n;ûτ6₧╠J≈Q#┼Z▐Vπ8c⌡╬k╩G|Ç<┤╬ùMr║¡∙ΩσF⌐·d╕┬½DTG
  14147. rü ú1eN=ú~▐ì»\i|V_╙Å(╦N
  14148. ô░┬¡∞qΦ│ä╔┌.ºΩ▀█w■ûb6▄∙z┼a]¼ïâƒç╠@₧─µπPα│hα'└╜╕▄T}F@>≡#û╛maÉ ₧ƒc[wâArƒ·,ú O╦░µG%3E$ûφ╞╦MçúL8╛ΘHïÉ┤B╟vx@R╘±0öu┘!
  14149.  
  14150. σE3oxÑ¡+=┐ê₧8ä&í╨Ω▀²┼╓┼¬√¬] ║≤oaAX╒─.GòSM9f^AH
  14151. Σò_o%N╖y    *í«2ε╫D    ½╢ú¢╖▄ÖuJ|eÇⁿ~;⌐╟┴M]çágºM▒·h╛pA/Σv▀▀W▄Kz┐=▌æ╞╢├ª3£Ü█üy ½°AA░ hïß4₧╦WΓ<┘O╩·(e╣╫m└Ng╙7┤╬├Gqí║±°Θ⌐αe╕ε╢JG_AG £ ·W?wT╚╠|α╚Nd(K ╬ë*╦Iåα▌▒∙eñ⌐ê╩ö?í÷█ ⁿ%■ûb6▄∙z┼a]¼ïâƒç╠@₧─µπPα│hα'└╜╕▄T}F@>≡#û╛maÉ ₧ƒc[wâArƒ·,ú O╦░µG%3E$ûφ╞╦MçúO#░±HïÇìBäl+YG├Σ18óxà≥╓╒!
  14152.  
  14153. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  14154. σäM&2G¬oi«¬3Θ£/j┼▌▐á┤îTÆxXI.d▀║l'ó▌ΘZG¢!
  14155.  
  14156. ΩA>='7▒ƒ_C╙δ╝8î)α└Ωî│ù■█¡σáAP »╚~3CS╦─9@ÿJTjhTA+·ì^Ph5[órPo▒δ/ⁿ₧V¡≈Ñ¢⌠╩Æf@Zh╙»-;╜ë┴Xöçtó╜xëAΦYNxΓeæ₧[Öwú>┌£╞≥î╖z£≥±·h½▒GQálx┬ε=┌ƒO⌡H9═K▀V°(xΩçl═h╧-╝£ùLq≤¿φ≥∞F╕ßbP░π≥ aEo$ŵW;tVCçW°â»^-=O╒î"äTBæΓ▐¡∞!!≈»é┼┌?ªú▌╞Za{
  14157. »<²xP⌡┤mÇoB¼ûä╙¥╓Oò▀╦ß⌡7╡yΦ'═Ω╕ùU|N
  14158. E$▒á╓d%É:¢▐MMtò u₧╗!!∞J.Y═▓»C9?
  14159. w┼╠██Qàτ!!▓µ    î£àB═l,_-{½±d4ƒeÜε╒£c╞╫¢▀∩é╠VêY¼╖LQ*íåÜ╬ íei
  14160. ≥¬╕├à8tÖƒ>ª£⌡╜▐Θ&ûP]OΩ╣xû)ºó▌⌠Θ╙╬·oJP╤°÷Özê⌐╚m┴╨P░αV7|°¡Çÿ╟JÜkrÆεôjôÿ¼╚╡╬0÷ê`^┐zeΓî-╝o¼æπ╢ë Äd≡ª╟╙∙àNë3_╟░¡ùC╣╬ƒ⌠Lσ{V═r└≈╙:_E@ⁿ1╩æC:Y╥▀▓cÅ╖╡nïGå,6∩ïä⌠Aî!!)9╛Ω┤*`┌k+Æv┐6·°┼amÿÉ·≤∙╕çε7[╨3Ñ,·`Å»Σ├(SgΩ
  14161. δ F▐∙j2▒»º╝Oë
  14162. 2Fs»"└╚δ^⌡║dÆ[¡√;É≈ú~Öl#r¿║σ ¼╔ í£ñIN[¿qz¼╪*4≤à]Nµ¬φ█Kâ└▀╫┌▄≈G
  14163. öM"óyeQ╞aQRGÖ┌]5 <ßá¼π┐3÷/^¥┤8£äÅl╦≤J~&╗*îK
  14164. 7ë╤║Hv z[~jΦ▒╡▓l≥╗<m^╖ë╓.─ò▒Uâqαsj(┘¼nΘ&£ΦIé·.ατE6{,cΩ╜ⁿv²╕à╥TΓ╥ç@▓í π╘╘&┐"EêûΘ½°ä│<º╠╖;ä1 φXä░Ü«╛lQ■YRWrτk¢Gô$    Nµ$zy ¿┌F┬g8¬ƒå;∙C°L°╣≈e±/Cv6╓ó║^╬@┐ùr∩4▄4â[u─!
  14165.  
  14166. ±Q%<+¼è 
  14167. ┐╗ÿ#â6Γ╒√╔ñù▄╨¼µ¼UJ╝║╘~"?ÉÑ0AÇZVjoUbσòWe#¼z~¬«`Φ█Aíí▓î╖┌ÖsfeÜ»x"╛┼╔\L╒åyºP╛xéA T]1τm£▀MÖ╞mV║¼╨π▄Ña╚Üî╙l¼²^W¬eXç²'╫┘VΣ@;╔Ü÷?u≡┴q┴Cz┼!
  14168.  
  14169. ≥A$'=╔σ[k¢ºƒ=Ç-í╒»╧÷┬╤▐■αáRG║⌐Ço|D╫à:ûP8{HGn ╢éLh-╬>╦╖`∙╓Wúñ≈éÜÑuƒaP } Çß-╝═┼KMæ5£y½@ótƒ╝_Jvî÷αzöWzº29╥û╞Σîñ|╥Mñ┴Étá·XΓcnîΣ ₧▐[πm.▀KÇV≡%t≈╠E»(⌐>Ñ∙ì@.≤├ÆùëoôΦ X╕⌠│J`TA`;ì ≈pm":á~ñÅ│Md:JO█ò*╦_╓▀╙▓∙b≡·∞º≤W▄èá`═ 9
  14170. Äy² RMφ╝3Ç%xπ Äêƒï═₧└─ΩW⌡5α+⌐0═≥÷╘    h[\    n╕wƒ°*bö0┼┘MQf╧ rê·1╨7Y╔»í:[S#pz╫▀ÆâFôµP,≈Æ#÷ⁿ÷.╖E<QTÿ░l5äb£Φÿ╙÷·Ñ ªßó6⌡1╔φAS7úÇå▀#ól<X│╜╕█╦4b╫¢8²╚í|╬ÉÆ@Ω)'à▀∩H£≤ë╡⌐]îÆDó,Z├¬ó╙=╪÷Ö=ùôOkï▌fM├¥╦┬ÆPP▀(.Ü≈ïI4▐╬⌡Y▄τê3≡ò}eéG]╙ûW@ 5O╦╦»≤▐^√<»≡é┴«╙EX╪pèN≤δ╘B╬Ü╪ÑUñ-H¬OT#û⌐╦(½Kùⁿ!
  14171.  
  14172. ≥M 4,▒¥7╢«â8î+Θ┘éªùò∩╟╖ΣñGF ÷ÇZ}[A╫û~FƒZ9g\]jπôg*H¼nZ~¬ª`⌡╪á▓≈î≥╠üqLB
  14173. ╖╓ è└╟P\öáráBóhé▌]H*Φpù╙! !
  14174.  
  14175. !DolphinSureTrustedData methodsFor!
  14176.  
  14177. σE3XR══'⌐╛ë8û⌡▄Ωî·╥▄┌║≈íJ▒╜╧i~IB█ï0æPVjzSV+≤éPp#]πkZ~¬ñ5ε₧T║╛▒ç■┴^â|_.i╬ⁿd!!ε╩╧KZÉçX7├)█∙?°P[!
  14178.  
  14179. σE3oxÑ¡+=┐ê₧8ä&í╨Ω▀²┼╓┼¬√¬] ║≤oaAX╒─.@₧IE>kpVrU╢æ Pp'[ªWVs╧┴I╕φGΦú┐¢╖╩ÿp[.d█¿lrª╠╠]ù╙}½ñxô⌡GJx⌡k▀▀{àVqì.╥ïâ≈┬ñ3¢ÿò╙u├¢>Q▒i|┬√;█ƒO⌡H9═K▀V°(x╖à¿/⌐#±┌ûHxâ╝±Φß¡▀eE∙ⁿ▀`kaGA
  14180. &h╙JΓ5)eJq█╠─╠38F_┘ô&¢N Ö■æΓí!!σëò▀ô0▓¡ñcª"3«uΩ`Z╔┤pÇ7¼¢ìò╬▄DÜ┼╓ªI± ¿d⌠#àΣ≈╧q`[}ß%Üß,qöÜWæu++pÅgnî∩ ±eòΓⁿR=<
  14181. r╫    ═Æ╩MÄΓH?Ñ·hôÆÉU╫80]╦≈*Y}éi¢²ÿ╓╕╗┼╣°é╠Q▄H▓ìSW0Ñ╣è
  14182. æj½wj╦¼╣╪─+t╝ƒ5ΘσÜ=Q!
  14183.  
  14184. σE3oxÑ¡+=┐ê₧8ä&í╨Ω▀²┼╓┼¬√¬] ║≤oaAX╒─-[ÉQE>{IV1OσêWg2Z▒y`~░ó.²│(iΩä▓è╖█╫qPad▀╕-6»▌┴@ÉùVw╖óuòAεTL 1≈aì₧MôuÄ(╓│╤Σ═╣3ƒïô╙}<║°PJútiç▄'╠╓QαBª2░≈,u°ç"ƒoΓ&Ñ┘óVf▓╖╢ôèo¼±s_½Θó jHQ;rÅ9≈9Hñ}ñâªWl(V^▀┴u╓ƒ≈▀╣Φt÷┐▓┘ê7╗ΣçdÑlw!
  14185.  
  14186. σE37ùå5'╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡¿Çz3jO╞ü@à^]ja]≤┴Xr'╖tR~Γ╕(⌡╦NΦ╡▓▐Σ╞Æp@Zh╙»-;╜ë╘QM╒Æ5¬Bó|╨⌡EGIUïï╓\▄@m╕/ô¥┼╢╪¿v╚èÖƒuª⌠E▒ nÇπ:▌ƒTΓXo═O╩²)d²ë8α[.─0╕╥ä`╗ºδ╛≈Φ≥iR╜áªqB Xτ∞we^╠╔Q₧«{=OE▐Ç;Ä₧⌡æ¿ΘcΦ│Æ┼ƒ,≥≡ë
  14187. ╩#
  14188. ┐}Φ
  14189. 4Zπ▓aÇyRß▐ûû╬╔Iù▀┴τV±R$▓ní!!└Σ²╓ C{k#T┼?ÜΣmvÉ"Ü]ƒ@Nvçblê╗!!Ω ▀¬ΩYq,Kw╥╩█╫CFöδYjÑ·JÜ£ëB╠k+D╓±fnWⁿ■┼▄╙¡·╜÷╪Ä╟Y▄\ÑùFD-░åå┼j¼qD∩╗æ▄╫>h█┌d┤ìⁿRQ┤∞∙%èSx2╖╞≡IÜ╩2òτ«\ïùK¼/<ô░τ├,╥ ¥;╖▌
  14190. $°á
  14191. E6╕⌡┴é°s!
  14192.  
  14193. σA4'1┤¢;&┤─µC╟∩╟°╔∞─ƒ┴╢≈σWF¼╕╥rc\_▌è~]æP"kAn ≤ê\td"╔9£»%Θ▌P    ╕ú╛æ∙!
  14194.  
  14195. ΦWáΓX@°êé9Æ:≤ö√▐δ╥ƒ▄╕▓▒[F ┐┴orU╙è~PÆG%`HZo
  14196. Σär)íy|úº)■É4á▓≈Ü≥╠Æpos╥ⁿ{3ó▄┼4"ⁿåaεN╖iô    ╝EG xΘeî╓ôD4╕9ôû╞⌡├ñvîM¢Üç}A∞£=)╚    ;ä·?╥∩JσM&╧t▀│1 ô«~╫Nb≡*│╨èG_╢╖╕ñ╜F╗±lZ∙π╛ v^£÷pr@@╨ ─é√~9OJÜæ:ëV à°╘¬▀d÷«ê╦ô=┤≈╠I▀5ùyσA5ïÅz┼a]¼ÆÇÇ¥ƒ[Æ╤╦τVß5¢gµ<╫ε∞╫J@;Φm╙Σ(iùtîG╪@Vvöe äΦΩ+]▄╖²R<Ym╙╪Æ▌Eü╫S╛°G▀àèE╥%;{Eÿ░d(¥`ºε┌▐»æ⌠»àµí2÷5╩Θ/!
  14197.  
  14198. ±Q%<+¼è D╨└╬ ï,÷╤²▀╛├╫╨■√½UL¡╢┴ozGXÆé1@╫KL/.KFi Æ\tf@Ñ<Gbºδ2 ▌G    ╛▓Ñ▄ÜÑqt■JMbfܼx0ó└╙QMç5ûaºE┐~æ∙F>ε    ⌡╖!
  14199.  
  14200. ±Q%<+¼è 
  14201. ┐╗ÿ#â6Γ╒√╔ô╜╢ùƒⁿ╢DF¡¿Ço{M╤ü,F₧YM)oOV+    ∙ô^Mn#│iQf½╕( ╠«≈úû≥ÅöqWkrÿ╤_─á╨LJÖÇp╝`│oä·XL,Σ$û═wòN4Ñ┴ç╞¼î¢3╢"¥æûÅπCWÉooíΩ!!╩╓YεB.╪ZÜ÷:!!─ë¿+P╨*│╨èW|╢╝█√≥í≥i_╕⌠╖Do/!
  14202.  
  14203. ±Q%<+¼è 
  14204. ┐╗ÿ#â6Γ╒√╔ñù▄╨¼µ¼UJ╝║╘~"?É┤,[ü^P/.B òXj/Uª<Gbºδ2 ▌G    ╛▓Ñ▐α╞╫`V.g╙¬h<ε╩┼K\£Üt║F⌠·lû8_:φmî╓\Äaq╛5╒¢└≈╪Ñ3╥P▀╙Éy║°QMía~┬ &▄╙VΣj*╒⌡∙(bφµj╓Q\╧0Ñ åV`║¿±²ß¡┤pI╗∞╗    )`_K;ê,Γ#t≥╚₧¿_d?BX▀╝aµ0k╓!
  14205.  
  14206. ±Q%<+¼è »½Ç#åΣ═éªùò∩╟╖ΣñGF ÷ÇZ}[A╫û~FƒZ:{Y_b■ä uf_╢~_cíδ+ ╟m┬┌▌≈╔▄æ4Nll╙»e7╝Ω┼K\£Üt║F÷mà≡XL"=°!
  14207.  
  14208. ≥M 4,▒¥7D╨└╬ ï,÷╤²▀╛├╫╨■ß¼TM╛»╒ivY╘─*ZÆV/m^Z}
  14209. Σ├s3 L&¥oZm¼¬4∩╠Gm┬▐≈!
  14210.  
  14211. ⌡V2    !!=á½3=╗─µC╟∩╟°╔∞ù╦▌╗▓╢ZD▒╛─;wIB╙─=]ÖKE#`R]lOΓët#LªuEo░∞3║▌M╝▓╣èΣÅâqL@xe╚╡k+º╟╟\¥╙f½QÑ=äΘB[I1∩$û╩±(╞i ôä┬·┼ñWë₧█Åe╟τVH½d.zûεsäé⌠D#╩╠ $e▌╞l├ ¬V∙╧åHr≤╛φⁿ∞╗ⁿeNÜσá cOV
  14212. r7╬    ∞6x]]²╪₧çVf_▀ì)╦^à≤├▒∞uφ╡Åä┌7│┼╚▄mK)C╤òfZP÷à{╒~OΘ╗ôüü═ê▀┬ΦC°Hp⌐nφ5àπ²╠T`_@2 
  14213. ▌ÜG »"₧B╓eCwç
  14214. !
  14215.  
  14216. ≈E+1Ñ¢3D╨└╬    ì:Γ▀ⁿîΩ▀┌ò¼≈ªVJ⌐╛╥<`R╙É?âP9k^b    ╢ê
  14217. o5╡}_cªσ`╔╫E⌐╗ñ▐÷Å( égJjD█¿l╝█╧K£╙a├)▀uæ╝SJ 6íp₧╙IÖPq¿@+┌å╦╕îÅgÇìîÜo
  14218. ε≡YW╡eh┬√;█ƒIµM&╚▐τ,#ö¡¿+}┼3╖£èWB▓ó±·á«╥aP¬σΦJ9%+?b£≡5ukQ▌Φÿ«K-/JK╘Ç#╦gL√Ü╕å∩dΦ╝┴╔¢*┤Äú!
  14219.  
  14220. ≈E+1Ñ¢3»½Ç#û7Σ╨═╒ñù▐σ½≡⌐ZP╖╛╥XvZB█é7QûKAG2H≤éJ&2Gª<Aoí«)∞█PG╗≈│ƒπ╬\
  14221. ÿ4Mk ╙║-;║ë╔JâƒqεB╕y╨ΘSC+Θa¢₧[àu£>▀¢╨■╔▓PìïÆòu »σR
  14222. cHïΦ=▀╙Lº@o°M╧τ(e▌╞l├g|╥0ú£èB4║║╕÷ßΦ÷eY╖᪠uCGbrÖ≈p~]└ìƒúUd/KI▐┴-ÆÖ²╘╖≥dñ┐ì▐ƒp⌡Äú`α?╡o∙OuQ±ªl╥~°¢┴àÅ╙Aƒû┴τV⌡P]╨ïZ╓Γ⌠┘ZV|M
  14223. @.∙2ü╘(wà=ÖG▄UG#█ a╜ε7∩6T═░╠R#.Cw╒╩╫ÖMªΓP9▓Ñ    ñíìR═8=Td╓±/₧~╫Φ╤╒¡╢╠°ªßóaÅ]¼é@%¼¢ï7╩>¼! !
  14224.  
  14225. DragDropObject comment:
  14226. ''!
  14227. !DragDropObject class methodsFor!
  14228.  
  14229. new
  14230.     "Answer a new instance of the receiver."
  14231.  
  14232.     ^super new initialize!
  14233.  
  14234. object: anObject
  14235.     "Answer a new instance of the receiver initialized with anObject in 'object' format."
  14236.  
  14237.     ^self new
  14238.         object: anObject;
  14239.         yourself! !
  14240.  
  14241. !DragDropObject methodsFor!
  14242.  
  14243. availableFormats
  14244.     "Answer an ordered collection of strings identifying each of the receiver's available formats."
  14245.  
  14246.     ^self subclassResponsibility!
  14247.  
  14248. format: formatIdentifier
  14249.     "Answer the receiver's data in the format identified by formatIdentifier. If the requested format is
  14250.     unavailable then signals an error."
  14251.  
  14252.     self subclassResponsibility!
  14253.  
  14254. format: formatIdentifier data: formattedDataObject
  14255.     "Set the receiver's format data for the format identified by formatIdentifier to formattedDataObject."
  14256.  
  14257.     self subclassResponsibility!
  14258.  
  14259. format: formatIdentifier ifAbsent: aNiladicValuable
  14260.     "Answer the receiver's data in the format identified by formatIdentifier. If the requested format is
  14261.     unavailable then evaluate aNiladicValuable."
  14262.  
  14263.     self subclassResponsibility!
  14264.  
  14265. isFormatAvailable: formatIdentifier
  14266.     "Answer whether the receiver can render itself in the format identified by formatIdentifier."
  14267.  
  14268.     ^self subclassResponsibility!
  14269.  
  14270. isObjectAvailable
  14271.     "Answer whether the receiver has #Object amongst its available formats."
  14272.  
  14273.     ^self isFormatAvailable: #Object!
  14274.  
  14275. isObjectKindAvailable: aClass
  14276.     "Answer whether the receiver has #Object amongst its available formats
  14277.     and that the object is a kind of aClass."
  14278.  
  14279.     ^self isObjectAvailable and: [self object isKindOf: aClass]!
  14280.  
  14281. object
  14282.     "Answer the receiver's data in #Object format. If #Object is unavailable then signal an error."
  14283.  
  14284.     ^self format: #Object!
  14285.  
  14286. object: anObject
  14287.     "Add to the receiver an 'object' format of a native Smalltalk object."
  14288.  
  14289.     self format: #Object data: anObject!
  14290.  
  14291. objectIfAbsent: aNiladicValuable
  14292.     "Answer the receiver's 'object' format or evaluate aNiladicValuable if it is not supported."
  14293.  
  14294.     ^self format: #Object ifAbsent: aNiladicValuable! !
  14295.  
  14296. DragDropSession comment:
  14297. ''!
  14298. !DragDropSession class methodsFor!
  14299.  
  14300. current
  14301.     "Answer the current (singleton) instance of the receiver or nil if there is none."
  14302.  
  14303.     ^Current!
  14304.  
  14305. defaultDragImages
  14306.     DefaultImages isNil 
  14307.         ifTrue: 
  14308.             [DefaultImages := IdentityDictionary new.
  14309.             DefaultImages
  14310.                 at: #none put: Cursor ddNone;
  14311.                 at: #move put: Cursor ddMove;
  14312.                 at: #copy put: Cursor ddCopy;
  14313.                 at: #link put: Cursor ddLink;
  14314.                 at: #moveScroll put: Cursor ddMoveScroll;
  14315.                 at: #copyScroll put: Cursor ddCopy;
  14316.                 at: #linkScroll put: Cursor ddLink].
  14317.     ^DefaultImages!
  14318.  
  14319. dragButton
  14320.     "Private - Answer the symbol that represents which mouse button starts a normal drag operation."
  14321.  
  14322.     ^#left!
  14323.  
  14324. dragSource: aView
  14325.     "Answer a new instance of the receiver with aView as the drag source."
  14326.  
  14327.     ^self dragSource: aView item: nil!
  14328.  
  14329. dragSource: aView item: anObject
  14330.     "Answer a new instance of the receiver with the argument, aView, as the dragSource and
  14331.     the argument, anObject, as suggestedSource."
  14332.  
  14333.     ^(self new)
  14334.         dragSource: aView;
  14335.         suggestedSource: anObject;
  14336.         yourself!
  14337.  
  14338. extendedDragButton
  14339.     "Private - Answer the symbol that represents which mouse button starts an extended drag operation."
  14340.  
  14341.     ^#right!
  14342.  
  14343. initialize
  14344.     "Private - Initialize the reciever."
  14345.  
  14346.     (OperationDescriptions := IdentityDictionary new)
  14347.         at: #move put: 'Move here';
  14348.         at: #copy put: 'Copy here';
  14349.         at: #link put: 'Link'!
  14350.  
  14351. isADragButton: aSymbol
  14352.     "Answer whether the mouse button identified by aSymbol is recognized as a drag initiator button."
  14353.  
  14354.     ^aSymbol == self dragButton or: [aSymbol == self extendedDragButton]!
  14355.  
  14356. new
  14357.     ^super new initialize!
  14358.  
  14359. onPreStripImage
  14360.     "Private - The image is about to be stripped. Nil any lazily initialized class variables."
  14361.  
  14362.     self uninitialize
  14363. !
  14364.  
  14365. uninitialize
  14366.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  14367.  
  14368.     Current := nil.
  14369.     DefaultImages := nil! !
  14370.  
  14371. !DragDropSession methodsFor!
  14372.  
  14373. addDragee: anObject
  14374.     "Add the <Object> argument to the receiver's collection of objects to be dragged."
  14375.  
  14376.     self addDragObject: (self newDragObject: anObject)!
  14377.  
  14378. addDragObject: aDragDropObject
  14379.     "Add aDragDropObject to the receiver's collection of objects to be dragged.
  14380.     This method may be useful for multiple selection situations."
  14381.  
  14382.     self dragObjects add: aDragDropObject!
  14383.  
  14384. availableFormats
  14385.     "Answer a <Set> of the <Symbol>s containing the names of all available formats."
  14386.  
  14387.     | answer |
  14388.     answer := IdentitySet new.
  14389.     self dragObjects do: [:o | answer addAll: o availableFormats].
  14390.     ^answer!
  14391.  
  14392. defaultOperation
  14393.     "Answer the receiver's defaultOperation. This Symbol identifies the operation
  14394.     to be performed unless overridden with the keyboard during the drag."
  14395.  
  14396.     ^defaultOperation
  14397. !
  14398.  
  14399. defaultOperation: aSymbol
  14400.     "Set the receiver's defaultOperation inst var to aSymbol. This identifies the operation
  14401.     to be performed unless overridden with the keyboard during the drag."
  14402.  
  14403.     defaultOperation := aSymbol
  14404. !
  14405.  
  14406. defaultScrollDelay
  14407.     "Answers the time (in ms) between the drop pointer entering the scroll zone
  14408.     and a scroll operation starting"
  14409.  
  14410.     ^1000!
  14411.  
  14412. defaultScrollInset
  14413.     "Answers the size (in pixels) of the scroll border at the edge 
  14414.     of a potential drop target"
  14415.  
  14416.     ^15!
  14417.  
  14418. defaultScrollInterval
  14419.     "Answers the time (in ms) between the scroll operations while the
  14420.     drop pointer is in the scroll zone"
  14421.  
  14422.     ^100!
  14423.  
  14424. doDragDropAt: aPoint
  14425.     "Private - Commence a default drag and drop operation at aPoint (screen coordinates)."
  14426.  
  14427.     ^self subclassResponsibility!
  14428.  
  14429. dragObjectClass
  14430.     ^self subclassResponsibility!
  14431.  
  14432. dragObjects
  14433.     "Answer the receiver's dragObjects inst var - a Collection of the objects being dragged."
  14434.  
  14435.     dragObjects isNil ifTrue: [dragObjects := OrderedCollection new].
  14436.     ^dragObjects!
  14437.  
  14438. dragObjects: anOrderedCollection
  14439.     "Set the receiver's dragObjects inst var to anOrderedCollection of the objects to be dragged."
  14440.  
  14441.     dragObjects := anOrderedCollection isNil ifFalse: [anOrderedCollection asOrderedCollection]!
  14442.  
  14443. dragPoint
  14444.     "Answer the receiver's dragPoint inst var. This contains the last known screen coordinates of the
  14445.     drag operation."
  14446.  
  14447.     ^dragPoint!
  14448.  
  14449. dragPointInView: aView
  14450.     "Answer the receiver's dragPoint converted to the coordinate system of
  14451.     aView. This contains the last known coordinates of the drag operation."
  14452.  
  14453.     ^View desktop mapPoint: self dragPoint to: aView
  14454. !
  14455.  
  14456. dragSource
  14457.     "Answer the drag source View."
  14458.  
  14459.     ^dragSource!
  14460.  
  14461. dragSource: aView
  14462.     "Set the receiver's dragSource inst var to aView."
  14463.  
  14464.     dragSource := aView!
  14465.  
  14466. dragSourceCut
  14467.     "Private - We have completed a successful move operation - cut the dragObjects from the drag source."
  14468.  
  14469.     dragSource isDragSource
  14470.         ifTrue: [dragSource ddCut: self]!
  14471.  
  14472. dropTarget
  14473.     "Answer the current drop target."
  14474.  
  14475.     ^dropTarget!
  14476.  
  14477. dropTargetDrop
  14478.     "Private - Instruct the current drop target to perform a drop."
  14479.  
  14480.     dropTarget isDropTarget ifTrue: [
  14481.         self isInDropTargetScrollZone: false.
  14482.         self solidifyOperation.
  14483.         operation notNil
  14484.             ifTrue: [^dropTarget ddDrop: self]
  14485.             ifFalse: [
  14486.                 "Drag was cancelled (operation is nil)"
  14487.                 dropTarget ddLeave: self]].
  14488.     ^false!
  14489.  
  14490. dropTargetEnter
  14491.     "Private - Inform the drop target that the receiver has has entered its air space."
  14492.  
  14493.     operation := nil.
  14494.     suggestedTarget := nil.
  14495.     self isInDropTargetScrollZone: false.
  14496.     dropTarget isDropTarget
  14497.         ifTrue: [dropTarget ddEnter: self]!
  14498.  
  14499. dropTargetLeave
  14500.     "Private - Inform the drop target that the receiver has left its air space."
  14501.  
  14502.     dropTarget isDropTarget
  14503.         ifTrue: [dropTarget ddLeave: self].
  14504.     self showDragImage.
  14505.     self isInDropTargetScrollZone: false.
  14506.     operation := nil.
  14507.     suggestedTarget := nil.
  14508. !
  14509.  
  14510. dropTargetOver
  14511.     "Private - Inform the drop target that the receiver is still flying overhead."
  14512.  
  14513.     operation := nil.
  14514.     dropTarget isDropTarget ifTrue: [
  14515.         dropTarget ddOver: self]!
  14516.  
  14517. forcedOperation
  14518.     "If the user is currently holding down one of the drag and drop modifier keys
  14519.     answer the operation intended. If no such keys are held down then answer nil."
  14520.  
  14521.     Keyboard default isCtrlDown ifTrue: [^#copy].
  14522.     Keyboard default isShiftDown ifTrue: [^#move].
  14523.     Keyboard default isAltDown ifTrue: [^#link].
  14524.     ^nil!
  14525.  
  14526. getCustomDragImages
  14527.     "Private - Determine any drag images which are to differ from the default.
  14528.     Usually this is only the underlying object icon, but we also invite the 
  14529.     drag source to set custom images for the various drop effects. 
  14530.     This is optional and if none are provided then default images will be used."
  14531.  
  14532.     "Make sure the required #Object image is available"
  14533.  
  14534.     dragImages at: #Object
  14535.         ifAbsentPut: 
  14536.             [| dragged |
  14537.             dragged := self dragObjects first.
  14538.             dragged isObjectAvailable 
  14539.                 ifTrue: [dragged object icon]
  14540.                 ifFalse: [Icon question]].
  14541.     dragSource isDragSource ifTrue: [dragSource ddGetImages: self]!
  14542.  
  14543. imageAt: aSymbol put: anImage
  14544.     "Set an image in the receiver's image dictionary. This is an IdentityDictionary mapping a drop operation to
  14545.     a drag image. The standard operation image keys are #none, #move, #moveScroll, #copy, #copyScroll, #link
  14546.     and #linkScroll. You may provide a drag image for a user-defined drop operation by adding it with the
  14547.     operation key symbol."
  14548.  
  14549.     dragImages at: aSymbol put: anImage!
  14550.  
  14551. imageKey
  14552.     "Private - Answer the key symbol to select the appropriate drag image.
  14553.     This will be one of the standard image keys #none, #move, #copy, #link,
  14554.     #moveScroll, #copyScroll, #linkScroll or else a symbol matching some
  14555.     user defined operation."
  14556.  
  14557.     operation isNil ifTrue: [^#none].
  14558.     inDropTargetScrollZone 
  14559.         ifTrue: 
  14560.             [operation == #move ifTrue: [^#moveScroll].
  14561.             operation == #copy ifTrue: [^#copyScroll].
  14562.             operation == #link ifTrue: [^#linkScroll]].
  14563.     ^operation!
  14564.  
  14565. initialize
  14566.     "Private - Initialize the receiver."
  14567.  
  14568.     defaultOperation := #move.
  14569.     dragImages := self class defaultDragImages copy.
  14570.     ^self!
  14571.  
  14572. intendedOperation
  14573.     "Answer the receiver's defaultOperation unless the user is forcing a different operation
  14574.     using the keyboard."
  14575.  
  14576.     | intendedOperation |
  14577.     (intendedOperation := self forcedOperation) isNil
  14578.         ifTrue: [intendedOperation := self defaultOperation].
  14579.     ^intendedOperation!
  14580.  
  14581. isFormatAvailable: aFormatIdentifier
  14582.     "Answer whether the receiver can render itself in format identified by aFormatIdentifier"
  14583.  
  14584.     ^self dragObjects allSatisfy: [:each | each isFormatAvailable: aFormatIdentifier ]!
  14585.  
  14586. isInDropTargetScrollZone
  14587.     "Private - Answer whether the cursor is currently over a 'drag and drop scroll zone' in the drop target."
  14588.  
  14589.     ^inDropTargetScrollZone!
  14590.  
  14591. isInDropTargetScrollZone: aBoolean
  14592.     "Private - Set the receiver's inDropTargetScrollZone inst var to aBoolean to indicate whether the cursor
  14593.     is currently over a 'drag and drop scroll zone' in the drop target."
  14594.  
  14595.     (aBoolean eqv: inDropTargetScrollZone) ifFalse: [
  14596.         aBoolean
  14597.             "Scroll operation starting"
  14598.             ifTrue: [    self startScrollProcess ]
  14599.             "Scroll operation ending"
  14600.             ifFalse: [ self stopScrollProcess ].
  14601.     inDropTargetScrollZone := aBoolean ].
  14602. !
  14603.  
  14604. isObjectKindAvailable: aClass
  14605.     "Answer whether the receiver can render itself as an Object which 
  14606.     is a kind of aClass"
  14607.  
  14608.     ^self dragObjects allSatisfy: [:each | each isObjectKindAvailable: aClass ]!
  14609.  
  14610. isTargetSameAsSource
  14611.     "Answer true if the source and target locations are the same"
  14612.  
  14613.     ^(self dragSource==self dropTarget and: [
  14614.         (self suggestedSource==self suggestedTarget) and: [
  14615.     self suggestedSource notNil]])
  14616. !
  14617.  
  14618. newDragObject: anObject 
  14619.     "Answer a new <DragDropObject> on the <Object> argument."
  14620.  
  14621.     ^self dragObjectClass object: anObject!
  14622.  
  14623. operation
  14624.     "Answer the receiver's operation inst var. This is a symbol identifying the operaion a drop would currently have
  14625.     on the drop target. This can be nil to indicate that there would be no effect, one of the standard drag and drop
  14626.     operations #move, #copy, #link, or some other symbol defined by the target."
  14627.  
  14628.     ^operation!
  14629.  
  14630. operation: aSymbol
  14631.     "Set the receiver's operation inst var to aSymbol - this identifies the operation a drop would currently
  14632.     have on the drop target. This can be nil to indicate that there would be no effect, one of the standard
  14633.     drag and drop operations #move, #copy or #link, or some other Symbol defined by the target."
  14634.  
  14635.     operation := aSymbol!
  14636.  
  14637. operationDescriptions
  14638.     "Answer an <abstractDictionary> that maps the standard drag and drop operations symbols
  14639.     to menu item names for the purposes of an extended drag and drop (i.e. these are used as the
  14640.     descriptions on the right drag popup menu)."
  14641.  
  14642.     ^OperationDescriptions!
  14643.  
  14644. solidifyOperation
  14645.     "Private - Time to make up our minds on the actual drag operation to be performed.
  14646.     By default we assume it has already solidified."
  14647.  
  14648. !
  14649.  
  14650. startScrollProcess
  14651.     "Private - Start a process for scrolling the drop target"                
  14652.  
  14653.     self stopScrollProcess.
  14654.     scrollProcess := [
  14655.         Processor sleep: self defaultScrollDelay.
  14656.             [ dropTarget ddScroll: self.
  14657.                 Processor sleep: self defaultScrollInterval ] repeat ] 
  14658.                     forkAt: Processor userBackgroundPriority!
  14659.  
  14660. stopScrollProcess
  14661.     "Private - Stops the process for scrolling the drop target"                
  14662.  
  14663.     scrollProcess notNil ifTrue: [
  14664.         scrollProcess terminate.
  14665.         scrollProcess := nil ]
  14666. !
  14667.  
  14668. suggestedSource
  14669.     "Answer the receiver's suggestedSource inst var. This is NOT the drag object but the object that
  14670.     was under the mouse at the point the drag commenced and may be nil. This can be used by the
  14671.     dragSource's #requestDragObjects to help identify which object(s) within the dragSource is to be
  14672.     the actual drag object(s)."
  14673.  
  14674.     ^suggestedSource!
  14675.  
  14676. suggestedSource: anObject
  14677.     "Set the receiver's suggestedSource inst var to anObject. This is NOT the drag object but the
  14678.     object that was under the mouse at the point the drag commenced and may be nil. This can be
  14679.     used by the dragSource's #requestDragObjects to help identify which object(s) within the
  14680.     dragSource is to be the actual drag object(s)."
  14681.  
  14682.     suggestedSource := anObject!
  14683.  
  14684. suggestedTarget
  14685.     "Answer the receiver's suggestedTarget inst var. This is NOT the dropTarget object but an object
  14686.     specified by a dropTarget on a previous call of #onDragEnter, #onDragOver or #onDrop and may
  14687.     therefore be nil. This can be used by the dropTarget to help with both drawing of drop emphasis
  14688.     and with the identification of drop participants in any eventual #onDrop."
  14689.  
  14690.     ^suggestedTarget!
  14691.  
  14692. suggestedTarget: anObject
  14693.     "Set the receiver's suggestedTarget inst var. This is NOT the dropTarget object but an object
  14694.     specified by a dropTarget to help with both drawing of drop emphasis and with the identification
  14695.     of drop participants in any eventual #onDrop."
  14696.  
  14697.     suggestedTarget := anObject!
  14698.  
  14699. supportedOperations
  14700.     "Answer a <Collection> of <Symbol>, that specifies the drop operations 
  14701.     supported by the current drop target."
  14702.  
  14703.     ^operationsSupportedByDropTarget!
  14704.  
  14705. supportedOperations: ops
  14706.     "Set the receiver's operationsSupportedByDropTarget inst var to the <Collection>
  14707.     of <Symbol>, ops. This specifies the drop operations supported by the current
  14708.     drop target."
  14709.  
  14710.     operationsSupportedByDropTarget := ops! !
  14711.  
  14712. Event comment:
  14713. ''!
  14714. !Event class methodsFor!
  14715.  
  14716. forSource: aWindow
  14717.     ^(self basicNew)
  14718.         setSource: aWindow;
  14719.         yourself! !
  14720.  
  14721. !Event methodsFor!
  14722.  
  14723. setSource: aWindow
  14724.     hWnd := aWindow asParameter!
  14725.  
  14726. window
  14727.     "Answers a window which was the target for this event. This window
  14728.     must be a registered Dolphin window."
  14729.  
  14730.     ^SessionManager inputState windowAt: hWnd ifAbsent: []! !
  14731.  
  14732. Exception comment:
  14733. ''!
  14734. !Exception class methodsFor!
  14735.  
  14736. , anotherException
  14737.     "Answer a new <exceptionSet> containing the receiver and the <exceptionSelector> 
  14738.     argument, anotherException. Note that the 'set' is a bit of a misnomer, as the result 
  14739.     does not conform to that protocol."
  14740.  
  14741.     ^ExceptionSet with: self with: anotherException!
  14742.  
  14743. beep
  14744.     "Sound an appropriate beep to draw the users attention.
  14745.     Overridden by subclasses to play more specific sounds."
  14746.  
  14747.     Sound beep!
  14748.  
  14749. handles: exception
  14750.     "Answer whether the receiver matches the <exceptionDescription>, exception, and 
  14751.     any handler at this scope should be invoked.
  14752.  
  14753.     Implementation Note: The default is to handle exceptions which are instances or 
  14754.     subinstances of the receiver. This provides for an elegant type-based mechanism 
  14755.     for handling exceptions, similar to that of C++."
  14756.  
  14757.     ^exception isKindOf: self!
  14758.  
  14759. icon
  14760.     "Answers an Icon that can be used to represent this class. Here we use a constant expression 
  14761.     evaluated at compile time in order to statically bind 'self' at this position in the class hierarchy 
  14762.     (i.e. to Object). This ensures that subclasses which do not override this method still answer 
  14763.     'Object defaultIcon' rather than 'aSubclass defaultIcon'. Classes which provide their own default icon 
  14764.     can override this method with a similar implementation perhaps with #defaultIconFrom: if the icon comes
  14765.     from an ExternalResourceLibrary other than the system default."
  14766.  
  14767.     ^##(self) defaultIcon!
  14768.  
  14769. new
  14770.     "Answer a new initialized instance of the receiver, conforming to 
  14771.     the <Exception> protocol."
  14772.  
  14773.     ^super new initialize!
  14774.  
  14775. signal
  14776.     "Raise a new instance of the receiver conforming to <signaledException> with all <exceptionDescription>
  14777.     attributes set to default values. A search is initiated for an exception handler prepared to handle 
  14778.     instances of the receiver. This method will not return to its sender, unless the new instance is 
  14779.     resumable, and the handler which catches it directs that it should be resumed."
  14780.  
  14781.     ^self new signal!
  14782.  
  14783. signal: signalerText
  14784.     "Raise a new instance of the receiver, with the <readableString> message text,
  14785.     signalerText, initiating a search for an <ExceptionHandler> prepared to handle 
  14786.     instances of the receiver. This method will not return to its sender, unless the new 
  14787.     instance is resumable, and the handler which catches it directs that it should 
  14788.     be resumed."
  14789.  
  14790.     ^self new
  14791.         signal: signalerText!
  14792.  
  14793. signal: signallerText with: signallerTag
  14794.     "Raise a new instance of the receiver, with the error tag <Object>, signallerTag, 
  14795.     and the <readableString> message text, signallerText,  initiating a search for 
  14796.     an <ExceptionHandler> prepared to handle instances of the receiver. 
  14797.     his method will not return to its sender, unless the new instance is 
  14798.     resumable, and the handler which catches it directs that it should be resumed."
  14799.  
  14800.     ^self new 
  14801.         signal: signallerText with: signallerTag!
  14802.  
  14803. signalWith: signallerTag
  14804.     "Raise a new instance of the receiver, with the error tag <Object>, signallerTag, 
  14805.     initiating a search for an <ExceptionHandler> prepared to handle instances of 
  14806.     the receiver. This method will not return to its sender, unless the new instance is 
  14807.     resumable, and the handler which catches it directs that it should be resumed."
  14808.  
  14809.     ^self signal: nil with: signallerTag!
  14810.  
  14811. sunitSignalWith: aString
  14812.     ^self signal: aString! !
  14813.  
  14814. !Exception methodsFor!
  14815.  
  14816. _descriptionArguments
  14817.     "Answer a <sequencedReadableCollection> of the  arguments to be substitued 
  14818.     into the receiver's Win32 description format string when constructing the receivers 
  14819.     #description.
  14820.     By default the arguments to the message formatting are the message text and 
  14821.     the tag supplied by the exception signaller, but if additional fields are available,
  14822.     then this should be overridden.
  14823.  
  14824.     N.B. This is part of the implementation of the ANSI standard message 
  14825.     #description and therefore it requires an underscore prefix in order
  14826.     to avoid the fragile base class problem where subclasses may 
  14827.     inadvertantly override a superclass method."
  14828.  
  14829.     ^Array 
  14830.         with: self messageText displayString     "...just in case the messageText is not a String"
  14831.         with: self tag displayString!
  14832.  
  14833. _descriptionFormat
  14834.     "Answer a <readableString> whose contents are a Win32 format string to be used 
  14835.     to construct the #description for the receiver.
  14836.     By default the format will display only the message text supplied by the signaller,
  14837.     but this can (and should) be overridden by subclasses to display something more specific.
  14838.  
  14839.     N.B. This is part of the implementation of the ANSI standard message 
  14840.     #description and therefore it requires an underscore prefix in order
  14841.     to avoid the fragile base class problem where subclasses may 
  14842.     inadvertantly override a superclass method."
  14843.  
  14844.     ^'%1'!
  14845.  
  14846. _evaluateHandler: handlerBlock in: anExceptionHandler 
  14847.     "Private - The receiver has been identified as a handler for the argument exception. 
  14848.     Handle the exception by evaluating the exception handling block, handlerBlock, 
  14849.     establishing the continue block so that a non-local return to our sender is possible. 
  14850.     When the continue block is evaluated it causes a non-local return of its argument value 
  14851.     to the context from which the receiver was signalled, having the effect of ignoring the 
  14852.     signalling of the receiver."
  14853.  
  14854.     | myEnv procEnv answer myContinueBlock activeProc |
  14855.     activeProc := Processor activeProcess.
  14856.     procEnv := activeProc exceptionEnvironment.
  14857.     myEnv := _activeHandler.
  14858.     myContinueBlock := _continueBlock.
  14859.     answer := 
  14860.             ["Handle the exception within the environment of its enclosing handlers (a 
  14861.              handler can't handle its own exceptions!!)"
  14862.  
  14863.             activeProc exceptionEnvironment: anExceptionHandler outer.
  14864.             "Record the active handler so that we can use it to act on responses from 
  14865.              handler block"
  14866.             _activeHandler := anExceptionHandler.
  14867.             "Create the continue block for use with #resume:"
  14868.             _continueBlock := [:continueWith | ^continueWith].
  14869.             handlerBlock value: self] 
  14870.                     ensure: 
  14871.                         ["Be sure to restore the previous exception environment"
  14872.  
  14873.                         _activeHandler := myEnv.
  14874.                         _continueBlock := myContinueBlock.
  14875.                         activeProc exceptionEnvironment: procEnv].
  14876.  
  14877.     "If the user supplied exception handling block terminates by dropping off its end,
  14878.     without specifying a particular action, then we default to continuing execution
  14879.     immediately after the try block, even if the exception is resumable. This change
  14880.     for compatibility with latest X3J20 proposal, Sept. 96, BSM."
  14881.     ^anExceptionHandler return: answer.
  14882.     #todo    "I am increasingly of the view that the continueBlock should be held in the handler
  14883.         since it would not then be necessary to save and restore it, and it relates to the
  14884.         handling of an Exception, not the Exception itself. Move it."!
  14885.  
  14886. _propagate
  14887.     "Private - Propagate the receiver up through the originating process' stack of
  14888.     ExceptionHandlers starting from the current one."
  14889.  
  14890.     | answer |
  14891.     answer := self _propagateFrom: Processor activeProcess exceptionEnvironment.
  14892.     ^answer == _resignalBlock
  14893.         ifFalse: [answer]
  14894.         ifTrue: [_resignalException signal]!
  14895.  
  14896. _propagateFrom: anExceptionEnvironmentOrNil 
  14897.     "Private - Propagate the receiver up through the chain of handlers starting at anExceptionHandlerOrNil,
  14898.     looking for one willing to handle the receiver. Should their be no such handler, then the default
  14899.     action associated with the receiver is performed."
  14900.  
  14901.     "The resignal block answers itself to provide a unique mark to identify retry attempts to the #handle method"
  14902.  
  14903.     | env oldEnv answer activeProc |
  14904.     _resignalBlock isNil ifTrue: [_resignalBlock := [^_resignalBlock]].
  14905.     env := anExceptionEnvironmentOrNil.
  14906.  
  14907.     "Exceptions can only be raised and handled in the context of the current active process."
  14908.     activeProc := Processor activeProcess.
  14909.  
  14910.     "We must prevent any exceptions generated during the search for a handler from
  14911.     causing an infinitely recursive search, so we temporarily trick the process
  14912.     into thinking it hasn't got a chain of exception handlers"
  14913.     oldEnv := activeProc exceptionEnvironment.
  14914.     activeProc exceptionEnvironment: nil.
  14915.     [env isNil] whileFalse: 
  14916.             [| handlerBlock |
  14917.             (handlerBlock := env actionFor: self) isNil 
  14918.                 ifFalse: 
  14919.                     [activeProc exceptionEnvironment: oldEnv.
  14920.                     ^self _evaluateHandler: handlerBlock in: env].
  14921.             env := env outer].
  14922.  
  14923.     "No handler was found, perform the default action in the same exception environment as that in place
  14924.     when the receiver was raised"
  14925.     activeProc exceptionEnvironment: _environmentWhenRaised.
  14926.     answer := self defaultAction.
  14927.     activeProc exceptionEnvironment: oldEnv.
  14928.     ^answer.
  14929.     #todo    "Wouldn't it be neater if the invocation of #defaultAction was performed within a handler block so that
  14930.         the handler responses could be used from within #defaultAction (they cannot at the moment). We could
  14931.         also have a bit less special case code."!
  14932.  
  14933. abort
  14934.     "Terminate the process in which the receiver was raised."
  14935.  
  14936.     Processor activeProcess terminate!
  14937.  
  14938. abortRetryIgnore
  14939.     "Throw up an Abort/Retry/Ignore Warning message box with the receiver's message: If the 
  14940.     user presses Ignore, then resume (continue execution as if the warning had not been raised), 
  14941.     if the user presses Abort, then return (continue execution after the handler), the answer is nil 
  14942.     in either case. Example usage:
  14943.  
  14944.     [ Warning signal: 'Aha!! Continue?'. Transcript show: 'Inside the try block'; cr ] 
  14945.         on: Warning do: [ :e |
  14946.             e abortRetryIgnore ]. Transcript show: 'After the try block'; cr.
  14947.     "
  14948.  
  14949.     self perform: self abortRetryOrIgnore
  14950. !
  14951.  
  14952. abortRetryOrIgnore
  14953.     "Throw up an Abort/Retry/Ignore Warning message box with the receiver's message
  14954.     and answer the symbolic name of the user's response."
  14955.     
  14956.     | mb |
  14957.     self beep.
  14958.     mb := MessageBox new.
  14959.     Processor isActiveMain ifTrue: [mb taskModal].
  14960.     ^mb
  14961.         abortRetryIgnore;
  14962.         defaultButton: 3;
  14963.         warning: self description!
  14964.  
  14965. beep
  14966.     "Sound an appropriate beep to draw the users attention."
  14967.  
  14968.     self class beep!
  14969.  
  14970. defaultAction
  14971.     "Perform the default action for the receiver if it is not handled
  14972.  
  14973.     This is an ANSI standard message, but the action to be taken is implementation
  14974.     defined. In the Dolphin development environment the default actions are
  14975.     as follows:
  14976.         Error        - Causes a walkback from the signal origin.
  14977.         Warning        - Displays an Abort/Retry/Ignore message box. 
  14978.         Notification    - Writes the description to the Transcript, and resumes.
  14979.     See those subclasses for further details."
  14980.  
  14981.     ^self subclassResponsibility!
  14982.  
  14983. description
  14984.     "Answer a <readableString> describing the exception which the receiver represents.
  14985.     Note that if 'an explicit message text was provided by the signaler of the exception,
  14986.     that text should be incorporated into the description.' We don't enforce this (because
  14987.     we take the view that it is more important that exceptions carry all necessary
  14988.     details from the signalling point that will enable them to be handled correctly,
  14989.     and that presentation to the user is the exceptional case).
  14990.  
  14991.     N.B. This is an ANSI standard message in a class which is explicitly specified
  14992.     to be subclassable, and therefore it must not send any messages to self
  14993.     other than other ANSI standard messages, or those prefixed with an
  14994.     underscore. This is to avoid the fragile base class problem where subclasses
  14995.     may inadvertantly override a superclass method."
  14996.  
  14997.     | desc |
  14998.     desc := self _descriptionFormat formatWithArguments: self _descriptionArguments.
  14999.     ^desc isEmpty 
  15000.         ifTrue: ['An unknown %1 has occurred' formatWith: self class name]
  15001.         ifFalse: [desc]!
  15002.  
  15003. displayOn: aStream
  15004.     "Append a user-friendly textual representation of the receiver to the 
  15005.     <puttableStream>, target."
  15006.  
  15007.     | signallerText |
  15008.     aStream nextPutAll: (
  15009.         (signallerText := self messageText) notNil
  15010.             ifTrue: [signallerText]
  15011.             ifFalse: [self description])!
  15012.  
  15013. exit: anObject
  15014.     "Answer the argument as the value of the handler block, as if it were the value of the last 
  15015.     expression in the try block. For non-resumable exceptions, this is 
  15016.     equivalent to #return:, for resumable #resume:. This is no longer part of the ANSI
  15017.     standard set of handler responses."
  15018.  
  15019.     ^self isResumable
  15020.         ifTrue: [self resume: anObject]
  15021.         ifFalse: [self return: anObject]!
  15022.  
  15023. hasTag
  15024.     ^tag notNil!
  15025.  
  15026. ignore
  15027.     "Perform the receiver's #resume action."
  15028.  
  15029.     self resume!
  15030.  
  15031. isNested
  15032.     "Answer whether the current exception currently being handled is within the scope of another
  15033.     handler for the same exception (i.e. if passed will be caught)."
  15034.  
  15035.     | env |
  15036.     env := Processor activeProcess exceptionEnvironment.
  15037.     [env isNil] whileFalse: [
  15038.         (env actionFor: self) isNil ifFalse: [^true].
  15039.         env := env outer].
  15040.     ^false!
  15041.  
  15042. isResumable
  15043.     "Answer whether the receiver represents a resumable error. 
  15044.     Exceptions are, by default, NOT resumable."
  15045.  
  15046.     ^false!
  15047.  
  15048. isUserResumable
  15049.     "Answer whether the user should be given the option of resuming when
  15050.     prompted with regard to this exception."
  15051.  
  15052.     ^self isResumable!
  15053.  
  15054. messageText
  15055.     "Answer the <readableString> message text supplied when the receiver was signalled,
  15056.     or <nil> if none was provided."
  15057.  
  15058.     ^messageText!
  15059.  
  15060. messageText: signalerText
  15061.     "Set the exceptions message text to the readableString argument, <signalerText>."
  15062.  
  15063.     messageText := signalerText!
  15064.  
  15065. okCancel
  15066.     "Throw up an OK/Cancel Warning message box with the receiver's message: If the user presses Ok, then resume
  15067.     (continue execution as if the warning had not been raised), if the user presses Cancel, then return (continue 
  15068.     execution after the handler), the answer is nil in either case. Example usage:
  15069.  
  15070.     [Warning signal: 'Aha!! Continue?'. Transcript show: 'Inside the try block'; cr ] on: Warning do: [ :e |
  15071.         e okCancel]. Transcript show: 'After the try block'; cr.
  15072.     "
  15073.  
  15074.     self okToContinue
  15075.         ifTrue: [self resume]
  15076.         ifFalse: [self return]!
  15077.  
  15078. okToContinue
  15079.     "Throw up an OK[Cancel] message box with the receiver's message, answering true if 
  15080.     it is ok to continue (the user pressed OK and the receiver is resumable)."
  15081.  
  15082.     | mb text |
  15083.     text := self description.
  15084.     mb := MessageBox new.
  15085.     Processor isActiveMain ifTrue: [mb taskModal].
  15086.     mb caption: self class displayString.
  15087.     ^self isUserResumable 
  15088.         ifTrue: [(mb okCancel; warning: text) == #ok]
  15089.         ifFalse: [mb errorMsg: text. false]!
  15090.  
  15091. outer
  15092.     "Answer the result of evaluating the next outermost exception handler for the 
  15093.     receiver, or the default action if none. The semantics of this handler response
  15094.     are quite subtle: Whether execution actually continues _in this message_ depends 
  15095.     on whether the receiver is resumable, and on the handler response invoked by the 
  15096.     outer handler, or the default action if there is no outer handler. If the exception
  15097.     is resumable, and the outer handler resumes then the answer from this 
  15098.     message will be the resumption value specified by that outer handler (or nil
  15099.     if non was specified), i.e. #resume(:) in the outer handler will resume in the
  15100.     handler which sent this message, not from the original point where the    
  15101.     exception was raised.  If the receiver is not a resumable exception, or if the
  15102.     outer handler does not resume, then control is not returned to this point and this
  15103.     message will not return. For exceptions that are not resumable, #outer is equivalent 
  15104.     to #pass."
  15105.  
  15106.     ^self _propagate!
  15107.  
  15108. pass
  15109.     "Propagate the receiver to any enclosing handlers. The exact behavior depends on 
  15110.     whether the receiver is resumable or not.
  15111.  
  15112.     This selector is not particularly well chosen (it is an ANSI selector) so it may not be
  15113.     clear that this is the way one resignals a caught exception from inside a handler
  15114.     in order to propagate it to any enclosing handlers, i.e. it is the way one says,
  15115.     'There is nothing further I can do with this exception, you have it.'"
  15116.  
  15117.     ^self exit: self _propagate!
  15118.  
  15119. postCopy
  15120.     "Apply any final flourish to the copy that may be required
  15121.     in order to ensure that the copy does not share any state with
  15122.     the original, apart from the elements. Answer the receiver.
  15123.     In the case of an Exception we assume it is being copied
  15124.     so that it may be re-raised, and therefore we nil the state
  15125.     associated with the context in which the original was raised."
  15126.  
  15127.     super postCopy.
  15128.     _environmentWhenRaised := _signalFrame := 
  15129.         _continueBlock := _resignalBlock := nil
  15130. !
  15131.  
  15132. printOn: aStream
  15133.     "Append a debug description of the receiver to aStream."
  15134.  
  15135.     aStream
  15136.         basicPrint: self;
  15137.         nextPut: $(; print: self description; nextPut: $)
  15138. !
  15139.  
  15140. printTraceOn: puttableStream
  15141.     "Write the receiver's description, and a stack trace from the point
  15142.     where the receiver was raised to puttableStream. This is intended for logging 
  15143.     error details.
  15144.     N.B. This only works where the receiver was signalled within the active process, 
  15145.     because Exceptions do not record the process in which they are signalled."
  15146.  
  15147.     puttableStream
  15148.             print: self;
  15149.             cr; cr;
  15150.             nextPutAll: (self stackTrace: 20);
  15151.             cr!
  15152.  
  15153. raisingFrame
  15154.     "Private - Answer the StackFrame from which the receiver was raised (approximate
  15155.     and for debugging purposes only)."
  15156.  
  15157.     | frame |
  15158.     frame := self signalFrame sender.
  15159.     "Skip the exception handling frames - a bit crap!!"
  15160.     
  15161.     [| receiver |
  15162.     receiver := frame receiver.
  15163.     (receiver isKindOf: Exception) or: [receiver isKindOf: Exception class]] 
  15164.             whileTrue: [frame := frame sender].
  15165.     ^frame!
  15166.  
  15167. resignalAs: anException
  15168.     "Signal the argument, anException, as if it had originally been raised in place of the
  15169.     receiver. The process state at the time the receiver was raised is restored by using
  15170.     the resignal block. This is powerful, but should be used with care!!"
  15171.  
  15172.     _resignalException := anException.
  15173.     _resignalBlock value!
  15174.  
  15175. resume
  15176.     "Answer <nil> as the value of the message that signaled this exception, 
  15177.     from whence execution continues, unless the current handler was activated
  15178.     as the result of a #outer action from an inner handler, in which case nil
  15179.     is returned to that handler, and execution continues there.
  15180.     Note that this message never returns to its sender.
  15181.     An error is signalled if the receiver is not resumable."
  15182.  
  15183.     self resume: nil!
  15184.  
  15185. resume: resumptionValue
  15186.     "Answer the <Object> resumptionValue as the result of the expression which 
  15187.     signalled this exception, from whence execution continues, unless the current 
  15188.     handler was activated as the result of a #outer action from an inner handler, 
  15189.     in which case resumptionValue is returned to that handler, and execution 
  15190.     continues there. Note that this message never returns to its sender.
  15191.     An error is signalled if the receiver is not resumable."
  15192.  
  15193.     self isResumable 
  15194.         ifTrue: [_continueBlock value: resumptionValue]
  15195.         ifFalse: [self error: 'non-continuable exception']!
  15196.  
  15197. retry
  15198.     "Abort the current exception handler and reattempt the evaluation of the try block.
  15199.     Note that this message does not return to its sender. Please use with care as it is
  15200.     easy to create an infinite loop by retrying a block indefinitely."
  15201.  
  15202.     _activeHandler retry!
  15203.  
  15204. retryUsing: alternativeBlock
  15205.     "Using the <niladicBlock>, alternativeBlock, in place of the try block from which the 
  15206.     receiver was raised, ignore the exception and retry in that context. This message does 
  15207.     not return to its sender.
  15208.     This should be used with particular care, as this is undoubtedly a most excellent 
  15209.     mechanism for the construction of excessively convoluted programs."
  15210.  
  15211.     _activeHandler retryUsing: alternativeBlock!
  15212.  
  15213. return
  15214.     "Answer <nil> as the value of the block guarded by the active exception handler.
  15215.     This message does not return to its sender."
  15216.  
  15217.     self return: nil!
  15218.  
  15219. return: returnValue
  15220.     "Answer the <Object> argument, returnValue, as the value of the block guarded by the 
  15221.     active exception handler. This message does not return to its sender."
  15222.  
  15223.     _activeHandler return: returnValue!
  15224.  
  15225. severityClass
  15226.     "Answer an exception class describing the severity of the notification."
  15227.  
  15228.     ^self class severityClass!
  15229.  
  15230. signal
  15231.     "Raise (or re-raise) the receiver in the context of the current active process, causing its propagation 
  15232.     up through the handler chain."
  15233.  
  15234.     _environmentWhenRaised isNil ifTrue: [
  15235.         "Save info about the raising environment in case we want to resignal."
  15236.         _environmentWhenRaised := Processor activeProcess exceptionEnvironment.
  15237.         "If the signaller did not specify the context where the error was raised, make it this one"
  15238.         _signalFrame := thisContext].
  15239.     ^self _propagate!
  15240.  
  15241. signal: signalText
  15242.     "Raise the receiver with the <readableString> error message text,
  15243.     signalText."
  15244.  
  15245.     self messageText: signalText.
  15246.     ^self signal!
  15247.  
  15248. signal: signalText with: arg
  15249.     "Raise the receiver with the <readableString> error message text,
  15250.     signalText and the <Object> tag, arg."
  15251.  
  15252.     self messageText: signalText.
  15253.     self tag: arg.
  15254.     ^self signal!
  15255.  
  15256. signalFrame
  15257.     "Private - Answer the StackFrame from which the receiver was signalled. This may be several 
  15258.     levels below the actual error detection frame on the stack."
  15259.  
  15260.     ^Processor activeProcess frameAtAddress: _signalFrame!
  15261.  
  15262. signalType
  15263.     "Private - Answer the type of signal for which the receiver is representing
  15264.     an exceptional event."
  15265.  
  15266.     ^self class!
  15267.  
  15268. signalWith: anObject
  15269.     "Raise the receiver with the <Object> tag."
  15270.  
  15271.     ^self signal: nil with: anObject!
  15272.  
  15273. stackTrace: anInteger
  15274.     "Private - Answer a <readableString> containing a stack trace to the depth specified by the <integer>
  15275.     argument. Assumes that the receiver is a signalled exception in the active process."
  15276.     
  15277.     | frame |
  15278.     frame := self raisingFrame.    "N.B. Assumes in active process"
  15279.     ^frame process stackTraceFrom: self raisingFrame depth: anInteger!
  15280.  
  15281. sunitExitWith: aValue
  15282.     self return: aValue!
  15283.  
  15284. tag
  15285.     "Answer the <Object> tag value with additional error details supplied 
  15286.     when the receiver was signalled. If the signaller has not provided a tag
  15287.     then answer the #messageText. 
  15288.     N.B. The tag should be used when examining exceptions, rather than the 
  15289.     message text, since the latter is intended only for human consumption, 
  15290.     and might, for example, vary between locales."
  15291.  
  15292.     ^tag ifNil: [self messageText]!
  15293.  
  15294. tag: signalTag
  15295.     "Private - Set the receiver's tag object to be the <Object> argument, signalTag.
  15296.     Answer the receiver."
  15297.  
  15298.     tag := signalTag!
  15299.  
  15300. toTrace
  15301.     "Print details of the Exception to the session managers debug output device."
  15302.     
  15303.     self toTrace: 0!
  15304.  
  15305. toTrace: frames
  15306.     "Print details of the Exception to the session managers debug output device,
  15307.     along with a stack track of depth as specified by the <integer>, frames."
  15308.     
  15309.     | sesh |
  15310.     sesh := SessionManager current.
  15311.     sesh trace: self description, String lineDelimiter.
  15312.     frames > 0 ifTrue: [ | proc |
  15313.         proc := Processor activeProcess.
  15314.         sesh trace: (proc stackTraceFrom: proc topFrame sender depth: frames), String lineDelimiter].! !
  15315.  
  15316. ExceptionHandlerAbstract comment:
  15317. ''!
  15318. !ExceptionHandlerAbstract class methodsFor!
  15319.  
  15320. initialize
  15321.     "Initialize the receiver's class instance variable."
  15322.  
  15323.     RetryCookie := Object new!
  15324.  
  15325. on: selector do: action
  15326.     "Private - Answer a new instance of the receiver with the <exceptionSelector>, 
  15327.     selector, and <monadicBlock> exception handler, action."
  15328.  
  15329.     ^self new on: selector do: action! !
  15330.  
  15331. !ExceptionHandlerAbstract methodsFor!
  15332.  
  15333. actionFor: exception
  15334.     "Private - Answer a <monadicBlock> handler for the <exceptionDescription> 
  15335.     argument, exception or nil if the receiver has no appropriate handler."
  15336.  
  15337.     ^self subclassResponsibility!
  15338.  
  15339. markAndTry
  15340.     "Private - Evaluate the receiver's tryBlock, having first created the block used to return 
  15341.     to the context which originated the receiver (i.e. the sender of #on:do:). The returnBlock, 
  15342.     when evaluated, will cause a non-local return to the context where the receiver was instantiated, 
  15343.     and is used to implement returning from (or dropping off the end of) exception handlers."
  15344.  
  15345.     returnContinuation := [:answer | ^answer].
  15346.     ^protectedBlock value!
  15347.  
  15348. outer
  15349.     "Private - Answer the receiver's outer handler."
  15350.     
  15351.     ^outer!
  15352.  
  15353. printOn: aStream
  15354.     "Append a short textual description of the receiver to aStream."
  15355.  
  15356.     aStream
  15357.         basicPrint: self;
  15358.         nextPut: $(;
  15359.         print: protectedBlock;
  15360.         nextPut: $)!
  15361.  
  15362. retry
  15363.     "Private - Attempt the receiver's try block again. The user supplied handler block could 
  15364.     have modified the try block, so this may not mean re-evaluating the same block. If not, 
  15365.     then the user-supplied handler block should have taken some other remedial action so that 
  15366.     the same exception is not regenerated, as otherwise an infinite loop may result. Use with care.
  15367.     Implementation Note: Return the unique Retry cookie which to distinguish from any other
  15368.     return value."
  15369.  
  15370.     self return: RetryCookie!
  15371.  
  15372. retryUsing: newProtectedBlock
  15373.     "Private - Restart the expression (#on:do:) from which the receiver originated, but 
  15374.     with the different try Block, newProtectedBlock. Use sparingly, and with care as the 
  15375.     results may be difficult to predict."
  15376.  
  15377.     protectedBlock := newProtectedBlock.
  15378.     self retry!
  15379.  
  15380. return: anObject
  15381.     "Private - Answer the argument as the value of the receiver's try block (which must have generated an exception caught
  15382.     by the receiver). The returnBlock contains a non-local return, so it will unwind the stack back to the
  15383.     context which was trying to evaluate the guarded block."
  15384.  
  15385.     returnContinuation value: anObject!
  15386.  
  15387. try: niladicBlock 
  15388.     "Private - Answer the result of evaluating niladicBlock within an exception environment
  15389.     established by pushing the receiver onto the active processes exception environment.
  15390.     Should an exception be generated, directly or indirectly, by niladicBlock, which is 
  15391.     caught by the receiver, then the corresponding handler block in the receiver will be 
  15392.     will be evaluated to handle it. If the receiver does not handle a raised exception then 
  15393.     that exception will propagate up the handler chain in the process' exception environment."
  15394.  
  15395.     | old answer process |
  15396.     protectedBlock := niladicBlock.
  15397.     process := Processor activeProcess.
  15398.     outer := old := process exceptionEnvironment.
  15399.     
  15400.     [process exceptionEnvironment: self.
  15401.     [(answer := self markAndTry) == RetryCookie] whileTrue] 
  15402.             ensure: [process exceptionEnvironment: old].
  15403.     returnContinuation := nil.
  15404.     ^answer! !
  15405.  
  15406. ExceptionSet comment:
  15407. 'ExceptionSet is a system class forming part of the Dolphin exception handling system''s implementation. It is used to collect together multiple <exceptionSelector>s specified in a comma separated list as the first argument to a #on:do: message to a <niladicBlock>.'!
  15408. !ExceptionSet class methodsFor!
  15409.  
  15410. new
  15411.     "Answer a new instance of the receiver."
  15412.  
  15413.     ^super new initialize!
  15414.  
  15415. with: selector1 with: selector2
  15416.     "Private - Answer a new instance of the receiver containing 
  15417.     the <exceptionSelector> arguments, selector1 and selector2"
  15418.  
  15419.     ^super new
  15420.         selectors: (OrderedCollection with: selector1 with: selector2)! !
  15421.  
  15422. !ExceptionSet methodsFor!
  15423.  
  15424. , anotherException
  15425.     "Add the <exceptionSelector>, anotherException, to the group of 
  15426.     <exceptionSelectors> recognised by the receiver.
  15427.     The ANSI standard does not specify whether the answer is a new
  15428.     exceptionSet, or the receiver - we answer the receiver."
  15429.  
  15430.     selectors add: anotherException!
  15431.  
  15432. handles: exception
  15433.     "Answer whether the receiver contains an <exceptionSelector> which
  15434.     matches the <exceptionDescription>, exception."
  15435.  
  15436.     ^selectors anySatisfy: [:es | es handles: exception]!
  15437.  
  15438. initialize
  15439.     "Initialize the receiver."
  15440.  
  15441.     selectors := OrderedCollection new!
  15442.  
  15443. selectors
  15444.     "Answer the value of the receiver's instance variable 'selectors'.
  15445.     This method was automatically generated, but may be modified."
  15446.  
  15447.     ^selectors!
  15448.  
  15449. selectors: anObject
  15450.     "Set the value of the receiver's instance variable 'selectors' to anObject.
  15451.     This method was automatically generated, but may be modified."
  15452.  
  15453.     selectors := anObject! !
  15454.  
  15455. ExternalCallback comment:
  15456. ''!
  15457. !ExternalCallback class methodsFor!
  15458.  
  15459. block: aBlockClosure argumentTypes: aString
  15460.     "Answer a new subinstance of the receiver appropriate for dispatching callbacks
  15461.     to the block, aBlockClosure, with the specified argument types."
  15462.  
  15463.     ^(BlockCallback new)
  15464.         block: aBlockClosure;
  15465.         descriptor: (self descriptorClass argumentTypes: aString);
  15466.         yourself!
  15467.  
  15468. block: aBlockClosure descriptor: anExternalDescriptor
  15469.     "Answer a new subinstance of the receiver appropriate for dispatching callbacks
  15470.     to the block, aBlockClosure, with the specified descriptor."
  15471.  
  15472.     ^(BlockCallback new)
  15473.         block: aBlockClosure;
  15474.         descriptor: anExternalDescriptor;
  15475.         yourself!
  15476.  
  15477. cacheProcAddress
  15478.     "Private - Save down the VM callback entry point proc address into the
  15479.     thunk template."
  15480.  
  15481.     ThunkTemplate
  15482.         dwordAtOffset: ProcAddressOffset put: VMLibrary default getGenericCallback
  15483. !
  15484.  
  15485. callback: anInteger withArgumentsAt: anAddress
  15486.     "Private - Ask the receiver's instance with the cookie, anInteger, to evaluate itself
  15487.     with arguments constructed from the raw data at anAddress (in the stack)"
  15488.  
  15489.     ^(self fromCookie: anInteger) valueWithArgumentsAt: anAddress!
  15490.  
  15491. callbackPrimitive
  15492.     "Private - Answer the index of the callback method primitive (which is only a marker)."
  15493.  
  15494.     ^0!
  15495.  
  15496. clear
  15497.     "Private - Clear down the registry of outstanding instances of the receiver.
  15498.     WARNING: THIS IS LIKELY TO REDUCE THE EFFECTIVENESS OF A RUNNING IMAGE."
  15499.  
  15500.     Registry := WeakRegistry new!
  15501.  
  15502. descriptorClass
  15503.     "Private - Answer the class used to build and represent function descriptors."
  15504.  
  15505.     ^ExternalDescriptor!
  15506.  
  15507. fromCookie: anInteger
  15508.     "Answer the receiver's registered instance with the cookie, anInteger. If there is no such
  15509.     instance, raise a NotFoundError/BoundsError."
  15510.  
  15511.     | inst |
  15512.     inst := Registry at: anInteger.
  15513.     ^inst isNil 
  15514.         ifTrue: [self errorNotFound: anInteger]
  15515.         ifFalse: [inst]
  15516. !
  15517.  
  15518. initialize
  15519.     "Private - Initialize the receiver's class variables.
  15520.  
  15521.         Registry        -    Array of currently registered instances of the receiver.
  15522.         ThunkTemplate    -    Proc. instance template used as the basis of the individual
  15523.                         external callback thunks. Allocated from fixed space so it does not move.
  15524.  
  15525.         ExternalCallback initialize
  15526.     "
  15527.     | n |
  15528.  
  15529.     Registry isNil ifTrue: [ self clear ].
  15530.     ThunkTemplate := ByteArray newFixed: 20.
  15531.     n := -1.
  15532.     ThunkTemplate
  15533.     "    byteAtOffset: (n := n + 1) put: 16rCC;"
  15534.         byteAtOffset: (n := n + 1) put: 16r54;        "push esp - value of esp saved is that before push"
  15535.         byteAtOffset: (n := n + 1) put: 16r68;        "push <callback id>"
  15536.         dwordAtOffset: (n := n + 1) put: 0.        "Id will be substituted here"
  15537.     IdOffset := n.
  15538.     ThunkTemplate
  15539.         "Calls normally have a relative displacement (unless far) so call through a register"
  15540.         byteAtOffset: (n := n + 4) put: 16rB8.        "mov    eax, GenericCallback"
  15541.     ProcAddressOffset := (n := n + 1).
  15542.     self cacheProcAddress.
  15543.     ThunkTemplate
  15544.         byteAtOffset: (n := n + 4) put: 16rFF;        "call    eax"
  15545.         byteAtOffset: (n := n + 1) put: 16rD0;
  15546.         byteAtOffset: (n := n + 1) put: 16rC2;        "ret    <argsSize>"
  15547.         wordAtOffset: (n := n + 1) put: 0.        "argument size will be substituted here"
  15548.     ArgSizeOffset := n.
  15549.     ThunkTemplate resize: n+2!
  15550.  
  15551. new
  15552.     "Answer a new registered instance of the receiver with a unique magic cookie."
  15553.  
  15554.     | answer |
  15555.     answer := self basicNew.
  15556.     answer cookie: (self register: answer).
  15557.     ^answer!
  15558.  
  15559. onStartup
  15560.     "Private - The system is starting. Perform necessary initialization.
  15561.     We clear down old callbacks as these can no longer be valid. We must
  15562.     also re-establish the VM entry point proc. address, as this may change."
  15563.  
  15564.     self clear.
  15565.     self cacheProcAddress
  15566.     !
  15567.  
  15568. receiver: anObject prototype: anExternalMethod
  15569.     #deprecated.    "Use #receiver:selector:descriptor:"
  15570.     self assert: 
  15571.             [(anExternalMethod isKindOf: ExternalMethod) 
  15572.                 and: [anExternalMethod primitiveIndex == self callbackPrimitive]].
  15573.     ^MessageCallback 
  15574.         receiver: anObject
  15575.         selector: anExternalMethod selector
  15576.         descriptor: anExternalMethod descriptor!
  15577.  
  15578. receiver: anObject prototype: anExternalMethod closure: extraObject
  15579.     #deprecated.    "Use #receiver:selector:descriptor: and #closure:"
  15580.     ^(self receiver: anObject prototype: anExternalMethod) 
  15581.         closure: extraObject!
  15582.  
  15583. receiver: anObject selector: aSymbol
  15584.     #deprecated.    "Use #receiver:selector:descriptor:"
  15585.     ^self receiver: anObject prototype: (anObject class definitionOf: aSymbol)!
  15586.  
  15587. receiver: anObject selector: aSymbol closure: extraObject
  15588.     #deprecated.    "Use #receiver:selector:descriptor: and #closure:"
  15589.     ^(self receiver: anObject selector: aSymbol) closure: extraObject!
  15590.  
  15591. receiver: anObject selector: aSymbol descriptor: anExternalDescriptor
  15592.     "Answer a new instance of the receiver configured to send the <selector>, aSymbol,
  15593.     to the <Object>, anObject, when invoked as a callback with descriptor, anExternalDescriptor."
  15594.  
  15595.     ^(MessageCallback new)
  15596.         receiver: anObject;
  15597.         selector: aSymbol;
  15598.         descriptor: anExternalDescriptor;
  15599.         yourself!
  15600.  
  15601. register: instance
  15602.     "Private - Register the subinstance of the receiver, instance, answering its
  15603.     unique integer cookie."
  15604.  
  15605.     ^Registry addAnsweringIndex: instance! !
  15606.  
  15607. !ExternalCallback methodsFor!
  15608.  
  15609. argumentCount
  15610.     "Private - Answer the number of arguments expected by the receiver."
  15611.  
  15612.     ^descriptor argumentCount!
  15613.  
  15614. argumentsSize
  15615.     "Private - Answer the total size of the receiver's arguments (when
  15616.     pushed on the stack)."
  15617.  
  15618.     ^descriptor argumentsSize!
  15619.  
  15620. argumentTypes
  15621.     "Private - Answer a collection of the argument types expected by the receiver."
  15622.  
  15623.     ^descriptor argumentTypes!
  15624.  
  15625. asParameter
  15626.     "Answer the receiver in a form suitable for passing as a callback function."
  15627.  
  15628.     ^self thunk!
  15629.  
  15630. callingConvention
  15631.     "Private - Answer the number of arguments expected by the receiver."
  15632.  
  15633.     ^descriptor callingConvention!
  15634.  
  15635. cookie
  15636.     "Answer the callbacks unique (among callbacks) magic cookie (actually an index 
  15637.     into the callback registry). This is not private, as it may be useful for some
  15638.     user code."
  15639.  
  15640.     ^cookie!
  15641.  
  15642. cookie: anInteger
  15643.     "Private - Set the callbacks magic cookie. Answer the receiver."
  15644.  
  15645.     cookie := anInteger!
  15646.  
  15647. descriptor
  15648.     "Private - Answer the external function descriptor of the callback function which the receiver
  15649.     represents. See ExternalMethod for further details of argument types etc."
  15650.  
  15651.     ^descriptor!
  15652.  
  15653. descriptor: anExternalFunctionDescriptor
  15654.     "Private - Set the external function descriptor of the callback function which the receiver
  15655.     represents. See ExternalMethod for further details of argument types etc."
  15656.  
  15657.     descriptor := anExternalFunctionDescriptor!
  15658.  
  15659. free
  15660.     "Explicitly free any resources consumed by the receiver as it is no longer required.
  15661.     Sending this message reduces the load on the MemoryManager, but it is not 
  15662.     strictly necessary. Do not free a callback that is still use!!"
  15663.  
  15664.     "There is no process sync problem here because the receiver cannot be GC'd while
  15665.     in this method, and therefore it cannot be replaced in the registry by another
  15666.     callback"
  15667.  
  15668.     (Registry at: cookie ifAbsent: []) == self
  15669.         ifTrue: [Registry removeAtIndex: cookie].
  15670.     thunk := nil!
  15671.  
  15672. makeProcInstance
  15673.     "Private - The receiver has been allocated the id, anInteger. Create
  15674.     a callback thunk for it. Use an ExternalBytes object which is guaranteed
  15675.     not to be moved by the MemoryManager."
  15676.  
  15677.     thunk := ThunkTemplate copy.
  15678.     thunk dwordAtOffset: IdOffset put: cookie.
  15679.     descriptor calleeCleans
  15680.         ifTrue: [thunk wordAtOffset: ArgSizeOffset put: self argumentsSize]!
  15681.  
  15682. thunk
  15683.     "Private - Answer the receiver's assembler thunk."
  15684.  
  15685.     thunk isNil ifTrue: [ self makeProcInstance ].
  15686.     ^thunk!
  15687.  
  15688. valueWithArgumentsAt: anAddress
  15689.     "Private - Evaluate the receiver with arguments instantiated from the raw data at anAddress.
  15690.     For performance and consistency (with outbound external calls) reasons, we use a VM supplied
  15691.     primitive to instantiate and push the arguments and perform the message, but there is no reason
  15692.     that this cannot be done in Smalltalk if different argument conversions are required. The standard
  15693.     conversions are the same as those performed for return types by the external call primitive (see
  15694.     the ExternalLibrary class)."
  15695.  
  15696.     ^self subclassResponsibility! !
  15697.  
  15698. ExternalDescriptor comment:
  15699. 'The argument/return types supported by the primitive DLL call function are:
  15700.  
  15701.     void     Only valid as a return type - the method answers self
  15702.     lpvoid     General pointer type, accepts byte objects e.g. Strings (pointer to contents 
  15703.         passed), nil (null pointer), integers (passes as address), or ExternalAddresses
  15704.         (the contained address is passed, not a pointer to the ExternalAddress object). 
  15705.         When used as a return type, the method answers an instance of ExternalAddress.
  15706.     lppvoid    Pointer to pointer. Used for functions which take a parameter into which they write
  15707.         an address. The corresponding argument must be an ExternalAddress (or other indirection
  15708.         object), or an object whose first instance variable is such (e.g. an ExternalStructure).
  15709.         The address of the ExternalAddress itself is passed, so that on return it contains the
  15710.         address written back by the external function. nil is not a valid argument value.
  15711.         As a return type answers a pointer instance of LPVOID (i.e. LPVOID* = void**).
  15712.     char    Signed character. Accepts Characters only.
  15713.     byte    Unsigned byte. Accepts SmallIntegers only. Passes a 32-bit value
  15714.         generated by zero extending the least significant byte. Fails if  not in the
  15715.         range 0..255. Zero extends into a positive SmallInteger when a return value.
  15716.     sbyte    Signed byte. Accepts SmallIntegers only. Passes a 32-bit value generated
  15717.         by sign extending the least significant byte. Fails if not in range -128..127.
  15718.         Sign extends into a positive or negative SmallInteger when a return value.
  15719.     word     Unsigned word. As #byte, but 16-bit, acceptable range 0..65535.
  15720.         Also accepts a byte object of size 2, which is zero extended to 32-bits.
  15721.     sword     Signed word. As #sbyte, but 16-bit, acceptable range -32768..32767.
  15722.         Also accepts a byte object of size 2, which is sign extended to 32-bits.
  15723.     dword    Unsigned double word (32-bits), accepts 32-bit Integers. Positive integers
  15724.         are passed as unsigned, and negative integers in their two''s complement
  15725.         representation.  The largest negative LargeInteger which can be passsed
  15726.         is -16r80000000 (or -2147483648) because this is the largest negative number 
  15727.         which can be represented in 32-bits in two''s complement notation.
  15728.         Also accepts byte objects of length 4, assumed to be in an unsigned bit representation.
  15729.         nil is passed as 0. As a return type, answers a SmallInteger, or a LargeInteger if the
  15730.         result cannot be represented as a positive SmallInteger (i.e. in 30 bits).
  15731.     sdword    Signed double word, accepts any Integer in the range -16r80000000..16r7FFFFFFF
  15732.         (i.e. Integer''s with a 32-bit two''s complement representation - all SmallIntegers and
  15733.         4-byte LargeIntegers). May also be other byte objects of length 4, which are 
  15734.         assumed to contain a 2''s complement 32-bit number.
  15735.         As a return type answers a SmallInteger, or, if more than 31-bits are required 
  15736.         to represent the two''s complement result, a LargeInteger. Also accepts nil (passed as 0).
  15737.     qword    Unsigned quad word. Similar to dword, but 64-bit (i.e. the range is -16r8000000000000000,
  15738.         the largest 64-bit two''s complement negative integer, up to 16rFFFFFFFFFFFFFFF the largest positive 
  15739.         unsigned 64-bit integer). 8-byte objects are acceptable and assumed to contain the correct unsigned
  15740.         bit representation. nil is passed as 0.
  15741.     sqword    Signed quad word. Accepts any Integer in the range which can be represented as a
  15742.         two''s complement number in 64 bits (i.e. -16r8000000000000000 to 16r7FFFFFFFFFFFFFFF).
  15743.         Also accepts 8 byte objects, which are assumed to contain 64-bit two''s complement numbers. 
  15744.         nil is passed as 0. As a return type answers the smallest Integer form which can contain 
  15745.         the 64-bit two''s complement integer.
  15746.     bool    Boolean. As an argument type, accepts true (translated to 1) or false
  15747.         (translated to 0). Also accepts SmallInteger values, pushing their host
  15748.         machine representation. As a return type, if the result is 0 answers false,
  15749.         if the result is non-zero, answers true.
  15750.     handle    32-bit handle. Accepts 32-bit integers, nil, or a byte object of size 4. 
  15751.         As a return type, answers an ExternalHandle, unless the
  15752.         returned handle is NULL, in which case answers ''nil''.
  15753.     double    64-bit floating point. Accepts instances of class Float (which contains
  15754.         a host machine representation of a double precision floating point number). 
  15755.         SmallIntegers may also be passed (they are promoted to the double precision
  15756.         floating point representation of their integral value). As a return type,
  15757.         answers an instance of class Float.
  15758.     lpstr    Pointer to C (null-terminated) ASCII string type. Accepts null terminated byte 
  15759.         objects (e.g. Strings, Symbols) or nil (null pointer). When used as a return type, 
  15760.         answers a String containing the characters of the C string up to the null terminator. 
  15761.         Unlike lpvoid, does not accept integer values as pointers, or ExternalAddress 
  15762.         (indirection) objects. If the validation is too tight for your requirements, then 
  15763.         use lpvoid. Do not use this return type where an external function is called which 
  15764.         expects the caller to assume ownership of the returned string, and to delete it when 
  15765.         it is no longer required, as a memory leak will result (use lpvoid instead).
  15766.     oop    Object identifier. Any non-SmallInteger can be passed. This parameter type
  15767.         is intended for use with the forthcoming User Primitive Kit. The value should
  15768.         be treated as an opaque Handle, and should not be stored for later use (it
  15769.         may change during a GC). As a return type, answers the object whose Oop is 
  15770.         the result. At present it is recommended that you do not use this type.
  15771.     float    32-bit floating point. Accepts instances of class Float, or SmallIntegers
  15772.         (as #double). The conversion of Floats (64-bit double precision) to #float 
  15773.         (32-bit single precision) may result in silent loss of precision. As a return
  15774.         type answers an instance of class Float (i.e. promotes to double precision).
  15775.     hresult    32-bit signed integer value. Validation as #sdword. As a return type, if less than
  15776.         0 (i.e. severity is error), causes the external call primitives to fail with a negative 
  15777.         failure reason which is the HRESULT value. This is convenient because it means an
  15778.         exception is automatically generated when an external function returns an HRESULT error.
  15779.     <struct>    Where <struct> is an ExternalStructure class name. Structure passed by value. Accepts 
  15780.         only the exact matching structure class. Again, the ExternalStructure arguments may be
  15781.         reference/pointer instances. When used as a return value, an instance of the 
  15782.         ExternalStructure class is answered, with the bytes of the returned structure as its contents
  15783.         (copied into a ByteArray).
  15784.     <struct>*    Where <struct> is an ExternalStructure class name. When used as a return type, a pointer
  15785.         instance of the ExternalStructure is answered, with an ExternalAddress pointing at the
  15786.         externally stored value as its first instance variable.
  15787.     <struct>**Equivalent to lppvoid.
  15788.     
  15789. Note that in general, the UndefinedObject, nil, is interchangeable with 0, or NULL, when interfacing with external library functions. Nullness can be tested with the #isNull message, with the UndefinedObject and SmallInteger zero answering true.'!
  15790. !ExternalDescriptor class methodsFor!
  15791.  
  15792. argumentTypes: argString
  15793.     "Answer an instance of the receiver instantiated from the argument, which
  15794.     is a String specifying a list of argument types in the standard Dolphin
  15795.     format. The return type is defaulted to 'dword' and the calling convention
  15796.     to 'stdcall:'."
  15797.  
  15798.     ^self
  15799.         returnType: 'dword'
  15800.         argumentTypes: argString!
  15801.  
  15802. callingConvention: convString returnType: retString argumentTypes: argString
  15803.     "Answer an instance of the receiver instantiated from the arguments
  15804.     specifying, respectively, the calling convention, return type, and argument
  15805.     types as parseable strings."
  15806.  
  15807.     ^self fromString: convString, ' ', retString, ' ', argString!
  15808.  
  15809. conventionFromName: aString
  15810.     "Answer the type name for the specified integer type."
  15811.  
  15812.     ^(CallingConventions indexOf: aString)-1!
  15813.  
  15814. descriptor: aByteArray literals: aSequenceableCollection
  15815.     "Private - Answer an instance of the receiver instantiated from the arguments."
  15816.  
  15817.     ^(self new: aSequenceableCollection size)
  15818.         descriptor: aByteArray;
  15819.         literals: aSequenceableCollection;
  15820.         yourself!
  15821.  
  15822. externalTypes
  15823.     ^ExternalTypes!
  15824.  
  15825. fromString: aString
  15826.     "Answer an instance of the receiver instantiated from the argument, which
  15827.     is a Dolphin format external function descriptor, e.g:
  15828.  
  15829.         ExternalDescriptor fromString: 'stdcall: hresult Blah GUID* lppvoid'
  15830.  
  15831.     Implementation Note: As ExternalDescriptors are immutable, they can be shared
  15832.     in order to save space. This facility can be turned off by setting the Shared
  15833.     lookup table (which is weak by default) to nil. Bear in mind, however, that
  15834.     quite a lot of space might otherwise be occupied by descriptors if there
  15835.     are a large number of callback functions in the image."
  15836.  
  15837.     Shared isNil ifTrue: [^self newFromString: aString].    
  15838.     ^Shared at: aString 
  15839.         ifAbsentPut: [self newFromString: aString]!
  15840.  
  15841. initialize
  15842.     "Private - Initialize the class variables of the receiver.
  15843.         self initialize
  15844.     "
  15845.  
  15846.     #todo.    "Share this table with the parser"
  15847.     ExternalTypes := LookupTable new.
  15848.  
  15849.     "N.B.  void is not valid as argument (unless indirected), only for return"
  15850.     ExternalTypes at: 'void' put: ExtCallArgVOID -> ExtCallArgLPVOID.
  15851.     ExternalTypes
  15852.         at: 'lpvoid' put: ExtCallArgLPVOID -> ExtCallArgLPPVOID;
  15853.         at: 'char' put: ExtCallArgCHAR -> ExtCallArgLPSTR;
  15854.         at: 'byte' put: ExtCallArgBYTE -> ExtCallArgLPVOID;
  15855.         at: 'sbyte' put: ExtCallArgSBYTE -> ExtCallArgLPVOID;
  15856.         at: 'word' put: ExtCallArgWORD -> #WORD;
  15857.         at: 'sword' put: ExtCallArgSWORD -> #SWORD;
  15858.         at: 'dword' put: ExtCallArgDWORD -> #DWORD;
  15859.         at: 'sdword' put: ExtCallArgSDWORD -> #SDWORD;
  15860.         at: 'bool' put: ExtCallArgBOOL -> #DWORD;
  15861.         at: 'handle' put: ExtCallArgHANDLE -> #DWORD;
  15862.         at: 'double' put: ExtCallArgDOUBLE -> #DOUBLE;
  15863.         at: 'lpstr' put: ExtCallArgLPSTR -> ExtCallArgLPPVOID;
  15864.         at: 'oop' put: ExtCallArgOOP -> ExtCallArgLPPVOID;
  15865.         at: 'float' put: ExtCallArgFLOAT -> #FLOAT;
  15866.         at: 'lppvoid' put: ExtCallArgLPPVOID -> nil;
  15867.         at: 'hresult' put: ExtCallArgHRESULT -> #HRESULT;
  15868.         at: 'lpwstr' put: ExtCallArgLPWSTR -> ExtCallArgLPPVOID;
  15869.         at: 'qword' put: ExtCallArgQWORD -> #ULARGE_INTEGER;
  15870.         at: 'sqword' put: ExtCallArgSQWORD -> #LARGE_INTEGER;
  15871.         at: 'ote' put: ExtCallArgOTE -> ExtCallArgLPPVOID;
  15872.         at: 'bstr' put: ExtCallArgBSTR -> ExtCallArgLPPVOID;
  15873.         at: 'variant' put: ExtCallArgVARIANT -> #VARIANT;
  15874.         at: 'date' put: ExtCallArgDATE -> #DATE;
  15875.         at: 'varbool' put: ExtCallArgVARBOOL -> #VARIANT_BOOL;
  15876.         at: 'guid' put: ExtCallArgGUID -> #REFGUID.
  15877.  
  15878.     "Maximum arg type value is currently 31"
  15879.     RetTypeMask := ExtCallArgCOMPTR.
  15880.  
  15881.     "The following types take arguments (in literal frame if a method)"
  15882.     ExternalTypes
  15883.         at: 'struct:' put: ExtCallArgSTRUCT -> ExtCallArgLPVOID;
  15884.         at: 'struct4:' put: ExtCallArgSTRUCT4 -> ExtCallArgLPVOID;
  15885.         at: 'struct8:' put: ExtCallArgSTRUCT8 -> ExtCallArgLPVOID;
  15886.         at: 'lp:' put: ExtCallArgLP -> ExtCallArgLPPVOID;
  15887.  
  15888.         at: 'comptr:' put: ExtCallArgCOMPTR -> ExtCallArgLPPVOID.
  15889.  
  15890.     "Init the reverse mapping of the type enumeration to string names"
  15891.     TypeNames := Array new: 32.
  15892.     ExternalTypes 
  15893.         keysAndValuesDo: [:eachKey :eachValue | TypeNames at: eachValue key + 1 put: eachKey].
  15894.  
  15895.     "Add mappings for classes with built-in types"
  15896.     ExternalTypes
  15897.         at: 'ExternalAddress' put: (ExternalTypes at: 'lpvoid');
  15898.         at: 'ExternalHandle' put: (ExternalTypes at: 'handle');
  15899.         at: 'BSTR' put: (ExternalTypes at: 'bstr');
  15900.         at: 'VARIANT' put: (ExternalTypes at: 'variant');
  15901.         at: 'SDWORD' put: (ExternalTypes at: 'sdword');
  15902.         at: 'DWORD' put: (ExternalTypes at: 'dword');
  15903.         at: 'LPVOID' put: (ExternalTypes at: 'lpvoid');
  15904.         at: 'DOUBLE' put: (ExternalTypes at: 'double');
  15905.         at: 'FLOAT' put: (ExternalTypes at: 'float');
  15906.         at: 'HRESULT' put: (ExternalTypes at: 'hresult');
  15907.         at: 'BYTE' put: (ExternalTypes at: 'byte');
  15908.         at: 'SBYTE' put: (ExternalTypes at: 'sbyte');
  15909.         at: 'WORD' put: (ExternalTypes at: 'word');
  15910.         at: 'SWORD' put: (ExternalTypes at: 'sword');
  15911.         at: 'LPWSTR' put: (ExternalTypes at: 'lpwstr');
  15912.         at: 'QWORD' put: (ExternalTypes at: 'qword');
  15913.         at: 'ULARGE_INTEGER' put: (ExternalTypes at: 'qword');
  15914.         at: 'SQWORD' put: (ExternalTypes at: 'sqword');
  15915.         at: 'LARGE_INTEGER' put: (ExternalTypes at: 'sqword');
  15916.         at: 'GUID' put: (ExternalTypes at: 'guid');
  15917.         at: 'IID' put: (ExternalTypes at: 'guid');
  15918.         at: 'CLSID' put: (ExternalTypes at: 'guid');
  15919.         at: 'VARIANT_BOOL' put: (ExternalTypes at: 'varbool');
  15920.         at: 'DATE' put: (ExternalTypes at: 'date').
  15921.     ExternalTypes shrink.
  15922.     self assert: [ExternalTypes values asSortedCollection last key < 32    "TypeSizes size"].
  15923.     "Remember that bytes and words are still pushed as 32-bit values"
  15924.     TypeSizes := #[0 4 4 4 4 4 4 4 4 4 4 8 4 4 4 4 4 4 8 8 4 4 16 8 4 16 0 4 8 4 4 4].
  15925.     CallingConventions := #('stdcall:' 'cdecl:').
  15926.     RetClassIndex := 4.
  15927.     Shared isNil ifTrue: [Shared := WeakLookupTable new]!
  15928.  
  15929. isPointerToStruct: anInteger 
  15930.     ^anInteger == ExtCallArgLP or: [anInteger == ExtCallArgCOMPTR]!
  15931.  
  15932. nameOf: typeOrdinal type: aClass 
  15933.     "Answer the type name for the specified type."
  15934.  
  15935.     ^(self typeHasArgument: typeOrdinal) 
  15936.         ifTrue: 
  15937.             [aClass name , (((self isPointerToStruct: typeOrdinal) and: [aClass isIndirection not]) 
  15938.                         ifTrue: ['*']
  15939.                         ifFalse: [''])]
  15940.         ifFalse: [TypeNames at: typeOrdinal + 1]!
  15941.  
  15942. nameOfConvention: anInteger
  15943.     "Answer the calling convention name for the specified convention type ordinal."
  15944.  
  15945.     ^CallingConventions at: anInteger + 1!
  15946.  
  15947. newFromString: aString 
  15948.     "Private - Answer a new, unshared, instance of the receiver instantiated from 
  15949.     the argument, which is a Dolphin format external function descriptor, e.g:
  15950.  
  15951.         ExternalDescriptor fromString: 'stdcall: hresult GUID* lppvoid'
  15952.     "
  15953.  
  15954.     | array |
  15955.     array := self parseDescriptor: aString.
  15956.     ^self descriptor: array first literals: array second!
  15957.  
  15958. oneStringArg
  15959.     "Answer a shared instance of the receiver describing a standard function
  15960.     with a single string argument."
  15961.  
  15962.     ^self argumentTypes: 'lpstr'!
  15963.  
  15964. parseArgDesc: aString 
  15965.     "Private - Parse the next argument type from the input stream argument, aStream, answering
  15966.     an association between the type number and an optional argument (a subclass of ExternalStructure)."
  15967.  
  15968.     | qualifier typeName assoc |
  15969.     typeName := aString upTo: $*.
  15970.     qualifier := aString rightString: aString size - typeName size.
  15971.  
  15972.     "Get an association between a type code for the name and the associated indirection type code or class name"
  15973.     assoc := ExternalTypes at: typeName
  15974.                 ifAbsent: 
  15975.                     ["Not a built-in type, so try as a class..."
  15976.  
  15977.                     ExtCallArgSTRUCT -> typeName asSymbol].
  15978.     qualifier = '**' ifTrue: [^self parseDoubleIndirection: assoc typeName: typeName].
  15979.     qualifier = '*' ifTrue: [^self parseSingleIndirection: assoc].
  15980.     ^self parseValueType: assoc!
  15981.  
  15982. parseCallingConvention: aStream
  15983.     "Private - Answer the calling convention number specified by the input stream."
  15984.  
  15985.     ^self conventionFromName: aStream nextWord!
  15986.  
  15987. parseDescriptor: aString 
  15988.     "Parse a literal string which describes an external function in the standard
  15989.     Dolphin format. This is very simplistic pending Smalltalk compiler support."
  15990.  
  15991.     | descriptor literals stream argCount returnType |
  15992.     stream := aString readStream.
  15993.     descriptor := OrderedCollection new: 10.
  15994.     descriptor add: (self parseCallingConvention: stream).
  15995.     descriptor add: nil.    "Reserve slot for argument count"
  15996.     returnType := self parseArgDesc: stream nextWord.
  15997.     descriptor add: returnType key.
  15998.     descriptor add: 0.
  15999.     literals := OrderedCollection new.
  16000.     returnType value notNil ifTrue: [literals add: returnType value].
  16001.     argCount := 0.
  16002.     stream skipSeparators.
  16003.     [stream atEnd] whileFalse: 
  16004.             [| argType |
  16005.             argType := self parseArgDesc: stream nextWord.
  16006.             argCount := argCount + 1.
  16007.             descriptor add: argType key.
  16008.             argType value notNil 
  16009.                 ifTrue: 
  16010.                     [descriptor add: literals size.
  16011.                     literals add: argType value]].
  16012.     descriptor at: 2 put: argCount.
  16013.     ^Array with: descriptor with: literals!
  16014.  
  16015. parseDoubleIndirection: assoc typeName: typeName 
  16016.     | pointerType |
  16017.     pointerType := assoc value.
  16018.     "If indirection type is #lppvoid or an indirection class, then cannot doubly indirect it"
  16019.     (pointerType = ExtCallArgLPPVOID or: 
  16020.             [pointerType isInteger not and: 
  16021.                     [assoc key == ExtCallArgSTRUCT 
  16022.                         and: [(self class environment at: pointerType) isIndirection]]]) 
  16023.         ifTrue: 
  16024.             [^self error: typeName 
  16025.                         , ': Only one further level of indirection to an indirection type is possible'].
  16026.     ^ExtCallArgLPPVOID -> nil!
  16027.  
  16028. parsePointerToStruct: anAssociation 
  16029.     | structClass |
  16030.     structClass := self class environment at: anAssociation value.
  16031.     ^(structClass isIndirection and: [anAssociation key == ExtCallArgSTRUCT]) 
  16032.         ifTrue: [ExtCallArgLPPVOID -> nil]
  16033.         ifFalse: 
  16034.             [((self class environment at: #IUnknown ifAbsent: []) 
  16035.                 ifNil: [ExtCallArgLP]
  16036.                 ifNotNil: 
  16037.                     [:unkClass | 
  16038.                     (structClass includesBehavior: unkClass) 
  16039.                         ifTrue: [ExtCallArgCOMPTR]
  16040.                         ifFalse: [ExtCallArgLP]]) 
  16041.                     -> structClass]!
  16042.  
  16043. parseSingleIndirection: anAssociation 
  16044.     | pointerType |
  16045.     pointerType := anAssociation value.
  16046.     pointerType isNil 
  16047.         ifTrue: 
  16048.             [^self error: (self nameOf: anAssociation key type: anAssociation value) 
  16049.                         , ' cannot be further indirected'].
  16050.     ^pointerType isInteger not 
  16051.         ifTrue: [self parsePointerToStruct: anAssociation]
  16052.         ifFalse: [pointerType -> nil]!
  16053.  
  16054. parseStructArg: assoc 
  16055.     | structClass |
  16056.     structClass := self environment at: assoc value.
  16057.     ^(structClass isIndirection 
  16058.         ifTrue: [ExtCallArgLP]
  16059.         ifFalse: 
  16060.             [| bytes |
  16061.             bytes := structClass byteSize.
  16062.             bytes <= 4 
  16063.                 ifTrue: [ExtCallArgSTRUCT4]
  16064.                 ifFalse: [bytes <= 8 ifTrue: [ExtCallArgSTRUCT8] ifFalse: [ExtCallArgSTRUCT]]]) 
  16065.             -> structClass!
  16066.  
  16067. parseValueType: assoc 
  16068.     assoc key == ExtCallArgSTRUCT ifTrue: [^self parseStructArg: assoc].
  16069.     ^assoc key -> nil!
  16070.  
  16071. returnType: retString argumentTypes: argString
  16072.     "Answer an instance of the receiver instantiated from the argument, which
  16073.     is a String specifying a list of argument types in the standard Dolphin
  16074.     format. The return type is defaulted to 'dword' and the calling convention
  16075.     to 'stdcall:'."
  16076.  
  16077.     ^self
  16078.         callingConvention: 'stdcall:'
  16079.         returnType: retString
  16080.         argumentTypes: argString!
  16081.  
  16082. sizeOf: anInteger type: aClass 
  16083.     "Private - Answer the size of the specified type."
  16084.  
  16085.     ^anInteger == ExtCallArgSTRUCT 
  16086.         ifTrue: [aClass byteSize]
  16087.         ifFalse: [TypeSizes at: anInteger + 1]!
  16088.  
  16089. structTypeForSize: anInteger 
  16090.     "Private - Answer the structure type to use for structures of the
  16091.     specified byte size."
  16092.  
  16093.     ^anInteger <= 8 
  16094.         ifTrue: 
  16095.             [anInteger <= 4 ifTrue: [ExtCallArgSTRUCT4] ifFalse: [ExtCallArgSTRUCT8]]
  16096.         ifFalse: [ExtCallArgSTRUCT]!
  16097.  
  16098. typeFromName: typeName
  16099.     "Answer the type code for the specified <readableString> type name."
  16100.  
  16101.     ^self typeFromName: typeName ifAbsent: [self errorNotFound: typeName]!
  16102.  
  16103. typeFromName: typeName ifAbsent: exceptionHandler 
  16104.     "Answer the type code for the specified <readableString> type name, 
  16105.     or the result of executing the niladic valuable, exceptionHandler, if the
  16106.     type is not recognised."
  16107.  
  16108.     ^(ExternalTypes at: typeName ifAbsent: [^exceptionHandler value]) key!
  16109.  
  16110. typeHasArgument: ordinalType
  16111.     "Private - Answer whether the specified type (identified by ordinal) has an argument
  16112.     accompanying it."
  16113.  
  16114.     ^ordinalType >= ExtCallArgSTRUCT! !
  16115.  
  16116. !ExternalDescriptor methodsFor!
  16117.  
  16118. argumentCount
  16119.     "Private - Answer the argument count of the external function described by the receiver."
  16120.  
  16121.     ^descriptor at: 2!
  16122.  
  16123. argumentIndexFromOffset: anInteger 
  16124.     "Private - Convert a zero-based offset into the descriptor array (as used by the VM when marshalling
  16125.     the objects onto the stack for an external call) into the index of the corresponding argument. We have
  16126.     to take account of the literal indices that are embedded in the descriptor."
  16127.  
  16128.     | i offset stop |
  16129.     offset := RetClassIndex + 1.
  16130.     stop := offset + anInteger.
  16131.     i := 0.
  16132.     [offset > stop] whileFalse: 
  16133.             [| type |
  16134.             i := i + 1.
  16135.             type := descriptor at: offset.
  16136.             offset := offset + 1.
  16137.             (self class typeHasArgument: type) ifTrue: [offset := offset + 1]].
  16138.     ^i!
  16139.  
  16140. argumentsDo: operation
  16141.     "Private - Evaluate the dyadic valuable argument, operation, for each of the argument
  16142.     types of the receiver, passing the argument type and optional literal parameter#
  16143.     as the arguments."
  16144.  
  16145.     | i size |
  16146.     i := RetClassIndex + 1.
  16147.     size := descriptor size.
  16148.     [i > size] whileFalse: 
  16149.             [| type |
  16150.             type := descriptor at: i.
  16151.             i := i + 1.
  16152.             operation value: type
  16153.                 value: ((self class typeHasArgument: type) 
  16154.                         ifTrue: 
  16155.                             [i := i + 1.
  16156.                             self at: (descriptor at: i - 1) + 1])]!
  16157.  
  16158. argumentsSize
  16159.     "Private - Answer the byte size of arguments described by the argument types in 
  16160.     the receiver when pushed on the machine stack."
  16161.  
  16162.     | sum |
  16163.     sum := 0.
  16164.     self argumentsDo: [:type :class | sum := sum + (self class sizeOf: type type: class)].
  16165.     ^sum!
  16166.  
  16167. argumentTypes
  16168.     "Private - Answer a sequenceable collection containing the argument type 
  16169.     descriptions for the receiver."
  16170.  
  16171.     | types |
  16172.     types := OrderedCollection new: self argumentCount.
  16173.     self argumentsDo: [:n :type |
  16174.         types add: (self class nameOf: n type: type)].
  16175.     ^types!
  16176.  
  16177. calleeCleans
  16178.     "Answer whether the receiver describes a function which pops its own arguments
  16179.     before returning (e.g. stdcall)."
  16180.  
  16181.     ^self convention ~= 1    "cdecl is 1"!
  16182.  
  16183. callingConvention
  16184.     "Private - Answer the calling convention name of the external function described by the receiver.
  16185.     This is an integer enumeration."
  16186.  
  16187.     ^self class nameOfConvention: self convention!
  16188.  
  16189. convention
  16190.     "Private - Answer the calling convention type (a small integer)."
  16191.  
  16192.     ^descriptor first!
  16193.  
  16194. description
  16195.     "Private - Answer the descriptor string for the external function described by the receiver."
  16196.  
  16197.     | stream types |
  16198.     stream := String writeStream: 60.
  16199.     stream
  16200.         nextPutAll: self callingConvention;
  16201.         space;
  16202.         nextPutAll: self returnType.
  16203.     types := self argumentTypes.
  16204.     types notEmpty ifTrue: [stream nextPut: $,].
  16205.     self argumentTypes do: 
  16206.             [:a | 
  16207.             stream
  16208.                 space;
  16209.                 nextPutAll: a].
  16210.     ^stream contents!
  16211.  
  16212. descriptor: aCollectionOfBytes
  16213.     "Private - Set the descriptor byte array for the external function described by the receiver."
  16214.  
  16215.     descriptor := aCollectionOfBytes asByteArray!
  16216.  
  16217. literals: args
  16218.     "Set the literal argument parameters to those in the SequenceableCollection argument, args.
  16219.     Answer the receiver."
  16220.  
  16221.     args keysAndValuesDo: [:i :e | self at: i put: e]
  16222.     !
  16223.  
  16224. name
  16225.     "Answer the 'name' of the external function described by the receiver."
  16226.  
  16227.     ^'_'
  16228.     !
  16229.  
  16230. name: aString 
  16231.     "Set the 'name' of the external function described by the receiver to the argument.
  16232.     At the moment we discard this."
  16233.  
  16234.     ^self!
  16235.  
  16236. printOn: aStream
  16237.     "Append a debug description of the receiver to aStream."
  16238.  
  16239.     aStream
  16240.         basicPrint: self;
  16241.         nextPut: $(;
  16242.         display: self description;
  16243.         nextPut: $)!
  16244.  
  16245. returnType
  16246.     "Private - Answer the return type name of the external function described by the receiver.
  16247.     This is an integer enumeration."
  16248.  
  16249.     | type class |
  16250.     type := (descriptor at: 3) bitAnd: RetTypeMask.
  16251.     class := (self class typeHasArgument: type) 
  16252.                 ifTrue: [self at: (descriptor at: RetClassIndex) + 1].
  16253.     ^self class nameOf: type type: class! !
  16254.  
  16255. ExternalLibrary comment:
  16256. 'ExternalLibrary is the class of objects which represent shared, external, function libraries (i.e. DLLs). Each DLL is represented by a separate subclass, with the methods of that subclass corresponding to functions exported from the DLL. The functions are a special form of primitive method (actually instances of <ExternalMethod>) containing the additional type information needed to interface to statically typed functions. The functions are invoked by sending Smalltalk messages int the normal way, with these being translated by the VM external call primitive to the actual function invocations. The VM coerces the Smalltalk objects passed as arguments to appropriate native types following certain rules (see below). The external call primitive will fail if a type mismatch occurs, and normally this will result in an InvalidExternalCall exception being raised (assuming the #invalidCall method has not been overridden).
  16257.  
  16258. External library classes are typically singletons, with the instances representing an "open" (usable) instance of the DLL. The singleton instances are accessible through the class #default method. The libraries are loaded lazily, on demand (but see <PermanentLibrary>).
  16259.  
  16260. The external call primitive supports the two most commonly used calling conventions:
  16261.  
  16262.     __declspec(cdecl)    - #stdcall
  16263.     __declspec(stdcall)    - #cdecl
  16264.  
  16265. The "fastcall" calling convention is not currently supported, but this is rarely (if ever) used for exported functions. The C++ "thiscall" calling convention (which passes the ''this'' pointer in the ECX register) is not supported either, but invoking virtual methods of C++ objects (and therefore COM interface methods) is possible - see IUnknown and its subclasses in the "OLE COM" package.
  16266.  
  16267. Apart from scalar types, the primitive also supports the passing and returning of structures by value, up to a maximum of 64Kb per structure (though passing such large structures by value is not recommended).
  16268.  
  16269. The argument/return types (and coercions) supported are:
  16270.  
  16271.     void     Only valid as a return type - the method answers self
  16272.     lpvoid     General pointer type, accepts byte objects e.g. Strings (pointer to contents 
  16273.         passed), nil (null pointer), integers (passes as address), or ExternalAddresses
  16274.         (the contained address is passed, not a pointer to the ExternalAddress object). 
  16275.         When used as a return type, the method answers an instance of ExternalAddress.
  16276.     lppvoid    Pointer to pointer. Used for functions which take a parameter into which they write
  16277.         an address. The corresponding argument must be an ExternalAddress (or other indirection
  16278.         object), or an object whose first instance variable is such (e.g. an ExternalStructure).
  16279.         The address of the ExternalAddress itself is passed, so that on return it contains the
  16280.         address written back by the external function. nil is not a valid argument value.
  16281.         As a return type answers a pointer instance of LPVOID (i.e. LPVOID* = void**).
  16282.     char    Signed character. Accepts Characters only.
  16283.     byte    Unsigned byte. Accepts SmallIntegers only. Passes a 32-bit value
  16284.         generated by zero extending the least significant byte. Fails if  not in the
  16285.         range 0..255. Zero extends into a positive SmallInteger when a return value.
  16286.     sbyte    Signed byte. Accepts SmallIntegers only. Passes a 32-bit value generated
  16287.         by sign extending the least significant byte. Fails if not in range -128..127.
  16288.         Sign extends into a positive or negative SmallInteger when a return value.
  16289.     word     Unsigned word. As #byte, but 16-bit, acceptable range 0..65535.
  16290.         Also accepts a byte object of size 2, which is zero extended to 32-bits.
  16291.     sword     Signed word. As #sbyte, but 16-bit, acceptable range -32768..32767.
  16292.         Also accepts a byte object of size 2, which is sign extended to 32-bits.
  16293.     dword    Unsigned double word (32-bits), accepts 32-bit Integers. Positive integers
  16294.         are passed as unsigned, and negative integers in their two''s complement
  16295.         representation.  The largest LargeNegativeInteger which can be passsed
  16296.         is -16r80000000 (or -2147483648) because this is the largest negative number 
  16297.         which can be represented in 32-bits in two''s complement notation.
  16298.         Also accepts byte objects of length 4, assumed to be in an unsigned bit representation.
  16299.         nil is passed as 0. As a return type, answers a SmallInteger, or a LargePositiveInteger if the
  16300.         result cannot be represented as a positive SmallInteger (i.e. in 30 bits).
  16301.     sdword    Signed double word, accepts any Integer in the range -16r80000000..16r7FFFFFFF
  16302.         (i.e. Integer''s with a 32-bit two''s complement representation - all SmallIntegers, 
  16303.         some 4-byte LargePositiveIntegers and LargeNegativeIntegers). May also be other
  16304.         byte objects of length 4, which are assumed to contain a 2''s complement 32-bit number.
  16305.         As a return type answers a SmallInteger, or if more than 31-bits are required 
  16306.         to represent the two''s complement result, a LargePositiveInteger or LargeNegativeInteger 
  16307.         depending on sign. Also accepts nil (passed as 0).
  16308.     qword    Unsigned quad word. Similar to dword, but 64-bit (i.e. the range is -16r8000000000000000,
  16309.         the largest 64-bit two''s complement negative integer, up to 16rFFFFFFFFFFFFFFF the largest positive 
  16310.         unsigned 64-bit integer). 8-byte objects are acceptable and assumed to contain the correct unsigned
  16311.         bit representation. nil is passed as 0.
  16312.     sqword    Signed quad word. Accepts any Integer in the range which can be represented as a
  16313.         two''s complement number in 64 bits (i.e. -16r8000000000000000 to 16r7FFFFFFFFFFFFFFF).
  16314.         Also accepts 8 byte objects, which are assumed to contain 64-bit two''s complement numbers. 
  16315.         nil is passed as 0. As a return type answers the smallest Integer form which can contain 
  16316.         the 64-bit two''s complement integer.
  16317.     bool    Boolean. As an argument type, accepts true (translated to 1) or false
  16318.         (translated to 0). Also accepts SmallInteger values, pushing their host
  16319.         machine representation. As a return type, if the result is 0 answers false,
  16320.         if the result is non-zero, answers true.
  16321.     handle    32-bit handle. Accepts 32-bit integers, nil, or a byte object of size 4. 
  16322.         As a return type, answers an ExternalHandle, unless the
  16323.         returned handle is NULL, in which case answers ''nil''.
  16324.     double    64-bit floating point. Accepts instances of class Float (which contains
  16325.         a host machine representation of a double precision floating point number). 
  16326.         SmallIntegers may also be passed (they are promoted to the double precision
  16327.         floating point representation of their integral value). As a return type,
  16328.         answers an instance of class Float.
  16329.     lpstr    Pointer to C (null-terminated) ASCII string type. Accepts null terminated byte 
  16330.         objects (e.g. Strings, Symbols) or nil (null pointer). When used as a return type, 
  16331.         answers a String containing the characters of the C string up to the null terminator. 
  16332.         Unlike lpvoid, does not accept integer values as pointers, or ExternalAddress 
  16333.         (indirection) objects. If the validation is too tight for your requirements, then 
  16334.         use lpvoid. Do not use this return type where an external function is called which 
  16335.         expects the caller to assume ownership of the returned string, and to delete it when 
  16336.         it is no longer required, as a memory leak will result (use lpvoid instead).
  16337.     oop    Object identifier. Any non-SmallInteger can be passed. The value should
  16338.         be treated as an opaque Handle, and should not be stored for later use (it
  16339.         may change during a GC). As a return type, answers the object whose Oop is 
  16340.         the result. At present it is recommended that you do not use this type.
  16341.     float    32-bit floating point. Accepts instances of class Float, or SmallIntegers
  16342.         (as #double). The conversion of Floats (64-bit double precision) to #float 
  16343.         (32-bit single precision) may result in silent loss of precision. As a return
  16344.         type answers an instance of class Float (i.e. promotes to double precision).
  16345.     hresult    32-bit signed integer value. Validation as #sdword. As a return type, if less than
  16346.         0 (i.e. severity is error), causes the external call primitives to fail with a negative 
  16347.         failure reason which is the HRESULT value. This is convenient because it means an
  16348.         exception is automatically generated when an external function returns an HRESULT error.
  16349.     <N>    Where N is the byte size of a pass-by-value structure of unspecified type. Accepts either
  16350.         byte objects (of the correct size) or ExternalStructure instances with the correct byteSize
  16351.         (or other classes with the same shape as ExternalStructures). ExternalStructures passed
  16352.         to such arguments can be reference instances (i.e. ones containing a pointer to the actual
  16353.         structure bytes, rather than the structure bytes themselves). As a return type, the result
  16354.         is a ByteArray of the specified size.
  16355.     <struct>    Where <struct> is an ExternalStructure class name. Structure passed by value. Accepts 
  16356.         only the exact matching structure class. Again, the ExternalStructure arguments may be
  16357.         reference/pointer instances. When used as a return value, an instance of the 
  16358.         ExternalStructure class is answered, with the bytes of the returned structure as its contents
  16359.         (copied into a ByteArray).
  16360.     <struct>*    Where <struct> is an ExternalStructure class name. When used as a return type, a pointer
  16361.         instance of the ExternalStructure is answered, with an ExternalAddress pointing at the
  16362.         externally stored value as its first instance variable.
  16363.     
  16364. Note that in general, the UndefinedObject, nil, is interchangeable with 0, or NULL, when interfacing with external library functions. Nullness can be tested with the #isNull message, with the UndefinedObject and SmallInteger zero answering true.'!
  16365. !ExternalLibrary class methodsFor!
  16366.  
  16367. clear
  16368.     "Private - Clear down cached external function addresses from previous runs. 
  16369.     The default instances will be lazily re-opened because their handles will be null
  16370.     on image re-start (ExternalHandles are automatically nulled by the VM on image load).
  16371.     Similary function addresses will be lazily requeried as required."
  16372.  
  16373.     default notNil ifTrue: [default handle: nil].
  16374.     self clearMethodDictionary: self methodDictionary.!
  16375.  
  16376. clearMethodDictionary: aMethodDictionary
  16377.     "Private - Clear down cached proc addresses in the argument, aMethodDictionary."
  16378.  
  16379.     aMethodDictionary do: [ :m | m clear ]!
  16380.  
  16381. closeAllDefaults
  16382.     "Private - Close all open default libraries."
  16383.     
  16384.     self allSubclasses do: [ :c | c closeDefault ]
  16385. !
  16386.  
  16387. closeDefault
  16388.     "Private - Close the default instance of the receiver (if there is one).
  16389.     Having closed it, clear down the default inst var so that any subsequent accesses
  16390.     will cause the library to be reopened."
  16391.  
  16392.     default isNil
  16393.         ifFalse: [ default close. default := nil ]!
  16394.  
  16395. default
  16396.     "Answer the default, opened, instance of the receiver."
  16397.  
  16398.     default isNil 
  16399.         ifTrue: [self openDefault]
  16400.         ifFalse: [default asParameter].
  16401.     ^default!
  16402.  
  16403. default: anExternalLibrary
  16404.     "Set the default instance of the receiver."
  16405.  
  16406.     default := anExternalLibrary!
  16407.  
  16408. fileName
  16409.     "Answer the host system file name for the external library the 
  16410.     receiver represents."
  16411.  
  16412.     ^self subclassResponsibility!
  16413.  
  16414. fromHandle: aHandle
  16415.     "Answers an instance of ExternalLibrary attached to aHandle."
  16416.  
  16417.     ^self new handle: aHandle!
  16418.  
  16419. icon
  16420.     "Answers an Icon that can be used to represent this class"
  16421.  
  16422.     ^Icon fromId: 154 in: ShellLibrary default!
  16423.  
  16424. initializeAfterBinaryLoad
  16425.     "Perform any post-binary load initialisation for the class. "
  16426.  
  16427.     super initializeAfterBinaryLoad.
  16428.     self clear!
  16429.  
  16430. load: aString flags: anInteger
  16431.     "Private - Open the external library with the external file name, aString,
  16432.     and answer the handle."
  16433.  
  16434.     | hLibrary klib flags |
  16435.     flags := OSVERSIONINFO current isNT 
  16436.             ifTrue: [anInteger]
  16437.             ifFalse: [0]. 
  16438.     klib := KernelLibrary default.
  16439.     hLibrary := klib 
  16440.                 loadLibraryEx: aString
  16441.                 hFile: nil
  16442.                 dwFlags: flags.
  16443.     ^hLibrary isNil 
  16444.         ifTrue: [Win32Error signal: aString printString]
  16445.         ifFalse: [hLibrary]!
  16446.  
  16447. moduleFileName: aLibOrHandle
  16448.     "Private - Answer the file name of the receiver's loaded module."
  16449.  
  16450.     | buf size |
  16451.     buf := File pathBuffer.
  16452.     size := KernelLibrary default 
  16453.             getModuleFileName: aLibOrHandle asParameter 
  16454.             lpFilename: buf 
  16455.             nSize: buf basicSize.
  16456.     ^buf resize: size!
  16457.  
  16458. onExit
  16459.     "Private - Perform shut down processing."
  16460.  
  16461.     self closeAllDefaults!
  16462.  
  16463. onPreStripImage
  16464.     "Private - The image is about to be stripped, close down defaults to allow unused
  16465.     subclasses to be stripped."
  16466.  
  16467.     self closeAllDefaults!
  16468.  
  16469. onStartup
  16470.     "Private - Perform session startup processing for the receiver and its subclasses."
  16471.  
  16472.     self allSubclasses do: [:c | c clear].
  16473.     "If we don't have a handle for the Kernel32.DLL then we can't open any other libraries"
  16474.     KernelLibrary openDefault.
  16475.     PermanentLibrary onStartup2.
  16476.     self onStartup2!
  16477.  
  16478. onStartup2
  16479.     "Private - Perform session startup processing for the receiver and its subclasses.
  16480.     We open the permanent libraries first to make the startup more robust in case of
  16481.     errors opening other libraries."
  16482.  
  16483.     self subclasses do: [:c | c == PermanentLibrary ifFalse: [c onStartup2]]!
  16484.  
  16485. open
  16486.     "Answer a new instance of the receiver to represent the receiver's ExternalLibrary. The 
  16487.     instance can be used to invoke the functions of the external library specified as instance
  16488.     methods"
  16489.  
  16490.     ^self open: self fileName!
  16491.  
  16492. open: aString
  16493.     "Answer an instance of the receiver which references the external
  16494.     library with the external file name, aString. The library is
  16495.     initialized (most libraries don't need any initializing, but you
  16496.     get the option)."
  16497.  
  16498.     ^self new open: aString; initialize!
  16499.  
  16500. openDefault
  16501.     "Private - Open and record the default instance of the receiver.
  16502.     Answer the new instance."
  16503.  
  16504.     ^default := self open!
  16505.  
  16506. stbModifyExportProxy: anSTBImportedClassProxy
  16507.     "Private - This is an opportunity to modifiy the classes' binary export proxy just before it is
  16508.     output (to an STC file). Here we always nil the 'default' class inst var to avoid a proxy
  16509.     fixup sequence problem on load."
  16510.  
  16511.     anSTBImportedClassProxy classInstVarValues at: 1 put: nil!
  16512.  
  16513. uninitialize
  16514.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  16515.  
  16516.     self closeDefault!
  16517.  
  16518. uninitializeBeforeRemove
  16519.     "Perform any pre-removal uninitialisation for the class. This includes any specific #uninitialize
  16520.     implementation (but note that #uninitialize is only sent to classes which directly implement
  16521.     #uninitialize, otherwise we'd probably end up damaging superclasses which are not being
  16522.     removed).
  16523.     Implementation Note: This is one of those cases where we want subclasses to inherit the
  16524.     uninitialize, so override to always call it."
  16525.  
  16526.     self uninitialize!
  16527.  
  16528. versionInfo
  16529.     "Answer a <VersionInfo> containing the version details from the receiver."
  16530.  
  16531.     ^VersionInfo forPath: self fileName! !
  16532.  
  16533. !ExternalLibrary methodsFor!
  16534.  
  16535. asParameter
  16536.     "Answer the receiver in a form appropriate for passing to an external
  16537.     library procedure."
  16538.  
  16539.     handle isNull ifTrue: [self open].
  16540.     ^handle!
  16541.  
  16542. basicOpen: aString
  16543.     "Private - Open the external library with the external file name, aString,
  16544.     as the library referenced by the receiver. Answer the receiver.
  16545.     The library is NOT initialized."
  16546.  
  16547.     handle := nil.
  16548.     self handle: (self class load: aString flags: self loadFlags)!
  16549.  
  16550. close
  16551.     "Release the reference the receiver has to the External Library it represents. This may
  16552.     not cause the library to be unloaded, so it may still function. Answer whether the
  16553.     library was successfully closed."
  16554.  
  16555.     | success |
  16556.     success := handle notNull and: [KernelLibrary default freeLibrary: handle].
  16557.     handle := nil.
  16558.     ^success!
  16559.  
  16560. ┼H+(0?¡£&,¿Üë8ô:≤╣àÑó─╦╤╜≤⌐_ │╥~`]Z╞─^¢mA-gHGn┼ä Oc4╬:T▒«,ⁿ₧K╛╢╗ù≤∞¢!
  16561.  
  16562. fileName
  16563.     "Answer the host system file name for the external library the 
  16564.     receiver represents."
  16565.  
  16566.     ^handle isNull
  16567.         ifTrue: [self class fileName]
  16568.         ifFalse: [self moduleFileName]!
  16569.  
  16570. formatMessage: anIntegerId with: arguments
  16571.     "Answer a message formatted from the Win32 format string with the specified
  16572.     id in the receiver, with substitutions from the collection, arguments."
  16573.  
  16574.  
  16575.     ^String formatMessage: anIntegerId in: self asParameter withArguments: arguments!
  16576.  
  16577. getProcAddress: aStringOrWord
  16578.     "Private - Answer the address of the receiver's procedure named aString."
  16579.  
  16580.     ^self getProcAddress: aStringOrWord ifAbsent: [self systemError]!
  16581.  
  16582. getProcAddress: nameOrOrdinal ifAbsent: exceptionHandler
  16583.     "Private - Answer the address of the receiver's procedure named by the <readableString>
  16584.     or <integer> ordinal, nameOrOrdinal. If the receiver does not contain a matching
  16585.     procedure, then answer the result of evaluation the <niladicValuable> exceptionHandler.."
  16586.  
  16587.     | address |
  16588.     address := KernelLibrary default getProcAddress: self asParameter lpProcName: nameOrOrdinal.
  16589.     ^address = 0
  16590.         ifTrue: [exceptionHandler value]
  16591.         ifFalse: [address]!
  16592.  
  16593. handle
  16594.     ^handle!
  16595.  
  16596. handle: aHandle
  16597.     "Private - Set the handle of the external library which the receiver represents.
  16598.     Answer the receiver."
  16599.  
  16600.     handle := aHandle isNil ifFalse: [aHandle asExternalHandle]!
  16601.  
  16602. invalidArgErrorClass
  16603.     "Private - Answer the class of Error to be signalled when an invalid argument is passed to one of 
  16604.     the receiver external functions."
  16605.  
  16606.     ^InvalidExternalCall!
  16607.  
  16608. invalidCall
  16609.     "An invalid external call was attempted through one of the receiver's methods.
  16610.     Generate an appropriate error from the following categories:
  16611.         -    Argument type error. At least one argument was either out of range or of invalid type.
  16612.             Only the first such error is reported. The primitive failure result will be >= 16
  16613.             if an argument is invalid, the invalid argument number (from 1) being (failure result - 16)+1.
  16614. `        -    Invalid receiver (failure result = 0)
  16615.         -    Procedure not found (failure result = 1)
  16616.         -    System error.
  16617.         -    Unknown primitive failure. An uncategorised primitive failure occurred. Seek assistance."
  16618.  
  16619.     | error failureCode proc |
  16620.     proc := Processor activeProcess.
  16621.     failureCode := proc primitiveFailureCode.
  16622.     failureCode < 0 ifTrue: [^HRESULTError signalWith: failureCode].
  16623.     failureCode >= 16 
  16624.         ifTrue: 
  16625.             ["An invalid argument was passed"
  16626.  
  16627.             | frame arg i descriptor |
  16628.             frame := proc topFrame sender.
  16629.             descriptor := frame method descriptor.
  16630.             i := descriptor argumentIndexFromOffset: failureCode - 16.
  16631.             arg := frame method isVirtualFunction ifTrue: [i - 1] ifFalse: [i].
  16632.             self invalidArgErrorClass 
  16633.                 invalidArgument: arg
  16634.                 got: (frame arguments at: arg)
  16635.                 expected: (descriptor argumentTypes at: i)]
  16636.         ifFalse: 
  16637.             [failureCode == 0 ifTrue: [^self error: 'invalid receiver'].
  16638.             failureCode == 1 
  16639.                 ifTrue: 
  16640.                     ["Check A or W prefix, even if no String args"
  16641.  
  16642.                     ^Win32Error signalWith: ERROR_PROC_NOT_FOUND]].
  16643.  
  16644.     "All arguments were apparently valid (assuming the Smalltalk validation matches the VM's),
  16645.     it must have been some system or unknown error."
  16646.     error := KernelLibrary default getLastError.
  16647.     ^error == 0 ifTrue: [self primitiveFailed] ifFalse: [self systemError: error]!
  16648.  
  16649. isOpen
  16650.     "Answer whether the external library represented by the receiver is open."
  16651.  
  16652.     ^handle notNull!
  16653.  
  16654. loadFlags
  16655.     ^0!
  16656.  
  16657. loadString: anIntegerId
  16658.     "Answer the string with the specified id from the receiver's resources."
  16659.  
  16660.     ^String fromId: anIntegerId in: self!
  16661.  
  16662. moduleFileName
  16663.     "Private - Answer the file name of the receiver's loaded module."
  16664.  
  16665.     ^self class moduleFileName: self!
  16666.  
  16667. open
  16668.     "Private - Open the external library referenced by the receiver. 
  16669.     Answer the receiver. The library is NOT initialized."
  16670.  
  16671.     self open: self fileName!
  16672.  
  16673. open: aString
  16674.     "Private - Open the external library with the external file name, aString,
  16675.     as the library referenced by the receiver. Answer the receiver."
  16676.  
  16677.     self basicOpen: aString!
  16678.  
  16679. printOn: aStream
  16680.     "Append a short textual description of the receiver to aStream."
  16681.  
  16682.     aStream 
  16683.         basicPrint: self; 
  16684.         nextPut: $(;
  16685.         nextPutAll: (handle isNil ifTrue: ['NULL'] ifFalse: [handle asInteger printStringRadix: 16]);
  16686.         nextPutAll: ' - ';
  16687.         print: self fileName;
  16688.         nextPut: $)!
  16689.  
  16690. stbSaveOn: anSTBOutFiler
  16691.     "Save out a binary representation of the receiver to anSTBOutFiler."
  16692.  
  16693.     anSTBOutFiler
  16694.         saveObject: self
  16695.         as: (STBSingletonProxy for: self class using: #default)!
  16696.  
  16697. systemError
  16698.     "Generate an error based on the last recorded host system error"
  16699.  
  16700.     ^Win32Error signal!
  16701.  
  16702. systemError: anInteger
  16703.     "Generate an error for the host system error, anInteger"
  16704.  
  16705.     ^HRESULTError signalWith: anInteger!
  16706.  
  16707. version
  16708.     "Answer a version number String in the format used by the receiver,
  16709.     (typically N.N Build N, but see #versionFormatString)."
  16710.  
  16711.     #deprecated.
  16712.     ^self versionString!
  16713.  
  16714. versionFormatString
  16715.     "Private - Answer a String containing the version format used by the receiver.
  16716.     The arguments than can be inserted into the string are:
  16717.         1) Product name
  16718.         2) Product major high word
  16719.         3) Product major low word
  16720.         4) Product minor high word
  16721.         5) Product minor low word
  16722.     "
  16723.  
  16724.     ^'%2!!d!!.%3!!d!! build %4!!d!!'!
  16725.  
  16726. versionInfo
  16727.     "Answer a <VersionInfo> containing the version details from the receiver."
  16728.  
  16729.     ^VersionInfo forPath: self moduleFileName!
  16730.  
  16731. versionString
  16732.     "Answer a version number String in the format used by the receiver,
  16733.     (typically N.N Build N, but see #versionFormatString)."
  16734.  
  16735.     ^self versionInfo formatVersionString: self versionFormatString! !
  16736.  
  16737. ExternalStructure comment:
  16738. ''!
  16739. !ExternalStructure class methodsFor!
  16740.  
  16741. alignment
  16742.     "Answer the natural alignment for instances of the receiver when 
  16743.     embedded in arrays or other structures. This is the natural alignment 
  16744.     of the largest field in the receiver. The actual alignment used may
  16745.     be different if the structure packing overrides it."
  16746.  
  16747.     self template.
  16748.     ^alignment!
  16749.  
  16750. αV5, ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H |IRrQ╢éXu5╖shºδ5Θ█F@╝╕≈î≥▀äqP.CÜ╜ »╨╙GôVçpεQ│~òΩT]N+ípå╬\╥/┼44╓╥─≤┬Ñaü▀╟áh╗≥CQ░e+iÉε*ǃ\µOo═\╬≥!!mαçp├Lj╠:±╤îW`≤║ßεσΣ┤bI¡áª vX
  16751. rîú&t]B└╔ä╠3:L^Üê!!êHùπ╘╝╝dΓ╝ê╬ô;╗α╨Gìh]fxjéOΦa\÷ñ{┼LI■ç!
  16752.  
  16753. αV5, ╜ƒ7s·áé.î-≥╣àÑ╝τ═▄¿≤▒V≥√ßu`_S└─*ZÆG&oH@+≡┴[l#L╖<~╗╗)∙▀N ▒≈╢É╖ô9âqLol√«3╖ùÇJ]ùƒf╜
  16754. ÷iƒA■T+Σ`▀╩V▄/┼9├Ç╞σ╔«g╚ ìëÆeε■Q╢h;ÉΩ0█╓IΓSh▀▄÷!!e╣╙a╥G.╫6Ñ╘├P|╢εδεσí≥iY╜á╝gCGKi4╬φ9cJS▌┬Ö∩V.&│┐&à^ äπæσí!!┤╫δñ≤7│╫█╩_w0░z╝fMπ¿]┘}^╤k⌠Φ·ç┘nÜ┌╓π┤)╡b∩'└⌡┘═Gpr!
  16755.  
  16756. atAddress: anAddress
  16757.     "Answer a new instance of the receiver instantiated from the
  16758.     data at the specified address. Normally  this will be a 'reference' 
  16759.     instance, that points at the data embedded    at the specified address. 
  16760.     However in the case of objects that always have reference form
  16761.     (e.g. COM interface pointers, BSTRs, etc) this will be a copy
  16762.     of the pointer at that address. This is particularly useful for accessing
  16763.     elements of arrays."
  16764.  
  16765.     ^self fromAddress: anAddress!
  16766.  
  16767. autoGenCategories
  16768.     "Private - Answer a <sequencedReadableCollection> of <MethodCategory>s into 
  16769.     which the auto-generated the structure accessors for the receiver should be compiled."
  16770.  
  16771.     ^Array
  16772.         with: self autoGenCategory
  16773.         with: self methodCategoryClass public.!
  16774.  
  16775. autoGenCategory
  16776.     "Private - Answer the basic<MethodCategory>s into which the auto-generated 
  16777.     structure accessors for the receiver should be compiled."
  16778.  
  16779.     ^self methodCategoryClass name: '**compiled accessors**'!
  16780.  
  16781. autoGenComment
  16782.     "Private - Answer a suitable piece of comment to warn the user that a
  16783.     method is automatically generated and should not be modified.
  16784.     Implementation Note: As of v2.2 this is empty by default as otherwise
  16785.     it tends to lead to rather bloated source files."
  16786.  
  16787.     ^''!
  16788.  
  16789. πE46╢å<=ë╜₧?å+╟▌Ω└·ìƒ├┐αíVP╝√╔uwAD╫ç*[ÿQWp.R]oΣÆ^Vh|╖}Amº┐MÉ╖0║╛íƒπ╩\S╫S[kr█¿hr»ë╙MZÇçg½░tò°K >Φjû╩PôL4í/└ô─≤î»}£▀Å¢yO≥ßBP╢awç▄'╠┌^ΩcîK█⌠(u╡¬½Da╥Ñ╘åb▓╝± Γ
  16790. ¡┤dY¬πá`B    rܵWlGnbφ2■2╘φ{=QH▀Æ,╟Bü∙┼░╝u∞┐┴▐è;╢Ω╧╩w╛yεO{Yóφ`╬y^δî▀■Σ╢Aò╥╠⌠G≈9╡e≥}çèÆ▓p/!!\E;▒1Ü≥!!aÑ-ÅKàXHLgÅrs─û_èc5N┴¼√a0(C|┌äÆ╧EäµO)≈δPÅÉ┼═)4V╠⌠-8Æx₧⌠╓┴T∞│ ▓┬Ö╪ôV·─QW6ºù¢~í!
  16791.  
  16792. beCompiled
  16793.     "Mark the receiver as a structure which is to be compiled"
  16794.  
  16795.     flags := flags maskSet: CompiledMask!
  16796.  
  16797. beUncompiled
  16798.     "Mark the receiver as a structure which is not to be compiled"
  16799.  
  16800.     flags := flags maskClear: CompiledMask
  16801. !
  16802.  
  16803. byteSize
  16804.     "Answer the size (in bytes) of the structure the receiver represents"
  16805.  
  16806.     template isNil ifTrue: [self defineTemplate].    "ensure the byte size has been calculated by lazy template accessor"
  16807.     ^self extraInstanceSpec!
  16808.  
  16809. byteSize: anInteger
  16810.     "Private - Set the size (in bytes) of the structure the receiver represents"
  16811.  
  16812.     | oldByteSize |
  16813.     (anInteger between: 0 and: (2 ** 15 - 1))
  16814.         ifFalse: [ self error: 'Invalid structure size ', anInteger displayString ].
  16815.     self extraInstanceSpec: anInteger!
  16816.  
  16817. changedByteSizeFrom: oldByteSize
  16818.     "Private - If the size of the receiver changes such that it fits into a different
  16819.     type for passing/returning structures by value, then we must recompile
  16820.     all existing referencing methods."
  16821.  
  16822.     (self descriptorClass structTypeForSize: oldByteSize) ~=
  16823.         (self descriptorClass structTypeForSize: self byteSize) 
  16824.             ifTrue: [self recompileReferences]
  16825.  
  16826.  
  16827. !
  16828.  
  16829. ΓH&    &½¥ôì╓jä╘²╦î≈╤±┌░≈ Fº╕┼kgAY▄¼?\ôSA81:)?ΣêXr#ε<rd▒╝%Φ₧V¡≈δ╗∩█ ÖuR3zr╧┐y'╝╠₧KÖÇ5µB÷nà ]N+íkÖ₧MöG4╛?╓¢╒≤▐Θ3ƒûÿ¢e╟πRT░e~î√ ₧╦WΓ╔\╒≈mv≡╙péI⌡òé╧uö¢╤┌¼Fºµ U┐á╝ `\& ïΩ$t]U═W╦ÿßMe=W ²┤»7h Σ┘╜≥!!≡▓äìê;ª÷┼Å
  16830. 1K╜pΘ`V∞╢)╘e^¼ZÉêƒÅ█Aÿα─ΩW⌡<┐5¡s└ √┌
  16831. R`@a< 3ƒ≥?+╙Y⌡#╡qpfàorë╪9Γ6Y█ΓεCkzK>K >₧█▀eôµR>φ┐LçûÜW╩%7^h╠⌠(/ⁿ·æ▒┐d!
  16832.  
  16833. clear: addressOrBytes
  16834.     "Finalize an instance of the structure which instances of the receiver wrap
  16835.     which resides at the specified address. Note that this is not about freeing
  16836.     the specified memory block, but any resources which it references."!
  16837.  
  16838. ΓH"'▒å6D╨└╬ù6≈╒√╔╛܃µ╗µσGK║√╥~pM_─ü,äcG╢âr.JπrFf«δ|▌δk$÷∙┌⌠₧α
  16839. àfWk ╪╣n3╗┌┼_ÉV₧f║ñxä⌡_-≤$╕δp╕rú|╟Ü╞╢╪íqä≥±·s    επRG¡r;üπ2═╠Z⌠g├Q╓│#dⁿ├}╞h╧-±²ÇP}ѽ└╛┴╝√m]¡Θ╜K+8a X!
  16840.  
  16841. compileAllDefinitions
  16842.     "Compile the definitions of the receiver and all its subclasses"
  16843.  
  16844.     self withAllSubclassesDo: [:each | each compileDefinition].
  16845. !
  16846.  
  16847. compileDefinition
  16848.     "Builds a new template and generates compiled methods for accessing the fields 
  16849.     described by it. Depending on the description held in each field, some accessor
  16850.     methods may be left as uncompiled to be addressed via the template and 
  16851.     #doesNotUnderstand:"
  16852.  
  16853.     self 
  16854.         removeTemplate; 
  16855.         defineTemplate;
  16856.         recompileDefinition; 
  16857.         shrink!
  16858.  
  16859. compileGetMethod: aSymbol forField: anExternalField
  16860.     "Private - Generate a compiled 'get' accessor method for the selector aSymbol 
  16861.     and field definition anExternalField."
  16862.  
  16863.     | aStream methodText remark |
  16864.     anExternalField canGenerateAccessor ifFalse: [^self].
  16865.     methodText := anExternalField readAccessorMethodText: self contentsAccessText.
  16866.     (methodText isNil or: [methodText isEmpty]) ifTrue: [^self].
  16867.     aStream := String writeStream: 256.
  16868.     aStream
  16869.         nextPutAll: (anExternalField selectorFrom: aSymbol);
  16870.         crtab;
  16871.         nextPutAll: '"Answer the receiver''s ';
  16872.         nextPutAll: aSymbol;
  16873.         nextPutAll: ' field as a Smalltalk object.'.
  16874.     remark := self autoGenComment.
  16875.     remark isEmpty 
  16876.         ifFalse: 
  16877.             [aStream
  16878.                 crtab;
  16879.                 nextPutAll: remark].
  16880.     aStream
  16881.         nextPut: $";
  16882.         cr;
  16883.         crtab;
  16884.         nextPutAll: methodText.
  16885.     "    Notification signal: aStream contents."
  16886.     self compile: aStream contents categories: self autoGenCategories!
  16887.  
  16888. compileSetMethod: aSymbol forField: anExternalField
  16889.     "Private - Generate a compiled 'set' accessor method for the selector aSymbol 
  16890.     and field definition, anExternalField"
  16891.  
  16892.     | aStream methodText remark |
  16893.     anExternalField canGenerateMutator ifFalse: [^self].
  16894.     methodText := anExternalField writeAccessorMethodText: self contentsAccessText.
  16895.     (methodText isNil or: [methodText isEmpty]) ifTrue: [^self].
  16896.     aStream := String writeStream: 256.
  16897.     aStream
  16898.         nextPutAll: aSymbol;
  16899.         nextPutAll: ' anObject';
  16900.         crtab;
  16901.         nextPutAll: '"Set the receiver''s ';
  16902.         nextPutAll: aSymbol allButLast;
  16903.         nextPutAll: ' field to the value of anObject.'.
  16904.     remark := self autoGenComment.
  16905.     remark isEmpty 
  16906.         ifFalse: 
  16907.             [aStream
  16908.                 crtab;
  16909.                 nextPutAll: remark].
  16910.     aStream
  16911.         nextPut: $";
  16912.         cr;
  16913.         crtab;
  16914.         nextPutAll: methodText.
  16915.     "    Notification signal: aStream contents."
  16916.     self compile: aStream contents categories: self autoGenCategories!
  16917.  
  16918. contentsAccessText
  16919.     "Private - Answer the method text that must be inserted to get access to the
  16920.     contents (bytes) of the instances of the receiver"
  16921.  
  16922.     ^'bytes'!
  16923.  
  16924. decompileDefinition
  16925.     "Remove generated accessor methods from the receiver, and rebuild the
  16926.     structure template"
  16927.  
  16928.     [self removeCategory: self autoGenCategory] on: NotFoundError do: [:e | e notify]!
  16929.  
  16930. defineField: fieldName type: anExternalField
  16931.     "Add the argument anExternalField as the next field of the receiver's template, 
  16932.     with the name, fieldName"
  16933.  
  16934.     | offset |
  16935.     offset :=self structurePacker offsetFor: anExternalField base: self byteSize.
  16936.     self defineField: fieldName type: anExternalField offset: offset.
  16937. !
  16938.  
  16939. defineField: fieldName type: anExternalField offset: offset
  16940.     "Add the argument anExternalField as the next field of the receiver's template, 
  16941.     with the name, fieldName, and the <integer> byte offset in the structure, offset.
  16942.     N.B. This should only be used where the offset is known, note also that the
  16943.     byte size is updated if the field is added at the end."
  16944.  
  16945.     self isCompiled ifFalse: [anExternalField beUncompiled].
  16946.     alignment := alignment max: anExternalField alignment.
  16947.     anExternalField offset: offset.
  16948.     self byteSize: (self byteSize max: (offset + anExternalField byteSize)).
  16949.     anExternalField isReadable
  16950.         ifTrue: [ template at: fieldName asSymbol put: anExternalField ].
  16951.     anExternalField isWriteable
  16952.         ifTrue: [ template at: (fieldName, ':') asSymbol put: anExternalField ]!
  16953.  
  16954. defineFields
  16955.     "Set the structure template for the receiver. Implemented
  16956.     by subclasses which wish to make use of the Structure Template
  16957.     support"
  16958.  
  16959. !
  16960.  
  16961. definesNewFields
  16962.     "Private - Answer whether the receiver defines any new fields, as opposed to
  16963.     just inheriting the lot from a superclass."
  16964.  
  16965.     ^self class includesSelector: #defineFields!
  16966.  
  16967. defineTemplate
  16968.     "Initialize the receiver class' structure template.
  16969.     Implementation Note: We try and share a superclass template
  16970.     if we don't directly implement #defineFields in a particular class.
  16971.     This is a space saving measure, and is necessary because 'template' is
  16972.     a class instance variable."
  16973.  
  16974.     | oldByteSize |
  16975.     oldByteSize := self extraInstanceSpec.
  16976.     self definesNewFields ifFalse: [ | ancestor |
  16977.         "Receiver doesn't define any new fields, so inherit the lot"
  16978.         ancestor  := self superclass.
  16979.         self byteSize: ancestor  byteSize.
  16980.         template := ancestor template.
  16981.         alignment := ancestor alignment.
  16982.         template notNil
  16983.             ifTrue: [^self changedByteSizeFrom: oldByteSize]].
  16984.     alignment := 1.
  16985.     self
  16986.         initializeTemplate; 
  16987.         defineFields;
  16988.         byteSize: (self structurePacker paddedSizeFor: self byteSize).
  16989.     template shrink.
  16990.     self changedByteSizeFrom: oldByteSize!
  16991.  
  16992. descriptorClass
  16993.     "Private - Return the class of external function descriptor associated with
  16994.     the receiver."
  16995.  
  16996.     ^ExternalDescriptor!
  16997.  
  16998. elementSize
  16999.     "Answer the size (in bytes) of the structure the receiver represents
  17000.     when used as an array element."
  17001.  
  17002.     ^self byteSize!
  17003.  
  17004. ΣH"06░╗+9┐≤╠#ï;Φ╞ⁿíö╛¥σ¼√│RW║√ì;RFE┼ü,âWAj2~K
  17005. ΣÅUU2]╢G░«~║▌N╗ñ≈è°Åçf[kn╬ⁿl ╝╚┘MÖ₧{║P÷rûAΦYFxî÷█AêGfó0ôå┌µ╔αdüù█çt
  17006. ε¡^J╢e~É▒s╫╤[εS*╧K╙²>-╣╬v╞K|╙q≤▒Θ)┌ɱ≡Σ║τ ∙▓▀`k OS?t'ïPú,#tCV⌠zºxπ¿_K=O_▀█o░v2á▀°£┴ª╛Ä╪ÿ2░«└╦ %╡s≥M!
  17007.  
  17008. τM"1 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H g^_oQ╢òIcf[¼<QoΓ╛3 ┌º≈Ñ¢τ▌ÆzJ@zh▀ⁿ7¡╠╔OMçQÇVsºF║y╨σAJI1∩$≥┤0ôV|⌐|└å╤π╧┤fÜî╒╤e├¢>zætnü√&╠┌yεD#╚!
  17009.  
  17010. τM"1 ╜ƒ7s·áé.î-≥╣àÑ╝τ═▄¿≤▒V≥√ßu`_S└─*ZÆvOVy≈ì8Pc*K²<Gs▓«`ε╤¡≈óì≥╦\
  17011. ÿ4L~r▀»h<║ë╘QM╒ûpºU│o╫╝WF 4σ$ï╟IÖ}ó@Q╣√╠Γ─Ña╚ïëå╗πRWΓwoè»'╓┌αH9╔Qܵ cⁿ╒8═D.£6┐╚åCqí≡╕≈εíµe_¡Θ╜+8a Xτ4Ω4x]CëJÉQ┌╠3UJJεô:ÄB¡π╘┤·!!Γ│ä┴₧
  17012. ¼≤╠4óo^bÜ}≡qóè¬2àÉàÜ£╠╞ïà╖ÖxY╙ê:├╙Ω╩)tL1≈wâ°$kà1ìh╓MFWƒpe░û_ècL5┴ñ╔V=)OC>φ6εΣ÷m"ªΩY&│┬ ▌ºÜW╠)+UNé±7C<ƒcÖ╡ÿ█¿│π│╚ƒ┬PÆ¥!
  17013.  
  17014. τM)
  17015. íâ7(⌐¼ß@∞}╒▄Ωî≥╓╠┴■αáUF¡╛╬xvB▌─*ZÆV/m^Z}
  17016. Σ┴VXufNπ_|GΓñ"≡█Aß≈┐ƒΣÅÆzkl▀╜~7¬ç¡3!!íÜ5ºP÷|₧A≤A_*⌡qæ╫Mà`ú@=╨å╩α╔¼j╚ô₧ÆrO╗ß░asç²s╩╫^Θ?═L╔σ(mαço├Kz╔1╢£ε.╡íΩ╛µª⌡lUúߪkBo1åJε7y[└ìÖ╕Wn4QC╘Ä:ÿÿ⌠æ╡²xñ┤ä█ƒ,⌡δ╚▀9Kⁿh⌠
  17017. 42ê╪f┬g^∩▐à£ï╠F▄┬àΣG≈=┐+µ2╫σ∙╪+"l$Wÿu╝ß(wâ=¢KƒRmâce₧Φ4±g!
  17018.  
  17019. fromAddress: anAddress
  17020.     "Answer a new instance that points to the ExternalAddress 
  17021.     respresented by anAddress (which responds to the protocol
  17022.     #isNull and #asExternalAddress).
  17023.     Implementation Note: If anAddress is the null pointer then 
  17024.     the answer is nil. This behaviour is useful when referencing
  17025.     an ExternalStructure from a PointerField, since such pointers
  17026.     are commonly Null."
  17027.  
  17028.     ^anAddress isNull ifFalse: [
  17029.         self basicNew
  17030.             initializeAtAddress: anAddress ]!
  17031.  
  17032. τV(<á¥7:⌐≤╠+ü;≤╤ⁿ▀╛┼┌╓▒αízM╣┤Ü;aMU√è8]╫PS$kI    +ßÅK L&ß]]y╡«2║▀¡á≈ìΓ═ä`_meÜ│kr║┴┼ZÉûc½Q÷jÿ Y=τaì█WƒGg∞4╓╥╨Γ▐╡p£ì₧■f¬⌠DG░i~å»1╟ƒK∩DoÉvΦ≡"s²εv─M0îú┘Çmz╡í┤╛ßΦαhY∙≤ól@\brÅτ5b\ñ}ñé¿Ze|J_ÜÄ8à_╓≥╚°Φiß·«╧É;╢≈àI└9M■ûb2ê╪Wê~^α▐∞∙τ╢Kù╫╓⌡d√ÅB┼ià⌡²▄3Ho@FN(°3╙ÜG °=Ö`╨D#╜^A╡╔0α7Xê╧à>XS#l┘ ╓▌Vô≡j╢√MìÉîT│FQ9)x╨⌡' /òEÖ²╫êN╛┐≥ƒ┼ì─2÷1╔φ,Y3«ù¥Iï%║lc
  17033. ╞≈▌ñ¼Vwàò!!åî⌠F╖ΩíiéDt%ö└!
  17034.  
  17035. fromBytes: aByteObject
  17036.     "Answer a new instance of the receiver with contents copied from aByteObject"
  17037.  
  17038.     ^self new copyBytes: aByteObject!
  17039.  
  17040. ╞A3<<=¿ïhi¬┐¿+æ>í╟⌡Ω≈╥╙╤É≤¿V ¿┌]zMZ╓¬?_ÆT<oIub
  17041. ·àDv0N▒ZZo«»MÉ╖)Ѻ╗¢·╩
  17042. ╫`V.IΦ╣n=╝═ΘWNÜL╔1p║e┐x£┤=⌡lÉ┌ÜMf∞4╓╥÷╥°αwì£ëÜ~
  17043. ¬▒U]Γt~┬²6▌┌V±D=é2░{ÖD╤⌡]±wB⌠ÄπÉPp░»⌠≥á!!¡αFU╝∞╢Bo/<b];Ç7ú?xKë█5ï╡X!!Q)%│ΦéT?╓▄ßÅ╧U╓·Æ╫╝7░∩═'╬2Gi╒ò4{J÷î)÷Li┼'░╡┘╬╧^Ü─π∩G°yßï^»Ä║▓p+&    /⌠1║∙>q╤&ÜZ╔Mkö |═û_è Zß¼ⁿCq`Ym╙╪Æ▀V    ì┬X.Ñ·Zî╧▀W╚9DA_»ÜMAö`ç╗╦┬ »│≈┐╬ÿïKöY┤─sW6⌐ôüΦ&¿ctX≥¡≡═─3}╫ò"τÿµUé≡■%çr2 ê┴╝Cû±.à⌐║╩òH▒5 Å░τ├<┼░Ü+àô
  17044. 0αªe*╛▌╓┬üUF▀.kÄ∙ìQí⌐ε\¥⌠║`G«╪s Σ/'⌐₧wD∩:Vóä¬≈▄I√<ª∙ö┴╕╥
  17045. T}▌`^ìO¿ò¬.-âï┌ÑÉ!!L¥P'¢▒ç2KZ½d░╧Q/Äô┴>▌ΓΣa¥ W≤pk╡▌²º█80î╥ìNnw╨z-
  17046. ÷┬Nδ╠²^ê╔í°åσ├¼nX¬l_╔K~¼G] \╨/ö┘≤>µgµ`_öε6rªñ¡¿Y¢]@t╥câù»αΓ)ÖB¬çSΦï┼αW|█ñ⌠d▓±┼æn├Σpu!
  17047.  
  17048. getFieldList
  17049.     "Private - Answer a <sequencedReadableCollection> of the fields defined 
  17050.     in the receiver's template, sorted in ascending order of offset from the start of the
  17051.     structure."
  17052.  
  17053.     | answer |
  17054.     answer := OrderedCollection new.
  17055.     (self template associations 
  17056.         asSortedCollection: [ :x :y | x value offset <= y value offset ])
  17057.             do: [ :assoc |
  17058.                 assoc key last == $: ifFalse: [ answer add: assoc key ]].
  17059.     ^answer
  17060.  
  17061. !
  17062.  
  17063. ╞A3<<=¿ï(╖¼ƒp┼/Γ·ε┴√─ƒ╟╣╨╢GQæ║═~`└âAâMj+c^@eƒ├7Tv*J«y]~Γ┐( ₧k2¡┤╕î≤µÿ.'ktⁿ╡h>¬τ┴TMå^┌Vx½W╛röA·^]I,Θa▀δ}¿p⌐?┴¢┴≤╚αqæMïôû<½≥RM┤e5∩à^┤╢6╧s
  17064.  j÷"│^Ω╙|┴Cb╠û┘ùb}╢óⁿ╨ß ¡τ(1╙ë█c9lHKi'Ü7ú>bFW╟╔Qå«Wjv\┘».å_┌¥╗╤ò▀╡ö┘º~ù╨²;àE% 0¿n╥yZ±°2¡2«k⌠∞∙τ├ò╫╚πQ┤]╨∩2╚Γδƒ@)\E;▒0ûπ lö8¢b╓ U ∞    τÆ'Σ(6H┌îεZ4)
  17065. m°╥▐┤.oΘΩZÑΩL┼╒ñW▌9]Eéµ%(ö6╫⌡┘▀ ┐·Γ┐╤Ä÷2÷1╔ìCp%¼üèIïφ~&·│╡▌Σ-cûâl¬ëΦz⌐ⁿΦiåNtwΩ╣|ò)ùα:ë┤£FÿÜ^πbB@º₧ê≤≡Γé?Å╟Lε╣.` ╕±╦╪╧YCCΦ)?╥Ö┬G9╪ÇτEë⌠╜mF░┘ ªC^╙╖Eδ#j∙╔┐≥¥Çu│÷╛Ǽ╪ J╪h^╨1îæ⌐.Σƒî■H÷&H£H5₧╛ç(⌠"ö└Z8nÄö⌐Z▓çëRî_Y┌#.╝╫╫µ╤+>T╝▓ñZ<9ïC?nk@╫.⌠%¿╡═w7ê╓║╢δ¿▐╛bZ─b_ªsαO'q∞╦≤₧{0┐Wa≥uß╟WeΦ·╗╣Z╠U0SC&P┘p£¥«Nñ∞gâ9╖½,▌σ²&┴=`\εΓñ²ê⌡╕Yïµ S▒waæΓ╦┼4╢±\¡┬@╫üK╘╫[äüÆY4⌐vDíh1¼(D!
  17066.  
  17067. ╞A3<<=¿ï&Öª£3▀±┬╦═Ω╓ƒ╞ñ╘¼VO╗ò┴vv┴₧[ÆS@oVV+αÇ o#Cº&z┤¬2▄╫G ¼≈ºÄßδ
  17068. ûW|a├µ-"╛▀ΣX\ö5▓g»Z█∙C╒\_=∞aæ╩êJq∞)╓æ╠Σ╚ë}Ä┼┴┤yê°RHªNXì *ûûΩD;─P▐V⌡"s╣╙p╟[Σ ±╪åWwíº·√ΣF¬φ H▒σ≥fC\c └gëzZ&x√2■$ªòRPX▐é.çVB▒⌡┼₧⌡dΦ╛»┬╣1Ñ·üdÑl^b)
  17069. ▓A╝{Vµ√)╨{φƒ═■Σ╢!!≥φ╠Φ┤>ìX╒à⌠Γ∙CeK(H0⌠{■¥D °É[╦%tB┤IAú╧ú3]┌äµR=>t┐s╖Θ╓Q╜úJ%╛√╒╒ÅW╚9DA2πΓ6$╪7·æ▒Éc╞╫¢▀⌡╚ê½Q«╫s6▓¥¥ï+╣8&_▐ü₧ß±\º╢kεσÜ!
  17070.  
  17071. ╞A3= 1á╒r9╜╝à.ΦUêû╞┴ε█┌╪╗ⁿ▒W╖╛ÇRAMU▌û:{ÖYKp4|V(πê/fBªh[eªδ&⌡╠á▓≈½╙√\Æg]gb▀╕-0╖ë╘QM╒ûpºU│o▐lû<%`Q╔V║φl░v4ô?/╟û└≈└¼3»ï╝åu µ£=-╦    1tù√₧°j╬eeîO▌·)(󬽬R█╡ôCa║¬╕Φß
  17072. ╜±:¬σ╛ BbS\(_Σc▌Gp3|oµ<Å|α!
  17073.  
  17074. ╞A3445í╒r9╕║ÿ8½>∞╤éªùò÷╪«■á^F▒»Ço{M√╢;QÿM@`]\1U╤ä
  17075. wg+Jδ5gº┐(⌡┌ºÑ≈è ╩\+│@ks┘«d0½═Ç[Q╒¢5╝F╡xÖ∙CdRêm╤█▄Cz┐9┴╥╫■╔α}ëÜ█£zO║∙R░e    tÉδs╚╓^ºU'╔å4└Sºì8═Wz╨*Ñ£ôEf▓ú²ΩσµÖ
  17076. 1╙ë█"0@u`'Rr▒5≡4rN\┼WΩ₧ÅX`9 !!░ΦFΓaâΣ∞°▐R╨ê╦ìè<ª≈█'╬2BIn╓╛b2ê╪y┬~O■(ƒîû╬╔Iù├└╝τ<╝+∩2╚Γ╕▐    dZ{4    9⌠#Æ⌠%+ⁿ^÷pÅXq\⌐K"αæ!
  17077.  
  17078. ╞A3)<"í╒r9╣½┐#ƒ:î╛åÄ╫┌╧┘╗ á]W »╚~3ad╫ç1@ôvJ,a    L
  17079. Γ▓CcnπqV~¬ñ$║╪MΦú┐¢╖·8*╫p[mr╙╛h6ε╦┘\¥╙p¡F┐kò▓<%dRê╖∞|»wXÿ@∞ü╫≥╧íäM╕₧çO┤⌠)╚    c╣α&╩Γ≥O<┼X╘≈mm÷╔ê~├=é╒ÖA=Φ├Æùók┬¥6╨≡▒1l\PKp3éµMpbJ\╧W╧₧ñjd&F╖δF╡
  17080. B╘├εù╫#!
  17081.  
  17082. ╞A3.,(íª</╡≤╠:ò °─Ωσ≡╤╨╕╘¢τzN»╖┼vvFBÆÉ6W╫vv/mTAo&°ç<J╖HJzºé.ⁿ╤
  17083. IΦ║▓è └^æ{L@zh▀ⁿXÜë─\[ûÜp¬┤d╨⌠T=Γaû╚\Ä ╞mV║√δ─ΘôFñ9▀ñ¼o¬≥VH« -~û█*╬┌vΘG ä2░ÜDZ÷╥l G⌠&í┘¬Jr╝Σ▓╛≡£φpYÉε┤K>+?b$_Σgë~,1[Yë á{π▒IY%SI≤Å)äùⁿ─╜ª!!┤⌠∞º≤*╝úôTÅ2C¿e∞
  17084. ]QΣ╛@╞CTΓ─┴¿░Ä┘σ·└c╪!!°V»^»Ä∞╓ZGmK4L;┐Z∙₧=uÑ-ÅK÷GM#Éalÿ■oú,╤¡·E>N {┼    É┐│-8╨úê╨b▌°⌡!
  17085.  
  17086. hasHandCodedMethodFor: selector
  17087.     "Private - Answer whether the receiver appears to have a hand coded implementation
  17088.     for the specified selector <Symbol>."
  17089.  
  17090.     | method |
  17091.     method := self compiledMethodAt: selector ifAbsent: [^false].
  17092.     ^(self autoGenCategory includesMethod: method) not!
  17093.  
  17094. icon
  17095.     "Answers an Icon that can be used to represent this class"
  17096.  
  17097.     ^##(self) defaultIcon!
  17098.  
  17099. init: buffer
  17100.     "Initialize a buffer (or buffer at the specified address) to hold an instance of the record type
  17101.     described by the receiver. Assumes that the memory is completely uninitialized."
  17102.  
  17103.     KernelLibrary default zeroMemory: buffer length: self byteSize!
  17104.  
  17105. initialize
  17106.     "Private - Initialize the receiver class.
  17107.         ExternalStructure initialize
  17108.     "
  17109.  
  17110.     CompiledMask := 16r1.!
  17111.  
  17112. initializeAfterBinaryLoad
  17113.     "Perform any post-binary load initialisation for the class. 
  17114.     Implementation Note: Use the template lazy accessor to cause the template
  17115.     to be defined (if not already). This is a non-destructive way to ensure the class
  17116.     is initialized."
  17117.  
  17118.     self template.
  17119.     self register!
  17120.  
  17121. ΦJ.<9¿å(,ê¼ï#û+Σ╞éªùò∩╟╖ΣñGF ÷ÇR}AB█à2[ìZ>f^y
  17122. ±êMc4¼zMùéΘ₧VΦÑ▓¥°▌^öx_}e╔≥/_─ñ¬0zÉ£qìO╖nâ∩Tx═kÉ╒Lîvu« 9ô£╞ßí╩Γ!
  17123.  
  17124. initializeTemplate
  17125.     "Private - Initialize the template instance variables of the receiver."
  17126.  
  17127.     self byteSize: 0.
  17128.     flags := CompiledMask.
  17129.     self removeTemplate.
  17130. !
  17131.  
  17132. isCompiled
  17133.     "Private - Answer whether the receiver is a compiled definition (i.e. methods have been generated
  17134.     from the template)."
  17135.  
  17136.     ^flags anyMask: CompiledMask!
  17137.  
  17138. ╚W
  17139. !!;¼å<.Ä░£/▀±µΩ╧±┼█ⁿ░⌠¬>)╓∙ΘvcDS▀ü0F╫KL/.ran ∙ôph @∙&zyŬ4∙╓K»â«Ä≥çU^ÜqJadÜ║b ε▌╚\á2ºVq½P╡oÖ∙U !!ípù█ÄGw⌐    *╓Ç좪═ßdôö¥{Oæ╬DPªc wÄ»═≥^≤B'┼Q▌"Ω=d▒¬½+√6┐ß├mF╢¡≈∞Σ/ª≥o∙≡ÇjTQ"h4üC╕zZ=úzºx┤ΘJh0E ▌ö&Å_╓απ╜ n÷╛¿├£1⌡Σ▄╦Lw
  17140. 3╜n²qKτú!
  17141.  
  17142. libraryAndIndex
  17143.     "Answer an <Asssociation> between an <AXTypeLibraryAnalyzer> on the receiver's type library
  17144.     and the index of the receiver's type information in that library, or nil if no type information is
  17145.     available."
  17146.  
  17147.     ^nil!
  17148.  
  17149. ∞Q4*у9«áâ$ä3└╞Φ┘≤╥╤┴Σ▓ñ]fô₧φ_V{uÆΘT;⌐^JB~~O*┼ó^Ph"F▒yP~½ñ.Θ₧@°≈╢É≤ò\%ûz{,KM■Ö^ε└╙v]üV¥aô!
  17150.  
  17151. new
  17152.     "Answer a instance of the receiver. This may be either an internal buffer
  17153.     (containing a <ByteArray>) or a reference to an external buffer (containing
  17154.     a <ExternalAddress>), as appropriate for the subclass. The default is an 
  17155.     internal buffer."
  17156.  
  17157.     ^self newBuffer!
  17158.  
  17159. new: anInteger
  17160.     "Answer a new instance of the receiver containing a buffer of the specified size.
  17161.     N.B. It is not normally necessary to specify the size of an ExternalStructure, because
  17162.     the subclasses normally know. However some structures may be of variable length."
  17163.  
  17164.     ^super new
  17165.         initialize: anInteger!
  17166.  
  17167. new: anInteger bufferClass: bufferClass
  17168.     "Answer a new instance of the receiver containing a buffer of the specified size
  17169.     allocated by the specified buffer class."
  17170.  
  17171.     ^super new
  17172.         bytes: (bufferClass newFixed: anInteger);
  17173.         initialize;
  17174.         yourself
  17175. !
  17176.  
  17177. newBuffer
  17178.     "Answer a new instance containing its own buffer."
  17179.  
  17180.     ^self new: self byteSize!
  17181.  
  17182. newBufferClass: bufferClass
  17183.     "Answer a new instance of the receiver containing a buffer of the receiver's size
  17184.     allocated by the specified buffer class."
  17185.  
  17186.     ^self new: self byteSize bufferClass: bufferClass!
  17187.  
  17188. newHeapPointer
  17189.     "Answer a new instance of the receiver suitable for use as a reference
  17190.     to an object allocated by some third party from the heap, but which
  17191.     we must free."
  17192.  
  17193.     ^self basicNew beNullHeapPointer!
  17194.  
  17195. newPointer
  17196.     "Answer a new instance of the receiver suitable for use as a reference
  17197.     to an externally allocated object."
  17198.  
  17199.     ^self basicNew beNullPointer!
  17200.  
  17201. newPointer: pointerClass
  17202.     "Answer a new instance of the receiver suitable for use as a reference
  17203.     to an externally allocated object, using the specified pointer class (e.g.
  17204.     COMTaskMemory)"
  17205.  
  17206.     ^self basicNew initializeAtAddress: pointerClass new!
  17207.  
  17208. ∩A0)ü«¢É╓jë:∩╙√─ô╜╢ùƒⁿ╢DF¡√┴;}MAÆ╖t▓~vObb òXj/Uªx~¡δ(⌡╥F@⌠╛╣è≥╚ ╔8 kn▌¿e~ε└╬J\öÉfεL░=ä    ∙] ;Σmë█K╥/┼0=┴åâ∙╩αr╚    ÉÄæp
  17209. π⌡^W▓axè»#╠╨KΦB └╒·*h≈╞l╦LiÇ6┐£░eRûÅ╩╠┴?÷¬lY╖τªX`JPc<Ü)∩#bñ}á{π╜{(P╖δF╡é░ïσ╝rß╢çìî*ⁿúöTÅFtC3;¥iΦy^÷╕f╬NTΓèÇ¥Ü╠Ü┬ƒª┬&êN┬≈├┐ûw,&O    π"û¡m^ó╣k■*scZ╞leâⁿ!!δPeP═¼ΦC9zX}┘┌±╒Eô╣9▓≤Oó°⌡.╖%>vA╤⌡~CóM▒▐∙α<ìâ▒║╬à╠Köαê@X#┤Ü╧▀pφtrX■▓╡├└1e┤û-┤¢¬í⌡²!
  17210.  
  17211. offsetFor: field base: currentOffset
  17212.     "Answer the adjusted offset for the <ExternalField>, field, from the
  17213.     base offset, currentOffset. Typically this will round up to some granularity
  17214.     which is the minimum off the field size and the structure packing (typically 8) - e.g. 
  17215.     32-bit field typically packed to a four byte boundary, a 12-byte structure would be
  17216.     packed to an 8-byte boundary.."
  17217.  
  17218.     ^currentOffset roundUpTo: (field alignment min: self packing)!
  17219.  
  17220. packing
  17221.     "Answer the default packing for instances of the receiver.
  17222.     This is the maximum alignment to which members of the structure
  17223.     after the first are padded. Each field type has a natural alignment
  17224.     (e.g. ints align to 32-bit boundaries), and it is the smaller of the
  17225.     packing and the natural alignment which is used to decide the
  17226.     padding necessary for the field in the structure.
  17227.     For Win32 the default packing is 8."
  17228.  
  17229.     ^8!
  17230.  
  17231. paddedSizeFor: size
  17232.     "Answer the adjusted size for the receiver rounded up from the 
  17233.     <integer>, size. Structures are padded so that there size is rounded
  17234.     up to the minimum of their natural alignment (which is the alignment
  17235.     of the largest member) and the packing setting 
  17236.     You may need to override this (or preferably the #packing method)
  17237.     if the external structure is compiled with a different packing (/Zp or 
  17238.     #pragma pack)"
  17239.  
  17240.     ^self offsetFor: self base: size!
  17241.  
  17242. pointerClass
  17243.     "Private - Answer the default class to use as a pointer"
  17244.  
  17245.     ^ExternalAddress!
  17246.  
  17247. ±K.!!=╢⌐;,╢¡╕3ò:î╛åÄ▀┘╠┬╗ασGK║√£^k\S└è?^▒VA&jh≈Ær)▒yCxº╕%⌠╩º╛╣è≥▌^â{fi╔ⁿh*║╠╥WIÖVçe½ítä    ╝EG UïÉ╨\▄Kz¿    .╓æ╫ ├«=╩`⌡÷∙1₧■^J╢e]ïΩ?┌!
  17248.  
  17249. ±V.!!íë3<╢╜║+ë*ΣÄ»═╚÷φⁿƒ▄æL▒ßÇzC]B╞à<^ÆlP8kZ^+b£ΦoGféRg*┤¬,∩█íñºÆ÷╓3═4_0{t╬╜o>½·╘KMö!
  17250.  
  17251. ±V.!!í¢:&╛ê₧-É2Σ┌√û╛╓═╥É≤¿V║╖┼vwME╤▐~W¢ZI.kHP+°àKc%[¬s]y°δ)⌠┌K╗≈╕É¡Åàs[
  17252. │■] º▀┴MM╒[╙1páFñ|ä╝PAI7⌠pÅ╦M▄Cf½1╓£╫╢┼«`£ æÅÜ}º■Y▒t oçΓ6╨╦ΦO;├╬÷m=Θ╥l╓Cl╠:é╚æAu╛≡┤╛ìl┴αaN╛σªFBcIGKr:ïJΓ7dBU╟ìÅ▓Z5AI▐┴-Æ₧⌡æΣ┘M┴ùÑΦ⌐δ»ë ├:GR▓x╝ qLßú`╨yT■J▐àû¥▄÷╝¼╧OΣ5╖n∩'─≤±╨G@Lg▒ç╖)jö'▀@╨ Csûeaƒ╗!!∞J'Yê▓αD"3H{û╤Æ▌Aà±Q#╣·    ÖçÉJ₧80U█α!!C1ÿnà·╩╦c╞╙µ╛╬ƒ├ZÄñïPT(Ñ╥å╧#┐ge ■║≡┴╨+aéÄlªÜ≈Aí≈∩:├Ab2Må┴²Yèí8₧τ│[₧█╖0@Éá╜─╪π╨7ÿüE∞╡m+ñ╕ÿ═Ü <.ú?3┴║╙F9çÇ≈Y▄ΩôzVδÆs?φn ▓█fM∞4V²ä╗≥╬N╨0πⁿä┴¿╬_HS═$U▐]⌠Ω┴^X¬¼╔Σ╣hHèNK#╫░èiRªg┘╬Wƒ╟≡>╘ΓáV╖vO╨9o╡╒▄Ñ╩tz/ΣóñRt2╩M;qFW└o°vá»Éw╟≥«▒Iåσ▌₧cSç- ┘LníP\t\┘kφ╗ƒmq╜LO⌐u£º1n⌡╛²ΘÿXoSH&DΣt▌╪┤α⌠5╩σΓo└╢÷JªQz6±Γñ■Ö∩÷U╚≤ π>c;≤╚wg¼└╗σ⌐ÉU▐╘O╬ƒWììΓ\╒v▒?/â _╠åoXs-±π²▓ΣbΣIFq█á~╞╒¢2û╡-bS∩░zEp▄æ·6ε>L$;²■ΣΘ7¡∩y>M∞╒ïy▄B╬δ┬'░e=rÆΩ:▓e─⌐Q┼¡q│ÑPe0ls²εª-ñC°╘è±ùI╨Rα√súÅày·t╫╩┤╛½H╧èùìδgùoú»┴ßH╧²ñ!!)Xo─ I H"R╡r╞O1▐au╪E#^╚ÉÉh)├ë╧,ºM9á_╝éαº;M`iÆΓ·éXΦ╘'^│`âx₧L+FæSv└≈y┘0╓{╡1┤∩╕A)¿╣ └/¡=UO│0┴óΘDª1░Eµαφ]┬!!╪wQ·√{,Y|µ╩!!µß!!└?═φ|δ'■óï1▀■╙BBä┼σ: ╙t∙║╫4▐ΩΓÄ(┐R    8∙║δ┘~│╖εK7ÅçgÆ═¥┼ìPÑ≥P░╪@î▄▐æçg|(n¥D┼~ìÅ╬╞╢┴1ªaΓ
  17253. fΓ■0αµ╟ÑδÖ┤ègOÅyòF}üt&w0┼r╜╢╪╛r┬b₧'┤│'|1 ê»█,.Φ╨"ùy╤ª╗Q¼≡╝▒&u:ɺ;fîk╙U
  17254. ⌡s╟Jàδ3IO)╒2r±Ä╥ö▓CΓz╛SÑN@╖╕í╟\Ä«j¥Å½2£½▒&÷≈iBS╒ó═╚B┤┐ï╛@Ñ)╚e▀c»E└┌r#╞f,\(▓HoV╙╕PΘΣ"3╛wΩ∞⌠╔b[^╘n╔E·ìòτûî┐[█║▓O╥ëa    ╦"⌐╢qIÇ₧¬%å≡▀|.±ΓΩ{åπ⌐¥$=y┬R}╩óÉ@╖ÑÅí╤½,ô╕
  17255. mÇ├T_PQn∙╥∩ä═6ñ}°aé╒Φ ┘S╚╕Φb╢C∙⌐▌8uë╡▓■·╠╕7zìⁿ╧d╚¢Kñe┌⌠Φ├:╜░ª¿~Es~?!!iF5Üd½ε╞)Üx╟αL─┤$íßⁿ¿é¬╛ô]■≥╒ÜÜàîE¼W&&RÑèsα═¡╫ª¡∙ττüJYJFur╩*¬oò╒εJ5ÿj┐àjδè╓p╬│GR▓╔êÑ÷Sû≤8«s
  17256. ëZ\)-É╘¡û2µ?9─┤∞-«╓╟{╕«┼╚æ╓╜"ä¬oU≤╠öSRA▒|αZⁿ▓▐┬æ░WÉ╫ aë&Γ≥ujÄ'└8e─XjΣc":≤lÉ╡LñàE▐aA▀Eµ?╚≈q·╝E╤N
  17257. ╧ü°ΣL>[╜ÅQÖ┴Åó}Ü╜ü_!!µ¼"└z├!!â ¡3φ║G⌡£└╙⌡¼q
  17258. ╒Φ⌐αZ]╨ⁿÉ╥µS&╜⌠°k▒╦o▌░+i╓:hdW/_N╔_·X■7║░6Bì∞2±|╠ó┌ìY"@ü▐,¡äΘ«╗Ω/-┬OgU▌@&\
  17259. αmÑǵ▓I─H┴πh▐╙╟ù¢E╓3╢$rΦm2\∙░)√z┌ÑN■≈13X#≈$>é@ç±ú8▒ó4╤
  17260. ╦╒P¡╟`╜Aóú7îU╠≈#ε▒=[æ    ±~doOFEa!
  17261.  
  17262. ±V.!!┤¢;&┤¿Çä-α┘Ω╪√┼àò┐ⁿÇfƃσHPY▄▐~SºJP>oY_n<ΓôXkf"╔Z░ó6√╩G@σ≈çî■┴^û4Zha╧░yr╛╚╥XEÉû5╕B║hòA·^]Ix⌡lÜ₧VîV}ú=▀╥╬≤╪¿|îMÅÜü}½σRVΓdhü²:▄┌[ºC6îK╥│@ É¢]εgCΣé ▌{╜║≈╛⌠¡┤<L¼⌠ª iCft7Å╜YpXI▌╚QÜáKl1FX▀ôoéIBå±┬½∙eñ╕ÿìê;│µ█ ┴2GR┤y≥b6÷╣lÇ{Zα¢┴₧¢╠\█╘└ªUµ ¬nσs╠Θ∞╨ZG)\[(≥#åσ(+╤]▒A╦këwe¢■'»J1T╔╢»^7zC>▀    ₧╙╫    ò≈L?ú┐Y₧ç₧J█8=B Q╓°!!}ⁿ■∩╨╫N╗¿≡ª█Ä┘æ]┤îJRd╖¢âï+ípc º≡╠└fà¢<╖ü■SQ░±■iòA|"╦ô≥D┘≥8╠░╕ÄöIΣ,_éº│ü=▐░ö1╓öEFα│m*Σ╢╡í°s8Xè>.╞╢╓F(²┴≥_ÖªÇ(╦╪6Θ;8«ΦuD >óÖ·α╙~±Ä╤╡▓é¥CZ╪qO¿]Ωφ┼∞╡┼¿O÷Zò]3Ö╖Æmºg¥±CnÄôΓ%ε∩∞.╪"╕±╩╓¬₧|k|≥î÷GlÜZ3rDS╔ b╝¼Æ9*Æ嫼gç┼²¢Jl)═#&û,áSz&F┌q╣êë{ 7ⁿON╡v ┐╝?p÷√⌠▐╘OoI#M±päö⌐8í∩(╞BΓ¼6üñ├2╪,r B∙╨⌐K∙¥ó┼=íƒt╫&/<∙╥:]▒╨    ≈∞K╖îe▐ÆO¢¢J╝äú\Ö_~⌠.<ƒ$5╘åJhY--╕─α»≤kªFBN┌σk├φ!
  17263.  
  17264. ±V.!! ░¥'*«Åà/ë;╗ö∙═∞╙┌╞╜▓¼]G╢⌐┼xgAY▄ùd₧Q@#|Hd¼┴
  17265. Xt!!J╖9α¢2≤╚C¡≈·▐╨╩àuJ.aÜ»y ╗╩╘LZÉVòpóG÷yò⌡_F1εj▀╙\ÅQu½|▄£╫∙î┤{ìM├ïåh»≤[Aæt~âΓmƃKµS(╔Kû{ÖDg÷╒8╓JkÇ)░╬èEv┐½╕·σ½µi^╝Σ≥%R]&n╕+╤3BlàW█ÿÑ\~? Üû&ƒRBé°╘°∩qß╣ê╦ô;▒ú╟┬2R ║<ázKτ╢l╥36åoùÅùç═Mÿ┬╠ΘLτ\r╫îY¼⌠²╙kN@>┴%Ü∙9Và&èM╦>HGoé: ¢·'τ6_ê½ßS8(Oj▀╨┴âÄτU8ñ┐Fæ╧▀S▀>?UT!
  17266.  
  17267. ±V.!!╢Ä"9┐¡║+ë*ΣÄ»═╚÷φⁿƒ▄æL▒ßÇzC]B╞à<^ÆlP8kZ^+b£Φis2[ó~_oæ┐2 ▀Om┬▐▐É≥╫.é`@*(ü╤[╟┘╥PFüL╙póEφ·hòB_;Σ?≥┤0⌡F}┐0╥ïÖ╢Å«vƒV≥±·╛≡TA∙`δδ:═╧SµXuî╠ 8dú£¿+╙/░▀å
  17268. ┘╟δ√∞ΦΣrU╖⌠ûdSYP3éµMppyq√>∞?╛ßVcfMΩö;ƒ[Ü⌡Γ¼εdσ╖╧á≡W┤╙▄█50¿n∙y2ê╪╬hC°6ïò▓é╙█æ₧ª»Z╙σ:╓≈⌠▐) F(π$û√+>ⁿ^÷'╤YVSôt:═┐|!
  17269.  
  17270. ╤Q3<<=¿ïhi¡ÅÇ+é,í─∙Φ ├▐Å■Γ│wB½║Çhin_╫ê:|ûRAp.HIM≤ìwg+JπlEk░ì) ╥FZΦºíƒσΘ¢p3j"≤▒}>½─┼W\╒¢5çq│~ƒ°xA7╗>»╦M║KqátÜ╥╬≤╪¿|îMÖöü<ª⌠qåTJçⁿ0╠╓]ΓEo╬FÜ√(!!δ┬{╟Kx┼- ▒Θ)┌╟╨╠┼5¥╪Tå▀ífGY&¢┼5}Kñ}ñxπÜPcY╘Æ&îTÆ░▌╖≥fñ¡º┴¢9ª»ñcªl^0≡<≤`bóºf╔i¼êÑÆÜ▐÷╝¼Å+╧>ç+═≥╘╠φZUsiL1⌡Æ·()ⁿ^÷'╢#HL^╞VA┐╥═>o╪┤εE3OzƒA│╕░kΩÄ6C½┐[Üô╢I═8xFA╫⌡d /╤p·æ▒┌∞α¼÷ê╚âhòV≤╓`D6»Ç£S╩>≈"!!=─ù₧°ΣX│╗Ç╧╣|╬ÉΘ,ài~$╟ëH╝S£φ1╠í»[ç║Cº*É≤τ╤?⌡±ä?╪Ω o÷Æe#╣┤àï╓Ze≥>╘╕╬K(┬╧≡iôΦÅ}C¼╚ HΘ:n·Ö]f▄o▌√è╙≥k°ù╠á┤òÜV+6░]¬N≤²Ü-¬çîó│$M4ÿWS#╫╕∩b{zò ƒ╚Gk9èï≥2ÿ┤╜{╧Kⁿw}¡Ö╘ú°x{cΓßñUfâK6ydS╚*ú├╚■^ê╔í°åσ├¼nX¬l_╔K~¼G] \╨/ö┘≤nX╕PⁿCEÉε" ╪÷Γ╒T╡0z'1I√dö╪τSα≤+┬╦½i═í│.▀z1^²≈╛Qæ÷╞æ9óƒ=π2&u╝│jpú╟#▓≡]■åR╦òZ샣äú\■rÿATk·9 ═É=L}»⌡τ¥εo¿Nk    ─⌡o≤₧╢T≡╦'S.}S∩∞^w╪┴π º'@!!!!i²└╔∞(Dñ·l3D«╜Σ⌡.¬δΓ0í d=╗òU╪í┘x╤ís╛│&]l6zz┤√ç4ñ@»╘é1úûDÅR▀╩8üïÄ$╝P╠╩¿φφF╔╜+╣╝▄R°OâÅ-ßá±╢7î%*\l─LH@║'╩╩yLΦ0:+TΘç-°Xæá║e¿xó Ñ▒Γ│~j.uô╢∙é>α├,OΣ%₧v⌠ OÉy7╠ⁿy╓/╫ßrº«╗Rlüî{╒╗Cº>zX║1ä∞ªz+┘^zu╡#■Θ∩Éyï!!ª{«0P$kx⌠≈&⌐╡_Å4╥ⁿp·'╜πûx╢╖┤┬ç⌐╬≤\*╚╚φ÷╦┼┐T▓w-<·║ï╓Dѽ∙7Ω╤7▐╡≥∞╛dîδ@à╪sÇâÆ«ç3\7hìt¡)4σΩ½╩╨┴1╣k╗KI┘σR╤º⌐rêê■╧≈tYéûPd╬u:!!{ª╪█δùO╫P₧$▒┤i5Y⌐ܬ╔'uñ£c▄[╒·╪2╦nóε}Ωi4g╒±Kπ╓,▄OòBÑ░[}ôr7╨çåµ≡è─.u├#D┤╕í¬:╤ΓTJü╩ñqß\╤╒J┌┐}!
  17271.  
  17272. ╤Q3<<=¿ï&Öª£3▀÷≥π═∙─ƒ┼¿╓ñGBσ√╨mWIB╙─-H▒VA&juRf
  17273. ¼┴C@/J»x}k»«`Ω╚CÄ╛▓Æ≤ò\üuL&ge╓╕X╟ïΘTXÖ₧{║óuòA╒cJ
  17274. 7≤`╢╨_ô.£(⌡¢╞·╚Ä|½Åé█5Oú⌠CL¡dJ}ì²s╩╫Zºt °▐α.s≡┼}╞l┘Ñ╘åf╢¡²≈÷║║6╘è█c*Wcf>J╬5▄$uLQ┼ì!!ƒ╡d9OH⌠Ä äJ▐¥╗╤ò▀│Å≡┌+╗≡└┴3K ▓{╝RSπ╢zî1ào≈║ÜÇôö├╤█Γ9╛!!í#╙├∙╦
  17275. %o T╩>¥╩mIí¼zφXRXEÅelë╒4εi1ó╦å>
  17276. 3D$>α;∞√°j2╩úL<╢φoûÉôCùwU:)S»ÜIiT»/╘│∩█ Φ╘ñ┘ä┘L▄Y┤▐ƒ╝á'Γ¥N!!Qû╘!
  17277.  
  17278. ≡Q",¬¢7;╝¿Å/▀α┌╞┬Ω╥═╙┐±ápO╛¿╙!!≤è-EÆM+.UV|O Å
  17279. \t Náy}¬ó#≥₧Q╕º╕îπ▄\
  17280. ƒq~e┘╡k;½═ÇPFüüt¡F÷méΦ^L4î÷ûLÅWuá %ôôâ⌡└í`¢D╙█£nOá°[½fJoèΩs╠┌\ΓH9╔MÜⁿ(r╣╔w╓}╒/í╙æP4ºª²╛Θ╝±rZ╕π╖D@,8a ¥∩p`ZU█Σ₧ñKk=@IÇ┴.às é⌡├╛²bßÖì╠ë-⌡Ω╧'└ 2QR8üû!
  17281.  
  17282. ≡Q",¬¢7;╝¿Å/▀α┌╞┬Ω╥═╙┐±ápO╛¿╙;zNx▌è;╫Z\)kKGb°⌐Wb*J▒9αè.Θ╔GΦ╢≈É≥╪\Ö`[ha┘╣-"í└╬MMçVä|¡K÷nà∞^]+ípù█ÅRq»    :┌ù╟╢┼«gìÖÜÉyO╛πXP¡cw∩àZû╩L≥@#└FÜ│.m°╘kï .Θ9±╚ïA4í½√√Θ¡µ X╢σíJ jRs"₧±peGUë├Å│_l?FÜÇ!!ÿMä░┼░∙ Ä╙ô╚ë+╣≈ë╔E2⌐}ΦzXóÑa┼-Uσ
  17283. ƒàÜìƒ^Ü┌╨τ@°|·n∙0└≈∞╓HANM1⌠%▌╡@ⁿ^÷RƒMCpò |αæ\α$O█Γ╡
  17284. q)Oxû    ╦┬╔KöµX╣δLìô₧D█?x=*x½⌠!!8Æx═╗πê»·φ÷┬êïLëH░ïWB7룢┘,¼acB╗┐╛τ╦+tà£-ñì╙X╖Ω╞iε*^ü²≥E├í ▓óÑWÅïS¬7(éºú═,├░å?ÜÆO;»┘e⌐°┘╪åY^JÉz8┼╗┼
  17285. 5╞╨≥OæπÆ}M░åsφ"2╫┤!
  17286.  
  17287. recompileDefinition
  17288.     "Private - Recompiles the existing template for the receiver"
  17289.  
  17290.     self decompileDefinition.
  17291.     self definesNewFields ifTrue: [
  17292.         self template keysAndValuesDo: [:selector :field |
  17293.             (self shouldCompile: selector forField: field) 
  17294.                 ifTrue: [
  17295.                     selector last == $: 
  17296.                         ifTrue: [self compileSetMethod: selector forField: field]
  17297.                         ifFalse: [self compileGetMethod: selector forField: field]]
  17298.                 ifFalse: [Notification signal: self name, ': Compiled accessor ', selector printString, ' not generated']]]!
  17299.  
  17300. recompileReferences
  17301.     "Private - Recompile all directly referencing external call methods
  17302.     that might need to change if the receiver's size changes."
  17303.  
  17304.     Notification signal: 'Recompiling references to ', self name, '...'.
  17305.     Smalltalk allClasses do: [:c |
  17306.         (c whichMethodsReferTo: self) do: [:e | 
  17307.             e isExternalCall ifTrue: [e recompile]]]!
  17308.  
  17309. ╙A$'<çâ7(¿≤╠:ô∙▌ⁿ╪≈┘╪╕╘¢τzN»╖┼vvFBÆÉ6W╫vv/mTAo&°ç<JásAnüº%√╠
  17310. IΦ║▓è └^æ{L@zh▀ⁿXÜë─\[ûÜp¬┤d╨⌠T=Γaû╚\Ä ╞i▀ù┬Σ┼«t╚    Éî¥<επRG¡r;ïß%╤╙IΓRo╩M▀·#f╣╞v█a╞Ñ╘år║½⌠·≤F╝ⁿaH∙ε╖%RZKd7╬ Ω1}FJ╠üQâ╡i3F_╖δFàU╓∙▀╗≡tα┐┴▀ƒ2░Γ┌┴wⁿq∙{M√±f╫c^ΦF£ÿ╙Ü╫M█─└σMµ~╫îY¼Ä╨φ?u\c2    ╬$ç≤.d¥8▀|┌NPgÑleîΘ}Ä`L5íÖµY z\w╥P₧┬╧aë≡H#╣°─°⌡.£AR=*x╤⌡(}Æ`Æ·╩êN╝¼╘«┬ÿ▀VÆ_εΘ/?≡╥═ ⌠å  r!
  17311.  
  17312. ╙A$'<çÇ"0αΘ£<á'Φ╟√┼≡╨ƒ┼¿▄áD ½╓Uv_;╕φ|{ÜOH/c^]O▀│Zi4KèrUe°± ▌M¼ö╕ÄεçU^ÜqJadÜ║b ε▌╚\á2ºVq½P╡oÖ∙U !!ípù█ÄGw⌐    *╓Ç좪╔Pçå█ÆrO½Θ^W╢i|┬ε!!█▐ΦGo┴Z╫ß4!!÷─{╫R~╔:╡£ü]4▓εΩ√π    ║≡ S┐áª%TPc;ÿ±P#1[I┘ìàßX-2F[╖δFçUùΣ╪╖≥/ñêä┴ô;ªú╞Åw«y V∩íe┼`^ΓƒòÜü╤ö╨àÑA√)·|Θ:╞∩╕▄V`J    < .╙τ"lƒ ÜJƒU/    ∩stƒε6≈7Y█Γ°_89BYm▐╦▐▌Å≈(▓┐ZùöìB┌bU:-{½Ö 1óY╗╧ÿφ1┐«⌡╡╩ç╟«]úïWR»éû[ª@─ #≥░ìÄ╙0xô╨l╖₧╒L╖φ≥'ä ]dε║.≤Uì▄wÜ¿┤P└█W╡╩≥╩½@ô¥·SⁿεVF≤▒    $8╟₧▒┘Éùz8┼╗┼
  17313. :┘╧≤kÿΓÄlQ▒ås■ ,│═`AΣ<
  17314. ò«╙±╦u╪"πÿ·Φ╚╧VP╪g }îSδóÇ{Ç≥Ñ░∞h[ƒD?âí▒a~─ ≡╓KgU╦òΓ1ÿφ∩+─_I╨mo║╤╛╠~╖bjn⌠»φH{₧z,?»F╙5Θπñπä!
  17315.  
  17316. ╙A$'<ç¥7(«¼╠G∩Vú²Γ▄≥╥╥╨░µσGK║√ΘIvKY└Ç\æPp\^Pd≥ó \g2Jδ5gº┐(⌡┌ºÑ≈è ╩\+│@ks┘«d0½═Ç[Q╒¢5╝F╡xÖ∙C"cQ┬vÜ▀MÖu∞9─╥╤≤╧»aîMÉ¥╙h½▒EAíemç²t═ƒK■Q*îV╘V╨L╣╙y╤I.═:╝╙æ]:▐─òöëo╛√iX≤áì5qBV
  17317. j>╬8µ?cKs█╠ÅΘ6Q)%ÿ∞Eµ0k¿╕≥ù╤Uσ⌐èαƒ3║±╨I┴ QR╣p·OvF÷┤Z╔w^ÑFÜäçÅ▄@÷╝!
  17318.  
  17319. ╙A$'<ç¥7(«¼»%ò&╗ö ┌═╪╩╟╜≈σCS⌐ƒ┼hg┬ö(vÆLPG2BµìTc([πh[oΓé ▌M¼₧╣ÿ°òF,ÆwQjC╚╣l&½üëEÉ¢qεE╣o╨⌠T<╒$¢█JƒP}«8ôÉ┌╢╪¿v╚Üÿûu½π:.╧
  17320. c¬▌φΩs╙≤L╬≡,m⌡çJ╟Aa╥;Æ╬åE`╢ì≈ε∙N┼₧    5╨█╗?%PZbx╬⌡$?d]S╠[á{π╚0V3VXτ┴9äS▄║æ¿∞w└┐Æ┘╙e╪ëáKóoZa{ⁿlΩOh2ê╪y╓-▒Fìäƒêƒz₧╒╩⌠F╫5╗Σ}¿ìæ╧
  17321. PMJ]}τ6ƒΓ(?╤$ë▓r(Ru╞isúε9∩J,Zⁿ░·Rkzq'=òRΘ█╫TѱN%Ñ∞    ₧ü┼Ö    u%φ╓    &╛^«╝æ∩@┴╨ÿê╪Ä╟Y▄jÑçJD â¥ƒ
  17322. æj╜tUε¼│╦à/g╣ƒ;²╚αB!
  17323.  
  17324. ╙A$'<Çè!!=¿ªòp┼/≈µΩ╧±┼█╕╘¢τzN»╖┼vvFBÆÉ6W╫mA)aIWO
  17325. σò VnπqV~¬ñ$║╪MΦú┐¢╖·8*╫p[mr╙╛h6ε╦┘\¥╙p¡F┐kò▓<%`≤aÜ₧Lîu∞9╨¥╤≥î»u╚ù₧╙n
  17326. ¡⌠^RºrMh┬√*╬┌≈S*┌V╒α!!x╣─j╟Cz┼;±╦èP|≤£²²∩¼╫rY╕⌠╖BK++?f [τ"╤2Dcdë(≥₧ÑZl0O Φä,äH▓⌡┬¼εn²≥∞º≤W▄╪└≥E!!÷<∞FZß╛{─$ül≈├■Σ▓"≥┼└ΩD┤ 5╣d≤7µδ²▐)_{8≥8ü≤c√]╝a≥,@Qh½eméΘ,ú 7Y═°»G'Oq─É┐│-8╨úê╨b▌!
  17327.  
  17328. ≤A$'<ìü4&╫├σhñ1≥├Ω▐╛╓╤òΓ█ùV@░⌐─R}NYî─:Wä\V#lR]lOΓët#LªuEo░∞3║═V╜┤úïσ╩\¢uM ░╒C=║╠ÇM@ö╙pεBóiò ∞E7íqî█êJq∞%└å╞√î░açûƒûxOºⁿGHºmuûε'╫╨Q½-┘KÜαmu±╬kéK}Ç9ú┘ÆQq╜║⌠τák┬¥uR╕÷│dDY&zïµpw@Bë┼╩àa k@╙â=èH ôπæ»⌠hτ▓┴▀ƒ/áΩ█ Å/»uΩ
  17329. 4J±┤)╧k┼4¢é££█aò╨╩»/₧{'┐+∞&╓≤╕▐UfL}≡5ƒ≥mq₧tûC╧DOfêt ä∩u∞7O═«∙R"tt╗p╖╬ÖP└±Uj½Æ#÷üûäqxCE─░0-öEÖ²╫√é╡ │æ╦≡b╥5╩φW_d·╧╧┬júmr6≥▓≡╟├ céƒvτ│Σ]Q╢ⁿ°&æDY9 ê·╥OùΣm╠£Çi─÷-╩    ├á┤∩ ▌░²T εC╒ªa~Ω╧±∙É^V╬%╞╕âE2æÇφOÉαí(╦╡:╬/8⌐█.╤)M┼!
  17330.  
  17331. ╙A$'<ìü;=αΘ£<½:÷╣àÑ╝■╥┼▓≈¿VM½√╘svαü=]à[m$hT    1=≤éKbA¬h#Γª%ε╓MΦ▒╕î╖█╫Az4.d▀»n º╦┼]ù╙}½ñxô⌡GJvî÷≈WòV}¡ 5╔ùâ≈î«vƒMÜûâhε≤BBñe;äα!!₧▐⌡D,├M▐Vⁿ+!!φ╧}éPk├:╕╩åV3áε∞τ≡µ┤TT░≤≥uJPc<Ü ≈?Y┌W┘Å╠3/JA╩ì*ÿNBå ┬½⌡cΦ┐┴Ç┌7íú├▄w│o╝|Zóªa╧a^¼îäÆ└▓"÷╝¼Åj╞7ÅG╒s·╪δ╦EhC
  17332.     ⌠4£σ)Lƒ=ï▓r(+
  17333. ╜ouÖ╞u⌡,XéΓ A?]P%╗p╖É┤.kΩèO/╗∙    û¢ûSäl(Fn╒╛IiT»<╫╣δφ!!ç°£▄!
  17334.  
  17335. register
  17336.     "(Re)Register the receiver's as the Record class for its GUID.
  17337.     This is used to map VT_RECORD <VARIANT>s and <SAFEARRAY>s
  17338.     back to the appropriate <ExternalStructure> class."
  17339.  
  17340.     self registerClass: self forGUID: _guid!
  17341.  
  17342. registerClass: structureClass forGUID: aGUID
  17343.     "Register the specified <ExternalStructure> class as the Record class
  17344.     for the specified <GUID>. Any existing registration is first removed.
  17345.     If the <GUID> is null, then only the removal occurs."
  17346.  
  17347.     | existingKey |
  17348.     RecordClasses isNil ifTrue: [^self].
  17349.     existingKey := RecordClasses keyAtValue: structureClass ifAbsent: [].
  17350.     existingKey isNil ifFalse: [RecordClasses removeKey: existingKey].
  17351.     aGUID isNull ifFalse: [RecordClasses at: aGUID put: structureClass]!
  17352.  
  17353. ≤A &,í¥<╕¬Ç+û,Σ╟éªùòùτ╗╗ùVD╢¿╘~aB┌ü~@Æ\A#x^A,╢Æ [e*N░oVyΓ¬3║╠GºÑ│▐⌠├äqM@yi╬┤X╟▌╚\AçVÆe╝LªoÖΦT.╚@îÉ¿J}┐@5└╥╩°╪Ñ}î¢█ÆoO»▒_A«pi┬Θ&╨▄KεN!!îH╥²@ É├}╘Gb╧/╕╥ä4▓áⁿ╛Φ╗┤nS∙≥ºOqOX&!!çφ6xLQ╟╚_τ╦4U*_▀ì)╦Hæ∙┬¼∙s╫»â╬û?ª≡╠óo^Ii╤òqSΣ±`╬dOσÆêëïφM£▀╓≥Gµ\]╨≥6╔ß╕▐JZZJ1≡$Ç≥>A₧n▀uà^#à rêⁿ<≡ N⌡!
  17354.  
  17355. removeTemplate
  17356.     "Private - Remove the template instance variables of the receiver"
  17357.  
  17358.     template := IdentityDictionary new!
  17359.  
  17360. setGuid: aGUID
  17361.     "Private - Set the value of the receiver's 'guid' instance variable to the 
  17362.     <GUID>, aGUID.
  17363.     Implementation Note: Override to register the structure in the table mapping GUIDs
  17364.     to record classes."
  17365.  
  17366.     _guid ~= aGUID ifTrue: [
  17367.         super setGuid: aGUID.
  17368.         self register]
  17369. !
  17370.  
  17371. shouldCompile: selector forField: anExternalField
  17372.     "Private - Answer whether to compile an accessor method
  17373.     with the specified selector for the specified field in the
  17374.     receiver."
  17375.  
  17376.     ^anExternalField canGenerateAccessors 
  17377.         and: [(self hasHandCodedMethodFor: selector) not        "Don't overwrite manually written methods"
  17378.             and: ["Don't generate inherited fields unless specifically marked for override"
  17379.                 anExternalField isOverride or: [
  17380.                     (self superclass template includesKey: (selector upTo: $:) asSymbol) not]]]!
  17381.  
  17382. shrink
  17383.     "Private - Reduce the size of the structure template by removing the write accessors.
  17384.     This should only be done to compiled structures."
  17385.  
  17386.     self template keysAndValuesDo: [:k :f |
  17387.         (k last == $: and: [f canGenerateMutator])
  17388.             ifTrue: [self template removeKey: k]]
  17389.  
  17390.     !
  17391.  
  17392. structurePacker
  17393.     "Answer the object which implements the structure packing algorithm
  17394.     for use with the receiver.  The object must respond to the <structurePacker>
  17395.     protocol."
  17396.  
  17397.     ^self!
  17398.  
  17399. ≥Q7
  17400. :*░è6┤╜ë8â>Γ╤ⁿíö╛¥σ¼√│RW║√ì;RFE┼ü,âWAj}^G+≡┴Wr#]Ñ}PoΓ¿,√═Q╗≈ñïτ▀ âqZ@lyÜ¿e7ε█┼ZM£û;├)▀T¥≡TB 6⌡eï╫VÆZú9ë╥⌠≤îíaì╪Å╙y╛⌠TP½n;ûτ2╩ƒK∩Do┼R╩÷ d≈╙y╓Ka╬╛┌├mF╢¡≈∞Σ/ª≥o«σ≥jP\crÖ∩ppLD▄┴ô╠3>F ╧Æ*ÅÖΓæ┐∙u≡│Å╩┌?╗τë╩#ⁿh⌠
  17401. 4Iπ╜|┼~π▐çÜï╙Lêû╠Φ┴6⌐'í1╨≤╕╥OgC    -π8à■)`╤=ï╦Obìe ÿδuσ7▄¬Ω\P#╒₧╞╤E└≈T/≈≡GÜ╒ï^╬)x\I╨±6}åi╨φ▌Æú·≈╖┘╦╬Gî]▓ì@X'Ñû╧├#«j&·╡╡▌à7tûî5τ¥πQQ½ ╗ºtcwEÄ¥▓ìΘ2╠âà▌█qüUuiÅáÑ╙(├Θ┘~ÆêOí║pd⌐√╓▀ö_┘/-╞╛└C9┼╘╛CÆαô{Oú╚:µn|╖▀}Fµ"▀±ô┼╬¥!!¼╡æì¡╥H╤aNHçO≥²═τï└í│&]ìRI(╫½äa{:£gÜ╬PFìêº#╫«Γ>¥B█jz½╠╨▓┌1qaª»∞C<╛W*xc\├ ¬vΘ«æw*└├∩┤C╣Θ▀¬|Éq^ Qo╗P]tW┌-≡╜ƒzG%┤ZN╣q╞ε
  17402. h∩φ░√▀]oZ4%¥àÉ╝α╒âΓº╧Γτg┘+vbZ⌠µ²JσÅ╗²]ï ⌠*&!!Φëno¡█Eú∩\▓ä_┌çüâVÅù╕J╞_n∙-}è F╚üfEn-«√α╖π*ªOh═∞o▌├ò~╕«]E?ΩoÜWg╨Ƭ ,»=*~Ω⌐∞µ/AñΓc"Mτ╫ÇxÄB╨ó▐'⌠ xâ≈-╡X╞╢ùαf╖Ñ]p0?4▓ⁿΘ2╜^ ╧ì╕ìF┘ ñ≥ñ┬ü7═5╫╟¿ ┐^ö½+φûúk├&ñ¿H▄ΘE╒╕7î%Q0í\CI"E│6ÅUïzK╖bl>W╝üÉ3}²ëσXæl5ì0Æ╧ΓÇ]6bTª╧∙MùφåjîL¼Bµk∙=[½ÉWƒ`ü2Æ┤¼╕Umò┐░¢c!
  17403.  
  17404. template
  17405.     "Private - Answer the receiver's structure template (defines the types and 
  17406.     offsets of the fields)"
  17407.  
  17408.     template isNil ifTrue: [self defineTemplate].
  17409.     ^template!
  17410.  
  17411. ⌡]76óÇ_C╙δ¡$û(Σ╞»═≡ùâⁿèδ╡Vj▒╜╧%3GXÆÉ6W╫MA)kREn▒Æ^M6Jπu]l¡╣-√╩Kª∙⌡≤¥óvw⌐g[ h ╬Ñ}7ç╟╞Vaô8£p⌠ìnò·J*εv┼₧▓M4╕,╓╥╩°╩»aà ïÆ£rO»τVM«awç¿!
  17412.  
  17413. ⌡]76óÇ/öªé/▀Σ╠∞╔ε├╓┌░┌ñ]G│╛╥!!≤è-EÆM+`B;∩æph @²<\dΓ┐( ₧P½▓╛ê≥▌[╫`Gk ╙▓k=╝─┴MAÜ▀{╟Lñ=Ö╝_@I,°tÜ₧PÆD{╛=╟¢╠°î⌐`╚ ëÜÜp¼²R╢h;ÉΩ ╦╙KºN)îZ╠ 8`φ╬v┼z╚:▄╢Ωz║ó∙·Θ₧⌡lI╕Γ╛\)Pe7₧Ω>YN^═╚─π4Q)%╞┴.ÿIò░═╒û┌≥Ç▐ë1╢úôTÅ2C░u■uM√Ég─DUΦå╚╙ç╠fÆ┌¿î+¥Äy⌠6ƒº├┌El_@2 Æ∙)iö&▀X▐TG^δ
  17414.     Σ≥3┼ )O═°»l0)Y}û█╦ÖPɵu$▒≡hï╧▀F═?7S├ⁿ1!
  17415.  
  17416. ⌡]71ªΓX@°êé9Æ:≤öε┬╛ï÷ߺΓáJ╜σÇt}B┌ü~@Æ\A#x^A,╢òIcfC¬~Ak░▓lù┤+║≈δÉ■├B^₧rfeÜ«h1½└╓\Z╒£fεM╣i╨    ²GJI9ípå╬\▄N}«=┴ïì┤í╩Γdâ█ƒuÅ Sm¼dc┬≤^┤╢SεC┬[≤≈(y╣¥%éQk╠9±╨èFf▓╝ß▀εü·dYí«▀`k[J\    G<è#φ5iY┌9─╩¿_K=O_▀█o░V ö╤▀╝╒oα┐Öìæ;¼▐!
  17417.  
  17418. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  17419. à:3jG▀▓h »┼╠@åû~ºM▒=ä    ⌡B+ípù█ƒNu┐|▌ô╬≤éΓΓ`⌡≥¡o
  17420. ó≈Júm!
  17421.  
  17422. understoodSelectors
  17423.     "Answer a Set of all message selectors understood by the receiver, not including those understood because
  17424.     they are implemented in superclasses. This should however include those that are not in the method dictionary
  17425.     but will be understood as a result of #doesNotUnderstand: processing, if that is possible."
  17426.  
  17427.     ^(IdentitySet withAll: super understoodSelectors)
  17428.         addAll: self template keys;
  17429.         yourself!
  17430.  
  17431. uninitializeBeforeRemove
  17432.     "Perform any pre-removal uninitialisation for the class.
  17433.     We need to unregister all subclasses as they are removed. This
  17434.     can't be done by #uninitialize since this only gets sent to classes
  17435.     that explicitly implement it; i.e. it is not inherited by our subclasses."
  17436.  
  17437.     _guid notNil ifTrue: [self unregister].
  17438.     template := _guid := nil.
  17439.     super uninitializeBeforeRemove!
  17440.  
  17441. unregister
  17442.     "Unregister the receiver as a Record class for its guid."
  17443.  
  17444.     (_guid notNil and: [RecordClasses notNil]) ifTrue: [
  17445.         RecordClasses removeKey: _guid ifAbsent: []]!
  17446.  
  17447. ⌠J4
  17448. 0;¡ë;,╛Öì8ä2Σ└Ω▐╚╓╙└╗ƒ╧:}≈ìßIZixµ─0WÇ)@2EU╢ÆU`fY╖'>╦┬9⌡╦P¡╗▒!
  17449.  
  17450. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  17451. m»g|jmT]x≈Å
  17452. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{Fûì╫╠─O! !
  17453.  
  17454. !ExternalStructure methodsFor!
  17455.  
  17456. _deepenShallowCopy: clone trail: copiesDictionary
  17457.     "Private - Deepen the argument, clone, which is a shallow copy of the receiver.
  17458.     Answer the deepened shallow copy (or another object to represent the deep copy
  17459.     if you so desire - though if you do this you must update the copiesDictionary).
  17460.     We need to override this in order to correctly deepen the contents instance
  17461.     variable which might be an external address - if so we copy the data pointed
  17462.     at, so that the clone is a true deep copy, and does not reference any of the
  17463.     same data as the receiver."
  17464.  
  17465.     self isNull 
  17466.         ifFalse: 
  17467.             ["Create a new copy of the internal/referenced data"
  17468.  
  17469.             clone
  17470.                 initialize: self byteSize;
  17471.                 copyBytes: bytes].
  17472.     "Use the standard implementation for the rest of the object"
  17473.     2 to: self class instSize + self basicSize
  17474.         do: [:i | clone instVarAt: i put: ((clone instVarAt: i) _deepCopy: copiesDictionary)].
  17475.     ^clone!
  17476.  
  17477. = anExternalStructure
  17478.     "Answer whether the receiver is equivalent to anExternalStructure.
  17479.     Two external structures are considered equivalent if they are of 
  17480.     the same type, and they contain the same bytes."
  17481.  
  17482.     ^self == anExternalStructure or: 
  17483.             [self species == anExternalStructure species and: 
  17484.                     [| isNull |
  17485.                     (isNull := self isNull) == anExternalStructure isNull and: 
  17486.                             [isNull or: 
  17487.                                     [(CRTLibrary default 
  17488.                                         memcmp: self
  17489.                                         buf2: anExternalStructure
  17490.                                         count: self comparisonSize) == 0]]]]!
  17491.  
  17492. alignment
  17493.     "Answer the alignment required for instances of the receiver when 
  17494.     embedded in arrays or other structures"
  17495.  
  17496.     ^self class alignment!
  17497.  
  17498. alternateInspectorClass
  17499.     "Answer the class of inspector to be used when the user requests to inspect
  17500.         the receiver with the Shift key held down."
  17501.  
  17502.     ^StructureInspector!
  17503.  
  17504. asByteArray
  17505.     "Answer the raw contents of the receiver as a byte array."
  17506.  
  17507.     ^self copyFrom: 1 to: self byteSize!
  17508.  
  17509. αW?=º¢_C╙δ¡$û(Σ╞»╪÷╥ƒëæ≡»V@½σÇmrDC╫─,WçMA9kUGn ╢âr.JπnViºó6 ╠ B┼▌┌⌠₧±¢rol╧╣!
  17510.  
  17511. asParameter
  17512.     "Answer the receiver in a form suitable for passing
  17513.     to an ExternalLibrary call. Although ExternalStructures can be passed to 
  17514.     #lpvoid parameter types directly, it is more useful if we answer the contents
  17515.     as this allows, for example, DWORDs to be passed as #dword parameters."
  17516.  
  17517.     ^bytes!
  17518.  
  17519. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òΓ─äaj₧ò⌠%3ZS┬û;AÆQP+zR\eO∙ç^Mn#▒yPo½╜%ΦÉ/j┴Ö╕è≥Åû`fi╔ⁿz;ó┼Ç[M╒╙p¿Fñx₧∙[x⌡lÜ₧KÖAqÑ9┴╥═∙╪αr╚Éïè2M├¢:.╦^<Z░╞≡δΘD8í5│α9s∞─lÿ}┼3╖çε.┌╖≈δ≥¡°f!
  17520.  
  17521. basicFree
  17522.     "Private - Free external resources owned by the receiver.
  17523.     This is a default implementation which relieves subclasses from
  17524.     the responsibility of providing both class (freeElement:) and instance 
  17525.     side (#basicFree) methods."
  17526.  
  17527.     self class clear: bytes!
  17528.  
  17529. beNullHeapPointer
  17530.     "Private - Set the receiver's contents to be a NULL heap pointer."
  17531.  
  17532.     self initializeAtAddress: self heapPointerClass new!
  17533.  
  17534. beNullPointer
  17535.     "Private - Set the receiver's contents to be a NULL pointer."
  17536.  
  17537.     self initializeAtAddress: self pointerClass new!
  17538.  
  17539. bufferClass
  17540.     "Private - Answer the default class to use as a contents buffer"
  17541.  
  17542.     ^ByteArray!
  17543.  
  17544. bytes
  17545.     "Answer the byte buffer which the receiver represents (a (sub)instance of ExternalBytes)."
  17546.  
  17547.     ^bytes!
  17548.  
  17549. bytes: aByteObject
  17550.     "Private - Set the contents of the receiver. Answer the receiver."
  17551.  
  17552.     bytes := aByteObject!
  17553.  
  17554. bytesAtOffset: anInteger put: anExternalStructureOrByteObject
  17555.     "Replace the bytes of the receiver from offset anInteger (0 based)
  17556.     with those of the argument aVariableByteObject"
  17557.  
  17558.     anExternalStructureOrByteObject
  17559.         replaceBytesOf: self bytes
  17560.         from: anInteger+1 
  17561.         to: anInteger + anExternalStructureOrByteObject size
  17562.         startingAt: 1!
  17563.  
  17564. byteSize
  17565.     "Answer the size in bytes of this structure"
  17566.  
  17567.     ^self class byteSize!
  17568.  
  17569. comparisonSize
  17570.     "Private - Answer the number of bytes of the receiver to use in comparisons.
  17571.     This may be slightly less than the #byteSize in order to exclude any padding
  17572.     bytes that are present to fill the structure out to its packing boundary.
  17573.     Subclasses should override as necessary."
  17574.  
  17575.     ^self byteSize!
  17576.  
  17577. copy
  17578.     "Answer a suitable copy of the receiver, which does not share the same byte data."
  17579.  
  17580.     ^super copy
  17581.         initialize: self byteSize;
  17582.         copyBytes: bytes;
  17583.         yourself!
  17584.  
  17585. copy: aByteClass from: start to: stop
  17586.     "Private - Answer a copy of the bytes of the receiver starting at index start, 
  17587.     until index stop, inclusive, as an instance of the argument, aByteClass."
  17588.  
  17589.     | len answer |
  17590.     len := stop - start + 1.
  17591.     ^self replaceBytesOf: (aByteClass new: len)
  17592.         from: 1 to: len startingAt: start!
  17593.  
  17594. copyBytes: aByteObject
  17595.     "Private - Set the contents of the receiver (as appropriate for the subclass).
  17596.     Answer the receiver."
  17597.  
  17598.     aByteObject replaceBytesOf: self bytes from: 1 to: self byteSize startingAt: 1!
  17599.  
  17600. copyFrom: start to: stop
  17601.     "Answer a copy of the bytes of the receiver starting at index start, 
  17602.     until index stop, inclusive."
  17603.  
  17604.     ^self copy: ByteArray from: start to: stop!
  17605.  
  17606. copyStringFrom: start to: stop
  17607.     "Answer a copy of the bytes of the receiver starting at index start, 
  17608.     until index stop, inclusive, as a String."
  17609.  
  17610.     ^self copy: String from: start to: stop!
  17611.  
  17612. copyToCOMTaskMemory
  17613.     "Answer a block of COM Task Memory into which the bytes of the 
  17614.     receiver have been copied."
  17615.  
  17616.     ^self copy: COMTaskMemory from: 1 to: self byteSize!
  17617.  
  17618. detach
  17619.     "Detach the receiver from the object at which it is pointing, answering the address
  17620.     of that object. This is useful where one wishes to take-over ownership of an object
  17621.     which would otherwise be cleaned up when the receiver is finalized."
  17622.  
  17623.     | detached |
  17624.     detached := self bytes.
  17625.     bytes := nil. 
  17626.     self beUnfinalizable.    "reduce Memory Manager load"
  17627.     ^detached!
  17628.  
  17629. do: aOneArgumentBlock
  17630.     "Evaluate the <monadicValuable> argument, operation, for each of the
  17631.     receiver's fields."
  17632.  
  17633.     self getValidFields do: [ :field | 
  17634.         aOneArgumentBlock value: (self getField: field) ]!
  17635.  
  17636. do: operation separatedBy: separator
  17637.     "Evaluate the <monadicValuable> argument, operation, for each of the 
  17638.     receiver's fields, interspersed with evaluations of the <niladicValuable>
  17639.     argument, separator. The separator is first evaluated after the first
  17640.     field, and is not evaluated after the last."
  17641.  
  17642.     self getValidFields 
  17643.         do: [ :field | operation value: (self getField: field) ]
  17644.         separatedBy: separator!
  17645.  
  17646. doesNotUnderstand: aMessage
  17647.     "Sent to the receiver by the VM when a message sent to the receiver was 
  17648.     not implemented by the receiver or its superclasses. In this case then the 
  17649.     selector of aMessage is looked up in the receiver's class' template, and 
  17650.     if found the appropriate field is retrieved/set."
  17651.  
  17652.     | args field |
  17653.     args := aMessage arguments.
  17654.     field := self template
  17655.             at: aMessage selector
  17656.             ifAbsent: [^super doesNotUnderstand: aMessage].
  17657.     ^args size == 0 
  17658.         ifTrue: [field readFrom: self bytes]
  17659.         ifFalse: [field writeInto: self bytes value: (args at: 1)]
  17660. !
  17661.  
  17662. finalize
  17663.     "Private - Perform death-bed operations."
  17664.  
  17665.     self free!
  17666.  
  17667. free
  17668.     "Free external resources owned by the receiver.
  17669.     Implementation Note: Whether we free the data or not we must
  17670.     make sure that we remove any lock for which we are responsible."
  17671.  
  17672.     self needsFree
  17673.         ifTrue: [self basicFree].
  17674.     bytes := nil.
  17675.     self beUnfinalizable    "finalization no longer required"!
  17676.  
  17677. getField: fieldNameString
  17678.     "Answer the value of the named field of the receiver,
  17679.     or if there is no such field then raise an exception."
  17680.  
  17681.     ^self perform: fieldNameString asSymbol!
  17682.  
  17683. getValidFields
  17684.     "Private - Answer a <sequencedReadableCollection> of the fields defined 
  17685.     in the receiver's template, sorted in ascending order of offset from the start of the
  17686.     structure, that are valid in this particular instance (some Windows structures
  17687.     have a mask field which identifies which of the other fields have been 
  17688.     initialized with a value)."
  17689.  
  17690.     ^self class getFieldList!
  17691.  
  17692. hash
  17693.     "Answer the SmallInteger hash value for the receiver.
  17694.     In order for internal structure to have the same value as pointer structures
  17695.     we use the VM export here."
  17696.  
  17697.     ^VMLibrary default hashBytes: bytes count: self comparisonSize!
  17698.  
  17699. heapPointerClass
  17700.     "Private - Answer the default class to use as a heap pointer"
  17701.  
  17702.     ^ExternalMemory!
  17703.  
  17704. hresultError: anInteger
  17705.     "Signal that a member function in the receiver returned the specified
  17706.     hresult."
  17707.  
  17708.     ^HRESULTError signalWith: anInteger!
  17709.  
  17710. initialize
  17711.     "Private - Perform any initialization required for the receiver
  17712.     which is specific to the value form. Answer the receiver.
  17713.     To perform reference specific initialization, override #initializePointer."
  17714. !
  17715.  
  17716. initialize: anInteger
  17717.     "Private - Create an external buffer in the receiver of the specified size.
  17718.     Some subclasses, particularly for Win32 structures, may want to override
  17719.     to set their first member to their size."
  17720.  
  17721.     bytes := self bufferClass newFixed: anInteger.
  17722.     self initialize!
  17723.  
  17724. initializeAtAddress: anAddress
  17725.     "Private - Initialize the receiver to be a reference to an ExternalStructure
  17726.     of the receiver's type at the specified address. Any modifications to the 
  17727.     receiver will be reflected back into the structure/object at anAddress."
  17728.  
  17729.     bytes := anAddress asExternalAddress.
  17730.     self initializePointer!
  17731.  
  17732. initializePointer
  17733.     "Private - Perform any initialization required for the receiver
  17734.     which is specific to the reference form. Answer the receiver.
  17735.     To perform value specific initialization, override #initialize."!
  17736.  
  17737. invalidArgErrorClass
  17738.     "Private - Answer the class of Error to be signalled when an argument to one of the receiver's
  17739.     external calls is invalid."
  17740.  
  17741.     ^InvalidExternalCall
  17742. !
  17743.  
  17744. invalidCall
  17745.     "An invalid virtual call was attempted through one of the receiver's methods.
  17746.     Generate an appropriate error from the following categories:
  17747.         -    Argument type error. At least one argument was either out of range or of invalid type.
  17748.             Only the first such error is reported.
  17749.         -    Unknown primitive failure. An uncategorised primitive failure occurred. Seek assistance."
  17750.  
  17751.     | failureCode proc |
  17752.     proc := Processor activeProcess.
  17753.     (failureCode := proc primitiveFailureCode) < 0 ifTrue: [^self hresultError: failureCode].
  17754.     failureCode >= 16 
  17755.         ifTrue: 
  17756.             [| frame i arg descriptor |
  17757.             frame := proc topFrame sender.
  17758.             descriptor := frame method descriptor.
  17759.             i := descriptor argumentIndexFromOffset: failureCode - 16.
  17760.             arg := frame method isVirtualFunction ifTrue: [i - 1] ifFalse: [i].
  17761.             self invalidArgErrorClass 
  17762.                 invalidArgument: arg
  17763.                 got: (frame arguments at: arg)
  17764.                 expected: (descriptor argumentTypes at: i)].    "One of the arguments was invalid?"
  17765.  
  17766.     "All arguments were apparently valid, it must have been some system or unknown error."
  17767.     ^self primitiveFailed!
  17768.  
  17769. isNull
  17770.     "Answer whether the receiver is a null external data item
  17771.     (that is, a null pointer, or a nilled out structure)."
  17772.  
  17773.     <primitive: 170>
  17774.     ^bytes isNull!
  17775.  
  17776. isPointer
  17777.     "Answer whether the receiver is a pointer to an external data item."
  17778.  
  17779.     ^bytes class isIndirection!
  17780.  
  17781. maxPrint
  17782.     "Private - Answer the maximum number of characters to output when appending the 
  17783.     receiver's textual representation to a Stream"
  17784.  
  17785.     ^500!
  17786.  
  17787. needsFree
  17788.     "Private - Answer whether the receiver requires freeing of any external resources."
  17789.  
  17790.     ^false!
  17791.  
  17792. notNull
  17793.     "Answer whether the receiver is not Null (i.e. not equal to 0)"
  17794.  
  17795.     ^self isNull == false!
  17796.  
  17797. pointerClass
  17798.     "Private - Answer the default class to use as a pointer"
  17799.  
  17800.     ^ExternalAddress!
  17801.  
  17802. printArgumentTypeOn: aStream
  17803.     "Private - Append a compilable argument type name, which is the receiver, to aStream."
  17804.  
  17805.     self class displayOn: aStream.
  17806.     self isPointer ifTrue: [aStream nextPut: $*]!
  17807.  
  17808. printCyclicRefOn: aStream
  17809.     "Private - Append to the argument, aStream, a String whose characters describe
  17810.     a cyclic (or recursive) reference to the receiver. Used by some
  17811.     printOn: methods (e.g. see Collection) to prevent an infinite recursion."
  17812.  
  17813.     aStream nextPutAll: '... a cyclic ref to '.
  17814.     self basicPrintOn: aStream.
  17815.     aStream nextPutAll: '...'!
  17816.  
  17817. printOn: aStream
  17818.     "Append a textual representation of the receiver to aStream.
  17819.     We use the template definition to do this in a generic way for all correctly 
  17820.     defined subclasses. Fields are printed in the order of their offset"
  17821.  
  17822.     | selector tooMany printed |
  17823.     printed := Processor activeProcess _alreadyPrinted.
  17824.     (printed includes: self) ifTrue: [^self printCyclicRefOn: aStream].
  17825.     printed add: self.
  17826.     
  17827.     [tooMany := aStream position + self maxPrint.
  17828.     super printOn: aStream.
  17829.     aStream nextPut: $(.
  17830.     self isNull 
  17831.         ifTrue: [aStream nextPutAll: 'NULL']
  17832.         ifFalse: 
  17833.             [self getValidFields do: 
  17834.                     [:field | 
  17835.                     aStream position > tooMany 
  17836.                         ifTrue: 
  17837.                             [aStream nextPutAll: '... etc ...'.
  17838.                             ^self].
  17839.                     aStream
  17840.                         display: field;
  17841.                         nextPutAll: '=';
  17842.                         print: (self getField: field)]
  17843.                 separatedBy: [aStream space]].
  17844.     aStream nextPut: $)] 
  17845.             ensure: [printed remove: self ifAbsent: []]!
  17846.  
  17847. publishedAspects
  17848.     "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  17849.  
  17850.     | aspects |
  17851.     aspects := super publishedAspects.
  17852.     self isNull 
  17853.         ifFalse: 
  17854.             [self getValidFields do: 
  17855.                     [:each | 
  17856.                     | field |
  17857.                     field := self template at: each.
  17858.                     aspects add: (field newAspect: Aspect name: each)]].
  17859.     ^aspects!
  17860.  
  17861. ≤A$'<ìü4&╫├σhñ1≥├Ω▐╛╓╤òΓ█ùV@░⌐─R}NYî─1\╫KL/.IVh
  17862.  ùK!!5╖eCoΓó.ⁿ╤P⌐ú╛æ∙ü^s²4iPs▀░kr¡┼┴J[╒ûz╝Gƒsû!
  17863.  
  17864. replaceBytesOf: aByteObject from: start to: stop startingAt: fromStart
  17865.     "Private - Standard method for transfering bytes from one variable
  17866.     byte object to another, normally double dispatched."
  17867.  
  17868.     ^bytes replaceBytesOf: aByteObject from: start to: stop startingAt: fromStart!
  17869.  
  17870. replaceFrom: start to: stop  with: aByteObject startingAt: fromStart
  17871.     "Standard method for transfering bytes from one variable
  17872.     byte object to another. See String>>replaceFrom:to:with:startingAt:"
  17873.  
  17874.     aByteObject replaceBytesOf: self bytes from: start to: stop startingAt: fromStart!
  17875.  
  17876. setField: fieldNameString value: anObject
  17877.     "Set the value of the named field of the receiver,
  17878.     or if there is no such field then raise an exception."
  17879.  
  17880.     ^self perform: (fieldNameString, ':') asSymbol with: anObject!
  17881.  
  17882. size
  17883.     "Answer the size of the receiver's contents (more useful)."
  17884.  
  17885.     ^self byteSize!
  17886.  
  17887. template
  17888.     "Private - Answer the receiver's structure template (defines the types and 
  17889.     offsets of the fields). Can be overridden by subclasses which wish to vary    
  17890.     the template on an instance specific basis, e.g. for a generic structure
  17891.     class."
  17892.  
  17893.     ^self class template!
  17894.  
  17895. value
  17896.     "Answer the receiver's value field as an equivalent Smalltalk object."
  17897.  
  17898.     ^self!
  17899.  
  17900. value: anObject
  17901.     "Set the value buffered by the receiver to anObject."
  17902.  
  17903.     ^self copyBytes: anObject!
  17904.  
  17905. ≈PJp\zö¥;?╗╜ëj╚└┌ⁿ█√┼ƒ┴╢≈σebìÆßUGB╦ö;àZU?gIVoOΓÄ^Kc6]ªoVd╢δ4≥█¡┤▓ùß╩P╒4m    Σ»h>¿ë├UIå╙a!
  17906.  
  17907. yourAddress
  17908.     "Answer the address of the receiver's contents"
  17909.  
  17910.     ^bytes yourAddress! !
  17911.  
  17912. File comment:
  17913. ''!
  17914. !File class methodsFor!
  17915.  
  17916. appendPathDelimiter: aString 
  17917.     "Answer a <readableString> that is the argument with a path separator appended to create the correct syntax for
  17918.     a path. If aString already ends in a path separator then the answer is equivalent."
  17919.  
  17920.     (aString notEmpty 
  17921.         and: [self pathDelimiters identityIncludes: aString last]) 
  17922.             ifTrue: [^aString].
  17923.     ^aString copyWith: self pathDelimiter!
  17924.  
  17925. attributes: aFileNameString
  17926.     ^KernelLibrary default getFileAttributes: aFileNameString!
  17927.  
  17928. change: aPathnameString extension: anExtensionString
  17929.      "Changes the extension of aPathnameString to anExtensionString.
  17930.     Answers the new filename"
  17931.  
  17932.     | components |
  17933.     components := self splitPath: aPathnameString.
  17934.     components at: 4 put: anExtensionString.
  17935.     ^self makePath: components!
  17936.  
  17937. commonPrefixOf: path1 and: path2
  17938.     "Answer the <readableString> common prefix shared between the two paths.
  17939.     This will be empty if the paths share no common prefix."
  17940.  
  17941.     | prefix len |
  17942.     prefix := File pathBuffer.
  17943.     len := ShlwapiLibrary default 
  17944.             pathCommonPrefix: path1 
  17945.             pszFile2: path2
  17946.             pszPath: prefix.
  17947.     ^prefix copyFrom: 1 to: len!
  17948.  
  17949. composePath: aPathString stem: aStemString extension: anExtensionString
  17950.     "Composes a full pathname from its components. The path or extension components 
  17951.     can be nil if necessary. The path can include the drive letter."
  17952.  
  17953.     ^self makePath: (Array with: nil with: aPathString with: aStemString with: anExtensionString)
  17954.     !
  17955.  
  17956. composePath: path subPath: subpath
  17957.     "Composes a full pathname from path and subpath components."
  17958.  
  17959.     | fullName |
  17960.     fullName := self pathBuffer.
  17961.     ^ShlwapiLibrary default pathCombine: fullName lpszDir: path lpszFile: subpath!
  17962.  
  17963. composeShortStem: aStemString extension: anExtensionString
  17964.     "Answer a String which is a file name abbreviated from aStemString and anExtensionString.
  17965.     Lower case vowels are dropped from the right of aStemString until it is less than
  17966.     or equal to 8 characters.
  17967.     If still longer than 8 chars, then other lowercase letters are dropped from the
  17968.     right of the stem until it is less than or equal to 8 characters."
  17969.  
  17970.     | stemResult extResult len useChar path |
  17971.  
  17972.     stemResult := aStemString.
  17973.     (stemResult size > 8) ifTrue:
  17974.         [stemResult := stemResult select: [:c | c isAlphaNumeric ]].
  17975.     (stemResult size > 8) ifTrue:
  17976.         [
  17977.         len := stemResult size.
  17978.         stemResult := stemResult reverse.
  17979.         stemResult := stemResult select: [:c | 
  17980.             (c isVowel and: [ c isLowercase and: [ len > 8 ]])
  17981.                 ifTrue: [ useChar:=false. len:=len - 1 ]
  17982.                 ifFalse: [ useChar:=true ]. 
  17983.             useChar ].
  17984.         stemResult:=stemResult reverse ].
  17985.     (stemResult size > 8) ifTrue: [
  17986.         len:=stemResult size.
  17987.         stemResult := stemResult reverse.
  17988.         stemResult := stemResult select: [:c | 
  17989.             (c isLowerCase and: [ len > 8])
  17990.                 ifTrue: [ useChar:=false. len:=len-1]
  17991.                 ifFalse: [ useChar:=true ].
  17992.             useChar].
  17993.         stemResult:=stemResult reverse ].
  17994.     (stemResult size > 8) ifTrue:
  17995.         [stemResult:=stemResult leftString: 8].
  17996.     (extResult size > 3) ifTrue:
  17997.         [extResult:=extResult leftString: 3].
  17998.  
  17999.     ^self composeStem: stemResult extension: anExtensionString!
  18000.  
  18001. composeStem: aStemString extension: anExtensionString
  18002.     "Composes a full pathname from aStemString and anExtensionString components.
  18003.     Implementation Note: This could be implemented in terms of #composePath:stem:extension:,
  18004.     which ultimately is implemented in terms of #makePath:, however it is a very frequently
  18005.     used method so an optimized version which takes advantage of private knowledge of
  18006.     how file names are constructed is warranted. Note that the dot separator may be
  18007.     specified in the extension, or not."
  18008.  
  18009.     ^anExtensionString first == $.
  18010.         ifTrue: [aStemString, anExtensionString]
  18011.         ifFalse: [aStemString, '.', anExtensionString]!
  18012.  
  18013. copy: oldFileNameString to: newFileNameString
  18014.     "Copy the file specified by oldFileNameString to newFileNameString.
  18015.     Signal a HostSystemError if the copy fails."
  18016.  
  18017.     (KernelLibrary default copyFile: oldFileNameString lpNewFileName: newFileNameString bfailIfExists: false)
  18018.         ifFalse: [KernelLibrary default systemError: Processor activeProcess lastError]!
  18019.  
  18020. createDirectory: path
  18021.     "Create a directory with the specified path.
  18022.     Answer whether the directory was actually created, or already existed.
  18023.     Raise a Win32Error if the call fails for any other reason than that the
  18024.     directory already exists."
  18025.  
  18026.     | kernel |
  18027.     kernel := KernelLibrary default. 
  18028.     ^(kernel createDirectory: path lpSecurityAttributes: nil)
  18029.         or: [ | err |
  18030.             err := kernel getLastError.
  18031.             err = ERROR_ALREADY_EXISTS
  18032.                 ifFalse: [^kernel systemError: err].
  18033.             false "already existed"]!
  18034.  
  18035. createDirectoryPath: path
  18036.     "Create a directory tree with the specified path - i.e. this will create a nested set of directories
  18037.     to any depth. Answer true if the final directory     was actually created, or false if it already existed. 
  18038.     Raise a Win32Error if the call fails for any other reason than that the directory already exists.
  18039.     Implementation Note: This may attempt more directory creation operations than are necessary,
  18040.     (e.g. to create the root directory if a drive is specified) but such requests are ignored."
  18041.  
  18042.     | delims pos created len part |
  18043.     created := false.
  18044.     len := path size.
  18045.     delims := self pathDelimiters.
  18046.     (path beginsWith: '\\') 
  18047.         ifTrue: 
  18048.             [pos := 3.
  18049.             2 timesRepeat: 
  18050.                     ["Skip UNC machine name and share"
  18051.  
  18052.                     pos := path indexOfAnyOf: delims startingAt: pos.
  18053.                     pos == 0 ifTrue: [^Win32Error signalWith: ERROR_INVALID_NAME].
  18054.                     pos := pos + 1]]
  18055.         ifFalse: [pos := 1].
  18056.     [pos <= len] whileTrue: 
  18057.             [| end |
  18058.             end := path indexOfAnyOf: delims startingAt: pos.
  18059.             end == 0 ifTrue: [end := len + 1].
  18060.             end == 1 
  18061.                 ifFalse: 
  18062.                     [(part := path copyFrom: 1 to: end - 1) last == $: 
  18063.                         ifFalse: 
  18064.                             ["Don't attempt to create the drive!!"
  18065.  
  18066.                             created := self createDirectory: part]].
  18067.             pos := end + 1].
  18068.     ^created!
  18069.  
  18070. default: aPathnameString extension: anExtensionString
  18071.      "Defaults the extension of aPathnameString to anExtensionString if there is no current extension.
  18072.     Answers the new filename"
  18073.  
  18074.     | components |
  18075.     components := self splitPath: aPathnameString.
  18076.     components last isEmpty ifTrue: [components at: 4 put: anExtensionString].
  18077.     ^self makePath: components!
  18078.  
  18079. delete: aFileNameString
  18080.     "Deletes the file whose name is specified by aFileNameString.
  18081.     Signal a Win32Error if the operation fails."
  18082.  
  18083.     (KernelLibrary default deleteFile: aFileNameString) 
  18084.         ifFalse: [KernelLibrary default systemError]!
  18085.  
  18086. deleteDirectory: aString
  18087.     "Recursively delete all files and folders within the specified directory, and
  18088.     remove the directory itself."
  18089.  
  18090.     self 
  18091.         forAll: '*.*'
  18092.         in: aString
  18093.         do: 
  18094.             [:each | 
  18095.             each isDirectory 
  18096.                 ifTrue: 
  18097.                     [| filename |
  18098.                     filename := each fileName.
  18099.                     (filename = '.' or: [filename = '..']) 
  18100.                         ifFalse: [self deleteDirectory: each path]]
  18101.                 ifFalse: [self delete: each path]].
  18102.     ^self removeDirectory: aString!
  18103.  
  18104. exists: aFileNameString
  18105.     "Answer true if there is a file whose specification is given by aFileName."
  18106.  
  18107.     ^(self attributes: aFileNameString) ~= -1!
  18108.  
  18109. extensionDelimiter
  18110.     "Answers the character that delimits a filename from its extension"
  18111.  
  18112.     ^ $.!
  18113.  
  18114. find: fileSpec
  18115.     "Answer a collection of WIN32_FIND_DATA structs for each file matching the 
  18116.     wildcarded path string, fileSpec. e.g:
  18117.  
  18118.         | list |
  18119.         list := ListPresenter show.
  18120.         list list: ((File find: '*.*') collect: [:s | s fileName])
  18121.     "
  18122.  
  18123.     | answer |
  18124.     answer := OrderedCollection new.
  18125.     self for: fileSpec do: [:s | answer add: s copy].
  18126.     ^answer!
  18127.  
  18128. for: aString do: operation
  18129.     "For each file/directory matching the wildcarded path string argument, aString, 
  18130.     evaluate the monadic valuable, operation, with a WIN32_FIND_DATA describing 
  18131.     the file/directory as the argument."
  18132.  
  18133.     ^self 
  18134.         for: aString
  18135.         in: (File splitPathFrom: aString)
  18136.         do: operation!
  18137.  
  18138. for: matchString in: dirString do: operation 
  18139.     "For each file/directory matching the wildcarded string argument, matchString, 
  18140.     in the directory named, dirString, evaluate the monadic valuable, operation, with 
  18141.     a WIN32_FIND_DATA describing the file/directory as the argument."
  18142.  
  18143.     | lib handle findStruct |
  18144.     lib := KernelLibrary default.
  18145.     findStruct := WIN32_FIND_DATA new.
  18146.     findStruct directory: dirString.
  18147.     handle := lib findFirstFile: (File composePath: dirString subPath: matchString)
  18148.                 lpFindFileData: findStruct.
  18149.     handle = INVALID_HANDLE_VALUE 
  18150.         ifTrue: 
  18151.             [| err |
  18152.             err := lib getLastError.
  18153.             ^(err == ERROR_FILE_NOT_FOUND or: [err == 5"ERROR_ACCESS_DENIED"]) 
  18154.                 ifTrue: [self]
  18155.                 ifFalse: [lib systemError: err]].
  18156.     
  18157.     [| error |
  18158.     
  18159.     [operation value: findStruct.
  18160.     lib findNextFile: handle lpFindFileData: findStruct] 
  18161.             whileTrue.
  18162.     error := lib getLastError.
  18163.     error = ERROR_NO_MORE_FILES ifFalse: [^lib systemError: error]] 
  18164.             ensure: [lib findClose: handle]!
  18165.  
  18166. for: matchString inAndBelow: dirString do: operation
  18167.     #deprecated.    "Use #forAll:in:do:"
  18168.     ^self 
  18169.         forAll: matchString
  18170.         in: dirString
  18171.         do: [:each | operation value: each directory value: each]!
  18172.  
  18173. forAll: matchString in: dirString do: operation
  18174.     "For each file or directory matching the wildcarded path string, fileSpec, 
  18175.     in and below the directory identified by the <readableString>, dir, evaluate 
  18176.     the <monadicValuable>, operation, with a WIN32_FIND_DATA describing 
  18177.     the file/directory as the argument."
  18178.  
  18179.     self 
  18180.         for: matchString
  18181.         in: dirString
  18182.         do: [:each | operation value: each].
  18183.     self forDirectoriesIn: dirString
  18184.         do: 
  18185.             [:each | 
  18186.             self 
  18187.                 forAll: matchString
  18188.                 in: each path
  18189.                 do: operation]!
  18190.  
  18191. forAllDirectories: matchString in: pathString do: operation 
  18192.     "For each directory whose name matches the wildcarded <readableString> argument,
  18193.     matchString, in the directory identified by the <readableString> argument, pathString,
  18194.     (and recursively below that), evaluate the monadic valuable, operation, with a 
  18195.     WIN32_FIND_DATA describing the directory as the argument."
  18196.  
  18197.     "Implementation Note: The tree traversal is pre-order, depth-first."
  18198.  
  18199.     self 
  18200.         forDirectories: matchString
  18201.         in: pathString
  18202.         do: 
  18203.             [:each | 
  18204.             operation value: each.
  18205.             self 
  18206.                 forAllDirectories: matchString
  18207.                 in: each path
  18208.                 do: operation]!
  18209.  
  18210. forAllDirectoriesIn: aString do: operation
  18211.     "For each directory in the directory identified by the <readableString> argument,
  18212.     and recursively below that, evaluate the monadic valuable, operation, with a 
  18213.     WIN32_FIND_DATA describing the directory as the argument.
  18214.     Implementation Note: The tree traversal is pre-order, depth-first."
  18215.  
  18216.     ^self 
  18217.         forAllDirectories: '*.*'
  18218.         in: aString
  18219.         do: operation!
  18220.  
  18221. forDirectories: matchString in: dirString do: operation
  18222.     "For each directory in the directory identified by the <readableString> argument, 
  18223.     dir, evaluate the monadic valuable, operation, with a WIN32_FIND_DATA describing the 
  18224.     directory as the argument."
  18225.  
  18226.     self 
  18227.         for: matchString
  18228.         in: dirString
  18229.         do: 
  18230.             [:each | 
  18231.             (each isDirectory and: 
  18232.                     [| fileName |
  18233.                     fileName := each fileName.
  18234.                     fileName ~= '.' and: [fileName ~= '..']]) 
  18235.                 ifTrue: [operation value: each]]!
  18236.  
  18237. forDirectoriesIn: aString do: operation
  18238.     "For each directory in the directory identified by the <readableString> argument 
  18239.     evaluate the monadic valuable, operation, with a WIN32_FIND_DATA describing the 
  18240.     directory as the argument."
  18241.  
  18242.     ^self 
  18243.         forDirectories: '*.*'
  18244.         in: aString
  18245.         do: operation!
  18246.  
  18247. fromHandle: aHandle
  18248.     "Answer a new instance of the receiver on the specified file handle.
  18249.     The instance will not automatically close the handle before it is GC'd (it assumes
  18250.     it does not own it)."
  18251.  
  18252.     ^super new
  18253.         handle: aHandle asExternalHandle;
  18254.         flags: ##(GENERIC_READ | GENERIC_WRITE);
  18255.         yourself!
  18256.  
  18257. fullPathOf: aPathnameString
  18258.     "Answers the full path of aPathnameString"
  18259.  
  18260.     | fullpath |
  18261.     fullpath := String new: self maxPath.
  18262.     ((KernelLibrary default getFullPathName: aPathnameString 
  18263.         nBufferLength: fullpath size lpBuffer: fullpath lpFilePart: nil)==0) ifTrue: [
  18264.             KernelLibrary default systemError].
  18265.     ^fullpath trimNulls!
  18266.  
  18267. fullPathOf: aPathnameString relativeTo: aBasePathString
  18268.     "Answers the full path of aPathnameString. If this is a truly relative
  18269.     path then it is formed as relative to aBasePathString"
  18270.  
  18271.     | actualPath |
  18272.     actualPath := (self isRelativePath: aPathnameString) 
  18273.         ifTrue: [self composePath: aBasePathString subPath: aPathnameString]
  18274.         ifFalse: [aPathnameString].
  18275.     ^self fullPathOf: actualPath
  18276. !
  18277.  
  18278. icon
  18279.     "Answers an Icon that can be used to represent this class. "
  18280.  
  18281.     ^Icon fromId: 2 in: ShellLibrary default!
  18282.  
  18283. initialize
  18284.     "Initialize the Class Variables of the receiver:
  18285.         File initialize
  18286.  
  18287.         OpenFlagsMask        Mask to extract the open mode flags.
  18288.         ShareModes        Map between portable share mode symbols and Win32 flag values.
  18289.         CheckModes         Map between portable access mode symbols and Win32 flag values 
  18290.                         with error checking.
  18291.         NoCheckModes        Ditto, without error checking."
  18292.  
  18293.     OpenFlagsMask := 2r111.
  18294.     ShareModes := ##(
  18295.         IdentityDictionary new
  18296.             at: #read            put: FILE_SHARE_READ;
  18297.             at: #write        put: FILE_SHARE_WRITE;
  18298.             at: #readWrite        put: FILE_SHARE_READ | FILE_SHARE_WRITE;
  18299.             at: #exclusive        put: 0;
  18300.             shrink;
  18301.             yourself).
  18302.     
  18303.     CheckModes := ##(
  18304.         IdentityDictionary new
  18305.             at: #read            put: OPEN_EXISTING | GENERIC_READ;
  18306.             at: #create        put: CREATE_NEW | GENERIC_READ | GENERIC_WRITE;
  18307.             "open will only ever open an existing file"
  18308.             at: #open            put: OPEN_EXISTING | GENERIC_READ | GENERIC_WRITE;
  18309.             at: #append        put: OPEN_EXISTING | GENERIC_READ | GENERIC_WRITE;
  18310.             at: #truncate        put: TRUNCATE_EXISTING | GENERIC_READ | GENERIC_WRITE;
  18311.             shrink;
  18312.             yourself).
  18313.  
  18314.     NoCheckModes := ##(
  18315.         IdentityDictionary new
  18316.             "No check read is a bit of a nonsense, but ..."
  18317.             at: #read            put: OPEN_ALWAYS | GENERIC_READ;
  18318.             at: #create        put: OPEN_ALWAYS | GENERIC_READ | GENERIC_WRITE;
  18319.             at: #open            put: OPEN_ALWAYS | GENERIC_READ | GENERIC_WRITE;
  18320.             at: #append        put: OPEN_ALWAYS | GENERIC_READ | GENERIC_WRITE;
  18321.             at: #truncate        put: CREATE_ALWAYS | GENERIC_READ | GENERIC_WRITE;
  18322.             shrink;
  18323.             yourself)!
  18324.  
  18325. isDirectory: aString
  18326.     "Answer true if there is a directory whose path is given by aString."
  18327.  
  18328.     | attribs |
  18329.     attribs := self attributes: aString.
  18330.     ^attribs ~= -1 and: [attribs allMask: FILE_ATTRIBUTE_DIRECTORY]!
  18331.  
  18332. isRelativePath: aFileNameString
  18333.     "Answers true if aFileNameString is a relative path with no absolute components"
  18334.  
  18335.     ^ShlwapiLibrary default pathIsRelative: aFileNameString
  18336. !
  18337.  
  18338. isRootPath: aString
  18339.     "Answer whether the <String> argument is a root path, e.g. 'c:\'"
  18340.  
  18341.     ^ShlwapiLibrary default pathIsRoot: aString!
  18342.  
  18343. isWriteable: aFileNameString
  18344.     "Answer true if aFileNameString speciifes a writeable file."
  18345.  
  18346.     | attributes |
  18347.     attributes :=  KernelLibrary default getFileAttributes: aFileNameString.
  18348.     ^(attributes ~= -1 and: [attributes allMask: FILE_ATTRIBUTE_READONLY]) not!
  18349.  
  18350. isWriteable: aFileNameString set: aBoolean
  18351.     "Set the writeable state of aFileNameString to aBoolean. Answers true if the
  18352.     operation succeeds"
  18353.  
  18354.     | mode |
  18355.     mode := aBoolean ifTrue: [ _S_IWRITE ] ifFalse: [ _S_IREAD ].
  18356.     ^(CRTLibrary default _chmod: aFileNameString pmode: mode)=0!
  18357.  
  18358. locateFilename: aFilenameString in: searchPath
  18359.     "Answers the full pathname of aFilenameString searched for in the ordered collection
  18360.     of paths provided in searchPath. If aFilenameString includes a directory then it is
  18361.     answered. Otherwise the file is searched for in the directories in searchPath. If the
  18362.     file is not found in any of these directories then aFilenameString is answered"
  18363.  
  18364.     | path fullpath |
  18365.     (self splitPathFrom: aFilenameString) isEmpty ifTrue: [
  18366.         searchPath do: [:each | 
  18367.             fullpath := self composePath: each subPath: aFilenameString.
  18368.             (self exists: fullpath) ifTrue: [ ^fullpath ]]].
  18369.     ^aFilenameString.!
  18370.  
  18371. makePath: anArray
  18372.     "Private - Composes a full pathname from its path, stem and extension components.
  18373.     The path and extension components can be nil or the empty string if the path
  18374.     does not have either of these components. The stem must be a non-empty String."
  18375.  
  18376.     | path |
  18377.     path := self pathBuffer.
  18378.     CRTLibrary default 
  18379.         _makepath: path 
  18380.             drive: (anArray at: 1) 
  18381.             dir: (anArray at: 2) 
  18382.             fname: (anArray at: 3) 
  18383.             ext: (anArray at: 4).
  18384.     ^path trimNulls!
  18385.  
  18386. maxPath
  18387.     "Answers the maximum number of characters in a file pathname"
  18388.  
  18389.     ^_MAX_PATH!
  18390.  
  18391. new
  18392.     "Answer a new initialized instance of the receiver."
  18393.  
  18394.     ^super new initialize!
  18395.  
  18396. open: aString
  18397.     "Open the file described by aString for exclusive read/write access.
  18398.     Answer the the new instance or signal a FileException if the operation fails."
  18399.  
  18400.     ^self open: aString mode: #open!
  18401.  
  18402. open: aString mode: aSymbol
  18403.     "Open a file for read/write access with exclusive access. The mode symbol, aSymbol, 
  18404.     determines what file opening mode to use when opening the file. Errors will
  18405.     be reported if an attempt is made to open a file which does not or does
  18406.     not exist, depending on the access mode (see open:mode:check:share:
  18407.     for the rules)."
  18408.  
  18409.     ^self open: aString mode: aSymbol check: true!
  18410.  
  18411. open: aString mode: aSymbol check: aBoolean
  18412.     "Open a file for read/write access with exclusive access. The mode symbol, aSymbol, 
  18413.     determines what file opening mode to use when opening the file. The check flag, aBoolean,
  18414.     determines whether or not errors are reported (see open:mode:check:share:
  18415.     for the rules).
  18416.     This method provides for ANSI (Posix) style file opening and is potentially
  18417.     more portable than those methods which require Win32 flags."
  18418.  
  18419.     ^self open: aString mode: aSymbol check: aBoolean share: #exclusive!
  18420.  
  18421. open: aString mode: modeSymbol check: aBoolean share: shareSymbol
  18422.     "Open a file for read/write access. The mode symbol, modeSymbol, determines
  18423.     what file opening mode to use when opening the file. The check flag, aBoolean,
  18424.     determines whether or not errors are reported. See instance method for
  18425.     further details."
  18426.  
  18427.     ^self new open: aString mode: modeSymbol check: aBoolean share: shareSymbol!
  18428.  
  18429. path: aPathnameString extension: anExtensionString
  18430.      "Answer a full pathname with the specified extension, whether or not aPathnameString already
  18431.     has an extension."
  18432.  
  18433.     | components |
  18434.     components := self splitPath: aPathnameString.
  18435.     components at: 4 put: anExtensionString.
  18436.     ^self makePath: components!
  18437.  
  18438. pathBuffer
  18439.     "Answer a buffer of sufficient size to contain a full path."
  18440.  
  18441.     ^String new: self maxPath!
  18442.  
  18443. pathDelimiter
  18444.     "Answers the character that delimits a path (or parts thereof)"
  18445.  
  18446.     ^ $\!
  18447.  
  18448. pathDelimiters
  18449.     "Answers the characters that can be used to delimits a path (or parts thereof).    
  18450.     Windows tends to accept the Unix delimiter, a forward slash, as well as its own
  18451.     back slash."
  18452.  
  18453.     ^'/\'!
  18454.  
  18455. relativePathOf: aPathString to: aBasePathString 
  18456.     "Answers the relative path of aPathString relative to aBasePathString.
  18457.     Note that if the last component of aBasePathString is to be considered a directory
  18458.     then there must be a trailing slash, otherwise the last component is ignored (it is
  18459.     treated as if it were a file name)."
  18460.  
  18461.     | relPath |
  18462.     relPath := self pathBuffer.
  18463.     relPath := (ShlwapiLibrary default 
  18464.         pathRelativePathTo: relPath
  18465.         pszFrom: aBasePathString
  18466.         dwAttrFrom: 0
  18467.         pszTo: aPathString
  18468.         dwAttrTo: 0) 
  18469.             ifTrue: 
  18470.                 [relPath trimNulls]
  18471.             ifFalse: [aPathString].
  18472.     ^(relPath beginsWith: '.\') ifTrue: [relPath allButFirst: 2] ifFalse: [relPath]!
  18473.  
  18474. removeDirectory: aString
  18475.     (KernelLibrary default removeDirectory: aString) 
  18476.         ifFalse: [KernelLibrary default systemError]!
  18477.  
  18478. removeExtension: aPathnameString
  18479.     "Answer a String which is fileName with the extension component removed."
  18480.  
  18481.     ^self makePath: ((self splitPath: aPathnameString) at: 4 put: nil; yourself)!
  18482.  
  18483. removePathDelimiter: aString
  18484.     "Answer a <readableString> that is the argument with a path separator at its end, if any, removed."
  18485.  
  18486.     ^(aString notEmpty 
  18487.         and: [self pathDelimiters identityIncludes: aString last]) 
  18488.             ifTrue: [aString allButLast]
  18489.             ifFalse: [aString]!
  18490.  
  18491. rename: oldFileNameString to: newFileNameString
  18492.     "Rename the file specified in oldFileNameString to newFileNameString.
  18493.     Signal a HostSystemError if the operation fails."
  18494.  
  18495.     (KernelLibrary default moveFile: oldFileNameString lpNewFileName: newFileNameString)
  18496.         ifFalse: [ KernelLibrary default systemError ]!
  18497.  
  18498. replacePath: filePath with: newPath
  18499.     "Replace the path component of the full path name, filePath, with the new path name,
  18500.     newPath, i.e. only the stem and extension remain intact."
  18501.  
  18502.     | oldPathComponents |
  18503.     oldPathComponents := self splitPath: filePath.
  18504.     oldPathComponents 
  18505.         at: 1 put: nil;            "new path can include drive letter"
  18506.         at: 2 put: newPath.
  18507.     ^self makePath: oldPathComponents!
  18508.  
  18509. shortPathOf: aPathnameString
  18510.     "Answers the short path version of aPathnameString"
  18511.  
  18512.     | shortpath |
  18513.     shortpath := String new: self maxPath.
  18514.     ((KernelLibrary default getShortPathName: aPathnameString 
  18515.         lpszShortPath: shortpath cchBuffer: shortpath size)==0) ifTrue: [
  18516.             KernelLibrary default systemError].
  18517.     ^shortpath trimNulls!
  18518.  
  18519. splitExtensionFrom: aString
  18520.     "Splits aPathname string and answers the extension portion.
  18521.     Answers the empty string if there is no extension."
  18522.  
  18523.     ^(self splitPath: aString) at: 4
  18524. !
  18525.  
  18526. splitFilenameFrom: aString
  18527.     "Splits aPathname string and answers the file name portion (including extension). Answers an
  18528.     empty string if there is no file stem."
  18529.  
  18530.     | splits |
  18531.     splits := self splitPath: aString.
  18532.     splits
  18533.         at: 1 put: nil;
  18534.         at: 2 put: nil.
  18535.     ^self makePath: splits!
  18536.  
  18537. splitPath: aString
  18538.     "Splits aPathname string into its path, stem and extension components and answers 
  18539.     a four element Array of these.
  18540.     Note: We use the C-runtime library to implement this, hence either backward or forward
  18541.     slashes (i.e. $\ or $/) are acceptable as pathname delimiters."
  18542.  
  18543.     | drive dir fname ext splits |
  18544.  
  18545.     "Prevent GPF for common error case of nil argument"
  18546.     aString isNil ifTrue: [^self error: 'nil path'].
  18547.  
  18548.     drive := String new: _MAX_DRIVE.
  18549.     dir := String new: _MAX_DIR.
  18550.     fname := String new: _MAX_FNAME.
  18551.     ext := String new: _MAX_EXT.    "may be more than 3 chars now"
  18552.  
  18553.     CRTLibrary default _splitpath: aString drive: drive dir: dir fname: fname ext: ext.
  18554.     "CRT function includes leading period on extension, which we don't"
  18555.     ext := ext trimNulls.
  18556.     (ext notEmpty and: [ext first == $.])
  18557.         ifTrue: [ext := ext copyFrom: 2].
  18558.     ^Array 
  18559.         with: drive trimNulls
  18560.         with: dir trimNulls
  18561.         with: fname trimNulls
  18562.         with: ext!
  18563.  
  18564. splitPathFrom: aPathnameString
  18565.     "Splits aPathname string and answers the path portion (including the drive letter, if any).
  18566.     Answers an  empty <String> if there is no path.
  18567.     Implementation Note: We use the CRT library _splitpath() function because the Win32
  18568.     API call, PathRemoveFileSpec() does not treat $/ as a path delimiter (only backslash)."
  18569.  
  18570.     | drive dir |
  18571.     "Passing a null pointer to _splitpath() will cause an unfriendly GPF"
  18572.     aPathnameString isNil ifTrue: [self error: 'nil path'].
  18573.     drive := String new: _MAX_DRIVE.
  18574.     dir := String new: _MAX_DIR.
  18575.     CRTLibrary default 
  18576.         _splitpath: aPathnameString
  18577.         drive: drive
  18578.         dir: dir
  18579.         fname: nil
  18580.         ext: nil.
  18581.     ^drive trimNulls , dir trimNulls!
  18582.  
  18583. splitStemFrom: aPathnameString
  18584.     "Splits aPathname string and answers the stem portion. Answers nil if there is none"
  18585.  
  18586.     ^(self splitPath: aPathnameString) at: 3!
  18587.  
  18588. temporary
  18589.     "Open a temporary file with a unique name generated by the system, for
  18590.     exclusive read/write access."
  18591.  
  18592.     ^self open: self temporaryFilename!
  18593.  
  18594. temporaryFilename
  18595.     "Answer a temporary filename in the current directory"
  18596.     
  18597.     ^self temporaryFilenameWithPrefix: ''
  18598.     !
  18599.  
  18600. temporaryFilenameWithPrefix: prefixString
  18601.     "Answer a temporary filename built from prefixString in the host systems
  18602.     temporary files directory. Signal a Win32Error if the operation fails."
  18603.  
  18604.     | returnBuf |
  18605.     returnBuf := self pathBuffer.
  18606.     (KernelLibrary default
  18607.         getTempFileName: self tempPath
  18608.         lpPrefixString: prefixString
  18609.         uUnique: 0
  18610.         lpTempFileName: returnBuf) == 0
  18611.             ifTrue: [KernelLibrary default systemError].
  18612.     ^returnBuf trimNulls
  18613.     !
  18614.  
  18615. tempPath
  18616.     "Answer the path of the directory designated for temporary files on the host system."
  18617.  
  18618.     | buf len |
  18619.     buf := self pathBuffer.
  18620.     len := KernelLibrary default getTempPath: buf size lpBuffer: buf.
  18621.     ^buf resize: len!
  18622.  
  18623. titleOf: aString
  18624.     "Answer the 'title' (i.e. the display name) of a file with the specified path name.
  18625.     The file title may or may not include the extension, depending on the users
  18626.     configuration."
  18627.  
  18628.     | buf lib |
  18629.     buf := File pathBuffer.
  18630.     lib := ComDlgLibrary default.
  18631.     (lib getFileTitle: aString lpszTitle: buf cbBuf: buf size) < 0
  18632.         ifTrue: [lib systemError: 123].
  18633.     ^buf trimNulls!
  18634.  
  18635. workingDirectory
  18636.     "Answer the current working directory."
  18637.  
  18638.     | buffer dir |
  18639.     buffer := self pathBuffer.
  18640.     dir := CRTLibrary default _getcwd: buffer maxlen: buffer size.
  18641.     ^dir last = $\
  18642.         ifTrue: [dir]
  18643.         ifFalse: [dir copyWith: $\]! !
  18644.  
  18645. !File methodsFor!
  18646.  
  18647. accessFlags
  18648.     "Private - Answer the Win32 access mode flags."
  18649.  
  18650.     ^flags bitAnd: OpenFlagsMask bitInvert
  18651. !
  18652.  
  18653. asParameter
  18654.     "Answer the external representation of the receiver."
  18655.  
  18656.     ^handle!
  18657.  
  18658. atEnd
  18659.     "Answer a Boolean indicating whether we are at the file's end
  18660.     or signal a FileException if the operation fails."
  18661.  
  18662.     ^self position = (self size - 1)
  18663. !
  18664.  
  18665. basicFree
  18666.     "Private - Close the file and nil the handle.
  18667.     Signal a FileException if the operation fails."
  18668.  
  18669.     | fh |
  18670.     fh := handle.
  18671.     self handle: nil.
  18672.     (KernelLibrary default closeHandle: fh) ifFalse: [self signalOsError: false]!
  18673.  
  18674. checkBoundsOf: aStringOrByteArray startingAt: startIndex for: bytesToTransferInteger
  18675.     "Private - Signal a FileException if the bounds of the transfer are out of range."
  18676.  
  18677.     bytesToTransferInteger == 0 ifFalse: [
  18678.         (startIndex < 1 or: [startIndex > aStringOrByteArray basicSize])
  18679.             ifTrue: [self error: 'Invalid array index'].
  18680.         startIndex + bytesToTransferInteger - 1 > aStringOrByteArray basicSize
  18681.             ifTrue: [self error: 'Buffer too small']]!
  18682.  
  18683. close
  18684.     "Close the file. The file can be reopened (depending on the access mode).
  18685.     Signal a FileException if an error occurs."
  18686.  
  18687.     self free; beUnfinalizable!
  18688.  
  18689. creationTime
  18690.     "Answer a <FILETIME> identifying the point in time at which some data was
  18691.     last written to the file associated with the receiver."
  18692.  
  18693.     | answer |
  18694.     answer := FILETIME new.
  18695.     self 
  18696.         getTimes: answer
  18697.         atime: nil
  18698.         mtime: nil.
  18699.     ^answer!
  18700.  
  18701. delete
  18702.     "Private - Close the receiver and delete the associated file.
  18703.     Useful for finishing with temporary files."
  18704.  
  18705.     self free.
  18706.     self class delete: spec!
  18707.  
  18708. finalize
  18709.     "Private - Sent when the object no longer has any strong references to it.
  18710.     Frees the external resources held by the object."
  18711.  
  18712.     self free!
  18713.  
  18714. flags: anInteger
  18715.     "Private - Save away the Win32 access and open flags."
  18716.  
  18717.     flags := anInteger!
  18718.  
  18719. flush
  18720.     "Force write modifications to disk (where possible).
  18721.     Signal a FileException if the operation fails."
  18722.  
  18723.     (KernelLibrary default flushFileBuffers: handle) ifFalse: [self signalOsError: false]!
  18724.  
  18725. free
  18726.     "Private - Close the file if it is not already closed.
  18727.     Signal a FileException if the operation fails."
  18728.  
  18729.     handle notNull
  18730.         ifTrue: [self basicFree]!
  18731.  
  18732. getTimes: ctime atime: atime mtime: mtime
  18733.     "Private - Get the receiver's time of creation, last access, and last modification, 
  18734.     all answered through the FILETIME arguments (which are treated as value holders
  18735.     and updated directly)."
  18736.  
  18737.     (KernelLibrary default getFileTime: self asParameter
  18738.         lpCreationTime: ctime
  18739.         lpLastAccessTime: atime
  18740.         lpLastWriteTime: mtime) ifFalse: [KernelLibrary default systemError]!
  18741.  
  18742. handle
  18743.     "Answer the file handle."
  18744.  
  18745.     ^handle!
  18746.  
  18747. handle: aHandle
  18748.     "Private - Set the handle inst var to aHandle."
  18749.  
  18750.     handle := aHandle!
  18751.  
  18752. initialize
  18753.     "Private - Instance initialization. Answer the receiver."
  18754.  
  18755.     self flags: 0!
  18756.  
  18757. isReadable
  18758.     "Answer true if the file is readable."
  18759.  
  18760.     ^flags anyMask: GENERIC_READ!
  18761.  
  18762. isWriteable
  18763.     "Answer whether the receiver can be written to."
  18764.  
  18765.     ^flags anyMask: GENERIC_WRITE!
  18766.  
  18767. lastAccessTime
  18768.     "Answer a <FILETIME> identifying the point in time at which some data was
  18769.     last written to the file associated with the receiver."
  18770.  
  18771.     | answer |
  18772.     answer := FILETIME new.
  18773.     self 
  18774.         getTimes: nil
  18775.         atime: answer
  18776.         mtime: nil.
  18777.     ^answer!
  18778.  
  18779. lastWriteTime
  18780.     "Answer a <FILETIME> identifying the point in time at which some data was
  18781.     last written to the file associated with the receiver."
  18782.  
  18783.     | answer |
  18784.     answer := FILETIME new.
  18785.     self 
  18786.         getTimes: nil
  18787.         atime: nil
  18788.         mtime: answer.
  18789.     ^answer!
  18790.  
  18791. name
  18792.     "Answer the receiver's filename."
  18793.  
  18794.     ^spec
  18795. !
  18796.  
  18797. open
  18798.     "Open, or reopen, the file described by the receiver with the receiver's
  18799.     access and sharing modes.
  18800.      If the operation fails then a resumable FileException is signalled. If
  18801.     the exception is handled and resumed, then a further attempt is made
  18802.     to open the file. This allows for easy implementation of '    retry' style
  18803.     functionality."
  18804.  
  18805.     | fh |
  18806.     
  18807.     [fh := KernelLibrary default 
  18808.                 createFile: spec
  18809.                 dwDesiredAccess: self accessFlags
  18810.                 dwSharedMode: shareFlags
  18811.                 lpSecurityAttributes: self securityAttributes
  18812.                 dwCreationDistribution: self openFlags
  18813.                 dwFlagsAndAttributes: FILE_ATTRIBUTE_NORMAL
  18814.                 hTemplateFile: nil.
  18815.     fh asSignedInteger == -1] 
  18816.             whileTrue: [self signalOsError: true].
  18817.     self handle: fh.
  18818.     self beFinalizable!
  18819.  
  18820. open: aStringFileName flags: flagsInteger share: shareFlagsInteger
  18821.     "Private - Open the file described by aString using the specified
  18822.     Win32 access and open flags (bitOr'd together), and share flags"
  18823.     
  18824.     self
  18825.         free;
  18826.         spec: aStringFileName;
  18827.         flags: flagsInteger;
  18828.         shareFlags: shareFlagsInteger;
  18829.         open!
  18830.  
  18831. open: aString mode: modeSymbol check: aBoolean share: shareSymbol
  18832.     "Open a file for read/write access. The mode symbol, modeSymbol, determines
  18833.     what file opening mode to use when opening the file. modeSymbol can be one of
  18834.     the three ANSI (posix based) modes:
  18835.  
  18836.         #create    -     open an existing file, or create a new file, for read/write,
  18837.                     positioned at the beginning
  18838.         #append    -     open an existing file, or create a new file, for read/write
  18839.                     and position to the end
  18840.         #truncate    -    open an existing file truncating existing contents, or
  18841.                     create a new file, for read/write.
  18842.  
  18843.     Or one of two additional modes:
  18844.  
  18845.         #read    -    open an existing file, or create a new file, for read-only access
  18846.         #open    -    open an existing file, or create a new file, for read/write access
  18847.  
  18848.     Although some of these modes are similar, and are sometimes synonyms, there may be subtle
  18849.     differences depending on the value of the check flag. The check flag, aBoolean,
  18850.     determines whether or not errors are reported according to the following rules:
  18851.  
  18852.         If mode = #create and the file exists
  18853.             If check = true raise an error, else use the existing file
  18854.         If mode = #append and the file does not exist
  18855.             If check = true raise an error, else create a new file
  18856.         If mode = #truncate and the file does not exist
  18857.             If check = true raise an error, else create a new file
  18858.         If mode = #read and the file does not exist
  18859.             If check = true raise an error, else create a new file (for read only)
  18860.         If mode = #open and the file does not exist
  18861.             If check = true raise an error, else create a new file (for read/write)
  18862.  
  18863.     The shareSymbol can be one of:
  18864.         #exclusive
  18865.         #read
  18866.         #write
  18867.         #readWrite"
  18868.  
  18869.     self open: aString
  18870.             flags: ((aBoolean ifTrue: [CheckModes] ifFalse: [NoCheckModes]) at: modeSymbol)
  18871.             share: (ShareModes at: shareSymbol).
  18872.     modeSymbol == #append
  18873.         ifTrue: [self setToEnd]!
  18874.  
  18875. openFlags
  18876.     "Private - Answer the Win32 creation mode flags."
  18877.  
  18878.     ^flags bitAnd: OpenFlagsMask!
  18879.  
  18880. position
  18881.     "Answer the absolute Integer position of the reciver's file pointer
  18882.     or signal a FileException if the operation fails."
  18883.  
  18884.     ^self seek: 0 sense: FILE_CURRENT
  18885. !
  18886.  
  18887. position: offset
  18888.     "Move the receiver's file pointer to absolute <integer> position, offset, 
  18889.     which is a zero-based offset from the start of the file. 
  18890.     Answer the <integer> offset achieved or signal a FileException 
  18891.     if the operation fails."
  18892.  
  18893.     ^self seek: offset sense: FILE_BEGIN
  18894. !
  18895.  
  18896. printOn: aStream
  18897.     "Append the ASCII representation of the receiver to aStream."
  18898.  
  18899.     aStream
  18900.         basicPrint: self;
  18901.         nextPut: $(;
  18902.         print: spec; space;
  18903.         print: handle;
  18904.         nextPut: $)!
  18905.  
  18906. read: aByteObject
  18907.     "Read into aStringOrByteArray a maximum of aByteObject size bytes
  18908.     from the file.
  18909.     Answer the number of bytes or signal a FileException if the operation fails."
  18910.  
  18911.     ^self
  18912.         read: aByteObject
  18913.         count: aByteObject basicSize
  18914. !
  18915.  
  18916. read: anAddress count: bytesToReadInteger 
  18917.     "Read a maximum of bytesToReadInteger bytes into anAddress from the file.
  18918.  
  18919.     It is not an error to read zero bytes.
  18920.     Answer the number of bytes read or signal a FileException if the operaion fails."
  18921.  
  18922.     | bytesRead |
  18923.     bytesToReadInteger == 0 ifTrue: [^0].
  18924.     bytesRead := ByteArray newFixed: 4.
  18925.     ^(KernelLibrary default 
  18926.         readFile: handle
  18927.         lpBuffer: anAddress
  18928.         nNumberOfBytesToRead: bytesToReadInteger
  18929.         lpNumberOfBytesRead: bytesRead
  18930.         lpOverlapped: nil) 
  18931.             ifTrue: [bytesRead dwordAtOffset: 0]
  18932.             ifFalse: [self signalOsError: false]!
  18933.  
  18934. read: aStringOrByteArray startingAt: startIndex count: bytesToReadInteger
  18935.     "Read a maximum of bytesToReadInteger bytes from the file starting with aStringOrByteArray at: startIndex.
  18936.  
  18937.     It is not an error to read zero bytes.
  18938.     It is an error if aStringOrByteArray is shorter than startIndex + bytesToReadInteger - 1.
  18939.     Answer the number of bytes read or signal a FileException if the operaion fails."
  18940.  
  18941.     ^self
  18942.         checkBoundsOf: aStringOrByteArray
  18943.         startingAt: startIndex
  18944.         for: bytesToReadInteger;
  18945.  
  18946.         read: aStringOrByteArray yourAddress + startIndex - 1
  18947.         count: bytesToReadInteger.
  18948.  
  18949. !
  18950.  
  18951. readByte
  18952.     "Answer the Integer value of the next byte from the file or nil if the receiver
  18953.     is positioned past the current EOF.
  18954.     Signal a FileException if an error occurs."
  18955.  
  18956.     | buffer |
  18957.     buffer := ByteArray new: 1.
  18958.     ^(self read: buffer count: 1) == 0
  18959.         ifTrue: [nil]
  18960.         ifFalse: [buffer at: 1]
  18961.  
  18962. !
  18963.  
  18964. readCharacter
  18965.     "Answer the next Character from the file or nil if the receiver
  18966.     is positioned past the current EOF.
  18967.     Signal a FileException if an error occurs."
  18968.  
  18969.     | string |
  18970.     string := String new: 1.
  18971.     ^(self read: string count: 1) == 0
  18972.         ifTrue: [nil]
  18973.         ifFalse: [string at: 1]!
  18974.  
  18975. readWriteStream
  18976.     "Answer a FileStream on the receiver initially configured to read/write text."
  18977.  
  18978.     ^FileStream on: self!
  18979.  
  18980. reset
  18981.     "Move the receiver's file pointer to the begining of the file.
  18982.     Signal a FileException if the operation fails."
  18983.  
  18984.     self position: 0
  18985. !
  18986.  
  18987. securityAttributes
  18988.     "Answer the <SECURITY_ATTRIBUTES> to be used when opening the file,
  18989.     or nil if the default security attributes are to be used.
  18990.     N.B. Must be nil (or NULL) on Win9X machines as only supported on NT."
  18991.  
  18992.     ^nil!
  18993.  
  18994. seek: offsetInteger sense: senseFlag 
  18995.     "Move the receiver's file pointer to position anInteger
  18996.     relative to the postition indicated by senseFlag.
  18997.  
  18998.     senseFlag
  18999.         must be one of (FILE_BEGIN, FILE_CURRENT, FILE_END).
  19000.  
  19001.     Answer the absolute integer position achieved or
  19002.     signal a FileException if the operation fails."
  19003.  
  19004.     | result |
  19005.     result := KernelLibrary default 
  19006.                 setFilePointer: handle
  19007.                 lDistanceToMove: offsetInteger
  19008.                 lpDistanceToMoveHigh: nil
  19009.                 dwMoveMethod: senseFlag.
  19010.     ^16rFFFFFFFF = result ifFalse: [result] ifTrue: [self signalOsError: false]!
  19011.  
  19012. setToEnd
  19013.     "Move the receiver's file pointer to the end of the file.
  19014.     Answer the absolute integer position achieved or
  19015.     signal a FileException if the operation fails."
  19016.  
  19017.     ^self seek: 0 sense: FILE_END
  19018. !
  19019.  
  19020. shareFlags: anInteger
  19021.     "Private - Save away the Win32 sharing mode."
  19022.  
  19023.     shareFlags := anInteger!
  19024.  
  19025. signalOsError: aBoolean 
  19026.     "Private - Signal a FileException on this file with the current OS error.
  19027.     The <boolean> argument indicates whether the exception should be 
  19028.     resumable or not."
  19029.  
  19030.     ^FileException signalOn: self resumable: aBoolean!
  19031.  
  19032. size
  19033.     "Answer the size of the file in bytes or
  19034.     signal a FileException if the operation fails."
  19035.  
  19036.     | result |
  19037.     result := KernelLibrary default getFileSize: handle lpFileSizeHigh: nil.
  19038.     ^16rFFFFFFFF = result ifFalse: [result] ifTrue: [self signalOsError: false]!
  19039.  
  19040. size: anInteger 
  19041.     "Set the size of the file to the <integer> argument number of bytes
  19042.     (can be used to truncate or extend a file)."
  19043.  
  19044.     self position: anInteger.
  19045.     (KernelLibrary default setEndOfFile: handle) ifFalse: [self signalOsError: false]!
  19046.  
  19047. spec: aString
  19048.     "Private - Set the file path to the <readableString> argument."
  19049.  
  19050.     spec := aString!
  19051.  
  19052. title
  19053.     "Answer the receiver's 'title' (i.e. the display name)."
  19054.  
  19055.     ^self class titleOf: self name!
  19056.  
  19057. write: aStringOrByteArray
  19058.     "Write all of aStringOrByteArray to the file.
  19059.     Answer the number of bytes written or signal a FileException if the operation fails."
  19060.  
  19061.     ^self
  19062.         write: aStringOrByteArray
  19063.         count: aStringOrByteArray basicSize.!
  19064.  
  19065. write: aStringOrByteArrayOrAddress count: bytesToWriteInteger 
  19066.     "Write bytesToWriteInteger bytes from aStringOrByteArrayOrAddress to the file.
  19067.  
  19068.     It is not an error to write zero bytes.
  19069.     Answer the number of bytes written or signal a FileException if the operaion fails."
  19070.  
  19071.     | bytesWritten |
  19072.     bytesToWriteInteger == 0 ifTrue: [^0].
  19073.     bytesWritten := ByteArray newFixed: 4.
  19074.     ^(KernelLibrary default 
  19075.         writeFile: handle
  19076.         lpBuffer: aStringOrByteArrayOrAddress
  19077.         nNumberOfBytesToWrite: bytesToWriteInteger
  19078.         lpNumberOfBytesWritten: bytesWritten
  19079.         lpOverlapped: nil) 
  19080.             ifTrue: [bytesWritten dwordAtOffset: 0]
  19081.             ifFalse: [self signalOsError: false]!
  19082.  
  19083. write: aStringOrByteArray startingAt: startIndex count: bytesToWriteInteger
  19084.     "Write bytesToWriteInteger bytes to the file starting with aStringOrByteArray at: startIndex.
  19085.  
  19086.     It is not an error to write zero bytes.
  19087.     It is an error if aStringOrByteArray is shorter than startIndex + bytesToWriteInteger - 1.
  19088.     Answer the number of bytes written or signal a FileException if the operation fails."
  19089.  
  19090.     ^self
  19091.         checkBoundsOf: aStringOrByteArray
  19092.         startingAt: startIndex
  19093.         for: bytesToWriteInteger;
  19094.  
  19095.         write: (ExternalAddress fromInteger: aStringOrByteArray yourAddress + startIndex - 1)
  19096.         count: bytesToWriteInteger.
  19097. !
  19098.  
  19099. writeByte: anIntegerOrCharacter
  19100.     "Write the given byte to the file.
  19101.     Answer 1 or signal a FileException if the operation fails."
  19102.  
  19103.     ^self write: (ByteArray with: anIntegerOrCharacter asInteger) count: 1! !
  19104.  
  19105. FileLocator comment:
  19106. 'A FileLocator is an abstract root for a hierarchy of subclasses that implement the <fileLocator> protocol. 
  19107. A <fileLocator> is used map between an external resource pathname and an internal name. First an external name is mapped to an internal form using #relativePathTo:. The latter can be held in the image and later mapped back to it''s is full external name using #localFileSpecFor:.
  19108.  
  19109. Several singleton <fileLocator>s are supplied and can be referenced using the following class methods:
  19110.  
  19111. #imageRelative    - An instance of ImageRelativeFileLocator
  19112. #installRelative    - An instance of InstallRelativeFileLocator
  19113. #absolute        - An instance od AbsoluteFileLocator
  19114. #default        - Answers the #imageRelative locator
  19115.  
  19116. For example, say that you want to reference an Icon resource file that is held relative to your current image file (perhaps in the \Resources sudirectory). You want to do this in such a way that if you move your image then the \Resources directory will be expected to move with it.
  19117.  
  19118. icon := Icon fromFile: ''Resources\myIcon.ico'' usingLocator: FileLocator imageRelative.
  19119.  
  19120. Here, the path to the icon file will be held within the Icon instance in a form that is relative to the base location of the image directory. Icons also hold the file locator too and use this to map back to the full path of the icon file when it is necessary to load it. Hence if you move your image file, the Icon will still expect to be able to load the icon resource from a location that relative to the image directory.
  19121.  
  19122. Typically, this is the behaviour that you''ll want by default. At development time, resources are referenced relative to the image and, at runtime, relative to the executable file (which is effective an image, anyway). For this reason the above example could also have been written as:
  19123.  
  19124. icon := Icon fromFile: ''Resources\myIcon.ico'' usingLocator: FileLocator default
  19125. or
  19126. icon := Icon fromFile: ''Resources\myIcon.ico'' 
  19127.  
  19128. Sometimes, especially in the case of development tools, you might want a resource to be referenced relative to the Dolphin installation directory. In this case an InstallRelativeFileLocator would be moe appropriate. Take a look at DolphinSureCertificate>>image, for example. Note that, at runtime, the image location and installation location are treated as the same by a standard RuntimeSessionManager.
  19129.  
  19130. Class Variables:
  19131.     Absolute        <AbsoluteFileLocator> instance used for locating files by absolute directory.
  19132.     InstallRelative    <InstallRelativeFileLocator> instance used for locating files relative to the installation directory.
  19133.     ImageRelative    <ImageRelativeFileLocator> instance used for locating files relative to the image directory.
  19134.  
  19135. '!
  19136. !FileLocator class methodsFor!
  19137.  
  19138. absolute
  19139.     "Answers an instance of the receiver that can be used to locate external files
  19140.     with an absolute path."
  19141.  
  19142.     ^AbsoluteFileLocator current
  19143. !
  19144.  
  19145. default
  19146.     "Answers an instance of the receiver that can be used to locate external files
  19147.     relative to the current image directory."
  19148.  
  19149.     ^self imageRelative
  19150. !
  19151.  
  19152. imageRelative
  19153.     "Answers an instance of the receiver that can be used to locate external files
  19154.     relative to the current image  directory."
  19155.  
  19156.     ^ImageRelativeFileLocator current!
  19157.  
  19158. installRelative
  19159.     "Answers an instance of the receiver that can be used to locate external files
  19160.     relative to the current installation directory."
  19161.  
  19162.     ^InstallRelativeFileLocator current
  19163. ! !
  19164.  
  19165. !FileLocator methodsFor!
  19166.  
  19167. basePath
  19168.     ^SessionManager current imageBase!
  19169.  
  19170. findOrImportForeignClass
  19171.     "An attempt is being made by a ClassLocator to load a class when the dynamic loading capability is not installed.
  19172.     This is normally available as part of the Web Deployment Kit. Raise an error to the effect that the class cannot be found."
  19173.  
  19174.     self errorClassNotFound.
  19175.     
  19176. !
  19177.  
  19178. localFileSpecFor: aStringFilename
  19179.     "Answer a filespec for aStringFilename relative to the current image
  19180.     directory. This is the reverse operation to #relativePathTo:, and is performed
  19181.     when the file needs to be located."
  19182.  
  19183.     ^File fullPathOf: aStringFilename relativeTo: self basePath
  19184.  
  19185. !
  19186.  
  19187. relativePathIfSubPath: aFilename 
  19188.     "Private - Answer a minimal <readableString> relative path to the resource with the 
  19189.     specified <readableString> path, but only if a sub-path of the receiver's
  19190.     base path, otherwise answer the full absolute path."
  19191.  
  19192.     | relative |
  19193.     relative := self relativeToBase: aFilename.
  19194.     ^(relative beginsWith: '..') 
  19195.         ifTrue: [File fullPathOf: aFilename]
  19196.         ifFalse: [relative]!
  19197.  
  19198. relativePathTo: aString 
  19199.     "Answer a minimal <readableString> relative path to the resource with the 
  19200.     specified <readableString> path from the receiver's base path."
  19201.  
  19202.     ^self relativeToBase: aString!
  19203.  
  19204. relativeToBase: aFilename 
  19205.     ^File relativePathOf: aFilename to: self basePath! !
  19206.  
  19207. Folder comment:
  19208. ''!
  19209. !Folder class methodsFor!
  19210.  
  19211. icon
  19212.     "Answers an Icon that can be used to represent this class. "
  19213.  
  19214.     ^Icon fromId: 4 in: ShellLibrary default!
  19215.  
  19216. new
  19217.     "Private - Use #pathname:"
  19218.  
  19219.     self shouldNotImplement!
  19220.  
  19221. pathname: aString
  19222.     "Answers an intance of the receiver with the specified path.
  19223.     Note that if the path is not expected to include a file stem, and must include
  19224.     a terminating delimiter."
  19225.  
  19226.     ^super new pathname: aString!
  19227.  
  19228. root
  19229.     "Answer an instance of the receiver representing the current root folder."
  19230.  
  19231.     ^self pathname: ''! !
  19232.  
  19233. !Folder methodsFor!
  19234.  
  19235. <= comperand
  19236.     "Answer whether the receiver is less than or equal to the <PackageFolder>,
  19237.     comperand."
  19238.  
  19239.     ^self pathname asUppercase <= comperand pathname asUppercase!
  19240.  
  19241. = comperand
  19242.     "Answer whether the receiver is equivalent to argument, comperand."
  19243.  
  19244.     ^self species == comperand species and: [self pathname sameAs: comperand pathname]
  19245. !
  19246.  
  19247. displayOn: aStream 
  19248.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  19249.     would want to see it."
  19250.  
  19251.     aStream nextPutAll: self name!
  19252.  
  19253. folderName
  19254.     "Answer the folder name of the receiver"
  19255.  
  19256.     ^(File isRootPath: self pathname) 
  19257.         ifTrue: [self volumeName]
  19258.         ifFalse: [File composePath: self rootName subPath: self pathname]!
  19259.  
  19260. hash
  19261.     "Answer the <SmallInteger> hash value for the receiver"
  19262.  
  19263.     ^self pathname asLowercase hash!
  19264.  
  19265. name
  19266.     "Private - Answer the folder name of the receiver"
  19267.  
  19268.     ^self pathname isEmpty 
  19269.         ifTrue: [self rootName]
  19270.         ifFalse: 
  19271.             [(File isRootPath: self pathname) 
  19272.                 ifTrue: [self volumeName]
  19273.                 ifFalse: [File splitFilenameFrom: (File removePathDelimiter: self pathname)]]!
  19274.  
  19275. parent
  19276.     "Answer a <Folder> representing the receiver's parent, or nil if a root.
  19277.     Note that this will be a new object each time as currently implemented,
  19278.     but they will be equal."
  19279.  
  19280.     | path |
  19281.     ^(path := self pathname) isEmpty 
  19282.         ifFalse: [self class pathname: (File splitPathFrom: path allButLast)]!
  19283.  
  19284. pathname
  19285.     "Private - Answer the folder pathname of the receiver"
  19286.  
  19287.     ^pathname!
  19288.  
  19289. pathname: aStringName 
  19290.     "Private - Initialize the receiver"
  19291.  
  19292.     pathname := aStringName!
  19293.  
  19294. printOn: aStream
  19295.     "Append, to aStream, a String whose characters are a description of the receiver as a developer
  19296.     would want to see it."
  19297.  
  19298.     aStream
  19299.         basicPrint: self;
  19300.         nextPut: $(;
  19301.         display: self;
  19302.         nextPut: $)
  19303. !
  19304.  
  19305. rootName
  19306.     "Private - Answer the name to use for the folder at the root of the current image hierarchy"
  19307.  
  19308.     ^'\'!
  19309.  
  19310. volumeName
  19311.     "Answer the name of the volume of this package folder in the form that Windows explorer
  19312.     would display it."
  19313.  
  19314.     ^[(DiskVolumeInformation forPath: self pathname) explorerName] 
  19315.         on: Win32Error
  19316.         do: [:ex | File removePathDelimiter: self pathname]! !
  19317.  
  19318. FramingConstraints comment:
  19319. 'FramingConstraints are used to describe the constraints to be placed on the various edges of a <view> that is to be laid out under the jurisdiction of a FramingLayout manager. When a view is under the control of a FramingLayout it is given an arrangement aspect that consists of a FramingConstraints instance. It is this that describes the relationships for computing the locations of the various edges of the view and the offsets to be applied from these locations. 
  19320.  
  19321. For each of the edges of the view, a FramingConstraints holds a framing relationship and an offset for the edge position relative to the computed location of this. The framing parameters can be set for each edge using the following pairs of aspects.
  19322.  
  19323. #bottomFraming,    #bottomOffset 
  19324. #leftFraming,    #leftOffset
  19325. #rightFraming,    #rightOffset
  19326. #topFraming,    #topOffset
  19327.  
  19328. The #xxxFraming aspects may be set to any of the following symbols:
  19329.  
  19330. #fixedParentBottom 
  19331. #fixedParentLeft 
  19332. #fixedParentRight 
  19333. #fixedParentTop 
  19334.  
  19335. Using the above relationships, the appropriate view edge will be positioned a fixed number of pixels from the specified edge of its parent. The distance is determined by the corresponding offset aspect, which must be an <integer> value.
  19336.  
  19337. #fixedViewBottom 
  19338. #fixedViewLeft 
  19339. #fixedViewRight 
  19340. #fixedViewTop 
  19341.  
  19342. Here, the view edge will be positioned a fixed number of pixels from the specified edge of itself. The distance is determined by the corresponding offset aspect, which must be an <integer> value.
  19343.  
  19344. #fixedPreviousBottom 
  19345. #fixedPreviousLeft 
  19346. #fixedPreviousRight 
  19347. #fixedPreviousTop 
  19348.  
  19349. Here, the view edge will be positioned a fixed number of pixels from the specified edge of the previous view in the z-order sequence. Once again, the distance is determined by the corresponding offset aspect, an <integer> value.
  19350.  
  19351. #relativeParentHeight
  19352. #relativeParentWidth
  19353.  
  19354. With these relationships, the edge is positioned within the view''s parent at a distance computed relative to the parent''s height or width. In these cases the offset must be set to a <number> in the range 0..1.
  19355.  
  19356. #centerRelativeParentHeight
  19357. #centerRelativeParentWidth
  19358.  
  19359. With these relationships, the centre of each view is positioned within the view''s parent at a distance computed relative to the parent''s height or width. Thanks to Ian Bartholomew for supplying the code for these particular constraints. He says: "This works best if all the subviews are the same size. It does still work if this isn''t true but the gaps between subviews are not then identical, although the position of the centre of the button still corresponds to the buttons offset." Also, "The #offset fields need to be structured in a fixed way. If you have three buttons then the offsets, left to right, need to be specified as 1/4, 2/4 (or 1/2) and 3/4 (Floats will not work)."
  19360.  
  19361. Note that in all cases a positive offset implies a position down or to the right of the computed location. Negative offsets can be used if the postion is required to be up or to the left.
  19362.  
  19363. For example: Position a view so that it''s left edge is 5 pixels in from the left of it''s parent; it''s width is 200 pixels; it''s bottom is at 50% of the parent height and it''s top is 10 pixels below the bottom of the previous view. Use the following FramingConstraints:
  19364.  
  19365. FramingConstraints new
  19366.     leftFraming: #fixedParentLeft; leftOffset: 5;
  19367.     rightFraming: #fixedViewLeft; rightOffset: 200;
  19368.     bottomFraming: #relativeParentHeight; bottomOffset: 0.5;
  19369.     topFraming: #fixedPreviousBottom; topOffset: 10.
  19370.  
  19371. Instance Variables:
  19372.     leftFraming    <Symbol> describing the relationship for the left edge of the view.
  19373.     leftOffset        <number> offset of the left edge from the described location.
  19374.     rightFraming    <Symbol> describing the relationship for the right edge of the view
  19375.     rightOffset    <number> offset of the right edge from the described location
  19376.     topFraming    <Symbol> describing the relationship for the top edge of the view
  19377.     topOffset        <number> offset of the top edge from the described location
  19378.     bottomFraming    <Symbol> describing the relationship for the bottom edge of the view
  19379.     bottomOffset    <number> offset of the bottom edge from the described location
  19380. '!
  19381. !FramingConstraints class methodsFor!
  19382.  
  19383. frameCalcs
  19384.     "Private - Answer a map of symbolic frame calculation names to the selectors which
  19385.     can be sent to calculate that frame."
  19386.  
  19387.     ^(IdentityDictionary new: 20)
  19388.         at: #fixedParentBottom put: #frameFixedParentBottom:dominant:parent:view:;
  19389.         at: #fixedParentLeft put: #frameFixedParentLeft:dominant:parent:view:;
  19390.         at: #fixedParentRight put: #frameFixedParentRight:dominant:parent:view:;
  19391.         at: #fixedParentTop put: #frameFixedParentTop:dominant:parent:view:;
  19392.         at: #fixedViewBottom put: #frameFixedViewBottom:dominant:parent:view:;
  19393.         at: #fixedViewLeft put: #frameFixedViewLeft:dominant:parent:view:;
  19394.         at: #fixedViewRight put: #frameFixedViewRight:dominant:parent:view:;
  19395.         at: #fixedViewTop put: #frameFixedViewTop:dominant:parent:view:;
  19396.         at: #fixedPreviousBottom put: #frameFixedPreviousBottom:dominant:parent:view:;
  19397.         at: #fixedPreviousLeft put: #frameFixedPreviousLeft:dominant:parent:view:;
  19398.         at: #fixedPreviousRight put: #frameFixedPreviousRight:dominant:parent:view:;
  19399.         at: #fixedPreviousTop put: #frameFixedPreviousTop:dominant:parent:view:;
  19400.         at: #relativeParentHeight put: #frameRelativeParentHeight:dominant:parent:view:;
  19401.         at: #relativeParentWidth put: #frameRelativeParentWidth:dominant:parent:view:;
  19402.  
  19403.         "Ian Bartholomew's extensions"
  19404.         at: #centerRelativeParentHeight
  19405.             put: #frameCenterRelativeParentHeight:dominant:parent:view:;
  19406.         at: #centerRelativeParentWidth
  19407.             put: #frameCenterRelativeParentWidth:dominant:parent:view:;
  19408.  
  19409.         shrink;
  19410.          yourself!
  19411.  
  19412. initialize
  19413.     "Initialize the Class Variables of the receiver:
  19414.         FramingConstraints initialize
  19415.     "
  19416.  
  19417.     OffsetCalcs := self offsetCalcs.
  19418.     FrameCalcs := self frameCalcs.!
  19419.  
  19420. new
  19421.     "Answer a new initialized instance of the receiver."
  19422.  
  19423.     ^super new initialize!
  19424.  
  19425. offsetCalcs
  19426.     "Private - Answer a map of symbolic offset calculation names to the selectors which
  19427.     can be performed to calculate that offset."
  19428.  
  19429.     ^(IdentityDictionary new: 20)
  19430.         at: #fixedParentBottom put: #offsetFixedParentBottom:dominant:parent:view:;
  19431.         at: #fixedParentLeft put: #offsetFixedParentLeft:dominant:parent:view:;
  19432.         at: #fixedParentRight put: #offsetFixedParentRight:dominant:parent:view:;
  19433.         at: #fixedParentTop put: #offsetFixedParentTop:dominant:parent:view:;
  19434.  
  19435.         at: #fixedViewBottom put: #offsetFixedViewBottom:dominant:parent:view:;
  19436.         at: #fixedViewLeft put: #offsetFixedViewLeft:dominant:parent:view:;
  19437.         at: #fixedViewRight put: #offsetFixedViewRight:dominant:parent:view:;
  19438.         at: #fixedViewTop put: #offsetFixedViewTop:dominant:parent:view:;
  19439.  
  19440.         at: #fixedPreviousBottom put: #offsetFixedPreviousBottom:dominant:parent:view:;
  19441.         at: #fixedPreviousLeft put: #offsetFixedPreviousLeft:dominant:parent:view:;
  19442.         at: #fixedPreviousRight put: #offsetFixedPreviousRight:dominant:parent:view:;
  19443.         at: #fixedPreviousTop put: #offsetFixedPreviousTop:dominant:parent:view:;
  19444.  
  19445.         at: #relativeParentHeight put: #offsetRelativeParentHeight:dominant:parent:view:;
  19446.         at: #relativeParentWidth put: #offsetRelativeParentWidth:dominant:parent:view:;
  19447.  
  19448.         "Ian Bartholomew's extensions"
  19449.         at: #centerRelativeParentHeight
  19450.             put: #offsetCenterRelativeParentHeight:dominant:parent:view:;
  19451.         at: #centerRelativeParentWidth put: #offsetCenterRelativeParentWidth:dominant:parent:view:;
  19452.  
  19453.         shrink;
  19454.         yourself.!
  19455.  
  19456. publishedAspectsOfInstances
  19457.     "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  19458.  
  19459.     | topBottomFramingChoices leftRightFramingChoices |
  19460.     topBottomFramingChoices := #(#fixedParentBottom #fixedParentTop #fixedViewBottom #fixedViewTop #fixedPreviousBottom #fixedPreviousTop #relativeParentHeight #centerRelativeParentHeight).
  19461.     leftRightFramingChoices := #(#fixedParentLeft #fixedParentRight #fixedViewLeft #fixedViewRight #fixedPreviousRight #fixedPreviousLeft #relativeParentWidth #centerRelativeParentWidth).
  19462.     ^(super publishedAspectsOfInstances)
  19463.         add: (Aspect integer: #topOffset);
  19464.         add: (Aspect choice: #topFraming from: topBottomFramingChoices);
  19465.         add: (Aspect integer: #bottomOffset);
  19466.         add: (Aspect choice: #bottomFraming from: topBottomFramingChoices);
  19467.         add: (Aspect integer: #leftOffset);
  19468.         add: (Aspect choice: #leftFraming from: leftRightFramingChoices);
  19469.         add: (Aspect integer: #rightOffset);
  19470.         add: (Aspect choice: #rightFraming from: leftRightFramingChoices);
  19471.         yourself!
  19472.  
  19473. stbConvertFrom: anSTBClassFormat 
  19474.     "Convert from previous version resource. 
  19475.     Version 1 removes deprecated framing symbols."
  19476.  
  19477.     | conversionMap |
  19478.     conversionMap := ##((IdentityDictionary new)
  19479.                 at: #relativeParentBottom put: #relativeParentHeight;
  19480.                 at: #relativeParentTop put: #relativeParentHeight;
  19481.                 at: #relativeParentLeft put: #relativeParentWidth;
  19482.                 at: #relativeParentRight put: #relativeParentWidth;
  19483.                 at: #relativeViewBottom put: #relativeParentHeight;
  19484.                 at: #relativeViewTop put: #relativeParentHeight;
  19485.                 at: #relativeViewLeft put: #relativeParentWidth;
  19486.                 at: #relativeViewRight put: #relativeParentWidth;
  19487.                 yourself).
  19488.     ^
  19489.     [:data | 
  19490.     | newInstance ver |
  19491.     newInstance := self basicNew.
  19492.     1 to: data size do: [:i | newInstance instVarAt: i put: (data at: i)].
  19493.     ver := anSTBClassFormat version.
  19494.     ver < 1 
  19495.         ifTrue: 
  19496.             [#(#leftFraming #rightFraming #topFraming #bottomFraming) do: 
  19497.                     [:each | 
  19498.                     | aspect newValue |
  19499.                     aspect := newInstance aspectValue: each.
  19500.                     newValue := conversionMap at: aspect value ifAbsent: [].
  19501.                     newValue notNil ifTrue: [aspect value: newValue]]].
  19502.     newInstance]!
  19503.  
  19504. stbVersion
  19505.     "Answer the current binary filer version number for instances of the receiver."
  19506.  
  19507.     ^1! !
  19508.  
  19509. !FramingConstraints methodsFor!
  19510.  
  19511. bottomFraming
  19512.     "Answer the framing symbol for the receivers bottom edge."
  19513.  
  19514.     ^bottomFraming!
  19515.  
  19516. bottomFraming: framing
  19517.     "Set the framing symbol for the receivers bottom edge."
  19518.  
  19519.     bottomFraming := framing!
  19520.  
  19521. bottomOffset
  19522.     "Answer the <Integer> framing offset for the receivers bottom edge."
  19523.  
  19524.     ^bottomOffset !
  19525.  
  19526. bottomOffset: offset
  19527.     "Set the framing offset for the receivers bottom edge to <Integer> offset."
  19528.  
  19529.     bottomOffset := offset !
  19530.  
  19531. calculateOffset: framing rectangle: rectangle dominant: dominant parent: parentExtent view: aView
  19532.     "Private - Answer the new absolute value from the framing attribute."
  19533.  
  19534.     ^self perform: (OffsetCalcs at: framing)
  19535.         with: rectangle
  19536.         with: dominant
  19537.         with: parentExtent
  19538.         with: aView.!
  19539.  
  19540. frame: framing build: build dominant: dominant parent: parentExtent view: aView
  19541.     "Private - Answer the new absolute value from the framing attribute."
  19542.  
  19543.     ^(self perform: (FrameCalcs at: framing) 
  19544.         with: build 
  19545.         with: dominant 
  19546.         with: parentExtent 
  19547.         with: aView) truncated!
  19548.  
  19549. frameCenterRelativeParentHeight: b dominant: d parent: p view: v
  19550.     "Private - Answer the result of performing the #centerRelativeParentHeight framing calculation against the arguments, 
  19551.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19552.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19553.  
  19554.     | buttonSpace gapSize |
  19555.     buttonSpace := (d denominator - 1) * v height.
  19556.     gapSize := (p y - buttonSpace) / d denominator.
  19557.     ^gapSize + ((d numerator - 1) * (v height + gapSize))!
  19558.  
  19559. frameCenterRelativeParentWidth: b dominant: d parent: p view: v
  19560.     "Private - Answer the result of performing the #centerRelativeParentWidth framing calculation against the arguments, 
  19561.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19562.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19563.  
  19564.     | buttonSpace gapSize |
  19565.     buttonSpace := (d denominator - 1) * v width.
  19566.     gapSize := (p x - buttonSpace) / d denominator.
  19567.     ^gapSize + ((d numerator - 1) * (v width + gapSize))!
  19568.  
  19569. frameFixedParentBottom: b dominant: d parent: p view: v
  19570.     "Private - Answer the result of performing the #fixedParentBottom framing calculation against the arguments, 
  19571.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19572.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19573.  
  19574.     ^ p y + d
  19575. !
  19576.  
  19577. frameFixedParentLeft: b dominant: d parent: p view: v
  19578.     "Private - Answer the result of performing the #fixedParentLeft framing calculation against the arguments, 
  19579.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19580.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19581.  
  19582.     ^ d
  19583. !
  19584.  
  19585. frameFixedParentRight: b dominant: d parent: p view: v
  19586.     "Private - Answer the result of performing the #fixedParentRight framing calculation against the arguments, 
  19587.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19588.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19589.  
  19590.     ^ p x + d
  19591. !
  19592.  
  19593. frameFixedParentTop: b dominant: d parent: p view: v
  19594.     "Private - Answer the result of performing the #fixedParentTop framing calculation against the arguments, 
  19595.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19596.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19597.  
  19598.     ^ d
  19599. !
  19600.  
  19601. frameFixedPreviousBottom: b dominant: d parent: p view: v
  19602.     "Private - Answer the result of performing the #fixedPreviousBottom framing calculation against the arguments, 
  19603.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19604.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19605.  
  19606.     | prior |
  19607.     prior := v previousSiblingView.
  19608.     ^prior notNil 
  19609.         ifTrue: [prior rectangle bottom+d]
  19610.         ifFalse: [d].
  19611. !
  19612.  
  19613. frameFixedPreviousLeft: b dominant: d parent: p view: v
  19614.     "Private - Answer the result of performing the #fixedPreviousLeft framing calculation against the arguments, 
  19615.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19616.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19617.  
  19618.     | prior |
  19619.     prior := v previousSiblingView.
  19620.     ^prior notNil 
  19621.         ifTrue: [prior rectangle left+d]
  19622.         ifFalse: [d].
  19623. !
  19624.  
  19625. frameFixedPreviousRight: b dominant: d parent: p view: v
  19626.     "Private - Answer the result of performing the #fixedPreviousRight framing calculation against the arguments, 
  19627.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19628.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19629.  
  19630.     | prior |
  19631.     prior := v previousSiblingView.
  19632.     ^prior notNil 
  19633.         ifTrue: [prior rectangle right+d]
  19634.         ifFalse: [d].
  19635. !
  19636.  
  19637. frameFixedPreviousTop: b dominant: d parent: p view: v
  19638.     "Private - Answer the result of performing the #fixedPreviousTop framing calculation against the arguments, 
  19639.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19640.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19641.  
  19642.     | prior |
  19643.     prior := v previousSiblingView.
  19644.     ^prior notNil 
  19645.         ifTrue: [prior rectangle top+d]
  19646.         ifFalse: [d].
  19647. !
  19648.  
  19649. frameFixedViewBottom: b dominant: d parent: p view: v
  19650.     "Private - Answer the result of performing the #fixedViewBottom framing calculation against the arguments, 
  19651.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19652.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19653.  
  19654.     ^ b bottom + d
  19655. !
  19656.  
  19657. frameFixedViewLeft: b dominant: d parent: p view: v
  19658.     "Private - Answer the result of performing the #fixedViewLeft framing calculation against the arguments, 
  19659.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19660.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19661.  
  19662.     ^ b left + d
  19663. !
  19664.  
  19665. frameFixedViewRight: b dominant: d parent: p view: v
  19666.     "Private - Answer the result of performing the #fixedViewRight framing calculation against the arguments, 
  19667.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19668.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19669.  
  19670.     ^ b right + d
  19671. !
  19672.  
  19673. frameFixedViewTop: b dominant: d parent: p view: v
  19674.     "Private - Answer the result of performing the #fixedViewTop framing calculation against the arguments, 
  19675.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19676.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19677.  
  19678.     ^ b top + d
  19679. !
  19680.  
  19681. frameRelativeParentHeight: b dominant: d parent: p view: v
  19682.     "Private - Answer the result of performing the #relativeParentBottom framing calculation against the arguments, 
  19683.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19684.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19685.  
  19686.     ^ d * p y
  19687. !
  19688.  
  19689. frameRelativeParentWidth: b dominant: d parent: p view: v
  19690.     "Private - Answer the result of performing the #relativeParentRight framing calculation against the arguments, 
  19691.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19692.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19693.  
  19694.     ^ d * p x
  19695. !
  19696.  
  19697. initialize
  19698.     "Private - Initialize the state of the receiver."
  19699.  
  19700.     super initialize.
  19701.     leftFraming := #fixedParentLeft.
  19702.     rightFraming := #fixedViewLeft.
  19703.     topFraming := #fixedParentTop.
  19704.     bottomFraming := #fixedViewTop.
  19705.     leftOffset := rightOffset := topOffset := bottomOffset := 0.!
  19706.  
  19707. keyFramingEdge: framing
  19708.     "Private - Answer whether framing can be successfuly placed without
  19709.     relying on another precomputed edge."
  19710.  
  19711.     ^(framing indexOfSubCollection: #Parent) > 0 or: [ (framing indexOfSubCollection: #Previous) > 0 ]!
  19712.  
  19713. leftFraming
  19714.     "Answer the framing symbol for the receivers left edge."
  19715.  
  19716.     ^leftFraming!
  19717.  
  19718. leftFraming: framing
  19719.     "Set the framing symbol for the receivers left edge."
  19720.  
  19721.     leftFraming := framing!
  19722.  
  19723. leftOffset
  19724.     "Answer the <Integer> framing offset for the receivers left edge."
  19725.  
  19726.     ^leftOffset!
  19727.  
  19728. leftOffset: offset
  19729.     "Set the framing offset for the receivers left edge to <Integer> offset."
  19730.  
  19731.     leftOffset := offset!
  19732.  
  19733. offsetCenterRelativeParentHeight: b dominant: d parent: p view: v
  19734.     "Private - Answer the result of performing the #centerRelativeParentHeight offset calculation against the arguments, 
  19735.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19736.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19737.  
  19738.     ^d / p y!
  19739.  
  19740. offsetCenterRelativeParentWidth: b dominant: d parent: p view: v
  19741.     "Private - Answer the result of performing the #centerRelativeParentWidth offset calculation against the arguments, 
  19742.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19743.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19744.  
  19745.     ^d / p x!
  19746.  
  19747. offsetFixedParentBottom: b dominant: d parent: p view: v
  19748.     "Private - Answer the result of performing the #fixedParentBottom offset calculation against the arguments, 
  19749.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19750.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19751.  
  19752.     ^ d - p y
  19753. !
  19754.  
  19755. offsetFixedParentLeft: b dominant: d parent: p view: v
  19756.     "Private - Answer the result of performing the #fixedParentLeft offset calculation against the arguments, 
  19757.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19758.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19759.  
  19760.     ^ d
  19761. !
  19762.  
  19763. offsetFixedParentRight: b dominant: d parent: p view: v
  19764.     "Private - Answer the result of performing the #fixedParentRight offset calculation against the arguments, 
  19765.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19766.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19767.  
  19768.     ^ d - p x
  19769. !
  19770.  
  19771. offsetFixedParentTop: b dominant: d parent: p view: v
  19772.     "Private - Answer the result of performing the #fixedParentTop offset calculation against the arguments, 
  19773.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19774.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19775.  
  19776.     ^ d
  19777. !
  19778.  
  19779. offsetFixedPreviousBottom: b dominant: d parent: p view: v
  19780.     "Private - Answer the result of performing the #fixedPreviousBottom offset calculation against the arguments, 
  19781.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19782.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19783.  
  19784.     | prior |
  19785.     prior := v previousSiblingView.
  19786.     ^prior notNil 
  19787.         ifTrue: [d - prior rectangle bottom]
  19788.         ifFalse: [d].!
  19789.  
  19790. offsetFixedPreviousLeft: b dominant: d parent: p view: v
  19791.     "Private - Answer the result of performing the #fixedPreviousLeft offset calculation against the arguments, 
  19792.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19793.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19794.  
  19795.     | prior |
  19796.     prior := v previousSiblingView.
  19797.     ^prior notNil 
  19798.         ifTrue: [d - prior rectangle left]
  19799.         ifFalse: [d].!
  19800.  
  19801. offsetFixedPreviousRight: b dominant: d parent: p view: v
  19802.     "Private - Answer the result of performing the #fixedPreviousRight offset calculation against the arguments, 
  19803.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19804.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19805.  
  19806.     | prior |
  19807.     prior := v previousSiblingView.
  19808.     ^prior notNil 
  19809.         ifTrue: [d - prior rectangle right]
  19810.         ifFalse: [d].!
  19811.  
  19812. offsetFixedPreviousTop: b dominant: d parent: p view: v
  19813.     "Private - Answer the result of performing the #fixedPreviousTop offset calculation against the arguments, 
  19814.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19815.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19816.  
  19817.     | prior |
  19818.     prior := v previousSiblingView.
  19819.     ^prior notNil 
  19820.         ifTrue: [d - prior rectangle top]
  19821.         ifFalse: [d].!
  19822.  
  19823. offsetFixedViewBottom: b dominant: d parent: p view: v
  19824.     "Private - Answer the result of performing the #fixedViewBottom offset calculation against the arguments, 
  19825.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19826.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19827.  
  19828.     ^ d - b bottom
  19829. !
  19830.  
  19831. offsetFixedViewLeft: b dominant: d parent: p view: v
  19832.     "Private - Answer the result of performing the #fixedViewLeft offset calculation against the arguments, 
  19833.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19834.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19835.  
  19836.     ^ d - b left
  19837. !
  19838.  
  19839. offsetFixedViewRight: b dominant: d parent: p view: v
  19840.     "Private - Answer the result of performing the #fixedViewRight offset calculation against the arguments, 
  19841.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19842.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19843.  
  19844.     ^ d - b right
  19845. !
  19846.  
  19847. offsetFixedViewTop: b dominant: d parent: p view: v
  19848.     "Private - Answer the result of performing the #fixedViewTop offset calculation against the arguments, 
  19849.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19850.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19851.  
  19852.     ^ d - b top
  19853. !
  19854.  
  19855. offsetRelativeParentHeight: b dominant: d parent: p view: v
  19856.     "Private - Answer the result of performing the #relativeParentBottom offset calculation against the arguments, 
  19857.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19858.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19859.  
  19860.     ^ d / p y
  19861. !
  19862.  
  19863. offsetRelativeParentWidth: b dominant: d parent: p view: v
  19864.     "Private - Answer the result of performing the #relativeParentRight offset calculation against the arguments, 
  19865.     b, v, d, and p, which are respectively the <Rectangle> being calculated, the <integer> dominent offset, 
  19866.     the <Point> specifying the parent extent, and the <View> whose build rectangle is being calculated."
  19867.  
  19868.     ^ d / p x
  19869. !
  19870.  
  19871. rectangleFor: aView from: parentExtent
  19872.     "Answer a new Rectangle generated from the receivers framings applied to parent extent."
  19873.  
  19874.     | rectangle |
  19875.     rectangle := 0@0 extent: 0@0.
  19876.  
  19877.     "frame the left and right edges"
  19878.     ((self keyFramingEdge: leftFraming) or: [self keyFramingEdge: rightFraming]) ifTrue: [
  19879.         (self keyFramingEdge: leftFraming)
  19880.             ifTrue: [rectangle left: (self frame: leftFraming build: rectangle dominant: leftOffset parent: parentExtent view: aView).
  19881.                     rectangle right: (self frame: rightFraming build: rectangle dominant: rightOffset parent: parentExtent view: aView)]
  19882.             ifFalse: [rectangle right: (self frame: rightFraming build: rectangle dominant: rightOffset parent: parentExtent view: aView).
  19883.                     rectangle left: (self frame: leftFraming build: rectangle dominant: leftOffset parent: parentExtent view: aView)]].
  19884.  
  19885.     "frame the top and bottom edges"
  19886.     ((self keyFramingEdge: topFraming) or: [self keyFramingEdge: bottomFraming]) ifTrue: [
  19887.         (self keyFramingEdge: topFraming)
  19888.             ifTrue: [rectangle top: (self frame: topFraming build: rectangle dominant: topOffset parent: parentExtent view: aView).
  19889.                     rectangle bottom: (self frame: bottomFraming build: rectangle dominant: bottomOffset parent: parentExtent view: aView)]
  19890.             ifFalse: [rectangle bottom: (self frame: bottomFraming build: rectangle dominant: bottomOffset parent: parentExtent view: aView).
  19891.                     rectangle top: (self frame: topFraming build: rectangle dominant: topOffset parent: parentExtent view: aView)]].
  19892.  
  19893.     ^rectangle
  19894.  
  19895.             
  19896.     !
  19897.  
  19898. resolutionScaledBy: scale
  19899.     "Private - The receiver is being loaded and it has been determined that the pixel resolution
  19900.     has changed since the point at which the view was saved. Scale any internal pixels by <Point>
  19901.     scale."
  19902.  
  19903.     (leftFraming=#relativeParentWidth) ifFalse: [
  19904.         leftOffset := (leftOffset * scale x) truncated ].
  19905.     (rightFraming=#relativeParentWidth) ifFalse: [
  19906.         rightOffset := (rightOffset* scale x) truncated ].
  19907.     (topFraming=#relativeParentHeight) ifFalse: [
  19908.         topOffset := (topOffset * scale y) truncated ].
  19909.     (topFraming=#relativeParentHeight) ifFalse: [
  19910.         bottomOffset := (bottomOffset * scale y) truncated ].
  19911. !
  19912.  
  19913. rightFraming
  19914.     "Answer the framing symbol for the receivers right edge."
  19915.  
  19916.     ^rightFraming!
  19917.  
  19918. rightFraming: framing
  19919.     "Set the framing symbol for the receivers right edge."
  19920.  
  19921.     rightFraming := framing!
  19922.  
  19923. rightOffset
  19924.     "Answer the <Integer> framing offset for the receivers right edge."
  19925.  
  19926.     ^rightOffset !
  19927.  
  19928. rightOffset: offset
  19929.     "Set the framing offset for the receivers right edge to <Integer> offset."
  19930.  
  19931.     rightOffset := offset !
  19932.  
  19933. topFraming
  19934.     "Answer the framing symbol for the receivers top edge."
  19935.  
  19936.     ^topFraming!
  19937.  
  19938. topFraming: framing
  19939.     "Set the framing symbol for the receivers top edge."
  19940.  
  19941.     topFraming := framing!
  19942.  
  19943. topOffset
  19944.     "Answer the <Integer> framing offset for the receivers top edge."
  19945.  
  19946.     ^topOffset!
  19947.  
  19948. topOffset: offset
  19949.     "Set the framing offset for the receivers top edge to <Integer> offset."
  19950.  
  19951.     topOffset := offset!
  19952.  
  19953. updateFor: aView from: parentExtent rectangle: rectangle
  19954.     "Update the receivers offsets from a new rectangle within the parentExtent."
  19955.  
  19956.     "frame the left and right edges"
  19957.     self assert: [(self keyFramingEdge: leftFraming) or: [self keyFramingEdge: rightFraming]].
  19958.     (self keyFramingEdge: leftFraming) 
  19959.         ifTrue: [
  19960.             leftOffset := self calculateOffset: leftFraming rectangle: rectangle 
  19961.                         dominant: rectangle left parent: parentExtent view: aView.
  19962.             rightOffset := self calculateOffset: rightFraming rectangle: rectangle 
  19963.                         dominant: rectangle right parent: parentExtent view: aView]
  19964.         ifFalse: [
  19965.             rightOffset := self calculateOffset: rightFraming rectangle: rectangle 
  19966.                         dominant: rectangle right parent: parentExtent view: aView.
  19967.             leftOffset := self calculateOffset: leftFraming rectangle: rectangle 
  19968.                         dominant: rectangle left parent: parentExtent view: aView].
  19969.  
  19970.     "frame the top and bottom edges"
  19971.     self assert: [(self keyFramingEdge: topFraming) or: [self keyFramingEdge: bottomFraming]].
  19972.     (self keyFramingEdge: topFraming)
  19973.         ifTrue: [
  19974.                 topOffset := self calculateOffset: topFraming rectangle: rectangle
  19975.                             dominant: rectangle top parent: parentExtent view: aView.
  19976.                 bottomOffset := self calculateOffset: bottomFraming rectangle: rectangle 
  19977.                             dominant: rectangle bottom parent: parentExtent view: aView]
  19978.         ifFalse: [
  19979.             bottomOffset := self calculateOffset: bottomFraming rectangle: rectangle 
  19980.                             dominant: rectangle bottom parent: parentExtent view: aView.
  19981.                 topOffset := self calculateOffset: topFraming rectangle: rectangle 
  19982.                             dominant: rectangle top parent: parentExtent view: aView].
  19983. ! !
  19984.  
  19985. Grabber comment:
  19986. 'A Grabber is used to mark view locations for aspects that may be grabbed by the mouse. A ViewComposer uses grabbers to manipulate the size of the current view. 
  19987.  
  19988. A Grabber will track the mouse, after receiving #trackMouseFrom:, until the mouse button is released at which time it modifies the appropriate aspect of the associated view. Once the operation is complete, that aspect of the view is triggered.'!
  19989. !Grabber class methodsFor!
  19990.  
  19991. cursors
  19992.     "Private - Answer the Cursors class variable."
  19993.  
  19994.     Cursors isNil ifTrue: [
  19995.         Cursors := IdentityDictionary new
  19996.             at: #bottomRight put: Cursor sizeNWSE;
  19997.             at: #topLeft put: Cursor sizeNWSE;
  19998.             at: #topRight put: Cursor sizeNESW;
  19999.             at: #bottomLeft put: Cursor sizeNESW;
  20000.             at: #leftCenter put: Cursor sizeWE;
  20001.             at: #rightCenter put: Cursor sizeWE;
  20002.             at: #topCenter put: Cursor sizeNS;
  20003.             at: #bottomCenter put: Cursor sizeNS;
  20004.             shrink;
  20005.             yourself ].
  20006.     ^Cursors
  20007. !
  20008.  
  20009. defaultExtent
  20010.     "Private - Answers the default extent to be used for the receiver"
  20011.  
  20012.     ^6 @ 6!
  20013.  
  20014. initialize
  20015.     "Private - Register the receiver with the #onStartup event"
  20016.  
  20017.     SessionManager current when: #sessionStarted send: #onStartup to: self!
  20018.  
  20019. new
  20020.     "Private - Use #view:aspect:"
  20021.  
  20022.     self shouldNotImplement!
  20023.  
  20024. onStartup
  20025.     "Private - Clear the Cursors class variable."
  20026.  
  20027.     Cursors := nil!
  20028.  
  20029. publishedEventsOfInstances
  20030.     "Answer a Set of Symbols that describe the published events triggered
  20031.     by instances of the receiver."
  20032.  
  20033.     ^super publishedEventsOfInstances
  20034.         add: #aspectChanged;
  20035.         yourself.
  20036. !
  20037.  
  20038. uninitialize
  20039.     SessionManager current removeEventsTriggeredFor: self!
  20040.  
  20041. view: aView aspect: anAspectSymbol arena: arenaView grid: aGrid status: statusModel
  20042.     "Answers an instance of the receiver for anAspectSymbol of aView. The new instance will be
  20043.     drawn within aView."
  20044.  
  20045.     ^super new
  20046.         view: aView aspect: anAspectSymbol arena: arenaView grid: aGrid status: statusModel;
  20047.         yourself! !
  20048.  
  20049. !Grabber methodsFor!
  20050.  
  20051. alignWithView
  20052.     "Private - Computes the boundary rectangle for the receiver to align with
  20053.     the grab aspect of the associated view"
  20054.  
  20055.     | point rect |
  20056.     rect := self view rectangle insetBy: (self defaultExtent // 2 negated).
  20057.     point := rect perform: self aspect.
  20058.     point := view parentView mapPoint: point to: self arena.
  20059.     rectangle := Rectangle center: point extent: (self defaultExtent).
  20060.  
  20061.     
  20062.  
  20063. !
  20064.  
  20065. arena
  20066.     "Answers the view where the receiver will be drawn."
  20067.     
  20068.     ^arena!
  20069.  
  20070. aspect
  20071.     "Answers the aspect symbol (i.e. #topLeft, #bottomRight) for the receiver"
  20072.     
  20073.     ^aspect!
  20074.  
  20075. beHorizontalOnly
  20076.     "Set the receiver for horizontal dragging only"
  20077.  
  20078.     constrain := #horizontal.!
  20079.  
  20080. beVerticalOnly
  20081.     "Set the receiver for vertical dragging only"
  20082.  
  20083.     constrain := #vertical.!
  20084.  
  20085. calculateViewRectangleFor: pointOffset 
  20086.     "Private - Calculates boundary rectangle for the associated view if the
  20087.     receiver were allowed to modify its aspect to pointOffset. The rectangle is
  20088.     in the coordinate system of the arena"
  20089.  
  20090.     | rect parent parentArenaRect |
  20091.     rect := self view rectangle.
  20092.     rect := self view parentView mapRectangle: rect to: self arena.
  20093.     rect perform: self setAspect with: pointOffset.
  20094.     rect := self arena mapRectangle: rect to: self view parentView.
  20095.     rect := Rectangle origin: (self constrainPoint: rect origin)
  20096.                 corner: (self constrainPoint: rect corner).
  20097.     rect := self view parentView mapRectangle: rect to: self arena.
  20098.     parent := self view parentView.
  20099.     parentArenaRect := parent mapRectangle: parent clientRectangle to: self arena.
  20100.     rect topLeft: (rect topLeft max: parentArenaRect topLeft).
  20101.     ^rect!
  20102.  
  20103. cancelTrackingAt: aPoint 
  20104.     self eraseTrackingAt: aPoint!
  20105.  
  20106. constrainPoint: aPoint
  20107.     "Private - Answers the position for aPoint after any view constraints have been taken 
  20108.     into consideration"
  20109.  
  20110.     ^grid constrainPoint: aPoint!
  20111.  
  20112. containsPoint: aPoint
  20113.     "Answer true if aPoint (in the coordinate system of our associated shell)
  20114.     is within the boundary of the receiver"
  20115.  
  20116.     ^self rectangle containsPoint: aPoint
  20117. !
  20118.  
  20119. continueTrackingAt: pointOffset from: previousPointOffset
  20120.     "Private - Continue position tracking for the associated view at pointOffset when
  20121.     the previous tracking position was at previousPointOffset. Part of the <MouseTracker>
  20122.     target protocol. Answers the actual position achieved after any view constraints
  20123.     have been applied"
  20124.  
  20125.     self eraseTrackingAt: previousPointOffset.
  20126.     self drawTrackingAt: pointOffset.
  20127.     ^pointOffset!
  20128.  
  20129. cursor
  20130.     "Answers the instance of Cursor which should be used to
  20131.     indicate that the mouse pointer is over the receiver."
  20132.  
  20133.     ^self cursors at: self aspect!
  20134.  
  20135. cursors
  20136.     "Private - Answer the Cursors class variable."
  20137.  
  20138.     ^self class cursors!
  20139.  
  20140. defaultColor
  20141.     "Private - Answers the default colour to be used for a grab location in the
  20142.     receiver. Use the higlight colour from the system colours"
  20143.  
  20144.     ^Color highlight!
  20145.  
  20146. defaultExtent
  20147.     "Private - Answers the default extent to be used for the receiver"
  20148.  
  20149.     ^self class defaultExtent!
  20150.  
  20151. draw
  20152.     "Draws the receiver in its arena"
  20153.  
  20154.     | canvas brush |
  20155.     self alignWithView.
  20156.     canvas := self arena canvas.
  20157.     brush := Brush color: self defaultColor.
  20158.     canvas fillRectangle: self rectangle brush: brush.
  20159.     canvas free
  20160.  
  20161.     !
  20162.  
  20163. drawTrackingAt: pointOffset
  20164.     "Draws the tracking for the aspect of the view associated with the receiver when 
  20165.     offset by pointOffset."
  20166.  
  20167.     | focusRect |
  20168.     focusRect := self calculateViewRectangleFor: pointOffset.
  20169.     self arena drawFocusRect: focusRect.
  20170.     status value: (self arena mapRectangle: focusRect to: self view parentView).!
  20171.  
  20172. endTrackingAt: pointOffset
  20173.     "Private - End position tracking for the associated view at aPoint.
  20174.     Part of the <MouseTracker> target protocol."
  20175.  
  20176.     | rect parentLayoutManager |
  20177.  
  20178.     self eraseTrackingAt: pointOffset.
  20179.  
  20180.     rect := (self calculateViewRectangleFor: pointOffset).
  20181.     rect := self arena mapRectangle: rect to: self view parentView.
  20182.  
  20183.     parentLayoutManager := self view parentView layoutManager.
  20184.     parentLayoutManager isNil 
  20185.         ifTrue: [ self view position: rect topLeft; extent: rect extent ]
  20186.         ifFalse: [ parentLayoutManager 
  20187.             "reposition: self view to: rect topLeft;"
  20188.             resize: self view to: rect ].
  20189.     self view parentView validateLayout.
  20190.  
  20191.     "If the view that the receiver is associated with has its own
  20192.     layout manager, then this will cause it to be validated."
  20193.     self view validateLayout.
  20194.  
  20195.     "Move the receiver to its new location and trigger a notification."
  20196.     self alignWithView; trigger: #aspectChanged.!
  20197.  
  20198. eraseTrackingAt: pointOffset
  20199.     "Erases the tracking for the aspect of the view associated with the receiver when offset
  20200.     by pointOffset. Since the tracking is drawn using an Xored pen we can erase it simply by redrawing 
  20201.     it once more"
  20202.  
  20203.     self drawTrackingAt: pointOffset!
  20204.  
  20205. grid
  20206.     "Answers the grid which the receiver should snap to."
  20207.     
  20208.     ^grid!
  20209.  
  20210. invalidate
  20211.     "Private - Invalidates the areas occupied by the receiver in the Shell associated with the receiver's view"
  20212.  
  20213.     self arena invalidateRect: self rectangle
  20214.  
  20215.     !
  20216.  
  20217. isHorizontalOnly
  20218.     "Answer true if the receiver is constrained for horizontal dragging only"
  20219.  
  20220.     ^constrain == #horizontal!
  20221.  
  20222. isVerticalOnly
  20223.     "Answer true if the receiver is constrained for vertical dragging only"
  20224.  
  20225.     ^constrain == #vertical!
  20226.  
  20227. rectangle
  20228.     "Private - Answers the boundary rectangle for the receiver in the coordinate
  20229.     system of our associated view"
  20230.  
  20231.     ^rectangle!
  20232.  
  20233. setAspect
  20234.     "Private - Answers the symbol for setting the aspect (i.e. #topLeft:, #bottomRight:)"
  20235.     
  20236.     ^(aspect , ':') asSymbol!
  20237.  
  20238. startTrackingAt: pointOffset
  20239.     "Private - Start aspect tracking for the associated view at pointOffset. Part of the 
  20240.     <MouseTracker> target protocol. Answers the actual position achieved after any view 
  20241.     constraints have been applied"
  20242.  
  20243.     self drawTrackingAt: pointOffset.
  20244.     ^pointOffset!
  20245.  
  20246. trackMouseFrom: aScreenPoint 
  20247.     "The mouse went down within the receiver. Start tracking its movement"
  20248.  
  20249.     | tracker |
  20250.     (tracker := MouseTracker forPresenter: self view presenter
  20251.                 startingAt: aScreenPoint) origin: self rectangle center.
  20252.     self isHorizontalOnly ifTrue: [tracker beHorizontalOnly].
  20253.     self isVerticalOnly ifTrue: [tracker beVerticalOnly].
  20254.     tracker startTracking: self!
  20255.  
  20256. view
  20257.     "Answers the view for the receiver"
  20258.     
  20259.     ^view!
  20260.  
  20261. view: aView aspect: anAspectSymbol arena: arenaView grid: aGrid status: statusModel
  20262.     "Sets the receiver's details."
  20263.     
  20264.     view := aView.
  20265.     aspect := anAspectSymbol.
  20266.     arena := arenaView.
  20267.     grid := aGrid.
  20268.     status := statusModel.
  20269.     self alignWithView! !
  20270.  
  20271. GraphicsTool comment:
  20272. ''!
  20273. !GraphicsTool class methodsFor!
  20274.  
  20275. fromHandle: aHandle
  20276.     "Answers an instance of the receiver with aHandle. The handle is not
  20277.     owned by the instance and will not therefore be freed by it."
  20278.  
  20279.     ^self new
  20280.         ownsHandle: false;
  20281.         handle: aHandle!
  20282.  
  20283. fromOwnedHandle: aHandle
  20284.     "Answers an instance of the receiver with aHandle. The handle is
  20285.     owned by the instance and will therefore be freed by it."
  20286.  
  20287.     ^self new
  20288.         ownsHandle: true;
  20289.         handle: aHandle;
  20290.         beFinalizable;
  20291.         yourself!
  20292.  
  20293. new
  20294.     "Answer a new, properly initialized, instance of the receiver."
  20295.  
  20296.     ^super new initialize!
  20297.  
  20298. onExit
  20299.     "Ensure all the receiver's subinstances are in their 'invalidated' state on exit
  20300.     so that they have released any external resources they are holding."
  20301.  
  20302.     self primAllSubinstances do: [:i | i onExit]!
  20303.  
  20304. onStartup
  20305.     "Ensure all the receiver's subinstances are in their 'invalidated' state on startup
  20306.     so that they rebuild their external resource when required rather than attempting
  20307.     to use an old handle hanging around from the sesssion when the image was saved."
  20308.  
  20309.     self primAllSubinstances do: [:i | i onStartup].
  20310.     self onStartup2!
  20311.  
  20312. onStartup2
  20313.     "Private - Perform system startup processing for all subclasses."
  20314.  
  20315.     self subclasses do: [:c | c onStartup2]! !
  20316.  
  20317. !GraphicsTool methodsFor!
  20318.  
  20319. asParameter
  20320.     "Answer the receiver in a form suitable for an API call."
  20321.  
  20322.     ^self handle!
  20323.  
  20324. basicFree
  20325.     "Private - Free up external resources held by the receiver.
  20326.     Ignore any errors which might arise."
  20327.  
  20328.     GDILibrary default deleteObject: handle!
  20329.  
  20330. basicHandle
  20331.     "Answer the receiver's handle instance variable.
  20332.     Does not cause the receiver to be realized."
  20333.  
  20334.     ^handle!
  20335.  
  20336. basicRealize
  20337.     "Private - Realize (create) the external resource associated with the receiver, sent
  20338.     from the public method, #realize, if not already realized."
  20339.  
  20340.     ^self handle: self createHandle!
  20341.  
  20342. clearCached
  20343.     "Private - Clear down the receiver's cached information and handles.
  20344.     Should be overridden by subclasses which wish to clear down other
  20345.     handles and cached information."
  20346.  
  20347.     handle := nil!
  20348.  
  20349. createHandle
  20350.     "Private - Create and answer an external resource handle associated with the receiver.
  20351.     This may be installed as the handle of the receiver if called from #basicRealize or it
  20352.     may be used by third parties who require a duplicate handle"
  20353.  
  20354.     ^self subclassResponsibility!
  20355.  
  20356. detachHandle
  20357.     "Answer the receiver's handle, and it is owned, relinquish ownership
  20358.     to the caller."
  20359.  
  20360.     | hTool |
  20361.     hTool := self handle.    "May realize the object"
  20362.     ownsHandle ifTrue: [self beUnfinalizable].
  20363.     self clearCached.
  20364.     ^hTool!
  20365.  
  20366. equals: anObject
  20367.     "GraphicTools are considered equal if they are identical
  20368.     or they have the same handle. We only include the identity check
  20369.     to early out of the possibly expensive handle test (we may need to
  20370.     realize the graphics objects to get the handles)."
  20371.  
  20372.     ^self == anObject or: [self handle = anObject handle].!
  20373.  
  20374. finalize
  20375.     "Private - The receiver is about to expire, so free any external resources. We use #free
  20376.     rather than #basicFree just in case the receiver has been explicitly freed whilst it was
  20377.     waiting in the finalize queue."
  20378.  
  20379.     "Notification signal: 'Finalizing ', self printString."
  20380.     self free!
  20381.  
  20382. free
  20383.     "Free external resources held by the receiver, and leave in a state such
  20384.     that the receiver will be re-realized the next time it is accessed."
  20385.  
  20386.     (self isRealized and: [self ownsHandle]) ifTrue: [
  20387.         self beUnfinalizable.
  20388.         self basicFree].
  20389.     handle := nil!
  20390.  
  20391. getData: aWinStruct
  20392.     "Private - Get the data bytes of the receiver's external resource object into    
  20393.     the specified structure. N.B. This only works for GDI objects."
  20394.  
  20395.     ^GDILibrary default
  20396.         getObject: self asParameter
  20397.         cbBuffer: aWinStruct byteSize
  20398.         lpvObject: aWinStruct
  20399.         !
  20400.  
  20401. getStockObject: anInteger
  20402.     "Private - Get the handle of the specified stock object."
  20403.  
  20404.     ^GDILibrary default getStockObject: anInteger        !
  20405.  
  20406. handle
  20407.     "Answer the receiver's handle. If unrealized then attempt to realize it first."
  20408.  
  20409.     handle isNil
  20410.         ifTrue: [self realize].
  20411.     ^handle!
  20412.  
  20413. handle: aHandle
  20414.     "Private - Set the receiver's handle to aHandle. Answer the receiver.
  20415.     Note: If aHandle isNil, then it is stored as 0 to prevent any subsequent attempt
  20416.     to lazily realize the receiver. Thus only one lazy realization attempt is made, 
  20417.     this does mean, however, that the handle cannot be set to nil via this mutator."
  20418.  
  20419.     handle := aHandle isNil 
  20420.         ifTrue: [0]        "prevent subsequent attempts to lazy init."
  20421.         ifFalse: [aHandle asParameter]!
  20422.  
  20423. initialize
  20424.     "Initialize the receiver's instance variables."
  20425.  
  20426.     ownsHandle := true    "By default instances will free their handles on finalization"!
  20427.  
  20428. isPersistent
  20429.     "Private - Answer true if the receiver holds sufficient information such that
  20430.     it can recreate itself when the image is saved and restored. This is also
  20431.     an indication as to whether the receiver can be filed out/in using the STB
  20432.     mechanism. Generally this ability corresponds to a useful implemenation
  20433.     of #basicRealize"
  20434.  
  20435.     ^false!
  20436.  
  20437. isRealized
  20438.     "Answer true if the receiver is realized."
  20439.  
  20440.     ^handle notNil!
  20441.  
  20442. onExit
  20443.     "Private - The session is about to end, ensure any resources held by the receiver are
  20444.     free'd. We use #free (instead of #basicFree) just in case the receiver is
  20445.     already freed."
  20446.  
  20447.     self free
  20448. !
  20449.  
  20450. onStartup
  20451.     "Private - The system is starting. Ensure no invalid handles remain."
  20452.  
  20453.     self clearCached!
  20454.  
  20455. ownsHandle
  20456.     "Answer whether the receiver owns the handle it is holding"
  20457.  
  20458.     ^ownsHandle!
  20459.  
  20460. ownsHandle: aBoolean
  20461.     "Private - Record whether the receiver owns the handle it is holding, and will
  20462.     therefore release it when finalized. Answer the receiver."
  20463.  
  20464.     ownsHandle := aBoolean!
  20465.  
  20466. postCopy
  20467.     "Apply any final flourish to the copy that may be required.
  20468.     GraphicsTools hold onto an external resource, which can't
  20469.     be shared in case the owner free's it."
  20470.  
  20471.     self clearCached!
  20472.  
  20473. realize
  20474.     "Realize (create) the external resource associated with the receiver,
  20475.     but only if not already realized. Subclasses must implement #basicRealize"
  20476.  
  20477.     ^self isRealized
  20478.         ifFalse: [
  20479.             self basicRealize.
  20480.             self ownsHandle ifTrue: [self beFinalizable]]!
  20481.  
  20482. stbFixup: anSTBInFiler at: newObjectIndex
  20483.     "Answer the true object that must be used to represent the receiver when read from anSTBInFiler,
  20484.     and also perform any post load fixup that might be needed."
  20485.  
  20486.     self clearCached.
  20487.     ^super stbFixup: anSTBInFiler at: newObjectIndex!
  20488.  
  20489. stbSaveOn: anSTBOutFiler
  20490.     "Save out a binary representation of the receiver to anSTBOutFiler.
  20491.     Only sub-instances of the receiver that are capable of persistency, i.e.
  20492.     they hold enough information to re-create themselves, can be filed out."
  20493.  
  20494.     self isPersistent
  20495.         ifFalse: [self error: 'Cannot #stbSaveOn: ', self printString].
  20496.  
  20497.     super stbSaveOn: anSTBOutFiler! !
  20498.  
  20499. Grid comment:
  20500. ''!
  20501. !Grid class methodsFor!
  20502.  
  20503. resolution: anInteger
  20504.     "Answers a new instance of the receiver with
  20505.     a resolution of anInteger."
  20506.  
  20507.     ^self new
  20508.         resolution: anInteger;
  20509.         yourself! !
  20510.  
  20511. !Grid methodsFor!
  20512.  
  20513. constrainPoint: aPoint
  20514.     "Private - Answers the position for aPoint
  20515.     after any grid constraints have been taken into consideration."
  20516.  
  20517.     ^(aPoint + (resolution//2)) // resolution * resolution!
  20518.  
  20519. constrainRectangle: aRectangle
  20520.     "Private - Answers the constrained position/size of aRectangle."
  20521.  
  20522.     ^(self constrainPoint: aRectangle origin) corner: (self constrainPoint: aRectangle corner)
  20523. !
  20524.  
  20525. resolution
  20526.     "Answers the number of pixels between adjacent points in the grid."
  20527.  
  20528.     ^resolution!
  20529.  
  20530. resolution: anInteger
  20531.     "Sets the number of pixels between adjacent points in the grid to anInteger."
  20532.  
  20533.     resolution := anInteger! !
  20534.  
  20535. GUID comment:
  20536. 'GUID is the class of 128-bit Globally Unique Identifiers (guids) which are used wherever a unique identifier is required in COM, for example to identify specific coclasses and interfaces.
  20537.  
  20538. You can easily allocate a new GUID by sending #newUnique to this class. Note that this process is very fast, so there is no particular reason not to use GUIDs for other purposes requiring unique identifiers such as records in a database.
  20539.  
  20540. Note: In versions of Dolphin prior to 2.2 GUID was a subclass of ExternalStructure. Although logically GUID belongs under ExternalStructure, it was move for reasons of space efficiency (every class now has a unique GUID).
  20541.  
  20542. Instance Variables:
  20543.     None (byte class)
  20544.  
  20545. Class Variables:
  20546.     Null    - The null <GUID>.'!
  20547. !GUID class methodsFor!
  20548.  
  20549. alignment
  20550.     "Answer the alignment requirements for the receiver.
  20551.     Implementation Note: The receiver is actually defined as a structure
  20552.     of the following form:
  20553.         typedef struct _GUID {
  20554.             unsigned long  Data1;
  20555.             unsigned short Data2;
  20556.             unsigned short Data3;
  20557.             unsigned char  Data4[ 8 ];
  20558.         } GUID;
  20559.     This means it's maximum alignment requirement is for a 32-bit integer,
  20560.     i.e. 4 rather than 16.
  20561.     "
  20562.  
  20563.     ^4!
  20564.  
  20565. αV5, ╜ƒ7s·áé.î-≥╣àÑ╝τ═▄¿≤▒V≥√ßu`_S└─*ZÆG&oH@+≡┴[l#L╖<~╗╗)∙▀N ▒≈╢É╖ô9âqLol√«3╖ùÇJ]ùƒf╜
  20566. ÷iƒA■T+Σ`▀╩V▄/┼9├Ç╞σ╔«g╚ ìëÆeε■Q╢h;ÉΩ0█╓IΓSh▀▄÷!!e╣╙a╥G.╫6Ñ╘├P|╢εδεσí≥iY╜á╝gCGKi4╬φ9cJS▌┬Ö∩V.&│┐&à^ äπæσí!!┤╫δñ≤7│╫█╩_w0!!«i aMτÉ{╥lB╤k⌠Φ·ç┘nÜ┌╓π┤)╡b∩'└⌡┘═Gpr!
  20567.  
  20568. atAddress: anAddress
  20569.     "Answer a new instance of the receiver instantiated from the
  20570.     data at the specified address. Normally  this will be a 'reference' 
  20571.     instance, that points at the data embedded    at the specified address. 
  20572.     However in the case of objects that always have reference form
  20573.     (e.g. COM interface pointers, BSTRs, etc) this will be a copy
  20574.     of the pointer at that address. This is particularly useful for accessing
  20575.     elements of arrays."
  20576.  
  20577.     ^self fromAddress: anAddress!
  20578.  
  20579. byteSize
  20580.     "Answer the size in bytes of this structure"
  20581.  
  20582.     ^16!
  20583.  
  20584. clear: addressOrBytes
  20585.     "Finalize an instance of the structure which instances of the receiver wrap
  20586.     which resides at the specified address. Note that this is not about freeing
  20587.     the specified memory block, but any resources which it references."!
  20588.  
  20589. compileDefinition
  20590.     "Implemented as part of the <externalStructure class> protocol, but nothing to do here."!
  20591.  
  20592. defineFields
  20593.     "Define the fields of the GUID structure.
  20594.         GUID defineTemplate
  20595.     
  20596.         typedef         struct tagGUID {
  20597.             unsigned long Data1;
  20598.             unsigned short Data2;
  20599.             unsigned short Data3;
  20600.             char Data4[8];
  20601.         } GUID;
  20602.  
  20603.     "
  20604.  
  20605.     "This method only present to prevent auto-generation from stdole type library
  20606.  
  20607.     self
  20608.         defineField: #Data1 type: DWORDField new offset: 0;
  20609.         defineField: #Data2 type: WORDField new offset: 4;
  20610.         defineField: #Data3 type: WORDField new offset: 6;
  20611.         defineField: #Data4 type: (ArrayField type: ByteArray length: 8) offset: 8.
  20612.     self byteSize: 16"
  20613.  
  20614.  
  20615. !
  20616.  
  20617. elementSize
  20618.     "Private - Answer the size (in bytes) of the structure the receiver represents
  20619.     when used as an array element."
  20620.  
  20621.     ^self byteSize!
  20622.  
  20623. ΣH"06░╗+9┐≤╠#ï;Φ╞ⁿíö╛¥σ¼√│RW║√ì;RFE┼ü,âWAj2~K
  20624. ΣÅUU2]╢G░«~║▌N╗ñ≈è°Åçf[kn╬ⁿl ╝╚┘MÖ₧{║P÷rûAΦYFxî÷█AêGfó0ôå┌µ╔αdüù█çt
  20625. ε¡^J╢e~É▒s╫╤[εS*╧K╙²>-╣╬v╞K|╙q≤▒Θ)┌ɱ≡Σ║τ ∙▓▀`k OS?t'ïPú,#tCV⌠zºxπ¿_K=O_▀█o░v2á▀°£┴!
  20626.  
  20627. fromAddress: ptr
  20628.     "Answer a new instance of the receiver with contents copied from
  20629.     the  GUID pointed at by ptr"
  20630.  
  20631.     ^ptr asExternalAddress
  20632.         replaceBytesOf: self new
  20633.         from: 1 to: 16 startingAt: 1!
  20634.  
  20635. fromBytes: guidBytes
  20636.     "Answer a new instance of the receiver which is a copy of the specified bytes."
  20637.  
  20638.     ^guidBytes replaceBytesOf: self new from: 1 to: self byteSize startingAt: 1
  20639. !
  20640.  
  20641. fromString: aString
  20642.     "Answer a new instance of the receiver instantiated from the argument, aString,
  20643.     which is in Microsoft(tm) GUID format.
  20644.     Implementation Note: Subclasses override this because OLE defines more specific
  20645.     functions for that purpose, which we use to be good boys, even though it appears not
  20646.     to be necessary (i.e. if we drop down a level and use the underlying
  20647.     RPC library function, it works anyway)."
  20648.  
  20649.     | answer status |
  20650.     answer := self newNull.
  20651.     (status := RPCLibrary default uuidFromString: (aString copyFrom: 2 to: aString size - 1) uuid: answer) == 0
  20652.         ifFalse: [RPCError signalWith: status].
  20653.     ^answer!
  20654.  
  20655. init: addressOrBytes
  20656.     "Initialize an instance of the structure which instances of the receiver wrap
  20657.     which resides at the specified address."!
  20658.  
  20659. initialize
  20660.     "Private - Initialize the receiver's class variables.
  20661.         GUID initialize
  20662.     "
  20663.     self extraInstanceSpec: self byteSize!
  20664.  
  20665. new
  20666.     "Answer a new, null, instance of the receiver."
  20667.  
  20668.     ^self new: self byteSize!
  20669.  
  20670. newBuffer
  20671.     "Answer a new instance containing its own buffer."
  20672.  
  20673.     ^self newNull
  20674. !
  20675.  
  20676. newNull
  20677.     "Answer a new, null, instance of the receiver."
  20678.  
  20679.     ^self new!
  20680.  
  20681. newUnique
  20682.     "Answer a new instance of the receiver generated using the standard
  20683.     algorithm (i.e. the answer should be unique)."
  20684.  
  20685.     | answer |
  20686.     answer := self new.
  20687.     RPCLibrary default uuidCreate: answer.
  20688.     ^answer!
  20689.  
  20690. null
  20691.     "Answer a null instance of the receiver."
  20692.  
  20693.     Null isNil ifTrue: [Null := self newNull].
  20694.     ^Null!
  20695.  
  20696. onPreStripImage
  20697.     "Private - Tidy up the receiver's lazily initialized class vars in preparation for image stripping."
  20698.  
  20699.     self uninitialize!
  20700.  
  20701. ±V.!!í¢:&╛ê₧-É2Σ┌√û╛╓═╥É≤¿V║╖┼vwME╤▐~W¢ZI.kHP+°àKc%[¬s]y°δ)⌠┌K╗≈╕É¡Åàs[
  20702. │■] º▀┴MM╒[╙1páFñ|ä╝PAI7⌠pÅ╦M▄Cf½1╓£╫╢┼«`£ æÅÜ}º■Y▒t oçΓ6╨╦ΦO;├╬÷m=Θ╥l╓Cl╠:é╚æAu╛≡┤╛ìl┴αaN╛σªFBcIGKr:ïJΓ7dBU╟ìÅ▓Z5AI▐┴-Æ₧⌡æΣ┘M┴ùÑΦ⌐δ»ë ├:GR▓x╝ qLßú`╨yT■J▐àû¥▄┘╗»ï(¥<┐fσ6╓Σ╕╓    i|[k#Tÿ>ò├?pön▀uƒKp»n æ╗w╩ e]╞ΓαB%*_>╫┘╟╘Aö»$▓·M▀öæ╬#1^T╨░&;ùià╗╠▌N╛┐≥│┬¥╬êPÑ─WS7╡₧¢Qª@─ P≥¡Ö└àe,╫ƒ óà⌠Qº╣≥:¬N9wüτΘE├í ÿª»SÅÅ¡=│╝│¢iò╕¡p√φ#oê╜`-╕τÿò╒H<.úSB⌐╛┼~.▐┼ñ
  20703. ºï÷+╦╡ZΘ<3┐╩4X°2J∞₧·╙°}·è╤▐∞╦┤v/5░mrÉ1îæ⌐.â≥┼ó!!ñ=LX┘`R'àúç|K╢v⌐╘V7c╤╟áw▐ⁿ∩6ⁿI╟|}¬âôßL₧{w≥ï±R];åz|XUδ.α`ö╠²^Wí»╞╦K¡╞╤│|ZP─X_²W}¼A:V╟?╔ªÄ_ =µⁿvƒΘ]ïöÖüs▒Sl5O+[≥+╤ú╨d╔èT¬k∙ú~╞áτg▄*z,ZªúÜl╒╕⌠╕^╬ε    /σ/#ª╚=&¼╨]∙æ3╫δz(▓¥]ºÖââ¢L╞E:╩<<ö5F─¢WBcL╡°»√á*▓KKhÆá-òÉ╒;ü╢~<UZ∩!!Ü@e≤Çτε'A3¿²╠Θ7σ⌐4{ß┼£dÖK┼Ñ;δl┘OWΘæ6óX╞≡╤£dº▓J[7~(║φ╜aªI≈╔┤Ñ┘æ[┘╔▄δΘ~ΦS╥╓┐ñφ|░ìù≡íK┘v╕»H▄ΘE╒┤∞YP!!E╜VAX/D÷·u:ë3q█8+J√ç╒<lα▌πy║óEαΩ░1ÅzF φ!
  20704.  
  20705. ±V.!! ░¥'*«Åà/ë;╗ö∙═∞╙┌╞╜▓¼]G╢⌐┼xgAY▄ùd₧Q@#|Hd¼┴
  20706. Xt!!J╖9α¢2≤╚C¡≈·▐╨╩àuJ.aÜ»y ╗╩╘LZÉVòpóG÷yò⌡_F1εj▀╙\ÅQu½|▄£╫∙î┤{ìM├ïåh»≤[Aæt~âΓmƃKµS(╔Kû{ÖDg÷╒8╓JkÇ)░╬èEv┐½╕·σ½µi^╝Σ≥%R]&n╕+╤3BlàW█ÿÑ\~? Üû&ƒRBé°╘°∩qß╣ê╦ô;▒ú╟┬2R ║<ázKτ╢l╥36åoùÅùç═Mÿ┬╠ΘLτ\]╨╚>╒δ²╥H}N@2 w╜°9`╦t╝A╧F₧teƒ⌡4∩91N▌í√B#?^mû╙┬╒A àφH+ú÷Fæ█▌*┤AR94┌Σ!!3É`ñ∩╩╟╕»π│ïì┬ZÉ\ö¥US~α¢ü┬8╛+ rÆ╫á▄╠1eí¢>«ë≥X■╣φ(æDu$╟╟ ∞E├í$ë½╗âòC¬*ùá¿╧:ï░Ö0ÆÄXí╗>d╛⌡╩╠É!
  20707.  
  20708. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ú╕3⌡▌K╝▓│▐α╞╫`V.r▀┐h;╕╠╥
  20709. °|■|ÉP│qûA≥PB !
  20710.  
  20711. uninitialize
  20712.     "Private - Tidy up the receiver in preparation for removal from the system."
  20713.  
  20714.     Null := nil.
  20715.     VMLibrary default registryAt: #GUID put: nil! !
  20716.  
  20717. !GUID methodsFor!
  20718.  
  20719. _collate: comperand
  20720.     "Private - Answer the ordering relationship between the receiver
  20721.     and the argument, comperand."
  20722.  
  20723.     | status answer |
  20724.     status := ByteArray newFixed: 4.
  20725.     answer := RPCLibrary default uuidCompare: self uuid2: comperand status: status.
  20726.     status := status dwordAtOffset: 0.
  20727.     status == 0 ifFalse: [RPCError signalWith: status].
  20728.     ^answer!
  20729.  
  20730. = comperand
  20731.     "Answer whether the receiver is equivalent to the <Object>, comperand."
  20732.  
  20733.     ^self species = comperand species and: [(self _collate: comperand) == 0]!
  20734.  
  20735. asByteArray
  20736.     "Answer the raw contents of the receiver as a byte array."
  20737.  
  20738.     ^self yourAddress asExternalAddress copyFrom: 1 to: self size!
  20739.  
  20740. αW?=º¢_C╙δ¡$û(Σ╞»╪÷╥ƒëæ≡»V@½σÇmrDC╫─,WçMA9kUGn ╢âr.JπnViºó6 ╠ B┼▌┌⌠₧±¢r!
  20741.  
  20742. asString
  20743.     "Answer a string representation of the receiver.
  20744.     Implementation Note: We want to use the standard COM string
  20745.     representation, so we need to add curly brackets. We could use the 
  20746.     COM function, but that would mean creating a dependency on 
  20747.     OLELibrary."
  20748.  
  20749.     | sz |
  20750.     sz := self stringSize.
  20751.     ^(String new: sz)
  20752.         at: 1 put: ${;
  20753.         replaceFrom: 2
  20754.             to: sz - 1
  20755.             with: self idlString
  20756.             startingAt: 1;
  20757.         at: sz put: $};
  20758.         yourself!
  20759.  
  20760. displayOn: target
  20761.     "Append an 'end-user suitable' textual representation of the receiver to the
  20762.     <puttableStream> argument, target.
  20763.     GUIDs are a fairly technical concept, but they do appear in the registry in a
  20764.     certain format, which we use here."
  20765.  
  20766.     target nextPutAll: self asString!
  20767.  
  20768. hash
  20769.     "Answer the SmallInteger hash value for the receiver.
  20770.     For correctness (we have overridden #= to use an external
  20771.     comparison) use the correct RPC library function."
  20772.  
  20773.     | status hash |
  20774.     status := ByteArray newFixed: 4.
  20775.     hash := RPCLibrary default uuidHash: self status: status.
  20776.     status := status dwordAtOffset: 0.
  20777.     ^status == 0 
  20778.         ifTrue: [hash]
  20779.         ifFalse: [RPCError signalWith: status]!
  20780.  
  20781. idlString
  20782.     "Answer the IDL string representation of the receiver."
  20783.  
  20784.     | pSz answer sz status |
  20785.     pSz := ExternalAddress new.
  20786.     (status := RPCLibrary default uuidToString: self stringUuid: pSz) == 0 
  20787.         ifFalse: [RPCError signal: status].
  20788.     UserLibrary default stringUpper: pSz.
  20789.     answer := String fromAddress: pSz.
  20790.     RPCLibrary default rpcStringFree: pSz.
  20791.     ^answer!
  20792.  
  20793. isNull
  20794.     "Answer whether the receiver is a null external data item
  20795.     (that is, a null pointer, or a nilled out structure)."
  20796.  
  20797.     ^self = self class null!
  20798.  
  20799. notNull
  20800.     "Answer whether the receiver is a null external data item
  20801.     (that is, a null pointer, or a nilled out structure)."
  20802.  
  20803.     ^self isNull == false!
  20804.  
  20805. printOn: aStream
  20806.     "Append a textual representation of the receiver to aStream."
  20807.  
  20808.     aStream
  20809.         basicPrint: self;
  20810.         nextPut: $(;
  20811.         display: self;
  20812.         nextPut: $)!
  20813.  
  20814. replaceBytesOf: aByteObject from: start to: stop startingAt: fromStart
  20815.     "Private - Standard method for transfering bytes from one variable
  20816.     byte object to another, normally double dispatched from #replaceFrom:to:with:startingAt:
  20817.  
  20818.     Primitive Failure Reasons:
  20819.         0     - fromStart is not a SmallInteger.
  20820.         1    - stop is not a SmallInteger.
  20821.         2    - start is not a SmallInteger.
  20822.         3    - aByteObject is not a byte object
  20823.         4    - 'from' or 'to' interval is out-of-bounds
  20824.     "
  20825.  
  20826.     | fromOffset |
  20827.     <primitive: 142>
  20828.     fromOffset := fromStart - start.
  20829.     stop to: start by: -1 do: [:i | aByteObject at: i put: (self basicAt: i + fromOffset)].
  20830.     ^aByteObject!
  20831.  
  20832. species
  20833.     "Answer the preferred class of the receiver - not always the same as the
  20834.     answer to #class (in this case the species of GUID and its subclasses 
  20835.     is always GUID)."
  20836.  
  20837.     ^GUID!
  20838.  
  20839. stringSize
  20840.     "Answer the number of characters in a GUID string."
  20841.  
  20842.     ^38!
  20843.  
  20844. value: guidBytes
  20845.     "Set the raw binary value of the receiver from those of the argument."
  20846.  
  20847.     guidBytes replaceBytesOf: self from: 1 to: self class byteSize startingAt: 1! !
  20848.  
  20849. HistoryList comment:
  20850. 'HistoryList maintains a list of recent visits which can be navigated back and forth, with similar behaviour to a Web browser''s history list.
  20851.  
  20852. Instance Variables:
  20853.     history        <OrderedCollection>. The history, oldest first.
  20854.     position        <integer>. Current position in the history, usually points at most recent visit.
  20855.     maxAge        <integer>. Maximum size to which the history list can grow before older items are discarded.'!
  20856. !HistoryList class methodsFor!
  20857.  
  20858. new
  20859.     "Answer a new initialized instance of the receiver
  20860.     with capacity for the default maximum number of
  20861.     items."
  20862.  
  20863.     ^self new: 100!
  20864.  
  20865. new: maxAge
  20866.     "Answer a new initialized instance of the receiver
  20867.     with capacity for the specified maximum number of items."
  20868.  
  20869.     ^super new initialize: maxAge! !
  20870.  
  20871. !HistoryList methodsFor!
  20872.  
  20873. addLast: location
  20874.     "Add a visit to the <Object>, location, to the receiver's history list after the
  20875.     current position such that it becomes current. Any history which was 
  20876.     forward of the previous position is discarded."
  20877.  
  20878.     position = history size 
  20879.         ifFalse: 
  20880.             [" Discard anything forward of this point"
  20881.  
  20882.             self clearFuture].
  20883.     position = maxAge 
  20884.         ifTrue: 
  20885.             [| newHistory |
  20886.             history := (history copyLikeOfSize: maxAge)
  20887.                         replaceFrom: 1
  20888.                             to: maxAge - 1
  20889.                             with: history
  20890.                             startingAt: 2;
  20891.                         at: maxAge put: location;
  20892.                         yourself]
  20893.         ifFalse: 
  20894.             [history addLast: location.
  20895.             position := position + 1]!
  20896.  
  20897. clearFuture
  20898.     "Clear the future sequence in the receiver forward of the current position."
  20899.  
  20900.     self hasFuture ifTrue: [
  20901.         history := history copyFrom: 1 to: position]!
  20902.  
  20903. clearPast
  20904.     "Clear the past sequence in the receiver before the current position."
  20905.  
  20906.     self hasPast ifTrue: [
  20907.         history := history copyFrom: position to: history size.
  20908.         position := self isEmpty ifTrue: [0] ifFalse: [1]].!
  20909.  
  20910. close
  20911.     "Relinquish any external resources associated with the receiver, and put the
  20912.     receiver into a 'closed' state (as appropriate to the subclass). Answer the receiver."
  20913.  
  20914.     self initialize: maxAge!
  20915.  
  20916. contents
  20917.     "Answer all of the objects in the collection accessed by the receiver.
  20918.     Generally the collection will be the same class as the one accessed by the receiver."
  20919.  
  20920.     ^history!
  20921.  
  20922. current
  20923.     "Answer the current location in the history list.
  20924.     Raise a <BoundsError> exception if the list is empty."
  20925.  
  20926.     ^history at: position!
  20927.  
  20928. current: location
  20929.     "Replace the current location in the history list with
  20930.     the specified new location.
  20931.     Raise a <BoundsError> exception if the list is empty."
  20932.  
  20933.     history at: position put: location!
  20934.  
  20935. futureSize
  20936.     "Answer the number of visits in the history which were made after the
  20937.     current one."
  20938.  
  20939.     ^history size - position!
  20940.  
  20941. goBack: count
  20942.     "Move back up to <Integer> count positions in the receiver's history list.
  20943.     This will increase the forward history by that amount"
  20944.  
  20945.     self position: ((position - count) max: 0).
  20946.     ^self isEmpty ifFalse: [self current]!
  20947.  
  20948. goForward: count
  20949.     "Move forward up to <Integer> count positions in the receiver's history list.
  20950.     This will increase the backward history by that amount."
  20951.  
  20952.     position := (position + count) min: history size.
  20953.     ^self current
  20954.     !
  20955.  
  20956. hasFuture
  20957.     "Answer whether their are an future visits in the receiver."
  20958.  
  20959.     ^self futureSize > 0!
  20960.  
  20961. hasPast
  20962.     "Answer whether there are any past visits in the receiver."
  20963.  
  20964.     ^self pastSize > 0!
  20965.  
  20966. initialize: max
  20967.     "Private - Initialize the receiver's instance variables."
  20968.  
  20969.     history := OrderedCollection new.
  20970.     position := 0.
  20971.     maxAge := max!
  20972.  
  20973. isEmpty
  20974.     "Answer whether the receiver's past history is empty."
  20975.  
  20976.     ^position == 0!
  20977.  
  20978. next
  20979.     "Answer the next item in the receiver's future sequence after the current
  20980.     position, or raise a BoundsError if none."
  20981.  
  20982.     ^history at: position + 1!
  20983.  
  20984. next: count
  20985.     "Answer up to<Integer> count visits after the current position.
  20986.     The current position is unaffected."
  20987.  
  20988.     ^history copyFrom: position + 1 to: (position + count min: history size)!
  20989.  
  20990. past
  20991.     "Answer the past sequence values from the receiver, in descending chronological
  20992.     order (i.e. most recent visits first). The current position is unaffected."
  20993.  
  20994.     ^self previous: self pastSize
  20995. !
  20996.  
  20997. pastSize
  20998.     "Answer the number of visits in the history which were made before the
  20999.     current one."
  21000.  
  21001.     ^position - 1!
  21002.  
  21003. position
  21004.     "Answer the receiver's current position reference for accessing the collection.
  21005.     This will be zero if the receiver has no visit history."
  21006.  
  21007.     ^position
  21008. !
  21009.  
  21010. position: anInteger
  21011.     "Set the receiver's current position reference for accessing the collection
  21012.     to the the argument, anInteger. If the argument is not within the bounds of
  21013.     the receiver's collection, report an error."
  21014.  
  21015.     (anInteger between: 0 and: history size)
  21016.         ifTrue: [position := anInteger]
  21017.         ifFalse: [^self errorSubscriptBounds: position]
  21018. !
  21019.  
  21020. previous
  21021.     "Answer the previous item in the receiver's past sequence immediately 
  21022.     before the current position, or raise a BoundsError error if none."
  21023.  
  21024.     ^history at: position - 1!
  21025.  
  21026. previous: count
  21027.     "Answer up to <Integer> count previous visits, in descending chronological
  21028.     order (i.e. most recent visits first). The current position is unaffected."
  21029.  
  21030.     ^(history copyFrom: position - (count min: position-1) to: position - 1) reverse!
  21031.  
  21032. removeMatching: discriminator
  21033.     "Remove those items from the history list for which the <monadicValuable>, discriminator, evaluates
  21034.     to true. This is useful when a UI item is removed so that it can no longer be visited. The current position
  21035.     is maintained if possible."
  21036.  
  21037.     | newHistory oldPosition |
  21038.     newHistory := history class new: history size.
  21039.     oldPosition := position.
  21040.     history keysAndValuesDo: [:i :each | 
  21041.         (discriminator value: each) 
  21042.             ifTrue: [
  21043.                 "If removing a past sequence value, then need to shift current position back too"
  21044.                 i <= oldPosition ifTrue: [position := position - 1]]
  21045.             ifFalse: [newHistory addLast: each]].
  21046.     history := newHistory.
  21047.     position < 0 ifTrue: [position := 0]
  21048.     !
  21049.  
  21050. reset
  21051.     "Set the receiver's position reference to the beginning of the collection"
  21052.  
  21053.     self position: 0
  21054. !
  21055.  
  21056. setToEnd
  21057.     "Set the receivers position reference to the end of the collection."
  21058.  
  21059.     position := history size!
  21060.  
  21061. skip: count
  21062.     "Move the current position in the history list by the specified <integer> number
  21063.     of positions."
  21064.  
  21065.     self position: position + count!
  21066.  
  21067. upToEnd
  21068.     "Answer the future sequence values after the current position in the receiver."
  21069.  
  21070.     ^self next: self futureSize!
  21071.  
  21072. visit: item
  21073.     "Record a new visit to the <Object>, item, unless already visiting that object."
  21074.  
  21075.     (self isEmpty or: [self current ~= item])
  21076.         ifTrue: [self addLast: item]
  21077.         ifFalse: [self current: item]! !
  21078.  
  21079. ImageManager comment:
  21080. ''!
  21081. !ImageManager class methodsFor!
  21082.  
  21083. new
  21084.     "Answer a new initialized instance of the receiver."
  21085.  
  21086.     ^super new initialize!
  21087.  
  21088. stbConvertFrom: anSTBClassFormat 
  21089.     "Version 1 adds backcolor and maskcolor instance variables."
  21090.  
  21091.     ^
  21092.     [:data | 
  21093.     | newInstance |
  21094.         newInstance := self basicNew.
  21095.         1 to: data size do: [:i | newInstance instVarAt: i put: (data at: i)].
  21096.         newInstance]!
  21097.  
  21098. stbVersion
  21099.     "Answer the current binary filer version number for instances of the receiver."
  21100.  
  21101.     ^1! !
  21102.  
  21103. !ImageManager methodsFor!
  21104.  
  21105. addImage: anImage
  21106.     "Adds the <image>, anImage, to the receiver if it is not already there. All objects to be added
  21107.     to an ImageManager must respond to #addToImageList: to actually perform the addition
  21108.     (they need not actually be sub-instances of class <Image>).
  21109.     The object is added for all formats i.e. to all of the existing image lists in our imageLists
  21110.     Dictionary. Answers the index of the object in the manager after converting from
  21111.     0 to 1 based."
  21112.  
  21113.     ^self addImage: anImage maskcolor: maskcolor!
  21114.  
  21115. addImage: anImage maskcolor: aColor
  21116.     ^images at: anImage
  21117.         ifAbsentPut: 
  21118.             [| index |
  21119.             imageLists isEmpty 
  21120.                 ifTrue: 
  21121.                     [| extent |
  21122.                     extent := anImage extent.
  21123.                     imageLists at: extent put: (self newImageListWithExtent: extent)].
  21124.             imageLists 
  21125.                 do: [:each | index := (anImage addToImageList: each mask: aColor) + 1].
  21126.             index]!
  21127.  
  21128. addObject: anImage
  21129.     Notification deprecated.
  21130.     ^self addImage: anImage!
  21131.  
  21132. at: anInteger
  21133.     Notification deprecated.     "Use #imageAt: (#at: is an over-generic selector)"
  21134.     ^self imageAt: anInteger
  21135. !
  21136.  
  21137. at: anInteger ifAbsent: exceptionHandler
  21138.     Notification deprecated.
  21139.     ^self at: anInteger ifAbsent: exceptionHandler!
  21140.  
  21141. backcolor
  21142.     "Answer the <Color> used as the background colour of the receiver's 
  21143.     image lists."
  21144.  
  21145.     ^backcolor!
  21146.  
  21147. backcolor: aColor 
  21148.     "Set the <Color> used as the background colour of the receiver's image lists."
  21149.  
  21150.     backcolor := aColor.
  21151.     imageLists do: [:each | each backcolor: aColor]!
  21152.  
  21153. buildImageListWithExtent: aPoint
  21154.     "Private - Build a new image list with the extent specified by the <Point> argument,
  21155.     populating it with all existing images."
  21156.  
  21157.     | newList count ordered |
  21158.     newList := self newImageListWithExtent: aPoint.
  21159.     count := images size.
  21160.     ordered := Array new: images size.
  21161.     images keysAndValuesDo: 
  21162.             [:eachKey :eachValue | 
  21163.             eachValue == 0 ifFalse: [ordered at: eachValue put: eachKey]].
  21164.     1 to: count
  21165.         do: 
  21166.             [:i | 
  21167.             | image |
  21168.             image := ordered at: i.
  21169.             (image isNil ifTrue: [Icon question] ifFalse: [image]) 
  21170.                 addToImageList: newList
  21171.                 mask: maskcolor].
  21172.  
  21173.     "Add the new rendering to our dictionary of those available"
  21174.     imageLists at: aPoint put: newList.
  21175.     ^newList!
  21176.  
  21177. imageAt: anInteger 
  21178.     "Answers the <Image> at the specified <integer> index in the receiver's
  21179.     image lists."
  21180.  
  21181.     ^images keyAtValue: anInteger!
  21182.  
  21183. imageAt: anInteger ifAbsent: exceptionHandler 
  21184.     "Answer the <Image> at the specified <integer> index in the receiver's
  21185.     image lists, or the result of evaluating the <niladicValuable>, exceptionHandler,
  21186.     if there is no image with that key."
  21187.  
  21188.     ^images keyAtValue: anInteger ifAbsent: exceptionHandler!
  21189.  
  21190. imageListWithExtent: aPoint 
  21191.     "Answer the image list for the receiver that has an extent that
  21192.     matches the <Point> argument. If no such list has yet been accessed then a new
  21193.     one is created and all of the existing images are added to it."
  21194.  
  21195.     | imageList |
  21196.     imageList := imageLists at: aPoint ifAbsent: [].
  21197.     (imageList isNil or: [imageList isRealized not]) 
  21198.         ifTrue: [imageList := self buildImageListWithExtent: aPoint].
  21199.     ^imageList!
  21200.  
  21201. indexOf: anImage
  21202.     Notification deprecated.
  21203.     #deprecated. "Over-generic collection selector, use #indexOfImage:"
  21204.     ^self indexOfImage: anImage!
  21205.  
  21206. indexOfImage: anImage
  21207.     "Locates anObject in the receiver and returns the integer index of its image.
  21208.     If anObject has not yet been added to the receiver then it is added automatically.
  21209.     This method is a synonym for #addImage:"
  21210.  
  21211.     ^self addImage: anImage.!
  21212.  
  21213. initialize
  21214.     "Private - Initialize the receiver. An ImageManager maintains a Dictionary of
  21215.     WinImageLists which can be addressed by the extents of the images that
  21216.     they contain. We also construct a Dictionary mapping between objects
  21217.     and their indexes in the various image lists. Any object can therefore
  21218.     ask for its index which will be identical for all the lists."
  21219.  
  21220.     self newImages!
  21221.  
  21222. maskcolor
  21223.     "Answer the <Color> used as the mask colour when loading bitmaps 
  21224.     into the receiver's image lists (i.e. the transparent colour). If the
  21225.     answer is nil then there is no mask colour set."
  21226.  
  21227.     ^maskcolor!
  21228.  
  21229. maskcolor: aColorOrNil
  21230.     "Set <Color> used as the mask colour when loading bitmaps 
  21231.     into the receiver's image lists (i.e. the transparent colour).
  21232.     This must be set before any image lists are created, or they
  21233.     will not have the requisite masking capability."
  21234.  
  21235.     maskcolor := aColorOrNil asParameter = CLR_NONE ifFalse: [aColorOrNil]!
  21236.  
  21237. newImageLists
  21238.     imageLists := LookupTable new!
  21239.  
  21240. newImageListWithExtent: aPoint
  21241.     "Private - Answer a new <WinImageList> appropriately configured to hold images for the receiver
  21242.     of the specified extent."
  21243.  
  21244.     | answer |
  21245.     answer := WinImageList 
  21246.                 newExtent: aPoint
  21247.                 initialSize: images size
  21248.                 masked: maskcolor notNil.
  21249.     answer backcolor: backcolor.
  21250.     ^answer!
  21251.  
  21252. newImages
  21253.     "Private - Initialize the receiver's image data structures."
  21254.  
  21255.     self newImageLists.
  21256.     images := LookupTable new!
  21257.  
  21258. purge
  21259.     "Empty the receiver of all objects"
  21260.  
  21261.     self newImages!
  21262.  
  21263. purgeImages
  21264.     "Private - Frees up all the image resources"
  21265.  
  21266.     Notification signal: 'Purging images from ' , self printString.
  21267.     self newImageLists!
  21268.  
  21269. purgeImagesWithExtent: aPoint
  21270.     "Private - Removes any image list that contains images of extent, aPoint"
  21271.  
  21272.     imageLists removeKey: aPoint
  21273.  
  21274.  
  21275. !
  21276.  
  21277. size
  21278.     "Answer the number of objects that have been added to the receiver"
  21279.  
  21280.     ^images size!
  21281.  
  21282. stbSaveOn: anSTBOutFiler
  21283.     "Save out a binary representation of the receiver to anSTBOutFiler.
  21284.     The WinImageLists held by the receiver cannot be binary filed out. We purge them
  21285.     here so that this is not a necessity. The unfortunate side effect is that the images
  21286.     will have to be rebuilt next time the receiver is accessed. Perhaps it would be better
  21287.     to use a true proxy class to avoid this inefficiency."
  21288.  
  21289.     self purgeImages.
  21290.     super stbSaveOn: anSTBOutFiler! !
  21291.  
  21292. InkStroke comment:
  21293. 'InkStroke consists of an <OrderedCollection> of <Point>s that describe the movement of a pen (or mouse) drawing a single stroke of ink. A <Scribble> presenter operates on a <listModel> of InkStrokes that, when replayed, comprises the scribbled picture.
  21294.  
  21295. Instance Variables:
  21296.     data    <OrderedCollection> of <Points> describing the strokes track.
  21297.  
  21298. '!
  21299. !InkStroke class methodsFor!
  21300.  
  21301. new
  21302.     "Answer an initialized instance of the receiver"
  21303.  
  21304.     ^super new initialize! !
  21305.  
  21306. !InkStroke methodsFor!
  21307.  
  21308. addPoint: aPoint
  21309.     "Adds aPoint to the collection of data points held by the receiver.
  21310.     Answers aPoint"
  21311.  
  21312.     ^data add: aPoint!
  21313.  
  21314. drawOn: aCanvas
  21315.     "Draw the receiver on aCanvas"
  21316.  
  21317.     aCanvas moveTo: data first.
  21318.     data do: [:each | aCanvas lineTo: each].
  21319. !
  21320.  
  21321. initialize
  21322.     "Private - Initialize the receiver"
  21323.  
  21324.     data := OrderedCollection new!
  21325.  
  21326. length
  21327.     "Answer the length of the receiver"
  21328.  
  21329.     | last delta |
  21330.     last := self points first.
  21331.     ^(self points inject: 0 into: [:sum :each | 
  21332.         delta := each-last. last := each. sum+delta r]) rounded!
  21333.  
  21334. points
  21335.     "Answer the collection of <Points> associated with the receiver"
  21336.  
  21337.     ^data!
  21338.  
  21339. printOn: aStream
  21340.     "Append, to aStream, a String whose characters are a description of the receiver as a developer
  21341.     would want to see it."
  21342.  
  21343.     aStream
  21344.         basicPrint: self;
  21345.         nextPut: $(; display: data size; nextPutAll: ' points)'! !
  21346.  
  21347. InputState comment:
  21348. '<InputState> is a singleton responsible for managing the windows message loop and related <Process>es.
  21349.  
  21350. Instance Variables:
  21351.     inputSemaphore    <Semaphore> on which the UI process blocks when the idle (i.e. when message loop is empty).
  21352.     idler        <Process>. The idle process responsible for relinquishing control to Windows when no other Smalltalk <Process>es are ready to run.
  21353.     idleTimer        <WeakArray> holding <window> currently hosting WM_TIMER used to keep background processing operational when running Windows modal msg loops such as those for common dialogs.
  21354.     main        <Process>. The current main UI process.
  21355.     windows        <LookupTable> of <Integer>. Map of window handles to associated Smalltalk windows (usually <View>s).
  21356.     deferredActions    <SharedQueue> of <niladicValuable>. Actions to be processed by the main process when the message loop is empty.
  21357.     lastWindow    <window> that last received a message (cached because most likely to receive next message too).
  21358.     wakeupEvent    <ExternalHandle> of Win32 Event object signalled by the VM when it wants the image to wake up.
  21359.  
  21360. Class Variables:
  21361.     MaxIdleSleep9x        <SmallInteger>. Timeout passed to MsgWaitForMultipleObjects by idle process when on Windows 9x 
  21362.     MaxIdleSleepNT        <SmallInteger>. Timeout passed to MsgWaitForMultipleObjectsEx by idle process when on Windows NT 
  21363.     EnumHandlesDescriptor    <ExternalDescriptor>. Callback descriptor for EnumWindows.
  21364.     UserInterruptSignal        <Signal>. Exception raised when Ctrl+Break key press detected.
  21365.     SamplingInterval        <SmallInteger> interval (measured in full method/blockactivations) between tests of                     system input queue for host system messsages when running background processes.
  21366. '!
  21367. !InputState class methodsFor!
  21368.  
  21369. icon
  21370.     "Answers an Icon that can be used to represent this class"
  21371.  
  21372.     ^##(self) defaultIcon!
  21373.  
  21374. initialize
  21375.     SamplingInterval := 16384.
  21376.     EnumHandlesDescriptor := ExternalDescriptor fromString: 'stdcall: dword handle dword'.
  21377.     MaxIdleSleep9x := 5000.
  21378.     MaxIdleSleepNT := 15000!
  21379.  
  21380. maxIdleSleep9x: aSmallInteger
  21381.     MaxIdleSleep9x := aSmallInteger!
  21382.  
  21383. maxIdleSleepNT: aSmallInteger
  21384.     MaxIdleSleepNT := aSmallInteger!
  21385.  
  21386. new
  21387.     "Answer a new instance of the receiver.
  21388.     Note that the new instance is not registered with the VM."
  21389.     
  21390.     ^super new initialize!
  21391.  
  21392. publishedEventsOfInstances
  21393.         "Answer a Set of Symbols that describe the published events triggered
  21394.         by instances of the receiver."
  21395.     
  21396.         ^super publishedEventsOfInstances
  21397.             add: #aboutToIdle;
  21398.             yourself.
  21399.     ! !
  21400.  
  21401. !InputState methodsFor!
  21402.  
  21403. aboutToForkUI
  21404.     "Private - A new main UI process is being started. Reset any global UI state."
  21405.  
  21406.     Smalltalk at: #Cursor ifPresent: [:cursorClass | cursorClass current: nil]!
  21407.  
  21408. aboutToIdle
  21409.     "The message loop is about to go to sleep - perform any actions necessary before that happens.
  21410.     We inform all views so that they may perform idle time updating of their user interfaces.
  21411.     Note that this is called from the main UI process, NOT the idle process."
  21412.  
  21413.     self uiIdle ifTrue: [
  21414.         "Make sure we have at least one process (the idle process) to run"
  21415.         self ensureIdlerRunning; keepAlive.
  21416.         "Publish that the UI is about to go idle"
  21417.         self trigger: #aboutToIdle]!
  21418.  
  21419. consoleStartup
  21420.     "Private - System startup has entered the second stage, and it is time to reinitialize
  21421.     the user interaction subsystem for a console session."
  21422.  
  21423.     windows := LookupTable new.
  21424.     "#aboutToIdle will not be invoked, so best to to start the idler manually as otherwise
  21425.      an idlePanic interrupt will be sent by the VM"
  21426.     self ensureIdlerRunning!
  21427.  
  21428. createAndRegisterInputSemaphore
  21429.     "Private - Create and register with the VM that aSemaphore is the Semaphore to be signalled when 
  21430.     input is available for the Main UI Process."
  21431.  
  21432.     inputSemaphore := Semaphore new.
  21433.     VMLibrary default registryAt: #InputSemaphore put: inputSemaphore!
  21434.  
  21435. createAndRegisterWakeupEvent
  21436.     "Private - Create and register the Win32 Event object that is signalled by the VM when it wants to wake 
  21437.     up the image from an idle state (i.e. from its call to MsgWaitForMultipleObjects[Ex])."
  21438.  
  21439.     wakeupEvent := KernelLibrary default 
  21440.                 createEvent: nil
  21441.                 bManualReset: false
  21442.                 bInitialState: false
  21443.                 lpName: nil.
  21444.     VMLibrary default registryAt: #WakeupEvent put: wakeupEvent!
  21445.  
  21446. destroyAllWindows
  21447.     "Private - Destroy all top-level Windows."
  21448.  
  21449.     self topLevelWindows do: [:w | w destroy].
  21450.     self purgeDeadWindows!
  21451.  
  21452. ensureIdlerRunning
  21453.     "Private - Ensure that the idle process is still running, and if not restart it."
  21454.  
  21455.     idler isNil ifTrue: [self forkIdler].
  21456.     idler isReady ifFalse: [idler terminate. "auto reforks"]
  21457.     !
  21458.  
  21459. ensureMainRunning
  21460.     main notNil 
  21461.         ifTrue: 
  21462.             [main suspendingList == inputSemaphore ifTrue: [^self].
  21463.             main isAlive 
  21464.                 ifTrue: 
  21465.                     ["Check for break key - inlined to avoid dependency on Keyboard class"
  21466.  
  21467.                     ((UserLibrary default getAsyncKeyState: VK_CANCEL) anyMask: 16r8001) 
  21468.                         ifTrue: [main queueInterrupt: Processor userBreakInterrupt].
  21469.                     ^self]].
  21470.     self forkMain!
  21471.  
  21472. enterIdle
  21473.     "Private - Put the current active process to sleep on the inputSemaphore.
  21474.     This is intended to provide an opportunity for background processes to run.
  21475.     Use with care."
  21476.  
  21477.     self inputSemaphore wait!
  21478.  
  21479. forkIdler
  21480.     "Private - Start a process at the lowest possible priority (system background) to
  21481.     perform idle time processing. The VM scheduler requires that there always be a 
  21482.     process ready to run, and the system idle process is that process. It is designed
  21483.     to put Dolphin to sleep in a CPU-cycle friendly manner by calling the Win32 function
  21484.     MsgWaitForMultipleObjects() to put the main Dolphin thread to sleep.
  21485.     Should the system idle process die for some reason, then another is normally started
  21486.     by the dying idler. If this mechanism fails, then the VM will send an Idle Panic 
  21487.     interrupt to whatever was the last active process, regardless of its state. See 
  21488.     ProcessorScheduler>>idlePanic: for further details.
  21489.     The system idle process is not the appropriate place to perform background processing;
  21490.     simply fork a further Process at #userBackgroundPriority.
  21491.     It is important that any background processes run at a priority below 
  21492.     #userSchedulingPriority, or Windows message starvation could occur."
  21493.  
  21494.     idler := ([
  21495.                 "Notification signal: self class name, ': Starting Idler process...'."
  21496.                 [ 
  21497.                     [self idleLoop] 
  21498.                         on: self userInterruptSignal
  21499.                         do: [:s |     "Assume user really wants to interrupt main UI process"
  21500.                                 self main queueInterrupt: Processor userBreakInterrupt.
  21501.                                 "Must explicitly resume to continue idle loop"
  21502.                                 s resume].
  21503.                 ] ifCurtailed: [
  21504.                     "If the idler terminates for some reason, start another"
  21505.                     Processor activeProcess == idler ifTrue: [self forkIdler]]
  21506.             ] forkAt: Processor systemBasePriority)
  21507.                 name: 'Idler';
  21508.                 yourself!
  21509.  
  21510. forkMain
  21511.     "Private - Start a new Main process at user scheduling priority, which runs until another
  21512.     Process asserts that it is the Main process. Any existing main process will terminate.
  21513.     Answer the new process."
  21514.  
  21515.     self aboutToForkUI.
  21516.     ([main := Processor activeProcess. self mainLoop] 
  21517.         forkAt: Processor userSchedulingPriority)
  21518.         name: 'Main';
  21519.         yourself
  21520. !
  21521.  
  21522. guiStartup
  21523.     "Private - System startup has entered the second stage, and it is time to reinitialize
  21524.     the user interaction subsystem for a GUI session."
  21525.  
  21526.     | oldWindows |
  21527.     oldWindows := windows.
  21528.     lastWindow := nil.
  21529.     windows := LookupTable new.
  21530.     oldWindows notNil ifTrue:
  21531.         [oldWindows do: [:w | w onStartup]]!
  21532.  
  21533. hasVisibleWindows
  21534.     "Private - Answer whether there are any visible windows belonging to the current
  21535.     session still open."
  21536.  
  21537.     "Implementation Note: We use the bare metal UserLibrary functions to avoid any
  21538.     dependency on the existing View classes. This might be important to those wanting
  21539.     to implement their own window class hierarchy."
  21540.  
  21541.     | hDesktop user |
  21542.     user := UserLibrary default.
  21543.     hDesktop := user getDesktopWindow.
  21544.     ^windows anySatisfy: 
  21545.             [:each | 
  21546.             | hWnd |
  21547.             hWnd := each asParameter.
  21548.             hWnd notNil 
  21549.                 and: [hWnd ~= hDesktop and: [(user isWindow: hWnd) and: [user isWindowVisible: hWnd]]]]!
  21550.  
  21551. idle9x
  21552.     "Private - Put the VM thread to sleep until there are messages from the host system, or a timer
  21553.     fires, to prevent unecessary consumption of host system time."
  21554.  
  21555.     "Implementation Note: Windows 95 does not support an alertable wait unfortunately, which means
  21556.     slightly slower overlapped calls. Although MsgWaitForMultipleObjectsEx() is theoretically supported 
  21557.     on Windows 98 there are some bugs in its implementation, and on some early versions of 98 the function 
  21558.     isn't even available, so it is safest to use the     MsgWaitForMultipleObjects()."
  21559.  
  21560.     MemoryManager current aboutToIdle.
  21561.     UserLibrary default 
  21562.         msgWaitForMultipleObjects: 1
  21563.         pHandles: wakeupEvent
  21564.         fWaitAll: false
  21565.         dwMilliseconds: MaxIdleSleep9x
  21566.         dwWakeMask: QS_ALLINPUT.
  21567.     self isInputAvailable 
  21568.         ifTrue: 
  21569.             [self ensureMainRunning.
  21570.             inputSemaphore set]!
  21571.  
  21572. idleLoop
  21573.     "Private - Repeatedly perform system idle processing (this is the control loop of the 
  21574.     Idler process). This loop is intended for system idle processing only, and should be
  21575.     kept simple to avoid instability. Perform user background processing in a background
  21576.     process forked for the purpose."
  21577.  
  21578.     "Implementation Note: The different versions of Windows have different process 
  21579.     synchronization capabilities, so use the best that are reliably available. Note that the 
  21580.     test for the OS version is carried out once, outside the loop."
  21581.  
  21582.     OSVERSIONINFO current isNT 
  21583.         ifTrue: [[Processor activeProcess == idler] whileTrue: [self idleNT]]
  21584.         ifFalse: [[Processor activeProcess == idler] whileTrue: [self idle9x]]!
  21585.  
  21586. idleNT
  21587.     "Private - Put the VM thread to sleep until there are messages from the host system, or a timer
  21588.     fires, to prevent unecessary consumption of host system time. This is called from the idle Process.
  21589.     Implementation Note: This implementation is only suitable for platforms that support
  21590.     MsgWaitForMultipleObjectsEx() with the MWMO_ALERTABLE flag, At the time of
  21591.     writing it appears that there are some bugs in Windows 98's implementation, and on some
  21592.     early versions of 98 the function isn't even available, so it is safest to use the 
  21593.     MsgWaitForMultipleObjects() as on Windows 95 (see idle9x). Therefore this idle loop body
  21594.     is only used by Dolphin 5.0 when on Windows NT4, 2000 and XP."
  21595.  
  21596.     MemoryManager current aboutToIdle.
  21597.     UserLibrary default 
  21598.         msgWaitForMultipleObjectsEx: 1
  21599.         pHandles: wakeupEvent
  21600.         dwMilliseconds: MaxIdleSleepNT
  21601.         dwWakeMask: QS_ALLINPUT
  21602.         dwFlags: MWMO_ALERTABLE.
  21603.     "Rather than use the return value from MsgWaitForMultipleObjectsEx() we call GetQueueStatus().
  21604.      This has the effect of clearing the 'new message' flag so that the next call to MsgWaitFor&c will 
  21605.      not return immediately if the UI loop is blocked for some reason and so is not calling PeekMessage
  21606.     GetMessage (which also clear the flag). This prevents short-cycling where the idle process goes into 
  21607.     a tight loop calling MsgWaitFor&c when the main UI process is put to sleep."
  21608.     self isInputAvailable 
  21609.         ifTrue: 
  21610.             [self ensureMainRunning.
  21611.             inputSemaphore set]!
  21612.  
  21613. idlePanic
  21614.     "Private - The Processor is panicking because it can't find any processes which
  21615.     are prepared to run. This has probably happened due to a deadlock, so terminate
  21616.     the existing idler in an attempt to continue. In order not to terminate the current active 
  21617.     process, fork off a new one to do the termination, at the highest possible priority.
  21618.     When we kill the idler it will get restarted by its termination handler,
  21619.     will notice that the main process is dead, and restart that too if necessary."
  21620.  
  21621.     [self forkIdler] forkAt: Processor timingPriority!
  21622.  
  21623. idler
  21624.     "Private - Answer the Idle Process."
  21625.  
  21626.     ^idler!
  21627.  
  21628. initialize
  21629.     "Private - Initialize the receiver's state instance variables."
  21630.  
  21631.     deferredActions := SharedQueue new.
  21632.     idleTimer := WeakArray with: DeadObject current.
  21633.     windows isNil ifTrue: [windows := LookupTable new].!
  21634.  
  21635. inputSemaphore
  21636.     "Private - Answer the queue empty/not-empty semaphore"
  21637.  
  21638.     ^inputSemaphore!
  21639.  
  21640. isDolphinWindow: hWnd
  21641.     "Answer whether the window with handle, hWnd, is a Dolphin window or not."
  21642.  
  21643.     ^(self windowAt: hWnd ifAbsent: []) notNil!
  21644.  
  21645. isInputAvailable
  21646.     "Private - Answer whether there is any input waiting in the Windows message queue.
  21647.     Note that a true answer does not guarantee that a call to GetMessage() will not block,
  21648.     since pre-processing may remove the messages, therefore this is only an indication
  21649.     that GetMessage() may need to be called (see also #isInputReady:)."
  21650.  
  21651.     "Implementation Note: We want to see if any input is available, not just what new input
  21652.      has arrived since the last call to GetMessage, PeekMessage, or GetQueueStatus, so we
  21653.       have to test against the high word."
  21654.  
  21655.     ^(UserLibrary default getQueueStatus: QS_ALLINPUT) anyMask: ##(QS_ALLINPUT << 16)!
  21656.  
  21657. isInputReady: aMSG
  21658.     "Private - Answer whether there is currently a message waiting in the host system queue
  21659.     (if there is, it is peeked into the argument, aMSG). Reset the VM sample interval too.
  21660.     Does not signal the inputSemaphore, which is left to the caller to do when appropriate."
  21661.  
  21662.     "Implementation Note: We must use PeekMessage() rather than GetQueueStatus() because
  21663.     the latter provides only an indication that a certain sort of input is available, and does not 
  21664.     guarantee that a subsequent call to GetMessage() will not block. Since blocking on 
  21665.     GetMessage() would prevent Dolphin's background green threads from getting any CPU time,
  21666.     we have to peek with the no-remove flag so that if this method answers true it is guaranteed
  21667.     that GetMessage() can be called without it blocking."
  21668.  
  21669.     self primSampleInterval: 0.
  21670.     ^UserLibrary default 
  21671.         peekMessage: aMSG
  21672.         hWnd: 0
  21673.         uMsgFilterMin: 0
  21674.         uMsgFilterMax: 0
  21675.         wRemoveMsg: PM_NOREMOVE!
  21676.  
  21677. keepAlive
  21678.     "Private - Stay-alive test. Sent during idle time to determine if the session
  21679.     needs to stay alive. Detects headless condition and reports to the session
  21680.     manager."
  21681.  
  21682.     self hasVisibleWindows
  21683.         ifFalse: [SessionManager current noVisibleWindows]!
  21684.  
  21685. loopWhile: aBlock
  21686.     "Pump messages until the niladic valuable argument, operation, evaluates to false."
  21687.  
  21688.     "Implementation Note: Host system events are processed at a higher priority to deferred
  21689.     messages queued by this or other processes. A single message of any type is processed
  21690.     before testing again to see if the loop should be terminated. A single deferred message 
  21691.     is processed between each test to see if there are further Windows messages.
  21692.     Generally however the Windows message queue remains empty for long periods, all deferred
  21693.     messages will be processed, and the active process will yield control to lower priority
  21694.     processes (esp. the idle process which puts the whole system to sleep)."
  21695.  
  21696.     | msg |
  21697.     msg := MSG new.
  21698.     
  21699.     [| deferred |
  21700.     
  21701.     [aBlock value ifFalse: [^self].
  21702.     self isInputReady: msg] 
  21703.             whileTrue: [self pumpMessage: msg].
  21704.     (deferred := deferredActions nextNoWait) isNil 
  21705.         ifTrue: [self messageLoopIdle    "Wait till message available"]
  21706.         ifFalse: [deferred value    "Process single deferred message"]] 
  21707.             repeat!
  21708.  
  21709. main
  21710.     "Private - Answer the Main Process"
  21711.  
  21712.     ^main!
  21713.  
  21714. main: aProcess
  21715.     "Private - Set the Main Process to be the argument, aProcess. Any existing main process will drop out
  21716.     of its message loop."
  21717.  
  21718.     main := aProcess!
  21719.  
  21720. mainLoop
  21721.     "Private - Pump messages until the another process assumes the role of main message loop."
  21722.  
  21723.     self loopWhile: [main == Processor activeProcess]
  21724. !
  21725.  
  21726. messageLoopIdle
  21727.     "Private - The message loop has gone idle. Perform various pre-idle activities before
  21728.     putting the current active process to sleep on the inputSemaphore.
  21729.     This is intended to provide an opportunity for background processes to run.
  21730.     #enterIdle should be used in the majority of the cases where some idle time is
  21731.     available, as it doesn't steal too many cycles  and/or cause synchronization problems.
  21732.     Note that this is called from the main UI process, NOT the idle process."
  21733.  
  21734.     self aboutToIdle.
  21735.     self inputSemaphore wait!
  21736.  
  21737. millisecondClockValue
  21738.     "Private - Answer the current value of the system millisecond clock."
  21739.  
  21740.     "Implementation Note: Primitive 174 is actually just a call to the WinMM function timeGetTime()
  21741.     which should be accurate to 1mS (unlike GetTickCount() which is only accurate to 10mS)."
  21742.  
  21743.     <primitive: 174>
  21744.     ^self primitiveFailed!
  21745.  
  21746. onExit
  21747.     "Private - The system is closing down, release system resources."
  21748.  
  21749.     KernelLibrary default closeHandle: wakeupEvent!
  21750.  
  21751. postQuit: anInteger
  21752.     "Private - Initiate graceful system shutdown with the appropriate Windows API call."
  21753.  
  21754.     UserLibrary default postQuitMessage: anInteger!
  21755.  
  21756. preTranslateMessage: aMSG
  21757.     "Private - Pre-dispatch message filter. Answers true if some window consumed
  21758.     the message, or false to have message dispatched as normal."
  21759.  
  21760.     | handle |
  21761.     handle := aMSG hwnd.
  21762.     [handle isNull] whileFalse: 
  21763.             [(self windowAt: handle ifAbsent: []) 
  21764.                 ifNotNil: [:window | (window preTranslateMessage: aMSG) ifTrue: [^true]].
  21765.             handle := UserLibrary default getParent: handle].
  21766.     ^false!
  21767.  
  21768. primaryStartup
  21769.     "Private - Re-initialize the receiver on session startup."
  21770.  
  21771.     self
  21772.         createAndRegisterWakeupEvent;
  21773.         registerAsDispatcher;
  21774.         createAndRegisterInputSemaphore;
  21775.         setSamplingInterval.
  21776.     idler isNil 
  21777.         ifFalse: 
  21778.             [idler kill.
  21779.             idler := nil    "Let a new idler be started later"]!
  21780.  
  21781. primSampleInterval: anInteger
  21782.     "Private - Set the interval (measure in messages) between polls of the host system input queue
  21783.     when running background processes. After anInteger messages following the last invocation
  21784.     of #isInputReady, the VM will test the queue, and will signal the inputSemaphore if there
  21785.     is any input ready. If anInteger is 0, the sample counter is reset to the current sampling
  21786.     interval value (which is answered).
  21787.  
  21788.     Primitive failure reasons:
  21789.         0 -    anInteger is not a SmallInteger.
  21790.  
  21791.     Notes:
  21792.     1) The sampling interval only comes into play when running CPU intensive background Processes - 
  21793.     it has no relevance if you never run lengthy computations in background Processes.
  21794.     2) It determines the frequency with which the VM samples the Windows message queue (it does not
  21795.     seem to be possible to do this using a separate thread as one might wish).
  21796.     2) During normal operation the sampling is suppressed by the main Processes message loop.
  21797.     3) 24576 is a suitable sampling interval for a P100 which will give a responsive UI even when 
  21798.     running CPU intensive background tasks continually. Increasing the value may give a slight 
  21799.     performance boost, but it will probably not be significant, since the sample occupies only a 
  21800.     few extra cycles.
  21801.     4) A value of 32768 on a P100 will introduce slight sluggishness in response to the keyboard 
  21802.     when typing fast (but no worse than some Word Processors!!).
  21803.     5) A value of 65536 will make keyboard response noticeably slothfull.
  21804.     6) It is probably not worth reducing this figure, unless you have a slow machine.
  21805.     7) The sampling can be turned off completely by specifying a value of -1 to #primSampleInterval:,
  21806.     but this will disable CTRL+BREAK, and switching away from background processes, so this should
  21807.     be done programmatically for short periods only.
  21808.     8) NT's scheduling algorithm seems to favour a CPU bound application which frequently tests for
  21809.     waiting messages, and therefore you may find that Dolphin will consume more processor time
  21810.     than other CPU bound background tasks notionally running in the same priority class. To avoid this 
  21811.     behaviour either avoid calculating Pi to millions of places in the background, or disable/extend input 
  21812.     sampling."
  21813.  
  21814.     <primitive: 94>
  21815.     ^self primitiveFailed!
  21816.  
  21817. processDeferredActions
  21818.     "Process all deferred actions. Normally these are processed one at a time when the message queue
  21819.     is found to be empty by the main UI process, but this message can be sent to empty the deferred
  21820.     actions queue if desired."
  21821.  
  21822.     | deferred |
  21823.     [(deferred := deferredActions nextNoWait) isNil] 
  21824.         whileFalse: [deferred value]!
  21825.  
  21826. prod
  21827.     "Prod the message loop into life if sent from a background process.
  21828.     Useful when a background process does something with visual effect that
  21829.     would not be seen unless the message loop comes to life."
  21830.  
  21831.     Processor activeProcess == main ifFalse: [self inputSemaphore signal]!
  21832.  
  21833. pumpMessage: aMSG
  21834.     "Private - Read and dispatch the first pending host system message.
  21835.     If a WM_QUIT is received, then exit Smalltalk."
  21836.  
  21837.     (UserLibrary default getMessage: aMSG hWnd: 0 wMsgFilterMin: 0 wMsgFilterMax: 0) == 0
  21838.         ifTrue: [SessionManager current onQuit: aMSG swParam]
  21839.         ifFalse: [
  21840.             (self preTranslateMessage: aMSG) ifFalse: [
  21841.                 UserLibrary default
  21842.                     translateMessage: aMSG;
  21843.                     dispatchMessage: aMSG]]!
  21844.  
  21845. pumpMessages
  21846.     "Read and dispatch any pending host system messages until the queue is empty.
  21847.     If a WM_QUIT is received, then exit Smalltalk. This can be used from user code
  21848.     to empty the message queue if necessary."
  21849.  
  21850.     | msg |
  21851.     msg := MSG new.
  21852.     self loopWhile: [self isInputReady: msg]!
  21853.  
  21854. purgeDeadWindows
  21855.     "Remove any windows in the windows collection which have a NULL handle.
  21856.     In normal use there will be no such windows, but as a result of errors, debugging
  21857.     sessions, etc, these can arise, so this message is provided to be used to purge
  21858.     any such zombies."
  21859.  
  21860.     | bEnabled |
  21861.     bEnabled := Processor enableAsyncEvents: false.
  21862.     windows := windows select: 
  21863.                     [:each | 
  21864.                     | hWnd |
  21865.                     (hWnd := each asParameter) notNil and: [UserLibrary default isWindow: hWnd]].
  21866.     lastWindow := nil.
  21867.     Processor enableAsyncEvents: bEnabled!
  21868.  
  21869. queueDeferredAction: operation
  21870.     "Queue a niladic valuable (e.g. a MessageSend or niladic block) for deferred evaluation 
  21871.     from the message pump when the Windows message queue is empty."
  21872.  
  21873.     "Implementation Note: We must signal the input semaphore or the action may end up hanging
  21874.     around until the next windows message arrives if the main process is currently idle (i.e.
  21875.     this is not the main process, or does not return to the message loop)."
  21876.  
  21877.     deferredActions nextPut: operation.
  21878.     inputSemaphore set!
  21879.  
  21880. registerAsDispatcher
  21881.     "Private - Notify the VM that the receiver should receive callbacks via the WndProc().
  21882.         SessionManager inputState registerAsDispatcher
  21883.     "
  21884.  
  21885.     VMLibrary default registryAt: #Dispatcher put: self!
  21886.  
  21887. removeWindowAt: aHandle
  21888.     "Private - Unregister a Window object with the specified handle.
  21889.     Implementation Note: Interrupts are disabled to prevent concurrent access to 
  21890.     the windows collection without the possibility of deadlock."
  21891.  
  21892.     | bEnabled |
  21893.     aHandle isNil ifTrue: [^self].
  21894.     bEnabled := Processor enableAsyncEvents: false.
  21895.     windows removeKey: aHandle asInteger ifAbsent: [].
  21896.     lastWindow := nil.
  21897.     Processor enableAsyncEvents: bEnabled!
  21898.  
  21899. setSamplingInterval
  21900.     "Private - Calculate and set sampling interval of approximately 24576 on a P100, 
  21901.     but which is no longer than 2^20 on faster machines and no shorter than 2^14 on 
  21902.     slower ones."
  21903.  
  21904.     | ticks loops startTime |
  21905.     startTime := self millisecondClockValue.
  21906.     loops := 0.
  21907.     
  21908.     [loops := loops + 1.
  21909.     1 to: 68000 do: [:i | ].
  21910.     (ticks := self millisecondClockValue - startTime) <= 0] 
  21911.             whileTrue.
  21912.     SamplingInterval := ((24576 * loops / ticks * 40) asInteger min: ##(2 ** 20)) 
  21913.                 max: ##(2 ** 14).
  21914.     self primSampleInterval: SamplingInterval!
  21915.  
  21916. startIdleTimer: wnd
  21917.     "Private - Start the idle timer (e.g. when a menu is popped), hosted by the
  21918.     window, wnd, which must respond to #asParameter by answering its window
  21919.     handle (it need not be a View). If the idle timer is already active then this do nothing."
  21920.  
  21921.     [ | idleHost hWnd |
  21922.         idleHost := idleTimer basicAt: 1.
  21923.         hWnd := wnd asParameter.
  21924.         (idleHost == DeadObject current 
  21925.                     or: [hWnd isNull or: [(UserLibrary default isWindow: hWnd) not]]) 
  21926.             ifTrue: [
  21927.                 idleTimer basicAt: 1 put: wnd.
  21928.                 UserLibrary default setTimer: hWnd nIDEvent: WM_ENTERIDLE uElapse: 100 lpTimerFunc: nil]
  21929.     ] critical!
  21930.  
  21931. stopIdleTimer: wnd
  21932.     "Private - Stop the idle timer hosted by the window, wnd. If the idle 
  21933.     timer is not actually hosted by aView, then do nothing."
  21934.  
  21935.     [ | idleHost |
  21936.         idleHost := idleTimer basicAt: 1.
  21937.         idleHost == wnd ifTrue: [
  21938.             idleTimer basicAt: 1 put: DeadObject current.
  21939.             UserLibrary default killTimer: wnd asParameter uIDEvent: WM_ENTERIDLE].
  21940.     ] critical!
  21941.  
  21942. topLevelHandlesDo: operation
  21943.     "Private - Enumerate the top-level windows through the monadic valuable, operation,
  21944.     which is expected to answer true to keep enumerating, or false to terminate the
  21945.     enumeration. Answer the result of the terminating enumeration.
  21946.     Implementation Note: The EnumWindowsProc() takes an extra, closure, parameter,
  21947.     which we don't need, so we wrap a monadic valuable in a dyadic callback block.
  21948.  
  21949.         BOOL CALLBACK EnumWindowsProc(
  21950.             HWND hwnd,        // handle of frame window
  21951.             LPARAM lParam        // closure value
  21952.         );
  21953.     "
  21954.  
  21955.     | enumerator result |
  21956.     enumerator := ExternalCallback block: [ :hWnd :lParam | operation value: hWnd ] 
  21957.                 descriptor: EnumHandlesDescriptor.
  21958.     result := UserLibrary default enumWindows: enumerator asParameter lParam: 0.
  21959.     enumerator free.    "not necessary, but helpful"
  21960.     ^result!
  21961.  
  21962. topLevelWindows
  21963.     "Answer a Collection containing all top level windows belonging to the Dolphin 
  21964.     process.
  21965.     Note that this will include windows which are not frame windows (e.g. tool tips),
  21966.     and furthermore it is not lightening fast!!"
  21967.  
  21968.     | shells bEnabled |
  21969.     shells := OrderedCollection new: 20.
  21970.     bEnabled := Processor enableAsyncEvents: false.
  21971.     self topLevelHandlesDo: [:hWnd |
  21972.         windows at: hWnd asInteger ifPresent: [:shell | shells addLast: shell].
  21973.         true "return true to keep enumerating" ].
  21974.     Processor enableAsyncEvents: bEnabled.
  21975.     ^shells!
  21976.  
  21977. uiIdle
  21978.     "Private - Inform the receiver's registered windows that the UI is 
  21979.     going idle so that they can update visual elements accordingly - e.g. 
  21980.     enable/disable toolbar buttons. The windows can do other processing
  21981.     from their idle notification handlers, but it should be of very short
  21982.     duration, or the responsiveness of the UI will be adversely affected."
  21983.  
  21984.     ^self topLevelHandlesDo: 
  21985.             [:each | 
  21986.             self isInputAvailable 
  21987.                 ifTrue: 
  21988.                     [self inputSemaphore set.
  21989.                     false    "stop enumerating"]
  21990.                 ifFalse: 
  21991.                     [self uiIdle: each.
  21992.                     true    "keep enumerating"]]!
  21993.  
  21994. uiIdle: hWnd
  21995.     "Private - If the argument is the handle of one of the receiver's
  21996.     currently visible windows, then request it to update its UI."
  21997.  
  21998.     | shell |
  21999.     shell := self windowAt: hWnd ifAbsent: [^self].
  22000.     shell isWindowVisible ifTrue: [
  22001.         "shell sendMessage: WM_IDLEUPDATECMDUI wParam: 1"
  22002.         shell wmIdleUpdateCmdUI: WM_IDLEUPDATECMDUI wParam: 1 lParam: 0]!
  22003.  
  22004. userInterruptSignal
  22005.     "Answer the UserInterruptSignal."
  22006.  
  22007.     UserInterruptSignal isNil ifTrue: [UserInterruptSignal := Signal resumableDescription: 'User Interrupt'].
  22008.     ^UserInterruptSignal!
  22009.  
  22010. visibleWindows
  22011.     "Private - Answer a collection of the visible windows belonging to the current
  22012.     session."
  22013.  
  22014.     "Implementation Note: We use the bare metal UserLibrary functions to avoid any
  22015.     dependency on the existing View classes. This might be important to those wanting
  22016.     to implement their own window class hieararchy."
  22017.  
  22018.     | hDesktop user |
  22019.     user := UserLibrary default.
  22020.     hDesktop := user getDesktopWindow.
  22021.     ^windows select: 
  22022.             [:each | 
  22023.             | hWnd |
  22024.             hWnd := each asParameter.
  22025.             hWnd notNil 
  22026.                 and: [hWnd ~= hDesktop and: [(user isWindow: hWnd) and: [user isWindowVisible: hWnd]]]]!
  22027.  
  22028. windowAt: aHandle ifAbsent: exceptionHandler
  22029.     "Answers an open window that has a handle of aHandle (an Integer or
  22030.     ExternalHandle). If the handle is nil, then answers nil."
  22031.  
  22032.     | hWnd bEnabled window |
  22033.     aHandle isNil ifTrue: [^exceptionHandler value].
  22034.     hWnd := aHandle asInteger.
  22035.     bEnabled := Processor enableAsyncEvents: false.
  22036.     window := windows at: hWnd ifAbsent: [].
  22037.     Processor enableAsyncEvents: bEnabled.
  22038.     ^window isNil ifTrue: [exceptionHandler value] ifFalse: [window]!
  22039.  
  22040. windowAt: aHandle put: aWindow
  22041.     "Register a Window object (which understands #dispatchMessage:) with the specified
  22042.     handle."
  22043.  
  22044.     | bEnabled |
  22045.     bEnabled := Processor enableAsyncEvents: false.
  22046.     windows at: aHandle asInteger put: aWindow.
  22047.     lastWindow := nil.
  22048.     Processor enableAsyncEvents: bEnabled!
  22049.  
  22050. windows
  22051.     "Private - Answer the collection of all open windows (a <LookupTable> mapping <integer>
  22052.     window handles to <windows>."
  22053.  
  22054.     ^windows!
  22055.  
  22056. wndProc: hWnd message: message wParam: wParam lParam: lParam cookie: cookie 
  22057.     "Private - Dispatch a Windows message to the appropriate event handler of the view
  22058.     whose handle is hWnd. If the window handle is not registered, then the default window 
  22059.     procedure is invoked. 
  22060.     WARNING: This method is an entry point from the VM, and must not be invoked from 
  22061.     Smalltalk code, as it returns directly to the VM as if from a callback. Do not modify or 
  22062.     remove this method."
  22063.  
  22064.     "Implementation Note: The VM sends this message with asynchronous process switching 
  22065.     disabled."
  22066.  
  22067.     | window |
  22068.     lastWindow asParameter = hWnd 
  22069.         ifFalse: 
  22070.             [lastWindow := windows at: hWnd ifAbsent: [].
  22071.             lastWindow isNil ifTrue: 
  22072.                     [^Processor callback: cookie
  22073.                         evaluate: 
  22074.                             [UserLibrary default 
  22075.                                 defWindowProc: hWnd
  22076.                                 msg: message
  22077.                                 wParam: wParam
  22078.                                 lParam: lParam]]].
  22079.     window := lastWindow.
  22080.     ^Processor
  22081.         enableAsyncEvents: true;
  22082.         callback: cookie
  22083.             evaluate: 
  22084.                 [(window 
  22085.                     dispatchMessage: message
  22086.                     wParam: wParam
  22087.                     lParam: lParam) asDword]! !
  22088.  
  22089. Interactor comment:
  22090. ''!
  22091. !Interactor class methodsFor!
  22092.  
  22093. forPresenter: aPresenter
  22094.     ^self basicNew
  22095.         setPresenter: aPresenter!
  22096.  
  22097. new
  22098.     "Use #view:target:"
  22099.  
  22100.     ^self shouldNotImplement! !
  22101.  
  22102. !Interactor methodsFor!
  22103.  
  22104. onCaptureChanged: aViewOrNil 
  22105.     "Default handler for a mouse capture changed event from the event source."
  22106.  
  22107.     ^self presenter onCaptureChanged: aViewOrNil!
  22108.  
  22109. onGetCursor: aSymbol
  22110.     "The named area of the view associated with the receiver has been hit.
  22111.     Answer the appropriate mouse cursor or nil to accept the default."
  22112.  
  22113.     ^self presenter onGetCursor: aSymbol!
  22114.  
  22115. onKeyPressed: aKeyEvent
  22116.     "Default handler for the receiver's view receiving a key press event."
  22117.  
  22118.     ^self presenter onKeyPressed: aKeyEvent!
  22119.  
  22120. onKeyReleased: aKeyEvent
  22121.     "Default handler for the receiver's view receiving a key up event."
  22122.  
  22123.     ^self presenter onKeyReleased: aKeyEvent!
  22124.  
  22125. onKeyTyped: aKeyEvent
  22126.     "Default handler for the receiver's view receiving a key entry."
  22127.  
  22128.     ^self presenter onKeyTyped: aKeyEvent!
  22129.  
  22130. onLeftButtonDoubleClicked: aMouseEvent 
  22131.     "Default handler for a mouse left button double-click event."
  22132.  
  22133.     ^self presenter onLeftButtonDoubleClicked: aMouseEvent!
  22134.  
  22135. onLeftButtonPressed: aMouseEvent 
  22136.     "Default handler for a mouse left button down event."
  22137.  
  22138.     ^self presenter onLeftButtonPressed: aMouseEvent!
  22139.  
  22140. onLeftButtonReleased: aMouseEvent 
  22141.     "Default handler for a mouse left button up event."
  22142.  
  22143.     ^self presenter onLeftButtonReleased: aMouseEvent!
  22144.  
  22145. onMiddleButtonDoubleClicked: aMouseEvent 
  22146.     "Default handler for a mouse middle button double-click event."
  22147.  
  22148.     ^self presenter onLeftButtonDoubleClicked: aMouseEvent!
  22149.  
  22150. onMiddleButtonPressed: aMouseEvent 
  22151.     "Default handler for a mouse middle button down event."
  22152.  
  22153.     ^self presenter onMiddleButtonPressed: aMouseEvent!
  22154.  
  22155. onMiddleButtonReleased: aMouseEvent 
  22156.     "Default handler for a mouse middle button up event."
  22157.  
  22158.     ^self presenter onMiddleButtonReleased: aMouseEvent!
  22159.  
  22160. onMouseMoved: aMouseEvent
  22161.     "Default handler for a mouse move event over the
  22162.     receiver's view."
  22163.  
  22164.     ^self presenter onMouseMoved: aMouseEvent!
  22165.  
  22166. onMouseWheeled: aMouseEvent 
  22167.     "Default handler for a mouse wheel movement event."
  22168.  
  22169.     ^self presenter onMouseWheeled: aMouseEvent!
  22170.  
  22171. onRightButtonDoubleClicked: aMouseEvent
  22172.     "Default handler for a mouse Right button double-click event."
  22173.  
  22174.     ^self presenter onRightButtonDoubleClicked: aMouseEvent!
  22175.  
  22176. onRightButtonPressed: aMouseEvent
  22177.     "Default handler for a Right button down mouse event."
  22178.  
  22179.     ^self presenter onRightButtonPressed: aMouseEvent!
  22180.  
  22181. onRightButtonReleased: aMouseEvent
  22182.     "Default handler for a Right button up mouse event."
  22183.  
  22184.     ^self presenter onRightButtonReleased: aMouseEvent!
  22185.  
  22186. presenter
  22187.     ^presenter!
  22188.  
  22189. setPresenter: aPresenter 
  22190.     "Private - Initialise the receiver's instance variables. Answer the receiver."
  22191.  
  22192.     presenter := aPresenter.
  22193.     ^self!
  22194.  
  22195. view
  22196.     ^self presenter view! !
  22197.  
  22198. Keyboard comment:
  22199. ''!
  22200. !Keyboard class methodsFor!
  22201.  
  22202. default
  22203.     "Answers the default Keyboard to use"
  22204.  
  22205.     DefaultInstance isNil ifTrue: [self default: self new initialize].
  22206.     ^DefaultInstance!
  22207.  
  22208. default: aKeyboard
  22209.     "Assigns the default Keyboard"
  22210.  
  22211.     DefaultInstance := aKeyboard!
  22212.  
  22213. initialize
  22214.     "Private - Initialize the receiver's class variables.
  22215.  
  22216.     Evaluate me to initialize:
  22217.         Keyboard initialize
  22218.     "
  22219.  
  22220.     self initializeVKeyMap!
  22221.  
  22222. initializeVKeyMap
  22223.     "Private - Initialize the receiver's map between virtual 
  22224.     key names, and key codes. This depends on the installed 
  22225.     keyboard layout, so needs to be performed on
  22226.     image startup/system reconfiguration, however that may upset
  22227.     our resource definitions."
  22228.  
  22229.     VirtualKeys := LookupTable new.
  22230.  
  22231.     "First determine the names of all the VK_XX definitions in Win32Constants"
  22232.     (Smalltalk at: #Win32Constants) keysAndValuesDo: 
  22233.             [:eachKey :v | 
  22234.             (eachKey beginsWith: 'VK_') 
  22235.                 ifTrue: 
  22236.                     [VirtualKeys 
  22237.                         at: (self keyNameFromVKey: v ifNone: [eachKey copyFrom: 4 to: eachKey size]) asUppercase
  22238.                         put: v]].
  22239.  
  22240.     "In order to represent the extended keys on the numeric pad (which 
  22241.     are also the extended keys on the AT keyboard) without getting them 
  22242.     confused with the numeric keys, we or in the extended key bit which
  22243.     appears in the scan code. This bit is then preserved when converting
  22244.     to the scan code, and hey presto we have the correct scan code.
  22245.     HOWEVER, be careful to always bitAnd: any virtual key code with 16rFF
  22246.     to ensure it is valid."
  22247.     (33 to: 40) , (45 to: 46) , (144 to: 144) do: 
  22248.             [:i | 
  22249.             | vk |
  22250.             vk := i bitOr: 256.
  22251.             VirtualKeys at: (self keyNameFromVKey: vk) asUppercase put: vk].
  22252.     VirtualKeys at: 'DELETE'
  22253.         ifPresent: 
  22254.             [:k | 
  22255.             "We also use an abbreviated name for this one"
  22256.             VirtualKeys at: 'DEL' put: k].
  22257.     VirtualKeys shrink!
  22258.  
  22259. keyNameFromLParam: lParam
  22260.     "Private - Answer the name of the specified key.
  22261.     Answers nil if the key cannot be translated."
  22262.  
  22263.     | buf len |
  22264.     buf := String new: 32.
  22265.     len := UserLibrary default
  22266.             getKeyNameText: lParam lpString: buf nSize: buf basicSize+1.    "includes null term"
  22267.     "Despite what the help says, the function does not call SetLastError(), so no
  22268.     point signalling a system error here"
  22269.     len == 0 ifTrue: [^nil].
  22270.     ^buf leftString: len!
  22271.  
  22272. keyNameFromScanCode: anInteger
  22273.     "Private - Answer the name of the specified key scan code.
  22274.     Answers nil if not translatable.
  22275.     "
  22276.  
  22277.     ^self keyNameFromLParam: "("(anInteger bitShift: 16)" maskSet: ##(1<<25))"!
  22278.  
  22279. keyNameFromVKey: anInteger
  22280.     "Private - Answer the name of the specified virtual key code.
  22281.         Keyboard keyNameFromVKey: 16r0023
  22282.     "
  22283.  
  22284.     ^self
  22285.         keyNameFromVKey: anInteger 
  22286.         ifNone: [self error: 'invalid virtual key ', anInteger displayString]!
  22287.  
  22288. keyNameFromVKey: anInteger ifNone: exceptionHandler
  22289.     "Private - Answer the name of the specified virtual key code,
  22290.     or evaluate the exceptionHandler block if none."
  22291.  
  22292.     | answer |
  22293.     answer := self keyNameFromScanCode: 
  22294.                 ((self vKeyToScanCode: anInteger) bitOr: (anInteger maskClear: 16rFF)).
  22295.     ^answer isNil
  22296.         ifTrue: [exceptionHandler value]
  22297.         ifFalse: [answer]
  22298. !
  22299.  
  22300. onPreStripImage
  22301.     "Private - The image is about to be stripped."
  22302.  
  22303.     self uninitialize!
  22304.  
  22305. uninitialize
  22306.     "Private - Uninitialize the receiver prior to its removal from the image."
  22307.  
  22308.     DefaultInstance := nil.!
  22309.  
  22310. userInterruptSignal
  22311.     Notification deprecated. "Send to SessionManager instead."
  22312.     ^SessionManager inputState userInterruptSignal!
  22313.  
  22314. virtualKey: aString
  22315.     "Answer a virtual key code generated from the virtual key name, aString."
  22316.  
  22317.     ^aString size == 1
  22318.         ifTrue: [aString first asUppercase asInteger]
  22319.         ifFalse: [
  22320.             VirtualKeys
  22321.                 at: aString asUppercase
  22322.                 ifAbsent: [self error: 'Unrecognised virtual key: ''', aString, '''']]!
  22323.  
  22324. vKeyToScanCode: anInteger
  22325.     "Private - Answer the scan code corresponding to the virtual key
  22326.     code, anInteger, or 0 if there isn't one."
  22327.  
  22328.     ^UserLibrary default mapVirtualKey: (anInteger bitAnd: 16rFF) uMapType: 0! !
  22329.  
  22330. !Keyboard methodsFor!
  22331.  
  22332. asyncKeyState: virtualKeyCodeInteger
  22333.     "Private - Answer the state of the specified virtual key."
  22334.  
  22335.     ^UserLibrary default getAsyncKeyState: virtualKeyCodeInteger!
  22336.  
  22337. getState
  22338.     "Private - Refresh the cached Win32 keyboard state ByteArray and answer it."
  22339.  
  22340.     ^(UserLibrary default getKeyboardState: state)
  22341.         ifTrue: [state]
  22342.         ifFalse: [UserLibrary default systemError]!
  22343.  
  22344. initialize
  22345.     "Private - Initialize the receiver."
  22346.  
  22347.     state := ByteArray new: 256
  22348. !
  22349.  
  22350. isAltDown
  22351.     "Answer whether the <ALT> key is down."
  22352.  
  22353.     ^self isKeyDown: VK_MENU!
  22354.  
  22355. isButtonDown: aSymbol 
  22356.     "Answer whether the mouse button identified by the symbolic name (either #left, #right, or #middle)
  22357.     is currently pressed down."
  22358.  
  22359.     ^self 
  22360.         isKeyDown: (##((IdentityDictionary new)
  22361.                 at: #left put: VK_LBUTTON;
  22362.                 at: #right put: VK_RBUTTON;
  22363.                 at: #middle put: VK_MBUTTON;
  22364.                 yourself) at: aSymbol)
  22365.  
  22366. !
  22367.  
  22368. isCancelDown
  22369.     "Answer whether the Cancel (CTRL+BREAK) key is down."
  22370.  
  22371.     ^self isKeyDown: VK_CANCEL!
  22372.  
  22373. isCancelPressed
  22374.     "Answer whether the Cancel (CTRL+BREAK) key has been pressed or is being pressed."
  22375.  
  22376.     ^self isKeyPressed: VK_CANCEL!
  22377.  
  22378. isCtrlDown
  22379.     "Answer whether the <CTRL> key is down."
  22380.  
  22381.     ^self isKeyDown: VK_CONTROL!
  22382.  
  22383. isKeyDown: virtualKeyCodeInteger
  22384.     "Private - Answer whether the specified virtual key is down. Under Windows the high bit of
  22385.     a key state is set when the key is down, and GetKeyState() returns a signed short, so the
  22386.     result key state will be negative if a key is down."
  22387.  
  22388.     ^(self keyState: virtualKeyCodeInteger) < 0!
  22389.  
  22390. isKeyPressed: virtualKeyCodeInteger
  22391.     "Private - Answer whether the specified virtual key has been pressed or is down now.
  22392.     Note this is not a reliable indication, so is only suitable for detecting Ctrl+Break or similar."
  22393.  
  22394.     ^(self asyncKeyState: virtualKeyCodeInteger) anyMask: 16r8001!
  22395.  
  22396. isShiftDown
  22397.     "Answer whether the <SHIFT> key is down."
  22398.  
  22399.     ^self isKeyDown: VK_SHIFT!
  22400.  
  22401. keyState: virtualKeyCodeInteger
  22402.     "Private - Answer the state of the specified virtual key."
  22403.  
  22404.     ^UserLibrary default getKeyState: virtualKeyCodeInteger!
  22405.  
  22406. resetCancel
  22407.     "Reset the Cancel (CTRL+BREAK) key."
  22408.  
  22409.     self resetKey: VK_CANCEL!
  22410.  
  22411. resetKey: virtualKeyCodeInteger
  22412.     "Private - Reset the specified virtual key."
  22413.  
  22414.     self setKeyState: virtualKeyCodeInteger to: 0!
  22415.  
  22416. setKeyState: virtualKeyCodeInteger to: byteMask
  22417.     "Private - Set the Win32 keyboard state of the specified virtual key to the specified byteMask"
  22418.  
  22419.     self getState at: virtualKeyCodeInteger+1 put: byteMask.
  22420.     self setState!
  22421.  
  22422. setState
  22423.     "Private - Modify Win32's keyboard state to that currently cached."
  22424.  
  22425.     UserLibrary default setKeyboardState: state
  22426. ! !
  22427.  
  22428. LayoutManager comment:
  22429. 'LayoutManager is the abstract superclass for classes that wish to implement the <layoutManager> protocol for the automatic arrangement of views within a parent <compositeView>. Dolphin supplies a base set of general purpose concrete layout managers which are general purpose enough to cover most requirements. 
  22430.  
  22431. To define a new layout manager you must implement the <layoutManager> protocol methods in [subclass responsibility].'!
  22432. !LayoutManager class methodsFor!
  22433.  
  22434. icon
  22435.     "Answers an Icon that can be used to represent this class"
  22436.  
  22437.     ^##(self) defaultIcon!
  22438.  
  22439. new
  22440.     "Answer an instance of the receiver. Instances require initialization"
  22441.  
  22442.     ^super new initialize! !
  22443.  
  22444. !LayoutManager methodsFor!
  22445.  
  22446. arrangementAspect
  22447.         "Private - Answer an Aspect description for the arrangement aspect of Views that
  22448.         are managed by the recever. The default is to allow for a workspace to edit the
  22449.         arrangement"
  22450.     
  22451.         ^Aspect name: #arrangement!
  22452.  
  22453. arrangementOf: aView
  22454.     "Answer the arrangement parameter of aView in the receiver. 
  22455.     If an arrangement parameter has not explicitly been set 
  22456.     then answer nil. Overidden by subclasses that take notice of
  22457.     arrangement parameters"
  22458.  
  22459.     ^nil
  22460.  
  22461. !
  22462.  
  22463. arrangementOf: aView put: anObject
  22464.     "Set the arrangement parameter of aView in the receiver to be anObject.
  22465.     The arrangement parameter has different meanings depending on the 
  22466.     class of the receiver. Overidden by subclasses that take notice of
  22467.     arrangement parameters"
  22468.  
  22469.  
  22470. !
  22471.  
  22472. layoutContainer: aContainerView
  22473.     "Performs a layout operation on the contents in aContainerView"
  22474.  
  22475.     ^self subclassResponsibility!
  22476.  
  22477. preferredLayoutExtentOf: aContainerView
  22478.     "Answer aPoint which is the preferred extent when laying out aContainerView"
  22479.  
  22480.     self subclassResponsibility!
  22481.  
  22482. removeSubView: aView
  22483.     "Remove aView from the collection of views which have been explicitly
  22484.     arranged by the receiver.
  22485.     Answer aView."
  22486.  
  22487.     ^aView
  22488. !
  22489.  
  22490. reposition: aMovedView to: aPoint
  22491.     "Private - The view, aView, has been moved to aPoint. Ask the receiver to do the repositioning
  22492.     and layout all the other views under its jurisdiction. In some circumstances the movement
  22493.     may not be allowed."
  22494.  
  22495.     self layoutContainer: aMovedView parentView!
  22496.  
  22497. resize: aSizedView to: aRectangle
  22498.     "Private - The view, aView, has been resized to aRectangle. Ask the receiver to do the resizing
  22499.     and layout all the other views under its jurisdiction. In some circumstances the resize
  22500.     may not be allowed."
  22501.  
  22502.     self layoutContainer: aSizedView parentView!
  22503.  
  22504. resolutionScaledBy: scale
  22505.     "Private - The receiver is being loaded and it has been determined that the pixel resolution
  22506.     has changed since the point at which the view was saved. Scale any internal pixels by <Point>
  22507.     scale."
  22508.  
  22509.  
  22510. ! !
  22511.  
  22512. Link comment:
  22513. 'Links are records of a reference to another Link, and are used to represent the linked elements of a <LinkedList>.
  22514.  
  22515. Link is an abstract base class which should be subclasses to hold objects of the appropriate type.'!
  22516. !Link class methodsFor!
  22517.  
  22518. nextLink: aLink
  22519.     "Answer a new instance of the receiver which refers to aLink as the
  22520.     link which succeeds it in a LinkedList"
  22521.  
  22522.     ^self new
  22523.         nextLink: aLink;
  22524.         yourself
  22525.  
  22526. ! !
  22527.  
  22528. !Link methodsFor!
  22529.  
  22530. nextLink
  22531.     "Answer the next Link in the list after the receiver"
  22532.  
  22533.     ^nextLink
  22534. !
  22535.  
  22536. nextLink: aLink
  22537.     "Set the next Link referred to by the receiver to a aLink."
  22538.  
  22539.     ^nextLink := aLink! !
  22540.  
  22541. ListViewColumn comment:
  22542. 'ListViewColumn is a description of a column held by a <ListView>. Note that, columns are only displayed when a list is in #report mode.
  22543.  
  22544. Each column is configurable using a number of valuables (usually blocks) which determine how the item objects held by the list are mapped to information to be presented in the column.The first mapping is achieved by the getContentsBlock which, given the list item, determines the object that the column actually represents. How this contents object is then mapped to the displayed text is determined by the getTextBlock. Similarly, the getImageBlock is used to map a contents object to the index of an image to display in the column (the ImageManager that will be used to obtain the actual image is that of the ListView itself). In order to determine how a column will be sorted (an operation that is automatically perform when a column header is clicked) the getSortValueBlock can be set. This takes a contents object and maps it to an appropriate sort value. If it is necessary for a column to display "tip text" then a getInfoTipBlock can be used to specify the mapping between a contents object and this text. The above blocks are initialized to defaults with the following actions:
  22545.  
  22546. getContentsBlock    - use the list item itself (the primary column object).
  22547. getTextBlock    - use #displayString on the contents object.
  22548. getImageBlock    - do not display images.
  22549. getSortValueBlock    - use the contents object itself.
  22550. getTipText    - do not display tip text.
  22551.  
  22552. One other ListViewColumn aspect worthy of note is #isAutoResize. Normally, columns have a fixed width (specified by the #width aspect) and they do not change size if the parent list is resized. This is the standard behaviour of the underlying Windows control. However, by setting #isAutoResize to true, the ListView will treat the column as dynamically re-sizeable. It will attempt to share the width remaining, after all fixed columns have been accounted for, between each of the auto-resizeable columns.
  22553.  
  22554. Instance Variables:
  22555.     text        <readableString> that is the heading text for the column.
  22556.     width        <integer> width of the column in pixels.
  22557.     alignment        <Symbol> describing the alignment  (#left, #center, #right) of the text in the column.
  22558.     getTextBlock    <monadicValuable> mapping a contents object to a <readableString> to be displayed.
  22559.     getSortValueBlock    <monadicValuable> mapping a contents object to an object that can be used as the sort basis for the column.
  22560.     getContentsBlock    <monadicValuable> mapping a list item to the column object presented by this column.
  22561.     compareBlock    <dyadicValuable> reserved for future use.
  22562.     parent        <ListView> holding this column.
  22563.     getImageBlock    <monadicValuable>or nil, mapping a contents object to an image index.
  22564.     isAutoResize    <boolean> indicating whether the column should dynamically resize to fill available space.
  22565.     getInfoTipBlock    <monadicValuable> mapping a content object to a <readableString> for the column''s tip text.
  22566.  
  22567.  
  22568.  
  22569. '!
  22570. !ListViewColumn class methodsFor!
  22571.  
  22572. icon
  22573.     "Answers an Icon that can be used to represent this class"
  22574.  
  22575.     ^##(self) defaultIcon!
  22576.  
  22577. initialize
  22578.     "Private - Initialize the class variables of the receiver:
  22579.         self initialize
  22580.     "
  22581.  
  22582.     AutoResizeMask := 1.
  22583.     SortInvertedMask := 2.!
  22584.  
  22585. new
  22586.     "Answer a new instance of the receiver."
  22587.  
  22588.     ^super new initialize!
  22589.  
  22590. publishedAspectsOfInstances
  22591.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  22592.     
  22593.         ^(super publishedAspectsOfInstances)
  22594.             add: (Aspect autostring: #text);
  22595.             add: (Aspect integer: #width);
  22596.             add: (Aspect block: #getContentsBlock);
  22597.             add: (Aspect block: #getImageBlock);
  22598.             add: (Aspect block: #getTextBlock);
  22599.             add: (Aspect block: #sortBlock);
  22600.             add: (Aspect choice: #alignment from: #(#left #center #right));
  22601.             add: (Aspect boolean: #isAutoResize);
  22602.             add: (Aspect block: #getInfoTipBlock);
  22603.             add: (Aspect block: #customDrawBlock);
  22604.             yourself!
  22605.  
  22606. stbConvertFrom: anSTBClassFormat
  22607.     "Convert from earlier version resource. 
  22608.     Version changes:
  22609.         1: Add a getImageBlock instance variable.
  22610.         2: Addsan isAutoResize instance variable.
  22611.         3: Add getInfoTipBlock instance variable.
  22612.         4: Add customDrawBlock instance variable.
  22613.         5: Old isAutoResize variable becomes flags variable."
  22614.  
  22615.     ^
  22616.     [:data | 
  22617.     | newInstance ver |
  22618.     newInstance := self basicNew.
  22619.     1 to: data size do: [:i | newInstance instVarAt: i put: (data at: i)].
  22620.     ver := anSTBClassFormat version.
  22621.     ver < 1 
  22622.         ifTrue: 
  22623.             ["Leave the new getImageBlock inst. var. nilled"
  22624.  
  22625.             ].
  22626.     ver < 2 ifTrue: [newInstance instVarAt: 10 put: false].
  22627.     ver < 3 
  22628.         ifTrue: 
  22629.             ["Leave the getInfoTipBlock inst. var. nilled"
  22630.  
  22631.             ].
  22632.     ver < 4 
  22633.         ifTrue: 
  22634.             ["Leave the new customDrawBlock inst. var. nilled"
  22635.  
  22636.             ].
  22637.     ver < 5 
  22638.         ifTrue: 
  22639.             [| wasAutoResize |
  22640.             wasAutoResize := newInstance instVarAt: 10.
  22641.             newInstance instVarAt: 10 put: (wasAutoResize ifTrue: [AutoResizeMask] ifFalse: [0])].
  22642.     newInstance]!
  22643.  
  22644. stbVersion
  22645.     "Answer the current binary filer version number for instances of the receiver."
  22646.  
  22647.     ^5!
  22648.  
  22649. text: titleString
  22650.     "Answer a new instance of the receiver."
  22651.  
  22652.     ^(self new)
  22653.         text: titleString;
  22654.         yourself!
  22655.  
  22656. text: titleString width: widthPixels
  22657.     "Answer a new instance of the receiver."
  22658.  
  22659.     ^(self new)
  22660.         text: titleString;
  22661.         width: widthPixels;
  22662.         yourself!
  22663.  
  22664. value: anObject
  22665.     "Private - Implement this message from the monadic valuable to support the default
  22666.     'get image' functionality for a column, which is to have no image (hence answer nil)."
  22667.  
  22668.     "ListViewColumn was previously used to remove the need to store a block down into a 
  22669.     view resource, but it is now possible to just nil the getImageBlock instead."
  22670.  
  22671.     #deprecated.
  22672.     ^nil! !
  22673.  
  22674. !ListViewColumn methodsFor!
  22675.  
  22676. alignment
  22677.     "Answer a Symbol listing the alignment of text within this column;
  22678.     left, right, centre."
  22679.  
  22680.     ^alignment!
  22681.  
  22682. alignment: aSymbol
  22683.     "Sets the alignment of the receiver to aSymbol.
  22684.     This can be one of #left, #center or #right."
  22685.  
  22686.     alignment := aSymbol.
  22687.     self update
  22688. !
  22689.  
  22690. alignmentCenter
  22691.     "Align contents and title to the center of the column."
  22692.  
  22693.     self alignment: #center.!
  22694.  
  22695. alignmentLeft
  22696.     "Align contents and title to the left of the column."
  22697.  
  22698.     self alignment: #left!
  22699.  
  22700. alignmentRight
  22701.     "Align contents and title to the right of the column."
  22702.  
  22703.     self alignment: #right.
  22704. !
  22705.  
  22706. basicWidth
  22707.     "Private - Answer the intended width of the column in pixels." 
  22708.  
  22709.     ^width
  22710. !
  22711.  
  22712. basicWidth: widthPixels
  22713.     "Private - Set the intended width of the column in pixels." 
  22714.  
  22715.     width := widthPixels!
  22716.  
  22717. contentFromRow: item
  22718.     "Private - Answer the content of this column extracted from the <Object>, item,
  22719.     which is an element of the receiver's parent <ListView>.
  22720.     As of Dolphin 3.0 the content block is permitted to be nil for the common case
  22721.     where the columns content needs to be the entire item."
  22722.  
  22723.     ^getContentsBlock isNil 
  22724.         ifTrue: [item]
  22725.         ifFalse: [getContentsBlock value: item]!
  22726.  
  22727. customDrawBlock 
  22728.     "Answer the <monadicValuable> used to set custom draw text attributes for this column 
  22729.     or nil if custom drawing is not employed specifically for this column."
  22730.  
  22731.     ^customDrawBlock!
  22732.  
  22733. customDrawBlock: operation
  22734.     "Set the <monadicValuable> used for custom drawing.
  22735.     When evaluated the valuable is passed a <customDrawContext>, which provides methods for setting text 
  22736.     attributes such as the font and foreground and background colours. In cases where total control over the 
  22737.     visual appearance of the item is required the canvas associated with the custom drawing context can be used, 
  22738.     and the operation should answer true to inform the View that all default drawing should be disabled."
  22739.  
  22740.     customDrawBlock := operation!
  22741.  
  22742. defaultGetContentsBlock
  22743.     "Private - Answer a <monadicValuable> to be used as the default mechanism
  22744.     for extracting the content object for this column from the primary object for a 
  22745.     particular ListView row. If the answer is nil then the default is for the column's 
  22746.     contents to be the primary (row) object itself."
  22747.  
  22748.     ^nil!
  22749.  
  22750. defaultGetImageBlock
  22751.     "Private - Answer a <monadicValuable>, or nil, to use to find out the image index of an object 
  22752.     that will be placed in the receiver. Nil is treated as implying the column has no associated images.
  22753.     Implementation Note: Answer nil as by default we do not have per-column images."
  22754.  
  22755.     ^nil!
  22756.  
  22757. defaultGetTextBlock
  22758.     "Private - Answer a <monadicValuable> that can be used by default to
  22759.     get the text object for this column's contents. A sensible default is for 
  22760.     this valuable to answer the content's #displayString."
  22761.  
  22762.     ^BasicListAbstract!
  22763.  
  22764. defaultSortBlock
  22765.     "Private - Answer a <dyadicValuable> (e.g. a two argument block)
  22766.     that can be used to compare two contents objects in this column.
  22767.     By default use the default <SortedCollection> comparison."
  22768.  
  22769.     ^SortedCollection defaultSortBlock!
  22770.  
  22771. defaultWidth
  22772.     "Private - Answer the default width of a newly created column"
  22773.  
  22774.     ^100!
  22775.  
  22776. getContentsBlock
  22777.     "Private - Answer a single argument Block which takes the primary object for 
  22778.     a ListView row and returns the content object for this column"
  22779.  
  22780.     ^getContentsBlock!
  22781.  
  22782. getContentsBlock: aOneArgBlock
  22783.     "Set the receiver's getContentsBlock to aOneArgBlock. This takes the 
  22784.     primary object for a ListView row and returns the content object for this
  22785.     column"
  22786.  
  22787.     getContentsBlock := aOneArgBlock.
  22788.     self update!
  22789.  
  22790. getImageBlock
  22791.     "Answer the block to use to find out the image index of an object that will
  22792.     be placed in the receiver"
  22793.  
  22794.     ^getImageBlock!
  22795.  
  22796. getImageBlock: aOneArgBlock
  22797.     "Set the block to use to find out the image index of an object that will
  22798.     be placed in the receiver"
  22799.  
  22800.     getImageBlock := aOneArgBlock.
  22801.     self update!
  22802.  
  22803. getInfoTipBlock
  22804.     "Answer the value of the receiver's 'getInfoTipBlock' instance variable."
  22805.  
  22806.     ^getInfoTipBlock!
  22807.  
  22808. getInfoTipBlock: anObject
  22809.     "Set the value of the receiver's 'getInfoTipBlock' instance variable to the argument, anObject."
  22810.  
  22811.     getInfoTipBlock := anObject!
  22812.  
  22813. getTextBlock
  22814.     "Answer a single argument Block which takes an object and returns
  22815.     a string suitable for displaying in the column."
  22816.  
  22817.     ^getTextBlock!
  22818.  
  22819. getTextBlock: aOneArgBlock
  22820.     "Set the receiver's getTextBlock; a single argument block which takes an object and returns
  22821.     a string suitable for displaying."
  22822.  
  22823.     getTextBlock := aOneArgBlock.
  22824.     self update!
  22825.  
  22826. headerIcon: aBoolean
  22827.     "Private - Answer the image to be displayed in the header for the receiver. The argument
  22828.     is true if the receiver is the selected column. Answer nil for no image."
  22829.  
  22830.     ^aBoolean 
  22831.         ifTrue: 
  22832.             [self isSortOrderInverted 
  22833.                 ifTrue: [Icon fromId: 'DownArrow.ico']
  22834.                 ifFalse: [Icon fromId: 'UpArrow.ico']]!
  22835.  
  22836. imageFromRow: item
  22837.     "Private - Answer the image for this column extracted from the <Object>, item,
  22838.     which is an element of the receiver's parent <ListView>.
  22839.     As of Dolphin 3.0 the image block is permitted to be nil for the common case
  22840.     where the columns does not have images."
  22841.  
  22842.     ^getImageBlock isNil ifFalse: [
  22843.         getImageBlock value: (self contentFromRow: item)]
  22844. !
  22845.  
  22846. index
  22847.     "Answer the one based index of the receiver in its parent"
  22848.  
  22849.     ^self parent allColumns indexOf: self!
  22850.  
  22851. infoTipFromRow: item withPrefix: prefixText
  22852.     "Private - Answer the info. tip for this column extracted from the <Object>, item,
  22853.     which is an element of the receiver's parent <ListView>, with the <readableString>
  22854.     prefix, prefixText, as supplied by the ListView (at the time of writing if the displayed 
  22855.     item text has been truncated with ellipsis, then prefixText will be the full item text, 
  22856.     otherwise it will be the empty string). If there is no info. tip block then answer the 
  22857.     empty string. The info. tip block can be a monadic or dynadic valuable, in either cases
  22858.     expected to evaluate to a <String>. If monadic then it is passed only the column
  22859.     content object, if dyadic it is passed the prefixText as its second argument.
  22860.     Info. Tip support is new for Dolphin 3.0.
  22861.     Note that this message is only sent to the column by the ListView when in report
  22862.     mode, as otherwise it handles this message itself. This allows for differing behaviour
  22863.     in a view dynamically switchable between modes."
  22864.  
  22865.     ^getInfoTipBlock isNil 
  22866.         ifTrue: ['']
  22867.         ifFalse: [ | content |
  22868.             content := self contentFromRow: item.
  22869.             (getInfoTipBlock argumentCount > 1
  22870.                 ifTrue: [getInfoTipBlock value: content value: prefixText]
  22871.                 ifFalse: [getInfoTipBlock value: content]) displayString]
  22872. !
  22873.  
  22874. initialize
  22875.     "Private - Initialize the state of the receiever."
  22876.  
  22877.     self alignmentLeft.
  22878.     getContentsBlock := self defaultGetContentsBlock.
  22879.     getTextBlock := self defaultGetTextBlock.
  22880.     getSortValueBlock := self defaultSortBlock.
  22881.     text := ''.
  22882.     width := self defaultWidth.
  22883.     flags := 0!
  22884.  
  22885. isAlignmentCenter
  22886.     "Answer whether the text in this column is centered."
  22887.  
  22888.     ^alignment = #center!
  22889.  
  22890. isAlignmentLeft
  22891.     "Answer whether the text in this column is aligned to the left."
  22892.  
  22893.     ^alignment = #left!
  22894.  
  22895. isAlignmentRight
  22896.     "Answer whether the text in this column is aligned to the right."
  22897.  
  22898.     ^alignment = #right!
  22899.  
  22900. isAutoResize
  22901.     "Answer true if the receiver will attempt to share the available width in it's parent with
  22902.     other auto-resize columns"
  22903.  
  22904.     ^flags anyMask: AutoResizeMask!
  22905.  
  22906. isAutoResize: aBoolean 
  22907.     "Set the auto-resize feature of the receiver to aBoolean. If enabled, the receiver will 
  22908.     attempt to share the available width in it's parent with other auto-resize columns"
  22909.  
  22910.     flags := flags mask: AutoResizeMask set: aBoolean.
  22911.     self parent ifNotNil: [:list | list autoResizeColumns]!
  22912.  
  22913. isSortable
  22914.     ^getSortValueBlock isNil not!
  22915.  
  22916. isSortOrderInverted
  22917.     ^flags anyMask: SortInvertedMask!
  22918.  
  22919. isSortOrderInverted: aBoolean
  22920.     flags := flags mask: SortInvertedMask set: aBoolean!
  22921.  
  22922. name
  22923.     "Answer the symbolic name of the column, which can be nil.
  22924.     The name is used to identify the column when needed."
  22925.  
  22926.     ^name!
  22927.  
  22928. name: aSymbolOrNil
  22929.     name := aSymbolOrNil isNil ifFalse: [aSymbolOrNil asSymbol]!
  22930.  
  22931. parent
  22932.     "Answers the ListView parent of the receiver"
  22933.  
  22934.     ^parent!
  22935.  
  22936. parent: aListViewOrNil
  22937.     "Private - Sets the ListView parent of the receiver to aListViewOrNil"
  22938.  
  22939.     parent := aListViewOrNil!
  22940.  
  22941. printOn: aStream
  22942.     "Append a representation of the receiver to aStream."
  22943.  
  22944.     aStream
  22945.         basicPrint: self;
  22946.         nextPut: $(; print: self text; nextPut: $)!
  22947.  
  22948. resolutionScaledBy: scale
  22949.     "Private - The receiver is being loaded and it has been determined that the pixel resolution
  22950.     has changed since the point at which the view was saved. Scale any internal pixels by <Point>
  22951.     scale."
  22952.  
  22953.     width := (width * scale x) truncated
  22954.  
  22955.  
  22956. !
  22957.  
  22958. rowSortBlock
  22959.     "Private - Answer a two argument block that can be used to compare
  22960.     two rows based on this column, or nil if the column is not sortable.
  22961.     Note that the first time the sort block is accessed, it is returned as originally 
  22962.     set up. On the next access it is inverted, and on the next it is inverted again
  22963.     (i.e. back to the original). This effectively toggles the sort order between
  22964.     ascending (or whatever it was originally) and descending, each time
  22965.     the sort block is accessed."
  22966.  
  22967.     ^self isSortable 
  22968.         ifTrue: 
  22969.             [self isSortOrderInverted 
  22970.                 ifTrue: 
  22971.                     [[:a :b | getSortValueBlock value: (self contentFromRow: b) value: (self contentFromRow: a)]]
  22972.                 ifFalse: 
  22973.                     [[:a :b | getSortValueBlock value: (self contentFromRow: a) value: (self contentFromRow: b)]]]!
  22974.  
  22975. sortBlock
  22976.     "Answer a single argument Block which takes a content object for 
  22977.     this column and answers a value which can be used as the sort basis
  22978.     for the column"
  22979.  
  22980.     ^getSortValueBlock!
  22981.  
  22982. sortBlock: aDyadicValuableOrNil
  22983.     "Set the receiver's getSortValueBlock to aOneArgBlock. This takes the 
  22984.     content object for a column and returns a sort value to use as the basis
  22985.     for sorting the column"
  22986.  
  22987.     getSortValueBlock := aDyadicValuableOrNil.
  22988.     self update!
  22989.  
  22990. text
  22991.     "Answer the title for this column in the list view header."
  22992.  
  22993.     ^text!
  22994.  
  22995. text: aString
  22996.     "Set the title for this column in the list view header."
  22997.  
  22998.     text := aString.
  22999.     self update!
  23000.  
  23001. textFromRow: item
  23002.     "Private - Answer the text for this column extracted from the <Object>, item,
  23003.     which is a row element of the receiver's parent <ListView>.
  23004.     As of Dolphin 3.0 the text block is permitted to be nil for the unusual case
  23005.     where the column has only images.
  23006.     As of Dolphin 4.0 #displayString is always sent to the result of the getTextBlock,
  23007.     which is useful in those cases where one forgets to answer a String. 
  23008.     #displayString on String is a very fast nop, so the extra safety costs little."
  23009.  
  23010.     ^getTextBlock isNil 
  23011.         ifTrue: ['']
  23012.         ifFalse: [(getTextBlock value: (self contentFromRow: item)) displayString]
  23013. !
  23014.  
  23015. toggleSortOrder
  23016.     ^self isSortOrderInverted: self isSortOrderInverted not!
  23017.  
  23018. update
  23019.     "Private - Update the associated ListView column if we have one"
  23020.  
  23021.     self parent notNil ifTrue: [
  23022.         self parent updateColumn: self ]!
  23023.  
  23024. width
  23025.     "Answer the real width of the column in pixels."
  23026.  
  23027.     | view |
  23028.     view := self parent.
  23029.     ^(view isOpen and: [view isReportMode]) 
  23030.         ifTrue: [view lvmGetColumnWidth: self index - 1]
  23031.         ifFalse: [self basicWidth]!
  23032.  
  23033. width: widthPixels
  23034.     "Set the width of the column in pixels."
  23035.  
  23036.     self basicWidth: widthPixels.
  23037.     self parent lvmSetColumn: (LVCOLUMN new width: widthPixels) at: self index-1
  23038. ! !
  23039.  
  23040. Locale comment:
  23041. ''!
  23042. !Locale class methodsFor!
  23043.  
  23044. default
  23045.     "Answer the instance of the receiver which represents the default user locale."
  23046.  
  23047.     ^self userDefault!
  23048.  
  23049. installedSystemLocales
  23050.     "Private - Answer the installed Win32 system locales.
  23051.         Locale installedSystemLocales
  23052.     "
  23053.  
  23054.     ^self systemLocales: 1!
  23055.  
  23056. lcid: anLCID
  23057.     "Answer an instance of the receiver to represent the Locale with the specified id."
  23058.  
  23059.     ^self new lcid: anLCID!
  23060.  
  23061. makeLangId: langIdBits subLang: subLangIdBits
  23062.     "Private - Answer a Win32 language Id word constructed from langIdBits (10 bits
  23063.     are significant) and subLangIdBits (6 bits are significant)."
  23064.  
  23065.     ^(subLangIdBits bitAnd: 63) << 10 bitOr: (langIdBits bitAnd: 1023)!
  23066.  
  23067. makeLcId: langIdWord sortId: sortIdBits
  23068.     "Private - Answer a Win32 Locale Id dword constructed from langIdWord and 
  23069.     sortIdBits (4 bits are significant).
  23070.         #define MAKELCID(lgid) ((unsigned long)(((unsigned short)(lgid)) | (((unsigned long)((unsigned short)(0))) << 16)))
  23071.     "
  23072.  
  23073.     ^(sortIdBits bitAnd: 16rF) << 16 
  23074.         bitOr: (langIdWord bitAnd: 16rFFFF)!
  23075.  
  23076. onPreStripImage
  23077.     "Private -  Assist in the image stripping process by clearning down any
  23078.     lazily initialized variables held by the receiver."
  23079.  
  23080.     UserDefault := nil!
  23081.  
  23082. onStartup
  23083.     "Private - The system has just started. Adjust any locale specific
  23084.     information (e.g. Dates and Times). Can be sent at other times
  23085.     if the Locale has been changed."
  23086.  
  23087.     UserDefault := SystemDefault := nil!
  23088.  
  23089. supportedSystemLocales
  23090.     "Private - Answer the supported Win32 system locales.
  23091.         Locale supportedSystemLocales
  23092.     "
  23093.  
  23094.     ^self systemLocales: 2!
  23095.  
  23096. systemDefault
  23097.     "Answer the instance of the receiver which represents the default user locale."
  23098.  
  23099.     SystemDefault isNil ifTrue: [SystemDefault := self lcid: KernelLibrary default getSystemDefaultLCID].
  23100.     ^SystemDefault!
  23101.  
  23102. systemLocales: anInteger
  23103.     "Private - Answer a collection of system locales, depending on the flags argument, anInteger."
  23104.  
  23105.     | enum locales |
  23106.     locales := OrderedCollection new: 30.
  23107.     enum := ExternalCallback block: [:locale | locales addLast: locale. true]
  23108.             descriptor: ExternalDescriptor oneStringArg.
  23109.     KernelLibrary default 
  23110.         enumSystemLocales: enum asParameter
  23111.         dwFlags: anInteger.
  23112.     enum free.
  23113.     ^locales collect: [:s | self lcid: (Integer readFrom: s asUppercase readStream radix: 16)]!
  23114.  
  23115. userDefault
  23116.     "Answer the instance of the receiver which represents the default user locale."
  23117.  
  23118.     UserDefault isNil ifTrue: [UserDefault := self lcid: KernelLibrary default getUserDefaultLCID].
  23119.     ^UserDefault! !
  23120.  
  23121. !Locale methodsFor!
  23122.  
  23123. amDesignator
  23124.     "Answer the String used in the receiver locale to designate AM (morning)."
  23125.  
  23126.     amDesignator isNil ifTrue: [amDesignator := self getInfo: LOCALE_S1159].
  23127.     ^amDesignator!
  23128.  
  23129. asParameter
  23130.     "Answer the receiver in a form suitable for passing to an external
  23131.     function call (the Win32 representation of a Locale, is the LCID)."
  23132.  
  23133.     ^lcid!
  23134.  
  23135. currency
  23136.     "Answer the currency symbol String used in the receiver locale.
  23137.     Implementation Note: We cache this because it is used for printing, etc."
  23138.  
  23139.     currencySymbol isNil ifTrue: [currencySymbol := self getInfo: LOCALE_SCURRENCY].
  23140.     ^currencySymbol
  23141. !
  23142.  
  23143. dateFormat
  23144.     "Answer the default date format for the receiver locale."
  23145.  
  23146.     ^self getInfo: LOCALE_SSHORTDATE!
  23147.  
  23148. dateFormats: aBoolean
  23149.     "Private - Answer a collection of the date formats for the specified locale, with short
  23150.     or long formats according to the argument, aBoolean."
  23151.  
  23152.     | enum formats |
  23153.     formats := OrderedCollection new: 4.
  23154.     enum := ExternalCallback block: [:format | formats add: format. true]
  23155.             descriptor: ExternalDescriptor oneStringArg.
  23156.     (self nlsLib 
  23157.         enumDateFormats: enum asParameter
  23158.         locale: self asParameter
  23159.         dwFlags: (aBoolean ifTrue: [DATE_LONGDATE] ifFalse: [DATE_SHORTDATE]))
  23160.             ifFalse: [self nlsLib systemError].
  23161.     enum free.
  23162.     ^formats!
  23163.  
  23164. dateOrder
  23165.     "Answer the date ordering used in the receiver locale.
  23166.         0    Month - Day - Year
  23167.         1    Day - Month - Year
  23168.         2    Year - Month - Day."
  23169.  
  23170.     ^self getIntegerInfo: LOCALE_IDATE!
  23171.  
  23172. dateSeparator
  23173.     "Answer the character used in the receiver locale to separate date components.
  23174.     Implementation Note: We cache this because it is used for printing Dates, etc."
  23175.  
  23176.     dateSeparator isNil ifTrue: [dateSeparator := self getInfo: LOCALE_SDATE].
  23177.     ^dateSeparator!
  23178.  
  23179. dayNames
  23180.     "Answer a lookup table mapping abbreviated and normal day names in the
  23181.     receiver locale to the day number."
  23182.  
  23183.     dayNames isNil ifTrue: [
  23184.         dayNames := LookupTable new: 14.
  23185.         1 to: 7 do: [ :i |
  23186.             dayNames 
  23187.                 at: (self nameOfDay: i abbrev: false) asLowercase put: i;
  23188.                 at: (self nameOfDay: i abbrev: true) asLowercase put: i ]].
  23189.     ^dayNames!
  23190.  
  23191. decimalSeparator
  23192.     "Answer the decimal separator String used in the receiver locale.
  23193.     Implementation Note: We cache this because it is used for printing Floats, etc."
  23194.  
  23195.     decimalSeparator isNil ifTrue: [decimalSeparator := self getInfo: LOCALE_SDECIMAL].
  23196.     ^decimalSeparator!
  23197.  
  23198. displayOn: aStream
  23199.     "Append a displayable representation of the receiver to aStream."
  23200.  
  23201.     aStream nextPutAll: self name!
  23202.  
  23203. getInfo: anIntegerLcType
  23204.     "Private - Answer a locale specific date String of the specified type for the receiver's locale.
  23205.     Implementation Note: Try a default maximum size of 20, which will handle most locale info,
  23206.     and if that is not enough fall back on the slower mechanism of enquiring for the size first."
  23207.  
  23208.     | size buf lib |
  23209.     lib := self nlsLib.
  23210.     buf := String new: 20.
  23211.     size := lib getLocaleInfo: lcid lCType: anIntegerLcType lpLCData: buf cchData: buf size+1.
  23212.     size == 0 ifTrue: [ | err |
  23213.         err := KernelLibrary default getLastError.
  23214.         size := lib getLocaleInfo: lcid lCType: anIntegerLcType lpLCData: nil cchData: 0.
  23215.         size == 0 ifTrue: [^lib systemError].
  23216.         "Strings allocate extra space for null automatically"
  23217.         buf := String new: size-1.
  23218.         lib getLocaleInfo: lcid lCType: anIntegerLcType lpLCData: buf cchData: size].
  23219.     ^buf resize: size-1
  23220.  
  23221. "
  23222. Locale userDefault getInfo: 42
  23223. "!
  23224.  
  23225. getIntegerInfo: anIntegerLcType
  23226.     "Private - Answer a locale specific single character of the specified type for the 
  23227.     receiver's locale."
  23228.  
  23229.     | buf lib |
  23230.     lib := self nlsLib.
  23231.     buf := String new: 15.
  23232.     (lib getLocaleInfo: lcid lCType: anIntegerLcType lpLCData: buf cchData: 11) == 0
  23233.         ifTrue: [lib systemError].
  23234.     ^CRTLibrary default atoi: buf!
  23235.  
  23236. isMonthBeforeDay
  23237.     "Answer true if the format for the receiver is expecting a month before a day"
  23238.  
  23239.     ^self dateOrder ~= 1!
  23240.  
  23241. lcid: anLCID
  23242.     "Private - Set the receiver's Win32 LCID which identifies the locale the
  23243.     receiver is representing. Answer the receiver."
  23244.  
  23245.     lcid := anLCID!
  23246.  
  23247. listSeparator
  23248.     "Answer the String used in the receiver locale to separate items in lists.
  23249.     Implementation Note: We cache this because it is used for printing, etc."
  23250.  
  23251.     listSeparator isNil ifTrue: [listSeparator := self getInfo: LOCALE_SLIST].
  23252.     ^listSeparator!
  23253.  
  23254. longDateFormat
  23255.     "Answer the default long date format for the receiver locale."
  23256.  
  23257.     ^self getInfo: LOCALE_SLONGDATE!
  23258.  
  23259. longDateFormats
  23260.     "Private - Answer a collection of the long date formats for the receiver locale."
  23261.  
  23262.     ^self dateFormats: true!
  23263.  
  23264. monthNames
  23265.     "Answer a map between <readableString> month names (and abbreviated month
  23266.     names) and the corresponding month number in the receiving locale."
  23267.  
  23268.     monthNames isNil ifTrue: [
  23269.         monthNames := LookupTable new: 24.
  23270.         1 to: 12 do: [ :i |
  23271.             monthNames
  23272.                 at: (self nameOfMonth: i abbrev: false) asLowercase put: i;
  23273.                 at: (self nameOfMonth: i abbrev: true) asLowercase put: i]].
  23274.     ^monthNames!
  23275.  
  23276. name
  23277.     "Answer the name of the receiver locale."
  23278.  
  23279.     ^self getInfo: LOCALE_SLANGUAGE!
  23280.  
  23281. nameOfDay: dayIndex abbrev: aBoolean
  23282.     "Private - Answer a String that is the localised short/long name of the day whose index is the 
  23283.     argument, dayIndex, where Monday is 1 and Sunday is 7, depending on the abbrev argument.
  23284.     N.B. This is Win32 specific."
  23285.  
  23286.     ^self getInfo: LOCALE_SDAYNAME1 + 
  23287.                     (aBoolean ifTrue: [7] ifFalse: [0]) +
  23288.                     dayIndex - 1!
  23289.  
  23290. nameOfMonth: monthIndex abbrev: aBoolean
  23291.     "Private - Answer a localised long/short String name for the month whose index is the argument, 
  23292.     monthIndex, where January is month 1, and December is month 12.
  23293.     N.B. This is Win32 specific."
  23294.  
  23295.     ^self getInfo: LOCALE_SMONTHNAME1 + 
  23296.                     (aBoolean ifTrue: [12] ifFalse: [0]) +
  23297.                     monthIndex - 1!
  23298.  
  23299. nlsLib
  23300.     "Private - Answer the library responsible for locale support."
  23301.  
  23302.     ^KernelLibrary default!
  23303.  
  23304. pmDesignator
  23305.     "Answer the character used in the receiver locale to designate PM (afternoon)."
  23306.  
  23307.     pmDesignator isNil ifTrue: [pmDesignator := self getInfo: LOCALE_S2359].
  23308.     ^pmDesignator!
  23309.  
  23310. printDate: aDate format: aStringOrNil flags: dwFlags
  23311.     "Private - Answer a locale specific formatted date String generated from the arguments."
  23312.  
  23313.     | year |
  23314.     "If a Date is prior to 01 January 1601, or post 31 December 65535, then it cannot be
  23315.     formatted by Windows."
  23316.     ^((year := aDate year) < 1601 or: [year > 65535])
  23317.         ifTrue: [self printUnboundedDate: aDate format: aStringOrNil flags: dwFlags]
  23318.         ifFalse: [self printSysDate: aDate asParameter format: aStringOrNil flags: dwFlags]!
  23319.  
  23320. printOn: aStream
  23321.     "Append a debug representation of the receiver to aStream."
  23322.  
  23323.     aStream
  23324.         basicPrint: self;
  23325.         nextPut: $(; print: self name; nextPut: $)!
  23326.  
  23327. printSysDate: aSYSTEMTIME format: aStringOrNil flags: dwFlags
  23328.     "Private - Answer a locale specific formatted date <String> generated from the arguments."
  23329.  
  23330.     | size buf lib |
  23331.     lib := self nlsLib.
  23332.     buf := String new: 30.
  23333.     size := lib getDateFormat: self asParameter dwFlags: dwFlags 
  23334.                 lpDate: aSYSTEMTIME lpFormat: aStringOrNil lpDateStr: buf cchDate: buf size+1.
  23335.     size == 0 ifTrue: [
  23336.         "Probably too big, find out how big a buffer is needed"
  23337.         size := lib getDateFormat: self asParameter dwFlags: dwFlags 
  23338.                 lpDate: aSYSTEMTIME  lpFormat: aStringOrNil lpDateStr: nil cchDate: 0.
  23339.         size == 0 ifTrue: [lib systemError].
  23340.         buf := String new: size-1.    "Strings allocate extra space for null terminator"
  23341.         lib getDateFormat: self asParameter dwFlags: dwFlags 
  23342.             lpDate: aSYSTEMTIME lpFormat: aStringOrNil lpDateStr: buf cchDate: size].
  23343.     "size includes terminating null"
  23344.     ^buf resize: size-1!
  23345.  
  23346. printTime: aTime format: aStringOrNil flags: dwFlags
  23347.     "Private - Append a locale specific string representation of the argument, aTime, to,
  23348.     aStream, using the specified format String (the default is used if it is nil)."
  23349.  
  23350.     | size buf timeParm lib |
  23351.     timeParm := aTime asParameter.
  23352.     lib := self nlsLib.
  23353.     buf := String new: 20.
  23354.     size := lib 
  23355.                 getTimeFormat: self asParameter
  23356.                 dwFlags: dwFlags
  23357.                 lpTime: timeParm
  23358.                 lpFormat: aStringOrNil
  23359.                 lpTimeStr: buf
  23360.                 cchBuf: buf size + 1.
  23361.     size == 0 
  23362.         ifTrue: 
  23363.             [size := lib 
  23364.                         getTimeFormat: self asParameter
  23365.                         dwFlags: dwFlags
  23366.                         lpTime: timeParm
  23367.                         lpFormat: aStringOrNil
  23368.                         lpTimeStr: nil
  23369.                         cchBuf: 0.
  23370.             size == 0 ifTrue: [^lib systemError].
  23371.             buf := String new: size - 1.    "Strings allocate extra space for null terminator"
  23372.             lib 
  23373.                 getTimeFormat: self asParameter
  23374.                 dwFlags: dwFlags
  23375.                 lpTime: timeParm
  23376.                 lpFormat: aStringOrNil
  23377.                 lpTimeStr: buf
  23378.                 cchBuf: size].
  23379.     ^buf resize: size - 1!
  23380.  
  23381. printUnboundedDate: aDate format: aStringOrNil flags: dwFlags
  23382.     "Private - Answer a locale specific formatted date String generated
  23383.     from the arguments. This is usually only employed if aDate is
  23384.     outside the range supported by Windows."
  23385.  
  23386.     | strm |
  23387.     #todo "Implement correctly to respect the format string".
  23388.     strm := String writeStream: 64.
  23389.     (dwFlags allMask: DATE_LONGDATE) 
  23390.         ifTrue: [
  23391.             strm
  23392.                 display: aDate dayOfMonth; space;
  23393.                 display: aDate monthName; space;
  23394.                 display: aDate year]
  23395.         ifFalse: [
  23396.             self isMonthBeforeDay 
  23397.                 ifTrue: [
  23398.                     strm
  23399.                         display: aDate monthIndex; nextPutAll: self dateSeparator;
  23400.                         display: aDate dayOfMonth; nextPutAll: self dateSeparator]
  23401.                 ifFalse: [
  23402.                     strm
  23403.                         display: aDate dayOfMonth; nextPutAll: self dateSeparator;
  23404.                         display: aDate monthIndex; nextPutAll: self dateSeparator].
  23405.                 strm display: aDate year].
  23406.     ^strm contents!
  23407.  
  23408. shortDateFormats
  23409.     "Private - Answer a collection of the short date formats for the user locale."
  23410.  
  23411.     ^self dateFormats: false!
  23412.  
  23413. timeFormat
  23414.     "Answer the default time format for the receiver locale."
  23415.  
  23416.     ^self getInfo: LOCALE_STIMEFORMAT!
  23417.  
  23418. timeFormats
  23419.     "Answer a collection of the time formats for the specified locale."
  23420.  
  23421.     | enum formats |
  23422.     formats := OrderedCollection new: 4.
  23423.     enum := ExternalCallback block: [ :format | formats add: format. true ] 
  23424.             descriptor: ExternalDescriptor oneStringArg.
  23425.     (self nlsLib
  23426.         enumTimeFormats: enum asParameter
  23427.         locale: self asParameter dwFlags: 0) ifFalse: [ self nlsLib systemError ].
  23428.     enum free.
  23429.     ^formats!
  23430.  
  23431. timeSeparator
  23432.     "Answer the character used in the receiver locale to separate time components.
  23433.     Implementation Note: We cache this because it is used for printing, etc."
  23434.  
  23435.     timeSeparator isNil ifTrue: [timeSeparator := self getInfo: LOCALE_STIME].
  23436.     ^timeSeparator!
  23437.  
  23438. timeZoneInformation
  23439.     | timeZoneInfo rc |
  23440.     timeZoneInfo := TIME_ZONE_INFORMATION new.
  23441.     rc := KernelLibrary default getTimeZoneInformation: timeZoneInfo.
  23442.     rc = -1 ifTrue: [^KernelLibrary default systemError].
  23443.     ^Array with: rc with: timeZoneInfo
  23444.  
  23445.  
  23446. ! !
  23447.  
  23448. Magnitude comment:
  23449. 'Magnitude is an abstract class which provides the protocol objects which can be compared
  23450. along a linear dimension, e.g. Numbers, Dates, Times.
  23451.  
  23452. Subclasses of Magnitude must implement the following comparing protocol (at the very least):
  23453. #<, #=, #hash'!
  23454. !Magnitude methodsFor!
  23455.  
  23456. < operand
  23457.     "Answer whether the receiver is less than the <magnitude>, operand.
  23458.  
  23459.     Only this relational operator need be implemented by subclasses, since the others can 
  23460.     be implemented in terms of it (though performance may dictate otherwise)."
  23461.  
  23462.     ^self subclassResponsibility!
  23463.  
  23464. <= operand
  23465.     "Answer whether the receiver is less than or equal to the <magnitude>, operand.
  23466.     Implemented in terms of #<, which must be implemented by subclasses, also make use 
  23467.     of compiler optimisation of #== instead of #not"
  23468.  
  23469.     ^(operand < self) == false!
  23470.  
  23471. = aMagnitude
  23472.     "Answer whether the receiver is equivalent to the argument, aMagnitude."
  23473.  
  23474.     ^self subclassResponsibility!
  23475.  
  23476. > operand
  23477.     "Answer whether the receiver is greater than the <magnitude>, operand.
  23478.     Implemented in terms of #<, which must be implemented by subclasses."
  23479.  
  23480.     ^operand < self!
  23481.  
  23482. >= operand
  23483.     "Answer whether the receiver is greater than or equal to the <magnitude>, operand.
  23484.     Implemented in terms of #<, which must be implemented by subclasses."
  23485.  
  23486.     ^(self < operand) == false!
  23487.  
  23488. between: min and: max
  23489.     "Answer whether the receiver is inclusively between the <magnitude> arguments, 
  23490.     min and max."
  23491.  
  23492.     ^self >= min and: [self <= max]!
  23493.  
  23494. hash
  23495.     "Answer a SmallInteger hash value for the receiver which obeys the invariant that any two 
  23496.     objects which compare equal (using #=) must have the same hash value (but not 
  23497.     necessarily vice-versa). Like #=, and #<, must be implemented by subclasses."
  23498.  
  23499.     ^self subclassResponsibility!
  23500.  
  23501. max: operand
  23502.     "Answer the greater of the receiver and the <magnitude>, operand.
  23503.      Implementation Note: #< is used since other relational operators are often implemented 
  23504.     in terms of it."
  23505.  
  23506.     ^self < operand
  23507.         ifTrue:  [operand]
  23508.         ifFalse: [self]!
  23509.  
  23510. min: operand
  23511.     "Answer the lesser of the receiver and the <magnitude>, operand."
  23512.  
  23513.     ^self < operand
  23514.         ifTrue:  [self]
  23515.         ifFalse: [operand]! !
  23516.  
  23517. MemoryManager comment:
  23518. 'MemoryManager is a singleton class whose sole instance is responsible for scheduling garbage collection, performing finalization, saving the image, etc.
  23519.  
  23520. The MemoryManager owns two processes which are responsible for performing certain garbage collection activities in synchronization with the image. The garbage collector itself cannot perform these tasks because it runs asynchronously in the VM. The first of these processes is responsible for sending #finalize messages to objects that were previously marked as finalized before they expired. It does this by consuming objects from a queue which is populated by the collector. This activity is performed at low priority, as in general it is considered that reclaiming resources is a lower priority activity than interactive tasks. Also the asynchronous nature of garbage collection makes it unpredictable when (if ever) an object will actually be ready for finalization. However, to avoid the queue growing indefinitely when a higher priority CPU intensive task is consuming all available cycles, the finalization queue has a "high water mark". When the collector enqueues a finalizable object and finds the queue has passed the high water mark, it sends an interrupt (via the Processor object) to indicate this condition. The MemoryManager responds by temporarily boosting the priority of the finalization task to a relatively high level (above the normal "user" levels), so that it is cleared down quickly.
  23521.  
  23522. There is also a "bereavement" queue which is managed in a similar way. The bereavement queue is populated by the collector with weakling objects (i.e. those with weak references) when they lose one or more of those references. Bereaved objects are consumed from the bereavement queue and sent #elementsExpired: messages by the "undertaker" process. A significant difference from the finalization process is that the undertaker runs at a very high priority in order to guarantee that weak objects are repaired immediately.
  23523.  
  23524. Note that collections that nil weak references can only be scheduled from the image (e.g. by the background idle process), never asynchronously by the VM. This is so that weak objects can be operated on atomically without the rug being pulled from under their feet by the collector.
  23525.  
  23526. Instance Variables:
  23527.     finalizer        <Process>. Low priority task responsible for sending #finalize message to finalizable objects.
  23528.     lastRequests    <Semaphore>. Semaphore signalled the GC when finalizable objects enqueued for finalizer.
  23529.     hospice        <Array>. Queue of objects requiring finalization. Growns dynamically by the GC as required.
  23530.     hospiceHighWater    <integer>. Level at which GC interrupts to notify finalizable garbage building up (default 64)
  23531.     reserved        Reserved for future use.
  23532.     undertaker        <Process>. High priority task responsible for repairing weak collections.
  23533.     bereavements    <Semaphore>. Semaphore signalled by GC when weak collections have suffered bereavements.
  23534.     bereaved        <Array>. Queue of weak collections which have suffered losses.
  23535.     bereavedHighWater    <integer>. Level at which GC interrupts to notify bereaved queue building up (default 32).
  23536.     gcInterval        <integer>. Milliseconds between major GC cycles.
  23537.     lastGCTime    <integer>. Milliseconds clock at last major GC cycle.
  23538.     lastGCDuration    <integer>. Duration in milliseconds of last major GC cycle.
  23539.     objectHeaderSize    <integer>. Number of bytes in object headers allocated by the VM (a constant).
  23540.  
  23541. Class Variables:
  23542.     GCInterval    <integer>. Default GC interval.
  23543.     Current        <MemoryManager>. Singleton instance.
  23544.  
  23545. '!
  23546. !MemoryManager class methodsFor!
  23547.  
  23548. current
  23549.     "Answer the singleton instance of the receiver.
  23550.     N.B. This instance can only be replaced with #become:, and the format
  23551.     must be the same."
  23552.  
  23553.     ^Current
  23554. !
  23555.  
  23556. gcInterval: anInteger
  23557.     "Set the interval between GC's (idle time) to anInteger"
  23558.  
  23559.     GCInterval := anInteger!
  23560.  
  23561. icon
  23562.     "Answers an Icon that can be used to represent this class"
  23563.  
  23564.     ^Icon fromId: 13 in: ShellLibrary default!
  23565.  
  23566. initialize
  23567.     "Initialize the class variables of the receiver
  23568.         Current        -    The singleton instance of the receiver. Can be replaced with an 
  23569.                         alternative memory manager if desired by sending #current:.
  23570.         GCInterval    -    Minimum idle time (milliseconds) between scheduled GC's"
  23571.  
  23572.     GCInterval := 10000.
  23573.     Current isNil ifTrue: [Current := super new initialize].
  23574.     "GUID is not properly set up by boot"
  23575.     self guid: (GUID fromString: '{703BD0AD-FBFF-4D00-866B-B80387F7B1D7}')!
  23576.  
  23577. new
  23578.     "The receiver is a singleton class."
  23579.  
  23580.     ^self shouldNotImplement!
  23581.  
  23582. removeFromSystem
  23583.     "Private - Remove the receiver completely from the system.
  23584.     Override because this class is critical to system operation, 
  23585.     and must not be deleted."
  23586.  
  23587.     ^self shouldNotImplement! !
  23588.  
  23589. !MemoryManager methodsFor!
  23590.  
  23591. aboutToIdle
  23592.     "Private - The system is about to quiesce, see whether its appropriate to reschedule 
  23593.     memory management activities. At the moment we just check that the finalization processes
  23594.     are still alive, and if not fork new ones."
  23595.  
  23596.     | now interval |
  23597.     self ensureProcessesRunning.
  23598.     Delay aboutToIdle.
  23599.     now := Delay millisecondClockValue.
  23600.     interval := now - lastGCTime.
  23601.     (interval > self gcInterval or: [interval < 0]) 
  23602.         ifTrue: 
  23603.             [self collectGarbage.
  23604.             lastGCDuration := Delay millisecondClockValue - now max: 10.
  23605.             gcInterval := GCInterval max: (lastGCDuration * 2 max: self minGCInterval)]!
  23606.  
  23607. administerLastRites
  23608.     "Private - Dequeue dying objects from the system finalization queue, and send them a 
  23609.     #finalize message. Multiple finalization processes are permissible because access to the 
  23610.     VM queue is atomic (which is in any case required for synchronisation with the VM's garbage 
  23611.     collection activities). This allows a user Process to synchronously perform finalization at 
  23612.     certain points, for example, so that all objects pending finalization are processed before 
  23613.     the image is saved. This may be necessary because the Finalizer runs at a very low priority."
  23614.     
  23615.     | dying |
  23616.     [(dying := self dequeueForFinalization) isNil] 
  23617.         whileFalse: [dying finalize]
  23618. !
  23619.  
  23620. bereavedOverflow: interruptArg
  23621.     "Private - The VM has detected that the bereavement queue has reached
  23622.     its high water mark. This should not happen, because the undertaker
  23623.     process runs at very high priority. If it does happen, then presumably
  23624.     it is because the Undertaker has died, and must be restarted."
  23625.  
  23626.     Notification signal: 'WARNING: Bereavement queue overflow'.
  23627.     self ensureProcessesRunning
  23628. !
  23629.  
  23630. collectGarbage
  23631.     "Private - Invoke the fast (non-compacting) garbage collector to reclaim inaccessible objects
  23632.     (those not reachable from root objects, such as the SystemDictionary, Smalltalk),
  23633.     and perform the grim reaping of objects which only have weak references from the roots
  23634.     of the world. Such objects are queued for finalization if so marked (see 
  23635.     Object>>beFinalizable). Objects marked as weak (see Object>>beWeak) will have their 
  23636.     losses replaced with the Corpse object, and if an instances of mourning classes (see 
  23637.     Behavior>>makeMourner) they will be queued to receive a #elementsExpired: message 
  23638.     informing them of the scale of their losses.
  23639.  
  23640.     If following the GC there are any objects awaiting finalization in the queue, then
  23641.     the Finalizer is signalled via its Semaphore, and it finalizes all objects waiting in
  23642.     the queue.
  23643.  
  23644.     This message is sent from system idle processing, but can also be invoked directly if desired.
  23645.  
  23646.     The MemoryManager makes certain guarantees to objects marked as requiring finalization:
  23647.     -    Such objects will receive a #finalize message, at some interval
  23648.         (of unspecified duration) after their last reference from an object not
  23649.         marked as weak has been cleared.
  23650.     -     Objects with last requests are guaranteed to receive only a single #finalize 
  23651.         message no matter how many objects weakly reference them.
  23652.     -    Objects with last requests will die immediately after they have carried out
  23653.         their last requests.
  23654.  
  23655.     Should an objects' #finalize methods cause, directly or indirectly, further references to be 
  23656.     taken to itself (e.g. by assignment to variables), then it will receive a reprieve and continue 
  23657.     to live. Should such an object require a further finalization message the next time it's on its 
  23658.     death bed, then it must be sent the #beFinalizable message again, because its finalization mark 
  23659.     is cleared when it is queued for finalization.
  23660.     
  23661.     It may be that an application requires that finalized objects be able to suspend their own 
  23662.     deaths, and this is the reason for the above described behavior, but it is necessary to
  23663.     regenerate any weak references still required, as these will have been lost.
  23664.  
  23665.     The guarantees to objects with weak references are:
  23666.     -    They will receive one, and only one, #elementsExpired: message following each GC,
  23667.         should they suffer a bereavement or bereavements, and the argument will inform them
  23668.         how many NEW Corpses they have.
  23669.     -    Former weak references will have been replaced with references to the Corpse 
  23670.         object.
  23671.     
  23672.     Note that the GC does not remove references to corpse from previous reapings.
  23673.     Should this be the behaviour desired, then weaklings must clear away corpses themselves
  23674.     from their #elementsExpired: method."
  23675.  
  23676.     lastGCTime := Delay millisecondClockValue.
  23677.     self primCollectGarbage: 0!
  23678.  
  23679. compact
  23680.     "Private - Invoke the slow (compacting) garbage collector to minimize the size
  23681.     of the object memory. Answers the number of objects in the system following 
  23682.     compaction. See #collectGarbage for further GC details."
  23683.  
  23684.     ^self primCompact
  23685. !
  23686.  
  23687. dequeueBereavementInto: anArray
  23688.     "Private - Remove the next entry from the system bereavement queue and populate anArray
  23689.     with its contents. Answers true if an element was dequeued into anArray, or false if the queue is empty.
  23690.  
  23691.     Primitive failure reasons:
  23692.         0 -    anArray is not an Array, or is not of sufficient size to hold a complete queue entry."
  23693.  
  23694.     <primitive: 119>
  23695.     ^self primitiveFailed
  23696. !
  23697.  
  23698. dequeueForFinalization
  23699.     "Private - Answer the next entry in the system finalization queue, or nil if it is
  23700.     empty. The primitive should not fail."
  23701.  
  23702.     <primitive: 118>
  23703.     ^self primitiveFailed
  23704. !
  23705.  
  23706. directFunerals
  23707.     "Private - Dequeue bereaved objects from the system bereavement queue, and send them an 
  23708.     #elementsExpired: message with an argument informing them of the magnitude of their losses. 
  23709.     Multiple funeral direction processes are permissible because access to the VM queue is atomic 
  23710.     (which is in any case required for synchronisation with the VM's garbage collection activities). 
  23711.     This allows a user Process to synchronously send #directFunerals at certain points, though this 
  23712.     should not be necessary because the Undertaker (necessarily) runs at a very high priority."
  23713.     
  23714.     | queueEntry |
  23715.     queueEntry := Array new: 2.
  23716.     [self dequeueBereavementInto: queueEntry] 
  23717.         whileTrue: [(queueEntry basicAt: 1) elementsExpired: (queueEntry basicAt: 2)]!
  23718.  
  23719. ensureProcessesRunning
  23720.     "Private - If the finalization processes have not been forked, or have died, 
  23721.     or are suspended on Semaphores other than the receiver's, refork them"
  23722.  
  23723.     (finalizer isNil or: [(finalizer isAlive: lastRequests) not])
  23724.         ifTrue: [self forkFinalizer].
  23725.     (undertaker isNil or: [(undertaker isAlive: bereavements) not])
  23726.         ifTrue: [self forkUndertaker]
  23727.     !
  23728.  
  23729. finalizer
  23730.     "Private - Answer the finalizer <Process>."
  23731.  
  23732.     ^finalizer!
  23733.  
  23734. finalizerMain
  23735.     "Private - Wait for objects to be queued to the system finalization queue, 
  23736.     then attempt to empty that queue. 
  23737.     The VM signals the queue semaphore each time it queues a group of objects to 
  23738.     the queue so the semaphore's signal count does not reflect the number of 
  23739.     elements waiting in the queue (this is to reduce the asynchronous signalling 
  23740.     overhead and to permit user code to force synchronous finalization by directly 
  23741.     invoking administerLastRites). 
  23742.     Should the finalizer be prematurely terminated by an error occurring in a #finalize 
  23743.     method, then it will be restarted the next time the system goes idle, but the 
  23744.     semaphore's signal count will not be reset, so any waiting objects should get 
  23745.     serviced in the near future, assuming Processor time is available.
  23746.     Should the VM detect that the finalization queue has reached the configured high
  23747.     water mark, then it will send an interrupt to the processor, which forwards it
  23748.     to the current memory manager. The default action on receipt of the interrupt
  23749.     is to raise the priority of the finalization process to lowIOPriority. After
  23750.     each iteration through #administerLastRites we set the priority back to its
  23751.     initial priority, so it never remains permanently elevated."
  23752.     
  23753.     | priority |
  23754.     finalizer := Processor activeProcess.
  23755.     finalizer name: 'Finalizer'.
  23756.     priority := finalizer priority.
  23757.     [finalizer == Processor activeProcess] whileTrue: [
  23758.         lastRequests wait. 
  23759.         self administerLastRites.
  23760.         finalizer priority: priority]!
  23761.  
  23762. forkFinalizer
  23763.     "Private - Start/restart the finalization process which oversees the administration of
  23764.     last rites. Note that because the finalizer runs at a low priority, finalization receives
  23765.     a low priority. For this reason, and others, it is not a good idea to rely on finalization
  23766.     to release limited resources."
  23767.  
  23768.     Notification signal: self class name, ': Restarting Finalizer process...'.
  23769.     [self finalizerMain] forkAt: Processor systemBackgroundPriority!
  23770.  
  23771. forkUndertaker
  23772.     "Private - Start/restart the process which directs funerals on behalf of objects 
  23773.     with weak references which suffer bereavements during a garbage collect. 
  23774.     The undertaker MUST run at a priority above that of any process likely to make 
  23775.     use of weakly referencing objects, unless those objects are prepared to handle 
  23776.     the appearance of Corpses before they receive a notification of the loss. 
  23777.     The undertaker's task is to inform weakly referencing objects of their bereavements, 
  23778.     so that they can make the necessary repairs. Weakly referencing objects that need 
  23779.     to make repairs, will almost certainly need to make these repairs to the exclusion 
  23780.     of other processes, so they will need to use a Mutex around all accesses (the Pattern 
  23781.     is: subclass the strong version, add a mutex, perform all accesses to potentially shared 
  23782.     data inside a critical section against the mutex with a supersend, implement 
  23783.     elementsExpired: repairing the shared data inside the mutex)."
  23784.  
  23785.     Notification signal: self class name, ': Restarting Undertaker process...'.
  23786.     [self undertakerMain] forkAt: Processor highIOPriority!
  23787.  
  23788. gcInterval
  23789.     "Private - Answer the interval (in milliseconds) between idle time GCs"
  23790.  
  23791.     ^gcInterval!
  23792.  
  23793. hospiceOverflow: interruptArg
  23794.     "Private - The VM has detected that the finalization queue has reached
  23795.     its high water mark. Clear down the finalization queue at an elevated
  23796.     priority."
  23797.  
  23798.     finalizer priority: Processor lowIOPriority
  23799.     !
  23800.  
  23801. initialize
  23802.     "Private - Initialize the receiver's instance variables.
  23803.     N.B. Use of this method in a running system is likely to result in 
  23804.     system failure."
  23805.  
  23806.     self resetGCStats.
  23807.     hospiceHighWater := 64.    "Max finalization queue before high priority administerLastRites"
  23808.     bereavedHighWater := 16.
  23809.     hospice := Array new: hospiceHighWater * 2.
  23810.     bereaved := Array new: bereavedHighWater * 2.
  23811.     lastRequests := Semaphore new.
  23812.     bereavements := Semaphore new.
  23813.     self registerObjects!
  23814.  
  23815. minGCInterval
  23816.     "Private - Answer the minimum interval (in milliseconds) between idle time GCs"
  23817.  
  23818.     ^5000!
  23819.  
  23820. objectCount
  23821.     "Private - Answer an approximate indication of the number of live objects in the system
  23822.     at the time of invocation."
  23823.  
  23824.     <primitive: 169>
  23825.     ^Class allRoots inject: 0 into: [:sum :e | sum + e primAllSubinstances size]!
  23826.  
  23827. objectHeaderSize
  23828.     "Private - Answer the value of the receiver's ''objectHeaderSize'' instance variable."
  23829.  
  23830.     ^objectHeaderSize!
  23831.  
  23832. onPreSaveImage
  23833.     "Private - Clean up before a snapshot. We perform a compacting garbage collect
  23834.     to minimize the image size, and then move objects queued for finalization. 
  23835.     We need to ensure that all objects pending finalization do actually get finalized 
  23836.     to ensure that those holding external resources are cleared down. If any such objects
  23837.     were later finalized in a new session their internal state would be invalid (they will 
  23838.     contain invalid handles), but in any case the finalization queue is renewed on restart.
  23839.     It is not necessary to inform weak objects of their losses, because the Undertaker 
  23840.     runs at a high priority and should interrupt us to perform that task."
  23841.  
  23842.     self
  23843.         compact;
  23844.         administerLastRites!
  23845.  
  23846. onStartup
  23847.     "Private - The system has just started, kick start the Memory Manager."
  23848.  
  23849.     self resetGCStats.
  23850.     self registerObjects.
  23851.     self ensureProcessesRunning!
  23852.  
  23853. otOverflow: anInteger
  23854.     "Private - The VM has allocated more memory for objects headers.
  23855.     The <integer> arguments specifies the new size of the OT.
  23856.     N.B. Sent with interrupts disabled from the Processor
  23857.     in response to an interrupt generated by the VM."
  23858.  
  23859.     | now |
  23860.     now := Delay millisecondClockValue.
  23861.     now - lastGCTime > (lastGCDuration * 4) 
  23862.         ifTrue: 
  23863.             [lastGCTime := now.
  23864.             self primCollectGarbage: 1.
  23865.             lastGCDuration := Delay millisecondClockValue - now max: 10]!
  23866.  
  23867. primCollectGarbage: flags
  23868.     "Private - Invoke the fast (non-compacting) garbage collector. Answers the receiver.
  23869.     The primitive should not fail.
  23870.     Flags:
  23871.         1    - Treat all references as strong (i.e. ignore weak attribute of objects).
  23872.     "
  23873.  
  23874.     <primitive: 112>
  23875.     ^self primitiveFailed!
  23876.  
  23877. primCompact
  23878.     "Private - Invoke the slow (compacting) garbage collector. Answers the number of
  23879.     objects in the system following compaction. The primitive should not fail."
  23880.  
  23881.     <primitive: 115>
  23882.     ^self primitiveFailed
  23883.  
  23884. !
  23885.  
  23886. registerObjects
  23887.     "Private - Register the finalize and bereavement queue Semaphores with the VM."
  23888.  
  23889.     VMLibrary default
  23890.         registryAt: #MemoryManager put: self;
  23891.         registryAt: #Corpse put: DeadObject current;
  23892.         registryAt: #FinalizeQueue put: hospice;
  23893.         registryAt: #FinalizeSemaphore put: lastRequests;
  23894.         registryAt: #BereavementQueue put: bereaved;
  23895.         registryAt: #BereavementSemaphore put: bereavements.
  23896.  
  23897.     "Signal the semaphores in case any objects waiting in the queues"
  23898.     lastRequests signal.
  23899.     bereavements signal
  23900.     !
  23901.  
  23902. resetGCStats
  23903.     lastGCTime := lastGCDuration := 0.
  23904.     gcInterval := GCInterval!
  23905.  
  23906. undertaker
  23907.     "Private - Answer the value undertaker <Process>."
  23908.  
  23909.     ^undertaker!
  23910.  
  23911. undertaker: aProcessOrNil
  23912.     "Private - Set the receiver's undertaker process to the argument, aProcessOrNil, 
  23913.     terminating any existing undertaker. The undertaker funerals for bereaved weak objects 
  23914.     (i.e. it sends them #elementsExpired: messages)."
  23915.  
  23916.     undertaker isNil ifFalse: [undertaker terminate].
  23917.     undertaker := aProcessOrNil!
  23918.  
  23919. undertakerMain
  23920.     "Private - Wait for bereaved objects to be queued to the system bereavement queue, then attempt
  23921.     to empty that queue. The VM signals the queue semaphore each time it queues a group of objects to 
  23922.     the queue    so the semaphore's signal count does not accurately reflects the number of elements waiting 
  23923.     in the queue (this is to reduce the asynchronous signalling overhead and to permit user code to force
  23924.     synchronous notification by synchronously sending #directFunerals). Should the undertaker be
  23925.     prematurely terminated by an errror occurring in an elementsExpired: method, then it will be 
  23926.     automatically restarted."
  23927.  
  23928.     undertaker := Processor activeProcess.
  23929.     undertaker name: 'Undertaker'.
  23930.     [undertaker == Processor activeProcess] whileTrue: [
  23931.          bereavements wait.
  23932.         self directFunerals]! !
  23933.  
  23934. MenuItem comment:
  23935. 'MenuItem is an abstract class whose subclasses represent the items held by a <Menu>.
  23936.  
  23937. Class Variables:
  23938.     StringSeparator    <Character> separator to use when parsing menu definitions using #fromString:
  23939.     Dividers        <LookupTable> mapping divider definition strings to menu item style <selector>s.
  23940.  
  23941. '!
  23942. !MenuItem class methodsFor!
  23943.  
  23944. errorIllegalMenuString: illegalString
  23945.     "Private - Raise an error to inform that illegalString can not be
  23946.     used to generate a MenuItem because it is of the incorrect format."
  23947.  
  23948.     self error: 'Illegal menu string: ', illegalString!
  23949.  
  23950. fromString: menuString 
  23951.     "Answer a new sub-instance of the receiver generated from menuString."
  23952.  
  23953.     | divider |
  23954.     divider := Dividers at: menuString ifAbsent: [].
  23955.     divider notNil 
  23956.         ifTrue: [^DividerMenuItem perform: divider]
  23957.         ifFalse: 
  23958.             [| subStrings |
  23959.             (subStrings := menuString subStrings: StringSeparator) size == 3 
  23960.                 ifTrue: 
  23961.                     [| commandDescription accel |
  23962.                     commandDescription := CommandDescription command: (subStrings at: 3) asSymbol.
  23963.                     commandDescription description: (subStrings at: 1).
  23964.                     (accel := subStrings at: 2) isEmpty 
  23965.                         ifFalse: [commandDescription acceleratorKeyString: accel].
  23966.                     ^CommandMenuItem new commandDescription: commandDescription]
  23967.                 ifFalse: [self errorIllegalMenuString: menuString]]!
  23968.  
  23969. icon
  23970.     "Answers an Icon that can be used to represent this class"
  23971.  
  23972.     ^##(self) defaultIcon!
  23973.  
  23974. initialize
  23975.     "Private - Initialize the class variables of the receiver:
  23976.         MenuItem initialize
  23977.     Dividers            - Map between divider item strings and selectors.
  23978.     StringSeparator    - Character used to separate substrings of definitions."
  23979.  
  23980.     Dividers := 
  23981.         ##(LookupTable new
  23982.             at: '-' put: #separator;
  23983.             at: '|' put: #break;
  23984.             at: '||' put: #barBreak;
  23985.             shrink;
  23986.             yourself).
  23987.     StringSeparator := $/.
  23988.     StylesMask := 16rFFFFF.        "Allows a lot of space for more Microsoft flags"
  23989.     !
  23990.  
  23991. new
  23992.     "Private - MenuItem is abstract"
  23993.  
  23994.     ^self subclassResponsibility
  23995. !
  23996.  
  23997. stbConvertFrom: anSTBClassFormat 
  23998.     "Convert from earlier version models.
  23999.         1: Added 'typeFlags' instance variable.
  24000.         2: 'image' instance variable added to CommandMenuItem subclass"
  24001.  
  24002.     ^anSTBClassFormat version < 1 
  24003.         ifTrue: 
  24004.             [
  24005.             [:data | 
  24006.             | newInst |
  24007.             newInst := self basicNew.
  24008.             data keysAndValuesDo: [:i :v | newInst instVarAt: i + 1 put: v].
  24009.             newInst flags: MFT_STRING.
  24010.             newInst]]
  24011.         ifFalse: 
  24012.             [
  24013.             [:data | 
  24014.             | newInst |
  24015.             newInst := self basicNew.
  24016.             1 to: data size do: [:i | newInst instVarAt: i put: (data at: i)].
  24017.             newInst]]!
  24018.  
  24019. stbVersion
  24020.     "Answer the current binary filer version number for instances of the receiver."
  24021.  
  24022.     ^1! !
  24023.  
  24024. !MenuItem methodsFor!
  24025.  
  24026. acceleratorKey
  24027.     "Private - Answer the accelerator key code for the receiver."
  24028.  
  24029.     ^self subclassResponsibility!
  24030.  
  24031. acceleratorKey: anInteger
  24032.     "Private - Set the receiver's accelerator key code to the argument, anInteger."
  24033.  
  24034.     ^self subclassResponsibility!
  24035.  
  24036. bitmap
  24037.     "Answer the <Bitmap> image associated with this <menuItem>, or nil if none."
  24038.  
  24039.     ^nil!
  24040.  
  24041. command
  24042.     "Answer the command to action when this menu item is selected."
  24043.  
  24044.     ^self commandDescription command!
  24045.  
  24046. commandDescription
  24047.     "Private - Answer the <commandDescription> for the receiver"
  24048.  
  24049.     ^self subclassResponsibility!
  24050.  
  24051. edit
  24052.     "Private - Edit the receiver in a dialog box. By default you can't edit
  24053.     a MenuItem."
  24054.  
  24055.     ^self!
  24056.  
  24057. flags
  24058.     "Private - Answer the value of the receiver's ''flags'' instance variable."
  24059.  
  24060.     ^flags!
  24061.  
  24062. flags: anObject
  24063.     "Private - Set the value of the receiver's ''flags'' instance variable to the argument, anObject."
  24064.  
  24065.     flags := anObject!
  24066.  
  24067. free
  24068.     "Free any external resources owned by the receiver.
  24069.     Implemented for polymorphism with Menu (menu items may be further 
  24070.     leaves or branches)."!
  24071.  
  24072. hasSubmenu
  24073.     "Private - Answer whether the receiver has a submenu connected to it."
  24074.  
  24075.     ^false!
  24076.  
  24077. height
  24078.     "Private - Answer the height of a menu item as currently configured."
  24079.  
  24080.     ^self subclassResponsibility!
  24081.  
  24082. id
  24083.     "Private - Answers the menu item identifier for the receiver"
  24084.  
  24085.     ^self subclassResponsibility!
  24086.  
  24087. insertIntoMenu: aMenu at: position info: aMENUITEMINFO
  24088.     "Append the receiver to the menu, aMenu."
  24089.  
  24090.     self populateItemInfo: aMENUITEMINFO.
  24091.     (UserLibrary default 
  24092.         insertMenuItem: aMenu asParameter
  24093.         uItem: position
  24094.         fByPosition: true
  24095.         lpmii: aMENUITEMINFO)
  24096.             ifFalse: [Win32Error signal: 'Unable to realize ', self printString]!
  24097.  
  24098. isDefault
  24099.     "Answer whether the receiver is expecting to be the default item on a menu."
  24100.  
  24101.     ^false!
  24102.  
  24103. isDefault: aBoolean
  24104.     "Set whether the receiver is expecting to be the default item on a menu."
  24105.  
  24106.     "Do nothing at this level"!
  24107.  
  24108. isDivider
  24109.     "Answer whether the receiver is actually just a divider."
  24110.  
  24111.     ^false!
  24112.  
  24113. items
  24114.     "Private - Answer a collection of sub-items immediately under the receiver.
  24115.     Implemented for polymorphism with Menu (Composite pattern)."
  24116.  
  24117.     ^#()!
  24118.  
  24119. menuFromHandle: menuHandle
  24120.     "Return the Menu associated with this handle.
  24121.     Implemented for polymorphism with Menu (Composite pattern)."
  24122.  
  24123.     ^nil!
  24124.  
  24125. populateItemInfo: aMENUITEMINFO
  24126.     "Private - Copy the receiver's item information into the <MENUITEMINFOA> argument."
  24127.  
  24128.     ^self subclassResponsibility!
  24129.  
  24130. printOn: aStream
  24131.     "Appends the receiver to aStream as a representation that a 
  24132.     developer would want to see"
  24133.  
  24134.     aStream
  24135.         basicPrint: self;
  24136.         nextPut: $(;
  24137.         display: self;
  24138.         nextPut: $)!
  24139.  
  24140. queryAlong: route
  24141.     "Answer a <CommandQuery> reflecting the current state of the 
  24142.     receiver's command for the <commandPolicy>, route."
  24143.  
  24144.     ^route query: self commandDescription!
  24145.  
  24146. registerAcceleratorKeyIn: anAcceleratorTable
  24147.     "Private - Register the accelerator key associated with this menu item, if
  24148.     there is one, in anAcceleratorTable."!
  24149.  
  24150. styleFlags
  24151.     "Private - Answer the MENUITEMINFO style flags of the receiver (see
  24152.     Win32 SDK docs for fType field)."
  24153.  
  24154.     ^flags bitAnd: StylesMask
  24155. !
  24156.  
  24157. styleFlags: flagsInteger
  24158.     "Private - Set the MENUITEMINFO style flags of the receiver (see
  24159.     Win32 SDK docs for fType field)."
  24160.  
  24161.     flags := (flags maskClear: StylesMask) maskSet: (flagsInteger bitAnd: StylesMask)!
  24162.  
  24163. text
  24164.     "Private - Answer the menu text (i.e. the text that appears in the menu) for the receiver."
  24165.  
  24166.     ^self subclassResponsibility! !
  24167.  
  24168. Message comment:
  24169. ''!
  24170. !Message class methodsFor!
  24171.  
  24172. selector: aSymbol
  24173.     "Answer a new instance of the receiver with the selector, aSymbol"
  24174.  
  24175.     ^self new setSelector: aSymbol arguments: #()!
  24176.  
  24177. selector: aSymbol argument: anObject 
  24178.     "Answer a new instance of the receiver with selector, aSymbol, and argument, 
  24179.     anObject"
  24180.  
  24181.     ^self new setSelector: aSymbol arguments: (Array with: anObject)!
  24182.  
  24183. selector: aSymbol arguments: anArray 
  24184.     "Answer a new instance of the receiver with selector, aSymbol, and arguments, anArray"
  24185.  
  24186.     ^self new setSelector: aSymbol arguments: anArray
  24187. ! !
  24188.  
  24189. !Message methodsFor!
  24190.  
  24191. = aMessage
  24192.     "Answer true if the receiver and aMessage are equal.
  24193.     Since we override = we also override hash."
  24194.  
  24195.     ^self == aMessage or: [
  24196.         self species == aMessage species and: [
  24197.             self selector == aMessage selector and: [self arguments = aMessage arguments]]]!
  24198.  
  24199. argumentCount
  24200.     "Answer the <integer> number of arguments in the receiver's
  24201.     message."
  24202.  
  24203.     ^args size!
  24204.  
  24205. arguments
  24206.     "Answer a <sequencedReadableCollection> containing the receiver's
  24207.     arguments."
  24208.  
  24209.     ^args!
  24210.  
  24211. arguments: anArray
  24212.     "Set the argument list of the receiver to anArray.
  24213.     Answer the receiver."
  24214.  
  24215.     args := anArray
  24216. !
  24217.  
  24218. asSymbol
  24219.     "Answer the receiver's <selector>."
  24220.  
  24221.     ^selector!
  24222.  
  24223. forwardTo: anObject
  24224.     "Send the receiver Message to anObject for evaluation, 
  24225.     answering the result"
  24226.  
  24227.     ^anObject perform: selector withArguments: args!
  24228.  
  24229. forwardTo: anObject with: aParameter
  24230.     "Private - Send the receiver Message to anObject for evaluation with aParameter, 
  24231.     answering the result"
  24232.  
  24233.     ^anObject perform: selector with: aParameter
  24234.  
  24235. !
  24236.  
  24237. forwardTo: anObject withArguments: anArray
  24238.     "Private - Send the receiver Message to anObject for evaluation with anArray of arguments, 
  24239.     answering the result"
  24240.  
  24241.     ^anObject perform: selector withArguments: anArray
  24242. !
  24243.  
  24244. hash
  24245.     "Since we implement = we must also implement hash to match"
  24246.     
  24247.     ^selector hash + args hash!
  24248.  
  24249. printOn: target
  24250.     "Append a short textual description of the receiver to the <puttableStream>, 
  24251.     target, in the form a developer might want to see it (attempt an evaluable
  24252.     literal representation)."
  24253.  
  24254.     target
  24255.         nextPutAll: self class name;
  24256.         nextPutAll: ' selector: ';
  24257.         print: selector.
  24258.     args isEmpty ifFalse: [
  24259.         target 
  24260.             nextPutAll: ' arguments: ';
  24261.             print: args].!
  24262.  
  24263. selector
  24264.     "Answer the receiver's <selector>"
  24265.  
  24266.     ^selector!
  24267.  
  24268. selector: aSymbol
  24269.     "Set the <selector> for the receiver to the argument."
  24270.  
  24271.     selector := aSymbol.!
  24272.  
  24273. setSelector: aSymbol arguments: argArray
  24274.     "Private - Initialize the receiver's instance variables."
  24275.  
  24276.     selector := aSymbol.
  24277.     args := argArray!
  24278.  
  24279. value: anObject
  24280.     "Answer the result of sending the receiver to the object, anObject.
  24281.     Implementation Note: By implementing this selector from the monadic
  24282.     valuable protocol, we enable the substitution of Messages for a
  24283.     large number of parameterization cases where blocks would otherwise
  24284.     be required."
  24285.  
  24286.     ^self forwardTo: anObject
  24287.  
  24288.  
  24289. !
  24290.  
  24291. value: receiver value: argument
  24292.     "Answer the result of sending the receiving message to the object, receiver,
  24293.     with the argument, argument.
  24294.     Implementation Note: By implementing this selector from the dyadic
  24295.     valuable protocol, we enable the substitution of Messages for a
  24296.     further set of parameterization cases where blocks would otherwise
  24297.     be required."
  24298.  
  24299.     ^self forwardTo: receiver with: argument!
  24300.  
  24301. valueWithArguments: argArray
  24302.     "Evaluate the receiver with an <Array> of arguments in argArray"
  24303.  
  24304.     ^self forwardTo: argArray first withArguments: (argArray copyFrom: 2)! !
  24305.  
  24306. MessageBox comment:
  24307. 'Windows Message Box.
  24308.  
  24309. Example usage:
  24310.  
  24311. MessageBox confirm: ''Would you like a cup of tea?''.
  24312. MessageBox warning: ''Contents are hot''.
  24313. MessageBox errorMsg: ''You''''ve burned yourself''.'!
  24314. !MessageBox class methodsFor!
  24315.  
  24316. confirm: promptText
  24317.     "Display a Windows Message Box prompting for confirmation of the 
  24318.     <readableString> prompt, promptText.
  24319.     Answer whether the user confirmed (by pressing the Yes button).
  24320.     The caption will be filled in from the defaults later."
  24321.  
  24322.     ^self confirm: promptText  caption: nil!
  24323.  
  24324. confirm: prompt caption: title
  24325.     "Display a Windows Message Box prompting for confirmation of the 
  24326.     <readableString> question, prompt , with the <readableString> caption,
  24327.     title."
  24328.  
  24329.     ^self new
  24330.         caption: title;
  24331.         confirm: prompt !
  24332.  
  24333. confirm: aString onYes: yesBlock onNo: noBlock onCancel: cancelBlock
  24334.     "Prompts the user with a Yes/No/Cancel message box and evaluates the 
  24335.     appropriate block based on the response"
  24336.  
  24337.     ^self new
  24338.         confirm: aString
  24339.         onYes: yesBlock
  24340.         onNo: noBlock
  24341.         onCancel: cancelBlock!
  24342.  
  24343. defaultCaption: anInteger
  24344.     ^DefaultCaptions at: anInteger ifAbsent: [SessionManager current applicationName]!
  24345.  
  24346. errorMsg: errorText
  24347.     "Display a Windows message box for the receiver with the default Windows
  24348.     Error caption, the <readableString> message, errorText, and an OK button. 
  24349.     Answer the symbolic name of the key pressed by the receiver in response to the 
  24350.     message (see ButtonMap)."
  24351.  
  24352.     ^self errorMsg: errorText caption: nil!
  24353.  
  24354. errorMsg: errorText caption: title
  24355.     "Display a Windows Message Box for the receiver with the <readableString> caption, 
  24356.     title, the <readableString> message, errorText, and an OK button. 
  24357.     Answer the symbolic name of the key pressed by the receiver in response to the 
  24358.     message (see ButtonMap)."
  24359.  
  24360.     ^self new
  24361.         caption: title;
  24362.         errorMsg: errorText!
  24363.  
  24364. initialize
  24365.     "Private - Initialize the class variables of the receiver:
  24366.         MessageBox initialize
  24367.  
  24368.     DefaultButtson        - Array mapping button position (1..4) to the appropriate constant
  24369.                     for setting the default button.
  24370.     ButtonMap            - Map between Win32 button Ids and portable symbolic constants.
  24371.     DefaultCaptions    - Map between icon styles and default captions
  24372.     "
  24373.  
  24374.     DefaultButtons := Array 
  24375.                 with: MB_DEFBUTTON1
  24376.                 with: MB_DEFBUTTON2
  24377.                 with: MB_DEFBUTTON3
  24378.                 with: MB_DEFBUTTON4.
  24379.     ButtonMap := (IdentityDictionary new)
  24380.                 at: IDOK put: #ok;
  24381.                 at: IDCANCEL put: #cancel;
  24382.                 at: IDYES put: #yes;
  24383.                 at: IDNO put: #no;
  24384.                 at: IDABORT put: #abort;
  24385.                 at: IDRETRY put: #retry;
  24386.                 at: IDIGNORE put: #ignore;
  24387.                 shrink;
  24388.                 yourself.
  24389.     "Where there is no entry in the table for the message box type, the application name is used."
  24390.     DefaultCaptions := (LookupTable new)
  24391.                 at: MB_ICONQUESTION put: 'Please confirm...';
  24392.                 shrink;
  24393.                 yourself    "Use the Windows default caption"!
  24394.  
  24395. new
  24396.     "Answer a new, initialized, instance of the receiver."
  24397.  
  24398.     ^super new initialize!
  24399.  
  24400. notify: aString
  24401.     "Prompts the user with an ok box with the specified
  24402.     title and the information icon.
  24403.     The caption will be filled in from the defaults later."
  24404.  
  24405.     ^self notify: aString caption: nil!
  24406.  
  24407. notify: notifyString caption: titleString
  24408.     "Prompts the user with an ok box with the specified title
  24409.     and content, and the information icon."
  24410.  
  24411.     ^self new 
  24412.         caption: titleString;
  24413.         notify: notifyString!
  24414.  
  24415. warning: warningString
  24416.     "Display a Windows message box for the receiver with the default warning caption,
  24417.     and the message, warningString, and an OK button.
  24418.     The caption will be filled in from the defaults later."
  24419.  
  24420.     ^self warning: warningString
  24421.         caption: nil!
  24422.  
  24423. warning: warningString caption: titleString
  24424.     "Display a Windows message box for the receiver with the caption, captionString,
  24425.     and the warning message, warningString, and an OK button. Answer the receiver (after 
  24426.     the message box has closed)."
  24427.  
  24428.     self new 
  24429.         caption: titleString;
  24430.         warning: warningString! !
  24431.  
  24432. !MessageBox methodsFor!
  24433.  
  24434. abortRetryIgnore
  24435.     "Set the receiver's style such that the receiver opens with Abort, Retry and Ignore 
  24436.     push buttons."
  24437.  
  24438.     self styleMaskSet: MB_ABORTRETRYIGNORE!
  24439.  
  24440. basicOpen
  24441.     "Private - Display the receiver, and answer the Win32 Id of the button pressed by the user."
  24442.  
  24443.     | lib wasDisabled hWnd |
  24444.     lib := UserLibrary default.
  24445.     struct owner isNil 
  24446.         ifTrue: 
  24447.             ["Get close to the metal in case there is no active window or
  24448.             the View system is in a perilous state, or we wan't it to be
  24449.             removed from the deployed app."
  24450.  
  24451.             struct owner: lib getActiveWindow].
  24452.     "Setup default caption if none other specified."
  24453.     struct caption isNil ifTrue: [struct caption: self defaultCaption].
  24454.     self isTaskModal 
  24455.         ifTrue: 
  24456.             ["If taskModal, then the owner will be the desktop so we need to get actual active view"
  24457.  
  24458.             hWnd := lib getActiveWindow.
  24459.             "Ensure owner is (temporarily) enabled to prevent losing activation when task modal message box is closed"
  24460.             (wasDisabled := (lib isWindowEnabled: hWnd) not) 
  24461.                 ifTrue: [lib enableWindow: hWnd bEnable: true].
  24462.             
  24463.             [SessionManager inputState startIdleTimer: hWnd.
  24464.             "Task modal only disables windows in the calling thread, so we can't use an     overlapped call here."
  24465.             button := lib messageBoxIndirect: struct] 
  24466.                     ensure: [SessionManager inputState stopIdleTimer: hWnd]]
  24467.         ifFalse: 
  24468.             [hWnd := struct owner asParameter.
  24469.             wasDisabled := (lib isWindowEnabled: hWnd) not.
  24470.             "MessageBoxIndirect is called using an overlapped call on a separate thread to avoid
  24471.             losing control of the message loop"
  24472.             Processor forkMainIfMain.
  24473.             button := lib overlappedMsgBoxIndirect: struct].
  24474.  
  24475.     "The message box will unhelpfully re-enable the window regardless of whether previously disabled"
  24476.     wasDisabled ifTrue: [lib enableWindow: hWnd bEnable: false].
  24477.     button == 0 ifTrue: [lib systemError].
  24478.     ^button!
  24479.  
  24480. beep
  24481.     "Play the system parp appropriate for the style of the receiver."
  24482.  
  24483.     Sound beep: self iconStyle!
  24484.  
  24485. button
  24486.     "Private - Answer the Win32 id for the button pressed by the user."
  24487.  
  24488.     ^button!
  24489.  
  24490. caption
  24491.     "Answer the receiver's current caption."
  24492.  
  24493.     | s |
  24494.     s := struct caption.
  24495.     ^s isNil
  24496.         ifTrue: [self defaultCaption]
  24497.         ifFalse: [s]!
  24498.  
  24499. caption: aString
  24500.     "Set the receiver's caption to be the argument, aString."
  24501.  
  24502.     struct caption: aString!
  24503.  
  24504. confirm: promptString
  24505.     "Display a host system message box with the prompt, promptString, with caption, 
  24506.     captionString, and Yes and No push buttons. Answer whether the user confirmed 
  24507.     (by pressing the Yes button)."
  24508.  
  24509.     ^(self
  24510.         text: promptString;
  24511.         prompt;
  24512.         yesNo;
  24513.         open) == #yes!
  24514.  
  24515. confirm: aString onYes: yesBlock onNo: noBlock onCancel: cancelBlock
  24516.     "Prompts the user with a Yes/No/Cancel message box and evaluates the appropriate block based on the response"
  24517.  
  24518.     | response |
  24519.     response := self confirmOrCancel: aString.
  24520.  
  24521.     ^response == #cancel
  24522.         ifTrue: [cancelBlock value]
  24523.         ifFalse: [ 
  24524.             response == #yes
  24525.                 ifTrue: [yesBlock value]
  24526.                 ifFalse: [noBlock value]]!
  24527.  
  24528. confirmOrCancel: promptString
  24529.     "Display a host system message box for the receiver with the prompt, aString,
  24530.     and Yes, No and Cancel push buttons. Answer one of the symbolic
  24531.     constants #yes, #no, #cancel, according to the button pressed by the receiver."
  24532.  
  24533.     ^self
  24534.         text: promptString;
  24535.         prompt;
  24536.         yesNoCancel;
  24537.         open!
  24538.  
  24539. defaultButton: anInteger
  24540.     "Set the default push button to be used when the receiver is opened. By default
  24541.     the first push button is the default button."
  24542.  
  24543.     self styleMaskSet: (DefaultButtons at: anInteger)!
  24544.  
  24545. defaultCaption
  24546.     "Private - Answer a suitable default caption based on style of the 
  24547.     message box."
  24548.  
  24549.     ^self class defaultCaption: self iconStyle!
  24550.  
  24551. error
  24552.     "Set the receiver's style such that the receiver opens as an error message."
  24553.  
  24554.     self styleMaskSet: MB_ICONERROR!
  24555.  
  24556. errorCaption
  24557.     "Answer the default caption for error message boxes."
  24558.  
  24559.     ^'Error'!
  24560.  
  24561. errorMsg: textString
  24562.     "Display a Windows message box for the receiver with the currently
  24563.     configured caption, and the error message, textString. Answer the 
  24564.     receiver (after the message box has closed)."
  24565.  
  24566.     ^self
  24567.         text: textString;
  24568.         error;
  24569.         "taskModal;"
  24570.         open!
  24571.  
  24572. fatalError
  24573.     "Set the receiver's style such that the receiver opens as a fatal error message (e.g.
  24574.     for out of resource situations)."
  24575.  
  24576.     self styleMaskSet: ##(MB_ICONERROR | MB_SYSTEMMODAL)!
  24577.  
  24578. icon: anIcon
  24579.     "Set the receiver's icon to be the argument, anIcon.
  24580.     The icon MUST have been loaded from resources"
  24581.  
  24582.     "NOTE: It appears that Win9x does not support the MB_USERICON message box
  24583.     style in the same way as NT4. For this reason we have disabled the ability to set
  24584.     a user defined icon for Win9x"
  24585.  
  24586.     #todo "Addess this for Win9x".
  24587.     OSVERSIONINFO current isWin9X 
  24588.         ifTrue: [ self notify ]
  24589.         ifFalse: [ struct icon: anIcon ]!
  24590.  
  24591. iconStyle
  24592.     "Private - Answer the icon style bits from the receiver's style mask."
  24593.  
  24594.     ^self style bitAnd: MB_ICONMASK
  24595. !
  24596.  
  24597. initialize
  24598.     "Private - Initialize the receiver's instance variables."
  24599.  
  24600.     struct := MSGBOXPARAMS new!
  24601.  
  24602. isTaskModal
  24603.     "Private - Answer whether the receiver is task modal (i.e. modal to all windows
  24604.     in the application not just the active one)."
  24605.  
  24606.     ^struct dwStyle allMask: MB_TASKMODAL!
  24607.  
  24608. notify
  24609.     "Set the receiver's style such that the receiver opens as a notification."
  24610.  
  24611.     self styleMaskSet: MB_ICONINFORMATION!
  24612.  
  24613. notify: notifyString
  24614.     "Display a host system message box for the receiver with the current caption,
  24615.     and the informational message, notifyString, and an OK button. Answer
  24616.     the receiver (after the message box has closed)."
  24617.  
  24618.     ^self
  24619.         text: notifyString;
  24620.         notify;
  24621.         open!
  24622.  
  24623. ok
  24624.     "Set the receiver's style such that the receiver opens with an OK button."
  24625.  
  24626.     self styleMaskSet: MB_OK!
  24627.  
  24628. okCancel
  24629.     "Set the receiver's style such that the receiver opens with OK and Cancel push buttons."
  24630.  
  24631.     self styleMaskSet: MB_OKCANCEL!
  24632.  
  24633. open
  24634.     "Display a host system message box for the receiver, and answer a portable symbolic constant 
  24635.     for the button pressed by the user.
  24636.     Note that the message box will beep when opened by the user (if configured)."
  24637.  
  24638.     ^self basicOpen; result!
  24639.  
  24640. owner: aHandle
  24641.     "Set the receiver's owning window handle to be the argument, aHandle.
  24642.     aHandle can be 0 if desired. If the handle is not explicitly set to 0,
  24643.     then the current active window handle will be used."
  24644.  
  24645.     struct owner: aHandle!
  24646.  
  24647. prompt
  24648.     "Set the receiver's style such that the receiver opens as a prompt."
  24649.  
  24650.     self styleMaskSet: MB_ICONQUESTION!
  24651.  
  24652. result
  24653.     "Answer a portable symbolic constant describing the button that was pressed by the user
  24654.     to close the receiver."
  24655.  
  24656.     ^ButtonMap at: button.
  24657. !
  24658.  
  24659. retryCancel
  24660.     "Set the receiver's style such that the receiver opens with Retry and Cancel push buttons."
  24661.  
  24662.     self styleMaskSet: MB_RETRYCANCEL!
  24663.  
  24664. setForeground
  24665.     "Set the receiver's style such that the receiver opens in the foreground."
  24666.  
  24667.     self styleMaskSet: MB_SETFOREGROUND!
  24668.  
  24669. style
  24670.     "Answer the receiver's currently configured message box styles."
  24671.  
  24672.     ^struct dwStyle!
  24673.  
  24674. style: flagsInteger
  24675.     "Private - Set the reciever's style to the argument, flagsInteger."
  24676.  
  24677.     struct dwStyle: flagsInteger!
  24678.  
  24679. styleMaskSet: maskInteger
  24680.     "Private - Add the specified message box style mask into the currently
  24681.     configured styles."
  24682.  
  24683.     struct styleMaskSet: maskInteger!
  24684.  
  24685. systemModal
  24686.     "Set the receiver's style so that it is system modal (i.e. all top level windows are 
  24687.     disabled) when opened. Since this option disables all other applications, it should
  24688.     be used only when catastrophic errors occur which require immediate user attention.
  24689.     N.B. Should be combined with #error to prevent activation messages being sent to
  24690.     the parent window when opened."
  24691.  
  24692.     self styleMaskSet: MB_SYSTEMMODAL!
  24693.  
  24694. taskModal
  24695.     "Set the receiver's style so that it is task modal (i.e. all top level Dolphin
  24696.     windows are disabled) when opened. Other applications are unaffected.
  24697.     Task modality only works in Win32 if the owner window handle is NULL, and by
  24698.     default we pass the handle of the active window, so must explicity null it here."
  24699.  
  24700.     self styleMaskSet: MB_TASKMODAL;     setForeground.
  24701.     self owner: 0!
  24702.  
  24703. text: aString
  24704.     "Set the receiver's text message to be the argument, aString."
  24705.  
  24706.     struct text: aString!
  24707.  
  24708. warning
  24709.     "Set the receiver's style such that the receiver opens as an warning message."
  24710.  
  24711.     self styleMaskSet: MB_ICONWARNING!
  24712.  
  24713. warning: warningString
  24714.     "Display a Windows message box for the receiver with the currently configured caption,
  24715.     and the warning message, warningString, and an OK button. Answer the receiver (after 
  24716.     the message box has closed)."
  24717.  
  24718.     ^self
  24719.         text: warningString;
  24720.         warning;
  24721.         open!
  24722.  
  24723. yesNo
  24724.     "Set the receiver's style such that it opens with Yes and No buttons
  24725.     (appropriate for prompts)."
  24726.  
  24727.     self styleMaskSet: MB_YESNO!
  24728.  
  24729. yesNoCancel
  24730.     "Set the receiver's style such that it opens with Yes, No, and Cancel buttons
  24731.     (appropriate for prompts)."
  24732.  
  24733.     self styleMaskSet: MB_YESNOCANCEL! !
  24734.  
  24735. MessageSequenceAbstract comment:
  24736. ''!
  24737. !MessageSequenceAbstract class methodsFor!
  24738.  
  24739. new
  24740.     "Answer an instance of the receiver; instance require initialization"
  24741.  
  24742.     ^super new initialize! !
  24743.  
  24744. !MessageSequenceAbstract methodsFor!
  24745.  
  24746. add: anEventMessageSend
  24747.     "Adds a <MessageSend> to this sequence."
  24748.  
  24749.     ^self subclassResponsibility!
  24750.  
  24751. argumentCount
  24752.     "Actually the argument count might be variable, but this seems the only sensible 
  24753.     implementation for this part of the protocol <message>."
  24754.  
  24755.     ^0!
  24756.  
  24757. asMinimumRepresentation
  24758.     "Attempts to fold the receiver to its minimum representation.
  24759.     If the receiver is empty return nil, otherwise return the receiver unchanged.
  24760.     Subclasses may re-implement this to compress dead space in themselves"
  24761.     
  24762.     ^self size == 0 ifFalse: [self]
  24763. !
  24764.  
  24765. forwardTo: anObject
  24766.     "Forwards all the messages in this sequence to anObject. Answers the
  24767.     result of the last message in the sequence."
  24768.  
  24769.     | answer |
  24770.     self messagesDo: [:each | answer := each forwardTo: anObject].
  24771.     ^answer!
  24772.  
  24773. includes: aMessage
  24774.     "Answer whether the argument, anObject, is equal to one of the 
  24775.     receiver's elements."
  24776.  
  24777.     self messagesDo: [:each | aMessage = each ifTrue: [^true]].
  24778.     ^false!
  24779.  
  24780. isEmpty
  24781.     "Answers true if there are no message in this sequence"
  24782.  
  24783.     ^self size == 0!
  24784.  
  24785. messagesDo: aBlock
  24786.     "Private - Enumerates through the receiver"
  24787.  
  24788.     ^self subclassResponsibility!
  24789.  
  24790. value
  24791.     "Plays all the messages in this sequence. They are assumed to be MessageSends
  24792.     that are fully qualified with their receivers. Answers the result of the last 
  24793.     message in the sequence."
  24794.  
  24795.     | answer |
  24796.     self messagesDo: [:each | answer := each value].
  24797.     ^answer!
  24798.  
  24799. value: arg1
  24800.     "Plays all the messages in this sequence passing the <Object> arg1 as a parameter. 
  24801.     They are assumed to be <message>s that are fully qualified with their receivers. 
  24802.     Answers the result of the last message in the sequence."
  24803.  
  24804.     | answer |
  24805.     self messagesDo: [:each | answer := each value: arg1].
  24806.     ^answer!
  24807.  
  24808. value: arg1 value: arg2
  24809.     "Plays all the messages in this sequence passing the <Object>s arg1 and arg2 as parameters. 
  24810.     They are assumed to be <message>s that are fully qualified with their receivers. 
  24811.     Answers the result of the last message in the sequence."
  24812.  
  24813.     | answer |
  24814.     self messagesDo: [:each | answer := each value: arg1 value: arg2].
  24815.     ^answer!
  24816.  
  24817. valueWithArguments: argArray
  24818.     "Evaluate the receiver with an <Array> of arguments in argArray"
  24819.  
  24820.     | answer |
  24821.     self messagesDo: [:each | answer := each valueWithArguments: argArray].
  24822.     ^answer! !
  24823.  
  24824. MethodCategorizationPolicy comment:
  24825. ''!
  24826. !MethodCategorizationPolicy class methodsFor!
  24827.  
  24828. default
  24829.     "Answer the default instance of the receiver."
  24830.  
  24831.     ^Default!
  24832.  
  24833. initialize    
  24834.     "Private - Initialize the receiver's class variables.
  24835.         MethodCategorizationPolicy initialize
  24836.     "
  24837.  
  24838.     Default := self new!
  24839.  
  24840. uninitialize
  24841.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  24842.  
  24843.     Default := nil.! !
  24844.  
  24845. !MethodCategorizationPolicy methodsFor!
  24846.  
  24847. allCategoriesOfSelector: selector
  24848.     "Private - Answer a <Collection> of all the <methodCategory>s in which
  24849.     the selector <Symbol>, selector, currently appears."
  24850.  
  24851.     | answer |
  24852.     answer := IdentitySet new.
  24853.     self class environment allBehaviorsDo: [:c | | method |
  24854.         method := c compiledMethodAt: selector ifAbsent: [].
  24855.         method notNil ifTrue: [answer addAll: (c categoriesOfMethod: method)]].
  24856.     ^answer!
  24857.  
  24858. bestSuggestionFor: aCompiledMethod
  24859.     "Answer the best suggestion for a category into which aCompiledMethod should be placed"
  24860.  
  24861.     ^(self suggestionsFor: aCompiledMethod) first!
  24862.  
  24863. couldBeAccessor: method
  24864.     "Private - Answer whether the <Symbol>, selector, might possibly be an accessor method 
  24865.     for its method class."
  24866.  
  24867.     | selector |
  24868.     selector := method selector.
  24869.     ^selector argumentCount <= 1 and: [ | name |
  24870.         name := selector last = $: 
  24871.             ifTrue: [selector allButLast]
  24872.             ifFalse: [selector asString].
  24873.         (method methodClass instVarNames detect: [ :each | each = name ] ifNone: []) notNil]
  24874. !
  24875.  
  24876. defaultCategories: method
  24877.     "Private - Answer a <sequencedReadableCollection> of default categories to be presented
  24878.     for the <CompiledMethod>, method."
  24879.  
  24880.     | catClass methodClass answer |
  24881.     methodClass := method methodClass.
  24882.     catClass := methodClass methodCategoryClass.
  24883.     answer := OrderedCollection new: 3.
  24884.     answer
  24885.         add: (catClass name: 'accessing');
  24886.         add: (catClass name: 'helpers').
  24887.     methodClass isMeta 
  24888.         ifTrue: [answer add: (catClass name: 'instance creation')]
  24889.         ifFalse: [answer add: (catClass name: 'operations')].
  24890.     ^answer!
  24891.  
  24892. isReturnConstant: aCompiledMethod 
  24893.     "Private - Answer whether the <CompiledMethod> argument returns a constant value."
  24894.  
  24895.     ^aCompiledMethod extraIndex between: 2 and: 5!
  24896.  
  24897. prefixCategories
  24898.     ^#(
  24899.     #('is' 'testing')
  24900.     #('can' 'testing')
  24901.     #('as' 'converting')
  24902.     #('be' 'modes') 
  24903.     #('error' 'exceptions') 
  24904.     #('on' 'event handling') 
  24905.     #('add' 'adding') 
  24906.     #('remove' 'removing') 
  24907.     #('compare' 'comparing') 
  24908.     #('refresh' 'updating') 
  24909.     #('test' 'unit tests')
  24910.     )!
  24911.  
  24912. suffixCategories
  24913.     ^#(
  24914.     #('Changed' 'updating')
  24915.     #('Menu' 'menus')
  24916.     #('Model' 'models')
  24917.     #('View' 'views')
  24918.     #('Shell' 'views')
  24919.     #('Dialog' 'views')
  24920.     )
  24921. !
  24922.  
  24923. suggestedPrivacyFor: method
  24924.     "Answer the suggested <MethodPrivacyCategory> for the <CompiledMethod>, method."
  24925.  
  24926.     | source catClass |
  24927.     source := method getSource.
  24928.     catClass := method methodClass methodCategoryClass.
  24929.     ^(source indexOfSubCollection: '"Private -') == 0
  24930.         ifTrue: [catClass public]
  24931.         ifFalse: [catClass private]!
  24932.  
  24933. suggestionsFor: method 
  24934.     "Answer a <sequencedReadableCollection> of suggested method categories for 
  24935.     the <CompiledMethod>, method. Entries towards the start of the list are considered 
  24936.     to be better suggestions"
  24937.  
  24938.     | suggestions selector categoryManager |
  24939.     categoryManager := method methodClass methodCategoryClass.
  24940.     suggestions := self superCategoriesOf: method.
  24941.     selector := method selector.
  24942.     (self isReturnConstant: method) 
  24943.         ifTrue: [suggestions add: (categoryManager name: 'constants')].
  24944.     (self couldBeAccessor: method) 
  24945.         ifTrue: [suggestions add: (categoryManager name: 'accessing')].
  24946.     suggestions addAll: (self allCategoriesOfSelector: selector).
  24947.     self prefixCategories do: 
  24948.             [:each | 
  24949.             (selector beginsWith: each first) 
  24950.                 ifTrue: [suggestions add: (categoryManager name: each last)]].
  24951.     self suffixCategories do: 
  24952.             [:each | 
  24953.             (selector endsWith: each first) 
  24954.                 ifTrue: [suggestions add: (categoryManager name: each last)]].
  24955.  
  24956.     "If there are no better suggestions then use 'accessing' or 'operations', etc"
  24957.     suggestions addAll: (self defaultCategories: method).
  24958.  
  24959.     "Remove any dumb suggestions"
  24960.     suggestions := suggestions select: [:s | s isVirtual not and: [s acceptsAdditions]].
  24961.  
  24962.     "And finally remove any existing categories."
  24963.     suggestions := suggestions copyWithoutAll: method categories.
  24964.     ^suggestions!
  24965.  
  24966. superCategoriesOf: method
  24967.     "Private - Answer a <sequencedReadableCollection> of the categories of superclass implementations
  24968.     of the <CompiledMethod>, method. Categories may appear more than once in the collection."
  24969.  
  24970.     | selector suggestions |
  24971.     selector := method selector.
  24972.     suggestions := OrderedCollection new.
  24973.     method methodClass allSuperclasses do: [ :each |
  24974.         (each includesSelector: selector) ifTrue: [ | m |
  24975.             m := each compiledMethodAt: selector.
  24976.             suggestions addAll: method categories]].
  24977.     ^suggestions! !
  24978.  
  24979. MethodContext comment:
  24980. ''!
  24981. !MethodContext methodsFor!
  24982.  
  24983. argumentCount
  24984.     "Private - Answer the number of arguments to the context. In the case of a MethodContext
  24985.     we ask its associated CompiledMethod. This implementation of #argumentCount does
  24986.     not imply that MethodContext complies with the ANSI <valuable> protocol (it does not)."
  24987.  
  24988.     ^self method argumentCount!
  24989.  
  24990. at: index
  24991.     "Answer the receiver's indexed instance variable at the argument index.
  24992.     As basicAt:, but may be reimplemented.
  24993.  
  24994.     Primitive Failure Reasons:
  24995.         0    - aSmallInteger is not a SmallInteger
  24996.         1    - aSmallInteger out of bounds (not in the range 1..receiver's indexable size)."
  24997.  
  24998.     <primitive: 49>
  24999.     ^self errorAt: index!
  25000.  
  25001. at: index put: value
  25002.     "Replace the receivers indexed instance variable at the argument,
  25003.     index, with the argument, value. Answer value.
  25004.     As basicAt:put: but may be reimplemented.
  25005.  
  25006.     Primitive Failure Reasons:
  25007.         0    - aSmallInteger is not a SmallInteger
  25008.         1    - aSmallInteger out of bounds (not in the range 1..receiver's indexable size) 
  25009.         2    - the argument, value, is not of a class which can be stored in the receiver
  25010.             (e.g. its a non-SmallInteger and the receiver is a ByteArray)."
  25011.  
  25012.     <primitive: 50>
  25013.     ^self errorAt: index put: value!
  25014.  
  25015. frameClass
  25016.     "Private - Answer the class of StackFrame to represent activations of the
  25017.     receiver."
  25018.  
  25019.     ^ContextFrame!
  25020.  
  25021. hasReturned
  25022.     "Private - Answer whether the receiver has already returned, and is therefore
  25023.     inactive. In the case of a MethodContext, if returned it can never be
  25024.     reactivated, but BlockContexts can be activated and return any number 
  25025.     of times."
  25026.  
  25027.     ^self outer == 0!
  25028.  
  25029. home
  25030.     "Privte - Answer the home context of the context. In the case of a MethodContext,
  25031.     this is always itself"
  25032.  
  25033.     ^self!
  25034.  
  25035. method
  25036.     "Private - Answer the home method for which the context represents execution state"
  25037.  
  25038.     ^method!
  25039.  
  25040. method: aCompiledMethod
  25041.     "Private - Set the home method for which the context represents execution state."
  25042.  
  25043.     method := aCompiledMethod!
  25044.  
  25045. outer
  25046.     "Private - Answer a SmallInteger pointer to the receiver's associated stack
  25047.     frame, or nil if the receiver has already returned."
  25048.  
  25049.     ^frame!
  25050.  
  25051. printOn: aStream
  25052.     "Append, to aStream, a String whose characters are a description of the receiver."
  25053.  
  25054.     aStream
  25055.         basicPrint: self;
  25056.         nextPutAll: ' for ';
  25057.         print: self method!
  25058.  
  25059. receiver
  25060.     "Private - Answer the 'self' of the context"
  25061.  
  25062.     ^receiver!
  25063.  
  25064. receiver: newReceiver
  25065.     "Private - Set the 'self' of the context"
  25066.  
  25067.     receiver := newReceiver! !
  25068.  
  25069. MethodProtocol comment:
  25070. 'MethodProtocol is a meta-information class which groups a set of selectors to form a cohesive unit of behavior which is independent of the class hierarchy. A class is said to conform to a MethodProtocol if it implements each of the selectors in the protocol, and if it claims to support the protocol, i.e. implementation of the set of selectors is a necessary but not sufficient condition because the implementation of the selectors must be as specified by the protocol. The precise semantics of the protocol are not formally specified by instances of this class, and cannot be tested by it, therefore if the programmer asserts that a class conforms to a protocol and it implements all the necessary selectors, that is deemed sufficient for conformance. A class automatically conforms to any protocols to which its superclasses conform.
  25071.  
  25072. If a method implementing a required protocol selector is removed from a class then the system automatically removes the protocol from the list supported by that class. Conversely if a protocol is extended by the addition of new selectors then this may result in the addition of stub method implementations to all conforming classes which do not currently respond to that selector. These stub methods raise an error when invoked and may be located by browsing the ''not yet implemented'' pseudo-category.
  25073.  
  25074. Conformance to a protocol may be tested a run-time by sending the message #conformsToProtocol: to the class. This is akin to send a #respondsTo: message to enquire whether a class understands an individual selector. By maintaining the protocol invariant that all conforming classes must respond to all a protocols selectors the system can perform a very fast conformance test (symbol lookup with in a set, chaining up the class hierarchy).
  25075.  
  25076. Each class (ClassDescription) stores a set of the symbolic names of the protocols to which it conforms, excluding those to which its superclasses conform. Testing for protocol conformance (using #conformsToProtocol:) is by symbolic name, and therefore it may be possible to strip the MethodProtocol objects themselves from a run-time application.
  25077.  
  25078. It is a good idea to keep protocols small, as this reduces the burden of implementation in a new class (you can quickly add a full set of stub methods in a class by dragging the protocol into the class, or by using the Add/Protocol command, in the Class Hierarchy Browser). You should also avoid extending the system defined protocols: Most of these are as defined by the ANSI Smalltalk Standard.
  25079.  
  25080. Instance Variables:
  25081.     name    <Symbol>        Unique symbolic name of the protocol (identity)
  25082.     comment    <String> or nil.    Description of the protocol (e.g. its specifiction)
  25083.     selectors    <IdentitySet>    The set of selectors required by the protocol
  25084.     flags    <integer>        Various boolean attributes of the protocol
  25085.  
  25086. Class Variables
  25087.     Protocols        <IdentityDictionary>    Maps protocol names to instances.
  25088.     StubAddedSignal    <NotificationSignal> Resumable signal raised when a stub method is generated.
  25089.     ReadOnlyMask    <integer> Masks read-only flag from flags instance variable
  25090.     ANSIMask    <integer> Masks ANSI flag from flags instance variable
  25091.  
  25092. '!
  25093. !MethodProtocol class methodsFor!
  25094.  
  25095. allMethodProtocols
  25096.     "Answer the a <collection> of all <MethodProtocols>s current registered in the system.
  25097.         MethodProtocol allMethodProtocols size
  25098.     "
  25099.  
  25100.     ^Protocols asArray!
  25101.  
  25102. ansiIcon
  25103.     "Private - Answers an Icon that can be used to represent an ANSI standard protocol."
  25104.  
  25105.     ^Icon fromId: 'METHODPROTOCOL_ANSI.ICO'!
  25106.  
  25107. existing: protocolName
  25108.     "Answer an existing <MethodProtocol> with the specified
  25109.     <Symbol> name, protocolName. Signals a NotFound exception
  25110.     if protocolName does not specify an existing protocol."
  25111.  
  25112.     ^Protocols at: protocolName asSymbol.!
  25113.  
  25114. exists: protocolName
  25115.     "Answer whether the named protocol exists."
  25116.  
  25117.     ^Protocols includesKey: protocolName asSymbol!
  25118.  
  25119. icon
  25120.     "Answers an Icon that can be used to represent this class. Here we use a constant expression 
  25121.     evaluated at compile time in order to statically bind 'self' at this position in the class hierarchy 
  25122.     (i.e. to Object). This ensures that subclasses which do not override this method still answer 
  25123.     'Object defaultIcon' rather than 'aSubclass defaultIcon'. Classes which provide their own default icon 
  25124.     can override this method with a similar implementation perhaps with #defaultIconFrom: if the icon comes
  25125.     from an ExternalResourceLibrary other than the system default."
  25126.  
  25127.     ^##(self) defaultIcon!
  25128.  
  25129. initialize
  25130.     "Private - Initialize the receiver's class variables.
  25131.         MethodProtocol initialize
  25132.     "
  25133.  
  25134.     StubAddedSignal := NotificationSignal description: '%1'.
  25135.     Protocols isNil ifTrue: [self initializeProtocols].
  25136.  
  25137.     ReadOnlyMask := 1.
  25138.     ANSIMask := 2.!
  25139.  
  25140. initializeProtocols
  25141.     "Private - Discard all existing protocols."
  25142.  
  25143.     Protocols := IdentityDictionary new!
  25144.  
  25145. name: protocolName
  25146.     "Answer a new or existing <MethodProtocol> with the specified
  25147.     <Symbol> name, protocolName."
  25148.  
  25149.     | symbol |
  25150.     symbol := protocolName asSymbol.
  25151.     ^Protocols at: symbol ifAbsentPut: [self basicNew setName: symbol; yourself]!
  25152.  
  25153. new
  25154.     "MethodProtocols must be unique for any particular name, and must be instantiated with the #name:
  25155.     method."
  25156.  
  25157.     ^self shouldNotImplement!
  25158.  
  25159. publishedEventsOfInstances
  25160.         "Answer a <Set> of <Symbol>s that describe the published events triggered
  25161.         by instances of the receiver."
  25162.     
  25163.         ^super publishedEventsOfInstances
  25164.             add: #protocolUpdated:;
  25165.             yourself.
  25166.     !
  25167.  
  25168. purgeUnused
  25169.     "Discard all method protocols which are not currently implemented by any class in the system.
  25170.     This might take a while.
  25171.         MethodProtocol purgeUnused
  25172.     "
  25173.  
  25174.     | allUsed |
  25175.     allUsed := IdentitySet new.
  25176.     self environment allBehaviorsDo: [:c | allUsed addAll: c protocols].
  25177.     (Protocols difference: allUsed) do: [:p | 
  25178.         self assert: [p behaviors isEmpty].
  25179.         Protocols removeKey: p name]
  25180.  
  25181.         
  25182.         !
  25183.  
  25184. readOnlyIcon
  25185.     "Private - Answers an Icon that can be used to represent a read-only protocol."
  25186.  
  25187.     ^Icon fromId: 'METHODPROTOCOL_READONLY.ICO'!
  25188.  
  25189. removeProtocol: protocolName
  25190.     "Remove the <MethodProtocol>, named by the <symbol>, protocolName, from the system."
  25191.  
  25192.     | symbol prot |
  25193.     symbol := protocolName asSymbol.
  25194.     prot := Protocols at: symbol.
  25195.     prot baseBehaviors do: [:c | c removeProtocol: prot].
  25196.     Protocols removeKey: symbol.
  25197.     self environment trigger: #protocolRemoved: with: prot!
  25198.  
  25199. separator
  25200.     "Private - Answer a Character used to split the individual names in a
  25201.     complete category."
  25202.  
  25203.     ^ $-!
  25204.  
  25205. stubAddedSignal
  25206.     "Private - Answer the signal which is raised when a stub method is added
  25207.     automatically in order to keep a class' protocol implementation complete."
  25208.  
  25209.     ^StubAddedSignal! !
  25210.  
  25211. !MethodProtocol methodsFor!
  25212.  
  25213. <= comperand
  25214.     "Answer whether the receiver is less than or equal to the <MethodProtocol>,
  25215.     comperand. This is to allow protocols to be sorted with the default sort block."
  25216.  
  25217.     ^self name <= comperand name!
  25218.  
  25219. = comperand
  25220.     "Answer whether the receiver is considered equal to the <Object>, comperand."
  25221.  
  25222.     ^self species == comperand species and: [self asSymbol == comperand asSymbol]!
  25223.  
  25224. addAllSelectors: newSelectors
  25225.     "Add the <collection> of <Symbol>s, newSelectors, to the set of method selectors 
  25226.     included in the receiver's protocol. Then ensure that the MethodProtocol invariants are
  25227.     maintained by ensuring that all conforming classes can understand the new selectors
  25228.     (by adding a dummy implementations if necessary), and that their implementing
  25229.     methods are recorded in the protocol."
  25230.  
  25231.     | extras |
  25232.     extras := newSelectors difference: selectors.
  25233.     extras isEmpty ifFalse: [
  25234.         "Record the additional selectors in the protocol"
  25235.         selectors addAll: extras.
  25236.  
  25237.         "Ensure all conforming classes implement the newly expanded protocols.
  25238.          Note that it is very important that #behaviors orders superclasses before subclasses"
  25239.         self baseBehaviors do: [:e |
  25240.             extras do: [:selector | self addClass: e selector: selector].
  25241.             "Ensure class marked as changed even if no stub methods added"
  25242.             e isChanged: true].
  25243.  
  25244.         "Finally inform any observers (browsers) of the change"    
  25245.         self class environment trigger: #protocolUpdated: with: self]
  25246. !
  25247.  
  25248. addClass: class
  25249.     "Add the <ClassDescription>, class, to the collection of classes associated with the receiver.
  25250.     Including a class in a protocol asserts that the class conforms to the protocol. In
  25251.     order to be sure that such is true, we generate default implementations for any
  25252.     messages the class does not currently implement."
  25253.  
  25254.     (class conformsToProtocol: self) ifFalse: [
  25255.         self selectors do: [:s | self addClass: class selector: s].
  25256.         class addProtocol: self.
  25257.  
  25258.         "We don't need to mark the base classes as having been changed
  25259.         in this situation." 
  25260.         self class environment trigger: #protocolUpdated: with: self ]!
  25261.  
  25262. addClass: behavior selector: selector
  25263.     "Private - Add the <symbol>, selector, to the receiver's protocol in the <Behavior>, 
  25264.     behavior. i.e. ensure that the behavior can understand the selector by adding
  25265.     a dummy implementation if necessary."
  25266.  
  25267.     (behavior canUnderstand: selector) ifFalse: [
  25268.         self compileStub: selector into: behavior]!
  25269.  
  25270. addMethodSilently: method
  25271.     "Private - Add the <CompiledMethod>, method, to the collection of methods within 
  25272.     the receiver.  As this is a method protocol we must maintain the protocol invariant 
  25273.     that all claimed implementors must respond to all the selectors. If the protocol is
  25274.     extended by the addition of this method (i.e. its selector is a new one) this may involve
  25275.     compiling stub methods into conformant classes. Furthermore we must make sure that
  25276.     the class of the method implements the whole protocol."
  25277.  
  25278.     (selectors includes: method selector) ifFalse: [
  25279.         self addSelector: method selector].
  25280.     self addClass: method methodClass!
  25281.  
  25282. addProtocol: protocol
  25283.     "Add all the selectors in the <MethodProtocol>, protocol, to the set of method 
  25284.     selectors included in the receiver's protocol. Then ensure that the MethodProtocol
  25285.     invariants are maintained by ensuring that all conforming classes can understand
  25286.     the added selectors."
  25287.  
  25288.     protocol selectors do: [:each | self addSelector: each ].
  25289.  
  25290.     !
  25291.  
  25292. addSelector: selector
  25293.     "Add the <symbol>, selector, to the set of method selectors included
  25294.     in the receiver's protocol. Then ensure that the MethodProtocol invariants are
  25295.     maintained by ensuring that all conforming classes can understand the selector
  25296.     (by adding a dummy implementation if necessary), and that their implementing
  25297.     methods are recorded in the protocol."
  25298.  
  25299.     self addAllSelectors: (Array with: selector)!
  25300.  
  25301. ansi
  25302.     "Set the receiver to be marked as an ANSI standard protocol as defined in the American National
  25303.     Standard for Information Technology - Programming Languages - Smalltalk, ANSI NCITS 319-1998."
  25304.  
  25305.     ^self isANSI: true!
  25306.  
  25307. asSymbol
  25308.     "Answer a <Symbol> which uniquely identifies the receiver."
  25309.  
  25310.     ^name!
  25311.  
  25312. attributes
  25313.     "Answer a <collection> of the <Symbol>s specifying attributes of the receiver."
  25314.  
  25315.     | attr |
  25316.     attr := OrderedCollection new.
  25317.     self isANSI ifTrue: [attr addLast: #ansi].
  25318.     self isReadOnly ifTrue: [attr addLast: #readOnly].
  25319.     ^attr!
  25320.  
  25321. attributes: attributes
  25322.     "Private - Set the attributes of the receiver to those named by the <Array> of <Symbol>s, attributes."
  25323.  
  25324.     (self attributes asSet equals: attributes asSet) ifFalse: [
  25325.         flags := 0.
  25326.         attributes do: [:e | self perform: e]]!
  25327.  
  25328. baseBehaviors
  25329.     "Answer a <collection> of all the <ClassDescription> objects which
  25330.     directly conform to the receiver without inheriting such conformance
  25331.     from a superclass."
  25332.  
  25333.     | conformers |
  25334.     conformers := OrderedCollection new.
  25335.     self class environment allBehaviorsDo: [:c | 
  25336.         (c protocolNames includes: name) ifTrue: [conformers add: c]].
  25337.     ^conformers
  25338. !
  25339.  
  25340. behaviors
  25341.     "Answer a <sequencedReadableCollection> of all the <ClassDescription> objects which conform
  25342.     to the receiver in class hierarchy order (i.e. superclasses first)."
  25343.  
  25344.     | answer |
  25345.     answer := OrderedCollection new: 10.
  25346.     self class environment allBehaviorsDo:  [:c | (c conformsToProtocol: self) ifTrue: [answer addLast: c]].
  25347.     ^answer!
  25348.  
  25349. comment
  25350.     "Answer a <readableString> describing the the receiver."
  25351.  
  25352.     ^comment isNil
  25353.         ifTrue: ['']
  25354.         ifFalse: [comment]!
  25355.  
  25356. comment: blah
  25357.     "Set the receiver's comment to the <readableString>, blah.
  25358.     If blah is empty (or nil) then stored comment is set to nil."
  25359.  
  25360.     comment := blah = '' ifFalse: [blah]!
  25361.  
  25362. compileStub: selector into: behavior
  25363.     "Private - Compile a target implementation method with the identified by the <symbol>,
  25364.     selector, into the <ClassDescription>, behavior."
  25365.  
  25366.     | target args sig |
  25367.     target  := String writeStream: 128.
  25368.     args := selector argumentCount.
  25369.     args == 0
  25370.         ifTrue: [target nextPutAll: selector]
  25371.         ifFalse: [ 
  25372.             (args == 1 and: [selector isInfix])
  25373.                 ifTrue: [target nextPutAll: selector; nextPutAll: ' operand']
  25374.                 ifFalse: [ | keywords |
  25375.                     keywords := selector keywords.
  25376.                     (1 to: keywords size)
  25377.                         do: [:i | target nextPutAll: (keywords at: i); space; 
  25378.                                 nextPutAll: 'arg'; display: i]
  25379.                         separatedBy: [target space]]].
  25380.     target crtab; nextPutAll: '"This is an auto-generated target implementation for the protocol <';
  25381.         nextPutAll: self asSymbol; nextPut: $>; crtab; 
  25382.         nextPutAll: 'and remains to be correctly implemented."'; cr; crtab;
  25383.         nextPutAll: '^Error notYetImplemented'.
  25384.     behavior compile: target contents.
  25385.     sig := self class stubAddedSignal.
  25386.     sig notNil ifTrue: [
  25387.         target reset;
  25388.             nextPutAll: 'Protocol ';
  25389.             display: self;
  25390.             nextPutAll: ' added stub implementation of new message ';
  25391.             print: behavior;
  25392.             nextPutAll: '>>';
  25393.             print: selector.
  25394.         sig
  25395.             signal: target contents
  25396.             with: behavior]
  25397. !
  25398.  
  25399. contents
  25400.     "Answer a <collection> of all methods classified under the receiver."
  25401.  
  25402.     | foundMethods |
  25403.     foundMethods := Set new.
  25404.     self behaviors do: [:aBehavior |
  25405.         foundMethods addAll: (self methodsInBehavior: aBehavior)].
  25406.     ^foundMethods!
  25407.  
  25408. displayOn: aStream
  25409.     "Append the receiver to aStream in a format that a user would want to see"
  25410.  
  25411.     aStream nextPut: $<; nextPutAll: name; nextPut: $>!
  25412.  
  25413. hash
  25414.     "Answer the <integer> hash value for the receiver."
  25415.  
  25416.     ^self asSymbol hash!
  25417.  
  25418. icon
  25419.     "Answers an Icon that can be used to represent this object."
  25420.  
  25421.     ^self isANSI
  25422.         ifTrue: [self class ansiIcon]
  25423.         ifFalse: [
  25424.             self isReadOnly
  25425.                 ifTrue: [self class readOnlyIcon]
  25426.                 ifFalse: [self class icon]]!
  25427.  
  25428. includesMethod: method
  25429.     "Answer whether the receiver includes the <CompiledMethod>, method,
  25430.     which it does if the methods selector is part of the protocol."
  25431.  
  25432.     ^(method methodClass conformsToProtocol: self) 
  25433.         and: [self includesSelector: method selector]!
  25434.  
  25435. includesSelector: selector
  25436.     "Answer whether the receiver includes the selector represented by the 
  25437.     <Symbol>, selector."
  25438.  
  25439.     ^selectors identityIncludes: selector!
  25440.  
  25441. initialize
  25442.     "Private - Initialize the receiver."
  25443.  
  25444.     selectors := IdentitySet new.
  25445.     flags := 0!
  25446.  
  25447. isANSI
  25448.     "Answer whether the receiver is an ANSI standard protocol."
  25449.  
  25450.     ^flags allMask: ANSIMask!
  25451.  
  25452. isANSI: aBoolean
  25453.     "Set whether the receiver is an ANSI standard protocol.
  25454.     Note that all ANSI protocols are considered 'ReadOnly' too."
  25455.  
  25456.     | newFlags |
  25457.     newFlags := aBoolean 
  25458.         ifTrue: [flags maskSet: (ANSIMask bitOr: ReadOnlyMask)]
  25459.         ifFalse: [flags maskClear: ANSIMask].
  25460.     newFlags ~= flags ifTrue: [
  25461.         flags := newFlags.
  25462.         self protocolUpdated].
  25463. !
  25464.  
  25465. isReadOnly
  25466.     "Answer whether the receiver is a read-only protocol which should not be updated by the tools
  25467.     (this is not enforced here)."
  25468.  
  25469.     ^flags allMask: ReadOnlyMask!
  25470.  
  25471. isReadOnly: aBoolean
  25472.     "Set whether the receiver is a read-only protocol."
  25473.  
  25474.     | newFlags |
  25475.     (newFlags := flags mask: ReadOnlyMask set: aBoolean) ~= flags ifTrue: [
  25476.         flags := newFlags.
  25477.         self protocolUpdated]!
  25478.  
  25479. methodsInBehavior: class
  25480.     "Answer all the methods in the <ClassDescription>, class, which are members of the receiver."
  25481.  
  25482.     ^(class conformsToProtocol: self)
  25483.         ifTrue: [class methodDictionary select: [:m | self includesSelector: m selector]]
  25484.         ifFalse: [Set new]!
  25485.  
  25486. name
  25487.     "Answer the unique <readableString> name for the receiver."
  25488.  
  25489.     ^name!
  25490.  
  25491. printOn: aStream
  25492.     "Append a representation of the receiver to aStream."
  25493.  
  25494.     aStream 
  25495.         basicPrint: self;
  25496.         display: self!
  25497.  
  25498. protocolUpdated
  25499.     "Private - Flag the receiver as updated and inform any observers."
  25500.  
  25501.     self class environment trigger: #protocolUpdated: with: self.
  25502.     self updateBaseClasses.!
  25503.  
  25504. readOnly
  25505.     "Set the receiver to be a read-only protocol (i.e. one which has a fixed set of selectors.
  25506.     This is not enforced by the #addSelector:, etc, methods of this class, but is expected
  25507.     to be respected by the tools."
  25508.  
  25509.     ^self isReadOnly: true!
  25510.  
  25511. removeAllSelectors: selectorsToRemove
  25512.     "Remove the <collection> of <symbol>s, selectors, from the set of method selectors included
  25513.     in the receiver's protocol. The absence of any of the selectors is ignored. Answer the argument."
  25514.  
  25515.     | missing |
  25516.     missing := IdentitySet new.
  25517.     selectorsToRemove do: [:s | selectors remove: s ifAbsent: [missing add: s]].
  25518.     selectorsToRemove size > missing size ifTrue: [self protocolUpdated].
  25519.     ^selectorsToRemove
  25520. !
  25521.  
  25522. removeClass: class
  25523.     "Remove the <ClassDescription>, class, from the classes 'held' by the receiver.
  25524.     In the case of a protocol we must remove the protocol from the classes set of
  25525.     implemented protocols - note that we cannot do that if the protocol is inherited."
  25526.  
  25527.     class removeProtocol: self.
  25528.     self protocolUpdated!
  25529.  
  25530. removeSelector: selector
  25531.     "Remove the <symbol>, selector, from the set of method selectors included
  25532.     in the receiver's protocol."
  25533.  
  25534.     ^self removeSelector: selector ifAbsent: [self errorNotFound: selector]!
  25535.  
  25536. removeSelector: selector ifAbsent: exceptionHandler
  25537.     "Remove the <symbol>, selector, from the set of method selectors included
  25538.     in the receiver's protocol."
  25539.  
  25540.     | answer |
  25541.     answer := selectors remove: selector ifAbsent: [^exceptionHandler value].
  25542.     self protocolUpdated.
  25543.     ^answer!
  25544.  
  25545. rename: newName
  25546.     "Rename the protocol to have the new symbolic name, newName.
  25547.     N.B. This is not recommended, as there may be symbolic references to the old name."
  25548.  
  25549.     | implementors sym |
  25550.     implementors := self baseBehaviors.
  25551.     sym := newName asSymbol.
  25552.     (Protocols includesKey: sym) ifTrue: [self error: 'Duplicate protocol name'].
  25553.     implementors do: [:i | i removeProtocol: self].
  25554.     Protocols 
  25555.         removeKey: name;
  25556.         at: sym put: self.
  25557.     name := sym.
  25558.     implementors do: [:i | i addProtocol: self; isChanged: true].
  25559.     self class environment trigger: #protocolUpdated: with: self!
  25560.  
  25561. selectors
  25562.     "Answer a <collection> of the selectors which make up the receiver's protocol."
  25563.  
  25564.     ^selectors!
  25565.  
  25566. setName: stem
  25567.     "Private - Set the name of the receiver to the <Symbol> equivalent 
  25568.     of the <readableString>, stem."
  25569.  
  25570.     name := stem asSymbol.
  25571.     self initialize!
  25572.  
  25573. updateBaseClasses
  25574.     "Private - The receiver has changed in such a way that it's
  25575.     base classes need to be marked as having been changed."
  25576.  
  25577.     self baseBehaviors do: [:each | each isChanged: true]
  25578. ! !
  25579.  
  25580. ModalMsgLoop comment:
  25581. ''!
  25582. !ModalMsgLoop class methodsFor!
  25583.  
  25584. new
  25585.     "Answer a new initialized instance of the receiver."
  25586.  
  25587.     ^super new initialize! !
  25588.  
  25589. !ModalMsgLoop methodsFor!
  25590.  
  25591. initialize
  25592.     "Private - Initialize the receiver's instance variables."
  25593.  
  25594.     loop := true!
  25595.  
  25596. signal
  25597.     "Terminate the modal loop, and return control to the sender of #wait."
  25598.  
  25599.     loop := false!
  25600.  
  25601. wait
  25602.     "Start the modal loop, returning when the receiver is signalled.
  25603.     While waiting the Windows message loop continues to be serviced,
  25604.     but keyboard and mouse input is discarded."
  25605.  
  25606.     SessionManager inputState loopWhile: [loop]! !
  25607.  
  25608. Model comment:
  25609. 'Model is an abstract class whose subclasses implement the <model> protocol and represent domain level data that is likely to be observed by other objects. The Model hierarchy is part of the MVP framework although <model> classes may well be used outside of this framework. 
  25610.  
  25611. SmalltalkSystem help: ''Overviews/ModelViewPresenter''.
  25612.  
  25613. In general, <models> differ from other objects which would otherwise be simply subclasses of Object by triggering change events when aspects of their data are modified. This enables the Observers of this data to keep up-to-date with the changes. In the MVP framework a <view> is typically an Observer of a <model>''s data. 
  25614.  
  25615. The Model class provides a faster means of event triggering for its subclasses than is available in standard objects but, apart from this it supplies, no new facilities other than to conveniently group classes that be considered to act as models and place them within the <model> protocol.
  25616.  
  25617. Instance Variables:
  25618.     events    <EventsCollection> holding the model''s event registrations.
  25619.  
  25620.  
  25621.  
  25622. '!
  25623. !Model class methodsFor!
  25624.  
  25625. icon
  25626.     "Answers an Icon that can be used to represent this class"
  25627.  
  25628.     ^##(self) defaultIcon!
  25629.  
  25630. new
  25631.     "Answer a new initialize instance of the receiver."
  25632.  
  25633.     ^super new initialize!
  25634.  
  25635. stbConvertFrom: anSTBClassFormat
  25636.     "Convert from earlier version models.
  25637.     1: Added 'events' instance variable to Model."
  25638.  
  25639.     ^[:data | | newInst offset |
  25640.         newInst := self basicNew.
  25641.         data keysAndValuesDo: [:i :v | newInst instVarAt: i+1 put: v].
  25642.         newInst]!
  25643.  
  25644. stbVersion
  25645.     "Answer the current binary filer version number for instances of the receiver."
  25646.  
  25647.     ^1! !
  25648.  
  25649. !Model methodsFor!
  25650.  
  25651. getEvents
  25652.     "Private - Answer the EventsCollection belonging to the receiver, or nil if the receiver
  25653.     has no events registered for it"
  25654.  
  25655.     ^events!
  25656.  
  25657. postCopy
  25658.     "Apply any final flourish to the copy that may be required
  25659.     in order to ensure that the copy does not share any state with
  25660.     the original. Answer the receiver."
  25661.  
  25662.     events := nil!
  25663.  
  25664. setEvents: anEventsCollectionOrNil
  25665.     "Private - Set the EventsCollection of the receiver to be anEventsCollectionOrNil.
  25666.     Answer the receiver."
  25667.  
  25668.     events := anEventsCollectionOrNil!
  25669.  
  25670. stbSaveOn: anSTBOutFiler
  25671.     "Output the receiver to anSTBOutFiler. We must ensure that the local events collection
  25672.     is NOT saved to the filer"
  25673.  
  25674.     anSTBOutFiler override: events with: nil.
  25675.     super stbSaveOn: anSTBOutFiler.! !
  25676.  
  25677. MoenContour comment:
  25678. 'MoenContour is a private helper class which is part of the implementation of the <MoenTreeView>
  25679.  
  25680. Instance Variables:
  25681.     lowerHead    <MoenLink>
  25682.     lowerTail        <MoenLink>
  25683.     upperHead    <MoenLink>
  25684.     upperTail        <MoenLink>
  25685. '!
  25686. !MoenContour class methodsFor!
  25687.  
  25688. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  25689. σäM&2G¬oi«¬3Θ£/j┼▌▐á┌└úf[Xi▀½-;¡╞╬! !
  25690.  
  25691. !MoenContour methodsFor!
  25692.  
  25693. φK0'íÄ6D╨└▓&è(Σ╞╟╔ ╙!
  25694.  
  25695. φK0'íÄ6s·¿í%Ç1═▌ß╟ô╜╢┘▒σáAk║║─;)╙⌐1WÖsM$e!
  25696.  
  25697. φK0' Ñå>D╨└▓&è(Σ╞█═≈█!
  25698.  
  25699. φK0' Ñå>s·¿í%Ç1═▌ß╟ô╜╢┘▒σáAw╛▓╠;)╙⌐1WÖsM$e!
  25700.  
  25701. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR½╛╪ofIZÆû;BàZW/`OR∙Å^V`f[½yxº¿%≤╚GΦú╕▐π╟^╦dKza╪░h║█┼XE╦VÆr╗N│sälû8Nxα$¢█OÖN{╝.ôƒ╩±─┤3ƒ æÅ╙hεΓRAΓi5└éY│╡6µr;▐Z█│@ É«z├Qg├ú╒ìP.≤╜²≥µ]Φ≈r╘è█c `^A;s&»∩Mp6Z@┘▀9Åá]0{!!░ΦF¢H ÿΣï°∩dΦ╝┴╪è.░±ß ╬lKτûfQτ⌐}≡xO═
  25702. Æ█╙╔╩Xï╙╫╥C²m²0îY¼ÄΦ═H}FZ8²1╙Γ=uö&½O╓`ö;τÆ\φ=H°╖√v=6Y9┌╔╫╦lüτm∞Æ#÷ⁿÅU╫",
  25703. ╟ⁿ"C1₧{ÆΘ≡╫¿ß▒╡┘╨ª5⌡1«ü]B╡å«╟pφ%j∞╗ó·─6}╩▌w╩ΓÖ=╢≡⌡=┘c2üô≤W£≤ì«▒╩÷-╩Q¢╜ù╘=ï░╘w═äX!
  25704.  
  25705. ⌠T7'íÄ6D╨└▓?ò/Σ╞╟╔ ╙!
  25706.  
  25707. ⌠T7'íÄ6s·¿í%Ç1═▌ß╟ô╜╢└«ΓáAk║║─;)╙⌐1WÖsM$e!
  25708.  
  25709. ⌠T7' Ñå>D╨└▓?ò/Σ╞█═≈█!
  25710.  
  25711. ⌠T7' Ñå>s·¿í%Ç1═▌ß╟ô╜╢└«ΓáAw╛▓╠;)╙⌐1WÖsM$e! !
  25712.  
  25713. MoenTreeNode comment:
  25714. 'MoenTreeNode is a private helper class which is part of the implementation of the <MoenTreeView>.
  25715.  
  25716. Each node in a MoenTreeView is represented by an instance of this class.
  25717.  
  25718. Instance Variables:
  25719.  
  25720.     object        <Object>. Element stored at this node.
  25721.     contour        <MoenContour>
  25722.     offset        <Point>
  25723.     position        <Point>
  25724.     parent         <MoenTreeNode>. Pointer up to parent. nil if a root.
  25725.     child         <MoenTreeNode>. Pointer to first child. nil if no children.
  25726.     sibling         <MoenTreeNode>. Pointer to next sibling. nil if no next sibling.
  25727.     clip        <Rectangle>. Clipping rectangle for this node.
  25728.     extent        <Point>. Height and width of this node.
  25729.     flags        <integer>. Various flags.
  25730.  
  25731. Class Variables:
  25732.     ExpandedMask    <integer>. Bit mask for setting/testing ''expanded'' flag
  25733.     HasExpandedMask    <integer>. Bit mask for setting/testing ''hasExpanded'' flag.
  25734. '!
  25735. !MoenTreeNode class methodsFor!
  25736.  
  25737. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  25738. σäM&2G¬oi«¬3Θ£/j┼▌▐á┌└úf[Xi▀½-;¡╞╬!
  25739.  
  25740. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐ì≥├^₧zWga╓╡w7├ú⌐% {∙P╢S╖sö°|N3í>┬₧╩P%ΓmV║║┬σΘ╕cë¢₧ùQ╜·  [-É╜}!
  25741.  
  25742. ∩A0w_Qµ║!!,·Ωâ(Å:Γ└╡▄ ┼┌█¬¿σGL ╕╥~r\SÆè1VÆLG691σä_&5G¼i_nîñ4╙╙R ¡║▓Éπ!
  25743.  
  25744. εF-6,■╧3'ò½å/å+í─ε▐√┘╦Å■≤ê\F▒Å╥~vfY╓üS8■aW/b]iσêwc1░yGEáí%∙╩@⌐╣ÿ£²╩
  25745. ╫d_kn╬µ-3â╞┼W|çû8z¬F! !
  25746.  
  25747. !MoenTreeNode methodsFor!
  25748.  
  25749. πQ3:6ûè1=╗ºï&ÇRï╜¡ⁿ∞▐╔╘¬≈σ₧╡╙lvZ╞î;àZG>oUTg
  25750. ╢ÄZs6_¬yW*á▓`ε╓G@¡»ºƒ∙╦SÿzJoc╬ⁿo'║▌╧WéÜ}ε.▄Ö╝^Z+Φ`Ü₧MöG4ó.▐ô╧╢╧¼zìï█Æn
  25751. »▒XBΓt~┬²6▌┌V±D=é╖|₧Gσçh╟N}Ç#▄╢ΩTq┐╜╕ñ╜F╗±lZ∙ΓºjHf|7└gë~bJ\╧W▀ë╡Xc;OIÜô&îR╡⌡▀¼∙sñ±┴à╦~òúü╩    $K]Lⁿ.╝B4Oτ╜zë$Θèä¥Üàï╙╔⌡╘R ┐g≥!
  25752.  
  25753. πQ3:6ùå(,╫├σ▄!
  25754.  
  25755. ΓE+ 4Ñ¢7
  25756. ╢á£Ç<⌡╣àÑ╝τ═▄¿≤▒V≥√πzKC▐à*W█G+mSV'O≈Åg(\┤yA*╢ú%║╠G¡╛í¢σê^öxW~i╘╗- ½╩╘XFÆûX─*éuòA ]F(Φjÿ₧KÖA`¡;▀ùâ ▀αgÇ ï█Æn
  25757. »▒@L½c;Ʋ6▌╓LΓM6î\╒τ,h≈╘8╓JkÇ-┤▀åMb╢╝╕ôèo⌐·d╕∞╛J qU4p;¥ßNS┴┴ÿñW#~.&╖δFùô≤┼°α Ä╙ô╚Ö*⌡╣öI▄;R│o⌡}P∞±l╪y^Γ─┴Çï╙N█╙▌≥G·p±+⌐ └δ■ƒS}[    G°-û╫},▀Y⌡'╠MD#Éisä∙9µ)-U─ª²R?EC>φ@█╙┌LF£úN/┤δ    ┼╚▀U█/,M╨≈!!Y}ömö≤ÿ╤á╣Σ║╩ƒ╬|ÉQ░╢@U0¥▄Γyó9¿n`X°▓╣▐ƒcÆÖ8ΘσÜ=/╢ⁿ°=ε*]!
  25758.  
  25759. ΓL.1U╬µp¿áÜ+æ:íÖ»φ≡─╚╨¼▓▒[F ¡┴wfM▌é~FƒZ8kXVb≤ôYJ&aL½u_nσδ)⌠═Vª┤▓▐ß╬ûvR "╖╓X╟≈├QAÖ!
  25760.  
  25761. ΓL.1bΣÄ<╕úë)æRï╜¡ⁿ∞▐╔╘¬≈σî╛╘;g@SÆÆ?^éZ%hGc
  25762. ╢ôZc/YªnyΓ∞#≥╫N∩≈╛ÉΣ█öqor╙╜o>½ë╘VüûVt╝DúpòΦ6╬fò█Zê 6┴jQ╣√└■┼¼w╚W┬█Ær ¼√RG╢!
  25763.  
  25764. ΓL.1*íü_C╙δ╕"î,í▌ⁿî ù█╨╝τóTJ▒╝Çvv\^▌Ç~SÖ[#}]d╢ö\bfM║<Gbºδ⌡█L4║▓▓¿■╩ ^₧yN km▀▓y3║└╧W£Çy¿⌠·hαN+÷aì₧E±(¡/─ù╤╢û²3º¢₧üy ì■[Hºcrìßs╨┌H⌐,EÑL▀⌡mb±╬t╞Pk╬╛å├.╢»√÷áΦ⌡nO«σáJaBKc3ì▐Y]&n╚▐Å│!
  25765.  
  25766. ΓL.1*íü&αΘâ:Ç-α└µ├≡║╡╝ⁿ┬╖ZU╛»┼;>s─à2GûKAjzSV+S√ÄXb/Lò}_º⌡`√╠EÑ▓╣è╗ÅÆf_go╘≡-3⌐╚╔W[üVûvª█∙·[=ívÜ▌\òTq╛G/ô¢╬√╔ñzëÜ█Étó⌡J¡dh╠¡^┤▓5Ä]o╔^┘│1 ô«}├AfÇe∞£ÉAx╡ε√÷Θ
  25767. ¼║6╨█╖ m[rç▐W'yF\╠#▀Å√V*%│║ ¢_ùΣ╪╖≥!!≥╗ì╪ƒd⌡µ╚
  25768. ╟KZa{j╒y² |╕∞)┼lXΣFìêæé╓F£δ!
  25769.  
  25770. ΓH.
  25771. XR══;│┐ì>Ǽö╬┬φ└┌╟■µ¡V⌐║╠nvY╘─*ZÆV/m^Z}
  25772. Σ╞!!%C¬l*½Ñ3ε▀L¡≈íƒσ╞¢qB
  25773. ╖╓ ¡┼╔I!
  25774.  
  25775. ΓH.
  25776. oxÑ╜7*«¿é-ë:î╛å╧≥▐╧òΣ»σRq║╕╘z}OZ╫!
  25777.  
  25778. ΓK):-╢ΓX@°Ö₧#ô>⌡╤»ü╛÷╤╞⌐≈╖W╖╛ÇmrDC╫─1T╫KL/.IVh
  25779.  ùK!!5Σ\d╢ñ5ΦÖ    ªñúƒ∙╠^üuL    ob╓╣#p├ú¡3!!½£aíVñ!
  25780.  
  25781. ΓK):-╢╒r(┤åÄ Ç<⌡╣àÑ╝τ═▄¿≤▒V≥√≤~gB┌ü~DûSQ/.TU+■ä^Kc%J¬jVxσ╕`╜▌M╝╕óî░Åä`_meܬl º╚┬UM╒£VaªF÷|éΘ\J,¡$₧╨v₧Hq»ræ ⌐¢ª╔pçïöånO⌠¼E¼Oqç∞'!
  25782.  
  25783. ΣJ#5'<í¥&αΘâ:Ç-α└µ├≡ù▓┐╫░òAJ⌐║╘~3≈Æ?^é^P/.V\e≥êp'C╢yk░¼5≈█LΣ≈╕Ä≥▌
  25784. ₧{PL.f╒«-7»╩╚GôVçpεM╣yòæ;& =∩a₧╩Q▄V|⌐@.╓æ╞ ┌Ña─M₧òù<ª⌠Yño;ûτ6₧═ZΣD&┌Z╚V╗$/ⁿë8├L.ç:┐╪╬Kf╖½Ω╣á║⌡vY½≤│K++?bG<¥µpeGUë╚ƒ¡M-3E ╬ë*╦_ùⁿ─╣Φhδ┤┴╠¥?╝φ┌Å?R╣∙bZ≡ +¡6åoé┴ûÅ▄@█╩¿î+±3▓+╗nà⌠²╙jGE9┐Z∙₧`É7ù╤Uljè] Ü≤<∩N▌º╡\P#pφ╬╫╦Eë∞Rjí■EèÉ┼█-;X|¿ÖMj8Éoƒ╗éÅN⌐╗≥╛ïÿ┬]ÉQ«âxI╩√▒█/┐cr⌠░≡╪─3dÆ└l┤ìⁿR!
  25785.  
  25786. Σ\3;,╔σ[┐▒ÿ/ï+!
  25787.  
  25788. Σ\3;,■╧3╡áé>ΦUê╤≈╪√┘╦òΣ»σRs░▓╬o!
  25789.  
  25790. ΘE4?-(Ñü6,╛─µC╗9φ╒Φ▀╛╓╙┘ô≤╢X ô┴hVPF╙è:WôrE9e!
  25791.  
  25792. ΘE4?-(Ñü6,╛≤╠+º0ε╪Ω═≡ù▓┐╫⌠⌐RD¼√Ü&3NZ╙â-Ü^W!!4{j╙ÖXh"JºQRy⌐δ3 ╩@⌐ò╕æ√╩!
  25793.  
  25794. ΘE4,<+¡ì>,Öíà&ü-Σ┌éªùΘ▄▌╖■íM░»εrW▄Çd¼LA&hZx*εæWb#K₧!
  25795.  
  25796. ΦW<4á╒r(ùªë$▒-Σ╤┴├·╥ƒ╕╘¢τcQ╢¡┴ovÆÑ0AÇZVjySV≤ô^Mn# Q\o¼ƒ2 █l¼▓Θ▐÷▌ ÜqP.i╔ⁿlr¬└╥\KüV£5ºM▓té E
  25797. 0Φh¢₧VÜ`ñ|┴ù└≤┼╢vÜC▌÷∙e╟φAúc;₧éY╖┌^ΣIoûÜ▐"d≈≤j╟G@╧;┤£ôEf╢á∞░ìl┴╧e]║Φ≥qh\[rÖΩE]E╠Mì*ÅáZe|ÜÆ*ç\Bƒ÷σ¬Θd╛·║≤Ä,áµ⌠GÅ6Cµ!!╝
  25798. u\Ω±y┴^Γú╧■Σ╢v¥╫╔⌡G!
  25799.  
  25800. ΦW%9¬ï7-╫├σâ3α╙ⁿî █╙°┐ß«    Üú╨z}LS╓⌐?A£!
  25801.  
  25802. ΦW%9¬ï7-αΘìè0φ╤ε┬╛║╡╝╕■ñTP ß¥;uDW╒ù~_ûLOp.~K{°à]K'\¿<@o╢±`√ⁿMñ▓╢É!
  25803.  
  25804. ΦW&1ªâ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ¼╚~g@S└─*ZÆV/m^Z}
  25805. Σ┴J&/Aπ}|½╕)°╥G@╕╢Ñè╖└^â|[@zr▀╣#_─áεV\ÉVçt║óuÖ╝U@ +∩#ï₧TÖCz∞4╥åâΓ─Ñ3å¢₧╙uε≡TP╖aw¢»%╫╠VσM*îP╘Vα.sⁿ┬vÄ/⌐5ñ╧ù`╗»∞╛ΘΦπoI╡Σ≥%P\o0éú61XY▌─╩╡Qh|UE▀û.ëV╓α╨¬Φ!!δ╝┴┘Æ;⌡⌠└╦
  25806.  EPn╓ûfJOπúl╬yσ░êƒ╬╨Z┴û■÷Cµ>«+Φ α Φ▐BlKFH3⌡m╙╠=dâ1æZƒRtjòibü■▐!
  25807.  
  25808. ΩA>;!!╡Ü3%î¿Ç?Çeí╒ßπⁿ▌┌╓¬▓¼Ub╜¿┼ug╫£=WçKM%`sRe ·ä  L&ß]]y╡«2║╩JΦ╣╢ô≥Å╫`V.a╚╗x?½╟╘ö╝½@ó3╨(·[=≤a▀╫J▄L{∞)╨Üâα═¼fìA▀Ü¥o½π:.╦t~┬²6═╩S≤ ╩▀≥!!t°╙q╠E.╘7┤£ìMx▓¬±²á⌐°u]╗∞╖FB`^Vv&çφ?1K\╠â|α╚||)B@╙ò6╦S╓σ┬╜°!!Γ╡ôìÖ1╕≤╚╞8R ║<Φq⌠░e╒hHóF≤δ·º╥Xù╙╚πLα$│d∩sδΦ∞┌@]GZ}ⁿ2ÇΣ,bötû]ƒ DLw╞to═∩=µJ7Y╦ºµA4(
  25809. xû╨ÆàaòΓP#úµzÜöìD╓7\I█«IiT╤eä╗╤▄╕╗²║╬ÅïVÆ┤î@+╖£å╠jÇmc╧¼╡╦≤6tÇ▌?τà P¿╖╣DΘ-^é▀╝PïΣ₧ú╕F«öπE鬻ü5æ±₧öìO⌡⌠R$!!½≈╨ïÜA╔.k╔▒≈X)╬Ü╛qóπ¥jJƒß}eéG
  25810. ┐╞wM·/M≈╩Æα╙_╤0▒╡åÇ¡╚!
  25811.  
  25812. ΩA>;!!Ñâ',αΘì$¬=δ╤∞╪╛▐┘⌠╝ßá]Wσ√╧kvZW╞ì1\╫2.C,z]x≤ô^Mn# Q\o¼ƒ2 █l¼▓Θ▐■┴\
  25813. ƒqkc▀╡{7╝ë╫QG╥╙f╜L╡tæ∙U 4ΣiÜ╨M±(Ñ|╟Ü╞╢ÉÅqé£Å═<╝÷BIºn5┬»╪ƒK∩D=╔╙│#n╣╘m┴J.╓>╜╔å4▓áδΘσΦαhY∙≥╖iR`rπ`è&pCE╚─ìßMe9 åÅ&ç[ƒ≤τ╣≡tσ╕ì╚─r⌡∞┘ ▌#≥<╒ qQ÷╕}┘-R FïÆûèƒNö─àσM∙1¿b≥<╦ºò╡sIoA8▒!!Æ√8`éz≥$╢1LRoâmeâ∩4≈*RêîαC4`
  25814. -v▀    ₧▀▄WüΣYj╛∞    îÉæS₧87T╟░6>öeü■╩Ƭ·≡╕ï╫Γ[ÖV┤ìQOÑô¥├ónoΓα▌ñ¼6b╫ô"┤£±Xí²╗ ìd?╟▄≥Iùµwí¿╕Z╛ëBªöε┤ü$▐⌠ò2╘Ω kï▌a(¼┤╚┘É6C@╧(╧φâqf╬┴²B▄·▄hLì▐9δ:tτâ4Mδ8L╕╦╕δ╪X╔u¬≤ñô┤╪EgτaXûa█╢¡-╘ö▄í╖<@ùP'¢▒ç!
  25815.  
  25816. ΩA>    6á╣3%»¼ƒèeí█ ╔∞╓╦▄▒ⁿ╚9*²₧╓z]W╞ü~FƒZvjBRo⌡╖Us'M»y&Γñ0 ╠Cí╕╣╥╖╔ ╫q_f ╤╣t}╕╚╠LM╒ÆgεJ╕=ä    ∙] ;Σmë█K▄/┼4╓Ç╞╢╪¿v╚Jö₧èoHε≡EAΓt~┬ß<┌┌L½.┬[Ü√(!!╛╤y╬Wk╙x±▌æA4ºª²╛∩ó±cH¬áíwCQKo<╬δp@T╠â_τ╦0Y4F ╒ô+ÄHBƒπæ╣∩!!α┐ç─ö;▒ú╦Åw±sε qMóÑ{┴{^■ƒì▌π╡!!▓█╒ΩG∙>«j⌡:╩Θ╕±RlF}5°$╙·(vé5ÿKƒRpânt═∩:ú-Yê░ΩT43\lû╪Æ╪Z│µ]8┤≈yÉÖûD╟rU:)╤░-.àm¢≈▌╓NÑ┤▒ó├ÄïPïV⌐èB    »ùü'┘/¿To∞∙úÄ╚0uÆûn╩Γ¥>x╖ⁿ≈/├Pb2"ò╫εdû╗w╖²╕Uëô┐xå╗ª╒ ▐■╨(ùï_╗⌠
  25817. e'ó┤╬╩Ö Tè?*├┐âE>┴┼²^í!
  25818.  
  25819. εF-6,╔σ[kè╗à<ä+Σöóî▀┘╠┬╗ασGK║√£TqBS╤É`ÇWM)fZxOΓëc*J«y]~Γ╕4⌡╠GΦ╛╣▐π╟╫zQk.ÿ╤_─á■VJƒÉ!
  25820.  
  25821. εB!!    0,╔σ[╡»è9Ç+!
  25822.  
  25823. εB!!    0,■╧3╡áé>ΦUê█Θ╩φ╥╦òΣ»σRs░▓╬o!
  25824.  
  25825. ±E5;,╔σ[kè╗à<ä+Σöóî▀┘╠┬╗ασGK║√£V|MXµû;W╣P@/0Dc⌡ë^Puf[½yxº¿%≤╚G∩ñ≈Ä÷▌â4Pjeö■X├ú⌐gXöûa!
  25826.  
  25827. ±E5;,■╧3╡¼éù:Σ·α╚√║╡╝«≤╖VM½√Ü&3I{▌ü0fàZAa_V!
  25828.  
  25829. ±K4!!1½ü_C╙ù£%û6⌡▌α┬!
  25830.  
  25831. ±K4!!1½ühi╗Öâ#ï+î╛å▄±─╓┴╖²½Γ√┴K|AX╞!
  25832.  
  25833. ±V"5'<í¥&αΘâ:Ç-α└µ├≡ù▓┐╫░òAJ⌐║╘~3≈Æ?^é^P/.O[nO¬îWg"FáJRf╖«~║▀P╜║▓Éπâ\çqLzi╒▓!!r»╬┴PFå╙}½ñxô⌡GJUï₧╨]▄V|⌐|╥ò┬ ┬│g╚₧ÿ¢<¿▒^P▒     sïπ7╠┌Qº    &éZöV≥m&Θ╒}ÅM|─:ú¢├Kf≤Θⁿ√≡á╣fU½≤ªMBqTTc ¥ ∩^~3":ñ}ñ╩ñXn4P╖δFäJä±┼▒≤oñ¼Ç┴Å;∩ú┌ ├yfxj╣} 4┐±z┼a]¼ûêƒèæ%±┐■πC≈p┤d⌡╠δ┼ƒN`C}/Σ2╔╖@°]÷u┌BJ#ûreóΘ1µSÆΓαG4(Kw┘É┐│-oΘµ])┐┐┬╒ÜF▌$xCI╬∙*!
  25834.  
  25835. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR½╛╪ofIZÆû;BàZW/`OR∙Å^V`f[½yxº¿%≤╚GΦú╕▐π╟^╦dKza╪░h║█┼XE╦VÆr╗N│sälû8Nxα$¢█OÖN{╝.ôƒ╩±─┤3ƒ æÅ╙hεΓRAΓi5└éY│╡6µr;▐Z█│@ É«z├Qg├ú╒ìP.≤╜²≥µ]┼₧    5╖σ¬2pRK"z╒gë~Ya]Y╟ùQÖñUk|LN╨ä,ƒoⁿÖ╕╢∙y≡èö┘└~±¬!
  25836.  
  25837. ≤A$46úâ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3ZS╤É?\ÉSAjmTEn≤à^[f[½yxº¿%≤╚G∩ñ≈Æ÷═╫uP.i╫╜j7αï¡3% ¡z╜Jótƒ╝TW=∩p┼₧\äVqó!
  25838.  
  25839. ≥A3572íî&s·¿éç5Σ╫√îε╓═╨░µ BÆ┤┼uGZS╫¬1VÆ2.C,kAb≈ò+ff¡uGcúº)α█á▓≈î≥╠üqLG} ╙▓~&»╟├\âüt¼O│n▐Cæ;"cQΓkæ╩VëP4÷]|■¥╞°∩»}£èë╙r
  25840. ╣┐:.╦o }æΩ'₧àºQ ▀V╬ⁿ#!!úÜ8ÆNÇo ▒Θ-{▒ñ²²⌠F≥⌐ ]╖╧░fRf [₧ ±>e
  25841. öW╠<àñWY.FI⌠Ä+ÄoⁿÖ╫┤²f≈·█É┌n√Äú`±2!
  25842.  
  25843. ≥M%<6úΓX@°Ö₧#ô>⌡╤»ü╛÷╤╞⌐≈╖W╖╛Ç'^GS▄░,WÆqK.k| éo5╖tV*░«# ╫T║≡ñ▐∙╩
  25844. ╫gWbi╘╗#p├ú¡3!!½ÜyºM▒!
  25845.  
  25846. ≥M%<6ú╒r(ùªë$▒-Σ╤┴├·╥▓┐╫ß¼QO╢╡╟;)╙⌐1WÖkV/ku\o
  25847. !
  25848.  
  25849. ≈M474í¼: ╢¡₧/ïεÄ»├ε╥═╘¬√¬].╒╥éKaA@╙É;┌a<oWFj≤┴
  25850. Qcf«s]kªó#╠▀N¡Θ≈ƒσ╚    ÆzJL.o╩╣3║└╧W╒ö|áPó=ò YdRêkÖ₧MöG4╛?╓¢╒≤▐τ`╚Æûûx»σRΓvhïφ?█ôΣI&└[Üⁿ)dΩë:»(¬Vó┘ÅB4║╜▌µ≡ª≡eX∙Θ┤>pCK]!!ïσW3yF\═╚««-3SI╚Ç;éU ½!
  25851.  
  25852. ≈M474í┐ ,ò╗ê/ùεÄ»├ε╥═╘¬√¬]╥╤⌐9CZ_─à*W╫xZ_~Γä^Mn# q\dú»)∙ΦC ╜▓Θ▐÷▌ ÜqP" ╒¼h »▌╔VF┘VÆtºMÑi╨⌠T=Γaû╚\Ä/┼2╫╥╫■╔«3ë
  25853. ₧Æ¥oε⌠VG¬ }┬µ'═ƒIεR&╬S▀V≡%h⌡├j╟L.ê6 ┘═u≤ΘΦ∞σKºµdY½º≥%Qv&åGσ"b[ë▀£ñK~=Oö├Bß7h  ┴╜ε`≡│Ä├┌(┤∩▄ òE$≥ûfgZε╖)╓dHσÆä░å╓Dƒ─└Φf√Hpü1Σ2╞∩╕├ZChL    +°$Ü⌡!!`í&Üa═DPGë: éδ0± 1U╟¼╥! !
  25854.  
  25855. Mutex comment:
  25856. 'Mutex is the class of process synchronisation objects which provide mutually exclusive access to critical sections, potentially permitting a single process to enter such critical sections multiple times recursively (in some other Smalltalk systems this class is in fact called, RecursionLock).
  25857.  
  25858. If any process is in a Mutex, then no other process is permitted to enter that Mutex, but that process may re-enter.
  25859.  
  25860. Mutex is particulary useful where the use of a simple mutual exclusion <Semaphore> alone might cause deadlock, e.g. in implementing process safe collections.
  25861.  
  25862. Access to the Mutex is through the #critical: method only. Versions of Dolphin prior to 3.0 also supported #wait and #signal messages, but these were not entirely safe.
  25863.  
  25864. Instance Variables:
  25865.  
  25866.     owner        <Process> which currently owns the instance, or nil if no owner
  25867.     semaphore    <Semaphore> used for mutual exclusion    '!
  25868. !Mutex class methodsFor!
  25869.  
  25870. new
  25871.     "Answer a new initialized instance of the receiver."
  25872.  
  25873.     ^super new initialize! !
  25874.  
  25875. !Mutex methodsFor!
  25876.  
  25877. critical: aNiladicBlock
  25878.     "Wait until the receiver is NOT owned by another Process than that currently
  25879.     active, and then evaluate the argument, aNiladicBlock, to the 
  25880.     exclusion of other Processes using this mutex, answering the result.
  25881.     Implementation Note: We could use Semaphore>>critical: to implement the
  25882.     #ifFalse: branch, but we code inline to avoid the overhead of a further #ensure:
  25883.     block to reset the owner instance variable in addition to that in Semaphore>>critical:
  25884.     which guarantees that the Semaphore is never left unsignalled on exit."
  25885.  
  25886.     | active stateHolder |
  25887.     (active := Processor activeProcess) == owner
  25888.         ifTrue: [^aNiladicBlock value].
  25889.  
  25890.     "We need to acquire the mutex before we can proceed"
  25891.     stateHolder := Array new: 1.
  25892.     ^[    "The semaphore primitive will atomically wait AND set the wait result if it completes"
  25893.         semaphore wait: INFINITE ret: stateHolder.
  25894.         owner := active.
  25895.         "Set the state to indicate that the owner has been set and can be tested for premature release"
  25896.         stateHolder basicAt: 1 put: active.
  25897.         aNiladicBlock value
  25898.     ] ensure: [ | state |
  25899.         "There are a number of possibilities:
  25900.             1: The normal case. The mutex was acquired, and the block evaluated to termination.
  25901.             2: The mutex was acquired and the block evaluated, but it prematurely released the mutex with #signal.
  25902.             3: The mutex was acquired, but the process was terminated before it could proceed any further.
  25903.             4: The process was terminated before the mutex could be acquired.
  25904.         In case 4 there is no action required."
  25905.         (state := stateHolder basicAt: 1) == active
  25906.             ifTrue: [ "Cases 1 & 2"
  25907.                 owner == active ifTrue: [ "Case 1: Normal completion"
  25908.                     owner := nil. semaphore signal]]
  25909.             ifFalse: [ "Cases 3 & 4"
  25910.                 state == WAIT_OBJECT_0 ifTrue: [ "Case 3: Acquired but not evaluated"
  25911.                     owner := nil. semaphore signal]]]!
  25912.  
  25913. critical: aNiladicBlock ifLocked: exceptionHandler
  25914.     "If the receiver is NOT owned by another Process than that currently
  25915.     active, then grab it and then evaluate the argument, aNiladicBlock, to the 
  25916.     exclusion of other Processes using this mutex, answering the result, otherwise
  25917.     evaluate the <niladicValuable>, exceptionHandler.
  25918.     Implementation Note: See #critical: for comments on the implementation."
  25919.  
  25920.     | active stateHolder |
  25921.     (active := Processor activeProcess) == owner
  25922.         ifTrue: [^aNiladicBlock value].
  25923.  
  25924.     stateHolder := Array new: 1.
  25925.     ^[
  25926.         semaphore wait: 0 ret: stateHolder.
  25927.         (stateHolder basicAt: 1) == WAIT_TIMEOUT 
  25928.             ifTrue: [exceptionHandler value]
  25929.             ifFalse: [
  25930.                 owner := active.
  25931.                 stateHolder basicAt: 1 put: active.
  25932.                 aNiladicBlock value]
  25933.     ] ensure: [ | state |
  25934.         (state := stateHolder basicAt: 1) == active
  25935.             ifTrue: [
  25936.                 owner == active ifTrue: [
  25937.                     owner := nil. semaphore signal]]
  25938.             ifFalse: [
  25939.                 state == WAIT_OBJECT_0 ifTrue: [
  25940.                     owner := nil. semaphore signal]]]!
  25941.  
  25942. initialize
  25943.     "Private - Initialise the receiver. The owner is initially nil, signifying no owner,
  25944.     the first process to send #critical: will be permitted to take ownership of
  25945.     the receiver."
  25946.  
  25947.     semaphore := Semaphore forMutualExclusion.
  25948.     owner := nil!
  25949.  
  25950. owner
  25951.     "Private - Answer the owner of the Mutex"
  25952.  
  25953.     ^owner!
  25954.  
  25955. printOn: aStream
  25956.     "Append a textual representation of the receiver to the <puttableStream> argument
  25957.     as a developer might want to see it."
  25958.  
  25959.     aStream 
  25960.         basicPrint: self;
  25961.         nextPutAll: '(owner: ';
  25962.         print: owner;
  25963.         nextPutAll: ', waiting: ';
  25964.         print: semaphore;
  25965.         nextPut: $)!
  25966.  
  25967. signal
  25968.     "Private - Release the mutex if still owned by the receiver.
  25969.     Note that this message _must only_ be sent from inside a critical: block
  25970.     as otherwise thread safety may be compromised. Indeed this method
  25971.     is only intended for prematurely releasing a mutex, for example on
  25972.     the occurrence of an error."
  25973.  
  25974.     Processor activeProcess == owner ifTrue: [
  25975.         owner := nil. semaphore signal]! !
  25976.  
  25977. OAIDEExtensions comment:
  25978. 'Class to host Object Arts extensions to the standard Dolphin IDE tools.'!
  25979. !OAIDEExtensions class methodsFor!
  25980.  
  25981. allToolClasses
  25982.     ^SmalltalkToolShell allSubclasses copyWith: SmalltalkWorkspaceDocument!
  25983.  
  25984. baseProtocolFor: anObject named: aStringName
  25985.     "Private - Answers a <readableString> that best describes the base protocol
  25986.     or class of anObject. A descriptive name is passed in aStringName."
  25987.  
  25988.     | protos classProtocol default |
  25989.     protos := anObject class allProtocols collect: [:each | each displayString].
  25990.     classProtocol := '<%1>' formatWith: anObject class name.
  25991.     default := (protos detect: [:each | each = classProtocol] ifNone: [classProtocol]) asValue.
  25992.     protos add: classProtocol.
  25993.     ^(ChoicePrompter 
  25994.         on: default
  25995.         choices: protos asSortedCollection
  25996.         caption: 'Protocol for ' , aStringName , '=' , anObject printString) isNil 
  25997.         ifTrue: [OperationAborted signal]
  25998.         ifFalse: [default value]!
  25999.  
  26000. browseKeyBindingsOfShell: aShell
  26001.     | temp stream appName subTitle |
  26002.     temp := File change: File temporaryFilename extension: 'htm'.
  26003.     stream := FileStream write: temp.
  26004.     appName := (String writeStream)
  26005.                 nextPutAll: 'Dolphin Smalltalk ';
  26006.                 nextPutAll: SessionManager current versionString;
  26007.                 contents.
  26008.     subTitle := (String writeStream)
  26009.                 display: aShell class;
  26010.                 nextPutAll: ' Key Bindings';
  26011.                 contents.
  26012.     stream
  26013.         nextPutAll: '<HTML><HEAD><TITLE>';
  26014.         nextPutAll: appName;
  26015.         nextPutAll: ' - ';
  26016.         nextPutAll: subTitle;
  26017.         nextPutAll: '</TITLE></HEAD><BODY><H1>';
  26018.         nextPutAll: appName;
  26019.         nextPutAll: '</H1><H2>';
  26020.         nextPutAll: subTitle;
  26021.         nextPutAll: '</H2>'.
  26022.     self printHtmlDescriptionOfKeyBindingsForShell: aShell on: stream.
  26023.     stream nextPutAll: '</BODY></HTML>'.
  26024.     stream close.
  26025.     ShellLibrary default shellOpen: temp!
  26026.  
  26027. classBrowserClasses
  26028.     ^(#(#ClassBrowserShell #SystemBrowserShell) 
  26029.         collect: [:each | Smalltalk at: each ifAbsent: []]) select: [:each | each notNil]!
  26030.  
  26031. extendClassCommentMenu: aClassBrowserAbstract
  26032.     | commentWorkspaceMenu |
  26033.     commentWorkspaceMenu := (aClassBrowserAbstract presenterNamed: 'comment') view contextMenu.
  26034.     commentWorkspaceMenu
  26035.         addSeparator;
  26036.         addCommandDescription: (ClosedCommandDescription 
  26037.                     command: #emitClassLayoutDescription
  26038.                     description: 'Emit Class Layout Description'
  26039.                     queryBlock: [:query | query isEnabled: aClassBrowserAbstract hasClassSelected]
  26040.                     receiver: aClassBrowserAbstract)!
  26041.  
  26042. extendHelpMenu: aSmalltalkToolShell
  26043.     aSmalltalkToolShell view menuBar ifNotNil: 
  26044.             [:menuBar | 
  26045.             (menuBar find: 'Help' ifAbsent: []) ifNotNil: 
  26046.                     [:helpMenu | 
  26047.                     helpMenu 
  26048.                         insertItem: (CommandMenuItem commandDescription: (ClosedCommandDescription 
  26049.                                         command: (Message selector: #browseKeyBindingsOfShell: argument: aSmalltalkToolShell)
  26050.                                         description: '&Key Bindings'
  26051.                                         receiver: self))
  26052.                         at: 2]]!
  26053.  
  26054. initialize
  26055.     "
  26056.         self initialize
  26057.     "
  26058.  
  26059.     | classBrowsers |
  26060.     classBrowsers := self classBrowserClasses.
  26061.     classBrowsers do: 
  26062.             [:each | 
  26063.             each 
  26064.                 when: #viewOpened:
  26065.                 send: #onBrowserOpened:
  26066.                 to: self].
  26067.     (self allToolClasses difference: classBrowsers) do: 
  26068.             [:each | 
  26069.             each 
  26070.                 when: #viewOpened:
  26071.                 send: #onToolOpened:
  26072.                 to: self]!
  26073.  
  26074. instVarDescriptionsFor: aClass
  26075.     "Private - Answers a <readableString> that describes the instance variables and
  26076.     class variables for aClass. This method is simplistic, in that it relies on the availability
  26077.     of an instance of aClass to perform its work. First it tries to locate an existing instance 
  26078.     but if this fails then #new is used to instantiate one afresh. This may not be a sensible thing
  26079.     to do for all classes, and may cause an error."
  26080.  
  26081.     | names stream instance instances |
  26082.     instances := aClass allSubinstances.
  26083.     instance := instances isEmpty ifTrue: [aClass new] ifFalse: [instances first].
  26084.     stream := WriteStream on: String new.
  26085.     names := aClass instVarNames.
  26086.     names notEmpty 
  26087.         ifTrue: 
  26088.             [stream
  26089.                 nextPutAll: 'Instance Variables:';
  26090.                 cr.
  26091.             names do: 
  26092.                     [:each | 
  26093.                     | index var |
  26094.                     index := aClass indexOfInstVar: each.
  26095.                     var := instance instVarAt: index.
  26096.                     stream
  26097.                         tab;
  26098.                         nextPutAll: each;
  26099.                         tab: 2;
  26100.                         nextPutAll: (self baseProtocolFor: var named: each);
  26101.                         cr].
  26102.             stream cr].
  26103.     names := aClass classVarNames.
  26104.     names notEmpty 
  26105.         ifTrue: 
  26106.             [stream
  26107.                 nextPutAll: 'Class Variables:';
  26108.                 cr.
  26109.             names do: 
  26110.                     [:each | 
  26111.                     | var |
  26112.                     var := aClass classPool at: each.
  26113.                     stream
  26114.                         tab;
  26115.                         nextPutAll: each;
  26116.                         tab: 2;
  26117.                         nextPutAll: (self baseProtocolFor: var named: each);
  26118.                         cr].
  26119.             stream cr].
  26120.     names := aClass class instVarNames.
  26121.     names notEmpty 
  26122.         ifTrue: 
  26123.             [stream
  26124.                 nextPutAll: 'Class Instance Variables:';
  26125.                 cr.
  26126.             names do: 
  26127.                     [:each | 
  26128.                     | index var |
  26129.                     index := aClass class indexOfInstVar: each.
  26130.                     var := aClass instVarAt: index.
  26131.                     stream
  26132.                         tab;
  26133.                         nextPutAll: each;
  26134.                         tab: 2;
  26135.                         nextPutAll: (self baseProtocolFor: var named: each);
  26136.                         cr].
  26137.             stream cr].
  26138.     ^stream contents!
  26139.  
  26140. onBrowserOpened: aClassBrowserAbstract
  26141.     self extendClassCommentMenu: aClassBrowserAbstract.
  26142.     self extendHelpMenu: aClassBrowserAbstract!
  26143.  
  26144. onToolOpened: aSmalltalkToolShell
  26145.     self extendHelpMenu: aSmalltalkToolShell!
  26146.  
  26147. printHtmlDescriptionOfKeyBindingsForShell: aShell on: stream
  26148.     | accels |
  26149.     accels := LookupTable new.
  26150.     aShell view combinedAcceleratorTable accelerators 
  26151.         do: [:each | accels at: each value command put: each value].
  26152.     accels := accels 
  26153.                 asSortedCollection: [:a :b | a acceleratorKeyString < b acceleratorKeyString].
  26154.     stream
  26155.         nextPutAll: '<BR><TABLE border=1 cellpadding=3 cellspacing=2>';
  26156.         nextPutAll: '<TR><TH>Accelerator</TH>';
  26157.         nextPutAll: '<TH>Command</TH>';
  26158.         nextPutAll: '<TH>Description</TH>';
  26159.         nextPutAll: '</TR>'.
  26160.     accels do: 
  26161.             [:each | 
  26162.             stream
  26163.                 nextPutAll: '<TR align=left><TD>';
  26164.                 nextPutAll: each acceleratorKeyString;
  26165.                 nextPutAll: '</TD><TD>';
  26166.                 print: each command;
  26167.                 nextPutAll: '</TD><TD>';
  26168.                 nextPutAll: (each description copyWithout: $&);
  26169.                 nextPutAll: '</TD></TR>'].
  26170.     stream nextPutAll: '</TABLE><BR>'!
  26171.  
  26172. uninitialize
  26173.     "
  26174.         self uninitialize
  26175.     "
  26176.  
  26177.     self allToolClasses do: [:each | each removeEventsTriggeredFor: self]! !
  26178.  
  26179. ObjectRegistry comment:
  26180. 'ObjectRegistry is part of Dolphin''s external interfacing support, its purpose being to provide a unique <integer> identifier for a specific object, and, depending on the subclass, to maintain a reference to that object to prevent it from being garbage collected. This can be useful, for example, where one needs some unique identifier for an object to be passed to some external entity. 
  26181.  
  26182. Note: The Oop (address) of an object is not a suitable candidate for uniquely identifying an object, because it may change over time as the garbage collector moves objects in memory. The identity hash of an object, although time invariant, is not suitable either because it is of limited range (16-bits), and therefore not guaranteed to be unique.
  26183.  
  26184. ObjectRegistry itself is abstract: Subclasses implement both permanent registries (that maintain a strong reference to registered objects and thus keep them alive) and weak registries (that reference registered objects only weakly and thus do not prevent them from being garbage collected).
  26185.  
  26186. Instance Variables:
  26187.     registry        <sequencedCollection>. The collection of registered objects.'!
  26188. !ObjectRegistry class methodsFor!
  26189.  
  26190. defaultCapacity
  26191.     "Private - Answer the default capacity for an instance of the receiver."
  26192.  
  26193.     ^4!
  26194.  
  26195. new
  26196.     "Answer a new permanent object registry with space for the default number of elements."
  26197.  
  26198.     ^self new: self defaultCapacity!
  26199.  
  26200. new: anInteger
  26201.     "Answer a new object registry with initial capacity 
  26202.     for anInteger elements."
  26203.  
  26204.     ^self basicNew initialize: anInteger! !
  26205.  
  26206. !ObjectRegistry methodsFor!
  26207.  
  26208. addAnsweringIndex: anObject
  26209.     "Register the argument, anObject, answering a unique SmallInteger id which can be used
  26210.     subsequently to retrieve that object."
  26211.  
  26212.     ^self subclassResponsibility!
  26213.  
  26214. at: anInteger
  26215.     "Answer the object registered with the receiver with the specified id.
  26216.     If the id is invalid, raise an exception.
  26217.     Implementation Note: Although we could check to see if the object 
  26218.     with the specified id is a valid object, we cannot detect the situation
  26219.     where an id has simply been reused, so we don't bother to incur the overhead."
  26220.  
  26221.     ^registry basicAt: anInteger!
  26222.  
  26223. at: anInteger ifAbsent: exceptionHandler
  26224.     "Answer the object registered with the receiver with the specified id.
  26225.     If the id is out of bounds, evaluate the niladic valuable argument, exceptionHandler."
  26226.  
  26227.     ^registry at: anInteger ifAbsent: exceptionHandler!
  26228.  
  26229. indexOf: anObject ifAbsent: exceptionHandler
  26230.     "Answer the element of the receiver at the specified id. If there is
  26231.     no such registered object, answer the result of evaluating the
  26232.     the niladic value argument, exceptionHandler.
  26233.     Implementation Note: We do an identity search, because object registries
  26234.     are intended for registering specific object instances, and because
  26235.     it is very fast."
  26236.  
  26237.     ^registry identityIndexOf: anObject ifAbsent: exceptionHandler!
  26238.  
  26239. initialize: anInteger
  26240.     "Private - Initialize the receiver with the specified initial capacity."
  26241.  
  26242.     ^self subclassResponsibility!
  26243.  
  26244. remove: anObject ifAbsent: exceptionHandler
  26245.     "Remove the registration of the argument, anObject, freeing its unique integer id for
  26246.     subsequent re-use."
  26247.  
  26248.     ^self removeAtIndex: (self indexOf: anObject ifAbsent: [ ^exceptionHandler value ])!
  26249.  
  26250. removeAtIndex: anInteger
  26251.     "Remove, and answer, the registered object with id anInteger in the receiver. 
  26252.     Raise an error if there is no element indexed by anInteger."
  26253.  
  26254.     ^self subclassResponsibility! !
  26255.  
  26256. Package comment:
  26257. ''!
  26258. !Package class methodsFor!
  26259.  
  26260. binaryGlobalExtension
  26261.     "Private - Answer the file extension for the files to which binary globals are stored."
  26262.  
  26263.     ^ 'stb'!
  26264.  
  26265. changedIcon
  26266.         "Private - Answer the icon to mark packages that have been changed"
  26267.     
  26268.         ^Smalltalk developmentSystem changedIcon!
  26269.  
  26270. clashSignal
  26271.     "Private - Answer the <Signal> which is raised should overlapping/clashing membership
  26272.     be detected when attempting to install a package."
  26273.  
  26274.     ^ClashSignal!
  26275.  
  26276. defaultSortBlock
  26277.     ^[:a :b | a name < b name]!
  26278.  
  26279. errorInvalidPACFile: pathString 
  26280.     "Private - Raise an <Error> to the effect that the file with the specified path is
  26281.     not a valid .PAC file."
  26282.  
  26283.     ^self error: 'Invalid PAC file: ', pathString!
  26284.  
  26285. errorInvalidPAXFile: pathString 
  26286.     "Private - Raise an <Error> to the effect that the file with the specified path is
  26287.     not a valid .PAX file."
  26288.  
  26289.     ^self error: 'Invalid PAX file: ', pathString!
  26290.  
  26291. fromFile: pathname
  26292.     "Private - Answer a new instance of the receiver created from the package file at the
  26293.     specified <readableString> path, pathname, or nil if the file does not contain a
  26294.     package."
  26295.  
  26296.     | answer |
  26297.  
  26298.     answer := ((File splitExtensionFrom: pathname) sameAs: self sourcePackageExtension) 
  26299.         ifTrue: [self fromPAXFile: pathname]
  26300.         ifFalse: [self fromPACFile: pathname].
  26301.     answer packageFileName: pathname.
  26302.     ^answer!
  26303.  
  26304. fromPACFile: pathname 
  26305.     "Private - Answer a new instance of the receiver created from the .PAC file at the
  26306.     specified <readableString> path, pathname, or raise an error if the file does not contain a
  26307.     package."
  26308.  
  26309.     | pacStream answer |
  26310.     pacStream := FileStream read: pathname text: false.
  26311.     answer := 
  26312.             [(STBFiler peekForSignatureIn: pacStream) 
  26313.                 ifTrue: 
  26314.                     [pacStream reset.
  26315.                     (STBInFiler on: pacStream) next]
  26316.                 ifFalse: 
  26317.                     [pacStream beText.
  26318.                     self readFrom: pacStream]] 
  26319.                     ensure: [pacStream close].
  26320.     answer isNil ifTrue: [self errorInvalidPACFile: pathname].
  26321.     ^answer!
  26322.  
  26323. fromPAXFile: pathname 
  26324.     "Private - Answer a new instance of the receiver created from the .PAX file at the
  26325.     specified <readableString> path, pathname, or raise an error if the file does not contain a
  26326.     package in source text representation."
  26327.  
  26328.     | paxStream answer |
  26329.     paxStream := FileStream read: pathname.
  26330.     answer := [self readFrom: paxStream] ensure: [paxStream close].
  26331.     answer isNil ifTrue: [self errorInvalidPAXFile: pathname].
  26332.     ^answer!
  26333.  
  26334. icon
  26335.     "Answers an Icon that can be used to represent this class."
  26336.  
  26337.     ^##(self) defaultIcon!
  26338.  
  26339. initialize
  26340.     "Private - Initialize the receiver's class variables.
  26341.         Package initialize
  26342.     "
  26343.  
  26344.     _Uncommitted := (self basicNew)
  26345.                 initialize;
  26346.                 packagePathname: '<Unpackaged>';
  26347.                 yourself.
  26348.     ClashSignal := Signal resumableDescription: 'Package contents clash'.
  26349.     UnsaveableSignal := Signal description: 'Package cannot be saved'.
  26350.     "This dictionary is used for loading binary legacy (pre 4.0) packages only"
  26351.     VersionLookup := (LookupTable new)
  26352.                 at: 1 put: #loadVersion1:filer:;
  26353.                 at: 2 put: #loadVersion2:filer:;
  26354.                 at: 3 put: #loadVersion3:filer:;
  26355.                 at: 4 put: #loadVersion4:filer:;
  26356.                 at: 5 put: #loadVersion5:filer:;
  26357.                 shrink;
  26358.                 yourself    "same format as 4, except VM version loaded here"!
  26359.  
  26360. manager
  26361.     "Answer the object responsible for managing the collection of installed packages.
  26362.     N.B. This should be the only reference to PackageManager in the entire system,
  26363.     as the class will be removed from a future release."
  26364.  
  26365.     ^PackageManager current!
  26366.  
  26367. name: nameString
  26368.     "Answer a new instance of the receiver with the <readableString> name, nameString."
  26369.  
  26370.     ^self new
  26371.         packageFileName: nameString;
  26372.         yourself
  26373. !
  26374.  
  26375. name: nameString comment: commentString
  26376.     #deprecated.
  26377.     ^(self name: nameString)
  26378.         basicComment: commentString;
  26379.         yourself!
  26380.  
  26381. nameForMethod: aMethod
  26382.     "Private - Answer an Association of the method class name String -> methods selector Symbol.
  26383.     See: Package>>methodFromName for the reverse transformation.
  26384.     Implementation Note: As of file version 1 we use a symbolic class name, if one
  26385.     is available, to save space. Metaclasses are not globals, so these _will_ have string names."
  26386.  
  26387.     ^aMethod methodClass name -> aMethod selector!
  26388.  
  26389. new
  26390.     "Answer a new instance of the receiver."
  26391.  
  26392.     ^super new initialize!
  26393.  
  26394. onPreStripImage
  26395.     "Private - The image is about to be stripped, clear lazily initialize class variables to assist
  26396.     the stripping process."
  26397.  
  26398.     ChangedIcon := SourcePackageIcon := nil!
  26399.  
  26400. packageExtension
  26401.     "Private - Answer the file extension for the file which an instance of the
  26402.     receiver is filed out to."
  26403.  
  26404.     ^ 'pac'!
  26405.  
  26406. packageFileVersion
  26407.     "Answer the current file format version of the receiever."
  26408.  
  26409.     ^5!
  26410.  
  26411. paxVersion
  26412.     "Private - Answer the current PAX format version number."
  26413.  
  26414.     ^0!
  26415.  
  26416. publishedAspectsOfInstances
  26417.     "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  26418.  
  26419.     | answer |
  26420.     answer := (super publishedAspectsOfInstances)
  26421.                 add: (Aspect string: #packageVersion);
  26422.                 add: (Aspect block: #aboutBlock);
  26423.                 add: (Aspect fileSave: #packageFileName);
  26424.                 add: (Aspect sequenceableCollection: #manualPrerequisites
  26425.                             addFrom: self manager packageNames asSortedCollection);
  26426.                 yourself.
  26427.     "If the image has the ADK loaded, then include the image stripper"
  26428.     self environment at: #ImageStripper
  26429.         ifPresent: [:is | answer add: (Aspect name: #imageStripper) beImmutable].
  26430.     ^answer!
  26431.  
  26432. publishedEventsOfInstances
  26433.         "Answer a <Set> of <Symbol>s, being the names all the events published
  26434.         by instances of the receiver."
  26435.     
  26436.         ^super publishedEventsOfInstances
  26437.             add: #changed;
  26438.             add: #ownedChanged;
  26439.             add: #prerequisitesReset;
  26440.             yourself.
  26441.     !
  26442.  
  26443. readFrom: pacStream
  26444.     "Private - Answer a new instance of the receiver created from the .PAX (source 
  26445.     text) format representation in the <readableStream>, pacStream."
  26446.  
  26447.     | chunk |
  26448.     chunk := (ChunkSourceFiler on: pacStream) nextChunk.
  26449.     ^Compiler evaluate: chunk logged: false!
  26450.  
  26451. sourceGlobalExtension
  26452.     "Private - Answer the file extension for the files to which source globals are stored."
  26453.  
  26454.     ^ 'st'!
  26455.  
  26456. sourcePackageExtension
  26457.     "Private - Answer the file extension for the file to which sources for an instance of the
  26458.     receiver is filed out to."
  26459.  
  26460.     ^ 'pax'!
  26461.  
  26462. stbConvertFrom: anSTBClassFormat
  26463.     "Convert version 0 packages by mutating class names from Strings
  26464.     into Symbols. There is no layout change."
  26465.  
  26466.     Notification signal: 'Converting package from version ',
  26467.                         anSTBClassFormat version printString, ' to: ',
  26468.                         self stbVersion printString.
  26469.  
  26470.     ^[:data |
  26471.         (anSTBClassFormat version to: self stbVersion - 1)
  26472.             inject: data into: [:inject :version |
  26473.                 self perform: ('stbConvertFromVersion', version displayString, ':') asSymbol with: inject]]
  26474.         
  26475.         
  26476.         !
  26477.  
  26478. stbConvertFromVersion0: data
  26479.     "Private - Convert version 0 packages by mutating class names from Strings
  26480.     into Symbols. There is no layout change. Answer the mutated data.
  26481.  
  26482.     Version 0 Package        -->        Version 1 Package
  26483.     1    name                        1    name
  26484.     2    packagePathname            2    packagePathname
  26485.     3    comment                    3    comment
  26486.     4    classNames                4    classNames
  26487.     5    methodNames                5    methodNames
  26488.     6    globalNames                6    globalNames
  26489.     7    prerequisiteNames            7    prerequisiteNames
  26490.     8    preinstall                8    preinstall
  26491.     9    postinstall                9    postinstall
  26492.     10    singleFile                10    singleFile"
  26493.  
  26494.     | classNames globalNames |
  26495.     classNames := data instVarAt: 4.
  26496.     classNames become: (classNames collect: [:n | n asSymbol]).
  26497.     classNames becomeA: IdentitySet.
  26498.     globalNames := data instVarAt: 6.
  26499.     globalNames becomeA: IdentitySet.
  26500.     ^data!
  26501.  
  26502. stbConvertFromVersion1: data
  26503.     "Private - Convert version 1 packages  to version2. The preinstall and
  26504.     postinstall instance variables are replaced by a dictionary which holds
  26505.     those scripts and any more we define. Answer the mutated data.
  26506.  
  26507.     Version 1 Package        -->        Version 2 Package
  26508.     1    name                        1    name
  26509.     2    packagePathname            2    packagePathname
  26510.     3    comment                    3    comment
  26511.     4    classNames                4    classNames
  26512.     5    methodNames                5    methodNames
  26513.     6    globalNames                6    globalNames
  26514.     7    prerequisiteNames            7    prerequisiteNames
  26515.     8    preinstall                8    singleFile
  26516.     9    postinstall                9    scripts
  26517.     10    singleFile"
  26518.  
  26519.     | preinstall postinstall newPackage newData |
  26520.     preinstall := data at: 8.
  26521.     postinstall := data at: 9.
  26522.     "need to temporarily convert data Array into a Package so we can
  26523.     use public methods to add preinstall/postinstall scripts"
  26524.     newPackage := self new.
  26525.     1 to: 7 do: [:index | newPackage instVarAt: index put: (data at: index)].
  26526.     newPackage instVarAt: 8 put: (data at: 10).
  26527.     newPackage scriptAt: #preinstall put: (data at: 8).
  26528.     newPackage scriptAt: #postinstall put: (data at: 9).
  26529.  
  26530.     "now convert Package back into an Array for processing by the next converter"
  26531.     newData := Array new: 9.
  26532.     1 to: 9 do: [:index | newData at: index put: (newPackage instVarAt: index)].
  26533.     ^newData!
  26534.  
  26535. stbConvertFromVersion2: data
  26536.     "Private - Convert version 2 packages to version3. The only change is the
  26537.     addition of a list of resources owned by a packkage which doesn't also
  26538.     own the class which the resource is from. This is similar to the methodNames
  26539.     support.
  26540.  
  26541.     Version 2 Package        -->        Version 3 Package
  26542.     1    name                        1    name
  26543.     2    packagePathname            2    packagePathname
  26544.     3    comment                    3    comment
  26545.     4    classNames                4    classNames
  26546.     5    methodNames                5    methodNames
  26547.     6    globalNames                6    globalNames
  26548.     7    prerequisiteNames            7    prerequisiteNames
  26549.     8    singleFile                8    singleFile
  26550.     9    scripts                    9    scripts
  26551.                                 10 resourceNames"
  26552.  
  26553.     | newPackage newData |
  26554.     newPackage := self new.
  26555.     1 to: 9 do: [:index | newPackage instVarAt: index put: (data at: index)].
  26556.  
  26557.     "now convert Package back into an Array for processing by the next converter"
  26558.     newData := Array new: 10.
  26559.     1 to: 10 do: [:index | newData at: index put: (newPackage instVarAt: index)].
  26560.     ^newData
  26561. !
  26562.  
  26563. stbConvertFromVersion3: data
  26564.     "Private - Convert version 3 packages to version 4. The main change is the
  26565.     addition of an imageStripperBytes instance variable to hold a filed imageStripper
  26566.     to be associated with the package. We hold the image stripper in this form to allow
  26567.     filing of the package into images that do not have ImageStripper installed. 
  26568.     Additionally we must convert the full stored pathname of the package to a
  26569.     name relative to the image base."
  26570.  
  26571.     "Note that this is currently the last converter in the chain and answers the
  26572.     coverted Package object rather than an Array. This will need to be changed
  26573.     to answer an Array if an additional converter is added."
  26574.  
  26575.     "Version 3 Package        -->        Version 4 Package
  26576.     1    name                        1    name
  26577.     2    packagePathname            2    packagePathname
  26578.     3    comment                    3    comment
  26579.     4    classNames                4    classNames
  26580.     5    methodNames                5    methodNames
  26581.     6    globalNames                6    globalNames
  26582.     7    prerequisiteNames            7    prerequisiteNames
  26583.     8    singleFile                    8    singleFile
  26584.     9    scripts                    9    scripts
  26585.     10     resourceNames                10    resourceNames
  26586.                                 11 imageStripperBytes"
  26587.  
  26588.     | newPackage packagePathName newData |
  26589.     newPackage := self new.
  26590.  
  26591.     "Copy over adding a nil imageStripperBytes slot"
  26592.     1 to: 10 do: [:index | newPackage instVarAt: index put: (data at: index)].
  26593.  
  26594.     "Convert the imagePathName to a relative path"
  26595.     packagePathName := File relativePathOf: (data at: 2) to: SessionManager current imageBase.
  26596.     newPackage instVarAt: 2 put: packagePathName.
  26597.  
  26598.     "Now convert Package back into an Array for processing by the next converter"
  26599.     newData := Array new: 11.
  26600.     1 to: 11 do: [:index | newData at: index put: (newPackage instVarAt: index)].
  26601.     ^newData
  26602. !
  26603.  
  26604. stbConvertFromVersion4: data
  26605.     "Private - Convert version 4 packages to version 5.
  26606.     Adds an aboutBlock (12) and versionString (13) instance variables."
  26607.  
  26608.     ^(Array new: 13)
  26609.         replaceFrom: 1 to: 11 with: data startingAt: 1;
  26610.         yourself!
  26611.  
  26612. stbConvertFromVersion5: data
  26613.     "Private - Convert version 4 packages to version 5.
  26614.     Ensures the events inst. var. is nil (previously unused), and add some spare inst. vars.
  26615.  
  26616.     Answers the actual Package instance since this is the last converter in the chain."
  26617.  
  26618.     | newPackage |
  26619.     newPackage := self new.
  26620.     1 to: 13 do: [:index | newPackage instVarAt: index put: (data at: index)].
  26621.     newPackage setEvents: nil.
  26622.     ^newPackage!
  26623.  
  26624. stbVersion
  26625.     "Answer the current binary filer version number for instances of the receiver."
  26626.  
  26627.     ^6!
  26628.  
  26629. uncommitted
  26630.     "Answer the special package used to 'hold' uncommitted classes and other globals."
  26631.  
  26632.     ^_Uncommitted!
  26633.  
  26634. uninitialize
  26635.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  26636.  
  26637.     ChangedIcon := _Uncommitted := nil!
  26638.  
  26639. unsaveableSignal
  26640.     "Private - Answer the <Signal> which is raised should an attempt be made to save
  26641.     a package with uncommitted or cyclic pre-requisites."
  26642.  
  26643.     ^UnsaveableSignal! !
  26644.  
  26645. !Package methodsFor!
  26646.  
  26647. about
  26648.     "Displays an about screen for the receiver using the aboutBlock if any has been set."
  26649.  
  26650.     self aboutBlock notNil ifTrue: [
  26651.         self aboutBlock value: self ]!
  26652.  
  26653. aboutBlock
  26654.     "Answer the <monadicValuable> that will display an About screen
  26655.     or nil if there is none. The receiver is passed as the parameter."
  26656.  
  26657.     ^aboutBlock
  26658. !
  26659.  
  26660. aboutBlock: aMonadicValuableOrNil
  26661.     "Set the <monadicValuable> that will display an About screen.  The receiver
  26662.     will be passed as the parameter to the valuable. 
  26663.     When a package is created it does not have an about operation set. 
  26664.     To set a default splash screen see #defaultAbout."
  26665.  
  26666.     aboutBlock := aMonadicValuableOrNil.
  26667.     self isChanged: true.
  26668.  
  26669. !
  26670.  
  26671. aboutBlockBytes: aByteArray
  26672.     "Private - Set the receiver's about block by rehydrating that in serialized
  26673.     form in the <ByteArray> argument."
  26674.  
  26675.     aboutBlock := Object fromBinaryStoreBytes: aByteArray
  26676.  
  26677. !
  26678.  
  26679. addClass: aClass
  26680.     "Add aClass to the list of classes owned by the receiver. A class can only be owned by
  26681.     a single package. Answer aClass."
  26682.  
  26683.     self manager addClass: aClass to: self.
  26684.     ^aClass!
  26685.  
  26686. addGlobalNamed: globalName
  26687.     "Add the global object to those owned by the receiver. Answer anObject."
  26688.  
  26689.     self manager addGlobalNamed: globalName to: self.
  26690.     ^globalName!
  26691.  
  26692. addLooseMethod: method 
  26693.     "Private - Add the <CompiledMethod>, method, to the set of loose methods
  26694.     owned by the receiver."
  26695.     
  26696.     self assert: [(self includesClass: method methodClass) not].
  26697.     methodNames add: (self nameForMethod: method).
  26698. !
  26699.  
  26700. addMethod: method
  26701.     "Add the <CompiledMethod>, method, to the list of methods owned by the receiver and
  26702.     answer that method. As this will involve moving the method from another package, this
  26703.     is a composite operation and we need to involve the package manager to avoid problems
  26704.     with issuing events while the package system is in an interim state."
  26705.  
  26706.     self manager addMethod: method to: self.
  26707.     ^method!
  26708.  
  26709. addPackagedMethod: method
  26710.     "Private - The <CompiledMethod> argument, which is owned indirectly by this package because
  26711.     it is a method of a class which is owned, is to be re-added to this package."
  26712.     
  26713.     self assert: [self includesClass: method methodClass].
  26714.     method methodClass isChanged: true!
  26715.  
  26716. addResourceIdentifier: rid
  26717.     "Add the <ResourceIdentifier>, rid, to the list of resources owned by the
  26718.     receiver. Answer the argument."
  26719.  
  26720.     self manager addResourceIdentifier: rid to: self.
  26721.     ^rid!
  26722.  
  26723. allDependentPackages
  26724.     "Answer a <collection> of the packages which are directly dependant on the receiver."
  26725.  
  26726.     ^self manager allDependentPackagesOf: self visited: Set new!
  26727.  
  26728. allFileOutNames
  26729.     "Private - Answers an OrderedCollection of the source filenames for the receiver and all of its 
  26730.     contents when in PAX source mode. Note that the PAX filename is alway last in the collection."
  26731.  
  26732.     | answer |
  26733.     answer := OrderedCollection new.
  26734.     self allSourceObjectsDo: [:each | answer add: each fileOutName].
  26735.     ^answer!
  26736.  
  26737. allMethods
  26738.     "Answer an <IdentitySet> of all the <CompiledMethod>s directly owned by
  26739.     the receiver or by owning the class in which it is situated."
  26740.  
  26741.     | answer |
  26742.     answer := IdentitySet new: (classNames size * 20).    "On average, about 10 methods per behaviour"
  26743.     self allMethodsDo: [:m | answer add: m].
  26744.     ^answer!
  26745.  
  26746. allMethodsDo: operation
  26747.     "Private - Evaluate the <monadicValuable>, operation, for Answer an <IdentitySet> of all the <CompiledMethod>s 
  26748.     directly owned by the receiver or by owning the class in which it is situated."
  26749.  
  26750.     | loose |
  26751.     loose := self manager looseMethods.
  26752.     self behaviorsDo: 
  26753.             [:eachBehavior | 
  26754.             eachBehavior methodDictionary 
  26755.                 do: [:eachMethod | (loose includesKey: eachMethod name) ifFalse: [operation value: eachMethod]]].
  26756.  
  26757.     "Finally evaluate the operation for all the package's own loose methods"
  26758.     self methods do: operation!
  26759.  
  26760. allPrerequisites
  26761.     "Private - Answer a collection of all the Packages objects which must be loaded in before the
  26762.     receiver may be loaded in."
  26763.  
  26764.     | required |
  26765.     required := self prerequisites asSet.
  26766.     required copy do: [:each | required addAll: each allPrerequisites].
  26767.     ^required!
  26768.  
  26769. allResourceIdentifiers
  26770.     "Answer a Set of all the ResourceIdentifiers directly owned by
  26771.     the receiver or by owning the class in which it is situated."
  26772.  
  26773.     | resources resourceManager loose |
  26774.     resourceManager := SessionManager current resourceManager.
  26775.     resources := self resourceIdentifiers.
  26776.     loose := self manager looseResourceIdentifiers.
  26777.     self classesDo: 
  26778.             [:aClass | 
  26779.             (resourceManager resourcesForClass: aClass ifNone: [#()]) keysAndValuesDo: 
  26780.                     [:resName :res | 
  26781.                     | resource |
  26782.                     resource := ResourceIdentifier class: aClass name: resName.
  26783.                     (loose includes: resource) ifFalse: [resources add: resource]]].
  26784.     ^resources!
  26785.  
  26786. allResourceNames
  26787.     "Answer a <Collection> of all the resource names directly owned by
  26788.     the receiver or by its owned classes."
  26789.  
  26790.     ^self 
  26791.         propertyAt: #allResourceNames 
  26792.         ifAbsent: [self allResourceIdentifiers collect: [:each | self nameForResourceIdentifier: each]]
  26793. !
  26794.  
  26795. allResourceNames: resources
  26796.     "Private - Record the <Collection> of <Associations>s, resources, as the names of all resources
  26797.     in this package. This information is recorded only temporarily during package loading, and later
  26798.     it is generated dynamically."
  26799.  
  26800.     self propertyAt: #allResourceNames put: resources!
  26801.  
  26802. allSourceObjects
  26803.     "Answer a <collection> containing the members of the receiver that can be filed out as 
  26804.     separate source files. These objects must respond to the <sourceObject> protocol. If the
  26805.     receiver is not the system package, then it is included as the last element of the collection.
  26806.     Currently we can externalize the receiver's PAX and it's classes, resources and 
  26807.     constant pools."
  26808.  
  26809.     | answer |
  26810.     answer := OrderedCollection new.
  26811.     self allSourceObjectsDo: [:each | answer add: each].
  26812.     ^answer!
  26813.  
  26814. allSourceObjectsDo: operation
  26815.     self classesDo: operation.
  26816.     self allResourceIdentifiers do: operation.
  26817.     self sourceGlobalVariables do: [:each | operation value: each value].
  26818.     "Note that the package itself is always enumerated last - this is important"
  26819.     (self isSystemPackage not or: [Smalltalk developmentSystem isOAD]) 
  26820.         ifTrue: [operation value: self]!
  26821.  
  26822. basicAddClass: aClass
  26823.     "Private - Add aClass to the list of classes owned by the receiver. A class can only be owned by
  26824.     a single package. Answer aClass. Note that it is assumed that the class is _not_ currently
  26825.     packaged. To correctly add a class regardless of packaging use PackageManager>>addClass:to:"
  26826.  
  26827.     | className |
  26828.     "ignore any methods of aClass which we own as they are included by our new ownership of aClass"
  26829.     (self methods select: [:aMethod | aMethod methodClass == aClass or: [aMethod methodClass == aClass class]])
  26830.         do: [:method | self removeLooseMethod: method].
  26831.     "ignore any resources of aClass which we own as they are included by our new ownership of aClass"
  26832.     (self resourceIdentifiers select: [:aResourceIdentifier | aResourceIdentifier owningClass == aClass])
  26833.         do: [:aResourceIdentifier | self removeLooseResource: aResourceIdentifier].
  26834.  
  26835.     className := self nameForClass: aClass.
  26836.     classNames add: className.
  26837.  
  26838.     "Although the class hasn't changed in itself, it will need to be filed out to its new location, if using .PAX format"
  26839.     aClass isChanged: true.
  26840.  
  26841.     ^aClass!
  26842.  
  26843. basicAddGlobalNamed: globalName
  26844.     "Private - Add the global object to those owned by the receiver. Answer anObject.
  26845.      Note that it is assumed that the global is _not_ currently packaged. To 
  26846.     correctly add a class regardless of packaging use the PackageManager."
  26847.  
  26848.     | global |
  26849.     globalNames add: globalName.
  26850.  
  26851.     "The global's value has not changed, but it may now need filing out to a new location"
  26852.     global := self globalFromName: globalName.
  26853.     (self isSourceGlobal: global) ifTrue: [
  26854.         global isChanged: true].
  26855.  
  26856.     ^globalName!
  26857.  
  26858. basicAddResourceIdentifier: rid
  26859.     "Private - Add the <ResourceIdentifier>, rid, to the list of resources owned by the
  26860.     receiver. Note that this message must only be sent if the resource in question
  26861.     is not a loose resource of another package already. To safely add
  26862.     a resource to a package, use PackageManager>>addResourceIdentifier:to:"
  26863.  
  26864.     | resourceClass resourceName |
  26865.     resourceClass := rid owningClass.
  26866.     resourceName := self nameForResourceIdentifier: rid.
  26867.     (self includesClass: resourceClass)
  26868.         ifFalse: [resourceNames add: resourceName].
  26869.  
  26870.     rid isChanged: true.
  26871.     ^rid!
  26872.  
  26873. basicComment: aString
  26874.     "Private - Set the comment of the receiver."
  26875.  
  26876.     comment := aString!
  26877.  
  26878. basicLoadVersion4: aFileStream filer: binaryFiler
  26879.     "Private - File in the objects owned by the receiver. The binaryFiler is positioned to
  26880.     a number of stored objects, organized into file version 4."
  26881.  
  26882.     self declareGlobals.
  26883.     self fileInClassDefinitions: aFileStream.
  26884.     self loadGlobalsFromFiler: binaryFiler.
  26885.     self loadResourcesFromFiler: binaryFiler.
  26886.  
  26887.     "File in any trailing source code of class/methods"
  26888.     self sourceManager fileInFrom: aFileStream beText!
  26889.  
  26890. basicPackageVersion: aString
  26891.     "Private - Sets the package version identification to aStringOrNil."
  26892.  
  26893.     packageVersion := (aString isNil or: [aString isEmpty]) ifFalse: [aString]!
  26894.  
  26895. basicRemoveClass: aClass
  26896.     "Private - Remove aClass from the list of Classes owned by the receiver.
  26897.     Answer aClass."
  26898.  
  26899.     classNames remove: (self nameForClass: aClass).
  26900.     ^aClass!
  26901.  
  26902. basicRemoveGlobalNamed: globalName
  26903.     "Private - Remove globalName from the list of globals owned by the receiver.
  26904.     Answer globalName."
  26905.  
  26906.     globalNames remove: globalName.
  26907.     ^globalName!
  26908.  
  26909. basicRemoveResourceIdentifier: rid
  26910.     "Private - Remove the <ResourceIdentifier>, rid, from the list of resources owned by 
  26911.     the receiver. Answer the name of the removed resource identifier if actually
  26912.     removed."
  26913.  
  26914.     ^(self includesClass: rid owningClass) ifFalse: [
  26915.         self removeLooseResource: rid]!
  26916.  
  26917. basicScriptAt: scriptSymbol put: aString
  26918.     "Private - Set the script String associated with scriptSymbol."
  26919.  
  26920.     aString isEmpty 
  26921.         ifTrue: [scripts removeKey: scriptSymbol ifAbsent: []]
  26922.         ifFalse: [scripts at: scriptSymbol put: aString]!
  26923.  
  26924. behaviorFromName: aString ifAbsent: exceptionHandler
  26925.     | index |
  26926.     index := aString identityIndexOf: $ .
  26927.     ^index == 0 
  26928.         ifTrue: [self classFromName: aString ifAbsent: exceptionHandler]
  26929.         ifFalse: 
  26930.             [(self classFromName: (aString leftString: index - 1)
  26931.                 ifAbsent: [^exceptionHandler value]) class]!
  26932.  
  26933. behaviors
  26934.     "Answer an <IdentitySet> of the <Behavior>s owned by the receiver."
  26935.  
  26936.     | answer |
  26937.     answer := IdentitySet new: (classNames size + 1) * 2. "Avoid need to grow set by presizing"
  26938.     self behaviorsDo: [:b | answer add: b].
  26939.     ^answer!
  26940.  
  26941. behaviorsDo: operation
  26942.     "Evaluate the monadicValuable, operation, for each and every <Behavior> owned
  26943.     by the receiver."
  26944.  
  26945.     self classesDo: [:aClass | operation value: aClass; value: aClass class].
  26946. !
  26947.  
  26948. beNotUsingPAX
  26949.     "Place the receiver into a mode where it is not using PAX source files.
  26950.     This simply involves deleting any PAX source files that currently exist. Without the
  26951.     presence of a same named PAX file, the receiver assumes it is operating in
  26952.     non-PAX mode for all future save operations."
  26953.  
  26954.     | msg names |
  26955.     self isUsingPAX ifFalse: [^self].
  26956.     names := self allFileOutNames.
  26957.     msg := 'Placing this package into PAC mode will delete %2!!d!! PAX source files in the%ndirectory %3.%n%nAre you sure that you wish to proceed?' 
  26958.                 formatWith: self name
  26959.                 with: names size
  26960.                 with: self path.
  26961.     (MessageBox confirm: msg caption: ('Convert ''%1'' to PAC mode...' formatWith: self name)) 
  26962.         ifTrue: [names do: [:each | File delete: each]]!
  26963.  
  26964. beUsingPAX
  26965.     "Place the receiver into a mode where it is using PAX source files.
  26966.     This simply involves creating the PAX source files for the first time. With the
  26967.     presence of a same named PAX file, the receiver assumes it is operating in
  26968.     PAX mode for all future save operations."
  26969.  
  26970.     | msg |
  26971.     self isUsingPAX ifTrue: [^self].
  26972.     msg := 'Placing this package into PAX source mode will create %1!!d!! source files%nin the directory %2.%n%nAre you sure that you wish to proceed?' 
  26973.                 formatWith: self allSourceObjects size
  26974.                 with: self path.
  26975.     (MessageBox confirm: msg
  26976.         caption: ('Convert ''%1'' to PAX mode...' formatWith: self name)) 
  26977.             ifTrue: [self fileOutAll]!
  26978.  
  26979. binaryGlobalNames
  26980.     "Private - Answer a <Collection> of <Symbol>s, being the names of all binary global variables
  26981.     in this package. This information is cached temporarily during package loading, and
  26982.     subsequently (after the package has been loaded) calculated."
  26983.  
  26984.     ^self propertyAt: #binaryGlobalNames 
  26985.         ifAbsent: [self binaryGlobalVariables collect: [:var | var key]]!
  26986.  
  26987. binaryGlobalNames: globs
  26988.     "Private - Record the <Collection> of <Symbol>s, globs, as the names of all binary global variables
  26989.     in this package. This information is recorded only temporarily during package loading."
  26990.  
  26991.     self propertyAt: #binaryGlobalNames put: globs!
  26992.  
  26993. binaryGlobalVariables
  26994.     "Private - Answer the receiver's binary globals that can't be filed out as separate source 
  26995.     objects. Note that this _includes_ any aliases."
  26996.  
  26997.     ^self globalVariables reject: [:e | self isSourceGlobal: e value]!
  26998.  
  26999. browse
  27000.         "Open a suitable browser onto the receiver."
  27001.     
  27002.         Smalltalk developmentSystem browsePackages: (Array with: self)!
  27003.  
  27004. buildPrerequisiteNames
  27005.     "Private - Calculate the names of the receiver's prerequisite packages."
  27006.  
  27007.     | prereqs |
  27008.     prereqs := self calculatePrerequisites collect: [:each | each name].
  27009.     self manualPrerequisites 
  27010.         do: [:each | (self manager packageNamed: each ifNone: []) isNil ifFalse: [prereqs add: each]].
  27011.     ^prereqs!
  27012.  
  27013. calculatePrerequisites
  27014.     "Private - Answer an <IdentitySet? of the prerequisite <Package>s which have to be
  27015.     present before the receiver's objects may be successfully used. These packages may
  27016.     well need other packages to be loaded before they can operate."
  27017.  
  27018.     ^self tracePrerequisites keys!
  27019.  
  27020. canFileOut
  27021.     "Answer true if the receiver can be filed out. At this stage we just check to ensure that
  27022.     all the file out names associated with the PAX file are writeable."
  27023.  
  27024.     ^self fileOutNames allSatisfy: [:each | File isWriteable: each]!
  27025.  
  27026. canShowAbout
  27027.     "Answer true if we can show an about box for the receiver, i.e. we have an aboutBlock"
  27028.  
  27029.     ^self aboutBlock notNil!
  27030.  
  27031. ΓM70*æ£;'╜≤╠+╢&∞┘Ω╪∞▐▄÷╖Γ¡VQ╥╤⌐9CZ_─à*W╫`XArΓÆQ}c%]║lGyΓ┐( ₧P½▓╛ê≥▌\ ä}P.aΘÑ`?½▌╥PK╢âp╝█∙lû8=φb▀▀UÉoq╕3╫üâ≈▀ô|Ü܃░só⌠TP½o!!┬╠<╙╧VδD+ßZ╬ⁿ)!!²┬~├Wb╘ ╛╬ùfx╝¡≤╖ẫ gπσ│    
  27032. %Z8a[Å9·=t[B└εÜ⌐\|QI╔ä;┼7h Ö╘╣ iñ╣ê▌Æ;º╓┌┴mK0Ñq±
  27033. `Mδ▓J╔}SΘ▐╝■Σ!
  27034.  
  27035. classDefinitionsFileName
  27036.     "Private - Answer a filename to use for filing out the class definitions of the receiver.
  27037.     Note this is only relevant if the receiver is a system package."
  27038.  
  27039.     ^File composePath: self path stem: self name, 'Classes' extension: 'st'.!
  27040.  
  27041. classes
  27042.     "Answer a Set of the Classes owned by the receiver."
  27043.  
  27044.     ^classNames collect: [:className | self classFromName: className]!
  27045.  
  27046. classesDo: operation 
  27047.     "Evaluate the <monadicValuable>, operation, for each of the classes 
  27048.     owned by the receiver. Note that this does not include the classes of
  27049.     the receiver's loose methods."
  27050.  
  27051.     ^classNames do: [:each | operation value: (self classFromName: each)]!
  27052.  
  27053. classesInHierarchyOrder
  27054.     "Private - Answer an <sequencedReadableCollection> of the
  27055.     receiver's ownded classes in the order that they would be
  27056.     visited by a depth-first traversal of the class hierarchy."
  27057.  
  27058.     ^self hierarchyOrderOfClasses: self classes!
  27059.  
  27060. classFromName: className
  27061.     "Private - Answer the Class object which className encodes.
  27062.  
  27063.     See Package>>nameForClass: for the reverse transformation."
  27064.  
  27065.     ^self environment at: className!
  27066.  
  27067. classFromName: className ifAbsent: exceptionHandler
  27068.     "Private - Answer the Class object which className encodes.
  27069.  
  27070.     See Package>>nameForClass: for the reverse transformation."
  27071.  
  27072.     ^self environment at: className ifAbsent: exceptionHandler!
  27073.  
  27074. classNames
  27075.     "Answer an <Set> of <Symbol>s naming all the classes owned by the receiver."
  27076.  
  27077.     ^classNames!
  27078.  
  27079. comment
  27080.     "Answer the comment String of the receiver"
  27081.  
  27082.     comment isNil ifTrue: [ comment := String new ].
  27083.     ^comment!
  27084.  
  27085. comment: aString
  27086.     "Set the comment of the receiver, and flag as changed."
  27087.  
  27088.     | expr |
  27089.     self basicComment: aString.
  27090.     expr := String writeStream.
  27091.     expr 
  27092.         nextPut: $(;print: self class; space; nextPutAll: #manager; space;
  27093.         nextPutAll: #packageNamed:; space;
  27094.         print: self name; nextPutAll: ') ';
  27095.         nextPutAll: #comment:; space;
  27096.         print: aString.
  27097.     self sourceManager logEvaluate: expr contents.
  27098.     self isChanged: true.
  27099. !
  27100.  
  27101. createPackagePath
  27102.     "Private - Create the directory where the receiver resides on disk"
  27103.  
  27104.     File createDirectoryPath: (File splitPathFrom: self fileOutName)
  27105. !
  27106.  
  27107. declareGlobals
  27108.     "Private - Define global variables for each of the globals in the package prior to those globals
  27109.     being loaded. Later (after the classes in the package have been defined - in case the globals are 
  27110.     instances of any of those classes) these will be loaded from their individual STB files."
  27111.  
  27112.     self globalNames do: [:each | self environment at: each put: nil]!
  27113.  
  27114. defaultAbout
  27115.         "Shows a default About splash screen for the receiver. This looks for a bitmap of the
  27116.         same name as the package in the package installation directory. This is displayed
  27117.         in a standard modal Splash view with no overlaid version text.
  27118.     
  27119.         If you wish to use such a splash screen for your about box then set
  27120.         #aboutBlock to: [ :package | package defaultAbout ]"
  27121.     
  27122.         (Splash bitmap: self defaultAboutBitmap) show!
  27123.  
  27124. defaultAboutBitmap
  27125.     "Answer a default Bitmap to use for the receiver. We assume that a JPG of the 
  27126.         same name as the package is available in the resources directory"
  27127.  
  27128.     "We have to be a bit careful here. At boot time (or if the OLE COM package has been 
  27129.         removed)     the OLEPicture class will not be available. In such cases we just display an 
  27130.         empty bitmap"
  27131.     | bitmapFile olePicture |
  27132.     olePicture := Smalltalk at: #OLEPicture ifAbsent: [].
  27133.     olePicture notNil 
  27134.         ifTrue: 
  27135.             [| bitmap |
  27136.             bitmapFile := File 
  27137.                         composePath: 'Resources\'
  27138.                         stem: self name
  27139.                         extension: 'jpg'.
  27140.             bitmap := olePicture fromFile: bitmapFile usingLocator: FileLocator installRelative]
  27141.         ifFalse: 
  27142.             [| bitmap |
  27143.             bitmap := DIBSection width: 480 height: 360].
  27144.     ^olePicture fromFile: bitmapFile!
  27145.  
  27146. dependentPackages
  27147.     "Answer a <collection> of the packages which are directly dependant on the receiver."
  27148.  
  27149.     ^self manager dependentPackagesOf: self!
  27150.  
  27151. depthOfClass: aClass 
  27152.     | depth class |
  27153.     depth := 0.
  27154.     class := aClass.
  27155.     [class superclass isNil] whileFalse: [
  27156.         class := class superclass.
  27157.         depth := depth + 1].
  27158.     ^depth!
  27159.  
  27160. displayOn: aStream
  27161.     "Append a representation of the receiver to aStream which is suitable for display to the end user."
  27162.  
  27163.     aStream nextPutAll: self name!
  27164.  
  27165. endClassDefinitionsMarker
  27166.     "Private - Answer a String marker used to indicate the end of the
  27167.     class definitions section in a legacy (pre 4.0) package file."
  27168.  
  27169.     ^'end-class-definition'!
  27170.  
  27171. environment
  27172.     "Private - Answer the global name associated with the receiver."
  27173.  
  27174.     ^Smalltalk!
  27175.  
  27176. errorFileCorrupt
  27177.     "Private - Filing in the receivers owned objects has failed because the
  27178.     file is corrupt."
  27179.  
  27180.     self error: 'FileIn of ', self name, ' package has failed, file is corrupt'!
  27181.  
  27182. errorUnknownFileVersion: foundVersion
  27183.     "Private - Raise an exception to inform that an attempt was made to load a
  27184.     package file of an unknown version."
  27185.  
  27186.     self error:
  27187.             'Unknown package file version found ', foundVersion displayString,
  27188.             '. Current version is ', self class packageFileVersion displayString!
  27189.  
  27190. fileInClassDefinitions: aFileStream
  27191.     "Private - Load all package classes from the filestream up to the end marker.
  27192.     Note that this is only used for loading binary legacy (pre 4.0) packages."
  27193.  
  27194.     | filer |
  27195.     aFileStream beText.
  27196.     filer := ChunkSourceFiler on: aFileStream.
  27197.     
  27198.     [filer atEnd ifTrue: [^self errorFileCorrupt].
  27199.     (Compiler evaluate: filer nextChunk logged: true) = 'end-class-definition'] 
  27200.             whileFalse.
  27201.     aFileStream skipSeparators.
  27202.     aFileStream next ~= $X ifTrue: [^self errorFileCorrupt].
  27203.     aFileStream beBinary!
  27204.  
  27205. fileInClasses
  27206.     "Private - Load all packaged classes from external files"
  27207.  
  27208.     self classesInHierarchyOrder do: [:each | self sourceManager fileIn: each fileOutName]!
  27209.  
  27210. fileInScript: aSymbol 
  27211.     "Private - 'File in' the named script."
  27212.  
  27213.     | filer |
  27214.     filer := self sourceManager 
  27215.                 chunkFilerOn: (self scriptAt: aSymbol) readStream.
  27216.     filer evaluationContext: self.
  27217.     [filer fileIn] on: CompilerErrorNotification
  27218.         do: 
  27219.             [:x | 
  27220.             | msg |
  27221.             msg := 'Error: Script for %1 at line %2: %3' 
  27222.                         formatWith: aSymbol
  27223.                         with: x line displayString
  27224.                         with: (x _descriptionArguments at: 5).
  27225.             Notification signal: msg.
  27226.             x
  27227.                 beep;
  27228.                 resume]!
  27229.  
  27230. fileNameForBinaryGlobal: globalName
  27231.     "Private - Answer a filename for storing the binary globalName."
  27232.  
  27233.     ^File composePath: self path stem: globalName extension: self class binaryGlobalExtension
  27234. !
  27235.  
  27236. fileNameForSourceGlobal: globalName
  27237.     "Private - Answer a filename for storing the source globalObject."
  27238.  
  27239.     ^File composePath: self path stem: globalName extension: self class sourceGlobalExtension
  27240. !
  27241.  
  27242. fileOut
  27243.     "Private - File out a definition of the receiver to source files. Normally this
  27244.     involves saving a PAX file except in the case where the receiver is a system package
  27245.     when separate class and resource definitions files are saved instead."
  27246.  
  27247.     self isSystemPackage 
  27248.         ifFalse: [self savePAX]
  27249.         ifTrue: [self fileOutBootDefinitions].
  27250.     self isChanged: false!
  27251.  
  27252. fileOutAll
  27253.     "Fileout the receiver to a PAX file and all out it's associated source files"
  27254.  
  27255.     self allSourceObjectsDo: [:each | each fileOut]!
  27256.  
  27257. fileOutAllChanged
  27258.     "Fileout the changed source objects in the receiver"
  27259.  
  27260.     self allSourceObjectsDo: [:each | each isChanged ifTrue: [each fileOut]]!
  27261.  
  27262. fileOutAllOn: aSourceFiler 
  27263.     self fileOutOn: aSourceFiler.
  27264.     ^self
  27265.         fileOutSourceGlobalsOn: aSourceFiler;
  27266.         fileOutClassesOn: aSourceFiler;
  27267.         fileOutBinaryGlobalsOn: aSourceFiler;
  27268.         fileOutResourcesOn: aSourceFiler!
  27269.  
  27270. fileOutBinaryGlobals
  27271.     "Private - File out binary globals to individual .STB files.
  27272.     This is used in the multi-file .PAX format to avoid binary merge conflicts in the
  27273.     main PAX."
  27274.  
  27275.     (self binaryGlobalVariables - self globalAliasVariables) do: [:var | | globalStream |
  27276.         globalStream := FileStream write: (self fileNameForBinaryGlobal: var key) text: false.
  27277.         var value binaryStoreOn: globalStream.
  27278.         globalStream close].
  27279.  
  27280. !
  27281.  
  27282. fileOutBinaryGlobalsOn: aSourceFiler 
  27283.     "Private - File out the binary representation of the receiver's non-<sourceObject> 
  27284.     globals onto the <SourceFiler> argument. Binary globals are saved as the literal 
  27285.     representation of their #binaryStoreBytes.  This is used in the single-file .PAC format."
  27286.  
  27287.     aSourceFiler 
  27288.         emitComment: 'Binary Globals';
  27289.         cr.
  27290.     (self binaryGlobalVariables asSortedCollection: self variableSortBlock) 
  27291.         do: [:var | aSourceFiler fileOutBinaryGlobal: var; cr]!
  27292.  
  27293. fileOutBootDefinitions
  27294.     "Private - If this is a system package then only write out .st files capable of defining
  27295.     the classes independently of the PAX. These are required by the Dolphin boot process.
  27296.     Note that the base system package cannot contain any resources."
  27297.  
  27298.     | filer |
  27299.     filer := ChunkSourceFiler 
  27300.                 on: (FileStream write: self classDefinitionsFileName text: true).
  27301.     [self fileOutClassDefinitionsOn: filer] ensure: [filer close]!
  27302.  
  27303. fileOutClassDefinitionsOn: aSourceFiler 
  27304.     "Private - Append the text definitions of the receivers owned classes to aFileStream.
  27305.     This should produce the minimal amount of information to create a new class when 
  27306.     loaded in (i.e. only the basic definitions are emitted)."
  27307.  
  27308.     aSourceFiler
  27309.         emitComment: 'Class Definitions';
  27310.         cr.
  27311.     self classesInHierarchyOrder 
  27312.         do: [:aClass | aSourceFiler fileOutBasicDefinitionOfClass: aClass].
  27313.     aSourceFiler cr!
  27314.  
  27315. fileOutClassesOn: aSourceFiler 
  27316.     "Private - Append definitions of all the classes owned by the
  27317.     receiver to the <SourceFiler>, aSourceFiler.
  27318.     Note that the classes are filed out in class hierarchy order to 
  27319.     avoid creating forward references and to create a consistently
  27320.     ordered source file that can be effectively diff'd."
  27321.  
  27322.     aSourceFiler
  27323.         emitComment: 'Classes';
  27324.         cr.
  27325.     self classesInHierarchyOrder do: 
  27326.             [:aClass | 
  27327.             aSourceFiler fileOutAttributesOfClass: aClass.
  27328.             self fileOutMethodsOfClass: aClass on: aSourceFiler.
  27329.             self fileOutMethodsOfClass: aClass class on: aSourceFiler]!
  27330.  
  27331. fileOutGlobalAliasesOn: aSourceFiler 
  27332.     "Private - File out the text representation of the receiver's global aliases onto the
  27333.     <puttableStream>, stream."
  27334.  
  27335.     aSourceFiler
  27336.         emitComment: 'Global Aliases';
  27337.         cr.
  27338.     (self globalAliasVariables asSortedCollection: self variableSortBlock) 
  27339.         do: [:var | aSourceFiler fileOutExpression: var key , ' := ' , var value name].
  27340.     aSourceFiler cr!
  27341.  
  27342. fileOutLooseMethodsOn: aSourceFiler 
  27343.     "Private - File out the loose methods owned by the receiver to the <SourceFiler> argument."
  27344.  
  27345.     | methodsByClass |
  27346.     aSourceFiler
  27347.         emitComment: 'Loose Methods';
  27348.         cr.
  27349.     methodsByClass := IdentityDictionary new.
  27350.     self methods do: 
  27351.             [:m | 
  27352.             "Note that the selectors will be filed out in sorted order, so we don't need to sort them"
  27353.  
  27354.             (methodsByClass at: m methodClass ifAbsentPut: [OrderedCollection new]) 
  27355.                 add: m selector].
  27356.     (methodsByClass associations 
  27357.         asSortedCollection: [:a1 :a2 | (a1 key name trueCompare: a2 key name) <= 0]) 
  27358.             do: [:assoc | aSourceFiler fileOutMessages: assoc value ofBehavior: assoc key]!
  27359.  
  27360. fileOutMethodsOfClass: aClass on: aSourceFiler 
  27361.     "Private - Append any definitions of the classes methods which
  27362.     are not owned by another package to the <puttableStream>, target."
  27363.  
  27364.     | methods |
  27365.     methods := self methodsOfClass: aClass.
  27366.     methods size = aClass methodDictionary size 
  27367.         ifTrue: 
  27368.             ["The common case is that all methods of the class also belong to the this package..."
  27369.  
  27370.             aSourceFiler fileOutAllMethodsOfBehavior: aClass]
  27371.         ifFalse: 
  27372.             ["...but if some methods are not owned by this package we have more work to do"
  27373.  
  27374.             | selectors prereqs addBlock |
  27375.             selectors := methods collect: [:m | m selector].
  27376.             aSourceFiler fileOutMessages: selectors ofBehavior: aClass.
  27377.  
  27378.             "File out the intersection of the immediate protocols of the class and those of this
  27379.             and prerequisite packages' methods"
  27380.  
  27381.             "First add all selectors in the superclass chain which are in this package or one of its
  27382.             pre-requisites into the set of available selectors."
  27383.             prereqs := self prerequisites.
  27384.             addBlock := 
  27385.                     [:e :p | 
  27386.                     selectors addAll: ((p methodsOfClass: e) collect: [:m | m selector])].
  27387.             prereqs do: [:p | addBlock value: aClass value: p].
  27388.             aClass allSuperclassesDo: 
  27389.                     [:e | 
  27390.                     addBlock value: e value: self.
  27391.                     prereqs do: [:p | addBlock value: e value: p]].
  27392.             #todo.    "File out partial protocols, although tools should prevent protocols being split across packages really"
  27393.             aSourceFiler fileOutProtocols: (aClass protocols 
  27394.                         select: [:p | (p selectors difference: selectors) isEmpty])
  27395.                 ofBehavior: aClass]!
  27396.  
  27397. fileOutName
  27398.     "Answer the pathname used to store the PAX file for the sources of the receiver"
  27399.  
  27400.     ^File composePath: self path stem: self name extension: self class sourcePackageExtension!
  27401.  
  27402. fileOutNames
  27403.     "Private - Answers a set of the source filenames for the receiver when in the multi-file
  27404.     (.PAX) source mode. This contains pathnames used to store the PAX file and each of the
  27405.     binary globals, etc. It does not include the source files for the    <sourceObject>s held by the 
  27406.     receiver."
  27407.     
  27408.     ^self isSystemPackage 
  27409.         ifTrue: [Set with: self classDefinitionsFileName]
  27410.         ifFalse: [
  27411.             Set new 
  27412.                 add: self fileOutName;
  27413.                 addAll: (self binaryGlobalNames collect: [:each | self fileNameForBinaryGlobal: each]);
  27414.                 yourself]!
  27415.  
  27416. fileOutOn: aSourceFiler
  27417.     "Append the definition of the receiver in PAX format onto the
  27418.     <SourceFiler> argument. This does not file out the source files of the 
  27419.     receiver's contents."
  27420.  
  27421.     self savePAXChunkOn: aSourceFiler.
  27422.     self fileOutClassDefinitionsOn: aSourceFiler.
  27423.     self fileOutGlobalAliasesOn: aSourceFiler.
  27424.     self fileOutLooseMethodsOn: aSourceFiler.
  27425.     aSourceFiler
  27426.         emitComment: 'End of package definition';
  27427.         cr!
  27428.  
  27429. fileOutResourcesOn: aSourceFiler 
  27430.     "Private - File out the text representation of the receiver's resources onto the
  27431.     <puttableStream>, pacStream. These are saved as the literal representation of 
  27432.     their #binaryStoreBytes. This is used in the single-file .PAC format."
  27433.  
  27434.     aSourceFiler 
  27435.         emitComment: 'Resources';
  27436.         cr.
  27437.     self allResourceIdentifiers asSortedCollection do: 
  27438.             [:each | 
  27439.             each fileOutOn: aSourceFiler.
  27440.             aSourceFiler cr]!
  27441.  
  27442. fileOutSourceGlobalsOn: aSourceFiler 
  27443.     "Private - File out the text representation of the receiver's globals onto the
  27444.     <puttableStream>, stream. This is used in the single-file .PAC format."
  27445.  
  27446.     aSourceFiler 
  27447.         emitComment: 'Source Globals';
  27448.         cr.
  27449.     (self sourceGlobalVariables 
  27450.         asSortedCollection: [:a :b | (a key trueCompare: b key) <= 0]) do: 
  27451.                 [:var | 
  27452.                 var value fileOutOn: aSourceFiler.
  27453.                 aSourceFiler cr]!
  27454.  
  27455. getEvents
  27456.     "Private - Answer the EventsCollection belonging to the receiver, or nil if the receiver
  27457.     has no events registered for it"
  27458.  
  27459.     ^events!
  27460.  
  27461. getPrerequisites
  27462.     "Private - Answer a collection of <Package>s that must be loaded before the
  27463.     receiver can be loaded. Note that this differs from #prerequisites in that it will
  27464.     trace the prerequisites of the system package (which is slow)."
  27465.  
  27466.     (prerequisiteNames isNil and: [self isSystemPackage]) 
  27467.         ifTrue: [prerequisiteNames := self buildPrerequisiteNames].
  27468.     ^self prerequisites!
  27469.  
  27470. globalAliases
  27471.     "Private - Answer a <collection> of <Symbol>s, being the names of global 
  27472.     variables owned by the receiver that are just aliases to other globals."
  27473.  
  27474.     ^self propertyAt: #globalAliases
  27475.         ifAbsent: [self globalAliasVariables collect: [:var | var key]]!
  27476.  
  27477. globalAliases: aliases
  27478.     "Private - Record the <Collection> of <Symbol>s, globs, as the names of all global variables
  27479.     owned by this package which are just aliases for other globals. This information is recorded only 
  27480.     temporarily during package loading and is subsequently calculated."
  27481.  
  27482.     self propertyAt: #globalAliases put: aliases!
  27483.  
  27484. globalAliasVariables
  27485.     "Private - Answer a <collection> of <Association>s, being the global variables owned
  27486.     by the receiver that are just aliases to classes."
  27487.  
  27488.     ^self globalVariables select: [:var | self isGlobalAlias: var]!
  27489.  
  27490. globalFromName: globalName
  27491.     "Private - Answer the global Object which globalName encodes.
  27492.  
  27493.     See Package>>nameForGlobal: for the reverse transformation."
  27494.  
  27495.     ^self environment at: globalName!
  27496.  
  27497. globalNameOfLiteral: anObject 
  27498.     "Private - Answer the global name of the argument, anObject, extracted from a CompiledMethods
  27499.     literal frame, or nil if it is not a global."
  27500.  
  27501.     ^(anObject isKindOf: Association) 
  27502.         ifTrue: 
  27503.             [| key |
  27504.             key := anObject key.
  27505.             self environment associationAt: key ifPresent: [:v | v == anObject ifTrue: [key]]]
  27506.         ifFalse: 
  27507.             [(anObject isKindOf: Class) 
  27508.                 ifTrue: 
  27509.                     [| key |
  27510.                     key := anObject name.
  27511.                     (self environment includesKey: key) ifTrue: [key]]]!
  27512.  
  27513. globalNames
  27514.     "Answer an <Set> of <Symbol>s,  naming all global objects
  27515.     (including pools but excluding classes) owned by the receiver."
  27516.  
  27517.     ^globalNames!
  27518.  
  27519. globals
  27520.     "Private - Answer a set of the non-class globals in the receiver."
  27521.  
  27522.     ^self globalVariables collect: [:a | a value]
  27523. !
  27524.  
  27525. globalVariables
  27526.     "Private - Answer a <collection> of <Association>s, being the receiver's global variables."
  27527.  
  27528.     ^self globalNames collect: [:each | self environment associationAt: each ifAbsent: [each->nil]]!
  27529.  
  27530. hasCyclicPrerequisites
  27531.     "Private - Answer whether any of the receivers prerequisites or their
  27532.     prerequisites are cyclic. So two packages rely on each other to be
  27533.     loaded before they can be loaded. The package system does not currently
  27534.     handle this smoothly though it is possible to load in such a thing by
  27535.     repeatedly trying to load in all packages until it works..."
  27536.  
  27537.     ^self hasCyclicPrerequisites: IdentitySet new!
  27538.  
  27539. hasCyclicPrerequisites: trail
  27540.     "Private - Walk the package pre-requisite net looking for a cyclic dependency.
  27541.     The <collection> trail includes all those packages already visited. If we find
  27542.     a duplicate package on the path then we know a cycle exists."
  27543.  
  27544.     | answer |
  27545.     trail add: self.
  27546.     answer := self prerequisites anySatisfy: [:prereq | 
  27547.                 (trail includes: prereq) or: [prereq hasCyclicPrerequisites: trail]].
  27548.     trail remove: self.
  27549.     ^answer!
  27550.  
  27551. hasUncommittedPrerequisites
  27552.     "Private - Answer whether any of the receivers prerequisites or their
  27553.     prerequisites are current uncomitted. If so the package should not be saved
  27554.     as it will not be reloadable into an image without the uncommitted objects.
  27555.     N.B. This method will go infinitely recursive if the package has cyclic
  27556.     pre-requisites as it does not maintain a visit list. It should therefore
  27557.     be called only after hasCyclicPrerequisites has returned false."
  27558.  
  27559.     ^self prerequisites anySatisfy: [:prereq | 
  27560.         prereq == _Uncommitted or: [prereq hasUncommittedPrerequisites]]!
  27561.  
  27562. hierarchyOrderOfClasses: aCollection 
  27563.     "Private - Answer an OrderedCollection of all the Classes owned
  27564.     by the receiver intersected with the collection in classes. 
  27565.     The classes are ordered by their depth in the class hierarchy, with Object
  27566.     being first if it is owned by the receiver."
  27567.  
  27568.     ^self environment allClasses intersection: aCollection!
  27569.  
  27570. imageStripper
  27571.     "Answer an image stripper for the receiver, or nil ImageStripper class is not present.
  27572.     Since we have to be able to load the receiver into images that do no necessarily have the 
  27573.     ImageStripper class installed, we hold the stripper as a binary filed out ByteArray in imageStripperBytes.
  27574.     We reconstitute this here."
  27575.  
  27576.     ^self environment at: #ImageStripper ifPresent: [:stripperClass | | stripper |
  27577.         stripper := imageStripperBytes notNil 
  27578.                     ifTrue: [Object fromBinaryStoreBytes: imageStripperBytes].
  27579.         stripper isNil 
  27580.             ifTrue: [stripper := stripperClass new rootPackage: self; stripRedundantClasses: true; yourself]
  27581.             ifFalse: [
  27582.                 "If the package has been renamed the STB'd image stripper might lose its root package"
  27583.                 stripper rootPackage isNil ifTrue: [stripper rootPackage: self]].
  27584.         stripper]
  27585. !
  27586.  
  27587. imageStripper: anImageStripper
  27588.     "Set the image stripper for the receiver to anImageStripper. 
  27589.     Since we have to be able to load the receiver into images that do no necessarily 
  27590.     have the ImageStripper class installed, we hold the stripper as a binary filed out ByteArray 
  27591.     in imageStripperBytes"
  27592.  
  27593.     | newBytes |
  27594.     newBytes := anImageStripper binaryStoreBytes.
  27595.     imageStripperBytes = newBytes ifFalse: [
  27596.         self imageStripperBytes: newBytes.
  27597.         self isChanged: true]
  27598. !
  27599.  
  27600. imageStripperBytes: aByteArray
  27601.     "Private - Set the image stripper bytes for the receiver to aByteArray."
  27602.  
  27603.     imageStripperBytes := aByteArray.
  27604.  
  27605. !
  27606.  
  27607. includesClass: aClass 
  27608.     "Answer whether the receiver owns aClass. aClass's metaclass is
  27609.     automatically owned as well."
  27610.  
  27611.     ^(classNames includes: (self nameForClass: aClass instanceClass)) 
  27612.         and: [(self isImportedClass: aClass) not]!
  27613.  
  27614. includesGlobalNamed: globalName
  27615.     "Answer whether the receiver owns the global named globalName."
  27616.  
  27617.     ^globalNames includes: globalName!
  27618.  
  27619. includesMethod: aMethod
  27620.     "Answer whether the receiver owns aMethod."
  27621.  
  27622.     (self isImportedClass: aMethod methodClass) ifTrue: [^false].
  27623.     ^methodNames includes: (self nameForMethod: aMethod)!
  27624.  
  27625. includesResourceIdentifier: aResourceIdentifier
  27626.     "Answer whether the receiver directly owns aResourceIdentifier.
  27627.     Implementation Note: Avoid the lookup in the table of imported classes if
  27628.     possible, as that is a relatively expensive operation."
  27629.  
  27630.     ^(resourceNames includes: (self nameForResourceIdentifier: aResourceIdentifier)) and: [
  27631.         (self isImportedClass: aResourceIdentifier owningClass) not]
  27632. !
  27633.  
  27634. initialize
  27635.     "Private - Initialize the state of the receiver."
  27636.  
  27637.     methodNames := PluggableSet searchPolicy: AssociationSearchPolicy current.
  27638.     resourceNames := PluggableSet searchPolicy: AssociationSearchPolicy current.
  27639.     classNames := IdentitySet new.
  27640.     globalNames := IdentitySet new.
  27641.     scripts := IdentityDictionary new.
  27642.     comment := ''.
  27643. !
  27644.  
  27645. initializeClasses
  27646.     "Private - Initialize all loaded classes."
  27647.  
  27648.     self classesInHierarchyOrder do: [:aClass | aClass initializeAfterLoad]!
  27649.  
  27650. initializeGlobals
  27651.     "Private - Initialize all globals (including classes) that require it."
  27652.  
  27653.     self initializeClasses.
  27654.     self globals 
  27655.         do: [:each | (each respondsTo: #initializeAfterLoad) ifTrue: [each initializeAfterLoad]].
  27656.     self globalAliasVariables 
  27657.         do: [:each | each value class isMeta ifTrue: [ClassLocator addAlias: each key forClass: each value]]!
  27658.  
  27659. isChanged
  27660.     "Answer true if the receiver or any of it's contents have been changed since
  27661.     their changed flag was last reset."
  27662.  
  27663.     ^self propertyAt: #isChanged ifAbsent: [false]!
  27664.  
  27665. isChanged: aBoolean
  27666.     "Set the changed flag for the receiver to aBoolean"
  27667.  
  27668.     self isChanged = aBoolean 
  27669.         ifFalse: 
  27670.             [aBoolean 
  27671.                 ifTrue: [self propertyAt: #isChanged put: true]
  27672.                 ifFalse: [self removePropertyAt: #isChanged ifAbsent: []].
  27673.             self trigger: #changed]!
  27674.  
  27675. isDefaultPackage
  27676.     "Answer whether the receiver is the default package to which all newly defined
  27677.     classes and methods are added."
  27678.  
  27679.     ^self manager defaultPackage == self!
  27680.  
  27681. isGlobalAlias: anAssociation 
  27682.     | glob |
  27683.     glob := anAssociation value.
  27684.     ^(self isSourceGlobal: glob) and: [anAssociation key ~= glob name]!
  27685.  
  27686. isImportedClass: aClass
  27687.     "Private - Answer true if aClass is an imported binary class"
  27688.  
  27689.     ^ClassLocator importedClasses identityIncludes: aClass!
  27690.  
  27691. isInstalled
  27692.     "Answer whether the receiver is currently installed in the system."
  27693.  
  27694.     ^self manager includesPackage: self!
  27695.  
  27696. isSourceGlobal: aGlobal
  27697.     "Private - Answer true if aGlobal can be filed out as an external source file"
  27698.  
  27699.     ^aGlobal class conformsToProtocol: #sourceObject
  27700. !
  27701.  
  27702. isSystemPackage
  27703.     "Answer whether the receiver is the system package"
  27704.  
  27705.     ^self manager systemPackage == self!
  27706.  
  27707. isUsingPAX
  27708.     "Answer true if the receiver is using PAX mode. If a PAX file of the same name as the
  27709.     receiver exists on disk then both PAC and PAX files are saved simultaneously."
  27710.  
  27711.     self isSystemPackage ifTrue: [^true].
  27712.     ^File exists: self fileOutName
  27713.  
  27714.     !
  27715.  
  27716. isUsingPAX: aBoolean
  27717.     "Place the receiver into a mode where it is using PAX source format according to aBoolean."
  27718.  
  27719.     self assert: [self isSystemPackage not].
  27720.     aBoolean 
  27721.         ifTrue: [ self beUsingPAX ]
  27722.         ifFalse: [ self beNotUsingPAX ]!
  27723.  
  27724. load
  27725.     "Private - Load all the objects owned by the receiver. This assumes that all prerequisite
  27726.     packages are currently loaded in."
  27727.  
  27728.     ((File splitExtensionFrom: self packageFileName) 
  27729.         sameAs: self class sourcePackageExtension) ifTrue: [self loadPAX] ifFalse: [self loadPAC].
  27730.     self removePAXProperties.
  27731.     self upateFileNames!
  27732.  
  27733. loadBinaryGlobals
  27734.     "Private - Load each of the receiver's binary globals from their individual STB files."
  27735.  
  27736.     self binaryGlobalNames do: [:each | | globalStream |
  27737.         globalStream := FileStream read: (self fileNameForBinaryGlobal: each) text: false.
  27738.         self environment at: each put: (Object binaryReadFrom: globalStream).
  27739.         globalStream close]!
  27740.  
  27741. loadGlobalsFromFiler: binaryFiler
  27742.     "Private - File in binary definitions of all the globals held by
  27743.     the receiver are directly or indirectly through class ownership.
  27744.     Note that this is only used for loading legacy (pre 4.0 packages."
  27745.  
  27746.     globalNames size timesRepeat: [binaryFiler next]!
  27747.  
  27748. loadLegacyPAC: aReadStream
  27749.     "Private - Load the package the receiver represents from the Dolphin 3.x format 
  27750.     (mixed STB binary and source text) on the <readableStream> argument, aReadStream."
  27751.  
  27752.     | sourceManager binaryFiler version |
  27753.     sourceManager := self sourceManager.
  27754.     binaryFiler := STBInFiler on: aReadStream.
  27755.  
  27756.     "Load the package. We ignore this (since it represents the receiver)."
  27757.     binaryFiler next.
  27758.     version := binaryFiler next.
  27759.  
  27760.     (VersionLookup includesKey: version)
  27761.         ifFalse: [^self errorUnknownFileVersion: version].
  27762.  
  27763.     self fileInScript: #preinstall.
  27764.     self perform: (VersionLookup at: version) with: aReadStream with: binaryFiler.
  27765.     self initializeGlobals.
  27766.     self fileInScript: #postinstall!
  27767.  
  27768. loadPAC
  27769.     "Private - Load all the objects owned by the receiver. This assumes that all prerequisite
  27770.     packages are currently loaded."
  27771.  
  27772.     | filename pacStream |
  27773.     filename := self packageFileName.
  27774.     Notification 
  27775.         signal: ('Loading package ''%1'' from: %2' formatWith: self name with: filename).
  27776.     pacStream := FileStream read: filename text: false.
  27777.     
  27778.     [(STBFiler peekForSignatureIn: pacStream) 
  27779.         ifTrue: 
  27780.             [pacStream reset.
  27781.             self loadLegacyPAC: pacStream]
  27782.         ifFalse: 
  27783.             [pacStream beText.
  27784.             self loadPAC: pacStream]] 
  27785.             ensure: [pacStream close]!
  27786.  
  27787. loadPAC: stream
  27788.     "Private - Load a chunked source text .PAC from the <readableStream>, stream."
  27789.  
  27790.     | filer |
  27791.     filer := ChunkSourceFiler on: stream.
  27792.  
  27793.     "Skip the first chunk since it represents the receiver."
  27794.     filer nextChunk.
  27795.  
  27796.     self fileInScript: #preinstall.
  27797.  
  27798.     "Must declare the globals before filing in any code"
  27799.     self declareGlobals.
  27800.  
  27801.     "File in the definitions of the package's members (pools, classes, methods, globals, resources, etc)"
  27802.     filer fileIn.
  27803.  
  27804.     self initializeGlobals.
  27805.     self fileInScript: #postinstall.
  27806. !
  27807.  
  27808. loadPAX
  27809.     "Private - Load all the objects owned by the receiver. This assumes that all prerequisite
  27810.     packages are currently loaded in."
  27811.  
  27812.     | filename filer |
  27813.     filename := self packageFileName.
  27814.     Notification 
  27815.         signal: ('Loading source package ''%1'' from: %2' formatWith: self name with: filename).
  27816.     filer := ChunkSourceFiler on: (FileStream read: filename).
  27817.     
  27818.     [| pax |
  27819.     pax := filer nextChunk.    "Skip the first chunk since it represents the receiver."
  27820.     self fileInScript: #preinstall.
  27821.  
  27822.     "Define any globals that might be referenced from source code, but don't load them as yet as they
  27823.          may be instances of one of the classes in the package."
  27824.     self declareGlobals.
  27825.  
  27826.     "Load source globals"
  27827.     self globalNames - (self propertyAt: #binaryGlobalNames ifAbsent: [#()]) 
  27828.         - (self propertyAt: #globalAliases ifAbsent: [#()]) 
  27829.             do: [:each | self sourceManager fileIn: (self fileNameForSourceGlobal: each)].
  27830.  
  27831.     "Load class definitions, aliases, and loose methods from the remainder of the PAX file"
  27832.     filer fileIn.
  27833.     self fileInClasses.
  27834.     self loadBinaryGlobals.
  27835.     self initializeGlobals.
  27836.     self loadResources.
  27837.     self fileInScript: #postinstall] 
  27838.             ensure: [filer close]!
  27839.  
  27840. loadResources
  27841.     "Private - Load all packaged resources for a source format (.PAX) package."
  27842.  
  27843.     | resNames |
  27844.     #todo.    ".pax file out should specify type of resource?"
  27845.     resNames := self allResourceNames.
  27846.     resNames notEmpty 
  27847.         ifTrue: 
  27848.             [| resClass |
  27849.             resClass := Smalltalk at: #ViewResource.
  27850.             resNames do: 
  27851.                     [:each | 
  27852.                     ResourceIdentifier 
  27853.                         load: resClass
  27854.                         intoClass: (self classFromName: each key)
  27855.                         name: each value]]!
  27856.  
  27857. loadResourcesFromFiler: binaryFiler 
  27858.     "Private - File in binary definitions of all the resources held by
  27859.     the receiver are directly or indirectly through class ownership."
  27860.  
  27861.     | aResourceIdentifier |
  27862.     [(aResourceIdentifier := binaryFiler next) notNil] whileTrue: 
  27863.             ["Read in the binary resource"
  27864.             | resource |
  27865.             resource := binaryFiler next.
  27866.             aResourceIdentifier assign: resource.
  27867.  
  27868.             "Flag this resource as unchanged since it has just been loaded"
  27869.             aResourceIdentifier resource isChanged: false]!
  27870.  
  27871. loadVersion1: aFileStream filer: binaryFiler
  27872.     "Private - File in the objects owned by the receiver. The binaryFiler is positioned to
  27873.     a number of stored objects, organized into file version 1."
  27874.  
  27875.     self vmVersionCheck: 0.
  27876.     self declareGlobals.
  27877.     self fileInClassDefinitions: aFileStream.
  27878.     self loadGlobalsFromFiler: binaryFiler.
  27879.  
  27880.     "File in any trailing source code of class/methods"
  27881.     self sourceManager fileInFrom: aFileStream beText.
  27882.     self initializeGlobals.!
  27883.  
  27884. loadVersion2: aFileStream filer: binaryFiler
  27885.     "Private - File in the objects owned by the receiver. The binaryFiler is positioned to
  27886.     a number of stored objects, organized into file version 2."
  27887.  
  27888.     self vmVersionCheck: 0.
  27889.     self declareGlobals.
  27890.     self fileInClassDefinitions: aFileStream.
  27891.     self loadGlobalsFromFiler: binaryFiler.
  27892.  
  27893.     "File in any trailing source code of class/methods"
  27894.     self sourceManager fileInFrom: aFileStream beText.
  27895.     self initializeGlobals!
  27896.  
  27897. loadVersion3: aFileStream filer: binaryFiler 
  27898.     "Private - File in the objects owned by the receiver. The binaryFiler is positioned to
  27899.     a number of stored objects, organized into file version 3."
  27900.  
  27901.     self vmVersionCheck: 0.
  27902.     self declareGlobals.
  27903.     self fileInClassDefinitions: aFileStream.
  27904.     self loadGlobalsFromFiler: binaryFiler.
  27905.  
  27906.     "Load in resources for each class"
  27907.     classNames size timesRepeat: 
  27908.             [| className resourceClass |
  27909.             className := binaryFiler next.
  27910.             resourceClass := self classFromName: className.
  27911.             binaryFiler next keysAndValuesDo: 
  27912.                     [:resourceName :resource | 
  27913.                     (ResourceIdentifier class: resourceClass name: resourceName) assign: resource]].
  27914.  
  27915.     "File in any trailing source code of class/methods"
  27916.     self sourceManager fileInFrom: aFileStream beText.
  27917.     self initializeGlobals!
  27918.  
  27919. loadVersion4: aFileStream filer: binaryFiler
  27920.     "Private - File in the objects owned by the receiver. The binaryFiler is positioned to
  27921.     a number of stored objects, organized into file version 4."
  27922.  
  27923.     self vmVersionCheck: 0.
  27924.     self basicLoadVersion4: aFileStream filer: binaryFiler!
  27925.  
  27926. loadVersion5: aFileStream filer: binaryFiler
  27927.     "Private - File in the objects owned by the receiver. The binaryFiler is positioned to
  27928.     a number of stored objects, organized into file version 5."
  27929.  
  27930.     self vmVersionCheck: binaryFiler next.
  27931.  
  27932.     "Apart from the VM version number, this format is the same as 4, so we just use
  27933.     the version 4 load."
  27934.     ^self basicLoadVersion4: aFileStream filer: binaryFiler!
  27935.  
  27936. φK47▒¥1,╫├σh╡-Φ┬ε╪√ùÆòî≈¿\U║¿Ço{M┴ï+@öZ,|T^+■ä^Kc%J¬jVxα╞Jô│(iαñ▓ƱÅ¢Y[fo▐»-3╜·╧K\É░yóF╡iÖ≥ *7∞tû╥\ÿoq╕3╫╥╟≤╩ífä¼öüh-ó■TOδ t╪»ä┌^ΣIo╨▀≡%!!⌡╚k╟qa╒-▓┘├y┘!
  27937.  
  27938. manager
  27939.     "Answer the object responsible for managing this package."
  27940.  
  27941.     ^self class manager!
  27942.  
  27943. manualPrerequisites
  27944.     "Answer the <collection> of manually specified pre-requisite package names for the receiver.
  27945.     Normally pre-requisites are calculated automatically, but in certain instances (such as method-only
  27946.     packages) the pre-requisite tracing mechanism doesn't find the dependency, so this collection
  27947.     is provided to permit the user to specify any additional pre-requisites. At present the collection
  27948.     must be maintained by inspecting the properties of the package."
  27949.  
  27950.     ^(manualPrerequisites isNil 
  27951.         ifTrue: [#()]
  27952.         ifFalse: [manualPrerequisites]) asOrderedCollection
  27953.         !
  27954.  
  27955. manualPrerequisites: aCollectionOfStrings 
  27956.     "Set the <collection> of manually specified pre-requisite package names for the receiver."
  27957.  
  27958.     | newPrereqs |
  27959.     newPrereqs := aCollectionOfStrings notEmpty 
  27960.                 ifTrue: [aCollectionOfStrings asSortedCollection asArray copyWithout: self name].
  27961.     newPrereqs = manualPrerequisites 
  27962.         ifFalse: 
  27963.             [manualPrerequisites := newPrereqs.
  27964.             self isChanged: true.
  27965.             self resetPrerequisites]!
  27966.  
  27967. methodFromName: methodName ifAbsent: exceptionHandler
  27968.     "Private - Answer the Method object which methodName encodes. There
  27969.     is some messing around to handle
  27970.  
  27971.     See Package>>nameForMethod: for the reverse transformation."
  27972.  
  27973.     | className methodClass |
  27974.     className := methodName key.
  27975.     methodClass := self behaviorFromName: className ifAbsent: [^exceptionHandler value].
  27976.     ^methodClass compiledMethodAt: methodName value asSymbol
  27977.         ifAbsent: exceptionHandler!
  27978.  
  27979. methodNames
  27980.     "Answer a <Set> of <Association>s, naming the methods owned by the
  27981.     receiver. Note that this only includes loose methods that extend classes in other 
  27982.     packages, not the name of methods defined in classes owned by this package."
  27983.  
  27984.     ^methodNames!
  27985.  
  27986. methods
  27987.     "Answer an <IdentitySet> of the <CompiledMethod>s owned by the receiver."
  27988.  
  27989.     | newIdentitySet |
  27990.     newIdentitySet := IdentitySet new: methodNames size.
  27991.     methodNames do: [:methodName |
  27992.         newIdentitySet add: (self methodFromName: methodName ifAbsent: [])].
  27993.     ^newIdentitySet!
  27994.  
  27995. methodsOfClass: aClass
  27996.     "Answer a Collection of the methods of aClass which the receiver either
  27997.     directly owns (as loose methods) or through owning aClass."
  27998.  
  27999.     ^(self includesClass: aClass) 
  28000.         ifTrue: 
  28001.             ["A neat way to express this would be:
  28002.                 aClass methodDictionary asIdentitySet difference: self class manager looseMethods
  28003.             but unfortunately performance is critical here, and we can double the speed as follows:"
  28004.  
  28005.             | owned loose all |
  28006.             all := aClass methodDictionary.
  28007.             owned := IdentitySet new: all size.
  28008.             loose := self manager looseMethods.
  28009.             all do: [:each | (loose includesKey: each name) ifFalse: [owned add: each]].
  28010.             owned]
  28011.         ifFalse: 
  28012.             ["Just pick out any loose methods we own in the class"
  28013.  
  28014.             self methods select: [:aMethod | aMethod methodClass == aClass]]!
  28015.  
  28016. name
  28017.     "Answer the name of the receiver. This must always be the same as the stem of the package's
  28018.     file name, and must be unique amongst all loaded packages in the system."
  28019.  
  28020.     ^name!
  28021.  
  28022. nameForClass: aClass
  28023.     "Private - Answer a String name suitable for adding to the receivers classNames.
  28024.     See: Package>>classFromName for the reverse transformation.
  28025.     Implementation Note: As of package binary file version 1, we store the class names
  28026.     as Symbols to avoid wasting space."
  28027.  
  28028.     ^aClass name!
  28029.  
  28030. nameForMethod: aMethod
  28031.     "Private - Answer an Association of the method class name String -> methods selector Symbol.
  28032.     See: Package>>methodFromName for the reverse transformation."
  28033.  
  28034.     ^self class nameForMethod: aMethod!
  28035.  
  28036. nameForResourceIdentifier: aResourceIdentifier
  28037.     "Private - Answer an <Association> that uniquely identifies the <ResourceIdentifier> argument."
  28038.  
  28039.     ^aResourceIdentifier owningClass name -> aResourceIdentifier name!
  28040.  
  28041. okToSaveOrDeploy
  28042.     "Private - Prior to saving or deploying the receiver, check that all is consistent and answer whether the
  28043.     receiver should be saved. Raise Errors that describe any problems."
  28044.  
  28045.     self isSystemPackage ifTrue: [^false].
  28046.     self hasCyclicPrerequisites 
  28047.         ifTrue: 
  28048.             [self class unsaveableSignal 
  28049.                 signal: ('The package ''%1'' has cyclic prerequisites.' formatWith: self name).
  28050.             ^false].
  28051.  
  28052.     "N.B. This must be done after the above, as it will go infinitely recursive if there are cycles."
  28053.     self hasUncommittedPrerequisites 
  28054.         ifTrue: 
  28055.             [self class unsaveableSignal 
  28056.                 signal: ('The package ''%1'' has prerequisites which are not currently assigned to any other package, or it is dependent on other packages which in turn have uncommitted prerequisites.' 
  28057.                         formatWith: self name).
  28058.             ^false].
  28059.     self validate.
  28060.     ^true!
  28061.  
  28062. okToUninstall
  28063.     "Private - Validate that the receiver can be uninstalled. 
  28064.     Raise Errors that describe any problems. Answer whether
  28065.     OK to proceed."
  28066.  
  28067.     self isSystemPackage ifTrue: [
  28068.         Error signal: 'The base system package cannot be uninstalled'.
  28069.         ^false].
  28070.  
  28071.     self hasCyclicPrerequisites ifTrue: [
  28072.         Error signal: ('The package ''%1'' has cyclic prerequisites and cannot be uninstalled.' formatWith: self name).
  28073.         ^false].
  28074.  
  28075.     ^true!
  28076.  
  28077. onClassRemoved: aClass
  28078.     "Private - React to aClass being removed from the Dolphin system.
  28079.     Ensure that none of the receivers loaded packages refer to aClass
  28080.     or its methods now it has departed.
  28081.  
  28082.     N.B. We have to take care here when checking methods. As aClass is
  28083.     no longer tied into the system class tree we have to use the method
  28084.     names."
  28085.  
  28086.     | className classClassName ownedChanged removed |
  28087.     className := aClass name.
  28088.     classClassName := aClass class name.
  28089.     ownedChanged := false.
  28090.  
  28091.     "remove any directly owned methods from aClass"
  28092.     removed := methodNames 
  28093.                 select: [:methodName | methodName key = className or: [methodName key = classClassName]].
  28094.     removed notEmpty 
  28095.         ifTrue: 
  28096.             [ownedChanged := true.
  28097.             methodNames removeAll: removed].
  28098.  
  28099.     "remove any directly owned resources from aClass"
  28100.     removed := resourceNames 
  28101.                 select: [:resourceName | resourceName key = className].
  28102.     removed notEmpty ifTrue: [
  28103.             ownedChanged := true.
  28104.             resourceNames removeAll: removed].
  28105.     (self includesClass: aClass) 
  28106.         ifTrue: 
  28107.             [ownedChanged := true.
  28108.             self basicRemoveClass: aClass].
  28109.     ^ownedChanged!
  28110.  
  28111. onClassRenamed: aClass from: oldName to: newName
  28112.     "Private - React to the <Class>, aClass, being removed from the Dolphin system.
  28113.     Ensure that none of the receivers loaded packages refer to aClass
  28114.     or its methods now it has departed.
  28115.  
  28116.     N.B. We have to take care here when checking methods. As aClass is
  28117.     no longer tied into the system class tree we have to use the method
  28118.     names."
  28119.  
  28120.     "Search for and rename any resources keyed on the class"
  28121.  
  28122.     (classNames includes: oldName) 
  28123.         ifTrue: 
  28124.             [classNames
  28125.                 remove: oldName;
  28126.                 add: newName.
  28127.             "If class includes package, can't be any loose methods or resources, so early out"
  28128.             ^true].
  28129.  
  28130.     ^(self renameLooseMethodsOf: oldName to: newName) 
  28131.         | (self renameResourcesOf: oldName to: newName)!
  28132.  
  28133. onGlobalRenamed: anAssociation from: oldName
  28134.     "Private - React to oldName global being renamed. Note that this
  28135.     is sent only for non-Class globals."
  28136.  
  28137.     (globalNames includes: oldName) 
  28138.         ifTrue: 
  28139.             [globalNames
  28140.                 remove: oldName;
  28141.                 add: anAssociation key.
  28142.             "Note that the pre-requisites are unaffected, but we reset them anyway because this is rare"
  28143.             self ownedChanged]!
  28144.  
  28145. onResourceRemoved: resourceId
  28146.     "Private - The specified resource has been removed from the system. Remove it
  28147.     from this package if referenced."
  28148.  
  28149.     self removeResourceIdentifier: resourceId!
  28150.  
  28151. ownedChanged
  28152.     "Private - The receiver's membership has changed, and its immediate pre-requisites may have 
  28153.     changed as a result."
  28154.  
  28155.     self ownedUpdated.
  28156.     self trigger: #ownedChanged!
  28157.  
  28158. ownedUpdated
  28159.     "Private - The receiver, or an object owned by the receiver has been updated.
  28160.     Mark the receiver as changed, and reset pre-requisites just in case there is any 
  28161.     effect on those, but do not trigger an #ownedChanged event."
  28162.  
  28163.     self resetPrerequisites; isChanged: true!
  28164.  
  28165. owningPackage
  28166.     "Answers the package that owns the receiver.
  28167.     This is obviously self in the case of packages"
  28168.  
  28169.     ^self!
  28170.  
  28171. packageFileName
  28172.     "Answer the full path name (ie Path+Stem+Extension) of the file used
  28173.     to store the source code representation of the receiver. This is recomposed
  28174.     from the relative path held"
  28175.  
  28176.     ^File fullPathOf: packagePathname relativeTo: SessionManager current imageBase!
  28177.  
  28178. packageFileName: pathname 
  28179.     "Private - Set the path name (ie Path+Stem+Extension) of the file used
  28180.     to store the binary representation of the receiver. This is always held as
  28181.     relative to the current image base. This name should only be changed
  28182.     through the PackageManager, and in fact it is not advisable to change
  28183.     it any way because other packages may be dependent upon it.."
  28184.  
  28185.     self packagePathname: (FileLocator imageRelative 
  28186.                 relativePathTo: (File default: pathname
  28187.                         extension: self class packageExtension))!
  28188.  
  28189. packageFolder
  28190.     ^File splitPathFrom: self packagePathname!
  28191.  
  28192. packagePathname
  28193.     ^packagePathname!
  28194.  
  28195. packagePathname: aString
  28196.     "Private - Set the receiver's path and name."
  28197.  
  28198.     | oldname |
  28199.     packagePathname := aString.
  28200.     "The name can no longer be independent of the file name, and is in fact just cached from the file stem"
  28201.     oldname := name.
  28202.     name := File splitStemFrom: aString.
  28203.     (oldname = name or: [oldname isNil]) 
  28204.         ifFalse: 
  28205.             [self isChanged: true.
  28206.             "If a package is renamed, then the dependent packages need to be resaved to update their pre-requisite information"
  28207.             self dependentPackages do: [:each | each isChanged: true]]!
  28208.  
  28209. packageVersion
  28210.     "Answer the version identification of the receiver as a String"
  28211.  
  28212.     ^packageVersion notNil ifTrue: [packageVersion] ifFalse: [''].
  28213. !
  28214.  
  28215. packageVersion: aString
  28216.     "Sets the package version identification to the <readableString>, aString,
  28217.     and flag as changed."
  28218.  
  28219.     self basicPackageVersion: aString.
  28220.     self isChanged: true.
  28221. !
  28222.  
  28223. path
  28224.     "Private - Answer the full path to the directory holding the receivers files."
  28225.  
  28226.     ^File splitPathFrom: self packageFileName!
  28227.  
  28228. paxVersion
  28229.     "Private - Answer the PAX format version of the package being loaded (or the current
  28230.     format if a loaded package)."
  28231.  
  28232.     ^self propertyAt: #paxVersion ifAbsent: [self class paxVersion]!
  28233.  
  28234. paxVersion: anInteger
  28235.     "Private - Temporarily record the PAX format version in which the package being loaded
  28236.     was saved. This may be used for loading old format source packages in future."
  28237.  
  28238.     self propertyAt: #paxVersion put: anInteger!
  28239.  
  28240. prerequisiteNames
  28241.     "Private - Answer the <readableString> names of the receiver's prerequisite packages, i.e.
  28242.     the packages which must be loaded before the receiver.
  28243.  
  28244.     There is a lazy evaluation here because anytime an object is added/removed/deleted
  28245.     from the current PackageManager then the prerequisites may change. Rather than
  28246.     updating after every change we set all Packages prerequisitePackages to nil and 
  28247.     recalculate them as they are requested."
  28248.  
  28249.     ^prerequisiteNames ifNil: 
  28250.             ["To save time make a special case of the system package"
  28251.  
  28252.             self isSystemPackage 
  28253.                 ifTrue: [IdentitySet new]
  28254.                 ifFalse: [prerequisiteNames := self buildPrerequisiteNames]]!
  28255.  
  28256. prerequisites
  28257.     "Answer a collection of <Package>s that must be loaded before the
  28258.     receiver can be loaded."
  28259.  
  28260.     | pacman |
  28261.     pacman := self manager.
  28262.     ^self prerequisiteNames 
  28263.         collect: [:packageName | pacman packageNamed: packageName ifNone: [_Uncommitted]]!
  28264.  
  28265. printBinaryStoreBytesOf: anObject
  28266.     "Private - Prints the literal representation of the binary store bytes of anObject
  28267.     onto a String and answers this."
  28268.  
  28269.     | bytes stream |
  28270.     stream := String writeStream.
  28271.     bytes := anObject binaryStoreBytes.
  28272.     bytes printPrefixOn: stream.
  28273.     bytes do: [:each | stream display: each; display: ' '].
  28274.     bytes printSuffixOn: stream.
  28275.     ^stream contents!
  28276.  
  28277. printOn: aStream
  28278.     "Append a representation of the receiver to aStream."
  28279.  
  28280.     aStream
  28281.         basicPrint: self;
  28282.         nextPut: $(;
  28283.         print: self name;
  28284.         nextPut: $)
  28285. !
  28286.  
  28287. privateUninstall
  28288.     "Private - This attempt to delete all the objects owned by the receiver
  28289.     from the system. This is a very defensive method, taking the view that any
  28290.     of the named objects it owns may not have a real object to match with that
  28291.     name. Still it tries to battle on and rid the system of all its owned objects.
  28292.  
  28293.     This does not remove the receiver from its package manager. Other than
  28294.     emergency situations it should be called from PackageManager>>uninstall:."
  28295.  
  28296.     self
  28297.         uninstallMethods;
  28298.         uninstallResources;
  28299.         uninstallGlobals;
  28300.         uninstallClasses!
  28301.  
  28302. remainingClasses
  28303.     "Answer a Set of the classes that are still present (i.e. ignore missing classes)"
  28304.  
  28305.     | classes |
  28306.     classes := Set new.
  28307.     classNames do: [:className |
  28308.         [
  28309.             classes add: (self classFromName: className)
  28310.         ] on: Error do: [:ignoredException | ignoredException notify]].
  28311.     ^classes
  28312. !
  28313.  
  28314. removeClass: aClass
  28315.     "Remove aClass from the list of Classes owned by the receiver.
  28316.     Answer aClass."
  28317.  
  28318.     self manager addClass: aClass to: nil.
  28319.     ^aClass!
  28320.  
  28321. removeGlobalNamed: globalName
  28322.     "Remove globalName from the list of globals owned by the receiver.
  28323.     Answer globalName."
  28324.  
  28325.     self manager addGlobalNamed: globalName to: nil.
  28326.     ^globalName!
  28327.  
  28328. removeLooseMethod: method
  28329.     "Private - Remove the <CompiledMethod>, method, which is directly owned by the 
  28330.     receiver (i.e. a loose method) from this package. Do not fire any events."
  28331.  
  28332.     self assert: [(self includesClass: method methodClass) not].
  28333.     methodNames remove: (self nameForMethod: method)!
  28334.  
  28335. removeLooseResource: rid
  28336.     "Private - Remove the <ResourceIdentifier>, rid, from the list of resources owned by 
  28337.     the receiver, and answer that resource identifier.
  28338.     Note that the resource is _not_ being removed from the system, just this package.
  28339.     Answer the name of the resource that was removed."
  28340.  
  28341.     self assert: [(self includesClass: rid owningClass) not].
  28342.     ^resourceNames remove: (self nameForResourceIdentifier: rid)!
  28343.  
  28344. removeMethod: method
  28345.     "Remove the <CompiledMethod>, method, from the list of loose methods owned by 
  28346.     the receiver, and answer that method.
  28347.     Note that the method is _not_ being removed from the system, just this package."
  28348.  
  28349.     self manager addMethod: method to: nil.
  28350.     ^method
  28351. !
  28352.  
  28353. removePackagedMethod: method
  28354.     "Private - Remove the <CompiledMethod>, method, which is a method of one of the classes
  28355.     owned by the receiver (i.e. not a loose method) from this package."
  28356.  
  28357.     self assert: [self includesClass: method methodClass].
  28358.     method methodClass isChanged: true!
  28359.  
  28360. removePAXProperties
  28361.     "Private - Throw away any info cached to load the package, and make sure not marked as changed"
  28362.  
  28363.     #(#allResourceNames #binaryGlobalNames #globalAliases #paxVersion #isChanged) 
  28364.         do: [:each | self removePropertyAt: each ifAbsent: []]!
  28365.  
  28366. removeResourceIdentifier: rid
  28367.     "Remove the <ResourceIdentifier>, rid, from the list of resources owned by 
  28368.     the receiver, and answer that resource identifier."
  28369.  
  28370.     self manager addResourceIdentifier: rid to: nil.
  28371.     ^rid!
  28372.  
  28373. renameLooseMethodsOf: oldClassNameString to: newClassNameString 
  28374.     | oldMetaName renamed newMetaName |
  28375.     oldMetaName := oldClassNameString , ' class'.
  28376.     renamed := methodNames 
  28377.                 select: [:each | each key = oldClassNameString or: [each key = oldMetaName]].
  28378.     renamed isEmpty ifTrue: [^false].
  28379.     newMetaName := newClassNameString , ' class'.
  28380.     renamed do: 
  28381.             [:each | 
  28382.             methodNames 
  28383.                 add: (each key = oldClassNameString ifTrue: [newClassNameString] ifFalse: [newMetaName]) 
  28384.                         -> each value].
  28385.     methodNames removeAll: renamed.
  28386.     ^true!
  28387.  
  28388. renameResourcesOf: oldNameString to: newNameString
  28389.     "Private - Search for and rename any resources keyed on the class."
  28390.  
  28391.     | renamed |
  28392.     renamed := resourceNames select: [:each | each key = oldNameString].
  28393.     ^renamed notEmpty and: 
  28394.             [renamed do: [:each | resourceNames add: newNameString -> each value].
  28395.             resourceNames removeAll: renamed.
  28396.             true]!
  28397.  
  28398. resetChangeFlags
  28399.     self allSourceObjectsDo: [:each | each isChanged: false].
  28400.     self isChanged: false!
  28401.  
  28402. resetPrerequisites
  28403.     "Private - Mark that the prerequisite packages for the receiver
  28404.     have changed. The packages will be recalculated the next time the
  28405.     #prerequsiteNames accessor is sent. An event is triggered
  28406.     iff the pre-reqs are actually reset, in case any tool (such as a
  28407.     PackagePrerequisitesShell) is monitoring them."
  28408.  
  28409.     prerequisiteNames notNil ifTrue: [
  28410.         prerequisiteNames := nil.
  28411.         self trigger: #prerequisitesReset]!
  28412.  
  28413. resourceFromName: resourceName
  28414.     "Private - Answer the ResourceIdentifier object which resourceName
  28415.     encodes."
  28416.  
  28417.     | className |
  28418.     className := resourceName key.
  28419.     ^ResourceIdentifier class: (self environment at: className) name: resourceName value.!
  28420.  
  28421. resourceIdentifiers
  28422.     "Answer a Set of ResourceIdentifier objects owned by the receiver."
  28423.  
  28424.     ^resourceNames collect: [:resourceName | self resourceFromName: resourceName]!
  28425.  
  28426. resourceNames
  28427.     "Private - Answer the <Set> of resource names owned by the reciver."
  28428.  
  28429.     ^resourceNames!
  28430.  
  28431. save
  28432.     "Save the receiver to a single PAC file. This includes all of the source for the receiver's contents.
  28433.     If the receiver is operating in PAX source mode then all of the source files are also
  28434.     filed out, including a .PAX definition. Answer whether the package was actually saved.
  28435.     This is the implementation behind the Package Browser's 'Save' command."
  28436.  
  28437.     self savePAC.
  28438.     self isUsingPAX ifTrue: [ 
  28439.         "If we are in PAX mode then also save a PAX file and all other files"
  28440.         self fileOutAll].
  28441.     self isChanged: false.
  28442.     ^true!
  28443.  
  28444. saveAs: aString 
  28445.     self manager renamePackage: self to: aString.
  28446.     self save!
  28447.  
  28448. saveChanges
  28449.     "Save the receiver, if changed. This includes all of the source for the receiver's contents.
  28450.     If the receiver is operating in PAX source mode then all of the changed source files are also     filed out.
  28451.     including a .PAX definition. Answer whether the package was actually saved.
  28452.     This is the implementation behind the Package Browser's 'Save Changes' command."
  28453.  
  28454.     self isChanged 
  28455.         ifTrue: 
  28456.             [self savePAC.
  28457.             self isUsingPAX 
  28458.                 ifTrue: 
  28459.                     [self fileOutAllChanged.
  28460.                     self isChanged: false]
  28461.                 ifFalse: [self resetChangeFlags]]!
  28462.  
  28463. savePAC
  28464.     "Private - File out a definition of the receiver and all the objects it owns to a single    
  28465.     text .PAC file. Any binary objects (views, non-<sourceObject> globals) are saved
  28466.     as the printed representation of their STB'd binary store bytes."
  28467.  
  28468.     | filer |
  28469.     self okToSaveOrDeploy.
  28470.     self createPackagePath.
  28471.     filer := self sourceManager sourceFilerOn: (FileStream 
  28472.                         write: (File path: self packageFileName extension: self class packageExtension)).
  28473.     [self fileOutAllOn: filer] ensure: [filer close]!
  28474.  
  28475. savePAX
  28476.     "Private - File out a definition of the receiver to a .PAX source file. 
  28477.     This does not file out the source files of the receiver's contents.
  28478.     Implementation Note: Use case sensitive collation in order to avoid problem
  28479.     of order switches for same named identifiers with different case, which can
  28480.     cause a line-based source management system to detect a change where
  28481.     there isn't one."
  28482.  
  28483.     | filer |
  28484.     self okToSaveOrDeploy.
  28485.     self createPackagePath.
  28486.     filer := self sourceManager sourceFilerOn: (FileStream write: self fileOutName).
  28487.     [self fileOutOn: filer] ensure: [filer close].
  28488.  
  28489.     "We must also file out the binary globals at this stage, as they are not <sourceObject>s."
  28490.     self fileOutBinaryGlobals!
  28491.  
  28492. savePAXAboutBlockOn: stream
  28493.     aboutBlock isNil 
  28494.         ifFalse: 
  28495.             [stream nextPutAll: 'package aboutBlockBytes: '.
  28496.             aboutBlock binaryStoreBytes hexStoreOn: stream.
  28497.             stream
  28498.                 nextPut: $.;
  28499.                 cr]!
  28500.  
  28501. savePAXChunkOn: aSourceFiler
  28502.     "Private - File out the receiver's package description stream in PAX source file format
  28503.     to the <puttableStream>, stream. This is in the form of a chunk which, when re-evaluated,
  28504.     creates an equivalent package description in a state which can be used for comparision
  28505.     or loading, etc. None of the code in the package, with the exception of the package scripts,
  28506.     is included. None of the code, including the package scripts, is evaluated."
  28507.  
  28508.     | stream |
  28509.     stream := String writeStream: 1024.
  28510.     self
  28511.         savePAXPackageOn: stream;
  28512.         savePAXPackageVersionOn: stream;
  28513.         savePAXAboutBlockOn: stream;
  28514.         savePAXStripperBytesOn: stream;
  28515.         savePAXScriptsOn: stream;
  28516.         savePAXNamesOn: stream;
  28517.         savePAXGlobalNamesOn: stream;
  28518.         savePAXResourceNamesOn: stream;
  28519.         savePAXPrerequisiteNamesOn: stream;
  28520.         savePAXManualPrerequisitesOn: stream.
  28521.  
  28522.     "Finish off the stream by answering the package loaded"
  28523.     stream nextPutAll: 'package'.
  28524.     aSourceFiler fileOutExpression: stream contents!
  28525.  
  28526. savePAXGlobalNamesOn: target
  28527.     "Private - File out the PAX source file expressions to record the names of
  28528.     the non-source globals owned by the receiver."
  28529.  
  28530.     #(#binaryGlobalNames #globalAliases) do: 
  28531.             [:each | 
  28532.             target
  28533.                 nextPutAll: 'package ';
  28534.                 nextPutAll: each;
  28535.                 nextPutAll: ': (Set new';
  28536.                 cr.
  28537.             self savePAXNames: (self perform: each) on: target.
  28538.             target
  28539.                 nextPutAll: ').';
  28540.                 cr;
  28541.                 cr]!
  28542.  
  28543. savePAXManualPrerequisitesOn: target
  28544.     "Private - File out the names of any manually configured pre-requisite packages 
  28545.     of the receiver onto the <puttableStream>, target."
  28546.  
  28547.     manualPrerequisites isNil ifFalse: [
  28548.         target nextPutAll: 'package '; nextPutAll: #setManualPrerequisites:; nextPutAll: ' #('.
  28549.         manualPrerequisites do: [:s | target crtab; print: s].
  28550.         target nextPutAll: ').'; cr; cr]!
  28551.  
  28552. savePAXNames: names on: stream
  28553.     "Private - File out the PAX source file representation of the list of source object
  28554.     names, names, onto the <puttableStream>, stream, in ascending order of their
  28555.     printable representation."
  28556.  
  28557.     ((names collect: [:each | each printString]) asSortedCollection: SortedCollection caseSensitiveSortBlock)
  28558.         do: [:eachName | stream tab; nextPutAll: 'add: '; nextPutAll: eachName; nextPut: $;; cr ].
  28559.     stream 
  28560.         tab; nextPutAll: 'yourself'!
  28561.  
  28562. savePAXNamesOn: target 
  28563.     "Private - File out the PAX source file representation of the class names, loose method 
  28564.     names, global names, resource names, onto the <puttableStream>, stream, in ascending 
  28565.     order of their printable representation."
  28566.  
  28567.     #(#classNames #methodNames #globalNames #resourceNames) do: 
  28568.             [:each | 
  28569.             | names |
  28570.             names := self perform: each.
  28571.             names notEmpty 
  28572.                 ifTrue: 
  28573.                     [target
  28574.                         nextPutAll: 'package ';
  28575.                         nextPutAll: each;
  28576.                         cr.
  28577.                     self savePAXNames: names on: target.
  28578.                     target
  28579.                         nextPut: $.;
  28580.                         cr;
  28581.                         cr]]!
  28582.  
  28583. savePAXPackageOn: stream
  28584.     "Private - Save the basic details of the receiver in the PAX source file 
  28585.     representation onto the <puttableStream>, target."
  28586.  
  28587.     "Create package and set some basic attributes"
  28588.  
  28589.     stream
  28590.         nextPutAll: '| package |';
  28591.         cr;
  28592.         nextPutAll: 'package := ';
  28593.         print: Package;
  28594.         space;
  28595.         nextPutAll: #name:;
  28596.         space;
  28597.         print: self name;
  28598.         nextPut: $.;
  28599.         cr;
  28600.         nextPutAll: 'package ';
  28601.         nextPutAll: #paxVersion:;
  28602.         space;
  28603.         print: self paxVersion;
  28604.         nextPut: $;;
  28605.         crtab;
  28606.         nextPutAll: #basicComment:;
  28607.         space;
  28608.         print: self comment;
  28609.         nextPut: $.;
  28610.         cr;
  28611.         cr.
  28612. !
  28613.  
  28614. savePAXPackageVersionOn: aStream
  28615.     "Private - Save Package Version - this is the version of the package, not the file out format"
  28616.  
  28617.     packageVersion isNil 
  28618.         ifFalse: 
  28619.             [aStream
  28620.                 nextPutAll: 'package ';
  28621.                 nextPutAll: #basicPackageVersion:;
  28622.                 space;
  28623.                 print: self packageVersion;
  28624.                 nextPut: $.;
  28625.                 cr;
  28626.                 cr]!
  28627.  
  28628. savePAXPrerequisiteNamesOn: target
  28629.     "Private - File out names of the pre-requisite packages of the receiver onto the onto 
  28630.     the <puttableStream>, target, in ascending order."
  28631.  
  28632.     | basePath |
  28633.     target
  28634.         nextPutAll: 'package ';
  28635.         nextPutAll: #setPrerequisites:;
  28636.         nextPutAll: ' (IdentitySet new';
  28637.         cr.
  28638.     basePath := self path.
  28639.     (self prerequisites asSortedCollection: [:a :b | (a name trueCompare: b name) < 0]) do: 
  28640.             [:each | 
  28641.             target
  28642.                 tab;
  28643.                 nextPutAll: 'add: ';
  28644.                 print: (File removeExtension: (File relativePathOf: each packageFileName to: basePath));
  28645.                 nextPut: $;;
  28646.                 cr].
  28647.     target
  28648.         tab;
  28649.         nextPutAll: 'yourself).';
  28650.         cr;
  28651.         cr!
  28652.  
  28653. savePAXResourceNamesOn: stream
  28654.     "Private - File out the PAX source file representation of ALL the 
  28655.     resources in the receiver onto the <puttableStream>, target."
  28656.  
  28657.     stream
  28658.         nextPutAll: 'package ';
  28659.         nextPutAll: #allResourceNames:;
  28660.         nextPutAll: ' (Set new';
  28661.         cr.
  28662.     (self allResourceNames collect: [:eachName | eachName printString]) asSortedCollection do: 
  28663.             [:eachName | 
  28664.             stream
  28665.                 tab;
  28666.                 nextPutAll: 'add: ';
  28667.                 nextPutAll: eachName;
  28668.                 nextPut: $;;
  28669.                 cr].
  28670.     stream
  28671.         tab;
  28672.         nextPutAll: 'yourself).';
  28673.         cr;
  28674.         cr!
  28675.  
  28676. savePAXScriptsOn: target
  28677.     "Private - File out the PAX source file representation of the receiver's scripts
  28678.     onto the <puttableStream>, target.
  28679.     Implementation Note: The scripts are installed using #basicScriptAt:put: to
  28680.     avoid the package being flagged as changed and the consequent transmission 
  28681.     of a change event."
  28682.  
  28683.     scripts keys asSortedCollection do: 
  28684.             [:each | 
  28685.             target
  28686.                 nextPutAll: 'package basicScriptAt: ';
  28687.                 print: each;
  28688.                 nextPutAll: ' put: ';
  28689.                 print: (self scriptAt: each);
  28690.                 nextPut: $.;
  28691.                 cr].
  28692.     target cr!
  28693.  
  28694. savePAXStripperBytesOn: stream
  28695.     "Private - File out the PAX source file representation of the receiver's 
  28696.     image stripper bytes (if any) onto the <puttableStream>, target."
  28697.  
  28698.     imageStripperBytes isNil 
  28699.         ifFalse: 
  28700.             [stream nextPutAll: 'package imageStripperBytes: '.
  28701.             imageStripperBytes hexStoreOn: stream.
  28702.             stream
  28703.                 nextPut: $.;
  28704.                 cr]!
  28705.  
  28706. script: scriptSymbol
  28707.     "Deprecated - use #scriptAt:"
  28708.  
  28709.     #deprecated.
  28710.     ^self scriptAt: scriptSymbol!
  28711.  
  28712. script: scriptSymbol put: aString
  28713.     "Deprecated in favour of #scriptAt:put:"
  28714.  
  28715.     #deprecated.
  28716.     self scriptAt: scriptSymbol put: aString!
  28717.  
  28718. scriptAt: scriptName
  28719.     "Answer the script <String> associated with the <Symbol>, scriptName.
  28720.  
  28721.     The currently used scripts are: #preinstall, #postinstall, #preuninstall and
  28722.     #postuninstall."
  28723.  
  28724.     ^scripts at: scriptName ifAbsent: ['']!
  28725.  
  28726. scriptAt: scriptSymbol put: aString
  28727.     "Set the script String associated with scriptSymbol."
  28728.  
  28729.     self basicScriptAt: scriptSymbol put: aString.
  28730.     self isChanged: true.!
  28731.  
  28732. setEvents: anEventsCollectionOrNil
  28733.     "Private - Set the EventsCollection of the receiver to be anEventsCollectionOrNil.
  28734.     Answer the receiver."
  28735.  
  28736.     events := anEventsCollectionOrNil!
  28737.  
  28738. setManualPrerequisites: anArrayOfStrings
  28739.     "Private - Set the names of the extra manually specified pre-requisite packages for 
  28740.     the receiver.
  28741.     **Note that this is sent from the chunks which define a package in .PAC and .PAX files
  28742.     and should not be deleted**."
  28743.  
  28744.     manualPrerequisites := anArrayOfStrings!
  28745.  
  28746. setPrerequisites: anIdentitySet
  28747.     "Private - Set the pre-computed pre-requisites of the receiver to specified Set of package names. 
  28748.     **Note that this is sent from the chunks which define a package in .PAC and .PAX files
  28749.     and should not be deleted**."
  28750.  
  28751.     prerequisiteNames := anIdentitySet!
  28752.  
  28753. sourceGlobalNames
  28754.     "Private - Answer a <collection> of <Symbols>'s, being the names of the global variables 
  28755.     owned by the receiver that can be filed out as separate source objects."
  28756.  
  28757.     ^globalNames 
  28758.         - self binaryGlobalNames 
  28759.         - self globalAliases!
  28760.  
  28761. sourceGlobalVariables
  28762.     "Private - Answer a <collection> of <Association>'s, being the global variable owned 
  28763.     by the receiver that can be filed out as separate source objects."
  28764.  
  28765.     ^self globalVariables 
  28766.         select: [:var | (self isSourceGlobal: var value) and: [(self isGlobalAlias: var) not]]!
  28767.  
  28768. sourceManager
  28769.     "Answer the receiver's source manager."
  28770.  
  28771.     ^self class sourceManager!
  28772.  
  28773. stbSaveOn: anSTBOutFiler
  28774.     "Output the receiver to anSTBOutFiler. We must ensure that the local events collection
  28775.     is NOT saved to the filer"
  28776.  
  28777.     anSTBOutFiler override: events with: nil.
  28778.     super stbSaveOn: anSTBOutFiler.!
  28779.  
  28780. systemGlobalRenamed: oldName to: newName
  28781.     "Private - React to oldName global being renamed."
  28782.  
  28783.     (classNames includes: oldName) ifTrue: [
  28784.         classNames remove: oldName; add: newName.
  28785.         ^self].
  28786.  
  28787.     (globalNames includes: oldName) ifTrue: [
  28788.         globalNames remove: oldName;     add: newName]!
  28789.  
  28790. toggleUsingPAX
  28791.     "Toggles the use of PAX mode."
  28792.  
  28793.     ^self isUsingPAX: self isUsingPAX not!
  28794.  
  28795. trace: trace prerequisite: aPackage from: from to: to type: type
  28796.     "Private - Append the supplied details of a prerequisite link
  28797.     to trace."
  28798.  
  28799.     | entries prereq |
  28800.     aPackage == self ifTrue: [^self].
  28801.     prereq := aPackage isNil ifTrue: [_Uncommitted] ifFalse: [aPackage].
  28802.  
  28803.     entries := trace at: prereq ifAbsentPut: [OrderedCollection new].
  28804.     entries add: (Array with: from with: to with: type)!
  28805.  
  28806. tracePrerequisiteGlobals: trace packagedGlobals: globalLookup
  28807.     "Private - Trace the prerequisites of the receiver that come about because of
  28808.     references to globals from methods."
  28809.  
  28810.     self allMethodsDo: [:aMethod | 
  28811.         aMethod literalsDo: [:literal | | global |
  28812.             global := self globalNameOfLiteral: literal.
  28813.             global notNil ifTrue: [ | prereq |
  28814.                 prereq := globalLookup at: global ifAbsent: [].
  28815.                 self trace: trace prerequisite: prereq from: aMethod to: global type: 'references global']]]!
  28816.  
  28817. tracePrerequisites
  28818.     "Private - Answer an IdentityDictionary of prerequisite package keys against an
  28819.     OrderedCollection of traces of the owned objects which forced a prerequisite link
  28820.     and the reason why. See #tracePrerequisites for further details."
  28821.  
  28822.     "Notification signal: 'Tracing prerequisites of ', self name."
  28823.     ^self tracePrerequisites: self manager packagedGlobals!
  28824.  
  28825. tracePrerequisites: globalLookup
  28826.     "Private - Answer an IdentityDictionary of prerequisite package keys against an
  28827.     OrderedCollection of traces of the owned objects which forced a prerequisite link
  28828.     and the reason why. A trace is an Array with elements:
  28829.  
  28830.     1    from        The owned object of the receiver
  28831.     2    to        The object belonging to a prerequsite package which from references
  28832.     3    reason    String description of how from references to.
  28833.  
  28834.     There are quite a few reasons for a prequisite being generated:
  28835.  
  28836.     *    from is a Class which is a subclass of the Class to.
  28837.     *    from is a directly owned CompiledMethod which is a method of the Class to.
  28838.     *    from is a directly owned ResourceIdentifier whose owningClass is the Class to.
  28839.     *    from is a CompiledMethod which references the global object to.
  28840.     *    from is a Class whose shared pools includes the global object to."
  28841.  
  28842.     | trace |
  28843.     trace := IdentityDictionary new.
  28844.  
  28845.     self 
  28846.         tracePrerequisitesOfClasses: trace packagedGlobals: globalLookup;
  28847.         tracePrerequisitesOfMethods: trace;
  28848.         tracePrerequisitesOfResources: trace;
  28849.         tracePrerequisiteGlobals: trace packagedGlobals: globalLookup.
  28850.  
  28851.     ^trace!
  28852.  
  28853. tracePrerequisitesOfClasses: trace packagedGlobals: globalLookup
  28854.     "Private - Trace the prerequisites of the receiver's owned classes."
  28855.  
  28856.     | manager |
  28857.     manager := self manager.
  28858.     self classesDo: [:aClass | | base prereq |
  28859.         base := aClass superclass.
  28860.         "Have to account specially for subclasses of nil to avoid dependency on _Uncommitted"
  28861.         prereq := base isNil 
  28862.                     ifTrue: [manager systemPackage] 
  28863.                     ifFalse: [manager packageOfClass: base].
  28864.         self 
  28865.             trace: trace 
  28866.             prerequisite: prereq 
  28867.             from: aClass 
  28868.             to: base 
  28869.             type: 'is a subclass of'.
  28870.  
  28871.         "Look for references to pool dictionaries"
  28872.         aClass sharedPoolNames do: [:poolName |
  28873.             self 
  28874.                 trace: trace 
  28875.                 prerequisite: (globalLookup at: poolName ifAbsent: [])
  28876.                 from: aClass 
  28877.                 to: poolName 
  28878.                 type: 'uses the shared pool']]
  28879.  
  28880. !
  28881.  
  28882. tracePrerequisitesOfMethods: trace 
  28883.     "Private - Trace the prerequisites of the receiver's loose methods."
  28884.  
  28885.     | manager |
  28886.     manager := self manager.
  28887.     self methods do: 
  28888.             [:aMethod | 
  28889.             self 
  28890.                 trace: trace
  28891.                 prerequisite: (manager packageOfClass: aMethod methodClass)
  28892.                 from: aMethod
  28893.                 to: aMethod methodClass
  28894.                 type: 'is a method of']!
  28895.  
  28896. tracePrerequisitesOfResources: trace
  28897.     "Private - Trace the prerequisites of the receiver's resources."
  28898.  
  28899.     | manager |
  28900.     manager := self manager.
  28901.     self allResourceIdentifiers do: [:rid | | prereq |
  28902.         prereq := manager packageOfClass: rid owningClass.
  28903.         self trace: trace prerequisite: prereq from: rid
  28904.                 to: rid owningClass type: 'is a resource of class'.
  28905.         rid resource hiddenClassReferences do: [:class |
  28906.             self trace: trace prerequisite: class owningPackage from: rid to: class type: 'references class']]!
  28907.  
  28908. uninstall
  28909.     "Uninstall the receiver and any dependent packages from the system with no questions asked.
  28910.     Does not prompt to save changes."
  28911.  
  28912.     self manager uninstall: self!
  28913.  
  28914. uninstallClasses
  28915.     "Private - Uninstall the classes owned by the receiver.
  28916.     Note that the ClassBuilder may raise its #hasInstancesSignal if the class has extant
  28917.     instances. This is passed on to any outer handler, giving that handler the opportunity
  28918.     to state whether the presence of instances hould be ignored or not. For example a
  28919.     graphical tool might prompt the user to decide, whereas an automatic uninstaller might
  28920.     just affirm. The outer handler needs to resume with true in order to actually go ahead
  28921.     and remove the class, otherwise the class will be "
  28922.  
  28923.     | classes empty |
  28924.     classes := self remainingClasses.
  28925.  
  28926.     "Remove classes, bottom up so as to remove subclasses first"
  28927.     classes := classes 
  28928.                 asSortedCollection: [:a :b | (self depthOfClass: a) > (self depthOfClass: b)].
  28929.     classes do: 
  28930.             [:aClass | 
  28931.             "Notification signal: 'Removing class ', aClass name."
  28932.             [aClass removeFromSystem] 
  28933.                 on: ClassBuilder invalidRemoveError
  28934.                 do: 
  28935.                     [:e | 
  28936.                     e notify.
  28937.                     e isNested 
  28938.                         ifTrue: 
  28939.                             ["Remember that global Error trap will also count as nest"
  28940.                             e outer == true ifFalse: [e return]].
  28941.                     "Either no outer handler, or outer said to ignore, in either case remove it anyway"
  28942.                     e resume]
  28943.                 on: Error
  28944.                 do: 
  28945.                     [:ignoredException | 
  28946.                     ignoredException notify.
  28947.                     aClass allInstances do: [:e | Notification signal: e allReferences printString]]].
  28948.  
  28949.     "If having difficulty tracking down the source of an image stripping problem which is
  28950.      keeping references to uninstalled packaged classes, then try commenting in this code."
  28951.     empty := MethodDictionary new.
  28952.     classes do: 
  28953.             [:aClass | 
  28954.             (aClass environment includesKey: aClass name) 
  28955.                 ifFalse: 
  28956.                     [aClass class methodDictionary: empty.
  28957.                     aClass methodDictionary: empty]]!
  28958.  
  28959. uninstallGlobals
  28960.     "Private - Uninstall the globals owned by the receiver. Should be done before classes 
  28961.     in case globals hold onto instances of any of the classes."
  28962.  
  28963.     globalNames do: [:globalName |
  28964.         [    self environment removeGlobalNamed: globalName
  28965.         ] on: Error do: [:ignoredException | ignoredException notify]].
  28966.  
  28967. !
  28968.  
  28969. uninstallMethods
  28970.     "Private - Uninstall the methods owned by the receiver that belong to classes which are not
  28971.     owned by the receiver (i.e. methods installed into classes outside this package)."
  28972.  
  28973.     methodNames do: [:methodName | | method |
  28974.         method := self methodFromName: methodName ifAbsent: [].
  28975.         method isNil
  28976.             ifTrue: [Notification signal: ('Packaged method %1>>%2 no longer exists'
  28977.                                     formatWith: methodName key with: methodName value)]
  28978.             ifFalse: [method methodClass removeSelector: method selector]].
  28979.  
  28980. !
  28981.  
  28982. uninstallResources
  28983.     "Private - Uninstall the resources owned by the receiver."
  28984.  
  28985.     resourceNames do: 
  28986.             [:each | 
  28987.             
  28988.             [SessionManager current resourceManager 
  28989.                 removeResource: (self resourceFromName: each)] 
  28990.                     on: Error
  28991.                     do: [:ignoredException | ignoredException notify]]!
  28992.  
  28993. upateFileNames
  28994.     "Private - Update the package filename to match the package name and to be a PAC."
  28995.  
  28996.     self packageFileName: (File 
  28997.                 composePath: self path
  28998.                 stem: self name
  28999.                 extension: self class packageExtension).
  29000.     "The prereqs may be out of date due to changes since last load, also the pre-reqs set at package load time
  29001.     include relative paths, so just toss them away"
  29002.     prerequisiteNames := nil!
  29003.  
  29004. validate
  29005.     "Private - Validate the internal structure repairing any errors"
  29006.  
  29007.     methodNames := methodNames 
  29008.                 select: [:each | (self methodFromName: each ifAbsent: []) notNil]!
  29009.  
  29010. variableSortBlock
  29011.     "Private - Answer a <dyadicValuable> sort block suitable for sorting global variable <Association>s
  29012.     into alphabetic order."
  29013.  
  29014.     ^[:a :b | (a key trueCompare: b key) <= 0]!
  29015.  
  29016. vmVersionCheck: verWhenSaved
  29017.     "Private - Raise a warning to the effect that the package being loaded
  29018.     was saved with an older, and incompatible, version of the VM, and so
  29019.     it may need to be modified (e.g. by recompiling blocks in version resources)
  29020.     in order to work - it should load OK though."
  29021.  
  29022.     | versionString verOnLoad |
  29023.     verOnLoad := VMLibrary default bytecodeVersion.
  29024.     verWhenSaved = verOnLoad ifTrue: [^self].
  29025.     versionString := verWhenSaved > 0 
  29026.                 ifTrue: [verWhenSaved highWord displayString , '.' , verWhenSaved lowWord displayString]
  29027.                 ifFalse: ['unknown'].
  29028.     Warning 
  29029.         signal: ('The package ''%1'' was saved with a different version of the Dolphin VM (%2). 
  29030. It will probably load, but it may not operate correctly. 
  29031. If you experience subsequent problems please contact the package supplier for an updated version.' 
  29032.                 formatWith: self name
  29033.                 with: versionString)! !
  29034.  
  29035. PackageManager comment:
  29036. 'The PackageManager class contains a collection of all the Packages currently loaded into
  29037. the system. The class obeys the Singleton pattern.
  29038.  
  29039. All the Packages known by a PackageManager must have unique names.
  29040.  
  29041. One of the packages is known as the system package. This Packages owns all of the system classes,
  29042. methods and globals which define the base Smalltalk system. It is not possible to remove or load in
  29043. a replacement for this package.
  29044.  
  29045. When Packages are loaded or removed from the CategoryManager we strive to leave the manager in a fully
  29046. working state. This is to ensure that the development tools will keep on working even if objects are
  29047. left unowned by a Package. It is possible to clear these up by using the PackageBrowser.
  29048.  
  29049. instance variables
  29050.     packages        Collection of loaded packages
  29051.     processEvents    Count of whether update events generated by the packages should be passed
  29052.             onto the rest of the system. Switched off during package install/uninstall for
  29053.             performance reasons.
  29054.     packagedGlobals    <IdentityDictionary> mapping package format global names to the owning
  29055.             package. Globals may be Classes or general global variables. This is a cache.
  29056.     looseMethods    <Collection> of all loose methods in the package system (i.e. methods owned
  29057.             by a package other that that of their class). This is a cache.
  29058.  
  29059. class variables
  29060.     Current        Singleton instance of PackageManager
  29061.     SystemPackage    Single package which owns all the system classes/globals
  29062.  
  29063. triggers generated
  29064.     loadedChanged    The collection of loaded packages has changed
  29065.     ownedChanged    The owned objects of a package have been changed, ie added to/removed.
  29066.     resetPrerequisites    The lazily generated prerequisites data for each of  the packages has been
  29067.             invalidated. This will happen quite often, for example compiling a method.
  29068.             The next time you request the prerequisites of a package it will calculate them.'!
  29069. !PackageManager class methodsFor!
  29070.  
  29071. current
  29072.     "Answer the singleton instance of the receiver."
  29073.  
  29074.     Current isNil 
  29075.         ifTrue: 
  29076.             [| dolphin |
  29077.             Notification signal: 'Creating new PackageManager'.
  29078.             Current := super new initialize.
  29079.             dolphin := self systemPackage.
  29080.             Current
  29081.                 basicAddPackage: dolphin;
  29082.                 observePackage: dolphin;
  29083.                 buildGlobalsMap].
  29084.     ^Current!
  29085.  
  29086. initialize
  29087.     "Private - Initialize the receiver's class variables.
  29088.         self initialize.
  29089.     "
  29090.  
  29091.     DuplicatePackageSignal := Signal 
  29092.                 description: 'Package ''%1'' already installed'.
  29093.     PackageNotFoundSignal := Signal 
  29094.                 description: 'Failed to locate Package ''%1'''.
  29095.     PrerequisiteNotFoundSignal := NotificationSignal 
  29096.                 description: 'Package ''%1'' cannot be found'!
  29097.  
  29098. new
  29099.     "The receiver is a singleton class"
  29100.  
  29101.     ^self shouldNotImplement!
  29102.  
  29103. newSystemPackage
  29104.     "Private - Answer the system Package. Adds all the Classes and Globals in
  29105.     the system to it. Assumed that there are no other Packages currently in the
  29106.     PackageManager. N.B. This should only ever be used during the boot
  29107.     process."
  29108.  
  29109.     | dolphin globalNames all inst |
  29110.     inst := self current.
  29111.     self assert: [inst packages isEmpty].
  29112.     (dolphin := Package name: self systemPackageName)
  29113.         basicComment: 
  29114. 'Dolphin Smalltalk Base System.
  29115. Copyright (c) Object Arts Ltd. 1997-2002. Portions Copyright (c) CGI Group (Europe) Ltd. 1997.';
  29116.         basicScriptAt: #preinstall put: 'Error signal: ''Can not replace the system package'''.
  29117.     all := self environment allClasses.
  29118.     all do: [:aClass | dolphin addClass: aClass].
  29119.     globalNames := Smalltalk keys.
  29120.     globalNames removeAll: (all collect: [:aClass | aClass name]).
  29121.     globalNames do: [:globalName | inst addGlobalNamed: globalName to: dolphin].
  29122.     dolphin isChanged: false.
  29123.     ^dolphin
  29124. !
  29125.  
  29126. publishedEventsOfInstances
  29127.         "Answer a <Set> of <Symbol>s being the names of the events published by
  29128.         instances of the receiver."
  29129.     
  29130.         ^super publishedEventsOfInstances
  29131.             add: #loadedChanged;
  29132.             add: #prerequisitesReset;    "All pre-requisities reset - old event, still fired"
  29133.             add: #prerequisitesReset:;    "Individual packages' prerequsites reset"
  29134.             add: #packageChanged:;
  29135.             add: #ownedChanged:;
  29136.             add: #classRepackaged:from:to:;
  29137.         add: #methodRepackaged:from:to:;
  29138.         add: #resourceRepackaged:from:to:;
  29139.         add: #globalRepackaged:from:to:;
  29140.             yourself.
  29141.     !
  29142.  
  29143. reset
  29144.     "Reset the receivers singleton current instance and SystemPackage."
  29145.  
  29146.     Current notNil ifTrue: [Current release].
  29147.     Current := nil.
  29148.     SystemPackage := nil.!
  29149.  
  29150. systemPackage
  29151.     "Answer the Package which contains all the base objects of the system."
  29152.  
  29153.     SystemPackage isNil ifTrue: [SystemPackage := self newSystemPackage].
  29154.     ^SystemPackage!
  29155.  
  29156. systemPackageName
  29157.     "Private - Answer the String name of the Package which owns all
  29158.     the system objects."
  29159.  
  29160.     ^'Object Arts\Dolphin\Base\Dolphin'!
  29161.  
  29162. uninitialize
  29163.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  29164.  
  29165.     self reset.! !
  29166.  
  29167. !PackageManager methodsFor!
  29168.  
  29169. addClass: aClass to: aPackageOrNil
  29170.     "Add the <Class>, aClass, to the <Package>, destination, after first 
  29171.     removing it from any existing package. If aPackage is nil, then the
  29172.     class becomes uncommitted (i.e. not owned by any package)."
  29173.  
  29174.     | source destination |
  29175.     source := self packageOfClass: aClass.
  29176.     destination := aPackageOrNil == Package uncommitted ifFalse: [aPackageOrNil].
  29177.     source == destination ifTrue: [^self].
  29178.     self forgetLooseMethods.    "Could be more discriminating, but rebuild is pretty quick"
  29179.     source notNil 
  29180.         ifTrue: 
  29181.             [packagedGlobals removeKey: aClass name.
  29182.             source basicRemoveClass: aClass].
  29183.     destination notNil 
  29184.         ifTrue: 
  29185.             [destination basicAddClass: aClass.
  29186.             packagedGlobals at: aClass name put: aPackageOrNil].
  29187.     self 
  29188.         classRepackaged: aClass
  29189.         from: source
  29190.         to: destination!
  29191.  
  29192. addGlobalNamed: globalName to: aPackageOrNil
  29193.     "Add the global variable named, globalName, to the <Package>, destination,
  29194.     after first removing it from any existing package."
  29195.  
  29196.     | source destination |
  29197.     source := self packageOfGlobalNamed: globalName.
  29198.     destination := aPackageOrNil == Package uncommitted ifFalse: [aPackageOrNil].
  29199.     source == destination ifTrue: [^self].
  29200.     source notNil 
  29201.         ifTrue: 
  29202.             [packagedGlobals removeKey: globalName.
  29203.             source basicRemoveGlobalNamed: globalName].
  29204.     destination notNil 
  29205.         ifTrue: 
  29206.             [aPackageOrNil basicAddGlobalNamed: globalName.
  29207.             packagedGlobals at: globalName put: aPackageOrNil].
  29208.     self 
  29209.         globalRepackaged: globalName
  29210.         from: source
  29211.         to: destination!
  29212.  
  29213. addLooseMethod: aCompiledMethod to: aPackage
  29214.     "Private - The loose <CompiledMethod> argument has been (or is about to
  29215.     be) added to the <Package> argument. Maintain the loose method cache."
  29216.  
  29217.     looseMethods notNil ifTrue: [looseMethods at: aCompiledMethod name put: aPackage].
  29218.     aPackage addLooseMethod: aCompiledMethod!
  29219.  
  29220. addManagedPackage: aPackage
  29221.     "Private - Add the <Package> argument to the collection of packages held by the receiver. 
  29222.     Each package must have a unique name. Answer the argument, or raise an error if either
  29223.     a package with the same name already exists or there is some clash between the
  29224.     contents of the package and existing installed packages."
  29225.  
  29226.     self addPackage: aPackage; observePackage: aPackage!
  29227.  
  29228. addMethod: aCompiledMethod to: aPackageOrNil
  29229.     "Add the <CompiledMethod>, method, to the <Package>, destination,
  29230.     after first removing it from any existing package. Note that this is a
  29231.     composite operation with 4 possible cases:
  29232.         1) packaged -> loose
  29233.         2) loose -> packaged
  29234.         3) loose -> loose
  29235.         4) packaged -> packaged (not possible)
  29236.     Moving a packaged method (one owned by the same package as the class in
  29237.     which it implements a message) to become a loose method in a foreign package
  29238.     is different to the others in that we can't actually 'remove' a packaged method 
  29239.     from its package since it is not listed separately. In order that the state of the
  29240.     packages is consistent in that case we all cases we therefore first add the method to its package in 
  29241.     which it becomes a loose method before 'removing' it from its home package."
  29242.  
  29243.     | source destination classPackage moved |
  29244.     classPackage := self packageOfClass: aCompiledMethod methodClass.
  29245.     destination := (aPackageOrNil isNil or: [aPackageOrNil == Package uncommitted]) 
  29246.                 ifTrue: [classPackage]
  29247.                 ifFalse: [aPackageOrNil].
  29248.     source := self packageOfMethod: aCompiledMethod.
  29249.     source == destination ifTrue: [^self].
  29250.     moved := source isNil 
  29251.                 ifTrue: 
  29252.                     [self 
  29253.                         moveMethod: aCompiledMethod
  29254.                         from: classPackage
  29255.                         to: destination]
  29256.                 ifFalse: 
  29257.                     [self 
  29258.                         moveLooseMethod: aCompiledMethod
  29259.                         from: source
  29260.                         to: destination].
  29261.  
  29262.     "Only after the move is complete do we publish events to observers"
  29263.     moved 
  29264.         ifTrue: 
  29265.             ["If the method is moving or returning to its home package, then that package is marked as
  29266.          changed, but the objects it lists as owned has not changed. Where a method is/was loose
  29267.          in a package, then the owning package has changed its owned contents."
  29268.  
  29269.             source isNil 
  29270.                 ifTrue: 
  29271.                     [source := classPackage.
  29272.                     self ownedUpdated: classPackage]
  29273.                 ifFalse: [source ownedChanged].
  29274.             aPackageOrNil isNil 
  29275.                 ifTrue: [self ownedUpdated: destination]
  29276.                 ifFalse: [self ownedChanged: destination].
  29277.             self 
  29278.                 methodRepackaged: aCompiledMethod
  29279.                 from: source
  29280.                 to: destination]!
  29281.  
  29282. addPackage: aPackage
  29283.     "Private - Add the <Package> argument to the collection of packages held by the receiver. 
  29284.     Each package must have a unique name. Answer the argument, or raise an error if either
  29285.     a package with the same name already exists or there is some clash between the
  29286.     contents of the package and existing installed packages. Note that at this point we don't
  29287.     subscribe to any of the package's events."
  29288.  
  29289.     | name |
  29290.     name := aPackage name.
  29291.     (self includesPackageNamed: name) ifTrue: [^self errorUniqueNames: name].
  29292.     (self loadCompatibilityCheck: aPackage) 
  29293.         do: [:each | each owningPackage: Package uncommitted].
  29294.     self basicAddPackage: aPackage.
  29295.     ^aPackage!
  29296.  
  29297. addPackagedMethod: method to: target
  29298.     "Private - The <CompiledMethod>, method, has been (or is about to
  29299.     be) added back to the same <Package>, target, to which its method class
  29300.     belongs. Note that the target might be nil if the method class is uncomitted."
  29301.  
  29302.     target isNil
  29303.         ifTrue: [method methodClass isChanged: true]
  29304.         ifFalse: [target addPackagedMethod: method]!
  29305.  
  29306. addResourceIdentifier: aResourceIdentifier to: aPackageOrNil
  29307.     "Add the <ResourceIdentifier>, aResourceIdentifier, to the <Package>, destination,
  29308.     after first removing it from any existing package."
  29309.  
  29310.     | source destination |
  29311.     destination := (aPackageOrNil isNil or: [aPackageOrNil == Package uncommitted]) 
  29312.                 ifTrue: [self packageOfClass: aResourceIdentifier owningClass]
  29313.                 ifFalse: [aPackageOrNil].
  29314.     source := self packageOfResourceIdentifierOrItsClass: aResourceIdentifier.
  29315.     source == destination ifTrue: [^self].
  29316.     source notNil ifTrue: [source basicRemoveResourceIdentifier: aResourceIdentifier].
  29317.     destination notNil ifTrue: [destination basicAddResourceIdentifier: aResourceIdentifier].
  29318.     self 
  29319.         resourceRepackaged: aResourceIdentifier
  29320.         from: source
  29321.         to: destination!
  29322.  
  29323. allDependentPackagesOf: package visited: visitedPackages
  29324.     "Private - Add dependent packages of the <Package> argument, package, which
  29325.     are not already members of the <Set>, visitedPackages, to that set, and visit
  29326.     them. Answer the combined dependents."
  29327.  
  29328.     (self dependentPackagesOf: package) do: [:e |
  29329.         (visitedPackages includes: e) ifFalse: [
  29330.             visitedPackages add: e.
  29331.             self allDependentPackagesOf: e visited: visitedPackages]].
  29332.     ^visitedPackages!
  29333.  
  29334. allGlobalAliases
  29335.     ^self packages inject: IdentitySet new
  29336.         into: 
  29337.             [:all :each | 
  29338.             all addAll: each globalAliases.
  29339.             all]
  29340. !
  29341.  
  29342. allPackagedClasses
  29343.     "Private - Answer a <collection> of all the packaged classes in the system."
  29344.  
  29345.     | answer |
  29346.     answer := OrderedCollection new: 1000.
  29347.     self packages do: [:eachPackage | eachPackage classesDo: [:eachClass | answer add: eachClass]].
  29348.     ^answer!
  29349.  
  29350. allPackagedGlobalNames
  29351.     "Private - Answer a <Set> of <Symbol>, being the names of all the 
  29352.     packaged globals in the system. Note that this does not include the
  29353.     names of packaged classes."
  29354.  
  29355.     | answer |
  29356.     answer := IdentitySet new: 50.
  29357.     self packages do: [:p | answer addAll: p globalNames].
  29358.     ^answer!
  29359.  
  29360. allSourceObjects
  29361.     "Answer a <collection> of all the source objects known to the receiver"
  29362.  
  29363.     | answer |
  29364.     answer := OrderedCollection new: 2000.
  29365.     self packages 
  29366.         do: [:eachPackage | eachPackage allSourceObjectsDo: [:each | answer addLast: each]].
  29367.     ^answer!
  29368.  
  29369. at: packageName
  29370.     "Deprecated for use of over-generic selector - use #packageNamed:"
  29371.  
  29372.     Notification deprecated.
  29373.     ^self packageNamed: packageName!
  29374.  
  29375. at: packageName ifAbsent: absentBlock
  29376.     "Deprecated (use of over-generic selector). Use #packageAt:ifAbsent:"
  29377.  
  29378.     Notification deprecated.
  29379.     ^self packageNamed: packageName ifNone: absentBlock!
  29380.  
  29381. basicAddPackage: aPackage
  29382.     self packages at: aPackage name put: aPackage!
  29383.  
  29384. basicRemovePackage: aPackage
  29385.     "Private - Remove the <Package> argument from the receiver's
  29386.     collection of loaded packages. All the packages owned objects are 
  29387.     assumed to have already been removed from the system.
  29388.     Answer the Package."
  29389.  
  29390.     self packages removeKey: aPackage name.
  29391.     defaultPackage == aPackage ifTrue: [defaultPackage := nil].
  29392.     ^aPackage!
  29393.  
  29394. basicUninstall: aPackage
  29395.     "Private - Remove aPackage from the receivers loaded packages.
  29396.     All the packages owned objects are removed from the system.
  29397.     Answer aPackage."
  29398.  
  29399.     self beNotProcessingEvents.
  29400.     [    
  29401.         aPackage removeEventsTriggeredFor: self.
  29402.         [aPackage privateUninstall]     ensure: [self basicRemovePackage: aPackage]
  29403.     ] ensure: [self beProcessingEvents]!
  29404.  
  29405. beNotProcessingEvents
  29406.     "Private - Temporarily suspend the processing of system events or
  29407.     triggering of our own. This is not a binary mode but a count, so the same
  29408.     number of beProcessingEvents must be sent to the reeciever as
  29409.     beNotProcessingEvents before events are again processed. Ignored
  29410.     events are NOT cached by the receiver for processing later.
  29411.  
  29412.     N.B. Note that processing of events should only be suspending when
  29413.     installing or uninstalling a package, as it can leave the receiver and the
  29414.     Packages it holds in an inconsistent state. The reason for suspending
  29415.     events is to prevent the package from receiving events while it is
  29416.     in a partially loaded or unloaded state, and also to avoid an unecessary
  29417.     flurry of knock-on events."
  29418.  
  29419.     self changeProcessEventsBy: 1.
  29420.     self forgetLooseMethods!
  29421.  
  29422. beProcessingEvents
  29423.     "Private - Recommence processing system events and sending our own
  29424.     only if an equal number of beProcessingEvents as beNotProcessingEvents
  29425.     have been sent to the receiver."
  29426.  
  29427.     (self changeProcessEventsBy: -1) == 0
  29428.         ifTrue: [self clearCachedInformation]!
  29429.  
  29430. buildGlobalsMap
  29431.     "Private - Answer an <IdentityDictionary> which maps the symbolic names of all packaged
  29432.     globals to the owning package. This is used during the tracing of package prerequisites.
  29433.     "
  29434.  
  29435.     packagedGlobals := IdentityDictionary new: self class environment size.
  29436.     self packages do: [:package |
  29437.         package globalNames do: [:globalName |
  29438.             packagedGlobals at: globalName put: package].
  29439.         package classNames do: [:className |
  29440.             packagedGlobals at: className asSymbol put: package]].
  29441.     ^packagedGlobals 
  29442. !
  29443.  
  29444. changedPackages
  29445.     "Answer a <collection> of all the packages that have been changed."
  29446.  
  29447.     ^self packages select: [:p | p isChanged]!
  29448.  
  29449. changeProcessEventsBy: countChange
  29450.     "Private - Change the receivers count of the processEvents by countChange.
  29451.     A value of zero indicates that no one has a lock on the triggers and that they 
  29452.     should be processed as they are received from the rest of the system or generated 
  29453.     by the receiver. A value greater than 0 indicates that processing is temporarily suspend 
  29454.     until it is reduced back to 0. Any events received while suspended ar NOT cached for later
  29455.     processing."
  29456.  
  29457.     processEvents := processEvents + countChange.
  29458.     processEvents < 0 ifTrue: [
  29459.         Notification signal: 'PackageManager processEvents became corrupt and has been reset.'.
  29460.         processEvents := 0].
  29461.     ^processEvents!
  29462.  
  29463. classRepackaged: aClass from: source to: destination
  29464.     "Private - Trigger class repackaging notifications."
  29465.  
  29466.     "When a class is repackaged (or removed), we reset all pre-reqs as it may affect not just
  29467.      the source and destination packages (e.g. packages with loose methods in the repackaged
  29468.      class are affected). This could probably be done more intelligently though."
  29469.  
  29470.     self assert: [source ~~ destination].
  29471.  
  29472.     self 
  29473.         ownedChanged: source;
  29474.         ownedChanged: destination;
  29475.         resetPrerequisites;
  29476.         trigger: #classRepackaged:from:to: 
  29477.             withArguments: (Array with: aClass with: source with: destination)
  29478. !
  29479.  
  29480. clearCachedInformation
  29481.     "Private - Clear down all cached information such as prerequisites."
  29482.  
  29483.     packagedGlobals notNil ifTrue: [self buildGlobalsMap].
  29484.     self forgetLooseMethods; resetPrerequisites!
  29485.  
  29486. defaultPackage
  29487.     ^defaultPackage!
  29488.  
  29489. defaultPackage: aPackage 
  29490.     defaultPackage := aPackage!
  29491.  
  29492. dependentPackagesOf: package
  29493.     "Private - Answer a <collection> of the packages which have the <Package> argument,
  29494.     as a prerequisite."
  29495.  
  29496.     ^self packages select: [:aPackage | aPackage prerequisites includes: package]!
  29497.  
  29498. duplicatePackageSignal
  29499.     "Private - Answer the Signal raised when an attempt is made to install a package
  29500.     with the same name as one already present in the image."
  29501.  
  29502.     ^DuplicatePackageSignal!
  29503.  
  29504. errorFileInCompatibilityCheck: aPackage overlap: overlappingObjects
  29505.     "Private - Raise an error that the receiver can not be filed in
  29506.     because some objects which it expects to own are already owned
  29507.     by existing Packages."
  29508.  
  29509.     "Notification signal: aPackage name, ': ', overlappingObjects asArray printString."
  29510.     Package clashSignal 
  29511.         signal: ('The package ''%1'' contains objects that are already installed in the image.' 
  29512.                 formatWith: aPackage name)
  29513.         with: overlappingObjects asArray!
  29514.  
  29515. errorPackageNotFound: packageName
  29516.     "Private - Raise an <Error> to the effect that the named package could
  29517.     not be located. This is trapped in install:."
  29518.  
  29519.     ^PackageNotFoundSignal signal: packageName!
  29520.  
  29521. errorPrerequisiteNotFound: aString
  29522.     "Private - Answer a <readableString> being a revised the path for the package,
  29523.     or nil if no suggestions are available (e.g. this is not an interactive session and so
  29524.     user input is not available)."
  29525.  
  29526.     ^PrerequisiteNotFoundSignal signal: aString!
  29527.  
  29528. errorRemove: removePackage requiredBy: aCollectionOfPackages
  29529.     "Private - Raise an error to inform that removePackage can not be
  29530.     removed as a collection of existing packages require it be loaded
  29531.     for them to continue to work."
  29532.  
  29533.     ^self 
  29534.         error: removePackage name , ' package can not be removed as ' 
  29535.                 , aCollectionOfPackages printString , ' packages require its owned objects'!
  29536.  
  29537. errorRemovingSystemPackage
  29538.     "Private - Raise an error to inform that the receivers systemPackage
  29539.     can never be removed or uninstalled."
  29540.  
  29541.     ^self 
  29542.         error: 'Can never remove the system package from the ' , self class name!
  29543.  
  29544. errorUniqueNames: conflictName
  29545.     "Private - Raise an error to inform that all Packages known by
  29546.     the receiver must have unique names."
  29547.  
  29548.     ^DuplicatePackageSignal signal: conflictName!
  29549.  
  29550. forgetLooseMethods
  29551.     "Forget the cached <LookupTable> of all the <CompiledMethod>s which are owned by
  29552.     packages which do not own the corresponding method class (i.e. those methods
  29553.     added by a package to classes in other packages)."
  29554.  
  29555.     looseMethods := nil!
  29556.  
  29557. getEvents
  29558.     "Private - Answer the EventsCollection belonging to the receiver, or nil if the receiver
  29559.     has no events registered for it"
  29560.  
  29561.     ^events!
  29562.  
  29563. getLooseMethods
  29564.     "Private - Answer a <LookupTable> of all the <CompiledMethod>s which are owned by
  29565.     packages which do not own the corresponding method class (i.e. those methods
  29566.     added by a package to classes in other packages). The table maps loose methods
  29567.     by name to their owning package."
  29568.  
  29569.     | loose |
  29570.     loose := PluggableLookupTable new: 1500 searchPolicy: AssociationSearchPolicy current.
  29571.     self packages do: [:each | loose atAll: each methodNames put: each].
  29572.     ^loose!
  29573.  
  29574. globalRepackaged: globalName from: source to: destination
  29575.     "Private - The global variable named by the <Symbol>, globalName, 
  29576.     has been repackaged. The operation is now complete and the package
  29577.     system in a consistent state so this is an appropriate point to pdate change 
  29578.     flags for all objects affected by the move and to trigger various notifications."
  29579.  
  29580.     self assert: [source ~~ destination].
  29581.  
  29582.     self 
  29583.         ownedChanged: source;
  29584.         ownedChanged: destination;
  29585.         resetPrerequisites;
  29586.         trigger: #globalRepackaged:from:to: 
  29587.             withArguments: (Array with: globalName with: source with: destination)
  29588. !
  29589.  
  29590. includes: packageName
  29591.     "Deprecated (use of over-generic selector). Use #includesPackageNamed:"
  29592.  
  29593.     Notification deprecated.
  29594.     ^self includesPackageNamed: packageName!
  29595.  
  29596. includesPackage: comperand
  29597.     "Answer whether the receiver holds the <Package>, comperand."
  29598.  
  29599.     ^self packages includes: comperand!
  29600.  
  29601. includesPackageNamed: packageName
  29602.     "Answer whether the receiver holds a <Package> whose name matches 
  29603.     the <readableString>, packageName."
  29604.  
  29605.     self packageNamed: packageName ifNone: [^false].
  29606.     ^true!
  29607.  
  29608. initialize
  29609.     "Private - Initialize the receivers instance variables and connect
  29610.     to a number of system triggers to ensure that the receivers packages
  29611.     remove references to any system objects which are removed."
  29612.  
  29613.     packages := PluggableLookupTable searchPolicy: SearchPolicy caseInsensitive.
  29614.     processEvents := 0.
  29615.     packagedGlobals := IdentityDictionary new.
  29616.     self observeEnvironment!
  29617.  
  29618. install: packagePathname
  29619.     "Install the package file at the <readableString> path, packagePathname, and any 
  29620.     pre-requisite packages, and any of the their pre-requisites, and so on. Answer a 
  29621.     <sequencedReadableCollection> of packages in the installation order (i.e. the target 
  29622.     package will be last in the list). If the package could not be loaded, answers an empty 
  29623.     collection. Note that 'installation' loads the Package object and all the objects it owns 
  29624.     too, i.e. all classes, methods, resources and globals are loaded into the system and the 
  29625.     packages' install scripts are run. The receiver attempts to laod any prerequsite packages 
  29626.     from the same path location as packagePathname, but if a suitable package then the 
  29627.     'prerequisite not found' exception is signalled. The caller can trap this exception (the 
  29628.     <exceptionSelector> can be accessed using the class side #prerequisiteNotFoundSignal 
  29629.     message), prompt the user to locate the path (for example), and resume the exception with 
  29630.     the prerequisite package path as the argument.
  29631.     The receiver's #loadedChanged event is triggered on completion of installation of the
  29632.     network of packages."
  29633.  
  29634.     | newPackages startPackage |
  29635.     startPackage := self loadPackage: packagePathname.
  29636.     (self includesPackageNamed: startPackage name) 
  29637.         ifTrue: [^self errorUniqueNames: startPackage name].
  29638.     
  29639.     [| filename |
  29640.     filename := startPackage packageFileName.
  29641.     newPackages := self 
  29642.                 loadPrereqsForPackage: startPackage
  29643.                 relativeTo: startPackage path
  29644.                 extension: (File splitExtensionFrom: filename)
  29645.                 loaded: (PluggableSet searchPolicy: SearchPolicy caseInsensitive)
  29646.                 trail: OrderedCollection new] 
  29647.             on: PackageNotFoundSignal
  29648.             do: 
  29649.                 [:ex | 
  29650.                 "Installation aborted"
  29651.  
  29652.                 ^#()].
  29653.     self assert: [newPackages last == startPackage].
  29654.     self beNotProcessingEvents.
  29655.     
  29656.     [newPackages do: 
  29657.             [:aPackage | 
  29658.             self addPackage: aPackage.
  29659.             [aPackage load] ifCurtailed: [self basicUninstall: aPackage].
  29660.             self observePackage: aPackage]] 
  29661.             ensure: 
  29662.                 [self beProcessingEvents.
  29663.                 self loadedChanged].
  29664.     ^newPackages!
  29665.  
  29666. isLooseMethod: aCompiledMethod
  29667.     "Answer whether the argument is a loose method (i.e. one owned by a package other
  29668.     than that of its class)."
  29669.  
  29670.     ^self looseMethods includesKey: aCompiledMethod name!
  29671.  
  29672. isLooseResource: aResourceIdentifier
  29673.     "Answer whether the argument is a loose resource (i.e. one owned by a package other
  29674.     than that of its associated class)."
  29675.  
  29676.     ^self looseResourceIdentifiers includes: aResourceIdentifier!
  29677.  
  29678. isProcessingEvents
  29679.     "Private - Answer whether the receiver will act on triggers from the rest of
  29680.     the system that it is interested in."
  29681.  
  29682.     ^processEvents == 0!
  29683.  
  29684. loadCompatibilityCheck: aPackage
  29685.     "Private - The <Package> argument is about to be filed in. Ensure
  29686.     that no existing package managed by the receiver owns any of the objects 
  29687.     which the package thinks it owns. This must be executed before the 
  29688.     package can be taken under the receiver's wing as a managed package.
  29689.  
  29690.     All the package's owned object names which overlap with any existing
  29691.     packages are stored in the overlappingObjects collection which is raised
  29692.     with the error. Refer to its contents if you have any problems."
  29693.  
  29694.     | overlappingObjects |
  29695.     overlappingObjects := Set new.
  29696.     aPackage classNames 
  29697.         do: [:each | Smalltalk at: each ifPresent: [:class | overlappingObjects add: class]].
  29698.     aPackage globalNames 
  29699.         do: [:each | Smalltalk associationAt: each ifPresent: [:global | overlappingObjects add: global]].
  29700.     "The methods accessor answers a collection of those methods named in the package that can
  29701.     be found in the image, since the package is not yet loaded, this will only include the clashing methods"
  29702.     overlappingObjects addAll: aPackage methods.
  29703.     overlappingObjects 
  29704.         addAll: (SessionManager current resourceManager allResourceIdentifiers 
  29705.                 intersection: aPackage resourceIdentifiers).
  29706.     overlappingObjects isEmpty 
  29707.         ifFalse: [self errorFileInCompatibilityCheck: aPackage overlap: overlappingObjects].
  29708.     ^overlappingObjects!
  29709.  
  29710. loadedChanged
  29711.     "Private - The set of installed packages has changed. Clear down all cached information
  29712.     that might be invalidated, and trigger an event for observers."
  29713.  
  29714.     self isProcessingEvents ifTrue: [
  29715.         self trigger: #loadedChanged]!
  29716.  
  29717. loadPackage: pathname
  29718.     "Private - Answer the Package object stored in the package file at pathname. Note that the
  29719.     loaded package's contents are NOT loaded and the package is NOT inserted into the receiver's
  29720.     collection of packages at this stage."
  29721.  
  29722.     ^Package fromFile: pathname!
  29723.  
  29724. loadPrereq: prereqPathString relativeTo: basePathString extension: extensionString loaded: loadedCollection trail: trailCollection
  29725.     "Private - Answer a Collection of Packages which have had to be loaded in for the
  29726.     pre-requisite package at the <readableString> path, prereqPath, which is relative to
  29727.     the <readableString> path, pathString. The collection also includes the contents of 
  29728.     loadedCollection."
  29729.  
  29730.     | package expectedPathname actualPathname prereqName |
  29731.     prereqName := File splitFilenameFrom: prereqPathString.
  29732.     "Already installed or already visited?"
  29733.     ((self includesPackageNamed: prereqName) or: [loadedCollection includes: prereqName]) 
  29734.         ifTrue: [^trailCollection].
  29735.     "First look using relative path from base"
  29736.     expectedPathname := File 
  29737.                 default: (File fullPathOf: prereqPathString relativeTo: basePathString)
  29738.                 extension: extensionString.
  29739.     actualPathname := (File exists: expectedPathname) 
  29740.                 ifTrue: [expectedPathname]
  29741.                 ifFalse: 
  29742.                     ["Try directly in the base folder"
  29743.  
  29744.                     | localPathname |
  29745.                     localPathname := File 
  29746.                                 composePath: basePathString
  29747.                                 stem: prereqName
  29748.                                 extension: extensionString.
  29749.                     (File exists: localPathname) 
  29750.                         ifTrue: [localPathname]
  29751.                         ifFalse: [self errorPrerequisiteNotFound: expectedPathname]].
  29752.     actualPathname notNil 
  29753.         ifTrue: [package := self loadPackage: actualPathname]
  29754.         ifFalse: [self errorPackageNotFound: prereqPathString].
  29755.     ^self 
  29756.         loadPrereqsForPackage: package
  29757.         relativeTo: package path
  29758.         extension: extensionString
  29759.         loaded: loadedCollection
  29760.         trail: trailCollection!
  29761.  
  29762. loadPrereqsForPackage: aPackage relativeTo: pathString extension: extensionString loaded: loadedCollection trail: trailCollection
  29763.     "Private - Load and append pre-requisites of the <Package>, aPackage, to the 
  29764.     <OrderedCollection>, trailCollection, before appending aPackage to the trail. 
  29765.     Answer the resulting trail. A package's pre-requisites always appear before itself, and 
  29766.     each package only appears once in the trail. The <PluggableSet>, loaded, records the 
  29767.     names of those packages that have previously been loaded while walking the pre-requisites 
  29768.     tree, but which may not necessarily be in the trail yet, since that is constructed by a post-order
  29769.     traversal. The <readableString>, pathString, specifies the original package path, and the 
  29770.     <readableString>, extensionString, specifies the original package extension (be it
  29771.     PAC or PAX, since we try and load the same type of pre-requisite package if we can). 
  29772.     This method is mutually recursive with #loadPrereq:path:extension:loaded:trail:"
  29773.  
  29774.     loadedCollection add: aPackage name.
  29775.     aPackage prerequisiteNames do: 
  29776.             [:each | 
  29777.             self 
  29778.                 loadPrereq: each
  29779.                 relativeTo: pathString
  29780.                 extension: extensionString
  29781.                 loaded: loadedCollection
  29782.                 trail: trailCollection].
  29783.     trailCollection addLast: aPackage.
  29784.     ^trailCollection!
  29785.  
  29786. looseMethodRemoved: aCompiledMethod
  29787.     "Private - The loose <CompiledMethod> argument has been (or is about to
  29788.     be) removed from the system or is no longer loose. Maintain the loose method cache."
  29789.  
  29790.     looseMethods notNil ifTrue: [looseMethods removeKey: aCompiledMethod name ifAbsent: []]!
  29791.  
  29792. looseMethods
  29793.     "Answer an <LookupTable> of all the <CompiledMethod>s which are owned by
  29794.     packages which do not own the corresponding method class (i.e. those methods
  29795.     added by a package to classes in other packages). This information is cached
  29796.     to speed up the tracing of pre-requisites, particular where the whole dependency
  29797.     tree must be calculated (as when uninstalling packages). Note that the information
  29798.     may be outdated if requested when event processing is disabled, but as this
  29799.     only applies during installation and uninstallation this is not material since
  29800.     the cache is then bypassed and is regenerated when event processing is again
  29801.     enabled."
  29802.  
  29803.     looseMethods isNil ifTrue: [looseMethods := self getLooseMethods].
  29804.     ^looseMethods!
  29805.  
  29806. looseMethodUpdated: aCompilationResult
  29807.     "There is nothing to do because the loose method cache now holds method 'names'
  29808.     which are indirect and remain valid as long as the class name and selector are
  29809.     unchanged, which they must be for a #methodUpdated: event"
  29810.  
  29811.     !
  29812.  
  29813. looseResourceIdentifiers
  29814.     "Private - Answer a <Set> of all <ResourceIdentifier>s owned by a package other
  29815.     than that of their associated class (by default a rid is owned by the package
  29816.     of its owning class)."
  29817.  
  29818.     | answer |
  29819.     answer := Set new: 25.
  29820.     self packages do: [:p | answer addAll: p resourceIdentifiers].
  29821.     ^answer
  29822.  
  29823. !
  29824.  
  29825. methodRepackaged: method from: source to: destination
  29826.     "Private - Trigger a method repackaging notification."
  29827.  
  29828.     self assert: [source ~~ destination].
  29829.  
  29830.     self 
  29831.         trigger: #methodRepackaged:from:to: 
  29832.             withArguments: (Array with: method with: source with: destination)!
  29833.  
  29834. moveLooseMethod: aCompiledMethod from: sourcePackage to: destinationPackage
  29835.     "Private - Move the loose <CompiledMethod> argument from the <Package>,
  29836.     sourcePackage, to the <Package>, destinationPackage."
  29837.  
  29838.     sourcePackage == destinationPackage 
  29839.         ifTrue: 
  29840.             ["No-op"
  29841.  
  29842.             ^false].
  29843.     sourcePackage removeLooseMethod: aCompiledMethod.
  29844.     self looseMethodRemoved: aCompiledMethod.
  29845.     destinationPackage == (self packageOfClass: aCompiledMethod methodClass) 
  29846.         ifTrue: [self addPackagedMethod: aCompiledMethod to: destinationPackage]
  29847.         ifFalse: [self addLooseMethod: aCompiledMethod to: destinationPackage].
  29848.     ^true!
  29849.  
  29850. moveMethod: method from: source to: destination
  29851.     "Private - Move the packaged (not loose) <CompiledMethod>, method, from
  29852.     the package of its method class to the foreign <Package>, destination.  Answer 
  29853.     whether the method was moved.
  29854.     Note that the destination cannot be nil (i.e. it is not possible to have uncommitted
  29855.     loose methods), however the source could be nil if the method's class is
  29856.     currently uncommitted."
  29857.  
  29858.     self assert: [destination notNil].
  29859.     source == destination ifTrue: ["No-op: Add packaged method to its own package" ^false].
  29860.     self addLooseMethod: method to: destination.
  29861.     source notNil ifTrue: [    source removePackagedMethod: method].
  29862.     ^true!
  29863.  
  29864. newPackage: packageFilename
  29865.     "Private - Add a new <Package> to the collection of packages held by the receiver,
  29866.     with the specified <readableString> package filename. Answer the new package."
  29867.  
  29868.     | pkg |
  29869.     pkg := Package name: packageFilename.
  29870.     self addManagedPackage: pkg.
  29871.     self loadedChanged.
  29872.     ^pkg!
  29873.  
  29874. observeEnvironment
  29875.     "Private - Observe system update events.
  29876.         self current observeEnvironment
  29877.     "
  29878.  
  29879.     (SessionManager current resourceManager)
  29880.         removeEventsTriggeredFor: self;
  29881.         when: #resourceRemoved:
  29882.             send: #onResourceRemoved:
  29883.             to: self;
  29884.         when: #resourceAdded:
  29885.             send: #onResourceAdded:
  29886.             to: self;
  29887.         when: #resourceUpdated:
  29888.             send: #onResourceUpdated:
  29889.             to: self!
  29890.  
  29891. observePackage: aPackage
  29892.     "Private - Subscribe to certain events from the <Package>, aPackage, now under the receiver's
  29893.     management."
  29894.  
  29895.     aPackage
  29896.         when: #changed send: #onPackageChanged: to: self with: aPackage;
  29897.         when: #ownedChanged send: #onOwnedChanged: to: self with: aPackage;
  29898.         when: #prerequisitesReset send: #onPrerequisitesReset: to: self with: aPackage!
  29899.  
  29900. onClassAdded: aClass
  29901.     "The <Class> argument has been newly added to the system. Associate
  29902.     it with the default package, if set."
  29903.  
  29904.     #todo.    "This event needs an additional parameter which should be the desired package, or nil for default"
  29905.     self isProcessingEvents ifTrue: [self addClass: aClass to: self defaultPackage]!
  29906.  
  29907. onClassRemoved: aClass
  29908.     "Private - React to aClass being removed from the Smalltalk system.
  29909.     Ensure that none of the packages held by the receiver refer to aClass
  29910.     or its methods now it has departed."
  29911.  
  29912.     self isProcessingEvents 
  29913.         ifTrue: 
  29914.             [| changed pkg |
  29915.             pkg := packagedGlobals removeKey: aClass name ifAbsent: [].
  29916.             "We must inform all packages, not just the package owning the class,
  29917.          in case any other packages include loose methods of the class. In case 
  29918.         they do we empty our loose method cache."
  29919.             self forgetLooseMethods.
  29920.             changed := self packages select: [:aPackage | aPackage onClassRemoved: aClass].
  29921.             changed do: [:aPackage | aPackage ownedChanged].
  29922.             self resetPrerequisites]!
  29923.  
  29924. onClassRenamed: aClass from: oldSymbol to: newSymbol 
  29925.     | changed |
  29926.     changed := self packages select: 
  29927.                     [:each | 
  29928.                     each 
  29929.                         onClassRenamed: aClass
  29930.                         from: oldSymbol
  29931.                         to: newSymbol].
  29932.     changed isEmpty ifTrue: [^self].
  29933.     "Only trigger events once all packages updated"
  29934.     self forgetLooseMethods.
  29935.     changed do: [:e | e ownedUpdated]!
  29936.  
  29937. onClassUpdated: aClass
  29938.     "Private - React to aClass being updated. This could be in response to
  29939.     its pool dictionaries changing, super class changing, etc. Note that this
  29940.     shouldn't changed the packaged status of the class, but may well change
  29941.     the prerequisites."
  29942.  
  29943.     self isProcessingEvents ifTrue: [self ownedUpdated: (self packageOfClass: aClass)]!
  29944.  
  29945. onGlobalRemoved: anAssociation
  29946.     "Private - React to globalName being removed from the Dolphin
  29947.     system. Ensure that none of the packages held by the receiver refer
  29948.     to globalObject now it has departed."
  29949.  
  29950.     self isProcessingEvents 
  29951.         ifTrue: 
  29952.             [| pkg |
  29953.             pkg := packagedGlobals removeKey: anAssociation key ifAbsent: [].
  29954.             pkg isNil ifFalse: [pkg basicRemoveGlobalNamed: anAssociation key].
  29955.             self ownedChanged: pkg.
  29956.             self resetPrerequisites]!
  29957.  
  29958. onGlobalRenamed: anAssociation from: aSymbol 
  29959.     "Private - A global has been renamed. Ensure that all the receivers packages
  29960.     are aware of this change. Note that pre-requisites should be unaffected."
  29961.  
  29962.     | global pkg newName |
  29963.     pkg := packagedGlobals at: aSymbol ifAbsent: [].
  29964.     newName := anAssociation key.
  29965.     pkg notNil ifTrue: [packagedGlobals changeKey: aSymbol to: newName].
  29966.     self isProcessingEvents ifFalse: [^self].
  29967.  
  29968.     "Unfortunately we get the same event for classes as other globals, so we must test,
  29969.     also we must be careful not to act on the rename of global aliases."
  29970.     global := anAssociation value.
  29971.     (global class isMeta and: [global name == newName]) 
  29972.         ifTrue: 
  29973.             [self 
  29974.                 onClassRenamed: global
  29975.                 from: aSymbol
  29976.                 to: newName]
  29977.         ifFalse: [pkg notNil ifTrue: [pkg onGlobalRenamed: anAssociation from: aSymbol]]!
  29978.  
  29979. onMethodAdded: aCompilationResult 
  29980.     "Private - A new method has been added to the system. Establish
  29981.     its package as either the suggestion in the CompilationResult (which
  29982.     was passed as a parameter with the original compilation request), or
  29983.     the default package if set, or the package of the method's class if
  29984.     both are nil."
  29985.  
  29986.     | owner default method package |
  29987.     self isProcessingEvents ifFalse: [^self].
  29988.     method := aCompilationResult method.
  29989.     package := aCompilationResult package.
  29990.     self assert: [method isLoose not].
  29991.     default := self defaultPackage ifNil: [package].
  29992.     owner := self packageOfClass: method methodClass.
  29993.     (default isNil or: [default == owner]) 
  29994.         ifTrue: [self addPackagedMethod: method to: owner]
  29995.         ifFalse: 
  29996.             [self addLooseMethod: method to: default.
  29997.             owner := default].
  29998.     aCompilationResult package: owner.
  29999.     self ownedUpdated: owner!
  30000.  
  30001. onMethodCategorized: aCompiledMethod 
  30002.     "Private - React to aMethod being recategorized in the Dolphin system.
  30003.     We may need to maintain change flags, but that should be it."
  30004.  
  30005.     | package |
  30006.     self isProcessingEvents ifFalse: [^self].
  30007.     package := self packageOfMethod: aCompiledMethod.
  30008.     package isNil 
  30009.         ifTrue: 
  30010.             ["If not a loose method, then the class has changed (marking its package as changed)"
  30011.             aCompiledMethod methodClass isChanged: true]
  30012.         ifFalse: 
  30013.             ["If a loose method, then only the package has changed"
  30014.             package isChanged: true]!
  30015.  
  30016. onMethodRemoved: aCompiledMethod
  30017.     "Private - The <CompiledMethod> argument is being removed from the Dolphin
  30018.     system. Ensure that any package which might own the method is informed."
  30019.  
  30020.     | pkg |
  30021.     self isProcessingEvents 
  30022.         ifFalse: 
  30023.             [self looseMethodRemoved: aCompiledMethod.
  30024.             ^self].
  30025.     pkg := self packageOfMethod: aCompiledMethod.
  30026.     pkg isNil 
  30027.         ifTrue: 
  30028.             [pkg := self packageOfClass: aCompiledMethod methodClass.
  30029.             pkg notNil ifTrue: [pkg removePackagedMethod: aCompiledMethod].
  30030.             self ownedUpdated: pkg]
  30031.         ifFalse: 
  30032.             [self looseMethodRemoved: aCompiledMethod.
  30033.             pkg removeLooseMethod: aCompiledMethod.
  30034.             "Removing a loose method does change package ownership"
  30035.             self ownedChanged: pkg]!
  30036.  
  30037. onMethodUpdated: aCompilationResult
  30038.     "Private - A pre-existing method has been updated. React by informing the 
  30039.     owning package (if any).
  30040.     Note that this event is only triggered when an existing method is modified, and 
  30041.     as it may previously have been loose we may need to replace the old instance
  30042.     in the loose method cache. If it was not loose before, it cannot be now (by
  30043.     this action)."
  30044.  
  30045.     | pkg |
  30046.     self isProcessingEvents 
  30047.         ifFalse: 
  30048.             [self looseMethodUpdated: aCompilationResult.
  30049.             ^self].
  30050.     pkg := self packageOfMethod: aCompilationResult oldMethod.
  30051.     pkg isNil 
  30052.         ifTrue: 
  30053.             [| method |
  30054.             method := aCompilationResult method.
  30055.             pkg := self packageOfClass: method methodClass.
  30056.             self addPackagedMethod: method to: pkg]
  30057.         ifFalse: [self looseMethodUpdated: aCompilationResult].
  30058.  
  30059.     "We don't ask the package to trigger an #ownedChanged event for the addition
  30060.      of new methods, this must be tracked by watching the normal system #methodAdded:
  30061.      event."
  30062.     self ownedUpdated: pkg!
  30063.  
  30064. onOwnedChanged: aPackage
  30065.     "Private - The contents of aPackage have been changed"
  30066.  
  30067.     self isProcessingEvents ifTrue: [
  30068.         self trigger: #ownedChanged: with: aPackage]!
  30069.  
  30070. onPackageChanged: aPackage
  30071.     "Private - Inform any interested parties that the <Package> argument 
  30072.     has been marked as changed. Note that this is only fired when a
  30073.     change mark is added or removed, not every time a package is changed."
  30074.  
  30075.     self isProcessingEvents ifTrue: [
  30076.         self trigger: #packageChanged: with: aPackage]!
  30077.  
  30078. onPrerequisitesReset: aPackage
  30079.     "Private - The <Package> argument has reset its prerequisites. Fire off
  30080.     an event to our own observers with that package as an argument."
  30081.  
  30082.     self trigger: #prerequisitesReset: with: aPackage!
  30083.  
  30084. onPreStripImage
  30085.     "Private - Image stripping is in progress. Set up the receiver so as not to interfere."
  30086.  
  30087.     packagedGlobals := nil.
  30088.     self release.
  30089.     self beNotProcessingEvents !
  30090.  
  30091. onResourceAdded: aResourceIdentifier
  30092.     self isProcessingEvents 
  30093.         ifTrue: 
  30094.             [self ownedUpdated: (self packageOfResourceIdentifierOrItsClass: aResourceIdentifier)]!
  30095.  
  30096. onResourceRemoved: aResourceIdentifier
  30097.     "Private - The resource identified by the identifier has been removed from the system."
  30098.  
  30099.     self isProcessingEvents 
  30100.         ifTrue: 
  30101.             [| pkg |
  30102.             pkg := self packageOfResourceIdentifierOrItsClass: aResourceIdentifier.
  30103.             pkg notNil ifTrue: [pkg basicRemoveResourceIdentifier: aResourceIdentifier].
  30104.             self ownedChanged: pkg]!
  30105.  
  30106. onResourceUpdated: aResourceIdentifier
  30107.     self isProcessingEvents 
  30108.         ifTrue: 
  30109.             [self ownedUpdated: (self packageOfResourceIdentifierOrItsClass: aResourceIdentifier)]!
  30110.  
  30111. ownedChanged: aPackage
  30112.     "Private - Trigger an ownership notification off the <Package> argument."
  30113.  
  30114.     aPackage isNil
  30115.         ifTrue: [Package uncommitted resetPrerequisites]
  30116.         ifFalse: [aPackage ownedChanged]!
  30117.  
  30118. ownedUpdated: aPackage
  30119.     "Private - Inform the <Package> argument that it has been changed and needs to reset
  30120.     its prerequisites, but not that its membership has changed."
  30121.  
  30122.     aPackage isNil
  30123.         ifTrue: [Package uncommitted resetPrerequisites]
  30124.         ifFalse: [aPackage ownedUpdated]!
  30125.  
  30126. packagedGlobals
  30127.     "Private - Answer an <IdentityDictionary> which maps the symbolic names of all packaged
  30128.     globals to the owning package. This is used during the tracing of package prerequisites."
  30129.  
  30130.     ^packagedGlobals!
  30131.  
  30132. packageNamed: packageName
  30133.     "Answer the <Package> held by the receiver whose name matches
  30134.     the <readableString>, packageName, or raise an error if there is
  30135.     no match."
  30136.  
  30137.     ^self packageNamed: packageName ifNone: [self errorNotFound: packageName]!
  30138.  
  30139. packageNamed: packageName ifNone: absentBlock
  30140.     "Answer the <Package> held by the receiver whose name matches
  30141.     <readableString>, packageName, or, if there is no such package,
  30142.     the result of evaluating the <niladicValuable>, absentBlock.
  30143.     Implementation Note: Use a case-insensitive comparison of the package
  30144.     names."
  30145.  
  30146.     ^self packages at: packageName ifAbsent: absentBlock!
  30147.  
  30148. packageNames
  30149.     "Answer a <collection> of <readableString>s, being the names of all <Package>s
  30150.     installed in the system (and managed the receiver)."
  30151.  
  30152.     ^self packages keys!
  30153.  
  30154. packageOfClass: aBehavior
  30155.     "Answer the package held by the receiver which owns aBehavior or nil
  30156.     if there isn't one."
  30157.  
  30158.     ^packagedGlobals at: aBehavior instanceClass name ifAbsentPut: [
  30159.         "Fall back on enumerating the packages."
  30160.         self packages detect: [:p | p includesClass: aBehavior] ifNone: [^nil]]!
  30161.  
  30162. packageOfGlobalNamed: globalName
  30163.     "Answer the package held by the receiver which owns globalName (excluding
  30164.     classes) or nil if there isn't one."
  30165.  
  30166.     | pkg |
  30167.     pkg := packagedGlobals at: globalName ifAbsentPut: [
  30168.             "Fall back on enumerating the packages."
  30169.             self packages detect: [:p | p includesGlobalNamed: globalName] ifNone: [^nil]].
  30170.     self assert: [pkg includesGlobalNamed: globalName].
  30171.     ^pkg
  30172. !
  30173.  
  30174. packageOfMethod: aCompiledMethod
  30175.     "Answer the Package held by the receiver which directly owns the 
  30176.     <CompiledMethod> argument as a loose method or nil if it is
  30177.     associated with the package of its class (i.e. it is not a loose method).
  30178.     Implementation Note: Use the loose method cache if available, otherwise
  30179.     do the slower search through each package in turn."
  30180.  
  30181.     ^looseMethods isNil 
  30182.         ifTrue: [self packages detect: [:pkg | pkg includesMethod: aCompiledMethod] ifNone: []]
  30183.         ifFalse: 
  30184.             [looseMethods at: aCompiledMethod name
  30185.                 ifPresent: 
  30186.                     [:pkg | 
  30187.                     self assert: [pkg includesMethod: aCompiledMethod].
  30188.                     pkg]]!
  30189.  
  30190. packageOfMethodOrItsClass: aMethod
  30191.     "Answer the <Package> which owns the <CompiledMethod>, method,
  30192.     either directly as a loose method, or indirectly by ownership of its
  30193.     class."
  30194.  
  30195.     | package |
  30196.     package := self packageOfMethod: aMethod.
  30197.     ^package notNil
  30198.         ifTrue: [package]
  30199.         ifFalse: [self packageOfClass: aMethod methodClass]!
  30200.  
  30201. packageOfResourceIdentifier: aResourceIdentifier
  30202.     "Answer the Package held by the receiver which directly owns
  30203.     aResourceIdentifier or nil if there isn't one."
  30204.  
  30205.     ^self packages
  30206.         detect: [:aPackage | aPackage includesResourceIdentifier: aResourceIdentifier]
  30207.         ifNone: []!
  30208.  
  30209. packageOfResourceIdentifierOrItsClass: aResourceIdentifier
  30210.     "Answer the <Package> managed by the receiver which owns either
  30211.     the <ResourceIdentifier> argument, or its class, or nil if resource is
  30212.     uncommitted."
  30213.  
  30214.     | package |
  30215.     package := self packageOfResourceIdentifier: aResourceIdentifier.
  30216.     ^package notNil
  30217.         ifTrue: [package]
  30218.         ifFalse: [self packageOfClass: aResourceIdentifier owningClass]!
  30219.  
  30220. packages
  30221.     "Answer the <collection> of <Package>s held by the receiver."
  30222.  
  30223.     ^packages!
  30224.  
  30225. prerequisiteNotFoundSignal
  30226.     ^PrerequisiteNotFoundSignal!
  30227.  
  30228. release
  30229.     "Private - Remove any event registrations the receiver has made 
  30230.     (this is not strictly necessary as the registrations are weak, but it hastens 
  30231.     the receiver's demise)."
  30232.  
  30233.     self class environment removeEventsTriggeredFor: self.
  30234.     SessionManager current resourceManager removeEventsTriggeredFor: self!
  30235.  
  30236. removePackage: aPackage
  30237.     "Remove aPackage from the receivers loaded packages. All the packages
  30238.     owned objects are removed from the system. This is only possible if no
  30239.     other packages require it for their continued operation. Answer aPackage
  30240.     or an error if other loaded packages have aPackage as a prerequisite.
  30241.  
  30242.     It is important with this method that we do not leave the receiver in a
  30243.     corrupt state. As a result once the removal process has started if we
  30244.     come across an error knowledge of aPackage is simply dropped which might
  30245.     result in classes/methods/globals not owned by any package.
  30246.  
  30247.     If aPackage is corrupt, leading to the canRemove: test raising an error
  30248.     then you can evaluate basicRemove: directly to remove aPackage."
  30249.  
  30250.     aPackage == self systemPackage
  30251.         ifTrue: [^self errorRemovingSystemPackage].
  30252.     self basicRemovePackage: aPackage.
  30253.     self loadedChanged.
  30254.     ^aPackage.!
  30255.  
  30256. renamePackage: aPackage to: aStringPathname
  30257.     "Attempts to rename aPackage held by the receiver to aStringName."
  30258.     
  30259.     | existing newName |
  30260.     newName := File splitStemFrom: aStringPathname.
  30261.     existing := self packageNamed: newName ifNone: [].
  30262.     (existing isNil or: [existing == aPackage]) ifFalse: [
  30263.         ^self error: 'Package already exists'].
  30264.     self packages 
  30265.         removeKey: aPackage name ifAbsent: [];
  30266.         at: newName put: aPackage.
  30267.     aPackage packageFileName: aStringPathname.
  30268.     ^self resetPrerequisites; loadedChanged
  30269.     
  30270. !
  30271.  
  30272. resetPrerequisites
  30273.     "Private - Inform all packages that their prerequisites may have
  30274.     changed, and trigger the generic event announcing that to the world."
  30275.  
  30276.     self packages do: [:aPackage | aPackage resetPrerequisites].
  30277.     self isProcessingEvents ifTrue: [
  30278.         self trigger: #prerequisitesReset]!
  30279.  
  30280. resourceRepackaged: aResourceIdentifier from: source to: destination
  30281.     "Private - Trigger resource repackaging notifications."
  30282.  
  30283.     self assert: [source ~~ destination].
  30284.  
  30285.     self 
  30286.         ownedChanged: source;
  30287.         ownedChanged: destination;
  30288.         trigger: #resourceRepackaged:from:to: 
  30289.             withArguments: (Array with: aResourceIdentifier with: source with: destination)
  30290. !
  30291.  
  30292. setEvents: anEventsCollectionOrNil
  30293.     "Private - Set the EventsCollection of the receiver to be anEventsCollectionOrNil.
  30294.     Answer the receiver."
  30295.  
  30296.     events := anEventsCollectionOrNil!
  30297.  
  30298. sortedPackages
  30299.     "Answer a SortedCollection of the packages held by the receiver,
  30300.     ordered by name."
  30301.  
  30302.     ^self packages asSortedCollection: Package defaultSortBlock!
  30303.  
  30304. systemPackage
  30305.     "Private - Answer the system package held by the receiver."
  30306.  
  30307.     ^self class systemPackage!
  30308.  
  30309. uninstall: aPackage 
  30310.     "Uninstall aPackage and (recursively) any packages dependent upon it, with no questions     
  30311.     asked, deleting all its owned objects from the system.  Run its preuninstall and postuninstall 
  30312.     scripts as well."
  30313.  
  30314.     aPackage isInstalled 
  30315.         ifTrue: 
  30316.             [aPackage okToUninstall.
  30317.             self beNotProcessingEvents.
  30318.             
  30319.             ["First forcibly uninstall all the dependents - if you get a stack overflow here, it's
  30320.             probably because two or more packages are cyclically dependent."
  30321.             aPackage dependentPackages do: [:each | self uninstall: each].
  30322.             Notification signal: ('Uninstalling package ''%1''' formatWith: aPackage name).
  30323.             aPackage fileInScript: #preuninstall.
  30324.             self basicUninstall: aPackage] 
  30325.                     ensure: 
  30326.                         [self
  30327.                             beProcessingEvents;
  30328.                             loadedChanged].
  30329.             aPackage fileInScript: #postuninstall]!
  30330.  
  30331. youShouldBeProcessingEvents
  30332.     "Private - The development system is informing us that the user-interface is active, and hence we
  30333.     should expect to be responding to events as otherwise change flags, and pre-requisites, etc
  30334.     will not be operating correctly."
  30335.  
  30336.     self isProcessingEvents 
  30337.         ifFalse: 
  30338.             [((MessageBox new)
  30339.                 taskModal;
  30340.                 yesNo;
  30341.                 warning: 'The package system is not currently monitoring change events. This means that changes may not be detected and flagged, caches are not maintained, and pre-requisites may be incorrect. Change monitoring should normally only be suppressed during lengthy install/uninstall operations. A previous error or debugging session may have left the package manager in an inconsistent state. 
  30342.  
  30343. Would you like to re-enable change monitoring (recommended)?') 
  30344.                     == #yes 
  30345.                     ifTrue: 
  30346.                         [[self isProcessingEvents] whileFalse: [self beProcessingEvents].
  30347.                         self clearCachedInformation]]! !
  30348.  
  30349. PC1Cipher comment:
  30350. 'This class provides a stream encoder/decoder using the PC1 algorithm.
  30351. Portions ⌐1997 by Stefan Matthias Aust'!
  30352. !PC1Cipher class methodsFor!
  30353.  
  30354. π]3*╢Ä+¿ªüï+Σ╙Ω▐ñù▐σ▒ß¼GJ⌐╛ΘugMQ╫ûWÄ)@GiΓähfS╬:h╗┐%Θ₧]ΦÿÑÜ≥▌┤{R kc╬╡b<ε╟┼N╒úfºW┐kò(≥EJ=≤OÜ╟₧[`⌐35╔ù좪╔}╚W┬█ÆL╜°CM┤e#uûΩ4█═tΓXaí5│-²m<╣ùEéUf╔3┤·éHg╢⌠╕ôèo┴¥[^á⌠╖BdBQQ&zÇJß$PATôW£Gÿç$r.&│ΦFàX╦░▀°■h≡ëë─£*∩úäQ≥KZa{=╛eΦ
  30355. gπóK┘y^═îÇè!
  30356.  
  30357. ΓL2;
  30358. Ñü6╡ªÇG∩VúΣ²┼Φ╓╦╨■┐σpK¬⌐╬;g@SÆû?\ôPIj}^VoOµÄU&1F╖tkΓ╣%√╥ºÑ╗Ü╖╩
  30359. Ö`B
  30360. ╖╓.ε┌╚Xë{∙fªB÷'═A╧TL*ΣL₧═Q╜Nsú5╟Ü╬╢┬Ñd╞`⌡≥Çtε∙VW¬IRî√6┘┌M╜═Q▐&ⁿ"m╖¬½Qf┴╣▌ÉL]╜ç÷Ωσ¡µ:ïß╝hFu&ï└?rDc╠╔_τ╦0SBB▐▒ äVB╠¡æ½⌠`ñ╝ê├¢2¥Γ┌óo^fxj╤ò!
  30361.  
  30362. Σ\&%4í▐_C╙δ⌐$å-°─√î ù╠▄│Γ⌐V¼»╥r}O┐εW;äZH,.^Kjµì L&ß9╚┬<║█Lº│▓î╖╙qt■qPad▀«-h≤ë╙\DôVäaªpóoò√EGSx░6╟É4÷+J⌐?▄û╞Σî½væM╥┼╙4
  30363. á≥X@ºrJxï ;█═l≤S&┬XÇV┤i≡╘8╦Q.┴ü ╥`╢╜∞╣⌐k┬!
  30364.  
  30365. Σ\&%4í▌_C╙δß@∞V≥╤π╩╛╥╟╘│Γ⌐V╥╤⌐9";╕φ"ÆQG%j^A+¢δw\h%@ºyA*°÷`Θ█NΦá╛è Σñ`L    `gÇⁿ*í┼╨QA¢Q▌{╟}│sô°T]I;Φtù█K»VfÑ;ë╥ä│╠7╔\\;{;·NsN<∩à!
  30366.  
  30367. µA)'9░è(┤¡â'▓6⌡▄═┼Ω─àò╝√▒`JÑ╛¡
  30368. w▄ù)WàL+.IRe ∙î^O([ª{Vxⁿδ7≤╩J@╝┐▓▐Σ┌ ¢}[.b╙¿^;┤╠Ä% ºpεA┐iúµT-≥p▀▄\▄)²V|╥£╟╢█⌐äM¥₧╙n╗ SAª k┬√<₧▐ΩT#╪V╩÷mn ç î/¡U╪²ôTx║½ⁿ╛├▒ΣtS╛≥│
  30369. |8e:ÇΩ"8@¥EÜ_τ╦4U _▀ì)╦]ÿ⌡├╣Φd╓╗Å╔ò3éΩ▌φ #HCε*╡OpVσ╕}≤dAΘL╞∞∙τ¥%±┐┘ªN±p¿j∩7╩Ω╕▄Sg[FZ5≡wÅÜG ¥1æàE@jÆSiù■~┤EjÉ∞é=X)Oxû╓╟╦J4üφX╕≡E╤°⌡.▌#-^TQÿ¡d8¥j╫Θ┘▄
  30370. £╡■║ï╖≈═▓╫cpε σz╪"¼"<E╗ì╡═╨-t┐¢?»⌐ⁿS╢≡∩!!Ä~2╔╛òRÿ∩3⬲╫█φUui╕Ñó╧wü═╨)₧ÄF╒ªa~Ω╧╡íⁿpM─z7¡▌¬#/├┴╛B¥⌡ö@Lï╥'∩+&α₧gMµ=Ω┼┤σφT╥9φÿ·Φ╚╬G╤eS╖R╧÷╘B∩ëûΣ╣=G╫6,O■¬┬2VR½l┘╠K5O┌╤⌐Z▓çë)▄I┌t.πäôε▀z`δ√µOhéG<i╦e╡,Θú₧#┌£∩ΩQúßÉ╣fQ êKJ∩M:½\Z]█q╣√╚>0╡LY╕Líá*eß√Γ▓Z╓2Zv╣√±╘»÷3╫B╖ ,┬¬µ)╪s"l#ûè╘U∙Æ∩óï·I╝g-o┴╞ ╦δ╣°V│∩y(╢■#Σ■3α∞!
  30371.  
  30372. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A%b£Φs35J»zc¼ó4≤▀N    ▓▓∙≤¥ª^s²4i\a╘╕]=í┼Ç╒F▌{╟µ=ä±T\;=±a₧╩▄yg⌐ :ôæ╦π▐«A뢽£sô┐:.╦Shæµ<╨≥^Θ@(╔Mܵ?sⁿ╔lé/⌐Vª╘åJ.≤φδ√≤í√no¡ßáa+?b!!ïτMp2LX▄├#ï»]]3L@╖δFΓN╠░┬╜≡g!
  30373.  
  30374. ≤E)7½â_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;"Æå7F╫ME$jT^+∙Äu#Jº<To¼«2√╩GΦ▒Ñæ·Åûxar╓╕-7╕╠╬M[█{∙{╟bªm£∙U**°tï╤^ÄCdñ|¢í└■┬Ñzì╓█â(]∙£=-α`∩àZαφ^ΘE├P╓X₧G!
  30375.  
  30376. ÷M3=╜╒r(ÿ░ÿ/ñ-≤╒÷îô╜╢ùƒⁿ╢DF¡√┴u3AX┴É?\öZ%hGc
  30377. ╢ôZc/Yªn}½┐(║▀`╝▓ûîσ╬\·3j#▐╣} ½╩┴MMæX■|ÉP│qûAδX[Σ}╜╟MÖQ.∞╩å╞╫▐▓ræ!
  30378.  
  30379. ÷M3=╜¡+=┐║╓jäΣ══╒Ω╥■╟¼≤╝.╒╥éZ}[A╫û~SÖM$}ORe ≤┴_&2Gª<Aoí«)∞█P@┐╛úû╖╬7ÄVGkA╚«l+∞ñ¬4"ⁿ(Çy¿╕xçA≈TVSxαOÜ╟{àVqì.╥ï!
  30380.  
  30381. ÷M3=╜ª<=┐«ë8▀αΣα▀≈├╓├╗█½GF╕╛╥PvQ┐εW╢QW=kIj╢êJr'Aáyeñδ4≥█¡┤▓ùß╩^Ç}J.aΩ│~;║└╓\a¢ûp╝h│d╥lû<%`≥aô╪ïK`ñ+9╩░┌Γ╔│)╚Eî₧ƒzO¼ΦCAârz¢╔!!╤╥vΘU*╦Z╚L│,Q÷╘q╓Kx┼┐╚åCqíà²τ⌐!
  30382.  
  30383. ÷M3=╜╝&;│ºïp┼>╩╤÷ Ω┼╓█╣ƒ╧:₧╡╙lvZ╙è~[ÖLP+`XV+≡┴
  30384. Qcf]ªVc┤«2║╔Ká≈╢╡≥╓/
  30385. à}P,░╤[É┌┼UN╒Ü}àF»_ë∙BI9╩aåφMÄKz½@=└░┌Γ╔üaÜ å!
  30386.  
  30387. ÷M3,╢è<.«í╓jç6⌡╟»íö╛¥⌠░ß▓VQ ║╬;zFE╞à0QÆK,.O[nOΣä\o0J▒<Dc╢ú`ª≈L¡░▓î⌐Åâgzr▀▓j&ªï¡3% ¡póE÷jÖ⌠zJ∩pÜ┘\Ä4Σ9▀öâ±╔«vÜ ï₧í}¬■Zs½tYï√ äƒ]εU<à! !
  30388.  
  30389. !PC1Cipher methodsFor!
  30390.  
  30391. ΓM70*■╧3 ú╜ëG∩Vú≈µ▄÷╥═ò┐╨╝GF ≤┬~g_S╫è~╫^J..    >F╕┴?J&l≥<ZyΓ¬`Θ╟O╝Ñ╛¥╖▄ ÆuS@kn┘│i7╝àÇ4"ⁿ¢5»MÑjò╝X\I=Φpù█K▄V|⌐@9▌æ╠≥╔ñ3ç▀ƒû¬⌠S┤ehïα=É¥2ì,EÑVÜL«mh╣î8ôl╔+É╥ç4ß√¡░ìl┴■ Σá╕JI%W~rÅ╣W91ÿ^ìâ╡xc8 ê╘z┼7h ≥▐á╝r≤╗æù┌v╝úéI₧Lw┤&╝G~⌐±8ë#6åoáÇ▒ù╦M█╘╠≥z√j·#π<▌º∙╦@!!NK2ΘwÆπw%ÿt╘ÄQ    #╬boò╗4≈PeVêΘ»xs
  30392. w┬;╨╓âT╒╢jⁿ┐╓!
  30393.  
  30394. ΓM70*ù¢  ┤«╓jä ⌡╞µ┬∙║╡╝ⁿ╙½@T║⌐Çz}S▄ç1VÆ[baIo
  30395. ⌡Ä\bo╡yAy½ñ.║╤D@⌐äúî■┴P╒4m    Σ╜^&╝└╬^ûƒp¡W∞=½[∙PLx²$╫═\ÉD4»    ,█ù╤¼îÑrï▀ÜÇU║⌠PA░)Jzæ╠;▀═^ΣU*▐b!
  30396.  
  30397. ΩA>w_Qµ«<:¡¼₧jæ7ΣöΣ╔τù╨╙■µ¡V¡╛├~z^S└╞S8·5-e^Je!
  30398.  
  30399. ΩA>@u3╔σ[kè╗à<ä+Σöóî╫┘╓┴╖≤⌐ZY║√┬tkP└ï3£+.yJ
  30400. ╫ô Xf@Ñ<FzΓ┐/║îVΦ╡«è≥▄R\·3jk▀Ñ-h≤ë╦!!°|·póE÷oò∙EdR!
  30401.  
  30402. ≤A4!!U╬µp┐║ë>┼+Θ╤»▀Ω╓╦╨■²úW╖╛ÇivKS█Æ;@╒2.G2Qd╢█C.v╖s    *≡■u│₧Cè«ú¢╓▌Ä:3jjܵ0r■ç¡3!!┼Vç/επ(╨≤ 2b∙$â│3⌡+~∞Zaô┌╚≤╒αr£W▀â╙@3ε·R]Γsaç»x₧ĺ
  30403. oä]╒│,uúç`é    .æv±ù├N4▒º∞▀ε≥┤2    ∞«▀`k DZ&!!Ö ≤MpiëFìâ╡Q7|I æ┴~╢oⁿÖ╪°ª<ñ░┴ù╟~σ! !
  30404.  
  30405. PlayShape comment:
  30406. 'A PlayShape represent a basic shape that may be added to a <Playground> window and then manipulated with messages. It is part of the Playground sample package and can be used as a Smalltalk learning aid. See this package''s comment for more details.
  30407.  
  30408. PlayShape is an abstract class. That is, it does not contain sufficient information or implementation to stand on its own. Only subclasses of PlayShape (such as Square, Circle etc) should ever be created. PlayShape does provides a number of methods that implement basic operations that the subclasses can rely on but they are not, in themselves, complete. For example, the #drawOn: method cannot actually draw the final shape since it does not have enough information. If you accidentally try to create an instance of PlayShape and add it to a Playground then you will receive a walkback describing that "#drawOn: is the responsibility of a subclass". This indicates the abstract nature of the PlayShape class.
  30409.  
  30410. Instance Variables:
  30411.     playground    <Playground> or nil owning the shape.
  30412.  
  30413. '!
  30414. !PlayShape methodsFor!
  30415.  
  30416. delay
  30417.     "Delay for a short period after redrawing. This allows us to see some (very) limited
  30418.     animation when repeating operations"
  30419.  
  30420.     Processor sleep: 200
  30421.     !
  30422.  
  30423. drawOn: aCanvas
  30424.     "Private - Draws the receiver on aCanvas. The PlayShape class does not hold
  30425.     enough information to describe how a particular shape might be drawn successfully. 
  30426.     This method is therefore the responsibilty of a subclass which provides this additional
  30427.     behaviour. For this reason we signal a walkback that describes this method as being 
  30428.     the responsibility of a subclass."
  30429.  
  30430.     self subclassResponsibility!
  30431.  
  30432. playground: aPlayground
  30433.     "Private - Sets the Playground to which the receiver belongs. This information
  30434.     is used so that the receiver can ask it's playground to redraw whenever any 
  30435.     changes are made to it. 
  30436.     This method should only be called by a Playground when the receiver is added
  30437.     or removed. It is not intended to be called directly by a user modifying a shape.
  30438.     Hence it is marked as being private"
  30439.  
  30440.     playground := aPlayground!
  30441.  
  30442. redraw
  30443.     "Ask for the receiver to be redraw within it's current Playground.
  30444.     This is normally sent when any significant changes have been made
  30445.     to the receiver"
  30446.  
  30447.     playground invalidate; update.
  30448.     self delay! !
  30449.  
  30450. Presenter comment:
  30451. 'Presenter is an abstract class whose subclasses conform to <presenter> and represent components in the Model-View-Presenter framework. A presenter is the equivalent of a "user interface component" in the Dolphin MVP framework. It achieves flexibility over other component based architectures by allowing its data (its model) and its screen representation (its view) to be pluggable. Thus, one can change the way a user sees and manipulates a component by changing its view and one can change the data that the component is representing  by changing the model. Substituting a presenter''s model also allows several  presenter and view pairs to share and interact with the same data.  
  30452.  
  30453. SmalltalkSystem help: ''Overviews/ModelViewPresenter''.
  30454.  
  30455. A presenter determines how the user perceives, selects, and performs actions on its model data. Whereas a view is an output device to display model information, a presenter is generally a co-ordinator between actions received in the view and the changes these make to the model.  The changes that a presenter makes to its model are normally instigated either by a <commandSource> or by interpreting gestures that the view has received from the user. Such changes are usually applied to a selection of the model''s data that is held by the presenter.
  30456.  
  30457. You will find that presenters naturally fall into two camps; those that are generic simple components such as text editors,  lists and trees, and those that are specific to application models. Often the more specific presenters are <compositePresenter>s since these can be used to handle simultaneous user interaction with multiple aspects of a model. Note that in contrast to previous versions of Dolphin, in Dolphin 5 both <compositePresenter>s and <presenters> can be subclassed directly off <Presenter> (the old CompositePresenter class has gone and is replaced with a global variable that aliases Presenter). 
  30458.  
  30459. When implementing any <presenter> the following basic steps should be followed:
  30460.  
  30461. 1. Decide what sort of presenter is being implemented and, therefore, its position in the class hierarchy. Normally, you will subclass below one of (Presenter, Shell, Dialog, ValueDialog or ValuePresenter). See the comments for these classes to understand more about when to use each type.
  30462.  
  30463. 2. Implement a #defaultModel class method to answer a default model suitable for the presenter. This model can be superseded as the presenter is instantiated, or replaced later, but it must be available for default instantiations.
  30464.  
  30465. 3. All presenters inherit a default view resource name of "Default view". It is recommended that if you only intend to have one view onto your presenter then it should be named this in the resource manager. Otherwise, it will be necessary to override the #defaultView class method to answer the actual name of the view resource you wish to use.
  30466.  
  30467. 4. Next create a view resource for the presenter and associate it with the presenter''s class. This is normally done using the View Composer. The easiest way to create a new view is to write click on the presenter class in the Class Hierarchy Browser and choose the "New view" command. This will launch the View Composer on a copy of the closest "Default view" found for the presenter. If you are designing the default view itself then remember to save it under the name that will be answered by the #defaultView method (see above).
  30468.  
  30469. 5. Override the #createSchematicWiring method on the instance side in order to "wire up" any event handlers that your presenter might need.
  30470.  
  30471. When implementing a <compositePresenter> the following basic steps should be followed (after the steps described above):
  30472.  
  30473. 1. Add instance variables for each of the sub-presenters that will make up the composite. Often one uses sub-presenters to display/edit different aspects of the model, so you will require one variable for each aspect that is to be "presented"..
  30474.  
  30475. 2. Implement a #createComponents instance side method. In here, the sub-presenters are created, named, and assigned to the appropriate instance variables. The names that you give them (not the instance variable names) are important since they indicate which sub-views, within the presenter''s associated <compositeView> will get connected to the various sub-presenters.
  30476.  
  30477. 3. It has been mentioned that the #createSchematicWiring method may need to be overriden to specify appropriate event handling. This is much more likely to be required when creating a <compositePresenter> since you are liable to want to hook up to any events triggered by the sub-presenters and redirect them to specific methods within the new presenter class.
  30478.  
  30479. 4. The next stage is to set up the models of the sub-presenters. Normally you will do this by overriding #model:. If your sub-presenters are to be used to display aspects of the <compositePresenter>''s model (as is common) then you should use this opportunity to assign appropriate <ValueAspectAdapter>s onto these aspects to them. 
  30480.  
  30481. Instance Variables:
  30482.     model        <Object> holding the model data that the presenter is to manipulate.
  30483.     view        <view> displaying the model data and supplying UI gestures and commands to the presenter.
  30484.     parentPresenter    <compositePresenter> that is the presenter''s parent or nil if it is a top level shell.
  30485.     events        <EventsCollection> holding the presenter''s event registrations.
  30486.     subPresenters    <OrderedCollection> of sub-presenters.
  30487.     names        <IdentityDictionary> mapping sub-presenter instances to their <readableString> names.
  30488.  
  30489. '!
  30490. !Presenter class methodsFor!
  30491.  
  30492. acceleratorKeyBindings
  30493.     "Answer a <Dictionary> mapping accelerator key sequences to commands, being the additional accelerator 
  30494.     definitions for commands not on the menu bars (if any) of the receiver's view(s).
  30495.     N.B. The answer is a copy of the accelerator key bindings, and so modifications will not take effect unless
  30496.     the dictionary is set back with #acceleratorKeyBindings:"
  30497.  
  30498.     | answer |
  30499.     answer := Dictionary new.
  30500.     self additionalAccelerators do: [:each | answer at: each last put: each first].
  30501.     ^answer!
  30502.  
  30503. acceleratorKeyBindings: aDictionary 
  30504.     "Set a collection of additional accelerator definitions for commands not on the menu bar of the receiver's view(s).
  30505.     The argument should be an <abstractDictionary> mapping accelerator key strings, e.g. 'Ctrl+I' to command name
  30506.     <Symbol>s."
  30507.  
  30508.     self setAdditionalAccelerators: (aDictionary associations asArray 
  30509.                 collect: [:each | Array with: each value with: each key])!
  30510.  
  30511. additionalAccelerators
  30512.     ^self getAdditionalAccelerators ifNil: [self defaultAdditionalAccelerators]!
  30513.  
  30514. addView: aViewClass asResource: aStringName
  30515.     "Adds a default instance of aViewClass as a resource of the receiver called aStringName"
  30516.  
  30517.     aViewClass makeResource: aStringName inClass: self !
  30518.  
  30519. create
  30520.     "Answers an instance of the receiver with a default view"
  30521.  
  30522.     ^self create: self defaultView
  30523.     !
  30524.  
  30525. create: aResourceNameString
  30526.     "Answers an instance of the receiver with a view identified by aResourceNameString"
  30527.  
  30528.     ^self create: aResourceNameString on: self defaultModel
  30529.     !
  30530.  
  30531. create: aResourceNameString in: aCompositePresenter
  30532.     "Answers an instance of the receiver created as a sub-presenter of aCompositePresenter
  30533.     and wired up to a view identified by the resource name aResourceNameString."
  30534.  
  30535.     ^self create: aResourceNameString in: aCompositePresenter on: self defaultModel.
  30536.     !
  30537.  
  30538. create: aResourceNameString in: aCompositePresenter on: aModel
  30539.     "Answers an instance of the receiver created as a sub-presenter of aCompositePresenter
  30540.     and wired up to a view identified by the resource name aResourceNameString. The new
  30541.     presenter is to be connected to aModel. It is assumed that, at this stage, aCompositePresenter
  30542.     is already opened in a view. For this reason we must force an #onViewOpened message to
  30543.     the newly created presenter"
  30544.  
  30545.     | newOne |
  30546.     newOne := aCompositePresenter add: (self on: aModel).
  30547.     newOne createView: aResourceNameString.
  30548.     ^newOne onViewOpened; yourself
  30549.     !
  30550.  
  30551. create: aResourceNameString on: aModel
  30552.     "Answers an instance of the receiver with a view identified by aResourceNameString
  30553.     and connected to aModel"
  30554.  
  30555.     ^(self on: aModel)
  30556.         createView: aResourceNameString; 
  30557.         yourself.
  30558.     !
  30559.  
  30560. createIn: aCompositePresenter
  30561.     "Answers an instance of the receiver created as a sub-presenter of aCompositePresenter
  30562.     and wired up to a default view"
  30563.  
  30564.     ^self create: self defaultView in: aCompositePresenter
  30565.     !
  30566.  
  30567. createIn: aCompositePresenter on: aModel
  30568.     "Answers an instance of the receiver created as a sub-presenter of aCompositePresenter
  30569.     and wired up to its default view. The new presenter is to be connected to aModel. "
  30570.  
  30571.     ^self create: self defaultView in: aCompositePresenter on: aModel
  30572.     !
  30573.  
  30574. createOn: aModel
  30575.     "Answers an instance of the receiver with a default view"
  30576.  
  30577.     ^self create: self defaultView on: aModel
  30578.     !
  30579.  
  30580. defaultAdditionalAccelerators
  30581.     "Answer a collection of additional accelerator definitions for commands not on the menu bar of the receiver's view(s).
  30582.     Each element of the collection should be a two element <Array>, the first element of which is the command symbol
  30583.     and the second the accelerator key string."
  30584.  
  30585.     ^#()!
  30586.  
  30587. defaultModel
  30588.     "Answer a default model to be assigned to the receiver when it
  30589.     is initialized. Answer nil for no default. Overidden by subclasses
  30590.     that can provide a more sensible default"
  30591.  
  30592.     ^nil!
  30593.  
  30594. defaultView
  30595.     "Answer the resource name of the default view for the receiver.
  30596.     Subclasses should override this method if they wish to use a different
  30597.     resource name for the default view"
  30598.  
  30599.     ^View defaultView!
  30600.  
  30601. editNewDefaultView
  30602.         "Open the View Composer on a new copy of the receiver's default view"
  30603.     
  30604.         | resourceIdentifier |
  30605.         resourceIdentifier := ResourceIdentifier class: self name: self defaultView.
  30606.         Smalltalk developmentSystem openViewComposerEmpty openOnCopyOf: resourceIdentifier!
  30607.  
  30608. getAdditionalAccelerators
  30609.     ^nil!
  30610.  
  30611. icon
  30612.     "Answers an Icon that can be used to represent this class"
  30613.  
  30614.     ^##(self) defaultIcon!
  30615.  
  30616. loadViewResource: aString inContext: aParentView
  30617.     "Private - Load a view resource called aString owned by this class."
  30618.  
  30619.     | resourceIdentifier |
  30620.     resourceIdentifier := ResourceIdentifier class: self name: aString.
  30621.     ^resourceIdentifier loadWithContext: aParentView.
  30622. !
  30623.  
  30624. new
  30625.     "Answer an instance of the receiver not yet connected to any view
  30626.     but connected to a default model"
  30627.  
  30628.     ^self on: self defaultModel!
  30629.  
  30630. on: aModel
  30631.     "Answer an instance of the receiver not yet connected to any view
  30632.     but connected to aModel."
  30633.  
  30634.     ^(super new) on: aModel; yourself!
  30635.  
  30636. setAdditionalAccelerators: anArray 
  30637.     self error: 'configuring accelerator keys is not supported'!
  30638.  
  30639. show
  30640.     "Answers an instance of the receiver shown in a default view"
  30641.  
  30642.     ^self create showShell
  30643.     !
  30644.  
  30645. show: aResourceNameString
  30646.     "Answers an instance of the receiver shown in a view identified by aResourceNameString"
  30647.  
  30648.     ^(self create: aResourceNameString) showShell.
  30649.     !
  30650.  
  30651. show: aResourceNameString on: aModel
  30652.     "Answers an instance of the receiver shown in a view identified by aResourceNameString
  30653.     and connected to aModel"
  30654.  
  30655.     ^(self create: aResourceNameString on: aModel) showShell.
  30656.     !
  30657.  
  30658. showOn: aModel
  30659.     "Answers an instance of the receiver shown in a default view
  30660.     and connected to aModel"
  30661.  
  30662.     ^(self createOn: aModel) showShell.
  30663.     ! !
  30664.  
  30665. !Presenter methodsFor!
  30666.  
  30667. add: aPresenter
  30668.     "Adds aPresenter to the receiver's collection of sub-presenters.
  30669.     Answers aPresenter"
  30670.  
  30671.     ^self add: aPresenter name: (self defaultNameOf: aPresenter).
  30672. !
  30673.  
  30674. add: aPresenter name: aNameString
  30675.     "Adds aPresenter to the receiver's collection of sub-presenters and
  30676.     gives it aNameString. Answers aPresenter"
  30677.  
  30678.     self subPresenters add: aPresenter.
  30679.     self name: aPresenter as: aNameString.
  30680.     aPresenter parentPresenter: self.
  30681.     ^aPresenter!
  30682.  
  30683. additionalAccelerators
  30684.     "Answer a collection of additional accelerator definitions for commands not on the menu bar of the receiver's view(s).
  30685.     Each element of the collection should be a two element <Array>, the first element of which is the command symbol
  30686.     and the second the accelerator key string."
  30687.  
  30688.     ^self class additionalAccelerators!
  30689.  
  30690. addToCommandRoute: route
  30691.     "Update the <OrderedCollection>, path, with the receiver's contribution to the command path
  30692.     held by the <CommandPolicy>, route. Answer the next <Presenter> to visit.
  30693.     The receiver is guaranteed not to be on the command path already.
  30694.     Implementation Note: By default we fire it straight back."
  30695.  
  30696.     ^route appendPresenter: self!
  30697.  
  30698. allSubPresentersDo: aMonadicValuable
  30699.     "Evaluate the <monadicValuable> argument for the receiver, and recursively each of its
  30700.     sub-presenters (i.e. a pre-order traversal)."
  30701.  
  30702.     self subPresenters do: 
  30703.             [:each | 
  30704.             aMonadicValuable value: each.
  30705.             each allSubPresentersDo: aMonadicValuable]!
  30706.  
  30707. asParameter
  30708.     "Answer the receiver in a form suitable for passing to an external
  30709.     function call (in this case the receiver's window handle)."
  30710.  
  30711.     ^self view asParameter
  30712. !
  30713.  
  30714. attachSubPresenterViews: aView 
  30715.     "Private - Now run through all our sub-presenters and connect them in turn
  30716.     to same named sub-views within aView."
  30717.  
  30718.     "N.B. If subPresenters is nil at this point, you might have forgotten
  30719.     a supersend in your presenter's #initialize method."
  30720.  
  30721.     self subPresenters do: 
  30722.             [:eachSubPresenter | 
  30723.             | name matchingSubView |
  30724.             name := self nameOf: eachSubPresenter.
  30725.             matchingSubView := aView viewNamed: name ifNone: [].
  30726.             matchingSubView notNil 
  30727.                 ifTrue: [eachSubPresenter view: matchingSubView presenterConnectionPoint]
  30728.                 ifFalse: 
  30729.                     ["No matching sub view - drill down one more layer"
  30730.  
  30731.                     eachSubPresenter attachSubPresenterViews: aView]]!
  30732.  
  30733. commandPolicy
  30734.     "Answers a <CommandPolicy> object set up for routing commands originating
  30735.     from the receiver. This should be overridden by subclasses that wish to use a different 
  30736.     routing policy."
  30737.  
  30738.     ^self view commandPolicy!
  30739.  
  30740. commandSource
  30741.     "Private - Answer the <View> starting point for command routing if a UI command
  30742.     is received by the receiver. Subclasses may override to suggest another source for their
  30743.     own commands."
  30744.  
  30745.     ^self view commandSource
  30746. !
  30747.  
  30748. connectView    
  30749.     "Private - Connect the view to the receiver. The default is to connect the 
  30750.     view's presenter to the receiver and the view's model to the receiver's model"
  30751.  
  30752.     self view presenter: self.
  30753.     self model notNil 
  30754.         ifTrue: [ self view model: self viewModel ]
  30755.     !
  30756.  
  30757. createComponents
  30758.     "Create the presenters contained by the receiver. At this stage
  30759.     the receiver has not yet been initialized."
  30760.  
  30761. !
  30762.  
  30763. createSchematicWiring
  30764.     "Create the trigger wiring for the receiver. At this stage the initialization
  30765.     is complete and the view is open"!
  30766.  
  30767. createView: aResourceNameString 
  30768.     "Private - Creates and connects a view for the receiver from the resource identified
  30769.     by aResourceNameString. Answers the new view created"
  30770.  
  30771.     | parentView surrogateShellView |
  30772.     parentView := self parentPresenter isNil 
  30773.                 ifTrue: 
  30774.                     ["The receiver has no parent presenter so create a basic
  30775.             ShellView to hold its view"
  30776.                     surrogateShellView := ShellView new create.
  30777.                     parentView := surrogateShellView.
  30778.                     parentView
  30779.                         layoutManager: GridLayout new;
  30780.                         caption: self printString;
  30781.                         largeIcon: self icon;
  30782.                         show.
  30783.                     parentView]
  30784.                 ifFalse: [self parentPresenter view].
  30785.  
  30786.     "Create the new view and validate the parent's layout"
  30787.     self view: (self class loadViewResource: aResourceNameString inContext: parentView).
  30788.     surrogateShellView notNil ifTrue: [self onViewOpened].
  30789.     parentView validateLayout.
  30790.     ^self view show!
  30791.  
  30792. cursor
  30793.     "Answers the cursor to be used while over the receiver's view
  30794.     (just delegate back to the view by default)."
  30795.  
  30796.     ^self view cursor
  30797. !
  30798.  
  30799. defaultNameOf: aView
  30800.     "Private - Answer a default name for aView within the receiver. The name is 
  30801.     of the form: classnn, where 'class' is the class of aView and 'nn' is an integer
  30802.     based on the count of existing instances of that class as sub-presenters of
  30803.     the receiver"
  30804.  
  30805.     | count |
  30806.     count := (self subPresenters select: [ :each | each class == aView class]) size.
  30807.     ^aView class name displayString , (count+1) displayString!
  30808.  
  30809. dragCut: session
  30810.     "The <DragDropSession>, session, has just completed a successful move operation.
  30811.     The dragged object(s) now need to be cut from the drag source. Shrug shoulders
  30812.     and reflect back to the View."
  30813.  
  30814.     self view dragCut: session!
  30815.  
  30816. dragEnter: session
  30817.     "The drag operation described by the <DragDropSession>, session,
  30818.      has entered the receiver's window.
  30819.     Use the session to provide feedback to the user about allowable operations etc."
  30820.  
  30821.     self view dragEnter: session.!
  30822.  
  30823. dragLeave: session
  30824.     "The drag operation described by the <DragDropSession>, session,
  30825.     has left the receiver's window."
  30826.  
  30827.     "Allow the view a chance to give feedback"
  30828.     self view dragLeave: session!
  30829.  
  30830. dragOver: session
  30831.     "The drag operation described by the <DragDropSession>, session,
  30832.     has moved to a new position over the receiver's window. Use the session 
  30833.     to provide feedback to the user about allowable operations etc.
  30834.     Implementation Note: Reflect back to the view in anticipation of it eventually
  30835.     triggering an event off the receiver so that the receiver's observers (typically
  30836.     higher level presenters, may get involved in the drag-drop session)."
  30837.  
  30838.     self view dragOver: session.!
  30839.  
  30840. drop: session
  30841.     "The drag operation described by the <DragDropSession>, session,
  30842.     would like to do a drop. Answer whether the drop was accepted and
  30843.     should proceed - an affirmative reply from this message instructs the 
  30844.     drag source to cut the dragged objects (depending on the drag operation).
  30845.  
  30846.     Implementation Note: It is possible to override this method to accept the 
  30847.     dropped Object(s), but the preferred mechanism is now to observe the 
  30848.     #drop:  event triggered by the receiver. In any case, if the drop was 
  30849.     unsuccessful the operation attribute of the session should be set to nil, 
  30850.     and false answered as the result of #drop:."
  30851.  
  30852.     ^self view drop: session!
  30853.  
  30854. ensureVisible
  30855.     "Ensures that the receiver is visible in it's parent"
  30856.  
  30857.     self view ensureVisible
  30858.  
  30859.     !
  30860.  
  30861. errorDuplicateName: aString
  30862.     "Report that aString is already in use"
  30863.  
  30864.     ^self error: 'duplicate name: ', aString!
  30865.  
  30866. fileLocator
  30867.     "Answer the file locator that can be used to locate external files used by the receiver"
  30868.  
  30869.     ^self view fileLocator!
  30870.  
  30871. getEvents
  30872.     "Private - Answer the EventsCollection belonging to the receiver, or nil if the receiver
  30873.     has no events registered for it"
  30874.  
  30875.     ^events!
  30876.  
  30877. hasFocus
  30878.     "Answer true if the receiver's view has the input focus"
  30879.  
  30880.     ^self view hasFocus!
  30881.  
  30882. hasFocusDeeply
  30883.     "Answer true if the receiver's view, or any of its sub-views, has the input focus"
  30884.  
  30885.     ^self view hasFocusDeeply!
  30886.  
  30887. hasView
  30888.     "Answer true if the receiver has a real view connected"
  30889.  
  30890.     ^self view class ~~ DeafObject!
  30891.  
  30892. hide
  30893.     "Hides the view of the receiver"
  30894.  
  30895.     self view hide!
  30896.  
  30897. initialize
  30898.     "Private - Initialize the receiver."
  30899.  
  30900.     "When overriding this method do remember to supersend!!"
  30901.  
  30902.     view := DeafObject current.
  30903.     subPresenters := OrderedCollection new.
  30904.     self createComponents!
  30905.  
  30906. invalidateUserInterface
  30907.     "Invalidates the user interface of the receiver indicating that it needs
  30908.     to be requeried using #validateUserInterface (usually at idle time)"
  30909.  
  30910.     self view invalidateUserInterface!
  30911.  
  30912. isOpen
  30913.     "Answer whether the receiver has a real view connected, and it is open (i.e. 
  30914.     there is a valid native Window associated with it)"
  30915.  
  30916.     ^self view isOpen == true!
  30917.  
  30918. model
  30919.     "Answer the model of the receiver"
  30920.  
  30921.     ^model
  30922. !
  30923.  
  30924. model: anObject
  30925.     "Set the model of the receiver to be anObject"
  30926.  
  30927.     model := anObject.
  30928.     self view notNil ifTrue: [
  30929.         self connectView]
  30930. !
  30931.  
  30932. name: aPresenter as: aNameString 
  30933.     "Sets the name of aPresenter within the receiver to be aNameString"
  30934.  
  30935.     "Check that aPresenter is one of our sub-presenters"
  30936.     self assert: [self subPresenters includes: aPresenter].
  30937.     names isNil 
  30938.         ifTrue: [(names := IdentityDictionary new) at: aPresenter put: aNameString]
  30939.         ifFalse: 
  30940.             ["Check that aNameString has not already been used"
  30941.             | exists |
  30942.             exists := names keyAtValue: aNameString ifAbsent: [].
  30943.             (exists isNil or: [exists == self]) 
  30944.                 ifTrue: [names at: aPresenter put: aNameString]
  30945.                 ifFalse: [self errorDuplicateName: aNameString]]!
  30946.  
  30947. nameOf: aPresenter
  30948.     "Answer the name of aPresenter within the receiver or nil
  30949.     if it has not been assigned a name"
  30950.  
  30951.     ^names isNil ifFalse: [names at: aPresenter ifAbsent: []]
  30952. !
  30953.  
  30954. on: aSubjectModel
  30955.     "Private - Initializes the model connection for the receiver to aSubjectModel.
  30956.     Most Presenters are connected directly to the subject. Some subclasses override
  30957.     this method to provide buffering between the Presenter model and the 
  30958.     subject (Dialogs)."
  30959.  
  30960.     self initialize.
  30961.     aSubjectModel notNil ifTrue: [ self model: aSubjectModel ]!
  30962.  
  30963. onAboutToDisplayMenu: popup
  30964.     "The pop-up <Menu>, popup, is about to be displayed.
  30965.     This is our opportunity to update it, e.g. to add/remove items.
  30966.     Note: Adding an item persists as the menu is not destroyed
  30967.     until the view is closed."
  30968.  
  30969.     ^self view onAboutToDisplayMenu: popup!
  30970.  
  30971. onActionPerformed
  30972.     "Handler for an action in the receiver's view"
  30973.  
  30974.     self view onActionPerformed.!
  30975.  
  30976. onCaptureChanged: hWnd
  30977.     ^nil!
  30978.  
  30979. onCloseRequested
  30980.     "Default handler for a close request event. Pass on to the view"
  30981.  
  30982.     ^self view onCloseRequested!
  30983.  
  30984. onGetCursor: aSymbol
  30985.     "The named area of the view associated with the receiver has been hit.
  30986.     Answer the appropriate mouse cursor or nil to accept the default."
  30987.  
  30988.     | globalCursor |
  30989.     ^(aSymbol == #client and: [(globalCursor := Cursor current) notNil]) 
  30990.         ifTrue: [globalCursor]
  30991.         ifFalse: [self view onGetCursor: aSymbol]!
  30992.  
  30993. onIdleEntered
  30994.     "There are no messages in the input queue and the input state is
  30995.     about to go idle. Perform any idle processing (by default do nothing)."
  30996.  
  30997.     ^true!
  30998.  
  30999. onInputMaskRequired: anEvent
  31000.     "Handler for an input event mask request from Windows.
  31001.     Reflect back to the view for processing - it doesn't seem worthwhile
  31002.     triggering an event in the general case, and if so it would required
  31003.     a value holder as its parameter."
  31004.     
  31005.     ^self view onInputMaskRequired: anEvent!
  31006.  
  31007. onKeyPressed: aKeyEvent
  31008.     "Default handler for the receiver's view receiving a key press event."
  31009.  
  31010.     ^self view onKeyPressed: aKeyEvent!
  31011.  
  31012. onKeyReleased: aKeyEvent
  31013.     "Default handler for the receiver's view receiving a key up event."
  31014.  
  31015.     ^self view onKeyReleased: aKeyEvent!
  31016.  
  31017. onKeyTyped: aKeyEvent
  31018.     "Default handler for the receiver's view receiving a key entry."
  31019.  
  31020.     ^self view onKeyTyped: aKeyEvent!
  31021.  
  31022. onKillFocus
  31023.     "Default handler for the receiver's view losing focus"
  31024.  
  31025.     ^self view onKillFocus!
  31026.  
  31027. onLeftButtonDoubleClicked: aMouseEvent
  31028.     "Default handler for a mouse left button double-click event."
  31029.  
  31030.     ^self view onLeftButtonDoubleClicked: aMouseEvent!
  31031.  
  31032. onLeftButtonPressed: aMouseEvent
  31033.     "Default handler for a left button down mouse event."
  31034.  
  31035.     ^self view onLeftButtonPressed: aMouseEvent!
  31036.  
  31037. onLeftButtonReleased: aMouseEvent
  31038.     "Default handler for a Left button up mouse event."
  31039.  
  31040.     ^self view onLeftButtonReleased: aMouseEvent!
  31041.  
  31042. onMiddleButtonDoubleClicked: aMouseEvent 
  31043.     "Default handler for a mouse middle button double-click event."
  31044.  
  31045.     ^self view onMiddleButtonDoubleClicked: aMouseEvent
  31046. !
  31047.  
  31048. onMiddleButtonPressed: aMouseEvent 
  31049.     "Default handler for a middle button down mouse event."
  31050.  
  31051.     ^self view onMiddleButtonPressed: aMouseEvent!
  31052.  
  31053. onMiddleButtonReleased: aMouseEvent 
  31054.     "Default handler for a middle button up mouse event."
  31055.  
  31056.     ^self view onMiddleButtonReleased: aMouseEvent!
  31057.  
  31058. onMouseMoved: aMouseEvent
  31059.     "Default handler for a mouse move event over the
  31060.     receiver's view."
  31061.  
  31062.     ^self view onMouseMoved: aMouseEvent!
  31063.  
  31064. onMouseWheeled: aMouseEvent 
  31065.     "Default handler for a mouse wheel movement event."
  31066.  
  31067.     ^self view onMouseWheeled: aMouseEvent!
  31068.  
  31069. onPositionChanged: aPositionEvent
  31070.     "Default handler for a change in position (resize or move) of the receiver's view."
  31071.     
  31072.     ^self view onPositionChanged: aPositionEvent!
  31073.  
  31074. onPositionChanging: aPositionEvent
  31075.     "Default handler for window position changing (move or resize).
  31076.     Modifying the contents of aPositionEvent can alter how it gets mapped
  31077.     to an actual position change of the receiver."
  31078.  
  31079.     ^self view onPositionChanging: aPositionEvent!
  31080.  
  31081. onRightButtonDoubleClicked: aMouseEvent
  31082.     "Default handler for a mouse Right button double-click event."
  31083.  
  31084.     ^self view onRightButtonDoubleClicked: aMouseEvent!
  31085.  
  31086. onRightButtonPressed: aMouseEvent
  31087.     "Default handler for a Right button down mouse event."
  31088.  
  31089.     ^self view onRightButtonPressed: aMouseEvent!
  31090.  
  31091. onRightButtonReleased: aMouseEvent
  31092.     "Default handler for a Right button up mouse event."
  31093.  
  31094.     ^self view onRightButtonReleased: aMouseEvent!
  31095.  
  31096. onSetFocus
  31097.     "Handler for the receiver's view gaining focus"
  31098.  
  31099.     ^self view onSetFocus!
  31100.  
  31101. onTipTextRequired: tool
  31102.     "Tool tip text is required for the <ToolbarItem>, tool."
  31103.  
  31104.     ^tool toolTipText!
  31105.  
  31106. onViewAvailable
  31107.     "A new view is available, but has not yet been connected to the receiver, i.e.
  31108.     the view will not yet be aware of this presenter or its model.
  31109.     This is an appropriate point for subclasses to apply any dynamic view 
  31110.     configuration that the application may require (e.g. setting a user configured 
  31111.     font previously saved in the Registry). Since the view is not yet connected, any 
  31112.     events fired will not reach this presenter or the model.
  31113.     This event is new for Dolphin 3.0"!
  31114.  
  31115. onViewClosed
  31116.     "Sent by the receiver's view when it has been closed"
  31117.  
  31118.     self view onViewClosed!
  31119.  
  31120. onViewDestroyed
  31121.     "Handler for view final view destruction. This is sent on receipt of WM_NCDESTROY,
  31122.     and is expected to be the last communication from Windows. There is nothing
  31123.     more we can do to save the patient. No event is triggered."
  31124.  
  31125.     | answer |
  31126.     answer := self view onViewDestroyed.
  31127.     view isStateRestoring         "If not recreating the view then discard it"
  31128.         ifFalse: [view := DeafObject current].
  31129.     ^answer!
  31130.  
  31131. onViewOpened
  31132.     "Now run through all our sub-presenters and connect them in turn
  31133.     to same named sub-views within aCompositeView"
  31134.  
  31135.     self subPresenters do: [:eachSubPresenter | eachSubPresenter onViewOpened].
  31136.     self createSchematicWiring.
  31137.     self view onViewOpened!
  31138.  
  31139. parentPresenter
  31140.     "Answer the Presenter that is the parent of the reciver, or nil if there
  31141.     is no parent"
  31142.  
  31143.     ^parentPresenter!
  31144.  
  31145. parentPresenter: aPresenter
  31146.     "Private - Set the Presenter that is the parent of the reciver to be aPresenter"
  31147.  
  31148.     parentPresenter := aPresenter!
  31149.  
  31150. performAction
  31151.     "Cause an #actionPerformed event to be routed"
  31152.  
  31153.     self view performAction!
  31154.  
  31155. presenterNamed: aString
  31156.     "Answer the sub-presenter within the receiver with aString as its
  31157.     name. Signals a NotFoundError if no matching named presenter exists."
  31158.  
  31159.     ^self presenterNamed: aString ifNone: [ self errorNotFound: aString ]
  31160. !
  31161.  
  31162. presenterNamed: aString ifNone: exceptionHandler
  31163.     "Answer the sub-presenter within the receiver's hierarchy with aString as its
  31164.     name. Evaluates the <niladicValuable>, exceptionHandler, if no matching 
  31165.     named view exists."
  31166.  
  31167.     names isNil ifFalse: [names keysAndValuesDo: [ :k :v | aString = v ifTrue: [^k]]].
  31168.     ^exceptionHandler value.
  31169.  
  31170. !
  31171.  
  31172. queryCommand: query
  31173.     "Enter details about a potential command for the receiver 
  31174.     into the <CommandQuery>, query."
  31175.  
  31176.     (query canPerformAgainst: self) ifTrue: [
  31177.         query beEnabled].
  31178.  
  31179.     ^false    "There was no specific enablement of the command at this level"!
  31180.  
  31181. remove: aPresenter
  31182.     "Removes aPresenter from the receiver's collection of sub-presenters.
  31183.     Answers aPresenter"
  31184.  
  31185.     self view removeSubView: aPresenter view.
  31186.     self subPresenters remove: aPresenter.
  31187.     aPresenter 
  31188.         parentPresenter: nil; 
  31189.         view: DeafObject current.
  31190.     names isNil ifFalse: [names removeKey: aPresenter].
  31191.     ^aPresenter
  31192. !
  31193.  
  31194. requestDragImages: session
  31195.     "This is where the receiver specifies any drag image overrides.
  31196.     To do this use DragDropSession>>#imageAt: <Symbol> put: <Image> where 
  31197.     the Symbol is an either #object (to specify the underlying icon), or an 
  31198.     operation Symbol such as #none, #move, #copy, #link, #moveScroll, #copyScroll, 
  31199.     #linkScroll or some other Symbol to match an operation symbol. The Image
  31200.     is any Image (e.g. Icon or Cursor)."
  31201.  
  31202.     self view requestDragImages: session!
  31203.  
  31204. requestDragObjects: session
  31205.     "This is where the receiver specifies which object(s) the <DragDropSession>, session,
  31206.     is to drag. The objects are added to the session using DragDropSession>>addDragObject: 
  31207.     or DragDropSession>>dragObjects:."
  31208.  
  31209.     self view requestDragObjects: session!
  31210.  
  31211. requestDropOperations: session
  31212.     "Update the <DragDropSession>, session, with the set of supported 
  31213.     drag and drop operation symbols (for right-button drags).
  31214.     Implementation Note: Reflect back to the View, which will (normally)
  31215.     tigger a #requestDropOperations: event off the receiver."
  31216.  
  31217.     self view requestDropOperations: session!
  31218.  
  31219. setEvents: anEventsCollectionOrNil
  31220.     "Private - Set the EventsCollection of the receiver to be anEventsCollectionOrNil.
  31221.     Answer the receiver."
  31222.  
  31223.     events := anEventsCollectionOrNil!
  31224.  
  31225. setFocus
  31226.     "Sets keyboard input focus to the view associated with the receiver.
  31227.     First ensure that the view is visible within it's parent"
  31228.  
  31229.     | v |
  31230.     v := self view.
  31231.     v  ensureVisible.
  31232.     v setFocus!
  31233.  
  31234. show
  31235.     "Shows the view of the receiver"
  31236.  
  31237.     self view show!
  31238.  
  31239. showShell
  31240.     "Shows the Shell to which the receiver belongs"
  31241.  
  31242.     self view topShell show!
  31243.  
  31244. stbSaveOn: anSTBOutFiler
  31245.     "Output the receiver to anSTBOutFiler. We must ensure that the local events collection
  31246.     is NOT saved to the filer"
  31247.  
  31248.     anSTBOutFiler override: events with: nil.
  31249.     super stbSaveOn: anSTBOutFiler.!
  31250.  
  31251. subPresenters
  31252.     "Answers an OrderedCollection of Presenters that are the
  31253.     children of the receiver"
  31254.  
  31255.     ^subPresenters!
  31256.  
  31257. topShell
  31258.     "Answer the <topPresenter> associated with the receiver."
  31259.  
  31260.     | next |
  31261.     next := self parentPresenter.
  31262.     next isNil ifTrue: [next := self view].
  31263.     ^next topShell!
  31264.  
  31265. validateUserInterface
  31266.     "Validates the user interface for the receiver. Usually performed at idle time
  31267.     when the  UI has been flagged as being invalid"
  31268.  
  31269.     self view validateUserInterface!
  31270.  
  31271. view
  31272.     "Answer the view for the receiver. If the view has not yet been created then
  31273.     it is created now"
  31274.  
  31275.     ^view !
  31276.  
  31277. view: aView 
  31278.     "Set the view for the receiver to aView. We also connect up any sub-views
  31279.     to same named presenters in our subPresenters collection"
  31280.  
  31281.     self attachSubPresenterViews: aView.    
  31282.     view := aView.
  31283.     self onViewAvailable.
  31284.     self connectView!
  31285.  
  31286. viewModel
  31287.     "Private - Answer the model that is to be connected to the view. In general this    
  31288.     is identical to the receiver's model but in some cases the presenter may want to
  31289.     donate a different model to the view"
  31290.  
  31291.     ^self model! !
  31292.  
  31293. ProcessorScheduler comment:
  31294. 'The singleton instance of ProcessorScheduler (the global, Processor) manages the set of live, ready to run, processes, scheduling the interpreter in a round-robin fashion but in strict priority order.
  31295.  
  31296. Processor is the destination for all asynchronous interrupts from the VM, and also manages ''callbacks'' (i.e. invocations of Smalltalk code from external systems, such as the dispatching of windows messages to the window procedure). In particular the Processor ensures that processes return from callbacks in strict LIFO order so that synchronization with the native machine stack is maintained.
  31297.  
  31298. Asynchronous interrupts may be delivered to a process at any time including when the process is suspended, e.g. waiting on a Semaphore. The only exceptions are that any interrupts queued to terminated processes are discarded, and that interrupts will not be delivered while asynchronous events are disabled (see #(enable|disable)Interrupts). Interrupts may be sent by the VM to notify of certain conditions, such as the weak loss or finalization queues exceeding their high water marks, but they can also be used to ''inject'' code from one process into another (see Process>>#interruptWith:). A similar mechanism is used when one Process explicitly terminates another (i.e. murder rather than suicide) to inject a terminate signal which is then used to raise an exception caught by a handler at the very base of the Process entry point. This has the effect of running all unwind blocks (set up by #ifCurtailed: and #ensure:) so that a Process can shut down cleanly.
  31299.  
  31300. Note that much of the behaviour of the ''processor'' is actually implemented in the process subsystem of the VM. This is partly for performance reasons, and partly because primitives are atomic.
  31301.  
  31302. Instance Variables:
  31303.     processLists     <Array> of <LinkedList>s of processes which are ready to run and awaiting scheduling.
  31304.     activeProcess     The <Process> which is currently executing
  31305.     pendingReturns    <Semaphore> on which out-of-order callback exit attempts wait their turn to exit.
  31306.     comStubs        <PermanentRegistry> of currently registered COM server stub object.
  31307.             Used to map virtual callbacks to their destination object.
  31308.     overlappedCalls    <Semaphore> on which processes engaged in overlapped calls wait for the call to complete.
  31309.     pendingTerminations    <Sempahore> on which processes being terminated wait until any outstanding overlapped calls have been terminated.
  31310.         
  31311. Class Variables:
  31312.     InterruptSelectors    <Array> of <Symbol> selectors for each of the interrupt numbers sent by the VM.'!
  31313. !ProcessorScheduler class methodsFor!
  31314.  
  31315. initialize
  31316.     "Initialize the receiver's class variables:
  31317.  
  31318.     InterruptSelectors    -    Selectors to be sent to the Processor when the corresponding interrupt
  31319.                         number is sent by the VM.
  31320.  
  31321.     Evaluate me to initialize:
  31322.         ProcessorScheduler initialize
  31323.     "
  31324.  
  31325.     ConstWriteSignal := Signal description: 'Attempt to update read-only object'.
  31326.     InterruptSelectors := 
  31327.         #(
  31328.             terminate:            "1"
  31329.             stackOverflow:        "2"
  31330.             debugBreak:        "3"
  31331.             singleStep:            "4"
  31332.             gpFault:             "5"
  31333.             idlePanic:            "6"
  31334.             interruptWith:        "7"
  31335.             onStartup:            "8"
  31336.             kill:                "9"
  31337.             fpException:        "10"
  31338.             userBreak:            "11"
  31339.             zeroDivide:        "12"
  31340.             otOverflow:        "13"
  31341.             constWrite:        "14"
  31342.             win32Fault:        "15"
  31343.             fpStackFault:        "16"
  31344.             noMemory:        "17"
  31345.             hospiceOverflow:    "18"
  31346.             bereavedOverflow:    "19"
  31347.             unusedInterrupt:        "20"
  31348.         )
  31349. !
  31350.  
  31351. new
  31352.     "There can be only one scheduler, and it is stored in the global variable Processor (which
  31353.     must not be reassigned!!)."
  31354.  
  31355.     ^self shouldNotImplement!
  31356.  
  31357. newPriorities: highestPriority activeProcess: aProcess
  31358.     "Private - Create Processor during boot."
  31359.  
  31360.     ^self basicNew setHighestPriority: highestPriority activeProcess: aProcess! !
  31361.  
  31362. !ProcessorScheduler methodsFor!
  31363.  
  31364. activePriority
  31365.     "Answer the priority of the current active process"
  31366.  
  31367.     ^self activeProcess priority!
  31368.  
  31369. activeProcess
  31370.     "Answer the current active process"
  31371.  
  31372.     ^activeProcess!
  31373.  
  31374. bereavedOverflow: interruptArg
  31375.     "Private - The VM has detected that the bereavement queue has reached
  31376.     its high water mark. Inform the memory manager."
  31377.  
  31378.     MemoryManager current bereavedOverflow: interruptArg.
  31379.     self enableInterrupts.
  31380.     !
  31381.  
  31382. callback: cookie evaluate: aNiladicBlock
  31383.     "Private - Evaluate aNiladicBlock and return the result to the VM. Should any
  31384.     attempt be made to make a far return over this context, then ensure that the
  31385.     VM stack for the callback is unwound."
  31386.  
  31387.     ^self callback: cookie return: (aNiladicBlock ifCurtailed: [self unwindCallback: cookie])!
  31388.  
  31389. callback: receiver perform: aSymbol cookie: cookie
  31390.     "Private - Entry point from the VM. Suspend whatever the receiver is doing and send the 
  31391.     Object, receiver, the unary message whose selector is aSymbol. Return the result to the 
  31392.     VM. The receiver will then resume its previously active context.
  31393.     We must trap any attempts to return over the callback (e.g. due to trapping an exception
  31394.     in an outer context) and unwind the VM stack too.
  31395.     WARNING: Do not remove or modify this method."
  31396.  
  31397.     ^self callback: cookie return: 
  31398.         ([receiver perform: aSymbol] ifCurtailed: [self unwindCallback: cookie])!
  31399.  
  31400. callback: receiver perform: aSymbol with: arg cookie: cookie
  31401.     "Private - Entry point from the VM. Suspend whatever the receiver is doing and send the 
  31402.     Object, receiver, the binary message whose selector is aSymbol with the argument, arg. 
  31403.     Return the result to the VM.  The receiver will then resume its previously active context.
  31404.     We must trap any attempts to return over the callback (e.g. due to trapping an exception
  31405.     in an outer context) and unwind the VM stack too.
  31406.     WARNING: Do not remove or modify this method."
  31407.  
  31408.     ^self callback: cookie return: 
  31409.         ([receiver perform: aSymbol with: arg] ifCurtailed: [self unwindCallback: cookie])!
  31410.  
  31411. callback: receiver perform: aSymbol with: arg1 with: arg2 cookie: cookie
  31412.     "Private - Entry point from the VM. Suspend whatever the receiver is doing and send the 
  31413.     Object, the keyword message whose selector is aSymbol with the arguments, arg1 and arg2.
  31414.     Return the result to the VM.  The receiver will then resume its previously active context.
  31415.     We must trap any attempts to return over the callback (e.g. due to trapping an exception
  31416.     in an outer context) and unwind the VM stack too.
  31417.     WARNING: Do not remove or modify this method."
  31418.  
  31419.     ^self callback: cookie return: 
  31420.         ([receiver perform: aSymbol with: arg1 with: arg2] 
  31421.             ifCurtailed: [self unwindCallback: cookie])!
  31422.  
  31423. callback: receiver perform: aSymbol with: arg1 with: arg2 with: arg3 cookie: cookie
  31424.     "Private - Entry point from the VM. Suspend whatever the receiver is doing and send the 
  31425.     Object, the keyword message whose selector is aSymbol with the arguments, arg1, arg2 and arg3.
  31426.     Return the result to the VM.  The receiver will then resume its previously active context.
  31427.     We must trap any attempts to return over the callback (e.g. due to trapping an exception
  31428.     in an outer context) and unwind the VM stack too.
  31429.     WARNING: Do not remove or modify this method."
  31430.  
  31431.     ^self callback: cookie return: 
  31432.         ([receiver perform: aSymbol with: arg1 with: arg2 with: arg3] 
  31433.             ifCurtailed: [self unwindCallback: cookie])!
  31434.  
  31435. callback: receiver perform: aSymbol withArguments: anArray cookie: cookie
  31436.     "Private - Entry point from the VM. Suspend whatever the receiver is doing and send the 
  31437.     Object, receiver, the keyword message whose selector is aSymbol with the arguments contained
  31438.     in anArray. Return the result to the VM. The receiver will resume from its active context
  31439.     before the callback.
  31440.     We must trap any attempts to return over the callback (e.g. due to trapping an exception
  31441.     in an outer context) and unwind the VM stack too.
  31442.     WARNING: Do not remove or modify this method."
  31443.  
  31444.     ^self callback: cookie return: (
  31445.         [receiver perform: aSymbol withArguments: anArray]
  31446.             ifCurtailed: [self unwindCallback: cookie])!
  31447.  
  31448. callback: cookie return: result
  31449.     "Private - Return the <Object>, result, to the VM as the result of the callback identified by the 
  31450.     <integer>, cookie, which the VM passed in when it originated the callback,
  31451.     restoring the current active process to the context it was executing before the callback occurred.
  31452.     If the primitive returns nil, then we wait on the Processor's pendingCallbacks list (Semaphore).
  31453.     The primitive does not return here if the callback return succeeds.
  31454.     The VM ensures that when a callback exit succeeds pendingCallbacks has enough signals such
  31455.     that any Processes which attempted to return from callbacks out of sync since the last successful 
  31456.     callback return, will be restarted so that they can try to return again.
  31457.     This mechanism is necessary to synchronise the multiple threads in Smalltalk with the single VM
  31458.     thread. It works quite satifactorily unless a Process with an active callback lower down the VM
  31459.     stack than the pending callbacks becomes indefinitely blocked - the result is a deadlock."
  31460.  
  31461.     [(self primReturn: result callback: cookie) isNil] whileTrue: [
  31462.         "There is a more recent callback which has still not returned, so we must wait..."
  31463.         pendingReturns wait].
  31464.     ^result    "Will not get this far unless in restarted image"!
  31465.  
  31466. callback: anInteger withArgumentsAt: anAddress cookie: cookie
  31467.     "Private - Entry point from the VM. Suspend whatever the receiver is doing and evaluate
  31468.     the callback message or block with magic cookie, anInteger, whose arguments are stored in 
  31469.     the VM's stack at the address, anAddress."
  31470.  
  31471.     ^self callback: cookie return: 
  31472.         ([(ExternalCallback callback: anInteger withArgumentsAt: anAddress) asDword] 
  31473.             ifCurtailed: [self unwindCallback: cookie])!
  31474.  
  31475. cannotReturn: anObject
  31476.     "Private - Sent when the VM is unable to return anObject from the current active block
  31477.     because it's home method has already returned, or is homed in another process. This happens 
  31478.     when a block which contains a ^-return is stored into a variable, and is evaluated at some point
  31479.     not in the call stack above the method from which the block originated. In other
  31480.     words, blocks which are stored for parameterizing, etc, (e.g. a sort block), or used to 
  31481.     fork new processes, cannot contain ^-returns.
  31482.     N.B. If you get a walkback with this error from BlockClosure>>newProcess (the bottom
  31483.     stack frame) then it is advisable to Kill the offending process, as further walkbacks
  31484.     will occur if it is terminated normally."
  31485.  
  31486.     ^self error: 'Cannot return ', anObject basicPrintString, ' to expired context or across Processes'!
  31487.  
  31488. comCallback: vfnIndex 
  31489.         id: objectCookie 
  31490.         subId: interfaceCookie 
  31491.         withArgumentsAt: anAddress 
  31492.         cookie: cookie
  31493.     "Private - Entry point from the VM. Suspend whatever the receiver is doing and send
  31494.     the virtual callback with cookies, objectCookie and interfaceCookie, for the virtual
  31495.     function indexed, vfnIndex, and whose arguments are stored in the VM's stack at the 
  31496.     address, anAddress." 
  31497.  
  31498.     "Transcript show: 'Com callback(vfn:', vfnIndex printString, ',', objectCookie printString, ',', interfaceCookie printString, ',', anAddress printString, ')'; cr."
  31499.     self callback: cookie return: 
  31500.         ([(comStubs at: objectCookie)
  31501.             callback: interfaceCookie vfn: vfnIndex withArgumentsAt: anAddress]
  31502.                 ifCurtailed: [self unwindCallback: cookie])!
  31503.  
  31504. constWrite: exceptionRecordBytes
  31505.     "Private - The VM generated a GP Fault interrupt. The argument is the relevant 
  31506.     EXCEPTION_RECORD."
  31507.  
  31508.     | exceptionRecord |
  31509.     self enableInterrupts.
  31510.     exceptionRecord := EXCEPTION_RECORD fromBytes: exceptionRecordBytes.
  31511.     ^ConstWriteSignal signalWith: exceptionRecord!
  31512.  
  31513. debugBreak: interruptArg
  31514.     "Private - A halt instruction was encountered.
  31515.     Note that async events are not re-enabled if the event is forwarded to a debugger."
  31516.  
  31517.     | debugger |
  31518.     debugger := activeProcess debugger.
  31519.     debugger isNil
  31520.         ifTrue: [self enableInterrupts]
  31521.         ifFalse: [debugger onBreak: interruptArg]!
  31522.  
  31523. enableAsyncEvents: aBoolean
  31524.     "Private - Enable/disable asynchronous interrupts and semaphore signals.
  31525.     This does not prevent process switches due to synchronous process synchronisation,
  31526.     but it does prevent a process from being pre-empted due to asynchronous events.
  31527.     N.B. Do not rely on disabling async events as a means of process synchronisation
  31528.     because this facility may not be available in a future pre-emptive multi-threaded VM."
  31529.  
  31530.     <primitive: 95>
  31531.     ^self primitiveFailed!
  31532.  
  31533. enableInterrupts
  31534.     "Private - Enable asynchronous interrupts and semaphore signals, and yield
  31535.     the processor in case a process switch would have occurred while async. events
  31536.     were disasbled.
  31537.     N.B. This is similar to #enableAsyncEvents:, but yields the processor if
  31538.     necessary. It is intended to be used from interrupt handlers: Since the VM
  31539.     dispatches interrupts even if it means pre-empting a higher priority process,
  31540.     we must allow that higher priority process to be rescheduled when re-enabling
  31541.     async. events. Where async. events are turned off to disable process switching
  31542.     in critical sections, the basic, #enableAsyncEvents:, message should be sent,
  31543.     since the normal process scheduling will not have been disrupted. Generally
  31544.     speaking this message need only be used in an interrupt handler."
  31545.  
  31546.     (self enableAsyncEvents: true)
  31547.         ifFalse: [self yield]!
  31548.  
  31549. forkMain
  31550.     "Private - Start a new main process."
  31551.  
  31552.     ^self systemProcessOwner forkMain!
  31553.  
  31554. forkMainIfMain
  31555.     "Private - Start a new main process if executed in the context of the current
  31556.     main process. Answer whether the active process was formerly the main 
  31557.     process."
  31558.  
  31559.     | wasMain |
  31560.     wasMain := self isActiveMain.
  31561.     wasMain ifTrue: [self forkMain].
  31562.     ^wasMain!
  31563.  
  31564. fpException: ieeeExceptionBytes
  31565.     "Private - The active process has caused an IEEE floating point exception, whose details
  31566.     are the argument. Raise a matching Smalltalk exception."
  31567.  
  31568.     | ieeeRecord |
  31569.     self enableInterrupts.
  31570.     ieeeRecord := _FPIEEE_RECORD fromBytes: ieeeExceptionBytes.
  31571.     ieeeRecord isZeroDivide
  31572.         ifTrue: [ZeroDivide dividend: ieeeRecord operand1 value]
  31573.         ifFalse: [FloatingPointException signalWith: ieeeRecord]!
  31574.  
  31575. fpStackFault: exceptionRecordBytes
  31576.     "Private - The VM generated an interrupt because it detected a floating point stack
  31577.     over or underflow. The argument is the relevant Win32 EXCEPTION_RECORD.
  31578.     Note that the VM will have reinitialized the floating point stack to avoid repeated
  31579.     FP stack check errors. FP stack check errors are an indication of a serious bug
  31580.     in some floating point code, the prime suspect being the reported module, 
  31581.     however it is worth bearing in mind that said module might be an innocent victim
  31582.     of the mess left by some previous user of the FP stack."
  31583.  
  31584.     | exceptionRecord |
  31585.     Float reset.
  31586.     self enableInterrupts.
  31587.     exceptionRecord := EXCEPTION_RECORD fromBytes: exceptionRecordBytes.
  31588.     Win32Fault signal: 'Floating point stack under/overflow' with: exceptionRecord!
  31589.  
  31590. genericInterrupt
  31591.     "Private - Answer the interrupt number of the generic interrupt."
  31592.  
  31593.     ^7!
  31594.  
  31595. gpFault: exceptionRecordBytes
  31596.     "Private - The VM generated a GP Fault interrupt. The argument is the relevant 
  31597.     EXCEPTION_RECORD.
  31598.     Notes: 
  31599.     1) GPFs most commonly occur during an external library call - check the parameters,
  31600.     it is often possible to identify the culprit from the reported invalid address.
  31601.     2) GPFs are OFTEN recoverable (by catching the GPFault exception and handling it,
  31602.     or during development by dismissing the walkback), but be aware that the VM is likely
  31603.     to become unstable if the faulting code overwrote any Smalltalk memory. Furthermore the 
  31604.     problem will often not show up until the next GC or later.
  31605.     3) If a GP fault occurred while WRITING to memory, then the chances are that corruption 
  31606.     may have occurred and you should prepare for the worst!!"
  31607.  
  31608.     | exceptionRecord |
  31609.     self enableInterrupts.
  31610.     exceptionRecord := EXCEPTION_RECORD fromBytes: exceptionRecordBytes.
  31611.     GPFault signalWith: exceptionRecord
  31612. "
  31613. ExternalAddress new dwordAtOffset:0
  31614. "!
  31615.  
  31616. highestPriority
  31617.     "Answer the highest priority level available"
  31618.  
  31619.     ^processLists size
  31620. !
  31621.  
  31622. highIOPriority
  31623.     "Answer the priority for critical I/O processes (e.g. network I/O)"
  31624.  
  31625.     ^9!
  31626.  
  31627. hospiceOverflow: interruptArg
  31628.     "Private - The VM has detected that the finalization queue has reached
  31629.     its high water mark. Inform the memory manager."
  31630.  
  31631.     self enableInterrupts.
  31632.     MemoryManager current hospiceOverflow: interruptArg.
  31633.     !
  31634.  
  31635. idlePanic: interruptArg
  31636.     "Private - The processor has determined that there are no processes ready to run - i.e.
  31637.     it is in a state of 'idle panic'. The argument is the interrupt enable/disable status.
  31638.     We take the remedial action of starting another idle process."
  31639.  
  31640.     SessionManager inputState idlePanic.
  31641.     self enableInterrupts!
  31642.  
  31643. idleProcess
  31644.     "Private - Answer the current idle process."
  31645.  
  31646.     ^self systemProcessOwner idler
  31647. !
  31648.  
  31649. interruptWith: aBlock
  31650.     "Private - Another process queued the argument aBlock for evaluation as an interrupt
  31651.     block in the context of the receiver, so evaluate it. The queuer of the block will
  31652.     not get an answer. The block is evaluated with async events disabled."
  31653.  
  31654.     aBlock value.
  31655.     self enableInterrupts!
  31656.  
  31657. iret: frameOffset list: suspendingList
  31658.     "Private - Return to the active process'  frame, at the specified 
  31659.     offset from the process base, on completion of an interrupt, restoring 
  31660.     the <List>|<Semaphore>, suspendingList, which is nil if the process 
  31661.     was active at the time of the interrupt. If a process is interrupted while
  31662.     suspended on a list, then it is re-suspended on that list when it has finished
  31663.     handling the interrupt, but note that it will be placed at the back of the list
  31664.     regardless of the position it was in when interrupted.
  31665.     Primitive failure reasons:
  31666.         0 -    the argument, frameOffset, is not a SmallInteger
  31667.  
  31668.     Be warned: This primitive method is not intended to be sent by user code
  31669.     it does not perform much error checking, and may cause the VM to
  31670.     terminate unexpectedly if the specified frameOffset is invalid."
  31671.  
  31672.     <primitive: 68>
  31673.     ^self primitiveFailed!
  31674.  
  31675. isActiveMain
  31676.     "Answer whether or not the active process is the main GUI process."
  31677.  
  31678.     ^activeProcess isMain!
  31679.  
  31680. kill: interruptArg
  31681.     "Private - The active process has been sent a kill interrupt, terminate it without running
  31682.     its unwind blocks."
  31683.  
  31684.     self enableInterrupts.
  31685.     activeProcess kill!
  31686.  
  31687. killInterrupt
  31688.     "Private - Answer the interrupt number of the Kill interrupt. The kill interrupt is used to terminate
  31689.     a Process with extreme prejudice (i.e. without giving it a change to run its unwind blocks)."
  31690.  
  31691.     ^9!
  31692.  
  31693. lowIOPriority
  31694.     "Answer the priority for normal I/O processes (e.g. keyboard/mouse input)."
  31695.  
  31696.     ^8
  31697. !
  31698.  
  31699. mainProcess
  31700.     "Private - Answer the current User Interface (Main) process"
  31701.  
  31702.     ^self systemProcessOwner main
  31703. !
  31704.  
  31705. noMemory: interruptArg
  31706.     "Private - The VM was unable to allocate or commit some virtual memory.
  31707.     In some cases this is not fatal, and Dolphin can continue. In other cases
  31708.     the VM will have no choice but to call FatalAppExit()."
  31709.  
  31710.     self enableInterrupts.
  31711.     OutOfMemoryError signal!
  31712.  
  31713. onStartup: args
  31714.     "Private - Interrupt sent by the VM after the image has been loaded. Interrupts are disabled.
  31715.     N.B. DO NOT REMOVE THIS METHOD OR YOUR SYSTEM WILL NOT START."
  31716.  
  31717.     "Any overlapped calls in progress when the image was saved are no longer valid."
  31718.     overlappedCalls := Semaphore new.
  31719.     "Any overlapped calls waiting for threads to terminate are wasting there time."
  31720.     pendingTerminations := Semaphore new.
  31721.  
  31722.     "Pass control to the SessionManager to start up as it wishes"
  31723.     SessionManager current onStartup: args!
  31724.  
  31725. otOverflow: anInteger
  31726.     "Private - The VM has allocated more memory for object headers. Inform the
  31727.     memory manager."
  31728.  
  31729.     MemoryManager current otOverflow: anInteger.
  31730.     "This interrupt is only ever sent to the active process, therefore no need to reschedule"
  31731.     self enableAsyncEvents: true!
  31732.  
  31733. pendingTerminations
  31734.     ^pendingTerminations!
  31735.  
  31736. primReturn: anObject callback: cookie
  31737.     "Private - Return the <Object>, result, to the VM as the result of the callback identified by the 
  31738.     <integer>, cookie, which the VM passed in when it originated the callback.
  31739.     Restore the current active process to the context it was executing before the callback occurred.
  31740.     The primitive will fail (but will not set the failure result) if:
  31741.         - the current active process is not in a callback
  31742.         - the callback identified by cookied was not the last
  31743.     Answer nil in the latter case so that #callbackReturn: keeps trying to exit (assuming no deadlock,
  31744.     it will eventually succeed when its turn comes). Where the process is attempting to return from a
  31745.     non-existant callback (perhaps the image was saved down with a process in the middle of a callback)
  31746.     then answer self so that the process continues, effectively ignoring the callback return request."
  31747.  
  31748.     <primitive: 104>
  31749.     ^activeProcess isInCallback
  31750.         ifFalse: [self]!
  31751.  
  31752. primUnwindCallback: cookie
  31753.     "Private - Unwind (i.e. abnormally terminate) the callback identified by the <integer>, cookie, 
  31754.     The context is unaffected (i.e. we continue to run in our caller).
  31755.     Note that this is achieved by raising a Win32 structured exception, and therefore any intervening
  31756.     frame based unwind handlers will be run.
  31757.     The primitive answers self if it 'succeeds'.
  31758.     The primitive will fail (but not set the failure reason) if:
  31759.         - the current active process is not in a callback
  31760.         - the last callback was not that identified by the cookie
  31761.     Answer nil in the latter case, so that the caller can put the active process to sleep to 
  31762.     wait its turn. In the former case, answer self to ignore the unwind request and continue."
  31763.  
  31764.     <primitive: 107>
  31765.     ^activeProcess isInCallback
  31766.         ifFalse: [self]!
  31767.  
  31768. primUnwindInterrupt
  31769.     "Private - Unwind (i.e. abnormally terminate) the most recent interrupt for the current active 
  31770.     process, the context is unaffected (i.e. we continue to run in our caller).
  31771.     The primitive answers self if it 'succeeds'.
  31772.     The primitive does not fail."
  31773.  
  31774.     <primitive: 150>
  31775.     ^self primitiveFailed!
  31776.  
  31777. processesAt: anInteger
  31778.     "Answer the number of processes at the specified priority level."
  31779.  
  31780.     ^(processLists at: anInteger) size!
  31781.  
  31782. registerCOMStub: target
  31783.     "Private - Register the specified argument COM callback target, answering its cookie."
  31784.  
  31785.     comStubs isNil ifTrue: [comStubs := PermanentRegistry new].
  31786.     ^comStubs addAnsweringIndex: target!
  31787.  
  31788. remove: aProcess ifAbsent: aBlock 
  31789.     "Private - Remove aProcess from the waiting process lists.
  31790.     If it is not in any of the waiting process lists, then evaluate
  31791.     aBlock. Answer aProcess"
  31792.  
  31793.     (processLists at: aProcess priority)
  31794.         remove: aProcess ifAbsent: aBlock.
  31795.     ^aProcess!
  31796.  
  31797. returnValue: anObject toFrame: frameAddress
  31798.     "Private - Return anObject to the active process'  frame at the specified 
  31799.     address (a SmallInteger - the actual address is frameAddress*2).
  31800.     The primitive does not fail.
  31801.     Be warned: This primitive method is not intended to be sent by user code
  31802.     it does not perform any error checking, and may cause the VM to
  31803.     terminate unexpectedly if the specified frameAddress is invalid."
  31804.  
  31805.     <primitive: 78>
  31806.     ^self!
  31807.  
  31808. setHighestPriority: priority activeProcess: aProcess
  31809.     "Private - Construct the process lists, and set the active process to aProcess.
  31810.     Used only during bootstrap to generate the singleton instance of the
  31811.     ProcessorScheduler class - Processor"
  31812.  
  31813.     processLists := (1 to: priority) collect: [ :i | LinkedList new ].
  31814.     activeProcess := aProcess.
  31815.     pendingReturns := Semaphore new!
  31816.  
  31817. signal: aSemaphore afterMilliseconds: anInteger
  31818.     "Private - Request that the VM signal aSemaphore as soon as possible after the
  31819.     the specified millisecond delay. Cancel any existing request if aSemaphore is 
  31820.     not actuall a Semaphore (typically nil). If anInteger <= 0, then the Semaphore
  31821.     is signalled immediately.
  31822.  
  31823.     Primitive failure results:
  31824.         0 -    anInteger is not a SmallInteger
  31825.         2 -  anInteger was greater than the maximum Delay which can be requested.
  31826.         3 -    OS refused to set timer (try KernelLibrary>>getLastError)"
  31827.  
  31828.     <primitive: 100>
  31829.     ^self primitiveFailed!
  31830.  
  31831. singleStep: interruptArg
  31832.     "Private - A single step has occurred.
  31833.     Note that interrupts are NOT re-enabled here if the event if forwarded to the debugger."
  31834.  
  31835.     | debugger |
  31836.     debugger := activeProcess debugger.
  31837.     debugger isNil 
  31838.         ifTrue: [self enableInterrupts]
  31839.         ifFalse: [debugger onStep: interruptArg]
  31840. !
  31841.  
  31842. sleep: anInteger
  31843.     "Delay the current active process for at least anInteger milliseconds."
  31844.  
  31845.     (Delay forMilliseconds: anInteger) wait!
  31846.  
  31847. stackOverflow: interruptArg
  31848.     "Private - The active process overflowed its maximum stack. This is most commonly caused by 
  31849.     failing to terminate a recursion. The default maximum stack should be sufficient for a 
  31850.     depth of several thousand message sends, but can be increased if necessary."
  31851.  
  31852.     self enableAsyncEvents: true.
  31853.     Win32Error signalWith: ERROR_STACK_OVERFLOW.
  31854.     #todo "Add an exception class for this?"!
  31855.  
  31856. suspendActive
  31857.     "Suspend the currently active process. A suspended process is removed from consideration
  31858.     by the scheduler (it will not be waiting on any of the Processor's lists), and will not 
  31859.     therefore be able to run until it is #resume'd."
  31860.  
  31861.     activeProcess suspend
  31862. !
  31863.  
  31864. systemBackgroundPriority
  31865.     "Answer the priority for background processes (idle time)"
  31866.  
  31867.     ^2
  31868. !
  31869.  
  31870. systemBasePriority
  31871.     "Answer the lowest possible priority."
  31872.  
  31873.     ^1!
  31874.  
  31875. systemProcessOwner
  31876.     "Private - Answer the object responsible for maintaining the system processes (excluding
  31877.     those which belong to the memory manager."
  31878.  
  31879.     ^SessionManager inputState!
  31880.  
  31881. terminate: interruptArg
  31882.     "Private - The current active process has been sent a terminate interrupt, terminate it."
  31883.  
  31884.     self enableInterrupts.
  31885.     self terminateActive!
  31886.  
  31887. terminateActive
  31888.     "Terminate the current active process"
  31889.  
  31890.     activeProcess terminate!
  31891.  
  31892. terminateInterrupt
  31893.     "Private - Answer the interrupt number of the Terminate interrupt. The terminate interrupt can be used
  31894.     to terminate a process gracefully, even if it is not the current active process."
  31895.  
  31896.     ^1!
  31897.  
  31898. timingPriority
  31899.     "Answer the priority for timing process. This must be the highest possible priority."
  31900.  
  31901.     ^10
  31902. !
  31903.  
  31904. unregisterCOMStub: cookie
  31905.     "Private - Unregister the COM object stub with the specified cookie."
  31906.  
  31907.     comStubs isNil ifTrue: [comStubs := PermanentRegistry new].
  31908.     comStubs removeAtIndex: cookie!
  31909.  
  31910. unregisterCOMStubs
  31911.     "Private - Unregister all COM object stubs."
  31912.  
  31913.     comStubs := nil!
  31914.  
  31915. unusedInterrupt: interruptArg
  31916.     "Private - The current active process has been sent an unknown interrupt, 
  31917.     raise an error."
  31918.  
  31919.     self enableInterrupts.
  31920.     self error: 'Unknown interrupt with ', interruptArg printString!
  31921.  
  31922. unwindCallback: cookie
  31923.     "Private - Unwind (i.e. abnormally terminate) the most recent callback of the current
  31924.     active process, passing the VM back the <SmallInteger> cookie which it passed in as one
  31925.     of the arguments to the entry point through which it originally called in to Smalltalk.
  31926.     The primitive method answers nil if an attempt was made to unwind
  31927.     a callback out of synchronisation with other callbacks (i.e. another Process is handling
  31928.     a more recent callback and has not yet returned/unwound it). If this happens we put
  31929.     the current active process to sleep until the VM signals the pendingCallbacks Semaphore on 
  31930.     a successful callback return or unwind, at which point this process can make another
  31931.     attempt at unwinding the callback identified by the cookie."
  31932.  
  31933.     [(self primUnwindCallback: cookie) isNil] whileTrue: [pendingReturns wait]!
  31934.  
  31935. unwindCallbacks
  31936.     "Private - Unwind the outstanding callbacks in the active process. This
  31937.     lives in ProcessorScheduler rather than Process, because callback returns
  31938.     can only be made while a Process is active."
  31939.  
  31940.     [activeProcess isInCallback] whileTrue: [self unwindCallback: 0]!
  31941.  
  31942. userBackgroundPriority
  31943.     "Answer the priority for user background processes."
  31944.  
  31945.     ^3!
  31946.  
  31947. userBreak: interruptArg
  31948.     "Private - The user pressed the interrupt key combination (e.g. CTRL+BREAK)
  31949.     to interrupt the active process.    Forward to the SessionManager as the
  31950.     response will depend on the application requirements."
  31951.  
  31952.     self enableInterrupts.
  31953.     SessionManager current onUserBreak!
  31954.  
  31955. userBreakInterrupt
  31956.     "Private - Answer the interrupt number of the CTRL+BREAK interrupt."
  31957.  
  31958.     ^11!
  31959.  
  31960. userInterruptPriority
  31961.     "Answer the priority for high-priority user interaction processes, such
  31962.     as window management tasks of limited duration"
  31963.  
  31964.     ^7!
  31965.  
  31966. userSchedulingPriority
  31967.     "Answer the priority for normal user interation"
  31968.  
  31969.     ^5
  31970. !
  31971.  
  31972. vmi: frameOffset list: suspendingList no: interruptNumber with: arg
  31973.     "Private - The VM has delivered the <integer> interrupt, interruptNumber, 
  31974.     which was queued with the <Object> argument, arg. At the time the interrupt occurred
  31975.     the process' active stack frame was at the <integer> offset, frameOffset, from the process
  31976.     base, and the process' suspendingList was the <Semaphore> suspendingList (nil if not waiting).
  31977.     N.B. The VM ensures that the current active process is the process for which the interrupt
  31978.     is intended, which may mean that a Semaphore wait is interrupted (this will be resumed on
  31979.     return from the interrupt, so there are no ill effects), or a suspended Process may be
  31980.     temporarily resumed.
  31981.     Implementation Notes:
  31982.     -    The frame is passed in as an offset, rather than a real address, because
  31983.         the process base address may not be the same on reloading a saved image, and it is possible
  31984.         to return from the interrupt in a subsequent session, e.g. when debugging a process.
  31985.     -    The VM ensures that the current active process is the process during
  31986.         whose execution the interrupt originally occurred, which may mean that a Semaphore wait 
  31987.         is interrupted (this will be resumed on return from the interrupt, so there are no side
  31988.         effects), or a suspended Process may be temporarily resumed.
  31989.     -    Async. process switches are disabled on entry to this method."
  31990.  
  31991.     [self perform: (InterruptSelectors basicAt: interruptNumber) with: arg]
  31992.         ifCurtailed: [self primUnwindInterrupt].
  31993.     self iret: frameOffset list: suspendingList!
  31994.  
  31995. win32Fault: exceptionRecordBytes
  31996.     "Private - The VM generated an unhandled Win32 Exception interrupt. The argument is the relevant 
  31997.     EXCEPTION_RECORD."
  31998.  
  31999.     | exceptionRecord |
  32000.     self enableInterrupts.
  32001.     exceptionRecord := EXCEPTION_RECORD fromBytes: exceptionRecordBytes.
  32002.     Win32Fault signalWith: exceptionRecord!
  32003.  
  32004. yield
  32005.     "Suspend the current active process, giving other processes at the same
  32006.     priority (and higher priorities of course?) a chance to run. If there are no
  32007.     other processes at the same, or higher, priority then the active process
  32008.     continues running.
  32009.     The primitive does not fail, and is much faster than the alternative
  32010.     of prodding a higher priority process to cause a rescheduling
  32011.     to occur (e.g. the timing process)."
  32012.  
  32013.     <primitive: 156>
  32014.  
  32015.     "Sleeping, for whatever duration, yields the processor."
  32016.     self sleep: 0!
  32017.  
  32018. zeroDivide: interruptArg
  32019.     "Private - The VM generated a Integer Divide by Zero interrupt. This will happen if any attempt is
  32020.     made to divide by zero, either in the execution of Dolphin code, in a Dolphin primitive, OR in
  32021.     an external library function."
  32022.  
  32023.     self enableInterrupts.
  32024.     ZeroDivide dividend: interruptArg
  32025.  
  32026. "
  32027. 1/0
  32028. "! !
  32029.  
  32030. PropertyManager comment:
  32031. ''!
  32032. !PropertyManager class methodsFor!
  32033.  
  32034. new
  32035.     "Answers an instance of the receiver; instances require initialization"
  32036.  
  32037.     ^super new initialize! !
  32038.  
  32039. !PropertyManager methodsFor!
  32040.  
  32041. initialize
  32042.     "Private - Initialize the receiver"
  32043.  
  32044.     register := (WeakIdentityDictionary new) haveStrongValues; yourself.!
  32045.  
  32046. propertyOf: anObject at: aSymbol
  32047.     "Answers a property value matching aSymbol for anObject"
  32048.  
  32049.     ^self propertyOf: anObject at: aSymbol ifAbsent: [anObject errorNotFound: aSymbol].
  32050. !
  32051.  
  32052. propertyOf: anObject at: aSymbol ifAbsent: aBlock
  32053.     "Answers a property value matching aSymbol for anObject. If no such property
  32054.     exists then aBlock will be evaluated"
  32055.  
  32056.     ^((register at: anObject ifAbsent: [^aBlock value]) at: aSymbol ifAbsent: aBlock).
  32057. !
  32058.  
  32059. propertyOf: anObject at: aSymbol put: valueObject
  32060.     "Associates a property valueObject with the property name aSymbol for anObject.
  32061.     Answer the valueObject put."
  32062.  
  32063.     | propertyDict |
  32064.     propertyDict := register at: anObject ifAbsentPut: [
  32065.         "No property dictionary yet exists for this object so create one"
  32066.         IdentityDictionary new].
  32067.     ^propertyDict at: aSymbol put: valueObject.
  32068.     
  32069. !
  32070.  
  32071. removeAllPropertiesOf: anObject
  32072.     "Removes all properties for anObject"
  32073.  
  32074.     register removeKey: anObject ifAbsent: []
  32075.     !
  32076.  
  32077. removePropertyOf: anObject at: aSymbol
  32078.     "Removes a property value matching aSymbol for anObject"
  32079.  
  32080.     self removePropertyOf: anObject at: aSymbol ifAbsent: [anObject errorNotFound: aSymbol]
  32081. !
  32082.  
  32083. removePropertyOf: anObject at: aSymbol ifAbsent: aBlock
  32084.     "Removes a property value matching aSymbol for anObject. If no such property
  32085.     exists then aBlock will be evaluated"
  32086.  
  32087.     | propertyDict |
  32088.     propertyDict := register at: anObject ifAbsent: [^aBlock value].
  32089.     propertyDict removeKey: aSymbol ifAbsent: [^aBlock value].
  32090.     propertyDict isEmpty ifTrue: [register removeKey: anObject].
  32091.     ! !
  32092.  
  32093. Question comment:
  32094. 'This class forms part of a tutorial for the Dolphin Beginner''s Guide. A Question represents a decision node in the animal guessing game. Question instances form the branch nodes in the game''s knowledge tree. Each instance contains the text of a question and a yes/no branch to take depending on the result of that question. These branches can either point to other Question nodes or to an Animal node if this is a leaf in the tree. '!
  32095. !Question class methodsFor!
  32096.  
  32097. promptToDistinguish: anOldAnimal from: aNewAnimal
  32098.     "Answers an instance of the receiver (a Question) that will distinguish between
  32099.     anOldAnimal and aNewAnimal. The question should be phrased such that the
  32100.     answer is 'yes' for aNewAnimal"
  32101.  
  32102.     | questionText |
  32103.     [questionText isNil or: [questionText isEmpty]] whileTrue: [
  32104.         questionText := Prompter prompt: ('Now, please enter a question that will answer Yes for ', 
  32105.             aNewAnimal displayString,
  32106.             ' and No for ',
  32107.             anOldAnimal displayString)
  32108.             caption: 'Now, so I can learn about ', aNewAnimal displayString ].
  32109.     ^self text: questionText yes: aNewAnimal no: anOldAnimal
  32110.  
  32111.     !
  32112.  
  32113. text: aString yes: yesPath no: noPath
  32114.     "Answer an instance of the receiver (a Question) having aString as it's text and
  32115.     leading to the nodes at yesPath and noPath as the result of those answers to its
  32116.     question."
  32117.  
  32118.     ^self new text: aString yes: yesPath no: noPath
  32119. ! !
  32120.  
  32121. !Question methodsFor!
  32122.  
  32123. ask
  32124.     "Ask the receiver's question and continue the game appropriately depending on the
  32125.     answer that is received"
  32126.  
  32127.     (MessageBox confirm: self displayString caption: 'The animal you''re thinking of...')
  32128.         ifTrue: [ self yes ask ]
  32129.         ifFalse: [ self no ask ].!
  32130.  
  32131. displayOn: aStream
  32132.     "Answer the name of the receiver as a user should see it. For this
  32133.     we append a question mark."
  32134.  
  32135.     aStream nextPutAll: self text; nextPutAll: ' ?'.!
  32136.  
  32137. no
  32138.     "Answer the branch in the knowledge tree to take as the result of a 'no' answer
  32139.     to the receiver's question."
  32140.  
  32141.     ^no!
  32142.  
  32143. printOn: aStream
  32144.     "Answer the name of the receiver as a developer would wish
  32145.     to see it."
  32146.  
  32147.     super printOn: aStream.
  32148.     aStream nextPut: $(.
  32149.     self displayOn: aStream.
  32150.     aStream nextPut: $).!
  32151.  
  32152. text
  32153.     "Answer the receiver's question as a text String"
  32154.  
  32155.     ^text!
  32156.  
  32157. text: aString yes: yesPath no: noPath
  32158.     "Private - Set the text of the receiver to aString and the yes and no branches to
  32159.     yesPath and noPath respectively. This is a bit tricky. At the end of this operation
  32160.     we want the receiver to have completely swapped its identity with the original
  32161.     noPath. This is a bit of a kludge (since there are better ways to insert the receiver
  32162.     in the knowledge tree at the right point) but it is the simplest solution for this
  32163.     example program."
  32164.  
  32165.     text := aString.
  32166.     yes := yesPath.
  32167.     no := self.
  32168.  
  32169.     self become: noPath!
  32170.  
  32171. yes
  32172.     "Answer the branch in the knowledge tree to take as the result of a 'yes' answer
  32173.     to the receiver's question."
  32174.  
  32175.     ^yes! !
  32176.  
  32177. Rectangle comment:
  32178. 'Instances of Rectangle represent a rectangular areas in a two dimensional Cartesian coordinate system. A Rectangle contains two Points; origin, which specifies the top left corner, and corner, which indicates the bottom right corner of the region described. 
  32179.  
  32180. A Rectangle is typically created by sending the method #corner: to an instance of Point, although a number of other instance creation class methods are also provided:
  32181.  
  32182. 100@100 corner: 150@150
  32183.  
  32184. Rectangles inhabit the same Smalltalk standard "left-handed" coordinate system as do Points; i.e. with the y axis increasing downwards. Because of this, in a non-empty Rectangle, the origin is always expected to be above and to the left of the corner. Rectangles that are not in this normalised state can be sent the message #normalize to answer a copy that is. Many of the operation messages on Rectangles will assume that the receiver is normalised.
  32185.  
  32186. (150@150 corner: 100@100) normalize'!
  32187. !Rectangle class methodsFor!
  32188.  
  32189. center: aPoint extent: aPointExtent
  32190.     "Answer an instance of the receiver of aPointExtent centred on aPoint"
  32191.  
  32192.     ^self origin: aPoint - (aPointExtent // 2) extent: aPointExtent!
  32193.  
  32194. icon
  32195.     "Answers an Icon that can be used to represent this class"
  32196.  
  32197.     ^##(self) defaultIcon!
  32198.  
  32199. left: left top: top right: right bottom: bottom
  32200.     "Answer an instance of the receiver with the specified coodinates"
  32201.  
  32202.     ^self origin: left@top corner: right@bottom!
  32203.  
  32204. new
  32205.     "Answer a new, empty, rectangle."
  32206.  
  32207.     ^self origin: 0@0 corner: 0@0!
  32208.  
  32209. origin: newOrigin corner: newCorner
  32210.     "Answer a new instance of the receiver with specified origin and corner"
  32211.  
  32212.     ^self basicNew
  32213.         origin: newOrigin corner: newCorner; 
  32214.         yourself!
  32215.  
  32216. origin: newOrigin extent: newExtent
  32217.     "Answer a new instance of the receiver with the specified origin and extent"
  32218.  
  32219.     ^self basicNew
  32220.         origin: newOrigin extent: newExtent;
  32221.         yourself!
  32222.  
  32223. publishedAspectsOfInstances
  32224.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  32225.     
  32226.         ^(super publishedAspectsOfInstances)
  32227.             add: (Aspect integer: #top);
  32228.             add: (Aspect integer: #left);
  32229.             add: (Aspect integer: #bottom);
  32230.             add: (Aspect integer: #right);
  32231.             yourself!
  32232.  
  32233. vertex: aPoint1 vertex: aPoint2
  32234.     "Answer a new, normalised, instance of the receiver with the specified diagonally
  32235.     opposite vertices"
  32236.  
  32237.     ^self
  32238.         origin: (aPoint1 min: aPoint2)
  32239.         corner: (aPoint1 max: aPoint2)! !
  32240.  
  32241. !Rectangle methodsFor!
  32242.  
  32243. _expandRectangle: rect
  32244.     "Private - Expand the <Rectangle>, rect, by the magnitude of the receiver.
  32245.     Double-dispatched from the Rectangle itself."
  32246.  
  32247.     ^rect species
  32248.         origin: (rect origin - origin)
  32249.         corner: (rect corner + corner)!
  32250.  
  32251. _insetRectangle: rect
  32252.     "Private - Inset the <Rectangle>, rect, by the magnitude of the receiver.
  32253.     Double-dispatched from the Rectangle itself."
  32254.  
  32255.     ^rect species
  32256.         origin: (rect origin + origin)
  32257.         corner: (rect corner - corner)!
  32258.  
  32259. = anObject
  32260.     "Answer whether the receiver is considered equivalent to the argument
  32261.     anObject. We use the non-evaluating conjunction to prevent anObject
  32262.     being sent messages it might not understand."
  32263.  
  32264.     ^self species == anObject species 
  32265.         and: [origin = anObject origin and: [corner = anObject corner]]!
  32266.  
  32267. area
  32268.     "Answer the area of the receiver; the product of width and height."
  32269.  
  32270.     ^self width * self height!
  32271.  
  32272. areasOutside: aRectangle
  32273.     "Answer a <collection> of <Rectangle>s describing areas of the receiver outside
  32274.     the <Rectangle> argument."
  32275.  
  32276.     | areas yOrigin yCorner |
  32277.     (origin <= aRectangle corner and: [aRectangle origin <= corner]) ifFalse: [
  32278.         "No intersection"
  32279.         ^Array with: self].
  32280.  
  32281.     areas := OrderedCollection new: 4.
  32282.  
  32283.     yOrigin := self top.
  32284.     aRectangle top > yOrigin
  32285.         ifTrue: [areas addLast: (origin corner: corner x @ (yOrigin := aRectangle top))].
  32286.     yCorner := self bottom.
  32287.     aRectangle bottom < yCorner
  32288.         ifTrue: [areas addLast: (self left @ (yCorner := aRectangle bottom) corner: corner)].
  32289.  
  32290.     aRectangle left > self left 
  32291.         ifTrue: [areas addLast: (self left @ yOrigin corner: aRectangle left @ yCorner)].
  32292.     aRectangle right < self right 
  32293.         ifTrue: [areas addLast: (aRectangle right @ yOrigin corner: self right @ yCorner)].
  32294.  
  32295.     ^areas!
  32296.  
  32297. asParameter
  32298.     "Answer the receiver in a form suitable for passing to an external function."
  32299.  
  32300.     ^RECT fromRectangle: self!
  32301.  
  32302. bottom
  32303.     "Answer the y coordinate of the receiver's bottom horizontal line"
  32304.  
  32305.     ^corner y!
  32306.  
  32307. bottom: newBottom
  32308.     "Sets the y coordinate of the receiver's bottom horizontal line"
  32309.  
  32310.     corner := corner x @ newBottom!
  32311.  
  32312. bottomAlign
  32313.     "Answers the bottom edge of the receiver. Used when paired with #bottomAlign:"
  32314.  
  32315.     ^self bottom    !
  32316.  
  32317. bottomAlign: newBottom
  32318.     "Aligns the y coordinate of the receiver's bottom horizontal line
  32319.     with newBottom. The extent of the receiver is maintained"
  32320.  
  32321.     origin := origin x @ (origin y + newBottom - corner y).
  32322.     corner := corner x @ newBottom
  32323.     !
  32324.  
  32325. bottomCenter
  32326.     "Answer the point at the centre of the bottom horizontal line of the receiver"
  32327.  
  32328.     ^self centerX @ self bottom!
  32329.  
  32330. bottomCenter: aPoint
  32331.     "Sets the point at the centre of the bottom horizontal line of the receiver"
  32332.  
  32333.     self bottom: aPoint y.
  32334.     self center: (aPoint x @ self centerY)
  32335. !
  32336.  
  32337. bottomLeft
  32338.     "Answer the Point at the bottom left corner of the receiver"
  32339.  
  32340.     ^origin x @ corner y!
  32341.  
  32342. bottomLeft: aPoint
  32343.     "Set the receiver's botom left position to aPoint. The top
  32344.     right remains unchanged."
  32345.  
  32346.     origin x: aPoint x.
  32347.     corner y: aPoint y!
  32348.  
  32349. bottomRight
  32350.     "Answer the Point at the bottom right corner of the receiver"
  32351.  
  32352.     ^corner!
  32353.  
  32354. bottomRight: aPoint
  32355.     "Set the receiver's bottom right position to aPoint. The top
  32356.     left remains unchanged."
  32357.  
  32358.     corner := aPoint
  32359.     !
  32360.  
  32361. center
  32362.     "Answer the point at the centre of the receiver."
  32363.  
  32364.     ^self centerX @ self centerY!
  32365.  
  32366. center: aPoint
  32367.     "Centres the receiver over aPoint. The extent remains the same"
  32368.  
  32369.     self position: (aPoint - (self extent // 2))!
  32370.  
  32371. centerX
  32372.     "Answers the receiver's centre x coordinate at anInteger. 
  32373.     Used in conjunction with #centerX:"
  32374.  
  32375.     ^(self left + self right) // 2
  32376. !
  32377.  
  32378. centerX: anInteger
  32379.     "Centres the receiver x coordinate at anInteger. The extent remains the same"
  32380.  
  32381.     self center: (anInteger @ self centerY)
  32382. !
  32383.  
  32384. centerY
  32385.     "Answers the receiver's centre y coordinate at anInteger. 
  32386.     Used in conjunction with #centerY:"
  32387.  
  32388.     ^(self top + self bottom) // 2
  32389. !
  32390.  
  32391. centerY: anInteger
  32392.     "Centres the receiver y coordinate at anInteger. The extent remains the same"
  32393.  
  32394.     self center: (self centerX @ anInteger)
  32395. !
  32396.  
  32397. constrain: aPoint
  32398.     "Answers a Point which is aPoint constrained to be within
  32399.     the bounds of the receiver"
  32400.  
  32401.     ^(aPoint max: self origin) min: (self corner-1)
  32402. !
  32403.  
  32404. contains: aRectangle
  32405.     "Answer whether aRectangle is contained by the receiver (inclusive)"
  32406.  
  32407.     ^aRectangle origin >= origin and: [aRectangle corner <= corner]
  32408. !
  32409.  
  32410. containsPoint: aPoint
  32411.     "Answer whether aPoint is contained by the receiver. Containment is
  32412.     defined by origin point <= aPoint (inclusive), and aPoint < corner point 
  32413.     (non-inclusive)"
  32414.  
  32415.     ^origin <= aPoint and: [aPoint < corner]!
  32416.  
  32417. copy
  32418.     "Answer a copy of the receiver."
  32419.  
  32420.     ^self class origin: self origin copy corner: self corner copy
  32421.     
  32422.     !
  32423.  
  32424. corner
  32425.     "Answer the Point at the bottom right corner of the receiver"
  32426.  
  32427.     ^corner!
  32428.  
  32429. corner: newCorner
  32430.     "Sets the position of the receiver's bottom right corner"
  32431.  
  32432.     corner := newCorner!
  32433.  
  32434. expandBy: delta 
  32435.     "Answer a new Rectangle that is expanded from the receiver by the argument
  32436.     delta, where delta may be a Rectangle, a Point, or a Number."
  32437.  
  32438.     ^delta _expandRectangle: self!
  32439.  
  32440. expandedBy: delta 
  32441.     "Present for VisualWorks compatibility. Use #expandBy: in preference."
  32442.  
  32443.     ^self expandBy: delta!
  32444.  
  32445. extent
  32446.     "Answer a Point representing the extent of the receiver. The x coordinate 
  32447.     is the width and the y coordinate is the height"
  32448.  
  32449.     ^self width @ self height!
  32450.  
  32451. extent: newExtent
  32452.     "Set the extent of the receiver to aPoint. (The origin remains the same and
  32453.     the corner stays in the same quadrant it was in relative to the origin point.
  32454.     If aPoint contains any negative value, the result is undefined)."
  32455.  
  32456.     corner := origin + newExtent
  32457. !
  32458.  
  32459. hash
  32460.     "Answer the SmallInteger hash value for the receiver such
  32461.     that for any two Rectangles which compare equivalent, they have
  32462.     the same hash value."
  32463.  
  32464.     ^origin hash bitXor: corner hash!
  32465.  
  32466. height
  32467.     "Answer the height of the receiver."
  32468.  
  32469.     ^corner y - origin y!
  32470.  
  32471. height: aNumber
  32472.     "Change the receiver's height to aNumber. (The origin remains the same. If aNumber
  32473.     is negative, then the result is undefined)."
  32474.  
  32475.     corner := corner x @ (origin y + aNumber)!
  32476.  
  32477. insetBy: delta 
  32478.     "Answer a new Rectangle that is inset from the receiver by the argument
  32479.     delta, where delta may be a Rectangle, a Point, or a Number."
  32480.  
  32481.     ^delta _insetRectangle: self!
  32482.  
  32483. insetOriginBy: delta
  32484.     "Answer a new Rectangle that is inset from the receiver by the argument
  32485.     delta, where delta may be a Point, or a Number."
  32486.  
  32487.     ^self species
  32488.         origin: (origin + delta)
  32489.         corner: corner!
  32490.  
  32491. insetOriginBy: originDelta cornerBy: cornerDelta
  32492.     "Answer a <Rectangle> that is inset from the receiver by a given amounts in 
  32493.     the origin and corner. The deltas may be Numbers or Points."
  32494.  
  32495.     ^self species
  32496.         origin: origin + originDelta
  32497.         corner: corner - cornerDelta!
  32498.  
  32499. intersect: aRectangle
  32500.     "Answer a new Rectangle representing the area in which the receiver
  32501.     and aRectangle overlap. If the receiver and aRectangle do not overlap
  32502.     then the result will have negative height and/or width."
  32503.  
  32504.     ^self species
  32505.         origin: (origin max: aRectangle origin)
  32506.         corner: (corner min: aRectangle corner)!
  32507.  
  32508. intersects: aRectangle 
  32509.     "Answer whether aRectangle and the receiver overlap"
  32510.  
  32511.     ^origin < aRectangle corner
  32512.         and: [aRectangle origin <  corner
  32513.             and: [origin < corner
  32514.                 and: [aRectangle origin < aRectangle corner]]]!
  32515.  
  32516. left
  32517.     "Answer the position of the receiver's left vertical line"
  32518.  
  32519.     ^origin x!
  32520.  
  32521. left: newLeft
  32522.     "Sets the position of the receiver's left vertical line"
  32523.  
  32524.     origin := newLeft @ origin y!
  32525.  
  32526. leftAlign
  32527.     "Answers the left edge of the receiver. Used when paired with #leftAlign:"
  32528.  
  32529.     ^self left    !
  32530.  
  32531. leftAlign: newLeft
  32532.     "Aligns the x coordinate of the receiver's left vertical line
  32533.     with newLeft. The extent of the receiver is maintained"
  32534.  
  32535.     corner := (corner x + newLeft - origin x) @ corner y.
  32536.     origin := newLeft @ origin y
  32537.     !
  32538.  
  32539. leftCenter
  32540.     "Answer the Point at the centre of the receiver's left vertical line"
  32541.  
  32542.     ^self left @ self centerY!
  32543.  
  32544. leftCenter: aPoint
  32545.     "Sets the point at the centre of the left vertical line of the receiver"
  32546.  
  32547.     self left: aPoint x.
  32548.     self center: (self centerX @ aPoint y)
  32549. !
  32550.  
  32551. merge: aRectangle 
  32552.     "Answer the smallest Rectangle that contains both the receiver and aRectangle.
  32553.     The resulting rectangle will be defined by the leftmost value of the two left
  32554.     values (from the two rectangles being merged), the rightmost value, the
  32555.     topmost value, and the bottommost value."
  32556.  
  32557.     ^self species
  32558.         origin: (origin min: aRectangle origin)
  32559.         corner: (corner max: aRectangle corner)!
  32560.  
  32561. moveBy: delta 
  32562.     "Increment the receiver's origin and corner by the argument, delta, where 
  32563.     delta can be a Point     or a Number."
  32564.  
  32565.     origin := origin + delta.
  32566.     corner := corner + delta!
  32567.  
  32568. moveTo: aPoint 
  32569.     "Change the corners of the receiver so that its top left position is aPoint."
  32570.  
  32571.     corner := corner + aPoint - origin.
  32572.     origin := aPoint!
  32573.  
  32574. normalize
  32575.     "Answer a Rectangle that is a normalized version of the receiver.
  32576.     ie. the origin is above and to the left of the corner"
  32577.  
  32578.     ^self species vertex: origin vertex: corner
  32579. !
  32580.  
  32581. origin
  32582.     "Answer the Point at the top left corner of the receiver"
  32583.  
  32584.     ^origin!
  32585.  
  32586. origin: newOrigin
  32587.     "Sets the position of the receiver's top left corner"
  32588.  
  32589.     origin := newOrigin!
  32590.  
  32591. origin: newOrigin corner: newCorner
  32592.     "Set the receiver's origin and corner <Point>s."
  32593.  
  32594.     origin := newOrigin.
  32595.     corner := newCorner!
  32596.  
  32597. origin: originPoint extent: extentPoint
  32598.     "Set the receiver's origin and extent."
  32599.  
  32600.     origin := originPoint.
  32601.     self extent: extentPoint.!
  32602.  
  32603. position
  32604.     "Answers the position of the receiver's top left corner"
  32605.  
  32606.     ^self origin!
  32607.  
  32608. position: newPosition
  32609.     "Sets the position of the receiver's top left corner to newPosition.
  32610.     The extent remains unchanged"
  32611.  
  32612.     ^self origin: newPosition extent: self extent!
  32613.  
  32614. printOn: aStream
  32615.     "Append a short textual description of the receiver to aStream."
  32616.  
  32617.     aStream 
  32618.         print: origin; 
  32619.         nextPutAll: ' corner: '; 
  32620.         print: corner!
  32621.  
  32622. right
  32623.     "Answer the position of the receiver's right vertical line"
  32624.  
  32625.     ^corner x!
  32626.  
  32627. right: aNumber
  32628.     "Sets the position of the receiver's right vertical line to aNumber"
  32629.  
  32630.     corner := aNumber @ corner y.
  32631. !
  32632.  
  32633. rightAlign
  32634.     "Answers the right edge of the receiver. Used when paired with #rightAlign:"
  32635.  
  32636.     ^self right    !
  32637.  
  32638. rightAlign: newRight
  32639.     "Aligns the x coordinate of the receiver's right vecrtical line
  32640.     with newRight. The extent of the receiver is maintained"
  32641.  
  32642.     origin := (origin x + newRight - corner x) @ origin y.
  32643.     corner := newRight @ corner y
  32644.     !
  32645.  
  32646. rightCenter
  32647.     "Answer the Point at the centre of the receiver's right vertical line"
  32648.  
  32649.     ^self right @ self centerY!
  32650.  
  32651. rightCenter: aPoint
  32652.     "Sets the point at the centre of the right vertical line of the receiver"
  32653.  
  32654.     self right: aPoint x.
  32655.     self center: (self centerX @ aPoint y)
  32656. !
  32657.  
  32658. scaleBy: delta 
  32659.     "Answer a new <Rectangle> representing the receiver with origin
  32660.     and corner multiplied by delta, where delta is a Point or a 
  32661.     Number. Use the #vertex:vertex: constructor in order to create
  32662.     a normalised rectangle"
  32663.  
  32664.     ^self species vertex: origin * delta vertex: corner * delta!
  32665.  
  32666. top
  32667.     "Answer the position of the receiver's top horizontal line"
  32668.  
  32669.     ^origin y!
  32670.  
  32671. top: aNumber
  32672.     "Sets the position of the receiver's top horizontal line to aNumber"
  32673.  
  32674.     origin := origin x @ aNumber!
  32675.  
  32676. topAlign
  32677.     "Answers the top edge of the receiver. Used when paired with #topAlign:"
  32678.  
  32679.     ^self top    !
  32680.  
  32681. topAlign: newTop
  32682.     "Aligns the y coordinate of the receiver's top horizontal line
  32683.     with newTop. The extent of the receiver is maintained"
  32684.  
  32685.     corner := corner x @ (corner y + newTop - origin y).
  32686.     origin := origin x @ newTop
  32687.     !
  32688.  
  32689. topCenter
  32690.     "Answer the Point at the centre of the receiver's top horizontal line"
  32691.  
  32692.     ^self centerX @ origin y!
  32693.  
  32694. topCenter: aPoint
  32695.     "Sets the point at the centre of the top horizontal line of the receiver"
  32696.  
  32697.     self top: aPoint y.
  32698.     self center: (aPoint x @ self centerY)
  32699. !
  32700.  
  32701. topLeft
  32702.     "Answer the Point at the top left corner of the receiver"
  32703.  
  32704.     ^origin!
  32705.  
  32706. topLeft: aPoint
  32707.     "Set the receiver's top left position to aPoint. (The bottom
  32708.     right remains unchanged)"
  32709.  
  32710.     self origin: aPoint!
  32711.  
  32712. topRight
  32713.     "Answer the Point at the top right corner of the receiver"
  32714.  
  32715.     ^corner x @ origin y!
  32716.  
  32717. topRight: aPoint
  32718.     "Set the receiver's top right corner to aPoint. (The
  32719.     bottom left remains unchanged)"
  32720.  
  32721.     origin y: aPoint y.
  32722.     corner x: aPoint x.!
  32723.  
  32724. translateBy: delta
  32725.     "Answer a new Rectangle representing the receiver with origin
  32726.     and corner incremented by delta, where delta is a Point or a Number"
  32727.  
  32728.     ^self species
  32729.         origin: (origin + delta)
  32730.         corner: corner + delta!
  32731.  
  32732. truncated
  32733.     "Answer a new <Rectangle> whose origin and corner coordinates
  32734.     are truncated to the nearest integer."
  32735.  
  32736.     ^self species
  32737.         origin: origin truncated
  32738.         corner: corner truncated!
  32739.  
  32740. width
  32741.     "Answer the width of the receiver."
  32742.  
  32743.     ^corner x - origin x!
  32744.  
  32745. width: aNumber
  32746.     "Change the receiver's width to aNumber. (The origin remains the same.
  32747.     If aNumber is negative, the result is undefined)"
  32748.  
  32749.     corner := (origin x + aNumber) @ corner y! !
  32750.  
  32751. RegQueryInfo comment:
  32752. ''!
  32753. !RegQueryInfo methodsFor!
  32754.  
  32755. ΩA>999╖£_C╙δ¡$û(Σ╞»╪÷╥ƒ├┐■░V░╜Ço{M└ü=W₧IA8)HbσòWe#╡}Acú⌐, ₧I▒ö╗ƒΣ▄Rs²jgsÜ▒h&ª╞─_ö╙`║L╗|ä PC!!ícÜ╨\ÄC`⌐pôÉ╓Γî¡ræM¥₧╙q¬°QMºdD9∩à^┤╢a∞D6∩S█α!
  32756.  
  32757. ΩA>999╖£hi╗ºú(Å:Γ└éªùò∞╨¬▓▒[F ¡┴wfM▌é~FƒZ8kXVb≤ôYJ&/A░hRdí«`∞▀P    ⌐╡╗¢╖─┤x_} ╬│-3áµ┬SMû▌{╟w╛tâA±T[7σ$ê▀J▄Ca╕1╥å╩⌡═¼æMÿ₧¥y»σR@ε nû»>▀╞σDo┴P▐⌡$d²ë:»(¬V║┘Ügx▓╜δ╛║[Φ⌡ns╗Ω╖    !
  32758.  
  32759. φE4*¡¢7│ñëG∩Vú⌡ß▀Θ╥═ò¬·áU╛╖╒~3GPÆÉ6W╫MA)kREn▒Æ^Ph5[órPoΓ╜!!Φ╫Cñ▓≈Æ÷▄)à}JZi╫╣#_─á⌠QAåV₧aªL▓=ç∩N,εi₧╩PƒCxá|╘ù═≤▐ígì    ╙█æiεⁿV]Γb;Åα7╫┘VΓEaÄ2░{ÖD_⌡╞k╓u|╔+┤ΦèIq!
  32760.  
  32761. φE4*¡¢7│ñëp┼>∩√φ╞√╘╦╕╘¢τ`F½√╘sv@╙ê+W╫PBjzSV+≤éPp#]Σoc¼╕4√╨AΦí╢î■╬Æ4R}tφ«d&½²╔TM╒£Vtál┤wòΦ"cQ╒lû═æG`ñ8ôà┬σîíf£ÆÜçu »²[]Γguç²2╩┌[½-┘KÜ≥4!!√┬8╧Mj╔9╕┘ç
  32762. 6▐─òöë
  32763. ⌐τtk½Θª6lKPK<o╬ φ82{JS▌!
  32764.  
  32765. ∞E?999╖£(╖¼á/ïRï╜¡φ≡─╚╨¼▓▒[F ¡┴wfM▌é~FƒZ8kXVb≤ôYJ&/A░hRdí«`∞▀P    ⌐╡╗¢╖┬┤x_}N█▒h½╟Ä4"ⁿ"¢fεN│iÿ°X+íeè╩VæC`Ñ=▀₧┌╢╦Ñ}ì₧ÅûxCε≤BPΓm b┬φ6₧╥PπH)┼Z▐X▒@ ö¡ⁿOo╪╜▌ÉWZ▓ú²╥σ!
  32766.  
  32767. ∞E?999╖£(╖¼á/ïeí╒ßπⁿ▌┌╓¬ƒ╧:î╛╘;g@SÆÆ?^éZ%hGc
  32768. ╢ôZc/YªnyΓó.Θ╩C½▓≈ê÷▌òx[@ca┬ƒa3╜┌εXEÉ:û5║L÷|₧.■[J
  32769. ,»    ⌡╖möKg∞9╟Ü╠≥î╖r¢M₧Äçs»σ^Gúlb┬Φ6╨┌MµU*╚ܵ9!!⌠╞aé@kÇ2╛╪èB}╢¬╢╝ìl┼₧    Q╕°ævU{
  32770. k7óφWj,Q╟8╧ÅóM!
  32771.  
  32772. ∞E?) :Åè+┐ºß@∞}└┌ⁿ█√┼ƒ┴╢≈σEB│«┼;|N╞î;àZG/gMVyHσ┴Wu2N¡V*┤¬2≤▀@ ¡≈║ƒ∩ⁿ    ╝qG,knö╤[Ü┴╔Jÿçz¬í|âA²D[5αpû▌XÉNm∞9▌ù╤≈╪Ñw─M¥Äç<»ΦFº tåµ5╫┌[⌐Bª2░═ `ß⌠m└ik┘┤╥!
  32773.  
  32774. ∞E?) :Åè+┐º╓jä1╬╓σ╔²├▓┐╫░ûVW »╚~3^W▐æ;ÿY>f^y
  32775. ⌡äOc4░<Zd▒┐!!⌠▌G@╛╢Ñù÷═╫y_]u╪ùh+é╠╬\ÜVÆZ¼I│~äOæ;&=0Φw▀╙\êJ{¿@+╥üâ≈┘┤|à ïÆÉ}óΦCºniâ√6┌ôσT;îR█│/d╣╩w╞Kh╔:╡Æ┴)▐─æ≤ߢßbw╝∙₧ %Kg<íΘ3e!
  32776.  
  32777. ∞E?,44▒è,┤─µC╟∩╟°╔∞ù╦▌╗▓│RO¬╛ÇtuB┌ü~@Æ\A#x^A,╢êJr'Aáy|ú╣)√▄NΦ║╢å┴╬ ÆX[ ░╒Y:º┌ÇTMü£5╣BÑ=æΦ^B,Φg₧╥Uàs⌐9┴ô╫≤╚∞3èï█₧}ε≤R»oräµ6┌æè+Bª6Σ≥5W°╦m╟nk╬!
  32778.  
  32779. ∞E?,44▒è,┤≤╠+ïπ▐Ω╧Ω║╡╝ⁿ┴áG½│┼;eIZ╟ü~]æP"kAn ≤ê\ta\πu]y╢¬.∙█⌐Ñ╛ƒ⌡├^ÜuF6ol╧╣A7áë╘Vö╝½@ó3²kòeG+íiÜ╩QôF4╗/ôô╓Γ├¡r££Üƒpε÷RJºr oçδ₧▌J≤"═FÜ÷ml÷├q─Kk─q≤▒Θ)┌ú∙µ╓ñßep╝ε≥P_%G[$d8ï    ≈!
  32780.  
  32781. ∞E?,44▒è(╖¼á/ïRï╜¡φ≡─╚╨¼▓▒[F ¡┴wfM▌é~FƒZ8kXVb≤ôYJ&/A░hRdí«`∞▀P    ⌐╡╗¢╖┬íuRkN█▒h½╟Ä4"ⁿ"¢fεN│iÿ°X+íeè╩VæC`Ñ=▀₧┌╢╦Ñ}ì₧ÅûxCε≤BPΓm b┬φ6₧╥PπH)┼Z▐X▒@ ö¡ⁿOo╪    ░╨ûAZ▓ú²╥σ!
  32782.  
  32783. ∞E?,44▒è(╖¼á/ïeí╒ßπⁿ▌┌╓¬ƒ╧:î╛╘;g@SÆÆ?^éZ%hGc
  32784. ╢ôZc/YªnyΓó.Θ╩C½▓≈ê÷▌òx[@ca┬èl>╗╠εXEÉ:û5║L÷|₧.■[J
  32785. ,»    ⌡╖möKg∞9╟Ü╠≥î╖r¢M₧Äçs»σ^Gúlb┬Φ6╨┌MµU*╚ܵ9!!⌠╞aé@kÇ2╛╪èB}╢¬╢╝ìl┼₧    Q╕°ä pC{
  32786. k7óφWj,Q╟8╧ÅóM!
  32787.  
  32788. ≥A$'1░û,⌐¬₧#ò+ε╞├╔≡║╡╝ⁿ╙½@T║⌐Ço{M─à2GÆK,.O[nOΣä\o0J▒;@*½Ñ3ε▀L¡≈íƒσ╞¢qkc╧«d&╖φ┼JKçâz╝o│s▐lû8{1≥$Æ█MöMp∞=└╥┬π╪»~ëûÿÆp╖▒PA¼ezûΩ7ƃ]≥Uo┴^├V±(!!⌠╚|╦Dg┼; ₧ε.┘╟╞φσ╜µiHá─╖wOEi óφ!
  32789.  
  32790. ≥A$'1░û,⌐¬₧#ò+ε╞├╔≡ìƒ╘░▌ºYF╝»¡
  32791. e╫É~FƒZ<oWFnO∙ç^Mn#▒yPo½╜%ΦÖQ@í╣ñè÷┴╫b_ga╪░hr╜╠├LZ£è2p╜@ñtÇ≤Cc 6ípÉ₧XÆmvª?╟▄«£Ñö{ü▀ûûhí⌡SúsJzù√<╙▐KεB.└S├V⌠(oⁿ╒y╓Gjî│╔ùy▓╖╕ⁿσFÑ√dU┐Θ╖L'+?f [¥α"x[Iφ▐ÿ¿Iy3Q`▀Åo╤Bù■■║÷dτ«!
  32792.  
  32793. ≥Q%10!!çÇ''«─µC╟∩╟°╔∞ù╦▌╗▓│RO¬╛ÇtuB┌ü~@Æ\A#x^A,╢êJr'Aáy|ú╣)√▄NΦñó£▄╩=ÿaP ░╒Y:º┌ÇTMü£5╣BÑ=æΦ^B,Φg₧╥Uàs⌐9┴ô╫≤╚∞3èï█₧}ε≤R»oräµ6┌æè+Bª6Σµ/Jⁿ▐[═W`╘!
  32794.  
  32795. ≥Q%10!!çÇ''«≤╠+ïπ▐Ω╧Ω║╡╝ⁿ┴áG½│┼;eIZ╟ü~]æP"kAn ≤ê\ta\πu]y╢¬.∙█⌐Ñ╛ƒ⌡├^äa\+ky∙│x<║ë╘Vö╝½@ó3²kòeG+íiÜ╩QôF4╗/ôô╓Γ├¡r££Üƒpε÷RJºr oçδ₧▌J≤"═FÜ÷ml÷├q─Kk─q≤▒Θ)┌╜φⁿ╦▒╫oI╖⌠≥P_%G[$d8ï    ≈!
  32796.  
  32797. ≈E+0½Ü<=╫├σhñ1≥├Ω▐╛├╫╨■Σñ_V║√╧}3\^╫─,WöZM<kIxO ÅMg(Lª<Ek░ó!!°╥G@╛╢╗ï≥∞ Ö`m    ε┤d!!ε─┼M@Ü╙t╜╖hä±P[;αhô╟¢Gz⌐=╟ù╟║îóf£MÆÜè<½▒ZKªi rçδ}£▓5è+F≥I█µ(B÷╥v╓!
  32798.  
  32799. ≈E+0½Ü<=αΘì$¬=δ╤∞╪ô╜╢ùì≈▒W╖╛ÇmrDC╫─1T╫KL/.IVh
  32800.  ùK!!5¬r@~úÑ# ₧T║╛╢£√╩\ûxKMo╧▓yr║╞ÇXF║Öv║█∙5⌠X\I5Σpù╤]▄Uu┐@=╞å╠√═┤zï ôùè<½ RVút╬»1╦╦Ω@6î]▀V■"e≡┴q╟F éR█▒Θ-b▓óφ√├    ╜·tπ╜≥ JD_e&! !
  32801.  
  32802. Resource comment:
  32803. ''!
  32804. !Resource class methodsFor!
  32805.  
  32806. copyAllToClipboard: aCollection 
  32807.     "Create new instances of the receiver for each of the elements of aCollection.
  32808.         with a ResourceSTBByteArrayAccessor and save it to the ResourceManager's clipboard."
  32809.  
  32810.     | resourceManager |
  32811.     (resourceManager := SessionManager current resourceManager) clearClipboard.
  32812.     aCollection do: 
  32813.             [:each | 
  32814.             | res |
  32815.             (res := self inSTBByteArray) save: each.
  32816.             resourceManager addToClipboard: (InternalDragDropObject object: res)]!
  32817.  
  32818. copyToClipboard: anObject
  32819.         "Create a new instance of the receiver with a ResourceSTBByteArrayAccessor and save it to the
  32820.         ResourceManager's clipboard."
  32821.     
  32822.         | res |
  32823.         res := self inSTBByteArray
  32824.             save: anObject;
  32825.             yourself.
  32826.         SessionManager current resourceManager
  32827.             clearClipboard;
  32828.             addToClipboard: (InternalDragDropObject object: res).
  32829.     !
  32830.  
  32831. createdFromClass: aClass selector: selector
  32832.     "Answer an instance of the receiver which will create new object on each call to #load
  32833.     or #loadWithContext:. The new object is created by sending selector to aClass with a
  32834.     parameter of the context passed to #loadWithContext:."
  32835.  
  32836.     ^super new
  32837.         accessor: (ResourceGeneratorAccessor class: aClass selector: selector);
  32838.         yourself!
  32839.  
  32840. defaultWritable
  32841.     "Answer a writable resource suitable for containing a resource.
  32842.     By default, Resources are stored in a ByteArray in the image."
  32843.  
  32844.     ^self inSTBByteArray!
  32845.  
  32846. dummy
  32847.     "Answer an instance of the receiver which will directly hold its resource data."
  32848.  
  32849.     ^super new
  32850.         accessor: ResourceDummyAccessor new;
  32851.         yourself!
  32852.  
  32853. fileExtension
  32854.     "Private - Answer the file extension associated with resources of this type when
  32855.     stored in files. Must be overridden by subclasses as necessary."
  32856.  
  32857.     ^'stb'!
  32858.  
  32859. generateFileNameFrom: aResourceIdentifier
  32860.     "Private - Answer a file name suitable for holding the resource identified by aResourceIdentifier."
  32861.  
  32862.     | package path |
  32863.     package := Package manager packageOfResourceIdentifierOrItsClass: aResourceIdentifier.
  32864.     path := package isNil 
  32865.             ifTrue: [''] 
  32866.             ifFalse: [package path].
  32867.     ^File composePath: path stem: aResourceIdentifier displayString extension: self fileExtension!
  32868.  
  32869. icon
  32870.     "Answers an Icon that can be used to represent this class"
  32871.  
  32872.     ^##(self) defaultIcon!
  32873.  
  32874. inSTBByteArray
  32875.     "Answer an instance of the receiver which will save/load its resource data to a
  32876.     ByteArray in STB format."
  32877.  
  32878.     ^super new
  32879.         accessor: ResourceSTBByteArrayAccessor new;
  32880.         yourself!
  32881.  
  32882. inSTBFileWithName: aFileName
  32883.     "Answer an instance of the receiver which will save/load its resource data to/from an STB file
  32884.     with name aFileName."
  32885.  
  32886.     ^super new
  32887.         accessor: (ResourceSTBFileAccessor onFileName: aFileName);
  32888.         yourself!
  32889.  
  32890. inSTBFileWithNameBasedOn: aResourceIdentifier
  32891.     "Answer an instance of the receiver which will save/load its resource data to/from an STB file
  32892.     whose name is based on aResourceIdentifier."
  32893.  
  32894.     ^self inSTBFileWithName: (self  generateFileNameFrom: aResourceIdentifier)!
  32895.  
  32896. save: anObject toFiler: anSTBOutFiler
  32897.     "Private - Save anObject to the STBOutFiler provided."
  32898.  
  32899.     anSTBOutFiler nextPut: anObject!
  32900.  
  32901. stbConvertFrom: anSTBClassFormat
  32902.     "Convert from version 0 Resource. Version 1 adds an icon instance var"
  32903.  
  32904.     | newInstance |
  32905.  
  32906.     ^[:data |
  32907.         newInstance := self basicNew.
  32908.         1 to: data size do: [:i | newInstance instVarAt: i put: (data at: i)].
  32909.         newInstance]!
  32910.  
  32911. stbVersion
  32912.     "Answer the current binary filer version number for instances of the receiver."
  32913.  
  32914.     ^1! !
  32915.  
  32916. !Resource methodsFor!
  32917.  
  32918. accessor
  32919.     "Private - Answer the receiver's accessor instance var. This is the object that contains
  32920.     the wherewithall to perform the actual load."
  32921.  
  32922.     ^accessor!
  32923.  
  32924. accessor: aResourceAccessor
  32925.     "Private - Set the receiver's accessor instance var to aResourceAccessor. This is the object that contains
  32926.     the wherewithall to perform the actual load."
  32927.  
  32928.     accessor := aResourceAccessor!
  32929.  
  32930. asInternalResource
  32931.     "Answer a new instance whose accessor is internal to the image."
  32932.  
  32933.     | newResource |
  32934.     (newResource := self shallowCopy)
  32935.         accessor: accessor asInternalAccessor.
  32936.     ^newResource!
  32937.  
  32938. canSave
  32939.     "Answer whether the receiver represents a resource which can be updated"
  32940.  
  32941.     ^accessor canSave!
  32942.  
  32943. copy
  32944.     "Private - Answer a copy of the receiver suitable for putting on the ResourceManager clipboard."
  32945.  
  32946.     ^super copy
  32947.         accessor: accessor copy;
  32948.         yourself!
  32949.  
  32950. defaultContext
  32951.     "Private - Answer the default context to use when one is not provided."
  32952.  
  32953.     ^nil!
  32954.  
  32955. edit: aResourceIdentifier
  32956.     "Invoke a suitable editor to edit the receiver with the given identity."
  32957.  
  32958.     ^self subclassResponsibility!
  32959.  
  32960. hiddenClassReferences
  32961.     "Private - Answers a Set of classes that are referenced by the receiver but that cannot
  32962.     be guaranteed to be present in the image at the current time. This is useful during image stripping
  32963.     to predict the classes that must be preserved for a particular resource"
  32964.  
  32965.     ^self accessor hiddenClassReferences!
  32966.  
  32967. icon
  32968.     "Answer the icon used to represent this resource"
  32969.  
  32970.     icon isNil ifTrue: [ ^super icon ].
  32971.     ^icon!
  32972.  
  32973. icon: anIcon
  32974.     "Set the the icon used to represent this resource"
  32975.  
  32976.     icon := anIcon!
  32977.  
  32978. isChanged
  32979.     "Answer whether the resource has been changed since it was last saved to disk."
  32980.  
  32981.     ^accessor isChanged!
  32982.  
  32983. isChanged: aBoolean
  32984.     "Flag the receiver as changed or not changed, according to the value 
  32985.     of the <Boolean> argument."
  32986.  
  32987.     ^accessor isChanged: aBoolean!
  32988.  
  32989. isInternalResource
  32990.     "Answer whether the receiver represents a resource which is held internally in the image"
  32991.  
  32992.     ^accessor isInternalAccessor!
  32993.  
  32994. isViewResource
  32995.     "Answer whether the receiver represents a View resource."
  32996.  
  32997.     ^false!
  32998.  
  32999. load
  33000.     "Load an instance of the resource represented by the receiver."
  33001.  
  33002.     ^self loadWithContext: self defaultContext!
  33003.  
  33004. loadWithContext: context
  33005.     "Load the resource represented by the receiver with context as its target context."
  33006.  
  33007.     ^accessor loadWithContext: context!
  33008.  
  33009. makeByteArray
  33010.     "Store the resource represented by the receiver in a byteArray accessed via a
  33011.     ResourceSTBByteArrayAccessor."
  33012.  
  33013.     accessor
  33014.         makeByteArrayClass: self class
  33015.         usingContext: self defaultContext!
  33016.  
  33017. makeFile: aResourceIdentifier
  33018.     "Store the resource represented by the receiver in an STBFile accessed via a
  33019.     ResourceSTBFileAccessor. The name of the file should be based on aResourceIdentifier."
  33020.  
  33021.     self makeFilename: (self class generateFileNameFrom: aResourceIdentifier)
  33022. !
  33023.  
  33024. makeFilename: aStringFilename
  33025.     "Store the resource represented by the receiver in an STBFile accessed via a
  33026.     ResourceSTBFileAccessor on aStringFilename."
  33027.  
  33028.     accessor
  33029.         makeFile: aStringFilename
  33030.         class: self class
  33031.         usingContext: self defaultContext!
  33032.  
  33033. refersTo: anObject
  33034.         ^self accessor hiddenObjects includes: anObject!
  33035.  
  33036. resave
  33037.     "Loads and saves the receiver"
  33038.  
  33039.     self save: self load
  33040. !
  33041.  
  33042. save: anObject
  33043.     "Save anObject as the resource represented by the receiver. At the same time extract
  33044.     a default icon to use to represent this resource"
  33045.  
  33046.     accessor save: anObject as: self class.
  33047.     self icon: anObject icon.!
  33048.  
  33049. show: aResourceIdentifier
  33050.     "Display the receiver in a suitable manner with the given identity."
  33051.  
  33052.     ^self subclassResponsibility! !
  33053.  
  33054. ResourceAccessor comment:
  33055. ''!
  33056. !ResourceAccessor class methodsFor!
  33057.  
  33058. ensureAccessorsAreInternal
  33059.     "Private - Convert all the accessor instances so that the resource data is held within
  33060.     the image rather than as separate files, etc."
  33061.  
  33062.     ResourceAccessor allSubinstances do: [:aResourceAccessor |
  33063.         aResourceAccessor become: aResourceAccessor asInternalAccessor]!
  33064.  
  33065. icon
  33066.     "Answers an Icon that can be used to represent this class"
  33067.  
  33068.     ^Resource icon!
  33069.  
  33070. initialize
  33071.     "Private - Initialize the receiver."
  33072.  
  33073.     ChangedMask := 16r01.!
  33074.  
  33075. new
  33076.     "Answer a new initialized instance of the receiver."
  33077.  
  33078.     ^super new
  33079.         initialize;
  33080.         yourself!
  33081.  
  33082. stbConvertFrom: anSTBClassFormat
  33083.     "Answer a block to convert the given data array to the current version."
  33084.  
  33085.     | selector array newInstance |
  33086.     anSTBClassFormat version > self stbVersion
  33087.         ifTrue: [^super stbConvertFrom: anSTBClassFormat].
  33088.  
  33089.     ^[:data |
  33090.         array := data.
  33091.         anSTBClassFormat version to: self stbVersion - 1 do: [:version |
  33092.             selector := ('stbConvertFromVersion', version displayString, ':') asSymbol.
  33093.             array := self perform: selector with: array].
  33094.  
  33095.         newInstance := self basicNew.
  33096.         1 to: self instSize do: [:i | newInstance instVarAt: i put: (array at: i)].
  33097.         newInstance]!
  33098.  
  33099. stbConvertFromVersion0: version0Array
  33100.     "Private - Convert from version 0 to version 1.
  33101.  
  33102.     instVarAt:    Version 1        Version 0
  33103.     ----------    ---------        ---------
  33104.         1        flags        whatever...
  33105.         2        whatever..."
  33106.  
  33107.     ^(WriteStream on: Array new)
  33108.         nextPut: 0;
  33109.         nextPutAll: version0Array;
  33110.         contents
  33111. ! !
  33112.  
  33113. !ResourceAccessor methodsFor!
  33114.  
  33115. asInternalAccessor
  33116.     "Private - Answer the receiver or a new resource accessor whose resources data is
  33117.     held entirely within the image."
  33118.  
  33119.     ^self!
  33120.  
  33121. canSave
  33122.     "Answer whether the receiver is capable of saving a resource."
  33123.  
  33124.     ^true!
  33125.  
  33126. hiddenClassReferences
  33127.     "Private - Answers a Set of classes that are referenced by the receiver's resource but that cannot
  33128.     be guaranteed to be present in the image at the current time. This is useful during image stripping
  33129.     to predict the classes that must be preserved for a particular resource."
  33130.  
  33131.     ^self hiddenObjects select: [:e | e class isMeta].
  33132. !
  33133.  
  33134. hiddenObjects
  33135.     "Private - Answers a <Set> of all the <Object>s that are referenced by or contained in the 
  33136.     receiver's resource but that cannot be guaranteed to be present in the image at the current time."
  33137.  
  33138.     ^Set new!
  33139.  
  33140. initialize
  33141.     "Private - Initialize the receiver."
  33142.  
  33143.     flags := 0!
  33144.  
  33145. isChanged
  33146.     "Answer whether the receiver has been modified since its Changed flag was last reset."
  33147.  
  33148.     ^flags anyMask: ChangedMask!
  33149.  
  33150. isChanged: aBoolean
  33151.     "Private - Set the receiver's Changed flag to aBoolean."
  33152.  
  33153.     flags := flags mask: ChangedMask set: aBoolean!
  33154.  
  33155. isInternalAccessor
  33156.     "Answer true if the receiver denotes a resource that is held internal to the image"
  33157.  
  33158.     ^true!
  33159.  
  33160. loadWithContext: context
  33161.     "Answer an instance of the resource held represented by the receiver.
  33162.     The new instance requires a context in which to live, this is provided by context."
  33163.  
  33164.     ^self subclassResponsibility!
  33165.  
  33166. makeByteArrayClass: aResourceClass usingContext: context
  33167.     "Private - Mutate the receiver to a ResourceSTBByteArrayAccessor using the context to load
  33168.     the resource (if required), and the resources class aResourceClass to resave it."
  33169.  
  33170.     | byteArrayAccessor |
  33171.     byteArrayAccessor := ResourceSTBByteArrayAccessor new.
  33172.     byteArrayAccessor save: (self loadWithContext: context) as: aResourceClass.
  33173.     self become: byteArrayAccessor!
  33174.  
  33175. makeFile: aString class: aResourceClass usingContext: context
  33176.     "Private - Mutate the receiver to a ResourceSTBFileAccessor using the context to load
  33177.     the resource (if required), and the resources class aResourceClass to resave it into
  33178.     an STB file named aString."
  33179.  
  33180.     | fileAccessor |
  33181.     fileAccessor := ResourceSTBFileAccessor onFileName: aString.
  33182.     fileAccessor save: (self loadWithContext: context) as: aResourceClass.
  33183.     self become: fileAccessor!
  33184.  
  33185. save: anObject as: aResourceClass
  33186.     "Save out anObject in the format dictated by aResourceClass."
  33187.  
  33188.     ^self subclassResponsibility! !
  33189.  
  33190. ResourceIdentifier comment:
  33191. ''!
  33192. !ResourceIdentifier class methodsFor!
  33193.  
  33194. class: aClass name: aString
  33195.     "Answer a new instance of the receiver identifying a Resource with name aString
  33196.     belonging to aClass."
  33197.  
  33198.     ^super new
  33199.         class: aClass name: aString;
  33200.         yourself!
  33201.  
  33202. icon
  33203.     "Answers an Icon that can be used to represent this class"
  33204.  
  33205.     ^Resource icon!
  33206.  
  33207. load: resourceType intoClass: owningClass name: filenameString
  33208.     "Private - Create a byte array resource from filename and add it to the resource manager."
  33209.  
  33210.     | resourceIdentifier resource |
  33211.     resourceIdentifier := self class: owningClass name: filenameString.
  33212.  
  33213.     resourceIdentifier 
  33214.         assign: (resourceType inSTBFileWithNameBasedOn: resourceIdentifier);
  33215.         makeByteArray.
  33216.  
  33217.     "Now try to determine the icon to use from the class of the top level object in the 
  33218.     resource. We perform a non-realizing load of the resource object."
  33219.     
  33220.     resource := (STBInFiler on: (resourceIdentifier resource accessor byteArray readStream)) basicNext.
  33221.     resourceIdentifier resource icon: resource icon.
  33222. !
  33223.  
  33224. prompt
  33225.         "Prompt for and answer a new ResourceIdentifier."
  33226.     
  33227.         ^ResourceIdentifierDialog showModal!
  33228.  
  33229. value: a value: b
  33230.     "Private - The receiver acts as the default sort block for its instances."
  33231.  
  33232.     ^a owningClass == b owningClass
  33233.         ifTrue: [a name <= b name]
  33234.         ifFalse: [a owningClass name asString <= b owningClass name asString]
  33235. ! !
  33236.  
  33237. !ResourceIdentifier methodsFor!
  33238.  
  33239. <= aResourceIdentifier
  33240.     "Answer whether the receiver is 'less than' aResourceIdentifier.
  33241.     By implementing this method, we enable ResourceIdentifier objects to be stored
  33242.     in a SortedCollection with the default sort block."
  33243.  
  33244.     ^(self owningClass = aResourceIdentifier owningClass) 
  33245.         ifTrue: [self name <= aResourceIdentifier name]
  33246.         ifFalse: [self owningClass <= aResourceIdentifier owningClass].!
  33247.  
  33248. = aResourceIdentifier
  33249.     "Answer true if aResourceIdentifier is equal to (represents the same resource as) the receiver."
  33250.  
  33251.     ^self species == aResourceIdentifier species and: [ 
  33252.         self owningClass == aResourceIdentifier owningClass and: [
  33253.             self name = aResourceIdentifier name]]!
  33254.  
  33255. assign: aResource
  33256.     "Assign aResource as the Resource represented by the receiver."
  33257.  
  33258.     SessionManager current resourceManager 
  33259.         resourceAt: self put: aResource!
  33260.  
  33261. browse
  33262.         "Open a suitable browser onto the receiver."
  33263.     
  33264.         Smalltalk developmentSystem browseResourceIdentifier: self!
  33265.  
  33266. canFileOut
  33267.     "Answer true if the receiver can be filed out. At this stage we just check to ensure that
  33268.     the file out file is writeable"
  33269.  
  33270.     ^File isWriteable: self  fileOutName!
  33271.  
  33272. canSave
  33273.     "Answer whether the resource represented by the receiver can save itself.
  33274.     If the receiver represents a new resource then we are always able to save it."
  33275.  
  33276.     | res |
  33277.     (res := self resourceOrNil) isNil
  33278.         ifTrue: [^true].
  33279.     ^res canSave!
  33280.  
  33281. canShow
  33282.     ^self resourceOrNil notNil and: [self owningClass respondsTo: #show:]!
  33283.  
  33284. class: aClass name: aString
  33285.     "Initialize the receiver from the parameters."
  33286.  
  33287.     owningClass := aClass.
  33288.     name := aString!
  33289.  
  33290. copy
  33291.     "Answer a new instance like the receiver."
  33292.  
  33293.     ^self class class: owningClass name: name!
  33294.  
  33295. edit
  33296.         "Invoke a suitable editor on the resource identified by the receiver."
  33297.     
  33298.         self resource edit: self!
  33299.  
  33300. exportedFileName
  33301.     "Private - Answer the receiver's default file name for file outs."
  33302.  
  33303.     ^self resource class generateFileNameFrom: self.!
  33304.  
  33305. fileOut
  33306.     "File out the receiver's resource to an external file"
  33307.  
  33308.     | resource | 
  33309.     resource := self resource.
  33310.     resource copy makeFilename: self fileOutName.
  33311.     self isChanged: false.
  33312. !
  33313.  
  33314. fileOutName
  33315.     "Answer the receiver's default file name for file outs."
  33316.  
  33317.     ^self exportedFileName!
  33318.  
  33319. fileOutOn: aSourceFiler
  33320.     aSourceFiler fileOutResource: self!
  33321.  
  33322. hash
  33323.     "Answer the SmallInteger hash value for the receiver."
  33324.  
  33325.     ^owningClass hash bitXor: name hash!
  33326.  
  33327. icon
  33328.     "Answer an icon to use for the receiver"
  33329.  
  33330.     ^self resource icon!
  33331.  
  33332. inheritedResource
  33333.     "Answer the resource represented by the receiver. If the receiver is not recognized by the ResourceManager
  33334.     then try all of its superclasses for a Resource of the same name. If no match is found then answer nil."
  33335.  
  33336.     | resource superclass |
  33337.     resource := self resourceOrNil.
  33338.     (resource isNil and: [(superclass := owningClass superclass) notNil])
  33339.         ifTrue: [resource := (self class class: superclass name: name) inheritedResource].
  33340.     ^resource!
  33341.  
  33342. isChanged
  33343.     "Answer whether the resource has been changed since it was last saved to disk."
  33344.  
  33345.     self resourceOrNil isNil
  33346.         ifTrue: [^false].
  33347.  
  33348.     ^self resource isChanged!
  33349.  
  33350. isChanged: aBoolean
  33351.     "Flag the receiver as changed or not changed, according to the value 
  33352.     of the <Boolean> argument. If the receiver is marked as changed, then
  33353.     its owning package (if any) is also so marked."
  33354.  
  33355.     aBoolean ifTrue: [ | package |
  33356.         (package := self owningPackage) notNil ifTrue: [
  33357.             package isChanged: true]].
  33358.     ^self resource isChanged: aBoolean!
  33359.  
  33360. isLoose
  33361.     "Answer whether the receiver is owned by a package different from that of its class."
  33362.  
  33363.     ^Package manager isLooseResource: self!
  33364.  
  33365. load
  33366.     "Load and answer the resource represented by the receiver."
  33367.  
  33368.     ^self searchForResource load!
  33369.  
  33370. loadWithContext: context
  33371.     "Load and answer the resource represented by the receiver with context context."
  33372.  
  33373.     ^self searchForResource loadWithContext: context!
  33374.  
  33375. makeByteArray
  33376.     "Store the resource represented by the receiver in a ResourceSTBByteArrayAccessor."
  33377.  
  33378.     | res |
  33379.     (res := self resourceOrNil) notNil    ifTrue: [
  33380.         res makeByteArray ]!
  33381.  
  33382. makeFile
  33383.     "Store the resource represented by the receiver in a ResourceSTBFileAccessor."
  33384.  
  33385.     | res |
  33386.     (res := self resourceOrNil) notNil    ifTrue: [
  33387.         res makeFile: self ]!
  33388.  
  33389. name
  33390.     "Answer the name of the resource represented by the receiver."
  33391.  
  33392.     ^name!
  33393.  
  33394. name: aString
  33395.     "Set the name of the resource represented by the receiver."
  33396.  
  33397.     name := aString!
  33398.  
  33399. owningClass
  33400.     "Answer the class that owns the resource represented by the receiver."
  33401.  
  33402.     ^owningClass!
  33403.  
  33404. owningClass: aClass
  33405.     "Set the class that owns the resource represented by the receiver."
  33406.  
  33407.     owningClass := aClass!
  33408.  
  33409. owningPackage
  33410.     "Answers the package that owns the receiver or nil if it is not yet owned
  33411.     by any package"
  33412.  
  33413.     ^Package manager packageOfResourceIdentifierOrItsClass: self!
  33414.  
  33415. owningPackage: aPackage
  33416.     "Set the receiver's <Package> to be the argument. Any current package association is lost."
  33417.  
  33418.     aPackage addResourceIdentifier: self!
  33419.  
  33420. printOn: aStream
  33421.     "Append, to aStream, a String whose characters are a description of the receiver as a developer
  33422.     would want to see it."
  33423.  
  33424.     owningClass printOn: aStream.
  33425.     aStream nextPut: $..
  33426.     (name notNil ifTrue: [name] ifFalse: ['untitled']) displayOn: aStream!
  33427.  
  33428. prompt
  33429.         "Prompt for and answer a new ResourceIdentifier using the receiver to give the default settings."
  33430.     
  33431.         ^(ResourceIdentifierDialog createOn: self) showModal!
  33432.  
  33433. resource
  33434.     "Answer the resource represented by the receiver. If the receiver is not recognized by the ResourceManager
  33435.     an error is raised."
  33436.  
  33437.     ^SessionManager current resourceManager 
  33438.         resourceAt: self ifAbsent: [self error: 'no such resource']!
  33439.  
  33440. resourceOrNil
  33441.     "Answer the resource represented by the receiver or nil if the ResourceManager 
  33442.     does not recognize the receiver."
  33443.  
  33444.     ^SessionManager current resourceManager 
  33445.         resourceAt: self ifAbsent: []
  33446. !
  33447.  
  33448. save: anObject
  33449.     "Save the anObject into the resource represented by the receiver."
  33450.  
  33451.     self resource save: anObject.
  33452.     self isChanged: true!
  33453.  
  33454. searchForResource
  33455.     "Answer the resource represented by the receiver. If the receiver is not recognized by the 
  33456.     ResourceManager then try all of its superclasses for a Resource of the same name. If no 
  33457.     match is found then raise an error."
  33458.  
  33459.     | resource |
  33460.     (resource := self inheritedResource) isNil ifTrue: [
  33461.         self error: ('%1 does not have or inherit a resource named %2.'
  33462.                     formatWith: owningClass printString with: name)].
  33463.     ^resource!
  33464.  
  33465. show
  33466.     "Display the resource identified by the receiver in whatever way is appropriate. Answer the <Presenter>
  33467.     opended to display it."
  33468.  
  33469.     ^self resource show: self!
  33470.  
  33471. storeOn: aStream
  33472.     "Append to the <puttableStream> argument, target, an expression which when 
  33473.     evaluated will answer a collection similar to the receiver."
  33474.  
  33475.     aStream
  33476.         nextPut: $(;
  33477.         print: self class;
  33478.         nextPutAll: ' class: ';
  33479.         print: self owningClass;
  33480.         nextPutAll: ' name: ';
  33481.         print: self name;
  33482.         nextPut: $)! !
  33483.  
  33484. RichText comment:
  33485. ''!
  33486. !RichText class methodsFor!
  33487.  
  33488. fromRtf: anRtfString
  33489.     "Answers an instance of the receiver holding anRtfString"
  33490.  
  33491.     ^super new rtf: anRtfString; yourself!
  33492.  
  33493. fromString: aString
  33494.     "Answers an instance of the receiver holding the plain text in aString.
  33495.     Note that we no longer use the converter to convert plain text to
  33496.     rich text, but just wrap it appropriately."
  33497.  
  33498.     ^super new rtf: '{\rtf1\ansi ', aString, '
  33499. }'!
  33500.  
  33501. new
  33502.     "Private - Use #fromRtf: or #fromString:"
  33503.  
  33504.     ^self shouldNotImplement!
  33505.  
  33506. onPreStripImage
  33507.     "Private - The image is about to be stripped. Nil out the cached converter to (potentially)
  33508.     allow RichTextEdit to be stripped."
  33509.  
  33510.     self uninitialize!
  33511.  
  33512. onStartup
  33513.     "Clean down the converter RichTextEdit instance on startup"
  33514.  
  33515.     Converter := nil!
  33516.  
  33517. rtfConverter
  33518.     "Private - Answer an instance of RichTextEdit which can be used to convert 
  33519.     between RTF and plain text or vice versa"
  33520.  
  33521.     Converter isNil ifTrue: [ 
  33522.         Converter := RichTextEdit new parentView: View desktop; create; yourself ].
  33523.     ^Converter!
  33524.  
  33525. uninitialize
  33526.     "Unitialize the receiver before it is uninstalled from the image."
  33527.  
  33528.     Converter isNil ifFalse: [Converter destroy. Converter := nil]! !
  33529.  
  33530. !RichText methodsFor!
  33531.  
  33532. = anObject
  33533.     "Answer whether the receiver and anObject are equivalent.
  33534.     RichText objects are considered equal to other rich text objects with the same RTF."
  33535.  
  33536.     ^(anObject species == self species) and: [anObject rtf = self rtf]!
  33537.  
  33538. asParameter
  33539.     "Answer the receiver in a form suitable for passing to an external
  33540.     library call. In this case we unwrap."
  33541.  
  33542.     ^self rtf!
  33543.  
  33544. asRichText
  33545.     "Answers the receiver as RichText"
  33546.  
  33547.     ^self!
  33548.  
  33549. asString
  33550.     "Answers the receiver as a String containing plain text"
  33551.  
  33552.     | converter string |
  33553.     converter := self class rtfConverter.
  33554.  
  33555.     converter rtfText: self rtf.
  33556.     string := converter plainText.
  33557.     converter setWindowText: ''.
  33558.  
  33559.     ^string!
  33560.  
  33561. copyToClipboard
  33562.     "Private - Copy a format of the receiver to the clipboard."
  33563.  
  33564.     Clipboard current setText: self format: #RichText!
  33565.  
  33566. displayOn: aStream
  33567.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  33568.     would want to see it."
  33569.  
  33570.     aStream nextPutAll: self asString!
  33571.  
  33572. displayString
  33573.     "Answer a String whose characters are a representation of the receiver as a user
  33574.     would want to see it"
  33575.  
  33576.     ^self asString displayString!
  33577.  
  33578. hash
  33579.     "Answer the <integer> hash value for the receiver."
  33580.  
  33581.     ^self rtf hash!
  33582.  
  33583. isEmpty
  33584.     "Answer whether the receiver contains no text."
  33585.  
  33586.     ^false!
  33587.  
  33588. notEmpty
  33589.     "Answer whether the receiver contains any text."
  33590.  
  33591.     ^true!
  33592.  
  33593. printOn: aStream
  33594.     "Append, to aStream, a String whose characters are a representation of the receiver 
  33595.     as a programmer would want to see it."
  33596.     
  33597.     aStream 
  33598.         basicPrint: self;
  33599.         nextPutAll: self rtf!
  33600.  
  33601. replaceSelectionIn: aTextEdit
  33602.     "Sent as part of a double dispatch from View objects to set their selection text from
  33603.     the receiver. The RichText protocol requires that aTextEdit must implement both #selectionPlainText:
  33604.     and #selectionRichText: methods."
  33605.  
  33606.     aTextEdit selectionRichText: self!
  33607.  
  33608. rtf
  33609.     "Private - Answers the receiver's RTF contents"
  33610.  
  33611.     ^rtf!
  33612.  
  33613. rtf: anRtfString
  33614.     "Private - Sets the receiver to contain the RTF text in anRtfString"
  33615.  
  33616.     rtf := anRtfString!
  33617.  
  33618. setTextInto: aView
  33619.     "Sent as part of a double dispatch from View objects to set their text from
  33620.     the receiver. The receiver is assumed to be rich text, so sends the #richText
  33621.     message back to aView."
  33622.     
  33623.     aView richText: self! !
  33624.  
  33625. SearchPolicy comment:
  33626. 'SearchPolicy is for configuring pluggable collections and models to use different searching policies, e.g. equality vs. identity. SearchPolicy itself implements an equality based policy using #= and #hash, etc.
  33627.  
  33628. SearchPolicy is the canonical implementation of the <searchPolicy> and <comparisonPolicy> protocols (the latter is really a subset of the former).
  33629.  
  33630. The <comparisonPolicy> protocol can be used to compare two objects in order to determine if they are the "same". Different comparison policies can be employed which, for example, consider that two objects are the same iff they are the exact same identical object (i.e. ''''obj1 == obj2'''' is true), or on the other hand if they are of equal value (i.e. ''''obj1 = obj2'''' is true).
  33631.  
  33632. SearchPolicy maintains a number of prebuilt instances which implement popular search/comparison policies. These are accessible via class side methods in the ''''instance creation'''' category.
  33633.  
  33634. Class Variables:
  33635.     Always        <AlwaysSearchPolicy>. Maintains that two objects are always equal.
  33636.     Identity        <IdentitySearchPolicy>. Singleton instance for identity searching.
  33637.     Equality        <SearchPolicy>. Singleton instance for equality searching.
  33638.     Never        <NeverSearchPolicy>. Maintains that two objects are never equal.
  33639.  
  33640. '!
  33641. !SearchPolicy class methodsFor!
  33642.  
  33643. always
  33644.     "Answers the singleton instance of the receiver that always answers 
  33645.     true to #compare:with: (i.e. under this comparison policy two objects 
  33646.     are always considered equal)."
  33647.  
  33648.     Always isNil ifTrue: [Always := AlwaysSearchPolicy new].
  33649.     ^Always!
  33650.  
  33651. caseInsensitive
  33652.     "Answer the singleton sub-instance of the receiver which supports a search policy
  33653.     based on case-insensitive string comparisons."
  33654.  
  33655.     CaseInsensitive isNil ifTrue: [CaseInsensitive := CaseInsensitiveSearchPolicy new].
  33656.     ^CaseInsensitive
  33657. !
  33658.  
  33659. equality
  33660.     "Answer the singleton sub-instance of the receiver which supports a search policy
  33661.     based on equality."
  33662.  
  33663.     Equality isNil ifTrue: [Equality := EqualitySearchPolicy new].
  33664.     ^Equality
  33665. !
  33666.  
  33667. identity
  33668.     "Answer the singleton sub-instance of the receiver which supports a search policy
  33669.     based on identity."
  33670.  
  33671.     Identity isNil ifTrue: [Identity := IdentitySearchPolicy new].
  33672.     ^Identity!
  33673.  
  33674. never
  33675.     "Answers the singleton instance of the receiver that always answers 
  33676.     false to #compare:with: (i.e. under this comparison policy two objects 
  33677.     are never considered equal)."
  33678.  
  33679.     Never isNil ifTrue: [Never := NeverSearchPolicy new].
  33680.     ^Never!
  33681.  
  33682. onPreStripImage
  33683.     "Private - Tidy up the receiver's lazily initialized class vars in preparation for image stripping."
  33684.  
  33685.     self uninitialize!
  33686.  
  33687. uninitialize
  33688.     "Private - Tidy up the receiver in preparation for removal from the system."
  33689.  
  33690.     Always := Never := CaseInsensitive := Equality := Identity := nil! !
  33691.  
  33692. !SearchPolicy methodsFor!
  33693.  
  33694. compare: operand1 with: operand2
  33695.     "Answer whether the <Object>, operand1, is considered equivalent to the <Object> argument,
  33696.     operand2, by this search policy."
  33697.  
  33698.     ^self subclassResponsibility
  33699. !
  33700.  
  33701. hash: operand
  33702.     "Answer a suitable hash value for the <Object>, operand, under this search policy."
  33703.  
  33704.     ^operand hash!
  33705.  
  33706. hash: operand max: maximum
  33707.     "Answer a suitable hash value for the <Object>, operand, under this search policy, 
  33708.     between 1 and the <integer>, maximum. If maximum is a significant proportion
  33709.     of the range of hash values generated, then the result should be scaled to distribute
  33710.     evenly between 1 and maximum in order to avoid generating excessive collisions at
  33711.     the low end of the range."
  33712.  
  33713.     ^(self hash: operand) \\ maximum + 1!
  33714.  
  33715. keyAtValue: value in: collection ifAbsent: operation
  33716.     "Answer the <Object> key of the <Object> argument, value in the keyed
  33717.     collection, collection, using the receiver's search policy. If there is no such 
  33718.     value, answer the result of evaluating the <niladicValuable>, operation."
  33719.  
  33720.     collection keysAndValuesDo: [:k :v | (self compare: v with: value) ifTrue: [^k]].
  33721.     ^operation value!
  33722.  
  33723. mapClass
  33724.     "Private - Answer the class of <LookupTable> which has a compatible search policy."
  33725.  
  33726.     ^LookupTable!
  33727.  
  33728. newLookupTable
  33729.     "Answer a new <LookupTable> with the receiver as its search policy."
  33730.  
  33731.     ^self mapClass new!
  33732.  
  33733. nextIndexOf: anElement in: sequence from: start to: stop
  33734.     "Answer the index of the next occurrence of anElement in the <sequencedReadableCollection>
  33735.     argument,  collection, between startIndex and stopIndex inclusive. If there are no such occurrences, 
  33736.     answer 0."
  33737.  
  33738.     sequence from: start to: stop keysAndValuesDo: [:i :elem | (self compare: elem with: anElement) ifTrue: [^i]].
  33739.     ^0! !
  33740.  
  33741. SecureHashAlgorithm comment:
  33742. 'This class implements the Secure Hash Algorithm (SHA) described in the U.S. government''s Secure Hash Standard (SHS). 
  33743. This standard is described in FIPS PUB 180-1, "SECURE HASH STANDARD", April 17, 1995. The Secure Hash Algorithm is also described on p. 442 of ''Applied Cryptography: Protocols, Algorithms, and Source Code in C'' by Bruce Scheier, Wiley, 1996.'!
  33744. !SecureHashAlgorithm class methodsFor!
  33745.  
  33746. Σ\&%4íΓX@°üë8Çα╞ΩîΩ▀┌ò╕√╖@W »╫t3MN╙ë.^ÆL,|T^+■ä^Jv#L¬zZiú┐)⌡╨º┤óô≥┴^▀Rw0] ΩëOr æÉ▄X■|├)▀nò·J9∞tô█4÷+6┴jQ╣√▀╢─í`ÇMâ÷∙»Γ_°=Jhçπ5₧╤Z≡'═L╥;÷>r°└}ÿ)┴=▓¢═)┌ª∙φΦF⌡┤1
  33747. ½┴δS[6c]2e▐\╗FfPmqÜ2ƒD▌≡5ioê╫ ╥y&╞╘ëß╪!!φ╝º╠û-░╣ë2óo^b░z╝
  33748. fMφú3Ç*oΘè┴╨▀ƒNÜ▀╔πF╡U⌠ï^»Ä≡▐    N)[    .⌠;ò╖#`åtùO╠lGpòagêíXëcL╔á∞S39N}╥╪╓▄Bàσ["▒°AûÆùN╘$1ZK╚√(    6¥a£≈╒▄í┤■╗┼ä█QôH▒├ ;N╔ÜÄ├j≡"7NΘµΣù¥lT├╬}ä█╥pC≥▄┘óe$,╓⌡L⌐╦╕┘éΦ▄╠ài_    àŪ═:╘¬╨√φ#o≥▒bd»µ╩─çC■?8╘≈Ç|═┴≈FÖΓ▌.∞▒YaàD]ä╩f]∩V.!
  33749.  
  33750. Σ\&%4í▌_C╙δñ/ù:í▌ⁿîΩ▀┌ò¬·¼AG ╛╪z~XZ╫─8@ÿR>f^x≤é_o%N╖u\dΓ»/∙╦Oªú≈╓╤µ,-╫Dk".1é∞ cτçÇ4"ⁿ"¢fεF«|¥≡T9°$ï▀RÖg⌐9┴ô╧╢▀Ñpç¢ê▌e├¢>Wºl ;ç≈2╙╧SΓBª6ÿ{Ö@ É█8╩C}╚¡▒Θ-|▓╜≡╛║[ΦτeP┐á╝%NTnï≡7tü_■ÿ¿Wj|MI═█o┌
  33751. R╞áüΦ╡!!τ╡ì┴ƒ=í╣ë2ò6Cá<╕I¼▄⌐eZ ▐▄╙▀ëZ╚éΣ╟úA₧?┬gß╞┘ï<8j#ko╙▒╓    7╞g╬èK2╨F ä²Γ6YÆΓ╘:[S#
  33752. {┌₧╫╦V    Æ╣mâ·Zï╒▄₧*9YL╞▒c>sⁿ■┼╠└⌐╫¢! !
  33753.  
  33754. !SecureHashAlgorithm methodsFor!
  33755.  
  33756. ΓK)0 ░ΓX@°Ö₧#ô>⌡╤»ü╛≡┌┴¡▓ñ]îôß;pGX╞ü&F╒2.C1:h°òArfF░RZfΓó&╬╠W≥≈î▐⌠└
  33757. ÆlJ@4=Ü»h>¿ë╙QI╣æt╝Z÷nÿ▀CJ,ΣY╤│3⌡|wú(╓è╫!
  33758.  
  33759. τM)Ñ£:D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ¼√╘svP█è?^╫WE9fUy√┴
  33760. QcfL¼rGo║┐`√╨F@½╗╕ì≥▄\â63j
  33761. │á-&í▌┴U[╒Æ}ε_█∙≤EN+í>┬₧}½mFê!!.┴ô┌╢┬Ñd╥M╩╒■f╜⌠[BΓsz«µ1╠▐M■<─^²τ`Ω╧"éQk╠9±▀îJ`╢╢∞╛∞Ç⌡sT¢∙ª?Ar3é¡zZ\U┼ìÅ▓\yLB╬ä7ƒoⁿÖ┘╣∩iñα▄ì╩p╪ëáXÅ8QRVⁿx≤U4d╕╕)▄-Sφû┴╔╙ƒ@Ü┼═ª@²¿1í{ì≤≈╦Jz]g▒>┌╖/làùG┘ 0╘ *═│`úGeUüδ╥\P#'v╫    ╓!
  33762.  
  33763. ΘE46■╧3 ú╜ë ù-α═»íö╛¥σ¼√│RW║√ì;[IE┌ü-âWAjjZGjO Å^XD?[ª]Axú▓`∩═K»≈úû≥Å àf[z ΘöLr¡╞╬MMì╤{├)▀nò·\9═m¥╠XÄ[4┴jU║ü╦≈Σí`Ç/è¥òy⌠▒DA«fJxìß'█╟Kè+FÑS╩4µ+gⁿ╒"éCL┘+┤²æVu¬├Æùë┐╪eRπá│(qCtt3ùJ≡*t!
  33764.  
  33765. ΘE46ìü&,╜¼₧p┼>╤█ⁿ┼Ω▐╔╨ùⁿ▒VD║⌐Ç!!·à-Z╫VJjzSV+ ùW&6@░uGc┤«`≤╨V»▓Ñ╨╖√╫}Pkg▀«-&íë┬\¥Çp¬Ñuƒ≡U9≈a▀ï╬{╛@:╓à╞Σîóz£╤┘■b─ÿKáu }ç²s┌╠K╬O+╔GÜ
  33766. ₧G°≈w╤Kz╔)┤⌡ìPq┤½Ω╛Σ»²to░·╖JH%W;r█[▒W]&9└δå▓\7|x_▀ì)╦_ä ├Γ╝&φ┤ò╚¥;ºú╩┴ 8Rñ∙
  33767. p╖α;ÇoR°┘╝▌π╡!!Ö├├αGµRjτ+├*╤Γ┘═GpL*½w┼úc√]¢]╦1OFf₧ :╨╗e¡gO5╔ÆαD8.C{ ╩╫▐A└τU-╛δzûÅÜ╩#b|¿ÖM$╦,┌¬╡╕g┼╛■∞ï░æV▄DαåPP"ÑÇ╧▀pφ*b ∩ù╛╩└'1═╟lú¢Σ}áⁿπi╚!!~Mù╞ª╤αâ┤┤@âìBè6 ä¼╡ü(┼¬╨7▀║kï┘ef║µ╫╚É
  33768. B▐2*╘≈╠D9ï┬≥Eƒφ▐(╦╧6εn<╗═|aΣa·╤╝τ╪I!
  33769.  
  33770. ΘE46ëè!!:╗«ëp┼>╥└²┼≡╨≡╟£δ▒Vb¡⌐┴b"?ɼ?AƒM$.O[nO±ê\hfBªo@kÑ«`∩═K»≈úû≥Å/öaL.H█»erÅ┼╟VZ£¢∞.▄·h┬BJ>íl₧═Q╡LG╕9╥ƒÖ╢äÆvë    ¼Åüyú▒XJ°  Hû²:╨╪p⌡c6╪Z√ß,x╣╞kα[z┼ú╬é]=▐─!
  33771.  
  33772. ΘE46ù¢ ,╗ñ╓jäε╟µ╪≈╪╤╘╝■á`W¡╛┴v3%<╗╞SäW#`Gc
  33773. ╢éWr#A╖oeñδ4≥█íí▓É╖▄ ÆuS@hr╒▒-&ª╠ÇZ]çûaεS╣nÖ⌡^AI,ε$ï╓\▄Gz¿@)└¢═±î┤{ìM¼₧Éi½▒E▒hJZÄΦ<╠╓K∩Laî2░╟%d╣⌠Pπo╠8╛╬èP|╛ε±φá¡≥iR╝Σ≥ %`|;Ur╛?┴Wa)ÿYì8₧ßP~|B@╔ÄoÅ_òΓ╪║∙eñ╡Åìèp⌡╖¥[Å
  33774. 1KU"¼l≡q[óÆ{┘}OπîÇâå╞█µ╫ΘV√?╢x¡s¼╞⌠╪T`[D.╜wÆ∙)%ó;è\▄alée ä⌡u└Me^╤Γ═E$9OYM╒██▄VJ└╘U&▓µ▀─╞êbU:)|¿ÖfnWⁿ■└┘Γ┐│σ┐─à╩]É]ôÉWS%¡╥Äε$⌐_&≤╖╝╦π>}äƒvτσÜ=x═┬τiüUvwΩ╣|ò)¢⌠1╠²αï½H░1     îºª├%╘├ä,ôåGF∩▒p╝⌡╤╟ö]AÉz}ö∙« Uó⌐φOÉα▄aC▒╘▓n6»╪I!
  33775.  
  33776. ΘE46░è5,¿≤╠+╡0≥▌√┼Φ╥÷█¬≈óVQ ╓¬1`W┴î~FƒZ-gMVeOµÄPr/Yª<Zd╢«' ╠ @£┐▓▐■┴ÉqL@zoÜ╛hrª╚╙QMæVÇz╗O▓=ÿΩT\i│$É╠ÜGc⌐|╤¢╫σéαΓd½ôÜoO½ CV╗ tïß'₧╓LºT<╔[ܲmjⁿ▐8┼G`┼-░╚èKz²∞òöìl┴τeP┐áá`Rvh&ï≈Y]&C╠╦QéáJeMe╘ò*î_╠░╨ê≤rφ«ê█ƒ╗≈╠╩yfxjéo∙rΣ╕g┴asφû!
  33777.  
  33778. ΘE4=╖£3.┐≤╠+╢+≤▌ß╦╤┼²╠¬≈äAQ╛ó¡
  33779. ~╙ù6âWAjiREn╢îJu'Hª<Fy½Ñ'║╩JΦä▓¥Γ▌^┐uM.A╓╗b º▌╚T╫{∙{╟P│qûAεT\ ,┬kæ╩\äV:┴jU└ù╧≡î¿r¢╢ò╛y╜≡PA°  Hû²:╨╪p⌡c6╪Z√ß,x╖¬½|.╙:╜┌├B}╜»⌠╓ßáÖ
  33780. !
  33781.  
  33782. ΘE4,╢è3$αΘìè,Φ└µ├≡╓▌┘╗┴▒AF╛╢Ç!!·à-Z╫KL/.X\e≤Å
  33783. J&)Iπh[oΓ¼)∞█L@╗úÑ¢÷┬\à{S@zh▀ⁿn'╝█┼W\╒£|║J╣s╨≤[=íaæ┌ëQ}ó|╟Ü╞╢ Ñp¥Ü█╗}ª▒vHÑorûτ>Ƀ2ì(─ZÜ%█ !!°╦═Pg╘7╝£èW4╖½■≈ε¼┤iR∙╞¢:1%v`)&c╓Z«F~1fDë▐Qï¡Jb|GI╔é=éXÆ░▐╢╝q¬·╒Ö╚~║σëNε'╕<▀mO÷╛n╥lKΣ─┴ú£╨\ö╒╩ΩQ╕RY¢gµ<╫ε∞╫U%G9▒£Γ?föt╝A█Km╞C'═∙,ú(7I╦º»d22O{─V₧σ╨HÖ»{εª╤°⌡.│FQcE╫Γ!!+<éd╢≈▀▌Ñ«∙╗ïà╬H▄PíùMe0▓ùÄæjσPc ìñ▄└>|╫ò"²╚╖R½╛▓DΘ)2ZgΩ╣|∩Eòτw₧ó«Q₧╕H¡,ùτ╩½@┬⌡£8╓ÅKΘ¥W0╕±┘╞╧YPt┼)"╘╛╠D=╔╠√yê⌠ÖhO∞▒Ya╓=1╢╪4Nπ5E⌠∞╗≥╒!
  33784.  
  33785. ≤A4!!½ü&,ó╜ß@∞<ε┌√╔µ├ƒ█▒µïZO ╓¬APµû+W═)@2:P≤ìu.NÅuQxú╣9║═Jî▓ñèσ└D╫wQze┬¿#_─á⌐0KÜçm║∞ ╨⌡]r!
  33786.  
  33787. ≥L&6<:╢Ä 0╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡¿Ço{MÄí&FÆMJ+bwZi≈ô&%@¡hRc¼ó.²₧V¡≈ä╢╓Å ÖwJ    an╔■X├ú⌐glÜâ|ápúoò"εH_7═m¥╠XÄ[4¿:╥ç╧Γ! !
  33788.  
  33789. SessionManager comment:
  33790. 'SessionManager is the class of objects responsible for managing the lifecyle of an application, from startup to shutdown. SessionManagers are also responsible for determining the global policy for dealing with unhandled Exceptions. 
  33791.  
  33792. SessionManager itself is abstract, with two further abstract subclasses that divide applications into two groups: <ConsoleSessionManager> whose subclasses implement Console (that is, command line, DOS style) applications, and <GUISessionManager> whose subclasses implement GUI (that is, Windows) applications.
  33793.  
  33794. When you come to deploy an application, you will probably need to write a SessionManager for it, although it is possible to do without (see the ADK documentation). In the case of a console application you should subclass <ConsoleSessionManager>, and in the case of a GUI application you should typically subclass <RuntimeSessionManager>. To get going it is only necessary to implement a #main method which either implements the main body of the application (in the case of simple console apps), or which invokes it by creating an instance of some other class, passing it appropriate arguments drawn from the #argv collection which is a collection of the components that formed the original command which started the application.
  33795.  
  33796. Instance Variables:
  33797.     inputState        <InputState>. Implements the Windows message loop (even console apps have one in Dolphin).
  33798.     resourceLibrary    <ExternalResourceLibrary>. Default library containing application resources.
  33799.     resourceManager    <ResourceManager>. Manager for Dolphin resources, such as views.
  33800.     imagePath        <String>. Path from which the image was loaded (path of the .EXE if a deployed app)
  33801.     servers        <SharedIdentitySet>. Running "servers" e.g. OLE servers, which need the session to stay up.
  33802.     argv        <Array> of <String>. Command line arguments in the normal C arrangement (first is .EXE name)
  33803.     cmdLineFlags    <Set> of <String>. Command line arguments prefixed with - or /.
  33804.     state        <SmallInteger>. Current stage of sessions life. Mostly relevant during startup and shutdown.
  33805.     sentry        <ExternalHandle>. Handle of Win32 named Semaphore which indicates running instance of image.
  33806.     startupArgs    <Array>. Raw startup arguments passed in by the VM.
  33807.     consoleHandler    <MessageCallback>. Handler for Win32 console control message callback.
  33808.     stdin        <StdioFileStream>. Standard input stream.
  33809.     stdout        <StdioFileStream>. Standard output stream.
  33810.     stderr        <StdioFileStream>. Standard error stream.
  33811.  
  33812. Class Variables:
  33813.     PreStartFile    <String>. Name of the file-in fairly early in startup to effect repairs, etc.
  33814.     Current        <SessionManager>. Singleton instance, being the current session manager.
  33815.  
  33816. '!
  33817. !SessionManager class methodsFor!
  33818.  
  33819. current
  33820.     "Answer the singleton instance of the receiver"
  33821.  
  33822.     ^Current!
  33823.  
  33824. current: aSessionManager
  33825.     "Assign the current SessionManager instance (which will be a subinstance).
  33826.     In order to preserve the triggers hanging off the old SessionManager, we
  33827.     use a #become:, we also copy across any existing input state so that
  33828.     the system continues to run."
  33829.  
  33830.     Current isNil
  33831.         ifTrue: [Current := aSessionManager. Current initialize]
  33832.         ifFalse: [
  33833.             aSessionManager
  33834.                 inputState: Current inputState;
  33835.                 initialize.
  33836.             Current become: aSessionManager]!
  33837.  
  33838. imageExtension
  33839.     "Answer the suffix for an executable image file"
  33840.  
  33841.     ^'exe'!
  33842.  
  33843. initialize
  33844.     "Private - Initialize the class variables of the receiver."
  33845.  
  33846.     PreStartFile := 'prestart.st'.
  33847.     Current := BootSessionManager basicNew. "For boot reasons, do not initialize"
  33848.     Current imagePath: '.\Dolphin'
  33849. !
  33850.  
  33851. inputState
  33852.     "Answer the InputState of the current session manager."
  33853.  
  33854.     ^self current inputState!
  33855.  
  33856. installNew
  33857.     "Install a new instance of the receiver as the current SessionManager.
  33858.     Answer the PREVIOUS SessionManager."
  33859.  
  33860.     | newSM |
  33861.     newSM := self basicNew.
  33862.     SessionManager current: newSM.        
  33863.     SessionManager current initializeFromSessionManager: newSM.
  33864.     ^newSM    "actually the old SessionManager, since #become: used to swap"
  33865. !
  33866.  
  33867. isConsoleApplication
  33868.     "Answer whether the sessions managed by instances of the receiver are for a console application 
  33869.     (as opposed to a GUI application, which is a completely separate thing under Windows).
  33870.     Implementation Note: This isn't really a console application, but the test is slightly misnamed
  33871.     since it really means is this not a GUI application."
  33872.  
  33873.     ^true!
  33874.  
  33875. isRuntime
  33876.     "Answer whether the sessions managed by instances of the receiver are for a run-time applications 
  33877.     (as opposed to development, or abstract)."
  33878.  
  33879.     ^false    "This is abstract"!
  33880.  
  33881. new
  33882.     "The receiver is a singleton class (in general) so this is not a permitted operation
  33883.     (see however #installNew)."
  33884.  
  33885.     ^self shouldNotImplement!
  33886.  
  33887. publishedEventsOfInstances
  33888.         "Answer a Set of Symbols that describe the published events triggered
  33889.         by instances of the receiver."
  33890.     
  33891.         ^super publishedEventsOfInstances
  33892.             add: #sessionStopped;
  33893.             add: #imageSaveCompleted;
  33894.             add: #'sessionStarted';
  33895.             add: #imageSaveStarting;
  33896.         add: #queryEndSession:;
  33897.             yourself.
  33898.     !
  33899.  
  33900. uninitialize
  33901.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  33902.  
  33903.     Current class==self ifTrue: [Current := nil]! !
  33904.  
  33905. !SessionManager methodsFor!
  33906.  
  33907. allocConsole
  33908.     "Private - Open a console window for this session."
  33909.  
  33910.     KernelLibrary default allocConsole
  33911. !
  33912.  
  33913. allowDuplicate
  33914.     "It would appear that the image associated with this session is already open. Take action
  33915.     appropriate to the policies of the receiver. Answer whether to continue the session.
  33916.     The default is to carry on brazenly."
  33917.  
  33918.     ^true
  33919.  
  33920. !
  33921.  
  33922. applicationName
  33923.     "Answer the application name. Use the applications executable name."
  33924.  
  33925.     ^self argc > 0
  33926.         ifTrue: [File splitStemFrom: self argv first]
  33927.         ifFalse: ['Application']!
  33928.  
  33929. applicationShortName
  33930.     "Answer the abbreviated application name."
  33931.  
  33932.     ^self applicationName!
  33933.  
  33934. argc
  33935.     "Answer the number of the command line arguments."
  33936.  
  33937.     ^self argv size!
  33938.  
  33939. argv
  33940.     "Answer an array of Strings containing the command line arguments."
  33941.  
  33942.     argv isNil 
  33943.         ifTrue: 
  33944.             [| lib |
  33945.             lib := CRTLibrary default.
  33946.             argv := StructureArray 
  33947.                         fromAddress: lib argv
  33948.                         length: lib argc asInteger
  33949.                         elementClass: LPSTR.
  33950.             argv := argv collect: [:e | e value]].
  33951.     ^argv!
  33952.  
  33953. backupOnImageSave
  33954.     "Answer whether the image should be backed up (i.e. the old .img file is renamed to .bak when the new .img
  33955.     file is successfully written). Note that this will slow down the operation quite a bit, as the OS has to do a lot
  33956.     more juggling."
  33957.  
  33958.     ^false!
  33959.  
  33960. basicPrimaryStartup
  33961.     "Perform critical startup operations which initialize the basic
  33962.     services in the image such as the process system. These startup activities
  33963.     should be kept to a minimal set, as there is no opportunity to repair any
  33964.     damage until these are completed, so if they fail, you've had it."
  33965.  
  33966.     VMLibrary default onStartup.    "The VMLibrary must be initialized before we do anything else."
  33967.     self openLibraries.    "Now we can open the permanent libraries"
  33968.     self imagePath: imagePath.    "Split off the extension now can use lib functions."
  33969.     ExternalCallback onStartup.    "Old callbacks will be invalid"
  33970.     self inputState primaryStartup.    "Register input semaphore, etc, kill previous idler in case on a different host OS"
  33971.     self class environment at: #Delay ifPresent: [:d | d onStartup].    "Reschedule delays etc."
  33972.     MemoryManager current onStartup    "Start (if necessary) finalization/bereavement processing, etc"!
  33973.  
  33974. basicSecondaryStartup
  33975.     "Perform secondary startup operations which initialize non-critical
  33976.     basic services in the image, such as the dates and times, and also initialize
  33977.     the message loop handler (we have a basic message loop even in a console 
  33978.     app)."
  33979.  
  33980.     Float onStartup.
  33981.     self class environment at: #Locale ifPresent: [:d | d onStartup]!
  33982.  
  33983. basicShutdown
  33984.     "Private - Perform basic system shutdown operations, just prior to the VM putting
  33985.     out the lights."
  33986.  
  33987.     self closeConsole.
  33988.     self comShutdown.
  33989.     self class environment at: #Delay ifPresent: [:d | d onExit].
  33990.     inputState onExit.
  33991.     ExternalLibrary onExit.
  33992.     KernelLibrary default closeHandle: sentry
  33993. !
  33994.  
  33995. basicStdioStreams
  33996.     "Private - Answer the 3-element <Array> of <StdioFileStream>s which are the 
  33997.     CRT stdin, stdout, and stderr streams, or nil if not opened yet."
  33998.  
  33999.     ^stdioStreams!
  34000.  
  34001. basicTertiaryStartup
  34002.     "Perform tertiary system startup operations."
  34003.  
  34004.     ^self subclassResponsibility!
  34005.  
  34006. clearSessionState
  34007.     "Clear any state saved down for a image save which is will not be required until that saved image is
  34008.     rehydrated."
  34009.  
  34010.     "By default, assume there is no extra state to save, and do nothing."!
  34011.  
  34012. closeConsole
  34013.     "Disconnect from and close any open console, including the standard input and output
  34014.     streams."
  34015.  
  34016.     self 
  34017.         closeConsoleStreams;
  34018.         unregisterConsoleCtrlHandler;
  34019.         freeConsole
  34020. !
  34021.  
  34022. closeConsoleStreams
  34023.     "Private - Close the standard console I/O streams."
  34024.     
  34025.     stdioStreams isNil ifFalse: [
  34026.         1 to: 3 do: [:i | | stm | (stm := (stdioStreams at: i)) notNil ifTrue: [stm close]].
  34027.         stdioStreams := nil]!
  34028.  
  34029. closeEventLog
  34030.     "Private - Close the NT event log, if open."
  34031.  
  34032.     eventLogHandle notNil ifTrue: [
  34033.         AdvApiLibrary default deregisterEventSource: eventLogHandle.
  34034.         eventLogHandle := nil]!
  34035.  
  34036. cmdLineFlags
  34037.     "Private - Answer the Set of flags specified on the command line.
  34038.     Currently this is rather simplistic, since it doesn't handle parameters
  34039.     with an argument, if the argument is separated from the parameter name
  34040.     by whitespace. The VM can't handle these anyway, as it knows nothing about
  34041.     the potential parameters, and so treats the first argument which does not
  34042.     beging with $/ or $- as the name of the image file. So, currently, parameters
  34043.     with arguments must be specified without any whitespace between the parameter
  34044.     name and the parameter value."
  34045.  
  34046.     cmdLineFlags isNil ifTrue: [
  34047.         cmdLineFlags := Set new.
  34048.         self argv do: [:a | 
  34049.             ('/-' includes: a first) ifTrue: [
  34050.                 cmdLineFlags add: (a copyFrom: 2)]]].
  34051.     ^cmdLineFlags!
  34052.  
  34053. computerName
  34054.     "Answer the name of the computer hosting the current session. 
  34055.     Signals an exception if the request fails."
  34056.  
  34057.     | name nameSize |
  34058.     name := String new: MAX_COMPUTERNAME_LENGTH.
  34059.     nameSize := DWORD fromInteger: name size+1.
  34060.     (KernelLibrary default getComputerName: name nSize: nameSize asParameter)
  34061.         ifFalse: [KernelLibrary default systemError].
  34062.     ^name leftString: nameSize asInteger!
  34063.  
  34064. comShutdown
  34065.     "Private - The system is about to shut down, so clear up any COM hangers on.
  34066.     Note: This used to be done by hanging of the shutdown trigger, but with the
  34067.     advent of control hosting there are sequencing issues, in particular it is important
  34068.     that the window system be closed before any COM object stubs in the receiver
  34069.     are destroyed. As the COM package may not be loaded, we can't use a hard
  34070.     reference to <COMInterface>"
  34071.  
  34072.     self outer notNull ifTrue: [self outer free].
  34073.     Smalltalk at: #COMInterface ifPresent: [:c | c onExit]!
  34074.  
  34075. comStartup
  34076.     "Private - Start up the COM sub-system, if loaded.
  34077.     Implementation Note: This used to be delayed until tertiary startup and hung off the #sessionStarted
  34078.     event, but that relied on COMInterface having registered itself before certain other event targets
  34079.     and was therefore not reliable."
  34080.  
  34081.     Smalltalk at: #IUnknown ifPresent: [:c | 
  34082.         c onStartup.
  34083.         "Attach the outer unknown passed by the stub, if any"
  34084.         self outer notNull ifTrue: [
  34085.             startupArgs at: 2 put: (c attach: self outer)]]
  34086.  
  34087. !
  34088.  
  34089. createInputState
  34090.     "Private - Allocate a new input state object for the receiver.
  34091.     WARNING: Do not send this message in a running system unless you want it to
  34092.     stop responding to input."
  34093.  
  34094.     inputState := InputState new!
  34095.  
  34096. defaultResLibPath
  34097.     "Answer the path of the development resource library."
  34098.  
  34099.     ^'DolphinDR005'!
  34100.  
  34101. defaultResourceLibrary
  34102.     "Private - Answer the ExternalResourceLibrary containing the Dolphin 
  34103.     development system resources."
  34104.  
  34105.     resourceLibrary isNil 
  34106.         ifTrue: 
  34107.             [resourceLibrary := ExternalResourceLibrary 
  34108.                         open: self defaultResLibPath
  34109.                         withAliases: #('dolphindr004' 'dolphindevres' 'dolphindr993')
  34110.                         flags: 0].
  34111.     ^resourceLibrary!
  34112.  
  34113. embeddedStartup
  34114.     "Private - The session has been started as an embedded session, perform appropriate
  34115.     actions."
  34116.  
  34117.     #todo "This is necessary because of dum GC strategy - we need to wake up to ensure it happens".
  34118.     [[Processor sleep: 1000] repeat] forkAt: Processor systemBackgroundPriority
  34119.             
  34120.             !
  34121.  
  34122. errorLogExtension
  34123.     "Answer the suffix for an error log file"
  34124.  
  34125.     ^'errors'!
  34126.  
  34127. errorLogName
  34128.     "Answer the name of the error log file used to record error information (e.g. unhandled exceptions)."
  34129.  
  34130.     ^File default: self imagePath extension: self errorLogExtension!
  34131.  
  34132. eventLogSource
  34133.     "Answer the 'source' that should be passed to the ReportEvent() API when logging events
  34134.     to the NT event log. This name will appear as the source of the event in the NT event
  34135.     viewer."
  34136.  
  34137.     ^self applicationName!
  34138.  
  34139. exit
  34140.     "Request to close down the session (user may cancel)."
  34141.  
  34142.     self exit: 0!
  34143.  
  34144. exit: anInteger
  34145.     "Request to close down the session with the specified exit code (user may cancel)."
  34146.  
  34147.     self inputState postQuit: anInteger!
  34148.  
  34149. forkMain
  34150.     "Start a new main process appropriate for the session.
  34151.     Override this to fork a specific main process. The default is to fork
  34152.     the standard message loop executing main process via the input state.
  34153.     We also defer an action to be processed by that UI process that acks
  34154.     the receiver that the UI loop has started."
  34155.  
  34156.     [self mainLoopStarted] postToInputQueue.
  34157.     inputState forkMain!
  34158.  
  34159. free
  34160.     "Free up any artifacts belonging to relevant to the current Session."
  34161.  
  34162.     ^self!
  34163.  
  34164. freeConsole
  34165.     "Private - Close (actually detach from) the console for this session.
  34166.         SessionManager current freeConsole
  34167.     "
  34168.  
  34169.     KernelLibrary default freeConsole!
  34170.  
  34171. getCommandLine
  34172.     "Private - Answer the command line String used to start Dolphin."
  34173.  
  34174.     ^KernelLibrary default getCommandLine!
  34175.  
  34176. getenv: aString
  34177.     "Answer the value of the specified environment variable, or nil if it does not exist.
  34178.     N.B. Size answered includes null terminator IF not enough space (or nil buffer)."
  34179.  
  34180.     | buf size |
  34181.     "N.B. Size answered includes null terminator IF not enough space (or nil buffer)."
  34182.     size := KernelLibrary default getEnvironmentVariable: aString lpBuffer: nil nSize: 0.
  34183.     size == 0 ifTrue: [^nil].
  34184.     buf := String new: size-1.    "Dolphin Strings alloc. extra space for null terminator"
  34185.     KernelLibrary default getEnvironmentVariable: aString lpBuffer: buf nSize: size.
  34186.     ^buf
  34187.     !
  34188.  
  34189. hasActiveServers
  34190.     "Private - Answer whether there are any servers still registered in this
  34191.     session."
  34192.  
  34193.     ^self servers notEmpty!
  34194.  
  34195. imageBase
  34196.     "Answer the base directory in which the image resides"
  34197.  
  34198.     ^File splitPathFrom: self imagePath!
  34199.  
  34200. imageExtension
  34201.     "Private - Answer the suffix for an executable image file"
  34202.  
  34203.     ^self class imageExtension!
  34204.  
  34205. imageFileName
  34206.     "Answer the file name of the current image."
  34207.  
  34208.     ^File default: self imagePath extension: self imageExtension!
  34209.  
  34210. imagePath
  34211.     "Answer the base file path on which the image, source and changes
  34212.     file names are based. An example might be: c:\Program Files\Dolphin\Dolphin."
  34213.  
  34214.     ^imagePath!
  34215.  
  34216. imagePath: aPathString
  34217.     "Private - used only after loading an image to set up path to the image and sources."
  34218.  
  34219.     imagePath := File removeExtension: aPathString!
  34220.  
  34221. imageVersion
  34222.     "Answer a String in the form N,N,N,N which specifies the version number of the image."
  34223.  
  34224.     | ms ls |
  34225.     ms := self imageVersionMajor.
  34226.     ls := self imageVersionMinor.
  34227.     ^(String writeStream: 16)
  34228.         print: ms highWord;
  34229.         nextPut: $.;
  34230.         print: ms lowWord;
  34231.         nextPut: $.;
  34232.         print: ls highWord;
  34233.         nextPut: $.;
  34234.         print: ls lowWord;
  34235.         contents!
  34236.  
  34237. imageVersionMajor
  34238.     "Answer the major component of the images version Integer."
  34239.  
  34240.     ^VMLibrary default registryAt: #ImageVersionMajor!
  34241.  
  34242. imageVersionMinor
  34243.     "Answer the minor component of the images version Integer."
  34244.  
  34245.     ^VMLibrary default registryAt: #ImageVersionMinor!
  34246.  
  34247. initialize
  34248.     "Private - Initialize the receiver after installation as the current SessionManager.
  34249.     Answer the receiver."
  34250.  
  34251.     state := 6.
  34252.     servers := SharedIdentitySet new.
  34253.     imagePath := '.\Dolphin'.
  34254.     ^self!
  34255.  
  34256. initializeFromSessionManager: oldSessionManager
  34257.     "Private - The receiver has taken take over as the current session
  34258.     manager from oldSessionManager. This is an opportunity to transfer
  34259.     state information from the replaced manager."
  34260.  
  34261.     imagePath := oldSessionManager imagePath.
  34262.     resourceManager := oldSessionManager resourceManager.
  34263.     stdioStreams := oldSessionManager basicStdioStreams.
  34264.     startupArgs := oldSessionManager startupArgs.
  34265.     ^self!
  34266.  
  34267. inputState
  34268.     "Answer the receiver's InputState, creating it if necessary."
  34269.  
  34270.     inputState isNil ifTrue: [self createInputState].
  34271.     ^inputState!
  34272.  
  34273. inputState: anInputState
  34274.     "Private - Set the receiver's InputState.
  34275.     WARNING: Do this very carefully."
  34276.  
  34277.     inputState := anInputState!
  34278.  
  34279. installationDirectory
  34280.     "Private - Answer the <readableString> path name of the directory in which this
  34281.     application is installed.
  34282.         SessionManager current installationDirectory.
  34283.     Application specific subclasses can override this to answer a directory read from
  34284.     a registry key (for example), or whatever is appropriate. The default is derived
  34285.     from the path of the loaded image."
  34286.  
  34287.     ^self imageBase
  34288.  
  34289.     !
  34290.  
  34291. isBinaryLooseMethodInstallationAllowed
  34292.     "Private - Answer true if loose method can be installed into the image by a BinaryPackage"
  34293.  
  34294.     ^true!
  34295.  
  34296. isConsoleApplication
  34297.     "Answer whether the session is for a console application (as opposed to a GUI application)."
  34298.  
  34299.     ^self class isConsoleApplication!
  34300.  
  34301. isDLL
  34302.     "Private - Answer whether the receiver is a shared library, as opposed to an application."
  34303.  
  34304.     ^false!
  34305.  
  34306. isEmbedded
  34307.     "Answer whether the session is running, or should be started, in 'embedded' 
  34308.     mode (i.e. headless)."
  34309.  
  34310.     ^self isDLL or: [self isEmbedding]!
  34311.  
  34312. isEmbedding
  34313.     "Answer whether the session was started with the /Embedded flag."
  34314.  
  34315.     ^self cmdLineFlags includes: 'Embedding'!
  34316.  
  34317. isHeadless
  34318.     "Private - Answer whether the session is _currently_ headless. This is most likely if the
  34319.     image was started with the /Embedded flag, and no visible windows have subsequently been
  34320.     opened."
  34321.  
  34322.     ^self inputState hasVisibleWindows not!
  34323.  
  34324. isRuntime
  34325.     "Answer whether this is a run-time session (i.e. running an application rather than the development
  34326.     system."
  34327.  
  34328.     ^self class isRuntime!
  34329.  
  34330. keepAlive
  34331.     "The inputState has determined that there are no live windows.
  34332.     By default we therefore shutdown if not acting as an embedded server.
  34333.  
  34334.     This can be overridden by derived classes that want to employ
  34335.     a different policy for deciding when to shut down."
  34336.  
  34337.     (self isEmbedded and: [self hasActiveServers])
  34338.         ifFalse: [self quit]!
  34339.  
  34340. logComment: aString
  34341.     "Ignore the comment string."
  34342.  
  34343. !
  34344.  
  34345. logError: anException
  34346.     "Append details about the unhandled exception, anException, to the session error log.
  34347.     Ignored for runtime systems, but it is suggested that subclasses perform some appropriate
  34348.     form of error logging. Here we are using the VM's dump facility to append a short
  34349.     but informative log each time an error occurs, to <app name>.ERRORS."
  34350.  
  34351.     VMLibrary default dump: anException description path: nil stackDepth: 0 walkbackDepth: -1!
  34352.  
  34353. logErrorEvent: message
  34354.     "Write a EVENTLOG_ERROR_TYPE entry to the system event log. Only available on NT/Win2K."
  34355.  
  34356.     self logEvent: message type: EVENTLOG_ERROR_TYPE!
  34357.  
  34358. logEvent: message type: typeCode
  34359.     "Write an entry to the system event log. Only available on NT/Win2K."
  34360.  
  34361.     | inserts app |
  34362.     eventLogHandle isNil ifTrue: [
  34363.         self openEventLog.
  34364.         eventLogHandle isNil ifTrue: ["Event log not available" ^self]].
  34365.  
  34366.     inserts := DWORDArray new: 2.
  34367.     app := self applicationName.
  34368.     inserts at: 1 put: app yourAddress.
  34369.     inserts at: 2 put: message yourAddress.
  34370.  
  34371.     (AdvApiLibrary default reportEvent: eventLogHandle wType: typeCode wCategory: 0 dwEventId: 1
  34372.             lpUserSid: nil wNumStrings: 2 dwDataSize: 0 lpStrings: inserts lpRawData: nil)
  34373.         ifFalse: [Win32Error signal]!
  34374.  
  34375. logInformationEvent: message
  34376.     "Write a EVENTLOG_INFORMATION_TYPE entry to the system event log. Only available on NT/Win2K."
  34377.  
  34378.     self logEvent: message type: EVENTLOG_INFORMATION_TYPE!
  34379.  
  34380. logSuccessEvent: message
  34381.     "Write a EVENTLOG_SUCCESS entry to the system event log. Only available on NT/Win2K."
  34382.  
  34383.     self logEvent: message type: EVENTLOG_SUCCESS!
  34384.  
  34385. logWarningEvent: message
  34386.     "Write a EVENTLOG_WARNING_TYPE entry to the system event log. Only available on NT/Win2K."
  34387.  
  34388.     self logEvent: message type: EVENTLOG_WARNING_TYPE!
  34389.  
  34390. main
  34391.     "Start the application associated with this run-time session. 
  34392.     This is the point to open the main application window, etc. It is called from the
  34393.     main UI process after the system startup has completed. See, for example,
  34394.     NotepadSessionManager that accompanies the Notepad sample."
  34395.  
  34396.     "N.B. There is no need to supersend this, it is a hook designed purely for app. use"!
  34397.  
  34398. mainLoopStarted
  34399.     "Private - The main UI loop has started, from which this message was sent.
  34400.     Enter the fifth age (maturity), and be 'In fair round belly with good capon lined.
  34401.     This is an appropriate time to fire up the application."
  34402.  
  34403.     state := 5.
  34404.     self main!
  34405.  
  34406. noVisibleWindows
  34407.     "Private - The inputState has determined that there are no live windows.
  34408.     If we have entered the fifth age (up and running), but not progressed
  34409.     into the sixth age, then send out a keepAlive heartbeat."
  34410.  
  34411.     state == 5     "Full of wise saws and modern instances?"
  34412.         ifTrue: [self keepAlive]
  34413. !
  34414.  
  34415. onCloseConsole
  34416.     "The user is attempting to close the console window. Act accordingly."
  34417.  
  34418.     self exit: 0!
  34419.  
  34420. onConsoleCtrl: dwCtrlType
  34421.     "Private - Private  - Handle a console control event.
  34422.     If you set a breakpoint in here, don't terminate the process or it will exit
  34423.     the Dolphin image when 0 (false) is returned and NT invokes the default
  34424.     handler."
  34425.  
  34426.     dwCtrlType < CTRL_CLOSE_EVENT
  34427.         ifTrue: [self inputState queueDeferredAction: [self onUserBreak]]
  34428.         ifFalse: [
  34429.             dwCtrlType = CTRL_CLOSE_EVENT
  34430.                 ifTrue: [self onCloseConsole]
  34431.                 ifFalse: [self inputState postQuit: dwCtrlType]].
  34432.     ^true!
  34433.  
  34434. onExit
  34435.     "Perform pre-termination actions.
  34436.     Note that it is too late to stop session termination now (at least in the design
  34437.     of the DevelopmentSessionManager)."
  34438.  
  34439.     state := 6.        "Into the lean and slippered pantaloon"
  34440.  
  34441.     self trigger: #sessionStopped.
  34442.     self shutdown.
  34443.     ^true    "We don't allow cancel, but a subclass could answer false if it wanted"!
  34444.  
  34445. onPostSaveImage
  34446.     "Private - Perform post-image save actions"
  34447.  
  34448.     self clearSessionState.
  34449.     self trigger: #imageSaveCompleted!
  34450.  
  34451. onPreSaveImage
  34452.     "Private - Perform pre-image save actions"
  34453.  
  34454.     self trigger: #imageSaveStarting.
  34455.     self saveSessionState.
  34456.     
  34457.     "These could be done with triggers, but they are critical to system operation
  34458.     and will always be required. In addition, the Delay pre-save operation should
  34459.     be done as close as possible to the actual save so that it is able to record
  34460.     the correct milliscond clock value for rescheduling delays on restart."
  34461.     MemoryManager current onPreSaveImage.
  34462.     self class environment at: #Delay ifPresent: [:d | d onPreSaveImage].
  34463.  
  34464. !
  34465.  
  34466. onQueryEndSession
  34467.     "The system is shutting down, answer whether we object."
  34468.     
  34469.     | okToQuit |
  34470.     okToQuit := true asValue.
  34471.     self trigger: #queryEndSession: with: okToQuit.
  34472.     ^self onQuit: (okToQuit value ifTrue: [0] ifFalse: [1])!
  34473.  
  34474. onQuit: anInteger
  34475.     "Handle a request to exit - the argument is the exit code.
  34476.     This message is normally sent from the InputState message pump.
  34477.     In general it should not be possible to cancel at this stage, but it
  34478.     is permitted by answering false."
  34479.  
  34480.     ^self quit: anInteger.        "Does not return unless cancelled"!
  34481.  
  34482. onStartup: args
  34483.     "Initialize the receiver immediately following system startup.
  34484.     This is the main system initialization routine, and is responsible
  34485.     for starting the windowing system, the process system, etc.
  34486.     WARNING: If you break the early startup process (especially before prestart.st)
  34487.     then you will not be able to load your image. It is recommended, therefore, that
  34488.     if changing startup code, you should attempt to run up a new copy of the image
  34489.     just saved BEFORE closing down. Walkbacks will work at just about any stage,
  34490.     but other windows will not open if View>>onStartup has not been run."
  34491.  
  34492.     state := 0.
  34493.     eventLogHandle := stdioStreams := consoleHandler := nil.
  34494.  
  34495.     "Save away the Array of startup arguments, passed in by the VM, for later use"
  34496.     startupArgs := args.
  34497.  
  34498.     args class == Array
  34499.         ifTrue: [imagePath := args first]
  34500.         ifFalse: [imagePath := args].
  34501.  
  34502.     cmdLineFlags := argv := nil.
  34503.     [
  34504.     self primaryStartup.
  34505.     state := 1.        "Mewling and puking in the nurse's arms"
  34506.  
  34507.     "Before the secondary startup, lets have an opportunity of getting
  34508.     in and fixing and possible problems with the image (only required in Development?)"
  34509.     self preStart.
  34510.     
  34511.     self secondaryStartup.
  34512.     state := 2.        "The whining schoolboy with shining morning face"
  34513.  
  34514.     "We are now in a position to claim ownership of the image file, if relevant."
  34515.     self registerRunning.
  34516.  
  34517.     "Trigger any user startup processing"
  34518.     [self trigger: #sessionStarted]
  34519.         ensure: [self tertiaryStartup].
  34520.     state := 3.        "The Lover sighing like furnace"
  34521.     ] ensure: [
  34522.         "Always attempt to start the main process (must place into state 5)
  34523.          even if earlier startup failed. This may help recover a damaged
  34524.          development image if the startup has progressed sufficiently far."
  34525.         self forkMain.
  34526.         state := 4.        "Full of strange oaths and bearded like the pard"
  34527.     ].
  34528.  
  34529.     "We must terminate the active process to prevent it from continuing from where it left
  34530.     off when the image was saved and running onExit processing, or whatever it would have
  34531.     done next. We also kill it to prevent any invalid termination running."
  34532.     Processor activeProcess kill!
  34533.  
  34534. onUnhandledError: anError
  34535.     "The unhandled Error, anError, occurred in the active Process.
  34536.     Perform whatever default processing is appropriate for the application."
  34537.  
  34538.     ^self unhandledException: anError!
  34539.  
  34540. onUnhandledNotification: aNotification
  34541.     "The unhandled Notification, aNotification, occurred in the active Process.
  34542.     Display the notification description on the Transcript (or other trace device)."
  34543.  
  34544.     aNotification toTrace.
  34545.     "aNotification printTraceOn: Transcript."        "Use this to get more detail about where it came from."
  34546.     ^nil!
  34547.  
  34548. onUnhandledWarning: aWarning
  34549.     "The unhandled Warning, aWarning, occurred in the active Process.
  34550.     Depending on the user response, either resume or terminate the process."
  34551.  
  34552.     ^self unhandledException: aWarning!
  34553.  
  34554. onUserBreak
  34555.     "Private - The user interrupted the currect active process by pressing the
  34556.     interrupt key combination (usually CTRL+BREAK). Take appropriate action
  34557.     according to the session requirements."
  34558.  
  34559.     self inputState userInterruptSignal signal
  34560. !
  34561.  
  34562. openConsole
  34563.     "Open and a console for this session and connect standard input and output streams.
  34564.     Answer whether the console was open already."
  34565.  
  34566.     | wasOpen |
  34567.     wasOpen := consoleHandler notNil.
  34568.     self 
  34569.         allocConsole;
  34570.         registerConsoleCtrlHandler;
  34571.         openConsoleStreams.
  34572.     ^wasOpen!
  34573.  
  34574. openConsoleStreams
  34575.     "Private - Open the standard console I/O streams."
  34576.  
  34577.     ^self subclassResponsibility!
  34578.  
  34579. openEventLog
  34580.     "Private - Open the NT event log for writing, and answer a handle onto it that can be passed to the
  34581.     ReportEvent() API."
  34582.  
  34583.     OSVERSIONINFO current isNT 
  34584.         ifTrue: 
  34585.             [eventLogHandle := VMLibrary default 
  34586.                         registerEventSource: self eventLogSource].
  34587.     ^eventLogHandle!
  34588.  
  34589. openLibraries
  34590.     "Private - Open the base set of external libraries (ExternalLibrary>>onStartup must
  34591.     open the PermanentLibraries)."
  34592.  
  34593.     ExternalLibrary onStartup!
  34594.  
  34595. outer
  34596.     "Answer the 'outer' value which was passed by the .EXE which started up the image.
  34597.     Often this will be an IUnknown pointer, but as far as the default SessionManager is
  34598.     concerned it is just an opaque value."
  34599.  
  34600.     ^startupArgs at: 2!
  34601.  
  34602. preStart
  34603.     "A hook for user configuration of the starutp - for example the development session
  34604.     manager uses this to file in a prestart.st fixup file, if there is one.
  34605.     The default is to do nothing."
  34606. !
  34607.  
  34608. primaryStartup
  34609.     "Perform very early startup actions.
  34610.     Before these actions are performed the system isn't even blinking in the daylight."
  34611.  
  34612.     self basicPrimaryStartup.
  34613.     Smalltalk at: #SourceManager ifPresent: [:sm | sm default ignoreSources]!
  34614.  
  34615. primQuit: anInteger
  34616.     "Private - Terminate Smalltalk immediately with anInteger as the exit code. Graceful termination 
  34617.     should be initiated via #exit. The primitive never fails, and never returns."
  34618.  
  34619.     <primitive: 113>
  34620.     ^self primitiveFailed!
  34621.  
  34622. primSnapshot: fileName backup: aBoolean type: anInteger
  34623.     "Private - Save the current image to fileName, optionally creating a backup of the existing file.
  34624.  
  34625.     Primitive failure codes:
  34626.         0    - fileName not a String
  34627.         1    - The image has expired
  34628.         2    - Unable to open image file
  34629.         3    - I/O Error writing image file (try KernelLibrary>>getLastError)."
  34630.  
  34631.     | result |
  34632.     <primitive: 97>
  34633.     result := Processor activeProcess primitiveFailureCode.
  34634.     result == 1 
  34635.         ifTrue: 
  34636.             [Warning signal: (String fromId: self expiredImageTextId
  34637.                         in: VMLibrary default asParameter)]
  34638.         ifFalse: [self error: 'Dolphin was unable to save the image.']!
  34639.  
  34640. quit
  34641.     "Force a close down of the session with the default exit code (0)"
  34642.  
  34643.     self quit: 0!
  34644.  
  34645. quit: anInteger
  34646.     "Private - Force a close down of the session with the specified exit code."
  34647.  
  34648.     self onExit ifTrue: [self primQuit: anInteger].
  34649.     ^false    "cancelled"!
  34650.  
  34651. registerConsoleCtrlHandler
  34652.     "Private - Associate a control callback with the console for Ctrl-C, etc, events from
  34653.     the OS."
  34654.  
  34655.     consoleHandler isNil ifTrue: [
  34656.         consoleHandler :=  MessageCallback
  34657.                         receiver: self
  34658.                         selector: #onConsoleCtrl:
  34659.                         descriptor: (ExternalDescriptor fromString: 'stdcall: bool dword').
  34660.         KernelLibrary default setConsoleCtrlHandler: consoleHandler asParameter add: true]!
  34661.  
  34662. registerRunning
  34663.     "Private - Register this session as the owner of the image by creating a named Win32 event.
  34664.     If we find that we have been beaten to it by a new pretender, then perform SessionManager
  34665.     specific action, which could include bowing out, or perhaps brazenly continuing."
  34666.  
  34667.     sentry := KernelLibrary default 
  34668.                 createEvent: nil bManualReset: false 
  34669.                 bInitialState: false 
  34670.                 lpName: (self imageFileName copyReplacing: $\ withObject: $/).
  34671.     KernelLibrary default getLastError == ERROR_ALREADY_EXISTS
  34672.         ifTrue: [self allowDuplicate ifFalse: [self quit: ERROR_ALREADY_EXISTS]]!
  34673.  
  34674. registerServer: server
  34675.     "Register the argument as a 'server' object which is handling unsolicited
  34676.     requests, e.g. an OLE COM class factory. The presence of registered servers
  34677.     prevents the receiver shutting down when run as a headless server."
  34678.  
  34679.     self servers add: server!
  34680.  
  34681. resourceManager
  34682.     "Answer the ResourceManager inst var."
  34683.  
  34684.     resourceManager isNil ifTrue: [resourceManager := ResourceManager new].
  34685.     ^resourceManager!
  34686.  
  34687. saveImage
  34688.     "Save an image of the current session so that it may be restored later. The precise operation 
  34689.     performed depends on the subclass (e.g. the DevelopmentSessionManager performs the traditional
  34690.     image snapshot, but a run-time SessionManager may save some other smaller set of information
  34691.     which is not a dump of the entire object memory)."
  34692.  
  34693.     self onPreSaveImage.
  34694.     [self saveImageDefault] ensure: [self onPostSaveImage]
  34695. !
  34696.  
  34697. saveImage: name
  34698.     "Save an image of the current session to the specified name (generally a file path).
  34699.     The precise operation performed (what is saved to where and how) is the responsibility
  34700.     of the subclass."
  34701.  
  34702.     self onPreSaveImage.
  34703.     [self saveImageTo: name] ensure: [self onPostSaveImage]
  34704. !
  34705.  
  34706. saveImageDefault
  34707.     "Save an image of the current session to the default persistant store (whatever that is)."
  34708.  
  34709.     ^self error: 'Unable to save image'!
  34710.  
  34711. saveImageTo: name
  34712.     "Save an image of the current session to the persistant store with the specified
  34713.     name (whatever that is)."
  34714.  
  34715.     ^self snapshot: name!
  34716.  
  34717. saveSessionState
  34718.     "Save down any session state that needs to be preserved and which is not automatically
  34719.     preserved by a normal image save. Examples would be externally managed resources
  34720.     such as Windows."
  34721.  
  34722.     "By default, assume there is no saved state, and do nothing"!
  34723.  
  34724. secondaryStartup
  34725.     "Perform second stage startup actions which can be done after prestart which
  34726.     provides a window to fix startup problems. Try and do things here rather than in 
  34727.     primary startup."
  34728.  
  34729.     self basicSecondaryStartup.
  34730.     self startUI.
  34731.     self comStartup!
  34732.  
  34733. servers
  34734.     "Private - Answer the registry of servers registered with this session."
  34735.  
  34736.     servers isNil ifTrue: [servers := SharedIdentitySet new].
  34737.     ^servers!
  34738.  
  34739. serverShutdown
  34740.     "Private - Determine if the system is running as a server, and if so, whether
  34741.     it should shut down."
  34742.  
  34743.     Notification signal: 'Server shutdown request'.
  34744.     (self isHeadless and: [self servers isEmpty])
  34745.         ifTrue: [self exit]!
  34746.  
  34747. setenv: nameString value: valueString
  34748.     "Set the value of the specified environment variable."
  34749.  
  34750.     (KernelLibrary default setEnvironmentVariable: nameString lpValue: valueString)
  34751.         ifFalse: [KernelLibrary default systemError]!
  34752.  
  34753. shutdown
  34754.     "Perform shutdown operations before the VM puts out the lights."
  34755.  
  34756.     state := 7.        "Second childishness and mere oblivion"
  34757.     self basicShutdown
  34758. !
  34759.  
  34760. snapshot: fileName
  34761.     "Private - Save the current image to fileName."
  34762.  
  34763.     ^self 
  34764.         primSnapshot: fileName
  34765.         backup: false
  34766.         type: 0!
  34767.  
  34768. startUI
  34769.     "Start up the input loop/message loop (instruct InputState appropriate depending on whether
  34770.     this is a GUI or console session)."
  34771.  
  34772.     ^self subclassResponsibility!
  34773.  
  34774. startupArgs
  34775.     "Private - Answer two element Array containing the startup arguments that were passed to this
  34776.     session."
  34777.  
  34778.     ^startupArgs!
  34779.  
  34780. stderr
  34781.     "Answer the standard error stream (a <puttableStream>)."
  34782.  
  34783.     ^self stdioStreams at: 3!
  34784.  
  34785. stderr: aStream
  34786.     "Set the standard error stream to the be <puttableStream> argument.
  34787.     Generally speaking this is connected to the CRT stderr stream."
  34788.  
  34789.     self stdioStreams at: 3 put: aStream!
  34790.  
  34791. stdin
  34792.     "Answer the standard input stream (a <gettableStream>)."
  34793.  
  34794.     ^self stdioStreams at: 1!
  34795.  
  34796. stdin: inputStream
  34797.     "Set the standard input stream to the be <gettableStream> argument."
  34798.  
  34799.     self stdioStreams at: 1 put: inputStream!
  34800.  
  34801. stdioStreams
  34802.     "Private - Answer the 3-element <Array> of <StdioFileStream>s which are the 
  34803.     CRT stdin, stdout, and stderr streams, opening the streams if they are not
  34804.     currently available."
  34805.  
  34806.     stdioStreams isNil ifTrue: [self openConsole].
  34807.     ^stdioStreams!
  34808.  
  34809. stdout
  34810.     "Answer the standard output stream (a <puttableStream>)."
  34811.  
  34812.     ^self stdioStreams at: 2!
  34813.  
  34814. stdout: outputStream
  34815.     "Set the standard output stream to the be <puttableStream> argument."
  34816.  
  34817.     self stdioStreams at: 2 put: outputStream
  34818. !
  34819.  
  34820. systemDirectory
  34821.     "Answer the path of the Windows system directory on the host computer
  34822.     for the current session."
  34823.  
  34824.     | path len |
  34825.     path := File pathBuffer.
  34826.     len := KernelLibrary default getSystemDirectory: path uSize: path size.
  34827.     ^len == 0
  34828.         ifTrue: [KernelLibrary default systemError]
  34829.         ifFalse: [path leftString: len]!
  34830.  
  34831. tertiaryStartup
  34832.     "Perform last startup operations before the main process is started - this includes firing the onStartup
  34833.     trigger."
  34834.  
  34835.     self basicTertiaryStartup!
  34836.  
  34837. trace: aString
  34838.     "Append aString to the trace device."
  34839.  
  34840.     KernelLibrary default outputDebugString: aString!
  34841.  
  34842. unhandledException: anException
  34843.     "Private - The unhandled Exception, anException, occurred in the active Process.
  34844.     Depending on the user response and the resumability of the exception, either 
  34845.     resume or terminate the process.
  34846.     Note: The exception response protocol (#resume, #pass, #outer, #exit, etc)
  34847.     can only be sent to an Exception inside a handler block (i.e. the second
  34848.     argument to BlockClosure>>on:do:)."
  34849.  
  34850.     self logError: anException.
  34851.     ^anException okToContinue
  34852.         ifTrue: ["Resume execution" anException]
  34853.         ifFalse: [Processor activeProcess terminate]!
  34854.  
  34855. unregisterConsoleCtrlHandler
  34856.     "Private - Unregister the console control callback."
  34857.  
  34858.     consoleHandler isNil ifFalse: [
  34859.         KernelLibrary default  setConsoleCtrlHandler: consoleHandler asParameter add: false.
  34860.         consoleHandler free.
  34861.         consoleHandler := nil]!
  34862.  
  34863. unregisterServer: server
  34864.     "The argument, server, is requesting session termination, as it is no
  34865.     longer required. If there are no further services active and the system is only
  34866.     running services (i.e. it is a headless app.), then the request is accepted."
  34867.  
  34868.     self servers remove: server ifAbsent: [].
  34869.     self serverShutdown!
  34870.  
  34871. userName
  34872.     "Answer the name of the user currently logged on. Signals a Win32Error if
  34873.     the request fails"
  34874.  
  34875.     | name nameSize |
  34876.     name := String new: 256.
  34877.     nameSize := DWORD fromInteger: name size.
  34878.     (AdvApiLibrary default getUserName: name nSize: nameSize asParameter)
  34879.         ifFalse: [AdvApiLibrary default systemError].
  34880.     ^name leftString: (nameSize asInteger-1)!
  34881.  
  34882. versionInfo
  34883.     "Answer the <VersionInfo> for this session, extracted from the host executable."
  34884.  
  34885.     ^VersionInfo forPath: (ExternalLibrary moduleFileName: nil)
  34886. !
  34887.  
  34888. windowsDirectory
  34889.     "Answer the path of the Windows system directory on the host computer
  34890.     for the current session."
  34891.  
  34892.     | path len |
  34893.     path := File pathBuffer.
  34894.     len := KernelLibrary default getWindowsDirectory: path uSize: path size.
  34895.     ^len == 0
  34896.         ifTrue: [KernelLibrary default systemError]
  34897.         ifFalse: [path leftString: len]! !
  34898.  
  34899. SharedQueue comment:
  34900. ''!
  34901. !SharedQueue class methodsFor!
  34902.  
  34903. initialize
  34904.     "Private - Initialize the receiver's class variables.
  34905.         SharedQueue initialize
  34906.     "
  34907.  
  34908.     AbsentCookie := Object new!
  34909.  
  34910. new
  34911.     "Answer a new instance of the receiver."
  34912.  
  34913.     ^self new: 4!
  34914.  
  34915. new: anInteger 
  34916.     "Answer a new instance of the receiver with initial space
  34917.     for anInteger elements in the queue."
  34918.  
  34919.     ^(self basicNew)
  34920.         initialize: anInteger;
  34921.         yourself! !
  34922.  
  34923. !SharedQueue methodsFor!
  34924.  
  34925. errorOutOfSync
  34926.     "Private - An internal synchronisation error (between the valueAvailable
  34927.     Semaphore and the contents OrderedCollection) has been detected.
  34928.     Raise an appropriate exception."
  34929.  
  34930.     self error: 'internal synchronisation error'!
  34931.  
  34932. initialize: anInteger
  34933.     "Private - Initialize the receiver, providing sufficient initial space
  34934.     in the queue for anInteger elements (the queue will grow however)."
  34935.  
  34936.     contents := OrderedCollection new.
  34937.     accessProtect := Semaphore forMutualExclusion.
  34938.     valueAvailable := Semaphore new
  34939. !
  34940.  
  34941. next
  34942.     "Answer the first item in the queue. If the queue is empty, make the current active 
  34943.     Process wait until another Process has put an object in the queue. Safe for multiple 
  34944.     consumers, since valueAvailable effectively records the number of entries in the queue."
  34945.  
  34946.     | value |
  34947.     valueAvailable wait.
  34948.     value := accessProtect critical: [contents removeFirstIfAbsent: [AbsentCookie]].
  34949.     value == AbsentCookie ifTrue: [self errorOutOfSync].
  34950.     ^value!
  34951.  
  34952. nextNoWait
  34953.     "Answer the first item in the queue, or nil if the queue is empty. The current active Process
  34954.     will not be made to wait, regardless of the queue state.
  34955.     Note: This is implemented rather than #isEmpty in order that the test and retrieval can
  34956.     be performed as an atomic unit. We also suppress any error due to the valueAvailable and
  34957.     contents collection size being out of sync. in order to avoid leaving the critical
  34958.     section locked. So even if the queue really is empty when the valueAvailable Semaphore
  34959.     says it is not, the external behaviour is correctly maintained."
  34960.  
  34961.     | value |
  34962.     (valueAvailable wait: 0) == WAIT_TIMEOUT ifTrue: [^nil].
  34963.     value := accessProtect critical: [contents removeFirstIfAbsent: [AbsentCookie]].
  34964.     value == AbsentCookie ifTrue: [self errorOutOfSync].
  34965.     ^value!
  34966.  
  34967. nextPut: value
  34968.     "Place the object, value, at the end of the queue, signalling the valueAvailable 
  34969.     semaphore    to permit consumers to continue, or record the current number of items in
  34970.     the queue if there are no consumers waiting. Answer the argument, value."
  34971.  
  34972.     accessProtect critical: [contents addLast: value].
  34973.     valueAvailable signal.
  34974.     ^value
  34975. !
  34976.  
  34977. peek
  34978.     "Answer the first object in the queue, but do not remove it. If the queue is empty, answer nil.
  34979.     The current active process will not be made to wait regardless of the queue state."
  34980.  
  34981.     ^accessProtect critical: [contents isEmpty ifFalse: [contents first]]!
  34982.  
  34983. size
  34984.     "Answer the number of objects currently in the queue"
  34985.  
  34986.     ^accessProtect critical: [contents size]! !
  34987.  
  34988. Signal comment:
  34989. ''!
  34990. !Signal class methodsFor!
  34991.  
  34992. description: anObject
  34993.     "Answer a new, non-resumable, instance of the receiver with the specified description"
  34994.  
  34995.     ^self new description: anObject!
  34996.  
  34997. icon
  34998.     "Answers an Icon that can be used to represent this class"
  34999.  
  35000.     ^Error icon!
  35001.  
  35002. new
  35003.     "Answer a new correctly initialize instance of the receiver."
  35004.     
  35005.     ^super new initialize!
  35006.  
  35007. resumableDescription: anObject
  35008.     "Answer a new continuable instance of the receiver with the specified description."
  35009.  
  35010.     ^self new 
  35011.         description: anObject;
  35012.         makeResumable! !
  35013.  
  35014. !Signal methodsFor!
  35015.  
  35016. , arg
  35017.     "Answer a new <ExceptionSet> containing the receiver and the argument."
  35018.  
  35019.     ^ExceptionSet with: self with: arg!
  35020.  
  35021. defaultAction: exception
  35022.     "Private - Perform the default action for the raised incarnation of the receiver,
  35023.     exception, as it has not been handled.
  35024.     Implementation Note: forward to the SessionManager for application specific handling."
  35025.  
  35026.     "Will not return unless execution is to be resumed"
  35027.     ^SessionManager current onUnhandledError: exception!
  35028.  
  35029. defaultResumption
  35030.     "Private - Answer the default setting for the receiver's resumable flag."
  35031.  
  35032.     ^false!
  35033.  
  35034. description
  35035.     "Private - Answer the receiver's description format string."
  35036.  
  35037.     ^description!
  35038.  
  35039. description: aString
  35040.     "Set the description of the receiver to be aString. The description can include
  35041.     Win32 format substitution specifiers."
  35042.  
  35043.     description := aString!
  35044.  
  35045. exceptionClass
  35046.     "Private - Answer the class of Exception to be raised when the receiver
  35047.     is signalled."
  35048.  
  35049.     ^RaisedSignal!
  35050.  
  35051. handles: exception
  35052.     "Answer whether the receiver matches the <exceptionDescription>, exception, and 
  35053.     any handler at this scope should be invoked."
  35054.  
  35055.     ^exception signalType == self
  35056. !
  35057.  
  35058. initialize
  35059.     "Private - Initialize the receiver's instance variables."
  35060.  
  35061.     resumable := self defaultResumption.
  35062.     description := '%1'!
  35063.  
  35064. isResumable
  35065.     "Answer whether the receiver represents a resumable Signal."
  35066.  
  35067.     ^resumable!
  35068.  
  35069. makeNonResumable
  35070.     "Make the receiver a non-resumable Signal. Answer the receiver."
  35071.  
  35072.     resumable := false!
  35073.  
  35074. makeResumable
  35075.     "Make the receiver a resumable Signal. Answer the receiver."
  35076.  
  35077.     resumable := true!
  35078.  
  35079. newException
  35080.     "Answer a new <Exception> instantiated on the receiver, but as yet unsignalled."
  35081.  
  35082.     ^self exceptionClass new
  35083.         signalType: self;
  35084.         yourself!
  35085.  
  35086. printOn: aStream
  35087.     "Append a short textual description of the receiver to aStream."
  35088.  
  35089.     aStream
  35090.         basicPrint: self;
  35091.         nextPut: $(;
  35092.         print: self description;
  35093.         nextPut: $)
  35094. !
  35095.  
  35096. resumable: aBoolean
  35097.     "Set whether the receiver represents a resumable Signal."
  35098.  
  35099.     resumable := aBoolean!
  35100.  
  35101. signal
  35102.     "Signal the occurrence of an exceptional condition.
  35103.     This method will not normally return to its sender.
  35104.     Implementation Note: A new <Exception> is instantiated and
  35105.     signalled, initiating a search for an ExceptionHandler prepared to
  35106.     handle that exception."
  35107.  
  35108.     ^self newException signal!
  35109.  
  35110. signal: signalerText
  35111.     "Signal the occurrence of an exceptional condition with the specified description.
  35112.     This method will not normally return to its sender.
  35113.     N.B. X3J20 requires that the argument, signalDescription, conform to the 
  35114.     <readableString> protocol, but we relax this to permit an object (which is sent 
  35115.     #displayString to get a <readableString>).
  35116.     Portable code should use only <readableString> descriptions.
  35117.     Implementation Note: Raise a new <Exception> instance with the specified details, 
  35118.     initiating a search for an ExceptionHandler prepared to handle that exception."
  35119.     
  35120.     ^self newException signal: signalerText!
  35121.  
  35122. signal: signalerText with: signalerTag
  35123.     "Signal the occurrence of an exceptional condition with the specified description
  35124.     and tag. This method will not normally return to its sender."
  35125.     
  35126.     ^self newException
  35127.         signal: signalerText
  35128.         with: signalerTag
  35129. !
  35130.  
  35131. signalWith: signalerTag
  35132.     "Signal the occurrence of an exceptional condition with the specified tag object.
  35133.     This method will not normally return to its sender."
  35134.     
  35135.     ^self newException signalWith: signalerTag! !
  35136.  
  35137. SmalltalkParser comment:
  35138. 'Instance Variables:
  35139.     scanner        <SmalltalkScanner>
  35140.     currentToken    <StToken>
  35141.     nextToken    <StToken>
  35142.     emptyStatements    <boolean>
  35143.     errorBlock        <dyadicValuable>
  35144.     source        <readableString>
  35145.     methodClass    <Class>|<Metaclass>
  35146.     methodNode    <StMethodNode>
  35147.  
  35148. Class Variables:
  35149.     ExternalValueTypes         <LookupTable>. Maps standard external type names, as recognised by the old Dolphin Compiler to the parameter types to be used for passing by value and by reference.
  35150.     ExternalReferenceTypes    <Array> of <integer>|<Symbol>. Reference types corresponding to the <integer> external value types.
  35151.     ExternalCallingConventions    <Array> of <String>. External calling convention keywords (e.g. ''cdecl:'').
  35152.     MaxPrimIndex        <integer>. Maximum primitive number.
  35153.     MaxVfn            <integer>. Maximum virtual function number.
  35154.  
  35155. '!
  35156. !SmalltalkParser class methodsFor!
  35157.  
  35158. initialize
  35159.     "Private - Initialize the receiver's class variables.
  35160.         SmalltalkParser initialize
  35161.     "
  35162.  
  35163.     MaxPrimIndex := 192.
  35164.     MaxVfn := 1024.
  35165.     ExternalValueTypes := LookupTable new.
  35166.     ExternalValueTypes
  35167.         at: 'sdword' put: ExtCallArgSDWORD;
  35168.         at: 'dword' put: ExtCallArgDWORD;
  35169.         at: 'lpvoid' put: ExtCallArgLPVOID;
  35170.         at: 'handle' put: ExtCallArgHANDLE;
  35171.         at: 'lppvoid' put: ExtCallArgLPPVOID;
  35172.         at: 'lpstr' put: ExtCallArgLPSTR;
  35173.         at: 'bool' put: ExtCallArgBOOL;
  35174.         at: 'double' put: ExtCallArgDOUBLE;
  35175.         at: 'float' put: ExtCallArgFLOAT;
  35176.         at: 'hresult' put: ExtCallArgHRESULT;
  35177.         at: 'char' put: ExtCallArgCHAR;
  35178.         at: 'byte' put: ExtCallArgBYTE;
  35179.         at: 'sbyte' put: ExtCallArgSBYTE;
  35180.         at: 'word' put: ExtCallArgWORD;
  35181.         at: 'sword' put: ExtCallArgSWORD;
  35182.         at: 'oop' put: ExtCallArgOOP;
  35183.         at: 'lpwstr' put: ExtCallArgLPWSTR;
  35184.         at: 'bstr' put: ExtCallArgBSTR;
  35185.         at: 'qword' put: ExtCallArgQWORD;
  35186.         at: 'sqword' put: ExtCallArgSQWORD;
  35187.         at: 'ote' put: ExtCallArgOTE;
  35188.         at: 'variant' put: ExtCallArgVARIANT;
  35189.         at: 'varbool' put: ExtCallArgVARBOOL;
  35190.         at: 'guid' put: ExtCallArgGUID;
  35191.         at: 'date' put: ExtCallArgDATE.
  35192.     "void is only valid as a return type, not an argument type."
  35193.     ExternalValueTypes at: 'void' put: ExtCallArgVOID.
  35194.  
  35195.     "Convert a few class types to the special types to save space and time"
  35196.     ExternalValueTypes
  35197.         at: 'ExternalAddress' put: ExtCallArgLPVOID;
  35198.         at: 'ExternalHandle' put: ExtCallArgHANDLE;
  35199.         at: 'BSTR' put: ExtCallArgBSTR;
  35200.         at: 'VARIANT' put: ExtCallArgVARIANT;
  35201.         at: 'SDWORD' put: ExtCallArgSDWORD;
  35202.         at: 'DWORD' put: ExtCallArgDWORD;
  35203.         at: 'LPVOID' put: ExtCallArgLPVOID;
  35204.         at: 'DOUBLE' put: ExtCallArgDOUBLE;
  35205.         at: 'FLOAT' put: ExtCallArgFLOAT;
  35206.         at: 'HRESULT' put: ExtCallArgHRESULT;
  35207.         at: 'BYTE' put: ExtCallArgBYTE;
  35208.         at: 'SBYTE' put: ExtCallArgSBYTE;
  35209.         at: 'WORD' put: ExtCallArgWORD;
  35210.         at: 'SWORD' put: ExtCallArgSWORD;
  35211.         at: 'LPWSTR' put: ExtCallArgLPWSTR;
  35212.         at: 'QWORD' put: ExtCallArgQWORD;
  35213.         at: 'ULARGE_INTEGER' put: ExtCallArgQWORD;
  35214.         at: 'SQWORD' put: ExtCallArgSQWORD;
  35215.         at: 'LARGE_INTEGER' put: ExtCallArgSQWORD;
  35216.         at: 'GUID' put: ExtCallArgGUID;
  35217.         at: 'IID' put: ExtCallArgGUID;
  35218.         at: 'CLSID' put: ExtCallArgGUID;
  35219.         at: 'VARIANT_BOOL' put: ExtCallArgVARBOOL;
  35220.         at: 'DATE' put: ExtCallArgDATE;
  35221.         shrink.
  35222.     "Reference types are the types to be used for the value type with one level of indirection, where the name
  35223.     of a struct class appears, this is assumed to be associated with an ExtCallArgLP argument type."
  35224.     ExternalReferenceTypes := Array new: 32.
  35225.     ExternalReferenceTypes
  35226.         at: ExtCallArgVOID + 1 put: ExtCallArgLPVOID;
  35227.         at: ExtCallArgLPPVOID put: nil;
  35228.         at: ExtCallArgCHAR + 1 put: ExtCallArgLPSTR;
  35229.         at: ExtCallArgBYTE + 1 put: ExtCallArgLPVOID;
  35230.         at: ExtCallArgSBYTE + 1 put: ExtCallArgLPVOID;
  35231.         at: ExtCallArgWORD + 1 put: #WORD;
  35232.         at: ExtCallArgSWORD + 1 put: #SWORD;
  35233.         at: ExtCallArgDWORD + 1 put: #DWORD;
  35234.         at: ExtCallArgSDWORD put: #SDWORD;
  35235.         at: ExtCallArgBOOL + 1 put: #DWORD;
  35236.         at: ExtCallArgHANDLE + 1 put: #ExternalHandle;
  35237.         at: ExtCallArgDOUBLE + 1 put: #DOUBLE;
  35238.         at: ExtCallArgLPSTR + 1 put: ExtCallArgLPPVOID;
  35239.         at: ExtCallArgOOP + 1 put: ExtCallArgLPPVOID;
  35240.         at: ExtCallArgFLOAT + 1 put: #FLOAT;
  35241.         at: ExtCallArgLPVOID + 1 put: ExtCallArgLPPVOID;
  35242.         at: ExtCallArgHRESULT + 1 put: #HRESULT;
  35243.         at: ExtCallArgLPWSTR + 1 put: ExtCallArgLPPVOID;
  35244.         at: ExtCallArgQWORD + 1 put: #ULARGE_INTEGER;
  35245.         at: ExtCallArgSQWORD + 1 put: #LARGE_INTEGER;
  35246.         at: ExtCallArgOTE + 1 put: ExtCallArgLPPVOID;
  35247.         at: ExtCallArgBSTR + 1 put: ExtCallArgLPPVOID;
  35248.         at: ExtCallArgVARIANT + 1 put: #VARIANT;
  35249.         at: ExtCallArgDATE + 1 put: #DATE;
  35250.         at: ExtCallArgVARBOOL + 1 put: #VARIANT_BOOL;
  35251.         at: ExtCallArgGUID + 1 put: #REFGUID;
  35252.         at: ExtCallArgSTRUCT + 1 put: ExtCallArgLP;
  35253.         at: ExtCallArgSTRUCT4 + 1 put: ExtCallArgLP;
  35254.         at: ExtCallArgSTRUCT8 + 1 put: ExtCallArgLP.
  35255.     "All possible calling conventions (not all are supported)"
  35256.     ExternalCallingConventions := #('stdcall:' 'cdecl:' 'fastcall:' 'thiscall:')!
  35257.  
  35258. new
  35259.     ^super new initialize!
  35260.  
  35261. parseExistingMethodNoError: aCompiledMethod
  35262.     ^[self parseMethod: aCompiledMethod getSource in: aCompiledMethod methodClass] 
  35263.         on: SmalltalkCompilerError
  35264.         do: 
  35265.             [:err | 
  35266.             Transcript
  35267.                 nextPutAll: 'Error ';
  35268.                 print: err errorCode;
  35269.                 nextPutAll: ' on line ';
  35270.                 display: err line;
  35271.                 nextPutAll: ' of ';
  35272.                 print: aCompiledMethod;
  35273.                 nextPutAll: ' -> ';
  35274.                 print: err errorMessage;
  35275.                 cr.
  35276.             nil]!
  35277.  
  35278. parseExpression: aString 
  35279.     ^self parseExpression: aString onError: nil!
  35280.  
  35281. parseExpression: aString in: aClass
  35282.     ^self parseExpression: aString in: aClass onError: nil!
  35283.  
  35284. parseExpression: aString in: aClass onError: aBlock
  35285.     | node parser |
  35286.     parser := self new.
  35287.     parser errorBlock: aBlock.
  35288.     parser methodClass: aClass.
  35289.     parser initializeParserWith: aString.
  35290.     node := parser parseExpression: aString.
  35291.     ^(node statements size == 1 and: [node temporaries isEmpty]) 
  35292.         ifTrue: [node statements first]
  35293.         ifFalse: [node]!
  35294.  
  35295. parseExpression: aString onError: aBlock 
  35296.     ^self parseExpression: aString in: Object onError: aBlock!
  35297.  
  35298. parseMethod: aString 
  35299.     ^self parseMethod: aString in: UndefinedObject!
  35300.  
  35301. parseMethod: aString in: aClass 
  35302.     ^self 
  35303.         parseMethod: aString
  35304.         in: aClass
  35305.         onError: nil!
  35306.  
  35307. parseMethod: aString in: aClass onError: aBlock
  35308.     | parser |
  35309.     parser := self new.
  35310.     parser errorBlock: aBlock.
  35311.     parser methodClass: aClass.
  35312.     parser initializeParserWith: aString.
  35313.     ^parser parseMethod: aString!
  35314.  
  35315. parseMethod: aString onError: aBlock 
  35316.     ^self 
  35317.         parseMethod: aString
  35318.         in: UndefinedObject
  35319.         onError: aBlock!
  35320.  
  35321. parseMethodNoError: aString 
  35322.     ^self parseMethodNoError: aString in: UndefinedObject!
  35323.  
  35324. parseMethodNoError: aString in: methodClass 
  35325.     ^self 
  35326.         parseMethod: aString
  35327.         in: methodClass
  35328.         onError: 
  35329.             [:message :pos | 
  35330.             Transcript
  35331.                 print: message;
  35332.                 nextPutAll: ' @ ';
  35333.                 display: pos;
  35334.                 cr.
  35335.             ^nil]!
  35336.  
  35337. parseMethodPattern: aString 
  35338.     | parser |
  35339.     parser := self new.
  35340.     parser errorBlock: [:error :position | ^nil].
  35341.     parser initializeParserWith: aString.
  35342.     ^[parser parseMessagePattern selector] on: SmalltalkCompilerError
  35343.         do: [:err | nil]! !
  35344.  
  35345. !SmalltalkParser methodsFor!
  35346.  
  35347. addCommentsTo: aNode
  35348.     aNode comments: aNode comments , comments.
  35349.     comments := OrderedCollection new!
  35350.  
  35351. assignmentNodeClass
  35352.     ^StAssignmentNode!
  35353.  
  35354. atEnd
  35355.     ^currentToken isEof!
  35356.  
  35357. blockNodeClass
  35358.     ^StBlockNode!
  35359.  
  35360. canHaveStatementsAfterReturn
  35361.     #rbFix. "Dolphin can have statements after the return"
  35362.     ^true!
  35363.  
  35364. cascadeNodeClass
  35365.     ^StCascadeNode!
  35366.  
  35367. errorBlock
  35368.     ^errorBlock isNil ifTrue: [[:message :position | ]] ifFalse: [errorBlock]!
  35369.  
  35370. errorBlock: aBlock 
  35371.     errorBlock := aBlock.
  35372.     scanner notNil ifTrue: [scanner errorBlock: aBlock]!
  35373.  
  35374. errorClass
  35375.     ^SmalltalkCompilerError!
  35376.  
  35377. errorPosition
  35378.     ^currentToken start!
  35379.  
  35380. evaluateStatements: anStSequenceNode 
  35381.     ^Compiler 
  35382.         evaluate: (source copyFrom: anStSequenceNode start to: anStSequenceNode stop)
  35383.         for: methodClass instanceClass
  35384.         logged: false!
  35385.  
  35386. externalReferenceTypeFor: valueType 
  35387.     ^ExternalReferenceTypes at: valueType + 1!
  35388.  
  35389. initialize
  35390.     comments := OrderedCollection new.
  35391.     emptyStatements := false.
  35392.     "If true then certain St80 syntax which is not valid ANSI are permitted, e.g. [:a ] is a valid block"
  35393.     st80Syntax := false!
  35394.  
  35395. initializeParserWith: aString
  35396.     source := aString.
  35397.     self 
  35398.         scanner: (self scannerClass on: (ReadStream on: aString) errorBlock: self errorBlock)!
  35399.  
  35400. line
  35401.     "Anwswer one-based <integer> line number of the receiver's current position in the 
  35402.     source text."
  35403.  
  35404.     ^scanner line!
  35405.  
  35406. literalArrayNodeClass
  35407.     ^StLiteralArrayNode!
  35408.  
  35409. literalNodeClass
  35410.     ^StLiteralNode!
  35411.  
  35412. lookupExternalStructType: anStIdentifierToken
  35413.     | structClass |
  35414.     structClass := methodClass environment at: anStIdentifierToken value
  35415.                 ifAbsent: 
  35416.                     [self parserError: CErrUndefinedClass
  35417.                         range: anStIdentifierToken sourceInterval].
  35418.     ((structClass isKindOf: Class) not 
  35419.         or: [structClass isPointers and: [structClass instSize < 1]]) 
  35420.             ifTrue: 
  35421.                 [self parserError: CErrInvalidStructArg
  35422.                     range: anStIdentifierToken sourceInterval].
  35423.     ^structClass!
  35424.  
  35425. messageNodeClass
  35426.     ^StMessageNode!
  35427.  
  35428. methodClass: aClass
  35429.     methodClass := aClass!
  35430.  
  35431. methodNodeClass
  35432.     ^StMethodNode!
  35433.  
  35434. nextToken
  35435.     ^nextToken isNil ifTrue: [nextToken := scanner next] ifFalse: [nextToken]!
  35436.  
  35437. optimizedNodeClass
  35438.     ^StOptimizedNode!
  35439.  
  35440. parseArgs
  35441.     | args |
  35442.     args := OrderedCollection new.
  35443.     [currentToken isIdentifier] whileTrue: [args add: self parseVariableNode].
  35444.     ^args!
  35445.  
  35446. parseAssignment
  35447.     "Need one token lookahead to see if we have a ':='. This method could 
  35448.     make it possible to assign the literals true, false and nil."
  35449.  
  35450.     | node position |
  35451.     (currentToken isIdentifier and: [self nextToken isAssignment]) 
  35452.         ifFalse: [^self parseCascadeMessage].
  35453.     node := self parseVariableNode.
  35454.     position := currentToken start.
  35455.     self step.
  35456.     ^self assignmentNodeClass 
  35457.         variable: node
  35458.         value: self parseAssignment
  35459.         position: position!
  35460.  
  35461. parseBinaryMessage
  35462.     | node |
  35463.     node := self parseUnaryMessage.
  35464.     
  35465.     [currentToken isLiteralToken ifTrue: [self patchNegativeLiteral].
  35466.     currentToken isBinary] 
  35467.             whileTrue: [node := self parseBinaryMessageWith: node].
  35468.     ^node!
  35469.  
  35470. parseBinaryMessageWith: aNode 
  35471.     | binaryToken |
  35472.     binaryToken := currentToken.
  35473.     self step.
  35474.     ^self messageNodeClass 
  35475.         receiver: aNode
  35476.         selectorParts: (Array with: binaryToken)
  35477.         arguments: (Array with: self parseUnaryMessage)!
  35478.  
  35479. parseBinaryPattern
  35480.     | binaryToken node args |
  35481.     currentToken isBinary
  35482.         ifFalse: [self parserError: CErrBadMessagePattern].
  35483.     binaryToken := currentToken.
  35484.     self step.
  35485.     args := Array with: self parseVariableNode.
  35486.     node := self methodNodeClass
  35487.         selectorParts: (Array with: binaryToken)
  35488.         arguments: args.
  35489.     node comments: node comments , args last comments.
  35490.     args last comments: nil.
  35491.     ^node!
  35492.  
  35493. parseBlock
  35494.     | position node |
  35495.     position := currentToken start.
  35496.     self step.
  35497.     node := self blockNodeClass new.
  35498.     #rbFix.    "Set start position before attempting to parse the block args so can use for error reporting if necessary"
  35499.     node left: position.
  35500.     self parseBlockArgsInto: node.
  35501.     node body: (self parseStatements: false).
  35502.     (currentToken isSpecial: $]) 
  35503.         ifFalse: [self parserError: CErrBlockNotClosed range: (position to: self errorPosition - 1)].
  35504.     node right: currentToken start.
  35505.     self step.
  35506.     ^node!
  35507.  
  35508. parseBlockArgsInto: node
  35509.     | verticalBar args colons |
  35510.     args := OrderedCollection new: 2.
  35511.     colons := OrderedCollection new: 2.
  35512.     verticalBar := false.
  35513.     [currentToken isSpecial: $:] whileTrue: 
  35514.             [colons add: currentToken start.
  35515.             self step.    ":"
  35516.             verticalBar := true.
  35517.             args add: self parseVariableNode].
  35518.     verticalBar 
  35519.         ifTrue: 
  35520.             [currentToken isBinary 
  35521.                 ifTrue: 
  35522.                     [node bar: currentToken start.
  35523.                     currentToken value == #| 
  35524.                         ifTrue: [self step]
  35525.                         ifFalse: 
  35526.                             [currentToken value == #|| 
  35527.                                 ifTrue: 
  35528.                                     ["Hack the current token to be the start 
  35529.                                     of temps bar"
  35530.  
  35531.                                     currentToken
  35532.                                         value: #|;
  35533.                                         start: currentToken start + 1]
  35534.                                 ifFalse: 
  35535.                                     [self parserError: CErrBlockArgListNotClosed
  35536.                                         range: (node start to: self errorPosition - 1)]]]
  35537.                 ifFalse: 
  35538.                     ["St-80 allows, for example, [:a] as a valid block, ANSI requires the arg list termination bar, i.e. [:a|]"
  35539.  
  35540.                     (st80Syntax and: [currentToken isSpecial: $]]) 
  35541.                         ifFalse: 
  35542.                             [self parserError: CErrBlockArgListNotClosed
  35543.                                 range: (node start to: self errorPosition - 1)]]].
  35544.     node
  35545.         arguments: args;
  35546.         colons: colons.
  35547.     ^node!
  35548.  
  35549. parseCascadeMessage
  35550.     | node |
  35551.     node := self parseKeywordMessage.
  35552.     #rbFix.    "Add outer loop to parse Dolphin's more flexible cascade syntax"
  35553.     
  35554.     [currentToken isKeyword ifTrue: [node := self parseKeywordMessageWith: node].
  35555.     currentToken isBinary ifTrue: [node := self parseBinaryMessageWith: node].
  35556.     currentToken isIdentifier ifTrue: [node := self parseUnaryMessageWith: node].
  35557.     (currentToken isSpecial: $;) and: [node isMessage]] 
  35558.             whileTrue: 
  35559.                 [| receiver messages semicolons |
  35560.                 receiver := node receiver.
  35561.                 messages := OrderedCollection new: 3.
  35562.                 semicolons := OrderedCollection new: 3.
  35563.                 messages add: node.
  35564.                 [currentToken isSpecial: $;] whileTrue: 
  35565.                         [semicolons add: currentToken start.
  35566.                         self step.
  35567.                         messages add: (currentToken isIdentifier 
  35568.                                     ifTrue: [self parseUnaryMessageWith: receiver]
  35569.                                     ifFalse: 
  35570.                                         [currentToken isKeyword 
  35571.                                             ifTrue: [self parseKeywordMessageWith: receiver]
  35572.                                             ifFalse: 
  35573.                                                 [| temp |
  35574.                                                 currentToken isLiteralToken ifTrue: [self patchNegativeLiteral].
  35575.                                                 currentToken isBinary ifFalse: [self parserError: CErrExpectMessage].
  35576.                                                 temp := self parseBinaryMessageWith: receiver.
  35577.                                                 temp == receiver ifTrue: [self parserError: CErrExpectMessage].
  35578.                                                 temp]])].
  35579.                 node := self cascadeNodeClass messages: messages semicolons: semicolons].
  35580.     ^node!
  35581.  
  35582. parseExpression: aString
  35583.     | node |
  35584.     node := self parseStatements: false.
  35585.     (self methodNodeClass selector: #noMethod body: node) source: aString.    "Make the sequence node have a method node as its parent"
  35586.     self atEnd ifFalse: [self parserError: CErrNonsenseAtExprEnd range: (self errorPosition to: source size)].
  35587.     ^node!
  35588.  
  35589. parseExtendedExternalCall: startInteger
  35590.     currentToken isIdentifier 
  35591.         ifTrue: 
  35592.             [| modifier |
  35593.             modifier := currentToken value.
  35594.             modifier = 'virtual' 
  35595.                 ifTrue: 
  35596.                     [self step.
  35597.                     ^self parseExternalCall: startInteger isVirtual: true]
  35598.                 ifFalse: 
  35599.                     [modifier = 'overlap' 
  35600.                         ifTrue: 
  35601.                             [self step.
  35602.                             ^self parseOverlappedCall: startInteger]]].
  35603.     self parserError: CErrBadPrimCallType!
  35604.  
  35605. parseExternalArgType
  35606.     | valueType indirections typeToken structClass stop |
  35607.     currentToken isIdentifier 
  35608.         ifFalse: [^self parserError: CErrExpectExtType range: currentToken sourceInterval].
  35609.     structClass := nil.
  35610.     valueType := ExternalValueTypes at: currentToken value ifAbsent: [ExtCallArgSTRUCT].
  35611.     structClass := valueType == ExtCallArgSTRUCT 
  35612.                 ifTrue: [self lookupExternalStructType: currentToken]
  35613.                 ifFalse: [nil].
  35614.     typeToken := currentToken.
  35615.     self step.
  35616.     indirections := self parseExternalArgTypeQualifier.
  35617.     indirections > 0 
  35618.         ifTrue: 
  35619.             [| refType |
  35620.             refType := valueType.
  35621.             indirections > 1 
  35622.                 ifTrue: 
  35623.                     [valueType == ExtCallArgSTRUCT 
  35624.                         ifTrue: [structClass isIndirection ifTrue: [refType := ExtCallArgLPPVOID]]
  35625.                         ifFalse: [refType := self externalReferenceTypeFor: valueType]].
  35626.             refType == ExtCallArgLPPVOID ifTrue: [self parserError: CErrNotIndirectable].
  35627.             stop := currentToken stop.
  35628.             "Step over the qualifier now we know it is valid"
  35629.             self step]
  35630.         ifFalse: [stop := typeToken stop].
  35631.     ^(StExternalArgTypeNode new)
  35632.         start: typeToken start;
  35633.         stop: stop;
  35634.         typeOrdinal: valueType;
  35635.         indirections: indirections;
  35636.         structClass: structClass;
  35637.         yourself!
  35638.  
  35639. parseExternalArgTypeQualifier
  35640.     | qualifier |
  35641.     currentToken isBinary ifFalse: [^0].
  35642.     qualifier := currentToken value.
  35643.     qualifier == #> ifTrue: [^0].
  35644.     (qualifier == #*> or: [qualifier == #**>]) 
  35645.         ifTrue: [qualifier := self patchExternalDescriptorClose].
  35646.     qualifier == #* ifTrue: [^1].
  35647.     qualifier == #** ifTrue: [^2].
  35648.     self parserError: CErrBadExtTypeQualifier!
  35649.  
  35650. parseExternalCall: startInteger isVirtual: aBoolean 
  35651.     | vfnIndex node |
  35652.     node := StExternalCallNode new.
  35653.     node
  35654.         start: startInteger;
  35655.         callingConvention: self parseExternalCallingConvention;
  35656.         returnType: self parseExternalArgType.
  35657.     aBoolean 
  35658.         ifTrue: 
  35659.             [node isVirtual: true.
  35660.             (currentToken isLiteralToken not or: [(vfnIndex := currentToken value) isInteger not]) 
  35661.                 ifTrue: [^self parserError: CErrExpectVfn].
  35662.             (vfnIndex between: 1 and: MaxVfn) ifFalse: [self parserError: CErrBadVfn].
  35663.             node nameOrOrdinal: vfnIndex.
  35664.             self step]
  35665.         ifFalse: [node nameOrOrdinal: self parseExternalCallName].
  35666.     self parseExternalCallArgs: node.
  35667.     ^node!
  35668.  
  35669. parseExternalCallArgList
  35670.     | args |
  35671.     args := OrderedCollection new.
  35672.     [self atEnd or: [currentToken isBinary: #>]] whileFalse: 
  35673.             [| arg |
  35674.             arg := self parseExternalArgType.
  35675.             (arg typeOrdinal == ExtCallArgVOID and: [arg indirections == 0])
  35676.                 ifTrue: [self parserError: CErrArgTypeCannotBeVoid range: arg sourceInterval].
  35677.             args addLast: arg].
  35678.     ^args!
  35679.  
  35680. parseExternalCallArgs: anStExternalCallNode
  35681.     | types got expected |
  35682.     types := self parseExternalCallArgList.
  35683.     anStExternalCallNode argumentTypes: types.
  35684.     got := types size.
  35685.     expected := methodNode argumentCount.
  35686.     got < expected 
  35687.         ifTrue: 
  35688.             [self parserError: CErrInsufficientArgTypes
  35689.                 range: (anStExternalCallNode start to: self errorPosition)].
  35690.     got > expected 
  35691.         ifTrue: 
  35692.             [self parserError: CErrTooManyArgTypes
  35693.                 range: (anStExternalCallNode start to: self errorPosition)].
  35694.     ^types!
  35695.  
  35696. parseExternalCallingConvention
  35697.     currentToken isKeyword 
  35698.         ifTrue: 
  35699.             [| answer |
  35700.             answer := (ExternalCallingConventions indexOf: currentToken value ifAbsent: [self parserError: CErrBadPrimCallType]) - 1.
  35701.             answer > 1 ifTrue: [self parserError: CErrUnsupportedCallConv].
  35702.             self step.
  35703.             ^answer].
  35704.     self parserError: CErrBadPrimCallType!
  35705.  
  35706. parseExternalCallName
  35707.     | nameOrOrdinal |
  35708.     currentToken isLiteralToken 
  35709.         ifTrue: 
  35710.             [| token |
  35711.             token := currentToken value.
  35712.             (token isString or: [token isInteger and: [token >= 0]]) ifTrue: [nameOrOrdinal := token]]
  35713.         ifFalse: [currentToken isIdentifier ifTrue: [nameOrOrdinal := currentToken value]].
  35714.     nameOrOrdinal isNil ifTrue: [self parserError: CErrExpectFnName].
  35715.     self step.
  35716.     ^nameOrOrdinal!
  35717.  
  35718. parseKeywordMessage
  35719.     ^self parseKeywordMessageWith: self parseBinaryMessage!
  35720.  
  35721. parseKeywordMessageWith: node 
  35722.     | args isKeyword keywords |
  35723.     args := OrderedCollection new: 3.
  35724.     keywords := OrderedCollection new: 3.
  35725.     isKeyword := false.
  35726.     [currentToken isKeyword] whileTrue: 
  35727.             [keywords add: currentToken.
  35728.             self step.
  35729.             args add: self parseBinaryMessage.
  35730.             isKeyword := true].
  35731.     ^isKeyword 
  35732.         ifTrue: 
  35733.             [self messageNodeClass 
  35734.                 receiver: node
  35735.                 selectorParts: keywords
  35736.                 arguments: args]
  35737.         ifFalse: [node]!
  35738.  
  35739. parseKeywordPattern
  35740.     | keywords args node |
  35741.     keywords := OrderedCollection new: 2.
  35742.     args := OrderedCollection new: 2.
  35743.     [currentToken isKeyword]
  35744.         whileTrue:
  35745.             [keywords add: currentToken.
  35746.             self step.
  35747.             args add: self parseVariableNode].
  35748.     node := self methodNodeClass
  35749.         selectorParts: keywords
  35750.         arguments: args.
  35751.     node comments: (node comments, args last comments).
  35752.     args last comments: nil.
  35753.     ^node!
  35754.  
  35755. parseLiteralArray
  35756.     | stream start stop |
  35757.     start := currentToken start.
  35758.     stream := WriteStream on: (Array new: 5).
  35759.     self step.
  35760.     [self atEnd or: [currentToken isSpecial and: [currentToken value = $)]]] 
  35761.         whileFalse: [stream nextPut: self parseLiteralArrayObject].
  35762.     (currentToken isSpecial and: [currentToken value == $)]) 
  35763.         ifFalse: [self parserError: CErrArrayNotClosed range: (start to: self errorPosition-1)].
  35764.     stop := currentToken stop.
  35765.     self step.
  35766.     ^self literalArrayNodeClass 
  35767.         startPosition: start
  35768.         contents: stream contents
  35769.         stopPosition: stop
  35770.         isByteArray: false!
  35771.  
  35772. parseLiteralArrayObject
  35773.     currentToken isSpecial 
  35774.         ifTrue: 
  35775.             [currentToken value == $( ifTrue: [^self parseLiteralArray].
  35776.             currentToken value == $[ ifTrue: [^self parseLiteralByteArray]].
  35777.     currentToken isLiteralArrayToken 
  35778.         ifTrue: 
  35779.             [^currentToken isForByteArray 
  35780.                 ifTrue: [self parseLiteralByteArray]
  35781.                 ifFalse: [self parseLiteralArray]].
  35782.     currentToken isOptimized ifTrue: [^self parseOptimizedExpression].
  35783.     currentToken isLiteralToken ifFalse: [self patchLiteralArrayToken].
  35784.     ^self parsePrimitiveLiteral!
  35785.  
  35786. parseLiteralByteArray
  35787.     | stream start stop |
  35788.     start := currentToken start.
  35789.     stream := WriteStream on: (Array new: 5).
  35790.     self step.
  35791.     [self atEnd or: [currentToken isSpecial and: [currentToken value = $]]]] 
  35792.         whileFalse: [stream nextPut: self parseLiteralByteArrayObject].
  35793.     (currentToken isSpecial and: [currentToken value == $]]) 
  35794.         ifFalse: [self parserError: CErrByteArrayNotClosed range: (start to: self errorPosition - 1)].
  35795.     stop := currentToken stop.
  35796.     self step.
  35797.     ^self literalArrayNodeClass 
  35798.         startPosition: start
  35799.         contents: stream contents
  35800.         stopPosition: stop
  35801.         isByteArray: true!
  35802.  
  35803. parseLiteralByteArrayObject
  35804.     (currentToken isLiteralToken and: 
  35805.             [currentToken value isInteger and: [currentToken value between: 0 and: 255]]) 
  35806.         ifFalse: [self parserError: CErrBadValueInByteArray].
  35807.     ^self parsePrimitiveLiteral!
  35808.  
  35809. parseMessagePattern
  35810.     currentToken isLiteralToken ifTrue: [self patchLiteralMessage].
  35811.     ^currentToken isIdentifier 
  35812.         ifTrue: [self parseUnaryPattern]
  35813.         ifFalse: 
  35814.             [currentToken isKeyword 
  35815.                 ifTrue: [self parseKeywordPattern]
  35816.                 ifFalse: [self parseBinaryPattern]]!
  35817.  
  35818. parseMethod
  35819.     methodNode := self parseMessagePattern.
  35820. "    self parseResourceTag."
  35821.     self addCommentsTo: methodNode.
  35822.     methodNode body: (self parseStatements: true).
  35823. "    methodNode tags: tags."
  35824.     ^methodNode!
  35825.  
  35826. parseMethod: aString
  35827.     | node |
  35828.     node := self parseMethod.
  35829.     self atEnd ifFalse: [self parserError: CErrNonsenseAtMethodEnd range: (self errorPosition to: aString size)].
  35830.     node source: aString.
  35831.     ^node!
  35832.  
  35833. parseOptimizedExpression
  35834.     | position node body |
  35835.     position := currentToken start.
  35836.     self step.
  35837.     body := self parseStatements: false.
  35838.     node := self optimizedNodeClass 
  35839.                 left: position
  35840.                 body: body
  35841.                 right: currentToken start.
  35842.     (currentToken isSpecial: $)) 
  35843.         ifFalse: [self parserError: CErrParenNotClosed range: node sourceInterval].
  35844.     #rbFix.    "Evaluate the expression now to record its value."
  35845.     node value: (self evaluateStatements: body).
  35846.     self step.
  35847.     ^node!
  35848.  
  35849. parseOverlappedCall: startInteger
  35850.     | node |
  35851.     node := self parseExternalCall: startInteger isVirtual: false.
  35852.     node isOverlapped: true.
  35853.     ^node!
  35854.  
  35855. parseParenthesizedExpression
  35856.     | leftParen node |
  35857.     leftParen := currentToken start.
  35858.     self step.
  35859.     node := self parseAssignment.
  35860.     ^(currentToken isSpecial: $)) 
  35861.         ifTrue: 
  35862.             [node addParenthesis: (leftParen to: currentToken start).
  35863.             self step.
  35864.             node]
  35865.         ifFalse: 
  35866.             [self parserError: CErrParenNotClosed range: (leftParen to: self errorPosition - 1).
  35867.             self]!
  35868.  
  35869. parsePrimitiveIdentifier
  35870.     | token node |
  35871.     token := currentToken.
  35872.     self step.
  35873.     node := self variableNodeClass identifierToken: token.
  35874.     self addCommentsTo: node.
  35875.     ^node!
  35876.  
  35877. parsePrimitiveLiteral
  35878.     | token |
  35879.     token := currentToken.
  35880.     self step.
  35881.     ^self literalNodeClass literalToken: token!
  35882.  
  35883. parsePrimitiveObject
  35884.     currentToken isIdentifier ifTrue: [^self parsePrimitiveIdentifier].
  35885.     (currentToken isLiteralToken and: [currentToken isMultiKeyword not]) 
  35886.         ifTrue: [^self parsePrimitiveLiteral].
  35887.     currentToken isLiteralArrayToken 
  35888.         ifTrue: 
  35889.             [^currentToken isForByteArray 
  35890.                 ifTrue: [self parseLiteralByteArray]
  35891.                 ifFalse: [self parseLiteralArray]].
  35892.     currentToken isSpecial 
  35893.         ifTrue: 
  35894.             [currentToken value == $[ ifTrue: [^self parseBlock].
  35895.             currentToken value == $( ifTrue: [^self parseParenthesizedExpression]].
  35896.     currentToken isOptimized ifTrue: [^self parseOptimizedExpression].
  35897.     self parserError: CErrInvalExprStart!
  35898.  
  35899. parserError: anInteger
  35900.     "Raise a <SmalltalkParseError> with the specified <integer> error code and associated arguments
  35901.     (which are used to when formatting the error message)."
  35902.  
  35903.     self parserError: anInteger range: currentToken sourceInterval!
  35904.  
  35905. parserError: anInteger range: anInterval 
  35906.     "Raise a <SmalltalkParseError> with the specified <integer> error code and associated arguments
  35907.     (which are used to when formatting the error message)."
  35908.  
  35909.     | err pos |
  35910.     pos := self errorPosition.
  35911.     err := self errorClass 
  35912.                 errorCode: anInteger
  35913.                 in: source
  35914.                 position: pos
  35915.                 line: self line
  35916.                 range: anInterval.
  35917.     self errorBlock value: err description value: pos.
  35918.     err signal!
  35919.  
  35920. parseStatementList: tagBoolean into: sequenceNode 
  35921.     | statements return periods node |
  35922.     return := false.
  35923.     statements := OrderedCollection new.
  35924.     periods := OrderedCollection new.
  35925.     self addCommentsTo: sequenceNode.
  35926.     tagBoolean ifTrue: [self parseTag].
  35927.     [self atEnd or: [currentToken isSpecial and: ['])}' includes: currentToken value]]] 
  35928.         whileFalse: 
  35929.             [return ifTrue: [self parserError: CErrUnterminatedStatement range: node sourceInterval].
  35930.             (currentToken isSpecial: $^) 
  35931.                 ifTrue: 
  35932.                     [| returnPosition |
  35933.                     returnPosition := currentToken start.
  35934.                     self step.
  35935.                     node := self returnNodeClass return: returnPosition value: self parseAssignment.
  35936.                     statements add: node.
  35937.                     return := self canHaveStatementsAfterReturn not]
  35938.                 ifFalse: 
  35939.                     [node := self parseAssignment.
  35940.                     statements add: node].
  35941.             (currentToken isSpecial: $.) 
  35942.                 ifTrue: 
  35943.                     [periods add: currentToken start.
  35944.                     self step.
  35945.                     self addCommentsTo: node]
  35946.                 ifFalse: [return := true].
  35947.             emptyStatements 
  35948.                 ifTrue: 
  35949.                     [[currentToken isSpecial: $.] whileTrue: 
  35950.                             [periods add: currentToken start.
  35951.                             self step]]].
  35952.     statements notEmpty ifTrue: [self addCommentsTo: statements last].
  35953.     sequenceNode
  35954.         statements: statements;
  35955.         periods: periods.
  35956.     ^sequenceNode!
  35957.  
  35958. parseStatements: tagBoolean
  35959.     | args leftBar rightBar |
  35960.     args := #().
  35961.     leftBar := rightBar := nil.
  35962.     currentToken isBinary 
  35963.         ifTrue: 
  35964.             [currentToken value == #| 
  35965.                 ifTrue: 
  35966.                     [leftBar := currentToken start.
  35967.                     self step.
  35968.                     args := self parseArgs.
  35969.                     (currentToken isBinary: #|) 
  35970.                         ifFalse: 
  35971.                             [self parserError: CErrTempListNotClosed range: (leftBar to: self errorPosition - 1)].
  35972.                     rightBar := currentToken start.
  35973.                     self step]
  35974.                 ifFalse: 
  35975.                     [currentToken value == #|| 
  35976.                         ifTrue: 
  35977.                             [rightBar := (leftBar := currentToken start) + 1.
  35978.                             self step]]].
  35979.     ^self parseStatementList: tagBoolean
  35980.         into: (self sequenceNodeClass 
  35981.                 leftBar: leftBar
  35982.                 temporaries: args
  35983.                 rightBar: rightBar)!
  35984.  
  35985. parseTag
  35986.     | tag start |
  35987.     (currentToken isBinary: #<) ifFalse: [^self].
  35988.     start := currentToken start.
  35989.     self step.
  35990.     tag := self parseTag: start.
  35991.     methodNode tag: tag.
  35992.     (currentToken isBinary: #>) ifFalse: [self parserError: CErrExpectCloseTag].
  35993.     tag stop: currentToken start.
  35994.     self step!
  35995.  
  35996. parseTag: startInteger
  35997.     ^currentToken isKeyword 
  35998.         ifTrue: 
  35999.             [currentToken value = 'primitive:' 
  36000.                 ifTrue: 
  36001.                     [| primitiveIndex |
  36002.                     self step.
  36003.                     (currentToken isLiteralToken not or: [currentToken value isInteger not]) 
  36004.                         ifTrue: [self parserError: CErrExpectPrimIdx].
  36005.                     primitiveIndex := currentToken value.
  36006.                     (primitiveIndex between: 1 and: MaxPrimIndex) 
  36007.                         ifFalse: [self parserError: CErrBadPrimIdx].
  36008.                     self step.
  36009.                     (StPrimitiveNode primitiveIndex: primitiveIndex)
  36010.                         start: startInteger;
  36011.                         yourself]
  36012.                 ifFalse: [self parseExternalCall: startInteger isVirtual: false]]
  36013.         ifFalse: [self parseExtendedExternalCall: startInteger]!
  36014.  
  36015. parseUnaryMessage
  36016.     | node |
  36017.     node := self parsePrimitiveObject.
  36018.     self addCommentsTo: node.
  36019.     
  36020.     [currentToken isLiteralToken ifTrue: [self patchLiteralMessage].
  36021.     currentToken isIdentifier] 
  36022.             whileTrue: [node := self parseUnaryMessageWith: node].
  36023.     self addCommentsTo: node.
  36024.     ^node!
  36025.  
  36026. parseUnaryMessageWith: aNode 
  36027.     | selector |
  36028.     selector := currentToken.
  36029.     self step.
  36030.     ^self messageNodeClass 
  36031.         receiver: aNode
  36032.         selectorParts: (Array with: selector)
  36033.         arguments: #()!
  36034.  
  36035. parseUnaryPattern
  36036.     | selector |
  36037.     selector := currentToken.
  36038.     self step.
  36039.     ^self methodNodeClass selectorParts: (Array with: selector) arguments: #()!
  36040.  
  36041. parseVariableNode
  36042.     currentToken isIdentifier ifFalse: [self parserError: CErrExpectVariable].
  36043.     ^self parsePrimitiveIdentifier!
  36044.  
  36045. patchExternalDescriptorClose
  36046.     "Hack needed because scanner treats trailing *> and **> binary selectors rather than two tokens"
  36047.  
  36048.     | qualifier |
  36049.     self assert: [nextToken isNil].
  36050.     qualifier := currentToken value.
  36051.     qualifier := (qualifier copyFrom: 1 to: qualifier size - 1) asSymbol.
  36052.     nextToken := currentToken.
  36053.     currentToken := StBinarySelectorToken value: qualifier start: nextToken start.
  36054.     nextToken value: #>.
  36055.     nextToken start: nextToken start + qualifier size.
  36056.     ^qualifier!
  36057.  
  36058. patchLiteralArrayToken
  36059.     (currentToken isIdentifier 
  36060.         or: [currentToken isBinary or: [currentToken isKeyword]]) 
  36061.             ifFalse: [^self parserError: CErrBadTokenInArray].
  36062.     currentToken := scanner literalTokenClass 
  36063.                 value: currentToken value asSymbol
  36064.                 start: currentToken start
  36065.                 stop: currentToken stop!
  36066.  
  36067. patchLiteralMessage
  36068.     | value |
  36069.     value := currentToken value.
  36070.     value == true 
  36071.         ifTrue: 
  36072.             [^currentToken := StIdentifierToken value: 'true' start: currentToken start].
  36073.     value == false 
  36074.         ifTrue: 
  36075.             [^currentToken := StIdentifierToken value: 'false' start: currentToken start].
  36076.     value == nil 
  36077.         ifTrue: 
  36078.             [^currentToken := StIdentifierToken value: 'nil' start: currentToken start]!
  36079.  
  36080. patchNegativeLiteral
  36081.     "Private - Handle the special negative number case for binary message sends."
  36082.  
  36083.     (currentToken value isKindOf: Number) ifFalse: [^self].
  36084.     currentToken value <= 0 ifFalse: [^self].
  36085.     currentToken value = 0 
  36086.         ifTrue: 
  36087.             [(source notNil 
  36088.                 and: [source notEmpty and: [(source at: (currentToken start min: source size)) == $-]]) 
  36089.                     ifFalse: [^self]].
  36090.     nextToken := currentToken.
  36091.     currentToken := StBinarySelectorToken value: #- start: nextToken start.
  36092.     nextToken value: nextToken value negated.
  36093.     (nextToken isKindOf: StNumberLiteralToken) 
  36094.         ifTrue: [nextToken source: (nextToken source copyFrom: 2 to: nextToken source size)].
  36095.     nextToken start: nextToken start + 1!
  36096.  
  36097. returnNodeClass
  36098.     ^StReturnNode!
  36099.  
  36100. scanner: aScanner
  36101.     scanner := aScanner.
  36102.     scanner separatorsInLiterals: st80Syntax.
  36103.     self step!
  36104.  
  36105. scannerClass
  36106.     ^SmalltalkScanner!
  36107.  
  36108. sequenceNodeClass
  36109.     ^StSequenceNode!
  36110.  
  36111. step
  36112.     (currentToken notNil and: [currentToken comments notNil]) 
  36113.         ifTrue: [comments addAll: currentToken comments].
  36114.     nextToken notNil 
  36115.         ifTrue: 
  36116.             [currentToken := nextToken.
  36117.             nextToken := nil]
  36118.         ifFalse: [currentToken := scanner next]!
  36119.  
  36120. variableNodeClass
  36121.     ^StVariableNode! !
  36122.  
  36123. SmalltalkScanner comment:
  36124. 'SmalltalkScanner is the Smalltalk lexical analyzer. It converts source text to a stream of <StToken>''s.
  36125.  
  36126. Note that SmalltalkScanner is based on the RBScanner class written by John Brant and Don Roberts for their Refactoring Browser. It has been extended for Dolphin to incorporate additional error reporting capabilities (such as the line number on which the error occurred), and the ability to parse Dolphin''s FFI call syntax.
  36127.  
  36128. Instance Variables:
  36129.     stream            <ReadStream> Input stream (method/expression source)
  36130.     buffer            <WriteStream> Token building buffer.
  36131.     tokenStart            <integer> position in stream at which current token starts.
  36132.     currentCharacter        <Character> last character read from stream.
  36133.     characterType        <Symbol>. Symbolic type of last character read from stream.
  36134.     classificationTable        <Array> of <Symbol>. Symbolic types of each possible character (one slot per code point).
  36135.     separatorsInLiterals        <boolean>. Whether to allow whitespace in literal constants.
  36136.     extendedLiterals        <boolean>. Whether extended literal constants (prefixed with ##) are parsed.
  36137.     comments            <OrderedCollection> of <Interval>. Ranges of the source occuppied by comments.
  36138.     errorBlock            <dyadicValuable> evaluated on encountering lexical errors
  36139.     nameSpaceCharacter        <Character>. Namespace separator character (not currently used on Dolphin)
  36140.     line            <integer> line number of current token.
  36141.  
  36142. Class Instance Variables:
  36143.     classificationTable        <Array>
  36144.  
  36145. '!
  36146. !SmalltalkScanner class methodsFor!
  36147.  
  36148. classificationTable
  36149.     classificationTable isNil ifTrue: [self initializeClassificationTable].
  36150.     ^classificationTable!
  36151.  
  36152. initialize
  36153.     self initializeClassificationTable!
  36154.  
  36155. initializeChars: characters to: aSymbol 
  36156.     characters do: [:c | classificationTable at: c asInteger put: aSymbol]!
  36157.  
  36158. initializeClassificationTable
  36159.     | allCharacters |
  36160.     PatternVariableCharacter := $`.
  36161.     classificationTable := Array new: 255.
  36162.     allCharacters := (1 to: 255) collect: [:i | Character value: i].
  36163.     self initializeChars: (allCharacters select: [:each | each isLetter])
  36164.         to: #alphabetic.
  36165.     self initializeChars: '_' to: #alphabetic.
  36166.     self initializeChars: '01234567890' to: #digit.
  36167.     self initializeChars: '!!%&*+,-/<=>?@\~|' to: #binary.
  36168.     classificationTable at: 177 put: #binary.    "plus-or-minus"
  36169.     classificationTable at: 183 put: #binary.    "centered dot"
  36170.     classificationTable at: 215 put: #binary.    "times"
  36171.     classificationTable at: 247 put: #binary.    "divide"
  36172.     self initializeChars: '().:;[]^' to: #special.
  36173.     self initializeChars: (allCharacters select: [:each | each isSeparator])
  36174.         to: #separator!
  36175.  
  36176. isSelector: aSymbol 
  36177.     | scanner token |
  36178.     scanner := self basicNew.
  36179.     scanner on: (ReadStream on: aSymbol asString).
  36180.     scanner step.
  36181.     token := scanner scanAnySymbol.
  36182.     token isLiteralToken ifFalse: [^false].
  36183.     token value isEmpty ifTrue: [^false].
  36184.     ^scanner atEnd!
  36185.  
  36186. isVariable: aString 
  36187.     | scanner token |
  36188.     aString isString ifFalse: [^false].
  36189.     aString isEmpty ifTrue: [^false].
  36190.     (self classificationTable at: aString first asInteger) == #alphabetic
  36191.         ifFalse: [^false].
  36192.     scanner := self basicNew.
  36193.     scanner on: (ReadStream on: aString asString).
  36194.     scanner errorBlock: [:s :p | ^false].
  36195.     scanner step.
  36196.     token := scanner scanIdentifierOrKeyword.
  36197.     token isKeyword ifTrue: [^false].
  36198.     ^scanner atEnd!
  36199.  
  36200. on: aStream
  36201.     | str |
  36202.     str := self basicNew on: aStream.
  36203.     str
  36204.         step;
  36205.         stripSeparators.
  36206.     ^str!
  36207.  
  36208. on: aStream errorBlock: aBlock
  36209.     | str |
  36210.     str := self basicNew on: aStream.
  36211.     str
  36212.         errorBlock: aBlock;
  36213.         step;
  36214.         stripSeparators.
  36215.     ^str!
  36216.  
  36217. patternVariableCharacter
  36218.     ^PatternVariableCharacter! !
  36219.  
  36220. !SmalltalkScanner methodsFor!
  36221.  
  36222. atEnd
  36223.     ^characterType == #eof!
  36224.  
  36225. classify: aCharacter 
  36226.     | index |
  36227.     "May be asked to classify nil if peek at end of stream"
  36228.     aCharacter isNil ifTrue: [^#separator].
  36229.     (index := aCharacter asInteger) == 0 ifTrue: [^#separator].
  36230. "    index > 255 ifTrue: [^self scannerError: 'unrecognised character ', (String with: aCharacter)]."
  36231.     ^classificationTable at: index!
  36232.  
  36233. contents
  36234.     | contentsStream |
  36235.     contentsStream := WriteStream on: (Array new: 50).
  36236.     self do: [:each | contentsStream nextPut: each].
  36237.     ^contentsStream contents!
  36238.  
  36239. do: aBlock
  36240.     "Evaluate the argument, aBlock, for each of the remaining elements that can be accessed by 
  36241.     the receiver."
  36242.  
  36243.     [self atEnd] whileFalse: [aBlock value: self next]
  36244. !
  36245.  
  36246. errorBlock
  36247.     ^errorBlock isNil ifTrue: [[:message :position | ]] ifFalse: [errorBlock]!
  36248.  
  36249. errorBlock: aBlock 
  36250.     errorBlock := aBlock!
  36251.  
  36252. errorClass
  36253.     ^SmalltalkCompilerError!
  36254.  
  36255. errorPosition
  36256.     ^stream position!
  36257.  
  36258. getComments
  36259.     | oldComments |
  36260.     comments isEmpty ifTrue: [^nil].
  36261.     oldComments := comments.
  36262.     comments := OrderedCollection new: 1.
  36263.     ^oldComments!
  36264.  
  36265. initializeForDolphin
  36266.     separatorsInLiterals := false.
  36267.     extendedLiterals := true.
  36268.     nameSpaceCharacter := nil.    "Dolphin does not currently support namespaces."
  36269.     line := 1!
  36270.  
  36271. lexicalError: anInteger
  36272.     self lexicalError: anInteger range: (tokenStart to: self errorPosition)!
  36273.  
  36274. lexicalError: anInteger range: anInterval 
  36275.     "Private - Evaluate the block. If it returns raise an error"
  36276.  
  36277.     | err pos |
  36278.     pos := self errorPosition.
  36279.     err := self errorClass 
  36280.                 errorCode: anInteger
  36281.                 in: stream contents
  36282.                 position: pos
  36283.                 line: self line
  36284.                 range: anInterval.
  36285.     self errorBlock value: err description value: pos.
  36286.     err signal!
  36287.  
  36288. line
  36289.     "Anwswer one-based <integer> line number of the receiver's current position in the 
  36290.     source text."
  36291.  
  36292.     ^line!
  36293.  
  36294. literalTokenClass
  36295.     ^StLiteralToken!
  36296.  
  36297. namespaceCharacter: aCharacter
  36298.     nameSpaceCharacter := aCharacter!
  36299.  
  36300. next
  36301.     | token |
  36302.     buffer reset.
  36303.     tokenStart := stream position.
  36304.     token := characterType == #eof 
  36305.                 ifTrue: 
  36306.                     [StToken start: tokenStart + 1    "The EOF token should occur after the end of input"]
  36307.                 ifFalse: [self scanToken].
  36308.     self stripSeparators.
  36309.     token comments: self getComments.
  36310.     ^token!
  36311.  
  36312. on: aStream
  36313.     buffer := WriteStream on: (String new: 60).
  36314.     stream := aStream.
  36315.     classificationTable := self class classificationTable.
  36316.     comments := OrderedCollection new.
  36317.     self initializeForDolphin!
  36318.  
  36319. previousStepPosition
  36320.     ^characterType == #eof 
  36321.         ifTrue: [stream position]
  36322.         ifFalse: [stream position - 1]!
  36323.  
  36324. readNumber
  36325.     | number |
  36326.     stream skip: -1.
  36327.     number := Number readSmalltalkSyntaxFrom: stream.
  36328.     self step.
  36329.     ^number!
  36330.  
  36331. scanAnySymbol
  36332.     characterType == #alphabetic ifTrue: [^self scanSymbol].
  36333.     characterType == #binary 
  36334.         ifTrue: [^self scanBinary: self literalTokenClass].
  36335.     ^StToken new!
  36336.  
  36337. scanBinary: aClass
  36338.     "Private - Although this does now permit binary selectors to be any length, as mandated by the ANSI
  36339.     standard, it still deliberately excludes '-' to avoid the ambiguity in expressions such as: '1--2'. The ANSI
  36340.     standard requires that this expression should be treated as a single send of the binary selector #-- to
  36341.     1 with 2 as its argument, however Smalltalk has traditionally treated this as '1 - -2', one subtract minus two."
  36342.  
  36343.     | val |
  36344.     buffer nextPut: currentCharacter.
  36345.     self step.
  36346.     [characterType == #binary and: [currentCharacter ~~ $-]] whileTrue: 
  36347.             [buffer nextPut: currentCharacter.
  36348.             self step].
  36349.     val := buffer contents.
  36350.     val := val asSymbol.
  36351.     ^aClass value: val start: tokenStart!
  36352.  
  36353. scanExtendedLiterals
  36354.     | token |
  36355.     self step.
  36356.     separatorsInLiterals ifTrue: [self stripSeparators].
  36357.     token := characterType == #alphabetic 
  36358.                 ifTrue: [self scanSymbol]
  36359.                 ifFalse: 
  36360.                     [characterType == #binary 
  36361.                         ifTrue: 
  36362.                             [(self scanBinary: self literalTokenClass) stop: self previousStepPosition]
  36363.                         ifFalse: 
  36364.                             [currentCharacter == $' 
  36365.                                 ifTrue: [self scanStringSymbol]
  36366.                                 ifFalse: 
  36367.                                     [currentCharacter == $( 
  36368.                                         ifTrue: 
  36369.                                             [self step.
  36370.                                             ^StOptimizedToken start: tokenStart]]]].
  36371.     token isNil ifTrue: [self lexicalError: LErrExpectExtendedLiteral].
  36372.     token value: ((Smalltalk at: #EsAtom ifAbsent: [Symbol]) 
  36373.                 intern: token value asString).
  36374.     ^token!
  36375.  
  36376. scanIdentifierOrKeyword
  36377.     | name |
  36378.     self scanName.
  36379.     currentCharacter == nameSpaceCharacter 
  36380.         ifTrue: 
  36381.             [| token |
  36382.             token := self scanNameSpaceName.
  36383.             token notNil ifTrue: [^token]].
  36384.     (currentCharacter == $: and: [stream peek ~~ $=]) ifTrue: [^self scanKeyword].
  36385.     name := buffer contents.
  36386.     name = 'true' 
  36387.         ifTrue: 
  36388.             [^self literalTokenClass 
  36389.                 value: true
  36390.                 start: tokenStart
  36391.                 stop: self previousStepPosition].
  36392.     name = 'false' 
  36393.         ifTrue: 
  36394.             [^self literalTokenClass 
  36395.                 value: false
  36396.                 start: tokenStart
  36397.                 stop: self previousStepPosition].
  36398.     name = 'nil' 
  36399.         ifTrue: 
  36400.             [^self literalTokenClass 
  36401.                 value: nil
  36402.                 start: tokenStart
  36403.                 stop: self previousStepPosition].
  36404.     ^StIdentifierToken value: name start: tokenStart!
  36405.  
  36406. scanKeyword
  36407.     | outputPosition inputPosition name |
  36408.     [currentCharacter == $:] whileTrue: 
  36409.             [buffer nextPut: currentCharacter.
  36410.             outputPosition := buffer position.
  36411.             inputPosition := stream position.
  36412.             self step.    ":"
  36413.             [characterType == #alphabetic] whileTrue: [self scanName]].
  36414.     buffer position: outputPosition.
  36415.     stream position: inputPosition.
  36416.     self step.
  36417.     name := buffer contents.
  36418.     ^(name occurrencesOf: $:) == 1 
  36419.         ifTrue: [StKeywordToken value: name start: tokenStart]
  36420.         ifFalse: 
  36421.             [StMultiKeywordLiteralToken 
  36422.                 value: name asSymbol
  36423.                 start: tokenStart
  36424.                 stop: tokenStart + name size - 1]!
  36425.  
  36426. scanLiteral
  36427.     self step.
  36428.     separatorsInLiterals ifTrue: [self stripSeparators].
  36429.     characterType == #alphabetic ifTrue: [^self scanSymbol].
  36430.     characterType == #binary 
  36431.         ifTrue: [^(self scanBinary: self literalTokenClass) stop: self previousStepPosition].
  36432.     currentCharacter == $' ifTrue: [^self scanStringSymbol].
  36433.     (currentCharacter == $( or: [currentCharacter == $[]) 
  36434.         ifTrue: [^self scanLiteralArrayToken].
  36435.     (separatorsInLiterals and: [currentCharacter == ${]) 
  36436.         ifTrue: [^self scanQualifiedReference].
  36437.     (extendedLiterals and: [currentCharacter == $#]) ifTrue: [^self scanExtendedLiterals].
  36438.     self lexicalError: LErrExpectConst!
  36439.  
  36440. scanLiteralArrayToken
  36441.     | token |
  36442.     token := StLiteralArrayToken value: (String with: $# with: currentCharacter)
  36443.                 start: tokenStart.
  36444.     self step.
  36445.     ^token!
  36446.  
  36447. scanLiteralCharacter
  36448.     | token |
  36449.     self step.    "$"
  36450.     self atEnd ifTrue: [self lexicalError: LErrExpectChar].
  36451.     token := self literalTokenClass
  36452.                 value: currentCharacter
  36453.                 start: tokenStart
  36454.                 stop: stream position.
  36455.     self step.    "char"
  36456.     ^token!
  36457.  
  36458. scanLiteralString
  36459.     self step.
  36460.     
  36461.     [currentCharacter isNil 
  36462.         ifTrue: [self lexicalError: LErrStringNotClosed].
  36463.     currentCharacter == $' and: [self step ~~ $']] 
  36464.             whileFalse: 
  36465.                 [buffer nextPut: currentCharacter.
  36466.                 self step].
  36467.     ^self literalTokenClass
  36468.         value: buffer contents
  36469.         start: tokenStart
  36470.         stop: self previousStepPosition!
  36471.  
  36472. scanName
  36473.     [characterType == #alphabetic or: [characterType == #digit]] whileTrue: 
  36474.             [buffer nextPut: currentCharacter.
  36475.             self step]!
  36476.  
  36477. scanNameSpaceName
  36478.     extendedLiterals 
  36479.         ifTrue: 
  36480.             [stream peek == $: ifFalse: [^nil].
  36481.             buffer next: 2 put: $:.
  36482.             self step]
  36483.         ifFalse: 
  36484.             [(stream atEnd or: [(self classify: stream peek) ~~ #alphabetic]) 
  36485.                 ifTrue: [^nil].
  36486.             buffer nextPut: $.].
  36487.     self step.
  36488.     self scanName.
  36489.     currentCharacter == nameSpaceCharacter ifTrue: [self scanNameSpaceName].
  36490.     ^StIdentifierToken value: buffer contents start: tokenStart!
  36491.  
  36492. scanNumber
  36493.     | start number stop |
  36494.     start := stream position.
  36495.     number := self readNumber.
  36496.     stop := self atEnd ifTrue: [stream position] ifFalse: [stream position - 1].
  36497.     ^StNumberLiteralToken 
  36498.         value: number
  36499.         start: start
  36500.         stop: stop
  36501.         source: (stream copyFrom: start to: stop)!
  36502.  
  36503. scanPatternVariable
  36504.     buffer nextPut: currentCharacter.
  36505.     self step.
  36506.     currentCharacter == ${ 
  36507.         ifTrue: 
  36508.             [self step.
  36509.             ^PatternBlockToken value: '`{' start: tokenStart].
  36510.     [characterType == #alphabetic] whileFalse: 
  36511.             [characterType == #eof 
  36512.                 ifTrue: [self lexicalError: LErrExpectMetaVariable].
  36513.             buffer nextPut: currentCharacter.
  36514.             self step].
  36515.     ^self scanIdentifierOrKeyword!
  36516.  
  36517. scanQualifiedReference
  36518.     | nameToken bindingClass |
  36519.     bindingClass := Smalltalk at: #BindingReference ifAbsent: [nil].
  36520.     bindingClass isNil ifTrue: [^self lexicalError: LErrBadChar].
  36521.     self step.    "{"
  36522.     self stripSeparators.
  36523.     nameToken := self scanIdentifierOrKeyword.
  36524.     (nameToken isIdentifier and: [nameToken value notEmpty]) 
  36525.         ifFalse: [self lexicalError: LErrInvalidQualifier].
  36526.     self stripSeparators.
  36527.     currentCharacter == $} ifFalse: [self lexicalError: LErrQualifiedRefNotClosed].
  36528.     self step.    "}"
  36529.     ^self literalTokenClass 
  36530.         value: (bindingClass pathString: nameToken value)
  36531.         start: tokenStart
  36532.         stop: self previousStepPosition!
  36533.  
  36534. scanSpecialCharacter
  36535.     | character |
  36536.     currentCharacter == $: 
  36537.         ifTrue: 
  36538.             [self step.
  36539.             ^currentCharacter == $= 
  36540.                 ifTrue: 
  36541.                     [self step.
  36542.                     StAssignmentToken start: tokenStart]
  36543.                 ifFalse: [StSpecialCharacterToken value: $: start: tokenStart]].
  36544.     character := currentCharacter.
  36545.     self step.
  36546.     ^StSpecialCharacterToken value: character start: tokenStart!
  36547.  
  36548. scanStringSymbol
  36549.     | literalToken |
  36550.     literalToken := self scanLiteralString.
  36551.     literalToken value: literalToken value asSymbol.
  36552.     ^literalToken!
  36553.  
  36554. scanSymbol
  36555.     | lastPosition hasColon value startPosition |
  36556.     hasColon := false.
  36557.     startPosition := lastPosition := stream position.
  36558.     [characterType == #alphabetic] whileTrue: 
  36559.             [self scanName.
  36560.             currentCharacter == $: 
  36561.                 ifTrue: 
  36562.                     [buffer nextPut: $:.
  36563.                     hasColon := true.
  36564.                     lastPosition := stream position.
  36565.                     self step]].
  36566.     value := buffer contents.
  36567.     (hasColon and: [value last ~~ $:]) 
  36568.         ifTrue: 
  36569.             [stream position: lastPosition.
  36570.             self step.
  36571.             value := value copyFrom: 1 to: lastPosition - startPosition + 1].
  36572.     ^self literalTokenClass
  36573.         value: value asSymbol
  36574.         start: tokenStart
  36575.         stop: self previousStepPosition!
  36576.  
  36577. scanToken
  36578.     "fast-n-ugly. Don't write stuff like this. Has been found to cause cancer in laboratory rats. Basically a 
  36579.     case statement. Didn't use Dictionary because lookup is pretty slow."
  36580.  
  36581.     characterType == #alphabetic ifTrue: [^self scanIdentifierOrKeyword].
  36582.     (characterType == #digit 
  36583.         or: [currentCharacter == $- and: [(self classify: stream peek) == #digit]]) 
  36584.             ifTrue: [^self scanNumber].
  36585.     characterType == #binary ifTrue: [^self scanBinary: StBinarySelectorToken].
  36586.     characterType == #special ifTrue: [^self scanSpecialCharacter].
  36587.     currentCharacter == $' ifTrue: [^self scanLiteralString].
  36588.     currentCharacter == $# ifTrue: [^self scanLiteral].
  36589.     currentCharacter == $$ ifTrue: [^self scanLiteralCharacter].
  36590.     ^self lexicalError: LErrBadChar
  36591.         range: (self errorPosition to: self errorPosition)
  36592. !
  36593.  
  36594. separatorsInLiterals: aBoolean
  36595.     separatorsInLiterals := aBoolean!
  36596.  
  36597. step
  36598.     | index |
  36599.     stream atEnd 
  36600.         ifTrue: 
  36601.             [characterType := #eof.
  36602.             ^currentCharacter := nil].
  36603.     currentCharacter := stream next.
  36604.     #rbFix. "Inline #classify: for performance reasons, and also implement line counting"
  36605.     characterType := (index := currentCharacter asInteger) == 0 
  36606.                 ifTrue: [#separator]
  36607.                 ifFalse: 
  36608.                     [index == 10 ifTrue: [line := line + 1].
  36609.                     classificationTable at: index].
  36610.     ^currentCharacter!
  36611.  
  36612. stripComment
  36613.     "Private - Skip to the next end-of-comment marker."
  36614.  
  36615.     | start stop |
  36616.     start := stream position.
  36617.     
  36618.     [| ch |
  36619.     stream atEnd 
  36620.         ifTrue: 
  36621.             [self lexicalError: LErrCommentNotClosed range: (start to: stream position)].
  36622.     ch := stream next.
  36623.     ch isLinefeed ifTrue: [line := line + 1].
  36624.     ch == $"] 
  36625.             whileFalse.
  36626.     stop := stream position.
  36627.     self step.
  36628.     "Do we need access to the comments?"
  36629.     comments add: (start to: stop)!
  36630.  
  36631. stripSeparators
  36632.     
  36633.     [[characterType == #separator] whileTrue: [self step].
  36634.     currentCharacter == $"] 
  36635.             whileTrue: [self stripComment]! !
  36636.  
  36637. SmalltalkSystemIcon comment:
  36638. ''!
  36639. !SmalltalkSystemIcon class methodsFor!
  36640.  
  36641. icon
  36642.     "Answers an Icon that can be used to represent this class"
  36643.  
  36644.     ^Smalltalk developmentSystem icon!
  36645.  
  36646. icon: anIcon description: aStringDescription openBlock: aDyadicValuable
  36647.     "Answers an instance of the receiver with anIcon, aStringDescription and the <dyadicValuable> 
  36648.     open block set to aDyadicValuable."
  36649.     
  36650.     ^super new icon: anIcon description: aStringDescription openBlock: aDyadicValuable
  36651.     !
  36652.  
  36653. new
  36654.     "Private - Use #icon:description:openBlock:."
  36655.  
  36656.     ^self shouldNotImplement!
  36657.  
  36658. show: aToolClass description: aStringDescription
  36659.     "Answers an instance of the receiver for the tool with aToolClass
  36660.     and the description in aStringDescription.
  36661.     Implementation Note: Use a MessageSend to avoid prolonging
  36662.     the life of the arguments to the 'block' when evaluated."
  36663.     
  36664.     ^self icon: aToolClass icon 
  36665.         description: aStringDescription 
  36666.         openBlock: (MessageSend receiver: aToolClass selector: #show)!
  36667.  
  36668. showModal: aToolClass description: aStringDescription
  36669.     "Answers an instance of the receiver for the modal tool with aToolClass
  36670.     and the description in aStringDescription"
  36671.     
  36672.     ^self 
  36673.         icon: aToolClass icon 
  36674.         description: aStringDescription 
  36675.         openBlock: (MessageSend receiver: aToolClass selector: #showModal)! !
  36676.  
  36677. !SmalltalkSystemIcon methodsFor!
  36678.  
  36679. = aSmalltalkSystemIcon
  36680.     "Answer true if aSmalltalkSystemIcon is equal to (has the same description as) the receiver."
  36681.  
  36682.     ^self species == aSmalltalkSystemIcon species and: [
  36683.         self description = aSmalltalkSystemIcon description]!
  36684.  
  36685. description
  36686.     "Answers the <readableString> description for the receiver"
  36687.  
  36688.     ^description!
  36689.  
  36690. hash
  36691.     "Answer the SmallInteger hash value for the receiver."
  36692.  
  36693.     ^description hash!
  36694.  
  36695. icon
  36696.     "Answers the <Icon> for the receiver"
  36697.  
  36698.     ^icon!
  36699.  
  36700. icon: anIcon description: aString openBlock: aMonadicValuable
  36701.     "Private - Sets the <Icon> for the receiver to anIcon, the <readableString> description
  36702.     to aString and the <monadicValuable> open block to aMonadicValuable. The latter is
  36703.     evaluated to determine what action to take when an attempt is made to open the receiver
  36704.     in a folder presenter. The parameter is the folder presenter displaying the receiver"
  36705.  
  36706.     icon := anIcon.
  36707.     openBlock := aMonadicValuable.
  36708.     description := aString
  36709.  
  36710.     !
  36711.  
  36712. isFolder
  36713.     "Answers true if the receiver can hold contents"
  36714.  
  36715.     ^false!
  36716.  
  36717. openBlock
  36718.     "Private - Answers the <monadicValuable> open block for the receiver"
  36719.  
  36720.     ^openBlock!
  36721.  
  36722. openIn: aFolderPresenter
  36723.     "Opens the receiver within aFolderPresenter"
  36724.  
  36725.     Cursor wait showWhile: [self openBlock value: aFolderPresenter value: self]!
  36726.  
  36727. printOn: aStream
  36728.     "Append a short textual description of the receiver to aStream."
  36729.  
  36730.     aStream
  36731.         basicPrint: self;
  36732.         nextPut: $(;
  36733.         print: self description;
  36734.         nextPut: $)
  36735. ! !
  36736.  
  36737. Sound comment:
  36738. 'Sound is the class of objects that represent wave audio resources (.wav files).
  36739.  
  36740. Instance Variables:
  36741.     name        <String> identifier (e.g. filename or resource identifier)
  36742.     location        <ExternalHandle> of the module containing the wave resource, or nil if a .wav file.
  36743.     type        <SmallInteger> flags.
  36744.     fileLocator    <FileLocator>
  36745.  
  36746. Class Variables:
  36747.     Registry        <IdentityDictionary>. Registry of standard named sounds.
  36748.  
  36749. "test"'!
  36750. !Sound class methodsFor!
  36751.  
  36752. beep
  36753.     "Generate the standard system parp."
  36754.  
  36755.     self beep: 0!
  36756.  
  36757. beep: anInteger
  36758.     "Generate a parp of the specified type (see Win32 documentation) from the system speaker."
  36759.  
  36760.     UserLibrary default messageBeep: anInteger!
  36761.  
  36762. beep: freqInteger duration: durationInteger
  36763.     "Generate a parp of the specified frequency and duration from the system speaker."
  36764.  
  36765.     KernelLibrary default beep: freqInteger dwDuration: durationInteger!
  36766.  
  36767. bell
  36768.     "Generate a very short parp using the computer speaker - useful for debugging.
  36769.     Implementation Note: Annoyingly MessageBeep(-1) does not have the desired effect on
  36770.     NT4.0 because it doesn't actually use the speaker if a Sound card is present."
  36771.  
  36772.     self beep: 750 duration: 15!
  36773.  
  36774. clearRegistry
  36775.     "Create the standard sound registry"
  36776.  
  36777.     Registry := IdentityDictionary new.
  36778. !
  36779.  
  36780. defaultBeep
  36781.     "Generate the default system beep."
  36782.  
  36783.     self beep: 0!
  36784.  
  36785. errorBeep
  36786.     "Generate the standard system error parp."
  36787.  
  36788.     self beep: MB_ICONERROR!
  36789.  
  36790. for: aSymbol ifAbsent: aBlock
  36791.     "Answers a standard sound from our own registry"
  36792.  
  36793.     ^Registry at: aSymbol ifAbsent: aBlock.!
  36794.  
  36795. for: aSymbol put: aSound
  36796.     "Sets a standard sound into our own registry"
  36797.  
  36798.     ^Registry at: aSymbol put: aSound.!
  36799.  
  36800. fromAlias: aString
  36801.     "Answer a new instance of the receiver from the alias aString (stored in the windows registry 
  36802.     and configurable from the control panel)"
  36803.  
  36804.     ^(self new)
  36805.         name: aString;
  36806.         type: SND_ALIAS | SND_ASYNC;
  36807.         yourself!
  36808.  
  36809. fromFile: aString
  36810.     "Answer a new instance of the receiver from the wave file named aString."
  36811.  
  36812.     ^self fromFile: aString usingLocator: FileLocator default!
  36813.  
  36814. fromFile: aString usingLocator: aFileLocator
  36815.     "Answer a new instance of the receiver from the wave file named aString
  36816.     using aFileLocator."
  36817.  
  36818.     ^(self new)
  36819.         name: (aFileLocator relativePathTo: aString);
  36820.         fileLocator: aFileLocator;
  36821.         type: SND_FILENAME | SND_ASYNC;
  36822.         yourself!
  36823.  
  36824. fromId: aResourceId in: anExternalHandle
  36825.     "Answer a new instance of the receiver from the resource identified by
  36826.     aResourceId in the external module identified by anExternalHandle"
  36827.  
  36828.     ^(self new)
  36829.         name: aResourceId;
  36830.         location: anExternalHandle;
  36831.         type: (SND_RESOURCE | SND_ASYNC);
  36832.         yourself!
  36833.  
  36834. informationBeep
  36835.     "Generate the standard system information parp."
  36836.  
  36837.     self beep: MB_ICONINFORMATION!
  36838.  
  36839. initialize
  36840.     "Private - Initialize the receiver"
  36841.  
  36842.     self clearRegistry!
  36843.  
  36844. promptBeep
  36845.     "Generate the standard system prompt (question) parp."
  36846.  
  36847.     self beep: MB_ICONQUESTION!
  36848.  
  36849. warningBeep
  36850.     "Generate the standard system warning parp."
  36851.  
  36852.     self beep: MB_ICONWARNING!
  36853.  
  36854. woofAndWaitFor: aSymbol
  36855.     "Woofs standard sound from our own registry"
  36856.  
  36857.     self woofAndWaitFor: aSymbol ifAbsent: []!
  36858.  
  36859. woofAndWaitFor: aSymbol ifAbsent: exceptionBlock
  36860.     "Woofs standard sound from our own registry"
  36861.  
  36862.     | sound |
  36863.     sound := (Registry at: aSymbol ifAbsent: []). 
  36864.     sound notNil 
  36865.         ifTrue: [ sound woofAndWait ]
  36866.         ifFalse: [ exceptionBlock value ]!
  36867.  
  36868. woofFor: aSymbol
  36869.     "Woofs standard sound from our own registry"
  36870.  
  36871.     self woofFor: aSymbol ifAbsent: []!
  36872.  
  36873. woofFor: aSymbol ifAbsent: exceptionBlock
  36874.     "Woofs standard sound from our own registry"
  36875.  
  36876.     | sound |
  36877.     sound := (Registry at: aSymbol ifAbsent: []). 
  36878.     sound notNil 
  36879.         ifTrue: [ sound woof ]
  36880.         ifFalse: [ exceptionBlock value ]! !
  36881.  
  36882. !Sound methodsFor!
  36883.  
  36884. fileLocator: aFileLocator    
  36885.     "Private - Set the file locator used to locate the receiver's WAV file.
  36886.     Answers nil for non-file based sounds."
  36887.  
  36888.     fileLocator := aFileLocator!
  36889.  
  36890. location: anObject
  36891.     "Private - Set the 'location' of the receiver's wave resource"
  36892.  
  36893.     location := anObject!
  36894.  
  36895. name: aString
  36896.     "Private - Set the 'name' of the receiver's wave resource"
  36897.  
  36898.     name := aString!
  36899.  
  36900. play: flags
  36901.     "Private - Play the receiver with the specified flags.
  36902.     Answer whether it succeeded."
  36903.  
  36904.     | soundName |
  36905.     soundName := fileLocator notNil
  36906.         ifTrue: [ fileLocator localFileSpecFor: name ]    
  36907.         ifFalse: [ name ].
  36908.     ^WinMMLibrary default playSound: soundName hmod: location fdwSound: flags!
  36909.  
  36910. type
  36911.     "Answer the type of the receiver (flags specifying whether it is asynchronous, etc)"
  36912.  
  36913.     ^type!
  36914.  
  36915. type: anInteger 
  36916.     "Private - Set the 'type' of the receiver's wave resource"
  36917.  
  36918.     type := anInteger!
  36919.  
  36920. woof
  36921.     "Play the receiver, but do not wait for the woof to finish. Subsequent woofs may terminate this one."
  36922.  
  36923.     self play: type!
  36924.  
  36925. woofAndWait
  36926.     "Play the receiver, waiting for the woof to finish"
  36927.  
  36928.     | flags |
  36929.     flags := (type bitAnd: ##(SND_ASYNC bitInvert)) bitOr: SND_SYNC.
  36930.     self play: flags! !
  36931.  
  36932. SourceFiler comment:
  36933. ''!
  36934. !SourceFiler class methodsFor!
  36935.  
  36936. on: aWriteStream 
  36937.     "Answer a new instance of the receiver for filing out source code onto the 
  36938.     <puttableStream> argument."
  36939.  
  36940.     ^(self new)
  36941.         setStream: aWriteStream;
  36942.         yourself! !
  36943.  
  36944. !SourceFiler methodsFor!
  36945.  
  36946. atEnd
  36947.     "Answer whether the receiver is at the end of its source stream."
  36948.  
  36949.     ^stream atEnd!
  36950.  
  36951. close
  36952.     "Close the source stream"
  36953.  
  36954.     stream close!
  36955.  
  36956. cr
  36957.     "Emit a line-delimiter to the source stream"
  36958.  
  36959.     stream cr!
  36960.  
  36961. emitCategoriesOfClass: aClass 
  36962.     "Private - Emit a chunk to source stream to reclassify the <Class>, aClass, in all its existing 
  36963.     categories."
  36964.  
  36965.     ^self subclassResponsibility!
  36966.  
  36967. emitCategoriesOfMethod: aCompiledMethod 
  36968.     "Private - Append an entry to the source stream to reclassify the <CompiledMethod>, 
  36969.     aCompiledMethod, in all its current method categories."
  36970.  
  36971.     ^self subclassResponsibility!
  36972.  
  36973. emitCategoriesOfMethods: methods 
  36974.     "Emit source that associates the <CompiledMethod>s in the <collection>, methods, with their
  36975.     current categories."
  36976.  
  36977.     methods do: [:m | self emitCategoriesOfMethod: m]!
  36978.  
  36979. emitComment: aString 
  36980.     "Private - Record aString to the source stream.
  36981.     N.B. Logging requests should be directed through the SessionManager."
  36982.  
  36983.     ^self subclassResponsibility!
  36984.  
  36985. emitCommentOfClass: aClass 
  36986.     "Private - Emit a chunk which defines the comment for the <Class>, aClass, to source stream."
  36987.  
  36988.     ^self subclassResponsibility!
  36989.  
  36990. emitFooterForMethodsOf: aClass 
  36991.     "Private - Ends the method definition chunks for aClass onto
  36992.     the source stream."
  36993.  
  36994.     ^self subclassResponsibility!
  36995.  
  36996. emitGUIDOfClass: aClass 
  36997.     "Private - Emit a GUID definition chunk for the <Class>, aClass, to the source stream."
  36998.  
  36999.     ^self subclassResponsibility!
  37000.  
  37001. emitHeaderForMethodsOf: aClass 
  37002.     "Private - Emits a category header for the class, aClass, to the source stream."
  37003.  
  37004.     ^self subclassResponsibility!
  37005.  
  37006. emitMessages: aClass ofBehavior: selectors 
  37007.     | methods sortedSelectors |
  37008.     sortedSelectors := selectors 
  37009.                 asSortedCollection: SortedCollection caseSensitiveSortBlock.
  37010.     methods := sortedSelectors asArray collect: 
  37011.                     [:selector | 
  37012.                     | method |
  37013.                     self
  37014.                         cr;
  37015.                         cr.
  37016.                     method := aClass compiledMethodAt: selector.
  37017.                     self emitMethod: method.
  37018.                     method].
  37019.     ^methods!
  37020.  
  37021. emitMethod: aCompiledMethod 
  37022.     "Private - File out the source of the single <CompiledMethod>, aCompiledMethod, to the source stream."
  37023.  
  37024.     ^self subclassResponsibility!
  37025.  
  37026. emitSetBehaviorFlag: flagName forClass: aClass 
  37027.     "Private - Emit an attribute for the <Class>, aClass, to define its special behaviour flag named by
  37028.     the <Symbol>, flagName."
  37029.  
  37030.     ^self subclassResponsibility!
  37031.  
  37032. emitSpecialBehaviourAttributesOfClass: aClass 
  37033.     "Private - Emit attributes for the <Class>, aClass, to define its special behaviour flags."
  37034.  
  37035.     #(#isIndirection #isNullTerminated) do: 
  37036.             [:flagName | 
  37037.             (aClass perform: flagName) 
  37038.                 ifTrue: [self emitSetBehaviorFlag: flagName forClass: aClass]]!
  37039.  
  37040. evaluationContext
  37041.     ^evaluationContext!
  37042.  
  37043. evaluationContext: anObject
  37044.     evaluationContext := anObject!
  37045.  
  37046. fileIn
  37047.     "File in the expressions/definitions from receiver's source stream, which is
  37048.     expected to be in the receiver's format. Any methods that fail to compile are stubbed 
  37049.     with instances of <CompileFailedMethod> and errors are logged to the Transcript."
  37050.  
  37051.     ^self subclassResponsibility!
  37052.  
  37053. fileOutAllMethodsOfBehavior: aClassDescription 
  37054.     "Emit definitions of all methods in the <ClassDescription> argument, aClassDescription,
  37055.     to the source stream."
  37056.  
  37057.     self fileOutMessages: aClassDescription selectors ofBehavior: aClassDescription.
  37058.     self isSourceOnly 
  37059.         ifFalse: [self fileOutProtocols: aClassDescription protocols ofBehavior: aClassDescription]!
  37060.  
  37061. fileOutAttributesOfClass: aClass 
  37062.     "File-out any attributes of the aClass (e.g. the comment, GUID, etc) not included in the basic
  37063.     aClass definition, onto the source stream."
  37064.  
  37065.     self emitGUIDOfClass: aClass.
  37066.     self emitSpecialBehaviourAttributesOfClass: aClass.
  37067.     self emitCommentOfClass: aClass.
  37068.     self emitCategoriesOfClass: aClass!
  37069.  
  37070. fileOutBasicDefinitionOfClass: aClass 
  37071.     "Print a definition of the <Class>, aClass, to the source stream."
  37072.  
  37073.     ^self subclassResponsibility!
  37074.  
  37075. fileOutBinaryGlobal: anAssociation 
  37076.     "File out the text representation of the non-<sourceObject>
  37077.     which is the value of the <Association>, anAssociation, to the
  37078.     source stream. The key of the association is the global name."
  37079.  
  37080.     ^self subclassResponsibility!
  37081.  
  37082. fileOutClass: aClass 
  37083.     "File out a full definition of the <ClassDescription>, aClass, to the source stream
  37084.     including all methods, categories and protocols. This includes all methods of the
  37085.     class, including any loose methods that may belong to packages other than the
  37086.     owning package of the class."
  37087.  
  37088.     self
  37089.         fileOutDefinitionOfClass: aClass;
  37090.         fileOutAllMethodsOfBehavior: aClass;
  37091.         fileOutAllMethodsOfBehavior: aClass class!
  37092.  
  37093. fileOutDefinitionOfClass: aClass 
  37094.     "File-out a definition of the <Class> to the source stream."
  37095.  
  37096.     self
  37097.         fileOutBasicDefinitionOfClass: aClass;
  37098.         fileOutAttributesOfClass: aClass!
  37099.  
  37100. fileOutExpression: aString
  37101.     "Append an immediate expression evaluation to the the source stream."
  37102.  
  37103.     ^self subclassResponsibility!
  37104.  
  37105. fileOutMessages: selectors ofBehavior: aClass 
  37106.     "Append the definitions of the methods of the <ClassDescription>, aClassDescription,
  37107.     whose names match the selectors in the <collection> of <Symbol>, aCollection, to the source 
  37108.     stream. Any method category settings are included."
  37109.  
  37110.     | methods |
  37111.     selectors isEmpty ifTrue: [^self].
  37112.     self emitHeaderForMethodsOf: aClass.
  37113.     methods := self emitMessages: aClass ofBehavior: selectors.
  37114.     self emitFooterForMethodsOf: aClass.
  37115.     self isSourceOnly ifFalse: [self emitCategoriesOfMethods: methods].
  37116.     self cr!
  37117.  
  37118. fileOutPoolDictionary: aPoolDictionary 
  37119.     "Append a definition of the <PoolDictionary> (or <PoolConstantsDictionary>, aPoolDictionary,
  37120.     to the source stream. The definition should be sufficient to recreate a copy  of the dictionary."
  37121.  
  37122.     ^self subclassResponsibility!
  37123.  
  37124. fileOutProtocols: aCollection ofBehavior: aClassDescription 
  37125.     "File out the <MethodProtocol>s in the <collection>, aCollection, to the source stream,
  37126.     associating them with the <ClassDescription>, aClassDescription."
  37127.  
  37128.     ^self subclassResponsibility!
  37129.  
  37130. fileOutResource: aResourceIdentifier 
  37131.     "Append a definition of the resource identified by the <ResourceIdentifier>, aResourceIdentifer,
  37132.     to the source stream. The definition should be sufficient to recreate a copy  of the resource."
  37133.  
  37134.     ^self subclassResponsibility!
  37135.  
  37136. flush
  37137.     "Flush the source stream."
  37138.  
  37139.     stream flush!
  37140.  
  37141. getSourceFromDescriptor: sourceDescriptor
  37142.     "Answer the <readableString> source corresponding to the specified <integer> 
  37143.     descriptor, sourceDescriptor, from the receiver's source stream."
  37144.  
  37145.     ^self subclassResponsibility!
  37146.  
  37147. isSourceOnly
  37148.     ^isSourceOnly!
  37149.  
  37150. isSourceOnly: aBoolean 
  37151.     isSourceOnly := aBoolean!
  37152.  
  37153. setStream: aPuttableStream 
  37154.     stream := aPuttableStream.
  37155.     self isSourceOnly: false!
  37156.  
  37157. setToEnd
  37158.     "Seek to the end of the source stream."
  37159.  
  37160.     stream setToEnd!
  37161.  
  37162. sourcePositionFromDescriptor: sourceObject
  37163.     "Private - Answer the offset from the start of the source file at which the chunk containing
  37164.     the source code whose location is described by, sourceDescriptor, can be found.
  37165.     If sourceObject is not an Integer, then an error will result."
  37166.  
  37167.     ^sourceObject bitShift: -8!
  37168.  
  37169. storeCommentString: aString forClass: aClass
  37170.     "Save the <readableString>, aString, as the comment text for the 
  37171.     <Class>, aClass, to the receiver's source stream encoding the position and 
  37172.     index into the class' source descriptor so that the comment may be retrieved later."
  37173.  
  37174.     ^self subclassResponsibility!
  37175.  
  37176. storeSource: aString for: aSourceObject
  37177.     "Private - Store the <readableString>, aString, as the source text for the <sourceObject>,
  37178.     aSourceObject, updating its source descriptor."
  37179.  
  37180.     ^self subclassResponsibility!
  37181.  
  37182. storeSourceString: aString forMethod: aCompiledMethod 
  37183.     "Save the <readableString>, aString, as the source text for the 
  37184.     <CompiledMethod>, aCompiledMethod, to the receiver's source stream
  37185.     encoding the position and index into the methods source descriptor so that 
  37186.     the source may be retrieved later."
  37187.  
  37188.     ^self subclassResponsibility!
  37189.  
  37190. stream
  37191.     "Private - Answer the value of the receiver's ''stream'' instance variable."
  37192.  
  37193.     ^stream! !
  37194.  
  37195. SourceManager comment:
  37196. ''!
  37197. !SourceManager class methodsFor!
  37198.  
  37199. default
  37200.     "Answer the default SourceManager to use."
  37201.  
  37202.     DefaultInstance isNil ifTrue: [ SourceManager newDefault ].
  37203.     ^DefaultInstance!
  37204.  
  37205. default: aSourceManager
  37206.     "Set the default  source manager to aSourceManager."
  37207.  
  37208.     DefaultInstance notNil ifTrue: [ DefaultInstance closeSources ].
  37209.     DefaultInstance := aSourceManager.
  37210.     DefaultInstance notNil ifTrue: [ DefaultInstance openSources ].!
  37211.  
  37212. icon
  37213.     "Answers an Icon that can be used to represent this class. Here we use a constant expression 
  37214.     evaluated at compile time in order to statically bind 'self' at this position in the class hierarchy 
  37215.     (i.e. to Object). This ensures that subclasses which do not override this method still answer 
  37216.     'Object defaultIcon' rather than 'aSubclass defaultIcon'. Classes which provide their own default icon 
  37217.     can override this method with a similar implementation perhaps with #defaultIconFrom: if the icon comes
  37218.     from an ExternalResourceLibrary other than the system default."
  37219.  
  37220.     ^##(self) defaultIcon!
  37221.  
  37222. initialize
  37223.     "Initialize the class variables of the receiver"
  37224.  
  37225.     SourcesIndex := 1.
  37226.     ChangesIndex := 2!
  37227.  
  37228. new
  37229.     ^super new initialize!
  37230.  
  37231. newDefault
  37232.     "Answer an instance of the receiver which becomes the default source manager"
  37233.  
  37234.     | sm |
  37235.     sm := self new.
  37236.     self default: sm.
  37237.     ^sm!
  37238.  
  37239. reset
  37240.     "Private - Reset this class"
  37241.     DefaultInstance class==self ifTrue: [ 
  37242.         DefaultInstance closeSources.
  37243.         DefaultInstance  := nil ].
  37244. !
  37245.  
  37246. uninitialize
  37247.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  37248.  
  37249.     self reset! !
  37250.  
  37251. !SourceManager methodsFor!
  37252.  
  37253. basicCompressSources: progress 
  37254.     "Private - Compresses the sources file reporting the progress to
  37255.     <monadicValuable>, progress."
  37256.  
  37257.     | totalClasses index tmpPath smlFile filer classes |
  37258.     index := 0.
  37259.     classes := self class environment allClasses.
  37260.     totalClasses := classes size.
  37261.  
  37262.     "Create temporary stream file"
  37263.     tmpPath := File temporaryFilenameWithPrefix: self changesExtension.
  37264.     smlFile := self sourcesFileName.
  37265.     filer := self sourceFilerOn: (FileStream write: tmpPath).
  37266.     filer
  37267.         sourceFileIndex: SourcesIndex;
  37268.         isSourceOnly: true.
  37269.     self logComment: 'Compressing sources....' to: filer.
  37270.     index := 0.
  37271.     classes do: 
  37272.             [:class | 
  37273.             filer storeCommentString: class comment forClass: class.
  37274.             filer fileOutAllMethodsOfBehavior: class class.
  37275.             filer fileOutAllMethodsOfBehavior: class.
  37276.             progress value: (index := index + 1) * 100 / totalClasses].
  37277.     filer close.
  37278.  
  37279.     "Copy temporary file over to dolphin.sml"
  37280.     self closeSourcesFile.
  37281.     File
  37282.         delete: smlFile;
  37283.         rename: tmpPath to: smlFile.
  37284.     self openSourcesFile: smlFile.
  37285.  
  37286.     "Save image"
  37287.     SessionManager current saveImage.
  37288.  
  37289.     "Clear down change log"
  37290.     self truncateChanges.
  37291.     self logComment: 'Compressed sources'!
  37292.  
  37293. basicOpenSources: filePath
  37294.     "Private - Open the source streams"
  37295.  
  37296.     self
  37297.         openSourcesFile: filePath;
  37298.         openChangesFile: filePath!
  37299.  
  37300. changesExtension
  37301.     "Private - Answers the suffix to use for the changes file"
  37302.  
  37303.     ^'chg'!
  37304.  
  37305. changesFileName
  37306.     "Answer the file name for the current change log."
  37307.  
  37308.     ^self changesStream name!
  37309.  
  37310. changesFileNameFromPath: filePath
  37311.     "Answer the file name for a change log with the specified image path."
  37312.  
  37313.     ^File path: filePath extension: self changesExtension!
  37314.  
  37315. changesFiler
  37316.     "Private - Answer a <SourceFiler> open on the changes log file, or nil 
  37317.     if there is no change log. The <SourceFiler> is position to the end of 
  37318.     the log ready to log new source, etc."
  37319.  
  37320.     ^(SourceFiles at: ChangesIndex) ifNotNil: [:changes | 
  37321.         changes
  37322.             setToEnd;
  37323.             yourself]!
  37324.  
  37325. changesStream
  37326.     "Private - Answer the FileStream open on the changes log file."
  37327.  
  37328.     ^(SourceFiles at: ChangesIndex) ifNotNil: [:changes | changes stream]!
  37329.  
  37330. chunkFilerOn: aStream 
  37331.     "Answer a <ChunkSourceFiler> on the specified stream."
  37332.  
  37333.     ^ChunkSourceFiler on: aStream!
  37334.  
  37335. closeChangesFile
  37336.     "Private - Close the changes log file FileStream."
  37337.  
  37338.     self closeSourceAt: ChangesIndex
  37339. !
  37340.  
  37341. closeSourceAt: anInteger
  37342.     "Private - Closes the source FileStream SourceFiles at: anInteger and nil it out."
  37343.  
  37344.     (SourceFiles at: anInteger) notNil ifTrue: [
  37345.         (SourceFiles at: anInteger) close.
  37346.         SourceFiles at: anInteger put: nil ].
  37347. !
  37348.  
  37349. closeSources
  37350.     "Private - Closes the changes and the sources files."
  37351.  
  37352.     self closeSourcesFile; closeChangesFile!
  37353.  
  37354. closeSourcesFile
  37355.     "Private - Close the sources FileStream."
  37356.  
  37357.     self closeSourceAt: SourcesIndex
  37358. !
  37359.  
  37360. compressChanges
  37361.     "Compresses the change log to remove duplicate entries, and save the image to keep it in sync."
  37362.  
  37363.     | tmpPath changesFileName filer resman |
  37364.     changesFileName := self changesFileName.
  37365.     tmpPath := File temporaryFilenameWithPrefix: self changesExtension.
  37366.     filer := self chunkFilerOn: (FileStream write: tmpPath).
  37367.     filer sourceFileIndex: ChangesIndex.
  37368.     resman := SessionManager current resourceManager.
  37369.     mutex critical: 
  37370.             [self class environment allClassesDo: 
  37371.                     [:class | 
  37372.                     "First the comment which is now stored in the source files"
  37373.  
  37374.                     (self sourceIndexFromDescriptor: class sourceDescriptor) = ChangesIndex 
  37375.                         ifTrue: [filer storeCommentString: class comment forClass: class].
  37376.                     self
  37377.                         compressChangesOf: class class on: filer;
  37378.                         compressChangesOf: class on: filer.
  37379.  
  37380.                     "And any changed resources of the class"
  37381.                     (resman resourceIdentifiersForClass: class) asSortedCollection do: 
  37382.                             [:each | 
  37383.                             each isChanged 
  37384.                                 ifTrue: 
  37385.                                     [each fileOutOn: filer.
  37386.                                     filer cr]]].
  37387.             filer close.
  37388.  
  37389.             "Now close, delete, rename, and reopen the changes file"
  37390.             self closeChangesFile.
  37391.             File
  37392.                 delete: changesFileName;
  37393.                 rename: tmpPath to: changesFileName.
  37394.             self openChangesFile: changesFileName].
  37395.     self logComment: 'Compressed changes'.
  37396.  
  37397.     "Save image"
  37398.     SessionManager current saveImage!
  37399.  
  37400. compressChangesOf: aBehavior on: aSourceFiler 
  37401.     "Private - Emits the changed methods of aBehavior onto aSourceFiler."
  37402.  
  37403.     | changed |
  37404.     changed := aBehavior changedMethods collect: [:each | each selector].
  37405.     aSourceFiler fileOutMessages: changed ofBehavior: aBehavior!
  37406.  
  37407. compressSources
  37408.     "Compresses the change log into the sources file. The result is a new empty changes log.
  37409.     The image must be saved to keep it in sync."
  37410.  
  37411.     self basicCompressSources: [:x | ]
  37412.  
  37413. !
  37414.  
  37415. compressSourcesWith: aProgressDialog
  37416.     "Compresses the change log into the sources file. The result is a new empty changes log.
  37417.     During the operation the progress is indicated by aProgressDialog."
  37418.  
  37419.     aProgressDialog operation: [:progress | self basicCompressSources: progress ].
  37420.     aProgressDialog showModal.
  37421. !
  37422.  
  37423. copyAndReopenSources: filePath 
  37424.     "Private - Copy sources to the specified path and open them there for any
  37425.     further perusal and modification.
  37426.  
  37427.     Take a special interest if we do not currently have the source files available.
  37428.     This will be the case when we load from a .exe. In this case we generate some
  37429.     suitable empty source files. We also have to mark methods so that they know
  37430.     they have lost any reference to information in a .sml file."
  37431.  
  37432.     | hadSources |
  37433.     hadSources := self hasSources.
  37434.  
  37435.     "Copy and and swap over sources. Take care to end up with a good sources and imagePath"
  37436.     hadSources 
  37437.         ifTrue: 
  37438.             [self copySourceFilesTo: (File removeExtension: filePath).
  37439.             self closeSources].
  37440.     hadSources 
  37441.         ifFalse: 
  37442.             [self createSources: filePath.
  37443.             "We have permanently lost access to any source information so mark all methods"
  37444.             self class environment allBehaviorsDo: 
  37445.                     [:aBehavior | 
  37446.                     aBehavior methodDictionary do: [:aMethod | aMethod loseSource]]].
  37447.     self openSources: filePath.!
  37448.  
  37449. copySourceFilesTo: path
  37450.     "Private - Copy the various Smalltalk sources files to a new root name"
  37451.  
  37452.     self flushChanges.
  37453.     [ File
  37454.         copy: self sourcesFileName to: (self sourcesFileNameFromPath: path);
  37455.         copy: self changesFileName to: (self changesFileNameFromPath: path)
  37456.     ] on: HRESULTError do: [:e |
  37457.         self error: 'Failed to copy sources to ', path, '(', e osErrorMessage, ')']!
  37458.  
  37459. createSources: filePath
  37460.     "Private - This will create a sources and changes file for the current image. Does not
  37461.     update the receiver to use these new files though."
  37462.  
  37463.     self createSourcesFile: filePath.
  37464.     (File open: (self changesFileNameFromPath: filePath) mode: #truncate check: false) close!
  37465.  
  37466. createSourcesFile: filePath 
  37467.     "Private - Create (or truncate) a source file with the specified path (and default extension)."
  37468.  
  37469.     (self newSourceFiler: (self sourcesFileNameFromPath: filePath)) close!
  37470.  
  37471. emitFileOutHeaderOn: aSourceFiler 
  37472.     "Private - Append the standard Dolphin file out header to the
  37473.     <puttableStream>, aWriteStream."
  37474.  
  37475.     aSourceFiler
  37476.         emitComment: 'Filed out from ' , VMLibrary default productName;
  37477.         cr!
  37478.  
  37479. ΣI.=ºÜ ,ÖíÖ$Äeí╒▄╪∞▐╤╥■÷á@@¡▓╨ozGXê─:Wä\V#~OZd╢æ [j/\½yAIº╣4≤╪K⌐ú▓─╖╠ â}X    ma╬╣-"╝└╓X\É=û/εSñtåΦTd !!íkæä¥q`╛=▐╥«£ÑΓCÜëÜçyOπ▒xQ╢po┬√;█ƒL≈D,┼Y╙≈muⁿ▀léC}Ç>±╚æQgº½ⁿ╛π╜·k╢ε≥ 1qTP
  37480. kpπ`Ä}YmD█▐ÅÑk5OI╚┴3µ0kéΓ─½Φdα·█É┌║∩┘╞ ênΘ`Zµòh╘lül≈Φ·τ█IÅ╫ƒªC╟"│eµ^»Äæ╢sBl\[4ß#Ü°#?╤0Ü]▄
  37481. HRwÅonαæ\ècLL▌áπ^"2O ]╙╩█▀Mü≈Yp≈ⁿLìüûA╫/9DE|¿ÖMjTü~₧φ┘╞ ç┐Φ∞ï¢┘VèY┤ünS=ε σz╩╣pc÷╙┌º¼1tÅÄ▓£╤X■╣Φ,ÅF0$ä╞∙cæ⌠9çè╝Fü₧U°UuiΩ¬╡Üi╥Γ▐SⁿεLφ▒$~≈┤╦╬ÖG┬/%╦æ╩F9┘∩≡▄τ»}Pº▌>FàD]╝╫xM°{A⌡═«┬╒N╙>∙╡äô┤╬ CXÖ` H¥N∩Φ╘NΣ└E#kƒRJ#àΣçe0ªwù╩V{₧ö≤2▄«≤2┌L┴l|╝éôÑÉα▓ΦCnwÅC3iiZ╨!!µ?Θ╡à"-▄├½ΓR╛Γ▄╢|Wû@NεQs»\M5G┌k√║ö(ÅKS«}=æ║;sªεΓß╠i~G)O¼1Æè≤c╩è;╩Φ░,─¿·3∩0f,Eªú⌐KΘÅ╗²Tï≥ ┐JIF·üvc░ò│▀Q½î!
  37482.  
  37483. errorNotPackaged: anObject
  37484.     "Private - Signal an error to indicate than anObject is not yet assigned to a packaged
  37485.     and therefore cannot be filed out"
  37486.  
  37487.     anObject error: 'Object is not owned by any package'!
  37488.  
  37489. fileIn: aFileName
  37490.     "File in the chunk format file named, aFileName, into the system."
  37491.  
  37492.     | stream |
  37493.     stream := FileStream read: aFileName.
  37494.     [self fileInFrom: stream] ensure: [stream close].!
  37495.  
  37496. fileInFrom: aStream 
  37497.     "Private - File in the expressions/definitions from the chunk stream, aStream.
  37498.     in the receiver's chunk format. Any methods that do not    compile are stubbed 
  37499.     with instances of CompileFailedMethod and errors logged to the Transcript."
  37500.  
  37501.     (self chunkFilerOn: aStream) fileIn!
  37502.  
  37503. fileInPackagedClass: aClass
  37504.     "File in aClass via the package mechanism. The class is filed in from the same directory as the
  37505.     package which contains it. Following this call the class and its methods are marked as unchanged."
  37506.  
  37507.     self fileInPackagedClass: aClass from: aClass fileOutName.
  37508.  
  37509.  
  37510.     !
  37511.  
  37512. fileInPackagedClass: aClass from: aFileName
  37513.     "File in aClass via the package mechanism. The class is filed in from aFileName.
  37514.     Following this call the class and its methods are marked as unchanged."
  37515.  
  37516.     self fileIn: aFileName.
  37517.     aClass initializeAfterLoad
  37518.  
  37519.  
  37520.     !
  37521.  
  37522. fileItIn: aString
  37523.     "File the chunk format Smalltalk expression in aString into the system"
  37524.  
  37525.     self fileInFrom: aString readStream
  37526. !
  37527.  
  37528. fileOut: anObject
  37529.     "File out anObject to its default file. If an error occurs during file out, the file
  37530.     will be closed by finalization."
  37531.  
  37532.     self fileOut: anObject to: anObject fileOutName.!
  37533.  
  37534. fileOut: anObject to: aFileName 
  37535.     "File out anObject to aFileName. If an error occurs during file out, the file
  37536.     will be closed by finalization."
  37537.  
  37538.     | filer |
  37539.     filer := self newSourceFiler: aFileName.
  37540.     anObject fileOutOn: filer.
  37541.     filer close!
  37542.  
  37543. fileOutPackagedClass: aClass
  37544.     "File out aClass via the package mechanism. The class is filed out to the same directory as the
  37545.     package which contains it. Only the methods contained in this package are included in the 
  37546.     generated file and following this call the class and its methods are marked as unchanged."
  37547.  
  37548.     self fileOutPackagedClass: aClass to: aClass fileOutName.
  37549.     !
  37550.  
  37551. fileOutPackagedClass: aClass to: aFileName 
  37552.     "File out aClass via the package mechanism. The class is filed out to aFileName.
  37553.     Only the methods contained in this package are included in the 
  37554.     generated file and following this call the class and its methods are marked as unchanged."
  37555.  
  37556.     | package filer |
  37557.     package := self packageManager packageOfClass: aClass.
  37558.     package isNil 
  37559.         ifTrue: 
  37560.             ["Not in any package so just file out normally"
  37561.             ^self fileOut: aClass to: aFileName].
  37562.     filer := self newSourceFiler: aFileName.
  37563.     filer fileOutDefinitionOfClass: aClass.
  37564.     package fileOutMethodsOfClass: aClass on: filer.
  37565.     package fileOutMethodsOfClass: aClass class on: filer.
  37566.     filer close.
  37567.  
  37568.     "Flag the class as being saved, i.e. no longer changed"
  37569.     aClass isChanged: false!
  37570.  
  37571. flushChanges
  37572.     "Private - Perform a full flush (i.e. flush OS file buffers) on the change log so 
  37573.     that change log file is guaranteed to be up-to-date. This should be performed before 
  37574.     an image save to guarantee that source is not lost."
  37575.  
  37576.     self changesStream fullFlush
  37577. !
  37578.  
  37579. getSourceFromDescriptor: sourceDescriptor
  37580.     "Answer the <readableString> source corresponding to the specified <integer> 
  37581.     descriptor, sourceDescriptor, from the receiver's source files. Note that the descriptor
  37582.     is allowed to be nil (in which case the answer is the empty string), or some other
  37583.     non-integer <readableString> object directly representing the source."
  37584.  
  37585.     | filer |
  37586.     filer := self sourceFileFromDescriptor: sourceDescriptor.
  37587.     filer notNil 
  37588.         ifTrue: [^mutex critical: [filer getSourceFromDescriptor: sourceDescriptor]]
  37589.         ifFalse: 
  37590.             [(sourceDescriptor isNil or: [sourceDescriptor isInteger]) 
  37591.                 ifFalse: [^sourceDescriptor asString]].
  37592.     ^''!
  37593.  
  37594. getSourceOfMethod: aCompiledMethod
  37595.     "Answer the source of the method, aCompiledMethod, from the receiver's source files."
  37596.  
  37597.     | source |
  37598.     source := self getSourceFromDescriptor: aCompiledMethod sourceDescriptor.
  37599.     ^source isEmpty 
  37600.         ifTrue: ['"Source currently unavailable"']
  37601.         ifFalse: [source]!
  37602.  
  37603. hasMethodChanged: aCompiledMethod
  37604.     "Private - Answer whether the receiver has been 'changed' (i.e. it has source in
  37605.     the change log)."
  37606.  
  37607.     ^(self sourceIndexFromDescriptor: aCompiledMethod sourceDescriptor) == ChangesIndex!
  37608.  
  37609. hasSources
  37610.     "Private - Answer whether the the sources and changes files are available."
  37611.  
  37612.     ^self changesStream notNil and: [self sourcesFileStream notNil]!
  37613.  
  37614. ignoreSources
  37615.     "Private - Initialize the receiver so that no source is available"
  37616.  
  37617.     SourceFiles
  37618.         at: ChangesIndex put: nil;
  37619.         at: SourcesIndex put: nil.!
  37620.  
  37621. initialize
  37622.     "N.B. This must be a mutex as, for example,when copying a methods source from one source stream from another 
  37623.     re-entry will occur."
  37624.  
  37625.     mutex := Mutex new!
  37626.  
  37627. logChanged: aSourceObject
  37628.     "File out the changed <sourceObject>, aSourceObject, to the change log."
  37629.  
  37630.     self changesFiler 
  37631.         ifNotNil: [:logger | mutex critical: 
  37632.                     [aSourceObject fileOutOn: logger.
  37633.                     logger flush]]!
  37634.  
  37635. logComment: aString
  37636.     "Record aString to the change log as a comment. All comments
  37637.     logged are prefixed with a timestamp.
  37638.     N.B. Logging requests should be directed through the SessionManager."
  37639.  
  37640.     self changesFiler 
  37641.         ifNotNil: [:logger | mutex critical: [self logComment: aString to: logger]]!
  37642.  
  37643. logComment: aString to: aSourceFiler
  37644.     "Record aString to the specified source file as a comment. All comments
  37645.     logged are prefixed with a timestamp."
  37646.  
  37647.     aSourceFiler emitComment: TimeStamp current displayString, ': ', aString; cr!
  37648.  
  37649. logEvaluate: aString
  37650.     "Record aString to the change log as an expression which has been evaluated."
  37651.  
  37652.     self changesFiler 
  37653.         ifNotNil: [:logger | mutex critical: 
  37654.                     [logger
  37655.                         fileOutExpression: aString;
  37656.                         flush]]!
  37657.  
  37658. newSourceFiler: path
  37659.     "Private - Answer a new <SourceFiler> on the specified path with the default
  37660.     format. Any existing file with at the specified path is truncated."
  37661.  
  37662.     | answer dir |
  37663.     dir := File splitPathFrom: path.
  37664.     (File isDirectory: dir) ifFalse: [File createDirectoryPath: dir].
  37665.     answer := self sourceFilerOn: (FileStream write: path).
  37666.     self emitFileOutHeaderOn: answer.
  37667.     ^answer!
  37668.  
  37669. nextChunkFrom: aStream 
  37670.     #deprecated.    "Use a ChunkSourceFiler"
  37671.     ^(ChunkSourceFiler on: aStream) nextChunk!
  37672.  
  37673. onExit
  37674.     "Private - The system is about to exit, close the source files."
  37675.  
  37676.     SourceFiles do: [:f | f notNil ifTrue: [f close]]
  37677. !
  37678.  
  37679. openChangesFile: filePath 
  37680.     "Private - Open the change log file and record it in SourceFiles at: 2."
  37681.  
  37682.     | stream |
  37683.     stream := FileStream readWrite: (self changesFileNameFromPath: filePath).
  37684.     SourceFiles 
  37685.         at: ChangesIndex 
  37686.             put: ((self chunkFilerOn: stream) sourceFileIndex: ChangesIndex; yourself)!
  37687.  
  37688. openSources
  37689.     "Private - Initialize source streams -to the defaults for the current session"
  37690.  
  37691.     self openSources: SessionManager current imagePath!
  37692.  
  37693. openSources: aString
  37694.     "Private - Initialize source streams - otherwise we'll not be able to see any source code.
  37695.     This should be done very early on in the startup."
  37696.  
  37697.     self closeSources.
  37698.     [self basicOpenSources: aString] on: FileException do: [:aFileException |
  37699.         aFileException notify.
  37700.         self ignoreSources]!
  37701.  
  37702. openSourcesFile: filePath 
  37703.     "Private - Opens a big sources file and record it in SourceFiles at: 1."
  37704.  
  37705.     | stream |
  37706.     stream := FileStream read: (self sourcesFileNameFromPath: filePath).
  37707.     SourceFiles 
  37708.         at: SourcesIndex 
  37709.         put: ((self sourceFilerOn: stream) sourceFileIndex: SourcesIndex; yourself)!
  37710.  
  37711. packageManager
  37712.     "Private - Answer the package manager to be used by the receiver."
  37713.  
  37714.     ^Package manager!
  37715.  
  37716. ≥A$'=çç''▒äì8Ä:≤╣àÑ╝τ═▄¿≤▒V≥√ßu`_S└─3SàTA8.O[j╢ê]o%N╖y@*úδ3 ▌W¡≈┤ûΓ┴\·3j^¥²I=ó┘╚PFªüA╝VÑiò╪P[x≥a£╦KÖ3!
  37717.  
  37718. ≥A$'=éå>,ôº╓jäΦ╪ΩΓ ┌┌╕╘¢τuJ│╛Ço{M┴ü=GàZ)fN]`O≡Ä Tg2Ñu_oΓó.║▀d    ñ▓Öƒ·╩\Ö`Q@zh▀ⁿ~+╜▌┼T°|·"}½░t£╝X\I>Φvî╩ƒJq» 9╫╥╫∙î│vìMû¥╙uε XPΓi;â» █▄J⌡Do╩P╚≥9!!°╔|Äg╞┐╙ù4ºª²≡ìl┴⌡ K╕≥╝ b\&5çµpe@┌╚Qâºy4F ╧Æ*Öƒπ┘╜°!!≡╡┴╬ò0íΩ╟╩E  ⁿh⌠
  37719. 4Yδ╜lÇdUóD≤δ■Σ╢T█┼╤⌠G⌡pªïZ╓≤Ω┌K)[    °;û─9wö5Æ═@F9╞aFä≈0═ (Yå╧à>
  37720. )Oxû    █╤╠VªΩP/₧±oìÜÆ₧?,BE╧═d3éyà■éÆ5┐«π│╩åï\ÉW│üx!
  37721.  
  37722. ≥A$'=éå>,ôº¬8è2╗öε Ω┼┌╘│ƒ╧:Ö▓╠~3\^╫─-WöJV/.X[~²┴Vt+N╖<\dΓ¬ε╠GÑ≈╛Éπ└\
  37723. ƒqws╬╣`|├ú⌐m@ÉVÇg½B╗=Ö╝WF+⌡$£╓\ƒIq¿@(▄╥╨≤╔αzÄMûÅ╙r║▒^JΓaJhç∞&╠┌ßN=┴^╬V≥#e╡çq─`╧+²£ùLq╜├ÆùßF┐⌡rR░ε╡J vRp7ÇJ≈pbJUë╦Q₧⌐\-)PI╚┴8éI
  37724. ô⌠æ¼≤!!τ╡Å┘ô0áµë╞?K ╣<·xZó╕gÄ/6åk⌠ΦÅ╬╠Mÿ├╫πo⌡;┐yí2╞≤φ▐y@    !!£]·Σ(fä&Üc▐
  37725. JGq╞:=═Φ0∩ eO═í·E4B p▌7▀└╥A╬Ä6Cº≡Z▀╧┬▀,BE╧░4 .ÿx₧⌠╓£c╞╙≡╡▀₧╩S▄²─De0▓ùÄï9ªkv+■«▒▄─+~àëwτå⌡Là∩· ÅAr;▌ô∙Cî≤2íª»_Åë░1═─═¿(ΓΣé;ùè
  37726. εºp-Ñ·éïàB
  37727. ºPBê ┬I(▐┴≥
  37728. ┴ªÅlA╖╬6%Θ<?┐╠=σ)╕ öε╔h╘2¡≡öóñ╧ OZ╨gO¢Φ²╫σò╩¡╗[èO`)à■┬/>ámÄ╧5`ƒéΘ#ƒ╙⌐{╘y╟lkπÖΦµz┤|π╖Γz>åKsl@╩"╖%¿Æâ%;╔╦∩ƒ!
  37729.  
  37730. ≥A$'=éå>,ô╜Ñ$▀ατ√▐≈┘╪╕╘¢τuJ│╛Ço{M┴ü=GàZ)fN]`O≡Ä Tg2ÉqRf«┐!!÷╒░ºÑ¢Σ▄Ö4W.aΘ¿;á╬ÇPFü╙}½Ñdâ∙\dRêPù█ÅVfÑ;ô¢╨╢╩⌐a¢▀ÿ¢y Ñ⌠S╢oJhçΩs╫┘εUo┬P╬V·#!!°çk╟A{╥:±┌îVy▓║╕ εΣ┤iZ∙ε╜N%R]h_ΣcΓW'p]^└╩Qâ▓j5UI╘┴;äô⌡æ▒·!!≡▓äìÅ-░±ë╞?C¿s╝ {Q÷╕g╒h√èë╙Ü╫M█╨╠ΩG┤>⌠)îY¿ìæ╠JoL>Σ%û╤$iöæh═L#çStƒ≥;ΣJ7Y╔ª▄C#?K!
  37731.  
  37732. sourceFileFromDescriptor: sourceDescriptor
  37733.     "Private - Answer the <SourceFiler> corresponding to the <integer> source descriptor, 
  37734.     sourceDescriptor, which encodes the index of the filer in its first 8 bits. The remaining bits are
  37735.     the unique identifier used by that filer to locate the source for that object. If the 
  37736.     specified source descriptor is not actually an integer (which is permitted) then answer nil, 
  37737.     in which case the source descriptor is expected to be an object which can be resolved
  37738.     to the source by sending it the #asString method."
  37739.  
  37740.     ^SourceFiles at: (self sourceIndexFromDescriptor: sourceDescriptor) ifAbsent: []!
  37741.  
  37742. sourceFilerClass
  37743.     "Answer the class of <SourceFiler> used by the receiver to write source files."
  37744.  
  37745.     ^ChunkSourceFiler!
  37746.  
  37747. sourceFilerOn: aStream
  37748.     "Answer a <SourceFiler> on the <puttableStream>, aWriteStream."
  37749.  
  37750.     ^self sourceFilerClass on: aStream!
  37751.  
  37752. sourceIndexFromDescriptor: sourceObject
  37753.     "Private - Answer an index into the SourceFiles array which specifies where the source of the 
  37754.     method whose source descriptor is, sourceObject, or 0 if the sourceObject is not an <integer>
  37755.     source descriptor."
  37756.  
  37757.     ^sourceObject isInteger
  37758.         ifTrue: [sourceObject bitAnd: 16rFF]
  37759.         ifFalse: [0]!
  37760.  
  37761. sourcePositionFromDescriptor: sourceObject
  37762.     "Private - Answer the offset from the start of the source file at which the chunk containing
  37763.     the source code whose location is described by, sourceDescriptor, can be found.
  37764.     If sourceObject is not an Integer, then an error will result."
  37765.  
  37766.     ^sourceObject bitShift: -8!
  37767.  
  37768. sourcesExtension
  37769.     "Private - Answer the suffix for the sources file"
  37770.  
  37771.     ^'sml'!
  37772.  
  37773. sourcesFileName
  37774.     "Answer the file name for the current sources file."
  37775.  
  37776.     ^self sourcesFileStream name!
  37777.  
  37778. sourcesFileNameFromPath: filePath
  37779.     "Private - Answer a file name for a source file at the specified path."
  37780.  
  37781.     ^File path: filePath extension: self sourcesExtension!
  37782.  
  37783. sourcesFileStream
  37784.     "Private - Answer the FileStream open on the big sources file."
  37785.  
  37786.     ^(SourceFiles at: SourcesIndex) ifNotNil: [:sourceFile | sourceFile stream]!
  37787.  
  37788. storeCategoriesForClass: class
  37789.     "Private - Store the categories of the <ClassDescription>, class, to
  37790.     the change log so that they may be reloaded later."
  37791.  
  37792.     self changesFiler 
  37793.         ifNotNil: [:logger | mutex critical: 
  37794.                     [logger
  37795.                         emitCategoriesOfClass: class;
  37796.                         flush]]!
  37797.  
  37798. storeCategoriesForMethod: method
  37799.     "Private - Store the categories of the <CompiledMethod>, method, to the change
  37800.     log so that they may be reloaded later."
  37801.  
  37802.     self changesFiler ifNotNil: 
  37803.             [:logger | 
  37804.             mutex critical: 
  37805.                     [logger
  37806.                         emitCategoriesOfMethod: method;
  37807.                         cr;
  37808.                         flush]]!
  37809.  
  37810. storeCommentString: blahBlah forClass: aClass
  37811.     "Private - Append the <readableString> comment, blahBlah, for the <Class>, aClass, 
  37812.     to the change log, saving the position and index so that it may be 
  37813.     retrieved later.
  37814.     If a valid source file is not available then just store aString
  37815.     directly in the class."
  37816.  
  37817.     | filer |
  37818.     (filer := self changesFiler) isNil 
  37819.         ifTrue: [aClass sourceDescriptor: blahBlah]
  37820.         ifFalse: 
  37821.             [mutex critical: 
  37822.                     [filer
  37823.                         storeCommentString: blahBlah forClass: aClass;
  37824.                         flush]]!
  37825.  
  37826. storeGUIDForClass: class
  37827.     "Private - Append the GUID of the <Class>, class, to the change log in a evaluable chunk."
  37828.  
  37829.     self changesFiler 
  37830.         ifNotNil: [:logger | mutex critical: 
  37831.                     [logger
  37832.                         emitGUIDOfClass: class;
  37833.                         flush]]!
  37834.  
  37835. storeSourceString: aString forMethod: aCompiledMethod
  37836.     "Private - Append the source, aString, for the method, aCompiledMethod, 
  37837.     to the change log, saving the position and index so that it may be 
  37838.     retrieved later.
  37839.     If a valid source file is not available then just store aString
  37840.     directly in the method."
  37841.  
  37842.     | logger |
  37843.     (logger := self changesFiler) isNil 
  37844.         ifTrue: [aCompiledMethod sourceDescriptor: aString]
  37845.         ifFalse: [mutex critical: [logger storeSourceString: aString forMethod: aCompiledMethod]]!
  37846.  
  37847. syntaxColorOfScript: aString 
  37848.         "Private - Construct a syntax-coloured RTF representation of the contents of a Smalltalk
  37849.         chunk format script."
  37850.     
  37851.         | source coloured filer |
  37852.         source := aString readStream.
  37853.         filer := ChunkSourceFiler on: source.
  37854.         coloured := String writeStream: aString size * 2.
  37855.         
  37856.         [| pos |
  37857.         pos := source position.
  37858.         source skipSeparators.
  37859.         coloured nextPutAll: ((aString copyFrom: pos + 1 to: source position) 
  37860.                     copyReplaceAll: String lineDelimiter
  37861.                     with: '\par ').
  37862.         source atEnd] 
  37863.                 whileFalse: 
  37864.                     [| expression isChunks |
  37865.                     (isChunks := source peekFor: $!!) 
  37866.                         ifTrue: [coloured nextPut: $!!].
  37867.                     expression := filer nextChunk.
  37868.                     coloured
  37869.                         nextPutAll: (Compiler unadornedSyntaxColorOfExpression: expression);
  37870.                         nextPutAll: '\plain !!';
  37871.                         cr.
  37872.                     isChunks 
  37873.                         ifTrue: 
  37874.                             [| reader context |
  37875.                             reader := Compiler evaluate: expression logged: false.
  37876.                             context := reader isNil ifFalse: [reader context].
  37877.                             reader := ChunkReader do: 
  37878.                                             [:chunk | 
  37879.                                             context isNil 
  37880.                                                 ifTrue: 
  37881.                                                     [coloured 
  37882.                                                         nextPutAll: (chunk copyReplaceAll: String lineDelimiter with: '\par ')]
  37883.                                                 ifFalse: 
  37884.                                                     [coloured
  37885.                                                         nextPutAll: '\par \par ';
  37886.                                                         nextPutAll: (Compiler unadornedSyntaxColorOfMethod: chunk in: context)].
  37887.                                             coloured
  37888.                                                 nextPutAll: '\plain !!';
  37889.                                                 cr]
  37890.                                         atEnd: [coloured nextPutAll: ' !!'].
  37891.                             reader fileInFrom: filer]].
  37892.         ^Compiler syntaxColorFromUnadornedRtf: coloured contents!
  37893.  
  37894. truncateChanges
  37895.     "Private - Truncate the change log.
  37896.     WARNING: If you do this you will lose the source of all changes since the
  37897.     last #compressSources."
  37898.  
  37899.     mutex critical: 
  37900.             [| chgFile |
  37901.             chgFile := self changesFileName.
  37902.             self closeChangesFile.
  37903.             (FileStream write: chgFile) close.    "truncate it"
  37904.             self openChangesFile: chgFile]! !
  37905.  
  37906. StackFrame comment:
  37907. 'StackFrame encapsulates behaviour of an activation record for use by the development tools (especially the debugger) and other reflective activities. A StackFrame is only valid as a snapshot of Process state (e.g. when the process is suspended, as it is when being debugged).
  37908.  
  37909. Dolphin''s activation records are not objects (in fact they are just range of slots in the Process stack), and so this class is employed to stand in and wrap those records.
  37910.  
  37911. The layout of a stack frame is:
  37912.  
  37913.     Calling stack frame address
  37914.     Instruction Pointer (offset into methods byte codes)
  37915.     Stack Pointer (address in Process stack)
  37916.     Method (CompiledCode subinstance)
  37917.     Base Pointer (address of arguments, which preceed the stack frame, or reference to MethodContext)
  37918.  
  37919. An activations arguments and receiver preceed the frame, with the arguments being pointed at by the frames BP (unless it is has an associated MethodContext due to the method having full blocks). The receiver is at BP-1, with arguments at BP+0..BP+n-1, where n is the number of arguments. 
  37920.  
  37921. An activations temporary variables immediately succeed the frame, with working stack space on top of those.'!
  37922. !StackFrame class methodsFor!
  37923.  
  37924. frameClassFor: aProcess at: anInteger
  37925.     "Private - Answer the subclass of the receiver to use to represent a stack frame in aProcess
  37926.     at the specified index."
  37927.  
  37928.     | base |
  37929.     base := aProcess at: anInteger + BaseOffset ifAbsent: [^nil].
  37930.     ^base isInteger
  37931.         ifTrue: [self]
  37932.         ifFalse: [
  37933.             base isNil 
  37934.                 ifTrue: [ContextFrame]
  37935.                 ifFalse: [base frameClass]]
  37936. !
  37937.  
  37938. initialize
  37939.     "Initialize the class variables of the receiver."
  37940.  
  37941.     ReturnOffset := 0.
  37942.     IPOffset := 1.
  37943.     SPOffset := 2.
  37944.     MethodOffset := 3.
  37945.     BaseOffset := 4.
  37946.     FrameSize := BaseOffset + 1!
  37947.  
  37948. process: aProcess index: anInteger
  37949.     "Private - Answer a new instance of the receiver representing the stack frame in aProcess
  37950.     at the specified index in aProcess, or nil if the specified index is out of bounds in the process."
  37951.  
  37952.     ^(self frameClassFor: aProcess at: anInteger) ifNotNil: 
  37953.             [:frameClass | 
  37954.             (frameClass new)
  37955.                 setProcess: aProcess index: anInteger;
  37956.                 yourself]!
  37957.  
  37958. publishedAspectsOfInstances
  37959.     "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  37960.  
  37961.     | aspects |
  37962.     aspects := super publishedAspectsOfInstances.
  37963.     aspects
  37964.         add: (Aspect collection: #arguments) beReadOnly;
  37965.         yourself;
  37966.         add: (Aspect name: #method);
  37967.         add: (Aspect integer: #ip);
  37968.         add: (Aspect integer: #sp);
  37969.         add: (Aspect integer: #bp) beReadOnly;
  37970.         add: (Aspect name: #sender);
  37971.         add: (Aspect collection: #tempNames) beReadOnly.
  37972.     ^aspects! !
  37973.  
  37974. !StackFrame methodsFor!
  37975.  
  37976. = anObject
  37977.     "Answer whether the receiver and anObject are considered equivalent.
  37978.     Two frames are equal if they are of the same species, are for the same
  37979.     Process, and frame pointer."
  37980.  
  37981.     ^self species == anObject species and: [
  37982.         process = anObject process and: [index == anObject index]]
  37983.     !
  37984.  
  37985. argAt: anInteger
  37986.     "Private - Answer the argument indexed, anInteger, from the receiver's stack frame.
  37987.     Arguments preceed other temporaries."
  37988.  
  37989.     ^(anInteger between: 1 and: self argumentCount) 
  37990.         ifTrue: [self at: anInteger + self argsOffset]
  37991.         ifFalse: [self errorSubscriptBounds: anInteger]!
  37992.  
  37993. argsOffset
  37994.     ^0!
  37995.  
  37996. argumentCount
  37997.     "Private - Answer the number of arguments to the receivers stack frame, this will 
  37998.     vary depending on whether the receiver is a frame for a block or method activation."
  37999.     
  38000.     ^self method argumentCount!
  38001.  
  38002. arguments
  38003.     "Private - Answer a SequenceableCollection of the receiver's arguments."
  38004.  
  38005.     ^(1 to: self argumentCount) collect: [:i | self argAt: i]!
  38006.  
  38007. asInteger
  38008.     "Private - Answer the stack frame index represented by the receiver."
  38009.  
  38010.     ^index!
  38011.  
  38012. at: anInteger
  38013.     "Private - Answer the temporary indexed, anInteger, from the receivers stack frame."
  38014.     
  38015.     ^(anInteger between: 1 and: self tempCount)
  38016.         ifTrue: [process at: self bp + anInteger - 1] 
  38017.         ifFalse: [self errorSubscriptBounds: anInteger]!
  38018.  
  38019. at: anInteger put: anObject
  38020.     "Private - Replace the temporary indexed, anInteger, in the 
  38021.     receiver's stack frame with anObject."
  38022.     
  38023.     ^(anInteger between: 1 and: self tempCount)
  38024.         ifTrue: [process at: self bp + anInteger - 1 put: anObject] 
  38025.         ifFalse: [self errorSubscriptBounds: anInteger]!
  38026.  
  38027. basicBP
  38028.     "Private - Answer the base object from the appropriate stack slot. May be a SmallInteger
  38029.     or an object (MethodContext/BlockClosure)."
  38030.  
  38031.     ^process at: index + BaseOffset!
  38032.  
  38033. basicBP: anObject 
  38034.     "Private - Set the base object from the appropriate stack slot. May be a SmallInteger
  38035.     or an object (MethodContext/BlockClosure)."
  38036.  
  38037.     ^process at: index + BaseOffset put: anObject!
  38038.  
  38039. basicIP
  38040.     "Private - Answer the unadjusted SmallInteger IP index from the appropriate stack slot."
  38041.  
  38042.     ^process at: index + IPOffset!
  38043.  
  38044. basicIP: anInteger
  38045.     "Private - Set the IP of the process stack frame the receiver represents to
  38046.     anInteger (which is an offset from the start of the byte code object of the
  38047.     method)."
  38048.  
  38049.     process at: index + IPOffset put: anInteger!
  38050.  
  38051. basicSender
  38052.     "Private - Answer the context which caused the activation that the receiver represents"
  38053.  
  38054.     ^process at: index + ReturnOffset!
  38055.  
  38056. basicSender: spInteger
  38057.     "Private - Set the sender of the process stack frame the receiver represents
  38058.     to spInteger (address/2 of the sender frame in the same process)."
  38059.  
  38060.     ^process at: index + ReturnOffset put: spInteger!
  38061.  
  38062. basicSP
  38063.     "Private - Answer the SmallInteger stack pointer from the appropriate stack slot."
  38064.  
  38065.     ^process at: index + SPOffset!
  38066.  
  38067. basicSP: spInteger
  38068.     "Private - Set the SP of the process stack frame the receiver represents
  38069.     to spInteger (address/2 of the receivers TOS in the process)."
  38070.  
  38071.     process at: index + SPOffset put: spInteger!
  38072.  
  38073. block
  38074.     ^nil!
  38075.  
  38076. bp
  38077.     "Private - Answer the index of first temporary of the frame the receiver represents."
  38078.  
  38079.     ^process indexOfSP: self basicBP!
  38080.  
  38081. context: aContext 
  38082.     "Private - Set the receiver to be a frame for the argument, aContext."
  38083.  
  38084.     self
  38085.         method: aContext method;
  38086.         basicBP: aContext!
  38087.  
  38088. displayOn: aStream
  38089.     "Append a short textual description of the receiver to aStream appropriate
  38090.     for displaying in a stack trace."
  38091.  
  38092.     | method class mClass selector currentMethod |
  38093.  
  38094.     "Display processing will fail if this stack frame is dead"
  38095.     self isDead ifTrue: [
  38096.         self printOn: aStream.
  38097.         ^self].
  38098.  
  38099.     method := self method.
  38100.     class := self receiver basicClass.        "Use basic class to avoid deref'ing proxies"
  38101.  
  38102.     aStream nextPutAll: class name.
  38103.     mClass := method methodClass.
  38104.     mClass == class ifFalse: [aStream nextPut: $(; display: mClass name; nextPut: $)].
  38105.     aStream nextPutAll: '>>'.
  38106.     selector := method selector.
  38107.     method isUnbound ifTrue: [
  38108.             "Method is unbound if it is either not in the class' method dictionary, or it doesn't have the same
  38109.             source as that currently in the dictionary"
  38110.             aStream nextPutAll: '{unbound}'].
  38111.     aStream nextPutAll: selector!
  38112.  
  38113. findIP: ip inTextMap: aTextMap
  38114.         "Private - Answer the index of the source map entry corresponding to the
  38115.         receiver's current IP. The index is 0 if not found.
  38116.         This is used by the debugger to identify the range of text of the expression/statement
  38117.         which is currently being executed."
  38118.     
  38119.         | i size |
  38120.         i := 1.
  38121.         size := aTextMap size.
  38122.         [i < size and: [(aTextMap at: i+1) key < ip]]
  38123.             whileTrue: [i := i + 1].
  38124.         ^i <= size ifTrue: [i] ifFalse: [0]!
  38125.  
  38126. frameAddress
  38127.     ^process spOfIndex: index!
  38128.  
  38129. frameSize
  38130.     "Private - Answer the size of a real stack frame (in Oops)."
  38131.  
  38132.     ^FrameSize!
  38133.  
  38134. hash
  38135.     "Answer the SmallInteger hash value for the receiver.
  38136.  
  38137.     Implemented here because equivalent objects (i.e. those that answer 
  38138.     true for #=) MUST answer the same hash value, and we override #=."
  38139.  
  38140.     ^process hash bitXor: index hash!
  38141.  
  38142. homeFrame
  38143.     "Private - Answer a frame to represent the receiver's home. Note that this will be the
  38144.     equal to the receiver (not necessarily identical however), unless this is a <BlockFrame>."
  38145.  
  38146.     ^self!
  38147.  
  38148. index
  38149.     "Private - Answer the receiver's frame index."
  38150.  
  38151.     ^index!
  38152.  
  38153. index: anInteger
  38154.     "Private - Set the index of the receiver's actual frame in its process' stack to
  38155.     be anInteger. Answer the receiver."
  38156.  
  38157.     index := anInteger!
  38158.  
  38159. ip
  38160.     "Private - Answer the instruction pointer index into the bytes of the home method, 
  38161.     saved down when the context was last suspended."
  38162.  
  38163.     | ip |
  38164.     ip := self basicIP.
  38165.     ^self method isPacked 
  38166.         ifTrue: [ip + 1]
  38167.         ifFalse: [ip - self ipBias]
  38168. !
  38169.  
  38170. ip: anInteger
  38171.     "Private - Set the IP of the process stack frame the receiver represents to
  38172.     anInteger (which is an index into the byte codes of the method)."
  38173.  
  38174.     self basicIP: (self method isPacked ifTrue: [anInteger - 1] ifFalse: [anInteger + self ipBias])!
  38175.  
  38176. ipBias
  38177.     "Private - Answer the bias of an IP index to the true IP offset in
  38178.     an compiled code object."
  38179.  
  38180.     ^MemoryManager current objectHeaderSize - 1!
  38181.  
  38182. isBlock
  38183.     "Answer whether this frame is a block activation as opposed to a method
  38184.     activation."
  38185.  
  38186.     ^false!
  38187.  
  38188. isDead
  38189.     "Answer whether this is a dead stack frame (i.e. one which has returned).
  38190.     Note that this is only an indication."
  38191.  
  38192.     ^(self index + BaseOffset) > process size!
  38193.  
  38194. isRestartable
  38195.     "Answer whether this frame is restartable. Some methods, such as
  38196.     callback entry points, cannot be restarted at all, others not reliably."
  38197.  
  38198.     ^self sender notNil and: [ | method |
  38199.         method := self method.
  38200.         method isExpression or: [
  38201.             method categories allSatisfy: [:c | c name ~= 'not restartable']]]!
  38202.  
  38203. localAt: anInteger
  38204.     "Private - Answer the argument indexed, anInteger, from the receiver's stack frame."
  38205.  
  38206.     ^self at: anInteger + self argumentCount!
  38207.  
  38208. localCount
  38209.     "Private - Answer the number of locals variables (non-argument temporaries) in the receiver's
  38210.     stack frame. This is always defined by the home method."
  38211.     
  38212.     ^self tempCount - self argumentCount!
  38213.  
  38214. makeDebug
  38215.     "Private - Convert the receiver to a debug frame. This is for the use of the debugger."
  38216.  
  38217.     | method debugMethod ip |
  38218.     method := self method.
  38219.     (method isDebugMethod or: [method sourceDescriptor isNil]) ifTrue: [^self].    "nothing to do"
  38220.     ip := self ip.
  38221.     debugMethod := method asDebugMethod.
  38222.     ip > 1 
  38223.         ifTrue: 
  38224.             ["1 should remain 1 as not a true breakpoint"
  38225.             ip := self 
  38226.                         mapIP: ip
  38227.                         from: method debugInfo
  38228.                         to: debugMethod debugInfo].
  38229.  
  38230.     "We must reset ip, even if not changed, because method bytecodes may change from 
  38231.         packed to unpacked. Also the method must be set first for #ip: to work correctly."
  38232.     self
  38233.         method: debugMethod;
  38234.         ip: ip!
  38235.  
  38236. mapIP: ip from: info to: debugInfo
  38237.         "Private - Map the specified ip using the supplied debug information
  38238.         maps for normal and debug versions of a method."
  38239.     
  38240.         | i offset map |
  38241.         map := info textMap.
  38242.         i := self findIP: ip inTextMap: map.
  38243.         offset := ip - (map at: i) key.
  38244.         ^offset < 0
  38245.             ifTrue: [ip]
  38246.             ifFalse: [(debugInfo textMap at: i) key + offset]
  38247.     !
  38248.  
  38249. method
  38250.     "Private - Answer a compiled code object for which the receiver represents a stack frame."
  38251.  
  38252.     ^process at: index + MethodOffset!
  38253.  
  38254. method: aCompiledMethod
  38255.     "Private - Set the method of the stack frame."
  38256.  
  38257.     process at: index + MethodOffset put: aCompiledMethod!
  38258.  
  38259. process
  38260.     "Private - Answer the process for which the receiver is representing a stack frame"
  38261.     
  38262.     ^process!
  38263.  
  38264. process: aProcess
  38265.     "Private - Set the Process in whose stack the receiver's frame resides"
  38266.  
  38267.     process := aProcess!
  38268.  
  38269. receiver
  38270.     "Private - Answer the 'self' of the context. This is at BP-1."
  38271.  
  38272.     ^process at: self bp - 1!
  38273.  
  38274. return: anObject 
  38275.     "Return anObject from the receiver to its caller."
  38276.  
  38277.     | sender |
  38278.     sender := self basicSender.
  38279.     (sender isNil or: [sender == 0]) ifTrue: [^Processor cannotReturn: anObject].
  38280.     Processor returnValue: anObject toFrame: (process indexOfSP: sender)!
  38281.  
  38282. sender
  38283.     "Private - Answer the invoking/calling/sending StackFrame."
  38284.  
  38285.     | sender |
  38286.     sender := self basicSender.
  38287.     ^sender == 0
  38288.         ifFalse: [process frameAtAddress: sender]!
  38289.  
  38290. sender: aStackFrameOrIndex
  38291.     "Private - Set the sender of the process stack frame the receiver represents
  38292.     to aStackFrameOrIndex."
  38293.  
  38294.     self basicSender: (process spOfIndex: aStackFrameOrIndex asInteger)!
  38295.  
  38296. setProcess: aProcess index: anInteger
  38297.     "Private - Set the Process in whose stack the receiver's frame resides
  38298.     and the index of the frame in that stack."
  38299.  
  38300.     process := aProcess.
  38301.     index := anInteger!
  38302.  
  38303. sp
  38304.     "Private - Answer the index into the process stack which is the TOS for the receivers
  38305.     corresponding activation record"
  38306.  
  38307.     ^process indexOfSP: self basicSP!
  38308.  
  38309. sp: anIntegerIndex
  38310.     "Private - Set the SP of the process stack frame the receiver represents
  38311.     to the slot at the specified index."
  38312.  
  38313.     self basicSP: (process spOfIndex: anIntegerIndex)!
  38314.  
  38315. stackTempCount
  38316.     "Private - Answer the number of temps allocated on the stack, including any slot allocated for the receiver."
  38317.  
  38318.     ^self tempCount + 1!
  38319.  
  38320. stackWorkspace
  38321.     "Private - Answer the number of additional stack temps currently in use
  38322.         (i.e. the depth of stack above the last named temporary currently being
  38323.         used for working space)."
  38324.  
  38325.     | sender working |
  38326.     sender := self sender.
  38327.     sender isNil 
  38328.         ifTrue: [working := 0]
  38329.         ifFalse: [working := self sp - sender sp - self stackTempCount - self frameSize].
  38330.     ^working!
  38331.  
  38332. tempCount
  38333.     "Private - Answer the number of temporary variables (arguments and locals) in the receiver's
  38334.     stack frame. This is always defined by the home method."
  38335.     
  38336.     ^self method tempCount!
  38337.  
  38338. tempNames
  38339.     "Private - Answer a list of temporaries in-scope for the instruction before the 
  38340.     receiver's ip. This may include 'unnamed' temporaries which are not in scope,
  38341.     but which are placeholders for temporaries reserved for previous blocks."
  38342.  
  38343.     ^self tempsBeforeIp: self ip!
  38344.  
  38345. tempsBeforeIp: ip 
  38346.     "Private - Answer a list of temporaries for the instruction before the specified ip."
  38347.  
  38348.     | map i size |
  38349.     ip isNil ifTrue: [^Array new].
  38350.     map := self tempsMap.
  38351.     map isEmpty ifTrue: [^Array new].
  38352.     i := 1.
  38353.     size := map size.
  38354.     [i < size and: [(map at: i + 1) key < ip]] whileTrue: [i := i + 1].
  38355.     ^(map at: i ifAbsent: [^Array new]) value!
  38356.  
  38357. tempsMap
  38358.     "Private - Answer the map between temporaries and ip values for the
  38359.     method in the currently selected stack frame."
  38360.  
  38361.     ^self method tempsMap!
  38362.  
  38363. textMap
  38364.     "Private - Answer the map between source text and ip values for the receiver's method."
  38365.  
  38366.     ^self method textMap! !
  38367.  
  38368. StatusBarItemAbstract comment:
  38369. 'StatusBarItemAbstract is an abstract class whose subclasses represent the items held by a <StatusBar> view.
  38370.  
  38371. Subclasses should redefine the #drawItem:bounding: to paint in the desired manner.
  38372.  
  38373. Instance Variables:
  38374.     border        <integer> representing the Windows border style for the item.
  38375.     width        <integer> representing the pixel width of the item. This should be -1 if the item is to occupy the full width of the status bar.
  38376.     parentView    <Status> bar holding the item.
  38377.     model        <ValueHolder> model holding the item''s data.
  38378.  
  38379. Class Variables:
  38380.     BorderStyles    <IdentityDictionary> mapping border style symbols to style integers.
  38381.  
  38382.  
  38383.  
  38384. '!
  38385. !StatusBarItemAbstract class methodsFor!
  38386.  
  38387. initialize
  38388.     "Private - Initialize the receiver.
  38389.  
  38390.     self initialize.
  38391. "
  38392.     BorderStyles := ##(IdentityDictionary new
  38393.         at: #noBorder put: SBT_NOBORDERS;
  38394.         at: #sunkenBorder put: 0;
  38395.         at: #raisedBorder put: SBT_POPOUT;
  38396.         yourself).
  38397. !
  38398.  
  38399. new
  38400.     "Answer a new initialize instance of the receiver."
  38401.  
  38402.     ^super new initialize!
  38403.  
  38404. publishedAspectsOfInstances
  38405.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  38406.     
  38407.         ^(super publishedAspectsOfInstances)
  38408.             add: (Aspect choice: #borderStyle from: BorderStyles keys asSortedCollection);
  38409.             add: (Aspect integer: #width);
  38410.             add: (Aspect string: #name);
  38411.             yourself!
  38412.  
  38413. separator: width
  38414.     "Answer a new instance of the receiver which appears blank."
  38415.  
  38416.     ^self new
  38417.         width: width;
  38418.         borderStyle: #noBorder;
  38419.         yourself! !
  38420.  
  38421. !StatusBarItemAbstract methodsFor!
  38422.  
  38423. beFullWidth
  38424.     "Set the width of the receiver so it will stretch to the far
  38425.     right of its parent view."
  38426.  
  38427.     self width: -1!
  38428.  
  38429. border
  38430.     "Private - Answer the receivers border."
  38431.  
  38432.     ^border!
  38433.  
  38434. border: anInteger
  38435.     "Private - Set the receivers border."
  38436.  
  38437.     border := anInteger.
  38438.     self update!
  38439.  
  38440. borderStyle
  38441.     "Answer a symbol describing the border style of the receiver"
  38442.  
  38443.     ^BorderStyles keyAtValue: self border!
  38444.  
  38445. borderStyle: aSymbol
  38446.     "Set the border of the receiver to the style dictated by aSymbol. This can be one of:
  38447.  
  38448.     #noBorder
  38449.     #sunkenBorder
  38450.     #raisedBorder "
  38451.  
  38452.     self border: (BorderStyles at: aSymbol)
  38453. !
  38454.  
  38455. drawItem: hDC bounding: boundingRectangle
  38456.     "A request to draw the receiver.
  38457.     Subclasses should redefine this."
  38458.  
  38459.     ^self subclassResponsibility!
  38460.  
  38461. extent: aPoint
  38462.     "Set the receiver's extent (the height is ignored)."
  38463.  
  38464.     self width: aPoint x!
  38465.  
  38466. getText
  38467.     "Private - Answer the text for this item."
  38468.  
  38469.     ^model isNil
  38470.         ifTrue: ['']
  38471.         ifFalse: [model value]!
  38472.  
  38473. getTipText
  38474.     "Private - Answer the tool-tip text for this item.
  38475.     Implementation Note: Use the same text as the content."
  38476.  
  38477.     ^self getText!
  38478.  
  38479. hasParentView
  38480.     "Private - Answer whether a valid parentView has been set for the receiver."
  38481.  
  38482.     ^self parentView notNil!
  38483.  
  38484. initialize
  38485.     "Private - Initialize the state of the receiver."
  38486.  
  38487.     super initialize.
  38488.     self
  38489.         borderStyle: #sunkenBorder;
  38490.         beFullWidth!
  38491.  
  38492. invalidate
  38493.     "Invalidate the entire client area so that it will be re-painted"
  38494.  
  38495.     self parentView invalidateRect: self rectangle!
  38496.  
  38497. model
  38498.     "Answer the model (if any) for the receiver"
  38499.     
  38500.     ^model!
  38501.  
  38502. model: aValueModel
  38503.     "Set model for the receiver. Overridden by subclasses that wish to connect
  38504.     to specific update events generated by the model"
  38505.     
  38506.     model := aValueModel.
  38507.     aValueModel when: #valueChanged send: #onValueChanged to: self.
  38508.     self refreshContents
  38509. !
  38510.  
  38511. name
  38512.     "Answer the name of the receiver in its parent or nil if no
  38513.     name has been set"
  38514.  
  38515.     ^self parentView nameOf: self.
  38516. !
  38517.  
  38518. name: aStringOrNil
  38519.     "Set the name of the receiver in its parent to aStringOrNil"
  38520.  
  38521.     ^self parentView name: self as: aStringOrNil.
  38522. !
  38523.  
  38524. onClick: aPoint 
  38525.     "This item was left-clicked at the specified <Point>."
  38526.  
  38527.     self trigger: #clicked: with: aPoint!
  38528.  
  38529. onDoubleClick: aPoint 
  38530.     "This item was left double-clicked at the specified <Point>."
  38531.  
  38532.     self trigger: #doubleClicked: with: aPoint!
  38533.  
  38534. onRightClick: aPoint 
  38535.     "This item was right-clicked at the specified <Point>."
  38536.  
  38537.     self trigger: #rightClicked: with: aPoint!
  38538.  
  38539. onValueChanged
  38540.     "The model held by the receiver has changed so refresh the parentView. The
  38541.     default is to invalidate the receiver and cause it to repaint."
  38542.  
  38543.     self refreshContents
  38544. !
  38545.  
  38546. onViewOpened
  38547.     "Handler for view opened"
  38548. !
  38549.  
  38550. parentView
  38551.     "Private - Answer the Status view which the receiver is attached to
  38552.     or nil if it is not attached."
  38553.  
  38554.     ^parentView!
  38555.  
  38556. parentView: aStatus
  38557.     "Private - Set the receivers parentView."
  38558.  
  38559.     parentView := aStatus!
  38560.  
  38561. presenter: aPresenter
  38562.     "Sets the presenter associated with the receiver (ignore this request)."
  38563. !
  38564.  
  38565. presenterConnectionPoint
  38566.     "Answer the view within the receiver to which a same named presenter should connect.
  38567.     Normally this is the receiver itself. Some views that wish to direct the presenter
  38568.     to connect to another view may override this method however"
  38569.  
  38570.     ^self!
  38571.  
  38572. rectangle
  38573.     "Answer the rectangle of the receiver in its parentView coordinates."
  38574.  
  38575.     ^parentView rectangleOfItem: self!
  38576.  
  38577. refreshContents
  38578.     "The model held by the receiver has changed so refresh the display
  38579.     of the receiver in the parentView. The default is to invalidate the 
  38580.     receiver and cause it to repaint."
  38581.  
  38582.     self hasParentView ifTrue: [
  38583.         self updateTipText; invalidate]!
  38584.  
  38585. style
  38586.     "Answer the <integer> style flags to be used when displaying the receiver."
  38587.  
  38588.     ^self border bitOr: SBT_OWNERDRAW !
  38589.  
  38590. update
  38591.     "Private - Update the parentView common controls knowledge of the receiver."
  38592.  
  38593.     parentView notNil ifTrue: [
  38594.         parentView updateItem: self ]!
  38595.  
  38596. updateTipText
  38597.     "Private - Update the receiver's tool tip text.
  38598.     We set this to be the same as the receiver's text so that full text can be viewed when
  38599.     truncated."
  38600.  
  38601.     self parentView setItem: self tipText: self getTipText!
  38602.  
  38603. width
  38604.     "Answer the width in pixels of the receiver, or -1 if the receiver
  38605.     is stretched to the end of its parentView."
  38606.  
  38607.     ^width!
  38608.  
  38609. width: widthInteger
  38610.     "Set the width in pixels."
  38611.  
  38612.     width := widthInteger.
  38613.     self update! !
  38614.  
  38615. STBClassFormat comment:
  38616. ''!
  38617. !STBClassFormat class methodsFor!
  38618.  
  38619. forClass: aClass version: oldVersion instSize: vars bytes: bytes variable: variable
  38620.     "Answer a new instance representing the STB format of oldVersion of aClass."
  38621.  
  38622.     | format |
  38623.     format := self new version: oldVersion instSize: vars bytes: bytes variable: variable.
  38624.     format converterBlock: (aClass stbConvertFrom: format).
  38625.     ^format! !
  38626.  
  38627. !STBClassFormat methodsFor!
  38628.  
  38629. converterBlock
  38630.     "Answer the receiver's converterBlock.
  38631.     The block should expect a single argument being the old object
  38632.     represented by:
  38633.         an Array if it was stored as pointers, or
  38634.         a ByteArray if it was stored as bytes.
  38635.     The block should answer a new object initialised from the data
  38636.     contained in the block parameter."
  38637.  
  38638.     ^converterBlock!
  38639.  
  38640. converterBlock: aBlock
  38641.     "Set the receiver's converterBlock inst var to aBlock.
  38642.     The block should expect a single argument being the old object
  38643.     represented by:
  38644.         an Array if it was stored as pointers, or
  38645.         a ByteArray if it was stored as bytes.
  38646.     The block should answer a new object initialised from the data
  38647.     contained in the block parameter."
  38648.  
  38649.     converterBlock := aBlock!
  38650.  
  38651. instSize
  38652.     "Answer the receiver's instSize inst var."
  38653.  
  38654.     ^instSize!
  38655.  
  38656. isBytes
  38657.     "Answer the receiver's isBytes inst var."
  38658.  
  38659.     ^isBytes!
  38660.  
  38661. isVariable
  38662.     "Answer the receiver's isVariable inst var."
  38663.  
  38664.     ^isVariable!
  38665.  
  38666. prefix: anSTBPrefix
  38667.     "Initialise the receiver from the details contained in anSTBPrefix."
  38668.  
  38669.     instSize := anSTBPrefix instSize.
  38670.     isBytes := anSTBPrefix isBytes.
  38671.     isVariable := anSTBPrefix isVariable.!
  38672.  
  38673. version
  38674.     "Answer the receiver's version inst var."
  38675.  
  38676.     ^version!
  38677.  
  38678. version: versionInteger instSize: sizeInteger bytes: bytesBoolean variable: variableBoolean
  38679.     "Private - Initialise the receiver from the arguments."
  38680.  
  38681.     version := versionInteger.
  38682.     instSize := sizeInteger.
  38683.     isBytes := bytesBoolean.
  38684.     isVariable := variableBoolean.
  38685. ! !
  38686.  
  38687. STBFiler comment:
  38688. ''!
  38689. !STBFiler class methodsFor!
  38690.  
  38691. errorInconsistentSTB: anObject
  38692.     "Private - Signal an STBError indicating that the stream being
  38693.     read contains inconsistent STB data."
  38694.  
  38695.     STBError 
  38696.         signal: ('STB input stream is inconsistent (object %1!!d!! referenced but not yet defined)' 
  38697.                 formatWith: anObject)!
  38698.  
  38699. errorNotSTB
  38700.     "Private - Signal an STBError indicating that the stream being
  38701.     read is not in Smalltalk Binary (STB) format."
  38702.  
  38703.     STBError signal: 'Input stream not in STB format'
  38704. !
  38705.  
  38706. errorUnrecognisedClass: aClass version: version
  38707.     "Private - Signal an STBError indicating that the STB data contains
  38708.     instances of aClass of version that we don't know how to convert."
  38709.  
  38710.     STBError     signal:
  38711.         'STB contains a version ', version displayString, ' instance of ',
  38712.             aClass name, ' and is unable to convert it.'!
  38713.  
  38714. errorVersion: anInteger
  38715.     "Private - Signal an STBError indicating that the stream being
  38716.     read has been written in a different version of STB."
  38717.  
  38718.     ^STBError signal: ('Input stream is an incompatible STB format (version %1!!d!!)' formatWith: anInteger)
  38719. !
  38720.  
  38721. on: aStream
  38722.     "Answer a new instance attached to the binary stream aStream."
  38723.  
  38724.     ^self new
  38725.         stream: aStream;
  38726.         initialize!
  38727.  
  38728. peekForSignatureIn: aReadStream
  38729.     "Answer whether the <readableStream> argument, aReadStream, appears to
  38730.     be an STB stream (or is positioned at the start of an STB stream). If the STB
  38731.     signature is found, then the stream is left positioned immediately after it, 
  38732.     otherwise the stream position is not changed."
  38733.  
  38734.     | position |
  38735.     position := aReadStream position.
  38736.     ^(aReadStream next: self signature size) = self signature
  38737.         or: [aReadStream position: position. false]!
  38738.  
  38739. signature
  38740.     "Private - Answer the signature that identifies the data as
  38741.     being in Smalltalk Binary (STB) format."
  38742.  
  38743.     ^##('!!STB ' asByteArray)
  38744. !
  38745.  
  38746. version
  38747.     "Private - Answer the version number of the format produced by the receiver."
  38748.  
  38749.     ^1
  38750. ! !
  38751.  
  38752. !STBFiler methodsFor!
  38753.  
  38754. atEnd
  38755.     "Answer true if the receiver is positioned at end of its stream."
  38756.  
  38757.     ^stream atEnd
  38758.  
  38759. !
  38760.  
  38761. context
  38762.     "Answers the context for objects read by the receiver"
  38763.  
  38764.     ^context!
  38765.  
  38766. context: anObject
  38767.     "Sets the context for objects read by the receiver to anObject. This may be,
  38768.     for example, the parent window of a window being read."
  38769.  
  38770.     context := anObject!
  38771.  
  38772. initialize
  38773.     version isNil ifTrue: [version := self class version].
  38774.     self reset.
  38775.     ^self!
  38776.  
  38777. position: anInteger
  38778.     "Position the receiver's stream to anInteger, read/write a header at this
  38779.     place and prepare it for a new input or output session."
  38780.  
  38781.     stream position: anInteger.
  38782.     self reset.!
  38783.  
  38784. reset
  38785.     "Private - Reset the instance.
  38786.     We pre-register objects that must never be recreated - note that if the 'fixed' list of pre-registered
  38787.     objects is changed, then the STB version must be changed and the old versions handled
  38788.     appropriately."
  38789.  
  38790.     self
  38791.         register: true;
  38792.         register: false;
  38793.         register: Smalltalk;
  38794.         register: Processor.
  38795.     version > 0 
  38796.         ifTrue: 
  38797.             ["Also register some commonly used classes so:
  38798.             a) It is possible to binary file the classes STBClassProxy and String; and
  38799.             b) we don't need to file these out all the time so can save some space.
  38800.             Note that pre-registering classes does not inflate the size of the binary file,
  38801.             it just pre-allocates a range of indices for fixed uses.
  38802.             N.B. Changing the order of these (or deleting registrations) will break existing
  38803.             binary files"
  38804.  
  38805.             self
  38806.                 register: String;
  38807.                 register: Array;
  38808.                 register: ByteArray;
  38809.                 register: LargeInteger;
  38810.                 register: STBClassProxy;
  38811.                 register: STBMetaclassProxy;
  38812.                 register: STBSymbolProxy;
  38813.                 register: STBCollectionProxy;
  38814.                 register: OrderedCollection;
  38815.                 register: STBIdentityDictionaryProxy;
  38816.                 register: LookupTable;
  38817.                 register: IdentityDictionary.            
  38818.             self setRefOffset: 24]!
  38819.  
  38820. setRefOffset: anInteger
  38821.     ^self subclassResponsibility!
  38822.  
  38823. stream
  38824.     "Answer the stream to which the receiver is attached."
  38825.  
  38826.     ^stream!
  38827.  
  38828. stream: aStream
  38829.     "Set stream to aStream."
  38830.  
  38831.     stream := aStream!
  38832.  
  38833. version
  38834.     ^version!
  38835.  
  38836. version: anInteger
  38837.     version := anInteger! !
  38838.  
  38839. STBPrefix comment:
  38840. 'STBPrefix represents the object prefix encoding used in an STB binary file stream. It encapsulates much of the complexity of the data encoding performed by the STBOutFiler and STBInFiler classes. As the data encoding has been designed to achieve a reasonably compact format there are some restrictions on the order in which the methods can be called.
  38841.  
  38842. Instance Variables:
  38843.  
  38844.     dword        The actual 32-bit <Integer> encoding
  38845.  
  38846. Pools:
  38847.     STBPrefixConstants    <PoolConstantsDictionary> containing bit masks for testing the encoding.
  38848.  
  38849.  
  38850. The encodings are as follows (this is best viewed in a non-proportional font):
  38851.  
  38852.     SSSSSSSS SSSSSSSS SSSSSSSS SSSSSS11    a SmallInteger
  38853.     RRRRRRRR RRRRRRRR RRRRRRRR RRRR0000    an Object Reference
  38854.     RRRRRRRR RRRRRRRR RRRRRRRR RRRR0010    a Class Reference (Non-proxy object)
  38855.     ???????? ????CCCC CCCCCCCC CCCC0100    a Character
  38856.     LLLLLLLL LLLLLLLL IIIIIIII ?NVB0110    an Initial Class prefix (to Non-proxy object)
  38857.     ???????? ???????? ???????? ????1000    RESERVED
  38858.     RRRRRRRR RRRRRRRR RRRRRRRR RRRR1010    a Class Reference (Proxy object)
  38859.     ???????? ???????? ???????? ????1100    RESERVED
  38860.     LLLLLLLL LLLLLLLL IIIIIIII ?NVB1110    an Initial Class prefix (to Proxy object)
  38861.                                 |||||||
  38862.                                 |||||| --> isSmallInteger
  38863.                                 ||||| ---> isDataPrefix
  38864.                                 |||| ----> isClassPrefix
  38865.                                 ||| -----> isProxy
  38866.                                 || ------> isBytes
  38867.                                 | -------> isVariable
  38868.                                  --------> isNonZeroVersion
  38869.  
  38870.     0SSSSSSS SSSSSSSS SSSSSSSS SSSSSSS1 -> 30 bit SmallInteger value (low bit always 1)
  38871.     00000000 00000000 CCCCCCCC CCCCCCCC -> 16 bit Charater value
  38872.     0000RRRR RRRRRRRR RRRRRRRR RRRRRRRR -> 28 bit Reference index
  38873.     00000000 00000000 LLLLLLLL LLLLLLLL -> 16 bit Class name length
  38874.     00000000 00000000 00000000 IIIIIIII -> 8 bit Instance size
  38875.  
  38876. When testing an instance of this class the tests should be performed in the following order.
  38877.  
  38878.     anSTBPrefix isSmallInteger
  38879.         ifTrue: [^anSTBPrefix smallInteger. to yeild the SmallInteger represented.]
  38880.         ifFalse: [
  38881.             anSTBPrefix isDataPrefix
  38882.                 ifFalse: [
  38883.                     anSTBPrefix isCharacter
  38884.                         ifTrue: [^anSTBPrefix character]
  38885.                         ifFalse: [^anSTBPrefix refIndex. to answer the index of an already loaded object.]]
  38886.                 ifTrue: [
  38887.                     The data of the object represented will follow the prefix (although perhaps not immediately).
  38888.                     anSTBPrefix isClassPrefix
  38889.                         ifFalse: [
  38890.                             anSTBPrefix refIndex. is the index of the class of the object represented.
  38891.                             The data of the object represented follows the prefix.]
  38892.                         ifTrue: [
  38893.                             anSTBPrefix isNonZeroVersion
  38894.                                 ifTrue: [The integer following the prefix is the version of the class of the object represented].
  38895.                             anSTBPrefix classLocatorLen. is the number of following bytes containing the name
  38896.                                 of the class of the object represented.
  38897.                             anSTBPrefix instSize. This is the instance size of the class of the object represented.
  38898.                             anSTBPrefix isBytes
  38899.                                 ifTrue: [The class of the object represented is made of bytes].
  38900.                             anSTBPrefix isVariable
  38901.                                 ifTrue: [The class of the object represented is indexable]].
  38902.                     anSTBPrefix isProxy
  38903.                         ifTrue: [
  38904.                             The object represented is a proxy for the real one and should be sent a #fixup:at: message
  38905.                             to yeild the real object]]]."'!
  38906. !STBPrefix class methodsFor!
  38907.  
  38908. forCharacter: aCharacter
  38909.     "Answer a new instance to prefix aCharacter."
  38910.  
  38911.     ^self new
  38912.         character: aCharacter;
  38913.         yourself!
  38914.  
  38915. forData
  38916.     "Answer a newly initialised instance to prefix a data object."
  38917.  
  38918.     ^self fromInteger: DataPrefixMask!
  38919.  
  38920. forObjectRef: anInteger
  38921.     "Answer a new instance to prefix an object that has already been output."
  38922.  
  38923.     ^self new
  38924.         objectRef: anInteger;
  38925.         yourself!
  38926.  
  38927. forProxy
  38928.     "Answer a newly initialised instance to prefix a proxy object."
  38929.  
  38930.     ^self forData
  38931.         beProxy;
  38932.         yourself!
  38933.  
  38934. forSmallInteger: aSmallInteger
  38935.     "Answer a new instance to prefix aSmallInteger."
  38936.  
  38937.     ^self new
  38938.         smallInteger: aSmallInteger;
  38939.         yourself!
  38940.  
  38941. fromInteger: anInteger
  38942.     "Answer a new instance initialise from anInteger."
  38943.  
  38944.     ^self new
  38945.         dword: anInteger! !
  38946.  
  38947. !STBPrefix methodsFor!
  38948.  
  38949. beDataPrefix
  38950.     "Set the receiver's isDataPrefix bit flag."
  38951.  
  38952.     dword := dword bitOr: DataPrefixMask!
  38953.  
  38954. beProxy
  38955.     "Set the receiver's isProxy bit flag."
  38956.  
  38957.     dword := dword bitOr: ProxyMask!
  38958.  
  38959. character
  38960.     "Answer the Character represented by the receiver."
  38961.  
  38962.     ^Character value: (dword bitShift: IndexShift)!
  38963.  
  38964. character: aCharacter
  38965.     "Make the receiver a prefix to a 'virtual' Character, virtual because
  38966.     as we encode aCharacter's value entirely within the prefix no object data need follow."
  38967.  
  38968.     dword := (aCharacter asInteger bitShift: IndexShift negated) bitOr: CharacterMask!
  38969.  
  38970. class: aClass locator: aString
  38971.     "Make the receiver a prefix for an object of a hitherto unencountered class
  38972.     aClass with locator aString."
  38973.  
  38974.     dword := (dword bitOr: (
  38975.             ClassPrefixMask bitOr: (
  38976.                 (aString size bitShift: 16) bitOr: 
  38977.                     (aClass instSize bitShift: 8)))).
  38978.     aClass isBytes
  38979.         ifTrue: [dword := dword bitOr: BytesMask].
  38980.     aClass isVariable
  38981.         ifTrue: [dword := dword bitOr: VariableMask].
  38982.     aClass stbVersion ~= 0
  38983.         ifTrue: [dword := dword bitOr: NonZeroVersionMask].!
  38984.  
  38985. classLocatorLen
  38986.     "Answer the receiver's classLocatorLen field."
  38987.  
  38988.     ^dword bitShift: -16.!
  38989.  
  38990. classRef: anInteger
  38991.     "The receiver will prefix a hitherto unencountered object whose class
  38992.     has already been output with reference index anInteger.
  38993.     As we encode the class reference within the prefix the object data
  38994.     immediately follows it."
  38995.  
  38996.     dword := dword bitOr: (anInteger bitShift: 4)!
  38997.  
  38998. dword
  38999.     "Answer the receiver as a 4 byte DWORD."
  39000.  
  39001.     ^dword
  39002. !
  39003.  
  39004. dword: anInteger
  39005.     "Set the receiver's dword inst var to anInteger.
  39006.     Answer the receiver."
  39007.  
  39008.     dword := anInteger.
  39009.     ^self!
  39010.  
  39011. instSize
  39012.     "Answer the receiver's instSize field."
  39013.  
  39014.     ^(dword bitShift: InstSizeShift) bitAnd: InstSizeMask!
  39015.  
  39016. isBytes
  39017.     "Answer the Boolean value of the isBytes bit flag."
  39018.  
  39019.     ^dword allMask: BytesMask!
  39020.  
  39021. isCharacter
  39022.     "Answer whether the receiver represents a Character."
  39023.  
  39024.     ^dword anyMask: CharacterMask!
  39025.  
  39026. isClassPrefix
  39027.     "Answer the Boolean value of the isClassPrefix bit flag."
  39028.  
  39029.     ^dword anyMask: ClassPrefixMask!
  39030.  
  39031. isDataPrefix
  39032.     "Answer the Boolean value of the isDataPrefix bit flag."
  39033.  
  39034.     ^dword anyMask: DataPrefixMask!
  39035.  
  39036. isNonZeroVersion
  39037.     "Answer the Boolean value of the isNonZeroVersion bit flag."
  39038.  
  39039.     ^dword anyMask: NonZeroVersionMask!
  39040.  
  39041. isProxy
  39042.     "Answer the Boolean value of the isProxy bit flag.
  39043.     If true, the object that the receiver prefixes is
  39044.     a proxy for the object rather than the object itself."
  39045.  
  39046.     ^dword anyMask: ProxyMask!
  39047.  
  39048. isSmallInteger
  39049.     "Answer the Boolean value of the isSmallInteger bit flag."
  39050.  
  39051.     ^dword anyMask: 1!
  39052.  
  39053. isVariable
  39054.     "Answer the Boolean value of the isVariable bit flag."
  39055.  
  39056.     ^dword allMask: VariableMask!
  39057.  
  39058. objectRef: anInteger
  39059.     "Make the receiver a prefix to a 'virtual' object that has already been
  39060.     output with index anInteger, virtual because as we encode the reference
  39061.     entirely within the prefix no object data need follow."
  39062.  
  39063.     dword := anInteger bitShift: 4!
  39064.  
  39065. printOn: aStream
  39066.     "Append a debugging description of the receiver to aStream."
  39067.  
  39068.     aStream
  39069.         basicPrint: self;
  39070.         nextPut: $(.
  39071.     dword printOn: aStream base: 16 showRadix: true.
  39072.     aStream nextPutAll: ': '.
  39073.     self isSmallInteger ifTrue: [
  39074.         aStream print: self smallInteger]
  39075.     ifFalse: [ self isDataPrefix ifFalse: [
  39076.         self isCharacter
  39077.              ifTrue: [aStream print: self character]
  39078.             ifFalse: [aStream nextPut: 'object ref: '; print: self refIndex]]
  39079.     ifTrue: [
  39080.         aStream nextPutAll: 'class'.
  39081.         self isClassPrefix
  39082.             ifTrue: [aStream nextPutAll: ' object']
  39083.             ifFalse: [aStream nextPutAll: ' ref: '; print: self refIndex]]].
  39084.     aStream nextPut: $)!
  39085.  
  39086. refIndex
  39087.     "Answer the receiver's object or class reference index."
  39088.  
  39089.     ^dword bitShift: IndexShift!
  39090.  
  39091. smallInteger
  39092.     "Answer the receiver decoded into a SmallInteger."
  39093.  
  39094.     ^dword bitShift: -1!
  39095.  
  39096. smallInteger: aSmallInteger
  39097.     "Make the receiver a prefix to a 'virtual' SmallInteger, virtual because
  39098.     as we encode the integer entirely within the prefix no object data need follow."
  39099.  
  39100.     dword := (aSmallInteger bitShift: 1) bitOr: 1! !
  39101.  
  39102. STBProxy comment:
  39103. ''!
  39104. !STBProxy class methodsFor!
  39105.  
  39106. new
  39107.     "Private - Use specialized instance creation methods"
  39108.  
  39109.     ^self subclassResponsibility! !
  39110.  
  39111. !STBProxy methodsFor!
  39112.  
  39113. stbFixup: inFiler at: anInteger
  39114.     "Answer the object that this one represents.
  39115.     As we use become to change the receiver's identity no fixups are required."
  39116.  
  39117.     ^self become: self value!
  39118.  
  39119. value
  39120.     "Answer the object that this one represents."
  39121.  
  39122.     ^self subclassResponsibility! !
  39123.  
  39124. StParseNodeVisitor comment:
  39125. 'BRProgramNodeVisitor is an abstract visitor for the BRProgramNodes.
  39126.  
  39127. '!
  39128. !StParseNodeVisitor class methodsFor!
  39129.  
  39130. new
  39131.     ^super new initialize! !
  39132.  
  39133. !StParseNodeVisitor methodsFor!
  39134.  
  39135. acceptAssignmentNode: anAssignmentNode 
  39136.     self visitNode: anAssignmentNode variable.
  39137.     self visitNode: anAssignmentNode value!
  39138.  
  39139. acceptBlockNode: aBlockNode 
  39140.     self visitArguments: aBlockNode arguments.
  39141.     self visitNode: aBlockNode body!
  39142.  
  39143. acceptCascadeNode: aCascadeNode 
  39144.     aCascadeNode messages do: [:each | self visitNode: each]!
  39145.  
  39146. acceptExternalArgTypeNode: anAssignmentNode
  39147.         "Dolphin specific extension"!
  39148.  
  39149. acceptExternalCallNode: anStExternalCallNode
  39150.     "Dolphin specific extension"
  39151.     !
  39152.  
  39153. acceptLiteralArrayNode: aRBLiteralArrayNode 
  39154.     aRBLiteralArrayNode contents do: [:each | self visitNode: each]!
  39155.  
  39156. acceptLiteralNode: aLiteralNode!
  39157.  
  39158. acceptMessageNode: aMessageNode 
  39159.     (aMessageNode isCascaded not or: [aMessageNode isFirstCascaded]) 
  39160.         ifTrue: [self visitNode: aMessageNode receiver].
  39161.     aMessageNode arguments do: [:each | self visitNode: each]!
  39162.  
  39163. acceptMethodNode: aMethodNode 
  39164.     self visitArguments: aMethodNode arguments.
  39165.     self visitNode: aMethodNode body!
  39166.  
  39167. acceptOptimizedNode: anOptimizedNode 
  39168.     self visitNode: anOptimizedNode body!
  39169.  
  39170. acceptPatternBlockNode: aRBPatternBlockNode 
  39171.     self visitArguments: aRBPatternBlockNode arguments.
  39172.     self visitNode: aRBPatternBlockNode body!
  39173.  
  39174. acceptPatternWrapperBlockNode: aRBPatternWrapperBlockNode 
  39175.     self visitNode: aRBPatternWrapperBlockNode wrappedNode.
  39176.     self visitArguments: aRBPatternWrapperBlockNode arguments.
  39177.     self visitNode: aRBPatternWrapperBlockNode body!
  39178.  
  39179. acceptPrimitiveNode: anStPrimitiveNode 
  39180.     !
  39181.  
  39182. acceptReturnNode: aReturnNode 
  39183.     self visitNode: aReturnNode value!
  39184.  
  39185. acceptSequenceNode: aSequenceNode 
  39186.     self visitArguments: aSequenceNode temporaries.
  39187.     self tagBeforeTemporaries 
  39188.         ifFalse: 
  39189.             [aSequenceNode parent ifNotNil: 
  39190.                     [:parent | 
  39191.                     parent isMethod 
  39192.                         ifTrue: [parent tag ifNotNil: [:tag | self visitNode: tag]]]].
  39193.     aSequenceNode statements do: [:each | self visitNode: each]!
  39194.  
  39195. acceptVariableNode: aVariableNode!
  39196.  
  39197. tagBeforeTemporaries
  39198.     ^false!
  39199.  
  39200. visitArgument: each 
  39201.     "Here to allow subclasses to detect arguments or temporaries."
  39202.  
  39203.     ^self visitNode: each!
  39204.  
  39205. visitArguments: aNodeCollection 
  39206.     ^aNodeCollection do: [:each | self visitArgument: each]!
  39207.  
  39208. visitNode: aNode 
  39209.     ^aNode acceptVisitor: self! !
  39210.  
  39211. StProgramNode comment:
  39212. 'StProgramNode is an abstract class that represents a parse tree node in a Smalltalk program.
  39213.  
  39214. Subclasses must implement the following messages:
  39215.     accessing
  39216.         start
  39217.         stop
  39218.     visitor
  39219.         acceptVisitor:
  39220.  
  39221. The #start and #stop methods are used to find the source that corresponds to this node. "source copyFrom: self start to: self stop" should return the source for this node.
  39222.  
  39223. The #acceptVisitor: method is used by StProgramNodeVisitors (the visitor pattern). This will also require updating all the StProgramNodeVisitors so that they can handle the new node type.
  39224.  
  39225. Subclasses might also want to redefine #match:inContext: and #copyInContext: to do parse tree searching and replacing (these methods are only available if the RBParser extension package is loaded).
  39226.  
  39227. Subclasses that contain other nodes should override equalTo:withMapping: to compare nodes while ignoring renaming temporary variables, and children that returns a collection of our children nodes.
  39228.  
  39229. Instance Variables:
  39230.     comments    <Collection> of <Interval>    the intervals in the source that have comments for this node
  39231.     parent    <StProgramNode>    the node we''re contained in
  39232.  
  39233. '!
  39234. !StProgramNode class methodsFor!
  39235.  
  39236. defaultFormatterClass
  39237.     ^Smalltalk developmentSystem formatterClass!
  39238.  
  39239. formatterClass
  39240.     ^FormatterClass isNil 
  39241.         ifTrue: [self defaultFormatterClass]
  39242.         ifFalse: [FormatterClass]!
  39243.  
  39244. formatterClass: aClass 
  39245.     FormatterClass := aClass!
  39246.  
  39247. optimizedSelectors
  39248.     ^#(#== #ifTrue: #ifTrue:ifFalse: #ifFalse: #ifFalse:ifTrue: #whileTrue: #whileTrue #whileFalse: #whileFalse #to:do: #to:by:do: #and: #or: #repeat #ifNil: #ifNotNil: #ifNil:ifNotNil: #ifNotNil:ifNil: #yourself #isNil #notNil)! !
  39249.  
  39250. !StProgramNode methodsFor!
  39251.  
  39252. acceptVisitor: aProgramNodeVisitor 
  39253.     self subclassResponsibility!
  39254.  
  39255. allArgumentVariables
  39256.     | children |
  39257.     children := self children.
  39258.     children isEmpty ifTrue: [^#()].
  39259.     ^children inject: OrderedCollection new
  39260.         into: 
  39261.             [:vars :each | 
  39262.             vars
  39263.                 addAll: each allArgumentVariables;
  39264.                 yourself]!
  39265.  
  39266. allDefinedVariableNodes
  39267.     | children |
  39268.     children := self children.
  39269.     children isEmpty ifTrue: [^#()].
  39270.     ^children inject: OrderedCollection new
  39271.         into: 
  39272.             [:vars :each | 
  39273.             vars
  39274.                 addAll: each allDefinedVariableNodes;
  39275.                 yourself]!
  39276.  
  39277. allDefinedVariables
  39278.     ^self allDefinedVariableNodes collect: [:e | e name]!
  39279.  
  39280. allTemporaryVariableNodes
  39281.     | children |
  39282.     children := self children.
  39283.     children isEmpty ifTrue: [^#()].
  39284.     ^children inject: OrderedCollection new
  39285.         into: 
  39286.             [:vars :each | 
  39287.             vars
  39288.                 addAll: each allTemporaryVariableNodes;
  39289.                 yourself]!
  39290.  
  39291. allTemporaryVariables
  39292.     ^self allTemporaryVariableNodes collect: [:e | e name]!
  39293.  
  39294. assigns: aVariableName 
  39295.     ^self children anySatisfy: [:each | each assigns: aVariableName]!
  39296.  
  39297. bestNodeFor: anInterval 
  39298.     | selectedChildren |
  39299.     (self intersectsInterval: anInterval) ifFalse: [^nil].
  39300.     (self containedBy: anInterval) ifTrue: [^self].
  39301.     selectedChildren := self children 
  39302.                 select: [:each | each intersectsInterval: anInterval].
  39303.     ^selectedChildren size == 1 
  39304.         ifTrue: [selectedChildren first bestNodeFor: anInterval]
  39305.         ifFalse: [self]!
  39306.  
  39307. blockVariables
  39308.     ^parent isNil ifTrue: [#()] ifFalse: [parent blockVariables]!
  39309.  
  39310. canMatchMethod: aCompiledMethod 
  39311.     ^self sentMessages allSatisfy: 
  39312.             [:each | 
  39313.             (self class optimizedSelectors includes: each) 
  39314.                 or: [aCompiledMethod refersToLiteral: each]]!
  39315.  
  39316. cascadeListCharacter
  39317.     ^$;!
  39318.  
  39319. children
  39320.     ^#()!
  39321.  
  39322. collect: aBlock 
  39323.     "Hacked to fit collection protocols"
  39324.  
  39325.     ^aBlock value: self!
  39326.  
  39327. comments
  39328.     ^comments isNil ifTrue: [#()] ifFalse: [comments]!
  39329.  
  39330. comments: aCollection
  39331.     comments := aCollection!
  39332.  
  39333. containedBy: anInterval 
  39334.     ^anInterval first <= self start and: [anInterval last >= self stop]!
  39335.  
  39336. containsReturn
  39337.     ^self children anySatisfy: [:each | each containsReturn]!
  39338.  
  39339. copyCommentsFrom: aNode 
  39340.     "Add all comments from aNode to us. If we already have the comment, then don't add it."
  39341.  
  39342.     | newComments |
  39343.     newComments := OrderedCollection new.
  39344.     aNode nodesDo: [:each | newComments addAll: each comments].
  39345.     self nodesDo: 
  39346.             [:each | 
  39347.             each comments do: [:comment | newComments remove: comment ifAbsent: []]].
  39348.     newComments isEmpty ifTrue: [^self].
  39349.     newComments := newComments asSortedCollection: [:a :b | a first < b first].
  39350.     self comments: newComments!
  39351.  
  39352. debugPrintString
  39353.     "Answer a <readableString> whose characters are a description of the receiver 
  39354.     as the debugger would want to see it.
  39355.     Implementation Note: Debugging the parser can be difficult if we use #printOn:
  39356.     because it attempts to output formatted text for the method, which can fail when it
  39357.     is only partially constructed."
  39358.  
  39359.     ^self basicPrintString
  39360. !
  39361.  
  39362. defines: aName
  39363.     ^false!
  39364.  
  39365. directlyUses: aNode
  39366.     ^true!
  39367.  
  39368. do: aBlock 
  39369.     "Hacked to fit collection protocols"
  39370.  
  39371.     aBlock value: self!
  39372.  
  39373. equalTo: aNode exceptForVariables: variableNameCollection 
  39374.     | dictionary |
  39375.     dictionary := Dictionary new.
  39376.     (self equalTo: aNode withMapping: dictionary) ifFalse: [^false].
  39377.     dictionary keysAndValuesDo: 
  39378.             [:key :value | 
  39379.             (key = value or: [variableNameCollection includes: key]) ifFalse: [^false]].
  39380.     ^true!
  39381.  
  39382. equalTo: aNode withMapping: aDictionary 
  39383.     ^self = aNode!
  39384.  
  39385. evaluatedFirst: aNode
  39386.     self children do: 
  39387.             [:each | 
  39388.             each == aNode ifTrue: [^true].
  39389.             each isImmediateNode ifFalse: [^false]].
  39390.     ^false!
  39391.  
  39392. formattedCode
  39393.     ^self formatterClass new format: self!
  39394.  
  39395. formatterClass
  39396.     ^self class formatterClass!
  39397.  
  39398. intersectsInterval: anInterval 
  39399.     ^(anInterval first between: self start and: self stop) 
  39400.         or: [self start between: anInterval first and: anInterval last]!
  39401.  
  39402. isAssignment
  39403.     ^false!
  39404.  
  39405. isBlock
  39406.     ^false!
  39407.  
  39408. isCascade
  39409.     ^false!
  39410.  
  39411. isDirectlyUsed
  39412.     "This node is directly used as an argument, receiver, or part of an assignment."
  39413.  
  39414.     ^parent isNil ifTrue: [false] ifFalse: [parent directlyUses: self]!
  39415.  
  39416. isEvaluatedFirst
  39417.     "Return true if we are the first thing evaluated in this statement."
  39418.  
  39419.     ^parent isNil or: [parent isSequence or: [parent evaluatedFirst: self]]!
  39420.  
  39421. isImmediateNode
  39422.     ^false!
  39423.  
  39424. isLast: aNode 
  39425.     | children |
  39426.     children := self children.
  39427.     ^children notEmpty and: [children last == aNode]!
  39428.  
  39429. isList
  39430.     ^false!
  39431.  
  39432. isLiteral
  39433.     ^self isLiteralNode!
  39434.  
  39435. isLiteralNode
  39436.     ^false!
  39437.  
  39438. isMessage
  39439.     ^false!
  39440.  
  39441. isMethod
  39442.     ^false!
  39443.  
  39444. isPatternNode
  39445.     ^false!
  39446.  
  39447. isReturn
  39448.     ^false!
  39449.  
  39450. isSequence
  39451.     ^false!
  39452.  
  39453. isUsed
  39454.     "Answer true if this node could be used as part of another expression. For example, you could use the 
  39455.     result of this node as a receiver of a message, an argument, the right part of an assignment, or the 
  39456.     return value of a block. This differs from isDirectlyUsed in that it is conservative since it also includes 
  39457.     return values of blocks."
  39458.  
  39459.     ^parent isNil ifTrue: [false] ifFalse: [parent uses: self]!
  39460.  
  39461. isValue
  39462.     ^false!
  39463.  
  39464. isVariable
  39465.     ^false!
  39466.  
  39467. lastIsReturn
  39468.     ^self isReturn!
  39469.  
  39470. listCharacter
  39471.     ^$@!
  39472.  
  39473. literalCharacter
  39474.     ^$#!
  39475.  
  39476. methodComments
  39477.     ^self comments!
  39478.  
  39479. methodNode
  39480.     ^parent isNil ifTrue: [nil] ifFalse: [parent methodNode]!
  39481.  
  39482. newSource
  39483.     ^self formattedCode!
  39484.  
  39485. nodesDo: aBlock 
  39486.     aBlock value: self.
  39487.     self children do: [:each | each nodesDo: aBlock]!
  39488.  
  39489. parent
  39490.     ^parent!
  39491.  
  39492. parent: anStProgramNode 
  39493.     parent := anStProgramNode!
  39494.  
  39495. precedence
  39496.     ^6!
  39497.  
  39498. printOn: aStream 
  39499.     aStream nextPutAll: self class name;
  39500.         nextPut: $(;
  39501.         nextPutAll: self formattedCode;
  39502.         nextPut: $)!
  39503.  
  39504. recurseInto
  39505.     ^false!
  39506.  
  39507. recurseIntoCharacter
  39508.     ^$`!
  39509.  
  39510. sentMessages
  39511.     | messages |
  39512.     messages := IdentitySet new.
  39513.     self children do: [:each | messages addAll: each sentMessages].
  39514.     ^messages!
  39515.  
  39516. size
  39517.     "Hacked to fit collection protocols"
  39518.  
  39519.     ^1!
  39520.  
  39521. source
  39522.     ^parent notNil ifTrue: [parent source] ifFalse: [nil]!
  39523.  
  39524. sourceInterval
  39525.     ^self start to: self stop!
  39526.  
  39527. start
  39528.     self subclassResponsibility!
  39529.  
  39530. statementCharacter
  39531.     ^$.!
  39532.  
  39533. statementComments
  39534.     | statementComments |
  39535.     statementComments := OrderedCollection withAll: self comments.
  39536.     self children do: [:each | statementComments addAll: each statementComments].
  39537.     ^statementComments asSortedCollection: [:a :b | a first < b first]!
  39538.  
  39539. statementNode
  39540.     "Return your topmost node that is contained by a sequence node."
  39541.  
  39542.     (parent isNil or: [parent isSequence]) ifTrue: [^self].
  39543.     ^parent statementNode!
  39544.  
  39545. stop
  39546.     self subclassResponsibility!
  39547.  
  39548. temporaryVariables
  39549.     ^parent isNil ifTrue: [#()] ifFalse: [parent temporaryVariables]!
  39550.  
  39551. uses: aNode
  39552.     ^true!
  39553.  
  39554. whichNodeIsContainedBy: anInterval 
  39555.     | selectedChildren |
  39556.     (self intersectsInterval: anInterval) ifFalse: [^nil].
  39557.     (self containedBy: anInterval) ifTrue: [^self].
  39558.     selectedChildren := self children 
  39559.                 select: [:each | each intersectsInterval: anInterval].
  39560.     ^selectedChildren size == 1 
  39561.         ifTrue: [selectedChildren first whichNodeIsContainedBy: anInterval]
  39562.         ifFalse: [nil]!
  39563.  
  39564. whoDefines: aName 
  39565.     ^(self defines: aName) 
  39566.         ifTrue: [self]
  39567.         ifFalse: [parent notNil ifTrue: [parent whoDefines: aName] ifFalse: [nil]]! !
  39568.  
  39569. Stream comment:
  39570. 'Stream represents a class of objects which can be used for streaming I/O. Stream itself is abstract.
  39571.  
  39572. InstanceVariables
  39573.     None.
  39574.  
  39575. Class Variables:
  39576.     EndOfStreamSignal    <exceptionSignaler/exeptionSelector>. Exception to mark attempts to read off the end of the stream.'!
  39577. !Stream class methodsFor!
  39578.  
  39579. endOfStreamSignal
  39580.     "Answer an exceptionSignaler/exceptionSelector object raised when an attempt is 
  39581.     made to read off the end of the stream. Those interested in catching end of 
  39582.     Stream exceptions should use this accessor to get the exceptionSelector to pass
  39583.     as the first parameter to an #on:do: message. Current the answer is a Signal
  39584.     instance, but it could be an Exception subclass in future."
  39585.  
  39586.     ^EndOfStreamSignal!
  39587.  
  39588. initialize
  39589.     "Private - Initialize the receiver's class variables.
  39590.         Stream initialize
  39591.     "
  39592.  
  39593.     EndOfStreamSignal := Signal description: 'End of stream'!
  39594.  
  39595. new
  39596.     "Streams must be instantiated onto something."
  39597.  
  39598.     ^self shouldNotImplement! !
  39599.  
  39600. !Stream methodsFor!
  39601.  
  39602. atEnd
  39603.     "Answer whether the receiver cannot access any more objects"
  39604.  
  39605.     ^self subclassResponsibility
  39606. !
  39607.  
  39608. close
  39609.     "Relinquish any external resources associated with the receiver, and put the
  39610.     receiver into a 'closed' state (as appropriate to the subclass). Answer the receiver."
  39611.  
  39612.     ^self!
  39613.  
  39614. contents
  39615.     "Answer all of the objects in the collection accessed by the receiver.
  39616.     Generally the collection will be the same class as the one accessed by the receiver."
  39617.  
  39618.     ^self subclassResponsibility
  39619. !
  39620.  
  39621. contentsSpecies
  39622.     "Private - Answer the class of Object to be used when answering collections of elements
  39623.     from the receiver."
  39624.  
  39625.     ^Array!
  39626.  
  39627. do: aBlock
  39628.     "Evaluate the argument, aBlock, for each of the remaining elements that can be accessed by 
  39629.     the receiver."
  39630.  
  39631.     [self atEnd] whileFalse: [aBlock value: self next]
  39632. !
  39633.  
  39634. errorEndOfStream
  39635.     "Raise an error to the effect that an attempt was made to read off the
  39636.     end of the collection over which the receiver is streaming."
  39637.  
  39638.     ^self class endOfStreamSignal signalWith: self!
  39639.  
  39640. isReadable
  39641.     "Answer whether the receiver can be read from (i.e. it implements the 
  39642.     gettableStream protocol)."
  39643.  
  39644.     ^false!
  39645.  
  39646. isWriteable
  39647.     "Answer whether the receiver can be written to (i.e. it implements the 
  39648.     puttableStream protocol)."
  39649.  
  39650.     ^false!
  39651.  
  39652. next
  39653.     "Answer the next object accessible by the receiver.
  39654.     Must be defined by subclasses which wish to implement the various read protocols
  39655.     implemented at this level."
  39656.  
  39657.     ^self subclassResponsibility!
  39658.  
  39659. next: anInteger
  39660.     "Answer the next anInteger number of objects accessible by the receiver.
  39661.     Generally, the answer will be a collection of the same class as the one
  39662.     accessed by the receiver, but this is determined by the receiver.
  39663.     Implementation Note: Subclasses should not generally override this
  39664.     method, but the more flexible #next:into:startingAt: message which
  39665.     this uses."
  39666.  
  39667.     ^self next: anInteger into: (self contentsSpecies new: anInteger) startingAt: 1!
  39668.  
  39669. next: count into: aSequenceableCollection startingAt: startAt
  39670.     "Destructively replace the elements of the argument, aSequenceableCollection,
  39671.     in the interval (startAt..startAt+count-1) with the next, count, elements of
  39672.     the receiver. Answer aSequenceableCollection.
  39673.     Implementation Note: This will fail if the receiver is not readable."
  39674.  
  39675.     startAt to: startAt+count-1 do: [:i | aSequenceableCollection at: i put: self next].
  39676.     ^aSequenceableCollection!
  39677.  
  39678. nextAvailable: anInteger
  39679.     "Answer up to anInteger elements of the receiver's collection.
  39680.     Generally, the answer will be a collection of the same class as the one
  39681.     accessed by the receiver (though this is determined by the receiver), and 
  39682.     will contain anInteger elements, or as many as are left in the receiver's collection."
  39683.  
  39684.     | newStream count |
  39685.     count := 0.
  39686.     newStream := self contentsSpecies writeStream: anInteger.
  39687.     [count == anInteger or: [self atEnd]] whileFalse: [
  39688.         newStream nextPut: self next.
  39689.         count := count + 1].
  39690.     ^newStream contents!
  39691.  
  39692. nextMatchFor: anObject
  39693.     "Access the next object and answer whether it is equal to the argument, anObject.
  39694.     Raise an EndOfStream exception (via #next) if there are no more elements in the receiver."
  39695.  
  39696.     ^anObject = self next
  39697. !
  39698.  
  39699. skipThrough: anObject
  39700.     "Set the receivers position reference to be past the next occurrence of the
  39701.     argument, anObject, in the collection. Answer the receiver, or nil
  39702.     if no such occurrence existed."
  39703.  
  39704.     "Included for compatibility with VisualWorks - the ANSI standard message #skipTo: should be used in preference"
  39705.  
  39706.     [self atEnd] whileFalse: [self next = anObject ifTrue: [^self]].
  39707.     ^nil
  39708. !
  39709.  
  39710. skipTo: anObject
  39711.     "Set the receivers position reference to be past the next occurrence of the
  39712.     argument, anObject, in the collection. Answer whether such an occurrence existed."
  39713.  
  39714.     [self atEnd] whileFalse: [self next = anObject ifTrue: [^true]].
  39715.     ^false
  39716. !
  39717.  
  39718. upTo: anObject
  39719.     "Answer a collection of elements starting with the next element accessed
  39720.     by the receiver, and up to, not inclusive of, the next element that is 
  39721.     equal to anObject. Positions the stream after anObject if found.
  39722.     If anObject is not in the collection, answer the entire rest of the collection.
  39723.     If the receiver is at its end, answer an empty Collection."
  39724.  
  39725.     | newStream nextObject |
  39726.     newStream := self contentsSpecies writeStream: 128.
  39727.     [self atEnd or: [nextObject := self next. nextObject = anObject]]
  39728.         whileFalse: [newStream nextPut: nextObject].
  39729.     ^newStream contents!
  39730.  
  39731. upToEnd
  39732.     "Answer a collection consisting of the remaining elements in the receiver (i.e. from the current
  39733.     position to the end)."
  39734.  
  39735.     | remainder |
  39736.     remainder := self contentsSpecies writeStream: 128.
  39737.     [self atEnd] whileFalse: [remainder nextPut: self next].
  39738.     ^remainder contents! !
  39739.  
  39740. StToken comment:
  39741. ''!
  39742. !StToken class methodsFor!
  39743.  
  39744. start: anInterval 
  39745.     ^self new start: anInterval! !
  39746.  
  39747. !StToken methodsFor!
  39748.  
  39749. comments
  39750.     ^comments!
  39751.  
  39752. comments: anObject
  39753.     comments := anObject!
  39754.  
  39755. isAssignment
  39756.     ^false!
  39757.  
  39758. isBinary
  39759.     ^false!
  39760.  
  39761. isBinary: aString
  39762.     "Answer whether the receiver is a binary token with the specified value."
  39763.  
  39764.     ^false!
  39765.  
  39766. isEof
  39767.     ^self class == ##(self)!
  39768.  
  39769. isIdentifier
  39770.     ^false!
  39771.  
  39772. isKeyword
  39773.     ^false!
  39774.  
  39775. isLiteralArrayToken
  39776.     ^false!
  39777.  
  39778. isLiteralToken
  39779.     ^false!
  39780.  
  39781. isOptimized
  39782.     ^false!
  39783.  
  39784. isPatternBlock
  39785.     ^false!
  39786.  
  39787. isPatternVariable
  39788.     ^false!
  39789.  
  39790. isSpecial
  39791.     ^false!
  39792.  
  39793. isSpecial: aCharacter
  39794.     ^false!
  39795.  
  39796. length
  39797.     ^0!
  39798.  
  39799. printOn: aStream 
  39800.     aStream
  39801.         nextPut: $ ;
  39802.         nextPutAll: self class name!
  39803.  
  39804. removePositions
  39805.     sourcePointer := nil!
  39806.  
  39807. scannerClass
  39808.     ^SmalltalkScanner!
  39809.  
  39810. sourceInterval
  39811.     "Answer an <Interval> that specifies the range of source positions occuppied by the receiver."
  39812.  
  39813.     ^self start to: self stop!
  39814.  
  39815. start
  39816.     ^sourcePointer!
  39817.  
  39818. start: anInteger 
  39819.     sourcePointer := anInteger!
  39820.  
  39821. stop
  39822.     ^self start + self length - 1! !
  39823.  
  39824. SUnitAbsModel comment:
  39825. ''!
  39826. !SUnitAbsModel class methodsFor!
  39827.  
  39828. basicDefaultConfiguration
  39829.  
  39830.     ^defaultConfiguration!
  39831.  
  39832. configurationClass
  39833.  
  39834.     self subclassResponsibility!
  39835.  
  39836. defaultConfiguration
  39837.  
  39838.     self basicDefaultConfiguration isNil
  39839.         ifTrue: [self initializeDefaultConfiguration].
  39840.  
  39841.     ^self basicDefaultConfiguration!
  39842.  
  39843. defaultConfiguration: aConfiguration
  39844.  
  39845.     defaultConfiguration := aConfiguration!
  39846.  
  39847. initializeDefaultConfiguration
  39848.  
  39849.     self defaultConfiguration: self configurationClass new.
  39850.     self defaultConfiguration
  39851.         showBackgroundColors: false;
  39852.         showIcons: true;
  39853.         showToolbar: true;
  39854.         useDisplayNames: false!
  39855.  
  39856. new
  39857.  
  39858.     ^super new
  39859.         initialize;
  39860.         yourself!
  39861.  
  39862. newForUI: aBrowser
  39863.  
  39864.     ^self
  39865.         newForUI: aBrowser
  39866.         builder: self builderClass!
  39867.  
  39868. newForUI: aBrowser builder: aTestSuiteBuilder
  39869.  
  39870.     ^self new
  39871.         browser: aBrowser;
  39872.         builder: aTestSuiteBuilder;
  39873.         reset;
  39874.         yourself!
  39875.  
  39876. showBackgroundColors
  39877.  
  39878.     ^self defaultConfiguration showBackgroundColors!
  39879.  
  39880. showBackgroundColors: aBoolean
  39881.  
  39882.     ^self defaultConfiguration showBackgroundColors: aBoolean!
  39883.  
  39884. showIcons
  39885.  
  39886.     ^self defaultConfiguration showIcons!
  39887.  
  39888. showIcons: aBoolean
  39889.  
  39890.     self defaultConfiguration showIcons: aBoolean!
  39891.  
  39892. showToolbar
  39893.  
  39894.     ^self defaultConfiguration showToolbar!
  39895.  
  39896. showToolbar: aBoolean
  39897.  
  39898.     self defaultConfiguration showToolbar: aBoolean!
  39899.  
  39900. useDisplayNames
  39901.  
  39902.     ^self defaultConfiguration useDisplayNames!
  39903.  
  39904. useDisplayNames: aBoolean
  39905.  
  39906.     self defaultConfiguration useDisplayNames: aBoolean! !
  39907.  
  39908. !SUnitAbsModel methodsFor!
  39909.  
  39910. basicSelectedItems
  39911.  
  39912.     ^selectedItems!
  39913.  
  39914. browser
  39915.  
  39916.     ^browser!
  39917.  
  39918. browser: anUI
  39919.     "set the browser you want callbacks to be sent to"
  39920.  
  39921.     browser := anUI!
  39922.  
  39923. builder
  39924.  
  39925.     ^builder!
  39926.  
  39927. builder: aListBuilder
  39928.  
  39929.     builder := aListBuilder!
  39930.  
  39931. canInspect
  39932.  
  39933.     ^self hasSelectedItems!
  39934.  
  39935. canRemove
  39936.  
  39937.     ^self hasSelectedItems!
  39938.  
  39939. colorSymbolFor: aTest
  39940.  
  39941.     ^self state colorSymbolFor: aTest!
  39942.  
  39943. configuration
  39944.  
  39945.     ^configuration!
  39946.  
  39947. configuration: aConfiguration
  39948.  
  39949.     configuration := aConfiguration!
  39950.  
  39951. configurationClass
  39952.  
  39953.     ^self class configurationClass!
  39954.  
  39955. detailState
  39956.  
  39957.     ^self state detailState!
  39958.  
  39959. hasBrowser
  39960.  
  39961.     ^self browser notNil!
  39962.  
  39963. hasSelectedItems
  39964.  
  39965.     ^self basicSelectedItems notNil and: [self basicSelectedItems notEmpty]!
  39966.  
  39967. iconSymbolFor: aTest
  39968.  
  39969.     ^self state iconSymbolFor: aTest!
  39970.  
  39971. initialize
  39972.  
  39973.     self
  39974.         configuration: self class defaultConfiguration deepCopy;
  39975.         state: (self stateClass newOn: self);
  39976.         selectedItems: OrderedCollection new;
  39977.         listItems: OrderedCollection new!
  39978.  
  39979. isOneBrowsableItemSelected
  39980.  
  39981.     ^self isOneItemSelected and: [self selectedItem canBrowse]!
  39982.  
  39983. isOneItemSelected
  39984.  
  39985.     ^self basicSelectedItems size = 1!
  39986.  
  39987. listItems
  39988.  
  39989.     ^listItems!
  39990.  
  39991. listItems: aCollection
  39992.  
  39993.     listItems := aCollection!
  39994.  
  39995. nameSortBlock
  39996.  
  39997.     ^[:a :b | a name <= b name]!
  39998.  
  39999. removeListItems: aCollection
  40000.  
  40001.     self listItems sunitbRemoveAll: aCollection.
  40002.     self basicSelectedItems sunitbRemoveAll: aCollection.
  40003.  
  40004.     self signalResetList!
  40005.  
  40006. removeSelectedInList
  40007.  
  40008.     | selected |
  40009.  
  40010.     selected := self basicSelectedItems.
  40011.     selected isEmpty
  40012.         ifTrue: [^self].
  40013.  
  40014.     self removeListItems: selected!
  40015.  
  40016. reset
  40017.  
  40018.     self buildList!
  40019.  
  40020. resultStateColorSymbol
  40021.  
  40022.     ^self state resultStateColorSymbol!
  40023.  
  40024. selectedItem
  40025.  
  40026.     | items |
  40027.  
  40028.     items := self selectedItems.
  40029.     ^items isEmpty
  40030.         ifTrue: [nil]
  40031.         ifFalse: [items first]!
  40032.  
  40033. selectedItems
  40034.  
  40035.     ^self basicSelectedItems asSortedCollection: self nameSortBlock!
  40036.  
  40037. selectedItems: aCollection
  40038.  
  40039.     selectedItems := aCollection!
  40040.  
  40041. selectItems: aCollection
  40042.  
  40043.     self
  40044.         selectedItems: aCollection;
  40045.         signalSelectedItems: aCollection!
  40046.  
  40047. showBackgroundColors
  40048.  
  40049.     ^self configuration showBackgroundColors!
  40050.  
  40051. showBackgroundColors: aBoolean
  40052.  
  40053.     self configuration showBackgroundColors: aBoolean!
  40054.  
  40055. showIcons
  40056.  
  40057.     ^self configuration showIcons!
  40058.  
  40059. showIcons: aBoolean
  40060.  
  40061.     self configuration showIcons: aBoolean!
  40062.  
  40063. showToolbar
  40064.  
  40065.     ^self configuration showToolbar!
  40066.  
  40067. showToolbar: aBoolean
  40068.  
  40069.     self configuration showToolbar: aBoolean!
  40070.  
  40071. signalResetList
  40072.  
  40073.     self hasBrowser
  40074.         ifFalse: [^self].
  40075.  
  40076.     self browser callbackResetList!
  40077.  
  40078. signalSelectedItems: aCollection
  40079.  
  40080.     self hasBrowser
  40081.         ifFalse: [^self].
  40082.  
  40083.     self browser callbackSelectedItems: aCollection!
  40084.  
  40085. signalToggledShowBackgroundColors
  40086.  
  40087.     self hasBrowser
  40088.         ifFalse: [^self].
  40089.  
  40090.     self browser callbackToggledShowBackgroundColors!
  40091.  
  40092. signalToggledShowIcons
  40093.  
  40094.     self hasBrowser
  40095.         ifFalse: [^self].
  40096.  
  40097.     self browser callbackToggledShowIcons!
  40098.  
  40099. signalToggledShowToolbar
  40100.  
  40101.     self hasBrowser
  40102.         ifFalse: [^self].
  40103.  
  40104.     self browser callbackToggledShowToolbar!
  40105.  
  40106. signalToggledUseDisplayNames
  40107.  
  40108.     self hasBrowser
  40109.         ifFalse: [^self].
  40110.  
  40111.     self browser callbackToggledUseDisplayNames!
  40112.  
  40113. state
  40114.  
  40115.     ^state!
  40116.  
  40117. state: anSunitBrowserUIState
  40118.  
  40119.     state := anSunitBrowserUIState!
  40120.  
  40121. stateClass
  40122.  
  40123.     ^self class stateClass!
  40124.  
  40125. toggleShowBackgroundColors
  40126.  
  40127.     self configuration toggleShowBackgroundColors.
  40128.     self signalToggledShowBackgroundColors!
  40129.  
  40130. toggleShowIcons
  40131.  
  40132.     self configuration toggleShowIcons.
  40133.     self signalToggledShowIcons!
  40134.  
  40135. toggleShowToolbar
  40136.  
  40137.     self configuration toggleShowToolbar.
  40138.     self signalToggledShowToolbar!
  40139.  
  40140. toggleUseDisplayNames
  40141.  
  40142.     self configuration toggleUseDisplayNames.
  40143.     self signalToggledUseDisplayNames!
  40144.  
  40145. useDisplayNames
  40146.  
  40147.     ^self configuration useDisplayNames!
  40148.  
  40149. useDisplayNames: aBoolean
  40150.  
  40151.     self configuration useDisplayNames: aBoolean! !
  40152.  
  40153. SUnitAbsWrapper comment:
  40154. ''!
  40155. !SUnitAbsWrapper class methodsFor!
  40156.  
  40157. newOn: anSUnitBrowserModel
  40158.  
  40159.     ^self new
  40160.         model: anSUnitBrowserModel;
  40161.         yourself! !
  40162.  
  40163. !SUnitAbsWrapper methodsFor!
  40164.  
  40165. icon
  40166.  
  40167.     | iconSymbol |
  40168.  
  40169.     iconSymbol := self model iconSymbolFor: self subject.
  40170.  
  40171.     (iconSymbol isNil or: [iconSymbol == #grayBallIcon])
  40172.         ifTrue: [^self class icon].
  40173.  
  40174.     ^iconSymbol = #redBallIcon
  40175.         ifTrue: [False icon]
  40176.         ifFalse: [
  40177.             iconSymbol = #yellowBallIcon
  40178.                 ifTrue: [Icon warning]
  40179.                 ifFalse: [True icon]]!
  40180.  
  40181. model
  40182.     "Private - Answer the value of the receiver's ''model'' instance variable."
  40183.  
  40184.     ^model!
  40185.  
  40186. model: anObject
  40187.     "Private - Set the value of the receiver's ''model'' instance variable to the argument, anObject."
  40188.  
  40189.     model := anObject!
  40190.  
  40191. subject
  40192.     "Private - Answer the value of the receiver's ''subject'' instance variable."
  40193.  
  40194.     ^subject!
  40195.  
  40196. subject: anObject
  40197.     "Private - Set the value of the receiver's ''subject'' instance variable to the argument, anObject."
  40198.  
  40199.     subject := anObject! !
  40200.  
  40201. SUnitBrowserAbsConfig comment:
  40202. ''!
  40203. !SUnitBrowserAbsConfig class methodsFor!
  40204.  
  40205. new
  40206.  
  40207.     ^super new
  40208.         initialize;
  40209.         yourself! !
  40210.  
  40211. !SUnitBrowserAbsConfig methodsFor!
  40212.  
  40213. initialize
  40214.  
  40215.     self properties: LookupTable new!
  40216.  
  40217. properties
  40218.  
  40219.     ^properties!
  40220.  
  40221. properties: aDictionary
  40222.  
  40223.     properties := aDictionary!
  40224.  
  40225. propertyAt: aSymbol
  40226.  
  40227.     ^self properties
  40228.         at: aSymbol
  40229.         ifAbsent: [nil]!
  40230.  
  40231. propertyAt: aSymbol put: anObject
  40232.  
  40233.     ^self properties
  40234.         at: aSymbol
  40235.         put: anObject!
  40236.  
  40237. showBackgroundColors
  40238.  
  40239.     ^self propertyAt: #showBackgroundColors!
  40240.  
  40241. showBackgroundColors: aBoolean
  40242.  
  40243.     self
  40244.         propertyAt: #showBackgroundColors
  40245.         put: aBoolean!
  40246.  
  40247. showIcons
  40248.  
  40249.     ^self propertyAt: #showIcons!
  40250.  
  40251. showIcons: aBoolean
  40252.  
  40253.     self
  40254.         propertyAt: #showIcons
  40255.         put: aBoolean!
  40256.  
  40257. showToolbar
  40258.  
  40259.     ^self propertyAt: #showToolbar!
  40260.  
  40261. showToolbar: aBoolean
  40262.  
  40263.     self
  40264.         propertyAt: #showToolbar
  40265.         put: aBoolean!
  40266.  
  40267. toggleShowBackgroundColors
  40268.  
  40269.     self showBackgroundColors: self showBackgroundColors not!
  40270.  
  40271. toggleShowIcons
  40272.  
  40273.     self showIcons: self showIcons not!
  40274.  
  40275. toggleShowToolbar
  40276.  
  40277.     self showToolbar: self showToolbar not!
  40278.  
  40279. toggleUseDisplayNames
  40280.  
  40281.     self useDisplayNames: self useDisplayNames not!
  40282.  
  40283. useDisplayNames
  40284.  
  40285.     ^self propertyAt: #useDisplayNames!
  40286.  
  40287. useDisplayNames: aBoolean
  40288.  
  40289.     self
  40290.         propertyAt: #useDisplayNames
  40291.         put: aBoolean! !
  40292.  
  40293. SUnitBrowserAbsUIState comment:
  40294. ''!
  40295. !SUnitBrowserAbsUIState class methodsFor!
  40296.  
  40297. newOn: aModel
  40298.  
  40299.     ^self new
  40300.         initializeModel: aModel;
  40301.         yourself! !
  40302.  
  40303. !SUnitBrowserAbsUIState methodsFor!
  40304.  
  40305. configuration
  40306.  
  40307.     ^self model configuration!
  40308.  
  40309. greenBallIconSymbol
  40310.  
  40311.     ^#greenBallIcon!
  40312.  
  40313. initializeModel: aModel
  40314.  
  40315.     self model: aModel!
  40316.  
  40317. model
  40318.  
  40319.     ^model!
  40320.  
  40321. model: aModel
  40322.  
  40323.     model := aModel!
  40324.  
  40325. redBallIconSymbol
  40326.  
  40327.     ^#redBallIcon! !
  40328.  
  40329. SUnitBrowserResult comment:
  40330. ''!
  40331. !SUnitBrowserResult class methodsFor!
  40332.  
  40333. new
  40334.  
  40335.     ^super new
  40336.         initialize;
  40337.         yourself!
  40338.  
  40339. newOn: anSunitModel
  40340.  
  40341.     ^self new
  40342.         initializeModel: anSunitModel;
  40343.         yourself!
  40344.  
  40345. resultClass
  40346.  
  40347.     ^TestResult! !
  40348.  
  40349. !SUnitBrowserResult methodsFor!
  40350.  
  40351. areAllTestsCompleted
  40352.  
  40353.     ^self runCount = self numberOfTests!
  40354.  
  40355. areAnyTestsCompleted
  40356.  
  40357.     ^self runCount > 0!
  40358.  
  40359. clear
  40360.  
  40361.     self initialize!
  40362.  
  40363. defects
  40364.  
  40365.     ^self testResult defects!
  40366.  
  40367. detectTest: aTestCase in: aCollection
  40368.  
  40369.     ^aCollection
  40370.         detect: [:each | aTestCase isSameAs: each]
  40371.         ifNone: [nil]!
  40372.  
  40373. errorCount
  40374.  
  40375.     ^self testResult errorCount!
  40376.  
  40377. failureCount
  40378.  
  40379.     ^self testResult failureCount!
  40380.  
  40381. hasErrors
  40382.  
  40383.     ^self testResult hasErrors!
  40384.  
  40385. hasFailures
  40386.  
  40387.     ^self testResult hasFailures!
  40388.  
  40389. initialize
  40390.  
  40391.     self testResult: self resultClass new!
  40392.  
  40393. initializeModel: anSunitModel
  40394.  
  40395.     self model: anSunitModel!
  40396.  
  40397. isError: aTestCase
  40398.  
  40399.     ^self testResult isError: aTestCase!
  40400.  
  40401. isFailure: aTestCase
  40402.  
  40403.     ^self testResult isFailure: aTestCase!
  40404.  
  40405. isPassed: aTestCase
  40406.  
  40407.     ^self testResult isPassed: aTestCase!
  40408.  
  40409. merge: aTestResult for: aTestCase
  40410.  
  40411.     | matchingTest |
  40412.  
  40413.     "merge the test case into the overall test results"
  40414.  
  40415.     self remove: aTestCase.
  40416.  
  40417.     matchingTest :=
  40418.         self
  40419.             detectTest: aTestCase
  40420.             in: aTestResult passed.
  40421.  
  40422.     matchingTest isNil
  40423.         ifFalse: [
  40424.             self testResult passed add: aTestCase.
  40425.             ^self].
  40426.  
  40427.     matchingTest :=
  40428.         self
  40429.             detectTest: aTestCase
  40430.             in: aTestResult errors.
  40431.  
  40432.     matchingTest isNil
  40433.         ifFalse: [
  40434.             self testResult errors add: aTestCase.
  40435.             ^self].
  40436.  
  40437.     matchingTest :=
  40438.         self
  40439.             detectTest: aTestCase
  40440.             in: aTestResult failures.
  40441.  
  40442.     matchingTest isNil
  40443.         ifFalse: [self testResult failures add: aTestCase]!
  40444.  
  40445. model
  40446.  
  40447.     ^model!
  40448.  
  40449. model: anSunitModel
  40450.  
  40451.     model := anSunitModel!
  40452.  
  40453. numberCorrectFor: aTest
  40454.  
  40455.     ^self
  40456.         numberInCollection: self testResult passed
  40457.         for: aTest!
  40458.  
  40459. numberErrorsFor: aTest
  40460.  
  40461.  
  40462.     ^self
  40463.         numberInCollection: self testResult errors
  40464.         for: aTest!
  40465.  
  40466. numberFailuresFor: aTest
  40467.  
  40468.     ^self
  40469.         numberInCollection: self testResult failures
  40470.         for: aTest!
  40471.  
  40472. numberInCollection: aCollection for: aTest
  40473.     "count the number of tests in aTest (TestCase or TestSuite) that have a matching Test Case in 
  40474.      aCollection"
  40475.  
  40476.     | allTests testCase |
  40477.  
  40478.     allTests := aTest allTests.
  40479.  
  40480.     ^allTests
  40481.         inject: 0
  40482.         into: [:count :each |
  40483.             testCase := nil.
  40484.             testCase :=
  40485.                 self
  40486.                     detectTest: each
  40487.                     in: aCollection.
  40488.             testCase isNil
  40489.                 ifTrue: [count]
  40490.                 ifFalse: [count + 1]]!
  40491.  
  40492. numberNotYetRunFor: aTest
  40493.  
  40494.     ^aTest allTests
  40495.         inject: 0
  40496.         into: [:count :each |
  40497.             ((self numberCorrectFor: each) + (self numberErrorsFor: each) +
  40498.                 (self numberFailuresFor: each) = 0)
  40499.                     ifTrue: [count + 1]
  40500.                     ifFalse: [count]]!
  40501.  
  40502. numberOfTests
  40503.  
  40504.     ^self model topLevelTests
  40505.         inject: 0
  40506.         into: [:total :each | total + each numberOfTests]!
  40507.  
  40508. passedCount
  40509.  
  40510.     ^self testResult passedCount!
  40511.  
  40512. remove: aTestCase
  40513.     "remove the results of test cases in aCollection"
  40514.  
  40515.     self testResult passed
  40516.         remove: aTestCase
  40517.         ifAbsent: [
  40518.             self testResult errors
  40519.                 remove: aTestCase
  40520.                 ifAbsent: [
  40521.                     self testResult failures
  40522.                         remove: aTestCase
  40523.                         ifAbsent: []]]!
  40524.  
  40525. removeAll: aCollectionTestCases
  40526.     "remove the results of test cases in aCollection"
  40527.  
  40528.     aCollectionTestCases do: [:each | self remove: each]!
  40529.  
  40530. resultClass
  40531.  
  40532.     ^self class resultClass!
  40533.  
  40534. runCount
  40535.  
  40536.     ^self testResult runCount!
  40537.  
  40538. testResult
  40539.  
  40540.     ^testResult!
  40541.  
  40542. testResult: aTestResult
  40543.  
  40544.     testResult := aTestResult! !
  40545.  
  40546. SUnitNameResolver comment:
  40547. ''!
  40548. !SUnitNameResolver class methodsFor!
  40549.  
  40550. classNamed: aSymbol
  40551.     ^Smalltalk 
  40552.         at: aSymbol 
  40553.         ifAbsent: [nil].!
  40554.  
  40555. defaultLogDevice
  40556.     ^Transcript
  40557.  
  40558.     
  40559.  
  40560. !
  40561.  
  40562. errorObject
  40563.     "Change for Dialect"
  40564.     ^Error
  40565.  
  40566.     
  40567.  
  40568. !
  40569.  
  40570. mnuExceptionObject
  40571.  
  40572.     ^MessageNotUnderstood
  40573.  
  40574.     
  40575.  
  40576. !
  40577.  
  40578. notificationObject
  40579.  
  40580.     ^Notification
  40581.  
  40582.     
  40583.  
  40584. ! !
  40585.  
  40586. TestCase comment:
  40587. 'A TestCase is a Command representing the future running of a test case. Create one with the class method #selector: aSymbol, passing the name of the method to be run when the test case runs.
  40588.  
  40589. When you discover a new fixture, subclass TestCase, declare instance variables for the objects in the fixture, override #setUp to initialize the variables, and possibly override# tearDown to deallocate any external resources allocated in #setUp.
  40590.  
  40591. When you are writing a test case method, send #assert: aBoolean when you want to check for an expected value. For example, you might say "self assert: socket isOpen" to test whether or not a socket is open at a point in a test.'!
  40592. !TestCase class methodsFor!
  40593.  
  40594. allTestSelectors
  40595.  
  40596.     ^self sunitAllSelectors select: [:each | 'test*' sunitMatch: each]
  40597.             !
  40598.  
  40599. buildSuite
  40600.     | suite |
  40601.     ^self isAbstract
  40602.         ifTrue: 
  40603.             [suite := self suiteClass named: self name asString.
  40604.             self allSubclasses 
  40605.                 do: [:each | each isAbstract ifFalse: [suite addTest: each buildSuiteFromSelectors]].
  40606.             suite]
  40607.         ifFalse: [self buildSuiteFromSelectors]
  40608.             !
  40609.  
  40610. buildSuiteFromAllSelectors
  40611.  
  40612.     ^self buildSuiteFromMethods: self allTestSelectors
  40613.             !
  40614.  
  40615. buildSuiteFromLocalSelectors
  40616.  
  40617.     ^self buildSuiteFromMethods: self testSelectors
  40618.             !
  40619.  
  40620. buildSuiteFromMethods: testMethods
  40621.  
  40622.     ^testMethods
  40623.         inject: (self suiteClass named: self name asString)
  40624.         into: [:suite :selector |
  40625.             suite
  40626.                 addTest: (self selector: selector);
  40627.                 yourself]
  40628.             !
  40629.  
  40630. buildSuiteFromSelectors
  40631.  
  40632.     ^self shouldInheritSelectors
  40633.         ifTrue: [self buildSuiteFromAllSelectors]
  40634.         ifFalse: [self buildSuiteFromLocalSelectors]
  40635.             !
  40636.  
  40637. debug: aSymbol
  40638.  
  40639.     ^(self selector: aSymbol) debug
  40640.             !
  40641.  
  40642. isAbstract
  40643.     "Override to true if a TestCase subclass is Abstract and should not have
  40644.     TestCase instances built from it"
  40645.  
  40646.     ^self sunitName = #TestCase
  40647.             !
  40648.  
  40649. resources
  40650.  
  40651.     ^#()
  40652.             !
  40653.  
  40654. run: aSymbol
  40655.  
  40656.     ^(self selector: aSymbol) run
  40657.             !
  40658.  
  40659. selector: aSymbol
  40660.  
  40661.     ^self new setTestSelector: aSymbol
  40662.             !
  40663.  
  40664. shouldInheritSelectors
  40665.     "I should inherit from an Abstract superclass but not from a concrete one by default, unless I have no testSelectors in which case I must be expecting to inherit them from my superclass.  If a test case with selectors wants to inherit selectors from a concrete superclass, override this to true in that subclass."
  40666.  
  40667.     ^self superclass isAbstract
  40668.         or: [self testSelectors isEmpty]
  40669.  
  40670. "$QA Ignore:Sends system method(superclass)$"
  40671.             !
  40672.  
  40673. suite
  40674.  
  40675.     ^self buildSuite
  40676.             !
  40677.  
  40678. suiteClass
  40679.     ^TestSuite
  40680.             !
  40681.  
  40682. sunitVersion
  40683.     ^'3.1'
  40684.             !
  40685.  
  40686. testSelectors
  40687.  
  40688.     ^self sunitSelectors select: [:each | 'test*' sunitMatch: each]
  40689.             ! !
  40690.  
  40691. !TestCase methodsFor!
  40692.  
  40693. addDependentToHierachy: anObject 
  40694.     "an empty method. for Composite compability with TestSuite"
  40695.  
  40696.  
  40697.             !
  40698.  
  40699. allTests
  40700.  
  40701.     ^Array with: self!
  40702.  
  40703. assert: aBoolean
  40704.  
  40705.     aBoolean ifFalse: [self signalFailure: 'Assertion failed']
  40706.             !
  40707.  
  40708. assert: aBoolean description: aString
  40709.     aBoolean ifFalse: [
  40710.         self logFailure: aString.
  40711.         TestResult failure sunitSignalWith: aString]
  40712.             !
  40713.  
  40714. assert: aBoolean description: aString resumable: resumableBoolean 
  40715.     | exception |
  40716.     aBoolean
  40717.         ifFalse: 
  40718.             [self logFailure: aString.
  40719.             exception := resumableBoolean
  40720.                         ifTrue: [TestResult resumableFailure]
  40721.                         ifFalse: [TestResult failure].
  40722.             exception sunitSignalWith: aString]
  40723.             !
  40724.  
  40725. canBrowse
  40726.  
  40727.     ^true!
  40728.  
  40729. canDebug
  40730.  
  40731.     ^true!
  40732.  
  40733. debug
  40734.     self resources do: [:res | 
  40735.         res isAvailable ifFalse: [^res signalInitializationError]].
  40736.     [(self class selector: testSelector) runCase] 
  40737.         sunitEnsure: [self resources do: [:each | each reset]]
  40738.             !
  40739.  
  40740. debugAsFailure
  40741.     | semaphore |
  40742.     semaphore := Semaphore new.
  40743.     self resources do: [:res | 
  40744.         res isAvailable ifFalse: [^res signalInitializationError]].
  40745.     [semaphore wait. self resources do: [:each | each reset]] fork.
  40746.     (self class selector: testSelector) runCaseAsFailure: semaphore.
  40747.  
  40748.             !
  40749.  
  40750. deny: aBoolean
  40751.  
  40752.     self assert: aBoolean not
  40753.             !
  40754.  
  40755. deny: aBoolean description: aString
  40756.     self assert: aBoolean not description: aString
  40757.             !
  40758.  
  40759. deny: aBoolean description: aString resumable: resumableBoolean 
  40760.     self
  40761.         assert: aBoolean not
  40762.         description: aString
  40763.         resumable: resumableBoolean
  40764.             !
  40765.  
  40766. displayName
  40767.  
  40768.     | name |
  40769.  
  40770.     name :=
  40771.         self selector
  40772.             copyFrom: 5
  40773.             to: self selector size.
  40774.  
  40775.     ^name sunitbAsProperNouns!
  40776.  
  40777. executeShould: aBlock inScopeOf: anExceptionalEvent 
  40778.     ^[aBlock value.
  40779.      false] sunitOn: anExceptionalEvent
  40780.         do: [:ex | ex sunitExitWith: true]
  40781.             !
  40782.  
  40783. failureLog
  40784.     ^SUnitNameResolver defaultLogDevice
  40785.  
  40786.             !
  40787.  
  40788. hasTests
  40789.  
  40790.     ^false!
  40791.  
  40792. isLogging
  40793.     "By default, we're not logging failures. If you override this in 
  40794.     a subclass, make sure that you override #failureLog"
  40795.     ^false
  40796.             !
  40797.  
  40798. isSameAs: aTestCase
  40799.  
  40800.     ^(aTestCase class = self class) and: [aTestCase selector = self selector]!
  40801.  
  40802. isTestSuite
  40803.  
  40804.     ^false!
  40805.  
  40806. logFailure: aString
  40807.     self isLogging ifTrue: [
  40808.         self failureLog 
  40809.             cr; 
  40810.             nextPutAll: aString; 
  40811.             flush]
  40812.             !
  40813.  
  40814. name
  40815.  
  40816.     ^self printString!
  40817.  
  40818. numberOfTests
  40819.  
  40820.     ^1!
  40821.  
  40822. openDebuggerOnFailingTestMethod
  40823.     "SUnit has halted one step in front of the failing test method. Step over the 'self halt' and 
  40824.      send into 'self perform: testSelector' to see the failure from the beginning"
  40825.  
  40826.     self
  40827.         halt;
  40828.         performTest
  40829.             !
  40830.  
  40831. performTest
  40832.  
  40833.     self perform: testSelector sunitAsSymbol
  40834.             !
  40835.  
  40836. printOn: aStream
  40837.  
  40838.     aStream
  40839.         nextPutAll: self class printString;
  40840.         nextPutAll: '>>#';
  40841.         nextPutAll: testSelector
  40842.             !
  40843.  
  40844. removeDependentFromHierachy: anObject 
  40845.     "an empty method. for Composite compability with TestSuite"
  40846.  
  40847.  
  40848.             !
  40849.  
  40850. resources
  40851.     | allResources resourceQueue |
  40852.     allResources := Set new.
  40853.     resourceQueue := OrderedCollection new.
  40854.     resourceQueue addAll: self class resources.
  40855.     [resourceQueue isEmpty] whileFalse: [
  40856.         | next |
  40857.         next := resourceQueue removeFirst.
  40858.         allResources add: next.
  40859.         resourceQueue addAll: next resources].
  40860.     ^allResources
  40861.             !
  40862.  
  40863. run
  40864.     | result |
  40865.     result := TestResult new.
  40866.     self run: result.
  40867.     ^result
  40868.             !
  40869.  
  40870. run: aResult
  40871.     aResult runCase: self
  40872.             !
  40873.  
  40874. runCase
  40875.  
  40876.     [self setUp.
  40877.     self performTest] sunitEnsure: [self tearDown]
  40878.             !
  40879.  
  40880. runCaseAsFailure: aSemaphore
  40881.     [self setUp.
  40882.     self openDebuggerOnFailingTestMethod] sunitEnsure: [
  40883.         self tearDown.
  40884.         aSemaphore signal]
  40885.             !
  40886.  
  40887. selector
  40888.     ^testSelector
  40889.             !
  40890.  
  40891. setTestSelector: aSymbol
  40892.     testSelector := aSymbol
  40893.             !
  40894.  
  40895. setUp
  40896.             !
  40897.  
  40898. should: aBlock
  40899.     self assert: aBlock value
  40900.             !
  40901.  
  40902. should: aBlock description: aString
  40903.     self assert: aBlock value description: aString
  40904.             !
  40905.  
  40906. should: aBlock raise: anExceptionalEvent 
  40907.     ^self assert: (self executeShould: aBlock inScopeOf: anExceptionalEvent)
  40908.             !
  40909.  
  40910. should: aBlock raise: anExceptionalEvent description: aString 
  40911.     ^self assert: (self executeShould: aBlock inScopeOf: anExceptionalEvent)
  40912.         description: aString
  40913.             !
  40914.  
  40915. should: aBlock raise: anException matching: discriminator
  40916.     "Example usage:
  40917.         self should: [array at: $1] raise: Error matching: [:ex | ex messageText = 'Index: $1 is not an integer'].
  40918.     "
  40919.  
  40920.     | raised |
  40921.     raised := false.
  40922.     aBlock on: anException
  40923.         do: 
  40924.             [:exception | 
  40925.             (discriminator value: exception) ifTrue: [raised := true].
  40926.             "If the exception is resumable, such as a warning, then allow execution of the block to continue"
  40927.             exception exit: nil].
  40928.     self assert: raised!
  40929.  
  40930. should: aZeroArgBlock trigger: aSymbol against: anObject 
  40931.     "Example Usage:
  40932.         self 
  40933.             should: [Object trigger: #testNoArgs]
  40934.             trigger: #testNoArgs
  40935.             against: Object.
  40936.     "
  40937.  
  40938.     self 
  40939.         should: aZeroArgBlock
  40940.         triggerAllOf: (Array with: aSymbol)
  40941.         against: anObject!
  40942.  
  40943. should: aBlock trigger: eventSymbol1 butNot: eventSymbol2 against: anObject 
  40944.     "Example usage:
  40945.         self 
  40946.             should: [presenter selection: each]
  40947.             trigger: #selectionChanged
  40948.             butNot: #selectionChanging:
  40949.             against: presenter.
  40950.     "
  40951.  
  40952.     self 
  40953.         should: aBlock
  40954.         triggerAllOf: (Array with: eventSymbol1)
  40955.         matching: [:message | true]
  40956.         butNoneOf: (Array with: eventSymbol2)
  40957.         against: anObject!
  40958.  
  40959. should: aZeroArgBlock trigger: aSymbol matching: discriminatorBlock against: anObject 
  40960.     "Example usage:
  40961.         self 
  40962.             should: [Object trigger: #testTwoArgs:arg2:]
  40963.             trigger: #testTwoArgs:arg2:
  40964.             matching: [:arg1 :arg2 | arg1 isNil & arg2 isNil]
  40965.             against: Object.
  40966.     "
  40967.  
  40968.     self assert: aSymbol argumentCount = discriminatorBlock argumentCount.
  40969.     self 
  40970.         should: aZeroArgBlock
  40971.         triggerAllOf: (Array with: aSymbol)
  40972.         matching: [:message | discriminatorBlock valueWithArguments: message arguments]
  40973.         against: anObject!
  40974.  
  40975. should: aZeroArgBlock triggerAllOf: aCollectionOfSymbols against: anObject 
  40976.     self 
  40977.         should: aZeroArgBlock
  40978.         triggerAllOf: aCollectionOfSymbols
  40979.         matching: [:message | true]
  40980.         against: anObject!
  40981.  
  40982. should: aBlock triggerAllOf: aCollectionOfSymbols matching: discriminator against: anObject
  40983.     self 
  40984.         should: aBlock
  40985.         triggerAllOf: aCollectionOfSymbols
  40986.         matching: discriminator
  40987.         butNoneOf: #()
  40988.         against: anObject!
  40989.  
  40990. should: aZeroArgBlock triggerAllOf: aCollectionOfSymbols matching: aOneArgBlock butNoneOf: aCollectionOfSymbols2 against: anObject 
  40991.     | fired allEvents |
  40992.     fired := Bag new.
  40993.     allEvents := aCollectionOfSymbols union: aCollectionOfSymbols2.
  40994.     "The expected and unexpected event sets should be disjoint"
  40995.     self assert: allEvents size = (aCollectionOfSymbols size + aCollectionOfSymbols2 size).
  40996.     
  40997.     [allEvents do: 
  40998.             [:each | 
  40999.             "If the event selector is part of nil's protocol, then no MNU will be raised, 
  41000.             and the test will be invalid"
  41001.  
  41002.             self deny: (nil respondsTo: each).
  41003.             anObject when: each sendTo: nil].
  41004.     aZeroArgBlock on: MessageNotUnderstood
  41005.         do: 
  41006.             [:mnu | 
  41007.             (mnu receiver ~~ nil or: [(allEvents includes: mnu selector) not]) ifTrue: [mnu pass].
  41008.             ((aCollectionOfSymbols2 includes: mnu selector) or: [aOneArgBlock value: mnu message]) 
  41009.                 ifTrue: [fired add: mnu selector].
  41010.             mnu resume: mnu receiver]] 
  41011.             ensure: [anObject removeEventsTriggeredFor: nil].
  41012.     "If this assertion fails, then the object did not trigger one or more of the expected events"
  41013.     self assert: (aCollectionOfSymbols difference: fired) isEmpty.
  41014.     "If this assertion fails, then the object triggered one or more events that it should not have"
  41015.     self assert: (aCollectionOfSymbols2 intersection: fired) isEmpty!
  41016.  
  41017. shouldnt: aBlock
  41018.     self deny: aBlock value
  41019.             !
  41020.  
  41021. shouldnt: aBlock description: aString
  41022.     self deny: aBlock value description: aString
  41023.             !
  41024.  
  41025. shouldnt: aBlock raise: anExceptionalEvent 
  41026.     ^self assert: (self executeShould: aBlock inScopeOf: anExceptionalEvent) not
  41027.             !
  41028.  
  41029. shouldnt: aBlock raise: anExceptionalEvent description: aString 
  41030.     ^self assert: (self executeShould: aBlock inScopeOf: anExceptionalEvent) not         description: aString
  41031.             !
  41032.  
  41033. shouldnt: aBlock trigger: aSymbol against: anObject
  41034.     "Example usage:
  41035.         self 
  41036.             shouldnt: [presenter selection: each]
  41037.             trigger: #selectionChanging:
  41038.             against: presenter.
  41039.     "
  41040.  
  41041.     ^self 
  41042.         shouldnt: aBlock
  41043.         triggerAnyOf: (Array with: aSymbol)
  41044.         against: anObject!
  41045.  
  41046. shouldnt: aBlock triggerAnyOf: aCollectionOfSymbols against: anObject
  41047.     "Example usage:
  41048.         self 
  41049.             shouldnt: [presenter model remove: objects last]
  41050.             triggerAnyOf: #(#selectionChanged #selectionChanging:)
  41051.             against: presenter.
  41052.     "
  41053.  
  41054.     | raised events argc fired |
  41055.     events := anObject getEvents.
  41056.     aCollectionOfSymbols do: [:each | anObject when: each sendTo: nil].
  41057.     fired := false.
  41058.     aBlock on: MessageNotUnderstood
  41059.         do: 
  41060.             [:mnu | 
  41061.             (mnu receiver ~~ nil or: [(aCollectionOfSymbols includes: mnu selector) not]) 
  41062.                 ifTrue: [mnu pass].
  41063.             fired := true.
  41064.             mnu resume: mnu receiver].
  41065.     anObject setEvents: events.
  41066.     self assert: fired not!
  41067.  
  41068. signalFailure: aString
  41069.     TestResult failure sunitSignalWith: aString
  41070.  
  41071.  
  41072.             !
  41073.  
  41074. step
  41075.  
  41076.     self debugAsFailure!
  41077.  
  41078. tearDown
  41079.             ! !
  41080.  
  41081. TestResource comment:
  41082. ''!
  41083. !TestResource class methodsFor!
  41084.  
  41085. current
  41086.  
  41087.     current isNil
  41088.         ifTrue: [current := self new].
  41089.  
  41090.     ^current
  41091.             !
  41092.  
  41093. current: aTestResource
  41094.  
  41095.     current := aTestResource
  41096.             !
  41097.  
  41098. isAbstract
  41099.     "Override to true if a TestResource subclass is Abstract and should not have
  41100.     TestCase instances built from it"
  41101.  
  41102.     ^self sunitName = #TestResource
  41103.             !
  41104.  
  41105. isAvailable
  41106.     ^self current notNil and: [self current isAvailable]
  41107.             !
  41108.  
  41109. isUnavailable
  41110.  
  41111.     ^self isAvailable not
  41112.             !
  41113.  
  41114. new
  41115.  
  41116.     ^super new initialize
  41117.             !
  41118.  
  41119. onPreStripImage
  41120.     self allSubclassesDo: [:each | each reset]!
  41121.  
  41122. reset
  41123.  
  41124.     current notNil ifTrue: [
  41125.         [current tearDown] ensure: [
  41126.             current := nil]]
  41127.             !
  41128.  
  41129. resources
  41130.     ^#()
  41131.             !
  41132.  
  41133. signalInitializationError
  41134.     ^TestResult signalErrorWith: 'Resource ' , self name , ' could not be initialized'
  41135.             ! !
  41136.  
  41137. !TestResource methodsFor!
  41138.  
  41139. canBrowse
  41140.  
  41141.     ^true!
  41142.  
  41143. description
  41144.  
  41145.     description isNil
  41146.         ifTrue: [^''].
  41147.  
  41148.     ^description
  41149.             !
  41150.  
  41151. description: aString
  41152.  
  41153.     description := aString
  41154.             !
  41155.  
  41156. displayName
  41157.  
  41158.     ^self name sunitbAsProperNouns!
  41159.  
  41160. initialize
  41161.     self setUp
  41162.  
  41163.             !
  41164.  
  41165. isAvailable
  41166.     "override to provide information on the
  41167.     readiness of the resource"
  41168.     
  41169.     ^true
  41170.             !
  41171.  
  41172. isUnavailable
  41173.     "override to provide information on the
  41174.     readiness of the resource"
  41175.     
  41176.     ^self isAvailable not
  41177.             !
  41178.  
  41179. name
  41180.  
  41181.     name isNil
  41182.         ifTrue: [^self printString].
  41183.  
  41184.     ^name
  41185.             !
  41186.  
  41187. name: aString
  41188.  
  41189.     name := aString
  41190.             !
  41191.  
  41192. printOn: aStream
  41193.  
  41194.     aStream nextPutAll: self class printString
  41195.             !
  41196.  
  41197. resources
  41198.     ^self class resources
  41199.             !
  41200.  
  41201. setUp
  41202.     "Does nothing. Subclasses should override this
  41203.     to initialize their resource"
  41204.             !
  41205.  
  41206. signalInitializationError
  41207.     ^self class signalInitializationError
  41208.             !
  41209.  
  41210. tearDown
  41211.     "Does nothing. Subclasses should override this
  41212.     to tear down their resource"
  41213.             ! !
  41214.  
  41215. TestResult comment:
  41216. 'This is a Collecting Parameter for the running of a bunch of tests. TestResult is an interesting object to subclass or substitute. #runCase: is the external protocol you need to reproduce. Kent has seen TestResults that recorded coverage information and that sent email when they were done.'!
  41217. !TestResult class methodsFor!
  41218.  
  41219. error
  41220.     ^self exError
  41221.             !
  41222.  
  41223. exError
  41224.     ^SUnitNameResolver errorObject
  41225.             !
  41226.  
  41227. failure
  41228.     ^TestFailure
  41229.             !
  41230.  
  41231. new
  41232.     ^super new initialize
  41233.             !
  41234.  
  41235. resumableFailure
  41236.     ^ResumableTestFailure
  41237.             !
  41238.  
  41239. signalErrorWith: aString 
  41240.     self error sunitSignalWith: aString
  41241.             !
  41242.  
  41243. signalFailureWith: aString 
  41244.     self failure sunitSignalWith: aString
  41245.             ! !
  41246.  
  41247. !TestResult methodsFor!
  41248.  
  41249. correctCount
  41250.     "depreciated - use #passedCount"
  41251.  
  41252.     ^self passedCount
  41253.             !
  41254.  
  41255. defects
  41256.     ^OrderedCollection new
  41257.         addAll: self errors;
  41258.         addAll: self failures; yourself
  41259.             !
  41260.  
  41261. errorCount
  41262.  
  41263.     ^self errors size
  41264.             !
  41265.  
  41266. errors
  41267.  
  41268.     errors isNil
  41269.         ifTrue: [errors := OrderedCollection new].
  41270.     ^errors
  41271.             !
  41272.  
  41273. failureCount
  41274.  
  41275.     ^self failures size
  41276.             !
  41277.  
  41278. failures
  41279.     failures isNil
  41280.         ifTrue: [failures := Set new].
  41281.     ^failures
  41282.             !
  41283.  
  41284. hasErrors
  41285.  
  41286.     ^self errors size > 0
  41287.             !
  41288.  
  41289. hasFailures
  41290.  
  41291.     ^self failures size > 0
  41292.             !
  41293.  
  41294. hasPassed
  41295.  
  41296.     ^self hasErrors not and: [self hasFailures not]
  41297.             !
  41298.  
  41299. initialize
  41300.             !
  41301.  
  41302. isError: aTestCase
  41303.  
  41304.     ^self errors includes: aTestCase
  41305.             !
  41306.  
  41307. isFailure: aTestCase
  41308.     ^self failures includes: aTestCase
  41309.             !
  41310.  
  41311. isPassed: aTestCase
  41312.  
  41313.     ^self passed includes: aTestCase
  41314.             !
  41315.  
  41316. passed
  41317.  
  41318.     passed isNil
  41319.         ifTrue: [passed := OrderedCollection new].
  41320.  
  41321.     ^passed
  41322.             !
  41323.  
  41324. passedCount
  41325.  
  41326.     ^self passed size
  41327.             !
  41328.  
  41329. printOn: aStream
  41330.  
  41331.     aStream
  41332.         nextPutAll: self runCount printString;
  41333.         nextPutAll: ' run, ';
  41334.         nextPutAll: self correctCount printString;
  41335.         nextPutAll: ' passed, ';
  41336.         nextPutAll: self failureCount printString;
  41337.         nextPutAll: ' failed, ';
  41338.         nextPutAll: self errorCount printString;
  41339.         nextPutAll: ' error'.
  41340.  
  41341.     self errorCount ~= 1
  41342.         ifTrue: [aStream nextPut: $s]
  41343.             !
  41344.  
  41345. runCase: aTestCase
  41346.  
  41347.     | testCasePassed |
  41348.  
  41349.     testCasePassed :=
  41350.         [
  41351.             [
  41352.                 aTestCase runCase.
  41353.                 true]
  41354.                     sunitOn: self class failure
  41355.                     do: [:signal |
  41356.                         self failures add: aTestCase.
  41357.                         signal sunitExitWith: false]]
  41358.                             sunitOn: self class error
  41359.                             do: [:signal |
  41360.                                 self errors add: aTestCase.
  41361.                                 signal sunitExitWith: false].
  41362.  
  41363.     testCasePassed
  41364.         ifTrue: [self passed add: aTestCase]
  41365.             !
  41366.  
  41367. runCount
  41368.  
  41369.     ^self passedCount + self failureCount + self errorCount
  41370.             !
  41371.  
  41372. tests
  41373.  
  41374.     ^(OrderedCollection new: self runCount)
  41375.         addAll: self passed;
  41376.         addAll: self errors;
  41377.         addAll: self failures;
  41378.         yourself
  41379.             ! !
  41380.  
  41381. TestSuite comment:
  41382. 'This is a Composite of Tests, either TestCases or other TestSuites. The common protocol is #run: aTestResult and the dependencies protocol'!
  41383. !TestSuite class methodsFor!
  41384.  
  41385. named: aString
  41386.  
  41387.     ^self new
  41388.         name: aString;
  41389.         yourself
  41390.             ! !
  41391.  
  41392. !TestSuite methodsFor!
  41393.  
  41394. addDependentToHierachy: anObject
  41395.     self sunitAddDependent: anObject.
  41396.     self tests do: [ :each | each addDependentToHierachy: anObject]
  41397.             !
  41398.  
  41399. addTest: aTest
  41400.     self tests add: aTest
  41401.             !
  41402.  
  41403. addTests: aCollection 
  41404.     aCollection do: [:eachTest | self addTest: eachTest]
  41405.             !
  41406.  
  41407. allTests
  41408.  
  41409.     | aCollection |
  41410.  
  41411.     aCollection := OrderedCollection new.
  41412.     self tests do: [:each | aCollection addAll: each allTests].
  41413.  
  41414.     ^aCollection!
  41415.  
  41416. buildSuite
  41417.  
  41418.     ^self deepCopy!
  41419.  
  41420. canBrowse
  41421.  
  41422.     ^false!
  41423.  
  41424. canDebug
  41425.  
  41426.     ^false!
  41427.  
  41428. defaultResources
  41429.     ^self tests 
  41430.         inject: Set new
  41431.         into: [:coll :testCase | 
  41432.             coll
  41433.                 addAll: testCase resources;
  41434.                 yourself]
  41435.             !
  41436.  
  41437. displayName
  41438.  
  41439.     ^self name sunitbAsProperNouns!
  41440.  
  41441. hasTests
  41442.  
  41443.     ^self tests notNil and: [self tests notEmpty]!
  41444.  
  41445. isTestSuite
  41446.  
  41447.     ^true!
  41448.  
  41449. name
  41450.  
  41451.     ^name
  41452.             !
  41453.  
  41454. name: aString
  41455.  
  41456.     name := aString
  41457.             !
  41458.  
  41459. numberOfTests
  41460.  
  41461.     ^self hasTests
  41462.         ifTrue: [
  41463.             self tests
  41464.                 inject: 0
  41465.                 into: [:total :each | total + each numberOfTests]]
  41466.         ifFalse: [0]!
  41467.  
  41468. removeDependentFromHierachy: anObject
  41469.     self sunitRemoveDependent: anObject.
  41470.     self tests do: [ :each | each removeDependentFromHierachy: anObject]
  41471.             !
  41472.  
  41473. resources
  41474.     resources isNil ifTrue: [resources := self defaultResources].
  41475.     ^resources
  41476.             !
  41477.  
  41478. resources: anObject
  41479.     resources := anObject
  41480.             !
  41481.  
  41482. run
  41483.     | result |
  41484.      result := TestResult new.
  41485.     self resources do: [ :res |
  41486.         res isAvailable ifFalse: [^res signalInitializationError]].
  41487.     [self run: result] sunitEnsure: [self resources do: [:each | each reset]].
  41488.     ^result
  41489.             !
  41490.  
  41491. run: aResult 
  41492.     self tests do: [:each | 
  41493.         self sunitChanged: each.
  41494.         each run: aResult]
  41495.             !
  41496.  
  41497. tests
  41498.     tests isNil ifTrue: [tests := OrderedCollection new].
  41499.     ^tests
  41500.             ! !
  41501.  
  41502. ToolbarItem comment:
  41503. 'ToolbarItem is an abstract class whose subclasses represent the items held by a <Toolbar>.
  41504.  
  41505. Instance Variables:
  41506.     commandId    <integer> ID of the item''s command (or zero if none).
  41507.     unused        <UndefinedObject> reserved for future use.
  41508.     window        <Toolbar> containing the item.
  41509.     style        <integer> representing the Window''s style of the item.
  41510.     commandDescription    <CommandDescription> or nil, of the item''s command.  
  41511.  
  41512. '!
  41513. !ToolbarItem class methodsFor!
  41514.  
  41515. buttonClass
  41516.     "Answer the subclass used to represent Toolbar buttons."
  41517.  
  41518.     ^ToolbarButton!
  41519.  
  41520. editTools
  41521.     "Answer a collection of items which are the standard file tools (e.g. new, open, save)
  41522.     in the standard order."
  41523.  
  41524.     | bc |
  41525.     bc := self buttonClass.
  41526.     ^(OrderedCollection new) 
  41527.         add: bc cutSelection;
  41528.         add: bc copySelection;
  41529.         add: bc pasteClipboard;
  41530.         add: bc clearSelection;
  41531.         add: bc undo;
  41532.         yourself.
  41533.  
  41534.     #todo "Is it necessary to create a new ToolbarButton each time, or can we share them?"!
  41535.  
  41536. fileTools
  41537.     "Answer a collection of items which are the standard file tools (e.g. new, open, save)
  41538.     in the standard order."
  41539.  
  41540.     | bc |
  41541.     bc := self buttonClass.
  41542.     ^Array 
  41543.         with: bc fileNew
  41544.         with: bc fileOpen
  41545.         with: bc fileSave.
  41546.  
  41547.     #todo "Is it necessary to create a new ToolbarButton each time, or can we share them?"!
  41548.  
  41549. findTools
  41550.     "Answer a collection of items which are the standard file tools (e.g. new, open, save)
  41551.     in the standard order."
  41552.  
  41553.     | bc |
  41554.     bc := self buttonClass.
  41555.     ^Array 
  41556.         with: bc find
  41557.         with: bc findNext.
  41558.  
  41559. !
  41560.  
  41561. icon
  41562.     "Answers an Icon that can be used to represent this class"
  41563.  
  41564.     ^##(self) defaultIcon!
  41565.  
  41566. new
  41567.     "Answer a new instance of the receiver."
  41568.  
  41569.     ^super new initialize! !
  41570.  
  41571. !ToolbarItem methodsFor!
  41572.  
  41573. commandId
  41574.     "Private - Answer the Integer command identifier for the receiver"
  41575.  
  41576.     ^0
  41577. !
  41578.  
  41579. getCommandId
  41580.     "Private - Determine and answer the Integer command identifier for the receiver."
  41581.  
  41582.     ^self commandId!
  41583.  
  41584. imageIndexIn: aWindow
  41585.     "Private - Answer the index of the bitmap from aWindows registered bitmaps
  41586.     which will be used for the receiver on the toolbar." 
  41587.  
  41588.     ^self subclassResponsibility!
  41589.  
  41590. initialize
  41591.     "Private - Initialize the state of the receiver."
  41592.  
  41593.     style := 0.
  41594. !
  41595.  
  41596. isDropdownStyle
  41597.     "Answers true if the receiver is a drop down style button"
  41598.  
  41599.     ^false!
  41600.  
  41601. onClick: aPoint 
  41602.     "This toolbar item was left-clicked at the specified <Point>."
  41603.  
  41604.     self trigger: #clicked: with: aPoint!
  41605.  
  41606. onDoubleClick: aPoint 
  41607.     "This item was left double-clicked at the specified <Point>.
  41608.     Note that we don't seem to receive these at present."
  41609.  
  41610.     self trigger: #doubleClicked: with: aPoint!
  41611.  
  41612. onRightClick: aPoint 
  41613.     "This toolbar item was right-clicked at the specified <Point>."
  41614.  
  41615.     self trigger: #rightClicked: with: aPoint!
  41616.  
  41617. parent
  41618.     "Answer the parent view of the receiver."
  41619.  
  41620.     ^self toolbar view!
  41621.  
  41622. style
  41623.     "Private - Answer the style of the receiver."
  41624.  
  41625.     ^style!
  41626.  
  41627. style: styleInteger
  41628.     "Private - Set the style of the receiver. "
  41629.  
  41630.     style := styleInteger.
  41631.     self update!
  41632.  
  41633. textIndexIn: aToolbar
  41634.     "Private - Answer the index of the text which will be shown on the toolbar for the
  41635.     receiver."
  41636.  
  41637.     ^self subclassResponsibility!
  41638.  
  41639. toolbar
  41640.     "Private - Answer the ToolBar in which the receier exists."
  41641.  
  41642.     ^window!
  41643.  
  41644. toolbar: aToolbar
  41645.     "Private - Set the toolbar in which the receiver exists to aToolbar."
  41646.  
  41647.     window := aToolbar!
  41648.  
  41649. update
  41650.     "Private - Update the associated Toolbar if we have one"
  41651.  
  41652.     self toolbar notNil ifTrue: [
  41653.         self toolbar updateAllItems  ]!
  41654.  
  41655. validateUserInterface: route
  41656.     "Set the UI state of the receiver. Overridden in subclasses"! !
  41657.  
  41658. TreeNode comment:
  41659. 'TreeNode represents a node of a tree in a <TreeModel> hierarchy.
  41660.  
  41661. Instance Variables:
  41662.     parent    <TreeNode> which is the parent of this node in the tree.
  41663.     children    <OrderedCollection> of <TreeNode>s or nil, containing the children of this node.
  41664.     object    <Object> which is at this node position in the tree.
  41665.  
  41666.  
  41667.  
  41668. '!
  41669. !TreeNode class methodsFor!
  41670.  
  41671. for: anObject
  41672.     "Answer an instance of the receiver that is to represent anObject"
  41673.  
  41674.     ^self new object: anObject; yourself! !
  41675.  
  41676. !TreeNode methodsFor!
  41677.  
  41678. addChildNode: aTreeNode
  41679.     "Adds aTreeNode as a child of the receiver. Answer aTreeNode"
  41680.  
  41681.     (children := self children) add: aTreeNode.
  41682.     aTreeNode parent: self.
  41683.     ^aTreeNode!
  41684.  
  41685. beChildless
  41686.     "Set the receiver to have no children."
  41687.  
  41688.     children := nil!
  41689.  
  41690. children
  41691.     "Answers an <sequencedCollection> of the child nodes of the receiver."
  41692.  
  41693.     ^children ifNil: [self newChildCollection]!
  41694.  
  41695. children: anOrderedCollection
  41696.     children := anOrderedCollection!
  41697.  
  41698. getChildren
  41699.     "Private - Answer the receiver's children instance variable."
  41700.  
  41701.     ^children!
  41702.  
  41703. newChildCollection
  41704.     ^OrderedCollection new!
  41705.  
  41706. object
  41707.     "Answer the object associated with the receiver"
  41708.  
  41709.     ^object!
  41710.  
  41711. object: anObject
  41712.     "Private - Set the object associated with the receiver"
  41713.  
  41714.     object := anObject!
  41715.  
  41716. parent
  41717.     "Answer the parent node of the receiver"
  41718.  
  41719.     ^parent!
  41720.  
  41721. parent: aTreeNode
  41722.     "Private - Set the parent of the receiver to aTreeNode"
  41723.  
  41724.     parent := aTreeNode!
  41725.  
  41726. printOn: target
  41727.     "Append, to the <puttableStream>, target, a string whose characters are a 
  41728.     the same as those which would result from sending a #printString
  41729.     message to the receiver.
  41730.     N.B. This is really intended for development use. #displayOn: and #displayString
  41731.     are complementary methods for generating strings for presentation to an
  41732.     end-user."
  41733.  
  41734.     target
  41735.         basicPrint: self;
  41736.         nextPut: $(;
  41737.         print: object;
  41738.         nextPut: $)!
  41739.  
  41740. removeChildNode: aTreeNode
  41741.     "Removes aTreeNode as a child of the receiver. 
  41742.     Answer aTreeNode unless it is not an child of the receiver, in which 
  41743.     case, raise a suitable Exception."
  41744.  
  41745.     self removeChildNode: aTreeNode ifAbsent: [^self errorNotFound: aTreeNode].
  41746.     aTreeNode parent: nil.
  41747.     ^aTreeNode
  41748.  
  41749.  
  41750.  
  41751.  
  41752.  
  41753. !
  41754.  
  41755. removeChildNode: aTreeNode ifAbsent: exceptionHandler
  41756.     "Remove aTreeNode from the receiver's children.  If several of the children are 
  41757.     equal to aTreeNode, only the first is removed. If no child is equal to aTreeNode, 
  41758.     answer the result of evaluating the <niladicValuable>, exceptionHandler. 
  41759.     Otherwise, answer aTreeNode."
  41760.  
  41761.     self children remove: aTreeNode ifAbsent: exceptionHandler.
  41762.     (children notNil and: [children isEmpty]) ifTrue: [
  41763.         "Fold child collection to nil if empty"
  41764.         children := nil].
  41765.     ^aTreeNode
  41766.  
  41767.  
  41768.  
  41769.  
  41770.  
  41771. ! !
  41772.  
  41773. TypeConverter comment:
  41774. 'A <TypeConverter> is capable of converting one type of object into another and vice versa. Very often a TypeConverter forms part of a <ValueConverter> model that sits between a subject value and some client of that value. The subject value is referred to as the ''left'' value and the value the client sees is the ''right'' value. In a typical usage (within the MVP framework) the ''left'' type is the type of the Model value, and the right type is the display value (usually a String).
  41775.  
  41776. TypeConverter is itself an abstract class and concrete subclasses must be created to provide specific type convertions. Subclasses should implement #leftToRight: and #rightToLeft: methods to perform the conversions. These methods are, however, private. The public interface for conversion is as defined in the <typeConverter> method protocol.
  41777.  
  41778. In order that these seletor names hold a common meaning all subclasses should follow the naming convention LefttypeToRighttype (e.g. NumberToString). 
  41779.  
  41780. TypeConverters support the notion of an undefined or null value for both left and right value types. The ''null'' value for one side is mapped to the ''null'' value for the other side and vice versa, without going through the normal conversion process. For example text converters will map nil from the left subject value to the empty string display value.
  41781.  
  41782. Instance Variables:
  41783.     leftNullValue    <Object> or nil, to which the right null value is mapped by a right to left conversion.
  41784.     rightNullValue     <Object> or nil, to which the left null value is mapped by a left to right conversion.
  41785.  
  41786.  
  41787.  
  41788. '!
  41789. !TypeConverter class methodsFor!
  41790.  
  41791. icon
  41792.     "Answers an Icon that can be used to represent this class"
  41793.  
  41794.     ^##(self) defaultIcon!
  41795.  
  41796. new
  41797.     "Answer a new instance of the receiver. Instances require initialization"
  41798.  
  41799.     ^super new initialize!
  41800.  
  41801. publishedAspectsOfInstances
  41802.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  41803.     
  41804.         ^(super publishedAspectsOfInstances)
  41805.             add: (Aspect name: #leftNullValue);
  41806.             add: (Aspect name: #rightNullValue);
  41807.             yourself! !
  41808.  
  41809. !TypeConverter methodsFor!
  41810.  
  41811. convertFromLeftToRight: anObject 
  41812.     "Converts the <Object> argument, which is assumed to be of the receivers left type
  41813.     (possibly its null value) to an <Object> of the receiver's right type (possibly its null
  41814.     value), and answers the resulting right value."
  41815.  
  41816.     (self isLeftNullValue: anObject) ifTrue: [^self rightNullValue].
  41817.     ^self leftToRight: anObject!
  41818.  
  41819. convertFromRightToLeft: anObject 
  41820.     "Converts anObject, which is assumed to be of the receivers right type to an object
  41821.     of the receivers left type. If anObject is an exceptional value it will be converted to the 
  41822.     receiver's equivalent for the right hand side. Answers the result of the conversion."
  41823.  
  41824.     (self isRightNullValue: anObject) ifTrue: [^self leftNullValue].
  41825.     ^self rightToLeft: anObject!
  41826.  
  41827. inverted
  41828.     "Answers a type converter that reverses the direction of the receiver's conversion. 
  41829.     In this case answers an instance of InvertingConverter that wraps the receiver"
  41830.  
  41831.     ^InvertingConverter inverting: self
  41832. !
  41833.  
  41834. isLeftNullValue: anObject 
  41835.     "Private - Answers whether the argument can be considered the 'null' value 
  41836.     for the left hand side value type."
  41837.  
  41838.     ^anObject = self leftNullValue!
  41839.  
  41840. isRightNullValue: anObject 
  41841.     "Private - Answers whether the argument can be considered the 'null' value 
  41842.     for the left hand side value type."
  41843.  
  41844.     ^anObject = self rightNullValue!
  41845.  
  41846. leftExceptionalValue
  41847.     #deprecated.
  41848.     ^self leftNullValue!
  41849.  
  41850. leftExceptionalValue: anObject
  41851.     #deprecated.
  41852.     ^self leftNullValue: anObject!
  41853.  
  41854. leftNullValue
  41855.     "Answer the 'null' value of the left type."
  41856.  
  41857.     ^leftNullValue!
  41858.  
  41859. leftNullValue: anObject 
  41860.     "Set the 'null' value of the left type to the argument."
  41861.  
  41862.     leftNullValue := anObject!
  41863.  
  41864. leftToRight: anObject
  41865.     "Private - Converts the <Object> argument, which is assumed to be of the receivers left 
  41866.     type to an <Object> of the receiver's right type. Answers the result of the conversion. 
  41867.     Must be overridden by subclasses to perform specific conversions."
  41868.  
  41869.     ^self subclassResponsibility!
  41870.  
  41871. rightExceptionalValue
  41872.     #deprecated.
  41873.     ^self rightNullValue!
  41874.  
  41875. rightExceptionalValue: anObject
  41876.     #deprecated.
  41877.     ^self rightNullValue: anObject!
  41878.  
  41879. rightNullValue
  41880.     "Answer the 'null' value of the right type."
  41881.  
  41882.     ^rightNullValue!
  41883.  
  41884. rightNullValue: anObject 
  41885.     "Set the 'null' value of the right type to the argument."
  41886.  
  41887.     rightNullValue := anObject!
  41888.  
  41889. rightToLeft: anObject
  41890.     "Private - Converts the <Object> argument, which is assumed to be of the receivers right 
  41891.     type to an <Object> of the receivers left type. Answers the result of the conversion. 
  41892.     Must be overridden by subclasses to perform specific conversions"
  41893.  
  41894.     ^self subclassResponsibility! !
  41895.  
  41896. UndefinedObject comment:
  41897. 'UndefinedObject is the singleton class of the distinguished object, <nil>.
  41898.  
  41899. <nil> is the initial value of all new variables (instance or otherwise), and hence a  primary purpose of UndefinedObject is to provide a means of detecting errors, especially those resulting from the failure to correctly initialize variables.
  41900.  
  41901. <nil> is also useful for explicitly representing a null value, e.g. in a variable which has no value. A common use of this type is in conjunction with lazy initialization. In this respect <nil> has a similar purpose to the SQL <null> value.
  41902.  
  41903. When interfacing to external functions, etc, <nil> is treated as the null pointer, or zero, as appropriate to the parameter type.
  41904.  
  41905. UndefinedObject implements the following ANSI protocols:
  41906.     <Object>
  41907.     <nil>'!
  41908. !UndefinedObject class methodsFor!
  41909.  
  41910. icon
  41911.     "Answers an Icon that can be used to represent this class"
  41912.  
  41913.     ^##(self) defaultIcon!
  41914.  
  41915. new
  41916.     "Answer a new instance of the receiver.
  41917.     There can be only one!!"
  41918.  
  41919.     ^nil!
  41920.  
  41921. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  41922. à:m░╒Sqá└╠!
  41923.  
  41924. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  41925. m»g|jmT]x≈Å
  41926. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{Q₧₧╠╟⌐! !
  41927.  
  41928. !UndefinedObject methodsFor!
  41929.  
  41930. _deepCopy: copiesDictionary
  41931.     ^self!
  41932.  
  41933. aspectDisplayOn: aStream
  41934.       "Private - Append a single-line textual representatin of the receiver to the <puttableStream>
  41935.       argument in a form that a user viewing the receiver as the value of a published aspect would 
  41936.       like to see it. Typically we use #displayOn: but some classes of object can use alternate display 
  41937.       formats. In this case we want to use #printOn: because nil displays as nothing.
  41938.       N.B. This is a development time only method that supports the PublishedAspectInspector."
  41939.   
  41940.       self printOn: aStream!
  41941.  
  41942. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣`▓▀6£êÆ│╟√%W┘4iGm╩░h?½╟╘X\£¥V[íW│'╨7╚nj$╒]▀╫J▄A|ú9▌╥┼∙▐αpçÅÜçuº²^P╗ rûτsΦ²≡I&╧W╖|Ü8rⁿ╘8⌠vQσüΦ║r╝╝╕≡⌡
  41943. ñ┤o^│σ▒BwCSt7Ç    µ|1JF╠ìé«Lj4zε╛╛v.╓²╪┐⌠uë╨Φ╠è.░Γ█I┬
  41944. %R¼lεdMδ░}┼-Z°Fÿêü¥╦£┌─ΦA±\r╫îY¼┘╬■(oHa2    3⌠ !
  41945.  
  41946. bindingFor: aString 
  41947.     "Answer a variable binding for the named variable in the scope of this class. 
  41948.     If there is no such variable, then answer nil."
  41949.  
  41950.     ^nil!
  41951.  
  41952. deepCopy
  41953.     "Answer the receiver - there is only one instance, nil."
  41954.  
  41955.     ^self!
  41956.  
  41957. displayOn: aStream
  41958.     "Append a representation of the receiver to aStream as a user would want to see it.
  41959.     The default is to do nothing, since, from the end-user perspective, the receiver is a null."!
  41960.  
  41961. ifNil: aBlock
  41962.     "If the receiver is the nil object, then answer the result of evaluating
  41963.     the <niladicValuable>, aBlock, otherwise answer the receiver."
  41964.  
  41965.     ^aBlock value!
  41966.  
  41967. ifNil: nilBlock ifNotNil: notNilBlock 
  41968.     "If the receiver is the nil object, then answer the result of evaluating
  41969.     the <niladicValuable>, nilBlock, otherwise answer the result of
  41970.     evaluating the <monadicValuable>, notNilBlock, with the
  41971.     receiver as its argument."
  41972.  
  41973.     ^nilBlock value!
  41974.  
  41975. ifNotNil: aBlock
  41976.     "If the receiver is not the nil object, then answer the result of evaluating
  41977.     the <monadicValuable>, aBlock, with the receiver as its argument, 
  41978.     otherwise answer nil."
  41979.  
  41980.     ^self!
  41981.  
  41982. ifNotNil: notNilBlock ifNil: nilBlock 
  41983.     "If the receiver is the nil object, then answer the result of evaluating
  41984.     the <niladicValuable>, nilBlock, otherwise answer the result of
  41985.     evaluating the <monadicValuable>, notNilBlock, with the
  41986.     receiver as its argument."
  41987.  
  41988.     "Implementation Note: This message is normally inlined by the compiler and so
  41989.     is never sent unless #perform'd."
  41990.  
  41991.     ^nilBlock value!
  41992.  
  41993. includesBehavior: aBehavior
  41994.     "Answer whether the receiver includes the behavior, aClass
  41995.     (i.e. is aBehavior the receiver or a superclass of the receiver)"
  41996.  
  41997.     ^aBehavior isNil!
  41998.  
  41999. isLiteral
  42000.     "Answer whether or not the receiver has a literal representation (probably its
  42001.     printString) which is directly recognised by the Compiler. Of course nil does."
  42002.  
  42003.     ^true!
  42004.  
  42005. isNil
  42006.     "Answer whether the receiver is the manifest constant, nil. Of course it is."
  42007.  
  42008.     ^true
  42009. !
  42010.  
  42011. isNull
  42012.     "Private - Answer whether the receiver is 'Null'. A Dolphin object is Null
  42013.     if it is passed/returned to an external library function as the Null pointer.
  42014.     nil is interchangeable with 0 in this respect."
  42015.  
  42016.     ^true!
  42017.  
  42018. name
  42019.     "Answer the name of a class."
  42020.  
  42021.     ^'nil'!
  42022.  
  42023. newClassBuilder: aClassSymbol instanceVariableNames: instVarString classVariableNames: classVarString poolDictionaries: poolDictString
  42024.     ^(ClassBuilder new)
  42025.         className: aClassSymbol asString;
  42026.         instanceVariableString: instVarString;
  42027.         classVariableString: classVarString;
  42028.         sharedPoolString: poolDictString;
  42029.         yourself!
  42030.  
  42031. notNil
  42032.     "Answer whether the receiver is not the manifest constant, nil. Of course it isn't."
  42033.  
  42034.     ^false
  42035. !
  42036.  
  42037. notNull
  42038.     "Private - Answer whether the receiver is not 'Null'. See #isNull for
  42039.     further explanation."
  42040.  
  42041.     ^false!
  42042.  
  42043. printOn: aStream
  42044.     "Append a short textual description of the receiver to <aStream>.
  42045.     Note that this override refines #printString to comply with the ANSI 
  42046.     protocol <nil>."
  42047.     
  42048.     aStream nextPutAll: 'nil'!
  42049.  
  42050. printString
  42051.     "Answer a <readableString> whose characters are a description of the receiver 
  42052.     as a developer would want to see it."
  42053.  
  42054.     ^'nil'!
  42055.  
  42056. shallowCopy
  42057.     "Answer the receiver - there is only one instance, nil."
  42058.  
  42059.     ^self!
  42060.  
  42061. subclass: aClassSymbol instanceVariableNames: instVarString classVariableNames: classVarString poolDictionaries: poolDictString
  42062.     ^(self 
  42063.         newClassBuilder: aClassSymbol
  42064.         instanceVariableNames: instVarString
  42065.         classVariableNames: classVarString
  42066.         poolDictionaries: poolDictString)
  42067.         modifyOrCreate!
  42068.  
  42069. subclass: aClassSymbol instanceVariableNames: instVarString classVariableNames: classVarString poolDictionaries: poolDictString category: aCategoryOrString
  42070.     ^(self 
  42071.         newClassBuilder: aClassSymbol
  42072.         instanceVariableNames: instVarString
  42073.         classVariableNames: classVarString
  42074.         poolDictionaries: poolDictString)
  42075.         categoryNames: (Array with: aCategoryOrString);
  42076.         modifyOrCreate!
  42077.  
  42078. subclass: aClassSymbol
  42079.         instanceVariableNames: instVarString
  42080.         classVariableNames: classVarString
  42081.         poolDictionaries: poolDictString
  42082.         classInstanceVariableNames: classInstVarString
  42083.     "If aClassSymbol is not an existing class then create and answer a new fixed-pointer subclass,
  42084.     otherwise modify the class with name aClassSymbol to have the indicated features and answer it.
  42085.     Subclasses of nil are root classes, like Object, and special care is needed in their definition. 
  42086.     It is also the case that many modifications of Object are illegal (it cannot have named instance 
  42087.     variables for example)."
  42088.  
  42089.     | subclass |
  42090.     subclass := self 
  42091.                 subclass: aClassSymbol
  42092.                 instanceVariableNames: instVarString
  42093.                 classVariableNames: classVarString
  42094.                 poolDictionaries: poolDictString.
  42095.     subclass class instanceVariableNames: classInstVarString.
  42096.     ^subclass
  42097. !
  42098.  
  42099. yourAddress
  42100.     "Private - Answer the address of the receiver.
  42101.     Nil is treated like a NULL pointer."
  42102.  
  42103.     ^0! !
  42104.  
  42105. VersionInfo comment:
  42106. 'VersionInfo is a wrapper class to simplify access to Win32 DLL and EXE version information.
  42107.  
  42108. For example:
  42109.  
  42110.     VersionInfo forPath: ''notepad.exe''    "Ctrl+I"
  42111.  
  42112. Instance Variables:
  42113.     fileInfo        <ByteArray>. Buffer containing the raw version information resource.
  42114.     prefix        <String>. Prefix used to access language specific information from the version info. string table.
  42115.     fixedInfo        <VS_FIXEDFILEINFO>. The basic version information which is always present.'!
  42116. !VersionInfo class methodsFor!
  42117.  
  42118. forPath: path
  42119.     "Answer a new instance of the receiver which can be used to query the version
  42120.     information of the file with the specified path."
  42121.  
  42122.     ^self new
  42123.         fileInfo: (VersionLibrary default getFileVersionInfo: path);
  42124.         yourself        !
  42125.  
  42126. publishedAspectsOfInstances
  42127.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  42128.     
  42129.         ^(super publishedAspectsOfInstances)
  42130.             add: (Aspect string: #fileDescription) beReadOnly;
  42131.             add: (Aspect string: #productName) beReadOnly;
  42132.             add: (Aspect string: #comments) beReadOnly;
  42133.             add: (Aspect string: #legalCopyright) beReadOnly;
  42134.             add: (Aspect string: #specialBuild) beReadOnly;
  42135.             add: (Aspect name: #fixedInfo);
  42136.             yourself! !
  42137.  
  42138. !VersionInfo methodsFor!
  42139.  
  42140. at: valueName
  42141.     "Answer the named version information from the receiver."
  42142.  
  42143.     | lpstr len |
  42144.     lpstr := ExternalAddress new.
  42145.     len := self queryValue: self prefix, valueName into: lpstr.
  42146.     ^len == 0
  42147.         ifTrue: ['']
  42148.         ifFalse: [String fromAddress: lpstr]!
  42149.  
  42150. comments
  42151.     ^self at: 'Comments'!
  42152.  
  42153. fileDescription
  42154.     "Answer the <readableString> file name from the receiver."
  42155.  
  42156.     ^self at: 'FileDescription'!
  42157.  
  42158. fileInfo: bytes
  42159.     "Private - Set the version data block to the <ByteArray>, bytes."
  42160.  
  42161.     fileInfo := bytes!
  42162.  
  42163. fileVersionString
  42164.     "Answer a String in the form N.N.N.N which specifies the version number of the file."
  42165.  
  42166.     ^self fixedInfo fileVersionString!
  42167.  
  42168. fixedInfo
  42169.     "Answer a <VS_FIXEDFILEINFO> containing the standard (fixed)
  42170.     version info from the receiver.
  42171.     Implementation Note: Cache it for later use."
  42172.  
  42173.     fixedInfo isNil
  42174.         ifTrue: [fixedInfo := self getFixedInfo].
  42175.     ^fixedInfo!
  42176.  
  42177. formatVersionString: format
  42178.     "Answer a version string formatted as per the Win32 format string, format."
  42179.  
  42180.     | major minor special |
  42181.     major := self productMajor.
  42182.     minor := self productMinor.
  42183.     ^format formatWithArguments: (Array 
  42184.                 with: self productName
  42185.                 with: major highWord
  42186.                 with: major lowWord
  42187.                 with: minor highWord
  42188.                 with: minor lowWord)!
  42189.  
  42190. getFixedInfo
  42191.     "Private - Answer a <VS_FIXEDFILEINFO> containing the standard (fixed)
  42192.     version info from the receiver."
  42193.  
  42194.     | info lib dwLen |
  42195.     dwLen := DWORDBytes new.
  42196.     info := VS_FIXEDFILEINFO newPointer.
  42197.     lib := VersionLibrary default.
  42198.     ^(lib verQueryValue: fileInfo lpSubBlock: '\' lplpBuffer: info puLen: dwLen)
  42199.         ifTrue: [info]
  42200.         ifFalse: [lib systemError]!
  42201.  
  42202. getTranslationInfo
  42203.     "Private - Get the language/code-page id from the version info block."
  42204.  
  42205.     | lpvi len |
  42206.     lpvi := ExternalAddress new.
  42207.     len := self queryValue: '\VarFileInfo\Translation' into: lpvi.
  42208.     self assert: [len >= 4].
  42209.     ^'%04x%04x' sprintfWith: (lpvi wordAtOffset: 0) with: (lpvi wordAtOffset: 2)!
  42210.  
  42211. legalCopyright
  42212.     "Answer the <readableString> copyright notice from the receiver."
  42213.  
  42214.     ^self at: 'LegalCopyright'
  42215. !
  42216.  
  42217. prefix
  42218.     "Private - Answer the <readableString> prefix to be prepended to names in
  42219.     order to extract them from the version information."
  42220.  
  42221.     prefix isNil
  42222.         ifTrue: [prefix := '\StringFileInfo\', self getTranslationInfo, '\'].
  42223.     ^prefix!
  42224.  
  42225. productMajor
  42226.     "Answer the <integer> major version number of the product."
  42227.  
  42228.     ^self fixedInfo dwProductVersionMS!
  42229.  
  42230. productMinor
  42231.     "Answer the <integer> minor version number of the product."
  42232.  
  42233.     ^self fixedInfo dwProductVersionLS!
  42234.  
  42235. productName
  42236.     "Answer the <readableString> product name from the receiver."
  42237.  
  42238.     ^self at: 'ProductName'!
  42239.  
  42240. productVersionString
  42241.     "Answer a String in the form N.N.N.N which specifies the version number of the product."
  42242.  
  42243.     ^self fixedInfo productVersionString!
  42244.  
  42245. queryValue: name into: buf
  42246.     "Private - Get the language/code-page id from the version info block."
  42247.  
  42248.     | dwLen |
  42249.     dwLen := DWORDBytes fromInteger: 123.
  42250.     VersionLibrary default verQueryValue: fileInfo lpSubBlock: name lplpBuffer: buf puLen: dwLen.
  42251.     ^dwLen asInteger!
  42252.  
  42253. specialBuild
  42254.     "Answer the <readableString> product name from the receiver."
  42255.  
  42256.     ^self at: 'SpecialBuild'! !
  42257.  
  42258. VideoLibrary comment:
  42259. 'VideoLibrary is represents a collection of VideoTapes that belong to a particular owner. This class is part of the Video Library sample package. Please see the package comment for more details.'!
  42260. !VideoLibrary class methodsFor!
  42261.  
  42262. default
  42263.     "Answer the default instance of the receiver."
  42264.  
  42265.     DefaultInstance isNil ifTrue: [
  42266.         DefaultInstance := self new ].
  42267.     ^DefaultInstance !
  42268.  
  42269. icon
  42270.     "Answers an Icon that can be used to represent this class"
  42271.  
  42272.     ^##(self) defaultIcon!
  42273.  
  42274. new
  42275.     "Answer a new, initialised, instance of the receiver.
  42276.  
  42277.     Illustrated Patterns:
  42278.     Instance Initialization
  42279.     "
  42280.  
  42281.     ^super new initialize!
  42282.  
  42283. uninitialize
  42284.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  42285.  
  42286.     DefaultInstance := nil! !
  42287.  
  42288. !VideoLibrary methodsFor!
  42289.  
  42290. defaultOwner    
  42291.     "Private - Answer a <readableString> to use as the owner identifier for a default instance.
  42292.  
  42293.     Illustrated Patterns:
  42294.     Constant Access Method
  42295.     Private Method
  42296.     "
  42297.  
  42298.     ^'My Video Collection'!
  42299.  
  42300. displayOn: aStream
  42301.     "Append, to aStream, a String whose characters are a description of the receiver as a user
  42302.     would want to see it."
  42303.  
  42304.     aStream
  42305.         display: self owner;
  42306.         nextPutAll: ', ';
  42307.         display: self tapes size;
  42308.         nextPutAll: ' tapes'
  42309. !
  42310.  
  42311. initialize
  42312.     "Private - Initialize the receiver to contain default values.
  42313.  
  42314.     Illustrated Patterns
  42315.     Instance Initialization
  42316.     "
  42317.  
  42318.     tapes := OrderedCollection new.
  42319.     owner := self defaultOwner.!
  42320.  
  42321. owner
  42322.     "Answer the <readableString> owner name of the receiver.
  42323.  
  42324.     Illustrated Patterns:
  42325.     Accessor Method"
  42326.  
  42327.     ^owner!
  42328.  
  42329. owner: ownerName
  42330.     "Initialize the receiver with the <readableString> ownerName
  42331.  
  42332.     Illustrated Patterns:
  42333.     Accessor Method"
  42334.  
  42335.     owner :=  ownerName.
  42336. !
  42337.  
  42338. printOn: aStream
  42339.     "Append, to aStream, a String whose characters are a description of the receiver as a developer
  42340.     would want to see it."
  42341.  
  42342.     self basicPrintOn: aStream.
  42343.     aStream
  42344.         nextPut: $(;
  42345.         display: self;
  42346.         nextPut: $)
  42347. !
  42348.  
  42349. tapes
  42350.     "Answer the <collection> of tapes held by the receiver.
  42351.  
  42352.     Illustrated Patterns
  42353.     Accessor Method
  42354.     "
  42355.  
  42356.     ^tapes! !
  42357.  
  42358. VideoRecording comment:
  42359. 'VideoRecording is represents a programme recorded on a VideoTape. This class is part of the Video Library sample package. Please see the package comment for more details.'!
  42360. !VideoRecording class methodsFor!
  42361.  
  42362. icon
  42363.     "Answers an Icon that can be used to represent this class"
  42364.  
  42365.     ^##(self) defaultIcon!
  42366.  
  42367. new
  42368.     "Answer a new, initialised, instance of the receiver.
  42369.  
  42370.     Illustrated Patterns:
  42371.     Instance Initialization
  42372.     "
  42373.  
  42374.     ^super new initialize! !
  42375.  
  42376. !VideoRecording methodsFor!
  42377.  
  42378. date
  42379.     "Answer the <Date> date when the receiver was aired.
  42380.  
  42381.     Illustrated Patterns:
  42382.     Accessor Method"
  42383.  
  42384.     ^date!
  42385.  
  42386. date: recordingDate
  42387.     "Set the date of airing of the receiver to <Date> recordingDate.
  42388.  
  42389.     Illustrated Patterns:
  42390.     Accessor Method"
  42391.  
  42392.     date := recordingDate!
  42393.  
  42394. defaultLength
  42395.     "Private - Answer the default length the receiver in minutes.
  42396.  
  42397.     Illustrated Patterns:
  42398.     Constant Access Method
  42399.     Private Method
  42400.     "
  42401.  
  42402.     ^30!
  42403.  
  42404. defaultTitle
  42405.     "Private - Answer a default title to use for the receiver when none other is provided.
  42406.  
  42407.     Illustrated Patterns:
  42408.     Constant Access Method
  42409.     Private Method
  42410.     "
  42411.  
  42412.     ^'<Untitled Recording>'!
  42413.  
  42414. displayOn: aStream
  42415.     "Append, to aStream, a String whose characters are a description of the receiver as a user
  42416.     would want to see it."
  42417.  
  42418.     aStream
  42419.         display: self title;
  42420.         nextPutAll: ' on ';
  42421.         display: self date;
  42422.         nextPutAll: ' at ';
  42423.         display: self time;
  42424.         nextPutAll: ' duration ';
  42425.         display: self length;
  42426.         nextPutAll: 'min'
  42427.  
  42428. !
  42429.  
  42430. initialize
  42431.     "Private - Initialize the receiver to contain default values.
  42432.  
  42433.     Illustrated Patterns
  42434.     Instance Initialization
  42435.     "
  42436.  
  42437.     self 
  42438.         title: self defaultTitle;
  42439.         date: Date today;
  42440.         time: Time now;
  42441.         length: self defaultLength!
  42442.  
  42443. length
  42444.     "Answer the <Integer> length of the receiver in minutes.
  42445.  
  42446.     Illustrated Patterns:
  42447.     Accessor Method"
  42448.  
  42449.     ^length!
  42450.  
  42451. length: lengthInMinutes
  42452.     "Set the duration of the receiver to <Integer> lengthInMinutes.
  42453.  
  42454.     Illustrated Patterns:
  42455.     Accessor Method"
  42456.  
  42457.     length := lengthInMinutes!
  42458.  
  42459. printOn: aStream
  42460.     "Append, to aStream, a String whose characters are a description of the receiver as a developer
  42461.     would want to see it."
  42462.  
  42463.     self basicPrintOn: aStream.
  42464.     aStream
  42465.         nextPut: $(;
  42466.         display: self;
  42467.         nextPut: $)
  42468. !
  42469.  
  42470. time
  42471.     "Answer the <Time> time when the receiver was aired.
  42472.  
  42473.     Illustrated Patterns:
  42474.     Accessor Method"
  42475.  
  42476.     ^time!
  42477.  
  42478. time: recordingTime
  42479.     "Set the time of airing of the receiver to <Time> recordingTime.
  42480.  
  42481.     Illustrated Patterns:
  42482.     Accessor Method"
  42483.  
  42484.     time := recordingTime!
  42485.  
  42486. title
  42487.     "Answer the <readableString> title of the receiver.
  42488.  
  42489.     Illustrated Patterns:
  42490.     Accessor Method"
  42491.  
  42492.     ^title!
  42493.  
  42494. title: titleString
  42495.     "Set the title of the receiver to <readableString> titleString.
  42496.  
  42497.     Illustrated Patterns:
  42498.     Accessor Method"
  42499.  
  42500.     title := titleString! !
  42501.  
  42502. VideoTape comment:
  42503. 'A VideoTape represents a collection of VideoRecordings recorded on a named video cassette. This class is part of the Video Library sample package. Please see the package comment for more details.'!
  42504. !VideoTape class methodsFor!
  42505.  
  42506. defaultTapeLength
  42507.     "Private - Answer a default length (in minutes) to use for instances of the receiver.
  42508.  
  42509.     Illustrated Patterns:
  42510.     Constant Access Method
  42511.     Private Method
  42512.     "
  42513.  
  42514.     ^240!
  42515.  
  42516. icon
  42517.     "Answers an Icon that can be used to represent this class"
  42518.  
  42519.     ^##(self) defaultIcon!
  42520.  
  42521. name: tapeName
  42522.     "Answers an instance of the receiver with the <readableString> tapeName and
  42523.     a default tape length.
  42524.  
  42525.     Illustrated Patterns:
  42526.     Instance Creation Method"
  42527.  
  42528.     ^super new name: tapeName length: self defaultTapeLength
  42529. !
  42530.  
  42531. name: tapeName length: tapeLength
  42532.     "Answers an instance of the receiver with the <readableString> tapeName and
  42533.     the <Integer> length in minutes.
  42534.  
  42535.     Illustrated Patterns:
  42536.     Instance Creation Method"
  42537.  
  42538.     ^super new name: tapeName length: tapeLength
  42539. ! !
  42540.  
  42541. !VideoTape methodsFor!
  42542.  
  42543. displayOn: aStream
  42544.     "Append, to aStream, a String whose characters are a description of the receiver as a user
  42545.     would want to see it."
  42546.  
  42547.     aStream
  42548.         display: self name;
  42549.         nextPutAll: ' E';
  42550.         display: self length
  42551. !
  42552.  
  42553. length
  42554.     "Answer the <Integer> length in minutes of the receiver.
  42555.  
  42556.     Illustrated Patterns
  42557.     Accessor Method
  42558.     "
  42559.  
  42560.     ^length!
  42561.  
  42562. name
  42563.     "Answer the <readableString> name of the receiver.
  42564.  
  42565.     Illustrated Patterns
  42566.     Accessor Method
  42567.     "
  42568.  
  42569.     ^name!
  42570.  
  42571. name: tapeName length: tapeLength
  42572.     "Private - Initialize the receiver with the <readableString> tapeName and
  42573.     the <Integer> length in minutes. 
  42574.  
  42575.     Illustrated Patterns:
  42576.     Instance Variable Role
  42577.     Private Method
  42578.     "
  42579.     name :=  tapeName.
  42580.     length := tapeLength.
  42581.     recordings := OrderedCollection new.!
  42582.  
  42583. printOn: aStream
  42584.     "Append, to aStream, a String whose characters are a description of the receiver as a developer
  42585.     would want to see it."
  42586.  
  42587.     self basicPrintOn: aStream.
  42588.     aStream
  42589.         nextPut: $(;
  42590.         display: self;
  42591.         nextPut: $)
  42592. !
  42593.  
  42594. recordings
  42595.     "Answer the <collection> of recordings held by the receiver.
  42596.  
  42597.     Illustrated Patterns
  42598.     Accessor Method
  42599.     "
  42600.  
  42601.     ^recordings! !
  42602.  
  42603. View comment:
  42604. 'View is an abstract class which is the root of the view hierarchy of classes. Instances of view or its subclasses are used to display Model data in windows. View is part of the Model-View-Presenter or MVP framework:
  42605.  
  42606. SmalltalkSystem help: ''Overviews/ModelViewPresenter''.
  42607.  
  42608. Views are used in conjunction with <model> and <presenter> objects. Model objects are used to hold application data, and the view''s responsibility is to display this data on the screen. Models usually trigger change notification to ensure that the view is kept up-to-date with the current state of their data. Presenter objects sit between the view and the model and negotiate how changes made in the view should be applied to the model. 
  42609.  
  42610. Instance Variables:
  42611.     handle        <ExternalHandle> for the view''s window held by MS Windows.
  42612.     creationParent    <compositeView> which is the parent of the view.
  42613.     creationStyle    <Array> of two elements holding the window''s WS_xxx and WS_EX_xxx styles..
  42614.     presenter        <presenter> used for negotiating changes to the view''s model.
  42615.     model        <Object> holding the view''s data.
  42616.     backcolor        <color> for the explicit view background or nil for the default,
  42617.     preferredExtent    <Point> specifying an explicit preferred extent or nil for none..
  42618.     flags        <integer> holding various <boolean> flags.
  42619.     contextMenu    <Menu> a pop-up context menu or nil if none.
  42620.     font        <Font> for displaying 
  42621.     events        <EventsCollection> holding event subscriptions.
  42622.     interactor        <interactor> that handles mouse and keyboard input, normally the view itself.
  42623.  
  42624. Class Variables:
  42625.     CreateCenteredMask    <integer>
  42626.     DragSourceMask        <integer>
  42627.     DropTargetMask        <integer>
  42628.     LayoutValidMask        <integer>.
  42629.     ManagedMask        <integer>
  42630.     MessageMap        <Array>. Map between Win32 message id''s and View selectors.
  42631.     MinimizedMask        <integer>
  42632.     NextId            <integer>
  42633.     NoInheritMenuMask    <integer>
  42634.     StateRestoringMask        <integer>
  42635.     UIValidMask        <integer>
  42636.     UsePreferredExtentMask    <integer>
  42637.     ViewClosedError        <Signal> raised when operations performed against a closed view
  42638.     WndClassAtom        <integer>
  42639.  
  42640. '!
  42641. !View class methodsFor!
  42642.  
  42643. active
  42644.     "Answers a Dolphin View for the active Window. This may not be
  42645.     a registered Dolphin window (e.g. the Window does not belong to Dolphin
  42646.     or is a control on a dialog template which has not been subclassed).
  42647.  
  42648.     N.B. We deliberately reference View specifically rather than 'self' because
  42649.     if the active window is not a registered Dolphin View then we want an
  42650.     instance of View to represent it, not an instance of whatever subclass
  42651.     sent the #active message."
  42652.  
  42653.     ^View fromHandle: self activeHandle!
  42654.  
  42655. activeHandle
  42656.     "Private - Answers the handle of the current active Window."
  42657.  
  42658.     ^UserLibrary default getActiveWindow!
  42659.  
  42660. capture
  42661.     "Answer the View that has the mouse capture or nil if none."
  42662.  
  42663.     | capturedHandle |
  42664.     capturedHandle :=  UserLibrary default getCapture.
  42665.     ^capturedHandle notNil 
  42666.         ifTrue: [ self withHandle: capturedHandle ] 
  42667.         ifFalse: [].
  42668. !
  42669.  
  42670. closeAll
  42671.     "Private - Ask all top level views to close (they will receiver a WM_CLOSE, which
  42672.     they may refuse). Answer whether all windows are closed."
  42673.  
  42674.     ^(self topLevelViews reject: [ :w | w close ]) isEmpty!
  42675.  
  42676. cursor
  42677.     "Answers the default cursor to be used for the mouse pointer when over instances of the receiver.
  42678.     Answer nil so the default cursor for the window class is used. This can be overridden for entire classes, 
  42679.     or on an instance basis."
  42680.  
  42681.     ^nil!
  42682.  
  42683. defaultId
  42684.     "Private - Answer a new id to use for a View"
  42685.  
  42686.     ^NextId := NextId + 1!
  42687.  
  42688. defaultModel
  42689.     "Answer a default model to be assigned to the receiver when it
  42690.     is initialized. Answer nil for no default. Overidden by subclasses
  42691.     that can provide a more sensible default"
  42692.  
  42693.     ^nil!
  42694.  
  42695. defaultView
  42696.     "Answer the resource name of the default view for the receiver.
  42697.     Subclasses should override this method if they wish to use a different
  42698.     resource name for the default view"
  42699.  
  42700.     ^'Default view'!
  42701.  
  42702. desktop
  42703.     "Answer the Desktop View"
  42704.  
  42705.     ^DesktopView current!
  42706.  
  42707. desktopHandle
  42708.     "Private - Answer the handle of the Desktop window."
  42709.  
  42710.     ^UserLibrary default getDesktopWindow!
  42711.  
  42712. destroyAll
  42713.     "Private - Forcibly close all windows (the Windows will not receiver a WM_CLOSE).
  42714.     This is a rather drastic action in that any unsaved data in any window will be lost."
  42715.  
  42716.     self topLevelViews do: [:w | w destroy].
  42717.     SessionManager inputState purgeDeadWindows!
  42718.  
  42719. editNewDefaultView
  42720.     "Open the View Composer to create a new view for the receiver."
  42721.  
  42722.     | view resName |
  42723.     view := View desktop addSubView: self new.
  42724.     resName := Prompter 
  42725.                 on: self defaultView
  42726.                 prompt: 'Resource name:'
  42727.                 caption: 'Create a view for class ' , self name.
  42728.     resName notNil 
  42729.         ifTrue: 
  42730.             [| resourceIdentifier |
  42731.             resourceIdentifier := ResourceIdentifier class: self name: resName.
  42732.             (resourceIdentifier resourceOrNil isNil or: 
  42733.                     [MessageBox confirm: ('%1 already exists. Do you wish to overwrite it?' 
  42734.                                 formatWith: resourceIdentifier displayString)]) 
  42735.                 ifTrue: 
  42736.                     [resourceIdentifier
  42737.                         assign: ViewResource defaultWritable;
  42738.                         save: view.
  42739.                     view destroy.
  42740.                     Smalltalk developmentSystem openViewComposerOn: resourceIdentifier]]!
  42741.  
  42742. focus
  42743.     "Answers the View with focus or nil if there is none.
  42744.     Implementation Note: We ensure that the answer is a basic View if not
  42745.     a registered view of a specific class. This avoid unpleasant
  42746.     surprises when evaluating 'self class focus' from subclasses, 
  42747.     especially DialogViews created from templates, where the children
  42748.     of the view may not themselves be Dolphin views."
  42749.  
  42750.     | focusHwnd |
  42751.     ^(focusHwnd := self focusHandle) isNil
  42752.         ifTrue: []
  42753.         ifFalse: [
  42754.             "N.B. Reference to specific class rather than self is deliberate"
  42755.             View fromHandle: focusHwnd]!
  42756.  
  42757. focusHandle
  42758.     "Private - Answers handle of the Window with focus, or nil if there is none."
  42759.  
  42760.     ^UserLibrary default getFocus!
  42761.  
  42762. foreground
  42763.     "Answers a Dolphin View for the foreground Window. This may not be
  42764.     a registered Dolphin View (e.g. the Window does not belong to Dolphin
  42765.     or is a control on a dialog template which has not been subclassed).
  42766.  
  42767.     N.B. We deliberately reference View specifically rather than 'self' because
  42768.     if the foreground window is not a registered Dolphin View then we want an
  42769.     instance of View to represent it, not an instance of whatever subclass
  42770.     sent the #foreground message."
  42771.  
  42772.     ^View fromHandle: self foregroundHandle!
  42773.  
  42774. foregroundHandle
  42775.     "Private - Answers handle of the current foreground window."
  42776.  
  42777.     ^UserLibrary default getForegroundWindow!
  42778.  
  42779. frameWidths: styleFlags
  42780.     "Answer the widths of the frames (if any) which will result
  42781.     from the style bits, styleFlags."
  42782.  
  42783.     | xMetric yMetric lib |
  42784.     (styleFlags allMask: WS_DLGFRAME) 
  42785.         ifTrue: [
  42786.             xMetric := SM_CXDLGFRAME.
  42787.             yMetric := SM_CYDLGFRAME]
  42788.         ifFalse: [
  42789.             (styleFlags allMask: WS_THICKFRAME) 
  42790.                 ifTrue: [
  42791.                     xMetric := SM_CXSIZEFRAME.
  42792.                     yMetric := SM_CYSIZEFRAME]
  42793.                 ifFalse: [
  42794.                     (styleFlags allMask: WS_BORDER) ifFalse: [^0@0].
  42795.                     xMetric := SM_CXBORDER.
  42796.                     yMetric := SM_CYBORDER]].
  42797.     
  42798.     lib := UserLibrary default.
  42799.     ^(lib getSystemMetrics: xMetric) @ (lib getSystemMetrics: yMetric)!
  42800.  
  42801. fromHandle: aHandle 
  42802.     "Answers a <View> that has a handle of aHandle (an Integer or
  42803.     ExternalHandle). This method answers a View whether or not
  42804.     aHandle is registered - if it isn't then the object is a temporary
  42805.     created for the purpose. The View will also be correctly wired
  42806.     to its parent, even if that parent is also unknown, and so on.
  42807.     See also #withHandle:, which answers only registered (known)
  42808.     Views."
  42809.  
  42810.     ^SessionManager inputState windowAt: aHandle
  42811.         ifAbsent: 
  42812.             [| unknownView parentView parentHandle |
  42813.             unknownView := self new handle: aHandle.
  42814.  
  42815.             "Locate a suitable parent view"
  42816.             parentHandle := unknownView getParent.
  42817.             parentView := View withHandle: parentHandle.
  42818.             parentView isNil 
  42819.                 ifTrue: 
  42820.                     ["Decide in a suitable class for the parent"
  42821.                     | parentStyle parentClass |
  42822.                     parentStyle := UserLibrary default getWindowLong: parentHandle nIndex: GWL_STYLE.
  42823.                     parentClass := (parentStyle anyMask: WS_CHILD) 
  42824.                                 ifTrue: [ContainerView]
  42825.                                 ifFalse: [ShellView].
  42826.                     parentView := parentClass fromHandle: parentHandle].
  42827.             unknownView parentView: parentView.
  42828.             unknownView]!
  42829.  
  42830. fromPoint: aPoint
  42831.     "Private - Answers the View beneath aPoint (in screen coordinates)."
  42832.  
  42833.     | handleFound |
  42834.     handleFound := UserLibrary default
  42835.         windowFromPoint: aPoint asParameter.
  42836.     ^self fromHandle: handleFound!
  42837.  
  42838. icon
  42839.     "Answers an Icon that can be used to represent this class"
  42840.  
  42841.     ^##(self) defaultIcon!
  42842.  
  42843. initialize
  42844.     "Private - Initialize the receiver's class variables:
  42845.         View initialize
  42846.     "
  42847.  
  42848.     NextId := 4096.
  42849.     LayoutValidMask := 16r1.
  42850.     ManagedMask := 16r2.
  42851.     DragSourceMask := 16r4.
  42852.     DropTargetMask := 16r8.
  42853.     UIValidMask := 16r10.
  42854.     StateRestoringMask := 16r20.
  42855.     CreateCenteredMask := 16r40.
  42856.     MinimizedMask := 16r80.
  42857.     UsePreferredExtentMask := 16r100.
  42858.     NoInheritMenuMask := 16r200.
  42859.     ViewClosedError := Signal description: 'View closed'.
  42860.     self initializeMessageMap!
  42861.  
  42862. initializeMessageMap
  42863.     "Private - Initialize the map of Windows message numbers to the selectors of
  42864.     the low-level event handlers in the receiver.
  42865.     N.B. Must not be stripped, as this is the only thing which prevents the handlers
  42866.     themselves from being stripped.
  42867.         self initializeMessageMap
  42868.     "
  42869.  
  42870.     MessageMap := (Array new: 1024)
  42871.                 at: WM_CREATE + 1 put: #wmCreate:wParam:lParam:;
  42872.                 at: WM_DESTROY + 1 put: #wmDestroy:wParam:lParam:;
  42873.                 at: WM_MOVE + 1 put: nil;
  42874.                 at: WM_SIZE + 1 put: #wmSize:wParam:lParam:;
  42875.                 at: WM_ACTIVATE + 1 put: #wmActivate:wParam:lParam:;
  42876.                 at: WM_SETFOCUS + 1 put: #wmSetFocus:wParam:lParam:;
  42877.                 at: WM_KILLFOCUS + 1 put: #wmKillFocus:wParam:lParam:;
  42878.                 at: WM_PAINT + 1 put: #wmPaint:wParam:lParam:;
  42879.                 at: WM_CLOSE + 1 put: #wmClose:wParam:lParam:;
  42880.                 at: WM_ERASEBKGND + 1 put: #wmEraseBkGnd:wParam:lParam:;
  42881.                 at: WM_SHOWWINDOW + 1 put: #wmShowWindow:wParam:lParam:;
  42882.                 at: WM_NCCREATE + 1 put: #wmNcCreate:wParam:lParam:;
  42883.                 at: WM_NCDESTROY + 1 put: #wmNcDestroy:wParam:lParam:;
  42884.                 at: WM_NCCALCSIZE + 1 put: #wmNcCalcSize:wParam:lParam:;
  42885.                 at: WM_NCHITTEST + 1 put: #wmNcHitTest:wParam:lParam:;
  42886.                 at: WM_NCPAINT + 1 put: #wmNcPaint:wParam:lParam:;
  42887.                 at: WM_NOTIFY + 1 put: #wmNotify:wParam:lParam:;
  42888.                 at: WM_PARENTNOTIFY + 1 put: #wmParentNotify:wParam:lParam:;
  42889.                 at: WM_CHAR + 1 put: #wmChar:wParam:lParam:;
  42890.                 at: WM_INITDIALOG + 1 put: #wmInitDialog:wParam:lParam:;
  42891.                 at: WM_COMMAND + 1 put: #wmCommand:wParam:lParam:;
  42892.                 at: WM_CONTEXTMENU + 1 put: #wmContextMenu:wParam:lParam:;
  42893.                 at: WM_TIMER + 1 put: #wmTimer:wParam:lParam:;
  42894.                 at: WM_INITMENU + 1 put: #wmInitMenu:wParam:lParam:;
  42895.                 at: WM_INITMENUPOPUP + 1 put: #wmInitMenuPopup:wParam:lParam:;
  42896.                 at: WM_MOUSEMOVE + 1 put: #wmMouseMove:wParam:lParam:;
  42897.                 at: WM_LBUTTONDOWN + 1 put: #wmLButtonDown:wParam:lParam:;
  42898.                 at: WM_LBUTTONUP + 1 put: #wmLButtonUp:wParam:lParam:;
  42899.                 at: WM_LBUTTONDBLCLK + 1 put: #wmLButtonDblClk:wParam:lParam:;
  42900.                 at: WM_RBUTTONDOWN + 1 put: #wmRButtonDown:wParam:lParam:;
  42901.                 at: WM_RBUTTONUP + 1 put: #wmRButtonUp:wParam:lParam:;
  42902.                 at: WM_RBUTTONDBLCLK + 1 put: #wmRButtonDblClk:wParam:lParam:;
  42903.                 at: WM_MBUTTONDOWN + 1 put: #wmMButtonDown:wParam:lParam:;
  42904.                 at: WM_MBUTTONUP + 1 put: #wmMButtonUp:wParam:lParam:;
  42905.                 at: WM_MBUTTONDBLCLK + 1 put: #wmMButtonDblClk:wParam:lParam:;
  42906.                 at: WM_HSCROLL + 1 put: #wmHScroll:wParam:lParam:;
  42907.                 at: WM_VSCROLL + 1 put: #wmVScroll:wParam:lParam:;
  42908.                 at: WM_SETCURSOR + 1 put: #wmSetCursor:wParam:lParam:;
  42909.                 at: WM_QUERYENDSESSION + 1 put: #wmQueryEndSession:wParam:lParam:;
  42910.                 at: WM_DRAWITEM + 1 put: #wmDrawItem:wParam:lParam:;
  42911.                 at: WM_KEYDOWN + 1 put: #wmKeyDown:wParam:lParam:;
  42912.                 at: WM_KEYUP + 1 put: #wmKeyUp:wParam:lParam:;
  42913.                 at: WM_SYSKEYDOWN + 1 put: #wmSysKeyDown:wParam:lParam:;
  42914.                 at: WM_SYSKEYUP + 1 put: #wmSysKeyUp:wParam:lParam:;
  42915.                 at: WM_SYSDEADCHAR + 1 put: #wmSysDeadChar:wParam:lParam:;
  42916.                 at: WM_SYSCOLORCHANGE + 1 put: #wmSysColorChange:wParam:lParam:;
  42917.                 at: WM_CTLCOLORMSGBOX + 1 put: #wmCtlColor:wParam:lParam:;
  42918.                 at: WM_CTLCOLOREDIT + 1 put: #wmCtlColor:wParam:lParam:;
  42919.                 at: WM_CTLCOLORLISTBOX + 1 put: #wmCtlColor:wParam:lParam:;
  42920.                 at: WM_CTLCOLORBTN + 1 put: #wmCtlColor:wParam:lParam:;
  42921.                 at: WM_CTLCOLORDLG + 1 put: #wmCtlColor:wParam:lParam:;
  42922.                 at: WM_CTLCOLORSCROLLBAR + 1 put: #wmCtlColor:wParam:lParam:;
  42923.                 at: WM_CTLCOLORSTATIC + 1 put: #wmCtlColor:wParam:lParam:;
  42924.                 at: WM_GETDLGCODE + 1 put: #wmGetDlgCode:wParam:lParam:;
  42925.                 at: WM_BEGINDRAG + 1 put: #wmBeginDrag:wParam:lParam:;
  42926.                 at: BM_SETSTYLE + 1 put: #bmSetStyle:wParam:lParam:;
  42927.                 at: WM_ENTERIDLE + 1 put: #wmEnterIdle:wParam:lParam:;
  42928.                 at: WM_IDLEUPDATECMDUI + 1 put: #wmIdleUpdateCmdUI:wParam:lParam:;
  42929.                 at: WM_WINDOWPOSCHANGING + 1 put: #wmWindowPosChanging:wParam:lParam:;
  42930.                 at: WM_WINDOWPOSCHANGED + 1 put: #wmWindowPosChanged:wParam:lParam:;
  42931.                 at: WM_ENTERMENULOOP + 1 put: #wmEnterMenuLoop:wParam:lParam:;
  42932.                 at: WM_EXITMENULOOP + 1 put: #wmExitMenuLoop:wParam:lParam:;
  42933.                 at: WM_CANCELMODE + 1 put: #wmCancelMode:wParam:lParam:;
  42934.                 at: WM_CAPTURECHANGED + 1 put: #wmCaptureChanged:wParam:lParam:;
  42935.                 at: WM_MOUSEWHEEL + 1 put: #wmMouseWheel:wParam:lParam:;
  42936.                 at: WM_GETMINMAXINFO + 1 put: #wmGetMinMaxInfo:wParam:lParam:;
  42937.                 yourself!
  42938.  
  42939. makeResource: aStringName inClass: aClass
  42940.     "Private - Save and instance of the receiver as a default writable ViewResource 
  42941.     called aString owned by aClass."
  42942.  
  42943.     | resID view shell |
  42944.     shell := ShellView new create.
  42945.     view := shell addSubView: self new.
  42946.     (resID := ResourceIdentifier class: aClass name: aStringName)
  42947.         assign: (ViewResource defaultWritable);
  42948.         save: view.
  42949.     shell destroy.
  42950.     ^resID!
  42951.  
  42952. mapRectangle: aRectangle from: aSourceView to: aDestinationView
  42953.     "Answers a RECT like aRectangle mapped from the coordinate system of aSourceView 
  42954.     into that of aDestinationView"
  42955.  
  42956.     | rect |
  42957.     rect := RECT fromRectangle: aRectangle.
  42958.     UserLibrary default
  42959.         mapWindowPoints: aSourceView asParameter
  42960.         hWndTo: aDestinationView asParameter
  42961.         lpPoints: rect
  42962.         cPoints: 2.
  42963.     ^rect
  42964. !
  42965.  
  42966. messageMap
  42967.     "Private - Answer the map between Win32 message numbers and selectors"
  42968.  
  42969.     ^MessageMap!
  42970.  
  42971. new
  42972.     "Answer a new, initialized, instance of the receiver."
  42973.  
  42974.     ^super new initialize!
  42975.  
  42976. onExit
  42977.     "Clean up the residue on Dolphin exit."
  42978.  
  42979.     self destroyAll.        "Destroy rather than close as more forcible and avoids save prompts"
  42980.     self unregisterClass!
  42981.  
  42982. onStartup
  42983.     "Perform post startup processing to initialize the View system"
  42984.  
  42985.     WndClassAtom := nil.
  42986.  
  42987.     self allSubclassesDo: [:c |
  42988.         (c class includesSelector: #onStartup) ifTrue: [c onStartup]].
  42989.  
  42990.     "Load the Common Control Library."
  42991.     CommCtrlLibrary openDefault.
  42992.  
  42993.     "We start some distance away from the standard Windows IDs for command buttons
  42994.     such as IDOK, etc, to avoid any clashes now or in future."
  42995.     NextId := 4096.
  42996.  
  42997.     "Register a hot key so that Ctrl+Break does not cancel dialogs (closes user interrupt walkback)"
  42998.     UserLibrary default registerHotKey: nil id: 0 fsModifiers: MOD_CONTROL vk: VK_CANCEL!
  42999.  
  43000. publishedAspectsOfInstances
  43001.     "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  43002.  
  43003.     | aspects |
  43004.     aspects := super publishedAspectsOfInstances.
  43005.     aspects
  43006.         add: (Aspect boolean: #hasBorder);
  43007.         add: (Aspect boolean: #hasClientEdge);
  43008.         add: (Aspect boolean: #hasStaticEdge);
  43009.         add: (Aspect boolean: #usePreferredExtent);
  43010.         add: (Aspect color: #backcolor);
  43011.         add: (Aspect menu: #contextMenu) beImmutable;
  43012.         add: (Aspect name: #position) beImmutable;
  43013.         add: (Aspect name: #extent) beImmutable;
  43014.         add: (Aspect name: #preferredExtent);
  43015.         add: (Aspect font: #font);
  43016.         add: (Aspect boolean: #isTabStop);
  43017.         add: (Aspect boolean: #isGroupStop);
  43018.         add: (Aspect boolean: #isDragSource);
  43019.         add: (Aspect boolean: #isDropTarget);
  43020.         add: (Aspect boolean: #isTransparent);
  43021.         add: (Aspect boolean: #isEnabled);
  43022.         add: (Aspect boolean: #inheritContextMenu);
  43023.         add: (Aspect autostring: #text);
  43024.         add: (Aspect string: #name).
  43025.     ^aspects!
  43026.  
  43027. publishedEventsOfInstances
  43028.         "Answer a Set of Symbols that describe the published events triggered
  43029.         by instances of the receiver."
  43030.     
  43031.         ^super publishedEventsOfInstances
  43032.             add: #actionPerformed;
  43033.             add: #drop:;
  43034.             add: #dragOver:;
  43035.             add: #viewDeactivated;
  43036.             add: #dragEnter:;
  43037.             add: #dragCut:;
  43038.             add: #dragLeave:;
  43039.             add: #focusLost;
  43040.             add: #leftButtonDoubleClicked:;
  43041.             add: #aboutToDisplayMenu:;
  43042.             add: #focusGained;
  43043.             add: #leftButtonPressed:;
  43044.             add: #leftButtonReleased:;
  43045.             add: #viewOpened;
  43046.             add: #rightButtonDoubleClicked:;
  43047.             add: #requestDragImages:;
  43048.             add: #viewClosed;
  43049.             add: #requestDropOperations:;
  43050.             add: #rightButtonPressed:;
  43051.             add: #positionChanged:;
  43052.             add: #rightButtonReleased:;
  43053.             add: #keyPressed:;
  43054.             add: #drag:;
  43055.             add: #keyReleased:;
  43056.             add: #keyTyped:;
  43057.             yourself.
  43058.     !
  43059.  
  43060. registerClass
  43061.     "Private - Register the receivers corresponding Win32 class - answer the class atom.
  43062.     Will work for subclasses that implement at least #winClassName, and 
  43063.     optionally #winClassStyle and #winClassBrush"
  43064.  
  43065.     | atom classStruct |
  43066.     classStruct := (WNDCLASS new)
  43067.                 className: self wndClassName;
  43068.                 lpfnWndProc: VMLibrary default getWndProc;
  43069.                 hInstance: VMLibrary default applicationHandle;
  43070.                 style: self winClassStyle;
  43071.                 hbrBackground: self winClassBrush asParameter;
  43072.                 hIcon: self winClassIcon asParameter;
  43073.                 hCursor: self winClassCursor asParameter;
  43074.                 yourself.
  43075.     atom := UserLibrary default registerClass: classStruct asParameter.
  43076.     ^atom == 0 ifTrue: [UserLibrary default systemError] ifFalse: [atom]!
  43077.  
  43078. registerMessage: aString
  43079.     "Register a named window message, answering the message id to use."
  43080.  
  43081.     ^UserLibrary default registerWindowMessage: aString!
  43082.  
  43083. releaseCapture
  43084.     "Release mouse capture."
  43085.  
  43086.     UserLibrary default releaseCapture!
  43087.  
  43088. reregisterClass
  43089.     "Private - Un-register then re-register receivers corresponding Win32 class."
  43090.  
  43091.     ^self
  43092.         unregisterClass;
  43093.         registerClass
  43094. !
  43095.  
  43096. selectorForMessage: anInteger
  43097.     "Private - Answer the selector for the specified message, or nil if not recognised."
  43098.  
  43099.     ^anInteger < WM_USER 
  43100.         ifTrue: [MessageMap at: anInteger + 1]!
  43101.  
  43102. show
  43103.     "Shows an instance of the receiver as a child of the desktop"
  43104.  
  43105.     ^(self new) showShell; yourself!
  43106.  
  43107. stbConvert: instVarArray fromVersion: verInteger
  43108.     "Convert from earlier version view by updating and answering the array of instance
  43109.     variables (for the View), instVarArray. 
  43110.     Note that versions prior to 10 were common across all Views, but at version 10 the
  43111.     STBViewProxy class was enhanced to support an individual version, and consequently
  43112.     the version may vary by individual class. However it is still necessary to support
  43113.     these earlier conversions, so remember to supersend."
  43114.  
  43115.     | instVars |
  43116.     instVars := instVarArray.
  43117.     verInteger < 1 ifTrue: [instVars := self stbConvertFromVersion0: instVars].
  43118.     verInteger < 2 ifTrue: [instVars := self stbConvertFromVersion1: instVars].
  43119.     verInteger < 3 ifTrue: [instVars := self stbConvertFromVersion2: instVars].
  43120.     verInteger < 4 ifTrue: [instVars := self stbConvertFromVersion3: instVars].
  43121.     verInteger < 5 ifTrue: [instVars := self stbConvertFromVersion4: instVars].
  43122.     verInteger < 6 ifTrue: [instVars := self stbConvertFromVersion5: instVars].
  43123.     verInteger < 8 ifTrue: [instVars := self stbConvertFromVersion7: instVars].
  43124.     verInteger < 9 ifTrue: [instVars := self stbConvertFromVersion8: instVars].
  43125.  
  43126.     ^instVars.!
  43127.  
  43128. stbConvertFromVersion0: array
  43129.     "Private - Perform an STB conversion from a version 0 <View> to version 1.
  43130.     i.e. insert largeIcon/smallIcon inst vars in     ShellView and subclasses."
  43131.  
  43132.     ^array    "No change at this level"!
  43133.  
  43134. stbConvertFromVersion1: array
  43135.     "Private - Perform an STB conversion from a version 1 (or earlier) <View> to version 2."
  43136.  
  43137.     ^array    "No change at this level"
  43138.  
  43139. !
  43140.  
  43141. stbConvertFromVersion2: array
  43142.     "Private - Perform an STB conversion from a version 2 (or earlier) <View> to version 3,
  43143.     i.e. add iconSpacing inst var in ListView and subclasses"
  43144.  
  43145.     ^array    "No change at this level"
  43146. !
  43147.  
  43148. stbConvertFromVersion3: array
  43149.     "Private - Perform an STB conversion from a version 3 (or earlier) <View> to version 4, 
  43150.     i.e. add getInfoTipBlock inst var in IconicListAbstract and subclasses."
  43151.  
  43152.     ^array    "No change at this level"
  43153.  
  43154.  
  43155. !
  43156.  
  43157. stbConvertFromVersion4: array
  43158.     "Private - Perform an STB conversion from a version 4 (or earlier) <View> to version 5,
  43159.     i.e. insert maxExtent/minExtent inst vars in ShellView and subclasses."
  43160.  
  43161.     ^array    "No change at this level"
  43162.  
  43163. !
  43164.  
  43165. stbConvertFromVersion5: array
  43166.     "Private - Perform an STB conversion from a version 5 (or earlier) <View> to version 6,
  43167.     i.e. insert lvStyle inst var in ListView and subclasses."
  43168.  
  43169.     ^array     "No change at this level"!
  43170.  
  43171. stbConvertFromVersion7: array
  43172.     "Private - Perform an STB conversion from a version 7 (or earlier) <View> to version 8,
  43173.     i.e. Add events and unused inst. vars to View."
  43174.  
  43175.     | newArray |
  43176.     newArray := Array new: array size + 2.
  43177.     newArray replaceFrom: 1 to: 10 with: array startingAt: 1.
  43178.     newArray replaceFrom: 13 to: newArray size with: array startingAt: 11.
  43179.     ^newArray
  43180. !
  43181.  
  43182. stbConvertFromVersion8: array
  43183.     "Private - Perform an STB conversion from a version 8 (or earlier) <View> to version 9,
  43184.     i.e. convert defaultButton inst. var. of <ShellView> and subclasses to integer id."
  43185.  
  43186.     ^array     "No change at this level"!
  43187.  
  43188. stbConvertProxy: anSTBViewProxy
  43189.     "Convert from earlier version view proxy by updating it in-place."
  43190.  
  43191.     anSTBViewProxy instVars: (self stbConvert: anSTBViewProxy instVars 
  43192.                             fromVersion: anSTBViewProxy version)!
  43193.  
  43194. stbVersion
  43195.     "Answer the current binary filer version number for instances of the receiver.
  43196.     Versions up to and include 9 are common, but in Dolphin 4.0 you may now
  43197.     upgrade Views individually. Just override this method to answer a version
  43198.     from 10 and up. See STBViewProxy>>stbVersion for details of the common 
  43199.     version upgrades that have happened to views in the past."
  43200.  
  43201.     ^9    "N.B. One must base off 9, or it will all go horribly wrong."!
  43202.  
  43203. topLevelViews
  43204.     "Answer a Collection containing all top level Dolphin Views.
  43205.     Note that this will include Views which are not Shells (e.g. tool tips)."
  43206.  
  43207.     ^SessionManager inputState topLevelWindows select: [:w | w isKindOf: ##(self)]!
  43208.  
  43209. unregisterClass
  43210.     "Private - Unregister the receivers corresponding Win32 class - answer whether it succeeds."
  43211.  
  43212.     ^UserLibrary default 
  43213.         unregisterClass: self wndClassName 
  43214.         hInstance: VMLibrary default applicationHandle!
  43215.  
  43216. viewClosedError
  43217.     "Answer the exceptionSignaler/exceptionSelector used to signal/catch common
  43218.     control message errors."
  43219.  
  43220.     ^ViewClosedError!
  43221.  
  43222. winClassBrush
  43223.     "Private - Answer the default class background brush handle to be used for instances 
  43224.     of the receiver. We use one of the standard system colours (adding 1 as required)"
  43225.  
  43226.     ^COLOR_WINDOW + 1!
  43227.  
  43228. winClassCursor
  43229.     "Private - Answer the default icon handle to be used for instances of the receiver.
  43230.     Implementation Note: Avoid creating a dependency on Cursor class."
  43231.  
  43232.     ^UserLibrary default loadCursor: nil lpCursorName: IDC_ARROW!
  43233.  
  43234. winClassIcon
  43235.     "Private - Answer the default icon handle to be used for instances of the receiver.
  43236.     Answer null to have windows provide a default icon."
  43237.  
  43238.     ^0!
  43239.  
  43240. winClassName
  43241.     "Private - Answer the Windows class name, or atom, to be used when creating Windows attached
  43242.     to instances of the receiver."
  43243.  
  43244.     WndClassAtom isNil ifTrue: [WndClassAtom := self reregisterClass].
  43245.     ^WndClassAtom!
  43246.  
  43247. winClassStyle
  43248.     "Private - Answer the default class style to be used for instances of the receiver."
  43249.  
  43250.     ^CS_DBLCLKS!
  43251.  
  43252. withHandle: aHandle
  43253.     "Private - Answers an open window that has a handle of aHandle (an Integer or
  43254.     ExternalHandle). AllViews is an IdentityDictionary associating SmallInteger
  43255.     window handles to View subinstances. SmallIntegers are used for performance
  43256.     reasons, but this can be changed by using #asExternalHandle instead of #asInteger,
  43257.     although you will need to visit #dispatchMessage:, (and any other direct users 
  43258.     of AllViews)."
  43259.  
  43260.     ^SessionManager inputState windowAt: aHandle ifAbsent: []!
  43261.  
  43262. wndClassName
  43263.     "Private - Answer the Windows class name to be registered with Win32 for instances of the receiver.
  43264.     Typically it is not necessary to override this message when creating custom views, the exceptional
  43265.     cases being when one wants different attributes associated with the Window class than the Dolphin
  43266.     defaults."
  43267.  
  43268.     ^'DolphinWindow'! !
  43269.  
  43270. !View methodsFor!
  43271.  
  43272. actualFont
  43273.     "Private - Answer the actual font to be used to paint text in the receiver.
  43274.     Views which have a nil font inherit their parent's font"
  43275.  
  43276.     self font isNil ifFalse: [ ^self font ].
  43277.     ^self parentView actualFont!
  43278.  
  43279. actualPreferredExtent
  43280.     "Private - Answer the preferred extent of the receiver that should be
  43281.     used by a layout manager during it's layout process. A preferred
  43282.     extent can be forced by setting the #preferredExtent aspect or it may be calculated
  43283.     in #calculateExtent"
  43284.  
  43285.     ^self preferredExtent notNil
  43286.         ifTrue: [ self preferredExtent ]
  43287.         ifFalse: [ self calculateExtent ].!
  43288.  
  43289. addSubView: aView
  43290.     "Adds aView as a subview of the receiver. Informs the receiver that the view
  43291.     has been added"
  43292.  
  43293.     self basicAddSubView: aView.
  43294.     self onSubViewAdded: aView.
  43295.     ^aView.!
  43296.  
  43297. addToCommandRoute: route
  43298.     "Update the <OrderedCollection>, path, with the receiver's contribution to the command path
  43299.     held by the <CommandPolicy>, route. Answer the next <Presenter> to visit.
  43300.     The receiver is guaranteed not to be on the command path already.
  43301.     Implementation Note: By default we fire it straight back."
  43302.  
  43303.     ^route appendPresenter: self!
  43304.  
  43305. allParents
  43306.     "Answers an <sequencedReadableCollection> of all parents of the receiver including, ultimately,
  43307.     the desktop."
  43308.  
  43309.     ^self isOpen 
  43310.         ifTrue: [ | p ps s |
  43311.             p := self parentView.
  43312.             ps := p allParents.
  43313.             s := ps size + 1.
  43314.             (Array new: s)
  43315.                 at: 1 put: p;
  43316.                 replaceFrom: 2 to: s with: ps startingAt: 1;
  43317.                 yourself]
  43318.         ifFalse: [#()]!
  43319.  
  43320. allSubViews
  43321.     "Answers an OrderedCollection of all sub views of the receiver"
  43322.  
  43323.     | answer |
  43324.     answer := OrderedCollection new.
  43325.     self subViews do: 
  43326.             [:each | 
  43327.             answer add: each.
  43328.             answer addAll: each allSubViews].
  43329.     ^answer!
  43330.  
  43331. arrangement
  43332.     "Answer the arrangement parameter for the receiver in its parent's 
  43333.     layout manager. If no parameter has been explicitly set, or if the
  43334.     parent has no layout manager then answer nil"
  43335.  
  43336.     ^self parentView arrangementOf: self.
  43337. !
  43338.  
  43339. arrangement: anObject
  43340.     "Set the arrangement parameter for the receiver in its parent's 
  43341.     layout manager to be anObject. If the parent has no layout manager 
  43342.     then a walkback will result"
  43343.  
  43344.     self parentView arrangementOf: self put: anObject.
  43345. !
  43346.  
  43347. asParameter
  43348.     "Answer the receiver in a form suitable for passing to an external
  43349.     function call (in this case the receiver's window handle)."
  43350.  
  43351.     ^handle
  43352. !
  43353.  
  43354. attachHandle: anIntegerOrHandle
  43355.     "Private - Set the handle for this View and ensure that it is registered in our
  43356.     AllViews collection. Note that though the View (sub)instance itself
  43357.     holds its handle as an instance of ExternalHandle, AllViews is an 
  43358.     IdentityDictionary keyed by an Integer (which will be a SmallInteger since 
  43359.     window handles are typically small positive numbers). This arrangement
  43360.     permits AllViews to be an IdentityDictionary, and a faster lookup results
  43361.     for the critical message dispatching."
  43362.  
  43363.     handle := anIntegerOrHandle asExternalHandle.
  43364.     SessionManager inputState windowAt: anIntegerOrHandle put: self!
  43365.  
  43366. backcolor
  43367.     "Answers the background colour of the receiver"
  43368.  
  43369.     ^backcolor
  43370. !
  43371.  
  43372. backcolor: aColorOrNil
  43373.     "Sets the background colour of the receiver to aColorOrNil.
  43374.     If aColorOrNil is nil then use the default color"
  43375.  
  43376.     backcolor := aColorOrNil.
  43377.     self invalidate.!
  43378.  
  43379. baseStyle
  43380.     "Private - Answer the receiver's base creation style.
  43381.     N.B. This may not be the receiver's current window style."
  43382.  
  43383.     ^creationStyle at: 1!
  43384.  
  43385. baseStyle: anInteger
  43386.     "Private - Set the receiver's base creation style.
  43387.     N.B. This does not affect the windows current style (see baseStyle:etc)"
  43388.  
  43389.     ^creationStyle at: 1 put: anInteger!
  43390.  
  43391. baseStyle: anInteger maskedBy: aMaskInteger
  43392.     "Private - Copies the bits in anInteger masked by aMaskInteger to the base style
  43393.     of the receiver. This message can be used to both clear and set style bits at the same
  43394.     time (useful where some are mutually exclusive). The bits specified only in aMaskInteger
  43395.     are cleared, while those in anInteger AND aMaskInteger are set.
  43396.     N.B. Most Windows controls are not capable of accepting dynamic style
  43397.     changes so if the style is changed and the receiver is open then the 
  43398.     window will be re-created to apply the new style"
  43399.  
  43400.     self baseStyle: anInteger maskedBy: aMaskInteger recreateIfChanged: true!
  43401.  
  43402. baseStyle: styleBitsToAdd maskedBy: styleBitMask recreateIfChanged: aBoolean 
  43403.     "Private - Copies the bits in styleBitsToAdd masked by styleBitMask to the base style
  43404.     of the receiver. Any bits set in styleBitMask which are not set in styleBitsToAdd
  43405.     will also be reset. If the style was changed, and the window is open, then it is
  43406.     either recreated, or the style long is set, depending on aBoolean."
  43407.  
  43408.     | baseStyle newBaseStyle |
  43409.     baseStyle := self baseStyle.
  43410.     newBaseStyle := baseStyle maskClear: styleBitMask.
  43411.     newBaseStyle := newBaseStyle maskSet: (styleBitsToAdd bitAnd: styleBitMask).
  43412.     newBaseStyle = baseStyle ifTrue: [^self].
  43413.     self baseStyle: newBaseStyle.
  43414.     self isOpen ifFalse: [^self].
  43415.     "Window is open, so need to recreate or set style long"
  43416.     aBoolean 
  43417.         ifTrue: [self recreate]
  43418.         ifFalse: 
  43419.             [| winStyle newWinStyle |
  43420.             winStyle := self getWindowStyle.
  43421.             newWinStyle := winStyle maskClear: styleBitMask.
  43422.             newWinStyle := newWinStyle maskSet: (styleBitsToAdd bitAnd: styleBitMask).
  43423.             self setWindowStyle: newWinStyle]!
  43424.  
  43425. baseStyleAllMask: anInteger
  43426.     "Private - Answers true if the base creation style bits contains all the bits in anInteger"
  43427.  
  43428.     ^self baseStyle allMask: anInteger.
  43429. !
  43430.  
  43431. baseStyleMask: anInteger set: aBoolean
  43432.     "Private - Sets/clears the base creation style bits in anInteger according to aBoolean.
  43433.     Most Windows controls are not capable of accepting dynamic style
  43434.     changes so if the style is changed and the receiver is open then the 
  43435.     window will be re-created to apply the new style"
  43436.  
  43437.     self baseStyleMask: anInteger set: aBoolean recreateIfChanged: true!
  43438.  
  43439. baseStyleMask: anInteger set: aBoolean recreateIfChanged: recreateIfChanged
  43440.     "Private - Sets/clears the base creation style bits in anInteger according to aBoolean.
  43441.     If the style is changed and the receiver is open then the window will be
  43442.     recreated to apply the new style. If the style was changed then recreate the view
  43443.     if recreateIfChanged is true"
  43444.  
  43445.     self baseStyle: (aBoolean ifTrue: [anInteger] ifFalse: [0])
  43446.         maskedBy: anInteger
  43447.         recreateIfChanged: recreateIfChanged!
  43448.  
  43449. basicAddSubView: aView
  43450.     "Private - Adds aView as a subview of the receiver. Can only be called before aView is realized
  43451.     due to a Windows bug where setParent: does not work reliably. The act of adding the 
  43452.     view realizes it. No notification is generated that this view has been added"
  43453.  
  43454.     aView parentView: self;    show. "Forces creation"
  43455.     ^aView.!
  43456.  
  43457. basicCreateAt: position extent: extentPoint 
  43458.     "Private - Create the Win32 window for the receiver, and answer its handle.
  43459.     N.B. The window may not be properly subclassed - use #createAt:extent: instead."
  43460.  
  43461.     | dwStyle |
  43462.     dwStyle := self baseStyle.
  43463.     ^UserLibrary default 
  43464.         createWindowEx: self extendedStyle
  43465.         lpClassName: self class winClassName
  43466.         lpWindowName: self windowName
  43467.         dwStyle: dwStyle
  43468.         x: position x
  43469.         y: position y
  43470.         nWidth: extentPoint x
  43471.         nHeight: extentPoint y
  43472.         hWndParent: self creationParentView asParameter
  43473.         hMenu: ((dwStyle anyMask: WS_CHILD) ifTrue: [self defaultId])
  43474.         hInstance: VMLibrary default applicationHandle
  43475.         lpParam: nil!
  43476.  
  43477. basicDestroy
  43478.     "Private - As #destroy, but must not be overridden."
  43479.  
  43480.     ^UserLibrary default destroyWindow: handle!
  43481.  
  43482. basicInvalidateLayout
  43483.     "Private - Invalidates the layout of the receiver (only) indicating that the geometry
  43484.     needs to be recalculated. Use #invalidateLayout to fully invalidate the parent chain
  43485.     of views."
  43486.  
  43487.     flags := flags maskClear: LayoutValidMask.!
  43488.  
  43489. basicPaint: message wParam: wParam lParam: lParam 
  43490.     "Private - This window requires painting and this is to be performed in
  43491.     the #onPaintRequired: handler. Generally speaking subclasses should
  43492.     override #onPaintRequired: to implement specialized painting. Note
  43493.      that the return value from #onPaintRequired: is ignored."
  43494.  
  43495.     | user hWnd ps |
  43496.     hWnd := self asParameter.
  43497.     ps := PAINTSTRUCT new.
  43498.     user := UserLibrary default.
  43499.     (user 
  43500.         getUpdateRect: hWnd
  43501.         lpRect: nil
  43502.         bErase: false) 
  43503.             ifTrue: 
  43504.                 [| hdc |
  43505.                 (hdc := user beginPaint: hWnd lpPaint: ps) isNil 
  43506.                     ifFalse: 
  43507.                         ["Rather than use #ifCurtailed: we use an Error handler so can validate and
  43508.                  prevent recursive walkback"
  43509.                         
  43510.                         [self onPaintRequired: (PaintEvent 
  43511.                                     handle: hWnd
  43512.                                     wParam: wParam
  43513.                                     hdc: hdc
  43514.                                     paintStruct: ps)] 
  43515.                                 on: Error
  43516.                                 do: 
  43517.                                     [:e | 
  43518.                                     user endPaint: hWnd lpPaint: ps.
  43519.                                     e pass]].
  43520.                 user endPaint: hWnd lpPaint: ps]
  43521.             ifFalse: 
  43522.                 ["No update region, therefore assume an internal paint. We mustn't call
  43523.              Begin/End paint - see Win32 docs on WM_PAINT."
  43524.                 | canv |
  43525.                 canv := self canvas.
  43526.                 self onPaintRequired: (PaintEvent 
  43527.                             handle: hWnd
  43528.                             wParam: wParam
  43529.                             hdc: canv asParameter
  43530.                             paintStruct: ps).
  43531.                 canv free].
  43532.     ^0    "We've handled it"!
  43533.  
  43534. beActive
  43535.     "Make the receiver the active window."
  43536.  
  43537.     ^UserLibrary default setActiveWindow: self asParameter!
  43538.  
  43539. beDefaultThemed
  43540.     "Restores the default visual theme for the receiver. Only effective on Windows XP and above"
  43541.  
  43542.     OSVERSIONINFO current isWinXP 
  43543.         ifTrue: 
  43544.             [ThemeLibrary default 
  43545.                 setWindowTheme: self handle
  43546.                 pszSubAppName: nil
  43547.                 pszSubIdList: nil]!
  43548.  
  43549. beForeground
  43550.     "Make the receiver the foreground window."
  43551.  
  43552.     ^UserLibrary default setForegroundWindow: self asParameter!
  43553.  
  43554. beNotThemed
  43555.     "Turns off any visual theme for the receiver. Only effective on Windows XP and above"
  43556.  
  43557.     OSVERSIONINFO current isWinXP 
  43558.         ifTrue: 
  43559.             [ThemeLibrary default 
  43560.                 setWindowTheme: self handle
  43561.                 pszSubAppName: '' asUnicodeString
  43562.                 pszSubIdList: '' asUnicodeString]!
  43563.  
  43564. beNotTopMost
  43565.     "Places the receiver above all non-topmost windows (that is, behind all topmost windows).
  43566.     This has no effect if the window is already a non-topmost window.
  43567.     Answers whether the operation was successful."
  43568.  
  43569.     ^self zOrderAfter: HWND_NOTOPMOST!
  43570.  
  43571. bePopupFor: aView
  43572.     "Sets the receiver to be a popup owned by aView"
  43573.  
  43574.     creationParent := aView.
  43575.     self baseStyleMask: WS_POPUP set: true!
  43576.  
  43577. beTopMost
  43578.     "Places the receiver above all non-topmost windows without activating it.
  43579.     The window maintains its topmost position even when it is deactivated.
  43580.     Answers whether the operation was successful."
  43581.  
  43582.     ^self zOrderAfter: HWND_TOPMOST!
  43583.  
  43584. bmSetStyle: message wParam: wParam lParam: lParam
  43585.     "Private - Handler for BM_SETSTYLE message.
  43586.     Implementation Note: This message is only received by Buttons, but we implement here in case
  43587.     we have a generic View referencing a button. Obviously we just accept the default processing."
  43588.  
  43589.     ^nil!
  43590.  
  43591. calcExtentFromClientExtent: aClientExtent
  43592.     "Private - Given aClientExtent calculates the required external view extent
  43593.     that would be required to achieve this taking into account the current
  43594.     window styles etc."
  43595.  
  43596.     | rect |
  43597.     rect := 0@0 extent: aClientExtent.
  43598.     ^(self calcRectangleFromClientRectangle: rect) extent
  43599.  
  43600. !
  43601.  
  43602. calcRectangleFromClientRectangle: aClientRectangle 
  43603.     "Private - Given aClientRectangle calculates the required external view rectangle
  43604.     that would be required to achieve this taking into account the current
  43605.     window styles etc."
  43606.  
  43607.     | rect |
  43608.     rect := RECT fromRectangle: aClientRectangle.
  43609.     UserLibrary default 
  43610.         adjustWindowRectEx: rect
  43611.         dwStyle: self baseStyle
  43612.         bMenu: self hasMenu
  43613.         dwExStyle: self extendedStyle.
  43614.     ^rect asRectangle!
  43615.  
  43616. calculateExtent
  43617.     "Private - Answer an extent for the receiver. By default this is the current
  43618.     extent of the receiver. Subclasses can reimplement it to answer an extent based
  43619.     on the current contents of a view."
  43620.  
  43621.     ^self extent!
  43622.  
  43623. canAcceptSubViews
  43624.     "Answer true if the receiver can accept sub views"
  43625.  
  43626.     ^false!
  43627.  
  43628. canvas
  43629.     "Answer a client canvas for this View"
  43630.  
  43631.     ^Canvas forView: self!
  43632.  
  43633. centerExtent: aPoint within: aParentView
  43634.     "Private - Answer the position to give a view of extent aPoint in order to center it within aParentView."
  43635.  
  43636.     ^(aParentView extent - aPoint) // 2
  43637.  
  43638. !
  43639.  
  43640. clientExtent
  43641.     "Answer a <Point> representing the extent of the receiver's client area."
  43642.  
  43643.     ^self clientRectangle extent!
  43644.  
  43645. clientHeight
  43646.     "Answer the height of the receiver's client area."
  43647.  
  43648.     ^self clientExtent y!
  43649.  
  43650. clientRectangle
  43651.     "Answer a Rectangle containing the bounding rectangle of the receiver's client area."
  43652.  
  43653.     | rect |
  43654.     rect := RECT new.
  43655.     UserLibrary default getClientRect: self asParameter lpRect: rect.
  43656.     ^rect asRectangle!
  43657.  
  43658. clientWidth
  43659.     "Answer the width of the receiver's client area."
  43660.  
  43661.     ^self clientExtent x!
  43662.  
  43663. close
  43664.     "Asks the receiver to close itself, answering whether does actually close."
  43665.  
  43666.     ^self destroy; isOpen not.!
  43667.  
  43668. command: anInteger id: id
  43669.     "Private - Default handler for redirected WM_COMMAND messages.
  43670.      The control-specific notification code is in anInteger."
  43671.  
  43672.     ^nil!
  43673.  
  43674. commandPolicy
  43675.     "Answers a <CommandPolicy> object for routing commands originating from the receiver.
  43676.     This can be overridden by subclasses which wish to use a different routing policy."
  43677.  
  43678.     | policy |
  43679.     policy := (self topShell commandPolicyWithSource: self presenter commandSource) 
  43680.                 asValue.
  43681.     self topShell trigger: #requestCommandPolicy: with: policy.
  43682.     ^policy value!
  43683.  
  43684. commandSource
  43685.     "Answer the <View> starting point for command routing if a UI command
  43686.     is received by the receiver. Can be overridden by subclasses that wish to indicate
  43687.     that their commands should be considered as originating elsewhere. The
  43688.     commandSource is typically at the head of the command route and therefore
  43689.     gets first refusal."
  43690.  
  43691.     ^self
  43692. !
  43693.  
  43694. connectModel
  43695.     "Connect the receiver to its model, wiring events, etc.
  43696.     This method should be overridden by subclasses. There is no need
  43697.     to supersend it, as it is provided only as a hook."!
  43698.  
  43699. contextMenu
  43700.     "Answer a context menu to use for the receiver
  43701.     If none then answer nil to indicate no context menu"
  43702.  
  43703.     ^contextMenu
  43704. !
  43705.  
  43706. contextMenu: aMenuOrNil
  43707.     "Set a per instance context menu to use for the receiver"
  43708.  
  43709.     contextMenu := aMenuOrNil
  43710. !
  43711.  
  43712. create
  43713.     "Private - Creates a window with
  43714.         creationParent (or the desktop if nil),
  43715.         creationStyle,
  43716.         default position,
  43717.         default size."
  43718.  
  43719.     creationParent isNil ifTrue: [self parentView: self class desktop].
  43720.     ^self
  43721.         createAt: (self defaultPositionWithin: creationParent forExtent: self defaultExtent)
  43722.         extent: self defaultExtent!
  43723.  
  43724. createAt: position extent: extentPoint
  43725.     "Private - Create the View window ensuring it has the VM window procedure.
  43726.     Answer the receiver."
  43727.  
  43728.     self hookWindowCreate.
  43729.     self unhookWindowCreate: (self basicCreateAt: position extent: extentPoint)!
  43730.  
  43731. creationParentView
  43732.     "Private - Answer the View where the receiver must be created"
  43733.  
  43734.     ^creationParent!
  43735.  
  43736. cursor
  43737.     "Answers the cursor to be used while over the client area of the receiver. Subclasses
  43738.     can override this to provide instance specific cursors."
  43739.  
  43740.     ^self class cursor
  43741. !
  43742.  
  43743. cursorPosition
  43744.     "Answer the position of the cursor in the receiver's co-ordinate system."
  43745.  
  43746.     ^self class desktop mapPoint: Cursor position to: self!
  43747.  
  43748. ddCut: session
  43749.     "Private - The <DragDropSession>, session, has just completed a successful move operation.
  43750.     The dragged object(s) now need to be cut from the drag source. We forward this on to the
  43751.     higher level protocol, going first to the Presenter, which will usually reflect back here, 
  43752.     and the receiver will then usually trigger an event which is typically observed by higher
  43753.     level presenters."
  43754.  
  43755.     self presenter dragCut: session!
  43756.  
  43757. ddDrop: session
  43758.     "Private - The drag operation described by the <DragDropSession>, session,
  43759.     would like to do a drop over the receiver.  Answer whether or not the drop
  43760.     was accepted.
  43761.     Implementation Note: We forward this on to the higher level protocol, going first 
  43762.     to the Presenter, which will usually reflect back here, and the receiver will then 
  43763.     usually trigger an event which is typically observed by higher level presenters."
  43764.  
  43765.     ^self presenter drop: session!
  43766.  
  43767. ddEnter: session
  43768.     "Private - The drag operation described by the <DragDropSession>, session,
  43769.     has entered the receiver's window.  We forward this on to the
  43770.     higher level protocol, going first to the Presenter, which will usually reflect back here, 
  43771.     and the receiver will then usually trigger an event which is typically observed by higher
  43772.     level presenters."
  43773.  
  43774.     self presenter dragEnter: session!
  43775.  
  43776. ddGetImages: session
  43777.     "Private - The <DragDropSession>, session, has been initiated from the receiver and 
  43778.     this is our opportunity to supply custom drag images.  We forward this on to the
  43779.     higher level protocol, going first to the Presenter, which will usually reflect back here, 
  43780.     and the receiver will then usually trigger an event which is typically observed by higher
  43781.     level presenters."
  43782.  
  43783.     self presenter requestDragImages: session!
  43784.  
  43785. ddGetObjects: session
  43786.     "Private - The <DragDropSession>, session, has been initiated from the receiver and a 
  43787.     collection of the objects to be dragged is required. We forward this on to the
  43788.     higher level protocol, going first to the Presenter, which will usually reflect back here, 
  43789.     and the receiver will then usually trigger an event which is typically observed by higher
  43790.     level presenters."
  43791.  
  43792.     self presenter requestDragObjects: session!
  43793.  
  43794. ddLeave: session
  43795.     "Private - The drag operation described by the <DragDropSession>, session,
  43796.     has left the receiver's window.  We forward this on to the
  43797.     higher level protocol, going first to the Presenter, which will usually reflect back here, 
  43798.     and the receiver will then usually trigger an event which is typically observed by higher
  43799.     level presenters."
  43800.  
  43801.     self presenter dragLeave: session!
  43802.  
  43803. ddOperations: session
  43804.     "Private - The drag operation described by the <DragDropSession>, session,
  43805.     wishes to perform an extended (right button) drop, and needs to know what
  43806.     operations are available for the pop-up menu. We forward this on to the
  43807.     higher level protocol, going first to the Presenter, which will usually reflect back here, 
  43808.     and the receiver will then usually trigger an event which is typically observed by higher
  43809.     level presenters."
  43810.  
  43811.     self presenter requestDropOperations: session!
  43812.  
  43813. ddOver: aDragDropSession
  43814.     "Private - The drag operation described by the <DragDropSession> argument 
  43815.     has moved to a new position over the receiver's window. We do a little hit test
  43816.     calculation to determine whether the new drag position is over the receiver's scroll
  43817.     regions before forwarding the notification on to the higher level protocol, going first 
  43818.     to the Presenter, which will usually reflect back here,  and the receiver will then 
  43819.     usually trigger an event which is typically observed by higher level presenters."
  43820.  
  43821.     "First test to see if we're in the drop scroll zone. Inform the session
  43822.     which will then send us #dropScroll: messages as appropriate"
  43823.  
  43824.     | pt rect |
  43825.     pt := aDragDropSession dragPointInView: self.
  43826.     rect := self clientRectangle insetBy: aDragDropSession defaultScrollInset.
  43827.     aDragDropSession isInDropTargetScrollZone: (rect containsPoint: pt) not.
  43828.  
  43829.     "Now just ask the presenter to perform any drop highlighting"
  43830.     self presenter dragOver: aDragDropSession!
  43831.  
  43832. ddScroll: session
  43833.     "Private - The drag operation described by the <DragDropSession>, session,
  43834.     is over the scroll region of the receiver's window.  We respond by scrolling the
  43835.     the receiver's window using standard scroll messages. Note that this message
  43836.     has no equivalent in the higher level 'drop target' protocol."
  43837.  
  43838.     | pt rect horz vert |
  43839.  
  43840.     pt := session dragPointInView: self.
  43841.     rect := self clientRectangle insetBy: session defaultScrollInset.
  43842.  
  43843.     pt x < rect left ifTrue: [ horz := SB_LINEUP ].
  43844.     pt x >= rect right ifTrue: [ horz := SB_LINEDOWN ].
  43845.     pt y < rect top ifTrue: [ vert := SB_LINEUP ].
  43846.     pt y >= rect bottom ifTrue: [ vert := SB_LINEDOWN ].
  43847.  
  43848.     session hideDragImage.
  43849.     horz notNil ifTrue: [ self sendMessage: WM_HSCROLL wParam: horz ].
  43850.     vert notNil ifTrue: [ self sendMessage: WM_VSCROLL wParam: vert ].
  43851.     session showDragImage.!
  43852.  
  43853. defaultExtent
  43854.     "Private - Answer the default size of the receiver. This is used only to
  43855.     set the size of a view when it is created. Thereafter preferredExtent is
  43856.     used when the desired size of a view is requested."
  43857.  
  43858.     ^##(100 @ 100)!
  43859.  
  43860. defaultExtentOf: subView
  43861.     "Private - Answer the default extent of subView within the receiver."
  43862.  
  43863.     ^self extent // 1.1!
  43864.  
  43865. defaultExtentWithin: aParentView
  43866.     "Private - Answer the default extent of the receiver within aParentView."
  43867.  
  43868.     ^aParentView defaultExtentOf: self!
  43869.  
  43870. defaultId
  43871.     "Private - Answer the id to be used when the receiver is created 
  43872.     as a child window (top-level windows do not have ids).
  43873.     Implementation Note: Allocate an id from the sequentially increasing
  43874.     counter (reset on image startup)."
  43875.  
  43876.     ^self class defaultId!
  43877.  
  43878. defaultPositionWithin: aParentView forExtent: aPoint
  43879.     "Private - Answer the default position of the receiver within aParentView given its intended extent aPoint.
  43880.     This is used only on creation."
  43881.  
  43882.     ^0@0!
  43883.  
  43884. defaultShowStyle
  43885.     ^SW_SHOW!
  43886.  
  43887. defaultStyle
  43888.     "Private - Answer the default window creation style as a two element Array
  43889.     The first element contains the standard Windows style bits, the second contains
  43890.     the extended style bits."
  43891.  
  43892.     ^Array with: self defaultWindowStyle with: self defaultWindowExStyle
  43893. !
  43894.  
  43895. defaultWindowExStyle
  43896.     "Private - Answer the default extended window creation style"
  43897.  
  43898.     ^0!
  43899.  
  43900. defaultWindowProcessing: anEvent
  43901.     "Pass an event to the 'default' window procedure of the receiver."
  43902.  
  43903.     ^self defaultWindowProcessing: anEvent message wParam: anEvent wParam lParam: anEvent lParam!
  43904.  
  43905. defaultWindowProcessing: message wParam: wParam lParam: lParam
  43906.     "Private - Pass an event to the 'default' window procedure of the receiver.
  43907.     Overridden by subclasses which need to pass the message to a previous 
  43908.     window procedure (e.g. see ControlView).
  43909.     This method should be called by subclasses when they need to perform default    
  43910.     window processing before some of their own processing in response to a message
  43911.     The normal option is to return a value which cannot be converted to an LRESULT
  43912.     (usually nil) so that the VM's window procedure does the job for us, but this
  43913.     method can be used where more flexibility in ordering is required."
  43914.  
  43915.     ^UserLibrary default 
  43916.         defWindowProc: self asParameter 
  43917.             msg: message 
  43918.             wParam: wParam 
  43919.             lParam: lParam!
  43920.  
  43921. defaultWindowStyle
  43922.     "Private - Answer the default basic window creation style.
  43923.     If the view is later given a parent then WS_CHILD will be set.
  43924.     Implementation Note: We use WS_CLIPSIBLINGS because we dynamically
  43925.     move windows around, and this prevents any possibility of overpainting.
  43926.     Note that it has no effect on non-child windows which have this style
  43927.     foisted upon them."
  43928.  
  43929.     ^WS_CLIPSIBLINGS!
  43930.  
  43931. destroy
  43932.     "Force the receiver closed. N.B. The receiver will receive WM_DESTROY
  43933.     and WM_NCDESTROY messages, but not a WM_CLOSE (Default window processing
  43934.     for WM_CLOSE is to call DestroyWindow)."
  43935.  
  43936.     ^self basicDestroy!
  43937.  
  43938. disable
  43939.     "Disable the receiver from receiving input events."
  43940.  
  43941.     self isEnabled: false!
  43942.  
  43943. disableRedraw
  43944.     "Disable repaints of the receiver's associated window."
  43945.  
  43946.     self setRedraw: false!
  43947.  
  43948. disconnectFromModel
  43949.     "Private - Remove all event registrations lodged with the current model."
  43950.  
  43951.     model notNil ifTrue: [model removeEventsTriggeredFor: self]!
  43952.  
  43953. dispatchMessage: message wParam: wParam lParam: lParam 
  43954.     "Private - Dispatch a message to the first level View message handler, if one
  43955.     exists, answering its result. If the message is not handled in
  43956.     Smalltalk ask for the default window procedure to be invoked.
  43957.     Answer an LRESULT value which is either the result answered by the Dolphin
  43958.     handler, or, if that does not yield an LRESULT, the answer from the 'superclass'
  43959.     window procedure (e.g. the default window procedure)."
  43960.  
  43961.     | answer |
  43962.     answer := (message < WM_USER 
  43963.                 ifTrue: 
  43964.                     ["It's a system message."
  43965.  
  43966.                     | selector |
  43967.                     (selector := MessageMap at: message + 1) notNil 
  43968.                         ifTrue: 
  43969.                             [self 
  43970.                                 perform: selector
  43971.                                 with: message
  43972.                                 with: wParam
  43973.                                 with: lParam]]
  43974.                 ifFalse: 
  43975.                     [message <= WM_USER_LAST 
  43976.                         ifTrue: 
  43977.                             ["It's a user message."
  43978.  
  43979.                             self 
  43980.                                 dispatchUser: message - WM_USER
  43981.                                 wParam: wParam
  43982.                                 lParam: lParam]
  43983.                         ifFalse: 
  43984.                             ["It's a registered message."
  43985.  
  43986.                             self 
  43987.                                 dispatchRegistered: message
  43988.                                 wParam: wParam
  43989.                                 lParam: lParam]]) 
  43990.                     asDword.
  43991.  
  43992.     "We MUST answer an integer value. If one was not provided, then assume default
  43993.     window processing is required."
  43994.     ^answer isInteger 
  43995.         ifTrue: [answer]
  43996.         ifFalse: 
  43997.             [self 
  43998.                 defaultWindowProcessing: message
  43999.                 wParam: wParam
  44000.                 lParam: lParam]!
  44001.  
  44002. dispatchRegistered: registeredId wParam: wParam lParam: lParam
  44003.     "Private - Dispatch the registered message which was sent to the receiver.
  44004.     To be overridden by subclasses which implement registered messages in an appropriate 
  44005.     manner (e.g. by a secondary message map, or, if few in number, by conditional tests)"
  44006.  
  44007.     ^nil        "accept default processing"!
  44008.  
  44009. dispatchUser: userId wParam: wParam lParam: lParam
  44010.     "Private - Dispatch the WM_USER+userId message which was sent to the receiver.
  44011.     To be overridden by subclasses which implement WM_USER+N messages in an appropriate 
  44012.     manner (e.g. by a secondary message map, or, if few in number, by conditional tests)"
  44013.  
  44014.     "Note: A nasty to watch out for here is that dialogs use values in the WM_USER 
  44015.     for standard system messages (e.g. DM_GETDEFID = WM_USER+0).    Therefore, it 
  44016.     is a good idea to base off WM_USER by, for example, 100, to avoid conflicts
  44017.     (especially in ShellViews)."
  44018.  
  44019.     ^nil     "accept default processing"!
  44020.  
  44021. dispatchUser: userId wParam: wParam lParam: lParam map: aLookupTable 
  44022.     "Private - Dispatch the WM_USER+userId message, aWinMSG, which was sent to the receiver, via
  44023.     the message map, aLookupTable (which maps userIds to selectors). A helper
  44024.     function for subclasses implementing #dispatchUser:wParam:lParam:."
  44025.  
  44026.     ^(aLookupTable at: userId ifAbsent: []) ifNotNil: 
  44027.             [:selector | 
  44028.             self 
  44029.                 perform: selector
  44030.                 with: WM_USER + userId
  44031.                 with: wParam
  44032.                 with: lParam]!
  44033.  
  44034. displayOn: aStream
  44035.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  44036.     would want to see it."
  44037.  
  44038.     | description |
  44039.     self displayOnFormats detect: [:each |
  44040.         (description := (self perform: each) displayString).
  44041.         description notNil and:  [description notEmpty]].
  44042.     description size>self displayOnMaxCharacters ifTrue: [
  44043.         description := (description leftString: self displayOnMaxCharacters),'...'].
  44044.     aStream nextPutAll: description.!
  44045.  
  44046. displayOnFormats
  44047.     "Private - Answers an array of selectors that can be used to determine how the receiver is
  44048.     represented as a textual display string by #displayOn:. These selectors are sent in turn
  44049.     until one yields a non-nil, non-empty string as a result. Can be overridden by subclasses to 
  44050.     change the way a view formats itself as text"
  44051.  
  44052.     ^#(name text class)!
  44053.  
  44054. displayOnMaxCharacters
  44055.     "Private - Answers the maximum number of characters to display with #displayOn:"
  44056.  
  44057.     ^24!
  44058.  
  44059. dragCut: session
  44060.     "The <DragDropSession>, session, has just completed a successful move operation.
  44061.     The dragged object(s) now need to be cut from the drag source. Generally speaking
  44062.     only high-level Presenters know how to do this, so we fire off a trigger in the hope
  44063.     that one might be listening."
  44064.  
  44065.     self presenter trigger: #dragCut: with: session!
  44066.  
  44067. dragEnter: aDragDropSession
  44068.     "The drag operation described by the <DragDropSession> argument has entered 
  44069.     the receiver's window. Use the session to provide feedback to the user about 
  44070.     allowable operations etc."
  44071.  
  44072.     self presenter trigger: #dragEnter: with: aDragDropSession!
  44073.  
  44074. dragLeave: aDragDropSession
  44075.     "The drag operation described by the <DragDropSession> argument
  44076.     has left the receiver's window."
  44077.  
  44078.     self presenter trigger: #dragLeave: with: aDragDropSession!
  44079.  
  44080. dragOver: aDragDropSession
  44081.     "The drag operation described by the <DragDropSession> argument
  44082.      has moved to a new position over the receiver's window.
  44083.     Fire a trigger off the presenter to give high level observers a chance
  44084.     to specify the operation and drop target."
  44085.  
  44086.     self presenter trigger: #dragOver: with: aDragDropSession!
  44087.  
  44088. drawFocusRect: rectangle
  44089.     "Draw a focus rectangle defined by rectangle (which can be a RECT or a Rectangle)."
  44090.  
  44091.     | hdc |
  44092.     hdc := self getDC.
  44093.     UserLibrary default drawFocusRect: hdc lprc: rectangle asParameter.
  44094.     self releaseDC: hdc!
  44095.  
  44096. drop: aDragDropSession
  44097.     "The drag operation described by the <DragDropSession> argument has 
  44098.     culminated in a drop over the receiver. Answer whether the drop was successfull
  44099.     so that the Session knows whether to cut the item from the drag source in the case 
  44100.     of a #move operation.
  44101.     Implementation Note: Fire a trigger to permit observers to participate and possibly
  44102.     implement the drop. Observers are expected to set the operation to nil on failure
  44103.     or if they do not want the 'cut from drag source' part of a move operation to be 
  44104.     performed."
  44105.  
  44106.     self presenter trigger: #drop: with: aDragDropSession.
  44107.     ^aDragDropSession operation notNil!
  44108.  
  44109. enable
  44110.     "Enable the receiver to receive input events."
  44111.  
  44112.     self isEnabled: true!
  44113.  
  44114. enableRedraw
  44115.     "Enable repaints of the receiver's associated Window."
  44116.  
  44117.     self setRedraw: true!
  44118.  
  44119. ensureLayoutValid
  44120.     "If the receiver's layout is invalid, then recurse up the tree to check the ensure the 
  44121.     validity of the parent. If the parent did not itself require layout validation, then
  44122.     validate the layout from this point. Answer whether validation was performed."
  44123.  
  44124.     self isLayoutValid ifFalse: [ | parent |
  44125.         ((parent := self parentView) notNil and: [self parentView ensureLayoutValid])
  44126.             ifFalse: [self validateLayout].
  44127.         ^true].
  44128.     ^false
  44129. !
  44130.  
  44131. ensureRectangleVisible: aRectangle
  44132.     "Ensures that the area of the receiver identified by the <Rectangle>, area,
  44133.     (specified in the view's own co-ordinates) is visible in it's parent, assuming
  44134.     that the parent has that level of control."
  44135.  
  44136.     self parentView ensureSubView: self rectangleVisible: aRectangle!
  44137.  
  44138. ensureSubView: aView rectangleVisible: aRectangle
  44139.     "Private - Ensures that the aRectangle area of the aView is visible in
  44140.     the receiver if the parent has this level of control.
  44141.     Should be overridden by subclasses which, for example, can scroll the
  44142.     specified region into view ."
  44143.  
  44144.     self parentView
  44145.         ensureSubView: self 
  44146.         rectangleVisible: (aView mapRectangle: aRectangle to: self)!
  44147.  
  44148. ensureSubViewVisible: aSubView
  44149.     "Ensures that aSubView is visible in the receiver. Overidden by sub views
  44150.     that have this level of control"
  44151.  
  44152.     self ensureVisible
  44153.  
  44154.     !
  44155.  
  44156. ensureVisible
  44157.     "Ensures that the receiver is visible in it's parent if the parent has
  44158.     this level of control"
  44159.  
  44160.     self parentView ensureSubViewVisible: self
  44161.  
  44162.     !
  44163.  
  44164. exStyle: exStyleBitsToSet maskedBy: exStyleBitMask
  44165.     "Private - Copies the bits in anInteger masked by exStyleBitMask to the extended style
  44166.     of the receiver. Most Windows controls are not capable of accepting dynamic style
  44167.     changes so if the style is changed and the receiver is open then the 
  44168.     window will be re-created to apply the new style."
  44169.  
  44170.     self exStyle: exStyleBitsToSet maskedBy: exStyleBitMask recreateIfChanged: true!
  44171.  
  44172. exStyle: exStyleBitsToSet maskedBy: exStyleBitMask recreateIfChanged: aBoolean 
  44173.     "Private - Copies the bits in anInteger masked by exStyleBitMask to the extended style
  44174.     of the receiver. If the style is changed then aBlock is evaluated"
  44175.  
  44176.     | exStyle newExStyle |
  44177.     exStyle := self extendedStyle.
  44178.     newExStyle := exStyle maskClear: exStyleBitMask.
  44179.     newExStyle := newExStyle maskSet: (exStyleBitsToSet bitAnd: exStyleBitMask).
  44180.     newExStyle = exStyle ifTrue: [^self].
  44181.     self extendedStyle: newExStyle.
  44182.     self isOpen ifFalse: [^self].
  44183.     aBoolean ifTrue: [self recreate] ifFalse: [self setWindowExStyle: newExStyle]!
  44184.  
  44185. exStyleAllMask: anInteger
  44186.     "Private - Answers true if the extended creation style bits contains all the bits in anInteger"
  44187.  
  44188.     ^self extendedStyle allMask: anInteger.
  44189. !
  44190.  
  44191. exStyleMask: exStyleBitsMask set: aBoolean
  44192.     "Private - Sets/clears the extended creation style bits in exStyleBitsMask
  44193.     according to aBoolean.
  44194.     Most Windows controls are not capable of accepting dynamic style
  44195.     changes so if the style is changed and the receiver is open then the 
  44196.     window will be re-created to apply the new style"
  44197.  
  44198.     self exStyleMask: exStyleBitsMask set: aBoolean recreateIfChanged: true!
  44199.  
  44200. exStyleMask: exStyleBitMask set: setBoolean recreateIfChanged: recreateBoolean
  44201.     "Private - Sets/clears the extended creation style bits in exStyleBitMask
  44202.     according to setBoolean. If the style is changed and recreateBoolean is
  44203.     true, then request that the window be recreated."
  44204.  
  44205.     self exStyle: (setBoolean ifTrue: [exStyleBitMask] ifFalse: [0])
  44206.         maskedBy: exStyleBitMask
  44207.         recreateIfChanged: recreateBoolean!
  44208.  
  44209. extendedStyle
  44210.     "Private - Answer the receiver's extended creation style.
  44211.     N.B. This may not be the receiver's current extended window style."
  44212.  
  44213.     ^creationStyle at: 2!
  44214.  
  44215. extendedStyle: anInteger
  44216.     "Private - Set the receiver's extended creation style.
  44217.     N.B. This does not affect the style of windows which have already been created
  44218.     (see exStyle:etc..)."
  44219.  
  44220.     ^creationStyle at: 2 put: anInteger!
  44221.  
  44222. extent
  44223.     "Answer the dimensions of the receiver's outer (non-client) window."
  44224.  
  44225.     ^self getWindowRect extent
  44226. !
  44227.  
  44228. extent: aPoint
  44229.     "Set the dimensions of the receiver's outer window to aPoint."
  44230.  
  44231.     aPoint = self extent ifFalse: [
  44232.         self setWindowPosAfter: 0 
  44233.             x: 0 y: 0 
  44234.             width: aPoint x
  44235.             height: aPoint y
  44236.             flags: ##(SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE)].
  44237.  
  44238. !
  44239.  
  44240. fileLocator
  44241.     "Answer the file locator that can be used to locate external files used by the receiver"
  44242.  
  44243.     ^self site getFileLocator!
  44244.  
  44245. filerProxy
  44246.     "Private - Answer a filer proxy that represents the receiver."
  44247.  
  44248.     | filerProxy |
  44249.     filerProxy := STBViewProxy for: self.
  44250.     self isTopView
  44251.         ifTrue: [filerProxy beTopView].
  44252.     ^filerProxy
  44253. !
  44254.  
  44255. findItemHandle: anInteger ifAbsent: exceptionHandler 
  44256.     "Private - Answer the handle of a child window within the receiver with the specified id,
  44257.     or if no such immediate child, then the first child of a child with encountered with that
  44258.     id, and so on. i.e. this is a recursive version of #getItemHandle:ifAbsent:
  44259.     If there is no such child in the receiver, or its children, etc, then answer the result 
  44260.     of evaluating the niladic valuable, exceptionHandler."
  44261.  
  44262.     (self getItemHandle: anInteger ifAbsent: []) 
  44263.         ifNil: 
  44264.             [self subViews do: 
  44265.                     [:each | 
  44266.                     | hWnd |
  44267.                     hWnd := each findItemHandle: anInteger ifAbsent: [].
  44268.                     hWnd isNil ifFalse: [^hWnd]]]
  44269.         ifNotNil: [:hWnd | ^hWnd].
  44270.     ^exceptionHandler value!
  44271.  
  44272. firstSubView
  44273.     "Answers the first sub view of the receiver or nil if there is none"
  44274.  
  44275.     | child |
  44276.     child := self getFirstChild.
  44277.     child isNil ifTrue: [^nil].
  44278.     ^self class withHandle: child
  44279. !
  44280.  
  44281. flash: anInteger
  44282.     "Flash the receiver in a manner so as to attract the user's attention, anInteger times."
  44283.  
  44284.     | canvas rect |
  44285.     canvas := self canvas.
  44286.     rect := self clientRectangle.
  44287.     (1 to: anInteger*2)
  44288.         do: [:i | canvas invertRectangle: rect]
  44289.         separatedBy: [Processor sleep: 65].
  44290.     canvas free
  44291. !
  44292.  
  44293. font
  44294.     "Answer the current font aspect. "
  44295.  
  44296.     ^font
  44297. !
  44298.  
  44299. font: aFontOrNil
  44300.     "Set a new font into the receiver. Setting nil implies that the font
  44301.     should be inherited from the parent"
  44302.  
  44303.     font := aFontOrNil.
  44304.     self isOpen ifTrue: [ self fontChanged ].
  44305. !
  44306.  
  44307. fontChanged
  44308.     "Private - The receiver's font has been changed. The default is to cause
  44309.     the receiver ot repaint. Overidden by subclasses that need to apply the 
  44310.     font to a Windows control"
  44311.  
  44312.     self subViews do: [:each | each fontChanged ].
  44313.     self invalidate; invalidateCalculatedExtent
  44314. !
  44315.  
  44316. forecolor
  44317.     "Answers the foreground colour of the receiver.
  44318.     Overidden by subclasses that support foreground colours"
  44319.  
  44320.     ^Color systemColor: COLOR_WINDOWTEXT
  44321. !
  44322.  
  44323. forecolor: aColorOrNil
  44324.     "Sets the foreground colour of the receiver to aColorOrNil.
  44325.     Overidden by subclasses that support foreground colours"
  44326. !
  44327.  
  44328. forecolorChanged
  44329.     "Private - The receiver's foreground color has been changed. The default is to cause
  44330.     the receiver to repaint"
  44331.  
  44332.     self subViews do: [:each | each forecolorChanged ].
  44333.     self invalidate
  44334. !
  44335.  
  44336. frameWidths
  44337.     "Answer the widths of the frames (if any) configured for the receiver."
  44338.  
  44339.     ^self class frameWidths: self baseStyle!
  44340.  
  44341. getDC
  44342.     "Answer a device context to enable drawing on the receiver."
  44343.  
  44344.     ^UserLibrary default getDC: self asParameter!
  44345.  
  44346. getEvents
  44347.     "Private - Answer the EventsCollection belonging to the receiver, or nil if the receiver
  44348.     has no events registered for it"
  44349.  
  44350.     ^events!
  44351.  
  44352. getFileLocator
  44353.     "Private - Answer the file locator for the receiver. 
  44354.     For normal views this is the default <FileLocator>."
  44355.  
  44356.     ^FileLocator default!
  44357.  
  44358. getFirstChild
  44359.     "Private - Answers the handle of the first child window of the receiver or nil if there is none"
  44360.  
  44361.     ^self getWindow: GW_HWNDCHILD!
  44362.  
  44363. getItem: anInteger
  44364.     "Private - Answer the the receiver's sub view with the specified ID.
  44365.     Note: This method is not only useful for Dialogs, as it can be used any parent-child 
  44366.     pair, as long as the child window has a unique identifier (as specified by the hMenu parameter in 
  44367.     the CreateWindowEx() function that created the child window)."
  44368.  
  44369.     ^self getItem: anInteger ifAbsent: [Win32Error signal]!
  44370.  
  44371. getItem: anInteger ifAbsent: exceptionHandler
  44372.     "Private - Answer the the receiver's sub view with the specified ID, or if there is no such child,
  44373.     then answer the result of evaluating the niladic valuable, exceptionHandler.
  44374.     Note: This method is not only useful for Dialogs, as it can be used any parent-child 
  44375.     pair, as long as the child window has a unique identifier (as specified by the hMenu parameter in 
  44376.     the CreateWindowEx() function that created the child window). By default Dolphin allocates all
  44377.     child windows unique id's.
  44378.  
  44379.     N.B. We deliberately reference View specifically rather than 'self' because
  44380.     if the item is not a registered Dolphin View then we want a generic
  44381.     instance of View to represent it, not an instance of whatever subclass
  44382.     sent the message."
  44383.  
  44384.     ^View fromHandle: (self getItemHandle: anInteger ifAbsent: [^exceptionHandler value])!
  44385.  
  44386. getItemHandle: anInteger ifAbsent: exceptionHandler
  44387.     "Private - Answer the handle of the receiver's sub view with the specified ID, 
  44388.     or if there is no such child, then answer the result of evaluating the niladic 
  44389.     valuable, exceptionHandler.
  44390.     Note: This method is not only useful for Dialogs, as it can be used any parent-child
  44391.     pair, as long as the child window has a unique identifier (as specified by the hMenu parameter in 
  44392.     the CreateWindowEx() function that created the child window). By default Dolphin allocates all
  44393.     child windows unique id's."
  44394.  
  44395.     | hwnd |
  44396.     hwnd := UserLibrary default getDlgItem: self asParameter nIDDlgItem: anInteger.
  44397.     ^hwnd isNil
  44398.         ifTrue: [exceptionHandler value]
  44399.         ifFalse: [hwnd]!
  44400.  
  44401. getParent
  44402.     "Private - Answers the handle of the parent window."
  44403.  
  44404.     ^UserLibrary default getParent: self asParameter!
  44405.  
  44406. getPreviousSibling
  44407.     "Private - Answers the handle of the previous sibling window (in Zorder sequence)
  44408.     of the receiver or nil if there are no more siblings."
  44409.  
  44410.     ^self getWindow: GW_HWNDPREV!
  44411.  
  44412. getScrollInfo: siStruct bar: bar
  44413.     "Private - Get the information about the receivers bar.
  44414.     Answer whether values were retrieved."
  44415.  
  44416.     ^UserLibrary default
  44417.         getScrollInfo: self asParameter fnBar: bar lpsi: siStruct!
  44418.  
  44419. getWindow: anInteger
  44420.     "Private - Answers the handle of the window with the specified relationship to the receiver."
  44421.  
  44422.     ^UserLibrary default getWindow: self asParameter uCmd: anInteger.
  44423. !
  44424.  
  44425. getWindowDC
  44426.     "Private - Answer a device context to enable drawing on the receiver's non client area."
  44427.  
  44428.     ^UserLibrary default getWindowDC: self asParameter!
  44429.  
  44430. getWindowExStyle
  44431.     "Private - Answer the extended window style of the receiver."
  44432.  
  44433.     ^self getWindowLong: GWL_EXSTYLE
  44434. !
  44435.  
  44436. getWindowLong: anInteger
  44437.     "Private - Answer the LONG at the specified offset in the receiver."
  44438.  
  44439.     ^UserLibrary default
  44440.         getWindowLong: self asParameter
  44441.         nIndex: anInteger!
  44442.  
  44443. getWindowRect
  44444.     "Private - Answer a raw (unmapped) RECT containing the bounding rectangle of the receiver's non-client window."
  44445.  
  44446.     | rect |
  44447.     rect := RECT new.
  44448.     UserLibrary default getWindowRect: self asParameter lpRect: rect.
  44449.     ^rect!
  44450.  
  44451. getWindowStyle
  44452.     "Private - Answer the window style of the receiver."
  44453.  
  44454.     ^self getWindowLong: GWL_STYLE
  44455. !
  44456.  
  44457. getWindowText
  44458.     "Private - Answers the text from the receiver"
  44459.  
  44460.     | textLen text |
  44461.     textLen := self textLength.
  44462.     text := String new: textLen.
  44463.     UserLibrary default getWindowText: self asParameter lpString: text nMaxCount: textLen+1.
  44464.     ^text!
  44465.  
  44466. getWndProc
  44467.     "Private - Answer the window procedure of the receiver."
  44468.  
  44469.     ^UserLibrary default getWindowDWORD: self asParameter nIndex: GWL_WNDPROC!
  44470.  
  44471. handle
  44472.     "Private - Answer the receiver's handle (an instance of ExternalHandle or nil)."
  44473.  
  44474.     handle isNil ifTrue: [ self create ].
  44475.     ^handle!
  44476.  
  44477. handle: aHandleOrNil
  44478.     "Private - Set the handle for the receiver. N.B. This is a simple
  44479.     accessor method; set the handle of a View with #attachHandle:"
  44480.  
  44481.     handle := aHandleOrNil!
  44482.  
  44483. hasBorder
  44484.     "Answer whether the receiver has a border (i.e. it has the WS_BORDER style)."
  44485.  
  44486.     ^self baseStyleAllMask: WS_BORDER!
  44487.  
  44488. hasBorder: aBoolean
  44489.     "Sets the receiver to be bordered or not depending on the value of aBoolean.
  44490.     (i.e. sets/clears the WS_BORDER style)."
  44491.  
  44492.     self baseStyleMask: WS_BORDER set: aBoolean.
  44493.     self invalidateLayout
  44494. !
  44495.  
  44496. hasCaption
  44497.     "Answers true if the receiver has a caption bar.
  44498.     i.e. it has the WS_CAPTION style"
  44499.  
  44500.     ^self baseStyleAllMask: WS_CAPTION!
  44501.  
  44502. hasCapture
  44503.     "Answer true if the receiver has captured the mouse."
  44504.  
  44505.     ^self == self class capture!
  44506.  
  44507. hasClientEdge
  44508.     "Answer whether the receiver has the client edge style (a bordering which gives the
  44509.     window a sunken 3D edge)."
  44510.  
  44511.     ^self exStyleAllMask: WS_EX_CLIENTEDGE!
  44512.  
  44513. hasClientEdge: aBoolean
  44514.     "Sets the receiver to have a sunken 3D border (Win95 edging style for
  44515.     controls intended to accept input) or not depending on the value of aBoolean.
  44516.     This is the WS_EX_CLIENTEDGE style."
  44517.  
  44518.     self exStyleMask: WS_EX_CLIENTEDGE set: aBoolean.
  44519.     self invalidateLayout
  44520. !
  44521.  
  44522. hasFocus
  44523.     "Answer true if the receiver has focus"
  44524.  
  44525.     ^self == self class focus!
  44526.  
  44527. hasFocusDeeply
  44528.     "Answer whether the receiver of any of its children, or its children's children, 
  44529.     and so on, has focus.
  44530.     Implementation Note: Walk up the parent chain from the window with focus until we
  44531.     find either the receiver, or the desktop."
  44532.  
  44533.     | hwnd |
  44534.     hwnd := self class focusHandle.
  44535.     [hwnd ~= 0] whileTrue: [
  44536.         handle = hwnd ifTrue: [^true].
  44537.         hwnd := UserLibrary default getParent: hwnd].
  44538.     ^false!
  44539.  
  44540. hasLayoutManager
  44541.     "Answer whether the receiver has a layout manager."
  44542.  
  44543.     ^self layoutManager notNil!
  44544.  
  44545. hasMenu
  44546.     "Private - Answer true if the receiver has a menu"
  44547.  
  44548.     ^false!
  44549.  
  44550. hasStaticEdge
  44551.     "Answer whether the receiver has the Static Edge style (a subtler 3D sunken edge
  44552.     than WS_EX_CLIENTEDGE, intended for use with windows which do not accept input)."
  44553.  
  44554.     ^self exStyleAllMask: WS_EX_STATICEDGE!
  44555.  
  44556. hasStaticEdge: aBoolean
  44557.     "Sets the receiver to have a subtly sunken 3D border (Win95 edging style for
  44558.     controls not intended to accept input) or not depending on the value of aBoolean.
  44559.     This is the WS_EX_STATICEDGE style."
  44560.  
  44561.     self exStyleMask: WS_EX_STATICEDGE set: aBoolean.
  44562.     self invalidateLayout
  44563. !
  44564.  
  44565. hasView
  44566.     "Private - Answer true if the view is valid.
  44567.     Part of the Presenter protocol used when the receiver is in fact its own presenter"
  44568.  
  44569.     ^true!
  44570.  
  44571. hasVisibleStyle
  44572.     "Answer whether the receiver has the WS_VISIBLE style."
  44573.  
  44574.     ^self getWindowStyle anyMask: WS_VISIBLE!
  44575.  
  44576. hasVisibleStyle: aBoolean
  44577.     "Set or clear the receiever's WS_VISIBLE style flag.
  44578.     Answer whether the receiver's window was previously visible."
  44579.  
  44580.     ^self showWithStyle: (aBoolean
  44581.         ifTrue: [SW_SHOW]
  44582.         ifFalse: [SW_HIDE])!
  44583.  
  44584. hasWindowEdge
  44585.     "Answer whether the receiver has the Window Edge style (a raised 3D edge)"
  44586.  
  44587.     ^self exStyleAllMask: WS_EX_TOOLWINDOW!
  44588.  
  44589. hasWindowEdge: aBoolean
  44590.     "Sets the receiver to have a Window Edge style (a raised 3D edge).
  44591.     This is the WS_EX_WINDOWEDGE style."
  44592.  
  44593.     self exStyleMask: WS_EX_TOOLWINDOW set: aBoolean.
  44594.     self invalidateLayout!
  44595.  
  44596. height
  44597.     "Answer the height of the receiver's outer window."
  44598.  
  44599.     ^self getWindowRect height
  44600. !
  44601.  
  44602. height: anInteger
  44603.     "Sets the height of the receiver's outer window to anInteger."
  44604.  
  44605.     self extent: self width @ anInteger!
  44606.  
  44607. hide
  44608.     "Makes the receiver invisible"
  44609.  
  44610.     ^self showWithStyle: SW_HIDE!
  44611.  
  44612. hookWindowCreate
  44613.     "Private - Hook window creation for the receiver so that we are able to intercept the very
  44614.     first message for the receiver and subclass the window at that point. This means
  44615.     that we can receiver every message for a View before its class' window proc, even
  44616.     if it is a control. We don't need to do anything fancy for our own windows."
  44617.  
  44618.     self onAboutToCreate.
  44619.     self primHookWindowCreate: true!
  44620.  
  44621. id
  44622.     "Answer the Integer identifier of the receiver"
  44623.  
  44624.     ^self getWindowLong: GWL_ID!
  44625.  
  44626. id: anInteger
  44627.     "Set the receiver's Integer identifier."
  44628.  
  44629.     ^self setWindowLong: GWL_ID to: anInteger!
  44630.  
  44631. inheritContextMenu
  44632.     "Answer whether the receiver will inherit the parent view's context menu if it has
  44633.     none of its own. This is the default, and is useful when you wish to define a single
  44634.     context menu at container level that is used in a number of sub-views. If, on the other
  44635.     hand, you want don't want to inherit the parent's context menu, perhaps because
  44636.     you want to use a control's own default menu, then this option must be toggled off."
  44637.  
  44638.     ^flags noMask: NoInheritMenuMask!
  44639.  
  44640. inheritContextMenu: aBoolean 
  44641.     flags := flags mask: NoInheritMenuMask set: aBoolean not!
  44642.  
  44643. initialize
  44644.     "Private - Initialise the new receiver."
  44645.  
  44646.     creationStyle := self defaultStyle.
  44647.     interactor := presenter := self.
  44648.     flags := 0.
  44649.     self isManaged: true.
  44650.     self initializeModel
  44651. !
  44652.  
  44653. initializeModel
  44654.     "Private - Set the default model for the receiver directly. Wire up the event triggers but don't trigger any change
  44655.     notifications yet."
  44656.     
  44657.     self setModel: self class defaultModel.
  44658.     self connectModel.
  44659. !
  44660.  
  44661. interactor
  44662.     ^interactor!
  44663.  
  44664. interactor: anInteractor 
  44665.     "Set the receiver's interactor, answering the previous one."
  44666.  
  44667.     | oldInteractor |
  44668.     oldInteractor := interactor.
  44669.     interactor := anInteractor.
  44670.     ^oldInteractor.!
  44671.  
  44672. invalidate
  44673.     "Invalidate the entire client area so that it will be re-painted"
  44674.  
  44675.     self invalidateRect: nil!
  44676.  
  44677. invalidateCalculatedExtent
  44678.     "The receiver's internal contents have been changed in such a way that
  44679.     the preferred calculatedExtent will also have been changed. If the preferred extent
  44680.     is in use and dependent on the calculatedExtent then invalidate the receiver's
  44681.     layout."
  44682.  
  44683.     (self usePreferredExtent and: [self preferredExtent isNil]) ifFalse: [^self].
  44684.     self invalidateLayout.
  44685.  
  44686.     "Most often the operation that caused the original contents change will
  44687.     have invalidated the receiver's contents. This propagates a validateLayout
  44688.     and thereby effects the appropriate layout recalculation. In some cases, however, 
  44689.     it is necessary to poke it for a layout to take place. We do this here by invalidating 
  44690.     a minimal rectangle of the receiver."
  44691.     self invalidateRect: (0 @ 0 extent: 1 @ 1)!
  44692.  
  44693. invalidateLayout
  44694.     "Invalidates the layout of the receiver and all its parent indicating that the geometry
  44695.     hierarchy needs to be recalculated."
  44696.  
  44697.     self basicInvalidateLayout.
  44698.     self allParents do: [:each | each basicInvalidateLayout ]!
  44699.  
  44700. invalidateRect: rectangle
  44701.     "Invalidates the specified client rectangle (a RECT, Rectangle, or nil for the whole client window)
  44702.     erasing the background. Answer whether the function succeeds."
  44703.  
  44704.     ^self invalidateRect: rectangle erase: true!
  44705.  
  44706. invalidateRect: rectangle erase: eraseBoolean 
  44707.     "Invalidates the specified client rectangle (a RECT, Rectangle, or nil for the whole client window).
  44708.     Set whether to erase the receivers background before repainting. Answer whether the function succeeds."
  44709.  
  44710.     "There is a possibility that this may be called before the receiver has been created
  44711.     so check for this to avoid accidentally redrawing the entire desktop"
  44712.  
  44713.     ^handle notNull and: 
  44714.             [UserLibrary default 
  44715.                 invalidate: handle
  44716.                 lpRect: rectangle asParameter
  44717.                 bErase: eraseBoolean asParameter]!
  44718.  
  44719. invalidateRgn: aRegionOrNil
  44720.     "Invalidates the client region aRegionOrNil (nil invalidates the whole client area)
  44721.     erasing the background. Answer whether the function succeeds."
  44722.  
  44723.     ^self invalidateRgn: aRegionOrNil erase: true!
  44724.  
  44725. invalidateRgn: aRegionOrNil erase: aBoolean
  44726.     "Invalidates the client region aRegionOrNil (nil invalidates the whole client area)
  44727.     erasing the background. Answer whether the function succeeds."
  44728.  
  44729.     ^UserLibrary default invalidateRgn: handle hRgn: aRegionOrNil asParameter bErase: aBoolean!
  44730.  
  44731. invalidateUserInterface
  44732.     "Invalidates the user interface of the receiver indicating that it needs
  44733.     to be requeried using #validateUserInterface (usually at idle time)"
  44734.  
  44735.     self topShell invalidateUserInterface!
  44736.  
  44737. isActive
  44738.     "Answer whether the receiver is the current active window."
  44739.  
  44740.     ^self class activeHandle = self handle!
  44741.  
  44742. isDialogMessage: aMSG
  44743.     "Private - Answer whether the receiver wishes to gobble up (and indeed has gobbled up) 
  44744.     the argument, aMSG. Although IsDialogMessage help mentions only that keyboard messages 
  44745.     are translated, the MFC library also calls IsDialogMessage for mouse messages, 
  44746.     so we follow suit."
  44747.  
  44748.     ^(UserLibrary default isDialogMessage: self handle lpMsg: aMSG) 
  44749.         == true    "in case of callback unwind on image restart"!
  44750.  
  44751. isDolphinWindow
  44752.     "Private - Answers true if this view is managed by Dolphin."
  44753.  
  44754.     ^SessionManager inputState isDolphinWindow: handle!
  44755.  
  44756. isDragSource
  44757.     "Private - Answer whether the receiver can take part in a drag and drop session as a drag source."
  44758.  
  44759.     ^flags anyMask: DragSourceMask!
  44760.  
  44761. isDragSource: aBoolean
  44762.     "Set or reset the receiver's isDragSource flag. When true, the receiver can take part in
  44763.     a drag and drop operation as a drag source."
  44764.  
  44765.     flags := flags mask: DragSourceMask set: aBoolean!
  44766.  
  44767. isDropTarget
  44768.     "Private - Answer whether the receiver can take part in a drag and drop session as a drop target."
  44769.  
  44770.     ^flags anyMask: DropTargetMask!
  44771.  
  44772. isDropTarget: aBoolean
  44773.     "Set or reset the receiver's isDropTarget flag. When true, the receiver can take part in
  44774.     a drag and drop operation as a potential drop target."
  44775.  
  44776.     flags := flags mask: DropTargetMask set: aBoolean.
  44777. !
  44778.  
  44779. isEnabled
  44780.     "Private - Answer whether the receiver is enabled for input"
  44781.  
  44782.     ^UserLibrary default isWindowEnabled: self asParameter
  44783. !
  44784.  
  44785. isEnabled: aBoolean
  44786.     "Set or reset whether the receiver is enabled for user input"
  44787.  
  44788.     UserLibrary default enableWindow: self asParameter bEnable: aBoolean
  44789. !
  44790.  
  44791. isForeground
  44792.     "Answer whether the receiver is the current foreground window."
  44793.  
  44794.     ^self class foregroundHandle = self handle!
  44795.  
  44796. isGroupStop
  44797.     "Answers whether the receiver has the WS_GROUP style."
  44798.  
  44799.     ^self baseStyleAllMask: WS_GROUP
  44800. !
  44801.  
  44802. isGroupStop: aBoolean
  44803.     "Sets whether the receiver has the WS_GROUP style according to aBoolean."
  44804.  
  44805.     self baseStyleMask: WS_GROUP set: aBoolean recreateIfChanged: false!
  44806.  
  44807. isLayoutValid
  44808.     "Answer true if the layout of the receiver is currently valid"
  44809.  
  44810.     ^flags allMask: LayoutValidMask.
  44811. !
  44812.  
  44813. isManaged
  44814.     "Answer true if the receiver is managed by its parent's layout manager"
  44815.  
  44816.     ^flags anyMask: ManagedMask!
  44817.  
  44818. isManaged: aBoolean
  44819.     "Set the receiver to be managed by its parent's layout manager according to 
  44820.     aBoolean"
  44821.  
  44822.     flags := flags mask: ManagedMask set: aBoolean!
  44823.  
  44824. isOpen
  44825.     "Answer whether the receiver has an associated Win32 Window.
  44826.     We don't use #handle here since this would force creation of the
  44827.     window. Note that the answer is not 100% reliable if affirmative,
  44828.     because we may be an old view with a handle which Windows
  44829.     has reused."
  44830.  
  44831.     ^handle notNil and: [UserLibrary default isWindow: handle]!
  44832.  
  44833. isPersistentlyDisabled
  44834.     "Private - Answer whether the receiver is disabled in a way that should be persisted.
  44835.     So, for example, if the receiver has been disabled by a non-Dolphin dialog window
  44836.     that cannot itself be persisted, it does not make sense to persist the disabled state either.
  44837.     Implementation Note: In the case of generic View's, they are considered persistently
  44838.     disabled if just disabled."
  44839.  
  44840.     ^self isEnabled not!
  44841.  
  44842. isPersistentView
  44843.     "Answer whether the receiver has persistent state which can and should
  44844.     be persistent in the image (i.e. top-level windows which answer true
  44845.     to this will be sent #state and #state: messages by the 
  44846.     SessionManager before the image is saved, and on session startup, respectively)."
  44847.  
  44848.     ^false!
  44849.  
  44850. isStateRestoring
  44851.     "Private - Answer true if the state of the receiver is being restored, i.e. we are
  44852.     within a #state: method. Used to disable some notification during this period when
  44853.     sibling views may not yet be valid"
  44854.  
  44855.     ^flags anyMask: StateRestoringMask
  44856. !
  44857.  
  44858. isStateRestoring: aBoolean
  44859.     "Private - Set a flag to indicate that state of the receiver is being restored according 
  44860.     to aBoolean. Used to disable some notification during this period when sibling views 
  44861.     may not yet be valid"
  44862.  
  44863.     flags := flags mask: StateRestoringMask set: aBoolean
  44864. !
  44865.  
  44866. isTabStop
  44867.     "Answers whether the receiver has the WS_TABSTOP style."
  44868.  
  44869.     ^self baseStyleAllMask: WS_TABSTOP
  44870. !
  44871.  
  44872. isTabStop: aBoolean
  44873.     "Sets whether the receiver has the WS_TABSTOP style according to aBoolean."
  44874.  
  44875.     self baseStyleMask: WS_TABSTOP set: aBoolean recreateIfChanged: false
  44876. !
  44877.  
  44878. isTopView
  44879.     "Answer whether the receiver is child of the Desktop."
  44880.  
  44881.     ^self isOpen and: [self parentView == self class desktop]!
  44882.  
  44883. isTransparent
  44884.     "Answer whether the receiver is transparent (i.e. it has the WS_EX_TRANSPARENT style)."
  44885.  
  44886.     ^self exStyleAllMask: WS_EX_TRANSPARENT!
  44887.  
  44888. isTransparent: aBoolean
  44889.     "Set whether or not the receiver is transparent (i.e. it 
  44890.     set/remove the WS_EX_TRANSPARENT style)."
  44891.  
  44892.     self exStyleMask: WS_EX_TRANSPARENT set: aBoolean
  44893. !
  44894.  
  44895. isWindowVisible
  44896.     "Answer whether both the receiver and its parent have the WS_VISIBLE style,  it is therefore possible
  44897.     that this method will answer true even if the receiver is totally obscured by other windows."
  44898.  
  44899.     ^UserLibrary default isWindowVisible: self asParameter
  44900. !
  44901.  
  44902. isWindowVisible: aBoolean
  44903.     "Set the window visibility according to aBoolean"
  44904.  
  44905.     aBoolean ifTrue: [self show] ifFalse: [self hide]
  44906. !
  44907.  
  44908. killTimer: anIntegerId
  44909.     "Private - Stops a timer for this window. The timer identifier (anIntegerId)
  44910.     is an integer that identifies the particular timer to kill. Answers
  44911.     true if the operation succeeds."
  44912.  
  44913.     ^UserLibrary default killTimer: self asParameter uIDEvent: anIntegerId!
  44914.  
  44915. layout
  44916.     "Recalculate the geometry of the receiver. Usually overridden by classes
  44917.     that support layout managers"
  44918.  
  44919.     !
  44920.  
  44921. layoutExtent
  44922.     "Answer the extent of the receiver that should be used by a layout manager during it's layout
  44923.     process. The the view has been flagged as requiring its preferred extent to be used then it is,
  44924.     otherwise the existing extent is answered. Subclasses can override this to answer an extent
  44925.     that is perhaps based on the current contents of the view."
  44926.  
  44927.     ^self usePreferredExtent ifTrue: [self actualPreferredExtent] ifFalse: [self extent]!
  44928.  
  44929. layoutManager
  44930.     "Answer the layout manager for the receiver.
  44931.     The default is to answer nil, and this is overridden in ContainerView."
  44932.  
  44933.     ^nil!
  44934.  
  44935. managedSubViews 
  44936.     "Answer an OrderedCollection of the sub views of the receiver that are managed.
  44937.     Managed sub views can be edited by the ViewComposer and are arranged
  44938.     by the layout manager (if any)"
  44939.  
  44940.     ^self subViews select: [ :each | each isManaged ]
  44941.     !
  44942.  
  44943. mapPoint: aPoint to: anotherView
  44944.     "Maps aPoint from the coordinate system of the receiver into that of anotherView"
  44945.  
  44946.     | pt |
  44947.     pt:= POINTL fromPoint: aPoint.
  44948.     UserLibrary default
  44949.         mapWindowPoints: self asParameter
  44950.         hWndTo: anotherView asParameter
  44951.         lpPoints: pt
  44952.         cPoints: 1.
  44953.     ^pt asPoint!
  44954.  
  44955. mapRectangle: aRectangle to: anotherView
  44956.     "Maps aRectangle from the coordinate system of the receiver into that of anotherView."
  44957.  
  44958.     ^(self class
  44959.         mapRectangle: aRectangle
  44960.         from: self
  44961.         to: anotherView) asRectangle
  44962. !
  44963.  
  44964. maxExtent
  44965.     "Answers the maximum extent for the receiver or nil if there is no constraint.
  44966.     This only applies for    views being resized directly by the UI. It is not considered
  44967.     during layout by a LayoutManager."
  44968.  
  44969.     ^nil!
  44970.  
  44971. minExtent
  44972.     "Answers the minimum extent for the receiver or nil if there is no constraint.
  44973.     This only applies for    views being resized directly by the UI. It is not considered
  44974.     during layout by a LayoutManager."
  44975.  
  44976.     ^nil!
  44977.  
  44978. model
  44979.     "Answer the model (if any) for the receiver"
  44980.     
  44981.     ^model!
  44982.  
  44983. model: aModel
  44984.     "Set model for the receiver. Subclasses that wish to connect to specific update 
  44985.     events generated by the model should override #connectModel."
  44986.     
  44987.     self 
  44988.         disconnectFromModel;
  44989.         setModel: aModel;
  44990.         connectModel;
  44991.         onModelChanged!
  44992.  
  44993. name
  44994.     "Answer the name of the receiver in its parent or nil if no
  44995.     name has been set"
  44996.  
  44997.     ^self parentView nameOf: self.
  44998. !
  44999.  
  45000. name: aStringOrNil
  45001.     "Set the name of the receiver in its parent to aStringOrNil"
  45002.  
  45003.     ^self parentView name: self as: aStringOrNil.
  45004. !
  45005.  
  45006. nameOf: aView
  45007.     "Answer the name of aView within the receiver or nil
  45008.     if it has not been assigned a name"
  45009.  
  45010.     ^nil!
  45011.  
  45012. needsValidateLayout
  45013.     "Answer true if the layout of the receiver or any of its subViews
  45014.     is invalid. This is an indication that a #validateLayout needs
  45015.     to be sent to sort or the geometry"
  45016.  
  45017.     ^self isLayoutValid not 
  45018.         or: [self subViews anySatisfy: [:each | each needsValidateLayout]]!
  45019.  
  45020. nextSiblingView
  45021.     "Answers the sibling immediately behind the receiver in the Zorder, or nil if there is none."
  45022.  
  45023.     | sibling |
  45024.     sibling :=  UserLibrary default getWindow: self asParameter uCmd: GW_HWNDNEXT.
  45025.     sibling isNil ifTrue: [^nil].
  45026.     ^self class withHandle: sibling
  45027. !
  45028.  
  45029. nmNotify: anNMHDR
  45030.     "Private - Default handler for a redirected WM_NOTIFY message."
  45031.  
  45032.     ^nil!
  45033.  
  45034. nonClientCanvas
  45035.     "Answer a canvas for drawing on the non-client areas of this View"
  45036.  
  45037.     ^Canvas forNonClientView: self!
  45038.  
  45039. noRedrawDo: operation
  45040.     "Perform the <niladicValuable>, operation, with redraw disabled."
  45041.  
  45042.     self disableRedraw.
  45043.     [operation value] ensure: [self enableRedraw]!
  45044.  
  45045. oldWndProc: anAddress
  45046.     "Private - Save the address of the old window procedure prior to subclassing."
  45047.  
  45048.     "Do nothing by default"
  45049.     ^self!
  45050.  
  45051. onAboutToCreate
  45052.     "Default handler for pre-creation event.
  45053.     The receiver is about to be realized, perform once off processing
  45054.     required before that happens. The default is to do nothing."
  45055.  
  45056.     ^nil!
  45057.  
  45058. onAboutToDisplayMenu: popup
  45059.     "The pop-up <Menu>, popup, is about to be displayed.
  45060.     This is our opportunity to update it, e.g. to add/remove items."
  45061.  
  45062.     self presenter trigger: #aboutToDisplayMenu: with: popup.
  45063.     ^0  "prevent default processing" !
  45064.  
  45065. onActionPerformed
  45066.     "Handler for an action in the receiver. 
  45067.     The default is to trigger an #action event off the presenter"
  45068.  
  45069.     Cursor wait showWhile: [self presenter trigger: #actionPerformed].
  45070.     self invalidateUserInterface!
  45071.  
  45072. onBegin: dragOp drag: dragee
  45073.     "Handler for a begin drag initiated by the mouse button identified by the <Symbol>, dragOp.
  45074.     The <Object>, dragee, is a suggestion for the drag object."
  45075.  
  45076.     "First check that the mouse button is still down. Sometimes bringing up a dialog or message box
  45077.     on a left click can cause the receiver to miss a corresponding mouse up."
  45078.         
  45079.     (Keyboard default isButtonDown: dragOp) ifTrue: [
  45080.         (InternalDragDropSession dragSource: self item: dragee)
  45081.             doDragDropAt: Cursor position button: dragOp]!
  45082.  
  45083. onCaptureChanged: aViewOrNil
  45084.     "The view with capture of the mouse has changed to the argument (which is nil if no
  45085.     Dolphin window has capture)."
  45086.  
  45087.     ^nil!
  45088.  
  45089. onCloseRequested
  45090.     "Default handler for a close request event.
  45091.     Answer nil to accept the default processing."
  45092.  
  45093.     ^nil!
  45094.  
  45095. onColorRequired: aColorEvent
  45096.     "Colour event handler for aColorEvent (WM_CTLCOLORXXX). 
  45097.     We can set up the canvas provided by the event with the appropriate foreground 
  45098.     and background colours for the receiver. Windows WM_CTLCOLORXXX messages require 
  45099.     that we answer the background brush handle"
  45100.  
  45101.     ^nil "Perform default processing"!
  45102.  
  45103. onCommand: aCommandDescription
  45104.     "Performs aCommandDescription for the receiver. We use the standard routing policy,
  45105.     and display the wait cursor until the action is completed."
  45106.  
  45107.     | answer |
  45108.     answer := Cursor wait showWhile: [ 
  45109.         self presenter commandPolicy route: aCommandDescription].
  45110.     "The command may have closed the window"
  45111.     self isOpen ifTrue: [self invalidateUserInterface].
  45112.     ^answer!
  45113.  
  45114. onCreated: anEvent
  45115.     "Default handler for creation. Note that it is a vagary of Windows that the receiver
  45116.     may not yet be fully created at this point. If this is important then override
  45117.     #onFullyCreated to guarantee that the receiver is fully consistent. 
  45118.     Answer nil to accept the default processing."
  45119.  
  45120.     ^nil!
  45121.  
  45122. onDestroyed
  45123.     "Default handler for destroy. Inform the parent that it's layout
  45124.     is now probably invalid. Inform the presenter that its view is now
  45125.     gone. Answer nil to accept the default processing."
  45126.  
  45127.     self isStateRestoring ifFalse: [self model removeEventsTriggeredFor: self].
  45128.     self parentView onSubViewRemoved: self.
  45129.     self presenter onViewClosed.
  45130.     ^nil!
  45131.  
  45132. onEraseRequired: aColorEvent 
  45133.     "Handler for erase background - erase to the background colour"
  45134.  
  45135.     | bkColour |
  45136.     bkColour := self backcolor.
  45137.     bkColour notNil 
  45138.         ifTrue: 
  45139.             [| brush |
  45140.             brush := bkColour brush.
  45141.             aColorEvent canvas fillRectangle: self clientRectangle brush: brush.
  45142.             brush free.
  45143.             ^1].
  45144.  
  45145.     "Pass to default window proc for erasing using window class brush"
  45146.     ^nil!
  45147.  
  45148. onFullyCreated
  45149.     "The receiver has just been fully created. This is a suitable place to perform initialization
  45150.     of the window from the receiver's instance variables. Note that this message is sent via
  45151.     a WM_PARENTNOTIFY Windows message to the Window's parent, and thus will not be 
  45152.     available for views that use the WS_EXNOPARENTNOTIFY extended style, or which are 
  45153.     created as immediate children of the desktop or any other Windows not subclassed by Dolphin."!
  45154.  
  45155. onGetCursor: aSymbol
  45156.     "The named area of the window associated with the receiver has been hit.
  45157.     Answer the appropriate mouse cursor, or nil to accept the default."
  45158.  
  45159.     ^aSymbol == #client ifTrue: [self cursor]!
  45160.  
  45161. onHScroll: aScrollEvent
  45162.     "Default handler for a horizontal scroll event.
  45163.     Answer nil to accept the default processing."
  45164.  
  45165.     ^nil!
  45166.  
  45167. onIdleEntered
  45168.     "There are no messages in the input queue and the input state is
  45169.     about to go idle. Perform any idle processing.
  45170.     N.B. Usually actioned only by top level windows, but also received by
  45171.     any other views without a presenter."
  45172.  
  45173.     ^true!
  45174.  
  45175. onInputMaskRequired: anEvent
  45176.     "Handler for a WM_GETDLGCODE request from Windows.
  45177.     The lParam is a pointer to the MSG that may be sent depending on the response.
  45178.     The answer should be some combination of DLGC_XXXX flags (e.g. DLGC_WANTARROWS | DLGC_WANTTAB).
  45179.     By default we perform the default window processing (which at the time of writing, ansers 0) 
  45180.     and bitOr: in DLGC_WANTCHARS, since this gives more useful and intuitive behaviour for 
  45181.     specialized View subclasses which will often want alpha-numeric keyboard input."
  45182.     
  45183.     ^(self defaultWindowProcessing: anEvent) bitOr: DLGC_WANTCHARS!
  45184.  
  45185. onKeyPressed: aKeyEvent
  45186.     "Default handler for a key press event.
  45187.     Accept the default window processing."
  45188.  
  45189.     self presenter trigger: #keyPressed: with: aKeyEvent.
  45190.     ^self defaultWindowProcessing: aKeyEvent!
  45191.  
  45192. onKeyReleased: aKeyEvent
  45193.     "Default handler for a key up event.
  45194.     Accept the default window processing."
  45195.  
  45196.     self presenter trigger: #keyReleased: with: aKeyEvent.
  45197.     ^self defaultWindowProcessing: aKeyEvent!
  45198.  
  45199. onKeyTyped: aKeyEvent
  45200.     "Default handler for a keyboard event.
  45201.     Accept the default window processing."
  45202.  
  45203.     self presenter trigger: #keyTyped: with: aKeyEvent.
  45204.     ^self defaultWindowProcessing: aKeyEvent!
  45205.  
  45206. onKillFocus
  45207.     "Handler for loss of focus"
  45208.  
  45209.     self presenter trigger: #focusLost.
  45210.     ^nil "Perform default processing"!
  45211.  
  45212. onLeftButtonDoubleClicked: aMouseEvent
  45213.     "Default handler for a mouse left button double-click event.
  45214.     Accept the default window processing."
  45215.  
  45216.     self presenter trigger: #leftButtonDoubleClicked: with: aMouseEvent.
  45217.     ^self defaultWindowProcessing: aMouseEvent!
  45218.  
  45219. onLeftButtonPressed: aMouseEvent
  45220.     "Default handler for a left button down mouse event.
  45221.     Accept the default window processing."
  45222.  
  45223.     self presenter trigger: #leftButtonPressed: with: aMouseEvent.
  45224.     ^self defaultWindowProcessing: aMouseEvent!
  45225.  
  45226. onLeftButtonReleased: aMouseEvent
  45227.     "Default handler for a Left button up mouse event.
  45228.     Accept the default window processing."
  45229.  
  45230.     self presenter trigger: #leftButtonReleased: with: aMouseEvent.
  45231.     ^self defaultWindowProcessing: aMouseEvent!
  45232.  
  45233. onMiddleButtonDoubleClicked: aMouseEvent 
  45234.     "Default handler for a mouse middle button double-click event.
  45235.     Accept the default window processing."
  45236.  
  45237.     self presenter trigger: #middleButtonDoubleClicked: with: aMouseEvent.
  45238.     ^self defaultWindowProcessing: aMouseEvent
  45239. !
  45240.  
  45241. onMiddleButtonPressed: aMouseEvent
  45242.     "Default handler for a middle button down mouse event.
  45243.     Accept the default window processing."
  45244.  
  45245.     self presenter trigger: #middleButtonPressed: with: aMouseEvent.
  45246.     ^self defaultWindowProcessing: aMouseEvent!
  45247.  
  45248. onMiddleButtonReleased: aMouseEvent
  45249.     "Default handler for a middle button up mouse event.
  45250.     Accept the default window processing."
  45251.  
  45252.     self presenter trigger: #middleButtonReleased: with: aMouseEvent.
  45253.     ^self defaultWindowProcessing: aMouseEvent!
  45254.  
  45255. onModelChanged
  45256.     "The model held by the associated presenter has been replaced (i.e. the complete
  45257.     contents have changed) so refresh the receiver here."
  45258.  
  45259.     self isOpen ifTrue: [self refreshContents]!
  45260.  
  45261. onMouseMoved: aMouseEvent
  45262.     "Default handler for a mouse move event.
  45263.     Accept the default processing.
  45264.     Note: We don't trigger an event here to save churning."
  45265.  
  45266.     ^self defaultWindowProcessing: aMouseEvent!
  45267.  
  45268. onMouseWheeled: aMouseEvent 
  45269.     "Default handler for a mouse wheel movement event.
  45270.     Accept the default window processing."
  45271.  
  45272.     self presenter trigger: #mouseWheeled: with: aMouseEvent.
  45273.     ^self defaultWindowProcessing: aMouseEvent!
  45274.  
  45275. onPaintRequired: aPaintEvent
  45276.     "Default handler for paint.
  45277.     N.B. Do not invoke default processing from this event because BeginPaint() has already
  45278.     been called. If you need to invoke default processing then you will have to override
  45279.     #wmPaint:wParam:lParam: (e.g. see ControlView)."!
  45280.  
  45281. onPositionChanged: aPositionEvent
  45282.     "Default handler for window position change (move or resize).
  45283.     Inform the parent view that its layout is now invalid. Accept the 
  45284.     default processing as well by answering the receiver.
  45285.     This event is new for Dolphin 3.0, and superceeds #onResized: and 
  45286.     #onMoved: which are no longer sent."
  45287.  
  45288.     aPositionEvent isRectangleChanged 
  45289.         ifTrue: [self invalidateLayout].
  45290.     self presenter trigger: #positionChanged: with: aPositionEvent!
  45291.  
  45292. onPositionChanging: aPositionEvent
  45293.     "Default handler for window position changing (move or resize).
  45294.     Modifying the contents of aPositionEvent can alter how it gets mapped
  45295.     to an actual position change of the receiver."
  45296.  
  45297.     self presenter trigger: #positionChanging: with: aPositionEvent.
  45298.     ^nil!
  45299.  
  45300. onRightButtonDoubleClicked: aMouseEvent
  45301.     "Default handler for a mouse Right button double-click event.
  45302.     Accept the default window processing."
  45303.  
  45304.     self presenter trigger: #rightButtonDoubleClicked: with: aMouseEvent.
  45305.     ^self defaultWindowProcessing: aMouseEvent!
  45306.  
  45307. onRightButtonPressed: aMouseEvent
  45308.     "Default handler for a Right button down mouse event.
  45309.     Accept the default window processing."
  45310.  
  45311.     self presenter trigger: #rightButtonPressed: with: aMouseEvent.
  45312.     ^self defaultWindowProcessing: aMouseEvent!
  45313.  
  45314. onRightButtonReleased: aMouseEvent
  45315.     "Default handler for a Right button up mouse event.
  45316.     Accept the default window processing."
  45317.  
  45318.     self presenter trigger: #rightButtonReleased: with: aMouseEvent.
  45319.     ^self defaultWindowProcessing: aMouseEvent!
  45320.  
  45321. onSetFocus
  45322.     "Handler for set focus event"
  45323.  
  45324.     self invalidateUserInterface.
  45325.     self presenter trigger: #focusGained.
  45326.     ^nil "Perform default processing"!
  45327.  
  45328. onStartup
  45329.     "Ensure that the handle of the receiver is set to nil at startup."
  45330.  
  45331.     handle := nil!
  45332.  
  45333. onSubViewAdded: aView
  45334.     "Received when aView has been added to the receiver.
  45335.     Can be overridden by subclasses to perform necessary housekeeping regarding the
  45336.     new contents of the receiver"
  45337.  
  45338.  
  45339.     !
  45340.  
  45341. onSubViewRemoved: aView
  45342.     "Received when aView has been removed from the receiver.
  45343.     Can be overridden by subclasses to perform necessary housekeeping regarding the
  45344.     new contents of the receiver"
  45345.  
  45346. !
  45347.  
  45348. onTipTextRequired: tool
  45349.     "Tool tip text is required for the <ToolbarItem>, tool.
  45350.     This event is sent to the receiver if it is current <commandTarget>
  45351.     for the command associated with the toolbar item."
  45352.  
  45353.     ^tool toolTipText!
  45354.  
  45355. onViewClosed
  45356.     "Handler for view destroy"
  45357.  
  45358.     self presenter trigger: #viewClosed.
  45359. !
  45360.  
  45361. onViewDestroyed
  45362.     "Handler for view final view destruction. This is sent on receipt of WM_NCDESTROY,
  45363.     and is expected to be the last communication from Windows. There is nothing
  45364.     more we can do to save the patient. No event is triggered.
  45365.     Note that we don't do finalization actions here, because a more robust choice
  45366.     is in the actual handler for WM_NCDESTROY, just in case the presenter fails
  45367.     to forward on this message."!
  45368.  
  45369. onViewOpened
  45370.     "Handler for view opened"
  45371.  
  45372.     self presenter trigger: #viewOpened.!
  45373.  
  45374. onVScroll: aScrollEvent
  45375.     "Default handler for a vertical scroll event.
  45376.     Answer nil to accept the default processing."
  45377.  
  45378.     ^nil
  45379.  
  45380. !
  45381.  
  45382. onZOrderChanged
  45383.     "Received when the Zorder of the subviews within the receiver has been
  45384.     directly changed. Can be overridden by subclasses to perform necessary 
  45385.     housekeeping regarding the new Zorder."
  45386.  
  45387. !
  45388.  
  45389. parentPresenter
  45390.     "Answer the presenter that can be considered the parent of the receiver.
  45391.     Part of the Presenter protocol used when the receiver is in fact its own presenter"
  45392.  
  45393.     | parent |
  45394.     parent := self parentView.
  45395.     ^(parent isNil or: [parent == self class desktop]) ifFalse: [parent presenter]!
  45396.  
  45397. parentView
  45398.     "Answer the parent View of the receiver assigned before creation,
  45399.     or nil if none."
  45400.  
  45401.     ^creationParent!
  45402.  
  45403. parentView: aView 
  45404.     "Private - Sets the parent of the receiver to aView. Can only be used when the
  45405.     receiver is not yet realized since Windows has a bug when reparenting"
  45406.  
  45407.     creationParent := aView.
  45408.     creationStyle at: 1 put: (self baseStyle mask: WS_CHILD set: aView ~~ self class desktop)!
  45409.  
  45410. performAction
  45411.     "Cause an #actionPerformed event to be routed"
  45412.  
  45413.     self presenter onActionPerformed!
  45414.  
  45415. placement
  45416.     "Answers an instance of WINDOWPLACEMENT filled with information about
  45417.     the current minimized/maximized/restored locations of the receiver and
  45418.     its current state. This can be restored at a later date using
  45419.     View>>placement:"
  45420.  
  45421.     | placement |
  45422.     placement := WINDOWPLACEMENT new.
  45423.     (UserLibrary default getWindowPlacement: self asParameter lpwndpl: placement)
  45424.         ifFalse: [UserLibrary default systemError].
  45425.  
  45426.     "If the receiver is invisible, we have to clear the SW_SHOWNORMAL flag which
  45427.     is set for some reason. A bug in Windows ?"
  45428.     (self getWindowStyle anyMask: WS_VISIBLE)
  45429.         ifFalse: [placement showCmd: (placement showCmd maskClear: SW_SHOWNORMAL)].
  45430.     ^placement!
  45431.  
  45432. placement: aWINDOWPLACEMENT
  45433.     "Sets the current minimized/maximized/restored locations of the receiver and
  45434.     its current state from information in aWINDOWPLACEMENT"
  45435.  
  45436.     UserLibrary default setWindowPlacement: self asParameter lpwndpl: aWINDOWPLACEMENT asParameter!
  45437.  
  45438. plainText
  45439.     "Answers the plain, unformatted, text from the receiver."
  45440.  
  45441.     ^self getWindowText!
  45442.  
  45443. plainText: aString
  45444.     "Private - Set the text contents of the receiver to the plain text aString.
  45445.     Part of the RichText double dispatching protocol"
  45446.  
  45447.     self setWindowText: aString
  45448. !
  45449.  
  45450. position
  45451.     "Answers the position of the receiver in the coordinates of its parent."
  45452.  
  45453.     ^self rectangle topLeft
  45454. !
  45455.  
  45456. position: aPoint
  45457.     "Set the top left position of the receiver to aPoint. aPoint is in the coordinate
  45458.     system of the receiver's parent. Answer whether the position request was accepted."
  45459.  
  45460.     ^self setWindowPosAfter: 0 
  45461.         x: aPoint x y: aPoint y  
  45462.         width: 0 height: 0
  45463.         flags: ##(SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE)!
  45464.  
  45465. positionForKeyboardContextMenu
  45466.     "Answer the desired position for a context menu requested from the keyboard.
  45467.     This should be based on the 'current selection', whatever that means in the context of the
  45468.     receiver. Should be overridden by subclasses as appropriate."
  45469.  
  45470.     ^self screenRectangle topLeft + 10!
  45471.  
  45472. postMessage: anIntegerMessageID wParam: wParam lParam: lParam
  45473.     "Private - Post the Win32 message anIntegerMessageID with parameters wParam and lParam to the receiver"
  45474.  
  45475.     ^UserLibrary default postMessage: self asParameter msg: anIntegerMessageID wParam: wParam lParam: lParam
  45476. !
  45477.  
  45478. preferredExtent
  45479.     "Answer the preferred size of the receiver or nil if none has been specified"
  45480.  
  45481.     ^preferredExtent!
  45482.  
  45483. preferredExtent: aPointOrNil 
  45484.     "Set the preferred size of the receiver to aPointOrNil. If nil is specified then this implies that
  45485.     the receiver has no preferred extent"
  45486.  
  45487.     preferredExtent = aPointOrNil ifTrue: [^self].
  45488.     preferredExtent := aPointOrNil.
  45489.     self parentView invalidateLayout!
  45490.  
  45491. presenter
  45492.     "Answers the presenter for the receiver"
  45493.  
  45494.     ^presenter!
  45495.  
  45496. presenter: aPresenter
  45497.     "Sets the presenter associated with the receiver"
  45498.  
  45499.     interactor := presenter := aPresenter.!
  45500.  
  45501. presenterConnectionPoint
  45502.     "Answer the view within the receiver to which a same named presenter should connect.
  45503.     Normally this is the receiver itself. Some views that wish to direct the presenter
  45504.     to connect to another view may override this method however"
  45505.  
  45506.     ^self!
  45507.  
  45508. preTranslateKeyboardInput: aMSG
  45509.     "Answer whether the receiver would like to consume the argument aMSG,
  45510.     which is a keyboard message.
  45511.     Implementation Note: Most views have no special pretranslation for
  45512.     keyboard input, so we answer false to have the message dispatched
  45513.     as normal."
  45514.  
  45515.     ^false!
  45516.  
  45517. preTranslateMessage: aMSG
  45518.     "Answer whether the receiver would like to consume the argument aMSG.
  45519.     There are separate pre-translation handlers for mouse and keyboard
  45520.     input, which can be overridden as necessary (e.g. see shells)."
  45521.  
  45522.     ^(aMSG isKeyboardInput and: [self preTranslateKeyboardInput: aMSG])
  45523.         or: [aMSG isMouseInput and: [self preTranslateMouseInput: aMSG]]
  45524. !
  45525.  
  45526. preTranslateMouseInput: aMSG
  45527.     "Answer whether the receiver would like to consume the argument aMSG.
  45528.     Implementation Note: By default we relay the mouse message to any tool tip 
  45529.     associated with the receiver, otherwise answering false to have the message
  45530.     dispatched as normal."
  45531.  
  45532.     | toolTip |
  45533.     ^(toolTip := self toolTipWindow) notNil and: [toolTip ttmRelayEvent: aMSG]
  45534.  
  45535. !
  45536.  
  45537. previousSiblingView
  45538.     "Answers the sibling immediately before the receiver in the Zorder, or nil if there is none."
  45539.  
  45540.     | sibling |
  45541.     sibling := self getPreviousSibling.
  45542.     sibling isNil ifTrue: [^nil].
  45543.     ^View withHandle: sibling
  45544. !
  45545.  
  45546. primHookWindowCreate: hookBoolean
  45547.     "Private - Ask the VM to hook the first subsequent window creation event for the receiver.
  45548.     When it receives such an event it will send a #subclassWindow: callback with the
  45549.     handle of the newly created window to the receiver. This allows controls to be
  45550.     subclassed BEFORE they return from the CreateWindowEx() call.
  45551.     The VM uses a CBT hook to achieve this. The hook is implemented in the VM to
  45552.     minimise the performance impact. The hook is automatically 'unhooked' by the VM
  45553.     when it receive's the create notification before it sends the #subclassWindow:
  45554.     callback.
  45555.     Primitive failure reasons:
  45556.         0     - hookBoolean not a boolean
  45557.         1    - already hooked by the view in the failure data
  45558.     "
  45559.  
  45560.     <primitive: 108>
  45561.     ^self primitiveFailed!
  45562.  
  45563. printOn: aStream
  45564.     "Append a short description of the receiver to aStream."
  45565.  
  45566.     aStream
  45567.         basicPrint: self;
  45568.         nextPut: $(;
  45569.         display: (handle isNil ifTrue: ['NULL'] ifFalse: [handle asInteger printStringRadix: 16]);
  45570.         nextPutAll: ', ';
  45571.         print: self displayString;
  45572.         nextPut: $)!
  45573.  
  45574. publishedAspects
  45575.     "Answer a <LookupTable> of the <Aspect>s published by the receiver."
  45576.  
  45577.     | aspects |
  45578.     aspects := super publishedAspects.
  45579.     self parentView notNil 
  45580.         ifTrue: 
  45581.             [| layoutManager |
  45582.             layoutManager := self parentView layoutManager.
  45583.             layoutManager notNil ifTrue: [aspects add: layoutManager arrangementAspect]].
  45584.     ^aspects!
  45585.  
  45586. queryCommand: aCommandQuery
  45587.     "Update aCommandQuery to indicates how a command would be processed.
  45588.     if sent to the receiver. Answers whether the receiver recognised the command
  45589.     as one of its own (this may be ignored by the command router). This need not
  45590.     be supersent if the #isEnabled: is sent to the <CommandQuery> to explicitly
  45591.     enable or disable a particular command."
  45592.  
  45593.     (aCommandQuery canPerformAgainst: self) ifTrue: [
  45594.         aCommandQuery beEnabled].
  45595.     ^false "not explicitly recognised at this level"!
  45596.  
  45597. queryCommandRouteFor: action
  45598.     "Private - Answer <CommandQuery> that indicates how the <commandDescription>, action,
  45599.     would be processed if sent to the receiver.
  45600.     Implementation Note: We use the receiver's command policy to route the command and query it"
  45601.  
  45602.     ^self presenter commandPolicy query: action!
  45603.  
  45604. queryContextMenu
  45605.     "Answer the context <Menu> that is associated with the receiver, if any.
  45606.     View's without their own context menu inherit that of the parent, or the
  45607.     parent's parent, and so on. The recursion will terminate at the desktop
  45608.     if no intervening views have a context menu, answering nil to indicate
  45609.     that there is no menu."
  45610.  
  45611.     ^self contextMenu 
  45612.         ifNil: [self inheritContextMenu ifTrue: [self parentView queryContextMenu]]!
  45613.  
  45614. recreate
  45615.     "Recreate the receiver if it is currently open. Useful for applying
  45616.     styles that are only available as pre-creation options"
  45617.  
  45618.     | state existingPresenter prevSibling |
  45619.     self isOpen ifFalse: [^self].
  45620.     "Switch out current presenter so it is not informed about our imminent destruction"
  45621.     existingPresenter := presenter.
  45622.     presenter := self.
  45623.  
  45624.     "Remember the z order position so it can be restored"
  45625.     prevSibling := self getPreviousSibling.
  45626.  
  45627.     "Destroy and recreate - As we are going to restore the state, we may want to avoid certain 
  45628.         actions we'd do in a normal destroy, so inform the ViewState this is a recreate."
  45629.     state := ViewState recordStateOf: self forRecreate: true.
  45630.     self basicDestroy.
  45631.     state restore.
  45632.  
  45633.     "Restore z-order position"
  45634.     self zOrderAfter: prevSibling.
  45635.  
  45636.     "Finally restore the presenter"
  45637.     presenter := existingPresenter!
  45638.  
  45639. rectangle
  45640.     "Answer a Rectangle containing the receiver's outer rectangle in the coordinate system of its parent."
  45641.  
  45642.     ^(self class
  45643.         mapRectangle: self getWindowRect
  45644.         from: nil
  45645.         to: self parentView) asRectangle!
  45646.  
  45647. rectangle: aRectangle
  45648.     "Set the boundary of the receiver to aRectangle. 
  45649.     aRectangle is in the coordinate system of the receiver's parent."
  45650.  
  45651.     aRectangle = self rectangle ifFalse:
  45652.         [self setWindowPosAfter: 0 
  45653.             x: aRectangle left y: aRectangle top  
  45654.             width: aRectangle width height: aRectangle height
  45655.             flags: ##(SWP_NOZORDER | SWP_NOACTIVATE)]!
  45656.  
  45657. refreshContents
  45658.     "The receiver's display needs to be refreshed. The default is to invalidate the
  45659.     receiver and cause it to repaint. This works fine for all views that do not cache
  45660.     data but work direct from the model data itself. Other subclasses may need to refresh 
  45661.     their cache."
  45662.  
  45663.     self invalidate!
  45664.  
  45665. releaseDC: hDC
  45666.     "Release the specified hDC (assumed to have been allocated
  45667.     by the receiver's #getDC). Answer whether the DC was indeed
  45668.     released."
  45669.  
  45670.     ^(UserLibrary default 
  45671.         releaseDC: self asParameter 
  45672.         hDC: hDC asParameter) == 1!
  45673.  
  45674. removeSubView: aView
  45675.     "Removes aView as a subview of the receiver. The removed view is destroyed"
  45676.  
  45677.     "Validate that aView is indeed one of the receiver's subviews"
  45678.     self assert: [aView parentView == self].
  45679.     ^aView destroy; yourself!
  45680.  
  45681. requestDragImages: session
  45682.     "This is where the receiver specifies any drag image overrides. 
  45683.     To do this use DragDropSession>>#imageAt: <Symbol> put: <Image> where 
  45684.     the Symbol is an either #object (to specify the underlying icon), or an 
  45685.     operation Symbol such as #none, #move, #copy, #link, #moveScroll, #copyScroll, 
  45686.     #linkScroll or some other Symbol to match an operation symbol. The Image
  45687.     is any <Image> (e.g. <Icon> or <Cursor>)."
  45688.  
  45689.     self presenter trigger: #requestDragImages: with: session!
  45690.  
  45691. requestDragObjects: session
  45692.     "This is where the receiver specifies which object(s) the <DragDropSession>, session,
  45693.     is to drag using DragDropSession>>addDragObject: or DragDropSession>>dragObjects:.
  45694.     The default is to fire a trigger, #drag:, off the Presenter which gives its observers an opportunity
  45695.     to supply the dragger objects"
  45696.  
  45697.     self presenter trigger: #drag: with: session!
  45698.  
  45699. requestDropOperations: aDragDropSession
  45700.     "Update the <DragDropSession>, session, with the set of supported 
  45701.     drag and drop operation symbols (for right-button drags).
  45702.     Implementation Note: Set up some sensible default operations, and then trigger a 
  45703.     #requestDropOperations: event off the receiver's presenter to give its observers an 
  45704.     opportunity to override those defaults."
  45705.  
  45706.     aDragDropSession supportedOperations isNil 
  45707.         ifTrue: 
  45708.             ["Presenter hasn't suggested anything, fill in some defaults"
  45709.  
  45710.             aDragDropSession supportedOperations: #(#move #copy)].
  45711.     self presenter trigger: #requestDropOperations: with: aDragDropSession!
  45712.  
  45713. resolution
  45714.     "Answer the logical pixels per inch for the receiver; i.e. the screen's
  45715.     logical pixels per inch"
  45716.  
  45717.     ^self class desktop resolution!
  45718.  
  45719. resolutionScaledBy: scale
  45720.     "Private - The receiver is being loaded and it has been determined that the pixel resolution
  45721.     has changed since the point at which the view was saved. Scale any internal pixels by <Point>
  45722.     scale. Note that the placement (position and extent) of the receiver has already been scaled
  45723.     in #restorePlacement:resolution:."
  45724.  
  45725.     preferredExtent notNil ifTrue: [
  45726.         preferredExtent := (preferredExtent*scale) truncated ]
  45727.  
  45728. !
  45729.  
  45730. restorePlacement: aWINDOWPLACEMENT resolution: aPointResolution 
  45731.     "Private - Restore the placement for the receiver to aWINDOWPLACEMENT which was
  45732.     measured at a screen resolution of aPointResolution. If the current resolution is different
  45733.     then the placement rectangle will have to be scaled appropriately. 
  45734.     Subclasses can override this message to compensate for a resolution change
  45735.     in any other ways required."
  45736.  
  45737.     | placement res |
  45738.     placement := aWINDOWPLACEMENT.
  45739.     res := self resolution.
  45740.     aPointResolution = res 
  45741.         ifFalse: 
  45742.             ["Resolution is now different so recompute the placement"
  45743.  
  45744.             | rect scale |
  45745.             scale := res / aPointResolution.
  45746.             rect := placement rcNormalPosition asRectangle.
  45747.             rect := rect scaleBy: scale.
  45748.             placement rcNormalPosition: rect truncated asParameter.
  45749.             self resolutionScaledBy: scale].
  45750.     self placement: placement!
  45751.  
  45752. richText
  45753.     "Answer a RichText containing the rich text contents of the receiver.
  45754.     May be overridden by subclasses which actually contain rich text."
  45755.  
  45756.     ^self plainText asRichText!
  45757.  
  45758. richText: aRichText
  45759.     "Private - Set the text contents of the receiver to the RTF text, aRichText.
  45760.     Part of the RichText double dispatching protocol"
  45761.  
  45762.     self plainText: aRichText asString
  45763. !
  45764.  
  45765. screenRectangle
  45766.     "Answer the boundary of the receiver window in screen coordinates"
  45767.  
  45768.     | localRect |
  45769.     localRect := self rectangle.
  45770.     ^self parentView mapRectangle: localRect to: self class desktop.
  45771. !
  45772.  
  45773. screenRectangle: aRectangle
  45774.     "Sets the boundary of the receiver to aRectangle.
  45775.     aRectangle is in screen coordinates"
  45776.  
  45777.     | localRect |
  45778.     localRect := self class desktop mapRectangle: aRectangle to: self parentView.
  45779.     self rectangle: localRect.
  45780. !
  45781.  
  45782. scrollBy: aPoint clip: clipRectangle
  45783.     "Scroll the contents of the receiver by aPoint"
  45784.  
  45785.     ^self scrollBy: aPoint scroll: nil clip: clipRectangle
  45786. !
  45787.  
  45788. scrollBy: aPoint scroll: scrollRectangle clip: clipRectangle
  45789.     "Scroll the contents of the receiver by aPoint."
  45790.  
  45791.     ^UserLibrary default
  45792.         scrollWindowEx: self asParameter
  45793.         dx: aPoint x
  45794.         dy: aPoint y
  45795.         prcScroll: scrollRectangle asParameter
  45796.         prcClip: clipRectangle asParameter
  45797.         hrgnUpdate: nil
  45798.         prcUpdate: nil
  45799.         flags: SW_ERASE | SW_INVALIDATE!
  45800.  
  45801. sendMessage: anIntegerMessageID
  45802.     "Private - Send the Win32 message anIntegerMessageID to the receiver's real window with wParam and lParam set to 0."
  45803.  
  45804.     ^UserLibrary default sendMessage: self asParameter msg: anIntegerMessageID wParam: 0 lParam: 0
  45805. !
  45806.  
  45807. sendMessage: anIntegerMessageID wParam: anInteger
  45808.     "Private - Send the Win32 message anIntegerMessageID to the receiver's real window with the specified
  45809.     wParam and lParam set to 0."
  45810.  
  45811.     ^UserLibrary default sendMessage: self asParameter msg: anIntegerMessageID wParam: anInteger lParam: 0!
  45812.  
  45813. sendMessage: anIntegerMessageID wParam: wParam lParam: lParam
  45814.     "Private - Send the Win32 message anIntegerMessageID with parameters wParam and lParam to the receiver"
  45815.  
  45816.     ^UserLibrary default sendMessage: self asParameter msg: anIntegerMessageID wParam: wParam lParam: lParam
  45817. !
  45818.  
  45819. sendMessage: anIntegerMessageID wParam: wParam lpParam: lParam
  45820.     "Private - Send the Win32 message anIntegerMessageID with parameters wParam and lpParam (pointer) to the receiver's
  45821.     Window."
  45822.  
  45823.     ^UserLibrary default sendMessage: self asParameter msg: anIntegerMessageID wParam: wParam lpParam: lParam
  45824. !
  45825.  
  45826. setCapture
  45827.     "Sets mouse capture to the receiver."
  45828.  
  45829.     UserLibrary default setCapture: self asParameter
  45830. !
  45831.  
  45832. setEvents: anEventsCollectionOrNil
  45833.     "Private - Set the EventsCollection of the receiver to be anEventsCollectionOrNil.
  45834.     Answer the receiver."
  45835.  
  45836.     events := anEventsCollectionOrNil!
  45837.  
  45838. setFocus
  45839.     "Sets focus to the receiver. Answers the View which previously had focus,
  45840.     or nil if none/invalid handle. Implicitly re-enables the top shell
  45841.     view if currently disabled."
  45842.  
  45843.     | top |
  45844.     top  := self topView.
  45845.     top isEnabled ifFalse: [top enable].
  45846.     ^UserLibrary default setFocus: self asParameter
  45847.  
  45848.  
  45849. !
  45850.  
  45851. setModel: aModel
  45852.     "Private - Set model for the receiver directly. Don't trigger any change
  45853.     notifications"
  45854.     
  45855.     model := aModel.
  45856. !
  45857.  
  45858. setRedraw: aBoolean
  45859.     "Private - Enable/disable repainting of the receiver's window."
  45860.  
  45861.     self sendMessage: WM_SETREDRAW wParam: aBoolean asParameter
  45862. !
  45863.  
  45864. setScrollInfo: siStruct bar: bar
  45865.     "Private - Set the specified scroll info for the receivers bar.
  45866.     Answer the current position of the bars thumb."
  45867.  
  45868.     ^UserLibrary default 
  45869.         setScrollInfo: self asParameter 
  45870.             fnBar: bar 
  45871.             lpsi: siStruct 
  45872.             fRedraw: true!
  45873.  
  45874. setTimer: id interval: interval
  45875.     "Private - Sets up a timer for this window. The <integer> timer identifier (id)
  45876.     will be passed to the wmTimer:wParam:lParam: event approximately every
  45877.     <integer> interval milliseconds. Answers true if the function succeeds."
  45878.  
  45879.     id == WM_ENTERIDLE
  45880.         ifTrue: [^self error: 'Sorry, timer id ', WM_ENTERIDLE displayString, ' is reserved for system purposes.'].
  45881.     ^(UserLibrary default setTimer: self asParameter nIDEvent: id uElapse: interval lpTimerFunc: nil) ~= 0!
  45882.  
  45883. setWindowExStyle: anInteger
  45884.     "Private - Set the receiver's extended window style bits to anInteger."
  45885.  
  45886.     self setWindowLong: GWL_EXSTYLE to: anInteger !
  45887.  
  45888. setWindowLong: anIntegerOffset to: anIntegerValue
  45889.     "Private - Set the receiver's Window DWORD at the specified offset to the specified integer value."
  45890.  
  45891.     ^UserLibrary default
  45892.         setWindowLong: self asParameter
  45893.         nIndex: anIntegerOffset
  45894.         dwNewLong: anIntegerValue!
  45895.  
  45896. setWindowPosAfter: aWindow x: xInteger y: yInteger width: widthInteger height: heightInteger flags: flagsInteger
  45897.     "Private - Set the 'position' of the receiver. Answer whether the request
  45898.     succeeded."
  45899.  
  45900.     ^UserLibrary default
  45901.         setWindowPos: self asParameter 
  45902.         hWndInsertAfter: aWindow asParameter
  45903.         x: xInteger y: yInteger
  45904.         cx: widthInteger cy: heightInteger
  45905.         uFlags: flagsInteger!
  45906.  
  45907. setWindowStyle: aDWORD
  45908.     "Private - Set the receiver's window style bits to aDWORD."
  45909.  
  45910.     UserLibrary default
  45911.         setWindowDWORD: self asParameter
  45912.         nIndex: GWL_STYLE
  45913.         dwNewDWORD: aDWORD!
  45914.  
  45915. setWindowText: aString
  45916.     "Private - Sets the text of the receiver"
  45917.  
  45918.     ^UserLibrary default setWindowText: self asParameter lpString: aString!
  45919.  
  45920. setWndProc: anAddress
  45921.     "Private - Set the window procedure of the receiver to the argument, anAddress.
  45922.     Answer the old window procedure address."
  45923.  
  45924.     ^UserLibrary default
  45925.         setWindowDWORD: self asParameter
  45926.         nIndex: GWL_WNDPROC
  45927.         dwNewDWORD: anAddress!
  45928.  
  45929. show
  45930.     "Makes the receiver visible."
  45931.  
  45932.     self isOpen ifFalse: [self create].
  45933.     self showWithStyle: self defaultShowStyle!
  45934.  
  45935. showShell
  45936.     "Private - Show the receiver within a shell"
  45937.  
  45938.     | shell |
  45939.     shell := ShellView new create; yourself.
  45940.     shell extent: (shell calcExtentFromClientExtent: self defaultExtent).
  45941.     shell layoutManager: GridLayout new.
  45942.     self parentView: shell.
  45943.     self create show.
  45944.     shell show!
  45945.  
  45946. showWithStyle: anInteger
  45947.     "Private - Makes this window appear with the required style.
  45948.     Answer whether the window was previously visible."
  45949.  
  45950.     ^UserLibrary default showWindow: self asParameter nCmdShow: anInteger!
  45951.  
  45952. state
  45953.     "Private - Answer a MessageSequence which, when replayed, will restore the receiver 
  45954.     to its current state.
  45955.     Implementation Note: We avoid saving unecessary window state by only recording 
  45956.     differences from the default state of a new View. This reduces the size of View resources
  45957.     and a saved image, and speeds up view restoration."
  45958.  
  45959.     | answer |
  45960.     answer := MessageSequence new.
  45961.     handle notNull 
  45962.         ifTrue: 
  45963.             [| txt |
  45964.             answer add: (MessageSend 
  45965.                         receiver: self
  45966.                         selector: #createAt:extent:
  45967.                         arguments: (Array with: self position with: self extent)).
  45968.             self isPersistentlyDisabled 
  45969.                 ifTrue: 
  45970.                     [answer add: (MessageSend 
  45971.                                 receiver: self
  45972.                                 selector: #isEnabled:
  45973.                                 argument: false)].
  45974.             self contextMenu isNil 
  45975.                 ifFalse: 
  45976.                     ["views do not have context menus by default"
  45977.  
  45978.                     answer add: (MessageSend 
  45979.                                 receiver: self
  45980.                                 selector: #contextMenu:
  45981.                                 argument: self contextMenu)].
  45982.             (txt := self text) notEmpty 
  45983.                 ifTrue: 
  45984.                     ["views have no text by default"
  45985.  
  45986.                     answer add: (MessageSend 
  45987.                                 receiver: self
  45988.                                 selector: #text:
  45989.                                 argument: txt)]].
  45990.     ^answer!
  45991.  
  45992. state: aMessageSequence
  45993.     "Private - Restore the receiver to the state saved in the <MessageSequence> argument."
  45994.  
  45995.     aMessageSequence value!
  45996.  
  45997. stbSaveOn: anSTBOutFiler
  45998.     "Output the receiver to anSTBOutFiler.
  45999.     Implementation Note: No need to override events collection with nil, as filed out as a proxy
  46000.     which will do that. Note, however, that (for performance reasons) STBViewProxy statically
  46001.     records the indices of certain instance variables here defined, and if new instance variables
  46002.     are added not only must the STBViewProxy conversion block be updated, but it may also
  46003.     be necessary to re-initialize STBViewProxy so the class variables are updated."
  46004.  
  46005.     anSTBOutFiler saveObject: self as: self filerProxy!
  46006.  
  46007. styles
  46008.     "Answer a two element Array containing the creation style bits for the receiver.
  46009.     See the comment under #style:"
  46010.  
  46011.     ^creationStyle!
  46012.  
  46013. styles: aStyleArray 
  46014.     "Private - Sets the creation style bits for the receiver from the two element aStyleArray. 
  46015.     Windows seems to use the style bits as a rather confusing mixture of style and state (for example
  46016.     WS_VSCROLL is used at creation time to indicate whether a vertical scroll bar
  46017.     is required. Later it is used to indicate the actual presence of the bar). Here
  46018.     we save the style bits so they can later be used if the window needs re-creating"
  46019.  
  46020.     creationStyle := aStyleArray.
  46021.     handle isNil ifTrue: [^self].
  46022.     self setWindowStyle: self baseStyle.
  46023.     self setWindowExStyle: self extendedStyle!
  46024.  
  46025. subclassWindow
  46026.     "Private - Install the Dolphin VM's WndProc as the Window Procedure of the receiver's window.
  46027.     This is a helper function to be sent from View classes which need to be subclassed (e.g. 
  46028.     ControlViews) in order that messages are received and dispatched through the Dolphin WndProc.
  46029.     The previous window procedure is typically stored in an instance variable, since windows
  46030.     can be 'subclassed' on an instance specific basis, and we may be subclassing a window
  46031.     that has already been subclassed (!!)."
  46032.  
  46033.     | dolphinWndProc oldProc |
  46034.     dolphinWndProc := VMLibrary default getWndProc.
  46035.     (oldProc := self setWndProc: dolphinWndProc) = dolphinWndProc 
  46036.         ifFalse: [self oldWndProc: oldProc]!
  46037.  
  46038. subclassWindow: hWnd
  46039.     "Private - Subclass the receiver's associated Win32 window, if necessary, by substituting the VM's 
  46040.     window procedure and saving the old one, and record hWnd as the handle of the receiver's window.
  46041.     Windows of Smalltalk registered classes (i.e. most windows apart from Windows controls) need only 
  46042.     record the handle passed by the VM (which has previously been instructed to hook the window create
  46043.     for the receiver).
  46044.     Implementation Note: This message is sent by the VM with asynchronous process switching disabled."
  46045.  
  46046.     self attachHandle: hWnd!
  46047.  
  46048. subViewFromPoint: aPoint
  46049.     "Answers the receiver's immediate subview beneath aPoint (in the receiver's coordinates)
  46050.     or nil if the receiver has no subview under that point.
  46051.     Implementation Note: Priority is given to non-transparent subviews, even if overlapped
  46052.     by transparent subviews."
  46053.  
  46054.     | viewFound |
  46055.     viewFound := self subViewFromPoint: aPoint flags: ##(CWP_SKIPTRANSPARENT | CWP_SKIPINVISIBLE | CWP_SKIPDISABLED).
  46056.     ^viewFound isNil 
  46057.         ifTrue: [    "Look for a transparent subview"
  46058.             self subViewFromPoint: aPoint flags: CWP_ALL]
  46059.         ifFalse: [viewFound]!
  46060.  
  46061. subViewFromPoint: aPoint flags: cwpFlags
  46062.     "Answers the View in the receiver beneath aPoint (in the receivers coordinates)."
  46063.  
  46064.     | handleFound viewFound |
  46065.     handleFound := UserLibrary default 
  46066.         childWindowFromPointEx: self asParameter pt: aPoint asParameter uFlags: cwpFlags.
  46067.     ^(handleFound notNil
  46068.         and: [handleFound ~= self handle
  46069.             and: [(viewFound := self class withHandle: handleFound) notNil
  46070.                 and: [viewFound isManaged]]])
  46071.         ifTrue: [viewFound]!
  46072.  
  46073. subViews
  46074.     "Answer a sequenceable collection of the sub views of the receiver in 
  46075.     z-order sequence"
  46076.  
  46077.     | answer child |
  46078.     answer := OrderedCollection new.
  46079.     child := self getFirstChild.
  46080.     [child notNil] whileTrue: 
  46081.             [| childView |
  46082.             childView := View withHandle: child.
  46083.             childView notNil 
  46084.                 ifTrue: [answer addLast: childView]
  46085.                 ifFalse: [childView := View fromHandle: child].
  46086.             child := UserLibrary default getWindow: childView asParameter uCmd: GW_HWNDNEXT].
  46087.     ^answer!
  46088.  
  46089. tabFirst
  46090.     "Set focus to the receiver"
  46091.  
  46092.     ^self tabFocus!
  46093.  
  46094. tabFocus
  46095.     "Private - Sets focus to the receiver. Answers the View which previously had focus,
  46096.     or nil if none/invalid handle."
  46097.  
  46098.     ^self setFocus!
  46099.  
  46100. tabNext
  46101.     "Tab to next control after the receiver in the tab order of the parent."
  46102.  
  46103.     | parent next |
  46104.     parent := self parentView.
  46105.     [parent notNil and: [next isNil]] whileTrue: [
  46106.         next := parent tabNextSiblingFrom: self forward: true.
  46107.         parent := parent parentView].
  46108.     next isNil ifFalse: [next tabFocus]!
  46109.  
  46110. tabNextSiblingFrom: aView forward: aBoolean 
  46111.     "Private - Answer the next sibling view after aView in the TAB sequence of the receiver,
  46112.     or nil if there is none."
  46113.  
  46114.     "There seems to be a bug in GetNextDlgTabItem().
  46115.     If you ask for the next item after nil, it answers the first (as documented).
  46116.     But if you ask for the previous item before nil it doesn't answer the last.
  46117.     Instead, it answers nil. We handle this as a special case."
  46118.  
  46119.     | nextHandle nextView |
  46120.     (aView isNil and: [aBoolean not]) 
  46121.         ifTrue: 
  46122.             ["Find the first item in the TAB sequence ..."
  46123.  
  46124.             nextHandle := UserLibrary default 
  46125.                         getNextDlgTabItem: self asParameter
  46126.                         hCtl: nil asParameter
  46127.                         bPrevious: false.
  46128.             "... and then ask for the item before it.
  46129.             This will give us the last item."
  46130.             nextHandle := UserLibrary default 
  46131.                         getNextDlgTabItem: self asParameter
  46132.                         hCtl: nextHandle
  46133.                         bPrevious: true]
  46134.         ifFalse: 
  46135.             [nextHandle := UserLibrary default 
  46136.                         getNextDlgTabItem: self asParameter
  46137.                         hCtl: aView asParameter
  46138.                         bPrevious: aBoolean not].
  46139.     nextView := View fromHandle: nextHandle.
  46140.     nextView = aView ifTrue: [^nil].
  46141.     nextView = self ifTrue: [^nil].
  46142.  
  46143.     "There's another bug in GetNextDlgTabItem().
  46144.     If there are no TABSTOP children in a container, then the function answers an (arbitary)
  46145.     non-TABSTOP child."
  46146.     nextView isTabStop ifFalse: [^nil].
  46147.     ^nextView!
  46148.  
  46149. text
  46150.     "Answers the text from the receiver.
  46151.     N.B. Some subclasses may answer RichText in response to this message,
  46152.     just as they accept RichText (or plain text) as the argument to #text: 
  46153.     to set their content. To get the plain, unformatted, text from any View, 
  46154.     you must send #plainText."
  46155.  
  46156.     ^self plainText
  46157. !
  46158.  
  46159. text: text
  46160.     "Sets the text for the receiver to the argument, text 
  46161.     (either plain or RichText)."
  46162.  
  46163.     text setTextInto: self
  46164.  
  46165. !
  46166.  
  46167. textLength
  46168.     "Private - Answers the length of text for the receiver.
  46169.     Note that this will send a WM_GETTEXTLENGTH message to the receiver's
  46170.     window."
  46171.  
  46172.     ^UserLibrary default getWindowTextLength: self asParameter!
  46173.  
  46174. toolTipWindow
  46175.     "Private - Answer the WinToolTip for the receiver, or nil if one has not been set."
  46176.  
  46177.     ^self propertyAt: #toolTipWindow ifAbsent: []!
  46178.  
  46179. toolTipWindow: aWinToolTip
  46180.     "Private - Set the tool tip for the receiver to aWinToolTip."
  46181.  
  46182.     self propertyAt: #toolTipWindow put: aWinToolTip!
  46183.  
  46184. topShell
  46185.     "Answer the first <topPresenter> located in the parent chain of the receiver.
  46186.     Note that this is a recursive implementation terminated by a different
  46187.     implementation in ShellView/DesktopView."
  46188.  
  46189.     ^self parentView topShell    !
  46190.  
  46191. topView
  46192.     "Answer the top-most parent of the receiver"
  46193.  
  46194.     | topMost |
  46195.     topMost := self.
  46196.     [ topMost isTopView ] whileFalse: [ topMost := topMost parentView ].
  46197.     ^topMost
  46198.     !
  46199.  
  46200. trackContextMenu: aPointEvent
  46201.     "Private - Shows and tracks a context menu for the receiver from the 
  46202.     mouse position in aContextMenuEvent. Answer nil if the receiver does not
  46203.     have a contextMenu to show, or a Boolean if it has."
  46204.  
  46205.     | menu |
  46206.     menu := self queryContextMenu.
  46207.     ^menu notNil ifTrue: [ | pos |
  46208.         pos := aPointEvent position.
  46209.         pos = (-1@-1) ifTrue: [pos := self positionForKeyboardContextMenu].
  46210.         menu showIn: self position: pos.
  46211.         true]
  46212. !
  46213.  
  46214. unhookWindowCreate: hWnd
  46215.     "Private - Undo #hookWindowCreate. The VM auto-unhooks, but if the window
  46216.     create fails this needs to be called as the VM may not have received
  46217.     any messages. We unhook before raising any error."
  46218.  
  46219.     self primHookWindowCreate: false.
  46220.     hWnd isNull
  46221.         ifTrue: [^Win32Error signal: 'failed to create window']
  46222. !
  46223.  
  46224. update
  46225.     "Repaint the receiver as necessary, immediately.
  46226.     N.B. This causes a callback as Windows sends a WM_PAINT directly."
  46227.  
  46228.     UserLibrary default updateWindow: self asParameter!
  46229.  
  46230. updateModel
  46231.     "Flush changes in the view back to the associated model.
  46232.     Some views cache their edit changes and do not modify the 
  46233.     model data until the edit is complete. Such subclasses should
  46234.     override this method to update the model if there have been
  46235.     changes"
  46236. !
  46237.  
  46238. usePreferredExtent
  46239.     "Answers true if the receiver's preferred extent should be used by a layout manager when
  46240.     laying out the contents of a container view containing the receiver"
  46241.  
  46242.     ^flags anyMask: UsePreferredExtentMask!
  46243.  
  46244. usePreferredExtent: aBoolean
  46245.     "Set the receiver to use it's preferred extent during layout according to aBoolean"
  46246.  
  46247.     flags := flags mask: UsePreferredExtentMask set: aBoolean.
  46248.     self isOpen ifTrue: [self parentView invalidateLayout]!
  46249.  
  46250. validate
  46251.     "Validate the entire client area so that it will be not be re-painted"
  46252.  
  46253.     self validateRect: nil. !
  46254.  
  46255. validateLayout
  46256.     "Validates the layout for the receiver"
  46257.  
  46258.     [ self isLayoutValid ] whileFalse: [
  46259.         flags := flags maskSet: LayoutValidMask.
  46260.         self layout ].!
  46261.  
  46262. validateRect: rectangle
  46263.     "Validates the specified client rectangle (a RECT, Rectangle, or nil for the whole client window).
  46264.     Answer whether the function succeeds."
  46265.  
  46266.     ^UserLibrary default validate: self asParameter lpRect: rectangle asParameter!
  46267.  
  46268. validateUserInterface
  46269.     "Validates the user interface for the receiver. Usually performed at idle time
  46270.     when the UI has been flagged as being invalid"
  46271. !
  46272.  
  46273. view
  46274.     "Answer the view associated with the receiver. Part of the <presenter>
  46275.     protocol used when the receiver is in fact its own presenter"
  46276.  
  46277.     ^self!
  46278.  
  46279. viewNamed: aString
  46280.     "Answer the sub-view within the receiver's hierarchy with aString as its
  46281.     name. Signals a NotFoundError if no matching named view exists."
  46282.  
  46283.     ^self viewNamed: aString ifNone: [self errorNotFound: aString]!
  46284.  
  46285. viewNamed: aString ifNone: aBlock
  46286.     "Answer the sub-view within the receiver's hierarchy with aString as its
  46287.     name. Evaluates aBlock if no matching named view exists. Elementary views
  46288.     have no named sub views"
  46289.  
  46290.     ^aBlock value!
  46291.  
  46292. visualObjectAtPoint: aPoint
  46293.     "Private - Answers the object that will be found by the VisualObjectFinder at aPoint (in local coordinates)
  46294.     within the receiver"
  46295.  
  46296.     ^self presenter!
  46297.  
  46298. width
  46299.     "Answer the width of the receiver's outer window."
  46300.  
  46301.     ^self getWindowRect width!
  46302.  
  46303. width: anInteger
  46304.     "Sets the width of the receiver's outer window to anInteger."
  46305.  
  46306.     self extent: anInteger @ self height
  46307. !
  46308.  
  46309. windowName
  46310.     ^''!
  46311.  
  46312. winFinalize
  46313.     "Private - Perform finalization actions for this view on destruction of the associated Window.
  46314.     Implementation Note: We don't release events/dependents if the view is being destroyed
  46315.     as the result of a recreate (noted by the state restoring flag being set), and also we don't
  46316.     nil the handle at this stage because it may be required to complete processing of the
  46317.     destroy message that caused this finalization."
  46318.  
  46319.     self isStateRestoring ifFalse: [self release].
  46320.     SessionManager inputState removeWindowAt: handle!
  46321.  
  46322. withAllParents
  46323.     "Answer an OrderedCollection of self and all its parent Views."
  46324.  
  46325.     ^(OrderedCollection with: self)
  46326.         addAll: self allParents;
  46327.         yourself!
  46328.  
  46329. withAllSubViews
  46330.     "Answer an OrderedCollection of self and all its sub views."
  46331.  
  46332.     ^(OrderedCollection with: self)
  46333.         addAll: self allSubViews;
  46334.         yourself!
  46335.  
  46336. wmActivate: message wParam: wParam lParam: lParam
  46337.     "Private - Default handler for a WM_ACTIVATE.
  46338.     Answer nil to accept default window processing."
  46339.  
  46340.     ^nil!
  46341.  
  46342. wmBeginDrag: message wParam: wParam lParam: lParam
  46343.     "Private - Default handler for a WM_BEGINNDRAG notification that dragging
  46344.     has started within child list box."
  46345.  
  46346.     | listbox |
  46347.     listbox := self class withHandle: lParam.
  46348.     ^listbox lbnBeginDrag: wParam.
  46349. !
  46350.  
  46351. wmCancelMode: message wParam: wParam lParam: lParam
  46352.     "Private - Default handler for WM_CANCELMODE"
  46353.  
  46354.     ^nil
  46355. !
  46356.  
  46357. wmCaptureChanged: message wParam: wParam lParam: lParam
  46358.     "Private - Default handler for WM_CAPTURECHANGED."
  46359.  
  46360.     ^self interactor onCaptureChanged: (self class withHandle: lParam)!
  46361.  
  46362. wmChar: message wParam: wParam lParam: lParam 
  46363.     "Private - Default handler for a WM_CHAR. Forward to the receiver #onKeyTyped: handler
  46364.     which should answer a non-Integer/non-Boolean value if it wants to accept
  46365.     the default processing for the message."
  46366.  
  46367.     ^self interactor onKeyTyped: (KeyEvent 
  46368.                 message: message
  46369.                 handle: handle
  46370.                 wParam: wParam
  46371.                 lParam: lParam)!
  46372.  
  46373. wmClose: message wParam: wParam lParam: lParam
  46374.     "Private - This window has been asked to close, answer whether or not it accepts the request."
  46375.  
  46376.     ^self onCloseRequested!
  46377.  
  46378. wmCommand: message wParam: wParam lParam: lParam 
  46379.     "Private - Handles a WM_COMMAND message. These can originate in a variety of ways each with slightly different
  46380.     processing requirements as follows:
  46381.         Control notifications commands        -    Pass onto the control window via #command:
  46382.         Pull down menu commmand        -    Pass onto focus window via #onCommand:
  46383.         Context menu command            -     Pass onto receiver window via #onCommand:"
  46384.  
  46385.     | id |
  46386.     id := wParam lowWord.
  46387.     ^lParam isNull 
  46388.         ifTrue: 
  46389.             ["Check for context menus"
  46390.             | foundCommand |
  46391.             (foundCommand := CommandDescription withId: id ifAbsent: []) notNil 
  46392.                 ifTrue: [self onCommand: foundCommand]
  46393.                 ifFalse: 
  46394.                     ["accept the default processing"
  46395.                     ]]
  46396.         ifFalse: 
  46397.             ["Command notification from a control."
  46398.             | control |
  46399.             control := self class withHandle: lParam.
  46400.             control notNil 
  46401.                 ifTrue: [control command: wParam highWord id: id]
  46402.                 ifFalse: 
  46403.                     ["accept the default processing"
  46404.                     ]]!
  46405.  
  46406. wmContextMenu: message wParam: wParam lParam: lParam
  46407.     "Private - Shows and tracks a context menu for the receiver"
  46408.  
  46409.     ^self trackContextMenu: (PointEvent message: message handle: handle wParam: wParam lParam: lParam)
  46410. !
  46411.  
  46412. wmCreate: message wParam: wParam lParam: lParam
  46413.     "Private - Default handler for a WM_CREATE."
  46414.  
  46415.     interactor isNil 
  46416.         ifTrue: 
  46417.             ["Necessary for some old resources"
  46418.  
  46419.             interactor := self presenter].
  46420.     self onCreated: (WindowsEvent 
  46421.                 message: message
  46422.                 handle: handle
  46423.                 wParam: wParam
  46424.                 lParam: lParam).
  46425.     ^self 
  46426.         defaultWindowProcessing: message
  46427.         wParam: wParam
  46428.         lParam: lParam!
  46429.  
  46430. wmCtlColor: message wParam: wParam lParam: lParam
  46431.     "Private - Default handler for a WM_CTLCOLORXXX message."
  46432.  
  46433.     | window |
  46434.     window := self class withHandle: lParam.
  46435.     ^window notNil ifTrue: [
  46436.         window onColorRequired: (ColorEvent message: message handle: handle wParam: wParam lParam: lParam)]!
  46437.  
  46438. wmDestroy: message wParam: wParam lParam: lParam
  46439.     "Private - This receiver is being destroyed."
  46440.  
  46441.     ^self onDestroyed!
  46442.  
  46443. wmDrawItem: message wParam: wParam lParam: lParam
  46444.     "Private - Default handler for a WM_DRAWITEM."
  46445.  
  46446.     | destinationWindow |
  46447.     destinationWindow := self class withHandle: (lParam asExternalAddress dwordAtOffset: 20).
  46448.     ^destinationWindow notNil
  46449.         ifTrue: [destinationWindow wmDrawItem: message wParam: wParam lParam: lParam]
  46450.         ifFalse: ["accept the default processing"]
  46451.  
  46452. !
  46453.  
  46454. wmEnterIdle: message wParam: wParam lParam: lParam
  46455.     "Private - Default handler for WM_ENTERIDLE.
  46456.     The intent of the sleep here is to give background tasks a change to run when Windows
  46457.     is performing some task (such as displaying a common dialog box) which steals all
  46458.     of Dolphin's cycles."
  46459.  
  46460.     "We'll try disrupting the user's menu activities too, and see how it
  46461.     works out, if there's a problem, re-enable this line.!!!!"
  46462.     "wParam = MSGF_MENU ifTrue: [^nil]."
  46463.  
  46464.     SessionManager inputState enterIdle. 
  46465.     ^0!
  46466.  
  46467. wmEnterMenuLoop: message wParam: wParam lParam: lParam
  46468.     "Private - The system has entered the modal menu loop.
  46469.     Implementation Note: The menu loop steals all our processor cycles, and it doesn't even
  46470.     send WM_ENTERIDLE messages unless the mouse is moved. This means that if a menu
  46471.     is popped, the entire system grinds to a halt. To prevent this happening we schedule a
  46472.     special timer while the menu loop is active. Be warned, this uses a magic number for
  46473.     the timer (WM_ENTERIDLE = 289). The timer fires every 1/10th of a second."
  46474.  
  46475.     SessionManager inputState startIdleTimer: self.
  46476.     ^nil!
  46477.  
  46478. wmEraseBkGnd: message wParam: wParam lParam: lParam
  46479.     "Private - Handle the WM_ERASEBKGND message from Windows. This is sent to clear an area of
  46480.     a window during a repaint (normally when BeginPaint() is called)."
  46481.  
  46482.     "self ensureLayoutValid."
  46483.     ^self onEraseRequired: (ColorEvent message: message handle: handle wParam: wParam lParam: lParam)!
  46484.  
  46485. wmExitMenuLoop: message wParam: wParam lParam: lParam
  46486.     "Private - The system has exited the modal menu loop. 
  46487.     Implementation Note: See wmEnterMenuLoop:&c. We must ensure the idle
  46488.     kick timer is killed."
  46489.  
  46490.     SessionManager inputState stopIdleTimer: self.
  46491.     ^nil!
  46492.  
  46493. wmGetDlgCode: message wParam: wParam lParam: aMSGAddress
  46494.     "Private - Low-level handler for a WM_GETDLGCODE sent by Windows to determine what
  46495.     input a particular window would like (usually when the window receivers focus).
  46496.     The lParam is a pointer to the MSG that may be sent depending on the response.
  46497.     The answer should be some combination of DLGC_XXXX flags (e.g. DLGC_WANTARROWS |
  46498.     DLGC_WANTTAB)."
  46499.  
  46500.     ^self presenter onInputMaskRequired: (WindowsEvent 
  46501.                 message: message
  46502.                 handle: handle
  46503.                 wParam: wParam
  46504.                 lParam: aMSGAddress)!
  46505.  
  46506. wmGetMinMaxInfo: message wParam: wParam lParam: lParam 
  46507.     "Private - Default handler for a WM_GETMINMAXINFO message."
  46508.  
  46509.     ^nil!
  46510.  
  46511. wmHScroll: message wParam: wParam lParam: lParam 
  46512.     "Private - A vertical Scroll event has occured. Pass onto receivers controller. Have to check
  46513.     whether the event came from a standard scrool bar or a scroll bar controller."
  46514.  
  46515.     ^(lParam == 0 
  46516.         ifTrue: [self]
  46517.         ifFalse: [SessionManager inputState windowAt: lParam ifAbsent: []]) ifNotNil: 
  46518.                 [:window | 
  46519.                 window onHScroll: (ScrollEvent 
  46520.                             message: message
  46521.                             handle: handle
  46522.                             wParam: wParam
  46523.                             lParam: lParam)]!
  46524.  
  46525. wmIdleUpdateCmdUI: message wParam: wParam lParam: lParam
  46526.     "Private - Default handler for a WM_IDLEUPDATECMDUI.
  46527.     WM_IDLEUPDATECMDUI is not a 'real' Windows message, but is one in the
  46528.     range reserved for MFC use. We have the same requirement for idle time
  46529.     status updating of visual user interface elements such as toolbar buttons, so
  46530.     it makes sense to use the same message."
  46531.  
  46532.     self presenter onIdleEntered.
  46533.     ^true!
  46534.  
  46535. wmInitMenu: message wParam: wParam lParam: lParam
  46536.     "Private - Default handler for initializing bar menus to screen.
  46537.     Answer nil to accept default window processing as this is
  46538.     relevant only to <ShellView>s."
  46539.  
  46540.     ^nil
  46541.  
  46542. !
  46543.  
  46544. wmInitMenuPopup: message wParam: wParam lParam: lParam
  46545.     "Private - Context menu or sub-menu can update its state on screen to reflect the
  46546.     current event target."
  46547.  
  46548.     | ctxtMenu subMenu |
  46549.     lParam highWord ~= 0 ifTrue: [^nil "default processing for system menus" ].
  46550.     ^((ctxtMenu := self queryContextMenu) notNil 
  46551.             and: [(subMenu := ctxtMenu menuFromHandle: wParam) notNil])
  46552.         ifTrue: [subMenu queryAllFromView: self].
  46553. !
  46554.  
  46555. wmKeyDown: message wParam: wParam lParam: lParam 
  46556.     "Private - Default handler for a WM_KEYDOWN."
  46557.  
  46558.     ^self interactor onKeyPressed: (KeyEvent 
  46559.                 message: message
  46560.                 handle: handle
  46561.                 wParam: wParam
  46562.                 lParam: lParam)!
  46563.  
  46564. wmKeyUp: message wParam: wParam lParam: lParam 
  46565.     "Private - Default handler for a WM_KEYUP."
  46566.  
  46567.     ^self interactor onKeyReleased: (KeyEvent 
  46568.                 message: message
  46569.                 handle: handle
  46570.                 wParam: wParam
  46571.                 lParam: lParam)!
  46572.  
  46573. wmKillFocus: message wParam: wParam lParam: lParam
  46574.     "Private - This window is losing focus"
  46575.  
  46576.     ^self presenter onKillFocus!
  46577.  
  46578. wmLButtonDblClk: message wParam: wParam lParam: lParam 
  46579.     "Private - Default handler for a WM_LBUTTONDBLCLICK event."
  46580.  
  46581.     ^self interactor onLeftButtonDoubleClicked: (MouseEvent 
  46582.                 message: message
  46583.                 handle: handle
  46584.                 wParam: wParam
  46585.                 lParam: lParam)!
  46586.  
  46587. wmLButtonDown: message wParam: wParam lParam: lParam 
  46588.     "Private - Default handler for a WM_LBUTTONDOWN event."
  46589.  
  46590.     ^self interactor onLeftButtonPressed: (MouseEvent 
  46591.                 message: message
  46592.                 handle: handle
  46593.                 wParam: wParam
  46594.                 lParam: lParam)!
  46595.  
  46596. wmLButtonUp: message wParam: wParam lParam: lParam 
  46597.     "Private - Default handler for a WM_LBUTTONUP event."
  46598.  
  46599.     ^self interactor onLeftButtonReleased: (MouseEvent 
  46600.                 message: message
  46601.                 handle: handle
  46602.                 wParam: wParam
  46603.                 lParam: lParam)!
  46604.  
  46605. wmMButtonDblClk: message wParam: wParam lParam: lParam 
  46606.     "Private - Default handler for a WM_MBUTTONDBLCLICK event."
  46607.  
  46608.     ^self interactor onMiddleButtonDoubleClicked: (MouseEvent 
  46609.                 message: message
  46610.                 handle: handle
  46611.                 wParam: wParam
  46612.                 lParam: lParam)
  46613. !
  46614.  
  46615. wmMButtonDown: message wParam: wParam lParam: lParam
  46616.     ^self interactor onMiddleButtonPressed: (MouseEvent 
  46617.                 message: message
  46618.                 handle: handle
  46619.                 wParam: wParam
  46620.                 lParam: lParam)!
  46621.  
  46622. wmMButtonUp: message wParam: wParam lParam: lParam 
  46623.     "Private - Default handler for a WM_MBUTTONUP event."
  46624.  
  46625.     ^self interactor onMiddleButtonReleased: (MouseEvent 
  46626.                 message: message
  46627.                 handle: handle
  46628.                 wParam: wParam
  46629.                 lParam: lParam)
  46630. !
  46631.  
  46632. wmMouseActivate: message wParam: wParam lParam: lParam
  46633.     "Private - Default handler for a WM_MOUSEACTIVATE.
  46634.     Answer nil to accept default window processing."
  46635.  
  46636.     ^nil!
  46637.  
  46638. wmMouseMove: message wParam: wParam lParam: lParam 
  46639.     "Private - Default handler for a WM_MOUSEMOVE event."
  46640.  
  46641.     ^self interactor onMouseMoved: (MouseEvent 
  46642.                 message: message
  46643.                 handle: handle
  46644.                 wParam: wParam
  46645.                 lParam: lParam)!
  46646.  
  46647. wmMouseWheel: message wParam: wParam lParam: lParam 
  46648.     "Private - Default handler for a WM_MOUSEWHEEL event."
  46649.  
  46650.     ^self interactor onMouseWheeled: (MouseEvent 
  46651.                 message: message
  46652.                 handle: handle
  46653.                 wParam: wParam
  46654.                 lParam: lParam)!
  46655.  
  46656. wmNcCalcSize: message wParam: wParam lParam: lParam
  46657.     "Private - Default handler for a WM_NCCALCSIZE message. 
  46658.     See MSDN for further information about this Windows message."
  46659.  
  46660.     ^nil
  46661. !
  46662.  
  46663. wmNcCreate: message wParam: wParam lParam: lParam
  46664.     "Private - Default handler for a WM_NCCREATE. 
  46665.     Answer nil to accept default window processing."
  46666.  
  46667.     ^nil
  46668. !
  46669.  
  46670. wmNcDestroy: message wParam: wParam lParam: lParam
  46671.     "Private - Notification that a window is about to disappear so we
  46672.      remove it from our management."
  46673.  
  46674.     | answer |
  46675.     self presenter onViewDestroyed.
  46676.     self winFinalize.
  46677.     answer := self defaultWindowProcessing: message wParam: wParam lParam: lParam.
  46678.     handle := nil.
  46679.     self isStateRestoring     "If not being recreated, discard the presenter"
  46680.         ifFalse: [interactor := creationParent := presenter := DeafObject current].
  46681.     ^answer!
  46682.  
  46683. wmNcHitTest: message wParam: wParam lParam: lParam
  46684.     "Private - Default handler for a WM_NCHITTEST. 
  46685.     Answer nil to accept default window processing."
  46686.  
  46687.     ^nil
  46688. !
  46689.  
  46690. wmNcPaint: message wParam: wParam lParam: lParam
  46691.     "Private - This window non-client area requires painting. 
  46692.     Do not set a breakpoint in this or subordinate methods, and beware errors!!"
  46693.  
  46694.     ^nil!
  46695.  
  46696. wmNotify: message wParam: wParam lParam: lParam
  46697.     "Private - Redirects WM_NOTIFY messages to the appropriate control as a notify message.
  46698.     Test control for nil because RichText instances receive a EN_SAVECLIPBOARD if
  46699.     they write to the clipboard, AFTER they receive wmNcDestroy. Don't know why."
  46700.  
  46701.     | pNMHdr control |
  46702.     "Rather than create a structure here, we just treat as an address as notifications
  46703.      are very frequent and mostly ignored."
  46704.     pNMHdr := lParam asExternalAddress.
  46705.     ^(control := self class withHandle: (pNMHdr dwordAtOffset: 0)) notNil
  46706.         ifTrue: [control nmNotify: pNMHdr]!
  46707.  
  46708. wmPaint: message wParam: wParam lParam: lParam
  46709.     "Private - This window requires painting. By default we use the internal painting
  46710.      dispatch."
  46711.  
  46712.     self ensureLayoutValid ifTrue: [^1]. "Old paint region probably different now so get Windows to send again"
  46713.     ^self basicPaint: message wParam: wParam lParam: lParam
  46714.  
  46715. !
  46716.  
  46717. wmParentNotify: message wParam: wParam lParam: lParam 
  46718.     "Private - This window received a notification from one of its children"
  46719.  
  46720.     | id |
  46721.     id := wParam lowWord.
  46722.     id = WM_CREATE 
  46723.         ifTrue: 
  46724.             ["Redirect WM_CREATE notifications to the child that has been created"
  46725.             | window |
  46726.             window := self class withHandle: lParam.
  46727.             window notNil ifTrue: [window onFullyCreated]].
  46728.     ^nil!
  46729.  
  46730. wmQueryEndSession: message wParam: wParam lParam: lParam
  46731.     "Private - This system is shutting down, answer false if we'd rather it didn't"
  46732.  
  46733.     ^SessionManager current onQueryEndSession!
  46734.  
  46735. wmRButtonDblClk: message wParam: wParam lParam: lParam
  46736.     "Private - Default handler for a WM_RBUTTONDBLCLICK."
  46737.  
  46738.     ^self     interactor
  46739.         onRightButtonDoubleClicked: (MouseEvent message: message handle: handle wParam: wParam lParam: lParam)!
  46740.  
  46741. wmRButtonDown: message wParam: wParam lParam: lParam
  46742.     "Private - Default handler for a WM_RBUTTONDOWN."
  46743.  
  46744.     ^self interactor
  46745.         onRightButtonPressed: (MouseEvent message: message handle: handle wParam: wParam lParam: lParam)!
  46746.  
  46747. wmRButtonUp: message wParam: wParam lParam: lParam
  46748.     "Private - Default handler for a WM_RBUTTONUP."
  46749.  
  46750.     ^self interactor
  46751.         onRightButtonReleased: (MouseEvent message: message handle: handle wParam: wParam lParam: lParam)!
  46752.  
  46753. wmSetCursor: message wParam: wParam lParam: lParam
  46754.     "Private - Handle the Win32 WM_SETCURSOR message."
  46755.  
  46756.     | myCursor hitType |
  46757.     hitType := #(#transparent #nowhere #client #caption #sysMenu #size #menu #hscroll #vscroll #minimize #maximize #left #right #top #topLeft #topRight #bottom #bottomLeft #bottomRight #border #object #close #help) 
  46758.                 at: lParam lowSWord + 2
  46759.                 ifAbsent: [#error].
  46760.     myCursor := self interactor onGetCursor: hitType.
  46761.     ^myCursor isNil 
  46762.         ifFalse: 
  46763.             [myCursor setCursor.
  46764.             true]!
  46765.  
  46766. wmSetFocus: message wParam: wParam lParam: lParam
  46767.     "Private - This window is getting focus."
  46768.  
  46769.     ^self presenter onSetFocus!
  46770.  
  46771. wmShowWindow: message wParam: wParam lParam: lParam
  46772.     "Private - The receiver window is being shown (i.e. made visible)."
  46773.  
  46774.     ^nil!
  46775.  
  46776. wmSize: message wParam: wParam lParam: lParam
  46777.     "Private - Default handler for a WM_SIZE (window resized) message.
  46778.     As of Dolphin 3.0 this event is largely superceeded by WM_WINDOWPOSCHANGING,
  46779.     and in fact it is suppressed by the default handler for that event."
  46780.  
  46781.     ^nil!
  46782.  
  46783. wmSysColorChange: message wParam: wParam lParam: lParam
  46784.     "Private - A system color change has occurred. Forward the message to all children in case any are
  46785.     common controls (see Win32 help)."
  46786.  
  46787.     self subViews do: [:child | child sendMessage: message wParam: wParam lParam: lParam].
  46788.     ^nil!
  46789.  
  46790. wmSysDeadChar: message wParam: wParam lParam: lParam
  46791.     "Private - Default handler for a WM_SYSDEADCHAR.
  46792.     Answer nil to accept default window processing."
  46793.  
  46794.     ^nil!
  46795.  
  46796. wmSysKeyDown: message wParam: wParam lParam: lParam
  46797.     "Private - Default handler for a WM_SYSKEYDOWN.
  46798.     Answer nil to accept default window processing."
  46799.  
  46800.     ^nil!
  46801.  
  46802. wmSysKeyUp: message wParam: wParam lParam: lParam
  46803.     "Private - Default handler for a WM_SYSKEYUP.
  46804.     Answer nil to accept default window processing."
  46805.  
  46806.     ^nil!
  46807.  
  46808. wmTimer: message wParam: wParam lParam: lParam
  46809.     "Private - A timer event, identified by the <integer> id, wParam, has fired."
  46810.  
  46811.     wParam == WM_ENTERIDLE ifTrue: ["Simulated WM_ENTERIDLE fired when menus popped"
  46812.         SessionManager inputState enterIdle. ^0].
  46813.     self presenter trigger: #timerTick: with: wParam.
  46814.     ^nil!
  46815.  
  46816. wmVScroll: message wParam: wParam lParam: lParam 
  46817.     "Private - A vertical Scroll event has occured. Pass onto the receivers controller. Have to check
  46818.     whether the event came from a standard scroll bar or a scroll bar controller."
  46819.  
  46820.     ^(lParam == 0 
  46821.         ifTrue: [self]
  46822.         ifFalse: [SessionManager inputState windowAt: lParam ifAbsent: []]) ifNotNil: 
  46823.                 [:window | 
  46824.                 window onVScroll: (ScrollEvent 
  46825.                             message: message
  46826.                             handle: handle
  46827.                             wParam: wParam
  46828.                             lParam: lParam)]!
  46829.  
  46830. wmWindowPosChanged: message wParam: wParam lParam: lParam
  46831.     "Private - The position of the receiver has changed in some manner."
  46832.  
  46833.     self isStateRestoring 
  46834.         ifFalse: 
  46835.             [| event |
  46836.             event := PositionEvent 
  46837.                         message: message
  46838.                         handle: handle
  46839.                         wParam: wParam
  46840.                         lParam: lParam.
  46841.             event makeStruct.
  46842.             self presenter onPositionChanged: event].
  46843.     "Ignore any return value from the high-level event, and answer 0 to 
  46844.     prevent the DefWindowProc being invoked, which in turn prevents
  46845.     WM_SIZE and WM_MOVE which we don't use anymore"
  46846.     ^0!
  46847.  
  46848. wmWindowPosChanging: message wParam: wParam lParam: lParam
  46849.     "Private - The position of the receiver is about to change in some manner."
  46850.  
  46851.     ^self isStateRestoring 
  46852.         ifFalse: 
  46853.             [| event |
  46854.             event := PositionEvent 
  46855.                         message: message
  46856.                         handle: handle
  46857.                         wParam: wParam
  46858.                         lParam: lParam.
  46859.             event makeStruct.
  46860.             self presenter onPositionChanging: event]!
  46861.  
  46862. x
  46863.     "Answer the left coordinate of the receiver in the coordinate system of the parent."
  46864.  
  46865.     ^self rectangle left!
  46866.  
  46867. x: anInteger
  46868.     "Sets the left edge position of the receiver to anInteger."
  46869.  
  46870.     self position: (anInteger @ self y)!
  46871.  
  46872. y
  46873.     "Answer the top coordinate of the receiver in the coordinate system of the parent."
  46874.  
  46875.     ^self rectangle top!
  46876.  
  46877. y: anInteger
  46878.     "Sets the top edge position of the receiver to anInteger."
  46879.  
  46880.     self position: (self x @ anInteger)!
  46881.  
  46882. zOrderAfter: aViewOrNil
  46883.     "Change the receiver's Z-order without affecting any other aspects of its
  46884.     position, size, or activation."
  46885.  
  46886.     self zOrderAfter: aViewOrNil withFlags: SWP_NOACTIVATE !
  46887.  
  46888. zOrderAfter: aViewOrNil withFlags: anInteger
  46889.     "Calls the SetWindowPos() API function to set the receiver's Z order.
  46890.     The flags specified by anInteger are ORed with (SWP_NOSIZE | SWP_NOMOVE)."
  46891.  
  46892.     aViewOrNil isNil
  46893.         ifTrue: [ self zOrderTop ]
  46894.         ifFalse: [ self setWindowPosAfter: aViewOrNil asParameter
  46895.             x: 0 y: 0 width: 0 height: 0 
  46896.             flags: (anInteger bitOr: ##(SWP_NOSIZE | SWP_NOMOVE)).
  46897.             self parentView onZOrderChanged ]!
  46898.  
  46899. zOrderBottom
  46900.     "Places the receiver at the bottom of the Z order. If the receiver is a topmost window,
  46901.     it loses its topmost status and is placed at the bottom of all other windows."
  46902.  
  46903.     self zOrderAfter: HWND_BOTTOM.!
  46904.  
  46905. zOrderTop
  46906.     "Brings the receiver to the top of the Z order.
  46907.     If the receiver is a top-level window, it is activated.
  46908.     If the receiver is a child window, the top-level parent view associated with the child is activated."
  46909.  
  46910.     UserLibrary default bringWindowToTop: self asParameter.
  46911.     self parentView onZOrderChanged.! !
  46912.  
  46913. ViewState comment:
  46914. 'ViewState is capable of holding the relevant state of any <view> so that it may be restored to the same state at a later date. Normally, a ViewState is used during an image save to capture the state of all of the open views so that they may be restored when the image is restarted, but it is also used when dynamic recreation of a view is required such as when changing certainWindow styles that may only be applied when a Window is created.
  46915.  
  46916. Instance Variables
  46917.     view        <view> whose state has been saved.
  46918.     state        <monadicValuable> 
  46919.     placement
  46920.     subViewStates'!
  46921. !ViewState class methodsFor!
  46922.  
  46923. new
  46924.     "Private - Use #recordStateOf:"
  46925.  
  46926.     ^self shouldNotImplement!
  46927.  
  46928. recordStateOf: aView forRecreate: aBoolean
  46929.     "Answer an instance of the receiver holding current state information about
  46930.     aView. This will allow aView's handle to be rebuilt when #restore is sent
  46931.     to this instance."
  46932.  
  46933.     ^super new 
  46934.         recordStateOf: aView forRecreate: aBoolean! !
  46935.  
  46936. !ViewState methodsFor!
  46937.  
  46938. recordStateOf: aView forRecreate: aBoolean
  46939.     "Private - Initialize the receiver so that it is capable of restoring
  46940.     the <View>, aView, after it's handle has become invalid. The <boolean>
  46941.     argument, aBoolean, indicates whether the state will be used to
  46942.     immediately restore the receiver, in which case the state restoring
  46943.     flag is set on aView and all its sub-views as they are traversed.
  46944.     Note that the flag is set before the state is recorded, so it can be tested
  46945.     in the #state implementation, but this is not usually necessary."
  46946.  
  46947.     view := aView.
  46948.     aBoolean ifTrue: [view isStateRestoring: true].
  46949.     state := aView state.
  46950.     placement := aView placement.
  46951.     subViewStates := aView subViews collect: [:each |
  46952.         ViewState recordStateOf: each forRecreate: aBoolean]!
  46953.  
  46954. restore
  46955.     "Restore the receiver's view to its former glory"
  46956.  
  46957.     view isStateRestoring: true.
  46958.     view state: state.
  46959.     subViewStates do: [ :each | each restore ].
  46960.     view 
  46961.         placement: placement; 
  46962.         basicInvalidateLayout.
  46963.     view isStateRestoring: false.! !
  46964.  
  46965. Aspect comment:
  46966. 'Part of the PublishedAspectorInspector framework.
  46967.  
  46968. <Aspect>s are used to describe the published aspects of various objects. An Aspect descriptor can be combined with a particular object to create an <AspectAccessor> that can be used to access the subject object with the value/value> protocol. The <AspectAccessor> uses the aspect name to construct accessor messages (e.g. #myAspect and #myAspect:) for getting and setting the value. An Aspect instance also holds a presenter block (a <dyadicValuable>) which, when evaluated, will create a presenter suitable for editing the aspect as its model.
  46969.  
  46970. All objects understand the #publishedAspects message, which is used to answer a <LookupTable> (keyed on aspect name) of all the Aspect descriptors that are published by the object. This additional meta-information is used by the development tools (in particular the <PublishedAspectInspector>) to easily allow user interface editing of various objects. Classes wishing allow such editing must publish aspects for their instances, and should do this by overriding the #publishedAspectsOfInstances method to add appropriate Aspects to this table.
  46971.  
  46972. Instance Variables:
  46973.     name        <Symbol> identifying the aspect.
  46974.     presenterBlock    <dyadicValuable> to be evaluated to bring up a presenter on the aspect
  46975.     editBlock        <monadicValue> to be evaluated to edit the aspect
  46976.     isMutable        <Boolean> specifying whether the aspect can be modified in-place'!
  46977. !Aspect class methodsFor!
  46978.  
  46979. autostring: aStringAspectSymbol
  46980.     "Answer an instance of the receiver for aStringAspectSymbol.
  46981.     The aspect is editable using a TextPresenter with a single line editor view
  46982.     that updates on each character"
  46983.  
  46984.     ^self name: aStringAspectSymbol
  46985.         presenterBlock: 
  46986.             [:p :m | 
  46987.             | presenter |
  46988.             presenter := TextPresenter createIn: p on: m.
  46989.             presenter view updatePerChar: true.
  46990.             presenter]!
  46991.  
  46992. bitmap: aBitmapAspectSymbol
  46993.     "Answer an instance of the receiver for aBitmapAspectSymbol.
  46994.     The aspect is viewable using an ImagePresenter with a 'Basic image' view
  46995.     and editable using a FileDialog"
  46996.  
  46997.     ^self 
  46998.         name: aBitmapAspectSymbol
  46999.         presenterBlock: (MessageSend 
  47000.                 receiver: ImagePresenter
  47001.                 selector: #create:in:on:
  47002.                 arguments: #('Basic image' nil nil))
  47003.         editBlock: 
  47004.             [:p | 
  47005.             | filename |
  47006.             filename := (FileOpenDialog new)
  47007.                         fileTypes: (Array with: DIBSection filesType with: FileDialog allFilesType);
  47008.                         showModal.
  47009.             filename notNil ifTrue: [p value: (DIBSection fromFile: filename)]]!
  47010.  
  47011. block: anAspectSymbol
  47012.     "Answer an instance of the receiver for anAspectSymbol, which is the accessor
  47013.     for some kind of <valuable> (not necessarily a block).
  47014.     The aspect is editable using a <ValueWorkspace> presenter configured so it
  47015.     has no evaluation context. This prevents a saved block from hanging on to the
  47016.     previous value of the aspect (often another block) as its receiver."
  47017.  
  47018.     ^self name: anAspectSymbol
  47019.         presenterBlock: 
  47020.             [:p :m | 
  47021.             
  47022.             [(ValueWorkspace createIn: p on: m)
  47023.                 evaluationContext: nil;
  47024.                 yourself] 
  47025.                     ensure: [p := m := nil]]!
  47026.  
  47027. boolean: aBooleanAspectSymbol
  47028.     "Answer an instance of the receiver for aBooleanAspectSymbol.
  47029.     The aspect is viewable using a BooleanPresenter and can be edited
  47030.     by toggling the aspect value. By default boolean aspects are not
  47031.     nullable."
  47032.  
  47033.     ^(self 
  47034.         name: aBooleanAspectSymbol
  47035.         presenterBlock: (MessageSend 
  47036.                 receiver: BooleanPresenter
  47037.                 selector: #createIn:on:
  47038.                 arguments: #(nil nil))
  47039.         editBlock: [:p | p value: p value not])
  47040.         isNullable: false;
  47041.         yourself!
  47042.  
  47043. choice: aChoiceAspectSymbol from: anArray
  47044.     "Answer an instance of the receiver for aChoiceAspectSymbol.
  47045.     The possible choices can be taken from from anArray"
  47046.  
  47047.     ^(self name: aChoiceAspectSymbol
  47048.         presenterBlock: 
  47049.             [:p :m | 
  47050.             (ChoicePresenter createIn: p on: m)
  47051.                 choices: anArray;
  47052.                 yourself])
  47053.         isNullable: false;
  47054.         yourself!
  47055.  
  47056. choice: aChoiceAspectSymbol from: anArray andNil: nilChoice 
  47057.     "Answer an instance of the receiver for aChoiceAspectSymbol.
  47058.     The possible choices can be taken from from anArray together with a choice
  47059.     which represents nil"
  47060.  
  47061.     | choices |
  47062.     choices := (OrderedCollection with: nilChoice)
  47063.                 addAll: anArray;
  47064.                 yourself.
  47065.     ^self name: aChoiceAspectSymbol
  47066.         presenterBlock: 
  47067.             [:p :m | 
  47068.             (ChoicePresenter createIn: p on: m)
  47069.                 nilChoice: nilChoice;
  47070.                 choices: choices;
  47071.                 yourself]!
  47072.  
  47073. choice: aSymbol fromMap: aLookupTable nullValue: anObject 
  47074.     "Answer an instance of the receiver for an aspect named by the
  47075.     <Symbol> argument. The possible choices can be taken from 
  47076.     the <LookupTable> argument, whose keys are the display values, 
  47077.     for user presentation, and whose values are the actual value choices for 
  47078.     the aspect."
  47079.  
  47080.     ^self name: aSymbol
  47081.         presenterBlock: 
  47082.             [:parent :model | 
  47083.             (ChoicePresenter createIn: parent
  47084.                 on: (ValueConverter subject: model
  47085.                         typeConverter: ((MappingConverter rightToLeft: aLookupTable)
  47086.                                 leftNullValue: anObject;
  47087.                                 yourself)))
  47088.                 choices: aLookupTable keys asSortedCollection;
  47089.                 yourself]!
  47090.  
  47091. collection: aSymbol
  47092.     "Answer an instance of the receiver for aCollectionAspectSymbol .
  47093.     The aspect is displayed using a CollectionPresenter"
  47094.  
  47095.     ^self collection: aSymbol presenterClass: CollectionPresenter!
  47096.  
  47097. collection: aSymbol addEvaluationFrom: anArrayOfStrings
  47098.     "Answer an instance of the receiver for aCollectionAspectSymbol.
  47099.     The aspect is displayed using a CollectionPresenter and may have new items added
  47100.     by choosing an appropriate evaluation from anArrayOfStrings"
  47101.  
  47102.     ^self 
  47103.         collection: aSymbol
  47104.         presenterClass: CollectionPresenter
  47105.         addEvaluationFrom: anArrayOfStrings!
  47106.  
  47107. collection: aCollectionAspectSymbol addFrom: anArray
  47108.     "Answer an instance of the receiver for aCollectionAspectSymbol.
  47109.     The aspect is displayed using a CollectionPresenter and may have new items added
  47110.     by choosing an appropriate object from anArray"
  47111.  
  47112.     ^self 
  47113.         collection: aCollectionAspectSymbol
  47114.         presenterClass: CollectionPresenter
  47115.         addFrom: anArray!
  47116.  
  47117. collection: aSymbol presenterClass: aClass
  47118.     ^self 
  47119.         name: aSymbol
  47120.         presenterBlock: (MessageSend 
  47121.                 receiver: aClass
  47122.                 selector: #createIn:on:
  47123.                 arguments: #(nil nil))
  47124.         editBlock: (Message selector: #addItem)!
  47125.  
  47126. collection: aSymbol presenterClass: collectionPresenterClass addEvaluationFrom: anArrayOfStrings
  47127.     ^self 
  47128.         name: aSymbol
  47129.         presenterBlock: 
  47130.             [:p :m | 
  47131.             (collectionPresenterClass createIn: p on: m) setAddItemBlock: 
  47132.                     [| choice |
  47133.                     choice := anArrayOfStrings size > 1 
  47134.                                 ifTrue: [ChoicePrompter choices: anArrayOfStrings caption: 'Add an Evaluation']
  47135.                                 ifFalse: [anArrayOfStrings first].
  47136.                     choice notNil ifTrue: [Compiler evaluate: choice logged: false]]]
  47137.         editBlock: (Message selector: #addItem)!
  47138.  
  47139. collection: aCollectionAspectSymbol presenterClass: collectionPresenterClass addFrom: anArray 
  47140.     ^self 
  47141.         name: aCollectionAspectSymbol
  47142.         presenterBlock: 
  47143.             [:p :m | 
  47144.             (collectionPresenterClass createIn: p on: m) setAddItemBlock: 
  47145.                     [anArray size > 1 
  47146.                         ifTrue: [ChoicePrompter choices: anArray caption: 'Add ...']
  47147.                         ifFalse: [anArray first]]]
  47148.         editBlock: (Message selector: #addItem)!
  47149.  
  47150. color: aColorAspectSymbol
  47151.     "Answer an instance of the receiver for aColorAspectSymbol.
  47152.     The aspect is viewable  using a ColorPresenter and editable using a ColorDialog"
  47153.  
  47154.     ^self 
  47155.         name: aColorAspectSymbol
  47156.         presenterBlock: (MessageSend 
  47157.                 receiver: ColorPresenter
  47158.                 selector: #createIn:on:
  47159.                 arguments: #(nil nil))
  47160.         editBlock: [:p | ColorDialog showModalOn: p model]!
  47161.  
  47162. date: aSymbol 
  47163.     "Answer an instance of the receiver for accessing a <Date> aspect
  47164.     of an object with accessor, aSymbol.
  47165.     The aspect is viewable and editable using a DatePresenter."
  47166.  
  47167.     ^self name: aSymbol
  47168.         presenterBlock: (MessageSend 
  47169.                 receiver: DatePresenter
  47170.                 selector: #createIn:on:
  47171.                 arguments: #(nil nil))!
  47172.  
  47173. defaultPresenterBlock
  47174.     "Private - Answers a valuable suitable for displaying an aspect in a
  47175.     <ValueWorkspace>."
  47176.  
  47177.     ^MessageSend receiver: ValueWorkspace selector: #createIn:on: arguments: #(nil nil)!
  47178.  
  47179. dictionary: aSymbol
  47180.     "Answer an instance of the receiver for the <Dictionary> aspect named by the <Symbol> 
  47181.     argument . The aspect is displayed using a DictionaryPresenter"
  47182.  
  47183.     ^self collection: aSymbol presenterClass: DictionaryPresenter!
  47184.  
  47185. fileOpen: aFilenameAspectSymbol
  47186.     "Answer an instance of the receiver for aFilenameAspectSymbol.
  47187.     The aspect is viewable using a ValueWorkspace and editable using a FileSaveDialog"
  47188.  
  47189.     ^self 
  47190.         name: aFilenameAspectSymbol
  47191.         presenterBlock: (MessageSend 
  47192.                 receiver: ValueWorkspace
  47193.                 selector: #createIn:on:
  47194.                 arguments: #(nil nil))
  47195.         editBlock: [:p | FileOpenDialog showModalOn: p model]!
  47196.  
  47197. fileSave: aFilenameAspectSymbol
  47198.     "Answer an instance of the receiver for aFilenameAspectSymbol.
  47199.     The aspect is viewable using a ValueWorkspace and editable using a FileSaveDialog"
  47200.  
  47201.     ^self 
  47202.         name: aFilenameAspectSymbol
  47203.         presenterBlock: (MessageSend 
  47204.                 receiver: ValueWorkspace
  47205.                 selector: #createIn:on:
  47206.                 arguments: #(nil nil))
  47207.         editBlock: [:p | FileSaveDialog showModalOn: p model]!
  47208.  
  47209. float: aSymbol
  47210.     "Answer an instance of the receiver for the <Float> aspect, aSymbol.
  47211.     The aspect is editable using a NumberPresenter."
  47212.  
  47213.     ^self number: aSymbol!
  47214.  
  47215. folder: aFolderAspectSymbol 
  47216.     "Answer an instance of the receiver for aFolderAspectSymbol.
  47217.     The aspect is viewable using a ValueWorkspace and editable using a BrowseFolderDialog"
  47218.  
  47219.     | editBlock |
  47220.     editBlock := Smalltalk at: #BrowseFolderDialog
  47221.                 ifPresent: [:dialog | [:p | dialog showModalOn: p model]].
  47222.     ^self 
  47223.         name: aFolderAspectSymbol
  47224.         presenterBlock: (MessageSend 
  47225.                 receiver: ValueWorkspace
  47226.                 selector: #createIn:on:
  47227.                 arguments: #(nil nil))
  47228.         editBlock: editBlock!
  47229.  
  47230. font: aFontAspectSymbol 
  47231.     "Answer an instance of the receiver for aFontAspectSymbol.
  47232.     The aspect is viewable using a FontPresenter and editable using a FontDialog"
  47233.  
  47234.     ^self name: aFontAspectSymbol 
  47235.         presenterBlock: (MessageSend receiver: FontPresenter
  47236.                         selector: #createIn:on: arguments: #(nil nil))
  47237.         editBlock: [ :p | FontDialog showModalOn: p model]!
  47238.  
  47239. hotkey: aHotKeyAspectSymbol 
  47240.     "Answer an instance of the receiver for aHotKeyAspectSymbol.
  47241.     The aspect is editable using a HotKey control."
  47242.  
  47243.     ^self name: aHotKeyAspectSymbol 
  47244.         presenterBlock: [:p :m |
  47245.             AcceleratorPresenter createIn: p on: ("AcceleratorTable keyCodeFromString: "m)]
  47246. !
  47247.  
  47248. icon: anIconAspectSymbol
  47249.     "Answer an instance of the receiver for anIconAspectSymbol.
  47250.     The aspect is viewable using an ImagePresenter with a 'Basic image' view
  47251.     and editable using a FileDialog"
  47252.  
  47253.     ^self 
  47254.         name: anIconAspectSymbol
  47255.         presenterBlock: (MessageSend 
  47256.                 receiver: ImagePresenter
  47257.                 selector: #create:in:on:
  47258.                 arguments: #('Basic image' nil nil))
  47259.         editBlock: [:p | Icon choose ifNotNil: [:icon | p value: icon]]!
  47260.  
  47261. inspector: anAspectSymbol
  47262.     "Answer an instance of the receiver for anAspectSymbol.
  47263.     The aspect is editable using an appropriate inspector"
  47264.  
  47265.     ^self name: anAspectSymbol
  47266.         presenterBlock: 
  47267.             [:p :m | 
  47268.             (m inspectorClass createIn: p)
  47269.                 object: m;
  47270.                 yourself]!
  47271.  
  47272. integer: aSymbol
  47273.     "Answer an instance of the receiver for aSymbol.
  47274.     The aspect is editable using a NumberPresenter"
  47275.  
  47276.     ^self number: aSymbol!
  47277.  
  47278. key: aKey
  47279.     "Answers an instance of KeyedAspect on aKey"
  47280.  
  47281.     ^KeyedAspect key: aKey!
  47282.  
  47283. list: aListAspectSymbol
  47284.     "Answer an instance of the receiver for aListAspectSymbol.
  47285.     The aspect is displayed using a CollectionPresenter"
  47286.  
  47287.     #deprecated. "Use #collection:"
  47288.  
  47289.     ^self collection: aListAspectSymbol
  47290. !
  47291.  
  47292. list: aListAspectSymbol addEvaluationFrom: anArrayOfStrings
  47293.     #deprecated.
  47294.     ^self sequenceableCollection: aListAspectSymbol addEvaluationFrom: anArrayOfStrings!
  47295.  
  47296. list: aListAspectSymbol addFrom: anArray
  47297.     #deprecated.
  47298.     ^self sequenceableCollection: aListAspectSymbol addFrom: anArray!
  47299.  
  47300. maxDisplayCharacters
  47301.     ^40!
  47302.  
  47303. menu: aMenuAspectSymbol
  47304.     "Answer an instance of the receiver for aMenuAspectSymbol.
  47305.     The aspect is editable using a MenuComposer"
  47306.  
  47307.     ^self 
  47308.         name: aMenuAspectSymbol
  47309.         presenterBlock: (MessageSend 
  47310.                 receiver: ValueWorkspace
  47311.                 selector: #createIn:on:
  47312.                 arguments: #(nil nil))
  47313.         editBlock: [:p | MenuComposer showModalOn: p model]!
  47314.  
  47315. menuBar: aMenuAspectSymbol
  47316.     "Answer an instance of the receiver for aMenuAspectSymbol.
  47317.     The aspect is editable using a MenuComposer"
  47318.  
  47319.     ^self 
  47320.         name: aMenuAspectSymbol
  47321.         presenterBlock: (MessageSend 
  47322.                 receiver: ValueWorkspace
  47323.                 selector: #createIn:on:
  47324.                 arguments: #(nil nil))
  47325.         editBlock: [:p | MenuBarComposer showModalOn: p model]!
  47326.  
  47327. multilineString: aStringAspectSymbol
  47328.     "Answer an instance of the receiver for aStringAspectSymbol.
  47329.     The aspect is editable using a TextPresenter with a multiline editor view
  47330.     that updates on each character"
  47331.  
  47332.     ^self name: aStringAspectSymbol
  47333.         presenterBlock: 
  47334.             [:p :m | 
  47335.             | presenter |
  47336.             presenter := TextPresenter 
  47337.                         create: 'Multiline text'
  47338.                         in: p
  47339.                         on: m.
  47340.             presenter view updatePerChar: true.
  47341.             presenter]!
  47342.  
  47343. name: aSymbol
  47344.     "Answer an instance of the receiver for anAspectSymbol.
  47345.     The aspect is editable using the default ValueWorkspace presenter"
  47346.  
  47347.     ^self name: aSymbol presenterBlock: self defaultPresenterBlock!
  47348.  
  47349. name: aSymbol chooseFrom: anArrayOfStrings
  47350.     "Answer an instance of the receiver for anAspectSymbol.
  47351.     The aspect is editable using a choice presenter filled with potential evaluations
  47352.     listed in anArrayOfStrings"
  47353.  
  47354.     ^self 
  47355.         name: aSymbol
  47356.         presenterBlock: self defaultPresenterBlock
  47357.         editBlock: 
  47358.             [:p | 
  47359.             | choice |
  47360.             choice := ChoicePrompter choices: anArrayOfStrings caption: 'Choose an Evaluation'.
  47361.             choice notNil ifTrue: [p value: (Compiler evaluate: choice logged: false)]]!
  47362.  
  47363. name: aSymbol editBlock: aOneArgEditBlock
  47364.     "Answer an instance of the receiver for anAspectSymbol.
  47365.     The aspect is editable using the default ValueWorkspace presenter and may be additionally
  47366.     edited by evaluating aOneArgEditBlock whose parameter is the presenter viewing
  47367.     the aspect. Note that ValueWorkspace is a development class and this is therefore a
  47368.     development method."
  47369.  
  47370.     ^super new 
  47371.         name: aSymbol
  47372.         presenterBlock: self defaultPresenterBlock
  47373.         editBlock: aOneArgEditBlock!
  47374.  
  47375. name: aSymbol presenterBlock: aTwoArgPresenterBlock
  47376.     "Answer an instance of the receiver for anAspectSymbol.
  47377.     The aspect is editable using the presenter answered by aTwoArgOPresenterBlock
  47378.     the first parameter to which is the parent presenter to host the editor and the
  47379.     second is the model being edited."
  47380.  
  47381.     ^self 
  47382.         name: aSymbol
  47383.         presenterBlock: aTwoArgPresenterBlock
  47384.         editBlock: nil!
  47385.  
  47386. name: aSymbol presenterBlock: aTwoArgPresenterBlock editBlock: aOneArgEditBlock
  47387.     "Answer an instance of the receiver for anAspectSymbol.
  47388.     The aspect will be made visible using the presenter answered by aTwoArgPresenterBlock
  47389.     the first parameter to which is the parent presenter to host it and the second is the model
  47390.     being edited. The aspect may be additionally edited by evaluating aOneArgEditBlock
  47391.     whose parameter is the presenter viewing the aspect."
  47392.  
  47393.     ^super new 
  47394.         name: aSymbol
  47395.         presenterBlock: aTwoArgPresenterBlock
  47396.         editBlock: aOneArgEditBlock!
  47397.  
  47398. new
  47399.     "Private - Use #name:presenterClass:"
  47400.  
  47401.     ^self shouldNotImplement!
  47402.  
  47403. number: aSymbol 
  47404.     "Answer an instance of the receiver for the <Number> aspect, aSymbol.
  47405.     The aspect is editable using a NumberPresenter."
  47406.  
  47407.     ^self name: aSymbol
  47408.         presenterBlock: 
  47409.             [:p :m | 
  47410.             | presenter |
  47411.             presenter := NumberPresenter createIn: p on: m.
  47412.             presenter view typeconverter leftNullValue: 0.
  47413.             presenter]!
  47414.  
  47415. richText: aRichTextAspectSymbol
  47416.     "Answer an instance of the receiver for aTextAspectSymbol.
  47417.     The aspect is editable using a RichTextPresenter"
  47418.  
  47419.     ^self name: aRichTextAspectSymbol
  47420.         presenterBlock: 
  47421.             [:p :m | 
  47422.             | presenter |
  47423.             presenter := RichTextPresenter createIn: p on: m.
  47424.             presenter view updatePerChar: true.
  47425.             presenter]!
  47426.  
  47427. sequenceableCollection: aSymbol
  47428.     "Answer an instance of the receiver for the <SequenceableCollection> aspect named
  47429.     by the <Symbol> argument."
  47430.  
  47431.     ^self collection: aSymbol presenterClass: SequenceableCollectionPresenter!
  47432.  
  47433. sequenceableCollection: aSymbol addEvaluationFrom: anArray
  47434.     "Answer an instance of the receiver for an aspect named by the <Symbol>, aSymbol.
  47435.     The aspect is displayed using a SequenceableCollectionPresenter and may have new 
  47436.     items added by choosing an appropriate appropriate evaluation from the <Array>
  47437.     of <String>s, anArray."
  47438.  
  47439.     ^self 
  47440.         collection: aSymbol
  47441.         presenterClass: SequenceableCollectionPresenter
  47442.         addEvaluationFrom: anArray!
  47443.  
  47444. sequenceableCollection: aSymbol addFrom: anArray
  47445.     "Answer an instance of the receiver for an aspect named by the <Symbol>, aSymbol.
  47446.     The aspect is displayed using a SequenceableCollectionPresenter and may have new 
  47447.     items added by choosing an appropriate object from the <Array>, anArray."
  47448.  
  47449.     ^self 
  47450.         collection: aSymbol
  47451.         presenterClass: SequenceableCollectionPresenter
  47452.         addFrom: anArray!
  47453.  
  47454. set: aSymbol
  47455.     "Answer an instance of the receiver for the <Set> aspect named by the <Symbol> 
  47456.     argument . The aspect is displayed using a HashedCollectionPresenter"
  47457.  
  47458.     ^self collection: aSymbol presenterClass: HashedCollectionPresenter!
  47459.  
  47460. string: aStringAspectSymbol
  47461.     "Answer an instance of the receiver for aStringAspectSymbol.
  47462.     The aspect is editable using a TextPresenter with a single editor view
  47463.     that updates on Enter or kill focus"
  47464.  
  47465.     ^self name: aStringAspectSymbol
  47466.         presenterBlock: (MessageSend 
  47467.                 receiver: TextPresenter
  47468.                 selector: #createIn:on:
  47469.                 arguments: #(nil nil))!
  47470.  
  47471. time: aSymbol 
  47472.     "Answer an instance of the receiver for accessing a <Time> aspect
  47473.     of an object with accessor, aSymbol.
  47474.     The aspect is viewable and editable using a TimePresenter."
  47475.  
  47476.     ^self name: aSymbol presenterBlock: [:p :m | TimePresenter createIn: p on: m]! !
  47477.  
  47478. !Aspect methodsFor!
  47479.  
  47480. <= anAspect
  47481.     "Answer whether the receiver is 'less than' anAspect..
  47482.     By implementing this method, we enable Aspect objects to be stored
  47483.     in a SortedCollection with the default sort block."
  47484.  
  47485.     ^(self species == anAspect species) 
  47486.         ifTrue: [self name <= anAspect name]
  47487.         ifFalse: [ self species <= anAspect species]!
  47488.  
  47489. = comperand
  47490.     "Answer whether the receiver is considered equal to the <Object>, comperand."
  47491.  
  47492.     ^self == comperand or: [self species == comperand species and: [self name == comperand name]]!
  47493.  
  47494. accessorClass
  47495.     ^AspectAccessor!
  47496.  
  47497. accessorFor: anObject 
  47498.     "Answers an AspectAccessor value adaptor for the receiver on anObject"
  47499.  
  47500.     ^self accessorClass subject: anObject aspect: self!
  47501.  
  47502. canEdit
  47503.     "Answer true if the receiver can be edited; that is, it has an edit block
  47504.     defined for it"
  47505.  
  47506.     ^self editBlock notNil!
  47507.  
  47508. canGenerateAccessors
  47509.     "Private - Answer true if instances of the receiver can generate code for attribute
  47510.     accessor methods. Aspects accessors cannot be generated"
  47511.  
  47512.     ^false!
  47513.  
  47514. canReadFrom: anObject
  47515.     ^self isReadable and: [anObject respondsTo: self getSelector]!
  47516.  
  47517. canWriteInto: anObject
  47518.     ^self isWriteable and: [anObject respondsTo: self putSelector]!
  47519.  
  47520. defaultFlags
  47521.     ^##(WriteableMask | ReadableMask | MutableMask | NullableMask)!
  47522.  
  47523. display: anObject on: aStream
  47524.     self name == #yourself 
  47525.         ifFalse: 
  47526.             [aStream
  47527.                 display: self;
  47528.                 nextPut: $=].
  47529.     (self readFrom: anObject) aspectDisplayOn: aStream!
  47530.  
  47531. displayOn: aStream
  47532.     "Append the receiver to aStream in a format that a user would want to see"
  47533.  
  47534.     aStream display: self name!
  47535.  
  47536. editBlock
  47537.     "Private - Answer the <monadicValuable> that can be used to edit the receiver's aspect."
  47538.  
  47539.     ^editBlock!
  47540.  
  47541. getSelector
  47542.     "Private - Answers the selector used for getting the aspect value from the subject"
  47543.  
  47544.     ^self name
  47545. !
  47546.  
  47547. hash
  47548.     "Answer the <Integer> hash value for the receiver."
  47549.  
  47550.     ^self name hash!
  47551.  
  47552. key
  47553.     "Private - Answer the lookup key of the receiver when it is to appear as an
  47554.     association (Aspects can be stored directly in Dictionaries)"
  47555.  
  47556.     ^self name!
  47557.  
  47558. name
  47559.     "Answer the aspect name Symbol of the receiver"
  47560.  
  47561.     ^name!
  47562.  
  47563. name: aSymbol presenterBlock: aOneArgPresenterBlock editBlock: aOneArgEditBlock
  47564.     "Private - Initialize the receiver; set the name to aSymbol and the 
  47565.     editor presenter creation block to aOneArgBlock"
  47566.  
  47567.     name := aSymbol.
  47568.     presenterBlock := aOneArgPresenterBlock.
  47569.     editBlock := aOneArgEditBlock!
  47570.  
  47571. nameIn: anObject
  47572.     "Private - Answer the 'name' of the aspect of the <Object> argument described by the receiver."
  47573.  
  47574.     ^name!
  47575.  
  47576. objectRefName: anObject
  47577.     ^self name!
  47578.  
  47579. presenterBlock
  47580.     "Answer the <dyadicValuable> capable of creating a presenter for the receiver's
  47581.      aspect name"
  47582.  
  47583.     ^presenterBlock!
  47584.  
  47585. presenterFor: aValueModel in: aCompositePresenter
  47586.     "Answer a new <Presenter> to display (and possibly edit) the aspect
  47587.     accessed by the <AspectAccessor> argument within the <CompositePresenter>
  47588.     argument."
  47589.  
  47590.     ^self presenterBlock value: aCompositePresenter value: aValueModel!
  47591.  
  47592. printOn: aStream
  47593.     "Append a representation of the receiver to aStream."
  47594.  
  47595.     aStream
  47596.         basicPrint: self;
  47597.         nextPut: $(; print: self name; nextPut: $)!
  47598.  
  47599. putSelector
  47600.     ^(self name copyWith: $:) asSymbol!
  47601.  
  47602. readFrom: anObject
  47603.     ^anObject perform: self getSelector!
  47604.  
  47605. value
  47606.     "Private - Answer the value of the receiver when it is to appear as an
  47607.     association (Aspects can be stored in Dictionaries)"
  47608.  
  47609.     ^self!
  47610.  
  47611. writeInto: subjectObject value: valueObject
  47612.     "Private - Set the attribute of subjectObject described by the receiver 
  47613.     to valueObject."
  47614.  
  47615.     ^subjectObject perform: self putSelector with: valueObject! !
  47616.  
  47617. ExternalField comment:
  47618. ''!
  47619. !ExternalField class methodsFor!
  47620.  
  47621. filler
  47622.     "Answer an instance of the receiver which describes a field which will not be used
  47623.     (it cannot be read or written)."
  47624.  
  47625.     ^self new beFiller!
  47626.  
  47627. ±V.!!Ñ¥;(╕Ñëp┼)α╞δ╔φ╘ƒ┴ºΓá    ║ú╘XIE┴─7\ôVV/mOZdσ█^Ph"F▒oe¼±`ε▀P¡ú┌⌠₧ì, ₧b_k ùⁿJ7á╠╥X\ÉVÆVf║Qú~äεT1Σh¢₧]ÖD}ó    (┌¥═╢┴Ñ`¢ ÿ₧╙s║■P¬eJ'Æ·'╩▐]δD╪M▀■s-╣╙y╨Ek╘s▄╢ΩB{íε∞÷σF╛⌡rU╕Γ╛BaCFt;îτW2hD┴ìM╝ÇkIpoä═o¥[Æ⌡┬╗░!!ñ¡ê┘Æ~íδ╠I▄2╡y°OzJ∩│l╥-6åoæç╙╥╓FÅ╙┬πP¬R9┤oΦ!!└Σ∞╓HzD$W£]·π,wû1ï╧
  47628. HLw▄ sê≈3╕J+Y╨╢▀B%F$û]₧▄▄SA! !
  47629.  
  47630. !ExternalField methodsFor!
  47631.  
  47632. alignment
  47633.     "Answer the alignment requirements for the receiver.
  47634.     This is the default alignment required for a field of the receiver's type
  47635.     when embedded in an array or structure, generally speaking this is the
  47636.     same as the byte size."
  47637.  
  47638.     ^self byteSize!
  47639.  
  47640. beFiller
  47641.     "Set the receiver's flag to specify that it is a filler field.
  47642.     The field will be largely ignored being neither readable nor writeable.
  47643.     Answer the receiver."
  47644.  
  47645.     self beInaccessible!
  47646.  
  47647. byteSize
  47648.     "Private - Answer the byteSize of the field the receiver represents."
  47649.  
  47650.     ^self subclassResponsibility!
  47651.  
  47652. fieldClass
  47653.     ^self subclassResponsibility!
  47654.  
  47655. isFiller
  47656.     "Private - Answer whether the receiver is a filler field."
  47657.  
  47658.     ^self isInaccessible
  47659. !
  47660.  
  47661. newAspect: aspectClass name: aSymbol 
  47662.     "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  47663.         which is appropriate for representing aspects of the receiver's field type."
  47664.  
  47665.     | aspect |
  47666.     aspect := self fieldClass newAspect: aspectClass name: aSymbol.
  47667.     aspect flags: (flags bitAnd: aspect flags).
  47668.     ^aspect!
  47669.  
  47670. offset
  47671.     "Private - Answer the offset of the receiver's field in its structure template."
  47672.  
  47673.     ^offset!
  47674.  
  47675. offset: anInteger
  47676.     "Private - Set the offset of the receiver's field in a structure template to be anInteger."
  47677.  
  47678.     offset := anInteger.
  47679.     !
  47680.  
  47681. printOn: aStream
  47682.     "Append a representation of the receiver to aStream."
  47683.  
  47684.     aStream
  47685.         basicPrint: self;
  47686.         nextPut: $(; print: self offset; nextPut: $)!
  47687.  
  47688. readAccessorMethodText: contentsAccessString
  47689.     "Private - Answer suitable method text for compiling a read-accessor method
  47690.     to substitute for the receiver (does not include the selector)"
  47691.  
  47692.     ^self readAccessorMethodText: contentsAccessString atOffset: self offset displayString!
  47693.  
  47694. readAccessorMethodText: contentsAccessString atOffset: offsetString
  47695.     "Private - Answer suitable method text for compiling a read-accessor method
  47696.     to substitute for the receiver (does not include the selector)"
  47697.  
  47698.     ^self subclassResponsibility!
  47699.  
  47700. selectorFrom: aSymbol
  47701.     "Private - Answer a Selector generated from the argument aSymbol."
  47702.  
  47703.     ^aSymbol!
  47704.  
  47705. writeAccessorMethodText: targetString
  47706.     "Private - Answer suitable method text for compiling a write-accessor method
  47707.     (should not include the selector).
  47708.     Write accessors normally answer self (i.e they have no explicit return value)."
  47709.  
  47710.     ^self subclassResponsibility! !
  47711.  
  47712. AXAutomationAspect comment:
  47713. 'AXAutomationAspect is the abstract superclass of <Aspect>s specialised for accessing properties and fields of Active-X Automation objects. It is an extension of the PublishedAspectorInspector framework.'!
  47714. !AXAutomationAspect methodsFor!
  47715.  
  47716. ΓE)(09á⌐ &╖≤╠+ïπ▐Ω╧Ω║╡╝Çßá_E ▓╙IvIR╙å2W!
  47717.  
  47718. ΓE)-'1░è'«ª╓jä1╬╓σ╔²├▓┐╫╠╢VO╣√╔hDZ_╞ü?P¢Z!
  47719.  
  47720. σA!! 4░⌐>(╜║ß@∞≥┴ ╔∞ù█╨╕≤░_WÖ╖┴|`[╙ù5q¢ZE84~~≈â\K'\¿! !
  47721.  
  47722. KeyedAspect comment:
  47723. 'Part of the PublishedAspectorInspector framework. KeyedAspect instances are used to describe the published aspects of a keyed collection. Typically these are accessed via #at: and #at:put: messages as governed by the KeyedAspectAccessor class.'!
  47724. !KeyedAspect class methodsFor!
  47725.  
  47726. key: aKey 
  47727.     "Answer an instance of the receiver created with aKey"
  47728.  
  47729.     ^self name: aKey! !
  47730.  
  47731. !KeyedAspect methodsFor!
  47732.  
  47733. = comperand
  47734.     "Answer whether the receiver is considered equal to the <Object>, comperand."
  47735.  
  47736.     ^self == comperand or: [self species == comperand species and: [self key == comperand key]]!
  47737.  
  47738. display: anObject on: aStream
  47739.     aStream
  47740.         display: self key;
  47741.         nextPut: $=.
  47742.     (self readFrom: anObject) aspectDisplayOn: aStream!
  47743.  
  47744. getSelector
  47745.     "Private - Answers the selector used for getting the aspect value from the subject"
  47746.  
  47747.     ^#at:
  47748. !
  47749.  
  47750. hash
  47751.     "Answer the <Integer> hash value for the receiver."
  47752.  
  47753.     ^self key hash!
  47754.  
  47755. objectRefName: anObject
  47756.     ^(self readFrom: anObject) basicPrintString , self key displayString copyWithout: Character space!
  47757.  
  47758. putSelector
  47759.     ^#at:put:!
  47760.  
  47761. readFrom: anObject
  47762.     ^anObject at: self key!
  47763.  
  47764. writeInto: subjectObject value: valueObject
  47765.     "Private - Set the attribute of subjectObject described by the receiver 
  47766.     to valueObject."
  47767.  
  47768.     ^subjectObject at: self key put: valueObject! !
  47769.  
  47770. AXRecordAspect comment:
  47771. 'AXRecordAspect is a specialised <Aspect> for accessing properties of user-defined Automation structures (as represented by instances of <AXRecord>). It is an extension of the PublishedAspectorInspector framework.'!
  47772. !AXRecordAspect methodsFor!
  47773.  
  47774. ≤A&*½éhi╗ºú(Å:Γ└éªùò∩╟╖ΣñGF ÷ÇZ}[A╫û~FƒZ+zOAbπòi ór|h¿«#ε₧P╕Ñ▓ì≥┴ô4\.t╥╣- ½╩┼P^É▌T─.▄«:²_` 2Σgï₧^ÖVRÑ0╫╚âσ╔¼u╚₧ûûAOí çrtÉ»7╤à▄*╘╞V÷5\!
  47775.  
  47776. ÷V.0¬¢=s·║Ö(Å:Γ└└╬⌠╥▄┴■Σñ_V║ßÇmrDC╫½<XÆ\Pj1:)?ΣêXr#ε<`o╢δ4≥█╝úÑù⌡┌╫{X@}u╪╢h1║µ┬SMû╙p╜@ñtÆ°Mx⌡lÜ₧KÖAqÑ9┴╥«£Ñ┤|╚₧ùåy ¼√RG╢.HΦéY╖ΣL≥C%╔\╬9±'d·╙8╤Gzµ6┤╨ç4á½⌠°á⌐∙e»ß╛?C
  47777. j'ï%ß5r[më├K╩äK3Q!!░ΦFÅUX╓¥╗╤ò▀αä╒┌"⌡Äú`ªl╜{∙-{Gó┤{╥bI┴Ö█╙ï╟ƒ╙╓σP²$│d∩^»Äæ╢sEh_@2 m╙┐j@â&É\ƒ DVwÅng═²<µ!!Åσ¬v}Yx┘╙╙═söδjñ·EÖ╒æF╙)qm! !
  47778.  
  47779. DispatchAspect comment:
  47780. 'DispatchAspect is a specialised <Aspect> for accessing properties of Automation objects through IDispatch. It is an extension of the PublishedAspectorInspector framework.'!
  47781. !DispatchAspect methodsFor!
  47782.  
  47783. σA4'1┤¢=;αΘì ░┬≡╩ ▌║╡╝║√╢CJ╗√Ü&3Ipτ¬v▓lgjc^^b ╕∞t0X5J»z!
  47784.  
  47785. σM4
  47786. <<╔σ[╛áƒ:î;!
  47787.  
  47788. ≤A&*½éhi╗ºú(Å:Γ└éªùò∩╟╖ΣñGF ÷ÇZ}[A╫û~FƒZ+zOAbπòi ór|h¿«#ε₧P╕Ñ▓ì≥┴ô4\.t╥╣- ½╩┼P^É▌T─.▄«:²_` 2Σgï₧^ÖVD╛,╓Ç╫∩σñ)╚Üùò< ºΓGMª]Jtî╡s√═MΦSo╚PÇV╚wdßçdéGv²!
  47789.  
  47790. ÷V.0¬¢=s·║Ö(Å:Γ└└╬⌠╥▄┴■Σñ_V║ßÇmrDC╫½<XÆ\PG2[ ùMcfπOV~Γ┐( ₧C╝Ñ╛£Γ█^ÿr{b╨╣n&ü╦╩\KüVùf¡Q┐ò╝SVI,Θa▀╠\ƒG}║.ô ⌐ƒ╪»3₧ ôÄûSñ⌠TP∞"g∩àZσ╠JσK*╧K⌡∙(bφçk╟V^╥0í┘æPmܬó╛≤ñ≥ X░≤ó%PTs7╘J⌡<dJ╦╚₧£b2 ≥│
  47791. ╕o.ó╒├¬≤së╨Φñ₧1∩úñcªl^0Hñ<αO5ï╪φhH Öä▒ü╟₧─╫ΘP┘7α+Σ+àπ²╠T`_@2 wÉ÷=qÿ;æƒPgqöor═Φ0≈,R╧Γ E>*O j╧ZÖò£A╟ñ,╕φD₧ü¿N╩$bS╬÷d<£i▐╞! !
  47792.  
  47793. BasicKeyedAspect comment:
  47794. 'Part of the PublishedAspectorInspector framework. BasicKeyedAspect instances are used to describe the published aspects of an object that can be accessed via #basicAt: and #basicAt:put: messages as governed by the BasicKeyedAspectAccessor class'!
  47795. !BasicKeyedAspect methodsFor!
  47796.  
  47797. getSelector
  47798.     "Private - Answers the selector used for getting the aspect value from the subject"
  47799.  
  47800.     ^#basicAt:
  47801. !
  47802.  
  47803. putSelector
  47804.     ^#basicAt:put:!
  47805.  
  47806. readFrom: anObject
  47807.     ^anObject basicAt: self key!
  47808.  
  47809. writeInto: subjectObject value: valueObject
  47810.     "Private - Set the attribute of subjectObject described by the receiver 
  47811.     to valueObject."
  47812.  
  47813.     ^subjectObject basicAt: self key put: valueObject! !
  47814.  
  47815. InstVarAspect comment:
  47816. ''!
  47817. !InstVarAspect methodsFor!
  47818.  
  47819. batchSize
  47820.     "Answers the batch size of the receiver, i.e. the number of keyed elements to return at a time"
  47821.  
  47822.     ^200!
  47823.  
  47824. canWriteInto: anObject
  47825.     ^self key ~= 0 and: [super canWriteInto: anObject]!
  47826.  
  47827. display: anObject on: aStream
  47828.     | index |
  47829.     (index := self key) == 0 
  47830.         ifFalse: 
  47831.             [aStream
  47832.                 display: (self instVarName: anObject);
  47833.                 nextPut: $=].
  47834.     (self readFrom: anObject) aspectDisplayOn: aStream!
  47835.  
  47836. instVarName: anObject
  47837.     "Answer the name of the instance variable described by the receiver in the 
  47838.     specified <Object>."
  47839.  
  47840.     | fixedSize index |
  47841.     (index := self key) = 0 ifTrue: [^#self].
  47842.     fixedSize := anObject class instSize.
  47843.     ^index <= fixedSize ifTrue: [anObject class allInstVarNames at: index] ifFalse: [index - fixedSize]!
  47844.  
  47845. nameIn: anObject
  47846.     "Private - Answer the 'name' of the aspect of the <Object> argument described by the receiver."
  47847.  
  47848.     ^self instVarName: anObject!
  47849.  
  47850. objectRefName: anObject
  47851.     | index stream |
  47852.     index := self key.
  47853.     stream := String writeStream.
  47854.     index > anObject class instSize 
  47855.         ifTrue: [stream nextPutAll: (anObject basicPrintString copyWithout: Character space)].
  47856.     stream display: (self instVarName: anObject).
  47857.     ^stream contents!
  47858.  
  47859. readFrom: anObject
  47860.     ^self key = 0 ifTrue: [anObject] ifFalse: [anObject instVarAt: self key]!
  47861.  
  47862. selectIn: anInspector
  47863.     anInspector selectAspect: self!
  47864.  
  47865. writeInto: subjectObject value: valueObject
  47866.     "Private - Set the attribute of subjectObject described by the receiver 
  47867.     to valueObject."
  47868.  
  47869.     ^subjectObject instVarAt: self key put: valueObject! !
  47870.  
  47871. KeyedAspectBatch comment:
  47872. 'Part of the PublishedAspectorInspector framework.<KeyedAspectBatch> instances are used to describe a group of <KeyedAspects> of a keyed collection. Batching the keyed aspects up in this way via a <KeyedAspectBatchAccessor> allows the PAI to only display a certain number of elements at a time. This can substantially improve performance when displaying large (or slow to access) collections.'!
  47873. !KeyedAspectBatch class methodsFor!
  47874.  
  47875. keys: aSequencedReadableCollection startingAt: startInteger batchSize: sizeInteger
  47876.     "Answer an instance of the receiver created with aKey"
  47877.  
  47878.     ^(super key: startInteger)
  47879.         setKeys: aSequencedReadableCollection batchSize: sizeInteger;
  47880.         yourself! !
  47881.  
  47882. !KeyedAspectBatch methodsFor!
  47883.  
  47884. accessorClass
  47885.     ^KeyedAspectBatchAccessor!
  47886.  
  47887. batchSize
  47888.     "Answers the batch size of the receiver, i.e. the number of keyed elements to return at a time"
  47889.  
  47890.     ^batchSize!
  47891.  
  47892. keys
  47893.     ^keys!
  47894.  
  47895. setKeys: aSequencedReadableCollection batchSize: anInteger
  47896.     "Private - Sets the batch size of the receiver"
  47897.  
  47898.     keys := aSequencedReadableCollection.
  47899.     batchSize := anInteger! !
  47900.  
  47901. EmbeddedField comment:
  47902. ''!
  47903. !EmbeddedField class methodsFor!
  47904.  
  47905. new
  47906.     "Private - Answer an instance of the receiver which describes an embedded attribute.
  47907.     This is an error because embedded attributes must include a type, and possibly
  47908.     a length."
  47909.  
  47910.     ^self shouldNotImplement! !
  47911.  
  47912. !EmbeddedField methodsFor!
  47913.  
  47914. alignment
  47915.     "Answer the alignment requirements for the receiver.
  47916.     This is the default alignment required for a field of the receiver's type
  47917.     when embedded in an array or structure, generally speaking this is the
  47918.     same as the byte size."
  47919.  
  47920.     ^self fieldClass alignment!
  47921.  
  47922. fieldClass
  47923.     "Private - Answer the class of <ExternalStructure> used to represent the 
  47924.     type of this field."
  47925.  
  47926.     ^fieldClass!
  47927.  
  47928. fieldClass: aClass
  47929.     "Private - Set the class of object to be used to represent the ExternalField in
  47930.     Smalltalk. Answer the receiver."
  47931.  
  47932.     fieldClass := aClass!
  47933.  
  47934. fieldClassName
  47935.     "Private - Answer the name of the class of object to be used to represent 
  47936.     the embedded field described by the receiver."
  47937.  
  47938.     ^self fieldClass name!
  47939.  
  47940. printOn: aStream
  47941.     "Append a representation of the receiver to aStream."
  47942.  
  47943.     aStream
  47944.         basicPrint: self;
  47945.         nextPut: $(; 
  47946.         print: self offset;
  47947.         nextPutAll: ': ';
  47948.         nextPutAll: self fieldClassName;
  47949.         nextPut: $)
  47950. !
  47951.  
  47952. readAccessorMethodText: contentsAccessString atOffset: offsetString
  47953.     "Private - Answer suitable method text for compiling a read-accessor method
  47954.     to substitute for the receiver (does not include the selector).
  47955.     Note that if returning an ExternalStructure subclass, then the
  47956.     resulting object will be a reference (an alias) to the original
  47957.     structure embedded in the contents of the receiving ExternalStructure,
  47958.     and therefore modifications to it will also modify the complete
  47959.     ExternalStructure. If, however, the structureClass is some other
  47960.     object which responds to #fromAddress:, the answer may be a copy
  47961.     of the embedded structure (e.g. subclasses of External) - so
  47962.     care is needed when updating the result."
  47963.  
  47964.     | s |
  47965.     s := (String new: 80) writeStream.
  47966.     s
  47967.         nextPut: $^;
  47968.         nextPutAll: self fieldClassName;
  47969.         nextPutAll: ' fromAddress: (';
  47970.         nextPutAll: contentsAccessString;
  47971.         nextPutAll: ' yourAddress'.
  47972.     offsetString ~= '0'
  47973.         ifTrue: [s nextPutAll: ' + '; nextPutAll: offsetString].
  47974.     ^s
  47975.         nextPut: $); 
  47976.         contents! !
  47977.  
  47978. FillerField comment:
  47979. ''!
  47980. !FillerField class methodsFor!
  47981.  
  47982. byteSize: anInteger
  47983.     "Answer a FillerField of the specified number of bytes"
  47984.  
  47985.     ^(self new) byteSize: anInteger; yourself! !
  47986.  
  47987. !FillerField methodsFor!
  47988.  
  47989. alignment
  47990.     "Answer the alignment requirements for the receiver.
  47991.     FillerFields pad to a specified number of bytes, so no further alignment
  47992.     is required."
  47993.  
  47994.     ^1!
  47995.  
  47996. byteSize
  47997.     "Private - Answer the byte size of the filler data the receiver represents"
  47998.  
  47999.     ^byteSize!
  48000.  
  48001. byteSize: anInteger
  48002.     "Private - Set the byte size of the filler data the receiver represents"
  48003.  
  48004.     byteSize := anInteger!
  48005.  
  48006. fieldClass
  48007.     ^ByteArray!
  48008.  
  48009. initialize
  48010.     "Private - Initialize the receiver."
  48011.     
  48012.     super initialize.
  48013.     self beInaccessible!
  48014.  
  48015. readAccessorMethodText: contentsAccessString atOffset: offsetString
  48016.     "Private - Answer suitable method text for compiling a read-accessor method
  48017.     to substitute for the receiver (does not include the selector)"
  48018.  
  48019.     ^nil!
  48020.  
  48021. readFrom: anExternal
  48022.     "Private - Answer the embedded object at the receiver's offset 
  48023.     in anExternal."
  48024.  
  48025.     ^self shouldNotImplement!
  48026.  
  48027. writeAccessorMethodText: contentsAccessString
  48028.     "Private - Answer suitable method text for compiling a write-accessor method
  48029.     to substitute for the receiver (does not include the selector)."
  48030.  
  48031.     ^nil!
  48032.  
  48033. writeInto: anExternal value: anObject
  48034.     "Private - Write anObject into anExternal at the appropriate offset and in the 
  48035.     appropriate format for the receiver"
  48036.  
  48037.     ^self shouldNotImplement! !
  48038.  
  48039. PointerField comment:
  48040. 'PointerField is an <ExternalField> type to represent pointer members of <ExternalStructure>s.'!
  48041. !PointerField class methodsFor!
  48042.  
  48043. ±V.!!Ñ¥;(╕Ñëp┼)α╞δ╔φ╘ƒ┴ºΓá    ║ú╘XIE┴─7\ôVV/mOZdσ█^Ph"F▒oe¼±`ε▀P¡ú┌⌠₧ì, ₧b_k ùⁿJ7á╠╥X\ÉVÆVf║Qú~äεT1Σh¢₧]ÖD}ó    (┌¥═╢┴Ñ`¢ ÿ₧╙s║■P¬eJ'Æ·'╩▐]δD╪M▀■s-╣╙y╨Ek╘s▄╢ΩB{íε∞÷σF╛⌡rU╕Γ╛BaCFt;îτW2hD┴ìM╝ÇkIpoä═o¥[Æ⌡┬╗░!!ñ¡ê┘Æ~íδ╠I▄2╡y°OzJ∩│l╥-6åoæç╙╥╓FÅ╙┬πP¬R9┤oΦ!!└Σ∞╓HzD$W£]·π,wû1ï╤YVSôt:═┐}╕JH6í╦ E84^C>┼╥╘éÉΓ_/∞┐$⌡ⁿ÷I█4,`Uπⁿ(Y}╥xÄδ▌êU∞⌐ß╖╚Äɱ2╔φUD-«å╒S╬2╣AjΦ¡δÄ¿U■ö)┐£└A■╣┐`ε*]!
  48044.  
  48045. to: aClass
  48046.     "Now deprecated in favour of #type: which is polymorphic
  48047.     with <StructureField>."
  48048.  
  48049.     Notification deprecated.
  48050.     ^self type: aClass!
  48051.  
  48052. type: aClass 
  48053.     "Answer a new instance of the receiver which is used for dereferencing
  48054.     pointers to objects of type aClass"
  48055.  
  48056.     ^super new fieldClass: aClass! !
  48057.  
  48058. !PointerField methodsFor!
  48059.  
  48060. byteSize
  48061.     "Private - Answer the byte size of the ExternalField the receiver represents
  48062.     Answer the size of a 32-bit pointer"
  48063.  
  48064.     ^4!
  48065.  
  48066. fieldClass
  48067.     "Private - Answer the class of Smalltalk object to be used when dereferencing
  48068.     pointers of the receiver's type."
  48069.  
  48070.     ^fieldClass!
  48071.  
  48072. fieldClass: aClass 
  48073.     "Private - Set the class of Smalltalk object to be used when dereferencing
  48074.     pointers of the receiver's type. Answer the receiver."
  48075.  
  48076.     fieldClass := aClass!
  48077.  
  48078. readAccessorMethodText: contentsAccessString atOffset: offsetString 
  48079.     "Private - Answer suitable method text for compiling a read-accessor method
  48080.     to substitute for the receiver (does not include the selector)"
  48081.  
  48082.     ^'^' , self fieldClass name , ' fromAddress: (' , contentsAccessString 
  48083.         , ' sdwordAtOffset: ' , offsetString 
  48084.         , ')'!
  48085.  
  48086. readFrom: anExternal 
  48087.     "Private - Answer an object of the type pointed at by the receiver in 
  48088.     anExternal. WARNING: May be a copy or a reference depending on 
  48089.     the behavior of pointerClass (which can be any Behavior which
  48090.     has the instance creation method #fromAddress:)"
  48091.  
  48092.     ^self fieldClass fromAddress: (anExternal sdwordAtOffset: offset)!
  48093.  
  48094. writeAccessorMethodText: contentsAccessString
  48095.     "Private - Answer suitable method text for compiling a write-accessor method
  48096.     to substitute for the receiver (does not include the selector)"
  48097.  
  48098.     ^contentsAccessString, ' dwordAtOffset: ', self offset displayString, ' put: anObject yourAddress'!
  48099.  
  48100. writeInto: anExternal value: anObject
  48101.     "Private - Write the address of the externally addressable Smalltalk object, anObject,
  48102.     into anExternal at the receiver's offset.
  48103.     N.B. Precautions must be taken (such as saving the Object as an
  48104.     instance variable of the ExternalStructure which encapsulates anExternal)
  48105.     to prevent anObject being garbage collected, which will invalidate its
  48106.     address. anObject cannot be saved by the receiver, because it is shared
  48107.     among all instances of a subclass of ExternalStructure (it is part of
  48108.     the class instance variable 'template')."
  48109.  
  48110.     ^anExternal dwordAtOffset: offset put: anObject yourAddress! !
  48111.  
  48112. ScalarField comment:
  48113. ''!
  48114. !ScalarField class methodsFor!
  48115.  
  48116. byteSize
  48117.     "Private - Answer the size of the field type the receiver represents in bytes.
  48118.     A large number of fields are 32-bits long."
  48119.  
  48120.     ^4! !
  48121.  
  48122. !ScalarField methodsFor!
  48123.  
  48124. accessorStem
  48125.     "Private - Answer the receiver's 'accessorStem' prefix to be prepended
  48126.     to automatically generated accessor selectors."
  48127.  
  48128.     ^self subclassResponsibility!
  48129.  
  48130. byteSize
  48131.     "Private - Answer the size of the field type the receiver represents in bytes.
  48132.     This is fixed for ScalarFields."
  48133.  
  48134.     ^self class byteSize!
  48135.  
  48136. readAccessorMethodText: contentsAccessString atOffset: offsetString
  48137.     "Private - Answer suitable method text for compiling a read-accessor method
  48138.     to substitute for the receiver (does not include the selector)"
  48139.  
  48140.     ^'^', self readAccessorPrefix, contentsAccessString, ' ', 
  48141.             self accessorStem, 'AtOffset: ', offsetString, self readAccessorPostfix!
  48142.  
  48143. readAccessorPostfix
  48144.     "Private - Answer the receiver's accessor method prefix to be prepended
  48145.     to automatically generated accessor read selectors."
  48146.  
  48147.     ^')'!
  48148.  
  48149. readAccessorPrefix
  48150.     "Private - Answer the receiver's accessor method prefix to be prepended
  48151.     to automatically generated accessor read selectors."
  48152.  
  48153.     ^'('!
  48154.  
  48155. writeAccessorMethodText: contentsAccessString
  48156.     "Private - Answer suitable method text for compiling a read-accessor method
  48157.     to substitute for the receiver (does not include the selector)"
  48158.  
  48159.     ^contentsAccessString, ' ', self accessorStem, 'AtOffset: ', self offset displayString, ' put: anObject'! !
  48160.  
  48161. ArrayField comment:
  48162. 'ArrayField is an <ExternalField> type to represent <ExternalStructure> members which are arrays whose contents are actually embedded in the structure, as opposed to being merely pointed at from the structure.'!
  48163. !ArrayField class methodsFor!
  48164.  
  48165. type: aClass length: anInteger
  48166.     "Answer a new instance of the receiver which is used for describing
  48167.     embedded arrays of type aClass, with anInteger elements."
  48168.  
  48169.     ^self basicNew initialize;
  48170.         fieldClass: aClass;
  48171.         length: anInteger! !
  48172.  
  48173. !ArrayField methodsFor!
  48174.  
  48175. alignment
  48176.     "Answer the alignment requirements for the receiver.
  48177.     This is the default alignment required for a field of the receiver's type
  48178.     when embedded in an array or structure, generally speaking this is the
  48179.     same as the byte size."
  48180.  
  48181.     ^self elementSize!
  48182.  
  48183. arrayClass
  48184.     "Private - Answer the class of <ExternalArray> that this field type describes."
  48185.  
  48186.     ^fieldClass!
  48187.  
  48188. byteSize
  48189.     "Private - Answer the byte size of the embedded array the receiver represents.
  48190.     By default we assume that the length of the receiver is specified in bytes."
  48191.  
  48192.     ^length * self elementSize!
  48193.  
  48194. elementSize
  48195.     "Private - Answer the byte size of the structures/values that constitute
  48196.     the elements of the embedded array the receiver represents."
  48197.  
  48198.     ^self arrayClass elementSize!
  48199.  
  48200. length
  48201.     "Private - Answer the length of the embedded array represented by the receiver."
  48202.  
  48203.     ^length!
  48204.  
  48205. length: anInteger
  48206.     "Private - Set the length (element count) of the embedded array the receiver 
  48207.     represents. Answer the receiver."
  48208.  
  48209.     length := anInteger!
  48210.  
  48211. lengthString
  48212.     "Private - Answer the length string to be inserted in the accessor."
  48213.  
  48214.     ^self length displayString!
  48215.  
  48216. readAccessorMethodText: contentsAccessString
  48217.     "Private - Answer suitable method text for compiling a read-accessor method
  48218.     to substitute for the receiver (does not include the selector)."
  48219.  
  48220.     ^(super readAccessorMethodText: contentsAccessString), 
  48221.             ' length: ', self lengthString!
  48222.  
  48223. readFrom: anExternal
  48224.     "Private - Answer the embedded object at the receiver's offset 
  48225.     in anExternal. This may be a copy of the original data
  48226.     (e.g. if structureClass is a subclass of External) or a
  48227.     reference to the original data (e.g. if structureClass is a
  48228.     subclass of ExternalStructure)"
  48229.  
  48230.     ^self arrayClass fromAddress: anExternal yourAddress + offset length: self length!
  48231.  
  48232. writeAccessorMethodText: contentsAccessString
  48233.     "Private - Answer suitable method text for compiling a write-accessor method
  48234.     to substitute for the receiver (does not include the selector).
  48235.     N.B. In this case we overwrite the embedded array."
  48236.  
  48237.     | aStream |
  48238.     aStream := String writeStream: 128.
  48239.     aStream 
  48240.         nextPutAll: '| size |'; crtab;
  48241.         nextPutAll: 'size := anObject byteSize'.
  48242.     "Null terminator is included in the reported byteSize, but not the size/basicSize"
  48243.     self arrayClass isNullTerminated 
  48244.         ifTrue: [aStream nextPutAll: ' - '; display: self elementSize].
  48245.     aStream
  48246.         nextPutAll: ' min: (';
  48247.         nextPutAll: self lengthString; nextPutAll: ' * '; display: self elementSize;
  48248.         nextPutAll: ').'; crtab;
  48249.         nextPutAll: 'anObject replaceBytesOf: ';
  48250.         nextPutAll: contentsAccessString;
  48251.         nextPutAll: ' from: '; nextPutAll: (self offset + 1) displayString;
  48252.         nextPutAll: ' to: '.
  48253.     self offset == 0
  48254.         ifFalse: [
  48255.             aStream 
  48256.                 nextPutAll: self offset displayString;
  48257.                 nextPutAll: ' + ' ].
  48258.     ^aStream
  48259.         nextPutAll: 'size startingAt: 1';
  48260.         contents!
  48261.  
  48262. writeInto: bytes value: anObject
  48263.     "Private - Write the bytes of anObject into anExternal."
  48264.  
  48265.     | size |
  48266.     size := anObject size min: self length * self elementSize.
  48267.     bytes replaceFrom: offset+1 to: offset+size with: anObject startingAt: 1! !
  48268.  
  48269. StructureField comment:
  48270. 'ExternalField Type for embedded structures'!
  48271. !StructureField class methodsFor!
  48272.  
  48273. ±V.!!Ñ¥;(╕Ñëp┼)α╞δ╔φ╘ƒ┴ºΓá    ║ú╘XIE┴─7\ôVV/mOZdσ█^Ph"F▒oe¼±`ε▀P¡ú┌⌠₧ì, ₧b_k ùⁿJ7á╠╥X\ÉVÆVf║Qú~äεT1Σh¢₧]ÖD}ó    (┌¥═╢┴Ñ`¢ ÿ₧╙s║■P¬eJ'Æ·'╩▐]δD╪M▀■s-╣╙y╨Ek╘s▄╢ΩB{íε∞÷σF╛⌡rU╕Γ╛BaCFt;îτW2hD┴ìM╝ÇkIpoä═o¥[Æ⌡┬╗░!!ñ¡ê┘Æ~íδ╠I▄2╡y°OzJ∩│l╥-6åoæç╙╥╓FÅ╙┬πP¬R9┤oΦ!!└Σ∞╓HzD$W£]·π,wû1ï╤YVSôt:═┐}╕JH6í╦ E84^C>┼╥╘éÉΓ_/∞┐$⌡ⁿ÷I█4,`Uπⁿ(Y}╥xÄδ▌êU∞⌐ß╖╚Äɱ2╔φUD-«å╒S╬2╣AjΦ¡δÄ¿U■ö)┐£└A■╣┐`ε*]!
  48274.  
  48275. type: aClass
  48276.     "Answer a new instance of the receiver which is used for describing
  48277.     embedded structures of type aClass."
  48278.  
  48279.     ^self basicNew
  48280.         initialize;
  48281.         fieldClass: aClass! !
  48282.  
  48283. !StructureField methodsFor!
  48284.  
  48285. byteSize
  48286.     "Private - Answer the byte size of the embedded ExternalStructure the
  48287.     receiver represents"
  48288.  
  48289.     ^self fieldClass byteSize!
  48290.  
  48291. readFrom: anExternal
  48292.     "Private - Answer the embedded object at the receiver's offset 
  48293.     in anExternal. This may be a copy of the original data
  48294.     (e.g. if structureClass is a subclass of External) or a
  48295.     reference to the original data (e.g. if structureClass is a
  48296.     subclass of ExternalStructure)"
  48297.  
  48298.     ^self fieldClass fromAddress: anExternal yourAddress + offset!
  48299.  
  48300. writeAccessorMethodText: contentsAccessString
  48301.     "Private - Answer suitable method text for compiling a write-accessor method
  48302.     to substitute for the receiver (does not include the selector).
  48303.     N.B. In this case we overwrite the entire embedded structure with
  48304.     a new one"
  48305.  
  48306.     | aStream |
  48307.     aStream := String writeStream: 128.
  48308.     ^aStream 
  48309.         nextPutAll: 'anObject replaceBytesOf: ';
  48310.         nextPutAll: contentsAccessString;
  48311.         nextPutAll: ' from: '; nextPutAll:  (self offset + 1) displayString;
  48312.         nextPutAll: ' to: '; nextPutAll: (self offset + self byteSize) displayString;
  48313.         nextPutAll: ' startingAt: 1';
  48314.         contents!
  48315.  
  48316. writeInto: anExternal value: anExternalStructure
  48317.     "Private - Write the bytes of anExternalStructure into anExternal."
  48318.  
  48319.     anExternalStructure
  48320.         replaceBytesOf: anExternal
  48321.         from: offset+1
  48322.         to: offset+self byteSize
  48323.         startingAt: 1! !
  48324.  
  48325. StringField comment:
  48326. '<StringField> is an <ExternalField> class which can be used to represent embedded strings fields in <ExternalStructure>s.
  48327.  
  48328. StringField can be used for both <String>s and <UnicodeString>s.'!
  48329. !StringField class methodsFor!
  48330.  
  48331. length: anInteger
  48332.     "Answer a new instance of the receiver which is used for describing
  48333.     embedded arrays of type aClass, and of byte size anInteger"
  48334.  
  48335.     ^self type: String length: anInteger! !
  48336.  
  48337. !StringField methodsFor!
  48338.  
  48339. length
  48340.     "Private - Answer the size of object of the receivers fieldClass required to hold the
  48341.     number of elements in the field."
  48342.  
  48343.     ^super length - 1!
  48344.  
  48345. readAccessorMethodText: contentsAccessString
  48346.     "Private - Answer suitable method text for compiling a read-accessor method
  48347.     to substitute for the receiver (does not include the selector).
  48348.     Revert back to the basic definition as we don't want to use the length (need
  48349.     to trim nulls)."
  48350.  
  48351.     ^self readAccessorMethodText: contentsAccessString atOffset: self offset displayString!
  48352.  
  48353. readFrom: anExternal
  48354.     "Private - Answer the embedded object at the receiver's offset 
  48355.     in anExternal. We trim any trailing nulls."
  48356.  
  48357.     ^self arrayClass fromAddress: anExternal yourAddress + offset!
  48358.  
  48359. writeAccessorMethodText: contentsAccessString
  48360.     "Private - Answer suitable method text for compiling a write-accessor method
  48361.     to substitute for the receiver (does not include the selector).
  48362.     N.B. In this case we overwrite the embedded String, not forgetting
  48363.     to Null Terminate it"
  48364.  
  48365.     ^(String writeStream: 256)
  48366.         nextPutAll: (super writeAccessorMethodText: contentsAccessString); 
  48367.         nextPut: $.; crtab;
  48368.         nextPutAll: contentsAccessString; 
  48369.         nextPutAll: ' at: size+';
  48370.         display: self offset + 1;
  48371.         nextPutAll: ' put: 0';
  48372.         contents!
  48373.  
  48374. writeInto: bytes value: anObject
  48375.     "Private - Write the bytes of anObject into anExternal. Don't forget the Null Terminator"
  48376.  
  48377.     | size elemSize |
  48378.     elemSize := self elementSize.
  48379.     size := anObject byteSize - elemSize min: self length * elemSize.
  48380.     bytes replaceFrom: offset+1 to: offset+size with: anObject startingAt: 1.
  48381.     bytes at: offset+size+1 put: 0! !
  48382.  
  48383. StructureArrayField comment:
  48384. ''!
  48385. !StructureArrayField methodsFor!
  48386.  
  48387. alignment
  48388.     "Answer the alignment requirements for the receiver.
  48389.     This is the default alignment required for a field of the receiver's type
  48390.     when embedded in an array or structure, generally speaking this is the
  48391.     same as the byte size."
  48392.  
  48393.     ^self fieldClass alignment!
  48394.  
  48395. arrayClass
  48396.     "Private - Answer the class of <ExternalArray> that this field type describes."
  48397.  
  48398.     ^StructureArray!
  48399.  
  48400. byteSize
  48401.     "Private - Answer the byte size of the embedded array the receiver represents"
  48402.  
  48403.     ^self length * self elementSize!
  48404.  
  48405. elementSize
  48406.     "Private - Answer the byte size of the structures/values that constitute
  48407.     the elements of the embedded array the receiver represents."
  48408.  
  48409.     ^self fieldClass elementSize!
  48410.  
  48411. fieldClassName
  48412.     "Private - Answer the name of the class of object to be used to represent 
  48413.     the embedded field described by the receiver."
  48414.  
  48415.     ^self arrayClass name!
  48416.  
  48417. readAccessorMethodText: contentsAccessString
  48418.     "Private - Answer suitable method text for compiling a read-accessor method
  48419.     to substitute for the receiver (does not include the selector)."
  48420.  
  48421.     ^(super readAccessorMethodText: contentsAccessString), 
  48422.             ' elementClass: ', self fieldClass name!
  48423.  
  48424. readFrom: anExternal
  48425.     "Private -  Answer a <StructureArray> which references the array
  48426.     of structures embedded in the <ExternalStructure>, struct, in the
  48427.     field described by the receiver.  The result may be sent #at: and #at:put:
  48428.     messages to get/set the actual elements in-place."
  48429.  
  48430.     ^self arrayClass 
  48431.         fromAddress: anExternal yourAddress + offset 
  48432.         length: self length
  48433.         elementClass: self fieldClass! !
  48434.  
  48435. PointerArrayField comment:
  48436. ''!
  48437. !PointerArrayField methodsFor!
  48438.  
  48439. alignment
  48440.     "Answer the alignment requirements for the receiver.
  48441.     All pointers are 32-bits."
  48442.  
  48443.     ^4!
  48444.  
  48445. arrayClass
  48446.     "Private - Answer the class of <ExternalArray> that this field type describes."
  48447.  
  48448.     ^PointerArray!
  48449.  
  48450. elementSize
  48451.     "Private - Answer the byte size of the structures/values that constitute
  48452.     the elements of the embedded array the receiver represents.
  48453.     All pointers are 32-bits."
  48454.  
  48455.     ^4! !
  48456.  
  48457. VariableStructureArrayField comment:
  48458. 'VariableStructureArrayField is a class of <AttributeDescriptor> which can be used to describe those fields of <ExternalStructure>s which are themselves embedded arrays of <ExternalStructure>s. For example, give the C++ structure definitions:
  48459.  
  48460.     struct PALETTEENTRY {...};
  48461.     struct LOGPALETTE {    
  48462.         struct LOGPALETTE {
  48463.             WORD         palVersion; 
  48464.             WORD         palNumEntries; 
  48465.             PALETTEENTRY palPalEntry[1]; 
  48466.         };
  48467.  
  48468. then a template definition for LOGPALETTE might be as follows:
  48469.  
  48470.     self
  48471.         defineField: #palVersion     type: WORDField new;
  48472.         defineField: #palNumEntries     type: WORDField new;
  48473.         defineField: #palPalEntry     type: (StructureArrayField type: PALETTEENTRY length: #palNumEntries)
  48474.  
  48475. Note: The #byteSize method must be overridden in structures with variable length embedded items, as the base implementation is calculated statically. Furthermore such structures cannot be passed and returned by value because the VM is unable to determine the correct size.
  48476.  
  48477. Instance Variables:
  48478.  
  48479. None, but we hijack the superclass instance variable ''length'' to hold the selector used to get the length at runtime. This is not terribly clean, but reflects this classes late addition to the design.'!
  48480. !VariableStructureArrayField methodsFor!
  48481.  
  48482. elementClass
  48483.     "Private - Answer the class of <ExternalStructure> used to represent elements of the receiver."
  48484.  
  48485.     ^fieldClass!
  48486.  
  48487. length
  48488.     "Answer the length of the array at the field described
  48489.     by the receiver. We don't know until run time what the length
  48490.     is, so claim there is one element."
  48491.  
  48492.     ^1!
  48493.  
  48494. lengthString
  48495.     "Private - Answer the length string to be inserted in the accessor."
  48496.  
  48497.     ^'self ', length!
  48498.  
  48499. readFrom: struct
  48500.     "Private -  Answer a <StructureArray> which references the array
  48501.     of structures embedded in the <ExternalStructure>, struct, in the
  48502.     field described by the receiver.  The result may be sent #at: and #at:put:
  48503.     messages to get/set the actual elements in-place."
  48504.  
  48505.     ^self arrayClass
  48506.         fromAddress: struct yourAddress + offset
  48507.         length: (struct perform: length)
  48508.         elementClass: self elementClass! !
  48509.  
  48510. ArrayPointerField comment:
  48511. 'ArrayPointerField is an <ExternalField> type to represent <ExternalStructure> members which are pointers to arrays.'!
  48512. !ArrayPointerField class methodsFor!
  48513.  
  48514. to: aClass length: anInteger
  48515.     "Now deprecated in favour of #type:length: which is polymorphic
  48516.     with <StructureArrayField>."
  48517.  
  48518.     Notification deprecated.
  48519.     ^(super type: aClass) length: anInteger!
  48520.  
  48521. type: aClass length: length
  48522.     "Answer a new instance of the receiver which is used for dereferencing
  48523.     pointers to arrays objects of type aClass, of the specified fixed <integer> length."
  48524.  
  48525.     ^(super type: aClass) length: length! !
  48526.  
  48527. !ArrayPointerField methodsFor!
  48528.  
  48529. length
  48530.     "Answer the <integer> length of the array pointed at by the field described
  48531.     by the receiver. If this is a dynamic value which will vary at runtime depending
  48532.     on the structure in which the field is embedded, then answer one."
  48533.  
  48534.     ^length!
  48535.  
  48536. length: elementCountOrSelector
  48537.     "Private - Set the length of the array pointed at by the field described
  48538.     by the receiver."
  48539.  
  48540.     length := elementCountOrSelector!
  48541.  
  48542. lengthString
  48543.     "Private - Answer the length string to be inserted in the accessor."
  48544.  
  48545.     ^self length displayString!
  48546.  
  48547. readAccessorMethodText: contentsAccessString
  48548.     "Private - Answer suitable method text for compiling a read-accessor method
  48549.     to substitute for the receiver (does not include the selector)."
  48550.  
  48551.     ^(super readAccessorMethodText: contentsAccessString), 
  48552.         ' length: ', self lengthString!
  48553.  
  48554. readFrom: anExternal 
  48555.     "Private - Answer an object of the type pointed at by the receiver in 
  48556.     anExternal. WARNING: May be a copy or a reference depending on 
  48557.     the behavior of pointerClass (which can be any Behavior which
  48558.     has the instance creation method #fromAddress:)"
  48559.  
  48560.     ^self fieldClass fromAddress: (anExternal sdwordAtOffset: offset) length: self length! !
  48561.  
  48562. StructureArrayPointerField comment:
  48563. 'StructureArrayPointerField is an <ExternalField> type to represent <ExternalStructure> members which are pointers to arrays of structures.'!
  48564. !StructureArrayPointerField methodsFor!
  48565.  
  48566. elementClass
  48567.     "Private - Answer the class of Smalltalk object embedded in the structure
  48568.     array pointed at by fields described by the receiver."
  48569.  
  48570.     ^fieldClass!
  48571.  
  48572. fieldClass
  48573.     "Private - Answer the class of Smalltalk object to be used when dereferencing
  48574.     pointers of the receiver's type."
  48575.  
  48576.     ^StructureArray!
  48577.  
  48578. readAccessorMethodText: contentsAccessString
  48579.     "Private - Answer suitable method text for compiling a read-accessor method
  48580.     to substitute for the receiver (does not include the selector)."
  48581.  
  48582.     ^(super readAccessorMethodText: contentsAccessString), 
  48583.         ' elementClass: ', self elementClass name!
  48584.  
  48585. readFrom: struct 
  48586.     "Private - Answer a <StructureArray> which references the array of structures
  48587.     pointed at by the field described by the receiver in the <ExternalStructure>, struct.
  48588.     N.B. The answer is a reference, and modifications to it will update the original buffer."
  48589.  
  48590.     ^self fieldClass 
  48591.         fromAddress: (struct sdwordAtOffset: offset)
  48592.         length: self length
  48593.         elementClass: self elementClass! !
  48594.  
  48595. PointerArrayPointerField comment:
  48596. ''!
  48597. !PointerArrayPointerField methodsFor!
  48598.  
  48599. fieldClass
  48600.     "Private - Answer the class of Smalltalk object to be used when dereferencing
  48601.     pointers of the receiver's type."
  48602.  
  48603.     ^PointerArray! !
  48604.  
  48605. VariableStructureArrayPointerField comment:
  48606. 'VariableStructureArrayPointerField is an <ExternalField> type to represent <ExternalStructure> members which are pointers to variable length arrays of structures where another field in the structure holds the length of the array, e.g. as in the various OLE counted array structures.'!
  48607. !VariableStructureArrayPointerField methodsFor!
  48608.  
  48609. length
  48610.     "Answer the length of the array pointed at by the field described
  48611.     by the receiver. We don't know until run time what the length
  48612.     is, so claim there is one element."
  48613.  
  48614.     ^1!
  48615.  
  48616. lengthString
  48617.     "Private - Answer the length string to be inserted in the accessor."
  48618.  
  48619.     ^'self ', length!
  48620.  
  48621. readFrom: struct 
  48622.     "Private - Answer a <StructureArray> which references the array of structures
  48623.     pointed at by the field described by the receiver in the <ExternalStructure>, struct.
  48624.     N.B. The answer is a reference, and modifications to it will update the original buffer."
  48625.  
  48626.     ^self fieldClass 
  48627.         fromAddress: (struct sdwordAtOffset: offset)
  48628.         length: (struct perform: length)
  48629.         elementClass: self elementClass! !
  48630.  
  48631. BOOLField comment:
  48632. ''!
  48633. !BOOLField methodsFor!
  48634.  
  48635. accessorStem
  48636.     "Private - Answer the receiver's 'accessorStem'."
  48637.  
  48638.     ^'dword'!
  48639.  
  48640. fieldClass
  48641.     ^Boolean!
  48642.  
  48643. readAccessorPostfix
  48644.     "Private - Answer the receiver's accessor method prefix to be prepended
  48645.     to automatically generated accessor read selectors."
  48646.  
  48647.     ^') asBoolean'!
  48648.  
  48649. readFrom: anExternal
  48650.     "Private - Instantiate an object of the the type the receiver represents
  48651.     at the receiver's offset in anExternal"
  48652.  
  48653.     ^(anExternal dwordAtOffset: offset) asBoolean
  48654. !
  48655.  
  48656. writeAccessorMethodText: contentsAccessString
  48657.     "Private - Answer suitable method text for compiling a write-accessor method
  48658.     to substitute for the receiver (does not include the selector)"
  48659.  
  48660.     ^(super writeAccessorMethodText: contentsAccessString), ' asParameter'!
  48661.  
  48662. writeInto: anExternal value: anObject
  48663.     "Private - Write anObject into anExternal at the receiver's offset, and in a form
  48664.     appropriate for the receiver's External type"
  48665.  
  48666.     ^(anExternal dwordAtOffset: offset put: anObject) asBoolean! !
  48667.  
  48668. BYTEField comment:
  48669. ''!
  48670. !BYTEField class methodsFor!
  48671.  
  48672. byteSize
  48673.     "Private - Answer the size of the field type the receiver represents in bytes.
  48674.     A large number of fields are 32-bits long."
  48675.  
  48676.     ^1! !
  48677.  
  48678. !BYTEField methodsFor!
  48679.  
  48680. accessorStem
  48681.     "Private - Answer the receiver's 'accessorStem'."
  48682.  
  48683.     ^'byte'!
  48684.  
  48685. fieldClass
  48686.     ^BYTE!
  48687.  
  48688. readFrom: anExternal
  48689.     "Private - Instantiate an object of the the type the receiver represents
  48690.     at the receiver's offset in anExternal"
  48691.  
  48692.     ^anExternal byteAtOffset: offset
  48693. !
  48694.  
  48695. writeInto: anExternal value: anObject
  48696.     "Private - Write the value of anObject into anExternal at the receiver's offset, and in a form
  48697.     appropriate for the receiver's External type"
  48698.  
  48699.     ^anExternal byteAtOffset: offset put: anObject! !
  48700.  
  48701. DOUBLEField comment:
  48702. ''!
  48703. !DOUBLEField class methodsFor!
  48704.  
  48705. byteSize
  48706.     "Private - Answer the size of the field type the receiver represents in bytes.
  48707.     A large number of fields are 32-bits long."
  48708.  
  48709.     ^8! !
  48710.  
  48711. !DOUBLEField methodsFor!
  48712.  
  48713. accessorStem
  48714.     "Private - Answer the receiver's 'accessorStem'."
  48715.  
  48716.     ^'double'!
  48717.  
  48718. fieldClass
  48719.     ^DOUBLE!
  48720.  
  48721. readFrom: anExternal
  48722.     "Private - Instantiate an object of the the type the receiver represents
  48723.     at the receiver's offset in anExternal"
  48724.  
  48725.     ^anExternal doubleAtOffset: offset
  48726. !
  48727.  
  48728. writeInto: anExternal value: anObject
  48729.     "Private - Write anObject into anExternal at the receiver's offset, and in a form
  48730.     appropriate for the receiver's External type"
  48731.  
  48732.     ^anExternal doubleAtOffset: offset put: anObject! !
  48733.  
  48734. DWORDField comment:
  48735. ''!
  48736. !DWORDField methodsFor!
  48737.  
  48738. accessorStem
  48739.     "Private - Answer the receiver's 'accessorStem'."
  48740.  
  48741.     ^'dword'!
  48742.  
  48743. fieldClass
  48744.     ^DWORD!
  48745.  
  48746. readFrom: anExternal
  48747.     "Private - Instantiate an object of the the type the receiver represents
  48748.     at the receiver's offset in anExternal"
  48749.  
  48750.     ^anExternal dwordAtOffset: offset
  48751. !
  48752.  
  48753. writeInto: anExternal value: anObject
  48754.     "Private - Write anObject into anExternal at the receiver's offset, and in a form
  48755.     appropriate for the receiver's External type"
  48756.  
  48757.     ^anExternal dwordAtOffset: offset put: anObject! !
  48758.  
  48759. FLOATField comment:
  48760. ''!
  48761. !FLOATField methodsFor!
  48762.  
  48763. accessorStem
  48764.     "Private - Answer the receiver's 'accessorStem'."
  48765.  
  48766.     ^'float'!
  48767.  
  48768. fieldClass
  48769.     ^FLOAT!
  48770.  
  48771. readFrom: anExternal
  48772.     "Private - Instantiate an object of the the type the receiver represents
  48773.     at the receiver's offset in anExternal"
  48774.  
  48775.     ^anExternal floatAtOffset: offset
  48776. !
  48777.  
  48778. writeInto: anExternal value: anObject
  48779.     "Private - Write anObject into anExternal at the receiver's offset, and in a form
  48780.     appropriate for the receiver's External type"
  48781.  
  48782.     ^anExternal floatAtOffset: offset put: anObject! !
  48783.  
  48784. QWORDField comment:
  48785. ''!
  48786. !QWORDField class methodsFor!
  48787.  
  48788. byteSize
  48789.     "Private - Answer the size of the field type the receiver represents in bytes."
  48790.  
  48791.     ^8! !
  48792.  
  48793. !QWORDField methodsFor!
  48794.  
  48795. accessorStem
  48796.     "Private - Answer the receiver's 'accessorStem'."
  48797.  
  48798.     ^'qword'!
  48799.  
  48800. fieldClass
  48801.     ^ULARGE_INTEGER!
  48802.  
  48803. readFrom: anExternal
  48804.     "Private - Instantiate an object of the the type the receiver represents
  48805.     at the receiver's offset in anExternal"
  48806.  
  48807.     ^anExternal qwordAtOffset: offset
  48808. !
  48809.  
  48810. writeInto: anExternal value: anObject
  48811.     "Private - Write anObject into anExternal at the receiver's offset, and in a form
  48812.     appropriate for the receiver's External type"
  48813.  
  48814.     ^anExternal qwordAtOffset: offset put: anObject! !
  48815.  
  48816. SBYTEField comment:
  48817. ''!
  48818. !SBYTEField class methodsFor!
  48819.  
  48820. byteSize
  48821.     "Private - Answer the size of the field type the receiver represents in bytes.
  48822.     A large number of fields are 32-bits long."
  48823.  
  48824.     ^1! !
  48825.  
  48826. !SBYTEField methodsFor!
  48827.  
  48828. accessorStem
  48829.     "Private - Answer the receiver's 'accessorStem'."
  48830.  
  48831.     ^'sbyte'!
  48832.  
  48833. fieldClass
  48834.     ^SBYTE!
  48835.  
  48836. readFrom: anExternal
  48837.     "Private - Instantiate an object of the the type the receiver represents
  48838.     at the receiver's offset in anExternal"
  48839.  
  48840.     ^anExternal sbyteAtOffset: offset
  48841. !
  48842.  
  48843. writeInto: anExternal value: anObject
  48844.     "Private - Write the value of anObject into anExternal at the receiver's offset, and in a form
  48845.     appropriate for the receiver's External type"
  48846.  
  48847.     ^anExternal sbyteAtOffset: offset put: anObject! !
  48848.  
  48849. SDWORDField comment:
  48850. ''!
  48851. !SDWORDField methodsFor!
  48852.  
  48853. accessorStem
  48854.     "Private - Answer the receiver's 'accessorStem'."
  48855.  
  48856.     ^'sdword'!
  48857.  
  48858. fieldClass
  48859.     ^SDWORD!
  48860.  
  48861. readFrom: anExternal
  48862.     "Private - Instantiate an object of the the type the receiver represents
  48863.     at the receiver's offset in anExternal"
  48864.  
  48865.     ^anExternal sdwordAtOffset: offset!
  48866.  
  48867. writeInto: anExternal value: anObject
  48868.     "Private - Write anObject into anExternal at the receiver's offset, and in a form
  48869.     appropriate for the receiver's External type"
  48870.  
  48871.     ^anExternal sdwordAtOffset: offset put: anObject! !
  48872.  
  48873. SQWORDField comment:
  48874. ''!
  48875. !SQWORDField class methodsFor!
  48876.  
  48877. byteSize
  48878.     "Private - Answer the size of the field type the receiver represents in bytes."
  48879.  
  48880.     ^8! !
  48881.  
  48882. !SQWORDField methodsFor!
  48883.  
  48884. accessorStem
  48885.     "Private - Answer the receiver's 'accessorStem'."
  48886.  
  48887.     ^'sqword'!
  48888.  
  48889. fieldClass
  48890.     ^LARGE_INTEGER!
  48891.  
  48892. readFrom: anExternal
  48893.     "Private - Instantiate an object of the the type the receiver represents
  48894.     at the receiver's offset in anExternal"
  48895.  
  48896.     ^anExternal sqwordAtOffset: offset
  48897. !
  48898.  
  48899. writeInto: anExternal value: anObject
  48900.     "Private - Write anObject into anExternal at the receiver's offset, and in a form
  48901.     appropriate for the receiver's External type"
  48902.  
  48903.     ^anExternal sqwordAtOffset: offset put: anObject! !
  48904.  
  48905. SWORDField comment:
  48906. ''!
  48907. !SWORDField class methodsFor!
  48908.  
  48909. byteSize
  48910.     "Private - Answer the size of the field type the receiver represents in bytes."
  48911.  
  48912.     ^2! !
  48913.  
  48914. !SWORDField methodsFor!
  48915.  
  48916. accessorStem
  48917.     "Private - Answer the receiver's 'accessorStem'."
  48918.  
  48919.     ^'sword'!
  48920.  
  48921. fieldClass
  48922.     ^SWORD!
  48923.  
  48924. readFrom: anExternal
  48925.     "Private - Instantiate an object of the the type the receiver represents
  48926.     at the receiver's offset in anExternal"
  48927.  
  48928.     ^anExternal wordAtOffset: offset
  48929. !
  48930.  
  48931. writeInto: anExternal value: anObject
  48932.     "Private - Write anObject into anExternal at the receiver's offset, and in a form
  48933.     appropriate for the receiver's External type"
  48934.  
  48935.     ^anExternal swordAtOffset: offset put: anObject! !
  48936.  
  48937. WORDField comment:
  48938. ''!
  48939. !WORDField class methodsFor!
  48940.  
  48941. byteSize
  48942.     "Private - Answer the size of the field type the receiver represents in bytes."
  48943.  
  48944.     ^2! !
  48945.  
  48946. !WORDField methodsFor!
  48947.  
  48948. accessorStem
  48949.     "Private - Answer the receiver's 'accessorStem'."
  48950.  
  48951.     ^'word'!
  48952.  
  48953. fieldClass
  48954.     ^WORD!
  48955.  
  48956. readFrom: anExternal
  48957.     "Private - Instantiate an object of the the type the receiver represents
  48958.     at the receiver's offset in anExternal"
  48959.  
  48960.     ^anExternal wordAtOffset: offset
  48961. !
  48962.  
  48963. writeInto: anExternal value: anObject
  48964.     "Private - Write anObject into anExternal at the receiver's offset, and in a form
  48965.     appropriate for the receiver's External type"
  48966.  
  48967.     ^anExternal wordAtOffset: offset put: anObject! !
  48968.  
  48969. HANDLEField comment:
  48970. ''!
  48971. !HANDLEField methodsFor!
  48972.  
  48973. fieldClass
  48974.     ^ExternalHandle!
  48975.  
  48976. readAccessorPostfix
  48977.     "Private - Answer the receiver's accessor method prefix to be prepended
  48978.     to automatically generated accessor read selectors."
  48979.  
  48980.     ^') asExternalHandle'!
  48981.  
  48982. readFrom: anExternal
  48983.     "Private - Instantiate an object of the the type the receiver represents
  48984.     at the receiver's offset in anExternal."
  48985.  
  48986.     ^(super readFrom: anExternal) asExternalHandle! !
  48987.  
  48988. LPVOIDField comment:
  48989. ''!
  48990. !LPVOIDField methodsFor!
  48991.  
  48992. fieldClass
  48993.     ^LPVOID!
  48994.  
  48995. readAccessorPostfix
  48996.     "Private - Answer the receiver's accessor method prefix to be prepended
  48997.     to automatically generated accessor read selectors."
  48998.  
  48999.     ^') asExternalAddress'!
  49000.  
  49001. readFrom: anExternal
  49002.     "Private - Instantiate an object of the the type the receiver represents
  49003.     at the receiver's offset in anExternal."
  49004.  
  49005.     ^(super readFrom: anExternal) asExternalAddress! !
  49006.  
  49007. AXAPIInfoAnalyzer comment:
  49008. ''!
  49009. !AXAPIInfoAnalyzer methodsFor!
  49010.  
  49011. αV"-'9┤ƒ7;⌐¢ë;É6≤╤δíö╛¥σ¼√│RW║√ì;RFE┼ü,ÇWA>f^A+╢ë^nkCªjVfΓ╝2√╬R║ñ≈ƒσ╩\ ÆeK    |e▐ⁿd<ε╬┼WMçƒX7├)▀·h┬\ 4τ$ÿ█WÖPu╕    3▌┤╧≈╦│3å▓ÜÇwUε├VSÅesìδ ±╤S■!
  49012.  
  49013. ΓK*
  49014. <4íó7=▓ªêù>±─Ω▐ñù▐µ¬α¼]D╥╤⌐g3KW╞º2SäL61:hΓóXu5∙!!yºº&║╫L╝╢╣¥≥Γ
  49015. ƒ{Z#ot▀╗b ╖Ω╠X[åX■|╜F║{╨≤\_4ΣIÜ╩QôF.∞╟Ç╩°╦═ßd£Üçyíπ^A▒:J3ú²!!▀╞è+FÑ6│·9iúç0┴Czπ3░╧Éz▓ú²ñá¡°f╕⌡ª%`Hv
  49016. r7ë±pBUÇzºxπ╚0z5WDÇ┴gê[╡ⁿ╨½∩!!Ω╗î╚└~≥ε╠╟
  49017. 3UJ╤òf6⌡╕}╚7∩èóƒÅ╠[█╞╨ΣN²y!
  49018.  
  49019. τQ)!!1½ü(⌐¢ë>É-∩Γε└δ╥àò┐╘É}`¢₧≤X"?É┤,[ü^P/.JσûK&1Gªh[o░δ/Φ₧L╝≈úû≥Å ÖwJ    anÜ╕h!!¡█╔[MæVæ5║K│=╠'╔l-╥G┴ÆæG`ñ8ƒ ⌐ƒ─í`╚ ▀êÜ{º≈^Gún;ÉΩ'╦═QºW.└J▀X▒@ ö¡ⁿCH⌡Æ°ªwW≤ª∙φ╥╝ßrRÅß╛!
  49020.  
  49021. µA)'9░è,«íâ.▀α≥┌Γ▌≤·µ¥▓▓AB»½╔ut╙èj║ZP"a_}j≤∞t0$]¬jR~ºδm║∙G¡Ñ╢è≥Å^ƒ}Y#l▀¬h>ε▐╥XXàüVsíQ÷iÿ╝\J0ε`▀┌\ÅAfÑ9╫╥«£Ñój╚ù₧╙ )¢▀t`çS)%┬ε!!┘╩RΓO;Ç┘ !!h≈└8╓JkÇ3╛╦╬Hqѽ⌠╛≈⌐ΣpY½ì╪c`R]brÇ ε41MIë┼╩²xUFX╥Ä+Ñ[ô«æ╣εf±╖ä├Äp⌡Äú`√2K
  49022. ╗t▒qIτ╜)╫Zⁿ¢ô╙£┌\Ä─╦⌡α5·hε!!╫Γ√╦ZRp_    2≈w£⌡'`Æ ▀O╠XNRsëseë╗Xëc1Sêúßo*K·.₧╤╓@╬í1@┌ò â╒îS╠)9]╨±48âBû÷▌Æ┴╨ÿÑ▀Ö╬^æ·┘e0▓¢üï=┐kr╚¬ó╦─2+╫╦~ ╞¥>x│δ·9ôEb è╓Uª┘≥2Çí²9α≥.╩Qèº│∞,┼°ƒ:╠╟K ╘Ü,@Ö╫╡íⁿp8-▌(*╨º╩D;æÇ D╜▐▒lV¬╙7&Θ#1╫┤!!âRK÷₧·≥╔I╪4«╗²δ╚╩GL╔auƒQπ╕╔T8πùî¡É)E£äíÄnKúrÉ═G;jâêπ╩∩≡+╪òjz½▄╥½W▌~p{π╡≡UAyτ$SC]@─?²`╗Åû:;!
  49023.  
  49024. µA)'9░è,«íâ.▓-α─ ╔∞─▓┐╫░òAJ⌐║╘~3⌡ü0Wà^P/.Zf
  49025. Γë]&2@πkAk▓δ%√▌J@º▒≈è ╩\éz]go╘»-;áë╘QM╒èpεG│nô⌡SJxπ}▀╩QÖf⌐9┌ä╞ΣéΓΓ`⌡≥¡o
  49026. ó≈W╖b    wâⁿ ∞┌L≈N!!▀V╪ $uα!
  49027.  
  49028. µA)'9░è,«íâ.▓-α─ ╔∞─àò┐╘É}`¢₧≤X"?╬─)@ûOM>.VV∙à0Xk#┐9╡╣!!Ω╫V@≥Ω≈ì≥├^₧gszh╒╕Z »┘╨\Zºé|╝F▓[ƒªN/╧G╗√j┐ ╞i1╓å╦∙╚Ärà▀┴╬<½²QÑe~Éε'█φ^≡l*╪W╒⌐m`▀≥VßfK≤▄╢Ω-┌¡∙ΩσºµiY¬║≥B`JSKo<¥Γ3tbU▌┬⌐áMh;L^╙ä<╤ä±┴▒Φ(¬╫δñì,┤≤└Å 1?╣&╝4yZ÷╣f─CZß▐█╬╬╠Mù╨àßG·"╗Σ└≤≡╨)N |╥╢─%å&₧^╧OE9╞meÖ≤:τ$$Q═ƒí:[St{┬╤╓≈E à!
  49029.  
  49030. µA)'9░è(¡äë>ì0σÄ»═╪Γ±÷Ü╫ûp╝║╘~tGD█ü-╫^g%bWVh Ä4 OônZ|ú┐%║ô'¡╣▓î÷█^û4Iop╩╣r¿╞╥\¥╙p║K╣y╨∙BLπa¢₧[à`ñ|Å┤÷╪∩äV╗.┴█Æn╗ⁿRJ╢.DΦå╨╠HΓSo═QÜJ╥Lⁿ╙p═F@┴2┤é├G{╜║∙≈εª≤ O╝∞╖    jTc+Ö±ppATë▀ƒ¼\c(\█ê=╦S É ├╡²uφ╡Åì≈T▄⌠┴╠wⁿ~∙OaLτ╡)╘b∩    ÉÆç£╩KÅû─ªA⌡<·εs╤∩²ƒC}G    Ms│Z∙ÜG ìtÆK╦NFMçme═τXëc(Y▄¬αS;G>îG₧┴▄H└±]=Ü·]ùÜ¢i▀!!=vOΣσ*)ÿcÖíÿ╙(Öö╥Æε╕Φ±2╔╠VS(ª╥î┼¿lc
  49031. ·¬╡π└+yÿ₧ªà⌡PKΣ⌠■=ïOt è╓\╝-≤ê^àíëFƒ₧πUuiΩ└£▌i┼±é9ôô
  49032. î▐fM╛⌡╩╠Éùz╘Ñ╩D;ï╫∞Cêπ»}Pº▌>R¿{eΦÉ"âR-⌡┴«Θ╥_≤4«≡╨æ│╘Ro╨cZèI⌠²∩IL¬Å═╢│<o≤2/OâÑÉoS¡p╫¼(fÿéδ1ÿâèR┤v$┼kg╖═ߺ≤tjgΘ┐╟Iq:Å@.'
  49033. Sπ├FìäñSó»╞╦+ñεè {^âf_æ/└<'=@∩9≡Ñ¢jkⁿ]ƒwä½=t∩±■¿╓YfJ"[¡1é¥▒αΩ3╨∞¼o─ê÷3─7wOΦµ║Vεàî⌠Q╪σ]°1";∙┴4 ╚╝lsñ∙U╕┬~+▓²'τçLâï╗%X╘2σ 2▒?Eüé,RyTI£╟╓╓ì═#.s    ┼σ0Ä▌▐*æ¡J5)ySÄ│z; ╥Å░_0»;C 3}╨âäîRGáΓi{ß▌₧~ÉB±π√'á-1y┌╕+░c╧╡ù½y╝úRt0?9╝ⁿ¼&º^µ╪ù_±éb┌Φ±sóïÅy╙;y┤¼ä≤¿S╒Φo╨ÿεg!
  49034.  
  49035. Φ@+;!!,╢å0<«¼ƒâ⌠┌∞û╛╓∙αÉ╤üvp£╓¬1xD█Æ?FÆ    jOU@|
  49036. Σ┴:5J▓iVdí«$╚█C⌐╡╗¢╘└ÆwJ    anäⁿb4εαΣuöç|¼Vóx╨ΦCF?≥$Ö╤K±(╕9ô╬σ├ΓâW¡>╝┼╙}⌐ΣZA¼tD9∩à^┤╢CºH+└~╬ß>!!σ¬½Kj╠Ñ╚æW4Θ≤╕╤≥¡µeXÜ∩╛fR\hrÇ⌠Y]&Y═∞₧│JV*%█à+º[é¬æ╣┌T╩ÖÑΦ⌐⌡Ω═µlfxj╒}° USεδ)┴Kn┬%║ñᡃAƒ┌πΩC≤k╫êZ─πⁿ■J3NZ8²1╙ (iüïZ═CWwâs:═·╓$xφæ╠<?GzƒT│╕░zä∩}>úφZ!
  49037.  
  49038. ΦJ446ºè,«íâ.ª>⌡╤Φ├∞▐┌╞Σ▓ñqL░╖┼z}%<╗╞@₧IE>k+.°Æ    \tfNπ\f««#ε╫MΦ╕▒▐⌠╬É{L    ksܽd&ªë╫QAû╙{╜W╖sô╝BF=íiÜ╩QôFg∞.╓╥╫∙îóv╚ îꣻσR@∞ >sç»o▄╨PδD.┬╖|Ü,s■╥u╟LzÇ6┐╪èGuº½δ╛≈¡αhY½áª%ETc5üΩ#1NB╠W╦ÿßX-,VN╓ê,╦U╓α├▒Ω`≡┐┴└ƒ*╜∞═Gìh]fxjéo∙r±ñk├aZ ¼äÇ₧╨Fê▀╟∩N²)!
  49039.  
  49040. ΦW39▒â&,╛₧₧+ò/Σ╞▌╔∩┬╓╟╗÷â\Qσ√┴]Ffu÷íq·5-h^IZ}Γä^&A░kVxΓ╝( ╩J║≈╢▐ ╞┌x[klܽ3╛┘┼KüÆ5¬F░|àΦB4φ$É╬MòMz¡ |├ô╤≈┴Ñgìî÷∙¿▒CLº  nî∞'╫╨QºE*▀\╚±(e╣┼aéVf┼φ·╢jWùï╦▌╛F⌐µgI┤σ╝BvNZj6╬µW7tAU█┘Äß/Q)!!░Φÿ_É░╨¬∙V÷╗æ▌ƒ,ª╤╠┌ %C╜r°U4dπù\εN╔5╜┴¢Å╠gï┬╠ΘL⌡┤{⌠'╓┌!
  49041.  
  49042. ΦW
  49043. !!0½ï;╗╣£/ùΣ┼·┼∞╥█≤▒α BÖÄεXWme±ΘT;╒oV#xZGnO╗┴?Wu1J▒<Dbº┐( ╠Φ┐╛Ö éüqR@yr█¼}7╝ë╞VZ╒¢5¿V╕~ä≤_=≥gì╫[ÖF4«|╟Ü╞╢í╩╘+¬╡░X*¥╥    úrnÅΩ=╩ƒL∩N:└[Ü÷mfⁿ╔}╨Cz┼; ₧ε.┘╟╞φσ
  49044. «┤aN╝╫á uCGT7ƒΩ5u!
  49045.  
  49046. ∞A3:<çÇ?$┐ºÿÇ,Γ╞µ▄Ω▐╨█╙ÿ╠mP║╖╞;`]T╤ê?AämA9~T]x⌠êPr?!
  49047.  
  49048. ±V.!!½é?,┤╜╝8Ç9Φ╠└┬ñù▐σ½µ▒RA│╛≤oaMW▀─7AºMM<oOV1O≈úVj#N¡9ú¢5ε╩Cñ▓äèσ╩·7iza╪τX╟á╬\Pü&å/ε⌠3²kòPm7φa₧╨òD@╛9ë╥°≈ⁿ╡g£ ¥ùûO╝⌠VIΓncû▀&╩■Sδoïo╚σ,uⁿç5éS!
  49049.  
  49050. ±V.!!▒ü1=│ªéù0⌡█√╒ε╥àò┐╘É}`¢₧≤X3GXê─*SàXA>.R]o
  49051. °òDr'M░<>╦ΘΦ╫T╝▓≈╙╖ΦÆf_k █▓-èσìJ\îûVe╝Lórä∞T7≤$ï╓\▄Oq╕3╫╥╟≤▀úaü܃╙~εσ_AΓ<,N¼╠√∞|╣o╩J╘╫(r·ï¿+a╬Ñ╘å(ú╗∞Ωßñ±SH½σ│\)A
  49052. t5ï¡WyFCë▐Qƒ▓\k)O ▄Ä=╦^òσ▄╜≥uσ«Ç▀â~Ñ÷█└2R
  49053. ▓<Φq∩┤}╚b_¼æî₧ï╤\╒ö¿î/₧{$╗yµ6╤º∞▐)[K.┐Z∙₧>`¥2▀#╡q(RqÅntñ▀╟&PÆΓ¿\P#pj╧
  49054. █êÖE ╡═Æ╠j▀ÉôB╙(=CC7╫■'C)òiä°╡╕g┼╡ ∞ïƒ╩M¢]┤╩(<M┤ô¥╬>φqv°╗■ú»Vp▒»ä¼╒g2Σ≡ΦèS`6ä█■L£íZµ╬╘]î╜F»+Z├─═¿@╕╦ä?äÇOî▐fM├·▌╙ü)DPδ6'Ü≈┬l    σπ┌o»┼▄`F« 2Σ':╜²{Fⁿ>J∞═╡∩å6╖\╩£∙Æ▒▄Caù    d2è]⌠ ┼S{Ç≥Ѭ«<yìzJ*═ΣâN><0èG¬ΓnÄ▄è]▒çε>┼ }└m4∙¥¢Φz┤I╙ò╟bY⌐;oMG╚*πqè«é9*êÿ∩≥╞è╣╓fY>ûvNª├<']h├kΘ▓ê
  49055. "ⁿKE¼} ╚╜7zπ╛∞àp▒3O5I·b╤┬αNí┼φ!!╔ç_Γσ≥5╦-~'@Φ═╝T∙Åßò:óƒt ß"0oª╒:gäα+9ô┘j¥┬S▄üCïÖJÖ╦┬}0¬vi°28B╔mC╙étddú±╗╓ì═#,H▄∩0Ä└┌,ÿ»][;}Lµ2Ü]8¥∞ÇvM╟@-5}6╝ΩσÑ'╚äRdç╣Æ7ÆF╬τF┬;ñ ~{î∙8ó1╘▌{╛┴█▐]m&?`α¿╣ ║MΓ╬─Ñ┘╨τⁿ>█ΦΘç}╩▄¬√φǺτëµqùg╣ßH╓µJ─╢7î%*\l─I_gδr█E╬5P╛V +_∩╠} [æá║x»L½ αΦ░"áyI4gàσ¬F╓Iº½J"╫ Σ╘$Dç?╥▄4├:é╤[╪╞▐.╡╖0╛▐9½b4▄KΦ▀Å(/┌ ░≈ⁿ¿╒<▀RH·╓U~~    £èF╧╥Θ<═Θv«0≥╕┬¼÷▌3h∙¡₧)√╒3ΦΓ═╙Ω√û(²'*?·║δ╣▐╫∩]g╨╒7╞Ñ≤IJcîû<φú<α∩≈├«Lf/|ÜN┼W0µΩ½¬|ƒ⌐T├êw ∙p'°│ä\⌐╣·₧≈5φP±*τ,%\¼Θæ▄╜5ñ■H╘┘2i*½÷╠╡KFìπ ╣'▐▒¡LÆ╛ª}⌠    /Z ┌WÑE²{/ªb╘N«╫U[of√[≡ëƒ╓╛
  49056. £5┌*n╒g ╪σ┌╗0╤ΓTÿç╜qåOⁿ°"÷░(Öë═╞N≡█≥╟%═YÆvx╕√Lφ╣
  49057. ½P U=]√+6g┐╥<²╢$(╛N█╘£îv╩j╓Çε≡é┐≡┼7PßàÜUª└f¢
  49058. Σ╕w
  49059. Ä▄σKΣ╨÷tBδ≥«»â╞└oX7-╪)}╩óÉ@╩╞α╨¼≥P╠ΦO7╝Ö<1!!]╨Ç∩ä═6ñ}╒εñòRÑ.éΩÑ^K╤Mç╞╕*I'π┌d¢Öû╜┼    jü╔8üâ▐Jú!
  49060.  
  49061. ±V.!!▒ü1=│ªéù0⌡█√╒ε╥ⁿ┌│ á]Wσ√┴]Ffu÷íq╫PJp.Zc~ΓÇUc[▒yRgΓ╞Jô┬º║║¢∙█\·7am╫╣c&εô¥{üÜrεTñtä╧E] 9∞>▀Å ─ ╞i/╓₧┼╢í╩ßìÆ¥h)╗ TP½oKÉα'╤╦F≈Duî^ⁿ#▌E▄⌠[»(⌐0┐å├G{╛ú²≡⌠k┬¥    U╖Σ╖?E XτµJ]└εç¼\c( ┘Ä"å_ é░╥╖≥uß┤ò▐┌1╗╣ë #░y╧fZπ╝!
  49062.  
  49063. ±V.!!Çú&¿ÅÖ$å+Φ█ßû╛╤╩█╜µ¼\M ┤╬!!3\W└â;F╫VJ.kUG1OΓÇJ L&ßLAc┤¬4 ₧@ÿÑ╛ÉπÅ╫]z,.d▀»n º┘╘PG¢VògεÉH╛"╪t|*f¡$Ö╦WƒV}úpôô╨σ┘¡vîMïö╙~
  49064. ε£=-ú ~Åφ6╠ƒPß;─ZÜ÷.d≡╤}╨.╧1±╚ïA4∩╛φΩ⌠¬°eo¡≥╖ ;
  49065. g ë≈Yr%=ú~┘ÿª\y|WM╪█oƒ[à½æ╢∙y≡èö┘└~±╪çdÑl║<⌡ x~÷Ñ{╔oN°ì«ò¿╩FÿîàαW·$│d∩z¿ìæ╢I3=;▒+╙π,wû1ï╤YVSôtAü≈oú 1ó╦åD4*K ┬┌≡└F╗≈]8░·]▀¢Ü_╩-Da╬¬dDq╤+¬╡╡╕g╕╗π▒╬ƒïQÖ@┤┤PB~α╓▓Hï)┐, rÆ¡╡┬├aàô"│«σZ░≡⌠'│R#ô╩∙┘τ"éñ⌐]àò¼6E@ù¿╡╞,┼░Ö0ÆéD╗⌠e&╣!
  49066.  
  49067. ±V.!!í¢:&╛≤╠+ú
  49068. ╧≈╦Θ═⌠ƒ┬¼≤╡CJ▒╝Ü;rFwΩ⌐;FƒP@oVV+°█^Is2[ó~_oæ┐2 ▀Om┬▐⌡«σ╞
  49069. âqM^r╙▓yr»ë╚PO¥[ƒc½O÷jé∞AJxτkì₧MöG4¬2╨å╩∙┬αwì£ëÜ~
  49070. ¬▒:.╦b;ûτ6₧ây╥o ΦzΘ5¡m`δ└m╧G`╘╛╥ùK4ºª²╛╝╜αt]╗∞╖9wCT8rÅΣ=tADçzºx½»Jz9Q █Åo╫{:╗⌡┼░≤e╩╗î╚─~╗Γ─┴wⁿlεzKτ╡)═hOΣ    Ü═╙ü═ò▀╔ªK≥R]╨∩<╦Γ╕╠I|C    ?⌠wö≥#`â5ïK█V/    δ
  49071.     │Φ0∩ eO▌á∞[0)Y+{┼
  49072. ╤▄╩Më∩U>«!
  49073.  
  49074. ±V.!!í¢:&╛èâ'ê:∩└▀├φ├▐╪╝■á    ▓╛═yvZ▌èdûoQ>zZQg
  49075. ┼ò \g+"╔Z░ó6√╩G@σ≈öÆ°▄^ûz{t╒±j7á╠┴MMæV₧aªL▓=ô±\J,»&≥┤4÷+g⌐ :ôé╤ ┬┤R¥É╝ûr"½σ_KªPhûε>▄╙Z╚Ouî^Ωτ9`√╦}±V|┼>╝!
  49076.  
  49077. ±V.!!í¢:&╛èâ'ê:∩└▀▐√╓╥╫▓≈ BÖÄεXWme±─1\═E{OGj·ä-Mt#N«<ZyÆ╣)∞▀V≥≈╢╝°└ûz3js▀░kr╛█╔W\╢₧páWåoò⌡I`bíe»╦MêCvá╟Ç╞≈┴αz¢=ìÆà}½½EÇowçε=É▓5Ä    g▀Z╓│+t≈─l╦M`Φ>óεåPaíá╬ ∞¡« ]ƒ╒£)&@uvB&_Σcè>u≥δ$ñé}H` ╥Ç<ªOé∙┴┤∙N±«æ╪Ä-⌡φ╞≥Lwfxj╒⌡    @M≈┤3Ç1ào≈Φ¿Å∩]Å┬─ΣN±!!$¿nα>¿ìæ╢s/AQ)┴"ç╓!!i╦t╪o╤ VGq╞thê╗iñQH6í╦å>X*Xp┬@₧╙ q(ú╟yö┐JôöîT·)+S╟ΘnW°■Æ▒▄ ┤«┴ú▀¬╟S╞τ┌D!!│çâï%½"oφ▒╗╟╦81âÆ)τ╧═9{═ÉÆ àfq;éëU╟A⌐⌠#ÿª┐XÅ¿S▒=├ºó┘=ßσäÜïFª¥r+í±ÿ▀¥≈tF¬▐┬z)▀╘ HÉπ»}Pº▌>eéG]┤█l\┌.P┘╚╢╗¥Z√ì╓┤ñÆ■_H]╘aU6⌠5Å÷┼_┌Ä╪à║r    E╤a╠╔Φb╢v⌐╘V7c╤╟⌠2╘Φá6╪ E┌}M╢╘▐ú╩U{|σ⌐φVh>à@a ;¼!!Φ}╜æé#dêéß!
  49078.  
  49079. ±V.!!
  49080. Ñÿ,«íâ.º0σ═╡î ±Ω√¥╓Ç`` ╡┴vv╙èj║ZP"a_}j≤┴W<fNôiG~ú⌐, φV¡╢║≤¥ª^.à}Hzeܱ-╝└╬M╒¥Vp╢W│o₧≡I6Γpû╤W▄Auá |╒¥╤╢╪¿v╚Üûæyε⌡RWíryçδs▄╞≤I*îⁿ#▌E▄⌠[£¬V░╬äQy╢á∞▓áá√sY∙≤╖fRZ&3Çú"vZ]╠┘╩áKh|B_Üà*ÿYƒ≥╘╝╝hΩ·ò┼ƒ~Θ┬±$╩?-╜q∙Q4^≡╢|═hU°J▐∞∙τ╨FÅ┘à≥J±Rl¬~⌡'─σ⌠┌)R{JDc▒6ü≡8hö:ï¥u+/    ∩^sê≈3ú0^╦«εD"O
  49081. n┘═██M
  49082. ë≈E!
  49083.  
  49084. ±V.!!
  49085. Ñÿ,«íâ.ª0∞┘Ω┬Ωìƒ╘ÿ╟ïpgÜêπ;|F ÆàGâKE(b^`≤Ço5▒uEk╢«z║▀`º╗▓ƒ∙óvwäqR.░╒"╝└╬Mzö╛aªL▓^ƒ ±TA≤a₧╙[ÉG.∞µ╝α╥ΘôPσg÷≥£rUε≡gQ╢t yÄΩ╩═ZµLBª6│αs≡╤y╓G4Ç>ô╙îHq▓á╢ôèo╗±lZ∙≡á qtTK7Ü∞~B]╠┘9Å¡I7|Bj∩» »1╡░▐╢ª!!σèö┘Ä?╖∩╠:█2
  49086. M╤òqSΣ±y╥dU°+¢ò¢ü█kö█╚πLα"?⌐α>╟δ²àZGOz(j╘░╖"k╦t₧~╩ UCaèeSÖΘ0Γ!
  49087.  
  49088. ±V.!!
  49089. Ñÿ,«íâ.ª0∞┘Ω┬Ω ┌┘«¿σReèòπ_V{uÆï0╫^t?zORi≤▓
  49090. Kc'Bπ9▒«,ⁿ₧Rí╣ú╢≥├ âfWiC╒▒`7á▌ÜI│#╜5Qïpò=ƒªN9-⌡p₧▄UÖq`╛=▐▄«£ÑíC¥ïÜæp
  49091. ¥σEAúmgδå0╠ä2ì(F╧Mö{ÖDrⁿ╦~éR|╔1Ñ·ûJwºº≈≡╨ºαoHá≡╖)hKPrh╬ ┼"Rku·4ìä√l VX╬Ç-ç_1éΓ╘╣±!
  49092.  
  49093. ±V.!!
  49094. Ñÿ,«íâ.ª0∞┘Ω┬Ωτ═╨┐ º_Fσ√┴]Ffu÷íq╫PJp.Zc~ΓÇUc[▒yRgΓó3╩╠K⌐ú▓─╖╬>ÿx[`░╒~7ó╧ÇIZ£ç5zúN│sä1εTI ╬j┼₧X¼W`╕>▀ù≡Γ▐ÑràMûêún╕≡CA°  Yìα?█▐Q⌐,EÑ^Ωτ9`√╦}±V|┼>╝▒Θ-╜½αΩ╨╝╒lPπá⌡# sI^&&åúPk%9á╚    ₧æLyO@Ç┴.¡o,╡╘⌠ï▀!!Ω╗î╚┴S▀èá╩#;¥p≡U4¬°)ç66åo≈Åûû╦xÄ┬ΣΩN«R#┐gτs╚Γ∞╫BJ@ D8 #╖≥>fâ=ÅZ╓O∞        â■-≈:0HÆΓ½!
  49095.  
  49096. ±V(
  49097.  ,╢è4¿¿£:Ç-╤╞Ω╩≈╧▓┐╫░ä]P¿╛╥;r
  49098. ßÉ,[ÖXjzTi
  49099. ╢æ \v#AºyW*╢ñ`≥╫Eσ╗▓ê≥├\    àuNkrÜ▒h&ª╞─JÆ¥g»W│y╨≤<%`/≤eÅ₧IÄMd╝(┴ù┼╢╩╡}ïûö¥oAε┼_M▒ h┬ß6██Zπ;├▐α9h≈└m╦QfÇ+╣┘ÉA4╛½∞÷∩╗┤fN╢φ≥wKT Xτ± aZD┌[ìÖßPc|PC╫äoê[ôπæ╣╝q÷╡æ╚ê*¼ú─╓E?
  49100. ⁿ~≤|π±y╥bKⁿè┴ÆÇ█Üû╒⌠MΣ%«yΣ5ïÑò╡w,qAZ8σp!
  49101.  
  49102. ≤E070,¼Ç6╗ñë è-╟┴ß╧Ω▐╨█Σ▓ñuvæÿΣ^@k;╕φ|bàVR+z^&O╫ÅNc4ór6âô ╩J¼Ö╢ô≥æ\Æg]gb╙▓jr║┴┼[ÉûaíQ÷vòδ^]+î÷▀Wÿu╛)▐ù═Γî«ràî█çsO¼⌠Q▒e;äα!!₧▐⌡@8îH╚π=dδçu╟Vf╧;±┌îV4ºª²╛µª≈tU╢ε▀`kaCFt;îτW2hD┴ìM¼öwNf∙▀oèHâ²╘╢Φ/ª╫δá≡W⌐ú╟┬wi╒r²q╕∞)┴Kn┬%║ñᡃE₧┬═ΘF┌=┐%îY¼┘┘τ7C}G    M≡:û╖@°]öK╞NPgò: ┼Φ0∩ eN═½ßA44^;╥)█▐▄Gűj╣■DÜ╒öB╟;7BDé²!!?ö~═╗┘⌠;éÖ╒ô°¿é2÷1╔àWQ1¡ùüσ+águB╗░▒├└pà¥9¬ì■@?Ñ⌠■:ε*^ë╫ Eè╗wéª░Q╩ÆIº1É!
  49103.  
  49104. ≤A.#=¬¢(╛Üë&Ç<⌡█²û╛╓∞╨»τá]@║┐≥~rLW╨ê;qÿSH/mOZd╢îTd#]∙<Rdâô ╙@║ô▓ì⌠óvw╒DL    xa╬╣-εα╞\¥╙póF╡iƒ╝R@+⌡vè▌MÖF4¬3▐╥╫■╔αxìêöüxε°Y╢h;▐ⁿ6╧╩ZΘB*╚m▀≈,c⌡┬[═Nb┼<Ñ╒îJ*≤├Æùß»ßmY╖⌠≥pJQKe3¢µW11L\╚┼Q¥¿Me|B ╚ä<ÄHô⌠æ½∙mß╣ò┬êr⌡≈┴ ┴E%¬y≥V÷ )ßcH√î┴Æ╬▓"≥è╓πSß>╣nσ└µⁿ▐Jll    E1⌠4ç■"k╧tÉHƒD[tërd₧╗!!δ 1╦¡ΓU84MYw╪╤Æ╪JFòφI9▓√    îÉôB▌87B|¿Ö-¥iÜ■╓╞╕│■╕ïÑ─KÖα░MSdí₧ê┘#╣jkX≥¡≡╠─,xö¢ ½æ░@Σ°δ9åNtwë╫εSÜε%ë╩╫=ëôF▒9å╗┤ü(┬░æ~àÆLΦ¼Op+Ωα╨╬╒    CM╟;9┘≈╚O%▄╧∞N▄≤Æ}K«£2Hµ!!:≈╠q[∩)R²└·≥╪W╪6╖·é┴¿╬_@S╠j
  49105. ▐1îæßTV┘»î⌐ó FèR?ç¡üi
  49106. εfû╧/Äëπw╠ßá3▄    Hòl`╜▄┴╡╤c{|ª▓Ωh?ÅCv=^Z╠<¡ví«é;:ê½┼╦@«á├¬lZùe^≡|áG] ╦"⌠╢┌>⌐QX≥81ç║; ≥÷±ⁿZ╠Rc&D≡~âæ⌐¡ú9╠■¼+╒σΣ(▐33$Aεú┐P≥¥╜ß╪≤
  49107. σ(1<░╚ ╦╫≈ΦQ┐ûSR╙¢[éôP═æ∩\â:ß:2ƒ5F╥├wRel¡√τ¿ºiÑDIrêΓoÄ┼╚;¥ΓOhyS≈s╒r╧Ä·6║0&>╕·úºV>╚ä'M²╒érƒS╠≡F─'º ,kàⁿíc┴╜┼▒6«┌z5s&s<²Θ║2¡^√ç─>░░D─ß·s│å▓r∩q▄╔┐▌óK╤ΓhΩÉ∞lùhó»-▐≈]╒┼ï&*w'¿DIgL╣!!█╬y\ª>9≤îîra∙▀╓,íPε▓½╢!!«;L-vê°∩é Ñå)_■l₧,├,@ƒR$üφ6T─7╨s╡5±¼╕Ij╜Ñ▒╙>½xHQ╖,┴ú⌡D▓w░≤σ¬p║M╪gQδYéWp>(╡≤=»╢}Æ#ü▓,S∩°≤ù'°≤ÿ+Φ¡ê/ⁿ═v9Γ÷╒4┼Ω)°ö2I≥TA▌ ╣δ╤C▓»Θ]y╥┬2αÑ÷¿σ;└■uï╞Yîàèú╚+=oçDÜßΘ½¬∙Ü}æ4Σ
  49108. q∩¡\r ∞╚µ÷ÿµ▐<─*¥Ouìr0'π[╤▐▓▀aâ²H«╡*m; ¡█ⁿüb<ßåg╙Z▀ª⌡Y▒4│±?┐8:Z ┌,q▀)åC▒2Åδ∙:O|ùf7∞₧ù╫═â╘.u▐4g│╗íÉ}Öº|ï£╜5£▓╝/±│jDÖƒ╔╔α▌≤₧ií*╚emwé╙┌ô     ½P$LqO║Og╪▓@ΦΣ1K└ûæ¿¢|[\▌+üX¡ù£τ╙Ü╕QV╕ÇÅ;Θ╥2F╤Aq╬╨
  49109. 9┌╪φD¼├δUcB⌠⌠└a╔°∩¬    !!!!ÉfdæG╡ç]·¬ÿáàê0╠╕e∞├T_PQn²╤Æ∞╢
  49110. ▒{£Ω«ÿ"Ωgÿ║≤{φ≤∞¥~
  49111. úæ▒■·╠─7vä²1Lüä▀÷+ù√ ═XΣ_┤╜ç;sfk^  ₧g½ε─>Ç~ïÑk½Éú■Γüé┤δMƒÜë⌐w╬-₧ Vδlz╜k=?<Eï¢<ƒá┴¬ÅδΦ·█╘P fX[╛┬°µºwÿoá└6óú¿τ9Üja¢üNåª%ñV┼╜Σ!!üWHX)y╚îÅè+╞!!,▐╕δ*·öφrΦè┴╦ææ█FΦ`└O╒╠≡?:═⌐└\±√₧æR∙ ÿ╦╝gÆ    <ú╙wså=█feÅ /µ,$uó-Å╡I¿ê┌iÜⁿ8åΣ9║»═F▐û╗ìa*=[└τ*≈¡¥φuâ╜¥_░TσgEào╓"ä║τaú∩╚ì╩╬╦╛A░ìÜ╔2&└█à╫╣Hg╜$<══}òaπ0Ä[½me╒*(`m~zN[M╔_äEδ-τ⌡7 è°
  49112. #s⌠ /é≥áñ&A#∞■0HqΓ∞î⌡ƒó}¢M1`Hô@9@í~«╬│≤ ╦oK¥╢I█╫╓⌐è█C+╝G|≈}<M░╛5[∩{╙"ñ╤Ñ!!'L¥Ywéiö≡≡<τ≡
  49113. ╤(ÿ¡?s╟t╫S¬Gú╢uÄU3╫╦: ô%^─G#! !
  49114.  
  49115. AXStructureTypeAnalyzer comment:
  49116. ''!
  49117. !AXStructureTypeAnalyzer class methodsFor!
  49118.  
  49119. ΦG(XR══'⌐╛ë8ûα┌»É╫╘╨█α▓▒[B½√├z}T╫─+AÆ[>aAnΣä\h2╖tZyΓ¿,√═QB┼▌┌⌠₧±9âqLolΘ¿'¡▌╒KM╒É{!
  49120.  
  49121. ±Q%<+¼è6⌐╣ë)æ,╬╥╞┬φ├▐█╜≈╢>)╓∙ßu`_S└─?╦sK%eNC_⌠ì&)Iπh[oΓ≈Θ╬G╝Θñ▐τ┌₧gVj ╪Ñ-;á┌╘XFûÇVz¿óuòAεTL 1≈aìɱ(╞i¢ü╓µ╔▓3ÿ¥ùÜo½⌡vW▓e    oæ└5≈╤L≤@!!╧Z╔_₧GÉ╞|╞.êó╠åG`≤╜²∩⌡ª≈e]╗∞╖)iJPr;ü╣Ws|J]╦▀├ß[hFM▐«!!çCY√Ü╕╤σn±¿Æ╚û8! !
  49122.  
  49123. !AXStructureTypeAnalyzer methodsFor!
  49124.  
  49125. πE44Ñ£!!D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3lY▐ö6[ÖG&oH@+σär)▒yCxº╕%⌠╩╜º▓î⌠├ä4Q.t╥╣- ½╩┼P^É▌T─.▄«$ΣEJαh¼╩KëA`╣9!
  49126.  
  49127. π]31╛è_C╙δ¡$û(Σ╞»╪÷╥ƒ╞╖ΦáJ▒√┬bgMEÆï8âWAj}OA~ Γö \&"J░Acá«$║▄[@╝┐▓▐σ╩₧b[ "╖╓X╟≈╙\DôVÆa╝J┤hä∩L Φ~Ü≈WÅVuó9!
  49128.  
  49129. ΓH&    &í£1D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ║╬;/IE┴ï=[ûKM%`i
  49130. Γû\hfNπX\f▓ú)⌠₧A ⌐ññ▐Σ┌
  49131. ûvR.f╒«- ½┘╥\[Éç{⌐.▄ä    ∙J,Σvæ▀U▄Vm╝|╫ù╨⌡▐⌐qì    ▀Öè<ª⌠VºcröΩ!!ƃ^ΘEo╪W▀V²8l√┬jéMhÇ6┐╪èVq░║±±ε┼₧    H╢áª%RLc|╠gëzZqC╠╦Qì¡Vo=O ù▀o█!
  49132.  
  49133. ΓH&    &í¢:&╛èì>Ç8ε╞÷∩≥╓╠╞╙ÿ╠s¡▓╓zgMƒ─\äHA8.O[nO⌡ìJuf@Ñ<^o╢ú/■₧A╝▓░æσ╓\
  49134. ÿ4\.u╔╣irº╟ÇX[åÉt║J╣s╨⌡EGI5Σpù╤]Ås⌐9┴ô╫≤╚═ßå█çt
  49135. επRGºi~É»5╤═ΣM.▀LÜ·)d╣╩}╓Ja─, ₧ε.┘╟╞█°¡µn]╡╙ªfR@crìΓ#1BU▌┬⌐áMh;L^├ó#èI!
  49136.  
  49137. ΓK):*⌐£&ê¼¥?î-Σ╨▀▐±├╨╓▒■╢    ╜▓╬zFQ┐εWºMM<oOV+B╢áJq#]πk[o╢ú%Φ₧V¡≈░Æ°═╫{\
  49138. kc╬ⁿz;║┴ÇM@ÉVÇp¡J░tò╝SF<Φjÿ₧ZôLrú1└╥╫∙îíäMïôû<½≥RW▒ab∩àZ▌╙^⌠Ro═Q▐V·#rφ╞v┴G.£┤╚ïKpâ╝≈Ω∩º°>O≈ó▀`o/"`rçú?t\^Äìƒ│Kh2W@├┴&àRä∙┼°·sδ╖┴┬Å,⌡÷┌╬    w    ╣< uL±²)╫hα
  49139. ▐Åûï█Å┘à⌡G±R9╝+Φ'àε⌡╧CdJ].▒#¢≥mwö8ÜX▐Usöoté°:∩g1ó╦╤"/Zlû╤▄▀Kì≡h%à·Xè£ìB┌*_T┴ (g╤n₧⌡▄█½≤▒╣┘╤ïd±2╔φG_*ñ¢üï<¼ns╗╜╝╧╓,1öò"íçΓYÉ÷╦;îT4ïëU┐£∙#ë╡│Uå¿S▒-û╗óü*▌±â-╤║!
  49140.  
  49141. µA)'9░è%╗║ƒî;ΣÄ»═▌█▐╞¡ƒ╧:P║╖╞;tMX╫û?FÆ{A,gUVM≤ìJ(K%╩oVfñδ' ╨G⌐ú▓╜√╬┤{Skn╬≥X╟ü╙\DôVö{½Q╖iÖ≥wC?≥$₧╥U▒CgºZ|²¥≈∩▄Ñ_ü╓█■f╟°Qbúl~╪»═┌Sß(╔Q▀≥9d═▐h╟ng┬▓▀åWg╝╝┼!
  49142.  
  49143. µA)'9░è,╝áé/ú6Σ╪δ▀ô╜╢ùÄα¼EB½╛Ç63oS▄ü,SâZ>f^( ≤çWcFªpWyΓª%ε╓MΦ▒╕î╖╬\âfKzu╚╣-%╝╚╨IMçX╤{├)▀a╨²CH ,íg₧╩zÉCg┐@5╫₧âΩí╩└Üùò< » pA¼ezûΩ╥▐L⌠l*▀L█÷w!!║├}─K`┼╕┘Å@g·ε±°╞ñτe∙█î i{f [Ü ±5e
  49144. öW■ÿ¿Wj|T^╙ò*╕Nô±▄÷æ ì«Ç▀¥;íÄú`ª 23⌐h▌xó÷m┼kRΓ╕êûé█[▄ì¿î+¥"«jπh¿ìæ╢Cq[6\)╨;ƒ¡m"╙ÜH╓DwÄe ï≥0∩6╟ñ»C9?
  49145. ^%╗p╖╗╫Aö╙I>û≤E┼╒îB╥*x^A╟½IiT°bÆπ╠Γ╕¢²║æ╦îÅL▓æFB1▓ù┴TÉG╟ Θ¬▒╠ƒ#╠≈F╬ß■Q    ░╔ε=óL|mMö╓·₧φ8Ī▒zïûB°UuiΩºó┘=ßσäÜïFª⌠ k)║²╘╬▒WM─3?╔╕═gª¬ù#ƒ⌠êh@∙▒Yaü-&⌠│!!π?H╕₧τíεO╧<¡≥╨û│╘ Co═v ZôïÆ⌐Tµ¥î┤┐&]+╜wi(═ΣïlRáf£╧VL/]┼Ωì^╦δ∞=¥@▄mM╢╘▐ú╩+>fΓ╖ñEs9₧K4iY╩!!╖%╜áà0;▄ê┬╚+╕σ▄╣/Oìm_▌PnªrK:~┌?±╝₧N"¿^Q╛tºád ≥ Γ∩╠y'3Iσvöî²Ñ√)≤∙â`═ │`▀=$    ▓Ä╫0∩Öú■▌≈≤+&<╝îu<Γ╕os▐òbΣöS]¢∙$τ■7û┼¼X╨ ~⌠;>BÅ]iov¿ù uPry╘₧£╥ĺXS|
  49146. Æá8ò╜▒W≡╦'-lB╙n╬2^nç┴¡!!¿ J :╕σΘ┐{Γ╡Qdç╣τyÖ_╫╥┬╕)d=û╕1░|═δ|╜┴█▐Yx7O/⌐╔Ñ-≥ ¿¥ÉíåòU¬Ö▀δΘtΓt═┴┐φ«ç║+Φ┘αn╓u╛ƒ└ΣíÆ3Å%@9╛AOgJ│+Å1tó0qób%$L╧ûÇ1}▐└╓`¬P╕r╩é╦_╚rG)té⌡■Ö·£`H▓d₧╓    6@╘A7═∞<y╜J½╥=┐⌡≈Sh«╢½£G─Q50ábêÑ╘DG╖╗Eƒéüt╣M┬diⁿOôK]£èF╧Çhü(╞φe~ä]öïδKƒπì.+Φ≈ßDù¿säô╫4▐ΩΓÄSC≈@æcßç╤tÿ░≡AJƒ¬\╗╔₧ε╨1╔╗Yé╠FîÆ▐ú╘eX#mä@├JIÇÜé╨ΓÇ4ñ.Γ
  49147. aΓ¡T+ⁿ∞╚τóéτùh[─*êFsçg3uM«▀╓┐╨á■H╘ñ'z?╥±╧╡KFΩÅz─~┼áöT«]Ω╗}┐2r$ɺd4ïw∙x/▄╝]╣π"_Ox╥z≡¢åεôiµy─?j═5(╩╘╠î,╤ΓTÿÿ┐4╚R▓║;≡çzCÖ╚ù°Fc₧╗⌡╓;╦E╡a▀├öπtwÿ)}Q \1╥/hM╫╣M8ç═D(»δ╚¡¥TVä,╚ßé┘Θ╧ì⌐mMΓÉ┼Oí╙hΓf ╢░mDöÖ≈Mαƒ÷iS²┬╩o├ñ┬├o297íeh╪σ╧    ╖╕Å╡├█:╚δ]╕Ö1:=ä╛ⁿè═(éeö°≥∞┘)▌ªτRuπ·Ñ▌;k9σ╠c÷Æç¡▐=%╒ⁿ5▄@╨╫δ,Ä π└ Φí▒î}Ve7%&O Z│╬eö┼¥xöícΓâ▓╤÷æéá╛âÇ!
  49148.  
  49149. µA)'9░è%╡½ì&í:τ▌ß┼Ω▐╨█Σ▓╢GQ¬╕╘UrES┐εWºMM<oOV+B╢ªWc4N╖ykΓª)⌠╫Oñ≈│¢±╞â}Q.o▄ⁿy:½ë╥\KÉàgεT╛tô    ╝FF4íaæ▀[ÉG4Ñ|╟¥â⌠╔α`ìæ╫■fº≈J¡tJsçε!!┌ôεOo╪W▀V≈(wⁿ╦w╥Ok╬+±┘ìR}íí÷≤σ╝║"1╙ì╪c%EY
  49150. u!!╬Ä}YrCQ┌ìK╫ßJh0E ▌ä!!ÄHé⌡≥┤²r≈₧ä╦ô0╝≈└┴_w⌐Φ!!uRτ±h╙^Bßæì▌π╡!!ê╙╔α≤9╛+∩<╤╔φ╙`I2[(⌠m╙╠.iÉ'î╪HF9╞seü²uΣ,X⌡∞é=XI┼    !
  49151.  
  49152. µA)'9░è'⌐╜ì$å:╥▌δ╔ñù▐÷▓≤╢@.╒╥┴XIE┴─=]ÜOM&kVm°ê
  49153. Pi(!
  49154.  
  49155. µA)'9░è0¬¼á#çΓ╫Ω▀φ╪═╕╘¢τcQ╢¡┴ovÆú;\ÆME>kGc
  49156. ╢┬
  49157. @v#c¬~i«¬3Θ₧O╝┐╕Ü╖╔ ╫uP@2E┬¿h á╚╠j\çÉ`╝FΦ=ç²A_ *»&≥┤4÷+h∞=┴ò╞Γî¼zèMÿù£~O¡≡Cg«ah┬≤^┤╢⌠D#╩┘²
  49158. d≈┬j├Vkπ3░╧Éiqá╜∙∙σ\Φ╖lU╗≥│DHQ"h6ï¬W9wiQ┼╚K╩Ügc5Oqö∞EΓNä≈╘¼╝;╣·▓┘ê7╗Σë▌ #!!«y²:2ê╪e╔o╢[▐Æûé┘Å╧╒πn²~╫ê'─⌡ ┌+&oG8Θ#úΓ9D¥8┼ÿH@qçry¼⌡1╩!!Y╨σ┤:[S#l┬▄ë┤.oΘφY2ú╧\ï┤ôKäla╤τ!!}Éb╫º∙┴┐╡≥┐╩ƒ┬PÆαå@B3ÑùüS╩$φ>G ╧ºá╦Θ6sà¢>╛⌐■U╜π■;▌9Mô█╝R£Γ2à▒╕F═▄Tπ,åΘ½╚+├±é'╤▄'lê▌ v0½÷⪠p8J╧"?≡ó╫k0╟Ü╛¥Φÿ)V¬┘sµ*1ó₧{N¬/L²ä¿Σ▐^╘#ªτ╫╞▓¥ _L▄$UÿS⌠⌡┴Sσòî¡÷<AìJ/ò╢âzU]├≡╥GiO¢òε9╠╧⌡/╥8H█Tk¡╤▄ó'╤bjnδ╣ΦCS9╨.|XU└;ú├╚╒(╟╧½ΓE«ε╒¡nKèd Φ\j¼YG6╪'÷▒¢rE\╓6[░w╚⌠c ⌡√ⁿεZ╤I^O$M╪¥ü²c╩èT¬kΣñX╙░÷}î+L╝Σ▒V■¥ú╓Q╞≤ rcÿNJF⌡Ä\g«╞@≈╟U╖ÇSF╫¢LÅ¢|âï½W─_q⌠1L■Zj╙äs:╨·≡ú≤Z▒^=L÷╗ñ╣▓0£║Z+=`w∩wÇSUn╥â▒rN╟@J ?'ìⁿ∙─7X «({@░É╔,±-¬ï▀1ñ)?d┌╕/╕E╤á■ªp╜≈Ub1~(ñ╔º%üBδ╪£EºéM└¬Ö▀üüc═y═╓·ñ≡╬Γg°┘αn╓u╛û╟∩F╚█[≥ID:┤-I_i,▄[▄Y═5Z┐`%&]▀Äå!!D²▌█c¬P║▓∞º"ßxM4cëΓ∙`ⁿqÇ┼!!_╗bé~█    6╘D3═ y█"╤iÆ<╕╗╛Fe╡½¡±+║=[Vñ+äÑ!
  49159.  
  49160. ∞A*0*╖ΓX@°êé9Æ:≤ö│▀√╞╩╨░±áWq║║─zqDS±ï2^Æ\P#aU+≡┴(xTjÉ_@*ª«3∙╠Kí╣░▐π╟^·7km╪╣r╕╚╥PIùû5íE÷iÿ╝CJ
  49161. =ΦrÜ╠Åg╕)╨å╓Σ╔α;ëîÄ₧yε°C½sJz┬ⁿ'╠╩\≤T=╔ù{ÖDh çq╓g╙1÷╚├P|╢ε√±∞
  49162. ¡≈tU╢ε≥ iJ    crï≤)8ñ}á{πƒJh0E ╠Ç=é[Ü⌡┬!
  49163.  
  49164. ∩E*XR══'⌐╛ë8┼>íê²╔ ╙▐╫▓≈ûGQ╢╡╟%3FW▀ü~TÿM>f^y
  49165. ⌡äOc4πnV~░ó%∞█F@«Ñ╕ô╖█·7ac╧▒h<║╚╘PG¢X╤{╟.▄«∙]II6αiÜφXÆQ@¡!
  49166.  
  49167. ±V.!!¿Ä!!:Öªü'Ç1⌡Σ²╔ ┌▌┘╗▌½    ½║╥|v\;╕φ|bàVR+z^&O╞ôWrfNπ\g»«.ε₧R¡╢║£√╩\çdL~r╙╜y7ε╧╧KüûVg½@│tåε@,ε$ï╓\▄/┼\,╞å╫≈╬¼v╗ì₧ÆqQΓ▒CE░go╠¡^┤▓5Ä]o└V╪V∩@ É╦q└4¥ó┘ÅB4º╖Φ√╠¬║6╨⌠│`R8a[Ç√d[
  49168. ëSæJτ╦02FT╬▒:ƒ{ܬæ½∙mΓ·å┴ò<┤∩τ┬lfxj╒r∙`o≈ÑH╠a¼A└┴Ü¥ƒIòûÖ├Zα"┤jφ╤⌡φ▄S{JX    >²6ÇΣmq₧tê\▐Vkâ '╓û_èc+Y╨╢▀B%F$û    █▐▀ä∩w/«ΦFìæ─*┤EQCP┴⌡nW°çΘ╤▄÷·Γ│╟ìïYëT¼¥tC%¼¢ë╬.âcká╙┌º¼1tÅÄ▓£╤X■╣╝iàR:Mô╩∙É∩1â╡░U₧ÆH¡x├╜»─iû╖╫e√φ#o∩▒p┐α∙╟ÖCH├8k╚▓╧Z/▀╥≈D¢╜±+╦╥6ⁿ!!« xD░{┐â·φ╘Y╧4▒∞▐╞!
  49169.  
  49170. ±V.!!Çú&╛░ú$▀⌡╒²╦√├ƒ▄░÷á]Wσ√╘zq[;╕φ|bàVR+z^&O╞ôWrf[½yCåç`■█Q║╛ºè■└^æ{L@zh▀ⁿ7¡╠╔OMçV£5║K│=╠ΘE[:φa¼╩KÖCy≥L|╟ô╤±╔┤=╩`⌡÷∙»πPA╢ zÇ╡s╩▐]⌠o┬Z┬├8u╪╦tÿ}┼3╖£è@xÿ½ßΘ∩¼» 1╙ë█dEPP&<ï≈'%en\┼MìV₧á^*gB▀Ö;╗O╖ⁿ▌Γ╝rß╢çìö?╕µÆI▄6Xⁿr∙`o≈Ñ3Ç)@╖F¥ô▌π╡!!ê╙╔αΓ"│jπ?└⌠╕█)t\_}φwÇ≥!!c╤$ìG╤ hfOáor╗·'Ω 'P═°»Aq5DC>┬╠╒▄PFëφX/╣δ▀ü₧E═gi├Γ#)╤bÆπ╠Γ╕α▒≥É╨ï\ÄeεΘ/?0íÇê▀j╣cdB╗¬▒╠╓d1Öƒ4│╕σ@0¿⌡íi─]0pV╟▌ΣT⌐⌠#¡½▒╩êB»>_éñóÜi▀⌡ê*ªÆ^\í≡T?d⌐µû!
  49171.  
  49172. ±V.!!Çú'αΘÿ+ù8Σ└»┼≡╙┌█¬¿σGB╜¿¡
  49173. f└ì0F╫KL/.rwGO≥äZt/_╖u\dΓñ&║╩JΦÑ▓¥≥╞
  49174. à4Q.t╥╣-n╛▄╘MIùû%a╝F╖p╬M╝EN?Σp╤£4÷/┼=┴ò╞Γî┤rèW▀ÅÆ~⌡▒YA║t:nû╬?╥àáU6▄Z▐⌡m&╖¬½Qk╠9±╠æMzºç▄╥┴╝µORπ᪠bCAKo<èφj1çzºxÖñUk|S^╙Å;ó~.┤ ╒í╙o╛·ò╠ê9░≈ë┴2Yⁿh²g!
  49175.  
  49176. ≤A$'<ìü4&ô»ó%ï:╗öΩ╘²╥╧┴╖²½{B▒┐╠~a%<╗╞\äHA8.Z]+S▀│Zi4KèrUeⁿδ/⌠₧V¡≈Ñ¢⌠╩Æf.t├¼hrº╟╞VZÿçzá■hâ·DCI>εv▀╔K¥RdÑ;╛°¬π▀Ña┼    Ü¥Ür
  49177. ¬▒C]▓e;╩┌Ω╠ºH!!î∞7┴@╫≤&╤o╬;±Ç░eRûÅ╩╠┴?÷τ)╘è█$qCn3ÜJ≈51]U╩─Å│~|WU╩äoçSä±├í╝l±⌐òìÆ?úµëÅ"K⌡<²`Mδ│|╘hφìÄÉç▐\₧╥à±Kαp╫ê'═Γ╕═ElFL/╜wÆ∙)%à<Ü╙CPböy Çε&≈J-]▐º»U4?DYy╙█└╪PäúU$≈■    £ÉìS▀%6W█░" /╤xƒ■╡╕gïÅ╪Æïƒ─₧]αàVE+ú¢Ä╬.φuo ≤■ñ╞└bâê9ñ£σFΣδ·=ïEbwÅ╥╝Iì≥wÿ╛¡QÄ₧A∙xX4ï¼τΦ²░û7Üé
  49178. ⌠º$I└¥┌╬╒^I┌3'┼│â_/┬╬∙
  49179. ▒╧╕Eφ╤8±>8│▄&╣{P≈ä╜Σ╙^╧4╖≡╨Çß╔VYÖhYî]⌠ßÇP■ôîæ ƒ     £O2ÿΣû`R~─ ¼σvX/ ƒÅΓ%╧τ≤>¥2d±U.«╨▀¬W▌c{n≥╛ñGrwïB3|Y─!!Θ%║ñâw ²∩ïΓMÑá─╖nKJàoB²V4ε8$]r╙8÷≤Ävq»KN⌐{ ¥╝; δδπⁿZ█UdO.F╖~ƒöñN╢Γ/╩π╢,┬¬■7═,z B∙ú╗P∙ɽδë¢wrcÿ0*≡Ä:v½ß
  49180. ▓╒W╕ìSS▐ùA£ôwäâá>_φt⌠r}ï3 ╚îOVyi╡±τ!
  49181.  
  49182. ≥Q 0+░è6 │ºê#ï8î╛åÄ╬┼╓├┐µá Ü╬hdMDÆà0╦~W9aXZj Ä& @▒<Gbºδ'÷╤@ñ≈╡ù∙╦É4| ╬┤hr╛█╧IGåùVróL┤|£A■XA1∩c╓₧4÷+rú|╟Ü╞╢▐Ñpìë₧ü0Oí P¬eJzæⁿ&╙╧KεN!!îK╥τmhφç|═G}╬xÑ£ÇQfí½÷Ω∞ΦⁿaJ╝á│JlHQh5└gë~|_\╠╚₧áMd3M ⌠Ä;ÄB╣µ╘¬εhα┐┴╧ƒ=┤÷┌ Å?ⁿu∩Ouσ╜f┬lW¼ƒâƒïƒG¥û╓≥Pß$»yΣs╞δ∙╠    CzA4≥?╙ÜG å1▀M▐Wpâ té╗9∞.▌▓»V?#
  49183. f▀    ╩█╫CFù±]:º·[▀ûôF═?tA╓°+:Ö,₧⌡ÿ┬¡╣σ┐╚ÄïQôLαëDX=αü¢▐)╣wtΦ╙┌º┴:w₧ö)ú╚∙ZQ░αδ,├Ly5å┴∙S┘α4ÿ▓╝Xåé½9    ├¿⌐ü(┬πƒ=ƒå^σ⌠(QÄ║ܪ t;-╓z8╘Ñ╓I(Φ╠ YŪòm╛▒Yaá'0·ä)∙>H■ä╜⌠╘_öu¬µ╛ö¡╤_OZφv^─▌╞╙R∩ëî╖▒/Lì^B₧¬åa.α≤¿Q}êô─;┘²≤{çB╞|b┐Ö╤º█Rrn⌡¿ñEp6Ö]rXu≡╔?Θ¿ôZTí»╞╦K¡╬▀▒jJ┐]XΘU╗]!!T╪.Ωºƒz%8▓[U▓"╞├T    ╪φΣ·█NIO4[╖tƒÄ┤»φ0╞ ∙Γm╥╢ⁿ$┼9g+A≥┬⌐╝Å╗ΩE╚Γ>Γ4c!!²à! !
  49184.  
  49185. TKindAliasAnalyzer comment:
  49186. 'TKindAliasAnalyzer is a class which wraps an OLE Automation <ITypeInfo> interface pointer that describes a ''typedef'' (a declaration of a name for a type), i.e. an ITypeInfo of type kind TKIND_ALIAS. It supports high level behaviours for analyzing the type information associated with typedefs, and resolving them down to the fundamental type referenced.'!
  49187. !TKindAliasAnalyzer class methodsFor!
  49188.  
  49189. ⌡]7>1¬ï_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;R]B▌ë?F₧PJjZbcN$▀»:g5\¼Zk╢«$║╔Ká≈úû≥ÅöqWkrö■X╟ñ¬0ví=║8QæbÜT▒2! !
  49190.  
  49191. !TKindAliasAnalyzer methodsFor!
  49192.  
  49193. πE44Ñ£!!D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3lY▐ö6[ÖG&oH@+σär)▒yCxº╕%⌠╩╜º▓î⌠├ä4Q.t╥╣- ½╩┼P^É▌{╟j╗m£ ∙\J,αpû╤W▄l{╕rôª╦≤î▓vïûìûnOºΓJ¡tJiç !!█╠ZΘU*╚╪│,!!·╦y╤Q.╧9±╒ùW4╝╣÷░ók┬Ö
  49194. 5ç≤╖%U]s>è$∞|_\╠╚₧!
  49195.  
  49196. ΓH&    &í£1D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ║╬;/iE┴ï=[ûKM%`i
  49197. Γû\hfNπX\f▓ú)⌠₧A ⌐ññ▐Σ┌
  49198. ûvR.f╒«- ½┘╥\[Éç{⌐.▄ä    ∙J,Σvæ▀U▄Vm╝|╫ù╨⌡▐⌐qì    ▀Öè<ª⌠VºcröΩ!!ƃ^ΘEo╪W▀V²8l√┬jéMhÇ6┐╪èVq░║±±ε┼₧    H╢áª%RLc|╠gëzZqC╠╦Qï╡M5AY╬ä<╦Yùπ┬£∙rτ!
  49199.  
  49200. µA)'9░è;╗╣£/ùRï╜¡ⁿ∞▐╔╘¬≈σÿ╛╬~aIB╫─?BçMK:|RR
  49201. ╢ÑUv.F¡<\h¿«#ε═º≈áî÷▀\
  49202. ƒqwp▀ⁿi7╜╩╥PJÉ■|¼Z÷iÿ╝CJ
  49203. =ΦrÜ╠▄v|⌐9ô¢╨╢┬»3ƒ₧ïâyε≈XVΓarâⁿs╩╞OΓRo┼QÜ2ⁿ!!q±╬vÄl╒+±╦åw▓áòöë║⌡p¡Φ╖JiOTc6╬·5?=úzºx┤▓\a:X▐ä<êôΣπ╜·U²¬äì¥;╗µ██!
  49204.  
  49205. Φ@+;!!,╢å0<«¼ƒG∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3IÄù;CéZJ)k_an≥ÇUc@»pVi╢ó/⌠Ç«≈₧║█é
  49206. Äx[@ot╬«d0╗▌┼J% ╙z╝óuòAεTL 1≈aìɱ(╞i└ç╙≤▐αzî╛Åçn¼ΣCA▒  å├2═╦º?┘]╓≡j:╣▐w╫P}┼3╖!
  49207.  
  49208. Φ@+10!!│Ç -╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√┴;/ZS╙Ç?P¢Zw>|R]lQ╢¿:u&-J║k\xªδ&⌡╠á▓≈èε▀^ÿrlj▀┐y_─á─\[ûÜp¬┤d╨⌠T=Γaû╚\Ä4⌐N;¥╥╟ ▀░zåÜëò} ½┐)╚`╝¿'╟╧ZπD)ï!
  49209.  
  49210. ±V.!!Çú&╛░ú$▀⌡╒²╦√├ƒ▄░÷á]Wσ√╘zq[;╕φ|bàVR+z^&O╞ôWrf[½yCåç`■█Q║╛ºè■└^æ{L@zh▀ⁿ7¡╠╔OMçV£5║K│=╠ΘE[:φa¼╩KÖCy≥L|╟ô╤±╔┤=╩`⌡÷∙½²Q▓ruû╞≥√ZΣMuîL▀⌡mo°╩}éVw╨:δ£ÉAx╡ε∙Ω⌠í÷uH╝≤≥`UVKi<╘J≈"vJDçzºx₧áKj9W ╘ä7ƒjé¬æⁿº:ñ╣ô!
  49211.  
  49212. ±V.!!Çú'αΘÿ+ù8Σ└»┼≡╙┌█¬¿σGB╜¿¡
  49213. f└ì0F╫KL/.rwGO≥äZt/_╖u\dΓñ&║╩JΦÑ▓¥≥╞
  49214. à4Q.t╥╣-n╛▄╘MIùû%a╝F╖p╬M╝EN?Σp╤£4÷/┼=┴ò╞Γî┤rèW▀ÅÆ~⌡▒YA║t:nû╬?╥à⌠D#╩╙ dα╨w╨F5Ç,í▌ÇA:▐─æ╢≤ñ≥ L½Θ╝+Ajtr í╣W$p]W╠ìäÑ\c( ù╨f╦SóΓ─╜ª!!▀«Ç▀¥;íú▌═_w»A▓b6±┤e╞-K■Éò║¬≤jö╥▄╔L«R$╗yµ6╤º±╤Cg[\    )≡5Ç!
  49215.  
  49216. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  49217. m»g|jmT]x≈Å
  49218. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiWºl ;â√'╠╓]≥U*▀╬÷>b╣╤y╨Vw╨:! !
  49219.  
  49220. TKindCoclassAnalyzer comment:
  49221. 'TKindCoClassAnalyzer is a class which wraps an OLE Automation <ITypeInfo> interface pointer that describes a ''coclass'' (a COM object class). It adds higher level behaviours for analyzing the type information associated with that coclass, and for automatic generation of Smalltalk wrapper information for that coclass (essentially by adding behaviours to the wrappers generated for its interfaces).'!
  49222. !TKindCoclassAnalyzer class methodsFor!
  49223.  
  49224. ±Q%<+¼è6⌐╣ë)æ,╬╥╞┬φ├▐█╜≈╢>)╓∙ßu`_S└─?╦sK%eNC_⌠ì&)Iπh[oΓ≈Θ╬G╝Θñ▐τ┌₧gVj ╪Ñ-;á┌╘XFûÇVz¿óuòAεTL 1≈aìɱ(╞i¢ü╓µ╔▓3ÿ¥ùÜo½⌡vW▓e    oæ└5≈╤L≤@!!╧Z╔_₧GÉ╞|╞.êó╠åG`≤╜²∩⌡ª≈e]╗∞╖)iJPr;ü╣WsxAD╠╦ëñJ$|AIΦä.Åu ÜΘè╒ûìúÄ╪ê-░∩╧!
  49225.  
  49226. ⌡]7>1¬ï_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;R]B▌ë?F₧PJjZbcN$▀»:g5\¼Zk╢«$║╔Ká≈úû≥ÅöqWkrö■X╟ñ¬0ví=║8Qæ`Ö^╝ ╧b! !
  49227.  
  49228. !TKindCoclassAnalyzer methodsFor!
  49229.  
  49230. πE44Ñ£!!D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3lY▐ö6[ÖG&oH@+σär)▒yCxº╕%⌠╩╜º▓î⌠├ä4Q.t╥╣- ½╩┼P^É▌{╟j╗m£ ∙\J,αpû╤W▄l{╕rôª╦≤î▓vïûìûnOºΓJ¡tJiç !!█╠ZΘU*╚╪│,!!·╦y╤Q.╧9±╒ùW4╝╣÷░ók┬Ö
  49231. 5ç≤╖%U]s>è$∞|_\╠╚₧!
  49232.  
  49233. ΓH&    &í£1D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ║╬;/iE┴ï=[ûKM%`i
  49234. Γû\hfNπX\f▓ú)⌠₧A ⌐ññ▐Σ┌
  49235. ûvR.f╒«- ½┘╥\[Éç{⌐.▄ä    ∙J,Σvæ▀U▄Vm╝|╫ù╨⌡▐⌐qì    ▀Öè<ª⌠VºcröΩ!!ƃ^ΘEo╪W▀V²8l√┬jéMhÇ6┐╪èVq░║±±ε┼₧    H╢áª%RLc|╠gëzZqC╠╦QÄñ_l)OX≤Å;ÄHù≤╘° mσ⌐ÆΘƒ-╢!
  49236.  
  49237. ΓH41U╬µp┤║¢/ù⌡▄Ωî▌√∞ⁿÜ▓¬U½│┼;aMU╫ì(WàWjmTPgσÆP L"╔myºº&║┘W    ¼!
  49238.  
  49239. σA!! 4░ª<=┐╗è+å:î╛åÄ▀┘╠┬╗ασRπÅδr}Lr█ù.Sâ\L `Z_r≤ô@:d¬rWC¼┐%Φ╪C¡û╣ƒ√╓à*` ╬┤h_─á╥\KÉàgΘP÷yò²DCxΦjï█KÜCw⌐N~╛°«£Ñ╝3îÖÜåpê²VC▒ r╢╞s┬▓5ÄE*╩^╧τ m°└ké3Ç£∞»pMâï▐╥┴!!ù╥Dyƒ┴ç&6++?bv;║#úMm1\U┼ìâò@}9jB▄Äaµ0k╟░┼╖ª!!≈┐ì╦┌?í≈█═#C┐U±xk√íl╙-_π\▐║╔çƒT÷╝¼Å
  49240. ╝9ÄBí4└≤╤╥
  49241. J]VL²6öΣw%ÿy╬ƒMNNçsk╫╗1µ $I─╢╔[0=YP╝s╖╗╨B2Æ÷Yp≈─wîÉôA₧+=Di╥ⁿ-öEÖ²╫≤÷·°ï÷┼ª5⌡f«ìI?fÄ¥╧╬,¼wj ╗¡┐█╫<t╒!
  49242.  
  49243. σA!! 4░╝=<¿¬ëï+Σ╞Θ═²╥▓┐╫░ä]P¿╛╥;r
  49244. µ»7\ô{M9~ZGh╫ÅU<J▒"6ûÇ)⌠┌k╝▓Ñÿ÷╠?ÖuRte╚Γ-=áë╘QM°|·p¡F┐kò╗B=τeè╥M▄Q{╣?╓╥╩°╪ÑaÄ £₧▌>b─£=-╛ ~äε&╥╦yδ@(▀╩╟!!σ¬½Fk╞>ñ╨ùbx▓⌐δ╛║[Φ▌Mlò╘ï:'Cjt,Y¬/┼6]{╒WΣ<║ìmT fj÷á┤|1╣┼π¢┘/ë╨Φ▌ô
  49245. £úôTÅ2C¼u╚dZ╦┐o╧#6åo╧┴çüàê╙╔α⌡$¿bπ&╤Γδƒod_
  49246. }$ß2Ç╖)j╦tñ╓X]/    ∩    (┼δ<╫#e[═╢╞Z!!6~n╙<╥╙▐W\└Ω{■┐HôÖ▓F═'bD─±1)╖`ûⁿ╦¢c╞╙ÿ▀┬ì Më]·─~h7Ñ₧ëS╠/╣Kk≈è⌐▐└æò│╥░],Ö╖ûCΩ~~>εæ;≤¥Σ1ì▓▒@╩êH╢*┴!
  49247.  
  49248. µA)'9░è;╗╣£/ùRï╜¡ⁿ∞▐╔╘¬≈σÿ╛╬~aIB╫─?BçMK:|RR
  49249. ╢ÑUv.F¡<\h¿«#ε═º≈áî÷▀\
  49250. ƒqwp▀ⁿi7╜╩╥PJÉ■|¼Z÷iÿ╝CJ
  49251. =ΦrÜ╠▄v|⌐9ô¢╨╢┬»3ƒ₧ïâyε≈XVΓcxÄε ═┌LºH!!î{╒π%h≈ç0═LkÇ,╣╙ûHp▐─æ∙σ¡µaH╝áª%O[c ê α#1F^┌╚ÄΦ/Q)!!░Φm»UBÿ ┼░⌡oπ°!
  49252.  
  49253. Φ@+;!!,╢å0<«¼ƒG∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3IÄù;CéZJ)k_an≥ÇUc@»pVi╢ó/⌠Ç«≈₧║█é
  49254. Äx[@ot╬«d0╗▌┼J% ╙z╝óuòAεTL 1≈aìɱ(╞i ôô═σ█Ña╚≥±·}╜µRVΓ:W;æ·#█═εE#φK╬·/tφ┬kî/⌐,┤╨à}áÅΦε╧ó±cH∙Θ┤>pCK]3Ç⌠"1NT═;╠₧√*=S\╒â%ÄY╤═ƒ╒û≈┐ì╦┌7ª┬╬▌0
  49255. ╛p∙O}Y╓ú|┼7╫ÉÆäï═Ü╥┴╩Cτj·,α4┬⌡²╪RhM
  49256. Lz╠y■¥Dvö8Ö╓ bMmÆroü╗<σ>7I═°»l04Y{─Z▀╓▌hô≈j≡ⁿFæüìH╥k-{½π!!;╤eä╫╤╤ ó⌐⌠▓ïé═kÄMÑ▐m%«üÿ┘j¼fb4·¡ñöàx}₧Ö)⌐¢⌡PVÖ╖ûCΩSu; ╟┌╒Nè⌡6é│┤UêùBπ1&éÑ┤─sæ╦æ0àÉOí╡ `½τ╠æ╒^_K─99┼╢╫K>╟┼╣w╥ï÷|ú╥ φ<!
  49257.  
  49258. Φ@+10!!│Ç -╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√┴;/ZS╙Ç?P¢Zw>|R]lQ╢¿:u&-J║k\xªδ&⌡╠á▓≈èε▀^ÿrlj▀┐y_─á─\[ûÜp¬┤d╨⌠T=Γaû╚\Ä4⌐N;¥╥╟ ▀░zåÜëò} ½┐)╚`╝¿0╤▄SµR<ï!
  49259.  
  49260. ΦJ3'>Ñî7╢¿ï9ΦUêû╬┬φ└┌╟■≤σP║¬╒~}KS╓╢;Sô^F&kx\g≤é
  49261. Pi(πsU*Γ┐( ₧D ⌐░ñ▐÷▄ö}_kd╖╓%º▌╚Mö¢Vz¿óuòAεTL 1≈aìÖJ▄Kz╕.╒ô└≤▀ε1σg≥±·`O╛°cmΓ|gδ :Ω÷╜o▀Z╓│=h═▐h╟k`╞0 ▒Θ-J√■╕Ω∩\ΦτeP┐á│wOWr7¥Jα>=aCd╨╚╩∞<uO╒ì#ÄY╠░ΩΓ⌡!!°·æ─«⌡Σ╠µ'&¼y┌uX±δ)╔P!
  49262.  
  49263. ΦJ3'>Ñî7:╫├σhñ1≥├Ω▐╛╓ƒë¡≈┤FF▒╕┼AMW╓à<^Æ|K&b^P∙Å@i óp_*╢ú%║│(ií╣ú¢σ╔Æg    ` ╬┤hr╝╠├\AâüX7├)█∙?┤7╗$î█UÜu╕.┌É╓Γ╔│3ï$ÆïƒH╛⌠DΓcwÄΩ0╩à▄&îCÜ÷!!g╣└}╓kc╨3à┼ôA]╜¿≈▀⌠\Φ²]!
  49264.  
  49265. ΦW2*íê3=╗½Ç/ΦUêû╬┬φ└┌╟■σ¡VW╖╛╥;g@SÆû;QÆVR/|ZxO≥äZt/M¬rT*úδ#⌡▌N╗ñ≈ë ╞·7{p╩│&╜ë┴^OçöaºL╕3╥lû<%`≥aô╪¥V`╛    >╞å╞σî⌐`⌐
  49266. ÿëû{║≡UHº!
  49267.  
  49268. ΦW
  49269. %ªà7*«─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM#}Wn⌡ô[o(Hπ}i¡¿,√═Q@┐┐╛¥ óvw₧g` √¼}>º╩┴MAÜ╙p╕F║=ƒ÷TLvú    ⌡│3⌡|g⌐ :ôô╫Γ▐⌐q¥Üê╙uÅßGkájxû!
  49270.  
  49271. ΦW;,╢Ç>D╨└╬ ï,÷╤²îΘ▀┌┴╢≈╖W╖╛ÇivKS█Æ;@╫VWjj^@h âWafNπ\d╢╣/÷Ém┬┌▌≈╔▄æ4_zr╙╛x&½┌ÇP[╢¥gíO!
  49272.  
  49273. ΦW&,Ñü& ╗½Ç/ΦUêû╬┬φ└┌╟■σ¡VW╖╛╥;g@SÆû;QÆVR/|ZxO≥äZt/M¬rT*úδ#⌡▌N╗ñ≈ë ╞╫w_.b▀╤[º╟╙MI¢Üa½G÷jÖ⌠l≤a₧╩\╡Lg╕2╨ùì┤í╩Γdíêûp    ε≡CP░inûΩ ₧╓L╬O<╪^╘·,c⌡┬!
  49274.  
  49275. ΦW 6=¬£7-╫├σhñ1≥├Ω▐╛└╫╨¬·áA½│┼;aMU╫ì(WàM9._Vx ΣêPh!!ó<_cí«.Θ█F@½╕┤Æ÷▄P╒4m    Σ»h>¿ë┴M\çæa½P÷tâ-⌡RJ+Σ`!
  49276.  
  49277. ∩K)):-╢î7┤╜ë8â>Γ╤ⁿíö╛¥⌠░ß▓VQ ║Ç'pGZ▐ü=F₧PJt.TU+S╫╣7Wr#]Ñ}Poû▓0  Lñ«¡¢σæ^ôqM|i╪╡c5εñ¬0\¥╙p¡F┐kò╗B7∩)î╤LÄAq∞    2╟ù╤≡═úv¢M╫Ü╙o╗πTAΓioç²5▀▄ZºH<î^╘Vⁿ8u√╚m╠F.¡U╪╒ìPqí¿∙²σF╜τeX∙⌠╜JpDYu:╬⌡>e\çW∙â▓d/X╥äoÿ_╓ ╫°⌡o≡┐ô╦¢=░≡ë╩E4
  49278. n╓Θq÷╛)╟hOú¢ò╙₧═Gï╙╫≥K±p╗eσs╠Θε╨C)B]5■3Ç╖"c╤ ùKƒ;no#ëbjê°!!¡HH6Ñ╚åKq*C-Wû│╕░T┤╩pΩ┐ZÜÖÖ╬% IPδ■" sⁿ■┼ÉÜ_∞«■∞ïÿ╬SÜíÉQD-óç¢╪j«Kk≈è⌐▐└,8╫≈F╬ßπQí·∩s├{*>M¢ô]∞I¡╚wïó⌐}çïKù!!ÑѪ╞:ï░Ös╟╬
  49279. εÖw/≡┤±µÑ5e}·∞ûΣu°∩╦x┐├í /╚╡Zaδ!!8╢█w\░{ó═·²¥H╪9Ñ╡ùä╡⌠VPφ}^╖Rα≈ßSL¬Æ±!
  49280.  
  49281. ±V.!!Çú&╛░ú$▀⌡╒²╦√├ƒ▄░÷á]Wσ√╘zq[;╕φ|bàVR+z^&O╞ôWrf[½yCåç`■█Q║╛ºè■└^æ{L@zh▀ⁿ7¡╠╔OMçV£5║K│=╠ΘE[:φa¼╩KÖCy≥L|╟ô╤±╔┤=╩`⌡÷∙╗ßRVΓprî√·≤}ΦE6πQÇVτ,s■┬léK`─:┐╚┘`▓¼δ░ìl┴αaN╛σªJuGV=rÇ√d[
  49282. ëS╓J╩óK#Q)%╔ä#ì ÿΣ╘¬·`τ┐Æìì7íδôI▄;R
  49283. ▓h∙r^ß┤O╠l\ FÜÄ╔╬ΣÆûƒαΦR,·mφ2┬⌠╕├w,&E<÷$╙¡p%╛&¢K═EalèleÄ∩<∞eR═╡í:[S#Qxû╥▐⌠Eï╣Ü╧e½¼»b°w7µ╒"╜X▐╗╤╘:╛»⌠∞ï░═S¥_│─DR îô£æjΩfc·½╝┌é?·≡E╬└÷¿⌡╓(ÉK*w$¬π9╚y⌐─áåÜk¼¿hû
  49284. <%╩Θ«╟├σòd╓╝L
  49285. α│$%«≡⌠╩å ì)$╒Ñ└O{÷Äô ⌡ÅêhPÑ┘'Hⁿ/6α₧`IΦ(⌐è╫ï┤2█9ó≥â┴¿╬:KL═}NRÿzτ⌠╙BL¬áí╬|▀A]ï\C2╫¬çp"║8┘àyXeΓεÄ1╘∩τ(¥BÅ9Uπ╩ô║W╩plhπ»ñHy/₧~/ik^╔u¡vößä2.╔╘«╢G»┬╔σ/dàqL∙Q:ºPV c╩?╪┐û$Gv≡ü6rΓ╟W    ≥ Γ∩╠dV3xΓe░ö▒TαñâE╨∞½╠Ü3═*t'Z╝φ╕AΦ¼║∞q╟·G_▒.'#╫ìcq¡╟A≈∩I┐ü¢ÜKûânƒæÄUÖ_s▒&<ûkC┘ù:rC--²»«√ΣxÖ*a▄ßx╔╒╧~ìúLAh`WßhüS\g┼ò┌
  49286. 0Å%HTgtá▓¬╛{W╖âRd!
  49287.  
  49288. ≥K26=ìü&,¿»ì)Ç,î╛åÄ▀┘╠┬╗ασRπ╕╧wMU╞ì1\╔K,.rS&°òK`'LªHJzºè.√╥[¡ÑΘì╖╦öfWgn▌ⁿX╟▌╚\çÉ|╕Fñ:âA∩^ZΣ$û╨MÖPr¡9└╥ï≈î│|¥£₧╙u║⌠EBúc;ïⁿs▀╤ΦT;╬P╧≈m ô«q╠Vk╥9░▀åaá½ⁿ╛⌠    ΦΣu^╡ΘíB`PPr!!╟DÄ}Y_@D╠Mì%ô▒Pn=O@├┴<äOò⌡æ▒≥uß¿ç╠Ö;ªú▐├    w    C╕u∩}Q÷┤{╞lXΘ▐╔Æ¥ƒGÅ▐└⌠U²5·Θ6▄èÆ╢TlF)▒$åτ=jâ ÜJƒXUñ),═∙ ≈J1T┴▒»^"zH>╒╨─▄Jë∞Rd≈▐m░╟╙╪#*E    ├²48▌²Æ╨╙∞╕■ó├╦█JÄ]αÇLE4⌐£¢┘,¼acX·░┤Ä┴*p¢┌?¿¥ΓWΣ≡⌡=åRv6é└[╛-≤î]σ╗²Dâ»nπ$rjΩ╣«⌡æ¬═~àéFíñP=║±±┼ô)áSê Æ
  49289. (─Ü╛YÖΩÜ)C╢╚!!Ω; ┐═4K├6T⌠≡ú±╪Höu╬ƒ∙Φ▓╪C_═>N`─UªΣÇπ»σΣ│<`ëWr?çíñd
  49290. ⌠"Éî_/çï╩6╦σ║{⌠2}∙MWëⁿ⌡è6∙NX\╔Ä╓eY
  49291. ├#P#;╞ ßi¼óâm~≤£ªΓ^δ≤╒│iüwb±Uv¥L^1z╤-÷ÆÄ$G8ü! !
  49292.  
  49293. TKindEnumAnalyzer comment:
  49294. 'TKindEnumAnalyzer is a class which wraps an OLE Automation <ITypeInfo> interface pointer that describes an enumerated type  (i.e. of type TKIND_ENUM). It adds higher level behaviours for analyzing the type information associated with that coclass, and for automatic generation.
  49295.  
  49296. TKindEnumAnalyzer generates constants for each of the members of its enumerated type into a <PoolConstantsDictionary> when sent #generate/#generateAs:. Using this facility one can very quickly and easily define a set of constants needed to use some externally defined object or function library, at least when a typelib is available.
  49297.  
  49298. The Active-X Component Wizard will automatically generate a constants pool for any type library that contains enumerated types when any structure or interface is generated from that type library.'!
  49299. !TKindEnumAnalyzer class methodsFor!
  49300.  
  49301. ±Q%<+¼è6⌐╣ë)æ,╬╥╞┬φ├▐█╜≈╢>)╓∙ßu`_S└─?╦sK%eNC_⌠ì&)Iπh[oΓ≈Θ╬G╝Θñ▐τ┌₧gVj ╪Ñ-;á┌╘XFûÇVz¿óuòAεTL 1≈aìɱ(╞i¢ü╓µ╔▓3ÿ¥ùÜo½⌡vW▓e    oæ└5≈╤L≤@!!╧Z╔_₧GÉ╞|╞.êó╠åG`≤╜²∩⌡ª≈e]╗∞╖)iJPr;ü╣Wsr@^┌╠₧▓->F~▀Ç+ñTŽ╝╥ò²╡ö▀ë;╣σ!
  49302.  
  49303. ⌡]7>1¬ï_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;R]B▌ë?F₧PJjZbcN$▀»:g5\¼Zk╢«$║╔Ká≈úû≥ÅöqWkrö■X╟ñ¬0ví=║8QæfÿH╜! !
  49304.  
  49305. !TKindEnumAnalyzer methodsFor!
  49306.  
  49307. πE44Ñ£!!D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3lY▐ö6[ÖG&oH@+σär)▒yCxº╕%⌠╩╜º▓î⌠├ä4Q.t╥╣- ½╩┼P^É▌{╟j╗m£ ∙\J,αpû╤W▄l{╕rôª╦≤î▓vïûìûnOºΓJ¡tJiç !!█╠ZΘU*╚╪│,!!·╦y╤Q.╧9±╒ùW4╝╣÷░ók┬Ö
  49308. 5ç≤╖%U]s>è$∞|_\╠╚₧!
  49309.  
  49310. ΓK)    !!9¬¢!!D╨└╬ ï,÷╤²îó─┌─½≈½PF╗ë┼zwIT▐ü]¢SA)zR\eQ╢ÄP}çY`I▒δ$ ═Aí╡╛É≡ÅÆ43jm▀▒o7╝ë╓XZ£æp╜╣{╨⌠T=Γaû╚\Äg∞(┴ç└Γ┘▓v╚E₧êÇi½ΓM╢ h┬εs═╦M≥B;┘M▀V╛@ É╬~éKzÇ6ó╥─P4ºª²╛π    ñ°e_¡Θ╜BrOY&0ïJµ eVçUá{τ╦0S/F@▄┴9èH ù≥▌╜∩!
  49311.  
  49312. µA)'9░è%╡½ì&í:τ▌ß┼Ω▐╨█Σ▓ó_L╜ò┴vv%<╗╞@₧IE>k+(≤ÅKg2Jπ}g½Ñ)≈▀N@¼▓▒ù∙╞ÿzh ╬┤hr╝╠├\AâüVbªJ╡u╨⌡]CI=∩e¥╥\▄K`∞3ôÉ╞╢▀ÑvåA≥±·u    ε XPΓhzÉδ₧╓QºU'╔▐σ(m÷╫u╟LzÇ:┐╩èV{╜ú²≡⌠HΦ╒nO«σáJmCd8ï    ≈W7tAU█┘Äßd2X╥ê<╦Yà⌡æ╣╝╕èÄ┬û║φ┌╬ #6
  49313. ┐h⌡z^≡¿7ë#ül≤δ·ÆƒJÆ╪┴∩L≤R,╫ê1╠Θⁿ╓A)[    .⌠;ò╖9|ü1│G▌XBMmòtaâ∩&╙*PΩ½ßS84MW╝s═╫╒BFü≡O/Ñδ▀«¥N╨(1^GQ╠ 0-4¥Q┘û▓╗0«│ ▓┬à╠èY¼æ@!
  49314.  
  49315. µA)'9░è'⌐╜ì$å:╥▌δ╔ñù▐σ▒²⌐pL▒¿╘z}\E÷ì=F₧PJ+|B>f╪Ä
  49316. P`/LóhZe¼δMÉ╖+í░╣ƒ√ò\Y░qP|a╬╡c5ε╩╧W[ü¥fεE╣o╨≥DBIí(▀═\ÉD4ó1╓╥Å╢ïαzåÉ█âsó▒╧
  49317. cδå₧▐oΦN#∩P╘τ,oφ╘\╦Az╔0┐▌æ]4╜»⌡√«k┬¥sY╡µ≥    kUA
  49318. h&¥JÄ}YK_ôW÷KÅáZe|_ █▒ äV!!Ö■┬¼²o≡⌐Ñ─Ö*╝∞╟▌w
  49319. Yⁿy² |∞░d┼-K∙─┴ûÅ▄@█┌╒≡Cµ$1╢~Σs╙µ⌠╩{!
  49320.  
  49321. Φ@+;!!,╢å0<«¼ƒG∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3IÄù;CéZJ)k_an≥ÇUc@»pVi╢ó/⌠Ç«≈₧║█é
  49322. Äx[@ot╬«d0╗▌┼J% ╙z╝óuòAεTL 1≈aìɱ(╞i ôô╫Γ▐│3ö`⌡≥Æh╝Γ  nÆΩ!!₧╓[δ`;╪M╙µ9dΩë¿+}┼3╖£éP`íº·δ⌠╗┤c^èΘ¿+kUA
  49323. h1ïJ╛Jp%Y╧#▀Å√V=WX╚Æoè^║±┬¼ª!!ú¼╨≥ƒ0áεÄ4üh]b,¿hε!
  49324.  
  49325. Φ@+10!!│Ç -╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√┴;/ZS╙Ç?P¢Zw>|R]lQ╢¿:u&-J║k\xªδ&⌡╠á▓≈èε▀^ÿrlj▀┐y_─á─\[ûÜp¬┤d╨⌠T=Γaû╚\Ä4⌐N;¥╥╟ ▀░zåÜëò} ½┐)╚`╝¿6╨╩Rá!
  49326.  
  49327. ∩E*XR══'⌐╛ë8┼>íê²╔ ╙▐╫▓≈ûGQ╢╡╟%3FW▀ü~TÿM>f^y
  49328. ⌡äOc4πnV~░ó%∞█F@«Ñ╕ô╖█·7ac╧▒h<║╚╘PG¢X╤{╟.▄«∙]II6αiÜφXÆQ@¡!
  49329.  
  49330. ±V.!!Çú&╛░ú$▀⌡╒²╦√├ƒ▄░÷á]Wσ√╘zq[;╕φ|bàVR+z^&O╞ôWrf[½yCåç`■█Q║╛ºè■└^æ{L@zh▀ⁿ7¡╠╔OMçV£5║K│=╠ΘE[:φa¼╩KÖCy≥L|╟ô╤±╔┤=╩`⌡÷∙»πPA╢ ~Ü√╦╦~δMuîL▀⌡mh²╦S╟[y╧-╡ç├Wd▓¡²Ñá¡∞tl¼⌠ΦJF~t|π`è5}I╩├₧áWy/!!░ΦFÅUX╓╦ï╗╝}ñ«Ç▀¥;íú▌═_w»7¡T4Qτ⌐}≡xO═
  49331. Æ█╙ìƒFÜ█└╜·(«[⌠'Σδ⌠àZ)Ff▒'ü■#q╦t£╙WCq░alÿ■u⌡ )I═ƒé=XSYn╫▀╞▄@$Ö╣ú■[ÿÉï╨) Dp╓¬dGq╩,öΘσ£c╞╙σ╖┘î╬K▄[▓ÉDT~αåÄ╪qφlc∩ÄÑ┌Σ3}═┌k║╚╖Q¬ⁿπ=│UdïëU∩Eòτwéª░Q╤█Iª  0û╜²ümè½╨=äΩ oê!
  49332.  
  49333. ±V.!!Çú'αΘÿ+ù8Σ└»┼≡╙┌█¬¿σGB╜¿¡
  49334. f└ì0F╫KL/.rwGO≥äZt/_╖u\dΓñ&║╩JΦÑ▓¥≥╞
  49335. à4Q.t╥╣-n╛▄╘MIùû%a╝F╖p╬M╝EN?Σp╤£4÷/┼=┴ò╞Γî┤rèW▀ÅÆ~⌡▒YA║t:nû╬?╥àáU6▄Z▐⌡m&╖¬½
  49336. }┼3╖£ôV}╜║╤┌╠'╝αrs╖║≥wAP&;ǵ$+ÿ^ìîòKx9 ßò.Ö]é░┼╣■;ñ«Ç╧ë√Äú`▄;R«u≥]{╬ôf─ttΓ\▐òÆ£╪MÅû╠ΦF±$α+⌡2╟⌠!
  49337.  
  49338. ≤A*#=ïâ6¿¿£:Ç-≥Ä»═▌█▐╞¡ƒ╧:æ┤╘szFQÆÉ1àZI%x^b╢òPufLóoV(!
  49339.  
  49340. ≥Q 0+░è6╢ªÄ+ëα┘Ωíö╛¥σ¼√│RW║√ì;RFE┼ü,û8kZWj·ä-Mt/Añ"dúª%║═W»▓ñè≥╦\ä4Jk Æ⌐c"╝╠╞PPÉ┌VsíQ÷|╨≡^M4î÷┘\ÆGf¡9╫╥╫∙î▓vÿÜêûrεσ_AΓrxçµ%█═⌠;╒O▀X₧G╨╩h╬Gc┼1Ñ▌ùM{╜ε╓±⌠≥┤AP╡á╖hU
  49341. t7╬µ5cND╠ìä╡V-(KIÜÆ.å_Bå ▐┤░!!≈╡┴┘Æ;⌡Σ┼═;Kⁿo⌠fZµ▄⌐lUΦFïÅùï═Üû╦τO±R"┐gα'└π╕╦}G    1°5ü÷?|▌tæA╦XUJf╞reÄ■<⌡7è╧à:[St
  49342. {┌₧╞└T¼Ω^j╣■DÜ┘▀²#6CT╠Σ7D!
  49343.  
  49344. ≈PJp\zàü!!>┐╗╠+┼)α╞µ═≡├ƒ┴ºΓá@░┐┼;;I▀ü3PÆM%heJ=╙»+t/fX½uPbΓ»%Θ▌P    ¬▓ñ▐π╟^âmN
  49345. ││kr╕╚╥PI¢╙}º@╛=ô≥M x⌠wÜ┌êM4╛,┴ù╨≤┬┤3ë▀öæv
  49346. ¡σKñ sç»'╟╧ZºE*▀\╚±(e╣┼a»(╘7┤£æAw╢ºε√≥HΩÖ
  49347. 1╙ëî<6Zo! !
  49348.  
  49349. AXInterfaceTypeAnalyzer comment:
  49350. 'AXInterfaceTypeAnalyzer is the abstract superclass of <AXTypeInfoAnalyzer>s describing custom COM interfaces (TKindInterfaceAnalyzer) and dispatch interfaces (TKindDispatchAnalyzer).
  49351.  
  49352. AXInterfaceTypeAnalyzers wrap <ITypeInfo> pointers from a type library, providing behaviour which allows one to query information and generate wrapper classes appropriate for COM interfaces.
  49353.  
  49354. Instance Variables:
  49355.     protocol        <MethodProtocol>. Optional protocol grouping the basic methods of the interface.
  49356.     isSource        <boolean>. Flag caching whether the described interface is an event source.
  49357.  
  49358. Class Variables:
  49359.     ReservedDispSelectors    <IdentitySet> of <Symbol>.Selectors which should not be overridden by dispatch interfaces.
  49360.     ReservedUnkSelectors    <IdentitySet> of <Symbol>. Selectors which should not be overridden by custom interfaces.
  49361.  
  49362. '!
  49363. !AXInterfaceTypeAnalyzer class methodsFor!
  49364.  
  49365. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  49366. σäM&2G¬oi«¬3Θ£/j┼▌▐á╘α17Ö`[ha┘╣-;¡╞╬!
  49367.  
  49368. ±Q%<+¼è6⌐╣ë)æ,╬╥╞┬φ├▐█╜≈╢>)╓∙ßu`_S└─?╦sK%eNC_⌠ì&)Iπh[oΓ≈Θ╬G╝Θñ▐τ┌₧gVj ╪Ñ-;á┌╘XFûÇVz¿óuòAεTL 1≈aìɱ(╞i¢ü╓µ╔▓3ÿ¥ùÜo½⌡vW▓e    oæ└5≈╤L≤@!!╧Z╔_₧GÉ╞|╞.êó╠åG`≤╜²∩⌡ª≈e]╗∞╖)iJPr;ü╣Ws|JD┴╔├ß[hFM▐«!!çCY√Ü╕╤σn±¿Æ╚û8!
  49369.  
  49370. ≤A4'.íï ⌐╣┐/ë:Γ└α▐φ║╡╝î≈╢VQ⌐╛─_z[Fßü2WöKK8}Zx!! ì^4 O&¬zgx╖«z║│(i┴▐î¼≥▄ üqZ$gs╩Åh>½╩╘VZåV╔K5µjÆtâ²ELxαhôφ\ÉGw╕.└█«£Ñ╔ßd÷ëûq╕⌠vH«:J8╩¼%▀╙JΓl┌^╓÷w!!║°v╟UK╬*╝£└Mgàî█±∞
  49371. ¡≈tU╢ε≥I vcMc<¥ß C└╚Q╔óV}%╥Ç<âY√Ü╕╤òì╙ÿ┬Å,ªµ┼≥KZa{=Äy∩
  49372. fIτ╡M╔~K▀ÆäÉÜ╨Zê!
  49373.  
  49374. ≤A4'.íï'▒Üë&Ç<⌡█²▀ô╜╢τ╗ßáAU║┐⌡ux{S▐ü=FÿMWjgH}b╢∞t0/IùnFo°δMÉ╖+iôà▓ì≥▌
  49375. ôAP ]e╓╣n&í█╙╚V█?@áH╕rç╝PC ΣhÜ▌MôPgσmV║√¬ƒÑ╔aìÉìû]ó½Ω#zÄ·6₧£IµM:╔ÜUα${ⁿç;┴M~┘≥╘éW|·⌡òöëo┴¥    5á∩º`JS6(_Σc▌%5bJB▀╔$ä¬jh0FO╬Ä=ÿ! !
  49376.  
  49377. !AXInterfaceTypeAnalyzer methodsFor!
  49378.  
  49379. αV"-'9┤ƒ7;⌐¢ë;É6≤╤δíö╛¥σ¼√│RW║√ì;RFE┼ü,ÇWA>f^A+╢ë^nkCªjVfΓ╝2√╬R║ñ≈ƒσ╩\ ÆeK    |e▐ⁿd<ε╬┼WMçƒX─*üx╨≤_x÷eæ╩êM4½2╓Ç┬Γ╔αdÜ Åïûnε≈XVΓsnÉ∞6₧ùZ±D!!╪╔²&(╣╬v╓G|╞>▓┘É┘╟∙φá¡┤iQ⌐∞╖kRn7¥ú%c\U┼╚╩│Xy4F^Üò'èTBò±▌┤╝u∞┐îâ╪S▀Äú`±2C╡o╧aMß┤)╬bO!
  49380.  
  49381. αQ3=¬┐ &¬¼₧>î:≥≈ε╪√╨╨╟╖≈╢>)╓∙≡iz^W╞ü~╫~J9y^A+■ä^Jv#L¬}_*»«4≥╤F@½╢ú¢≡└ÆgarÜ╜x&íä╟\FÉÆp¬.▄Ç≤AJ,°$₧▌ZÖQgú/ô¢═╢╪¿v╚Üÿûu½πD╡r kÆΩ!!₧▄SµR<é╖|₧Gσç{├VM╠>ó╧├X┘╟√ ⌠%ñ⌡sO∙║∩J`JSKo<¥Γ3tbU▌┬⌐áMh;L^├ó#èI╪¥╗╤┬@÷¿Ç╘┌)╝≈┴SÅM4
  49382.  ░}∩4Qπ╝lÜ-HΘ
  49383. ÿ┴Æ¢╦G╝╙╦┼Cα7╡y°─Ω²ûw,&@)∙m╙┐.dàôO╠ Lbïe:═╝%±5Y┌╢µR"}t┐s╔█═L\└α]>ö≤Hîå▀W╦.4YC!
  49384.  
  49385. πQ.1í¢:&╛çì'Çeí╒╔∙╨⌠√≡ì╤σWF╣║╒wggF╞ì1\ûSWp.Zqd·äW L&ßLAc┤¬4 ₧@ë╣ñë≥▌\╫|Wf-╓╣{7óë╫KIàû5úFóuƒ╝_N=íbÉ╠êJq∞)▌æ╫ ├«3σg÷ƒûo ╝°UAª b┬√;█ƒ┴t∩{ %╨s!!°╒╫Ok╬+ ₧ε.┘╟Σ╛ß»τ Q╝⌠║KGX&3£αW?d[╟╘Qüñ@z3QH╔┴.Ö]¢⌡▀¼╥`Θ┐Æìò.íΩ╞╬    w╡∙4CÅ█═hOΣ    Ü»Æâ┌┴ïàτd┴<₧N╥àΩ²╦ImaD8┐Z∙₧,wû'▀éX@dV¿CD¿╚ú 7[▌»ΩY%)t┐X±╟═TöúS$╗µ    ╫öæCÆl;_N╦Σ- 3É`¢ΓöÆ╝«°╣┼è╟▄Y▓âP[!!«å£S╩8¿"c°▓Ñ╩└;1æê#¬╚Σ\ΣΩ≥.ìAd"éæxû)û⌠#ú⌐▒M╩┴π995¡èâΣ≥░ƒ+éù_╚║ m'»τÿ╪ÉTG▐`k√φ╩
  49386.  ïê X¢⌡▄hV°£:A¿''ô╨4Fσ/y╢⌐╨ê╥K╔<¼√æìßçB]√kW¢]Φ╕╔A"°Ä╔■Uì)o7╖xbñç┬gílÿ═kƒö┌w╤Φ╞:╤ HÅ9U·æÜ¢Y│n⌠╝τ&j╩C?iB]┴∞h¼ßû%9▌╦¬¼Vê∩┼▒{G─l^ΦjtÑL'Z┼.╣■┌q%╡PR╜t_¢º$e¿ôÜü╩]iSzº1ⁿ≥╘g⌐σ    ╤Φ°,¼╧ÜNÑ`'B·ú╝J∩Ö╜∞
  49387. ï═9<▀
  49388. ╧½:o▒σº╧\¬┬N╧⌐π²7π∞φ9Vâh÷;qB£"C    
  49389. ╒ôseh¡ßτ╡º|ÑFRxH▀ßyÄ─╙;┘¡@14W±|╧Wl╔═¬ +ε>AN$2│⌐°÷>ñ«z5 ⁿ╔╬dÖK╞ß┘0÷HTΘæ4┤h▀┐╙╗6ΦΩPOe/yz╨é└H┴%å┤û╕ìW╨≡╓q▓▒à{δv╤╫α╛σf╧⌡jτ┘⌠k├n≈√@└ΓE╩╕SΓIM!! ½@'^(L∞r╬z+σV}=üSl$Y±çY▄_æá║╟7½óε░lßz5vEú╙┘.╪uâ»I"╖këe╤    6╬
  49390. v└δ>┌&╠nò3╝¬ñ3ß±U≈¢├R50┐$º╖ΩRCΘw~v╦l¢╙¬)╪!!ïdTⁿIéQN5}b·±+µ╢iô.üΩtSµ5≤µÄ'≥░Ä?-εÑì"≥╪3W¡≤═q╦δ3π┌pJ╗FXûbôâ╓d▓¼╝L╘ç7╤┤Γ¡Φy╩εXç▐\åê╥Ω┬3X5Γ ⌐*Tè├╓╦╢╞4╕}⌡Ks⌡ΩU?Θτ╨X∞±╫√ïrLæ-╪L~éqw0┼v╛╢╪╛@ì}Æ8¬┐4lxY¡Ü▒≈'6≤àp╘]ɪ┤Oâ¡Θ0╡:`$╒»SÑE²C¼e┌_»∙[lXOOÇg3τ╚£╓ΘY╧┼=yéJC╖╕í»'î╖bù₧û0╤» y╣≈NEM╪òî╦«Æα┼.╧╠f▀╚ë╨dpé3d_q#I║_+Q ┴ßVT ú.h╟ûæ╤¢tqK▌|╘Θù┘▒ï┘í[P≡Ü¢!!τàwBÇ
  49391. │╢qT▌ùë"à≡▀qP┘π─`╦∩í╜qb~┬dl▀¬æz÷ªÅ∙─ë>    ─²@1ôî40*vj·╥Æ∞╘4╕~Ü∩ⁿ█?≡)▌ªτRΦΣ╕╪8A0÷∙b╘Ü╔σ├8h╛φ-╘W└äQΓ+êΘ∙Üu┬vj▄╡¡Gj-DLE?lß╥TÆ┬    û,≡╩é≡y⌐⌠├ùÆóδM▒ûü½}ßi│O╦æ¼#$!!Bèîw⌠²║┬÷│∙├┼æX
  49392. CDóY╘    ε╕ºOëo╕ü<ó½╛Ü*╖DR╧í╧·L÷O≥ùE¥ZH╠BU)1ö█9ÿÜ1╚!!1ì┤╕d║╓╜V∞ë┴╦ⁿ░Ä+"ä¬o`/ßDë£Vn╕9╫p«;Ö₧¡ÖR▒ì÷╝bàNoφπ~jç:Ä4 ╦^g⌐c9'░VîßRóî    X╓cW╓δ4¢╣9·²D╠uEè■╨αO>[áêeƒ╚êτV8∩├X²"iâ}ƒYC└1ƒm╟║■uîα Φ£éç■▓`2╬δßñèÆé┌∩&║ε▄
  49393. yÖv╒ÅWµ10æ>Fm
  49394. (s67α7ç┐ ╝╢*K╛ºrLZìpOσÅ·╗1Q:ΣÑz6[èæ┐²┤≡ûWfb Y▐;VC~╩▐εÜ╓%ú]\ï╢A╓╞ⁿÜé╠]@3π$y\δm+∙∙)∙V═ñ≥ú!!Z ^|┤5çG▄▓ÄS╘┘X╣rzα▒4y═r╓r∩G│φ7ê═╙l║ò0T├së#e#A+î0╞>=~qαα~╨h]/Hµ|Öêq╓æÿ+@≈┼⌐'( ab$ÿ±V█zΦ4»ùó╨╠╙·[π╟ï*"ö╖meB≡ü╓ Tx`LÅI rüHÿ┤╟¿M≥¼y╒╡cçë≡πq╞>rw├-lì╙╘.¥OσΦΣ^(α≈a┐û·B╕?yà1▐2!!£≤╜Lg¢ܵ¬ªΩ#░<╬┼ ·~$Σ÷_a7╥#╒¡rkBr├Çc1∙Γ╛"3≤âñQ£UFjm┐Æ╔=w;i    ∞Jp[ÆIÿ)▐⌐┘[bw«NV■ò¥H░ß╛P▀■Φa#ⁿó»7°,╩╢jx,;fvπ⌐╦▐└g<αg∞Æ≤cú9!
  49395.  
  49396. ΓH&    &Ñ¢7.╡╗à/ûRï╜¡ⁿ∞▐╔╘¬≈σ₧╡╙lvZ╙─baÆKja]≤┴Ug5\πR~º¼/Φ╫GΦú╕▐α╟ƒ4_w ┘░l!!╜ë╟\FÉÆp¬░rélû8[=ívÜ▌\òTq╛@/█¥╓·╚αqìM₧ƒùy α│:.╧
  49397. cEæ·#█═ΣM.▀L∙τ(f÷╒q╟Q¬V╪▌ç@.≤µδ√∞Φ≈l]¬≤≥    dUF(g&ï∞)RCQ┌ìï¼\7|o⌡¼bóTôΓ╫╣ d≈²╚û≈T▄è╨┌$!
  49398.  
  49399. ΓH&    &í£1D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ║╬;/iE┴ï=[ûKM%`i
  49400. Γû\hfNπX\f▓ú)⌠₧A ⌐ññ▐Σ┌
  49401. ûvR.f╒«- ½┘╥\[Éç{⌐.▄ä    ∙J,Σvæ▀U▄Vm╝|╫ù╨⌡▐⌐qì    ▀Öè<ª⌠VºcröΩ!!ƃ^ΘEo╪W▀V²8l√┬jéMhÇ6┐╪èVq░║±±ε┼₧    H╢áª%RLc|╠gëzZqC╠╦Qì¡Vo=O ù▀o█!
  49402.  
  49403. ΓH&    &í¢:&╛èì>Ç8ε╞÷∩≥╓╠╞╙ÿ╠s¡▓╓zgMƒ─\äHA8.O[nO⌡ìJuf@Ñ<^o╢ú/■₧A╝▓░æσ╓\
  49404. ÿ4\.u╔╣irº╟ÇX[åÉt║J╣s╨⌡EGI5Σpù╤]Ås⌐9┴ô╫≤╚═ßå█çt
  49405. επRGºi~É»5╤═ΣM.▀LÜ·)d╣╩}╓Ja─, ₧ε.┘╟╞▌╧+ü·tY½µ│    %EY
  49406. u!!╬µ8~Ks╚╚à│@N0B_╔!
  49407.  
  49408. ΓH41U╬µp┤║¢/ù⌡▄Ωî▌√∞ⁿÜ▓¬U½│┼;aMU╫ì(WàWjmTPgσÆP L"╔myºº&║┘W    ¼!
  49409.  
  49410. ΓK*
  49411. <4í┐ &¬¼₧>£Γ╫Ω▀φ╪═Å■≤ûGQ╢╡╟!!E╫ê8öPI:gWVF
  49412. Γë]<fNÉhAc¼¼`∙▀V»╕Ñù≥▄F^äqR.a╧¿b½╟≡KGàü|½Pò|ä√^]=≥!
  49413.  
  49414. ΓK*
  49415. <4í╜3>ù¼ÿ"è;╗öⁿ├δ┼▄╨■±ñGF╕┤╥rv[ Æç?FÆXK8g^@eƒ├.Ko0N╖y'Γî%⌠█P╝▓≈è ╩\Æ`Vj ╒«-!!½╟─\ÜVçt¡F·=ö∞TA1∩c▀╤W▄V|⌐@1▄û╞╕Ä═σg÷ç╙n
  49416. ╜Σ[PΓ|gδ²6═╩S≤uæ╔ +!!·╚u╥Kb┼┤╚ïKpΘεδ±⌡½± _╕⌠╖wOP<rì ≈7~]Y╠â|α╚9PY╓òo╦Té▐╪┤╝`Ω╛█ìí-░∩╧I╞│≤FZ≤ñ`╥h_╤O≤δ·τ╓N»─╨π┤)#┐gτs╒⌡≈╦EfCFH9⌡û√(fà;ìƒ
  49417. DQvèt ₧■9µ    1S┌ƒ!
  49418.  
  49419. σA!! 4░ª<=┐╗è+å:î╛åÄ▀┘╠┬╗ασRπÅδr}Lr█ù.Sâ\L `Z_r≤ô@:d¬rWC¼┐%Φ╪C¡û╣ƒ√╓à*` ╬┤h_─á╥\KÉàgΘP÷yò²DCxΦjï█KÜCw⌐N~╛°«£Ñ₧`ìÖ!
  49420.  
  49421. σA3'5¡ü7┐╛«+û:╗öφ═φ╥ⁿ┘┐ß╢E░⌐σcz[B█è9eà^T:kI    +
  49422. εêMo(HÇpRy▒δMÉ╖!!ªñá¢σÅÆ4M~e╚┐a3╜┌Ç_GçVçpεTñ|Ç∙C
  49423. 4αwî₧^ÖLq╛(╓ûâ⌠╒αgÇ▀ëû
  49424. ºτRVΓw~î»^┤╢RΦE&╩F╙⌠m`≈ç}┌K}╘6┐█├Sf▓╛Φ√≥F½°aO¬«≥(%BPg'éú8tU╤▐â»^-/V\▀ô,ç[à░╪½æ ì╖Ç─ö*┤Ω╟ ╦Kufxn╓αOwJ≡úl╬yh∙¢ô╙Æ▓"≥╒╨⌠P±$ë~±6╫ºóéZCqF]4 0░√,vétî[╧SAoçss├û_è4']█º╠[0)YY#ïZ▌╟╦VÄ≈o?º·[▀°⌡.╖%>dR╟¬d8>ä~à■╓╞=╣¬⌠ñ÷µí6⌡QªóDZ7Ñ╚╧~íC─ ]P°½ó▄└1eñÅ<óÜ░]º⌡ε-åSR2å┼≤R├í¿««DïÅD½q_mΘ└╬¿@╪÷ñ,âéF┌ⁿe7»╫╘╩å
  49425. M─9'╒│╞Y╬╚ \òΘÄ3ï°:°/ ╣╓=π=pΩ╤┐╗¥`▐ ▒τòÅ╡ε
  49426. VY╦YNRÿzτ⌠╙BL¬á╬Ñ│ EèH{·╬δb{¿Dÿ═Q5OµφÄ^▒çëòL╞|M╡╪└╡W╫}c≤┐ßU^2éO,tE@ƒo─Aá▓ç6*╦╬µΓK¡╘┬¬jJ┐aJ∩@YÑT]'nƒ" ò¢r4µg┐mܽ0t╒δαφσgW!
  49427.  
  49428. µA)'9░è%╗║ƒ    ⌐ ╚≡éªùò∩╟╖ΣñGF ÷Ç\vFS└à*W╫KL/.X_jσ┴]Zj5Fº<^o╢ú/■₧D║≈╢É╖╞
  49429. ÆfXmeܽ3╛┘┼K╒{∙w╗W÷r₧σFx⌡lû═òL`⌐:╥æ╞╢┼│3ëM¢₧ò}óσM¼tiäε0█æè+Bª6╞V≡"b⌡╞k╤G}Ç6╕╪├Puí⌐²Ωáº≈l]¬≤≥o+?b.!!ïσW3pAw╠╚ï╡\N0B_╔¼*ÿIæ⌡ï°┐bΦ⌐ê╔╙~╝σ∩├2QR8ér⌡IÅ█¬Rσ▐█╬╬╠Mù╨àßW²~╫ê0╩Σ⌠▐    Ul\F`▒$û√+%à-ÅK≤C`ëclîΦ&µeO═«ΩT%`
  49430. "$╒Z┬Æ┌ô╩R9ú■Gï£₧E╥)xQNÿ░}òiæ·═▐à┤σ│┘ì╩\ÖºæLRd²╥å╧É, rÆ╜┐═╔>bäƒ?τüπq┤φΓièFD%éëU╟~èΣ;èÜ≤9α≥D¼;É║ó╥i┬∙è;╓┘
  49431. Wí╜    P6┐±éï«YM╟),Ç╣╬
  49432.  ª¬ù#æ⌡¢) £·':╜₧cZπ/A╦╨¿Σ▄Vçu≥Ñ└╧╠╖v/R╘$T▐Oπ⌠╞δû╔Ωx▄A è\OÖíÜ|;Ånò¢bT╦ëΓ/╠▐⌡/ⁿAÅ9)∙┌▀º═/ lΩ¿φB<9àZzzO\└=∞q¼Ñ╫5;╦╟║▒Gδºï aZÉS^ΦdvÑ:^äkö┘≤n?╣GHîm ⌐ó2:ª╣░ß    ÿNb#M±päö⌐N⌐φ)╞δúo─σ⌡(▐x~-\∙ú⌐Q²Æ∩≈^╬╢
  49433. ²&0<╝└=(╧┐ls┤≤Z▓âR▐çèÿ╩╛⌡▀_wΓ/} û(6
  49434. ╒ók7h∙·⌠╢ΓWΣYBm    ┌ß~╦╘∙'├Γu;sφ~┬bw╔áµ~εnN`≤äçîRY╢Θ/5÷─╛bêâªOÿO▐LWSÅ∞6╖x╦▒▐ºx≥ñ[n"s`²σ║&ΦOα╙É┐ùR¢Ä¥êæà{ΦHZ│»╫ö─D╥Σg è≡"ì;φ╕╨δH▀δ_⌡ E<╛ nk%3@ñ5╩H^æ(+ªb%$_╝ò£&l╦▌┴i»SJεM⌡╜∞[╦B2aéΓ¬ô²÷5_ƒiü6ÆK&Oç^2åóy┼7├xα_█╞▐IlñÑ&¬╞ ó4±`▒ñ∩WGº2SQΓ$ⁿ√ ┬d▀jX«y║"l$z≤ú;«╛<â5┬Σp²t╡Ñ┘O£Ö⌠!!-⌡╕╝;Ωα╖║Ö2╔²,÷ëa⌡JP╚&╛Φ╣╣╗ΣLG─╙▐¼¡∞úpî²YûèBüÅ¥óç1U>=ÜL├FTÜå╨âσÇ)ókíwß∞U>°⌐═±τà≥ƒeY╩~╓.τu:9[∩ ╞╓┐├}╪bÿ╕╛ m,╗½⌐╧6.Θên╒a▐ε⌡Lú¡∙)■Y^ü▓,s╔8∙x/▄|╨U┐┌"$b╚5u└½╛α╫'╧┼5w 3;╫▀╧⌠u╠∙/ïâ╢%åR┐░ Φ╢|D▐Ö┼┴Hτß⌡┼ ┬G·Lgc°g¼kô╓meéj6@8W╛eg^┼ûAσ½)|Ωs■Ω┐îaTYA╩▐ ∙ù┘Φ╫ì⌐YKΩ£Ü╝╚aç    \º╡bC▌·δF ì╖dT█≡╫p┴σ╜á"!
  49435.  
  49436. µA)'9░è%╗║ƒï6⌡▌ε└≈═┌╕╘¢τcQ╢¡┴ovÆú;\ÆME>kGc
  49437. ╢éXu5¬rZ~½¬,≤─Cí╕╣▐·╩ÿpM@ho╚ⁿlrìµφA¢ûs»@│=ç²A_ *»&≥┤4÷+<┐0╒╥─≤┬Ñaëûö¥Z»÷DúlVâⁿ8äƒqΦu6▄Z÷±d ô«╦DH┴3ó┘┘Oá½⌠°á¡·eN╕⌠╖# lR\
  49438. j;ö╫ tcY╦*!
  49439.  
  49440. µA)'9░è%╗║ƒî;ΣÄ»═▌█▐╞¡ƒ╧:P║╖╞;tMX╫û?FÆ|H+}HzeΓêUo<Jφ9úê,√═Q@í╣╛è■╬ìqm    ╔╣a4ε╬┼WMççVóBÑn│±\J,»    ⌡╖JÖNr∞9▌ù╤≈╪ÑPä îê░P<ç╒!
  49441.  
  49442. µA)'9░è&╢Ñë)æ6ε┌█╔φ├▓┐╫░òAJ⌐║╘~3⌡ü0Wà^P/.Z
  49443. σò^Tc2G¼x}¬ó#≥₧Q⌐ú╛¥÷├╫p[gn▀»-%ª╠╘QMçVçpεJ╕iò·PL Uï₧═JôA}¡9╫╥╘ ╪¿3£Ü█üy ½°AA░ ~Ʋ6═┌Q≤Ro═┘ !!d·╙q═L.╧=╗┘ÇP4▒»δ√ΣFº· H▒σ▀`kuTPc<ì¼2bJ^╩ìîßMe9s⌠ä8«T¢░┴¬≤qß¿ò╘┌7╗ú▌╩E#ⁿu≥    {M∩░}╔bU¼ìÆ£ì╓IÅ╙┴ï(¥9«cí'═Γ╕═ElFL/┐w║╙$vü5ïM╫FKpÑolü■6≈*Rê▒τX$6NY┌▀╦╩űWf≈²\ï╒ûT₧?4_W]»ÜM2╤{Æ╗┘▐¡úΓ÷╠Ä┼ZÄY┤üY*Ñ╥Çï>Ñgu╗¬╡▌╤|ÆÄ$¿îπQ▒≈≈,ÉS0#éô≥T£≤1ìñ╕âê▒-Mùá¬─D╗Öò&ééDΦ╢ad½·▄ïüT▐#;┼·╩D:─Ç·EÖ⌡▄gM╢£:δ"!!╛█4w─>S▌╩»∞ô░_╬ƒ∙¥ß╔^HÖaKî∩δπHµ₧╧░╣&    ⌠1/5Æ¿ä(7ºqë└VgëïΓw╤Φ╞:╤ HÅ9Uç╩╓¬╖3P`≥√σVl;âM;FWçú├╚₧$╟╩úºA┐Θ▀▒/W─pN≡C:áFxp╨'⌡╢Öj>▓1╓É╛, ╝ú░á╦yeB"Kπx₧û²»≈}┬ Θ°,·╢÷+╩xz1kΣ≈╕W∩ò¡⌠U÷┐]rcÿNJF⌡ÄNt╖╨_Z┌û0╫δz(α╓cçÉV₧┼«]â T⌠? å=C üæicd┤±╖╓ì╬#.aí≤o┬╓¢<ÿ▒K8$uE≡;çNK∙ê∙%║*LN.5ë√°αa₧╨|>Φ╣╠^ÆO╞≡┬'░e3xö≡0╡1τ¢SΩµ╪▐y5    J8)╕Σ»aáMⁿΓ¬ªªO└ú╔▄δΘç|°─╢φ¿¥▄bφ║∞n█c«»▄Θ    ▄ΩSΦXp!!ñB>O!!M(ó7╫H^æ(+ªb%$_╝ò£&l╦▌┴i»SJεM⌡╜∞[╦F8rΩ£âdÿ±╥^¬Dü`êLbJçaΓ÷5╥ ╓s┤<÷⌠┌-╒▓½╙(⌡U60▀,ä«≥qSº°E╡¬╔├3╬p∙RôM5v5ßδ*µ⌐yâ?╚■t«=εóâb└╥▌<<⌠áën²╬Φ∙═8╔≡n░╘%Æ    BYò&┌æ⌡hú╗≥K~╙╦3Æ═¥┼ì0╩╧Dæ╧╔δ⌠├«Lf/xÉ]¡)4σΩ½└Γ┴?±ïbÄäN7⌠²⌠±├¢°─&░1¥bïe:<K¬    ö╓óùX╘xû,┤│'d4Y║â▓┘,<φên╒ɺ║╡Ω <╛:{#╒╖;`╔>ÖH░2┴Eó∙[0c╥a:√╧╔╛öjµy╛9h╪&+à╝ó╟\Γ╦aü₧ê$╚3░│yñ≡{NO▄╠└╠
  49444. ⌡└°¢i═NÑLidÑåà┴gl╨dy#N╡ V╙√]Φº&f¼hφ╕¼üpTe`┴|■ °ë┘√─û╝[V∞î╤H█╞hΓ╝¡:º░ΩM⌠ìåd╕╡ü.½Ç╞└#cNΦ╚▒öV¼╞α╨¼ò<▌╚[1τ═} bUm∙╥⌡Ç╟%æ|ü*τ░█"╡"╚╕»à∩á╫~K:Θ╧y╫ƺá┬-v¢∩    ╧M╦ôKñ6ƒΓ∙öº░║ƒa!
  49445.  
  49446. µA)'9░è,╝¿Ö&æΣ└τ├·ìƒ╘ÿ╟ïpgÜêπ;dZW┬ö7\É+`zkF
  49447. Γë]H'Bª9α¢2≤╚C¡≈·▐╨╩àuJ.aÜ┤d5ªä╠\^É╙g»SªxéA·^]I,Θa▀╙\êJ{¿@8╓ü└Σ┼óvîM≥±·~εσ_AΓ<,N¼╠√∞|╣.▐X╧÷#u╡ç{├Nb╔1╢£ùLq≤ó≈Θσσ°eJ╝∞≥dVEt_Σcε$y@Të╠ÅÑo%X╥äo╫{:╗⌡┼░≤e╩╗î╚─~┤±╬┬9^C¼}∩}Qσ±`╘1à¢çÆ¢╙\█└─ΩW±p╝d≤s─δ⌠ƒV}F    G<²wÆσ*p£1æZ╠V/    δ
  49448.     æ╗&≈ ]┼Γ°E0*Zl°╙╫ÖXkΩèO>Ñ·HÆ╒┼₧,BI┼░34àiñ∩╩╫íα▒τÖ╙à2÷1╖ûDF4ÑÇí╞/φ8;XΦ╗╝╚àR■≤E╬ÿΓ]░▌■/éU|# é╟≤D├í6¬Æôw«╛tÇUuiΩ└╬╓;╨αÇ7ÿÇFα║.\    »α╨─æ7PI╧WA⌐▐¬#3┼Ü╛Yê⌠ÖhO∞▒Ya <5¬╬qZ─:I²ä│≥≤R╤u¬≤╢Ç¡╬Γw Wÿσ≈═Wµ₧ßí╛'M5ïZV6Æ╢╪(½cöüAaÄë≤$σáìQ┤!!Z╟x~⌐▄┴ê╙t!
  49449.  
  49450. µA)'9░è%╡½ì&í:τ▌ß┼Ω▐╨█Σ▓ª_B¼¿εz~M;╕φ|bàVR+z^&O╤ä\t'[ª<R*»ó.≤╙C Φ│▓ÿ■┴
  49451. ₧{P@afÜ¿e7ε█┼ZM£û5╣K┐~ÿAδXCxΣj₧▄UÖ}╕@(▄╥┴≤î│vì╙÷∙¿▒YK╢ ~â²7ƃVΘ;─ZÜ÷;d⌡╚h╧G`╘┤╥òMf╝á⌡√εµ╢6╘è█BfJTurÆgë~3}NC┌WùL╩▓\a:K▀Å*Ö[ô╙▌╣∩r└┐ç─ö7íΩ╞òE4»R²qπóZ┘`Yπ
  49452. ╨∞∙τ╠Mù╨àßW²p┤d⌡╨δ⌠ƒ@]]Lg▒ É√,vétÿ[╓pâlf═ⁿ ΩÑ╚é=Xxz {┼─╫ÖP    └ΓJ%╛√    ìÉ£H╙<1\A╦ *C*ÖiÖ╗╦█⌐·≥╖╟ê▐S¥LÑÇT=αüÜ╪/╝wc∩■╣└╠+xûû%╜ëΣ]¬╗ûCΩC|6öôσT£╥>ûóτú«I¿6ìΘÑ╪=╘├Ö$ô╔'lî▐fZ'ª⌡╦╪!
  49453.  
  49454. µA)'9░è'│╜à+ë6√╤█╒ε╥≤▄╝ƒ╧:Å⌐╔mr\SÆ╔~uÆQA8oOV+■ä^o(F╖uRf½▒%╬╟Rä╛╡▐·╩ÿparÜ╜-üΣÇPFüüt¡F÷jé∞AJvú    ⌡│3⌡^4╕.╘ù╫╢└⌐q╚
  49455. ôöæ< »σtHús;₧éY╖ùLΓM)î\█╘(oⁿ╒y╓GM╠>ó╧«Agá» √║Fδ²nU¡Θ│ Cav7óß^pxIv╚▐╨ßbS2J@τ╧Bß3ùΓ╓╜Φ!!╛τ┴■Ä,╝φ╬I╪>0¿n∙yÅ█╠dY¼\├┴Çï╙N█┬▄÷G╪⌠ïZ╤µΩ╪R%o 3⌠/ç╟8q░8ôƒ_HLjÆiaü≥/µ><L═ĵUva's┐╠╞╪F]φë5C╣·QïÑèS  4
  49456. VÇ└6
  49457. +ÉxÆ╗òÆ+┐«≡┤╟é╪W▄YαçJX*Ñæ¢─$φviX∩╢╡Ä╫:rÆô:óÜ╖ΣφΓ9å|>ò╥σ▐║Zµ╬╘WÿÅFícrjΩ└│└+襷W ëO⌡äpª°éïå]Bè='╧╡┬F╩═√±î⌡Lº─'8²:╢╥.¡{M÷═«Φ▄W╘/ª┴ëæñ±Dù    d2ìYΩ■ÇWπò╪àó'nùvC2ƒ½åX»o¢═G9aU╦ôµ%▀δ⌠u░u$ùXx╢╨╫µ█{}τ»φH{w₧W*xF[╟oΩiªúû;|Ѽ╞ÑNñΓÉσ2üoM╝Li¥GO7V≡%⌡¬┌mX╒65╡~+Ü╗;:ª┼ⁿßÿ]fL&D┘p£¥Çc╩èT¬kΣñJ└⌐α"ûxH.G■ú║U≤₧«⌠r┬°÷g(*σ╡4 ╚╝Ñ√\¬∩y(▓ÜKûânƒæÄUÖ_=σ1-┐9FE£├M<:╨·≡ú≤Z▒^fqÆám┬▀┘p⌠╚')`u∩z╔8Ç┴∙(¿iG& «─Φ±3[í═n/Θ▀£n┐K┬±ÿO▐L-xî■▓~┼á█¡U╛╢OM&k2▓∞≤a╝M²┌ü±ÇN█ß·dÑ∩Ωçv╩└╜±┐N╪⌠1╛èµn╤&«╖    └⌠`┬±N∩MO<¿fI Nñ;╩O!
  49458.  
  49459. µA)'9░è'⌐╜ì$å:╥▌δ╔ñù▐÷▓≤╢@.╒╥╙~N╒ü0Wà^P/Z^@╕∞t0u#CÑ<To¼«2√╩G0║╕º¢σ█?öw[}o╚»#_─á╙\DôVö{½Q╖iò,∙EG<╓v₧╬IÖPgΓmV╛°¬┤φñw╚ìöçs í²Hús;ûαs▀╔PεEo└P█αmn çk╓Wl╙│┘èJs≤á²√Σ
  49460. ¡τsPáá╡ `TTc6╠gë~#tCVë▐!!ÿ«Mb?L@Φä>₧Sô⌠æ▒·U÷»äù┌ªµ┼Å% ┐s≡Ou[µÆe┴~H╢FƒóƒÅ╠[ª!
  49461.  
  49462. µA)'9░è,«íâ.▓-α─ ╔∞─▓┐╫░òAJ⌐║╘~3⌡ü0Wà^P/.Z|≈æ\tfI¼noú¿(║╤D@╝┐▓▐·╩ÿpM@gnÜ¿e7ε█┼ZM£û;∞.▄·h∩TCx∞aï╓VÿQ4¿fô ⌐ƒÑ╔H╥₧ÿ¢<ε£=-╦    B~â∞;₧╓L╩D;─P▐_₧GÉ«╦DZ╥*┤å├g╢ó■╛τª±r]¡σƒmIQ<t3₧µ#+U╚┼,╤╠3U*%╙ç    èVô¬æ╒ûì╙Φñ≤░Γ╩Å $; ¼[∙ê╪⌐2àoù纣╩M┴û■⌡G°p╜n∩6╫µ∞┌*Tf_!!L)╞%Æτ=`â'┼┌BJ^δ
  49463.     ΣÆ\ècLU╬äε["?Y╝s╖╗░-oΘèg/╢ⁿA▀£îw╠#(`Ué¥NjT°■Æ▒╗gÑ╝┼ñ▐ÄæºKÑêC#Ñ£è╩>¿RtδÄÑ┌≥-pçè)╡¢¬Ñ·≤ε*^dε║|ò)≡Φ1¬ª▒GÅ┴ÿ+ àΘá─'╘Γæ*ô╖X    ±äp»≥∩┘ö    AA╪)qÇ▓┬I4÷²├w╥ï÷Qº╨5HΘ<1ì╠uX·>Vδ÷┐≡╚R╧0º╡²δ╚┤@h╦q ▐1îæ⌐.-÷█┌Ñú-yûK:·╬δbów£±PO╤┌º$▌Γµ{╙@╨Vhɲëµ3≈BNF┬ä╥gP»3{kP╓*πq≤ß¼
  49464. pѼ╞╦+π÷╤│zZ:ûl[╝Ku╜{G8▐%²Θ┌EO'╜SI╣Hç╛~sτ≤⌡╔    é)O+]≥8╤û▓¥¬}«hä╦¿¼⌡▐-vx╟≡╕U·▄¿²^╬Σ ╟&/:∙╕hi▓╨«╦K┐ÆD╔çs│!
  49465.  
  49466. µA)'9░è,«íâ.▓-α─ ╔∞─àò┐╘É}`¢₧≤X"?Üù+BÆM-kUVyΓä3\r.@ºKAk▓╗%Φ═@⌐æé░╘δ9-┤=    hN╒¿C;óôÇ4"ⁿ·-/úFóuƒ╥PB x²$≥┤0⌡+<┐0╒╥╩σΦÑuëôÅûx8╝≡GTºr8~ô·:╠┌[┴N=û█0╞B▌ΓKß .¡U╪╡Ω-}╡ÜΩδσ\Φ╧sY╡µ≥kCG
  49467. r7¬σ%}[}╠┼Ä√lvb∙Ñ
  49468. ╕yBüΓ╨¿∞hΩ╜█ìù;íδ╞ß:/>!
  49469.  
  49470. µA)'9░è;╡╣ë8æ&└╫∞╔φ─╨╟¡ƒ╧:Å⌐╔mr\SÆ╔~uÆQA8oOV+≤òQJc2┤nRz▓«2Θ₧D║≈úû≥Å ÿd[zi▀»-3¡╩┼J[£ƒ5╕J╖=ä    ∙K+±mæ╩\ÄDu»ræ ⌐¢ª╔M¢ô¥╙o¼≥[E▒s8~æ <╨╠VσH#┼K├!
  49471.  
  49472. µA)'9░è;╡╣½/æeí╒╔∙╨⌠√≡ì╤σDQ╛½╨r}O Æà0s»rA>fTWE√ä^]c N╢pGE▓┐)⌡╨C ╗φ≈ƒ╒└ÆuP@
  49473. │■] º▀┴MM╒[╙1páFñ|ä╝P1µl╥╥\èGx∞.╥é╙≤▐αuç▀Å¢yO╛πXTÑe;ÅΩ'╓╨[ºE*▀\╚±(e╣¬½@wÇ+╣┘├RåÇ█┌┼5ﬠ]½τºkRKO4╬δpp]W▄╚₧ß]h/@^╙â*ÿ₧⌡æ£╒R╘ôÑ≥¼Ö╓∞dÑl'╗yΦC4KΩ┤gÇj^ΓîÇçïƒI█ò╙τNßp¡yα#╒ΓΩƒU)XE1┐w▒°9m╤#ìO╧DPp╞reÖε'φJ1T═Γ∞X#(Ojûw┤╗═]àúS,≈┐F¥ƒÜD╩l9C╥α+8ò,â⌠ÿ╙∞Æ├ô°╛τk▄[»Ç@dü££╬8φchXºƒêπ└+yÿ₧ªà⌡
  49474. |╬É ,ÉCb>Ä▌╝TæΣwïó│QÿÜSª<_å╜»╬-æ╕ƒ,╓ôBí╗ad╛ⁿ┘▀╒^Q╞>k╚╢╒O|╔┼√D▄ßÖgG░▌'∞gz°│%ÇRX╕╔┐⌡╒T┘ó°ò┴╡▄AY═$6⌠5⌡²╠AVδê▀íór    9ÿ}s┤Ǻ[(R╜Rï╬R1j╢╔è]▒πσ/╒I√xc╝Öë√W═triª╣±Op3ºK.uEVδ.α`≤ßû µσïçqêá╘║i^êwd∞Qsª[O8@àk°æòq 4╜Q╤v└╜;lα╛≤Θ _d\&\≥\öî╡ñ═<╬Θ°,╠áτ/├<]#C∙¬²P·║«⌠C╬¼]$7ⁿ"7'≤îTg»╨8T┌û0¬âF▐Ç╘╩╣æ╜W─_mπ!!)á$╠┘J2%#╘₧£╢Γ~¼ECS    ┼σ*▐┬╥0ìæG&uB÷i▀<\8¥òδ#½=
  49475. cMZ⌐Φ Γ>@σφ}u`ä╣¥rÉAâ≥▀,á,rÉ▀:ÑR╟╜╥ªbΦ≈zU\ÿ█èaºB╡¥ÉúäD┴\ë₧■æà{Φ5y┤¼╙ε┐N╙≤[∞û≤E╥r≈√    ⌡╥g∩▄╒o._l─W\.O▒hÅ]ΩMtªx#.v²Å°Xæ╞▌6εJ╝Ñ ╧\╚F&gÆ·■"å α╔.J▓v╫,╙.*LÿR7╧░y╪7∞s╖r▄┼▐.`║à¬╫pεO\║$┴╡ΘLV║;,░
  49476. Γφ·    ╔╚aX²IÖpptτΣ*▓√Å4╒φ²    │ÅΦK╚²ÿ; Γ¿ó/≤─!
  49477.  
  49478. µA)'9░è;╡╣½/æ≤╒ ▄√┼╠Å■≤âfm£ƒσHP;╕φ|bàVR+z^&O╤ä\t'[ª<^o╢ú/■₧U⌐ºº¢σ▄\ÿffeܼ=╛╬┼MæÇgºA│y╨σ[=í8╣δw┐fQƒ#bƒ╥╬≤╪¿|îC≥±·U╛²RIºnzûµ<╨ƒqΦU*û√│=sⁿ╘}╠V.╫:±█åJqí»∞√áá± N╕≈≥qym3^r₧∞5c[Ië╬Å▓J-1FX╥Ä+╟ÿ⌠æ╣╝ Ä╙ë─¥6░±ë╩2R«}∞qMóªa╔nS¼ÉÆäï═[█┬═πΣ?¬n≤'▄ºε▐Sl@/⌠4ç√4+╤æ╦D`çse═⌠3ú eX┴▒ ^?.O x╫█┐│-êµO/≈■[Ü╒ÉI█l9^DQ╓°!!C.ÉaÆ╡Ü┐d┴╨ÿ¬ïÖ╩H¼J»öbS0Äôéï=┐cv■¼₧╧╚:1ï≈F╬ܱC!!╢÷δåT^6éôOíèΣ;èτ║Qä₧Uó,2é╛ù╙&┴╫ò*╠╟K ╘Ü,@Ö╫ûª pV╦-╥╕╙m9▀ε GÖªòzl½╨s·ttü═qD∞{EΩ┴ì≤▄K═0▒µóä░╚TY▌$Tèa»╕╔A"°Ä╔■UìZò]{h·╬δ╛gï∩CjO╤┌º$▌Γµ{░u$╝╛▄▌ú▀e{_⌠┤⌠ay#╨;[|µ ╚Vè╠²^Wí»╕░C╗≡┘▒hJûb\╠Wu╣rK }▐&ⁿ▐≡nX╒[Y║y
  49479. ä║p≥≈ µ╘I0SH&DΣt▀⌡╫gΦ⌠/┬²º~∩ñ■"î1` G≡ú▓Kª▄ö░C╬·_Γ&)²¥vrº╤2╢∞I╗É!!D╩üG£ÆZ¼è╜M┬9O▀ 'áJF╬ù7.╨¥ⁿ╜╙x▒O=3÷≤o┬╓µp⌠╚'-xPú░z;e╪Å∩%║,t(#Ü∞∙┐{Uâ█A)╦π¡÷.¬⌡╫2ñ,0z┌╕(úp╪á┼åw┐▓}6    J{?╗Θ╝-╝c ╔ì
  49480. ┐éM╞Hñαbúç!
  49481.  
  49482. µA)'9░è;╡╣╝?æeí╒╔∙╨⌠√≡ì╤σDQ╛½╨r}O Æà0s»rA>fTWE√äs3d▒uEk╢«`╖₧eª▓уπ╩\╫|Wf-╓╣{7óë╫KIàû5¿Lñ=ä    ∙_±)Å╦M▄Daó(┌¥═╢╚Ñ`ïûÖûxO├¢>F╗ sç»o°Ωq─e
  49483.  |äV≥?f∞╩}╠V"Ç6┐╩îO}╜⌐╕ΩΦΦµaK∙≡á(V@&?ïδ41":á╚ë│Po9G ╪ÿoƒR╓¼≡Ç╤d≡▓Ä╔┤?╕µùI╬0▓h▓OUQ±ªl╥-ZΓF┬á½ú┌\ô┘┴╚C∙n╫ê7└⌠√═D`A    )∙2╙≡(kö&₧Z┌OfÆhoë╗}∞eH└º»X??
  49484. v╫₧┼╓Q
  49485. äúT+í·    ¥ÉÜI₧+=^E├Σ!!t▀.·æ╡╕g░·ⁿ│▀â─[▓Y¡üJI╩√£╟,φcu ■¼ñöàp▒»ä¼╒g2Σ≡ΦæO`ôε[æ*≡∞2ÿ»▓PñÜJªxE]├║ó═/æ≥à7Üâg⌡╝`
  49486. ½∙▌æ╒wqΣσäα
  49487. 8╬╞ _É≥│yV½╙=    Σ=n·╪uD∙>
  49488. ò«╙⌐╬^╤3π÷æÅå╪CN╪p v¢Hε≈─iτ₧╚■U╗-]
  49489. û_h'Üí╦(fxz╟kƒ⌡PjU╦Ωì^▒ç█'¥ L╟~k¡Ö╧╦}╖{τ⌐πChw╨zN^@╠!!Ω%╛│₧#;√╥╜ºCª║ÉΩ>DΘ    "ò,w¼AF;W±*⌠╢┌n8▓Ko╡ë║+rπ╤■▓Z╠[xK3Ü°±╘í±:╞¡í~Å╚ÖNÑQ`'B·ú¡K⌡Æ╗╚B─µ-
  49490. ╥(."∙ån<Γ╘#/Ö▀}¢▒0╘Ü╬â_ÿ鬫uÿAuû<Fr½Ωc>g░·ßï⌡e┤zRiRêßL√■°╝æmvB?è═Sr═êΣ~ε(J/╕²σΩ?zñπjVgç╣τôIÖó╫0│ *4└÷0Ñ_┴╝Q║┬█▐yUfm/╕▓Θ╗Iπ█─╛ÄQ▄ß─b╣Æàe·l5▌╞┐φ╛H╧╜+Ωÿ±e╥rφ╕▌≤L┬∞I█qXo─0HD(Eÿ3┬Y!
  49491.  
  49492. µA)'9░è;╡╣╝?æΣ╥╪▐ ╟╧╨¼ß E¬╡├_v[U┐εWºMM<oOV+B╢ªWc4N╖ykΓ╝2√╬R║≈▒æσÅÆ4Nap▀«y+ε┘╒Mÿçz¬.▄ö∩R]:Σ`▀▄@▄V|⌐@`⌡ºφ╒Φà@½S╙█òi¡╒RWí.HΦéY╖╠ZδGo╦Z╘ß,uⁿ≈j═R^╒+å╬éTd╢╝δñá╜·cx╝≤▒!
  49493.  
  49494. µA)'9░è;╡╣╝?æ≤╒ ▄√┼╠Å■≤âfm£ƒσHP%<╗╞@₧IE>k+(≤ÅKg2JπqV~¬ñ$║╔P╕º▓îΣÅà4Jk ╩«b"╛▄╘LÉÉ|¼F▓=Æ╝EG x╜B¬≡z╕gGÅ^pôƒ╞Γ─»w╞`⌡≥║qó⌠ZA¼t oïα=₧±P≤Duî~╬Vπ?dΩ┬v╓y┼╢┘ìAf▓║²╛⌠¡┤r]«áóZ~m3&"£≤"eV╚╬Ö▓`9WD╒àc╦[ Æ░╨°æ ì▓ê╩Æ;ºú┼ ┘;K╜l∞
  49495. f⌡╣`├e∩    Éùû£╦[█└─⌠K⌡$·j≤4╨Ω²╤U%]>┐w║∙mqÖ1▀M▐ DlÇ a═ <≡,R▄º²Q09Ot┐╓╫╩AFü±Yj╕±L▀öæC₧80U├²!!Mⁿ·æ▒Ü⌐╢≈÷╠Ä┼ZÄY┤üwW3ÉÇÇ√?╣8&▌ï₧φßB┤╙l«Ä▐[è≡≈s├-^dεΦOεAÄ╠2ÿ»▓PñÜJªx@ε├╬¿@┬⌡£8╓åX╓ªt4»µ╦∙ÉDM╪?/Ç┌⌐#Uó⌐≈L¿⌠ëlΓτ Σ(t╜█zM°:P²⌠¿ε═k╚!!∙╡æºö≤<byΩGNLî]÷Φ╔I░█▐Ñ¢-]
  49496. û_h'Üí┐U!
  49497.  
  49498. µA)'9░è(¡Ö₧%òΣ└╡î ±Ω√¥╓Ç``╥╤⌐9CZ_─à*W╫kUVyΓä^X&1]ólCo░δ&⌡╠á▓≈Äσ└ Æ`{n┘¿d=áë─\[ûÜp¬┤d╨⌠TU╘J╝·|»a*∞.╘ç╬≤┬┤=╞`⌡≥▓r╣⌠EúnJ'ú╫█╦WΦE═R▀H│.n≈╙y╦Lg╬8±╧åHq░║≈∞á¡φwS½Σ≥ aTa'âφpxAV╞└₧¿Vc|TD╙é'╦Yÿ░╝╥òcß·ö▐ƒ:⌡≈╞I╠
  49499. 9⌐ΦOuß░e╠-OπFèëû╬╥MÅ▐╩Γ ╢Z╫ê╓Γ⌠┘ZThX+L)∙8ù┘,höÉ\∙OAwÅon╫╗4┼? ∞ç▄t!
  49500.  
  49501. µA)'9░è(¡Ö₧%ò⌠└╡î ±Ω√¥╓Ç``╥╤⌐9CZ_─à*W╫kUVyΓä^X&*@┤1_o┤«,║╔P╕º▓î╖╔ ╫`V.p╚│}7╝▌┘XÇ╙`á@ótƒ╝UJ;≤m¥█]▄@m∞4╓╥«£ÑⁿU╜#╝┐╢O,≡▒VVÑu~î√}Ƀ~ΘR8╔Mܲm=╪ U╟Vf╧;ƒ▌ÄA*≤¡≈≡⌠í·iR╛áí`EAtrπ`è5hX_█ìäÑl.DY╫ä!!ƒ ÿ÷▐¬±`≡│Ä├┌)╜Ω╩Å6R╣<Θq[óÑfÇnTΓèôåì╦Üû╞τN°R$╡+⌡;└ºò╡sKl[F9┐u■¥@°
  49502. îK╙PbæMeÖ≤:τ$$Q═äαE/Dj▀╨êÖE ╡═Æ╠j!
  49503.  
  49504. µA)'9░è<┤╜à'Ç∙└Ω┬φ▐▌▄▓√▒Jw║¿╘!!Γû7DûKAj#tn≤ôMcfNπnFd╢ó- ₧G╝▓╣ì■═₧`G@ze╔¿-;¿ë╬\MæùX─*ƒpÇ∙\J,αpû╤W▄l{╕fô╗τ ▀░r£ù┼═uïΘCA¼syÄΩs╫╠µ<┼R╩÷m&╟╙j╫G)¡U╪╤åP|╝¬┤╛≤    Φπe╢ε╛BbC[t3Üú8x\▌▐╩¼\y4LHÜê!!ƒUBé°╘°δsσ¬æ╚êS▀è└Å?R
  49505. ▓h∙r^ß┤)╔~Φ    ¢Æ╙▒╤GÅΘàτF≡R=┐fπ6╫⌠╕▐{Z)°:û╗mjâtûHƒU/    ∩isâ╝!!ú eX┴░ΩT%zc=w┼
  49506. ▀╞┌LFäµO)▓±MÜ¢ïû;=M█░*8ò,â⌠ÿ▌⌐¿π┐╧Ī5⌡YαùPF!!▓æâ╪9φoc ≤▒┤Ä╠11âÆ)τä±@íδ╗*éSu~C┼╛æ*≡²wà┤ÖMäÜJ¬;_ε├╬╚:⌡Θ₧?¢ÄIF╗ΘOw!!ª≥ÿ┬å<IP╧48╔╡╧Orª¬ùÅπÉo½╧√>5«▌|IΦ7A╕┼┤σçµ<░╤ëÅá╨E╫kæN╝╕√Tµ¥îªÑ-jÿHUfë║┬A/╛cì┬J+RF╦Äß╩√σa¥$╔9z╕╦╘ú₧mÅ╥≡Gn0ÅZz'÷; lºª╫ ,┴╥¬æV╣σ╤▓5X╤5æ/└AO&T┌?╣▐≡nX▓ZD¿H
  49507. £Å2l╝╛│ß    ²B~@4A⌡}ö├²▓≈<┴YÇ╚¿╠²"╘,C7Z▌∩▒╝█φ┘^╪ßIµ/&;⌠ìh&╢▌ZÑ∙Z╗ïD╔╘CÅÄïü½WT╞ r■,.BÆ$C
  49508. ╧╬nZr#√│«√Σx 
  49509. Do╔Γ1ú║▓W≡¼K<DC≈!!ÜWl9¥æ°*║s4ñτ∞Φ2WδâRd²╒éq▄D╠∩▀.▒;nö±1╢\═ñ╪¼,≥úNg&kz╛τº5¡B√╬╣!
  49510.  
  49511. µA)'9░è,⌐╜ƒG∩VúΣ²┼Φ╓╦╨■┐σtF▒╛╥zgM╙è'âZW>.VV∙àg5\¼Zk╢«$║╔Ká≈úû≥ÅöqWkrö■X├ú⌐JMÖ╙{╟*▒x₧εP[
  49512. ⌠jï╫TÖgl╕2└¢┴ └⌐gæ9Üêç'b─ÿ>Cºniâ√6²╨SδD,╪V╒╟(rφ!
  49513.  
  49514. µA)'9░è(╢╝ë å<Σ╟ⁿ├∞ìƒ╘░╙¥~F▓╣┼iWME╤─)@ûOT#`\    +°á&tc2G¼x}k»«MÉ╖0║╛íƒπ╩\S╫S[kr█¿hr»ëâOIÖûVt¡@│nâεI*ípù█ÿGr¡0╟╥╙Σ├░vÜå██X&¥┴~`¥V+W╖╩z₧▓5ÄE*▀\╚±(e╣┼aéVf┼φ²╗iq╛¼²∞─╗≈>╕≥╡`HAE&åú3rJC┌▀Qî«K-(KIÜæ=äJäΣ╚╒ûφ⌐┴╔ƒ-╢±└ ╩w     C¿t∙O(~┌£l╘eTΦ(ƒîû╨ƒIë╤╨δG·~°ï^»ÄΣƒG{H]}φZ∙₧>`¥2▀O╠ DPw▄ [î⌡█' Q╩º²s4)IYw┼,▀▐╠A6Æ∞L/ÑδPó█≥-╖d+ULé≤%öbÆΘ┘╞ ü┐ΓÑ╩î╬▄╢àIC!!Θ╥åφ+íqcB╗àÄ▌└3w¬╘A═ßΣUúⁿ∩i┘0ò┌√Ä≤>ÿóÄ@ÿ₧F«b_R╓ Θ¼C╕Σæ,æé^kï▌f`-╣Σ╘╩îC▄;'╒▓ÿ'Vó⌐²X╥ï÷Qº╨5H°<=┤╩DZσ+c²╨Öε╨V╪;╖┼éäá╨JYâ$U┐d╦²═E°┐╔╖÷'GX┘OG4Éíû&fxz╜gò╟}àô╤6╘√σ ╧]÷vc┤▄▌▓'╤bjnδ╣ΦCS9╨.|XU└;ú├╚â6,╧├╗╧(┬ë╙¡{^▀!!ò,t¼MZF╦
  49515. ⌡┐└>@»ZP║8X╙├T    Å·∙√
  49516. ╘[sI&F╓I╝¥⌐»τ┬ΦΓ─⌐÷$╪7ay#ûè╘Zε╥┬Æ9╪≤I≥(.?⌡äV░┌ÑΦ@ƒüD╚çA£═₧ä╜\╫_y■&)¥$!
  49517.  
  49518. µA)'9░è(╢╝ëÉ+α└α▐ñù▐█ƒ╩êVN╜╛╥_v[UÆô,SçOM$ij╫╣3\r.@ºRRgº╞Jô£ríí╢è≥ÅQ^░qP|a╬╣-3εè╓XDÇ╔Vx╗W╖iƒ╝W@x⌡lÜ₧]ÖDu╣ (ôé╤∙▄Ña£▀╙╖U<₧╪s{öA&Nºªs│╡6πD<╧M╙÷)!!√▐8╓JkÇcùΘ¡gPû¥█áá║≤uQ╝εªD@,8a.╬Γ7t[╚╩çñWyBA▀┴3µ0kà⌡▌╛╝`≈⌐ä▀Äd⌡╪╚ε=╣n╪
  49519. g\ó╕z÷lW∙«ô£₧┌ZÅ╧àτL≡Hpüj∩²╩²╦ImaD8▒6ü≡8hö:ïm╨OV#█ 1░╞{Ä`L█ºπQq9KY╙█└╪P¡µO9╢°L┼╒▄Q▀ -UXé∙"%<¥ÆíÿΘ0┐┐²░÷┼ª5⌡LíûBS0α╚╥S°>┐kh╗⌐ó╟╤:Bâê)ªà¬C±»╡DΘ)q%
  49520. Æ▐≥T╖α:ëττ    ╩ÜIé2ùí¿┼╨²ò~ùòM∞▒p
  49521. ½∙▌╪╒XV┘.e¡▌¬^=┘╟√^±î⌡F½╧#Θ7n·¥bIµ.Aóƒ╫ï┤2╬%ó÷ò┌╠╖v/R▄|kïH╟⌠╠Vδë╦▒│&],ÿVC}·╬δ]├≡╒Ch
  49522. ƒΩì^▒·ß9år'╝`╝┴╟û╩Prc╝√úO2₧.uOéh¬>─╦■^0═▐╗ÆW┐┴▄│5 èBs╤@w½P\V╠(╣╜¢sj╤55╒vÉ║u≥▀ⁿΣ@ÿ-T7Z°aöè⌐α∞;âσº,╙á≡"┼.v0Φ∞²M⌠Ö∩ñÉ¢wv` ";;╠¥nG«┘_Z╢≥xå»L┘æ\¬ÆMë┼«^╓ <.Bƒ1_╒Übyv`╝»ÿ╤ĬO_i8▌⌠K┬▄ü~▐ⁿ)xCµ;╒v╒ä¬6⌐<I )'≤«úêQ=╢δc=M■┬çyêq┬ε╙ª*.^Å⌡2┤▄Ç─╝w┐╡YO-%z⌐Θ╗&¡Xí░εlÑéS╥≡Ö▀δâe·tà¿╨ù─I╪ ╬î≈C█j≈√O└ΓE╩╕╜!!)\l⌐VM>÷3┴}&µpM╜t+U∙┬É>l√▌▄~⌡3z╟v│√ú5ñ ~)Ië≤≥ª²τ,GΣ%î~╒(FÜC└⌠<O║I½╕  ┬▌.z╣╜ ╤%ú(UU│ô╣÷DTº.2íß√τèd▀cOΘ_éQF?ja≡φ;╡!
  49523.  
  49524. µA)'9░è(╢╝ëù0±╤²╪τα═╘«ΓáAP╥╤⌐3`MZ╘─8GÖ\P#aU@+≤ìZr|ÿ&Vkíú`µ₧G½┐≈ùΣ∙éqnap▀«y+ôÇÇ]G╧V■|╟*ì'ò Yxî÷╖0Çy⌐4▄ûφ≈┴Ñ3ö`⌡≥·½σ_KªN vç»iâƒLΓM)î]╧ )Lⁿ╙p═F@┴2┤å├Au░ª╕·σ⌐ßlHû≡ªkGY<rê ∩5?":á~ñïóQ-5P|╚Ä?¼_╓¥╗╤òì│ç∙ê+░╣ëdÑl^b{jçq∙|Pµƒh═hφÖö₧ï╤\╕┘╨ΦV┤OpΩ+îY¼Äæ╢s/`I2[(⌠m╙╠>`¥2▀I┌DPbÆeVî≈ µ+&_═▒ⁿX#`
  49525. ╒₧┼╦EÉΩR-φ┐DÜüùH┌9]E, ¥NjT°₧²■╙┐┐½÷ªßó6⌡1╔┐HS0¿¥ï=╩'¿"g
  49526. ⁿ½╜╦╦+RÿÅ"│╚¡@Σöæ@Ω)^dÄ╒!!εU£╗w╖┤╕Xî█@ª6é╜ó≈(▌σòâôKεªU$!!½≈╨ïé PT┌3%╟φâG9▀╚±N▓τælƒß!
  49527.  
  49528. Φ@+;!!,╢å0<«¼ƒG∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3IÄù;CéZJ)k_an≥ÇUc@»pVi╢ó/⌠Ç«≈₧║█é
  49529. Äx[@ot╬«d0╗▌┼J% ╙z╝óuòAεTL 1≈aìɱ(╞i ôô╫Γ▐│3ö`⌡≥Æh╝Γ  nÆΩ!!₧╓[δ`;╪M╙µ9dΩë¿+}┼3╖£èWPª»⌠╛ìl┴¥iZì≥ºX%}Tr ¥JΓ4]NC▌MìVÄ┤Xa{~!!░ΦFé\$ùⁿ┬╜ª!!▀╫δñ≤Wªµ┼Å $*│q²}P∞Æf═}Z°£ìû╬▓"≥┐¼ÅK≥&"»n╗s■µ∞╦U)NM≡$ç¡m"₧8ÜO╩ NObÆioâ╝▐DH6í▒Ω[7zC
  49530. [╬█▄╩Mîµ#▒┘HôåÜ₧9DT╤░%9╜mä∩éÆIó╡ │╙ƒ╬QÅQóê@ε σz⌡+╣vt û╘!
  49531.  
  49532. ΦM#w_Qµ«<:¡¼₧jæ7Σö╞σ┌ùù┌¼▓üzj¢≥ÇtuB┌ü~@Æ\A#x^A,╢êMc4IóV*Ωñ2║┌K╕╛╣è≥▌öqN,░╤[É┌┼UN╒åq!
  49533.  
  49534. ΦJ/'1░è6»ºÅ>î0∩╟éªùò∩╟╖ΣñGF ÷ÇZ}[A╫û~S╫W/NVe ≤à,\g"NípVI¡º, ▌V    º╣Θ▐°╔\B▒Ap#JEΘƒ3!!ε═┼JKçæ{⌐óuòAæ;&6Θaì╫MÖF4í(█¥╟σî»u╚ù₧╙n
  49535. ¡⌠^RºrD9∩à^┤╢CºC.▀ZÜ
  49536. ₧G√╞k╟4¥ó┘ÅB4á╗Φ√≥/ªαeN┐ß▒L,<5d3¥ú#_F\ë╦%ÿ┤\7|xÆ╚╦S░±▌½∙;ñüâ╠ë;⌡σ▄╠>≡<■gZó╕g╚hIσ¢à╡¢╤KÅ▀╩ΦQ╔!
  49537.  
  49538. ΦJ4
  49539. 0;░Ä0%┐Ö₧%ò:≤└µ╔φ║╡╝ⁿ╙½@T║⌐Ç'`MG╟ü0QÆ[v/o_Ri≤óUj#L╖u\dⁿδ/ⁿ₧t!!ÜôÆ¡╘Ç:+╣Wz%]C╔ⁿX╟═┼JKçæ{⌐óuòA⌡_\=Γp₧▄UÖd╛,╓Ç╫ ╔│3ëîöÉu║⌠S╡is┬√;█ƒMΓB*┼I▀╜m!!═╧q╤/⌐3╕╧ù}╜¡⌠δΣ╗┤aP╡áóuCGo7¥J⌠9rG╩├Qêñ9BHÜÇ!!Å₧∙╥░╝`÷┐┴├ò*⌡ε╚─3fxj╜o╝{Q»│{╧zHφÆä▌╬ΦM█╪└πF┤?·b∩0╔≥ⁿ┌ZRaJF@3Γ'û⌠9dô8Ü~═QGqÆie₧╗:σJ$P─╧à>84Bl▀█╓ÖMöµN,╢ⁿLî█▌*┤AR9\Q├■78â,äε╚╫╕úß│ïùª5⌡Y«ùRS6α╚╥S╪/íd&■¬╕┴┴,1䃠óïΣQƒú÷iƒ}wöπ≤P╛Σ#╠ª│P╨█|«x¡ª⌐Φ'┬αò=éåH
  49540. Σ⌠k0ù╔ûª pBQ┌?9╘«╙O|æ¥╛YÖΩÜ)Q╖╠6┴  ┐╠rIΘ>
  49541. ò«╙▀╬N═0▒ßëæñ¥Ur╨hc1≈5∩■⌠U∩┴îƒ╕;^ïf+L■═ïn-╜g├üyzÄò≤.╚δá2╙ ]╨zz╕█▀ú'╠~nj⌠»φCo{╩O4n]W╫!
  49542.  
  49543. ΦJ446ºè,«íâ.ª>⌡╤Φ├∞▐┌╞Σ▓ñqL░╖┼z}%<╗╞@₧IE>k+.°Æ    \tfNπ\f««#ε╫MΦ╕▒▐⌠╬É{L    ksܽd&ªë╫QAû╙{╜W╖sô╝BF=íiÜ╩QôFg∞.╓╥╫∙îóv╚ îꣻσR@∞ >sç»o▄╨PδD.┬╖|Ü,s■╥u╟LzÇ6┐╪èGuº½δ╛≈¡αhY½áª%ETc5üΩ#1NB╠W╦ÿßX-,VN╓ê,╦U╓α├▒Ω`≡┐┴└ƒ*╜∞═Gìh]fxjá< `|ε░z╙-Gül≈éÆÜⁿDÜ┼╓ª⌐R#┐gτs╠Θδ╦HjJ+L)∙8ù╘,qö3É\╞;MCpò.τÆ ┬7]╤Γé=XS]j▐@₧Ü┌Eú∩]9ñ┐G₧ÿÜ₧?=\FQ╦■0/ùmö■√╙⌐╜■ñ╥Ñ╩RÖ═ε,?3⌐åçIïb«cr;≈┐ú▌à1p܃vτ¢⌡XΣ°ε=îgu9.å╟√Oï°ì¬╕τ±.╩/ï≤τë(≤ ƒ2ôåDFΦ▓;v1»«ÿ≡ûEg╞;8╙≈╙X5▌┴ΩOíªòodú╨ ▓n╣▀`kµ:Wδä¬⌠▀W╘6₧╝!
  49544.  
  49545. ΦJ446ºè,«íâ.ª>⌡╤Φ├∞╬ⁿ┘┐ß╢>)╓∙≡iz^W╞ü~╫~J9y^A+■ä^Zj'\░<\lΓª%ε╓MΦ┤╢è≥╚ Ä4J.b▀ⁿx!!½═ÇPF╒Çz¡J╖iÖ≥X,Θ$Æ█MöMp┐@;╓£╞Σ═┤vî`⌡≥æeO║∙R░e    ~ï∙6╠ƒYΦSo╧S█αmr≡├}éOk╘7╛╪É
  49546. 6▐─òöë8ï█Mu╖⌠╖dEPKk7Ü∞p[U╬▀⌐¡X~/!
  49547.  
  49548. ΦJ3'>Ñî7
  49549. ╗╜ë-è-°·ε┴√║╡╝ⁿ┬╖ZU╛»┼;>w▄ù)WàP"k]j≤┴_&2Gª<@zº¿)√╥¡ú┐æ≤ÅâqY|yÜ║b ε▌╚\£çg¿B╡x╨∙BLπa¢│3⌡V|⌐@.╓æ╞ ┌Ña╞O≥±■fÉ╢tkÅ #uûΩ!!╪▐\ΓRbïÜ÷!!g╣╔y╧G!
  49550.  
  49551. ΦW!!7⌐Ä& ╡º»%ê/α└µ╬≥╥▓┐╫░ä]P¿╛╥;d@S╞î;@╫KL/.IVh
  49552.  ùK&/\πxVyí╣)°╫LΦ╢╣▐■┴àr_k ═┤d1ªë¡3!!£╙9Yïùhä±P[7∩$£╤TîC`Ñ0╓▄â┬─⌐`╚    É₧ÇrH║▒ZAúnJoèε'₧╦WΓ,└^╔₧G⌠╥k╓l┼╡┘æMb╢¬╕°≥    Ñ┤Ix░≤ó fNKl'¥ú8p[╞┴╩┤Jh/M╧ò å[ƒ ▀╒ûτ╡î▌¢*╝ß┼ Å.≥>æe5ïÅz┼a]¼èòüç▌]Å╙╓ªKτ3%«d∞2╤ε≈╤9Id_]4≤;ûÜG!
  49553.  
  49554. ΦW'1▓è6D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ¼╚~g@S└─*ZÆV/m^Z}
  49555. Σ┴XufMªy]*ª«2≤╚GΦ▒Ñæ·Åÿ`V| ╙▓y7╝╧┴ZM█T■|─*ênò·N,≤m¥╦MÖQ4»)1├₧≈∩▄Ñ`╚S▀╦!
  49556.  
  49557. ΦW44╔σ[k¢ºƒ=Ç-í├τ╔Ω▀┌╟■µ¡V¡╛├~z^S└─7A╫[A9mIZi°å^X&%Z░h\gΓó.ε█P⌐┤▓≤¥ª ₧wV@je╚╡{7╜ë╞KGÿV║2|╜S╖iô    ╝PAx÷lû▌Q▄Auó@>╓╥╞≈▐¼j╚ì█ƒ}½£=-áouåíq│╡2ì(▀Z╓│=h═▐h╟k`╞0±╒É`a▓ó!
  49558.  
  49559. ΦW!!=¬£;+╢¼ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVjgHo
  49560. σé Pd/Añ<R*ª▓.√╙K⌐╗╗ç╖╩
  49561. ÆzM    ll▀ⁿd<║╠╥_Iû■|µJ°x▐A≤_JI/Θm£╓æCm∞8╫╥═≤█α~ìùöùoO» S▓rkç²'╫┌Lº@;îM╧╛9h⌠┬1î¬R█╡╜Wq┐¿╕ ⌠║²bI¡σíJ vcMc<¥ß!
  49562.  
  49563. ΦW:,½î=%ê¼¥?î-Σ╨éªùò∩╟╖ΣñGF ÷ÇZ}[A╫û~EƒZP"kIjOµôMi%@»<@b¡╛,■₧@Φ░▓É≥▌
  49564. ÆparÜ¿e7εΩ∩t£çg¿B╡x▐Cæ;"cQ▀,î█UÜs⌐9┴ô╫ ├«Uä ÿê╙}ó▄VW⌐:J_çΘ:╨┌o⌡N;├\╒║m`≈├"éy}┼3╖£èW@í»√√╧ñφ R╢⌠Å!
  49565.  
  49566. ΦW *ºè_C╙δ¡$û(Σ╞»█÷╥╦▌╗ασGK║√╥~pM_─ü,₧L.kHPy⌠ê^&'Σo\░¿%╜₧K╝▓Ñÿ÷╠P·7!!.s╒⌐1½ë╔W\Éòv½┐n╨≥@,πkè╨]▄Kz╕.╒ô└≤î┤{Ü裢<ª°TLΓa;ìφ9█▄Kº,EÑO╧ $r±┬kéGx┼1Ñ╧═]ºε±φáºα U┤≡╛`HAbrîú8p[╞╟ë╡->VXÜâ6╦Sà░╥┤⌡dΩ«Æâ≈T▄╫┴▄E>Rⁿj∙mτ⌐y┼cHσ¢┴çï╠\█┬╩ªA⌡3»gα'└½╕╠~JFJ<≥?û╖$q╤2É\ƒ@Vfö u₧■{Ä`Lr╟╢Ωq
  49567. X|╫╥╦Ö@àúH%≈■    ô£ÆN╩-,YOé "C │ ╫Φ╫╟»┐▒┐┼ƒ╬MÜYúüV%▓ù╧╟'óqrXû╘┘╧╔(pÄëlúüπD¬φ■;àAs2╔æxû-≤ê>ƒö▓AÿÿBπ1 .èÑτ╚/σΓà;╠╟qkï▌fm7Ö√═┘ûùz8┼╗┼
  49568. (╥╨√fòΣ▄jMí╨2√+'·▀zQ┘:P±╫╝°çµoá╡î┴ó¥ II╦g rÉHπΩ╞F∩êî¡╡$\£HfäíÄn6/]├≡ K\₧òΣ2!
  49569.  
  49570. ΦW87¿â7*«áâ$ΦUêû▀▐≈┴▐┴╗▓Φb▒¿╫~aA┌ü*ZÆM>f^y
  49571. ⌡äOc4½}@*á«%⌠₧F║╛í¢≤Å ÿy`o╬┤h ε└╬MMçÆpα█²kòo=φb▀╫]│DZ¡9ë╥ä╔ΓÑd¡èû╘<¿╨UWºn!!┬╘╪▐S⌠DàçV╫R╔ε\²lK≈ƒΘ«)!
  49572.  
  49573. ∞A3:<çÇ?$┐ºÿÇ,Γ╞µ▄Ω▐╨█╙ÿ╠m▓╛╘s|L▌é~FƒZ    AvdⁿäM!!!
  49574.  
  49575. ∞A3:<╖ΓX@°êé9Æ:≤öεîó─┌─½≈½PF╗ë┼zwIT▐ü]¢SA)zR\eQ╢Ä:zì_wOæê~Θ₧F╗┤Ñù⌡╞╫`V.░╒`7║┴╧][╒òVaªF÷oò∙XY *¡$Ü╞ZÉWpÑ;ôô═∩î╖{üù█¢}½▒UAºnJrîτ6╠╓KΓEaÄ2░{ÖD_Ω┬t─h╒1▓╚èKzáεⁿ≈µ¡µeR║σΦJ`JSKo<å±$tKv▄╬â«W~!
  49576.  
  49577. ±V.!!╢ê'$┐ºÿp┼>∩±├Θ╙≤·µ¥▓½RN║┐Ü;r{B└ì0U╫PJp.Zc~ΓÇUc[▒yRgΓ╞Jô▀L%äÆÜ║╥ⁿ?^₧gqzi╒▓l>εñ¬0!!£º`½÷Fæ┘}j$─W╝₧V₧Hq»▀ô╨σî░aüï┤âhí VHÆazÅΩ'█═º@!!Θs ;╫R┌çw╠.┴ñ╚ùEv┐½╦Ω≥⌐∙]1╙ë█CGYch╬1Γ'%e[Q╦╚"₧│\l1B▀Ö;╗O╖ⁿ▌Γ╝`╫«ô─ö9ê!
  49578.  
  49579. ±V.!!íë3<╢╜í/æ7ε╨╡î ±Ω√¥╓Ç`` ¼╥zcX_▄âdûQeC^Gc≥»Tcf@¡&kÆ╛4ε▀@ ¡äúî≥╬s²B@`a╫╣-.├ú⌐JMÖ╙f╜Fñi╩A╟PA(╠aï╓Vÿluí|╥Ç─π┴Ñ}£.ÉÄ¥hO≡▒y∞`îε>█ƒ║<╔S▄V±8h⌡├U╟Vf╧;ƒ▌ÄA.≤»▐╦╬%î╤S∙Σ╖ pJA$v&çφ<b▌╪─╠3tPI╓çoê[ ▒⌡▀╜ε`≡┐¼╚Ä6║ττ┬3QR╜q∙F4VΣùh╠~^╢FÑ┐¥ç╙u╒╗»ÅL⌡5·{≤:╦≤╦╓Hh[[8▐9╔╖,Uä ïO▌DqwöeaÇ╡Xëc$l▌╢√V36O*j─▀▀ÖG╬Ä6Cñ·EÖ╒≥-╖E(BI╓▌!!5₧h┤⌠╒▀ ó«┴ñ╬è╞]É]·─DpÄ▒½6°    └q⌠░ΩÄ─dâÄ-Ñä⌡g╢ⁿ·$ε*^öπ⌡Vÿ⌡2╓τ╗UåêBφUuiéÖ▓╒=╨≥£;ÑôXα╣bM├≈╩▀ö
  49580. )áSB╬▓█^ ▐╘▀FÉ╝▄.fº┌2Σ:t¼▀x]∩(∙╓┐í═Z╬&ª±╨ç«╧_GP╒$KèUΘ÷┴KV·Ü▐Ñ│<Lèh·╬δ{εrï╚LNƒê└2╓├σ/╒Iσv}¡╪▐ñ█^p5ª║╘Sh#ïL6xyF╫*∞hτ╠²^-═╩⌐Γ/┴ë╣»}VÉGN·DoÑAc1G╫$²æòzkⁿ^zëV<¼ïCïöÖü╩[zG)O¡1Éû£6ìµ)╦Θîm╠á₧MÑQ|,╝ΓìLΦê«·\╬┼     ≡*mBûßDhú╪!
  49581.  
  49582. ±V.!!íë3<╢╜í/æ7ε╨═├·╬àò┐╘É}`¢₧≤X3_D╙ö.[ÖXjoUrS"≤òVbN«ye¼±`√εW╝╢╡Æ≥ⁿ ÆuS@
  49583. │á-3╝╬├IçåpáWÑ=¢σF@<≥$Ö╫KÅV4Ñ8┌æ╞σîíaÅÆ₧¥h!!»ⁿRWΓ|gδεδ±|├d∩╥α oΩ╨}╨g╞ ú╔å4ê»╚δ⌠⌐÷lYè⌠áh[~&╛≈Mp5qmçzºxïæLy(BN╓äƒHù²æ╢∙y≡èö┘╗2╣╣ëN▄;UM╤òqF⌡╛{─~╢[▐Ç¥»τe₧┬═ΘF┌=┐+Ω6▄≡≈═U'"l 4 3Ü⌠(v╤n┬▐`zNâthé Γ ┴¼δ^2?YW╝s▀└▐Q àφH9≈Ñ▀ö╣r≡us2é±6(£iÖ∩╦£c╞╙≡ñ╠₧╞ZÆLÄàHS7α╚╥S╩$îZK∩╢┐╩δ>|Æ┌-╡ÅσY¬φ╒(ÄEcy`φ║εGÜím╤τ╝Z½újª,ççª╠,æ±é9âèO⌡ùq*╛║╡íⁿXV┘.kÜΩâK.╠├╛┴ª═'/╚╡bHⁿ!!n·▀fOΘV.æ¡╛εç░_╩£∙║√╪ETÖxN6⌠5Åæ╞N∙Åî¡é:\├} ₧╢æ|KHNεdÿ═QROéü┴6╘²σa¥$Lσlz¡╪╤¬φeljτ╢ñEn#ïL`=oïBç └╚û+▄╥«áN«╙─¡j^Θ    "ò,║EO7VäFô┌≤n5╡LL░y╥εvkπτττ▄I*Z}≥pÆÉ⌠U═ëT¬kä▒|└ª÷iíRK'∩µ▒_╝±┼æ9óƒ 3=√¥wc¼┴_Z ²K╣ùD╒Ç]╬ûJ╨┼τW╟y⌠;}çjC┬ïC.:╨¥£╡µgíN=@╔≥m█▌▐0ìîO-gΓoÇSWc▐ëúrN╟@-g(=τ⌐∞╒.@▒∩m7▌─£r¥J■!
  49584.  
  49585. ±V.!!í¢:&╛≤╠+ú
  49586. ╧≈╦Θ═⌠ƒ┬¼≤╡CJ▒╝Ü;rFwΩ⌐;FƒP@oVV+°█^XV3[╖}Qfºÿ4Φ█C┼▌▐▄╟▌û`[@# Ω«d<║╠ÇX¥ö8óFáx£AδCN(Σv▀╪VÄ`ñ|▐ù╫■├ñ3îîÿüu½⌡)╚    b┬√;█ƒ┴t∩{ %╨s-╣╩}╓Ja─╛╥ùK4ºª²╛╝╜αt]╗∞╖9wCT8rÅΣ=tADçzºx╛⌐P~|T^█æ?ÄHBù≤┼¡²mΦú┴▀ƒ*á±╟Å?R│nε
  49587. wKóÑp╨hπ▐Äæä┌KÅû─⌡√ ╡xΣ7à≤≈ƒw,N    ├á┬Q╤7ÉJ┌Vcmòweƒ╗4φJy}≡ÅΩC95N7█ÇÆ╫E ëφ[jú≈L▀àìN╨8=T|¿Ö))Öcô╖ÿ▌∞┤°║ïé═ÆW«üE,»çâï(¿"a⌡╗ó╧╤:u┘╪A═σÜ=Σ⌠■=ïOt è╓Uα-≤ê$ë½╗ïêTª* Z├ƪτ ╙┤Ññ
  49588. ≥Ö
  49589. p,Ñ≡σà°s8I╧.#╧│φK1╬Çñ▄⌡ÖeDΓ▐&Σ*┐╩|GεE⌡┴αí▄}ΦÇ╤╡▓é¥CZ╪qO▒L≥±╧IµêûΣ╖$Z╫6,O⌐∞æmS¡cùµGjèôΓ▌·Φ4┘1L╪|jπÖ▐ú╓~zAτ╢ß<Zα'StLf╫:Φ?Θ╠²^Wí²óºVú∩╘ænR─sY⌡KnÜ\I:R╦>δ╢╡p]q╜oI¿lèó;S≥∞⌡Θû7z'NI╟dàî╝ ¼µ╫ΦúaüªßiíRK'∩µ▒_╝î╜±^▀█ ■# ±àh╢ÅEæ╔w¥ª6r°╘AÇ═ï╡║M┬v⌠)û1Hr½ΩcDra┐┤ÿ╤Ä═#Wo╞⌠G╦─╙1¥ÇA1.Γ]∩=qF°▓╔rN╟@-g0!!╝∙²∞5S «n5,╓²ïcöH╟╠█'┘OWΘæ0┐+ê▒!!┬╝b│╡YS7m?╝στL┬%å┤ëÑïN╤<σ∙uï!
  49590.  
  49591. ±V.!!í¢:&╛ïâ.£eí╒╔∙╨⌠√≡ì╤σDQ╛½╨r}O Æà0s»rA>fTWE√ä^Vh|óLF~╢¬"÷█q║▓╢ôÜÑu\ºfWot▀ⁿ r₧█╔W\╒¢5úB┐s╨≤UVI7τ$₧₧öKsñM0╓ä╞·î¡v£Ƀ╙z╝▒CLº ~ûτ<┌ƒ[ΓR,▐V╪≈m ô«z█z╚:±ÇÑqZÉè▌═├XΦ⌡r[¼φ╖)V
  49592. j>çΣW$yJ┼┌\åñOh0A▀ò'ä^BÆ⌡┬╗εhµ┐àìÿ'⌡≈┴ óo^W3;æyΦ{[╠░d┼3φÖö₧ï╤\╫û╩ΦV√R$▓nío╒≥∞╦DeJ5]/⌠6₧⌐mdâ3èC┌U ∞    AâΦ"µ6╞½π%5
  49593.  
  49594. k╞
  49595. ╠╫╩WFçµR/Ñ■]ûÜæ╤*x]E╩  O}ö`ä■ÿ┴ á╝┐⌠ªßª5⌡f│üIPd│çì╟+╛qTΦ«┐└╓6s₧û%│æ!
  49596.  
  49597. ±V.!!í¢:&╛èâ'ê:∩└╡î ±Ω√¥╓Ç`` ┤╬!!3\W└â;F·5-9kWU+ΣêMK#[½sWI¡ª- ╨V0║▓╢ô⌡├D╫ux5@C■Ö^ε╞╬üüp║┐ná⌡GN=╗$Ö▀UÅG:┴jU└ù╧≡î░aüï│ûp╜σEM¼g)tÅΓ6╨╦º@    ∙q∙2╓B╣╚vÿz┴-╢┘ù
  49598. ┘╟δ√∞ΦΣrU╖⌠ôjaPK7Ü∞~\D╚╧ÅÄW7|WM╚å*ƒ!
  49599.  
  49600. ±V.!!╢Ç",¿╜ò    è2∞╤ß╪┌╥▄┘Σ▓ñ]bçû┼vqMD÷ü-Q╫PJp.Zc~ΓÇUc[▒yRg╧┴I─═G «≈ñï⌡╠ägl}p╒▓~;¼└╠P\î!
  49601.  
  49602. ±V.!!╢Ç",¿╜ò    è2∞╤ß╪╬╪╠┴┐ º_Fσ√┴uRp{╫ë<Wà{A9m\eU╢Ç.Lr2NípVY╢╣%√╙/j┴⌡çî■┘
  49603. Æ4@^r╙▓yr»╟┘IâÜt¼O│=ö DB 6⌡eï╫VÆrú|╟Ü╞╢▄▓|ÿìÅè< ½ΓTV½b┬φ*₧╦WΓBª6å7╦d⌠┼}╨fk╙<∩£éVsªú²≡⌠JΦ√n¡Φ╖J^uSAg0é╨"tN]ùW╠ì┤Th2WÜ╡'éIBü∙▌┤╝hΩ╣ì╪₧;╪ëá┴w⌐q∙`^÷╕f╬-]■    ô┴çå┌Å╧╒π°¿j≤*ëºΦ┌Nh_    < w║╙%â1Å\┌ DLwçtié⌡u∞ eH└º»:[SZ q╞╠╞└FüφXj╢┐ZïöæC▀><C╧²!!)╤mäΦ╫╤¡«⌠▓ï£┬KöíæQYiºùü┘+╣gbX÷╗ñ╞╩;b·≡E∩ƒ°]¼╣÷(Ür2Mé▐ΦY╨»uß═╨>πêB»>_æá⌐╒╘ⁿÇ-éòCµùi)»·╠æ╒_e≥.═╡╞X╬╙²
  49604. ôΦ╞)CÆ╔'Θ,8┐φ`Z∩:I╢⌐╨ê╬^╤3πσéê»╔/TS╔aOçΘ⌡═B■┐╔º∞hH ╕ck#ܪçz/¡"û╧Vn?₧ô≤6┌Γσ╔H╘t ╘│║╡╥w>⌠▓ΩR]"₧AxD└;σj¡æÿ$*╔╦¡«Gäεè noÉwJ■IÜA\1R╥!
  49605.  
  49606. ±V.!!╢Ç"┐╜╓jä╘·╠Φ█Σⁿò⌐αñCS╢╡╟!!3IX≤╝WâWK.@Z^nO∙ÅDgZ╖hRh««ε╠GÑ≈│¢±╬    â[Ngo╘╜a!!⌠ë┴{GÜû{ε.▄╥1εXY,Σ$╥₧~ÖLq╛(╓╥╫■╔α~ëæ█æs ╖▒XBΓaJ;èµ4╓ÆSΓW*└█≡(rΩ╚jéDa╥Ñ╘ådííΦ│τ╝┤mY¡Φ╜BaCFt;îτW]&R╨W┘ÅßK    mo■ñ¿N╓²╘¼⌠nα⌠┴∞ö-óµ█I┴ ;Kⁿr≤OyZ÷╣f─-R FèÄ╙î┌₧█╠≥V±~°ï^»Ä╞╠Jo\?≥;ÆΣ>Wö'ÅA╤ H@jèitö!
  49607.  
  49608. ±V.!!╢Ç"┐╜»%ê2Σ┌√û╛╓╤⌠å▀á^A║⌐Σ~`K▌èdûoQ>zZQg
  49609. ┼ò \g+"╔@o«¡MÉ╖+║╛╣è╟▌░qJ#am╫╣c&₧█┼XEùûL5»MùE╜±SJΣw£₧VÆ4¡0)╟å┬⌠└Ñ@£ÜÜ₧'b─ÿ>T░io▓²<╬┌M≤X ├R╫²9Q÷╘l├Ol╠:δ£éJUïâ²≤Γ║╨eO║á╜X%Ger&Å∩e]U╚!
  49610.  
  49611. ±V.!!╢Ç"┐╜»%ê2Σ┌√ⁿ∞╥▐╪╝■á    ╛╡ßC^M[╨ü,vÆLGjaU    +╞ö
  49612. Mg$CªOGxº¬-ù┤+ÿóúè÷═ñ`Lom╖╓[║╚┬% ·p╢Wåhä ≡]IúEæ═NÖP4╕9ô╬ä¡í╩ßÜâçL║╨[H°  uú╫█╥]ΓS ╔L┘V≡!!`Ω╘\╟QmÇ4┤┼├Pmú½╓ φ≤Ö
  49613. 5╨ε╖USA*j>╘JñIpgN\▄ìîßMe9 ¥╞tµ0k ■╘áΦQ±«á┴ûd⌡Γ╟(≈(2«X∙w∞░d┼66åo≈Åûû╦xÄ┬ΣΩN«Rw²,í#╫ΦΦ┌Rp    O}σ?û╖?`Æ1ûX┌
  49614. !
  49615.  
  49616. ±V.!!╢Ç"»╜╓jä╘·╠Φ█Σⁿò⌐αñCS╢╡╟!!3IX≤╝WâWK.@Z^nO∙ÅDgZ╖hRh««ε╠GÑ┌▌≈╡ üuJ.-Üî;á▌ÇM@ÉV₧|á┤rö╝^II9í$ù╫^öx⌐9▀╥┬⌡╧Ñ`¢ì█òsεσ_AΓptÆó#╦╦ΩD;─P▐V≈(r·╒q└GjÇR█╡ü]4ºª²╛╝ ¥┌Cx£╙æTBdTRk7Ç»W3pC\└╩Q₧⌐\-0L[ùì*¥_╓²╘¼⌠nα·à╚ë=ºΩ╦ ╦E5R┤y╝SUg╧┤}╚b_┬ôä═π╡!!Ü─┬≤O±$÷+ε=╤Φ╕╦C)\)σ6æ√(Và&ÜO╥FCqüumê⌡!!¡JR█╡ΩE"zDrû╤Æ╩QɱY9ñ┐NÜ¢ÜU▀81_NQ═÷d8àdÿ öÆ á⌐⌠÷╪Ä╟Y╥═ε(<M₧üè═j╛wd≈┐ú▌≈:bçò"┤ü≥]¡φΓ!
  49617.  
  49618. ±V.!!╢Ç"»╜»%ê2Σ┌√û╛╓╤⌠å▀á^A║⌐Σ~`K▌èdûoQ>zZQg
  49619. ┼ò \g+"╔RZ╖┐4√▄N¢úÑ¢÷┬qt■Jl;╖╓[á╠╪MxÇ▓y⌠±?úΦ[=í#╪Ö±(┼9╦å≤π╪üäW▀Ü¥]7â⌠ZFºr.~æ∞s╨▐RΓBª6│÷5u╔╥lπNbÜ÷¢─dííΦ√≥▒┤oZ∙⌠║BwCVo$ïú?1[X╠WæV╤╠3UMI┬ò₧N#Üⁿï°²o┼é¼╚ù<░±φ ▄w
  49620. ⌐q∙`Ló╜h╙y°Ää╜Å╥M└╗»Å+·(«[⌠'Σδ⌠àZ7H1Σ2╙°+%à<Ü▐
  49621. FWnânt├╝{Ä`LO═«Θ!!(Cjµ╤┬▄VÖ└S'║·GïÑÉT╩-5RLÿ░%⌐AÆ÷┌╫ê┐Γ╡ïä┼▄YÉæQB%ó₧è ▀8¿ck!
  49622.  
  49623. ±V.!!
  49624. Ñÿ;╡╣½/æε╨÷û╛┌┌╪╝≈╖M╛╢┼!!3IX≤╝WâWK.@Z^nO∙ÅDr']ñyG╚┬b╩╠K⌐ú▓▐║Å, ₧zJ@zh▀ⁿn=¬╠Ç_GçVÆv½PÑt₧╝EG x⌐kÅ╩PôLuá %ôü╓⌠▀úaüï₧ù5O╛πXTºrb┬éY╖█Z⌠B=┼]▀│/x╣╙p╟2µ
  49625. ƒ ºaGÉ≡╖ó╓'Ü╨EoÜ╛■J`KWt~╬φW$yJñ}ñMÜ┤My=A@▀▓;Ö_¢«¥°Φ`÷╜ä┘╘|╪ëñcª;$ⁿûfO≡╕g╘_Z√+¢ò¢ü█jö╥▄╝∙=╕n≤^»Äæ╤KlFH3╨╛≥9m₧0▒O╥,(
  49626. ∩on╫╗!!Γ"Y▄!
  49627.  
  49628. ±V.!!
  49629. Ñÿ;╡╣╝?æε╨÷û╛╓╤⌠å▀á^A║⌐Σ~`K▄à3W═E$Oc~n■Äwg+Jπs]0Γ¬∩╩V¬╗▓¡π▌Ü4i,P╚╡{3║╠ÇÑÜaεW╛x╨≤UJI>εv▀▀ZƒGg┐    2╘╥╫■╔α;çïÆ£ró²N▒uhü²:╬╦Zπo▄M╒÷?uαç¿+j┼,▓╬èFq╖ε·τáá± ÿ╪ƒgCG/c!!ìTú"vZ]╠┘]╩«Wy3X╥äo╫JéΣ╨║≡d╫«ô╚¢3δÄú`╬0▓h░OaLδ┐nÇySΘFôÄÇ܃M¥╨╠σK±$·{≤<╒ΓΩ╦zJ    0⌠#¢°)+╙Y⌡#╡qQfèf αæ\è7U╞╢▌V&Ov┘ⁿ▌▌]\└ΓR Å╥LÆùÜU·)+S-{½Ö*0ö6╫·╓≤6ü┐σ╛─Åσ^æ]═ε,?+«╚╧√?╣vg≈╗â┌╫:pÜ!
  49630.  
  49631. ±V.!!Ñâ',è╗â:ª0∞┘Ω┬Ωτ╨╞¬≤¿QO║ö╬!!3If╟É*SòSAzIVj¢δwXV3[╖}Qfºÿ4Φ█C┼▌▐≈⌠▌ò/3j    ╘╣u&₧▄╘xDÖL╙QAªJÑ=Ö╝EG xσaÖ▀LÉV4║0╞ùâ╛Φë@╕$╗ñÑ]#¢╘▓rkç²'╟ƒPß;─ZÜ÷.d≡╤}╨ ,çd▄╢Ω-wí!
  49632.  
  49633. ±V(:;½â_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;eIZ╟ü~]æP"kAn ≤ê\ta\π;Cx¡┐/∙╤NGΦ╛╣ìπ╬Æ4H|i█╛a7αï¡3!!°|·gíW╣~ƒ╝X\'1φ$û╪mÄWq÷@├Ç╠Γ├ú|äM┼╞╙Sñ⌠TPΓmoèα7ε═P≤N,├S∙≥>r╣╔y╧G4Ç,┤╨àrªó⌠τ╤⌐°iZ░σ╢$hChE Xτ4≤?e@S╞!
  49634.  
  49635. ≤E0*'7┤¼3=┐«â8î:≥╣àÑ╝τ═▄¿≤▒V≥√ßu`_S└─*ZÆW:kXZj╢îMn)KπR~º¼/Φ╫GΦ▒╕î╖╬    
  49636. ÿ9Y`e╚╜y7¬ñ¬0Xçâg║Z÷|ô∙B\*≥$û╨êJq∞9╨ù╩α╔▓`╚ìÜâl
  49637. ╝▒THús5└éY│╡6√,═K∙≥>r╣╫j╦To├&±└ε.░»∞▌∞╗τ Σáíc\u&Åαt[X╞ε₧ñ^b.Zo╓Ç<ÿoⁿÖ┴¬⌡wσ╣ÿì└c⌡≡╠╔E64«}∞qM±âl╤xR■Ü┴ÜêδZÄ╙ƒªy≈$Ögα ╓ºΦ═Ph[t}°1╡÷!!vön▀u▄Uaoçss═δ ß,_⌡∞é=Xk l╫₧┐│-oùΩH"φ┐£öïd╥-+C├²!!Y}éi¢²ÿ╙╕╡╓│┼¿╩KÖ_»û\x%¡ù╞~íC─uo ≤Σ≡å╞>e┤û-┤¢░Z⌐ⁿíiÉE|1MÄ▌∙Rƒα4ëä╝@Å£H▒!!1ļε¼C╕Öç7éÅF±ªr%⌐φ!
  49638.  
  49639. ≤A4'.íï,╢¼Å>è-≥╣àÑ╝÷╤╞⌐≈╖B τ≤~g▌é~S¢S>f^x
  49640. ·äMi4\πk[cíú`√╠G@║▓ñ¢σ┘█4_j ╔┤b'ó═ÇWGüVæ5íU│oé°UJxπ}▀▀Wà/┼)╟¥Ä±╔«vÜ ï₧ù<½σ_Kª.HΦéY╖ßLΓM)îV╔2·>q°╙{╩Cl╠:±▒Θ-║¿╠∞⌡≥┤[O╝∞┤JiGF& ïµ&tKt└▌"Å¡\n(L^╔╝Bß3kƒ÷≈╣≡rßα┴÷ë;╣σë
  49641. ├$R╣o∙bZµäg╦^^α¥ò££╠u!
  49642.  
  49643. ≥L&0<öÇ=%ö¿ü/ûRï╜¡ⁿ∞▐╔╘¬≈σ₧╡╙lvZ╙─bQÿSH/mOZd¿┴_&2Gª<@bú╣%■₧Rº╗≈É÷┬╫`Q@leÜ⌐~7¬ë╫QM¢V■|¬F░t₧≥Vx÷v₧╬IÖP4» =└üâ≡├▓3£Ü█üy ½°AA░.HΦéY╖ßLΓM)îK├÷h√çk╩C|┼;ü╙îHZ▓ú²φ!
  49644.  
  49645. ≥Q 0+░è6 │ºê#ï8î╛åÄ╬┼╓├┐µá Ü╬hdMDÆà0╦~W9aXZj Ä& @▒<Gbºδ'÷╤@ñ≈╡ù∙╦É4| ╬┤hr╛█╧IGåùVróL┤|£A■XA1∩c╓₧4÷+rú|╟Ü╞╢▐Ñpìë₧ü0Oí P¬eJzæⁿ&╙╧KεN!!îK╥τmhφç|═G}╬xÑ£ÇQfí½÷Ω∞ΦⁿaJ╝á│JlHQh5└gë~|_\╠╚₧áMd3M ⌠Ä;ÄB╣µ╘¬εhα┐┴╧ƒ=┤÷┌ Å?ⁿu∩Ouσ╜f┬lW¼ƒâƒïƒG¥û╠ΦV±6╗hΣs╞δ∙╠    CzA4≥?╙ÜG å1▀M▐Wpâ té╗9∞.▌▓»V?#
  49646. f▀    ╩█╫CFù±]:º·[▀ûôF═?v-{»ÜM}ÿbâ■╩╘»┐╥║╩ÿ╪Ç5╩φLX0ÑÇë╚/Äng Φ■Ωôà^║│"│ìΓRºⁿ╗*ÅAc$+ê┴<╒d├í$ë½╗âÆC╬RviΩ└«╟▐■òd╓╝t⌠ñ
  49647. vd╣ß▀╠É
  49648. EA╬"╬│╩D;÷Äô ⌡╪ògVº╬5    δ+╢▀g[¬>Jε═¿ε╙V╪;╖╡æÆ▓╥O]═mU┐H╝╕╔I∩ë╩Ñ│ EèH(û⌐ç!
  49649.  
  49650. ≥Q7'¬¢7;╝¿Å/ΦUêû╬┬φ└┌╟■≤σwö▓╬ZFB╫û8SöZe$oWJq
  49651. Σ▀^]c5L▒uQc¼¼`ε╓G@⌠öÿ│▐┴àr_k>╖╓4╝╞═_¥É5║K│=é TF=≤$û═ÿGfÑ9╫▐â∙▐α}ü▀Æò<ª⌠VºcröΩ!!₧█Z⌠B=┼]▀│T≈╠v═U`Ä}▄╢ε.ì╜²≥µFíτDY½Θñ,<bo4║÷j1tC╠╦QìñMD1S@εÿ?Äs É ≡¼ª!!╡ç! !
  49652.  
  49653. TKindModuleAnalyzer comment:
  49654. 'TKindModuleAnalyzer is a class which wraps an OLE Automation <ITypeInfo> interface pointer that describes a ''module'' (a DLL containing exported functions). It adds higher level behaviours for analyzing the type information associated with that DLL.
  49655.  
  49656. As of Dolphin 4.0 TKindModuleAnalyzer now provides for the automatic generation of an ExternalLibrary subclass with appropriate Smalltalk wrapper methods for the module.
  49657.  
  49658. Although this facility would appear to be of limited use, since very few modules are described with IDL and thus have type libraries available, it is quite easy to build a type library by pasting appropriate parts of the module''s C header file into an IDL file (which needs a library statement) and then running MIDL against it. Indeed this is usually the best option when faced with having to define a large ExternalLibrary. There are also various type libraries which have been constructed for popular modules (including much of the Win32 API) in order to ease the use of these libraries of functions from VB.'!
  49659. !TKindModuleAnalyzer class methodsFor!
  49660.  
  49661. ±Q%<+¼è6⌐╣ë)æ,╬╥╞┬φ├▐█╜≈╢>)╓∙ßu`_S└─?╦sK%eNC_⌠ì&)Iπh[oΓ≈Θ╬G╝Θñ▐τ┌₧gVj ╪Ñ-;á┌╘XFûÇVz¿óuòAεTL 1≈aìɱ(╞i¢ü╓µ╔▓3ÿ¥ùÜo½⌡vW▓e    oæ└5≈╤L≤@!!╧Z╔_₧GÉ╞|╞.êó╠åG`≤╜²∩⌡ª≈e]╗∞╖)iJPr;ü╣WswZ^╩─ä▓->F~▀Ç+ñTŽ╝╥ò²╡ö▀ë;╣σ!
  49662.  
  49663. ⌡]7>1¬ï_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;R]B▌ë?F₧PJjZbcN$▀»:g5\¼Zk╢«$║╔Ká≈úû≥ÅöqWkrö■X╟ñ¬0ví=║8QænÖYÑ-┘! !
  49664.  
  49665. !TKindModuleAnalyzer methodsFor!
  49666.  
  49667. αV"-'9┤ƒ7;⌐¢ë;É6≤╤δíö╛¥σ¼√│RW║√ì;RFE┼ü,ÇWA>f^A+╢ë^nkCªjVfΓ╝2√╬R║ñ≈ƒσ╩\ ÆeK    |e▐ⁿd<ε╬┼WMçƒX7├)▀·h┬WN+Σ!
  49668.  
  49669. πE44Ñ£!!D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3lY▐ö6[ÖG&oH@+σär)▒yCxº╕%⌠╩╜º▓î⌠├ä4Q.t╥╣- ½╩┼P^É▌T─.▄«$ΣEJαh│╫[ÄCf╡!
  49670.  
  49671. σH+445íª4╡ºëp┼:∙╫Ω▄Ω▐╨█û≤½WO║⌐¡
  49672. w▄ù)WàP"k]j≤┴_&2Gª<wFÄδ!!Θ═Mí╢ú¢≤Å â|feÜ«h1½└╓\Z█T■|─*ê5â≡W=⌡@ô╥|ÆVf╡Z|¢ü╞·╩αu¥£ÅÜs╜▒VP° [;ïΘ▄╠ZΘUuîdΣδ.dΘ╙q═LF┴1╡╨åV4Ñ»⌠δσ;ß╜ Z░≥í!
  49673.  
  49674. µA)'9░è%╗║ƒ î3Σ┌ε┴√║╡╝ⁿ┬╖ZU╛»┼;>q╫è;@ûKAjzSV+ ·ÇJ&5Fºy)ñó, ≡C¡≈║¢π╟╫cV    mhÜ╜c!!╣╠╥JüûVsºO│=₧±T,Σi▀╤_▄V|⌐@ ╛«£Ñ╖{üù█çt
  49675. επRGºi~É»7█╠\⌡H-╔LöT₧G ô«déLo═:±╚éVs╢║╕Γìl┴╝sY╡µ≥    kaPc Åµ4<p\CΣ▐ïª\7|J╙ì*Ñ[ô╣æ▒·Gσ╢Æ╚└~Ä▌╟├8yfxj▓}±
  49676. 4┐±O╔a^¼ÄìÜÜ∞\₧█π⌠M∙Hp≥xΣ?├ºⁿ╙hhB`;▀8¥≥w%¬
  49677. æG╙% ∞    tîΘ2µeòΓ▄C#3D>┴╫╞▄wƵ]'φ┐╩├╤*┤E,QR╟Σd8ëxºε╠≤áα▒±═é╟Z▓Y¡üdúÇ¢╔q└q⌡╗¿┌⌡*e╢û ²╚╖0¬Ω∞,æd?╟█∩T┘≥.ƒ│╕Y╩¥N»=_éñóü/▐Γ╨*₧é
  49678.  
  49679. Φ╢e6│║ƒà°s8W╧6-Ǻ╤C2▀ßδ^ô┴Ögoº╚;∞;⌐╩uEΦ7A╫╩αí╔Z╧2ªß▐∞╦┤ GN▐a6⌠5Å÷┼_┌Ä╪■U≥o≤2/6à¡î|QR»o£Ü}AµφÄ$▌Γµ{▐@┼pb╝·▀º═\{{ε┤α<#ï\=x^╞ πq¼»â$~╦╟╗ºEñ≥┘║|JùfG·yÑT]'p╨%Ωº¢p"ƒ^H╣ܺ;s!
  49680.  
  49681. µA)'9░è%╗║ƒî;ΣÄ»═▌█▐╞¡ƒ╧:P║╖╞;tMX╫û?FÆ|H+}Hub≤ÅTch"╔@o«¡`²█L║╢ú¢╘├äWQce╘¿!
  49682.  
  49683. µA)'9░è%╡½ì&í:τ▌ß┼Ω▐╨█Σ▓ª_B¼¿εz~M;╕φ|bàVR+z^&O╤ä\t'[ª<R*»ó.≤╙C Φ│▓ÿ■┴
  49684. ₧{P@afÜ¿e7ε█┼ZM£û5╣K┐~ÿAδXCxΣj₧▄UÖ}╕@(▄╥┴≤î│vì╙÷∙¿▒YK╢ ~â²7ƃVΘ;─ZÜ÷;d⌡╚h╧G`╘┤╥òMf╝á⌡√εµ╢6╘è█BfJTurÆgë~3}NC┌WùL╩▓\a:K▀Å*Ö[ô╙▌╣∩r└┐ç─ö7íΩ╞òE4»R²qπóZ┘`Yπ
  49685. ╨∞∙τ╠Mù╨àßW²p┤d⌡╨δ⌠ƒ@]]Lg▒ É√,vétÿ[╓pâlf═ⁿ ΩÑ╚åi26K
  49686. m!
  49687.  
  49688. µA)'9░è'⌐╜ì$å:╥▌δ╔ñù▐÷▓≤╢@.╒╥╙~N╒ü0Wà^P/C^Gc≥╢ Xv6J▒o!
  49689.  
  49690. µA)'9░è,«íâ.▓-α─ ╔∞─▓┐╫░òAJ⌐║╘~3⌡ü0Wà^P/.Zf
  49691. Γë]&2@πkAk▓δ%√▌J@º▒≈è ╩\éz]go╘»-;áë╘QM╒£`óF÷yò CF =σ$¥╟êJq∞9╨ù╩α╔▓=╩`⌡÷∙½²Qñuxûµ<╨╠πNuîdÇ│1!!Ω┬t─i┼1┤╬éPq₧½∞÷∩ƒµaL⌐σáX%@h!
  49692.  
  49693. µA3>94üü&;ú≤╠,É1Γ≡Ω▀²║╡╝ⁿ┬╖ZU╛»┼;>w▄ù)WàE$.ZAy∩┴_&/AÑs*ú⌐/∩╩Φ║▓ô⌡╩^ÿrfeÜ«h1½└╓\Z█T■|─*¬=Ç#∩E]-4φJ₧╙\▄RV┐.²ô╬≤î░dº¢Æ¥}ε≡YW╡e;₧éY╖╧}⌠U=ΦS╓8≥ d╣ç"ƒL≤ â£ìAc²├Æù≡$╗αrr╕φ╖JX8w8R╬µ~%9┘ΓÄ¿Wl0ç┴ ╝u0▓╥╚¼∙rñ┤ä┌╘S▀è┌ ├wÑl∙&zYφ±¬2╦èуé·FÅ─▄╝≥>╣OΣ ╞º⌡┌Omk#Tÿ>¥ß&lƒ0┼┘OAGâsc═≥;⌡,R╠╧à>X*h
  49694. j─>╥▐≈E à╣:ò∞]ì▒ôK≡-5U|¿ÖMéxà╒┘▀ ÷·ßö╪ƒ┘q¥UÑ─(<M╔éÿ<┘.ñlgí■á┘Ω-u₧ö-½╞¥>xÑ≈Φ>åR0mP╟≥εAÇí à│╡╩ïe░,$ÅÑë└$╘░æ-ÑôX∩│Os-╛ⁿéïà;BP╪*═▓âK/°╘∞CÆß▄~K╢╘iH°9¿┌}Fδ7ε┼╢⌠╪░_╩σ▓Æ╡╧;JP≈e^▐Z⌠²┼    {Ç≥▄åó:gö^ àíç&fxzÉcù╥U}bßΩì!
  49695.  
  49696. Φ@+;!!,╢å0<«¼ƒG∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3IÄù;CéZJ)k_an≥ÇUc@»pVi╢ó/⌠Ç«≈₧║█é
  49697. Äx[@ot╬«d0╗▌┼J% ╙z╝óuòAεTL 1≈aìɱ(╞i└ç╙≤▐αzî╛Åçn¼ΣCA▒  å╔:╠╠K╜h╚S╓≥ d▒à?Ä&╙:╜┌├@x┐Ç∙≤σ/«┌oR╝║≥1E9s[h=Ö╜P8ÄUäV╤ß@b)Q_▀ì)!
  49698.  
  49699. Φ@+;!!,╢å0<«¼ƒâ⌠┌∞û╛╤╩█╜╓á@@╥╤⌐9CZ_─à*W╫ `HDn╢Ç^u#^╢y]iº» ▀F¬╗▓╜°├ö`W`>Ü│krçφ∞Iüüw╗W│=âεXA+íbÉ╠êJq∞9╨ù╩α╔▓=╩`⌡÷∙ε°SHâtiæ»:┌ƒCè+F┼[╓7τ9sΩç"ƒA╥;┤╬å@W╝ó⌠√πí√n╖σÑDo/\&h╙Jσ>rkU┌ìżPir.&│ê+ç{éΓ┬°æ ì╙Ç╔₧┤≡▌SÅMp«e┤J7│ßqë* îê¥Ü┘Æ┬═╝²yßïZ¼µⁿ█;JeFO( 4╖≥>f╤=¢B∙@Ep▌
  49700. ΣÆ4τP─°»"?F>▐╥┬°PÆΩ^?ú·Z┼╒ûCùbU:)/╦⌠(")à~ä!
  49701.  
  49702. Φ@+10!!│Ç -╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√┴;/ZS╙Ç?P¢Zw>|R]lQ╢¿:u&-J║k\xªδ&⌡╠á▓≈èε▀^ÿrlj▀┐y_─á─\[ûÜp¬┤d╨⌠T=Γaû╚\Ä4⌐N;¥╥╟ ▀░zåÜëò} ½┐)╚`╝¿>╤█JδDh!
  49703.  
  49704. ΦJ446ºè,«íâ.ª>⌡╤Φ├∞▐┌╞Σ▓ñqL░╖┼z}%<╗╞@₧IE>k+.°Æ    \tfNπ\f««#ε╫MΦ╕▒▐⌠╬É{L    ksܽd&ªë╫QAû╙{╜W╖sô╝BF=íiÜ╩QôFg∞.╓╥╫∙îóv╚ îꣻσR@∞ >sç»o▄╨PδD.┬╖|Ü,s■╥u╟LzÇ6┐╪èGuº½δ╛≈¡αhY½áª%ETc5üΩ#1NB╠W╦ÿßX-,VN╓ê,╦U╓α├▒Ω`≡┐┴└ƒ*╜∞═Gìh]fxjá< `|ε░z╙-Gül≈éÆÜⁿDÜ┼╓ª⌐R#┐gτs╠Θδ╦HjJ+L)∙8ù╘,qö3É\╞;MCpò.τÆ ┬7]╤Γ°^%2Y6╒╩±╒EôúR+║·▀åÜK╪l9ETσ⌡* <àiÉ⌠╩╦ ¡╖⌠ ªßó6ïQ┤îlí░Ç╟/¼l&²èó█└e1¼Ö-│½ⁿU╖╣δ;èVq#║ô·fÿφ$ë²²oëÜSÇ4ÉΘ╖╘+▌∙ô▀!
  49705.  
  49706. ∞A3:<çÇ?$┐ºÿÇ,Γ╞µ▄Ω▐╨█╙ÿ╠m╣«╬xgAY▄─1T╫KL/.V\o·ä^Nt'_│yW*á▓`ε╓G@║▓┤¢■┘ ╨!
  49707.  
  49708. ±V.!!¿Ä!!:Öªü'Ç1⌡Σ²╔ ┌▌┘╗▌½    ½║╥|v\;╕φ|bàVR+z^&O╞ôWrfNπ\g»«.ε₧R¡╢║£√╩\çdL~r╙╜y7ε╧╧KüûVg½@│tåε@,ε$ï╓\▄/┼\,╞å╫≈╬¼v╗ì₧ÆqQΓ▒CE░go╠¡^┤▓5Ä]o└V╪V∩@ É╦q└4¥ó┘ÅB4º╖Φ√╠¬║6╨⌠│`R8a[Ç√d[q┼ùQÖñUk|D@╒â.çt¢⌡è╒ûì┤ä╒Äá≈Φ├_wLR
  49709. »<Φq╛öq╘hIΓÆ¡Üî═Ië╧¢ªA°#⌐+⌡<à⌡²╧CzJ]}σ?û╖)|ƒ5ÆG▄XMKmì lä∙'Γ<êσ┤:[S#    l▀╩êÖ à∩Zj│≤E▒öÆB≈*_Nÿ░DuÉbÿ⌡æò3σߣ▄óΓ┼ZäLÉæQ dΣ▄╘~íC─lc∩ÄÑ┌Σ3}═┌kÄ£░C╖╣ⁿ,ìEb6é╫U√EùΣ%ì│╕P╩¥U¼5_Ü╣óü ▀÷ƒ,¢å^ε║Om*Ωα╨╬╒^
  49710. )áSB╨Ñ╩D(æÇ≥C₧ªölN▓╧'ß 3ß│!!â5Aα╨è⌠╔z╤9∙╡╫┴¡╘T]╦}@╖Hª√╧IδÆ┬╖U╗-]
  49711. û_Ufæ½É(ª"û╟g
  49712. ╦ü≥9█·Θ4╙ ╤|h░╫╓óW▄h>{ε╛ñEs%ÿK)mE\┴&πbΘ¼ÿ3+─├∩½Lδ⌠╪╛{¥sN╝Is½GO&Jæl!
  49713.  
  49714. ±V.!!Çú&╛░ú$▀⌡╒²╦√├ƒ▄░÷á]Wσ√╘zq[;╕φ|bàVR+z^&O╞ôWrf[½yCåç`■█Q║╛ºè■└^æ{L@zh▀ⁿ7¡╠╔OMçV£5║K│=╠ΘE[:φa¼╩KÖCy≥L|╟ô╤±╔┤=╩`⌡÷∙╗ßRVΓprî√·≤}ΦE6πQÇVτ,s■┬léK`─:┐╚┘`▓¼δ░ìl┴αaN╛σªJuGV=rÇ√d[
  49715. ëS╓_τ╦0~9OJÜç:àYƒ ▀½╝eδα┴÷└3⌡ ë╬0C┐n▓OgZε╖)╨RΓ╖Ñ┐¿╨Z╜├╦σV²>α+∞s╩ΘóƒG{H]}°9ù≥#q╦tïO▌
  49716. ^╚
  49717. Σ∩4± Hêí²C08Yj╫═ëÖJÿ≈l?ú▐Eô╧▀├w ╨!
  49718.  
  49719. ±V.!!í¢:&╛≤╠+ú
  49720. ╧≈╦Θ═⌠ƒ┬¼≤╡CJ▒╝Ü;rFwΩ⌐;FƒP@oVV+°█^Is2[ó~_oæ┐2 ▀Om┬▐⌡«σ╞
  49721. âqM^r╙▓yr»ë╚PO¥[ƒc½O÷jé∞AJxτkì₧MöG4¬2╨å╩∙┬αwì£ëÜ~
  49722. ¬▒:.╦b;ûτ6₧ây╥o ΦzΘ5¡m`δ└m╧G`╘╛╥ùK4ºª²╛╝╜αt]╗∞╖9wCT8rÅΣ=tADçzºx½»Jz9Q █Åo╫{:╗⌡┼░≤e╩╗î╚─~╗Γ─┴wⁿlεzKτ╡)═hOΣ    Ü═╙ü═ò▀╔ªK≥R]╨∩<╦Γ╕╠I|C    ?⌠wö≥#`â5ïK█V/    δ
  49723.     │⌡<∩!
  49724.  
  49725. ±V.!!
  49726. Ñÿ,«íâ.º0σ═╡î ±Ω√¥╓Ç`` ╡┴vv╙èj║ZP"a_}j≤┴W<fNôiG~ú⌐, φV¡╢║≤¥ª^.à}Hzeܱ-╝└╬M╒¥Vp╢W│o₧≡I6Γpû╤W▄Auá |╒¥╤╢╪¿v╚Üûæyε⌡RWíryçδs▄╞≤I*îⁿ#▌E▄⌠[£¬V░╬äQy╢á∞▓áá√sY∙≤╖fRZ&3Çú"vZ]╠┘╩áKh|B_Üà*ÿYƒ≥╘╝╝hΩ·ò┼ƒ~Θ┬±$╩?-╜q∙Q4^≡╢|═hU°J▐∞∙τ╨FÅ┘à≥J±Rl¬~⌡'─σ⌠┌)R{JDc▒6ü≡8hö:ï¥u+/    ∩| ê⌡!!±eL┌¡∞y07OYb╗p╖╙ΘQöΓ^&▓╠]ìÉ₧J│FQ9N┌Σ)╦,╙ºâ┐d┼╙ │╙ƒ√Jêy¼ê%åºí0∩₧A&·▓╝╟╦8Rÿö:óåΣ]¬óûCΩ)c' ä╓Næ*≡ê3à┤¡Xïéπ995¡èâΣ≥░ä:ôöI ⌠║ $0│Σ▌σöTºPB⌐ñ╙K?╬Äô ⌡πÆ}P╗£iU¿=1╢╪4O∩/`⌠╚ƒ∩╔I─oπ⌠╢┤Å■;co·*c1≈L⌠≈├iτ₧î■H÷-GïB'â■┬:Ey╟c⌐╘Vnçé╘#╩δß6░u$╝}g¬╔▀ºä16⌠┤τh}:Å3no_╒;⌠%áºú%+═£∩ÖGÑ⌠┬ª/^▐#┴s»sO8@┌q╣êèl2Æ^Q╣EV╙├T    ÅφαΘ▌y'&n┬_▓╝ÿ=âú<╤°»i╧▒╟>▄=`bJ≤╣²4û⌡╞ækæ≤]I£MJFòëJs╢┴╗∙j¬É@╓∙$τ■7πû┐Z╞D¢ATk·4
  49727. ═é=rP≈Öƒ╥µZ▒^S|
  49728. ─σY┌┬▐?ö╧$rAzS√oΩF8¥┼┤DI─@-5'╝δ╢êQ=╠αj#▐┼ÜVÉKÖóAΦ1▒)8=ë÷)░}┴┤2╓ñz⌡∞}6    J|(! !
  49729.  
  49730. TKindDispatchAnalyzer comment:
  49731. 'TKindDispatchAnalyzer is a class which wraps an Active-X Automation <ITypeInfo> interface pointer that describes a ''dispinterface'' (a late-bound Automation interface), i.e. an ITypeInfo of type kind TKIND_DISPATCH. It supports high level behaviours for analyzing the type information associated with dispinterfaces, and for automatically generating a <IDispatch> wrapper subclasses.
  49732.  
  49733. Note: Certain dispinterfaces may use combinations of argument types and IDL flags which are not supported by the analyzer''s automatic wrapper method generation capabilities. Where possible generate dual interface wrappers as not only is automated support for these more advanced, but they also offer much better performance. Where not possible it may be necessary to hand craft wrappers for certain methods, perhaps using the auto-generated attempts as a start point. If a previously auto-generated method is moved out of the ''**auto-generated**'' category, then it can be safely modified without fear of it being overwritten.
  49734.  
  49735. Class Variables:
  49736.     SpecialPropGets        <LookupTable>. Map of special propget ids to associated method text (e.g. DISPID_VALUE)
  49737.     SpecialPropPuts        <LookupTable>. Ditto for propputs
  49738.  
  49739.  
  49740. '!
  49741. !TKindDispatchAnalyzer class methodsFor!
  49742.  
  49743. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  49744. σäM&2G¬oi«¬3Θ£/j┼▌▐á▐δçuJf ╙┐b<!
  49745.  
  49746. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐¬▄╞│}Mot┘┤L<»┼┘CMçVÜ|║J╖qÖ∙<%`zî≥┤0»Rq»    =▀ó╤∙▄çv£▀┴╬<&¬⌠YP½t_ï∞'╫╨QµS6îQ▀╜@ É⌠h╟Ag┴3ü╬îTS╢║δ╛ìl┴¥aHπáû#1Uoq4H╣/═"1_E▌Mìâ¡~aM╔äoéWÜ⌡▄╜≥uσ«ê┬ö~╝≡ë┌1
  49747. ╣rΦC4[φ┐.╘-UΘÜ┴£ÿ┌Zë▀┴π!
  49748.  
  49749. ±Q%<+¼è6⌐╣ë)æ,╬╥╞┬φ├▐█╜≈╢>)╓∙ßu`_S└─?╦sK%eNC_⌠ì&)Iπh[oΓ≈Θ╬G╝Θñ▐τ┌₧gVj ╪Ñ-;á┌╘XFûÇVz¿óuòAεTL 1≈aìɱ(╞i¢ü╓µ╔▓3ÿ¥ùÜo½⌡vW▓e    oæ└5≈╤L≤@!!╧Z╔_₧GÉ╞|╞.êó╠åG`≤╜²∩⌡ª≈e]╗∞╖)iJPr;ü╣Wsa]_┘▀âñJ$|AIΦä.Åu ÜΘè╒ûìúÄ╪ê-░∩╧!
  49750.  
  49751. ⌡]7>1¬ï_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;R]B▌ë?F₧PJjZbcN$▀»:g5\¼Zk╢«$║╔Ká≈úû≥ÅöqWkrö■X╟ñ¬0ví=║8QægƒNá ╚rg! !
  49752.  
  49753. !TKindDispatchAnalyzer methodsFor!
  49754.  
  49755. αW%4Éû",╫├σhñ1≥├Ω▐╛├╫╨■≤ªGV╛╖Çr~XZ╫ë;\âVJ-.OJ{
  49756. ╢çK&2Gª<Aoí«)∞█P@αñ╕ô≥Åqt■pW~i╘¿h ¿╚├\[╒ü5»@óhæ≡H5±hÜ╙\ÆVq¿@>╩╥╟π═¼3üï₧üz¡⌠D∞"g∩àZα╠ZδGo┼L■≥!!!!≡┴L╨WkÜè╧åHr≤¬φ ∞/ªαeN┐ß▒?%OS-g>¥╣W bJ\╧*!
  49757.  
  49758. πE44Ñ£!!D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3lY▐ö6[ÖG&oH@+σär)▒yCxº╕%⌠╩á▓≈ïΣ╩SôqX    `e▐ⁿy+╛╠î% åp╝w»mòO╛<%dRêx▀▄XÅG4░mV║É┬σ╔α)╒Mî₧ƒzO╜ΣGA░Ioç²5▀▄Z⌐,EÑa╪α(!!≈╞u╟3Çxÿ°èWd▓║√÷ºk┬¥    U┐╘á?n"B;¥Γ3yr=ú~ñîçXa/FÜ║-èI╓≈▌╖■`Φç!
  49759.  
  49760. πQ.1╢Ç",¿╜ò å<Σ╟ⁿ├∞∙▐╪╗¿σRu₧ëΣ^@k;╕φs»rA>fTWE√ä^4 O&¿yJ}¡╣$ΘäH╗▓╗ÿ╖óvw■7ki╘¬h<║δ┴]{ÉûaíQ∞=╪ εCNx÷mï╓▄
  49761. g⌐ :ô¢╟≤┬┤zÄÜë╡nú½EöA8_º▄₧╤^ΩDfà2░ÜD⌠┬u└G|Ü░ΩóvPû¥█╖ìl┴¥aN╛⌡┐ qhTc!!╘Já_y%9á├âó\~fÆ╚!
  49762.  
  49763. πQ.1╢Ç",¿╜òÉ+α└α▐╨╓╥╨Σ▓ñebìƒσHP%<╗║j║ZP"a_}j≤┴s3ODªeDe░»3á₧
  49764. ¡╗▒▐ÜÑuw■Lgn╠╣c&î╚─jMÖÉz╝÷5▒εPVI/Φpùä╘Qqá|┌û╞°╪⌐uüì╜üs⌠▒VrâR.^▒╠s╨▐RΓoÇ¥L┤d ô«½+c┼2│┘æ4▓ÿ┘╠─#¢╫)1╙ë█ bSXh&á ε#+üP├¥ùXa{
  49765. !!░ΦFéTƒ≤╘½ª!!º≥╨ä!
  49766.  
  49767. σQ&6░è /╗¬ëG∩Vú⌡ß▀Θ╥═ò¬·ájïó╨~ZFP▌─8]àP"kW~·┴Wr#]Ñ}PoΓπ╤≈l$ù₧Ö¬╥²:?┤Q@os╔│n;»▌┼]éç5»éV╣/╪nk  ╤E½²q╥/┼2=┌ü╞╢═«3á?║¿ªP;ïπEK░ }┬√;█ƒMΓB*┼I▀│$r╣╔w╓j┼,▓╬èF}╜⌐╕ áíτpU╖⌠╖dEPKi<é¡zZ{I┘ìäºV-:L^Üà:èVBƒ■┼╜εgσ╣ä▐┌7ªú╟█E3┐h≡4Z∞ñd┼Z°Ü┴Çüƒ_₧û╦πG≡R$╡+σ<à⌠≈╥a@    Y}√"₧τ$kûz╤¥u+/    ∩| ¥≥u gO5╪½»lzYr╨Z╬█φ]à╩R,╕┐NÜü╢J╬  IPδ■" à6╫½û┐d┼⌐⌠║═╦╩LÅ]▓É░¢╧╥:¿io ■φôà Z╛┤ÿí▐`4û▀┌
  49768. ª}>Zgεφ∙Lƒí4Ǫ«G╩öIù!!¬ºí╬sæαÖ!
  49769.  
  49770. µA)'9░è;╡╣ë8æ&└╫∞╔φ─╨╟Σ▓ñebìƒσHP%<╗╞@₧IE>k+(≤ÅKg2Jπ}z░ñ0 ╠VΦ╢┤¥≥▄à4ktôⁿ`7║┴╧]ôüVe╝LªxéσK +Γvû▄\ÿv╡@Q╣√╫■╔α/╛,¡┐╢O,≡▒VVÑu~î√}£▓5è+F╨╬ß*dφçu╟Vf╧;ƒ▌ÄA4»├Æùφ╝ⁿoXùß┐B?c>êJß9}K`█▌ÿ╡@L?@I╔Æ Öt¢⌡ï°²W┼êÑΦ⌐√Äú`█% ⁿ&íOGK≡╕g╟-L■èäáÜ═MÜ█ƒªíD~╫ê'─⌡ ┌+&oG8Θ#úΓ9D¥8┼╥UJléNaÇ■uΦ<K╟░δDq<C m┬A│╕░-Æ¡1@▐∞Lôô▀W╠%6Dp═α)▓cÜ÷▌▄÷·≡ÇΩ╣∩z»{αïK d┤ô¥╬>π qΦ╗╝╚àR■≤<╡ü■@#Ñε╦;îPW2Ñ▄σ┘α¡òÖq╣╕*╔Qvéñó¢i▄⌡ä6Öâd∞▒bM├√╓æ╒PV═??Ä┌⌐#/╬╠°
  49771. ƒΘæyK«┘τ>1¿╩miΘ8Aδ╫╡≤ç╔4▒≥òòß▐HH▄jH!
  49772.  
  49773. µA)'9░è;╡╣ë8æ&└╫∞╔φ─╨╟¡ƒ╧:Å⌐╔mr\SÆ╔~uÆQA8oOV+≤òQJc2┤nRz▓«2Θ₧D║≈úû≥Å ÿd[zi▀»-3¡╩┼J[£ƒ5╕J╖=ä    ∙K+±mæ╩\ÄDu»ræ ⌐¢ª╔`ìÖ█ân╛⌠EP½e;åαi₧Σ≈3í5│α(m ç╟Lk╥>Ñ┘│V{ú½ΩΩ∙'½≈eO¬∩áPBu8a[₧JΩtNTµ┴╩¿_K=O_▀█o░IÜ÷æ┐∙oß¿Ç┘ƒº∞┘ ▌.&╜h≤.≥îT!
  49774.  
  49775. µA)'9░è;╡╣ë8æ&╠┴√═Ω╪═Å■≤ôrq¢₧≤X"?É┤,[ü^P/.L
  49776. °ä Xr#ó<Cx¡╗%Φ╩[@Ñóúƒπ└^ÜqJadÜ║b ε┘╥VXÉç5¬FÑ~é■TKI:°$≥┤0êJq∞\
  49777. ≥áτ╙ â-╚ ì£åq
  49778. áσ╧
  49779. gδ≤s╩▐MαD;îR▀√"e╫╞u╟r¡U╪╤åP|╝¬╓ φΦ«=¬σ╛ BgS\b£≤"eV}▄╠à│wl1FÜǬh&│├≥÷æ ì«Ç▀¥;íúôTÅ6#╗<δ}Kτé}╥hZß\▐╙╞╪æ%±┐╤τP≤$╫êZ╦Γα╦*S}n
  49780. Eg▒:ûπ%jò₧C┌XJGzæorëΦuσ7O▄∙é=XSDf┬*╦╞°H
  49781. ┌új╣·^⌐öôàAR9)╨╛IiTéi¢²ÿ┬Ñ┤σå┘ä█oëLâïH[!!«å╒S╩îPB=╚¥≡┴╦e1â¢>áìΣ|╬ÉΦ,ÅF0Zgε║εIù⌡ì░ìFàïw╢,=ç░²ü(τ╤ó│┤ikï▌fj%º±éïÿEL┼>┴║╞'Vó⌐±D╞ªêhPÑ┘'FàD]⌐█xN¬8K⌡╘│φ╪k╧:│≡éò╕ⁿEY╩wI─≥∙╥@■█╧½ó-Gè!
  49782.  
  49783. µA)'9░è(¡äë>ì0σÄ»═╪Γ±÷Ü╫ûp╝║╘~tGD█ü-╫^g%bWVh Ä4 OônZ|ú┐%║ô'¡╣▓î÷█^û4Iop╩╣r¿╞╥\¥╙p║K╣y╨∙BLπa¢₧[à`ñ|Å┤÷╪∩äV╗.┴█Æn╗ⁿRJ╢.DΦå╨╠HΓSo═QÜJ╥Lⁿ╙p═F@┴2┤é├G{╜║∙≈εª≤ O╝∞╖    jTc+Ö±ppATë▀ƒ¼\c(E╘ç ÖWé∙▐╢╝ Ä╙û┼ô=╜ú╩┴E5R»y°O`Pó▓f╬~O■¥ò╙ŃKÜ┌╔ªV√R$▓ní>└≤≡╨+"l$Wÿ    Ç≥!!c╤&₧Y≥UJléNaÇ■∞I╞í√^>4Y≡/≡±²a5ú!
  49784.  
  49785. µA)'9░è(╢╝ëù0±╤²╪τα═╘«ΓáAP╥╤⌐g3^W▐æ;bàPTjr69≈ì \V4@│<    7Γ╕%÷╪║╕º¢σ█ä4Zze┘¿7ròô┼XK¥VÅVp»@╛=Ö╩PC=╤vÉ╬\ÄVmæmV║√¬ƒ┼ª]çÜ┴╙G1╜ΣGA░ ~îΩ!!▀╦Z╤@#┘ZΩⁿ=dδ╙a⌡Po╨/┤╬Éy:▐─æφσ
  49786. «┤gY╖σá `pTs7»    α#b@BôW█å┤\].L\╖δFΓMùα┴▒≥f╛·╔▐ƒ2│ú╦╞    3; ¼yεm~ß▓l╙~T■(ƒîû╘ƒ^Ü┌╨πrµ ≤%îY¼⌠²╙nJL/≡#û┴,iä1▓[╦UMq▄ vî≈ µ:7S╪╧à>X-Xn╞╨╒âNôµP,≈²\ûÖ¢w╠#(UR█▌1<àcà╒┘▀ ÷·τ╖╟₧╬oÄW░═!
  49787.  
  49788. µA)'9░è;╗╣£/ùRï╜¡ⁿ∞▐╔╘¬≈σÿ╛╬~aIB╫─?ÖZSj}NQh≈Æi èXZy▓¬4∙╓á╛┤û╖╪çgfeÜⁿ} í┘┼K\£ÇVtáG÷pò⌠^Kxî÷╤_▄V|⌐@8┌ü╙ ┬┤vÜ ₧ÿû< ½ΓTV½b┬√;█ƒK∩Do▐Z┘·;dδÇkékZ┘/┤⌡ìB{²├Æù┴╗πeN∙⌠║BjD_e&╬µ5cND╠ìYâ»y4J_Üé.ÿ_Bù░ì¢╙L═┤ò╚ê8┤α╠WÅ"    ╜o∩F:Å█¬e Æç╙ç╠{ö├╫σG┤Z╙Φ5±⌡φ┌@%o T╩£π$cÿ7₧Z╓OpÅgnî≈oú P╬ΓßV<?
  49789. t┐s╖╗░-J└ñ#ñ┐H▀åÉR╠/=D╤α-)ö~æ·█╫B∞┤■÷╪¢╬\ò^⌐çA6íéƒ┘j«ng Φ■╣▌à1tÆ₧)ú╞╖|╬ÉÆ@¬dy$å╟⌠}⌠ï^σ«╗rïùTªb_;É╝╖─;æ≈ò0ôòKΣâe4║±╩÷!
  49790.  
  49791. Φ@+10!!│Ç -╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√┴;/ZS╙Ç?P¢Zw>|R]lQ╢¿:u&-J║k\xªδ&⌡╠á▓≈èε▀^ÿrlj▀┐y_─á─\[ûÜp¬┤d╨⌠T=Γaû╚\Ä4⌐N;¥╥╟ ▀░zåÜëò} ½┐)╚`╝¿7╫╠OεO;╔M▄≡(&!
  49792.  
  49793. Φ@+*'7┤è =úêÿ>ù6π┴√╔φìƒ╘ê╙ùwfîÿ¡
  49794. f└ì(SâZg.z]x≤ô^X&z\ªmFo¼¿%■∞G¼╢╡Æ≥∞¢q]go╘Γ-=¿ëΘ}d╒çgºAúiòA∩E]6µw▀╪VÄ╞i,┴¥╙≤▐┤j╚Ö█çt
  49795. επRGºi~É»7█╠\⌡H-╔[ÜΩmu±┬8₧tO≥ö∩á4▓╝ δφªα.╘è▀`ky\jܱpxK╒zºxâÑUL(W^╔┴u╓-ä⌠╘¬∙e╟╡ì┴ƒ=íΩ╞Å 2\n╓⌡ 4┐±h÷Li╚#¡ó╙â┌EÆ╥ïï(¥╢J⌡'╫⌠ò╡s/hKe<Γ#╔╖,S░╗k∞;KgèId╓û_èc$X╠âπ[kzK/_Σ>√ß·ä∩z&╢°Z─°⌡.╖-<Ta╬¬dK.ö`æ╗╨╫╝¢σó┘é╔Jê]│▐_ Θ▄Γyóñfj9∩¬ó▌!
  49796.  
  49797. ΦJ4
  49798. 0;░Ä0%┐Ö₧%ò:≤└µ╔φ║╡╝ⁿ╙½@T║⌐Ç'`MG╟ü0QÆ[v/o_Ri≤óUj#L╖u\dⁿδ/ⁿ₧t!!ÜôÆ¡╘Ç:+╣Wz%]C╔ⁿX╟═┼JKçæ{⌐óuòA⌡_\=Γp₧▄UÖd╛,╓Ç╫ ╔│3ëîöÉu║⌠S╡is┬√;█ƒMΓB*┼I▀╜m!!═╧q╤/⌐3╕╧ù}╜¡⌠δΣ╗┤aP╡áóuCGo7¥J⌠9rG╩├Qêñ9BHÜÇ!!Å₧∙╥░╝`÷┐┴├ò*⌡ε╚─3fxj╜o╝{Q»│{╧zHφÆä▌╬ΦM█╪└πF┤?·b∩0╔≥ⁿ┌ZRaJF@3Γ'û⌠9dô8Ü~═QGqÆie₧╗:σJ$P─╧à>84Bl▀█╓ÖMöµN,╢ⁿLî█▌*┤AR9~Y╤⌡(}ü~ÿδ▌└Ñ┐Γ÷┘Ä┴ZƒL·─~ )αÄ╧ï#╛Li╥░ú▐└<eûÿ ó╡╣Q╖∞δ,æy9ù╓ΦA¢φ2╝╡▓DÅëS¬= !
  49799.  
  49800. ΦW!!7⌐Ä& ╡º»%ê/α└µ╬≥╥▓┐╫░ä]P¿╛╥;d@S╞î;@╫KL/.IVh
  49801.  ùK&/\πxVyí╣)°╫LΦ╢╣▐■┴àr_k ═┤d1ªë¡3!!£╙9Yïùhä±P[7∩$£╤TîC`Ñ0╓▄â╘╒αwì ûòÜhí @½srî√6╠┘^ΣD<î^╚₧G°╥l═Oo╘6╛╥├G{╛╛∙ΩΘñ±.╘è▀`k[RGc_Σ!
  49802.  
  49803. ΦW:,½î=%ê¼¥?î-Σ╨éªùò∩╟╖ΣñGF ÷ÇZ}[A╫û~EƒZP"kIjOµôMi%@»<@b¡╛,■₧@Φ░▓É≥▌
  49804. ÆparÜ¿e7εΩ∩t£çg¿B╡x▐Cæ;"cQ▀wè╬\Ä}┐0.▄å╠⌡├¼AìèÆüy ε≡Y@° 1hçπ5₧╓L╘N:▐\▀+!
  49805.  
  49806. ±V.!!¿Ä!!:Öªü'Ç1⌡Σ²╔ ┌▌┘╗▌½    ½║╥|v\;╕φ|bàVR+z^&O╞ôWrfNπ\g»«.ε₧R¡╢║£√╩\çdL~r╙╜y7ε╧╧KüûVg½@│tåε@,ε$ï╓\▄/┼\,╞å╫≈╬¼v╗ì₧ÆqQΓ▒CE░go╠¡^┤▓5Ä]o└V╪V∩@ É╦q└4¥ó┘ÅB4º╖Φ√╠¬║6╨⌠│`R8a[Ç√d[
  49807. ëSæJτ╦02FT╬▒:ƒ{ܬæ½∙mΓ·å┴ò<┤∩τ┬lfxj╒r∙`o≈ÑH╠a¼A└┴Ü¥ƒI█┴╫τRΣ"·hφ2╓⌠╕╪Hl]]8⌡wò°?%à<Ü█RRbÆch═≥;≈7Z╔íΩva's┐
  49808. ╠█╫P\└≡Y&▒┐OèÖô^∩99\I╦⌡ -<£i╠û▓╗gó┐Θó√₧▀~ÉT·─"▓¥éS▀3╜g&⌡╕┐▄╚>e₧ò"τü■¼ⁿ╗n─+Zgε║∙Xì╤"ÿå▒X╨█K¬:_åÑ╖╥=├∙₧9═Ω oê║
  49809. |0Üß╠ΩÖ ì}lÇ╗╩H.╩╥τ▄╧ê)A¡╥'    ß '·╙q\Γ4@δä«ε¥\╪!!π⌠₧àß╬R═l ÄNΘΦ┼Uπ₧▀Σ╕,     ùMI-ÆΣû`R½væ╬F/
  49810. ôùΦ$▌Ωá|år'╝`╝┴╟û╩Prc╝√úDew₧F;i
  49811. [╦;Φw»áö2pÅ!
  49812.  
  49813. ±V.!!Çú&╛░ú$▀⌡╒²╦√├ƒ▄░÷á]Wσ√╘zq[;╕φ|bàVR+z^&O╞ôWrf[½yCåç`■█Q║╛ºè■└^æ{L@zh▀ⁿ7¡╠╔OMçV£5║K│=╠ΘE[:φa¼╩KÖCy≥L|╟ô╤±╔┤=╩`⌡÷∙εßEK▓sJg∩àZ═╩OΓSo▄M╙τE╒σw╞[A╬e±╚éVs╢║╕≈ε¡·t∙⌠│++?br3£µpb_Q╩ûQäñAy VXÇ┴kÉBòΓƒ╒û⌠¿Ä▌ë~∩╛ë╩    1K│l∙`Vτó'¡2°îåû܃\Ü╘ƒªV⌡#±:║s╦Γα╦*S}n
  49814. Eg▒pâσ"uö&ïG┌ 8╞cr├û_è7S╪▒»:[S#qîZσê╔└ +úδ[î╒â*┤EQ9T╨≈!!}àmòíÿ╞«⌐║ΣÉ╦┼ZäLÉæQ dΣ⌐┴~íC─ g ∩¼úăb1䃠í╚∙Pöδ⌠9åRd.,ô╟⌡Bî⌡2ƒ²²D─÷-╩Qvù╜╡╥i╒ ╩~¡▌KF²⌠e6¡±╠ï¢IP·/?ß╗╧|╩²╛YÖ÷¥{C╢┘7*±ttü╩uZφ>P╕╩┐∙╔k╚!!é∙£█ßÜSΣ*c1≈5Å∞┴U∩Å<yìb¬ ┬k\~─ ≡¿Qc    ╦ù⌡>╓·╔±9B╟Oo½╨╥ñ█+>ª┤Ω<#ï\=x^╠!!Θ`º╡═w*╔─╝Θσì║╓6àqL∙Q:ºPV c╩?ú≤▐%\q┐Ma≥uσ─Wp⌠±α√Z╤IO^3Q╖xù╛╝│µgâ9∙ú~╞áτg╧*Nl#ûè⌐X∞▀≈EIσ&!!<╖┘!!&¼╨çΘMƒÄ¢╙CïâVàü╝Mÿ_yπfPh·#
  49815. üÄs_xi¬Öƒ╥Än½FR┼ávÄ▌¢.ï½@Pz╠uÇSFc╧å∩ dº'@ )'τ⌐∙Σ9Gε╝RVgç╣¥rîF╤π╙&û<d=╗∞>úv═ñQ╘║Kⁿ┌z5t"m=╕ⁿΘ"║Xε▀▐EÑéC╞Iñ·u«û░b·T╥ƒ·╣░Ü╝+²ïÄ╛!
  49816.  
  49817. ±V.!!í¢:&╛ïâ.£eí╒╔∙╨⌠√≡ì╤σDQ╛½╨r}O Æà0s»rA>fTWE√ä^Vh|óLF~╢¬"÷█q║▓╢ôÜÑu\ºfWot▀ⁿ r₧█╔W\╒¢5úB┐s╨≤UVI7τ$₧₧öKsñM0╓ä╞·î¡v£Ƀ╙z╝▒CLº ~ûτ<┌ƒ[ΓR,▐V╪≈m ô«z█z╚:±ÇÑqZÉè▌═├XΦ⌡r[¼φ╖)V
  49818. j>çΣW$yJ┼┌\åñOh0A▀ò'ä^BÆ⌡┬╗εhµ┐àìÿ'⌡≈┴ óo^W3;æyΦ{[╠░d┼3φÖö₧ï╤\╫û╩ΦV√R$▓nío╒≥∞╦DeJ5]/⌠6₧⌐mdâ3èC┌U ∞    AâΦ"µ6╞½π%5
  49819.  
  49820. k╞
  49821. ╠╫╩WFçµR/Ñ■]ûÜæ╤*x]E╩  O}ö`ä■ÿ┴ á╝┐⌠ªßª5⌡f│üIPd═°µz█8ñlr*·⌐¥╦╤7~ô╕#úæ¬é╠╒
  49822. ºeC`φ║|≥AöΣm╠ª│u▓╢B╖0¡¿¬─D╗Ö∙1ÿ▌
  49823. ╤íp%¿°▌°ü TE╟!
  49824.  
  49825. ±V.!!▒â& ò╝ÿÇ+Θ█δε±╙╞Å■≤âfm£ƒσHPA└à.B₧QCp.Z]J7█ä
  49826. Qi"aóqV*¡Ñz║▀r╝ú╢£√╩/
  49827. àq_
  49828. │■] º▀┴MM╒[╙1páFñ|ä╝EG x∞eû╨₧Mp╡@3╒╥┬╢─⌐tÇ@ô₧àyεⁿRP¬o;äα!!₧╦WΓ)┘Q┘·"o╣├}╤A|╔=┤╪├)┌¼ß╛⌠¡┤<zî╬æ.'Ve Kg ëε>e└█ü¿Wj|WD▀┴#äMOÜ⌡╟╜≡!!≤¿Ç▌è;ºú─ █8R╜q∙ 4]√±}╚h6åo┬á½ú┌\ô┘┴╚C∙n·j≤4╨Ω²╤
  49829. )@]2▒#¢≥m9ü!!ïZ▐MGPÆreî÷kú 7[▌»ΩY%t
  49830. -v╙Z╪╟╫Gë∞RG▌ûA₧å▀J╦ ,YP╟░+)üyâ╗╚╙¡╖⌠ó╬Ö╪▄O¿ìF^d⌐ü╧├+úi`≈▓⌐Ä─11éö9┤¥±XQ½·°<æRu9é¥Wæ*⌠ï^Éτ▓A₧ïR╖+_é╗ª╠:æ±é9âèO⌡Üi!!╣┤╨╩å+TPè&F¬▐╠_(█╒ΩY▄╝┴)CäΘ+╠ Ö₧{]■+Q∞φ┤σ╘X╪&φÿ·Φ▓╪@╪w^îH╝╕√H■ï┘░÷;@£f╞Ö╠ay╟ ¼╥G/éÇ∩#ÿ∙σ7╤_Z╘wz∙═▄µ╠xjjª┤≤H< ÿO*mO@à&π%╜⌐₧$~╦╟╝ºδß├ l^─fF∞Iu░E:\╚'ⁿ╖¥{G>║_│uçá;n≥ôÜüZ╚_xO7[╖e₧╪┤    «∞/╞BΓ╖x╤░τ4î1ubZ⌠µñ²Ä¬÷▀╢²+:o≥ìbº╤IZ╡ΘM■âD¢çGâçRô┼╗\âΓ=1╙?FüÇ uR{h¬τ╡ì┼╬#~┼≡e└╒╒*┘ªK-xY≤~╚SBc╬Æπ#ε(Hg#╝√∞Φ>@áⁿ|{≈É£rÜB╤τ╒'°e1o└Φ:úy╔áù╝y≥á]pcj*²Θ║a⌐B»╥å┤ÇU¢Pë₧ÿìö~Φ|▀╤│±ú░ìùèΩe┘gíßHö╨H▐÷SΦKuBφB@!!╕3┬Y^ç5V⌡0`jY┌╖>╢L╦Ωôb»SεSα¼Γ>áhS` φƒâd T⌐╔5_«pÖÆ,Yæ2╚Ω)╓:±n⌐;┐¿≈ )√±^»▌9╜1^U│k┴╣≤UVª#\╢≤ⁿ¿
  49831. ┬%█rXⁿüI<$g≡≈:┤╡<ë4üΘS∩&∩π¢l▒╛≡EA²¡₧/≤╥3@░║╪≤╨╙┐Al╗URåk╓î─c∙╙û1vß╥"╞í⌡áß
  49832. ╪ΘSà╟8π∩≈ñ┬=I h£h╠O╠─▐â°╙*»|í5╝Ç*[àΩ╓ Σα╠Ö⌠5è<ÇW@¢r9Q⌡[ô▐┐─K╚d╫{α≡nI*ª█¿┘5uñ═9╜$╣▌ÑJ½    ╛ª}┐!!`'Ǻ-4▀%Ä╪╝$Ñ∩"5z╚5v╖╞ ╣ù¥┬7┬3▀▄═╜u╤ /ù½Ç┘┤░'╩╢bR╪₧╦╨ ·╞╧╓$╔S∩a╣╥ò╟r#╔l  q?_ìGgJ ┼ƒ¡╔GO├─ó▒╔/[M╠+╟EÇε≡é┐à∞_V ╒âbîßkè?    ░¡bR┬▄╫\■£╖-æÿ¬┼°╗¿kxw┘ón╠ⁿZ≥│₧ë╨Å┼ób┐î*<:╩√╝▐▓[╚ⁿb√«êlñ`ÿú║àjâ┼▀;P!!╘╩d·¢ƒ æ~?ಠV¢è·{ìK≤√ ╙X≥BCÑ╡ÖsI %k<-_√C»ε┐RÆk▌⌐|┬ùP═ÿ₧∞ε╬╕ ╛奵2₧Ü| Vδ>Üv '
  49833. [¢¡fα╧⌐╬ï╔ò`Ü╛²7[xZ│a╧
  49834. ªⁿ»M₧síà>┐ƒ║ówÜ//ⁿê Äú l⌡öE¥ZpσEJ@j&╬íx⌠ΩO«Z\ɱ│yÉ╞─ë∞≥Γ╗╛╟]Nⁿ`┬{╖tσ⌠<Zó_╗╘W¬╖⌐╗s╫~≡░ëo¼r≈ßpså+=╞q$╟0ëJ_\!!Ö}ò√O≈F╗$*÷Lzε^é[ßèûò.╩M▐ú»¥furε╬M¢╙▄▀BΦ└X²J0 ΓcKîi±9ä ÷~Ω∩πìΦ╥╤π%oé┘╜═1&╓Γä╦≈    d┐7⌠┌~¥¡\⌠[∙q█WD}6yyNo7<┤åX▐)▒∩bEܵ
  49835. 4 ß ┬í╚▌^!!DΦÑj$┼ΦÅ╨╘┘-!!çM)gYë(\S┤c≈ò÷½Y╪Rì¡C╨╫└█Ö╙Dg░b3≤}K╝▓>°r═@ú ÷╗+Z)K5┤1>ûJüΘ±7²ª0▄╦╒Pîy╥r¥C│≈-▀■≥┘┤dΦ    
  49836. τ|Ym*_u+K}┬-ÿi=Äδl╖!!~Oσ|Ö├Yφz─Üt┌x∞╒@U$fêúS÷äD╤ÖÇä╧┌±Tε┤¢70ù░w YΦ░╩₧O}.êxJV╙UƒφôñΦC 4Çφ ΘáèÅo╞)Ra┴; ["ñ╗¢>)«e─╧╖~╝ña₧ƒ∩ΣWsΘVúR    ∩≈┐    mÇ╥ááá÷t»!!    ╙[═╗<5■⌐ ΘßîEo\+    _¬µO─╠»v%τ¿τ1≤|BiL₧ï╔0T-k┐I╫Yü%└╕╬3<┬GE∩ëèΣµèS┬½┐nx╗╢¼6¼x▀Ñbi Oy_ⁿª╫╪à)&±S½╓ù
  49837. ╧CM╙R.L8┐┬▐-)#·#;"Bg µp!! í&#d\ºτx6,`7·7L╧ÿ╢9c»╣₧X0/}┘ Γ≈µ╬≡¼m╪7¬╜╠▓gûr≤√╖vHd¼eUc░â²îÑàçô≥ßEZ3dM)Wvû∞î≡▄┴L2πd╒Z5ñVgíÿ ∙ε'K║ó&╖ìACtΘêú₧,▒^╜ñ╖Ü≤÷ºƒó)è╒╜┴J╒wº0j─íæĬ,Äöm╥>▐BZ╝wE┘ª1▌⌐t╣T╤î≡bU]╠Ö¥╙Ω¼¢ⁿ*qZ≈-L#╬╨ Ñ⌡m¿'αèû╪α∙ºUZÜ ▐6nàz√yé╧ók╣╨44x∙│╫ì¡δ+H∞Æ■½»┐Üπy{[≡Θá│êlàm│üòkcíäR ╜¬½┌}ôM4ƒdñH>Üvódü∙`├j±0q^m╪ùF╧è ┤X¬Γ≡å6▀▒ï█促6°±╤?J▒*)═NÅΩé V╗o'búæ}RR;9W╢■GBG±}¡╖5&Ö½▐í[H¿.ôY'ÄûzÑ║·≥Zû ;êå─╫├╓7S≈R║î"#f╘1    ½s$τ═╔¢w╚╦kæ╣½p
  49838. Më mº7╗Cíu½¥fnΘ╪z*Q₧ïz$Só!!%y4    óJä│íc1╞Eε"9/ƒ─┐╪,ó/mΦ²æ≥aÉ
  49839. oR"▐╜Ω╢╫ε∙zd:&»╙⌠£Θ┌`$Γ<±δ≤BæF;µßW∙░_«╚íΣ┬Σ╡⌡Ö[╫aÄ{┬ε<iL!!┴≥ /¿2▐ìÑìå╔▌═"½⌐½Ñεmlµ╞çFa.ó┬0²_ƒçWµΘr;a∞OVÄA_â;╟cóC1x.₧╨M╦Θ}¿¬═╩╘⌐0■-v⌐p¥Ω0#1p┴dü¢æ%{!!R░.)µ╤╡√S⌠jó╘µä*²J╘C▒^k=╤7_╘º╝]J1┤>VYZ▀▒ 5,ö╨FP║■>╟wj δ├½ öv│═öpwæ7Γñ^ασ┬âü)█¬÷╖
  49840. τHöOZV┤08Wf £yKo╖╤°
  49841. ≥▒}─▀`■ü▌@⌐╦┼~Γ|5ô╔╤Φ═╠Q>¼}ƒ╝Θ╪é ¡lbùKz╜≈a¬áΣ▌ÅNòUJê(╒@? 6åå.¿╘╞█╫╒o&!!┘i¡bφÉo■îⁿ:hFµ{iû+▌t═=`ÇP/el⌐b╪D█'4Æ░å;╝7"ï╜|2∙╦v.⌐÷q╝uTå╓╣÷I╠Jƃ8┌â@■Qαÿσ░≤- àd░]    7Å?∩#¼àicªo≤æ█∙uÜ°░¡·}ôê┬╤╓cM╞ñ┴Ed=ui▒├í1D▄ÿWT╤╡à·█┌╨Qcÿ|╒ó₧Æ,└{Hÿ╘▓mü£*h▀]òαƒ≤²╘p∙«┴W≥.ε█`╔ÉíδàΣT.+╙¢Æ╖wÄ╣{,√√╙╖É¿ù≈─(0w
  49842. α 5■û╠2`╥ê│*▀]òX>v ∩▌#æ"M ╓∩"!
  49843.  
  49844. ±V.!!╢Ç",¿╜ò    è2∞╤ß╪┌╥▄┘Σ▓ñ]bçû┼vqMD÷ü-Q╫PJp.Zc~ΓÇUc[▒yRg╧┴I√εW╝╢╡Æ≥ⁿ ÆuS@mr╬╜ohε¢Ä4"ⁿûsε.▄∙εXA┼H╗█ZÉ4¡δ┐╞√╬Ña¼îÿ╙rú⌠:.╦    bÆΩi₧▐Q╞y╔R╪ß    dΩ─8╓Fk╙<▄╢Ω-{╜⌠╕ ╨╝αa^╡σü`GX!
  49845.  
  49846. ±V.!!╢Ç"┐╜╓jä╘·╠Φ█Σⁿò⌐αñCS╢╡╟!!3IX≤╝WâWK.@Z^nO∙ÅDgZ╖hRh««ε╠GÑ≈│¢±╬    â[Ngo╘╜a!!⌠ë┴{GÜû{ε.▄╥1εXY,Σ$╥₧~ÖLq╛(╓╥╫■╔α~ëæ█æs ╖▒XBΓaJ;èµ4╓ÆSΓW*└█≡(rΩ╚jéDa╥Ñ╘ådííΦ│τ╝┤mY¡Φ╜BaCFt;îτW]&R╨W┘ÅßK    mo■ñ¿N╓²╘¼⌠nα⌠┴∞ö-óµ█I┴ ;Kⁿr≤OyZ÷╣f─-R FèÄ╙î┌₧█╠≥V±~°ï^»Ä╞╠Jok#Tÿ'ü■#qú5ê~═QefÆBoëΓoú iµü╦r's┐▀▀▄Füφ}Ü·]ùÜ¢i▀!!==*x½ *Y}É\é∩╠╙ á┐┬ó┘Ä╩R!
  49847.  
  49848. ±V.!!╢Ç"»╜╓jä╘·╠Φ█Σⁿò⌐αñCS╢╡╟!!3IX≤╝WâWK.@Z^nO∙ÅDgZ╖hRh««ε╠GÑ┌▌≈╡ üuJ.-Üî;á▌ÇM@ÉV₧|á┤rö╝^II9í$ù╫^öx⌐9▀╥┬⌡╧Ñ`¢ì█òsεσ_AΓptÆó#╦╦ΩD;─P▐V≈(r·╒q└GjÇR█╡ü]4ºª²╛╝ ¥┌Cx£╙æTBdTRk7Ç»W3pC\└╩Q₧⌐\-0L[ùì*¥_╓²╘¼⌠nα·à╚ë=ºΩ╦ ╦E5R┤y╝SUg╧┤}╚b_┬ôä═π╡!!Ü─┬≤O±$÷+ε=╤Φ╕╦C)\)σ6æ√(Và&ÜO╥FCqüumê⌡!!¡JR█╡ΩE"zDrû╤Æ╩QɱY9ñ┐NÜ¢ÜU▀81_NQ═÷d8àdÿ öÆ á⌐⌠÷╪Ä╟Y╥═ε(<M₧üè═j└qδ¼╣└╤pǬ>¿ÿ└Aå÷ 0┘q8⌐≡1┘s║î]σ╬│Uç₧π9!!╗äó╒!!▐⌠╛?¢é'lê▌j~Ω⌡Φ▐üPF╞?╘Ñ╞K1!
  49849.  
  49850. ±V.!!
  49851. Ñÿ,«íâ.º0σ═╡î ±Ω√¥╓Ç`` ╡┴vv╙èj║ZP"a_}j≤┴W<fNôiG~ú⌐, φV¡╢║≤¥ª^.à}Hzeܱ-╝└╬M╒¥Vp╢W│o₧≡I6Γpû╤W▄Auá |╒¥╤╢╪¿v╚Üûæyε⌡RWíryçδs▄╞≤I*îⁿ#▌E▄⌠[£¬V░╬äQy╢á∞▓áá√sY∙≤╖fRZ&3Çú"vZ]╠┘╩áKh|B_Üà*ÿYƒ≥╘╝╝hΩ·ò┼ƒ~Θ┬±$╩?-╜q∙Q4^≡╢|═hU°J▐∞∙τ╨FÅ┘à≥J±Rl¬~⌡'─σ⌠┌)R{JDc▒6ü≡8hö:ï¥u+/    ∩| îΘ2αJ,Xê░ΩC#Z>╩w┤╗╨@F┌╛+æ╩g╝▒║t²l5UM╞╛IiTÉ~É°ÿêS∞╗╫âσ¿∩z»{αçuW6탣]ª@└Z╪▒Ñ┬┴sÆ┌#⌐ì░[Σφ≤,├Ru$ò┼°öΣ:Äó»âƒT∩x ļτ╬/æτÿ7òÅ
  49852. αó
  49853. $I└¥▒╚Ç
  49854. EK╟z*├┤╞Y/─╥φ
  49855. òΦ▄@f½╧#    ⁿ-<⌠₧GGτ>P±╔┐≥¥O╒0░≡╨Ç│╪_HS═$ZîWπⁿÇF¬ï▐½▒-]BÄSC(╫░èmRªmî═FVm
  49856. ┼┼è]▒∩≥<▐_ê9>∙┤╣╧~╫wJ}≤╛╛]π'SFyB└,ΣdÑæà8.∩├╗▒¬⌠è f[gε
  49857. "ò,s»e\1@┌%φΘ┌mX╒65╒CEÿε" ïöÖüs▒3T[^gAΣ_ÿö²▓╣}°¡½Σ¿π3╒:b#ûè╘0ò⌡╞±Vφ≈ ½gNEòß╦╝l!!╢╠L¬ûC╫æ}Üà[ïê∩\█ JΣ<ƒjCQ¼Θc>╨¥µ╛δlÖwz3eóëkΦσ⌡╜ç}8h|W≡V╧Fk═ì∩01║9Q4s╨âäî2Ræⁿz>W«╜Σ⌡.°▄╙.▓eSΘæV╪a┌╣├àc╛úsu7R?⌐αª%èCδ─▐E░Ñt√1└╤Cò∩Ωç}╔╫╗ε╜N╙α1╛ÿφC∩K¿»▄πg═⌡_ï&*\l─KYAMTó&╬^╬FM
  49858. ╖q!!æΦyö\╓Ω≈I¥}Pª│┘º"┤iu!!jÆ≤¬É,√╙%■^î\╟1Bû[3≥φ+╓.ét╛*уóS3ⁿ⌡(é£G─QN\óÿªπεw:ù+╤╠═.≤d╚n\²I▓V3*ƒÄE╧∙Uåz└µ1α °≡ä#⌡⌡▌?'Σóÿ+∞ì3σ ╫q╟≡3αƒ`∩BÉi┴É╒sú■ΦAg╘à[╕╔┐Σ÷<╪╧Oö╧éâçΩ╬+^7hîL╙aXäé╘╩ΣÜ}â[∩|Φ·N{¼Φ╩┐ó¼µ¢rh¥)¥fÅj*0≥[àΓ°ù1º■(╗ä4}=EY╥±╧╡Kσ║w─Z╤╢╣]æ╕∙<╜Y^ⁿ┌Wd▐%Ü⌡`╨Yƒ≤ 3Ekï._öß√║ùè├
  49859. o╪%╥ïêΘuè╢{Üéæ?╚«╣"τ▓5Σ┬í»a─╟⌡├(╬Lñ?pc│ ╦oΩ║m╟q-/E%z╖J1I₧¿YδΣ$(╝h⌠²æì/T⌐▓lΘìè√┌ÿ╡±æ╤bîßsî \°∙0ú│ì!!σƒéeBó▒«»â╞ÆD+&┬fg╬G¬ôπúÅ∙╩ï-─±T ╣═0;/7 ò√²è═<▓)ô∙ⁿém╜7╫ñídδτ⌐▀*6δ╩~╧ä╤╚╗Tⁿü]╔B╟╫Oñr┌ùç╜q┴v
  49860. │ÇÖgAT I5mE5╚ ╠E┐√>çcÖÄnµ£Píα≡Éèó┐ñ₧¥»2≈b⌐U√Uδlz├
  49861. ]Z<RRƒ¥z▓╓Φ«î╩ò`Ü╛²7:V\NÑL╞5Φ«ΓM⌠ ┼ΘY┬╪╥s╬j▀6/û▌«¼∞F▀Ω%α;C╠,JⁿÑ{⌠ΩO«=0åα¢x┤≥▄0▀á¡ú√╖ΘVrâ¬o@ⁿÇÄP<╔╙s«i▓╒╤╪║Wÿ╫≥oÄg·á}y├;╙a(╧S{≤c0:Z░yÖ╡W¿₧E╨`Y╒ »2ë≡|╜æ-⌐"eú·╗╣3~mV0Ñïpè╓₧πΦ└X²"∩ ΓR\öM╬!!╠║░3╜Φ≤╕╩└╨┤`%═≈⌐τ"╜╗°╢è tº║êP$²«\⌠1σnh═==LdJg&zlü$üMµe│░5X├«DKYìpOσΓÜú$D,≥φ>$    îå╛╨╘┘δ#qp▄sIZε▌εÜ╓M─}víªX╫╓ⁿÜéƒS ¼iv∩V>T╝ó{δn╠!!┐
  49862. ┴╗'2n)«pε&ⁿòèPåΩ8ÉAê╗2=╪1╛ ╞/╬▐â`╠╙7°£4d▀[Γt'e#Ab╒Æ5oqσå.⌠l^+Kµ|■╧G═X─ïX╗H┼√+     fl╤D[Ä%≥äD╤±┤â╦╫≥A▒╟å~[≤ÖL(òÄ╞½sd`e├JX7åÄß╟EφJ╗t╒«╩Ωáφπe╫sl≡2@[?ß╗╛\Zα)₧à₧w│▓j«¬Θ≡zQ,$╬RáyIk«╞ñ]pû
  49863. ┼ò╡▒÷5▓Cj┤&í`⌠n5≈«E E╝`£α>F!!-    ╜┘Hα├╖lH{εó░Nè'MæñéI
  49864. ]z=Ω$Qò\è╪┐╧7s¡&-≈à    îv▒█σTà ┼
  49865. XÆ┤░!
  49866.  
  49867. ±V.!!
  49868. Ñÿ;╡╣½/æε╨÷û╛╓╤⌠å▀á^A║⌐Σ~`K▄à3W═E$Oc~n■Äwg+Jπs]0Γ¬∩╩V¬╗▓¡π▌Ü4i,P╚╡{3║╠ÇÑÜaεW╛x╨≤UJI>εv▀▀ZƒGg┐    2╘╥╫■╔α;çïÆ£ró²N▒uhü²:╬╦Zπo▄M╒÷?uαç¿+j┼,▓╬èFq╖ε·τáá± ƒ╒£)&@uvU)n╕+╤3BlàW└çú\pC╘┴;â_B√Ü╕Σ∞t≡«Ç╧û;å≈█ ╬iGR╜n√
  49869. `á▄¡2≡Fùà╙₧═GïΓ▄÷G┤"╜hí/¿ìæ╓3FH3╨╛≥ gö&╗K╠Ofïid├û_è 7[╦Γ╡
  49870. q;D8F√╙╨▄V"à≡_j╢φNèÿÜI╩7ENî¥Nj▓cé≈▄Æ ⌐·■╕╬╦─Y▄L¿üD!!│ù¥╬.φoc∙╗óÄ╠;b█┌?¿à⌡ó╣∞!!èCxwå┼╝-≤ê^Å▓«@àûó;É║¿╙:æ∙₧~┐úC±╡g,ΦÖ▓óö VGègvÇτâ'Vó⌐≈L¿⌠ëlΓ▒YaüGë╬qKπ:H╚╓╡±·^╔&π⌠ä█ß╘+6░g2ùZ╓Ω┼TΣÅûΣx▄A k≡2}|ç╢ìx ε~┘¼(fΓε┘╚ⁿ∩+┌Yòp}ù╨▀µ╠+>T÷⌐δV{2₧3no_╒;⌠Xαß·]Wí»╞╦+óµ÷╛cL▐#&û,└<']:Σ*╔ªÄj3░Zo¿jëú~nπµΣ╪╠{fgXσ~üƒ╕εÄW¬kä╦¿╠α"└>Ns▓Ä╫0²¼║∞D╩⌠:σ5&.±╚tc║┴5úª·╝],▒²^£ÿN╛£┐ÖB:≡&:╛5╙ºtT7n╡⌡µ¿├o╖I    bíóC╚É┌0┘½@-fPΓx▀SBm╘Å■6ΓiP"=²Φπ÷,Q╖«{3«╙üeÄB└÷F┬;ñ |Ωæw∙a┌┐π▒f╖≈Yycv4╛Σ╝%¡_═╪îºèN╟Hñ▌E╕ëÄx∙{]₧─┤·≈µ≈y±ë╫{╟cφ¡    ▀≥LîÑ╖q
  49871. uh╟g,
  49872. x5T│hÅ1tó0#│@9>L²ÇÉ}Ω╠╥a├4y╟v╔√░?»oI0têµ▐å⌐═%Rστ╗eLMæO"±∞-5█/ÿ:ⁿr░╗úFj┤ÿ½╫8¿9_\∞b╞ï¿,,┌6#    ╢≤ΩΣπ0┘g\π7ⁿx,>amß╙:▓Üpî`ü»9δ8√óà'Γ└Å 8Φ╛ÿ7╫┼)Z¬í┤[»ù$■ëbC·Üb¥∩║╢¼√[7îÜvéαÜ╞ìP┼²pà╞Fî▄▐╟¡L4RF╩y╥LMëæ╓┌U ╙}ú`σjΓΘ_åä«qîïï┤ƒt[æ4¥Mdág20N∩╣╡╪╛5╠dÉ4░╡(|║êµåoσäCΦc╒á╜Wª)½±8≡5f0Ç╛;z╪òCª<╕'┬âr7m╥(o╛┘╥╛öjµy╛3|°5<█ïê├_Γ╦y≡▒╣╔¿╛!!Φ▓\CM▄ì┴¿bg¥╗ê╛@┬E╣Tdó+╩┌ô&#╦}<
  49873. qα+6g┐╥<πí52Ürδ┘┤à/T[\├~╓πÉ╖Ω█£┐B±çî█σkΓfu¡┐EQ┬╩ß¼⌠▄|.æÿ°7÷°á╣#,:┬ah╪G¿ÜF≥δ₧▒─òy╟²,│ë<-ypà▓∩ǃ$»|åΩ░╚ ▌P╡└ê{àjδ£─*\4µ╙uΦâüá╨4 ü]e▓,¡ö≡#ÿá¡åC┼uj▄▌Γ-e<kVIP Wé#╟┴2çMźzµ£┤ß¡┼╧∩Éÿè╪▓wΣ7│R═RΦlz├
  49874. ]ZDÄÆsδÉΦ┬⌠ñ R₧╜²7jc*fFJ┐T≤ΦµºZ┬ ╞ΘY┬╪╥sñv╬/9ⁿêZ┴═{▀*h÷ö}┤'╓[Sn °ª{⌠ΩO«Z1æ«δ╩║╣U∞ë┴╦├σ▌+S«⌐o`/│wσ⌠TVF░m╗╦W├π╓╘│z≤░█⌡gèë|z¢ ┴`╞Q5ád44[∙n.ê»Ω]αoq╢=│låXîΩj∩≡F▌L├╚╫πO>[└τ*É┴â÷<mûê=ÿ@¡Tµw]┌,àv√É₧├ênÆ≡▒╔└íq╠≡╥¼WùÜÉ═Σk╢ ╬╔zâ3╞!!╟Γ"+┤gm@zyN<!!╕"úYδ²±yYεâvOZìpOσÅÉó I/▒≈*Uµ∩î╘╫┘▓2}B┼Fía┌φÜ╓%ú5'éªTΦ╟╞║â    à]>╢qa■t9■ΩVqç╢i╪g⌠ú3{
  49875. t╔0Θ%ⁿ²╙,⌐ñ0╥║¼(x┼|╛ ╞/⌐▓oû`╠¥v╛┘j:í wαk!
  49876.  
  49877. ±V.!!
  49878. Ñÿ;╡╣╝?æε╨÷û╛╓╤⌠å▀á^A║⌐Σ~`K▄à3W═E$Oc~n■Äwg+Jπs]0Γ¬∩╩V¬╗▓¡π▌Ü4i,P╚╡{3║╠ÇÑÜaεW╛x╨≤UJI>εv▀▀ZƒGg┐    2╘╥╫■╔α;çïÆ£ró²N▒uhü²:╬╦Zπo▄M╒÷?uαç¿+j┼,▓╬èFq╖ε·τáá± ÿ╪ƒgCG/c!!ìTú"vZ]╠┘]╩«Wy3X╥äo╫JéΣ╨║≡d╫«ô╚¢3δÄú`╬0▓h░OaLδ┐nÇySΘFôÄÇ܃M¥╨╠σK±$·{≤<╒ΓΩ╦zJ    0⌠#¢°)+╙Y⌡#╡q]bögc═·'Σ(Y╞╢┴V<?YYb╗p╖╙ΘQöΓ^&▓╠]ìÉ₧J│FQ9N┌Σ)░`¢íÿò⌐╢≈÷╪Ä▀oÄW░üWB=ëû╒Sîq└q ╖ú▐╔>h═┌-⌐⌐╚y⌐√■;ºEc4Mè╓⌡D┬î]σ╬«DïÿBφUuié╗á╘$╘■äùèOíεR$%ñ╒αµÉYK╬*═▓âK.╠╒≤OÆ≥▓hOº╧}eéG5¿┘w░f∙╓╜⌠╨^╙!!ì⌠¥ä▓¥ OF▄*c1≈]⌠ ├H¬╩î╔▀A@¡IS#═Σ∩b{zò ⌐╙Mjƒ₧º>╦«Θ5┘U╨},╘│╛╠~╖}ß╕ñ<e╩#P#;¼&δQ╗┤Æm~Ѽ╞╦+┬ëδ²_MöfYΦ\:íT]t^╨9ⁿ≤Äv?ⁿPR╣8å¬;xª╢µφ┴[4]÷}╪┌╨d═ëT¬kä╦m±░τ3═:'}Φ±╕X±±┼æ9óƒtv
  49879. π3"-ª╚(=╧┐ls▐ò0╫îY╧ñ[Ü╢Rå▀∩PN╩ r╨::₧5 ¢├B/ve╕φ╡╡Γ}■
  49880. &eóëº╣▓W¥½] $uO╣;█Ua¥╠¬N├C-gNZ╘Çπα#@ò√{aM¬Ö╒÷.¬ïo┐K╖7*|éóσ?Ñ┌x╛┴█µPHoy?;»∩¬aσ ╛░εl╪Ω(╝{α√*÷∩Ωç}╖¼╙┼≈N¥√+ô≤è ╛─╥a╥╫\╪∞[Σ@F┐ Dl&N(▀[ª5wó{\ª@9>y≡ÄJ╒uk∙┌┌oÅJJεX√å╚_╚z*Iε≥πåΦ▀z ╖>α╗eL*²>_¿≈< ├╫nÜ>╜⌡≈)¼ñσÆm⌡U60▀KΦ▀Å(/╜2 Ƶ╔ΣèdâcOΘO¢K$Jt°µ<µ║h┌z╚í*~ä]öïδKƒÖ⌠!!-⌡╕╝;Ω¢3^╢í┤[»ùI₧≤&ÆUAÆdë┬äM∙╙û1╕«_╙ÉΓ╕≡8╬≈S╖▐Gîçô╟¡L4Rß ╬FEÿ│╫╫4·╠gΩ)°g⌡■E>ΩáâCêê■¥≈5φ:èWqî<g`┬q╜╢╪╛U╦Pû-«╡|(Uup╓≥╧╡.╘ƒv─O╥╕░k╢»²0▌^^ⁿ┌W┬)îváf⌠Aº░[q kƒ/r╣╙ ╣ùjµy╛St╔?=ε─▄Å9ç°/ïì¡<┘¿æ"Θ▓|Y╨₧▀╤Sc₧╗ê╛@Ñ)▓er│7√Lφ╣b≥|- Q3W╛uM ╫╢{?ä═##▓s╧φ¼¿yâ}┌    °ü├½æ┬┴4-æ¢Ü≥╕g¬■∙bB╔╠ΘMΓìÿ}Bδ▒╧t╒■⌠─lXQ É!
  49881.  
  49882. ±V(
  49883. 0*░å7:╫├σhñ1≥├Ω▐╛ï╠╨»τá]@║┐≥~rLW╨ê;qÿSH/mOZd¿┴_&næXvYü╕`■█Q║╛╡ù∙╚\
  49884. ƒqm    ▐╡~"»▌├QIùûVe╝Lªxé⌡T\I9≥wÉ▌P¥Vq¿@+┌å╦╢╪¿v╚Üÿûu½πΓNoç»'╓▐KºU'┼LÜ·>uö¡╦Q.╬0Ñ£ÇKyú╝²÷σ╗²vY⌡áí fCrrèµ>6[└╬ƒÑ\-(KC╔äo¢Hå⌡├¼⌡d≈·Ç╬Ö;ª≡└ ├Za{╡}╝fP≥╢l╘"K■    Äæå܃E₧┬═ΘFτ\r╫îY¼┘δ┌@)Y[4≡5ƒ≥>!
  49885.  
  49886. ≥Q7'¬¢7;╝¿Å/ΦUêû╬┬φ└┌╟■µ¡V╛√£OXAX╓¡0FÆMB+m^re·ÿ\txºy@i░ó"≤╨E@╝┐▓▐½∞33╛zJ|f█┐hl├ú⌐_ZÜ╙}º@╛=ä    ∙] ;Σmë█K▄Kg∞9┴¢╒≤╚∞3ç▀òÜpOº≈P¬eJiç∞6╫╔Z⌡+╔L┘·/dΩçQ≈Le╬0ª╥═┘├Æù▐¡°f░≤ûi+?b;ê>±5+k┌┴╩ÑLl0jB╬ä=ì[ô░┬¡∞d÷ôÅ┘ƒ,│Γ╩ ≥h]b{
  49887. ║Z²gZ╕±R╙xKΘ▐Æå₧┌Z▓╪╤πP≥3┐V!
  49888.  
  49889. ≈PJp\zàü!!>┐╗╠+┼)α╞µ═≡├ƒ┴ºΓá@░┐┼;;I▀ü3PÆM%heJ=╙»+t/fX½uPbΓ»%Θ▌P    ¬▓ñ▐π╟^âmN
  49890. ││kr╕╚╥PI¢╙}º@╛=ô≥M x⌠wÜ┌êM4╛,┴ù╨≤┬┤3ë▀öæv
  49891. ¡σKñ sç»'╟╧ZºE*▀\╚±(e╣┼a»(╘7┤£æAw╢ºε√≥HΩÖ
  49892. 1╙ëî<6Zb|8V║)╦! !
  49893.  
  49894. TKindInterfaceAnalyzer comment:
  49895. 'TKindInterfaceAnalyzer is a class which wraps an Active-X Automation <ITypeInfo> interface pointer that describes a ''interface'' (a dual or custom COM interface), i.e. an ITypeInfo of type kind TKIND_INTERFACE. It supports high level behaviours for analyzing the type information associated with interfaces, and for automatically generating a <IUnknown> wrapper subclasses.
  49896.  
  49897. Note: This analyzer''s capabilities in auto-generating method wrappers are comprehensive, but certain combinations of argument types and IDL flags may foil it. Please report such generation problems via the normal Object Arts support channels. Where it is not desirable to wait for a patch, one can hand craft wrappers for problem methods, perhaps using the auto-generated attempts as a start point. If a previously auto-generated method is moved out of the ''**auto-generated**'' category, then it can be safely modified without fear of it being overwritten.
  49898. '!
  49899. !TKindInterfaceAnalyzer class methodsFor!
  49900.  
  49901. ⌡]7>1¬ï_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;R]B▌ë?F₧PJjZbcN$▀»:g5\¼Zk╢«$║╔Ká≈úû≥ÅöqWkrö■X╟ñ¬0ví=║8QæjÿI╡3┌pl,! !
  49902.  
  49903. !TKindInterfaceAnalyzer methodsFor!
  49904.  
  49905. αV"-'9┤ƒ7;⌐¢ë;É6≤╤δíö╛¥σ¼√│RW║√ì;RFE┼ü,ÇWA>f^A+╢ë^nkCªjVfΓ╝2√╬R║ñ≈ƒσ╩\ ÆeK    |e▐ⁿd<ε╬┼WMçƒX7├)█∙?┤BJ>ícÜ╨\ÄC`Ñ2⌡₧┬±▀α}ç ₧êÿ&O£≡@iºttåⁿ╨╙F«.┬[ÇV╚>tΘ┬jéC|┼ú▌ôTqí╜╩√±íµeXä!
  49906.  
  49907. πE44Ñ£!!D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3lY▐ö6[ÖG&oH@+σär)▒yCxº╕%⌠╩á▓≈ìΓ▀ öx_} ╒║-&ª╠ÇPFüüt¡F█∙∙BLπa¢₧[à`ñ|┴ù└≤┼╢vÜC▌÷∙e╟φFús;₧éY╖▌^⌠DoûÜ÷!!g╣╘m╥G|Θ1Ñ┘æBu░½╢ôèoû÷aO╝á╗,lJ8a[ç ╫%t≥4Γ<ú»Mh.EM┘äµ0k ∙╫₧²m≈┐█ìí~⌐ú╟┬wi╒òGz^∩┤)Ü0εìä╙Ç▐E₧ƒà╗│;┤`∩<╥Θ┐ƒ@]]Lg▒ ║┬#nƒ;ê@Γu++
  49908. ∩    iï▌4∩ êÖßV<?
  49909. D>æ3·█╩TöαTm≈÷O½çèBälyd╤α%>ÖQ·æ▒╗g┼│≈É╩ç╪Z╞¢åDE!!αòâ╔+í_[%!
  49910.  
  49911. τQ)!!1½ü(⌐¢ë>É-∩Γε└δ╥àò┐╘É}`¢₧≤X"?É┤,[ü^P/.JσûK&1Gªh[o░δ/Φ₧L╝≈úû≥Å ÖwJ    anÜ╕h!!¡█╔[MæVæ5║K│=╠'╔l-╥G┴ÆæG`ñ8ƒ ⌐ƒ─í`╚ ▀êÜ{º≈^Gún;ÉΩ'╦═QºW.└J▀X▒@ ö¡ⁿCH⌡Æ°ªwW≤║ⁿ√≤ΦΓtº╜≥<6Zng.Uó>ú"+k╚1°?⌐à|^D█ÆÄNùⁿ∞!
  49912.  
  49913. µA)'9░è%╗║ƒï6⌡▌ε└≈═┌╕╘¢τcQ╢¡┴ovÆú;\ÆME>kGc
  49914. ╢éXu5¬rZ~½¬,≤─Cí╕╣▐·╩ÿpM@ho╚ⁿlr¡▄╙MGÿVÜa½Q░|ô╝F](±aìɱ(╞i/╞é╞ΣîºvåìÜçy,ó≡DWïnoïε?╫┼Z⌐,EÑ╔ +!!■┬v╟Po╘6╛╥ÑHu┤╜╕ εà⌡sWπá£$pHVo=Ç>Γ<tñ}ñxâºl0PIÇ┴ÿ_É░╓╜≥d÷╗ò╚╛;│Ω╟ Θ9
  49915. │r∩25!
  49916.  
  49917. µA)'9░è,╝áé/ú*∩╫√┼±┘╠╕╘¢τcQ╢¡┴ovÆú;\ÆME>kGc
  49918. ╢ç We2F¼r~ú⌐, ₧F«╛╣ùπ╞╫wR}sÜ▒h&ª╞─NÜ╙}½ñxô⌡GJvú    ⌡│3⌡^4╕.╘ù╫╢┴ÑgÇ¢ê╙║╥[E▒sJg∩àZû╠ZδGo╧^╘1÷#dδ╞l╟ab┴,ó±åWg▓⌐²ñáE¼±fU╖σö fR\h!!╟JΩpCC╠Mì*┤»Pa!!░Φ"ÄN
  49919. Ö⌠┬°ª<ñ⌐ä┴£~╕µ▌└$Ei╒q∙|Pµó)╔~~ßèÿ╙ç┘|ë├└╝╧,#┐gτïèÆ╢G{H]}½j╙─9wÿ:ÿ╚
  49920. HVf╡trê·8╣JpÜ∞é=X.K y╙│╕░-à√HóδhôÖ┼Ö(=VI╟╓1>àeÿ⌡╦òU┴╨ÿ▀╚Ö▀^₧═ε,?*Ñè¢#▐>înjB╗∙≥Ω└<}ûê)τ£°QQ▓≡Θ=ûA|w Æ▌ΦIû∩wÿª┐XÅ█A¼*_ï¼τΓⁿ░Ö0ééXα╖
  49921. $c±Ö▓óⁿ    CM─.qÇñ╞F:ï╞δFÉ ¡|C«╒5φ*╗╙qçQ-æ╟¿⌡▄Yçu±«²δ╚┤OO╔hB─⌡²╠AVφù├ª║H£+L■═îm#╗v╕═NL/H╦âΓ1╤ασ╪]┘xz╝₧¥╦}╖b{cα√⌠Tu9₧o/iEu└!!└`╜⌐ÿ3╟╒╗úO⌐∞╒ÉaJÉbY√@nτ8$]G▐9■╢Ä>    4ñKl⌐l>äód íφ⌡Σƒy'*Mπy₧£«Nñ∞gâoç╦¿₧⌐*î$3O$òè╘E╝Ĭ∞d╥µ_≡5""∩╚f ╚╝lsñ∙U╕┬R╚æ\Ü═▒ê∩X╧y■&+B╬p % ≥╖.Dv[Aä║ÿ╤Ä═^Fo═⌠ñ╣▓W≡í\)v ú)ü~8 ┤Φâ!!╢=t▒σ╖Ñ|PáΦf5╚┼ÇtêN╠∞\ûa≤kSΘæV∙b═╝ù║wÑÜHh,{╝σ¼º^╔╚èÑèN█Hñ∙9÷ÆÆ~αa'█╔┐²╣H╧╚eñ┘≈c┼a¿»F╛ì ÑæHπXw,¿N^AAgS│&√E╬[X╖>A@1òδÉ&]ß┘╓,≤SªÑ°╖:╡;~)Iεƒπ ░σ╒%■τ╗eL*»C7╙■<║I½╥[╪╞┤U}╜│L üq├R50▀KΦ▀ΦD^ºâ    ■▓¿Z┬!!▀wOαnÅ@j$2▓ñt╦╤ΘS¿üδ,Θ╥ù6╫ⁿæuh ⌐ÿτ╤vAÇÉ░X»ùI₧öwW∩*RA╔&ù┼φ>┌╘ò1┴╞$╙¡Σ∞╛dî÷à╪R£ï¢ñ╙D+x¢¡)4σΩ╥┬≈═.Ωg≥.≈∙Yrüâ¡qîï₧≥╕gPù<┬ΣV\4╞ └▐ú╨Y┘²H╘┘OQ ½Üñåb|┐τ╣'╣▌▄1¼▓ΦÑ U;ÖΘ~3═>ôK░|┴y▓·%_O)╒2|ôΓ√║ùjµ╓({┴4i┌▐Æε╤º/ ┘₧╣#█¿ 'φñ[^└╓î└5Nτ╫±╓;═TñFh∞J²ü┴ff╓)*Q2^å5g┐╥<∙Ñ?!!»s┐÷╜æa$OZ₧+ƒB╨╣⌠ü┐≡┐[T∙ç₧πîP╤O'░╕qW╦═ñFΘüó%eSó▒ç.√ñ┬├o%91àl}ï╖█9¥┬ë╕╤╕5┌δα═*05>Gô╖·û╠ñ}¥∩ƒÇv╡=╫╕°1zφ∙Γ╝T!!&ß╙v¢ö£¿┴0sÉ╦8╚VΘÆ∞-₧á¡└║í⌠ê}Je*ku1nE5≡ ╓aÇ┘)Ü╟α|εòα±√äö┤ÿâÜÖ░{Θhß6ù+ç╕j1 !
  49922.  
  49923. µA)'9░è;╡╣ë8æ&└╫∞╔φ─╨╟¡ƒ╧:Å⌐╔mr\SÆ╔~uÆQA8oOV+≤òQJc2┤nRz▓«2Θ₧D║≈úû≥Å ÿd[zi▀»-3¡╩┼J[£ƒ5╕J╖=ä    ∙K+±mæ╩\ÄDu»r╛°¬┬─ÑaìM₧ëû<í▒GV¡piûµ6═ƒ^⌠R ╧V█÷)!!ε╬l╩z╚:±╬åGq║╕²∞¼F╗√ H▒σáBlUi&åφpe@═âS!
  49924.  
  49925. µA)'9░è(¡Ö₧%òΣ└╡î ±Ω√¥╓Ç``╥╤⌐9CZ_─à*W╫kUVyΓä^X&1]ólCo░δ&⌡╠á▓≈Äσ└ Æ`{n┘¿d=áë─\[ûÜp¬┤d╨⌠TU╘J╝·|»a*∞.╘ç╬≤┬┤=╞`⌡≥▓r╣⌠EúnJ'ú╫█╦WΦE═R▀H│.n≈╙y╦Lg╬8±╧åHq░║≈∞á¡φwS½Σ≥ aTa'âφpxAV╞└₧¿Vc|TD╙é'╦Yÿ░╝╥òcß·ö▐ƒ:⌡≈╞I╠
  49926. 9⌐ΦOuß░e╠-OπFèëû╬╥MÅ▐╩Γ ╢Z╫ê/àΩ²╦ImaD8▒4Æπ>%à5ìI┌ ^∞    mê∩=∞ ]┼º»lzYr╨Z╠╙╬iöδS.Ö■DÜ│ÉU°96ST═■~C<╖Y╣╪ⁿ≈=Å⌠£▄ó├╪ZÉ^αçDXÑ£è╩>¿Oc ≤▒┤α─2tô└l¬ìΣ\á╫·$å    0> í╥∩E├í ▓⌐┤X╖╒*╔Qù║τ¢tæπò2É╟X÷äk4ë⌡╠╬ÆCM╧)e¡▌¬^=┘╟√^▄╝┴)q╢╬:∩n#¿╫`M┘/V²┼╖╗¥îgφÿ·Φ¼╪ NS▌JV¢÷Ω╔I┘Æ╦¬ó=[╢UfâÑÉo]├≡╒Ch
  49927. ƒ╟Σ%ûâèR╬A╙9╙░║╢╫j]τ¼╘Ts'¡K.^E_╚*πq≤ßû µσïçqêì║╓P▐#_²W}¼A#^:╢"Ωâêw0¿Zⁿ0ë║- ∩≡≤Σ▄_yI4M√w╤æ│┤Γ3└└ºx╔¬≈═,v%Aε·₧U²Å╝╕@┘  ⌠nmBûßic«╙Ew▌ò0«ÉO╧ªOÖºLàòêMß~Φr}╡-%;Σ░)
  49928. =╖⌡°╛╜*⌐OSu╠╬k├╒╢T≡╦Ar4BΓi▌F,░δâ !!ó/(>¡αßα    U▓├j/ß╘╘7êF╤σ┬b╖*0ià÷+ó1╦▒╥»yá╛O:c|;⌐√τL┬%╤╨ü╣îE√Θ±!
  49929.  
  49930. µA)'9░è(¡Ö₧%ò⌠└╡î ±Ω√¥╓Ç``╥╤⌐9CZ_─à*W╫kUVyΓä^X&$N░uP*╡╣!!Ω╬GΦ▒╕î╖█╫dL~e╚¿tr╛▄╘EÉ¢q├)▀yò CF =σ$¥╟êJq∞\µ╝α╥ΘôP╓A▀ûûhí⌡ânlç²s═┌SΓB;├MÜ÷4v÷╒|é/⌐>┐╪├Ef┤╗⌡√εΦΣaU½á╗jTX
  49931. r;üú8xLXë╠╩ú\-)PI▐┴;äÖ■┬¼εtτ«∞º≤?⌡α╚├E#R┤y╝qKΩ╛mÄ/6åk⌠ΦÅ╬╥MÅ▐╩Γl⌡5·wîY¼Ω²╦ImaD8▒m╬╖>`¥2▀\▐lGwÄodú·8µ,*Nε╖ßT%3E$û°τ≈g"Ñ╨d┌ò ╫åÜK╪l;QN6╟■!!<ài║■╠┌¿ö≡╗╬Åææ]┤îJR
  49932. íƒèZïG╟ ²èó█└e1·≡E╬ß╦?½ε╗,ÄIdwÅ╓U±EìΘ8êτ┐[Äé╬RrjΩ└╬▌i╥±ä-╓ôKµ▒$8╟₧▒óⁿPP┘zq¥≈╨O0═Ç∞Kï╓ÄfRü▌'∩!!&│█gçQ-æ¡«α╧\╪!!π»═┴Æ╔OR▐$IùHπ╦╘UδûûΣ@τzo≤2/OÜíû`=»o£üRfƒ┤ε0╓∩⌠.╧b█#.¡╪┴í╩?Å╥ìR}%ìK.=I@ïBç └╚ä22╬å┬╚+┬ë╣»}VÉQJδuhªE~!!Gⁿ$⌠╛ƒpkⁿ^zëV<¼ïCïöÖüs▒TkK}·tàÉ▓
  49933. ÄΓ0╞oç╦¿╠ⁿ)ûxg#\√µ⌐4û⌡╞æ9┬σ-τ&7*ª╚2eú┴Z╛≥Z▓ùD╚╬¥ÆRî┼ªJ╫t≥-ç8 <└ù`XetÜ°⌠¿⌠*┤XNk    ▄σ#Ç╜▒W≡╦]$rÄ│z; ═ôπ0£(S>5<¡┘°±[í≈5{ ╚σáT╕b≡┴k╝K▌LWsü⌡:δ1┼╡▀ºr£╢YIS╘üª/≥ √▄û┤ù╕xì¥Ñçîq«v╙╒│≥¿u▄≡F√ìδm╙<φ»    ┴αL╪╕YΘBW0 ╣X"F╣ ╞Yæ5Zªcd5ûδ.ÿ7}≡╞╫B»S!
  49934.  
  49935. Φ@+;!!,╢å0<«¼ƒG∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3IÄù;CéZJ)k_an≥ÇUc@»pVi╢ó/⌠Ç«≈₧║█é
  49936. Äx[@ot╬«d0╗▌┼J% ╙z╝óuòAεTL 1≈aìɱ(╞i└ç╙≤▐αzî╛Åçn¼ΣCA▒  å╔:╠╠K╜h├]╨≡9&óça═W|╙:╜┌!
  49937.  
  49938. Φ@+10!!│Ç -╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√┴;/ZS╙Ç?P¢Zw>|R]lQ╢¿:u&-J║k\xªδ&⌡╠á▓≈èε▀^ÿrlj▀┐y_─á─\[ûÜp¬┤d╨⌠T=Γaû╚\Ä4⌐N;¥╥╟ ▀░zåÜëò} ½┐)╚`╝¿:╨╦Z⌡G.╧Z¥!
  49939.  
  49940. ΦW
  49941. !!0½ï;╗╣£/ùΣ┼·┼∞╥█≤▒α BÖÄεXWme±ΘT;╒oV#xZGnO╗┴?Wu1J▒<Dbº┐( ╠Φ┐╛Ö éüqR@yr█¼}7╝ë╞VZ╒¢5¿V╕~ä≤_=≥gì╫[ÖF4«|╟Ü╞╢í╩╘+¬╡░X*¥╥    úrnÅΩ=╩ƒL∩N:└[Ü÷mfⁿ╔}╨Cz┼; ₧ε.┘╟╞φσ
  49942. «┤aN╝╫á uCGT7ƒΩ5uQ╟ùQτ╦0Ux╔ä#ìô■╘¬²uφ╡Åδû?▓≡ë└(6YⁿQ⌡}Rδ½l≈Zⁿ¢ôÇ╟ƒ%±┐¼Å+√j·Pα≡╔█√?uJ[:Σ:û∙9v╤5æW∞UKpÇy:═└oµ &Tê╛»R09BYw┼,▀└╨EöúS8φ┐rÜö£O₧%+U ═>!
  49943.  
  49944. ±V.!!¿Ä!!:Öªü'Ç1⌡Σ²╔ ┌▌┘╗▌½    ½║╥|v\;╕φ|bàVR+z^&O╞ôWrfNπ\g»«.ε₧R¡╢║£√╩\çdL~r╙╜y7ε╧╧KüûVg½@│tåε@,ε$ï╓\▄/┼\,╞å╫≈╬¼v╗ì₧ÆqQΓ▒CE░go╠¡^┤▓5Ä]o└V╪V∩@ É╦q└4¥ó┘ÅB4º╖Φ√╠¬║6╨⌠│`R8a[Ç√d[
  49945. ëSæJτ╦02FT╬▒:ƒ{ܬæ½∙mΓ·å┴ò<┤∩τ┬lfxj╒r∙`o≈ÑH╠a¼A└┴Ü¥ƒI█┴╫τRΣ"·hφ2╓⌠╕┘T)[L}╥╛╖$kà1ìH▐D$▌
  49946. ΣÆ%±+HÆΓⁿR=<
  49947. k┌╟π╠E
  49948. ëσU/│╤HÆÉ─*┤EQ^E    ╓└1¥`═╗ƒÆ    ⌐┤⌠ñ╩ƒ╬[▄^▓ïH0╣éèS┬$½mt·¬╣┴╦xÖ┌8»ì░VπóûCΩ)~2ôπΦaòφm╠½┤V╩ôB»( æá⌐╞r╝Ü∙WÿéR╤íE(ª«ÿî╥^H├89┴Ñ┌|Γ╘╛IôΦêhK¼╧sφ:<╡┌g■4±╩¼ε╓^¥!!½≡╨îñ╨CNÖbU¥H∩≈╬TV∩â▄½│,    ÇR.û░┬a╝dÿ┬GX(!
  49949.  
  49950. ±V.!!Çú&╛░ú$▀⌡╒²╦√├ƒ▄░÷á]Wσ√╘zq[;╕φ|bàVR+z^&O╞ôWrf[½yCåç`■█Q║╛ºè■└^æ{L@zh▀ⁿ7¡╠╔OMçV£5║K│=╠ΘE[:φa¼╩KÖCy≥L|╟ô╤±╔┤=╩`⌡÷∙ε≤VWº Φå ╦╧Z⌡?▐V╘┌    M█╚|█m`ÜÑ▌æCqºε±≡Σªα:¡ß░L,<    g!!ïJ╣JpbJ\╧W▐ÜñKD2WI╚ç.ê_L√Ü╕║²rß·ê▐┤7╣ú└Θ;YⁿGΦfXτÑ)╬hC°6ïò▓é╙█æà╝│Ip┤n∙'⌡≥∞■J3H.⌠w¥÷ `¼z≥$╢ @Pdât â■-≈:0HΘ«πq}
  49951. 9ìZ▌└ù)lΘ≡Y&▒┐DÜüùH┌?x=*x½⌠+Y}¬6Ü╗─Æ∞¬π┐┼ƒΓ{░w«▐B%▓òèï#úfc∩Σ≡┌─=b▄╦╩ΓÖ=íΘ·;éTu3/₧ëU╟Tÿ≤0ë│²Wÿª    ╬Rvé╗á─=æ≤é*ùàF⌡╡wΩ·▌╙ü)DPδ6'Ü≈äWgî¢╛IÄï÷+!
  49952.  
  49953. ±V.!!í¢:&╛ïâ.£eí╒╔∙╨⌠√≡ì╤σDQ╛½╨r}O Æà0s»rA>fTWE√ä^Vh|óLF~╢¬"÷█q║▓╢ôÜÑu\ºfWot▀ⁿ r₧█╔W\╒¢5úB┐s╨≤UVI7τ$₧₧öKsñM0╓ä╞·î¡v£Ƀ╙z╝▒CLº ~ûτ<┌ƒ[ΓR,▐V╪≈m ô«z█z╚:±ÇÑqZÉè▌═├XΦ⌡r[¼φ╖)V
  49954. j>çΣW$yJ┼┌\åñOh0A▀ò'ä^BÆ⌡┬╗εhµ┐àìÿ'⌡≈┴ óo^W3;æyΦ{[╠░d┼3φÖö₧ï╤\╫û╩ΦV√R$▓nío╒≥∞╦DeJ5]/⌠6₧⌐mdâ3èC┌U ∞    AâΦ"µ6╞½π%5
  49955.  
  49956. k╞
  49957. ╠╫╩WFçµR/Ñ■]ûÜæ╤*x]E╩  O}ö`ä■ÿ┴ á╝┐⌠ªßª5⌡DαöDD%¡ü╧∙/╣"zuæ╫▒Φ≡R│┐ä╚°Uë∞≈=èP|2"Æ╟ΘTèíZµ╬╘]î»U╢=E@ε├╬¿@Ω╬â;Üü
  49958. kï▌fM║µ╤┼ü4DH▐3╒úεO(├╧·hôΓà3ú·&╦
  49959. ë²"âR-æ╙¿α═K╘;ñ»╨Ç»ⁿ'kY═l_░]δ²¡-â≥ѽ∞hH2îOR'ò¿ç[»oñÅ/|èòµ:╦«║f¥kαWM¥ⁿαàW▀cyzδ╛ΩRoyτ$S5D`└;¡?⌠ßû µσïçqêá┬║{I êJE°@bαPiÅkö┘≤7êMI╣"_σ─W    Å┼∞¿╓I}\MΣr╤ä╨d╔èT┬2°╢x└º " ,a'O±Ä╫0ò⌡╞÷U╙Γ-
  49960. ╨+/u╝╧f&ú█▓εó┼H,▒²'τ■]ÿæ««uÿAT û(6
  49961. ╒ók7*╕·µ¼ΓxΣ=Oåìº╣▓?ù▒Y:PS≡xÜI"▄º▀1è w-g0▒Φ■÷Q╢φ!!Vgç╣τvÆT╘τ≥'º&~vàß▄í┘x╛╕d╗╣qe7w5╣╔╗&╜AΩ╙É_±╦@█3▄┘uóèÅs└t█à╗∞¬R╨ΓeΩ╖Γo╥uφ║ëºG■²N»!!)\l─g@A#DÑ1òV█tK┐cl+Lª┬º7}▒ñ╣╟7yºñΓ░3óoL.u▌╢δà∞╘N¡f═z╙0F∙=_¿ÉP┘yé{ï'Ñ╗╢Ee╣é¡╫+úv13▀KΦ╖╓TRº6º6µ·φ▌Ií 4ç3ÿ]$T`ß╣oΓ⌡'φP¿üzφ&ΘπÇ╕¥≈BBäεÑ(╛╒{  Ö8╒╛.°┌}Z∩
  49962. RA╙g┴à┼}▓░Φ7┼╧3▄α÷ó≈.╔Θà─L╔ö¢╛╥7S{këE╒Fèæ═╬UΓ╚8Ω|α2ΩΦT:πφêXα⌠Æ·▐oZΘS±yÜ&6&Ñ╟╦±╓Rì^ÑÄà
  49963. \x╝Ü│╧'o≈ào╒Z┘╣░KΓ/ÿ┘à@wåª=w╔?çRE║v╨^δΘ8g£5'φìö╞≥Cå╤5h┴&=╫▐╞αXß╦/8û¥╜'┘ⁿ╣,÷≈lXR╔ì╪╠
  49964. °█⌡╬i█I╡$B╗ ╩ö╥mhé`7 D¡GyN┼╛AΦ╢m+»s≈≈╝Ü5_╫╥    ß─ÄΩ╪ì∞JK╕çÜ≤Ü|Bƒ╔╙
  49965. ▄▄τMσÅ│0A≈πâe╘σ┐¼%!!cæl}▀╖å╡╞α╨ìò ▌╕x²▌y47<]╨Ç·úΩéM░8╚ⁿëcú╓╣÷d╤J¬Ñ╫
  49966. Z ßà0αûú░┼-~ùΣ1?╧W┴ûñ,ƒΓ∙Σ╝EC±è╢<)dN$l%RτM┴eï┌{ç,Åíx½ö┤·°ü┼╩█dï#åî¿s±a÷&é-çΩm1+8Bè┐~■ÉΦä⌡ª≡┤Ö∙4jBIB┤╩┘▒≈X
  49967. ┘ ╞ΘYó╖Å▓aÇnV╠ígµ¢åVïⁿ.°6*ÿD_@dN Ñ{⌠Ω5╫26¢»╞╔║╣Uïσ░╢╚¬└JCΓ3âgΓ3ëë]iWèx╖çBΓ■╔╨º*⌠│█ò@Γ∞az┘XD╛Lúf-╨1?;\░f
  49968. àΓT┐═
  49969. ╪-D█ ²"╩ÄÆû.¡!!èÆ¿Ä3g|Y&çÅN¢╫█Θ    aòª#ÉX@δ±a    £¿D ô÷a¡⌠
  49970. ■ù╠Θ─┤`8Ö╛«αZA÷Ω╝┌≈i╖+φ═C~ét╥8ÿV Eq╘gzyNj7=╖9üH∞eτΦbì╚' 6≡)ê╚Æ╜1&ε«i*    Åû½╨╘┘â!!jNö@"W»~│ö│¼E╨Yß╔%}▒âÆÅÇ_ƒS ║    uÆV]╢δ{vä╢i╪g╠M▓3)
  49971. :┤]φ&ⁿòè%²╗4╔ ¢╝za⌐║╞/╬╝r¢G╩├vá═q\╬P    ∞kN}LKorKn╫nÄz_X╪┤*≈%E!!╧K░¢╨nσì;QφR╛╜4#~3óµNû1ε?¼Ö▓L╨ëµ│QφíÄ)4└░B$qΘö▀╜OtGP▌CzüTÄ⌡╨ÉCìs╓«╩é∙÷≥i┬?j}Γ*^~Θ╫╫bn^π)₧Γ≥fìóf¢û≡XΩ1nÅ-╬KMh╞ƒ╪ ~ç┴Ññφ₧^╓Gi┤&═⌠ta½±_n#Γ╢Σ=F!!Jev└α[$╙┌╛lH÷¥░Hì) σì▐!!a9;·$`éD«*└≈èq    ╘XAδ╟,⌡,═ª╓4yÑ¡«F0≈ñºh╢UÄ▐V?e$÷τ╨┌àpc│móèù
  49972. ╧CM╙2A+╕└─7&ZÆXSFj&:τ>uó).%▀ïR(c7·Z ╡≥µq7ß¼╓b78w┌▐º±▒°≈»m╪7¬╜╠╣pµlΓ/Sg╦₧Xa ╤o?{>╖Ö┬Å░ÅMµ╞╚╔2W?=tBpÉ√ì≡ß┴p6δvN╜'aßCTⁿ╘m£>╟    je╓╟%√üBQ~±Ä╨┌wπïú┤Ü≤¢╟σ█Lé┬πêY÷A¥A∩üΦÄú&╩┘┤B▓!!v+┴.b8æ├Têτi╣BΦì∞WFX╒æ½╔∞║└╢L!!╨)%X╘π δ⌡ «
  49973. ┌úÆd┤æ╧.íaS╠:≤Oñ2╥HÄ¢╕o¼åq@7å▄┐Θ─êQ1ë·Θ⌠≈¬î├+:ìæ.╔Ωαφcⁿφ²Yg┼Φ#vΣ▒║ÿ)τn╙┼xƒj╢c₧Ω%╨$░aUq¢╓;Ç⌡M╚Tƒ∙≡üw█▓£¿ä▓ƒw∙┤┴>!
  49974.  
  49975. ±V.!!▒â& ò╝ÿÇ+Θ█δε±╙╞Å■≤âfm£ƒσHPA└à.B₧QCp.Z]J7█ä
  49976. Qi"aóqV*¡Ñz║▀r╝ú╢£√╩/
  49977. àq_
  49978. │■] º▀┴MM╒[╙1páFñ|ä╝EG x∞eû╨₧Mp╡@3╒╥┬╢─⌐tÇ@ô₧àyεⁿRP¬o;äα!!₧╦WΓ)┘Q┘·"o╣├}╤A|╔=┤╪├)┌¼ß╛⌠¡┤<zî╬æ.'Ve Kg ëε>e└█ü¿Wj|WD▀┴#äMOÜ⌡╟╜≡!!≤¿Ç▌è;ºú─ █8R╜q∙ 4]√±}╚h6åo┬á½ú┌\ô┘┴╚C∙n·j≤4╨Ω²╤
  49979. )@]2▒#¢≥m9ü!!ïZ▐MGPÆreî÷kú 7[▌»ΩY%t
  49980. -v╙Z╪╟╫Gë∞RG▌ûA₧å▀J╦ ,YP╟░+)üyâ╗╚╙¡╖⌠ó╬Ö╪▄O¿ìF^d⌐ü╧├+úi`≈▓⌐Ä─11éö9┤¥±XQ½·°<æRu9é¥Wæ*⌠ï^Éτ▓A₧ïR╖+_é╗ª╠:æ±é9âèO⌡Üi!!╣┤─ª p^Q▐*>╘ñâaï┴╪▓┼╕Lqü£<ⁿ>!!«≈zLπ8Aδè╫ï┤H╪9Ñ╡æÆ▓╪RÖ_NèL≤∞╙πü╔ΣK÷ytL⌠1+L■µ╖{Súk₧╔VVx
  49981. çﺠ┘α⌠{╔┬kg¡▄ô⌐╨1i}τ½⌠Cnwâ@ziB[╓oεd║ñ█w?█å¼úLδσ▌»cP─hE≤Rv¼QI1╨-╣░òs>▓ZR¿ußε.e⌠÷±°    ÿNeSG F°cö╪▓┤≤(╫¡½jü▒√"╒xr0K≥ñ⌐εÖ«⌠\╥╢ ⌡"'c╝èorΓ╘≈∩P│ÆX¢ÇFï╫LÅû║Mâ|▒)}Æ"
  49982. ╥ÉJQu╨┤÷┤Ωz½DBsêΣo╪╒╫1ëº\[8uE≡r╘c╤ì¬%╝(I 36»·¡τ"╖δi>δ▐ìr╨╠≡F╞'ª-?mô╕+╛1▀ó╟Φcó≈O "qz▓Ωú$½XíƒΘo╪¡N┴Γ²s╖ûëxα5y┤¼╙φñ@╙µgñ┘ñU╓tú▓╘╜    ï╕ª_F9φD k±|êRït-£Sk▀┬ö?l╕àô+εV╜_τ½╧\╚z*l&êπ■â ·å3Bñ`═h█5OòN╒δ0╨c»╥[╪╞▐ )√±^»▌9╜1^U│k┴╣≤UVª#\╢≤ⁿ¿
  49983. ┬%█rXⁿüI<$g≡≈:┤╡<ë4üΘS∩&∩π¢l▒╛≡EA²¡₧/≤╥3@░║╪≤╨╙┐Al╗URåk╓î─c∙╙û1vß╥"╞í⌡áß
  49984. ╪ΘSà╟8π∩≈ñ┬=I h£h╠O╠─▐â°╙*»|í5╝Ç*[àΩ╓ Σα╠Ö⌠5è<ÇW@¢r9Q⌡[ô▐┐─K╚d╫{α≡nI*ª█¿┘5uñ═9╜$╣▌ÑJ½    ╛ª}┐!!`'Ǻ-4▀%Ä╪╝$Ñ∩"5z╚5v╖╞ ╣ù¥┬7┬3▀▄═╜u╤ /ù½Ç┘┤░'╩╢bR╪₧╦╨ ·╞╧╓$╔S∩a╣╥ò╟r#╔l  q?_ìGgJ ┼ƒ¡╔GO├─ó▒╔/[M╠+╟EÇε≡é┐à∞_V ╒¢
  49985. ⌡ï2µeu═╨b`█═≡Iεò│&dU²≡╬¼â╞└o2*7âk3ïS■°>₧┬π╨╦₧!!∙φZ▒ücu~:â▓°ñ╦kß.╬fü╒Φ ┘*╩ú∩,¼
  49986. ▒┴╗W!!\ì╤u├âú░┼sÖ▓tK¢U╤âKñe╘ùç╜q┴▓⌠╤/a6~kOD-H⌐M╟eä▐u■|⌠╔kεèਪ┼å╡╢MëÆï»V÷~≡[√Uδlz«f'0GRç▐ÿú┴¬Å│ε²├╣[L i]áU╬≥¿╜ [ÿt½ò=«┐»4ªi▀={º▄T╧Ñ╡KH≥ùE¥ZpëZ_Lm&å╧H▌é4└^_≈¥┬⌐▌╘5ùσ½╢±░┌x«m╞
  49987. ╠ÇêP 9═╙s╚\¬╖┼߬ÿ█╛k»tµß1εr@╜$·H{⌠"49M├yÖ⌠Vφê ∩x@ÇE½j╡¡òòF⌠]▐Æ╕à#YmE7¿â.⌠¡≥ßlâ½k╘[ç~ƒ Gàt╓âε╓ª╗G╝Ç╫╥╫¬`'▀¬┤√6%╛╗Æ═≈    d²hnë╔3jäg╞7æ]╪b▄     icm t&¼:╔ ╕6╕╣$E═äuO2Ω8íπç╕;LΩ║{eÄ£≥▓¼┤|Vë?z/N═6(^│H╕▌│╥&ú5'╖∙ETé╫╙ÿçE├],M╨╗qL¡±'vä╢i░>Γú3-Oα"{àB°ûèP╘┘2┬ïΓz/ƒ╣╞/╬╣rÜD ═╙÷£k╬Hδ"'e#A{╫nâz_X╪┤ ù*"Vb╒H░┼J═x─ï=╛ü╣1OV(;v╠^@│÷äD╤±╣ñ╔╬÷½ΩσL{X≤ÖBgh≥É╩ Lx]ÅVe└J¢α╓∩`èt╒«╩Ω╒úτo─}b}┬= Ä╙╘bn^ïR≡¼¡C2¡╢`╗ù∩B½.O7╬RáyIk╞ƒ╡Lw╘\¥µá▒⌠t╝"╬\∞ Σo¢╞v    xÄd≥îD,(    Θä7y¿ª╥_a,σñ½H┤? ╥╕▐#u9~δJpûBê3┴¿─"&╩JW╣ü┬¡å╥7yÑ═┴    X■╗º?≥=≈┤==>D uâ╬u½┤¼}hñg≡ô∙t»%*⌐h|/╣──{zO_û'8"RÜ:∙j'g]í÷x9MmçL ºⁿ¢F╚─¡q+8h┌ °\ƒòⁿ⌠»mè∞┴┘┐gµwµ$ñπ4'╒l    <E╫■lε║▒öH┼╪╩∩%\hV* ■çΘ£ß╨F#.√q/░?aßJ
  49988. Vª«τ¼a╝Å4¡─êΣπ≤ÿp÷█╘²Ä¿εà¥0ƒùèδ"Ü+αz'∩ù¬┌ù╩ïIàj∙!!v/┬.Ic²╛(òτsφK▌╪∙QU[└╘ù█╛░╘»a    $ìL>╘╟ φí;≈
  49989. ₧∞┐▀≥╩á6;ⁿƒA3┘OΦt₧╝╕|½ïyI²░░ß▒÷M⌠╔º╡íσ╤╝V3\l╫╦A°επφn≡°╧ÄìFE═°üü3─αN╩-[╘Q┤y╫╜ÿa±bfuï.ô ╦¢3£⌠üÄⁿ┌¼!
  49990.  
  49991. ±V.!!╢Ç",¿╜ò    è2∞╤ß╪┌╥▄┘Σ▓ñuvæÿΣ^@k▌èdûoQ>zZQg
  49992. ┼ò \g+"╔C»╗, ╙G╝ú╛æ∙Å2âq@Zh▀ⁿDéë─\KÖVògεW╛x╨ε^_ *⌡}▀▌XÆv⌐@/╓ù═╢┼«3£Ü█ü}εµEE▓pi╠¡!
  49993.  
  49994. ±V.!!╢Ç"┐╜╓jä╘·╠Φ█Σⁿò⌐αñCS╢╡╟!!3IX≤╝WâWK.@Z^nO∙ÅDgZ╖hRh««ε╠GÑ≈│¢±╬    â[Ngo╘╜a!!⌠ë┴{GÜû{ε.▄╥1εXY,Σ$╥₧~ÖLq╛(╓╥╫■╔α~ëæ█æs ╖▒XBΓaJ;èµ4╓ÆSΓW*└█≡(rΩ╚jéDa╥Ñ╘ådííΦ│τ╝┤mY¡Φ╜BaCFt;îτW]&R╨W┘ÅßK    mo■ñ¿N╓²╘¼⌠nα⌠┴∞ö-óµ█I┴ ;Kⁿr≤OyZ÷╣f─-R FèÄ╙î┌₧█╠≥V±~°ï^»Ä╞▐8IfCH3▒Z∙₧Dlùì[┌B/    ∩        ╢Φ0∩ e1ó╦å>X*Xp┬>█╘╪Q
  49995. ö╬Y>┐≡M╜Ü¢^äl9vu?ß╘0ⁿ■Æ▒╗╛╗ߪ┬à╠▄Y«Ñ}{!!┤ÜÇσ+ág rÆ╫┘º╩1+╫¢▓£ΣU¿ⁿ╚=æEq:0Ω╣|òIƒ╟6Ç┤╕╩÷-╩Qv;ɼ½╟i╝Ü∙W εZΦ║I!!╛ⁿ╫╧╖U]Éz*µéφiε≤▌'÷Å⌡+╡╬2°':╜ä4IΣ|╒┴«Θ╥_≤4«≡²δ╚┤v/S╫>NZ«I≥∞┴E∩¿╪╢╖%t!
  49996.  
  49997. ±V.!!╢Ç"»╜╓jä╘·╠Φ█Σⁿò⌐αñCS╢╡╟!!3IX≤╝WâWK.@Z^nO∙ÅDgZ╖hRh««ε╠GÑ┌▌≈╡ üuJ.-Üî;á▌ÇM@ÉV₧|á┤rö╝^II9í$ù╫^öx⌐9▀╥┬⌡╧Ñ`¢ì█òsεσ_AΓptÆó#╦╦ΩD;─P▐V≈(r·╒q└GjÇR█╡ü]4ºª²╛╝ ¥┌Cx£╙æTBdTRk7Ç»W3pC\└╩Q₧⌐\-0L[ùì*¥_╓²╘¼⌠nα·à╚ë=ºΩ╦ ╦E5R┤y╝SUg╧┤}╚b_┬ôä═π╡!!Ü─┬≤O±$÷+ε=╤Φ╕╦C)\)σ6æ√(Và&ÜO╥FCqüumê⌡!!¡JR█╡ΩE"zDrû╤Æ╩QɱY9ñ┐NÜ¢ÜU▀81_NQ═÷d8àdÿ öÆ á⌐⌠÷╪Ä╟Y╥═ε(<M₧üè═j└qδ¼╣└╤tâÆ#ú¬ P■╣·╢nS(┤≡xû)≡÷%ì╖¡]ä£π9!!╗äó╒!!▐⌠╛?¢é'lê▌j~Ω⌡Φ▐üPF╞?╘Ñ╞K1!
  49998.  
  49999. ±V.!!
  50000. Ñÿ,«íâ.º0σ═╡î ±Ω√¥╓Ç`` ╡┴vv╙èj║ZP"a_}j≤┴W<fNôiG~ú⌐, φV¡╢║≤¥ª^.à}Hzeܱ-╝└╬M╒¥Vp╢W│o₧≡I6Γpû╤W▄Auá |╒¥╤╢╪¿v╚Üûæyε⌡RWíryçδs▄╞≤I*îⁿ#▌E▄⌠[£¬V░╬äQy╢á∞▓áá√sY∙≤╖fRZ&3Çú"vZ]╠┘╩áKh|B_Üà*ÿYƒ≥╘╝╝hΩ·ò┼ƒ~Θ┬±$╩?-╜q∙Q4^≡╢|═hU°J▐∞∙τ╨FÅ┘à≥J±Rl¬~⌡'─σ⌠┌)R{JDc▒6ü≡8hö:ï¥u+/    ∩aPÿ∩!!Γ)Y√╢²R07's┐█╩═tö┬P&φ┐├âûU╩99\VÖ¥NjTƒiÅ∩Φ╟ì╢²∞ïèφj▓{äívudúôâ┬$¬Aiφ╗╛┌╠0╠≈F╬ßπDºⁿáDΘ)3ö├²Y├í6¬Æôw«╛tÇx å║ñτ<▀≤╨*ÅùO(α╣
  50001. ?I└¥▒╪àRAæWA⌐▐╟C/█╠ S╞ª¥Owî -█t¼╪zaΣ?Aαè╫ï┤Z√ì╓┤ñÆ■_GN▐q^ÉH╥ß╨B¬ƒ├■U█B k≡`#╫╕┬a{z╟c⌐╘Vnçé╘#╩δß6░u$╝¬╔╥ÑàÅ╥ìBu$ÜB;d└ú├╚û+▄╥«áN«╙─¡j^Θ    "òK▒A~!!Gàk╜φ┴mX╒\N¿y╙├T    Å≡⌡≡ΦO~2B+╖6»ï╕ªú4═∞«e┼å≥+└(O$òè╛K!
  50002.  
  50003. ±V.!!
  50004. Ñÿ;╡╣½/æε┘Γ╔≡├àò┐╘É}`¢₧≤X3GXê─?béKP+lWVXΣäT&/\ônZ|ú┐%á₧C"º╕╗¢÷┴\s²Mbfܼ;á▌πVEÿ¥E╝F░tê.≥ ⌠pï▀[ÉGG╕9╥ƒâ ▀Éaü₧Åû&O»╙XK«e u╠éY╖▐o≥U;═]╓└9sⁿ╞u»(⌐1┤─ùtaºÅ⌠≥║F∩╙eH∙⌠║BsGYcrü ú8tÄPû|α╚0c9[XΩö;¬V╠░╨₧╔O╟₧ñ■╣~╗Γ─ öh]b{╣dΦ?aK├╜eÜ-½A▐æüü╧Më┬▄ªM≥R$▓ní!!└Σ²╓ C{AP¢^Æ╟8qà5¥B┌+UPfçmτÆ\α~1ó╦åT#t's┼╥╘ÖTëφH ó±Jï£ÉIε>7DO█α!! 2£aÆ⌡╠êN¡£─ÿΦ»εl┐»è%Éç¢╩(ígU Θ╗▒├ïR■ë)½Ä░D¡≈∩åTx8    ñ▄±Eù⌡â┤⌐UçÖKªb_Ñ£ëΓ⌠├│~ÖëFαäp0½÷╘╬ªCA╦7!
  50005.  
  50006. ±V.!!
  50007. Ñÿ;╡╣╝?æε┘Γ╔≡├àò┐╘É}`¢₧≤X3FW▀üdûQeC^Gc≥»Tcf@¡&kÆ╛4ε▀@ ¡äúî≥╬^₧gngv█¿hhε╚ΓVGÖÆ5├)▀nò·_∩p╝╤TæGz╕0.╓ö╩επ«)╚ »Äçh¼²Rw╢rzÅ»:═∩MεW.╪ZÇV≥n÷╦}├L ¡U╪▌│Q`º»·≥σ5╝µe]┤ì╪ckkCMV'Ü+∩j1c╠ìéñ{=OY▀┴ ì₧⌡æ ╗&┐╫δñ≤0░√▌9┌Yⁿ}┌:Z|╞öZπ-Uφ ¢┌■Σ╢!!ò╙▌≥rß╢g╗séá┐ƒ
  50008. Tf_[)Φw£±mqÖ1▀A▌DAw╞wrîδ%µe^╤Γ√_4zB╝s╖╤╦Pé╕1@▐ûGÜìïw╦8\LKé╖d8Æi₧φ▌└N╕╡▒ó├Äï█═ε,?*Ñè¢#▐>înjB╗┐û√δU▓⌐τëΓS⌐ⁿ⌡=É|6ôôσP£╧6üóµ9α≥.¡=│╝│α%▌¬╨y╚╟Kµía*╛╕ÿî╬t;-ú4.╪ú≤_(Ω╠≥▄τÆHzÅ┘'τ*╗╙qδ)Cφ╔┐∩╔u▄8ªµ╨ìá╬ 1│gU¢D≥╚╒SL¬▀é x▄A ï+L■═üzEy╟q£═DVéë≤═απ/╘Cσka¡╓╟┐█Rqbδ╛ΩR&wïhSivα╬%ª»═w?°╙╗╢C⌐∞╒î{Mànæ/║PB2╧9≡╜ÄS%┤PXƒwà½0t╓±πⁿ╒XfgI╤D┐╗Ö+ô└}╠ ╖Γm±░τ3═:'}Φ±╕X±!
  50009.  
  50010. ≤E070,¼Ç6╗ñë è-╟┴ß╧Ω▐╨█Σ▓ñuvæÿΣ^@k;╕φ|bàVR+z^&O╫ÅNc4ór6âô ╩J¼Ö╢ô≥æ\Æg]gb╙▓jr║┴┼[ÉûaíQ÷vòδ^]+î÷▀Wÿu╛)▐ù═Γî«ràî█çsO¼⌠Q▒e;äα!!₧▐⌡@8îH╚π=dδçu╟Vf╧;±┌îV4ºª²╛µª≈tU╢ε▀`kaCFt;îτW2hD┴ìM¼öwNf∙▀oèHâ²╘╢Φ/ª╫δá≡W⌐ú╟┬w½sε g≥ú`═lI⌡FìêëïƒT÷╝¼ΦC∙pα6í2π╥╓ⁿ>cZlFD8σ?£≤d£1╤#╡qJGzæorëΦu╣WeR╔»Ω:?Sq─═£┤.oɱU'╢φP▀╧┬▀
  50011. ~c5τ├C4éAÆ∩╨▌
  50012. ∞╫¢▀óΓóVÜl▓æ@ d¢Öè
  50013. ▄%┐fuX²╖ó▌╤rûè%│ëⁿ] í²╞DΘ)^dÄ╒3²LèΣm╠╩╫=π≥.╩WÑ£ëΓ⌠├│~ƒözεñ(a0ΩÖ▓óⁿp8-ú3-⌠Ñ╓Ofï√╣MÖ≥ú.╧╢ZaüG]╙╫rnδ7W²₧·î╖2┤\╩£∙ΦÜ▄9sr·@+h╜∩δ≡U·½┘░'│.    o≤2/O■═δbÜpî─VTH¢Æ≤%▌Φ▀|αr'╝╨░║╧~╫wXnΩ¿ß<Zα'S#;¼Fä Æ▓Æ;8ê╟╝▒G╣⌠è T^,▒Mh╪`IèG'c═$ΘâÅj:╤55╒vß╟W    Å╣α²τW.g%¥°±╘g╔èqâ    Φ╗{╬╖≈4î>z0]Φ▐≤4û⌡╝±J╬╢GBI·":8≤Ü~uΓ╞ ▓▓4╘δD┬âA£ôM╩▀≥WΓh≡1} û'YF ╚Ö.:╨¥£║≤0Σm▄║*▐┬╥3ÿ░W@E?è│Wr╤ÇΘ╝&ITga╨âäîR=╠·`aM²┘ör±-¬ïo┐Kú,*u┌╕4┤h▀┐╙╗╪▐y5    Jl.╝·╜(ªK╬╔▐Eπ╪,┐{쥻ìòe²p╪ï╫ö─yⁿ▀F√ìδm╙H¼╢ôè#ÑæQπUT:⌐CI_"M░r▌Y┼c\ªR-.k∙Äû&fΩôôg½Gíñ°Γ;ñvF2<╟≈╠8╕;═πh≈τ╗7DüZ3╧φ┌&╤ √<░ó▓h«╢▓╫$║]T│1∞▄Å(O╜3º¿¿µ▌!!ïkSΩSòV!
  50014.  
  50015. ≥A+6,½¥&¿ÅÖ$å+Φ█ßû╛╓∙αÉ╤üvp£╓¬1xD█Æ?FÆ    jOU@|
  50016. Σ┴u3F╖}Qfºδ≈▀N ╝╢╗ò╖▄ÆwJ| ▄│r║┴┼EÉ¢qεL░=ä    ∙] ;Σmë█K█Q╞i5▌å╞Σ╩ípìM¢₧Ǻ≤R@Γb;ûτ6₧ây╥o ΦzΘ5¡m`δ└m╧G`╘q≤▒Θ)┌É░φσ
  50017. «┤r]«═╖
  50018. jB{
  50019. k7¿±1%LD└├K╩áX`h ▓ ┬ôⁿ╘╗Φn÷!
  50020.  
  50021. ≈PJp\zàü!!>┐╗╠+┼)α╞µ═≡├ƒ┴ºΓá@░┐┼;;I▀ü3PÆM%heJ=╙»+t/fX½uPbΓ»%Θ▌P    ¬▓ñ▐π╟^âmN
  50022. ││kr╕╚╥PI¢╙}º@╛=ô≥M x⌠wÜ┌êM4╛,┴ù╨≤┬┤3ë▀öæv
  50023. ¡σKñ sç»'╟╧ZºE*▀\╚±(e╣┼a»(╘7┤£æAw╢ºε√≥HΩÖ
  50024. 1╙ëî<6Zs{ H╣$! !
  50025.  
  50026. TKindRecordAnalyzer comment:
  50027. 'TKindRecordAnalyzer is a class which wraps an Active-X Automation <ITypeInfo> interface pointer that describes a ''struct'' (a C structure). It adds high level behaviours for analyzing the type information associated with structures, and for automatic generation of <ExternalStructure> wrapper classes.
  50028.  
  50029. At present TKindRecordAnalyzer is not capable to automatically generating a full #defineFields class method. Support for such will be added in a future release. In the meantime a stub #defineFields is emitted that contains an IDL description of the structure in its comment, and the body of which sets the correct byte size for the structure. '!
  50030. !TKindRecordAnalyzer class methodsFor!
  50031.  
  50032. ⌡]7>1¬ï_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;R]B▌ë?F₧PJjZbcN$▀»:g5\¼Zk╢«$║╔Ká≈úû≥ÅöqWkrö■X╟ñ¬0ví=║8Qæqô^┐3╪! !
  50033.  
  50034. !TKindRecordAnalyzer methodsFor!
  50035.  
  50036. Φ@+10!!│Ç -╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√┴;/ZS╙Ç?P¢Zw>|R]lQ╢¿:u&-J║k\xªδ&⌡╠á▓≈èε▀^ÿrlj▀┐y_─á─\[ûÜp¬┤d╨⌠T=Γaû╚\Ä4⌐N;¥╥╟ ▀░zåÜëò} ½┐)╚`╝¿ ╩═JΣUh! !
  50037.  
  50038. TKindUnionAnalyzer comment:
  50039. ''!
  50040. !TKindUnionAnalyzer class methodsFor!
  50041.  
  50042. ⌡]7>1¬ï_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;R]B▌ë?F₧PJjZbcN$▀»:g5\¼Zk╢«$║╔Ká≈úû≥ÅöqWkrö■X╟ñ¬0ví=║8QævÿT┐/! !
  50043.  
  50044. !TKindUnionAnalyzer methodsFor!
  50045.  
  50046. Φ@+10!!│Ç -╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√┴;/ZS╙Ç?P¢Zw>|R]lQ╢¿:u&-J║k\xªδ&⌡╠á▓≈èε▀^ÿrlj▀┐y_─á─\[ûÜp¬┤d╨⌠T=Γaû╚\Ä4⌐N;¥╥╟ ▀░zåÜëò} ½┐)╚`╝¿&╨╓PΘ! !
  50047.  
  50048. ClassDescription comment:
  50049. 'ClassDescription is an abstract class which adds descriptive information such as instance variable names and method categories to Behavior. This additional state and behaviour is generally not required or used by the VM, but is important for the development environment, the compiler in particular.
  50050.  
  50051. Instance Variables:
  50052.     instanceVariables        <String>. A space separated list of instance variable names.
  50053.     methodsCatalogue        <IdentityDictionary> mapping <MethodCategory>s to <Array>s of <Symbol>
  50054.     protocols            <Set> of <MethodProtocol>s implemented by (sub-)instances.'!
  50055. !ClassDescription methodsFor!
  50056.  
  50057. <= aClassDescription
  50058.     "Answer whether the receiver is 'less than' aClassDescription.
  50059.     By implementing this method, we enable Class objects to be stored
  50060.     in a SortedCollection with the default sort block."
  50061.  
  50062.     ^self name <= aClassDescription name!
  50063.  
  50064. addInstVarName: aString
  50065.     "Add a new instance variable to the receiver with the specified <readableString> name."
  50066.  
  50067.     | newClass |
  50068.     newClass := (ClassBuilder forModifying: self)
  50069.                 instanceVariables: (self instVarNames copyWith: aString);
  50070.                 modifyExistingClass.
  50071.     newClass notNil ifTrue: [newClass logDefinition].
  50072.     ^newClass!
  50073.  
  50074. addProtocol: protocol
  50075.     "Private - Add the specified method protocol to the list implemented by the receiver.
  50076.     Implementation Note: The protocols are stored by symbolic name in order not to
  50077.     require that the <MethodProtocol> objects be present at run-time. Note further
  50078.     that this method only adds the protocol to the list directly supported by this class,
  50079.     and should not be called directly or the integrity of the protocol will be impaired."
  50080.  
  50081.     | protName |
  50082.     protName := protocol asSymbol.
  50083.     protocols isNil ifTrue: [protocols := IdentitySet new].
  50084.     protocols add: protName.
  50085.     self allSubclassesDo: [:q | q removeProtocol: protName ifAbsent: []]!
  50086.  
  50087. addSharedPool: aPoolDictionary 
  50088.     "Add the specified pool dictionary to the list of those referenced by the receiver. 
  50089.     Note that this is a low-level operation intended for system use. The <ClassBuilder>
  50090.     should be used to modify classes."
  50091.  
  50092.     self instanceClass
  50093.         setSharedPoolNames: (self sharedPoolNames copyWith: aPoolDictionary name)!
  50094.  
  50095. allGetters
  50096.     "Private - Answer a <Set> of the instance variable getter methods in the receiver"
  50097.  
  50098.     ^self withAllSuperclasses inject: Set new
  50099.         into: 
  50100.             [:getters :each | 
  50101.             getters addAll: each getters.
  50102.             getters]!
  50103.  
  50104. allProtocols
  50105.     "Answer a <collection> of all the <MethodProtocol>s implemented by the receiver's
  50106.     instances, including those inherited from superclasses."
  50107.  
  50108.     | answer |
  50109.     answer := IdentitySet new.
  50110.     self withAllSuperclassesDo: [ :c | answer addAll: c protocols].
  50111.     ^answer!
  50112.  
  50113. browse
  50114.         "Open a suitable browser onto the receiver."
  50115.     
  50116.         Smalltalk developmentSystem browseClass: self!
  50117.  
  50118. canUnderstandProtocol: protName
  50119.     "Answer whether the receiver can understand the named <MethodProtocol>,
  50120.     even if it does not necessarily claim to implement it. See also #conformsToProtocol:"
  50121.  
  50122.     | protocol |
  50123.     protocol := self methodProtocolClass name: protName asSymbol.
  50124.     ^protocol selectors allSatisfy: [:s | self canUnderstand: s]!
  50125.  
  50126. categoriesFor: selector
  50127.     "Answer a chunk reader which will include the selector in
  50128.     each of the method category names to be read in.
  50129.     If the receiver doesn't actually include the selector, then just stream 
  50130.     over the categories and ignore them"
  50131.  
  50132.     | categories method |
  50133.     method := self compiledMethodAt: selector ifAbsent: [^ChunkReader null].
  50134.     categories := OrderedCollection new.
  50135.     ^ChunkReader do: [:chunk | categories addLast: (self methodCategoryClass name: chunk)]
  50136.         atEnd: 
  50137.             [method categories: categories.
  50138.             method storeCategories]!
  50139.  
  50140. categoriesFor: selector are: categories
  50141.     "Compatibility ith IBM Smalltalk fileIn format (which is of the form
  50142.     <class> categoriesFor: <selector> are: #([<categoryString>]*).
  50143.     Sets the additional categories of a selector if it exists."
  50144.  
  50145.     (self includesSelector: selector) ifTrue: [
  50146.         categories do: [:categoryString |
  50147.             self 
  50148.                 includeSelector: selector 
  50149.                 inCategory: (self methodCategoryClass name: categoryString)]]
  50150. !
  50151.  
  50152. categoriesOfMethod: aCompiledMethod
  50153.     "Private - Answer a <Set> of all the <methodCategory> objects in the receiver
  50154.     of which the <CompiledMethod> (assumed to belong to the receiver), 
  50155.     method, is a member.
  50156.     Implementation Note: There is a much simpler implementation for this method,
  50157.     but we want to avoid running the Unclassified category's inclusion test because
  50158.     it is slow and duplicates work we already have to do in enumerating the method
  50159.     catalogue. Performance is important as emitting the method categories constitutes
  50160.     a large proportion of file-out time. Unfortunately this optimized implementation
  50161.     does break encapsulation a little since it relies on the current implementation of
  50162.     the methods catalogue."
  50163.  
  50164.     "The simple implementation - about one third the speed
  50165.     ^self methodCategories select: [:category | category includesMethod: method]"
  50166.  
  50167.     | answer catClass unclassified |
  50168.     catClass := self methodCategoryClass.
  50169.     unclassified := catClass unclassified.
  50170.     answer := self whichCategoriesIncludeSelector: aCompiledMethod selector.
  50171.     answer isEmpty ifTrue: [answer add: catClass unclassified].
  50172.     catClass pseudoCategories do: 
  50173.             [:each | 
  50174.             (each ~~ unclassified and: [each includesMethod: aCompiledMethod]) 
  50175.                 ifTrue: [answer add: each]].
  50176.     answer add: aCompiledMethod privacyCategory.
  50177.     ^answer!
  50178.  
  50179. classCategoryClass
  50180.     "Private - Answer the class of object used to categorize classes.
  50181.     Answer nil if the category system is not present."
  50182.  
  50183.     ^Smalltalk at: #ClassCategory ifAbsent: []!
  50184.  
  50185. classPool
  50186.     "Answer the dictionary of class variables."
  50187.  
  50188.     ^self subclassResponsibility!
  50189.  
  50190. classVariableString
  50191.     "Answer a space separated string of the names of the receiver's class variables"
  50192.  
  50193.     | aStream |
  50194.     aStream := String writeStream: 40.
  50195.     self classPool keys asSortedCollection 
  50196.         do: [ :key | aStream nextPutAll: key]
  50197.         separatedBy: [aStream space].
  50198.     ^aStream contents!
  50199.  
  50200. coloredDefinition
  50201.     "Answer the definition message for the receiver, as coloured RTF text."
  50202.  
  50203.     ^self compilerClass syntaxColorOfExpression: self definition!
  50204.  
  50205. comment
  50206.     "Answer the class comment for the receiver"
  50207.  
  50208.     ^self subclassResponsibility!
  50209.  
  50210. comment: aString
  50211.     "Set the class comment for the receiver to aString"
  50212.  
  50213.     ^self subclassResponsibility!
  50214.  
  50215. commentStamp: stamp prior: prior 
  50216.     "Answer a chunk reader which will add a comment to the receiver. Supplied for 
  50217.     compatibility with the Squeak fileout format"
  50218.  
  50219.     ^SingleChunkReader do: [:chunk | self comment: chunk]!
  50220.  
  50221. compile: aString categories: aCollection
  50222.     "Compile the <readableString> argument, aString,  as source code in the context of the receiver
  50223.     and add the resulting method to the receiver's method dictionary, in the 
  50224.     categories in the <collection> of <MethodCategory>s.
  50225.     If the collection of categories does not include a privacy category, then the
  50226.     suggestion made by the default <MethodCategorizationPolicy> is chosen.
  50227.     If a compile error occurs then a <CompilerNotification> is signalled. 
  50228.     Answers the new method or nil if it failed to compile."
  50229.  
  50230.     ^self 
  50231.         compile: aString
  50232.         categories: aCollection
  50233.         package: nil!
  50234.  
  50235. compile: aString categories: categories package: aPackageOrNil
  50236.     "Compile the <readableString> argument, aString, as source code in the 
  50237.     context of the receiver and add the resulting method to the receiver's method 
  50238.     dictionary, in the categories in the <collection> of <MethodCategory>s, 
  50239.     categories. A #methodAdded: or #methodUpdated: event (depending on
  50240.     whether the resulting method is new or replaces an existing method) is
  50241.     fired with the <CompilationResult> as its argument. Note that a 
  50242.     #methodCategorized: event will not be generated, even if the set
  50243.     of categories of a pre-existing method are changed, because all the
  50244.     necessary information is available with a #methodUpdated: event.
  50245.     If the collection of categories does not include a privacy category, then the
  50246.     suggestion made by the default MethodCategorizationPolicy is chosen.
  50247.     If a compile error occurs then a <CompilerNotification> is signalled. 
  50248.     Answers the new method or nil."
  50249.  
  50250.     | method result |
  50251.     result := self basicCompile: aString.
  50252.     result notNil 
  50253.         ifTrue: 
  50254.             [| allCats |
  50255.             result package: aPackageOrNil.
  50256.             allCats := categories.
  50257.             method := result method.
  50258.             (allCats anySatisfy: [:c | c isPrivacy]) 
  50259.                 ifFalse: 
  50260.                     ["No method privacy was specified, so look for the conventional signature..."
  50261.  
  50262.                     | policy |
  50263.                     allCats := OrderedCollection withAll: categories.
  50264.                     policy := Smalltalk at: #MethodCategorizationPolicy ifAbsent: [].
  50265.                     policy notNil ifTrue: [allCats addLast: (policy default suggestedPrivacyFor: method)]].
  50266.             "To avoid generating a recategorization event we eschew CompiledMethod>>categories:"
  50267.             self methodCategoryClass setMethod: method categories: allCats.
  50268.             method storeCategories.
  50269.             "Now we can safely trigger #methodAdded/Updated: since the source and categories are now available"
  50270.             result fireSystemUpdateEvent].
  50271.     ^method!
  50272.  
  50273. compile: codeString classified: categoryString
  50274.     "Compile the argument, code, as source code in the context of the receiver
  50275.     and add the resulting method to the receiver's method dictionary.
  50276.     The newly compiled method is added to the category identified by the <readableString>,
  50277.     cat. If the new method replaces an existing one then the original categorization is maintained.
  50278.     If a compile error occurs then a CompilerNotification is signalled. 
  50279.     Answers the new method or nil if the compilation failed.
  50280.     N.B. This method is present primarily as part of the original ST-80 ClassDescription
  50281.     protocol, but is of limited use in a multi-category system like Dolphin. We recommend that
  50282.     #compile:categories: be used in preference."
  50283.  
  50284.     | method result |
  50285.     result := self basicCompile: codeString.
  50286.     result notNil 
  50287.         ifTrue: 
  50288.             [| category |
  50289.             method := result method.
  50290.             category := self methodCategoryClass name: categoryString asString.
  50291.             result isNew 
  50292.                 ifTrue: [category addMethodSilently: method]
  50293.                 ifFalse: [category addMethod: method].
  50294.             method storeCategories.
  50295.             result fireSystemUpdateEvent].
  50296.     ^method!
  50297.  
  50298. conformsToProtocol: protocol
  50299.     "Answer whether the receiver conforms to the named <MethodProtocol>."
  50300.  
  50301.     | protName |
  50302.     protName := protocol asSymbol.
  50303.     ^(protocols notNil and: [protocols includes: protName]) or: [
  50304.         superclass notNil and: [superclass conformsToProtocol: protName]]
  50305. !
  50306.  
  50307. copy: selector from: class
  50308.     "Copy the method with the selector <Symbol>, selector, in <ClassDescription>, 
  50309.     class, to the receiver's method dictionary, maintaining any existing categories.
  50310.     If a compile error occurs then a CompilerNotification is signalled. 
  50311.     Answers the new method or nil."
  50312.  
  50313.     ^self copy: selector from: class categories: (class compiledMethodAt: selector) categories
  50314.  
  50315. !
  50316.  
  50317. copy: selector from: class categories: categories
  50318.     "Copy the method with the selector <Symbol>, selector, in <Behavior>, 
  50319.     class, to the receiver's method dictionary, classifying it in each of the 
  50320.     the <Collection> of <methodCategory>s, categories.
  50321.     If a compile error occurs then a CompilerNotification is signalled. 
  50322.     Answers the new method or nil."
  50323.  
  50324.     | method |
  50325.     method := class compiledMethodAt: selector.
  50326.     ^self 
  50327.         compile: method getSource
  50328.         categories: categories
  50329.         package: method owningPackageIfLoose!
  50330.  
  50331. copy: sel from: class classified: cat
  50332.     "Copy the method with the selector <Symbol>, sel, in <Behavior>, class, 
  50333.     to the receiver's method dictionary, adding it to the category identified by 
  50334.     the <String>, cat. The method is not recompiled.
  50335.     This method is primarily present for Smalltalk-80 compatibility, but differs
  50336.     in that as Dolphin supports multiple categories, the existing method classifications
  50337.     are retained and 'cat' is treated as a new classification.
  50338.     The method is recompiled in its new class. If a compile error occurs then a 
  50339.     CompilerNotification is signalled. Answers the new method or nil."
  50340.  
  50341.     | categories |
  50342.     categories := (class compiledMethodAt: sel) categories.
  50343.     categories add: (self methodCategoryClass name: cat asString).
  50344.     ^self 
  50345.         copy: sel
  50346.         from: class 
  50347.         categories: categories!
  50348.  
  50349. copyAll: selectors from: class
  50350.     "Copy each of the methods with selectors in the <Collection> of <Symbol>s,
  50351.     selectors, from the <Behavior>, class, to the receiver's method dictionary, 
  50352.     maintaining the methods current categories.
  50353.     Answers whether all of the methods copied successfully."
  50354.  
  50355.     ^selectors allSatisfy: [:selector | (self copy: selector from: class) notNil]!
  50356.  
  50357. copyAll: selectors from: class classified: cat
  50358.     "Copy each of the methods with selectors in the <Collection> of <Symbol>s,
  50359.     selectors, from the <Behavior>, class, to the receiver's method dictionary, 
  50360.     adding the new methods to the category with <readableString> name, cat,
  50361.     as well as the methods current categories.
  50362.     Answers whether all of the methods copied successfully."
  50363.  
  50364.     ^selectors allSatisfy: [:selector | 
  50365.         (self copy: selector from: class classified: cat) notNil]!
  50366.  
  50367. copyAllCategoriesFrom: class
  50368.     "Copy all categories of method from the <Behavior>, class, to the receiver.
  50369.     Answers whether all of the methods copied successfully."
  50370.     
  50371.     ^class selectors allSatisfy: [:selector | (self copy: selector from: class) notNil]!
  50372.  
  50373. copyCategory: category from: aClass
  50374.     "Copy all methods of the <ClassDescription> class, in the <MethodCategory>
  50375.     named by the <readableString>, category, to the receiver. Answers whether all 
  50376.     of the methods copied successfully."
  50377.  
  50378.     | cat |
  50379.     cat := self methodCategoryClass name: category asString.
  50380.     ^(cat methodsInBehavior: self) 
  50381.         allSatisfy: [:m | (self copy: m selector from: aClass classified: cat) notNil]!
  50382.  
  50383. copyCategory: category from: aClass classified: newCategory
  50384.     "Copy all methods of the <ClassDescription> class, in the <MethodCategory>
  50385.     named by the <readableString>, category, to the receiver. Answers whether all 
  50386.     of the methods copied successfully. The methods are additionally classified
  50387.     under the <MethodCategory> named by the <readableString>, newCategory."
  50388.  
  50389.     | cat |
  50390.     cat := self methodCategoryClass name: category asString.
  50391.     ^(cat methodsInBehavior: self) 
  50392.             allSatisfy: [:m | (self copy: m selector from: aClass classified: newCategory) notNil]!
  50393.  
  50394. defaultIcon
  50395.     "Answer a suitable default icon to use for this class. Not all classes use their 
  50396.     default icon; one must define an appropriate #icon method in each class where the 
  50397.     icon required differs from that of the superclass."
  50398.  
  50399.     ^(self environment at: #Icon) fromId: self defaultIconName.
  50400.  
  50401.     !
  50402.  
  50403. defaultIconFrom: anExternalResourceLibrary
  50404.     "Answer a suitable default icon to use for this class. If anExternalResourceLibrary
  50405.     is, for some reason not open, then use the icon for the Object class."
  50406.  
  50407.     anExternalResourceLibrary asParameter isNull
  50408.         ifTrue: [^Object defaultIcon].
  50409.     ^(self environment at: #Icon) fromId: self defaultIconName in: anExternalResourceLibrary.
  50410.  
  50411.     !
  50412.  
  50413. defaultIconName
  50414.     "Answer a filename to use for an icon of this class."
  50415.  
  50416.     ^File composeStem: self name extension: 'ico'.!
  50417.  
  50418. definition
  50419.     "Answer the <readableString> definition message, which, when evaluated, will 
  50420.     define the receiver."
  50421.  
  50422.     | strm |
  50423.     strm := String writeStream: 256.
  50424.     self printDefinitionOn: strm.
  50425.     ^strm contents
  50426. !
  50427.  
  50428. displayOn: aStream
  50429.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  50430.     would want to see it."
  50431.  
  50432.     aStream nextPutAll: self name
  50433. !
  50434.  
  50435. getters
  50436.     "Private - Answer a <Set> of the instance variable getter methods in the receiver"
  50437.  
  50438.     ^self methodDictionary values select: [:each | each isGetter]!
  50439.  
  50440. includesCategory: category
  50441.     "Answer whether the receiver includes the named category."
  50442.  
  50443.     ^self methodsCatalogue includesKey: (self methodCategoryClass name: category)!
  50444.  
  50445. includeSelector: aSelector inCategory: category
  50446.     "Add aSelector to aCategoryString while leaving it in its existing
  50447.     set of categories."
  50448.     | catalogue noCategory selectors |
  50449.  
  50450.     self assert: [category isKindOf: self methodCategoryClass].
  50451.  
  50452.     "Ensure a methods catalogue entry exists for the requested category"
  50453.     catalogue := self methodsCatalogue.
  50454.     (self includesCategory: category) ifFalse: [
  50455.         catalogue at: category put: Array new].
  50456.  
  50457.     "Now add to the category if not already present therein"
  50458.     ((selectors := catalogue at: category) identityIncludes: aSelector) ifFalse: [
  50459.         catalogue at: category put: (selectors copyWith: aSelector)].
  50460.  
  50461.     self methodsCatalogue: catalogue!
  50462.  
  50463. indexOfInstVar: instVarName
  50464.     "Answer the index of the specified inst. var in the receiver, or
  50465.     if no matching instance variable, raise a NotFoundError."
  50466.  
  50467.     ^self allInstVarNames indexOf: instVarName ifAbsent: [self errorNotFound: instVarName]!
  50468.  
  50469. indexOfInstVar: instVarName ifAbsent: exceptionHandler
  50470.     "Answer the <integer> index of the inst. var of the receiver
  50471.     identified by the <readableString> name, instVarName, or
  50472.     if no matching instance variable, the result of evaluating the
  50473.     <niladicValuable>, exceptionHandler."
  50474.  
  50475.     ^self allInstVarNames indexOf: instVarName ifAbsent: exceptionHandler!
  50476.  
  50477. instanceVariables: aString
  50478.     "Private - Set the receiver's instanceVariables inst var."
  50479.  
  50480.     instanceVariables := aString!
  50481.  
  50482. instanceVariableString
  50483.     "Answer a string containing the names of the instance 
  50484.     variables in instances of the receiver, in the order they
  50485.     appear in those instances. The names are separated by spaces."
  50486.  
  50487.     | aStream |
  50488.     instanceVariables isNil ifTrue: [^''].
  50489.     instanceVariables class == String ifTrue: [^instanceVariables].
  50490.     aStream := String writeStream: 64.
  50491.     instanceVariables 
  50492.         do: [:instVarName | aStream nextPutAll: instVarName]
  50493.         separatedBy: [aStream space].
  50494.     ^aStream contents!
  50495.  
  50496. instVarNames
  50497.     "Answer a <sequencedReadableCollection> of the receiver's instance variable 
  50498.     names."
  50499.  
  50500.     instanceVariables isNil ifTrue: [^Array new].
  50501.     "This required for bootstrapping purposes only"
  50502.     instanceVariables class == Array ifTrue: [^instanceVariables].
  50503.     ^instanceVariables subStrings!
  50504.  
  50505. logDefinition
  50506.     self sourceManager logEvaluate: self definition!
  50507.  
  50508. methodCategories
  50509.     "Answer a <collection> of all the <methodCategory>s in which 
  50510.     the receiver's methods are classified."
  50511.  
  50512.     ^(self realMethodCategories)
  50513.         addAll: self methodCategoryClass pseudoCategories;
  50514.         yourself!
  50515.  
  50516. methodCategoryClass
  50517.     "Private - Answer the class of object used to categorize methods in the receiver.
  50518.     Implementation Note: This method cannot be stripped because it is required for
  50519.     compilation, but we want to allow the class to be stripped, and so answer a
  50520.     DeafObject if it has been."
  50521.  
  50522.     ^Smalltalk at: #MethodCategory ifAbsent: [DeafObject current]!
  50523.  
  50524. methodProtocol: protocolName attributes: attributes selectors: selectors
  50525.     "Instantiate and install the MethodProtocol named by the <Symbol>, protocolName,
  50526.     with the attributes named in the <Array> of <Symbol>s, attributes, with the selectors 
  50527.     in the <Array> of <Symbol>s selectors."
  50528.  
  50529.     
  50530.     (self methodProtocolClass name: protocolName)
  50531.         attributes: attributes;
  50532.         addAllSelectors: selectors;
  50533.         addClass: self!
  50534.  
  50535. methodProtocolClass
  50536.     "Private - Answer the class of object used to represent method protocols for the receiver."
  50537.  
  50538.     ^Smalltalk at: #MethodProtocol!
  50539.  
  50540. methods
  50541.     "For compatibility with Visual Smalltalk/Smalltalk Express
  50542.      file out format (both bereft of categories)."
  50543.  
  50544.     ^self methodsFor!
  50545.  
  50546. methodsCatalogue
  50547.     "Private - Answer an IdentityDictionary which stores Arrays of selectors
  50548.     keyed by category objects."
  50549.  
  50550.     ^methodsCatalogue isNil
  50551.         ifTrue: [IdentityDictionary new]
  50552.         ifFalse: [methodsCatalogue]!
  50553.  
  50554. methodsCatalogue: mapOrNil
  50555.     "Private - Sets the methods catalogue to mapOrNil which stores Arrays of selectors
  50556.     keyed by category objects. If the map is empty, then it is reduced to nil to save space."
  50557.  
  50558.     methodsCatalogue := (mapOrNil notNil and: [mapOrNil notEmpty])
  50559.                             ifTrue: [mapOrNil]
  50560. !
  50561.  
  50562. methodsFor
  50563.     "Answer a chunk reader to read and compile method chunks for the receiver.
  50564.     New methods are classified into the default category (''unclassified'')."
  50565.  
  50566.     ^ChunkReader 
  50567.         do: [:chunkString | self compile: chunkString]
  50568.         inContext: self
  50569.         atEnd: []!
  50570.  
  50571. methodsFor: categoryName 
  50572.     "Answer a chunk reader to read and compile method chunks for the receiver
  50573.     to be classified into the method category with the specified <readableString> name.
  50574.     This method is present for loading ST files in Green Book format. Ensure
  50575.     first that the category name doesn''t, falsely, appear hierarchical."
  50576.  
  50577.     | useName |
  50578.     useName := categoryName 
  50579.                 copyReplacing: (self environment at: #Category) separator
  50580.                 withObject: $/.
  50581.     ^ChunkReader 
  50582.         do: [:chunkString | self compile: chunkString classified: useName]
  50583.         inContext: self
  50584.         atEnd: []!
  50585.  
  50586. methodsFor: name stamp: aString 
  50587.     "Answer a chunk reader to read and compile method chunks for the receiver
  50588.     to be classified into the method category with the specified <readableString> name.
  50589.     The stamp is ignored. This method is for compatibility with the Squeak fileout format."
  50590.  
  50591.     | useName methodString |
  50592.     useName := name copyReplacing: (self environment at: #Category) separator
  50593.                 withObject: $/.
  50594.     ^ChunkReader 
  50595.         do: 
  50596.             [:chunkString | 
  50597.             methodString := chunkString copyReplaceAll: '_' with: ':='.
  50598.             self compile: methodString classified: useName]
  50599.         inContext: self
  50600.         atEnd: []!
  50601.  
  50602. newAspect: aspectClass name: aSymbol 
  50603.         "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  50604.         which is appropriate for representing aspects of the receiver's type."
  50605.     
  50606.         ^aspectClass name: aSymbol!
  50607.  
  50608. owningPackage
  50609.     ^self instanceClass owningPackage!
  50610.  
  50611. printDefinitionOn: target
  50612.     "Private - Append the textual definition of the receiver to the <puttableStream>, target."
  50613.  
  50614.     ^self subclassResponsibility!
  50615.  
  50616. printOn: aStream
  50617.     "Append the name of the receiver to aStream."
  50618.  
  50619.     aStream nextPutAll: self name.
  50620. !
  50621.  
  50622. privateMethods
  50623.     "For compatibility with IBM Smalltalk file out format"
  50624.  
  50625.     ^self methodsFor: 'private'
  50626.  
  50627. !
  50628.  
  50629. protocolNames
  50630.     "Private - Answer a <collection> of <Symbol>s, being the names of the
  50631.     <MethodProtocol>s  implemented directly by the receiver's instances (i.e. 
  50632.     excluding inherited protocols)."
  50633.  
  50634.     ^protocols isNil
  50635.         ifTrue: [IdentitySet new]
  50636.         ifFalse: [protocols]!
  50637.  
  50638. protocols
  50639.     "Private - Answer the <collection> of <MethodProtocol>s  implemented 
  50640.     directly by the receiver's instances (i.e. excluding inherited protocols)."
  50641.  
  50642.     ^protocols isNil
  50643.         ifTrue: [IdentitySet new]
  50644.         ifFalse: [ | mpc |
  50645.             mpc := self methodProtocolClass.
  50646.             protocols collect: [:p | mpc name: p]]!
  50647.  
  50648. protocols: anIdentitySetOrNil
  50649.     "Private - Set the protocols collection to anIdentitySetOrNil"
  50650.  
  50651.     protocols := anIdentitySetOrNil
  50652. !
  50653.  
  50654. publicMethods
  50655.     "For compatibility with IBM Smalltalk file out format"
  50656.  
  50657.     ^self methodsFor: 'public'
  50658.  
  50659. !
  50660.  
  50661. realCategoriesOfMethod: aCompiledMethod
  50662.     "Private - Answer a <collection> of the 'real' (i.e. non-pseudo or virtual) categories of the specified
  50663.     <CompiledMethod>, which is assumed to be a method of the receiver."
  50664.  
  50665.     | answer |
  50666.     answer := self whichCategoriesIncludeSelector: aCompiledMethod selector.
  50667.     answer add: aCompiledMethod privacyCategory.
  50668.     ^answer!
  50669.  
  50670. realMethodCategories
  50671.     "Answer a <collection> of all the <methodCategory>s in which 
  50672.     the receiver's methods are classified, but excluding pseudo-categories.
  50673.     Note, though, that public/private categories are included since
  50674.     these are not 'calculated' as such, but based on a flag in the method header."
  50675.  
  50676.     | catClass |
  50677.     catClass := self methodCategoryClass.
  50678.     ^self methodsCatalogue keys
  50679.         add: catClass public;
  50680.         add: catClass private;
  50681.         yourself!
  50682.  
  50683. removeCategory: category
  50684.     "Remove the Category from the receiver. N.B. All the methods belonging to the
  50685.     category are removed even if the method belongs to any other categories.
  50686.     In other words this removes a category of methods, not just the category."
  50687.  
  50688.     self removeSelectors: (((self methodCategoryClass name: category asString) methodsInBehavior: self) 
  50689.                         collect: [:method | method selector])!
  50690.  
  50691. removeInstVarName: aString
  50692.     "Remove the instance variable of the receiver with the specified <readableString> name."
  50693.  
  50694.     | newClass |
  50695.     newClass := (ClassBuilder forModifying: self)
  50696.                 instanceVariables: (self instVarNames copyWithout: aString);
  50697.                 modifyExistingClass.
  50698.     newClass notNil ifTrue: [    newClass notNil ifTrue: [newClass logDefinition]].
  50699.     ^newClass!
  50700.  
  50701. removeMethodFromCategories: method
  50702.     "Private - Remove the specified method (assumed to be of the receiver)
  50703.     from all the categories under which it is currently classified."
  50704.  
  50705.     (self categoriesOfMethod: method) do: [:c | c removeMethodSilently: method]!
  50706.  
  50707. removeProtocol: protocol
  50708.     "Private - Remove the specified method protocol from the list implemented by the receiver."
  50709.  
  50710.     self removeProtocol: protocol ifAbsent: [self protocols errorNotFound: protocol]!
  50711.  
  50712. removeProtocol: protocol ifAbsent: exceptionHandler
  50713.     "Private - Remove the specified method protocol from the list implemented by the receiver."
  50714.  
  50715.     protocols isNil ifTrue: [^exceptionHandler value].
  50716.     protocols remove: protocol asSymbol ifAbsent: [^exceptionHandler value].
  50717.     protocols isEmpty ifTrue: [protocols := nil]!
  50718.  
  50719. removeSelector: aSelector fromCategory: category
  50720.     "Private - Remove aSelector from aCategory. If no selectors are associated with
  50721.     aCategory as the outcome of this, then aCategory is removed"
  50722.  
  50723.     | catalogue aCategory anAssoc selectors |
  50724.     catalogue := self methodsCatalogue.
  50725.  
  50726.     selectors := catalogue at: category ifAbsent: [^self].
  50727.     (selectors identityIncludes: aSelector) ifFalse: [^self].
  50728.  
  50729.     selectors := catalogue at: category put: (selectors copyWithout: aSelector).
  50730.     selectors isEmpty
  50731.         ifTrue: [catalogue removeKey: category].
  50732.     self methodsCatalogue: catalogue!
  50733.  
  50734. removeSelector: selector ifAbsent: aBlock
  50735.     "Remove the method with selector, selector, from the receiver's method dictionary, answering
  50736.     the removed method. If it is not in the receiver's method dictionary, then answer the 
  50737.     result of evaluating aBlock."
  50738.  
  50739.     | method |
  50740.     method := super removeSelector: selector ifAbsent: [^aBlock value].
  50741.     self sourceManager logEvaluate: self name, ' removeSelector: ', selector printString, ' ifAbsent: []'.
  50742.     (self canUnderstand: selector) ifFalse: [
  50743.         "Remove any protocols from the receiver and subclasses which, 
  50744.         with the loss of the method, are no longer completely implemented"
  50745.         self removeUnsupportedProtocols: IdentitySet new selector: selector].
  50746.     "Remove the method from any categories"
  50747.     method categories do: [:c | c removeMethodSilently: method].
  50748.     ^method!
  50749.  
  50750. removeSelectors: selectors 
  50751.     "Remove each of the <Symbol> selectors in the <collection> argument, selectors,
  50752.     from the receiver's message dictionary. If any of the selectors are not present, they
  50753.     are simply ignored. Answer a <collection> of the methods which were actually
  50754.     removed."
  50755.  
  50756.     | methods stream |
  50757.     methods := super removeSelectors: selectors.
  50758.     stream := String writeStream.
  50759.     stream
  50760.         print: self;
  50761.         space;
  50762.         display: #removeSelectors:;
  50763.         nextPutAll: ' #('.
  50764.     methods do: [:each | stream print: each selector] separatedBy: [stream space].
  50765.     stream nextPut: $).
  50766.     self sourceManager logEvaluate: stream contents.
  50767.     selectors do: 
  50768.             [:selector | 
  50769.             (self canUnderstand: selector) 
  50770.                 ifFalse: 
  50771.                     ["Remove any protocols from the receiver and subclasses which, 
  50772.         with the loss of the method, are no longer completely implemented"
  50773.  
  50774.                     self removeUnsupportedProtocols: IdentitySet new selector: selector]].
  50775.     "Remove the methods from any categories"
  50776.     methods do: [:method | method categories do: [:c | c removeMethodSilently: method]].
  50777.     ^methods!
  50778.  
  50779. removeSharedPool: aPoolDictionary 
  50780.     "Remove the specified pool dictionary to the list of those referenced by the receiver. 
  50781.     Note that this is a low-level operation intended for system use. The <ClassBuilder>
  50782.     should be used to modify classes."
  50783.  
  50784.     self instanceClass
  50785.         setSharedPoolNames: (self sharedPoolNames remove: aPoolDictionary name; yourself)!
  50786.  
  50787. removeUnsupportedProtocols: superUnsupported selector: removedSelector
  50788.     "Private - Remove any protocols that are no longer supported after the removal
  50789.     of the <selector>, removedSelector, from the receiver. Any removed protocols still 
  50790.     supported by subclasses are migrated down."
  50791.  
  50792.     | unsupported |
  50793.     unsupported := self protocols select: [:p | p includesSelector: removedSelector].
  50794.     unsupported do: [:p | p removeClass: self].
  50795.     unsupported addAll: superUnsupported.
  50796.     self subclasses do: [:s |
  50797.         "If the subclass has its own implementation for the selector, then it can still
  50798.          support the protocol, otherwise it might need to remove further protocols"
  50799.         (s canUnderstand: removedSelector)
  50800.             ifTrue: [unsupported do: [:p | p addClass: s]]
  50801.             ifFalse: [s removeUnsupportedProtocols: unsupported selector: removedSelector]]!
  50802.  
  50803. renameInstVar: oldString to: newString
  50804.     "Private - Rename the instance variable of the receiver named by the <readableString>, oldString, to be
  50805.     named by the <readableString>, newString. The variable must be one of the receiver's own instance 
  50806.     variables , not of one of its superclasses.
  50807.     Note: This is a low-level operation that does not recompile any methods, however since the methods
  50808.     access instance variables by index they will remain valid until recompiled. It is the caller's responsibility
  50809.     to rewrite and recompile methods that reference the instance variable."
  50810.  
  50811.     self setInstanceVariables: (self instVarNames copyReplacing: oldString withObject: newString).
  50812.     self logDefinition.
  50813.     self environment classUpdated: self!
  50814.  
  50815. selectorsInCategory: category
  50816.     "Answer an <Collection> of selector <Symbol>s, of the receiver's methods 
  50817.     which are included in the <methodCategory>, category."
  50818.  
  50819.     ^self methodsCatalogue at: category ifAbsent: [Array new]!
  50820.  
  50821. setInstanceVariables: aCollection
  50822.     "Private - Set the instance variable string of the receiver to be the list
  50823.     of names in aCollection, separated by spaces."
  50824.  
  50825.     | aStream |
  50826.     instanceVariables := 
  50827.         aCollection isEmpty 
  50828.             ifFalse: [
  50829.                 aStream := String writeStream: 64.
  50830.                 aCollection 
  50831.                     do: [:i | aStream nextPutAll: i]
  50832.                     separatedBy: [aStream space].
  50833.                 aStream contents]!
  50834.  
  50835. sharedPoolNames
  50836.     "Answer a <Set> of <String>s, being the names of the shared pool dictionaries that
  50837.     are specified locally in the receiver (pools are inherited in Dolphin)."
  50838.  
  50839.     ^self instanceClass sharedPoolNames!
  50840.  
  50841. sharedPools
  50842.     "Answer a Set of the pools (dictionaries) that are specified locally 
  50843.     in the receiver."
  50844.  
  50845.     | environment |
  50846.     environment := self environment.
  50847.     ^self sharedPoolNames collect: [ :symbol | self environment at: symbol ifAbsent: [Dictionary new]]!
  50848.  
  50849. sharedVariableString
  50850.     "Answer a String containing the names of the Pools accessable
  50851.     from the receiver and its instances. The names are separated
  50852.     by spaces."
  50853.  
  50854.     | aStream |
  50855.     aStream := String writeStream: 32.
  50856.     self sharedPoolNames asSortedCollection
  50857.         do: [:s | aStream nextPutAll: s]
  50858.         separatedBy: [aStream space].
  50859.     ^aStream contents!
  50860.  
  50861. sourceManager
  50862.     "Answer the receiver's source manager. Answer a DeafObject if none is available."
  50863.  
  50864.     ^(Smalltalk at: #SourceManager ifAbsent: [^DeafObject current]) default!
  50865.  
  50866. storeCategories
  50867.     "Private - Record the categories of the receiver to the change log.
  50868.     The job is simply delegated to the receiver's source manager (if available)."
  50869.  
  50870.     self sourceManager storeCategoriesForClass: self .
  50871. !
  50872.  
  50873. storeCategoriesOfMethod: aCompiledMethod
  50874.     aCompiledMethod storeCategories!
  50875.  
  50876. whichCategoriesIncludeSelector: aSelector
  50877.     "Private - Answer a <collection> of the 'real' (i.e. non-pseudo or virtual) categories in the 
  50878.     receiver's method catalogue which include the specified selector."
  50879.  
  50880.     | answer catClass selector |
  50881.     answer := IdentitySet new: 5.
  50882.     self methodsCatalogue keysAndValuesDo: 
  50883.             [:eachCategory :eachSelectors | 
  50884.             (eachSelectors identityIncludes: aSelector) 
  50885.                 ifTrue: [answer add: eachCategory]].
  50886.     catClass := self methodCategoryClass.
  50887.     ^answer! !
  50888.  
  50889. Class comment:
  50890. '"Instances" of Class describe the representation and behavior of objects. Class adds more comprehensive programming support facilities to the basic ones provided in the abstract superclass Behavior and more descriptive facilities to the ones provided in the abstract superclass ClassDescription. In particular Class adds the representation for class variable names and shared (pool) variables.
  50891.  
  50892. In reality, Class has no instances. All classes in the system are actually instances of a parallel hierarchy of Metaclass instances, but they do have the same shape as Class and are logically, if not physically, instances of it.
  50893.  
  50894. Instance Variables:
  50895.  
  50896.     name        <Symbol> which is the name of the class
  50897.     classPool        <PoolDictionary> mapping class variable name <String>s to values
  50898.     sharedPools    <Array> of <Symbol> names of shared variable pools
  50899.     comment        <String> comment about the class (like this one), or nil if none.
  50900.     classCategories    <Array> of <ClassCategory>. The categories of the class, if any.
  50901.     _guid        <GUID>. Unique identifier for the class.
  50902.     '!
  50903. !Class class methodsFor!
  50904.  
  50905. allBehaviors
  50906.     "Private - Answer a Set of all of the Behaviors contained in the system.
  50907.     N.B. There is currently no specified ordering (hence the answer is a Set)."
  50908.  
  50909.     | answer |
  50910.     answer := Set new: 1000.
  50911.     self allBehaviorsDo: [:behavior | answer add: behavior].
  50912.     ^answer!
  50913.  
  50914. allBehaviorsDo: operation
  50915.     "Private - Evaluate the monadic valuable, operation, for each of the Behaviors in the system.
  50916.     N.B. No guarantee is made about ordering, except that the operation is evaluated
  50917.     for a subclass after its superclass."
  50918.  
  50919.     self allClassesDo: [ :class |
  50920.         operation value: class.
  50921.         operation value: class class]!
  50922.  
  50923. allClasses
  50924.     "Private - Answer an OrderedCollection of all of the classes in the system, in breadth-first order.
  50925.     There is no particular ordering at a particular depth.
  50926.     N.B. Do not change this ordering to depth-first without careful thought about the
  50927.     implications for the rest of the system (even though it might be faster)."
  50928.  
  50929.     | answer roots |
  50930.     roots := self allRoots.
  50931.     answer := OrderedCollection withAll: roots.
  50932.     roots do: [:root | answer addAll: root allSubclasses].
  50933.     ^answer.!
  50934.  
  50935. allClassesDo: operation
  50936.     "Private - Evaluate the monadic valuable, operation, for each of the classes in the system.
  50937.     N.B. No guarantee is made about ordering, except that the block is evaluated
  50938.     for a subclass after its superclass."
  50939.  
  50940.     self allRoots do: [:root | root withAllSubclassesDo: operation]!
  50941.  
  50942. allMethodsDo: operation
  50943.     "Private - Evaluate the monadic valuable, operation, for each and every method in the system
  50944.     which is connected into the class hierarchy. No ordering should be assumed."
  50945.  
  50946.     self allBehaviorsDo: [:behavior | behavior methodDictionary do: operation]!
  50947.  
  50948. allRoots
  50949.     "Private - Answer a Collection of all global root classes - ie. those that are subclasses of nil.
  50950.     The answered collection will include only global classes. We do a bit of shuffling to ensure that
  50951.     Object will be the first class."
  50952.  
  50953.     | roots |
  50954.     roots := (self basicAllRoots 
  50955.                 select: [:each | (self environment at: each name ifAbsent: []) == each]) asSet.
  50956.     roots remove: Object.
  50957.     ^(roots asOrderedCollection)
  50958.         addFirst: Object;
  50959.         yourself!
  50960.  
  50961. basicAllRoots
  50962.     "Private - Answer a Collection of all root classes - ie. those that are subclasses of nil."
  50963.  
  50964.     ^(Metaclass primAllInstances select: [:meta | meta instanceClass superclass isNil])
  50965.         collect: [:meta | meta instanceClass]!
  50966.  
  50967. icon
  50968.     "Answers an Icon that can be used to represent this class"
  50969.  
  50970.     ^##(self) defaultIcon! !
  50971.  
  50972. !Class methodsFor!
  50973.  
  50974. addClassVarName: aString
  50975.     "Add a new class variable to the receiver with the specified <readableString> name.
  50976.     Note: This is a low-level operation and does not recompile affected classes. Generally 
  50977.     speaking any modification to a class should be made through a <ClassBuilder>."
  50978.  
  50979.     | varName |
  50980.     varName := aString asString.    "Allow symbolic names too"
  50981.     self withAllSubclasses do: 
  50982.             [:each | 
  50983.             (each classPool bindingFor: varName) isNil 
  50984.                 ifFalse: [^self error: aString , ' is already used as a variable name in class ' , each name]].
  50985.     classPool := self classPool.
  50986.     (classPool includesKey: varName) 
  50987.         ifFalse: 
  50988.             [classPool at: varName put: nil.
  50989.             self logDefinition.
  50990.             self environment classUpdated: self]!
  50991.  
  50992. addSharedPool: aPoolDictionary 
  50993.     "Add the argument, aPoolDictionary, as one of the receiver's pool dictionaries. 
  50994.     It is an error if the dictionary is already one of the pools.
  50995.     Note: This is a low-level operation and does not recompile affected classes. Generally 
  50996.     speaking any modification to a class should be made through a <ClassBuilder>."
  50997.  
  50998.     | poolName pools |
  50999.     poolName := aPoolDictionary name.
  51000.     pools := self sharedPoolNames.
  51001.     (pools includes: poolName)
  51002.         ifTrue: [^self error: 'The dictionary is already in my pool'].
  51003.     pools add: poolName.
  51004.     sharedPools := pools.!
  51005.  
  51006. addToSuper
  51007.     "Private - Add the receiver as a subclass of its superclass
  51008.     and do the same for the receiver's metaclass buddy."
  51009.  
  51010.     super addToSuper.
  51011.     self class addToSuper!
  51012.  
  51013. basicClassPool
  51014.     "Private - Answer the receiver's class pool (dictionary of class variables)."
  51015.  
  51016.     ^classPool
  51017. !
  51018.  
  51019. basicClassPool: aDictionaryOrNil
  51020.     "Private - Set the receiver's class pool (dictionary of class variables).
  51021.     The Associations in this Dictionary are those referenced from CompiledMethod's
  51022.     literal frame - if you are calling this method make certain you understand what
  51023.     you're doing!!"
  51024.  
  51025.     classPool := aDictionaryOrNil!
  51026.  
  51027. basicSharedPools: aCollection
  51028.     "Private - Set the receiver's shared pools collection."
  51029.  
  51030.     sharedPools := aCollection!
  51031.  
  51032. bindingFor: aString 
  51033.     "Answer a variable binding for the named variable in the scope of this class. 
  51034.     If there is no such variable, then answer nil.
  51035.     Note that in Dolphin pools are inherited."
  51036.  
  51037.     classPool isNil 
  51038.         ifFalse: 
  51039.             [| classVar |
  51040.             (classVar := classPool bindingFor: aString) isNil ifFalse: [^classVar]].
  51041.     sharedPools isNil 
  51042.         ifFalse: 
  51043.             [self sharedPools do: 
  51044.                     [:each | 
  51045.                     | sharedVar |
  51046.                     (sharedVar := each bindingFor: aString) isNil ifFalse: [^sharedVar]]].
  51047.     ^superclass bindingFor: aString!
  51048.  
  51049. canFileOut
  51050.     "Answer true if the receiver can be filed out. At this stage we just check to ensure that
  51051.     the file out file is writeable"
  51052.  
  51053.     ^File isWriteable: self  fileOutName!
  51054.  
  51055. categories
  51056.     "Answer a <Array> of <ClassCategory>s in which the receiver is included.
  51057.     This will always contains at least one entry ('Unclassified' if there are no others)."
  51058.  
  51059.     ^classCategories isNil
  51060.         ifTrue: [Array with: self classCategoryClass unclassified]
  51061.         ifFalse: [classCategories]!
  51062.  
  51063. categories: aCollection 
  51064.     "Set the Categories of the receiver to those in the specified <collection> of <ClassCategory>s.
  51065.     Remove from any other categories."
  51066.  
  51067.     | unclassified newCategories oldCategories |
  51068.     unclassified := self classCategoryClass unclassified.
  51069.     newCategories := aCollection reject: [:c | c = unclassified].
  51070.     oldCategories := self classCategories ifNil: [#()].
  51071.     (newCategories symmetricDifference: oldCategories) isEmpty 
  51072.         ifFalse: 
  51073.             [self classCategories: newCategories.
  51074.             self isChanged: true.
  51075.             self storeCategories.
  51076.             self class environment trigger: #classCategorized: with: self]!
  51077.  
  51078. categoriesForClass
  51079.     "Private - Answer an <ChunkReader> configured for reading the receiver's
  51080.     <ClassCategory>s."
  51081.  
  51082.     | catclass cats |
  51083.     catclass := self classCategoryClass.
  51084.     cats := OrderedCollection new.
  51085.     ^ChunkReader 
  51086.         do: [:chunkString | cats addLast: (catclass name: chunkString)]
  51087.         atEnd: [self categories: cats]!
  51088.  
  51089. category
  51090.     "Answer the <ClassCategory> of the receiver or nil if it does not have one.
  51091.  
  51092.     If the receiver is associated with a number of category objects then the alphabetically
  51093.     first one is answered (the list is maintained in sort order)."
  51094.  
  51095.     | categories |
  51096.     categories := self categories.
  51097.     ^categories isEmpty ifFalse: [categories first]
  51098. !
  51099.  
  51100. category: category
  51101.     "Set the category of the receiver to be the <ClassCategory> category, or the
  51102.     <ClassCategory> named by the <readableString>, category.
  51103.     The receiver is removed from any existing categories."
  51104.  
  51105.     self categories: (Array with: (self classCategoryClass name: category asString))!
  51106.  
  51107. classCategories
  51108.     "Private - Answer a <collection> of <ClassCategory> objects representing the 
  51109.     class categories of which the receiver is a member, or nil if unclassified."
  51110.  
  51111.     ^classCategories!
  51112.  
  51113. classCategories: categoryCollection
  51114.     "Private - Set the class categories of the receiver to categoryCollection."
  51115.  
  51116.     classCategories := categoryCollection isEmpty 
  51117.                         ifFalse: [categoryCollection asSortedCollection asArray]
  51118. !
  51119.  
  51120. classPool
  51121.     "Answer the Dictionary of class variables belonging to the receiver.
  51122.     N.B. This should not be modified as it may not be the actual class pool
  51123.     (though it is guaranteed to have identical contents)."
  51124.  
  51125.     ^classPool isNil ifTrue: [PoolDictionary new] ifFalse: [classPool]!
  51126.  
  51127. classVarNames
  51128.     "Answer a Set of the class variable names of the receiver."
  51129.  
  51130.     ^classPool isNil ifTrue: [Set new] ifFalse: [classPool keys]!
  51131.  
  51132. clearGuid
  51133.     "Private - Set the receiver's GUID to be the null <GUID>.
  51134.     Might be overridden by subclasses which must retain their GUIDs (e.g. COMInterfaces)."
  51135.  
  51136.     _guid := nil!
  51137.  
  51138. comment
  51139.     "Answer the class comment for the receiver."
  51140.  
  51141.     ^String readFrom: (self sourceManager getSourceFromDescriptor: comment) readStream!
  51142.  
  51143. comment: blahBlah
  51144.     "Set the class comment for the receiver to the readableString, blahBlah."
  51145.  
  51146.     self sourceManager storeCommentString: blahBlah forClass: self.
  51147.     self isChanged: true.
  51148.     "No need to clear the class caches in this case"
  51149.     self environment trigger: #classUpdated: with: self!
  51150.  
  51151. definitionChunk
  51152.     "Answer a chunk string for the definition of the receiver"
  51153.  
  51154.     | stream |
  51155.     stream := String writeStream: 256.
  51156.     (self sourceManager sourceFilerOn: stream) fileOutDefinitionOfClass: self.
  51157.     ^stream contents!
  51158.  
  51159. fileIn
  51160.     "File in the receiver's definition from a class file in the receiver's
  51161.     package directory."
  51162.  
  51163.     self sourceManager fileInPackagedClass: self!
  51164.  
  51165. fileOut
  51166.     "File out the receiver's definition to a class file in the receiver's
  51167.     package directory."
  51168.  
  51169.     self sourceManager fileOutPackagedClass: self!
  51170.  
  51171. fileOutName
  51172.     "Private - Answer the default file name for the class to file out on."
  51173.  
  51174.     | path package |
  51175.     path := File composeStem: self fileOutStem extension: 'cls'.
  51176.     package := self owningPackage.
  51177.     package notNil ifTrue: [path := File replacePath: path with: package path].
  51178.     ^path!
  51179.  
  51180. fileOutOn: aSourceFiler
  51181.     aSourceFiler fileOutClass: self!
  51182.  
  51183. fileOutStem
  51184.     "Private - Answer the default file name stem for the class to file out on."
  51185.  
  51186.     ^self name!
  51187.  
  51188. guid
  51189.     "Answer the receiver's globally unique id (a 128-bit number allocated/set 
  51190.     when the receiver was created or filed in)."
  51191.  
  51192.     ^_guid isNil
  51193.         ifTrue: [GUID null]
  51194.         ifFalse: [_guid]!
  51195.  
  51196. guid: id
  51197.     "Private - Set the value of the receiver's 'guid' instance variable to the 
  51198.     <GUID>, id.
  51199.     N.B. A classes GUID should not normally be changed after the class has
  51200.     been created, but should remain with it throughout its life."
  51201.  
  51202.     self setGuid: id.
  51203.     self storeGUID!
  51204.  
  51205. includeInCategory: category
  51206.     "Add the receiver to the ClassCategory with specified name, while leaving it in its existing
  51207.     set of categories."
  51208.  
  51209.     self categories: (self categories asSet add: (self classCategoryClass name: category asString); yourself)!
  51210.  
  51211. initializeAfterBinaryLoad
  51212.     "Perform any post-binary load initialisation for the class. Ensure all the
  51213.     methods are marked as having no source."
  51214.  
  51215.     self methodDictionary do: [:each | each loseSource ].
  51216.     self class methodDictionary do: [:each | each loseSource ]!
  51217.  
  51218. initializeAfterLoad
  51219.     "Perform any post-load initialisation for the class. This includes any specific #initialize
  51220.     implementation (but not that #initialize is only sent to classes which directly implement
  51221.     #initialize, otherwise we'd end up re-initializing the class variables of the superclass
  51222.     every time a new subclass was added).
  51223.     There may be some circumstances where an entire hierarchy of classes requires some
  51224.     common initialization after load, in which case this message can be overridden."
  51225.  
  51226.     "Initialize if necessary"
  51227.     (self class includesSelector: #initialize) ifTrue: [self initialize].
  51228.  
  51229.     "Flag as not changed"
  51230.     self isChanged: false!
  51231.  
  51232. instanceClass
  51233.     "Answer the receiver's singleton instance (the actual class object)."
  51234.  
  51235.     ^self!
  51236.  
  51237. isChanged
  51238.     "Answer true if the receiver or any of it's contents have been changed since
  51239.     their changed flag was last reset."
  51240.  
  51241.     ^self propertyAt: #isChanged ifAbsent: [false]!
  51242.  
  51243. isChanged: aBoolean
  51244.     "Flag the receiver as changed or not changed, according to the value 
  51245.     of the <Boolean> argument. If the receiver is marked as changed, then
  51246.     its owning package (if any) is also so marked."
  51247.  
  51248.     self propertyManager isNil ifTrue: [^self].
  51249.     "Note that we don't test the existing value of the change flag here, because
  51250.      we want to inform the package regardless (in case it isn't currently changed
  51251.      for some reason)"
  51252.     aBoolean 
  51253.         ifTrue: [ | package |
  51254.             self propertyAt: #isChanged put: true.
  51255.             (package := self owningPackage) notNil ifTrue: [
  51256.                 package isChanged: true]]
  51257.         ifFalse: [self removePropertyAt: #isChanged ifAbsent: []]!
  51258.  
  51259. name
  51260.     "Answer a <readableString> that is the name of the receiver
  51261.     Implementation Note: For compatibility reasons, the answer is actually a Symbol."
  51262.  
  51263.     ^name!
  51264.  
  51265. newClassBuilder: aClassSymbol instanceVariableNames: instVarString classVariableNames: classVarString poolDictionaries: poolDictString
  51266.     ^(ClassBuilder new)
  51267.         superclass: self;
  51268.         className: aClassSymbol asString;
  51269.         instanceVariableString: instVarString;
  51270.         classVariableString: classVarString;
  51271.         sharedPoolString: poolDictString;
  51272.         yourself!
  51273.  
  51274. noClassCategoryName
  51275.     "Answer the String name of the ClassCategory used to mark that no
  51276.     category has been set for a Class."
  51277.  
  51278.     ^self classCategoryClass unclassifiedName!
  51279.  
  51280. owningPackage
  51281.     "Answers the package that owns the receiver or nil if it is not yet owned
  51282.     by any package."
  51283.  
  51284.     "We use an indirect reference to the Package to avoid referencing
  51285.     this development class in a runtime image. The answer should always be nil
  51286.     in a runtime application."
  51287.  
  51288.     ^(self environment at: #Package ifAbsent: [^nil]) manager packageOfClass: self!
  51289.  
  51290. owningPackage: aPackageOrNil
  51291.     "Set the receiver's <Package> to be the argument. Any current package association is lost.
  51292.     Note that setting the owning package of a class to the distinguished '_Uncommitted' package
  51293.     is exactly the same as setting it to nil."
  51294.  
  51295.     (self environment at: #Package ifAbsent: [^nil])
  51296.         manager addClass: self to: aPackageOrNil!
  51297.  
  51298. printDefinitionOn: target
  51299.     "Private - Append the textual definition of the receiver to the <puttableStream>,
  51300.     target. Note that this includes the definition of the receiver's metaclass since
  51301.     we now define the whole caboodle using a single message."
  51302.  
  51303.     ^target
  51304.         nextPutAll: self superclass name; space; nextPutAll: self kindOfSubclass; print: self name; crtab;
  51305.         nextPutAll: 'instanceVariableNames: '; print: self instanceVariableString; crtab; 
  51306.         nextPutAll: 'classVariableNames: '; print: self classVariableString; crtab;
  51307.         nextPutAll: 'poolDictionaries: '; print: self sharedVariableString; crtab;
  51308.         nextPutAll: 'classInstanceVariableNames: '; print: self class instanceVariableString!
  51309.  
  51310. removeClassVarName: aString
  51311.     "Remove the class variable from the receiver with the specified <readableString> name.
  51312.     Note: This is a low-level operation and does not recompile affected classes. Generally 
  51313.     speaking any modification to a class should be made through a <ClassBuilder>."
  51314.  
  51315.     | varName |
  51316.     varName := aString asSymbol.
  51317.     self classPool removeKey: varName.
  51318.     classPool isEmpty ifTrue: [classPool := nil].
  51319.     self logDefinition.
  51320.     self environment classUpdated: self!
  51321.  
  51322. removeFromCategory: category
  51323.     "Remove the receiver from the aCategoryOrString, while leaving it in any other
  51324.     class categories."
  51325.  
  51326.     | classCat |
  51327.     classCat := self classCategoryClass name: category asString.
  51328.     self categories: (self categories asSet remove: classCat; yourself)!
  51329.  
  51330. removeFromSuper
  51331.     "Private - Remove the receiver as a subclass of its superclass
  51332.     and do the same for the receiver's metaclass buddy."
  51333.  
  51334.     super removeFromSuper.
  51335.     self class removeFromSuper!
  51336.  
  51337. removeFromSystem
  51338.     "Private - Remove the receiver from the system. This method will fail if the class has instances
  51339.     or subclasses so these must be removed first where ever  possible, which should be done in
  51340.     an #uninitialize method. #unitialize is sent immediately before the class is removed, but (like
  51341.     #initialize) only if directly implemented by the class - i.e. it will not be sent if the implementation
  51342.     is inherited. N.B. Do not supersend #uninitialize from an override, as you may damage a
  51343.     superclass which is not being removed."
  51344.  
  51345.     self subclasses do: [:each | each removeFromSystem].
  51346.     self sourceManager logEvaluate: self name, ' removeFromSystem'.
  51347.     ClassBuilder removeClass: self!
  51348.  
  51349. removeSharedPool: aPoolDictionary 
  51350.     "Remove the argument, aPoolDictionary, as one of the receiver's pool dictionaries. 
  51351.     Note: This is a low-level operation and does not recompile affected classes. Generally 
  51352.     speaking any modification to a class should be made through a <ClassBuilder>."
  51353.  
  51354.     | poolName |
  51355.     poolName := aPoolDictionary name.
  51356.     self sharedPoolNames remove: poolName.
  51357.     sharedPools isEmpty ifTrue: [sharedPools := nil]!
  51358.  
  51359. rename: aString
  51360.     "Private - Change the name of the receiver to aString.
  51361.     N.B. This is the low-level rename operation, and does not rename any references
  51362.     to the class."
  51363.  
  51364.     | currentName |
  51365.     currentName := self name.
  51366.     self rename: aString in: self environment.
  51367.     self sourceManager logEvaluate: ((String writeStream)
  51368.                 nextPutAll: currentName;
  51369.                 space;
  51370.                 nextPutAll: #rename:;
  51371.                 space;
  51372.                 print: aString;
  51373.                 contents)!
  51374.  
  51375. rename: aString in: aSystemDictionary
  51376.     "Private - Rename the receiver to aString.
  51377.     This will change the receiver's key in aSystemDictionary whilst maintaining the association.
  51378.     This means that any existing references will be maintained but method source code will still
  51379.     contain the old name and will subsequently fail to compile unless edited.
  51380.  
  51381.     We Remove the receiver from the subclass collection of its superclass for the
  51382.     duration of the rename just in case the subclass collection is key-sensitive."
  51383.  
  51384.     | newName oldName binding |
  51385.     self removeFromSuper.
  51386.     oldName := name.
  51387.     newName := aString asSymbol.
  51388.     binding := self environment changeKey: oldName to: newName.
  51389.     name := newName.
  51390.     self addToSuper.
  51391.     "Note how the event is delayed until the class is correctly wired in"
  51392.     self environment triggerGlobalRenamed: binding from: oldName!
  51393.  
  51394. renameClassVar: oldString to: newString
  51395.     "Private - Rename the class variable of the receiver named by the <readableString>, oldString, to be
  51396.     named by the <readableString>, newString. The variable must be one of the receiver's own class 
  51397.     variables , not of one of its superclass'.
  51398.     Note: This is a low-level operation that does not recompile any methods, however since the methods
  51399.     access class variables via the binding (Association) they will remain valid until recompiled. It is the 
  51400.     caller's responsibility to rewrite and recompile methods that reference the variable."
  51401.  
  51402.     self classPool changeKey: oldString to: newString.
  51403.     self logDefinition.
  51404.     self environment classUpdated: self!
  51405.  
  51406. requiresInstallation
  51407.     "Answer whether the receiver requires 'installing' into its environment."
  51408.  
  51409.     ^name notNil!
  51410.  
  51411. setClassVarNames: anArray 
  51412.     "Private - Change the set of class variables to be those specified in anArray.
  51413.     Existing variables which are still required are left untouched, those no
  51414.     longer required are deleted, and new ones may be added (initialised to nil).
  51415.     Answer whether any class variables were removed as this indicates that a
  51416.     recompilation is required."
  51417.  
  51418.     | removed added original |
  51419.     classPool := self classPool.
  51420.     original := classPool keys.
  51421.     removed := original difference: anArray.
  51422.     removed do: [:each | classPool removeKey: each].
  51423.     added := anArray difference: original.
  51424.     added do: [:each | classPool at: each put: nil].
  51425.     classPool isEmpty ifTrue: [classPool := nil].
  51426.     ^removed notEmpty or: [added notEmpty and: [self hasCompilationFailures]]!
  51427.  
  51428. setGuid: id
  51429.     "Private - Set the value of the receiver's 'guid' instance variable to the 
  51430.     <GUID>, id.
  51431.     N.B. A classes GUID should not normally be changed after the class has
  51432.     been created, but should remain with it throughout its life."
  51433.  
  51434.     _guid := id.
  51435. !
  51436.  
  51437. setName: aSymbol
  51438.     "Private - Set the name of the receiver to be aSymbol."
  51439.  
  51440.     name := aSymbol!
  51441.  
  51442. setSharedPoolNames: aCollection
  51443.     "Private - Set the shared variable pool to include the names in aCollection.
  51444.     N.B. initial conversion to a set removes duplicates."
  51445.  
  51446.     sharedPools := aCollection isEmpty 
  51447.         ifFalse: [aCollection asSet asArray collect: [:poolName | poolName asSymbol]]!
  51448.  
  51449. sharedPoolNames
  51450.     "Answer a Set of the names of the shared pool dictionaries that
  51451.     are specified locally in the receiver."
  51452.  
  51453.     sharedPools isNil ifTrue: [^Set new].
  51454.     ^sharedPools asSet.
  51455. !
  51456.  
  51457. sharedStaticPools
  51458.     "Private - Answer an array of all the non-empty shared pools for the 
  51459.     receiver.
  51460.     N.B. Sent by compiler, and may be removed in future."
  51461.  
  51462.     | answer pool |
  51463.     answer := OrderedCollection new.
  51464.     "First the class variables"
  51465.     self withAllSuperclassesDo: [ :c | 
  51466.         pool := c basicClassPool.
  51467.         (pool notNil and: [pool notEmpty]) ifTrue: [answer add: pool]].
  51468.     "Then the pool variables"
  51469.     self withAllSuperclassesDo: [:c | 
  51470.         c sharedPools do: [:s | 
  51471.             s isEmpty ifFalse: [answer add: s]]].
  51472.     ^answer asArray!
  51473.  
  51474. sourceDescriptor
  51475.     "Answer the source descriptor for the receiver's comment."
  51476.  
  51477.     ^comment!
  51478.  
  51479. sourceDescriptor: sourceDes
  51480.     "Private - Set the class comment source descriptor for the receiver 
  51481.     to sourceDes, the format of which only the SourceManager understands."
  51482.  
  51483.     comment := sourceDes!
  51484.  
  51485. stbConvertFrom: anSTBClassFormat
  51486.     "Private - Answer a block that answers a new instance initialised from the block's single
  51487.     parameter, an Array or ByteArray representing the old object whose format is
  51488.     described by anSTBClassFormat.
  51489.  
  51490.     By default, classes only know about the current format."
  51491.  
  51492.     ^nil!
  51493.  
  51494. stbModifyExportProxy: anSTBImportedClassProxy
  51495.     "Private - This is an opportunity to modifiy the classes' binary export proxy just before it is
  51496.     output (to an STC file). The default is to do nothing - the standard STBImportedClassProxy is
  51497.     generally sufficient for nearly all cases."!
  51498.  
  51499. stbSaveOn: anSTBOutFiler
  51500.     "Save out a binary representation of the receiver to anSTBOutFiler."
  51501.  
  51502.     anSTBOutFiler saveObject: self as: (STBClassProxy for: self)!
  51503.  
  51504. stbVersion
  51505.     "If instances of a class are saved out to an STBOutFiler and must
  51506.     remain loadable even if the class format changes then we need to be able
  51507.     to distinguish between the different formats. A new binary format is
  51508.     created whenever the number or order of instance variables in a class
  51509.     are changed. All classes initially answer a version number of zero.
  51510.  
  51511.     This identification of a changed format is achieved by overriding this
  51512.     class method in the changed subclass to answer a new SmallInteger.
  51513.     Also, in order to 'upgrade' an old instance to a new one, you must
  51514.     provide or amend the class method #stbConvertFrom:."
  51515.  
  51516.     ^0!
  51517.  
  51518. storeGUID
  51519.     "Private - Record the receivers GUID to the change log."
  51520.  
  51521.     self sourceManager storeGUIDForClass: self
  51522. !
  51523.  
  51524. subclass: aClassSymbol instanceVariableNames: instVarString classVariableNames: classVarString poolDictionaries: poolDictString
  51525.     ^(self 
  51526.         newClassBuilder: aClassSymbol
  51527.         instanceVariableNames: instVarString
  51528.         classVariableNames: classVarString
  51529.         poolDictionaries: poolDictString) modifyOrCreate!
  51530.  
  51531. subclass: aClassSymbol instanceVariableNames: instVarString classVariableNames: classVarString poolDictionaries: poolDictString category: aCategoryOrString
  51532.     "If aClassSymbol is not an existing class then create and answer a new fixed pointer subclass,
  51533.     otherwise modify the class with name aClassSymbol to have the indicated features and answer it.
  51534.     Primarily present for backwards compatibility with Smalltalk-80."
  51535.  
  51536.     ^(self 
  51537.         newClassBuilder: aClassSymbol
  51538.         instanceVariableNames: instVarString
  51539.         classVariableNames: classVarString
  51540.         poolDictionaries: poolDictString)
  51541.         categoryNames: (Array with: aCategoryOrString);
  51542.         modifyOrCreate!
  51543.  
  51544. subclass: aClassSymbol
  51545.         instanceVariableNames: instVarString
  51546.         classVariableNames: classVarString
  51547.         poolDictionaries: poolDictString
  51548.         classInstanceVariableNames: classInstVarString
  51549.     "Create or modify the class, classSymbol, to be a subclass of the receiver
  51550.     with the specified instance variables, class pool, and pool dictionaries,
  51551.     and class instance variables."
  51552.  
  51553.     | subclass |
  51554.     subclass := self 
  51555.                 subclass: aClassSymbol
  51556.                 instanceVariableNames: instVarString
  51557.                 classVariableNames: classVarString
  51558.                 poolDictionaries: poolDictString.
  51559.     subclass class instanceVariableNames: classInstVarString.
  51560.     ^subclass!
  51561.  
  51562. sunitName
  51563.     ^self name!
  51564.  
  51565. uninitialize
  51566.     "Private - Perform any uninitialisation for the class - typically clearing down class variables - in
  51567.     preparation for removal from the system. You should override this method if, for example,
  51568.     your class maintains a registry of its own instances in a class variable.
  51569.     This message will only be sent to a class which directly implements it, i.e. it will not be
  51570.     sent if the implementation is inherited."
  51571.  
  51572.     ^self error: 'Do not supersend #uninitialize'!
  51573.  
  51574. uninitializeBeforeRemove
  51575.     "Perform any pre-removal uninitialisation for the class. This includes any specific #uninitialize
  51576.     implementation (but note that #uninitialize is only sent to classes which directly implement
  51577.     #uninitialize, otherwise we'd probably end up damaging superclasses which are not being
  51578.     removed).
  51579.     There may be some circumstances where an entire hierarchy of classes requires some
  51580.     common uninitialization prior to removal, in which case this message can be overridden."
  51581.  
  51582.     (self class includesSelector: #uninitialize) ifTrue: [self uninitialize]!
  51583.  
  51584. variableByteSubclass: aClassSymbol instanceVariableNames: instVarString classVariableNames: classVarString poolDictionaries: poolDictString
  51585.     ^(self 
  51586.         newClassBuilder: aClassSymbol
  51587.         instanceVariableNames: instVarString
  51588.         classVariableNames: classVarString
  51589.         poolDictionaries: poolDictString)
  51590.         beBytes;
  51591.         modifyOrCreate!
  51592.  
  51593. variableByteSubclass: aClassSymbol instanceVariableNames: instVarString classVariableNames: classVarString poolDictionaries: poolDictString category: aCategoryOrString
  51594.     "If aClassSymbol is not an existing class then create an answer a new variable byte subclass,
  51595.     otherwise modify the class with name aClassSymbol to have the indicated features and answer 
  51596.     it. Primarily present for backwards compatibility with Smalltalk-80."
  51597.  
  51598.     ^(self 
  51599.         newClassBuilder: aClassSymbol
  51600.         instanceVariableNames: instVarString
  51601.         classVariableNames: classVarString
  51602.         poolDictionaries: poolDictString)
  51603.         beBytes;
  51604.         categoryNames: (Array with: aCategoryOrString);
  51605.         modifyOrCreate!
  51606.  
  51607. variableByteSubclass: aClassSymbol
  51608.         instanceVariableNames: instVarString
  51609.         classVariableNames: classVarString
  51610.         poolDictionaries: poolDictString
  51611.         classInstanceVariableNames: classInstVarString
  51612.     "Create or modify the class, classSymbol, to be a variable-byte subclass 
  51613.     (has indexable byte-size nonpointer variables) of the receiver
  51614.     with the specified class pool, and pool dictionaries, and class instance
  51615.     variables. Note that variable byte classes cannot have any named
  51616.     instance variables, and therefore the instVarString must be empty."
  51617.  
  51618.     | subclass |
  51619.     subclass := self 
  51620.                 variableByteSubclass: aClassSymbol
  51621.                 instanceVariableNames: instVarString
  51622.                 classVariableNames: classVarString
  51623.                 poolDictionaries: poolDictString.
  51624.     subclass class instanceVariableNames: classInstVarString.
  51625.     ^subclass
  51626. !
  51627.  
  51628. variableSubclass: aClassSymbol instanceVariableNames: instVarString classVariableNames: classVarString poolDictionaries: poolDictString
  51629.     ^(self 
  51630.         newClassBuilder: aClassSymbol
  51631.         instanceVariableNames: instVarString
  51632.         classVariableNames: classVarString
  51633.         poolDictionaries: poolDictString)
  51634.         beVariable;
  51635.         modifyOrCreate!
  51636.  
  51637. variableSubclass: aClassSymbol instanceVariableNames: instVarString classVariableNames: classVarString poolDictionaries: poolDictString category: aCategoryOrString
  51638.     "If aClassSymbol is not an existing class then create and answer a new variable pointer 
  51639.     subclass, otherwise modify the class with name aClassSymbol to have the indicated features and 
  51640.     answer it. Primarily intended for backwards compatibility with Smalltalk-80."
  51641.  
  51642.     ^(self 
  51643.         newClassBuilder: aClassSymbol
  51644.         instanceVariableNames: instVarString
  51645.         classVariableNames: classVarString
  51646.         poolDictionaries: poolDictString)
  51647.         beVariable;
  51648.         categoryNames: (Array with: aCategoryOrString);
  51649.         modifyOrCreate!
  51650.  
  51651. variableSubclass: aClassSymbol
  51652.         instanceVariableNames: instVarString
  51653.         classVariableNames: classVarString
  51654.         poolDictionaries: poolDictString
  51655.         classInstanceVariableNames: classInstVarString
  51656.     "Create or modify the class classSymbol to be a variable subclass (has
  51657.     indexable pointer variables) of the receiver with the specified
  51658.     instance variables, class pool, pool dictionaries, and class instance
  51659.     variables."
  51660.  
  51661.     | subclass |
  51662.     subclass := self 
  51663.                 variableSubclass: aClassSymbol
  51664.                 instanceVariableNames: instVarString
  51665.                 classVariableNames: classVarString
  51666.                 poolDictionaries: poolDictString.
  51667.     subclass class instanceVariableNames: classInstVarString.
  51668.     ^subclass
  51669.  
  51670. ! !
  51671.  
  51672. Metaclass comment:
  51673. 'Metaclass is the class of objects which represent the classes of the Classes of the system.
  51674. In other words, every class in the system (e.g. Integer) is the sole instance of an instance of Metaclass
  51675. (e.g. Integer class), they are not instances of Class (which, in fact, has no instances). A class object''s 
  51676. class (a Metaclass) provides the instance specific behavior of that class (i.e. it is where the class 
  51677. methods live, whereas the instance methods live in the class object itself).
  51678.  
  51679. A Metaclass fulfils the role for a class object that a class object does for its instances.
  51680.  
  51681. The Metaclass hierarchy parallels the Class hierarchy in that if class X is a subclass of class Y, then
  51682. X class is also a subclass of Y class. The roots of the class hierarchy (e.g. Object), however, are
  51683. exceptions to this rule since Object''s superclass is nil, but Object class (i.e. the Metaclass instance of
  51684. which Object is an instance) is a subclass of Class.
  51685.  
  51686. Please see the Blue Book for further explanation.
  51687.  
  51688. Metaclass has the following instance variables:
  51689.     instanceClass    - the single instance of the Metaclass which is a Class object'!
  51690. !Metaclass class methodsFor!
  51691.  
  51692. icon
  51693.     "Answers an Icon that can be used to represent this class. Here we use a constant expression 
  51694.     evaluated at compile time in order to statically bind 'self' at this position in the class hierarchy 
  51695.     (i.e. to Object). This ensures that subclasses which do not override this method still answer 
  51696.     'Object defaultIcon' rather than 'aSubclass defaultIcon'. Classes which provide their own default icon 
  51697.     can override this method with a similar implementation perhaps with #defaultIconFrom: if the icon comes
  51698.     from an ExternalResourceLibrary other than the system default."
  51699.  
  51700.     ^##(self) defaultIcon! !
  51701.  
  51702. !Metaclass methodsFor!
  51703.  
  51704. addToSuper
  51705.     "Private - Add the receiver into its superclasses' subclass collection.
  51706.     Root Metaclasses will have a superclass of Class - we do not put such
  51707.     classes into Class's subclass collection."    
  51708.  
  51709.     superclass ~~ Class
  51710.         ifTrue: [super addToSuper]
  51711. !
  51712.  
  51713. bindingFor: aString 
  51714.     "Answer a variable binding for the named variable in the scope of this class. 
  51715.     If there is no such variable, then answer nil."
  51716.  
  51717.     ^self instanceClass bindingFor: aString!
  51718.  
  51719. classPool
  51720.     "Answer the dictionary of class variables."
  51721.  
  51722.     ^instanceClass classPool!
  51723.  
  51724. classVariables
  51725.     "Answer the dictionary of class variables."
  51726.  
  51727.     ^instanceClass classVariables!
  51728.  
  51729. classVarNames
  51730.     "Answer a Set of the class variable names of the receiver."
  51731.  
  51732.     ^Set new!
  51733.  
  51734. comment
  51735.     "Answer the class comment for the receiver."
  51736.  
  51737.     ^self instanceClass comment
  51738. !
  51739.  
  51740. comment: aString
  51741.     "Set the class comment for the receiver to aString."
  51742.  
  51743.     self instanceClass comment: aString
  51744. !
  51745.  
  51746. instanceClass
  51747.     "Answer the receiver's singleton instance (the actual class object)."
  51748.  
  51749.     ^instanceClass
  51750. !
  51751.  
  51752. instanceClass: aClass
  51753.     "Private - Set the receiver's instance class to aClass.
  51754.     Any users of this method probably don't understand what they're doing."
  51755.  
  51756.     instanceClass := aClass
  51757. !
  51758.  
  51759. instanceVariableNames: aString 
  51760.     "Set the instance variables of the receiver (the class instance variables
  51761.     of its instance class) to those in aString - a space separated name list."
  51762.  
  51763.     | classInstVars |
  51764.     classInstVars := aString trimBlanks.
  51765.     ^self instanceVariableString trimBlanks = classInstVars 
  51766.         ifTrue: [self]
  51767.         ifFalse: [
  51768.             ClassBuilder new
  51769.                 class: self;
  51770.                 superclass: superclass;
  51771.                 instanceSpec: instanceSpec;
  51772.                 instanceVariableString: classInstVars;
  51773.                 modifyExistingClass]!
  51774.  
  51775. isChanged: aBoolean
  51776.     "Flag the receiver as changed or not changed, according to the value 
  51777.     of the <Boolean> argument.
  51778.     Implementation Note: The change flags are held on the instance side."
  51779.  
  51780.     self instanceClass isChanged: aBoolean!
  51781.  
  51782. isMeta
  51783.     "Answer whether the receiver is a <Metaclass>."
  51784.  
  51785.     ^true!
  51786.  
  51787. name
  51788.     "Answer a String containing the receiver name. 
  51789.     For speed code directly rather than use concatenation.
  51790.     N.B. This is NOT a global name."
  51791.  
  51792.     ^instanceClass name, ' class'!
  51793.  
  51794. new
  51795.     "Answer a new instance of the receiver - there can be only one (the
  51796.     class object). Why define an instance creation method as an instance
  51797.     method? Because Metaclasses are actually the classes of classes."
  51798.  
  51799.     instanceClass isNil
  51800.         ifFalse: [self error: 'There can be only one (instance of a metaclass)'].
  51801.     ^instanceClass := super new
  51802. !
  51803.  
  51804. printDefinitionOn: target 
  51805.     "Private - Append the textual definition of the receiver to the <puttableStream>, target."
  51806.  
  51807.     target
  51808.         nextPutAll: self name;
  51809.         space;
  51810.         display: #instanceVariableNames:;
  51811.         space;
  51812.         print: self instanceVariableString!
  51813.  
  51814. removeClassVarName: aString 
  51815.     "Remove the class variable from the receiver with the specified <readableString> name."
  51816.  
  51817.     ^self instanceClass removeClassVarName: aString!
  51818.  
  51819. removeFromSuper
  51820.     "Private - Remove the receiver from its superclasses' subclass collection.
  51821.     Root Metaclasses will have a superclass of Class - we do not put such
  51822.     classes into Class's subclass collection."
  51823.  
  51824.     superclass ~~ Class
  51825.         ifTrue: [super removeFromSuper]
  51826. !
  51827.  
  51828. setSharedPoolNames: aCollection
  51829.     "Private - Set the <Symbol> names of the shared pool dictionaries that
  51830.     are specified locally in the receiver (pools are inherited in Dolphin)."
  51831.  
  51832.     self instanceClass setSharedPoolNames: aCollection
  51833. !
  51834.  
  51835. sharedStaticPools
  51836.     "Answer the receiver's shared pools."
  51837.  
  51838.     ^instanceClass sharedStaticPools!
  51839.  
  51840. stbSaveOn: anSTBOutFiler
  51841.     "Save out a binary representation of the receiver to anSTBOutFiler."
  51842.  
  51843.     anSTBOutFiler saveObject: self as: (STBMetaclassProxy for: self)! !
  51844.  
  51845. False comment:
  51846. 'The False class implements the behaviour of the false (logical false) object.
  51847.  
  51848. False is a singleton whose sole instance is the object represented by the reserved word, false. (i.e. any reference to false will always answer true when compared with any other using the #== message).
  51849.  
  51850. False implement the ANSI protocols <Object> and <boolean>.'!
  51851. !False class methodsFor!
  51852.  
  51853. icon
  51854.     "Answers an Icon that can be used to represent this class"
  51855.  
  51856.     ^##(self) defaultIcon! !
  51857.  
  51858. !False methodsFor!
  51859.  
  51860. | operand
  51861.     "Answer whether either the receiver OR the <boolean> argument, operand,
  51862.     is true.
  51863.     Implementation Note: The #ifTrue:ifFalse: is present in order to have the 
  51864.     VM check that the operand is actually a <Boolean>."
  51865.  
  51866.     ^operand ifTrue: [true] ifFalse: [false]!
  51867.  
  51868. and: operand
  51869.     "Answer whether the receiver and the result of evaluating the <niladicValuable>,
  51870.      operand, are both true. The argument is only evaluated if the receiver is true.
  51871.     N.B. In the normal case where operand is a literal block the compiler inlines
  51872.     the conditional operation in the home method."
  51873.  
  51874.     ^self!
  51875.  
  51876. asDword
  51877.     "Answer the receiver in a form suitable for passing/returning as a
  51878.     32-bit integer value."
  51879.  
  51880.     ^0!
  51881.  
  51882. asParameter
  51883.     "Answer the value of the receiver in a form suitable for
  51884.     passing to an external function call."
  51885.  
  51886.     ^0
  51887. !
  51888.  
  51889. ifFalse: operand
  51890.     "Evaluate and answer the result of the evaluating the <niladicValuable>
  51891.     argument, operand, if the receiver is false, otherwise answer nil. 
  51892.     N.B. This messuage is optimised by the compiler by inlining literal block
  51893.     arguments in their home method."
  51894.  
  51895.     ^operand value!
  51896.  
  51897. ifFalse: falseOperand ifTrue: trueOperand
  51898.     "Evaluate, and answer the result, of the <niladicValuable>, falseOperand, if 
  51899.     the receiver is false, or the <niladicValuable>, trueOperand, if the receiver is 
  51900.     true.
  51901.     N.B. This message is normally optimised by the compiler if the operands are
  51902.     literal blocks."
  51903.  
  51904.     ^falseOperand value!
  51905.  
  51906. ifTrue: operand
  51907.     "Evaluate and answer the result of the evaluating the <niladicValuable>
  51908.     argument, operand, if the receiver is true, otherwise answer nil. 
  51909.     N.B. This messuage is optimised by the compiler by inlining literal block
  51910.     arguments in their home method."
  51911.  
  51912.     ^nil!
  51913.  
  51914. ifTrue: trueOperand ifFalse: falseOperand
  51915.     "Evaluate, and answer the result, of the <niladicValuable>, falseOperand, if 
  51916.     the receiver is false, or the <niladicValuable>, trueOperand, if the receiver is 
  51917.     true.
  51918.     N.B. This message is normally optimised by the compiler if the operands are
  51919.     literal blocks."
  51920.  
  51921.     ^falseOperand value!
  51922.  
  51923. not
  51924.     "Answer the logical inverse of the receiver."
  51925.  
  51926.     ^true
  51927. !
  51928.  
  51929. or: operand
  51930.     "Answer whether either the receiver or the result of evaluating the
  51931.     <niladicValuable> argument, operand, is true. The argument is only
  51932.     evaluated if the receiver is false.
  51933.     N.B. In the normal case where the argument is a literal block the compiler
  51934.     optimizes this message by inlining the conditional operation in the home
  51935.     method."
  51936.  
  51937.     ^operand value!
  51938.  
  51939. printOn: target
  51940.     "Append the a textual representation of the receiver to the puttableStream, <target>..
  51941.     Note that this override refines #printString to comply with the ANSI 
  51942.     protocol <boolean>."
  51943.     
  51944.     target nextPutAll: 'false'!
  51945.  
  51946. xor: operand
  51947.     "Answer whether either the receiver or the boolean argument <operand>
  51948.     is true, but not both.
  51949.     Since the receiver is false, the answer depends entirely on the argument."
  51950.  
  51951.     ^operand! !
  51952.  
  51953. True comment:
  51954. 'The True class implements the behavior of the true (logical truth) object.
  51955.  
  51956. Trueis a singleton whose sole instance is the object represented by the reserved word, true. true is an identity object (i.e. any reference to true will always answer true when compared with any other using the #== message).
  51957.  
  51958. True implement the ANSI protocols <Object> and <boolean>.'!
  51959. !True class methodsFor!
  51960.  
  51961. icon
  51962.     "Answers an Icon that can be used to represent this class"
  51963.  
  51964.     ^##(self) defaultIcon! !
  51965.  
  51966. !True methodsFor!
  51967.  
  51968. & operand
  51969.     "Answer whether the receiver and the <boolean> argument, operand,
  51970.     are both true.
  51971.     Implementation Note: The #ifTrue:ifFalse: is present in order to have the 
  51972.     VM check that the operand is actually a <Boolean>."
  51973.  
  51974.     ^operand ifTrue: [true] ifFalse: [false]!
  51975.  
  51976. and: operand
  51977.     "Answer whether the receiver and the result of evaluating the <niladicValuable>,
  51978.      operand, are both true. The argument is only evaluated if the receiver is true.
  51979.     N.B. In the normal case where operand is a <niladicBlock> the compiler inlines
  51980.     the conditional operation in the home method."
  51981.  
  51982.     ^operand value!
  51983.  
  51984. asDword
  51985.     "Answer the receiver in a form suitable for passing/returning as a
  51986.     32-bit integer value."
  51987.  
  51988.     ^1!
  51989.  
  51990. asParameter
  51991.     "Answer the value of the receiver in a form suitable for
  51992.     passing to an external function call."
  51993.  
  51994.     ^1
  51995. !
  51996.  
  51997. ifFalse: operand
  51998.     "Evaluate and answer the result of the evaluating the <niladicValuable>
  51999.     argument, operand, if the receiver is false, otherwise answer nil. 
  52000.     N.B. This messuage is optimised by the compiler by inlining literal block
  52001.     arguments in their home method."
  52002.  
  52003.     ^nil!
  52004.  
  52005. ifFalse: falseOperand ifTrue: trueOperand
  52006.     "Evaluate, and answer the result, of the <niladicValuable>, falseOperand, if 
  52007.     the receiver is false, or the <niladicValuable>, trueOperand, if the receiver is 
  52008.     true.
  52009.     N.B. This message is normally optimised by the compiler if the operands are
  52010.     literal blocks."
  52011.  
  52012.     ^trueOperand value!
  52013.  
  52014. ifTrue: operand
  52015.     "Evaluate and answer the result of the evaluating the <niladicValuable>
  52016.     argument, operand, if the receiver is true, otherwise answer nil. 
  52017.     N.B. This messuage is optimised by the compiler by inlining literal block
  52018.     arguments in their home method."
  52019.  
  52020.     ^operand value!
  52021.  
  52022. ifTrue: trueOperand ifFalse: falseOperand
  52023.     "Evaluate, and answer the result, of the <niladicValuable>, falseOperand, if 
  52024.     the receiver is false, or the <niladicValuable>, trueOperand, if the receiver is 
  52025.     true.
  52026.     N.B. This message is normally optimised by the compiler if the operands are
  52027.     literal blocks."
  52028.  
  52029.     ^trueOperand value!
  52030.  
  52031. not
  52032.     "Answer the logical inverse of the receiver."
  52033.  
  52034.     ^false
  52035. !
  52036.  
  52037. or: operand
  52038.     "Answer whether either the receiver or the result of evaluating the
  52039.     <niladicValuable> argument, operand, is true. The argument is only
  52040.     evaluated if the receiver is false.
  52041.     N.B. In the normal case where the argument is a literal block the compiler
  52042.     optimizes this message by inlining the conditional operation in the home
  52043.     method."
  52044.  
  52045.     ^self!
  52046.  
  52047. printOn: target
  52048.     "Append the a textual representation of the receiver to the puttableStream, <target>..
  52049.     Note that this override refines #printString to comply with the ANSI 
  52050.     protocol <boolean>."
  52051.     
  52052.     target nextPutAll: 'true'!
  52053.  
  52054. xor: operand
  52055.     "Answer whether either the receiver or the boolean argument <operand>
  52056.     is true, but not both.
  52057.     Since the receiver is false, the answer is true only if the argument
  52058.     is false."
  52059.  
  52060.     ^operand not! !
  52061.  
  52062. PrinterCanvas comment:
  52063. ''!
  52064. !PrinterCanvas class methodsFor!
  52065.  
  52066. choose
  52067.     "Answers a new instance of the receiver created with a non-owned hDC to a printer
  52068.     chosen by the user with the PrintDialog. If the user cancels out of the dialog
  52069.     then we answer nil."
  52070.  
  52071.     | hDC |
  52072.     ^(hDC := PrintDialog showModal) isNil
  52073.         ifFalse: [self withOwnedDC: hDC]! !
  52074.  
  52075. !PrinterCanvas methodsFor!
  52076.  
  52077. basicFree
  52078.     "Private - Free the external resources associated with the receiver."
  52079.  
  52080.     self endPage; endDoc.
  52081.     super basicFree!
  52082.  
  52083. endDoc
  52084.     "Signal the end of the current document."
  52085.  
  52086.     GDILibrary default endDoc: self asParameter
  52087. !
  52088.  
  52089. endPage
  52090.     "Signal the end of the current page."
  52091.  
  52092.     GDILibrary default endPage: self asParameter
  52093.  
  52094. !
  52095.  
  52096. startDoc
  52097.     "Signal the start of a new document."
  52098.  
  52099.     self startDocNamed: SessionManager current applicationName!
  52100.  
  52101. startDocNamed: aString 
  52102.     | struct |
  52103.     struct := DOCINFO new.
  52104.     struct lpszDocName: aString.
  52105.     GDILibrary default startDoc: self asParameter lpdi: struct!
  52106.  
  52107. startPage
  52108.     "Signal the start of a new page."
  52109.  
  52110.     GDILibrary default startPage: self asParameter! !
  52111.  
  52112. ClassCategory comment:
  52113. ''!
  52114. !ClassCategory class methodsFor!
  52115.  
  52116. allClassCategories
  52117.     "Answer the set of all <classCategory>s current registered in the system."
  52118.  
  52119.     ^Table asArray!
  52120.  
  52121. categoryIcon
  52122.     "Answer an Icon representing the Category objects which the receiver collects." 
  52123.  
  52124.     ^Class icon!
  52125.  
  52126. initialize
  52127.     "Private - Initialize the receiver's class variables.
  52128.  
  52129.     This is a No-Op because we have to create the table
  52130.     during the booting process of Dolphin so all the methods
  52131.     categories can be set as they are loaded. Support for the booting
  52132.     of the system is unnecessary in the release version of Dolphin but
  52133.     it resolves the conundrom of creating the Smalltalk system, which
  52134.     relies on itself to work, from nothing using smalltalk. 
  52135.  
  52136.     It is unwise to clear down this table, as the development system
  52137.     expects methods and classes to be correctly categorized."
  52138. "    | newTable |
  52139.  
  52140.     newTable := WeakLookupTable new.
  52141.     newTable addAll: Table associations.
  52142.     Table := newTable"
  52143.  
  52144.     "During the boot, weakness doesn't work properly, so some repairs may be needed"
  52145.     Unclassified := self newNamed: self unclassifiedName.
  52146.     Table 
  52147.         at: self unclassifiedName put: Unclassified;
  52148.         removeKey: 'No category' ifAbsent: []!
  52149.  
  52150. name: cat
  52151.     "Answer a new or existing class category with the specified name."
  52152.  
  52153.     | nameString |
  52154.     nameString := cat asString.
  52155.     ^nameString isEmpty 
  52156.         ifTrue: [self unclassified]
  52157.         ifFalse: [Table at: nameString ifAbsentPut: [self newNamed: nameString]]!
  52158.  
  52159. unclassified
  52160.     "Answer a <ClassCategory> used to mark an unclassified classes."
  52161.  
  52162.     ^Unclassified!
  52163.  
  52164. unclassifiedName
  52165.     "Private - Answer the String name used to mark a none existing category."
  52166.  
  52167.     ^ 'Unclassified'!
  52168.  
  52169. uninitialize
  52170.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  52171.  
  52172.     Table := nil.
  52173.     Unclassified := nil! !
  52174.  
  52175. !ClassCategory methodsFor!
  52176.  
  52177. addClass: class
  52178.     "Add the <Class>, class, to the collection of classes associated with the receiver."
  52179.  
  52180.     class includeInCategory: self!
  52181.  
  52182. contents
  52183.     "Answer a Collection of all Class objects which are 
  52184.     held by the receiver."
  52185.  
  52186.     ^self class environment allClasses select: [:aClass | self includesClass: aClass]!
  52187.  
  52188. includesClass: class 
  52189.     "Answer whether the receiver includes the <ClassDescription>, class."
  52190.  
  52191.     | classCategories |
  52192.     ^(classCategories := class classCategories) isNil 
  52193.         ifTrue: [self == self class unclassified]
  52194.         ifFalse: [classCategories identityIncludes: self]!
  52195.  
  52196. removeClass: aClass
  52197.     "Remove aClass from the classes held by the reciver. Answer
  52198.     aMethod."
  52199.  
  52200.     aClass removeFromCategory: self.
  52201.     ^aClass! !
  52202.  
  52203. IntermediateCategory comment:
  52204. ''!
  52205. !IntermediateCategory class methodsFor!
  52206.  
  52207. name: categoryName
  52208.     "Answer the subinstance of the receiver with the 
  52209.     <readableString> name, categoryName."
  52210.  
  52211.     ^self newNamed: categoryName! !
  52212.  
  52213. !IntermediateCategory methodsFor!
  52214.  
  52215. acceptsAdditions
  52216.     "Answer whether new members can be added to the receiver.
  52217.     Intermediate categories are merely placeholders in the tree, and cannot
  52218.     have methods or classes added to them directly."
  52219.  
  52220.     ^false!
  52221.  
  52222. addClass: class
  52223.     "Add the <Class>, class, to the collection of classes associated with the receiver."
  52224.  
  52225.     ^self shouldNotImplement!
  52226.  
  52227. addMethod: method
  52228.     "Add the <CompiledMethod>, method, to the collection of methods within the receiver.
  52229.     As this is a pseudo category witch calculated membership, we just ignore the request."
  52230. !
  52231.  
  52232. addMethodSilently: method
  52233.     "Private - Add the <CompiledMethod>, method, to the collection of methods within the receiver
  52234.     without making any fuss.
  52235.     As this is a pseudo category with calculated membership, we just ignore the request."!
  52236.  
  52237. contents
  52238.     "Answer all the objects held by the receiver (in this case none - this is a branch
  52239.     category used as a temporary placeholder in a category tree)."
  52240.  
  52241.     ^#()!
  52242.  
  52243. includesMethod: method
  52244.     "Answer whether the receiver includes the <CompiledMethod>, method.
  52245.     Intermediate categories (i.e. non-terminal branches of the category tree)
  52246.     never include any methods."
  52247.  
  52248.     ^false!
  52249.  
  52250. isIntermediate
  52251.     "Private - Answer whether the receiver is a temporary category used only as a 
  52252.     branch node in a category tree."
  52253.  
  52254.     ^true!
  52255.  
  52256. methodsInBehavior: class
  52257.     "Answer all the methods in the <Behavior>, class, which are members of the receiver.
  52258.     We aren't able to determine this readily."
  52259.  
  52260.     ^Set new!
  52261.  
  52262. removeClass: class
  52263.     "Remove the <ClassDescription>, class, from the classes 'held' by the receiver."
  52264.  
  52265.     ^self shouldNotImplement! !
  52266.  
  52267. MethodCategory comment:
  52268. 'MethodCategory is the class of objects used to classify the methods of classes in taxonomies that are generally unrelated to the class hierarchy.
  52269.  
  52270. Instance Variables: (None)
  52271.  
  52272. Class Variables:
  52273.     Pseuds        <Set> of <VirtualMethodCategory>s. The pseudo-categories.
  52274.     Table        <WeakLookupTable> mapping <String> names to <MethodCategory> instances.'!
  52275. !MethodCategory class methodsFor!
  52276.  
  52277. addPseud: category
  52278.     "Add the virtual method category, category, to the global list of virtual categories
  52279.     which may be associated with any class. Any samed name standard category
  52280.     is removed from the system."
  52281.  
  52282.     self removeCategory: category.
  52283.     Pseuds add: category.
  52284.     ^Table at: category name put: category.!
  52285.  
  52286. all
  52287.         "Answer the category for all methods."
  52288.     
  52289.         ^AllMethodsCategory current
  52290.     !
  52291.  
  52292. allMethodCategories
  52293.     "Answer the set of all <methodCategory>s current registered in the system."
  52294.  
  52295.     ^Table values!
  52296.  
  52297. deprecatedMethods
  52298.     "Answer the category for deprecated methods. Note we choose not to use #deprecated as the selector
  52299.     for this method, as otherwise it too would appear in the deprecated category."
  52300.  
  52301.     ^self name: '*-deprecated'!
  52302.  
  52303. initialize
  52304.     "Private - Initialize the receiver's class variables.
  52305.         MethodCategory initialize
  52306.     "
  52307.  
  52308.     self initializeTable!
  52309.  
  52310. initializeTable
  52311.     "Private - Initialize the receiver's dictionary of instances.
  52312.  
  52313.     This is a No-Op because we have to create the table
  52314.     during the booting process of Dolphin so all the methods
  52315.     categories can be set as they are loaded. Support for the booting
  52316.     of the system is unnecessary in the release version of Dolphin but
  52317.     it resolves the conundrom of creating the Smalltalk system, which
  52318.     relies on itself to work, from nothing using smalltalk. 
  52319.  
  52320.     It is unwise to clear down this table, as the development system
  52321.     expects methods and classes to be correctly categorized."
  52322. "    | newTable |
  52323.  
  52324.     newTable := WeakLookupTable new.
  52325.     newTable addAll: Table associations.
  52326.     Table := newTable"
  52327.  
  52328.     "Repair table as weakness not operative during boot process"
  52329.     Table removeAllKeys: (Table keys select: [:k | k isKindOf: DeadObject])!
  52330.  
  52331. name: categoryName
  52332.     "Answer the subinstance of the receiver with the <readableString> name, categoryName."
  52333.  
  52334.     | nameString |
  52335.     nameString := categoryName asString.
  52336.     self assert: [nameString isKindOf: String].
  52337.     ^Table at: nameString ifAbsentPut: [self newNamed: nameString]!
  52338.  
  52339. primitives
  52340.     "Answer the category for primitive methods."
  52341.  
  52342.     ^self name: '*-primitives'!
  52343.  
  52344. private
  52345.     "Answer the category for private methods."
  52346.  
  52347.     Private isNil ifTrue: [Private := self name: 'private'].
  52348.     ^Private!
  52349.  
  52350. pseudoCategories
  52351.     "Answer the <collection> of standard pseudo categories, the contents of which 
  52352.     are calculated, and which might therefore be associated with any class in the system."
  52353.  
  52354.     ^Pseuds!
  52355.  
  52356. pseudPrefix
  52357.     "Private - Answer the <readableString> prefix to be prepended to the names of the
  52358.     standard pseudo categories. N.B. The prefix should be short."
  52359.  
  52360.     ^'*-'!
  52361.  
  52362. public
  52363.     "Answer the category for public methods."
  52364.  
  52365.     Public isNil ifTrue: [Public := self name: 'public'].
  52366.     ^Public!
  52367.  
  52368. removeCategory: category
  52369.     "Remove the specified category from all classes with which it is associated,
  52370.     and also from the table of categories."
  52371.  
  52372.     | catName |
  52373.     catName := category asString.
  52374.     "Make absolutely sure any standard category of the same name has been removed"
  52375.     self environment allBehaviorsDo: [:c | | catalogue |
  52376.         catalogue := c methodsCatalogue.
  52377.         (catalogue keys select: [:e | e name = catName]) 
  52378.             do: [:k | catalogue removeKey: k]].
  52379.     Pseuds remove: (Table removeKey: catName ifAbsent: []) ifAbsent: []!
  52380.  
  52381. removePseud: pseud
  52382.     "Remove the virtual method category, pseud, from the global list of virtual 
  52383.     categories which may be associated with any class."
  52384.  
  52385.     ^Pseuds notNil ifTrue: [Pseuds remove: (Table removeKey: pseud asString ifAbsent: []) ifAbsent: []]!
  52386.  
  52387. setMethod: method categories: categories
  52388.     "Private - Set the categories of the <CompiledMethod>, method, to be the <Collection> of
  52389.     <methodCategory>s, categories, only (i.e. any existing non-pseudo classifications
  52390.     not in 'categories' are removed)."
  52391.  
  52392.     | newCategories original unwanted |
  52393.     original := method categories reject: [:each | each isPseud].
  52394.     newCategories := categories reject: [:each | each isPseud].
  52395.     unwanted := original difference: newCategories.
  52396.     newCategories := newCategories difference: original.
  52397.     unwanted do: [:c | c removeMethodSilently: method].
  52398.     newCategories do: [:each | each addMethodSilently: method].
  52399.     ^unwanted notEmpty or: [newCategories notEmpty]!
  52400.  
  52401. unclassifiedName
  52402.     "Private - Answer the <readableString> name for the unclassified category."
  52403.  
  52404.     ^ '*-unclassified'!
  52405.  
  52406. uninitialize
  52407.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  52408.  
  52409.     Pseuds := Table := nil! !
  52410.  
  52411. !MethodCategory methodsFor!
  52412.  
  52413. addClass: class
  52414.     "Add the <Class>, class, to the collection of classes associated with the receiver.
  52415.     There is nothing we can do for method categories as we don't have the notion of
  52416.     a set of selectors which constitutes the category, and therefore we can't update
  52417.     the class in any useful manner (however see MethodProtocol)."!
  52418.  
  52419. addMethod: method
  52420.     "Add the <CompiledMethod>, method, to the collection of methods within the receiver."
  52421.  
  52422.     (self includesMethod: method) ifFalse: [
  52423.         self addMethodSilently: method.
  52424.         method methodClass environment trigger: #methodCategorized: with: method]
  52425. !
  52426.  
  52427. addMethodSilently: method
  52428.     "Private -  Add the <CompiledMethod>, method, to the collection of methods 
  52429.     classified under receiver, without triggering a recategorization event."
  52430.  
  52431.     method methodClass includeSelector: method selector inCategory: self!
  52432.  
  52433. behaviors
  52434.     "Answer a <sequencedReadableCollection> of all the <ClassDescription> objects which conform
  52435.     to the receiver in class hierarchy order (i.e. superclasses first)."
  52436.  
  52437.     | answer |
  52438.     answer := OrderedCollection new: 10.
  52439.     self class environment allBehaviorsDo: [:aBehavior | 
  52440.         (aBehavior includesCategory: self) ifTrue: [answer addLast: aBehavior]].
  52441.     ^answer!
  52442.  
  52443. contents
  52444.     "Answer a <collection> of all methods classified under the receiver."
  52445.  
  52446.     | foundMethods |
  52447.     foundMethods := Set new.
  52448.     self behaviors do: [:aBehavior |
  52449.         foundMethods addAll: (self methodsInBehavior: aBehavior)].
  52450.     ^foundMethods!
  52451.  
  52452. includesMethod: method
  52453.     "Answer whether the receiver includes the <CompiledMethod>, method."
  52454.  
  52455.     ^(method methodClass selectorsInCategory: self) identityIncludes: method selector!
  52456.  
  52457. isPrivacy
  52458.     "Private - Answer whether the receiver is a method privacy category."
  52459.  
  52460.     ^false!
  52461.  
  52462. methodsInBehavior: class
  52463.     "Answer all the methods in the <Behavior>, class, which are members of the receiver."
  52464.  
  52465.     ^(class selectorsInCategory: self) collect: [:selector |
  52466.         class compiledMethodAt: selector]
  52467. !
  52468.  
  52469. removeClass: class
  52470.     "Remove the <ClassDescription>, class, from the classes 'held' by the receiver.
  52471.     In this case we just remove all references to this category from the class."
  52472.  
  52473.     (self methodsInBehavior: class) do: [:m | self removeMethodSilently: m]!
  52474.  
  52475. removeMethod: method
  52476.     "Remove the <CompiledMethod>, method, from the methods held 
  52477.     by the receiver, triggering a method categorization event to inform
  52478.     observers."
  52479.  
  52480.     self removeMethodSilently: method.
  52481.     method methodClass environment trigger: #methodCategorized: with: method!
  52482.  
  52483. removeMethodSilently: method
  52484.     "Private - Remove the <CompiledMethod>, method, from the set of 
  52485.     methods that are members of the receiver, and make no fuss about it." 
  52486.  
  52487.     method methodClass removeSelector: method selector fromCategory: self! !
  52488.  
  52489. VirtualMethodCategory comment:
  52490. 'VirtualMethodCategory is the class of method categories whose membership is calculated on demand rather than looked up in the method catalogue of the method''s class. As virtual categories usually have no static record in the image, they typically carry no space overhead. This is a significant benefit for the privacy categories ''private'' and ''public'' (membership of which is determined by a bit flag in the method header), as every method in the system is in one or the other. The downside is that querying the membership of the category takes more time, although this is not likely to be noticeable in normal operation.
  52491.  
  52492. VirtualMethodCategory itself is abstract, but provides much of the implementation for simple virtual categories, which typically need implement only #includesMethod:
  52493.  
  52494. Virtual method categories are sometimes referred to as pseudo-categories.
  52495.  
  52496. Instance Variables:
  52497.     None
  52498.  
  52499. Class Variables:
  52500.     None'!
  52501. !VirtualMethodCategory methodsFor!
  52502.  
  52503. addMethodSilently: method
  52504.     "Private - Add the <CompiledMethod>, method, to the set of methods that are members
  52505.     of the receiver. Pseudo-categories have a calculated membership and typically can't be
  52506.     added to in this manner."
  52507. !
  52508.  
  52509. behaviors
  52510.     "Private - Answer a collection of <Behavior>s which have the receiver as one of its
  52511.     method categories. As this is a pseudo category, we claim the allegiance of all
  52512.     Behaviors in the system."
  52513.  
  52514.     ^self class environment allBehaviors!
  52515.  
  52516. includesMethod: method
  52517.     "Answer whether the receiver includes the <CompiledMethod>, method."
  52518.  
  52519.     ^self subclassResponsibility!
  52520.  
  52521. isVirtual
  52522.     "Answer whether the receiver is a virtual category, i.e. one that
  52523.     has calculated contents. All pseudo-categories are virtual, but not vice versa."
  52524.  
  52525.     ^true!
  52526.  
  52527. methodsInBehavior: class
  52528.     "Answer all the methods in the <Behavior>, class, which are members of the receiver,
  52529.     determined by examining each methods header flags."
  52530.  
  52531.     ^class methodDictionary select: [:m | self includesMethod: m]!
  52532.  
  52533. removeMethodSilently: method
  52534.     "Private - Remove the <CompiledMethod>, method, from the set of 
  52535.     methods that are members of the receiver, and make no fuss about it.
  52536.     In general the membership of pseudo-categories is generated and in 
  52537.     order to remove a method it is necessary to modify it so that it no longer
  52538.     fits the membership criteria of the category."! !
  52539.  
  52540. AllMethodsCategory comment:
  52541. 'AllMethodsCategory is a virtual method category class the dynamically generated membership of which includes all methods.
  52542.  
  52543. Instance Variables:
  52544.     None
  52545.  
  52546. Class Variables:
  52547.     None'!
  52548. !AllMethodsCategory class methodsFor!
  52549.  
  52550. current
  52551.     "Answer the singleton instance of the receiver."
  52552.  
  52553.     ^Current!
  52554.  
  52555. initialize
  52556.     "Private - Initialize the receiver.
  52557.         self initialize.
  52558.     "
  52559.  
  52560.     Current := super newNamed: 'All'!
  52561.  
  52562. newNamed: categoryName
  52563.     "Private - Answer a new subinstance of the receiver with the 
  52564.     <readableString> name, categoryName."
  52565.  
  52566.     ^self shouldNotImplement!
  52567.  
  52568. uninitialize
  52569.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  52570.  
  52571.     Current := nil! !
  52572.  
  52573. !AllMethodsCategory methodsFor!
  52574.  
  52575. includesMethod: method
  52576.     "Answer whether the receiver includes the <CompiledMethod>, method.
  52577.     The 'All' methods category includes all methods!!"
  52578.  
  52579.     ^true! !
  52580.  
  52581. FailedCompilationsCategory comment:
  52582. 'FailedCompilationsCategory is a virtual method category class the dynamically generated membership of which includes all methods which failed to compile during a file-in or class recompilation (e.g. after deleting or renaming an instance variable).
  52583.  
  52584. Instance Variables:
  52585.     None
  52586.  
  52587. Class Variables:
  52588.     None'!
  52589. !FailedCompilationsCategory class methodsFor!
  52590.  
  52591. initialize
  52592.     "Private - Initialize the receiver.
  52593.         FailedCompilationsCategory initialize.
  52594.     "
  52595.  
  52596.     self addPseud: (self newNamed: self pseudPrefix, 'compilation failures')!
  52597.  
  52598. uninitialize
  52599.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  52600.  
  52601.     self removePseud: self pseudPrefix, 'compilation failures'! !
  52602.  
  52603. !FailedCompilationsCategory methodsFor!
  52604.  
  52605. includesMethod: method
  52606.     "Answer whether the receiver includes the <CompiledMethod>, method."
  52607.  
  52608.     ^method isCompilationFailure! !
  52609.  
  52610. MethodPrivacyCategory comment:
  52611. 'MethodPrivacyCategory is a virtual method category class used to dynamically group private/public methods.
  52612.  
  52613. This class has two instances representing the ''private'' and ''public'' categories.
  52614.  
  52615. The "privacy" of a method is recorded in the method header flags, and it is those flags which instantiations of this class test against to identify methods with the corresponding privacy level. Every method in the system will be in one or other MethodPrivacyCategory.
  52616.  
  52617. Instance Variables:
  52618.     privacy    <Integer> bit mask used to compare against the bits of the method headers.
  52619.  
  52620. Class Variables:
  52621.     None'!
  52622. !MethodPrivacyCategory class methodsFor!
  52623.  
  52624. initialize
  52625.     "Private - Initialize the receiver's class variables, etc.
  52626.     N.B. This is present to support the Dolphin boot process, it is
  52627.     not intended to be re-run subsequently."
  52628.  
  52629.     | hermits cave |
  52630.     cave := self private.
  52631.     hermits := cave contents.
  52632.     self removeCategory: 'private'; removeCategory: 'public'.
  52633.     Private:= (self newNamed: 'private') privacy: true; yourself.
  52634.     Public := (self newNamed: 'public') privacy: false; yourself.
  52635.     Table at: Public name put: Public; at: Private name put: Private.
  52636.     "N.B. private category now changed"
  52637.     cave := self private.
  52638.     hermits do: [:hermit | cave addMethodSilently: hermit]!
  52639.  
  52640. uninitialize
  52641.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  52642.  
  52643.     Public := Private := nil! !
  52644.  
  52645. !MethodPrivacyCategory methodsFor!
  52646.  
  52647. acceptsAdditions
  52648.     "Answer whether methods can be added to the receiver.
  52649.     Although this is a pseudo category, it can accept additions."
  52650.  
  52651.     ^true!
  52652.  
  52653. addMethodSilently: method
  52654.     "Private - Add the <CompiledMethod>, method, to the set of methods that are members
  52655.     of the receiver. As this is a pseudo category, we just set/reset the private flag 
  52656.     on the method"
  52657.  
  52658.     method isPrivate: privacy!
  52659.  
  52660. includesMethod: method
  52661.     "Answer whether the receiver includes the <CompiledMethod>, method."
  52662.  
  52663.     ^method isPrivate == privacy!
  52664.  
  52665. isPrivacy
  52666.     "Private - Answer whether the receiver is a method privacy category."
  52667.  
  52668.     ^true!
  52669.  
  52670. isPseud
  52671.     "Answer whether the receiver is a pseudo category (it isn't even though it is virtual)"
  52672.  
  52673.     ^false!
  52674.  
  52675. privacy: flags
  52676.     "Private - Set the privacy level represented by the receiver."
  52677.  
  52678.     privacy := flags!
  52679.  
  52680. removeMethodSilently: method
  52681.     "Private - Remove the <CompiledMethod>, method, from the set of 
  52682.     methods that are members of the receiver, and make no fuss about it." 
  52683.  
  52684.     method isPrivate: privacy not! !
  52685.  
  52686. PrimitiveMethodsCategory comment:
  52687. 'PrimitiveMethodsCategory is a virtual method category class used to dynamically group methods which have primitive implementations.'!
  52688. !PrimitiveMethodsCategory class methodsFor!
  52689.  
  52690. initialize
  52691.     "Private - Initialize the receiver.
  52692.         PrimitiveMethodsCategory initialize.
  52693.     "
  52694.  
  52695.     self addPseud: (self newNamed: self pseudPrefix, 'primitives')!
  52696.  
  52697. uninitialize
  52698.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  52699.  
  52700.     self removePseud: self pseudPrefix, 'primitives'! !
  52701.  
  52702. !PrimitiveMethodsCategory methodsFor!
  52703.  
  52704. includesMethod: method
  52705.     "Answer whether the receiver includes the <CompiledMethod>, method."
  52706.  
  52707.     ^method isExternalCall not and: [method isPrimitive]! !
  52708.  
  52709. ReferencesCategory comment:
  52710. 'ReferencesCategory is the class of virtual method categories which dynamically determines their membership to include only those methods which reference a particular object from their literal frame.
  52711.  
  52712. ReferencesCategory has instances such as the ''*-subclass responsibility'' category, but you can create your own references categories by following the examples in the class #initialize method.
  52713.  
  52714. Instance Variables:
  52715.     object    <Object> to which a reference confers category membership.
  52716.  
  52717. Class Variables:
  52718.     None'!
  52719. !ReferencesCategory class methodsFor!
  52720.  
  52721. initialize
  52722.     "Private - Initialize the receiver.
  52723.         ReferencesCategory initialize.
  52724.     You can add your own reference categories for the selectors you are interested in.
  52725.     Unless you want this method to appear in the category too, you should use #asSymbol to
  52726.     construct the referenced symbol dynamically.
  52727.     "
  52728.     
  52729.     | deprecated |
  52730.     deprecated := (self newNamed: self pseudPrefix, 'deprecated') literal: 'deprecated' asSymbol; yourself.
  52731.     self 
  52732.         addPseud: deprecated;
  52733.         removeCategory: 'deprecated'.
  52734.     "Legacy class files may refer to ordinary categories previously used for this purpose"
  52735.     Table
  52736.         at: 'deprecated' put: deprecated.!
  52737.  
  52738. uninitialize
  52739.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  52740.  
  52741.     self removePseud: self pseudPrefix, 'deprecated'! !
  52742.  
  52743. !ReferencesCategory methodsFor!
  52744.  
  52745. includesMethod: method
  52746.     "Answer whether the receiver includes the <CompiledMethod>, method.
  52747.     A method is considered to be in a ReferencesCategory if it references
  52748.     the object which that category is interested in."
  52749.  
  52750.     ^method refersToLiteral: literal!
  52751.  
  52752. literal: anObject
  52753.     "Set the value of the receiver's 'literal' instance variable to the argument, anObject."
  52754.  
  52755.     literal := anObject! !
  52756.  
  52757. UnclassifiedMethodsCategory comment:
  52758. 'ReferencesCategory is a virtual method categories class which dynamically determines its membership to be those methods which are categorized only in other virtual categories, i.e. those methods which have not been specifically allocated a category.
  52759.  
  52760. Instance Variables:
  52761.     None
  52762.  
  52763. Class Variables:
  52764.     None'!
  52765. !UnclassifiedMethodsCategory class methodsFor!
  52766.  
  52767. initialize
  52768.     "Private - Initialize the receiver.
  52769.         UnclassifiedMethodsCategory initialize.
  52770.     "
  52771.  
  52772.     | unclassified names |
  52773.     names := #('unclassified' 'no category' 'as yet unclassified').
  52774.     names do: [:each | self removeCategory: each].
  52775.     self addPseud: (self newNamed: self unclassifiedName).
  52776.     unclassified := self unclassified.
  52777.     names do: [:each | Table at: each put: unclassified]!
  52778.  
  52779. uninitialize
  52780.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  52781.  
  52782.     self removePseud: self unclassifiedName! !
  52783.  
  52784. !UnclassifiedMethodsCategory methodsFor!
  52785.  
  52786. acceptsAdditions
  52787.     "Answer whether methods can be added to the receiver.
  52788.     Although this is a pseudo category, it can accept additions."
  52789.  
  52790.     ^true!
  52791.  
  52792. addMethodSilently: method
  52793.     "Private - Add the <CompiledMethod>, method, to the set of methods that are members
  52794.     of the receiver. As this is a pseudo category which a method can only exist in if in no
  52795.     real categories, we must remove the method from any real categories."
  52796.  
  52797.     method categories do: [:c | c isPseud ifFalse: [c removeMethodSilently: method]]!
  52798.  
  52799. includesMethod: method
  52800.     "Answer whether the receiver includes the <CompiledMethod>, method.
  52801.     Implementation Note: Unfortunately we must use private knowledge of the implementation
  52802.     of the methods catalogue/protocols to avoid creating an infinite loop here (if we asked the method
  52803.     for its categories that would be the result)."
  52804.  
  52805.     | selector |
  52806.     selector := method selector.
  52807.     ^method methodClass methodsCatalogue allSatisfy: [:e | (e includes: selector) not]!
  52808.  
  52809. methodsInBehavior: class
  52810.     "Answer a <collection> of all the methods in the <Behavior>, class, which are 
  52811.     currently unclassified.
  52812.     Implementation Note: The simple implementation using #includesMethod: is too slow
  52813.     since it involves repeatedly searching the same collections. It is several times faster 
  52814.     (depending on the class) to build a set of the classified selectors and compare that 
  52815.     against the set of all selectors."
  52816.  
  52817.     | classified dict |
  52818.     classified := IdentitySet new.
  52819.     class methodsCatalogue do: [:e | classified addAll: e].
  52820.     dict := class methodDictionary.
  52821.     "We know that the classified methods must be a subset of the class' methods"
  52822.     ^dict size = classified size
  52823.         ifTrue: [IdentitySet new]
  52824.         ifFalse: [(dict keys difference: classified) collect: [:s | class compiledMethodAt: s]]! !
  52825.  
  52826. PackedReferencesCategory comment:
  52827. 'PackedReferencesCategory is the class of virtual method categories dynamically determines their membership to include only those methods which have packed byte codes and reference a particular object from their literal frame. In practice this will include only those methods that consist of a send to self of a zero argument selector.
  52828.  
  52829. PackedReferencesCategory has instances such as the ''*-subclass responsibility'' category, but you can create your own references categories by following the examples in the class #initialize method.'!
  52830. !PackedReferencesCategory class methodsFor!
  52831.  
  52832. initialize
  52833.     "Private - Initialize the receiver.
  52834.         PackedReferencesCategory initialize.
  52835.     You can add your own reference categories for the selectors you are interested in.
  52836.     Unless you want this method to appear in the category too, you should use #asSymbol to
  52837.     construct the referenced symbol dynamically.
  52838.     "
  52839.     
  52840.     | subresps todo sni |
  52841.     subresps := (self newNamed: self pseudPrefix, 'subclass responsibility') literal: #subclassResponsibility; yourself.
  52842.     todo := (self newNamed: self pseudPrefix, 'not yet implemented') literal: #notYetImplemented; yourself.
  52843.     sni := (self newNamed: self pseudPrefix, 'should not implement') literal: #shouldNotImplement; yourself.
  52844.     self 
  52845.         addPseud: subresps;
  52846.         addPseud: todo;
  52847.         addPseud: sni;
  52848.         removeCategory: 'subclass responsibility';
  52849.         removeCategory: 'not yet implemented';
  52850.         removeCategory: 'should not implement'.
  52851.  
  52852.     "Legacy class files may refer to ordinary categories previously used for this purpose"
  52853.     Table
  52854.         at: 'subclass responsibility' put: subresps;
  52855.         at: 'not yet implemented' put: todo;
  52856.         at: 'should not implement' put: sni.!
  52857.  
  52858. uninitialize
  52859.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  52860.  
  52861.     self removePseud: self pseudPrefix, 'subclass responsibility'.
  52862.     self removePseud: self pseudPrefix, 'not yet implemented'.
  52863.     self removePseud: self pseudPrefix, 'should not implement'! !
  52864.  
  52865. !PackedReferencesCategory methodsFor!
  52866.  
  52867. includesMethod: method
  52868.     "Answer whether the receiver includes the <CompiledMethod>, method.
  52869.     A method is considered to be in a PackedReferencesCategory if it references
  52870.     the object which that category is interested in, and is a packed method."
  52871.  
  52872.     ^(super includesMethod: method) and: [method isPacked]! !
  52873.  
  52874. SingleChunkReader comment:
  52875. ''!
  52876. !SingleChunkReader methodsFor!
  52877.  
  52878. fileInFrom: aSourceFiler
  52879.     "Private - File in the next chunk (if any) from the <ChunkSourceFiler> argument, 
  52880.     aChunkSourceFiler, then evaluate the final action and answer its result."
  52881.  
  52882.     | chunk |
  52883.     (aSourceFiler atEnd or: [(chunk := aSourceFiler nextChunk) isEmpty]) 
  52884.         ifFalse: [self chunk: chunk].
  52885.     ^endAction value! !
  52886.  
  52887. Bag comment:
  52888. 'A Bag is a variable sized, unordered, collection which is extensible and contractible, but not accesssible using external keys. Bag is similar to Set, but can contain duplicate elements (which it counts). Elements are considered to  be duplicates if they compare as equal using #=.
  52889.  
  52890. Bag conforms to the ANSI protocols:
  52891.     Object
  52892.     collection
  52893.     extensibleCollection
  52894.     Bag'!
  52895. !Bag class methodsFor!
  52896.  
  52897. identityNew
  52898.     "Answer a new instance of the receiver with default initial capacity, which uses identity 
  52899.     as the comparison for identifying duplicate elements."
  52900.  
  52901.     ^self identityNew: 3
  52902. !
  52903.  
  52904. identityNew: anInteger
  52905.     "Answer a new instance of the receiver with sufficient initial capacity for anInteger unique
  52906.     elements, which uses identity as the comparison for identifying duplicate elements."
  52907.  
  52908.     ^super new contents: (IdentityDictionary new: anInteger)
  52909. !
  52910.  
  52911. new
  52912.     "Answer a new instance of the receiver with default initial capacity, 
  52913.     which uses equality as the comparison for identifying duplicate elements."
  52914.  
  52915.     ^self new: 3!
  52916.  
  52917. new: count
  52918.     "Answer a new instance of the receiver with sufficient initial capacity for 
  52919.     the number of elements specified by the <integer> argument, count,
  52920.     which uses equality as the comparison for identifying duplicate elements."
  52921.  
  52922.     ^super new 
  52923.         contents: (LookupTable new: count)!
  52924.  
  52925. publishedAspectsOfInstances
  52926.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  52927.     
  52928.         ^(super publishedAspectsOfInstances)
  52929.             add: (Aspect collection: #elements);
  52930.             yourself! !
  52931.  
  52932. !Bag methodsFor!
  52933.  
  52934. add: newElement
  52935.     "Include the <Object> argument, newElement, as an element of the receiver, once.
  52936.     newElement must not be nil. Answer newElement."
  52937.  
  52938.     ^self add: newElement withOccurrences: 1.!
  52939.  
  52940. add: newElement withOccurrences: count
  52941.     "Include the <Object> argument, newObject, as an element of the receiver,
  52942.     anInteger number of times. newElement must not be nil.
  52943.     Answer newObject.
  52944.     Note that nil is not a valid value for newElement, but the ANSI standard
  52945.     specifies that the result is undefined if nil is added, so we do not explicitly
  52946.     test for it here."
  52947.  
  52948.     contents at: newElement put: count + (self occurrencesOf: newElement).
  52949.     ^newElement!
  52950.  
  52951. asBag
  52952.     "Answer a <Bag> containing the same elements as the receiver."
  52953.  
  52954.     ^self!
  52955.  
  52956. asSet
  52957.     "Answer a <Set> containing each of the unique elements of the receiver.
  52958.     Implementation Note: Reimplement for efficiency only."
  52959.  
  52960.     ^contents keys asSet!
  52961.  
  52962. at: index
  52963.     "Generate an error to the effect that Bag's are not keyed 
  52964.     (they're like Sets with duplicates)."
  52965.  
  52966.     ^self errorNotKeyed!
  52967.  
  52968. at: index put: value
  52969.     "Generate an error to the effect that Bag's are not keyed 
  52970.     (they're like Sets with duplicates)"
  52971.  
  52972.     ^self errorNotKeyed!
  52973.  
  52974. contents: initialContents
  52975.     "Private - Set the receiver's contents to be the
  52976.     <abstractDictionary>, initialContents."
  52977.  
  52978.     contents := initialContents!
  52979.  
  52980. do: operation
  52981.     "Evaluate <monadicValuable> argument, operation, for each of the element of the 
  52982.     receiver. Answers the receiver.
  52983.     Implementation Note: Bags need to perform the operation repeatedly for each element, 
  52984.     depending on the number of occurrences."
  52985.  
  52986.     contents keysAndValuesDo: [:elem :count |
  52987.         count timesRepeat: [operation value: elem]]!
  52988.  
  52989. elements
  52990.     "Private - Answers the contents of the receiver as an OrderedCollection"
  52991.  
  52992.     ^self asOrderedCollection!
  52993.  
  52994. elements: anOrderedCollection
  52995.     "Private - Sets the contents of the receiver from anOrderedCollection"
  52996.  
  52997.     contents := contents class new: anOrderedCollection size.
  52998.     self addAll: anOrderedCollection!
  52999.  
  53000. includes: target
  53001.     "Answer whether the <Object> argument, target, 
  53002.     is one of the elements of the receiver."
  53003.  
  53004.     ^contents includesKey: target!
  53005.  
  53006. occurrencesOf: target
  53007.     "Answer the <integer> number of the receiver's elements which are 
  53008.     equal to the <Object> argument, target."
  53009.  
  53010.     ^contents at: target ifAbsent: [0]!
  53011.  
  53012. postCopy
  53013.     "Apply any final flourish to the copy that may be required
  53014.     in order to ensure that the copy does not share any state with
  53015.     the original, apart from the elements. Answer the receiver.
  53016.  
  53017.     In the case of a Bag we need a completely new dictionary because
  53018.     it is part of the implementation of the Bag, rather than a public
  53019.     characteristic of the data structure."
  53020.  
  53021.     | original |
  53022.     super postCopy.
  53023.     original := contents.
  53024.     contents := original copyEmpty.
  53025.     original keysAndValuesDo: [:k :v | contents at: k put: v]!
  53026.  
  53027. remove: oldElement ifAbsent: exceptionHandler
  53028.     "Decrement the number of occurrences of the <Object> argument, 
  53029.     oldObject, in the receiver, and if it reaches zero remove oldElement 
  53030.     completely. If oldElement is not an element of the receiver, answer 
  53031.     the result of evaluating the <niladicValuable>, exceptionHandler, 
  53032.     else answer oldElement."
  53033.  
  53034.     | count |
  53035.     (count := contents at: oldElement ifAbsent: [^exceptionHandler value]) == 1
  53036.         ifTrue:  [contents removeKey: oldElement]
  53037.         ifFalse: [contents at: oldElement put: count - 1].
  53038.     ^oldElement!
  53039.  
  53040. removeAllOccurrencesOf: target ifAbsent: exceptionHandler
  53041.     "Remove all the occurrences of the <Object> target from the receiver. 
  53042.     If target is not an element of the receiver, answer the result of evaluating 
  53043.     the <niladicValuable>, exceptionHandler."
  53044.  
  53045.     ^contents removeKey: target ifAbsent: exceptionHandler!
  53046.  
  53047. size
  53048.     "Answer the <integer> number of elements in the receiver, counting duplicates as the
  53049.     number of times which they occur.
  53050.     Implementation Note: Could implement more elegantly with #inject:into:, but
  53051.     this implementation is faster."
  53052.  
  53053.     | tally |
  53054.     tally := 0.
  53055.     contents do: [:elemCount | tally := tally + elemCount].
  53056.     ^tally!
  53057.  
  53058. valuesAndCountsDo: aBlock 
  53059.     contents keysAndValuesDo: aBlock! !
  53060.  
  53061. SequenceableCollection comment:
  53062. 'SequenceableCollection is the class of Collections whose elements are ordered and which are externally named by integer indices.'!
  53063. !SequenceableCollection class methodsFor!
  53064.  
  53065. newAspect: aspectClass name: aSymbol 
  53066.         "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  53067.         which is appropriate for representing aspects of the receiver's type."
  53068.     
  53069.         ^aspectClass sequenceableCollection: aSymbol!
  53070.  
  53071. ofSize: anInteger
  53072.     "Private - Answer a new instance of the receiver with anInteger nil elements.
  53073.     This method is subtly different from #new: because that, as defined for 
  53074.     SequenceableCollections, answers a Collection with sufficient space for 
  53075.     anInteger elements, but which, in the case of some subclasses, may be considered 
  53076.     empty - i.e. containing no elements. If we attempt to perform a #replaceFrom:to:with:startingAt:
  53077.     on an empty SequenceableCollection, then a bounds error will result. This protocol 
  53078.     enables SequenceableCollection's implementation of copy replacement to work for most 
  53079.     subclasses."
  53080.  
  53081.     ^self new: anInteger!
  53082.  
  53083. writeStream
  53084.     "Answer a WriteStream on the a new empty instance of the receiver."
  53085.  
  53086.     ^self new writeStream!
  53087.  
  53088. writeStream: anInteger
  53089.     "Answer a WriteStream on the a new instance of the receiver with
  53090.     initialize size, anInteger."
  53091.  
  53092.     ^(self new: anInteger) writeStream! !
  53093.  
  53094. !SequenceableCollection methodsFor!
  53095.  
  53096. , aSequencedReadableCollection
  53097.     "Answer a new <sequencedReadableCollection> like the receiver (i.e. of the receiver's
  53098.     species but not necessarily the exact same class) containing the elements    of the receiver 
  53099.     in their original order with those of the <sequencedReadableCollection> argument
  53100.     appended in their original order.
  53101.     Note: This is the concatenation operation, and is a simplified form of 
  53102.     #copyReplaceFrom:to:with:."
  53103.  
  53104.     | size newSize |
  53105.     size := self size.
  53106.     newSize := size + aSequencedReadableCollection size.
  53107.     ^(self copyLikeOfSize: newSize)
  53108.         replaceFrom: 1
  53109.             to: size
  53110.             with: self
  53111.             startingAt: 1;
  53112.         replaceFrom: size + 1
  53113.             to: newSize
  53114.             with: aSequencedReadableCollection
  53115.             startingAt: 1;
  53116.         yourself!
  53117.  
  53118. _sameAsString: comparand
  53119.     "Private - Answer whether the receiver collates the same as <readableString>
  53120.     argument, comparand.
  53121.     This will only work if the receiver contains integers in the range of character
  53122.     values, if not an exception will be raised.
  53123.     Implementation Note: Double dispatched from String>>sameAs:."
  53124.  
  53125.     | string2 size |
  53126.     size := self size.
  53127.     string2 := String new: size.
  53128.     1 to: size do: [:i | string2 basicAt: i put: (self at: i)].
  53129.     ^(comparand _collate: string2) == 0!
  53130.  
  53131. = comparand
  53132.     "Answer whether the receiver and the <Object> argument, comparand,
  53133.     are considered equivalent - that is they are of the same class and size, and
  53134.     contain eqivalent elements that are in the same sequence.
  53135.     Implementation Note: We perform a series of tests of increasing slowness, culminating
  53136.     in an element-by-element equality test."
  53137.  
  53138.     | size |
  53139.     self == comparand ifTrue: [^true].
  53140.     #todo "ANSI draft says must be same class, not just same species".
  53141.     (self species == comparand species) ifFalse: [^false].
  53142.     size := self size.
  53143.     size = comparand size ifFalse: [^false].
  53144.     1 to: size do: [ :i |
  53145.         (self at: i) = (comparand at: i)
  53146.             ifFalse: [^false]].
  53147.     ^true!
  53148.  
  53149. after: target
  53150.     "Answer the element after the <Object> argument, target.  
  53151.     Report an error if target is not in the receiver, or if there 
  53152.     are no elements after it."
  53153.  
  53154.     ^self after: target ifAbsent: [self errorNotFound: target]!
  53155.  
  53156. after: target ifAbsent: exceptionHandler
  53157.     "Answer the element after target, or if not present the result of evaluating the
  53158.     niladic valuable, exceptionHandler."
  53159.  
  53160.     | index |
  53161.     index := self indexOf: target.
  53162.     ^index == 0
  53163.         ifTrue: [exceptionHandler value]
  53164.         ifFalse: [
  53165.             index = self size 
  53166.                 ifTrue: [self errorLastObject: target]
  53167.                 ifFalse: [self at: index + 1]]!
  53168.  
  53169. allButFirst
  53170.     "Answer a copy of the receiver containing all but the first
  53171.     element. Raise an error if there are not enough elements."
  53172.  
  53173.     ^self allButFirst: 1!
  53174.  
  53175. allButFirst: n
  53176.     "Answer a copy of the receiver containing all but the first n
  53177.     elements. Raise an error if there are not enough elements."
  53178.  
  53179.     ^ self copyFrom: n + 1 to: self size!
  53180.  
  53181. allButLast
  53182.     "Answer a copy of the receiver containing all but the last
  53183.     element. Raise an error if there are not enough elements."
  53184.  
  53185.     ^ self allButLast: 1!
  53186.  
  53187. allButLast: anInteger
  53188.     "Answer a copy of the receiver containing all but the last anInteger
  53189.     elements. Raise an error if there are not enough elements."
  53190.  
  53191.     ^self first: self size - anInteger!
  53192.  
  53193. alternateInspectorClass
  53194.     "Answer the class of inspector to be used when the user requests to inspect
  53195.         the receiver with the Shift key held down."
  53196.  
  53197.     ^SequenceableCollectionInspector!
  53198.  
  53199. appendToStream: puttableStream
  53200.     "Private - Append the receiver's elements to the argument, puttableStream.
  53201.     We can be able to do a fast block copy. Answer the receiver.
  53202.     Implementation note: Double dispatched from puttableStream>>nextPutAll:."
  53203.  
  53204.     puttableStream next: self size putAll: self startingAt: 1!
  53205.  
  53206. approxSize
  53207.     "Private - Answer the approximate size of the receiver.
  53208.     Implementation Note: In general sequenceable collections keep a
  53209.     tally, so we can use the actual size."
  53210.  
  53211.     ^self size!
  53212.  
  53213. at: index
  53214.     "Answer an <Object> which is the element of the receiver 
  53215.     at the specified index. If the index is out of bounds, raise an exception."
  53216.  
  53217.     ^self subclassResponsibility!
  53218.  
  53219. at: index ifAbsent: exceptionBlock
  53220.     "Answer an <Object> which is the element of the receiver 
  53221.     at the specified index. If the index is out of bounds answer
  53222.     the result of evaluating the <niladicValuable> exceptionBlock."
  53223.  
  53224.     ^(index > 0 and: [index <= self size])
  53225.         ifTrue: [self at: index]
  53226.         ifFalse: [exceptionBlock value]!
  53227.  
  53228. at: key ifPresent: operation
  53229.     "Answer the result of evaluating the monadic valuable, operation, if
  53230.     the argument, key, is the key of an element in the receiver, with that
  53231.     element as its argument. If the key is not present, then answer nil."
  53232.  
  53233.     ^operation value: (self at: key ifAbsent: [^nil])!
  53234.  
  53235. at: index put: newElement
  53236.     "Replace the element of the receiver at the specified <integer> index with 
  53237.     the <Object> argument, newElement. If the index is out of bounds, raise 
  53238.     a BoundsError."
  53239.  
  53240.     ^self subclassResponsibility!
  53241.  
  53242. atAll: indices put: newElement
  53243.     "Replace the elements of the receiver at each <integer> element of the <collection> 
  53244.     argument, indices, with the <Object> argument, newElement."
  53245.  
  53246.     indices do: [:index | self at: index put: newElement]!
  53247.  
  53248. atAllPut: newElement
  53249.     "Replace all the elements of the receiver with the <Object> argument,
  53250.     newElement."
  53251.  
  53252.     1 to: self size do: [:index | self at: index put: newElement]!
  53253.  
  53254. basicBeginsWith: aCollection
  53255.     "Answer whether the receiver begins with the sequence
  53256.     of objects in the <Collection> argument.
  53257.     Should not be overridden (but see #beginsWith:)"
  53258.  
  53259.     | i |
  53260.     self size < aCollection size ifTrue: [^false].
  53261.     i := 1.
  53262.     aCollection do: 
  53263.             [:each | 
  53264.             (self at: i) = each ifFalse: [^false].
  53265.             i := i + 1].
  53266.     ^true!
  53267.  
  53268. before: target
  53269.     "Answer the receiver's element immediately before the argument, target. 
  53270.     Raise an exception if target is not an element of the receiver, or if 
  53271.     there are no elements before it (i.e. it is the first element)."
  53272.  
  53273.     ^self before: target ifAbsent: [self errorNotFound: target]!
  53274.  
  53275. before: target ifAbsent: exceptionHandler
  53276.     "Answer the element before the argument, target, or if not present the 
  53277.     result of evaluating the niladic valuable, exceptionHandler."
  53278.  
  53279.     | index |
  53280.     index := self indexOf: target.
  53281.     ^index == 0
  53282.         ifTrue: [exceptionHandler value]
  53283.         ifFalse: [
  53284.             index == 1 
  53285.                 ifTrue: [self errorFirstObject: target]
  53286.                 ifFalse: [self at: index - 1]].!
  53287.  
  53288. beginsWith: aCollection
  53289.     "Answer whether the receiver begins with the sequence
  53290.     of objects in the <Collection> argument."
  53291.  
  53292.     ^self basicBeginsWith: aCollection!
  53293.  
  53294. collect: transformer
  53295.     "Evaluate the <monadicValuable> argument, transformer, for each of the 
  53296.     receiver's elements in the order defined by the receiver's implementation of #do:.
  53297.     Answer a new collection like the receiver (i.e. of the same species but not
  53298.     necessarily the exact same class) containing the values returned by transformation
  53299.     block.
  53300.     Implementation Note: By making use of the special instance creation method 
  53301.     #copyLikeOfSize: we can avoid using a WriteStream here."
  53302.  
  53303.     | answer |
  53304.     answer := self copyLikeOfSize: self copySize.
  53305.     self 
  53306.         keysAndValuesDo: [:i :each | answer at: i put: (transformer value: each)].
  53307.     ^answer!
  53308.  
  53309. copyFrom: start
  53310.     "Answer a copy of a subset of the receiver which starts with its element at Integer 
  53311.     index start."
  53312.  
  53313.     ^self copyFrom: start to: self size!
  53314.  
  53315. copyFrom: start to: stop
  53316.     "Answer a new <sequencedReadableCollection> like the receiver
  53317.     containing those elements of the receiver between the <integer> indices start
  53318.     and stop, inclusive, and in the same order."
  53319.  
  53320.     | len |
  53321.     len := stop - start + 1.
  53322.     ^(self copyLikeOfSize: len) 
  53323.         replaceFrom: 1
  53324.         to: len
  53325.         with: self
  53326.         startingAt: start!
  53327.  
  53328. copyLikeOfSize: anInteger
  53329.     "Private - Answer a new collection of the same species as the receiver but with
  53330.     anInteger nil or zero elements. 
  53331.     N.B. Subclasses must override to preserve additional instance variables."
  53332.     
  53333.     "Note: This message differs from #copyEmpty: in two ways:
  53334.     1) an instance of the receivers #species, rather than exact class (although this is usually the same) 
  53335.     is answered; and
  53336.     2) the answer doesn't just have sufficient capacity for anInteger elements, but actually has that 
  53337.     many nil or zero elements."
  53338.  
  53339.     ^self species ofSize: anInteger!
  53340.  
  53341. copyReplaceAll: targetElements with: replacementElements
  53342.     "Answer a new <sequencedReadableCollection> which is a copy of the receiver
  53343.     but in which all occurrences of targetElements have been replaced     by 
  53344.     the elements of the <sequencedReadableCollection> replacementElements."
  53345.  
  53346.     | occurrences resultCollection findSize replaceSize extraSpace index sourceIndex resultIndex selfSize |
  53347.     occurrences := self occurrencesOfSubCollection: targetElements.
  53348.     findSize := targetElements size.
  53349.     replaceSize := replacementElements size.
  53350.     extraSpace := (replaceSize - findSize) * occurrences.
  53351.     selfSize := self size.
  53352.     resultCollection := self copyLikeOfSize: selfSize + extraSpace.
  53353.     sourceIndex := 1.
  53354.     resultIndex := 1.
  53355.     
  53356.     [(index := self indexOfSubCollection: targetElements startingAt: sourceIndex) 
  53357.         > 0] 
  53358.             whileTrue: 
  53359.                 ["We have found a subCollection to replace.
  53360.         Copy the elements before the match."
  53361.  
  53362.                 index > sourceIndex 
  53363.                     ifTrue: 
  53364.                         [resultCollection 
  53365.                             replaceFrom: resultIndex
  53366.                             to: resultIndex + index - sourceIndex - 1
  53367.                             with: (self copyFrom: sourceIndex to: index - 1).
  53368.                         resultIndex := resultIndex + index - sourceIndex.
  53369.                         sourceIndex := index].
  53370.                 "Copy the replacement collection."
  53371.                 resultCollection 
  53372.                     replaceFrom: resultIndex
  53373.                     to: resultIndex + replaceSize - 1
  53374.                     with: replacementElements.
  53375.                 resultIndex := resultIndex + replaceSize.
  53376.                 sourceIndex := sourceIndex + findSize].
  53377.  
  53378.     "Copy the collection following the last replacement (if any)."
  53379.     resultCollection 
  53380.         replaceFrom: resultIndex
  53381.         to: resultCollection size
  53382.         with: (self copyFrom: sourceIndex to: selfSize).
  53383.     ^resultCollection.
  53384.     #todo    "This implementation does not look very efficient. Might be better to use Streams.
  53385.             OR a collection of the positions should be created, and then the construction of the copy
  53386.             could use that."!
  53387.  
  53388. copyReplaceFrom: start to: stop with: replacementElements
  53389.     "Answer a new <sequencedReadableCollection> which is a copy of the receiver
  53390.     but in which all elements of the receiver between the <integer> indices
  53391.     start and stop (inclusive) have been replaced by the elements of the
  53392.     <sequencedReadableCollection> replacementElements. The latter need not 
  53393.     be the same size as the range of elements being replaced.
  53394.  
  53395.     This message can be used to insert, append, or replace, so the rules are quite complicated!!
  53396.         If stop is less than start, then replacementElements is inserted in the receiver:
  53397.         If start = 1, then prepend
  53398.         If start = size+1 then append
  53399.         stop must = start-1
  53400.         Else treat as replacement"
  53401.  
  53402.     | newSize repSize |
  53403.     repSize := replacementElements size.
  53404.     newSize := self size + repSize - (stop - start + 1).
  53405.     ^(self copyLikeOfSize: newSize)
  53406.         replaceFrom: 1
  53407.             to: start - 1
  53408.             with: self
  53409.             startingAt: 1;
  53410.         replaceFrom: start
  53411.             to: start + repSize - 1
  53412.             with: replacementElements
  53413.             startingAt: 1;
  53414.         replaceFrom: start + repSize
  53415.             to: newSize
  53416.             with: self
  53417.             startingAt: stop + 1!
  53418.  
  53419. copyReplaceFrom: start to: stop withObject: replacementElement
  53420.     "Answer a new <sequencedReadableCollection> which is a copy of 
  53421.     the receiver, but with the elements between the <integer> indices start
  53422.     to stop (inclusive) replaced with the <Object> replacementElement.
  53423.  
  53424.     This message can be used to insert, append, or replace:
  53425.     1) stop = start - 1, and start <= receiver size. This is the insert operation:
  53426.     The Replacement element is inserted between the elements at stop and 
  53427.     start. No elements are actually replaced.
  53428.     2) stop = receiver size, and start = stop + 1. This is the append operation:
  53429.     replacementElement is appended to the new collection.
  53430.     3) Otherwise the operation is a replacement and each of the elements
  53431.     in the specified range is replaced in the copy with replacementElement."
  53432.  
  53433.     | answer size |
  53434.     size := self size.
  53435.     (start < 1 or: [start > (size + 1)]) 
  53436.         ifTrue: [^self errorSubscriptBounds: start].
  53437.     (stop > size or: [stop < (start - 1)]) 
  53438.         ifTrue: [^self errorSubscriptBounds: stop].
  53439.     (stop = (start - 1) and: [start <= size]) 
  53440.         ifTrue: 
  53441.             ["Insert"
  53442.  
  53443.             ^(self copyLikeOfSize: size + 1)
  53444.                 replaceFrom: 1
  53445.                     to: stop
  53446.                     with: self
  53447.                     startingAt: 1;
  53448.                 at: start put: replacementElement;
  53449.                 replaceFrom: start + 1
  53450.                     to: size + 1
  53451.                     with: self
  53452.                     startingAt: start;
  53453.                 yourself].
  53454.     (stop = size and: [start = (stop + 1)]) 
  53455.         ifTrue: 
  53456.             ["Append"
  53457.  
  53458.             ^self copyWith: replacementElement].
  53459.  
  53460.     "Replace"
  53461.     answer := self copyLikeOfSize: size.
  53462.     answer 
  53463.         replaceFrom: 1
  53464.         to: start - 1
  53465.         with: self
  53466.         startingAt: 1.
  53467.     start to: stop do: [:i | answer at: i put: replacementElement].
  53468.     answer 
  53469.         replaceFrom: stop + 1
  53470.         to: size
  53471.         with: self
  53472.         startingAt: stop + 1.
  53473.     ^answer!
  53474.  
  53475. copyReplacing: targetElement withObject: replacementElement
  53476.     "Answer a new <sequencedReadableCollection> which is a copy 
  53477.     of the receiver, but in which any occurrences of the <Object> targetElement
  53478.     are replaced with the <Object> replacementElement."
  53479.  
  53480.     ^self collect: [:each | each = targetElement 
  53481.         ifTrue: [replacementElement] 
  53482.         ifFalse: [each]].!
  53483.  
  53484. copyWith: newElement
  53485.     "Answer a <sequencedReadableCollection> which is a copy of 
  53486.     the receiver that has newElement concatenated to its end."
  53487.  
  53488.     | size |
  53489.     size := self size.
  53490.     ^(self copyLikeOfSize: size + 1)
  53491.         at: size + 1 put: newElement;
  53492.         replaceFrom: 1
  53493.             to: size
  53494.             with: self
  53495.             startingAt: 1!
  53496.  
  53497. copyWithout: oldElement
  53498.     "Answer a <sequencedReadableCollection> which is a copy of the receiver, but in
  53499.     which all occurrences of the <Object> oldElement have been removed."
  53500.  
  53501.     | aStream |
  53502.     aStream := (self copyLikeOfSize: self copySize) writeStream.
  53503.     self 
  53504.         do: [:element | element = oldElement ifFalse: [aStream nextPut: element]].
  53505.     ^aStream contents!
  53506.  
  53507. copyWithoutAll: oldElements
  53508.     "Answer a <sequencedReadableCollection> which is a copy of the receiver, but in
  53509.     which all occurrences of the elements of the <Collection> oldElements have been removed."
  53510.  
  53511.     | aStream |
  53512.     aStream := (self copyLikeOfSize: self copySize) writeStream.
  53513.     self 
  53514.         do: [:element | (oldElements includes: element) ifFalse: [aStream nextPut: element]].
  53515.     ^aStream contents!
  53516.  
  53517. copyWithoutDuplicates
  53518.     "Answers a copy of the receiver that contains no duplicate objects.
  53519.     Uses equality for comparison."
  53520.  
  53521.     | set |
  53522.     set := self asSet.
  53523.     ^self select: [:each | (set includes: each) 
  53524.         ifTrue: [ set remove:each. true ]
  53525.         ifFalse: [ false ]].!
  53526.  
  53527. do: operation
  53528.     "Evaluate the <monadicValuable> argument, operation, for each of the 
  53529.     receiver's elements. Answers the receiver. The elements are evaluated in index order.
  53530.  
  53531.     Implementation Note: Implemented in terms of #keysAndValuesDo: to reduce
  53532.     the burden of subclassing SequenceableCollection. Where performance is an issue
  53533.     subclasses may want to override."
  53534.  
  53535.     self keysAndValuesDo: [:i :elem | operation value: elem]!
  53536.  
  53537. endsWith: aCollection
  53538.     "Answer whether the receiver begins with the sequence
  53539.     of objects in the <Collection> argument"
  53540.  
  53541.     | i |
  53542.     (i := self size - aCollection size + 1) < 1 ifTrue: [^false].
  53543.     aCollection do: 
  53544.             [:each | 
  53545.             (self at: i) = each ifFalse: [^false].
  53546.             i := i + 1].
  53547.     ^true!
  53548.  
  53549. errorFirstObject: target
  53550.     "Private - Report an error to the effect that an attempt was made to access the object
  53551.     before the argument, target, where the latter is the last element of the receiver."
  53552.  
  53553.     ^self error: target printString, ' is my first object'!
  53554.  
  53555. errorLastObject: target
  53556.     "Private - Report an error to the effect that an attempt was made to access the object
  53557.     after the argument, target, where the latter is the last element of the receiver."
  53558.  
  53559.     ^self error: target printString, ' is my last object'!
  53560.  
  53561. findFirst: discriminator
  53562.     "Answer the <integer> index of the first element of the receiver for which the 
  53563.     <monadicValuable> argument, discriminator, evaluates to true. If there are 
  53564.     no such elements, answer 0.
  53565.     Implementation Note: We use #keysAndValuesDo: because subclass' implementations of
  53566.     #at: may be quite slow (e.g. LinkedList)."
  53567.  
  53568.     self keysAndValuesDo: [:i :elem | (discriminator value: elem) ifTrue: [^i]].
  53569.     ^0!
  53570.  
  53571. findLast: discriminator
  53572.     "Answer the <integer> index of the last element of the receiver for which the 
  53573.     <monadicValuable> argument, discriminator, evaluates to true. If there are 
  53574.     If there are no such elements, answer 0."
  53575.  
  53576.     self size to: 1 by: -1 do: [:i | (discriminator value: (self at: i)) ifTrue: [^i]].
  53577.     ^0!
  53578.  
  53579. first
  53580.     "Answer an <Object> which is the first element of the receiver. 
  53581.     Raise an exception if the receiver contains no elements."
  53582.  
  53583.     ^self at: 1!
  53584.  
  53585. first: anInteger
  53586.     "Answer a copy of the receiver comprising the leftmost anInteger elements."
  53587.  
  53588.     ^self copyFrom: 1 to: anInteger!
  53589.  
  53590. fourth
  53591.     "Answer an <Object> which is the fourth element of the receiver. 
  53592.     Raise an exception if the element does not exist."
  53593.  
  53594.     ^self at: 4!
  53595.  
  53596. from: start do: operation
  53597.     "Evaluate the <monadicValuable>, operation, for each element of the receiver
  53598.     from start, inclusive."
  53599.  
  53600.     self 
  53601.         from: start
  53602.         keysAndValuesDo: [:i :each | operation value: each]!
  53603.  
  53604. from: start keysAndValuesDo: operation 
  53605.     "Evaluate the <dyadicValuable>, operation, for each element of the receiver
  53606.     from the element with <integer> index, start, inclusive. A BoundsError will be
  53607.     raised if either start or stop is out of bounds."
  53608.  
  53609.     self 
  53610.         from: start
  53611.         to: self size
  53612.         keysAndValuesDo: operation!
  53613.  
  53614. from: start to: stop do: operation 
  53615.     "Evaluate the <monadicValuable>, operation, for each element of the receiver
  53616.     between start and stop, inclusive.
  53617.     Implementation Note: Implemented in terms of #from:to:keysAndValuesDo: to reduce
  53618.     the burden of subclassing SequenceableCollection."
  53619.  
  53620.     self 
  53621.         from: start
  53622.         to: stop
  53623.         keysAndValuesDo: [:i :each | operation value: each]!
  53624.  
  53625. from: start to: stop keysAndValuesDo: operation
  53626.     "Evaluate the <dyadicValuable>, operation, for each element of the receiver
  53627.     between the <integer> indices, start and stop, inclusive with the element and its
  53628.     index as respectively the second and first arguments. A BoundsError will be
  53629.     raised if either start or stop is out of bounds.
  53630.     Implementation Note: Subclasses should override this method in order to
  53631.     replace all #do: family enumerators (#do:, #keysAndValuesDo:, #from:to:do:, and,
  53632.     of course, #from:to:keysAndValuesDo:). Subclasses may also want to override this
  53633.     if they have a slow implementation of the random accessor method #at:, but can be more 
  53634.     efficiently accessed serially (e.g. a singly Linked List), or if they have
  53635.     to calculate their size using #countElements (which would cause an infinite recursion
  53636.     as it uses #do:, which uses #size, ...)."
  53637.  
  53638.     start to: stop do: [:i | operation value: i value: (self at: i)]!
  53639.  
  53640. grow
  53641.     "Private - Increase the capacity of the receiver. Answer the receiver."
  53642.  
  53643.     self resize: self size + self growSize!
  53644.  
  53645. hash
  53646.     "Answer the <integer> hash value for the receiver.
  53647.     Implementation Note: This is not a terribly good hash function (in particular it
  53648.     exhibits very poor temporal stability), but it is quick, and alternatives involve expensive 
  53649.     iteration through the receiver's elements."
  53650.  
  53651.     | size |
  53652.     (size := self size) == 0 ifTrue: [^17171].
  53653.     ^size + (self at: 1) hash + (self at: size) hash!
  53654.  
  53655. identityIndexOf: anElement
  53656.     "Answer the index of the first occurrence of the object which is the argument 
  53657.     anElement, within the receiver. If the receiver does not contain anElement, 
  53658.     answer 0. This method is the same as #indexOf:, but uses #== for comparison."
  53659.  
  53660.     ^self nextIdentityIndexOf: anElement from: 1 to: self size!
  53661.  
  53662. identityIndexOf: anElement ifAbsent: exceptionBlock
  53663.     "Answer the index of the first occurrence of the object which is the argument 
  53664.     anElement, within the receiver. If the receiver does not contain anElement, answer 
  53665.     the result of evaluating the argument, exceptionBlock. This method is the same
  53666.     as #indexOf:ifAbsent:, but uses #== for comparison."
  53667.  
  53668.     | index |
  53669.     index := self identityIndexOf: anElement.
  53670.     ^index == 0
  53671.         ifTrue: [exceptionBlock value]
  53672.         ifFalse: [index]!
  53673.  
  53674. includesKey: anInteger
  53675.     ^anInteger between: 1 and: self size!
  53676.  
  53677. indexOf: target
  53678.     "Answer the <integer> index of the first element of the receiver which is 
  53679.     equal to the <Object> argument, target, within the receiver. If the receiver 
  53680.     does not contain any elements equal to target, answer 0."
  53681.  
  53682.     ^self nextIndexOf: target from: 1 to: self size!
  53683.  
  53684. indexOf: target ifAbsent: exceptionHandler
  53685.     "Answer the <integer> index of the first element of the receiver which is 
  53686.     equal to the <Object> argument, target, within the receiver. If the receiver 
  53687.     does not contain any elements equal to target, answer the result of evaluating 
  53688.     the <niladicValuable>, exceptionHandler."
  53689.  
  53690.     | index |
  53691.     index := self indexOf: target.
  53692.     ^index == 0
  53693.         ifTrue: [exceptionHandler value]
  53694.         ifFalse: [index]!
  53695.  
  53696. indexOfSubCollection: aSequenceableCollection
  53697.     "Answer the index of the first occurrence within the receiver of aSequenceableCollection,
  53698.     starting at index anInteger. If there are no such occurrences, answer 0."
  53699.  
  53700.     ^self indexOfSubCollection: aSequenceableCollection startingAt: 1!
  53701.  
  53702. indexOfSubCollection: targetSequence startingAt: start
  53703.     "Answer the <integer> index of the next occurrence within the 
  53704.     receiver of the <sequencedReadableCollection> targetSequence,
  53705.     starting at the <integer> index start.
  53706.     If there are no such occurrences, answer 0."
  53707.  
  53708.     | size subSize firstElement j |
  53709.     subSize := targetSequence size.
  53710.     subSize == 0 ifTrue: [^0].
  53711.     firstElement := targetSequence at: 1.
  53712.     size := self size.
  53713.     subSize == 1
  53714.         ifTrue: [^self nextIndexOf: firstElement from: start to: size].
  53715.     start to: size - subSize + 1 do: [ :i |
  53716.         (self at: i) = firstElement
  53717.             ifTrue: [
  53718.                 j := 2.
  53719.                 [(self at: i + j - 1) = (targetSequence at: j)] whileTrue: [
  53720.                     j = subSize ifTrue: [^i].
  53721.                     j := j + 1]]].
  53722.     ^0!
  53723.  
  53724. indexOfSubCollection: targetSequence startingAt: start ifAbsent: exceptionHandler
  53725.     "Answer the <integer> index of the next occurrence within the 
  53726.     receiver of the <sequencedReadableCollection> targetSequence,
  53727.     starting at the <integer> index start.
  53728.     If no such match is found, answer the result of evaluating the 
  53729.     <niladicValuable>, exceptionHandler."
  53730.  
  53731.     | index |
  53732.     index := self indexOfSubCollection: targetSequence startingAt: start.
  53733.     ^index == 0
  53734.         ifTrue: [exceptionHandler value]
  53735.         ifFalse: [index]!
  53736.  
  53737. keyAtEqualValue: value ifAbsent: exceptionHandler
  53738.     "Answer the <integer> key of the <object> argument, value. 
  53739.     If there is no such element, answer the result of evaluating the 
  53740.     niladic valuable, exceptionHandler.
  53741.     N.B. Equality is used for comparison of the values (this increases the chances of 
  53742.     returning any duplicates the collection might contain)."
  53743.  
  53744.     ^self indexOf: value ifAbsent: exceptionHandler!
  53745.  
  53746. keyAtValue: value
  53747.     "Answer the <integer> key of the <Object> argument, value. 
  53748.     If there is no such value, send #errorNotFound: to the receiver with 
  53749.     value as its argument.
  53750.     N.B. Since elements are not necessarily unique, answer the index of the 
  53751.     first one encountered in a serial search."
  53752.  
  53753.     ^self keyAtValue: value ifAbsent: [self errorNotFound: value]!
  53754.  
  53755. keyAtValue: value ifAbsent: operation
  53756.     "Answer the <integer> key of the <Object> argument, value. 
  53757.     If there is no such value, answer the result of evaluating the 
  53758.     <niladicValuable>, operation. Identity is used for comparison of the values."
  53759.  
  53760.     ^self identityIndexOf: value ifAbsent: operation!
  53761.  
  53762. keys
  53763.     "Answer a <collection> containing the receiver's keys."
  53764.  
  53765.     ^1 to: self size!
  53766.  
  53767. keysAndValuesDo: operation
  53768.     "Evaluate the <dyadicValuable>, operation, for each element of the receiver
  53769.     with the <integer> index of that element and the element itself as the arguments.
  53770.     Implementation Note: Subclasses should override #from:to:keysAndValuesDo: rather 
  53771.     than this method, unless they have a slow implementation of #size, or one that 
  53772.     relies on #countElements (since that uses #do: to calculate the size and may
  53773.     therefore go infinitely recursive)."
  53774.  
  53775.     self from: 1 keysAndValuesDo: operation!
  53776.  
  53777. last
  53778.     "Answer the <Object> which is the last element of the receiver. 
  53779.     Raise an exception if the receiver contains no elements."
  53780.  
  53781.     ^self at: self size!
  53782.  
  53783. last: anInteger
  53784.     "Answer a copy of the receiver comprising the rightmost anInteger elements."
  53785.  
  53786.     | size |
  53787.     size := self size.
  53788.     ^self copyFrom: (size + 1 - anInteger) to: size!
  53789.  
  53790. lastIndexOf: target
  53791.     "Answer the <integer> index of the last element of the receiver which is 
  53792.     equal to the <Object> argument, target, within the receiver. If the receiver 
  53793.     does not contain any elements equal to target, answer 0."
  53794.  
  53795.     ^self prevIndexOf: target from: self size to: 1!
  53796.  
  53797. lastIndexOf: anObject ifAbsent: exceptionHandler 
  53798.     "Answer the <integer> index of the last element of the receiver which is 
  53799.     equal to the <Object> first argument within the receiver. If the receiver 
  53800.     does not contain any elements equal to target, answer the result of 
  53801.     evaluating the <niladicValuable>, exceptionHandler."
  53802.  
  53803.     "Included for compatibility with Visual Works"
  53804.  
  53805.     | index |
  53806.     ^(index := self lastIndexOf: anObject) == 0 
  53807.         ifTrue: [exceptionHandler value]
  53808.         ifFalse: [index]!
  53809.  
  53810. nextIdentityIndexOf: anElement from: start to: stop
  53811.     "Answer the index of the next occurrence of anElement in the receiver's indexable
  53812.     variables between startIndex and stopIndex inclusive. If there are no such occurrences, answer 0.
  53813.     Subclasses may be able to provide a more efficient implementation using 
  53814.     #primIdentityIndexOf:from:to:."
  53815.  
  53816.     self from: start to: stop keysAndValuesDo: [:i :elem | elem == anElement ifTrue: [^i]].
  53817.     ^0!
  53818.  
  53819. nextIndexOf: anElement from: start to: stop
  53820.     "Answer the index of the next occurrence of anElement in the receiver between 
  53821.     startIndex and stopIndex inclusive. If there are no such occurrences, answer 0."
  53822.  
  53823.     self from: start to: stop keysAndValuesDo: [:i :elem | elem = anElement ifTrue: [^i]].
  53824.     ^0!
  53825.  
  53826. occurrencesOfSubCollection: aSubCollection
  53827.     "Private - Answer the number of occurrences of aSubCollection in the receiver."
  53828.  
  53829.     | index count size |
  53830.     index := 1.
  53831.     count := 0.
  53832.     size := aSubCollection size.
  53833.     [(index := self indexOfSubCollection: aSubCollection startingAt: index) > 0] whileTrue: [ 
  53834.         count := count + 1.
  53835.         index := index + size].
  53836.     ^count!
  53837.  
  53838. prevIndexOf: anElement from: start to: stop
  53839.     "Answer the index of the occurrence of anElement in the receiver between previous
  53840.     to start, but after stop. If there are no such occurrences, answer 0."
  53841.  
  53842.     start to: stop by: -1 do: [ :i | (self at: i) = anElement ifTrue: [ ^i ]].
  53843.     ^0!
  53844.  
  53845. prevIndexOfSubCollection: aSequenceableCollection startingAt: anInteger
  53846.     "Answer the index of the previous occurrence within the receiver between startIndex and stopIndex
  53847.     of aSequenceableCollection, before the element with index, anInteger. If there are no previous
  53848.     occurrences of aSequenceableCollection, answer 0."
  53849.  
  53850.     | subSize firstElement j |
  53851.     (subSize := aSequenceableCollection size) == 0 ifTrue: [ ^0 ].
  53852.     firstElement := aSequenceableCollection at: 1.
  53853.     subSize == 1
  53854.         ifTrue: [ ^self prevIndexOf: firstElement from: anInteger to: 0 ].
  53855.     anInteger to: 1 by: -1 do: [:i |
  53856.         (self at: i) = firstElement
  53857.             ifTrue: [
  53858.                 j := 2.
  53859.                 [ (self at: i + j - 1) = (aSequenceableCollection at: j) ] whileTrue: [
  53860.                     j = subSize ifTrue: [^i].
  53861.                     j := j + 1 ]]].
  53862.     ^0
  53863. !
  53864.  
  53865. prevIndexOfSubCollection: aSequenceableCollection startingAt: anInteger ifAbsent: exceptionBlock
  53866.     "Answer the index of the previous occurrence within the receiver between startIndex and stopIndex
  53867.     of aSequenceableCollection, before the element with index, anInteger. If there are no previous
  53868.     occurrences of aSequenceableCollection, answer the result of evaluating exceptionBlock."
  53869.  
  53870.     | index |
  53871.     index := self prevIndexOfSubCollection: aSequenceableCollection startingAt: anInteger.
  53872.     ^index == 0
  53873.         ifTrue: [exceptionBlock value]
  53874.         ifFalse: [index]
  53875. !
  53876.  
  53877. publishedKeyedAspects
  53878.     "Answers a <LookupTable> of the published aspects of the 
  53879.         receiver's keyed contents."
  53880.  
  53881.     | batchAccessor keyedAspects |
  53882.     batchAccessor := KeyedAspectBatchAccessor subject: self
  53883.                 batchSize: self publishedKeyedAspectsBatchSize.
  53884.     keyedAspects := batchAccessor getBatchAccessors collect: [:each | each aspectDescriptor].
  53885.     ^(LookupTable new)
  53886.         addAll: keyedAspects;
  53887.         yourself!
  53888.  
  53889. readStream
  53890.     "Answer a ReadStream on the receiver."
  53891.  
  53892.     ^ReadStream on: self!
  53893.  
  53894. remove: oldElement ifAbsent: exceptionHandler
  53895.     "Remove the <Object> oldElement from the receiver's elements.
  53896.     Raise an exception, as SequenceableCollections are not (in general) 
  53897.     contractible."
  53898.  
  53899.     ^self shouldNotImplement!
  53900.  
  53901. replaceBytesOf: aByteObject from: start to: stop startingAt: fromStart
  53902.     "Private - Standard method for transfering bytes from one sequence of bytes (or characters)
  53903.     to another, normally double dispatched from #replaceFrom:to:with:startingAt:
  53904.     by byte subclasses. Implementing this message at this level allows for the concatenation
  53905.     of character arrays to strings, for example.
  53906.     Implementation Note: It is assumed that the receiver and the argument,
  53907.     cannot be the same object, which will be the case for correctly defined subclasses
  53908.     which must override this implementation.."
  53909.  
  53910.     | fromOffset |
  53911.     fromOffset := fromStart - start.
  53912.     start to: stop do: [:i | aByteObject at: i put: (self at: i + fromOffset)].
  53913.     ^aByteObject!
  53914.  
  53915. replaceFrom: start to: stop with: replacementElements
  53916.     "Destructively replace the elements of the receiver between the <integer> arguments
  53917.     start and stop with the <Object> elements of the <sequencedReadableCollection> argument, 
  53918.     replacementElements. Answer the receiver. Raise an Exception if  replacementElements does 
  53919.     not contain the number of elements required to exactly fill the replacement interval in the receiver."
  53920.  
  53921.     replacementElements size = (stop - start + 1)
  53922.         ifFalse: [^self error: 'size of replacement incorrect'].
  53923.     ^self replaceFrom: start to: stop with: replacementElements startingAt: 1!
  53924.  
  53925. replaceFrom: start to: stop with: replacementElements startingAt: repStart
  53926.     "Destructively replace the elements of the receiver between the <integer> arguments
  53927.     start and stop with the <Object> elements of the <sequencedReadableCollection> 
  53928.     argument, replacementElements beginning with its element with <integer> index 
  53929.     repStart. Answer the receiver. Overlapping moves are correctly handled.
  53930.     Unlike #replaceFrom:to:with:, the size of replacementElements is not checked
  53931.     directly (X3J20 does not specify that this should be an error), but an error will
  53932.     be raised when an attempt is made to access an out-of-bounds element in
  53933.     replacementElements.
  53934.     N.B. It is not an error to specify an empty replacement interval, even if
  53935.     start, stop, and/or repStart are out-of-bounds (this is compatible with the major
  53936.     implementations).
  53937.     Implementation Note: The performance of this method is very important to overall 
  53938.     system performance. This implementation is mostly inlined by the compiler."
  53939.  
  53940.     | offset |
  53941.     offset := repStart - start.
  53942.     (self == replacementElements and: [repStart < start])
  53943.         ifTrue: [
  53944.             "Move within same object overlaps, so do backwards"
  53945.             stop to: start by: -1 do: [:i |
  53946.                 self at: i put: (replacementElements at: offset + i)]]
  53947.         ifFalse: [
  53948.             "Non-overlapping moves are done forwards"
  53949.             start to: stop do: [:i |
  53950.                 self at: i put: (replacementElements at: offset + i)]]!
  53951.  
  53952. replaceFrom: start to: stop withObject: replacementElement
  53953.     "Destructively replace the elements of the receiver between the
  53954.     <integer> indices start and stop with the <Object> argument,
  53955.     replacementElement. Answer replacementElement."
  53956.  
  53957.     start to: stop do: [:i | self at: i put: replacementElement].
  53958.     ^replacementElement!
  53959.  
  53960. resize: anInteger
  53961.     "Private - Resize the receiver to accomodate anInteger elements.
  53962.     Answer the receiver."
  53963.  
  53964.     (self copyEmpty: anInteger)
  53965.         replaceFrom: 1 to: self size with: self startingAt: 1;
  53966.         become: self!
  53967.  
  53968. reverse
  53969.     "Answer a new <sequencedReadableCollection> which contains the same elements
  53970.     as the receiver, but in reverse order."
  53971.  
  53972.     | answer i |
  53973.     i := self size.
  53974.     answer := self copyLikeOfSize: i.
  53975.     self do: 
  53976.             [:element | 
  53977.             answer at: i put: element.
  53978.             i := i - 1].
  53979.     ^answer!
  53980.  
  53981. reverseDo: operation
  53982.     "Evaluate the <monadicValuable> argument, operation, against each 
  53983.     element of the receiver in reverse order, from end to start."
  53984.  
  53985.     self size to: 1 by: -1 do: [:i | operation value: (self at: i)]!
  53986.  
  53987. second
  53988.     "Answer an <Object> which is the second element of the receiver. 
  53989.     Raise an exception if the element does not exist."
  53990.  
  53991.     ^self at: 2!
  53992.  
  53993. select: discriminator
  53994.     "Evaluate the <monadicValuable> argument, discriminator, for each of the receiver's elements.
  53995.     Answer a new <collection> like the receiver containing only those elements for which 
  53996.     the discriminator evaluates to true."
  53997.  
  53998.     | aStream |
  53999.     aStream := self species writeStream: self copySize.
  54000.     self keysAndValuesDo: [:i :elem |
  54001.         (discriminator value: elem) ifTrue: [aStream nextPut: elem]].
  54002.     ^aStream contents!
  54003.  
  54004. size
  54005.     "Answer the <integer> number of elements in the receiver."
  54006.  
  54007.     ^self subclassResponsibility!
  54008.  
  54009. skipOver: stream
  54010.     "Private - Answer whether the receiver matches the contents of <sequencedStream> stream
  54011.     taking account of any case differences. Answers true if a complete match is
  54012.     found, false otherwise. If a match is found then the stream is left pointing to the next character
  54013.     following the match. If not, the stream position is left unchanged."
  54014.  
  54015.     | originalPosition |
  54016.     originalPosition := stream position.
  54017.     self do: [ :each | 
  54018.         (stream atEnd or: [stream next~=each]) ifTrue: [ 
  54019.             stream position: originalPosition. ^false]].
  54020.     ^true
  54021. !
  54022.  
  54023. swap: integerIndex1 with: integerIndex2
  54024.     "Swap the elements of the receiver at the specified indices"
  54025.  
  54026.     | element |
  54027.     element := self at: integerIndex1.
  54028.     self at: integerIndex1 put: (self at: integerIndex2).
  54029.     self at: integerIndex2 put: element!
  54030.  
  54031. third
  54032.     "Answer an <Object> which is the third element of the receiver. 
  54033.     Raise an exception if the element does not exist."
  54034.  
  54035.     ^self at: 3!
  54036.  
  54037. upTo: target
  54038.     "Answer a new <sequencedReadableCollection> containing the elements of 
  54039.     the receiver up to the specified target, or if the target is not present in the receiver, 
  54040.     the rest of the receiver.
  54041.  
  54042.     Implementation Note: This is a convenient shortcut method for:
  54043.         self readStream upTo: target
  54044.     And is usually faster since the Streams implementation is generic."
  54045.  
  54046.     ^self copyFrom: 1 to: (self indexOf: target ifAbsent: [self size+1])-1!
  54047.  
  54048. with: otherCollection do: operation
  54049.     "Evaluate the <dyadicValuable> argument, operation, with each of 
  54050.     the receiver's elements along with the corresponding element from the 
  54051.     <sequencedReadableCollection> argument, otherCollection. 
  54052.     Raise an exception if otherCollection is not the same size as the receiver."
  54053.  
  54054.     self size = otherCollection size
  54055.         ifFalse: [^self error: 'collections are of different sizes'].
  54056.     self keysAndValuesDo: [:i :elem |
  54057.         operation
  54058.             value: elem
  54059.             value: (otherCollection at: i)]!
  54060.  
  54061. writeStream
  54062.     "Answer a WriteStream on the receiver."
  54063.  
  54064.     ^WriteStream on: self! !
  54065.  
  54066. Set comment:
  54067. 'Set is a generic collection class which represents an unordered, extensible/contractible, collection, accessible only by value, not by external keys. Element comparison is by equality (i.e. using #hash and #=).'!
  54068. !Set class methodsFor!
  54069.  
  54070. initialize
  54071.     "Private - Initialize the receiver's class variables."
  54072.  
  54073.     self initializeSizeTable
  54074. !
  54075.  
  54076. initializeSizeTable
  54077.     "Private - Construct a difference table which can be used to calculate the nearest 
  54078.     larger prime for each odd integer up to a certain limit.  The greater the limit the more
  54079.     table space is used, although as this is a byte array this isn't likely to be a problem.
  54080.     Ultimately the use of a byte array limits the table size since at some point the offset
  54081.     to the next prime will be greater than 255.
  54082.  
  54083.         self initializeSizeTable
  54084.     "
  54085.  
  54086.     | primes last count max |
  54087.     max := (2**12)+1.    "Max size for which entry will be found in table"
  54088.     primes := Integer primesUpTo: max+255.
  54089.     count := max bitShift: -1.
  54090.     SmallPrimeOffsets := ByteArray new: count.
  54091.     last := 1.
  54092.     1 to: count do: [:i | | n p |
  54093.         n := (i bitShift: 1) bitOr: 1.
  54094.         [(p := primes at: last) >= n] whileFalse: [last := last + 1].
  54095.         SmallPrimeOffsets at: i put: p - n]!
  54096.  
  54097. new
  54098.     "Answer a new instance of the receiver with the default initial capacity.
  54099.     Implementation Note: Although it is tempting to implement this using
  54100.     #basicNew: to avoid going through the sizing code, that makes subclassing
  54101.     much more fragile (e.g. they will often need to override #new as well as
  54102.     #new:), so avoid the temptation."
  54103.  
  54104.     ^self new: 2!
  54105.  
  54106. new: count
  54107.     "Answer a new instance of the receiver with an initial capacity of at least 
  54108.     <integer> count elements (i.e. the size is a hint)."
  54109.  
  54110.     ^(self basicNew: (self sizeFor: count)) initialize!
  54111.  
  54112. newAspect: aspectClass name: aSymbol 
  54113.         "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  54114.         which is appropriate for representing aspects of the receiver's type."
  54115.     
  54116.         ^aspectClass set: aSymbol!
  54117.  
  54118. sizeFor: anInteger
  54119.     "Private - Answer the size of Set that should be created to hold anInteger elements.
  54120.     This formula should be kept in step with that in the instance method #privateAt:put:.
  54121.     Try to answer only prime sizes as these give a better hash distribution."
  54122.  
  54123.     ^anInteger < 2 
  54124.         ifTrue: 
  54125.             ["Minimum capacity of Dolphin hashed collection is 2"
  54126.  
  54127.             2]
  54128.         ifFalse: 
  54129.             [| n i |
  54130.             n := anInteger * 100 // 75 bitOr: 1.
  54131.             i := n bitShift: -1.
  54132.             ^i > SmallPrimeOffsets basicSize 
  54133.                 ifTrue: 
  54134.                     ["Larger sizes just left odd"
  54135.  
  54136.                     n]
  54137.                 ifFalse: 
  54138.                     ["Calculate nearest prime larger than requested size plus 25% slop"
  54139.  
  54140.                     (SmallPrimeOffsets basicAt: i) + n]]! !
  54141.  
  54142. !Set methodsFor!
  54143.  
  54144. - others
  54145.     "Answer a <Set> containing the elements of the receiver that are 
  54146.     not present in the <collection>, others."
  54147.  
  54148.     ^self reject: [:each | others includes: each]!
  54149.  
  54150. add: newElement
  54151.     "Include the <Object> newElement as one of the elements of the receiver. 
  54152.     If newElement is nil, then it is not added. Answer newElement.
  54153.     Note: If newElement is already in the receiver (i.e. has an equal element 
  54154.     already in the receiver), then this operation has no effect. Note further
  54155.     that if an equal element already exists then it is not overwritten, but the
  54156.     answer is still newElement. I tried to persuade the committee that the original
  54157.     element should be answered, but they didn't see the problem."
  54158.  
  54159.     | index |
  54160.     newElement isNil ifTrue: [^newElement].        "Sets cannot store empty objects"
  54161.     index := self findElementOrNil: newElement.
  54162.     (self basicAt: index) isNil
  54163.         ifTrue: [self privateAt: index put: newElement].
  54164.     ^newElement!
  54165.  
  54166. approxSize
  54167.     "Private - Answer the approximate size of the receiver.
  54168.     Implementation Note: Sets keep a tally, so we can use the actual size."
  54169.  
  54170.     ^self size!
  54171.  
  54172. asSet
  54173.     "Answer a <Set> whose elements are those stored in the receiver 
  54174.     (any duplicates are therefore eliminated)."
  54175.  
  54176.     ^self!
  54177.  
  54178. at: index
  54179.     "Generate an exception to the effect that Sets are not keyed."
  54180.  
  54181.     ^self errorNotKeyed
  54182. !
  54183.  
  54184. at: index put: value
  54185.     "Generate an exception to the effect that Sets are not keyed."
  54186.  
  54187.     ^self errorNotKeyed
  54188. !
  54189.  
  54190. averageProbesPerElement
  54191.     "Answer the average number of probes necessary to  find an element 
  54192.     in the receiver. Ideally this should be close to 1."
  54193.  
  54194.     | probes capacity |
  54195.     self isEmpty ifTrue: [^1].
  54196.     probes := 0.
  54197.     capacity := self basicSize.
  54198.     1 to: capacity
  54199.         do: 
  54200.             [:i | 
  54201.             | element pos distance |
  54202.             element := self basicAt: i.
  54203.             element notNil 
  54204.                 ifTrue: 
  54205.                     [pos := self bestSlotFor: element boundedBy: capacity.
  54206.                     distance := i - pos.
  54207.                     distance < 0 ifTrue: [distance := distance + capacity].
  54208.                     probes := probes + distance + 1]].
  54209.     ^probes asFloat / self size!
  54210.  
  54211. bestSlotFor: element boundedBy: capacity
  54212.     ^self hash: element max: capacity!
  54213.  
  54214. collisions
  54215.     "Answer the <Integer> number of the elements which are not found
  54216.     on first probe."
  54217.  
  54218.     | answer capacity |
  54219.     answer := 0.
  54220.     capacity := self basicSize.
  54221.     1 to: capacity
  54222.         do: 
  54223.             [:i | 
  54224.             | element |
  54225.             element := self basicAt: i.
  54226.             element notNil 
  54227.                 ifTrue: 
  54228.                     [(self hash: element max: capacity) ~= i ifTrue: [answer := answer + 1]]].
  54229.     ^answer!
  54230.  
  54231. copyElementsInto: newMe
  54232.     "Private - Add the receiver's elements into the argument, newMe.
  54233.     Part of the implementation of hashed collection resizing. Subclasses
  54234.     override as necessary."
  54235.  
  54236.     self do: [:element | newMe uncheckedAdd: element]!
  54237.  
  54238. copyWithoutDuplicates
  54239.     "Answers a copy of the receiver that contains no duplicate objects. 
  54240.     Implementation Note: Sets are already free of duplicates so a plain
  54241.     copy will do."
  54242.  
  54243.     ^self shallowCopy!
  54244.  
  54245. do: operation
  54246.     "Evaluate the <monadicValuable> argument, operation, for each of the 
  54247.     elementss of the receiver. Answers the receiver."
  54248.  
  54249.     | element |
  54250.     tally == 0 ifTrue: [^self].        "Nothing to do"
  54251.     1 to: self basicSize do: [:index |
  54252.         (element := self basicAt: index) isNil
  54253.             ifFalse: [operation value: element]]!
  54254.  
  54255. elements
  54256.     "Private - Answers the contents of the receiver as an OrderedCollection"
  54257.  
  54258.     ^self asOrderedCollection!
  54259.  
  54260. elements: anOrderedCollection
  54261.     "Private - Sets the contents of the receiver from anOrderedCollection"
  54262.  
  54263.     | originalContents|
  54264.     originalContents:= self shallowCopy.
  54265.     self removeAll: originalContents.
  54266.     self addAll: anOrderedCollection.
  54267. !
  54268.  
  54269. equals: comperand
  54270.     "Answer whether the receiver is equivalent to the <Object>, comperand.
  54271.     I often think this ought to be the definition of Set>>=, but for compatibility
  54272.     with other Smalltalks, we'll use the alternative selector.
  54273.     Implementation Note: Do our best to avoid an element-by-element
  54274.     comparison. The algorithm will be slowest where the comperand is
  54275.     equal to the receiver, but not identical."
  54276.  
  54277.     comperand == self ifTrue: [^true].
  54278.     comperand species == self species ifFalse: [^false].
  54279.     comperand size == self size ifFalse: [^false].
  54280.     self do: [:e | (comperand includes: e) ifFalse: [^false]].
  54281.     ^true!
  54282.  
  54283. find: target
  54284.     "Answer the actual element of the receiver which matches (however 'match' is defined)
  54285.     the argument, target. This can be useful when eliminating duplicates."
  54286.  
  54287.     ^self find: target ifAbsent: [self errorNotFound: target]!
  54288.  
  54289. find: target ifAbsent: exceptionHandler
  54290.     "Answer the actual element of the receiver which matches (however 'match' is defined)
  54291.     the argument, target. If there is no such element, then the result of evaluating the
  54292.     niladic valuable, exceptionHandler, is answered."
  54293.  
  54294.     | element |
  54295.     element := self basicAt: (self findElementOrNil: target).
  54296.     ^element notNil
  54297.         ifTrue: [element]
  54298.         ifFalse: [exceptionHandler value]!
  54299.  
  54300. findElementOrNil: anObject
  54301.     "Private - Answer the index of the given object in the receiver, or, if not found,
  54302.     the index of the first empty slot including and after that to which the object hashes.
  54303.     Implementation Note: This implementation is tuned to give the best performance on the
  54304.     current VM. Although it might seem worthwhile unrolling the loop to avoid performing
  54305.     a division operation inside the loop, in practice that operation is rarely taken and
  54306.     average performance suffers from the extra temporaries used."
  54307.  
  54308.     | capacity index element |
  54309.     capacity := self basicSize.
  54310.     index := self hash: anObject max: capacity.
  54311.     [(element := self basicAt: index) isNil or: [anObject = element]] 
  54312.         whileFalse: [index := index \\ capacity + 1].
  54313.     ^index!
  54314.  
  54315. fixCollisionsFrom: index
  54316.     "Private - Rehashes objects in the collection after index to see if any of
  54317.     them hash to index.  If so, that object is copied to index, and the
  54318.     process repeats with that object's index, until a nil is encountered."
  54319.  
  54320.     | slotIndex capacity element |
  54321.     slotIndex := index.
  54322.     capacity := self basicSize.
  54323.     [slotIndex := slotIndex \\ capacity + 1.
  54324.       (element := self basicAt: slotIndex) isNil]
  54325.         whileFalse:  [ | hashIndex |
  54326.             hashIndex := self findElementOrNil: element.
  54327.             (self basicAt: hashIndex) isNil ifTrue: [self moveFrom: slotIndex to: hashIndex]]!
  54328.  
  54329. grow
  54330.     "Private - Expand the receiver to a capacity suitable for holding more elements"
  54331.  
  54332.     self resize: self size * 2!
  54333.  
  54334. hash: anObject max: anInteger
  54335.     ^anObject hash \\ anInteger + 1!
  54336.  
  54337. identityIncludes: target
  54338.     "Answer whether the <Object> argument, target, is one of the receiver's elements.
  54339.     Implementation Note: If anObject is identical to any object in the Set, then
  54340.     it must also be equal to that object, which means it must have the same hash
  54341.     value as that object, and therefore we can use a hashed lookup to optimize
  54342.     this method over the serial search in the Collection implementation."
  54343.  
  54344.     | element |
  54345.     element := self basicAt: (self findElementOrNil: target).
  54346.     ^element notNil and: [element == target]!
  54347.  
  54348. includes: target
  54349.     "Answer whether the <Object> argument, target, is one of 
  54350.     the elements of the receiver."
  54351.  
  54352.     ^(self basicAt: (self findElementOrNil: target)) notNil!
  54353.  
  54354. initialize
  54355.     "Private - Instance variable initialization. The tally records the number of elements."
  54356.  
  54357.     tally := 0
  54358. !
  54359.  
  54360. moveFrom: fromIndex to: toIndex
  54361.     "Private - Destructively move the element at index, fromIndex, over
  54362.     the element (normally nil) at index, toIndex. Must be overridden by subclasses
  54363.     with a different structure which wish to inherit the collision repair mechanism."
  54364.  
  54365.     self basicAt: toIndex put: (self basicAt: fromIndex).
  54366.     self basicAt: fromIndex put: nil!
  54367.  
  54368. occurrencesOf: target
  54369.     "Answer an <integer> which is the number of occurrences of target in the receiver.
  54370.     Implementation Note: Sets cannot contain duplicates, so this is either 0 or 1"
  54371.  
  54372.     ^(self includes: target) ifTrue: [1] ifFalse: [0]!
  54373.  
  54374. postResize: oldMe
  54375.     "Private - This message is sent by the receiver when resizing, after the
  54376.     receiver's elements have been added to a new Collection and the
  54377.     receiver has become that collection. It is a chance for the receiver
  54378.     to perform any final state changes needed."!
  54379.  
  54380. preResize: newMe
  54381.     "Private - This message is sent by the receiver when resizing, before the receiver's elements are added
  54382.     to newMe. It gives the receiver the opportunity to copy other parts of its state into newMe.
  54383.     See also, #postResize and #copyEmpty: (which is subtly different, since it is used for creating copies of the
  54384.     receiver, not for rebuilding it). Subclasses should implement as necessary."
  54385. !
  54386.  
  54387. privateAt: index put: newObject
  54388.     "Private - Insert newObject as the element of the receiver at index. Attempts to maintain the
  54389.     'optimal' load factor (and thereby ensures there is always a least one empty slot in the Set, an 
  54390.     invariant required by the search algorithm)."
  54391.  
  54392.     | capacity |
  54393.     self basicAt: index put: newObject.
  54394.     tally := tally + 1.
  54395.     capacity := self basicSize.
  54396.     capacity - tally <= (capacity bitShift: -2) ifTrue: [self grow].
  54397.     ^newObject!
  54398.  
  54399. rehash
  54400.     "Rehash the receiver by making use of the resizing mechanism, which essentially builds a
  54401.     new collection. 
  54402.     Implementation Note: It is important that #resize: is not optimised as this method
  54403.     is used to reconstruct valid Sets from invalidated ones (e.g. where the hash value of
  54404.     an Object has changed)."
  54405.  
  54406.     self resize: self size!
  54407.  
  54408. remove: anObject ifAbsent: aBlock
  54409.     "If oldObject is one of the receiver's elements, then remove it from the receiver 
  54410.     and answer oldObject (as Sets cannot contain duplicates, only one element is ever 
  54411.     removed). If oldObject is not an element of the receiver (i.e. no element of the 
  54412.     receiver is #= to oldObject) then answer the result of evaluating aBlock."
  54413.  
  54414.     | index element |
  54415.     index := self findElementOrNil: anObject.
  54416.     ^(element := self basicAt: index) isNil
  54417.         ifTrue: [aBlock value]
  54418.         ifFalse: [self removeIndex: index. element]!
  54419.  
  54420. removeIndex: anInteger
  54421.     "Private - Remove the element at index, anInteger, in the receiver. Does not
  54422.     check that the element is empty."
  54423.  
  54424.     self basicAt: anInteger put: nil.
  54425.     tally := tally - 1.
  54426.     self fixCollisionsFrom: anInteger!
  54427.  
  54428. resize: anInteger
  54429.     "Private - Resize the receiver to have a capacity suitable for accomodating
  54430.     at least anInteger elements. Answer the receiver (resized). The receiver is
  54431.     rehashed regardless of whether it is already of the correct capacity (this
  54432.     is important)."
  54433.  
  54434.     | newMe |
  54435.     newMe := self copyEmpty: anInteger.
  54436.     self preResize: newMe.
  54437.     self copyElementsInto: newMe.
  54438.     self become: newMe.
  54439.     "newMe is now the old me!!"
  54440.     self postResize: newMe
  54441. !
  54442.  
  54443. shrink
  54444.     "Rebuild the collection with the optimal size for its current number of elements,
  54445.     as #rehash, but doesn't resize if already correct size."
  54446.  
  54447.     | size |
  54448.     size := self size.
  54449.     (self basicSize = (self class sizeFor: size)) 
  54450.         ifFalse: [self resize: size]!
  54451.  
  54452. size
  54453.     "Answer an <integer> specifying the number of elements in the receiver."
  54454.  
  54455.     ^tally!
  54456.  
  54457. stbSaveOn: anSTBOutFiler
  54458.     "Save out a binary representation of the receiver to anSTBOutFiler."
  54459.  
  54460.     anSTBOutFiler saveObject: self as: (STBCollectionProxy for: self)!
  54461.  
  54462. uncheckedAdd: newObject
  54463.     "Private - Add newObject to the receiver, without checking to see if it is already present.
  54464.     We also assume the receiver is large enough to accommodate the new element, and so do not
  54465.     attempt to maintain the load factor."
  54466.  
  54467.     tally := tally + 1.
  54468.     ^self basicAt: (self findElementOrNil: newObject) put: newObject! !
  54469.  
  54470. ArrayedCollection comment:
  54471. 'ArrayedCollection is the class of <SequenceableCollection>s of a fixed size which are indexable by integer keys from 1 to the size of the collection.'!
  54472. !ArrayedCollection class methodsFor!
  54473.  
  54474. new
  54475.     "Answer a new, empty, instance of the receiver."
  54476.  
  54477.     ^self new: 0!
  54478.  
  54479. new: elementCount withAll: elementValue
  54480.     "Answer a new instance of the receiver with <integer>, elementCount, 
  54481.     elements, each of which is initialized to the <Object>, elementValue.
  54482.     Included mainly for compatibility with VisualWorks."
  54483.  
  54484.     ^(self new: elementCount)
  54485.         atAllPut: elementValue;
  54486.         yourself!
  54487.  
  54488. with: element1
  54489.     "Answer a new instance of the receiver containing the single 
  54490.     <Object> element, element1."
  54491.  
  54492.     ^(self new: 1)
  54493.         at: 1 put: element1;
  54494.         yourself!
  54495.  
  54496. with: element1 with: element2
  54497.     "Answer an instance of the receiver containing the <Object>
  54498.     arguments as its elements"
  54499.  
  54500.     ^(self new: 2)
  54501.         at: 1 put: element1;
  54502.         at: 2 put: element2;
  54503.         yourself!
  54504.  
  54505. with: element1 with: element2 with: element3
  54506.     "Answer an instance of the receiver containing the <Object>
  54507.     arguments as its elements."
  54508.  
  54509.     ^(self new: 3)
  54510.         at: 1 put: element1;
  54511.         at: 2 put: element2;
  54512.         at: 3 put: element3;
  54513.         yourself!
  54514.  
  54515. with: element1 with: element2 with: element3 with: element4
  54516.     "Answer an instance of the receiver containing the <Object>
  54517.     arguments as its elements."
  54518.  
  54519.     ^(self new: 4)
  54520.         at: 1 put: element1;
  54521.         at: 2 put: element2;
  54522.         at: 3 put: element3;
  54523.         at: 4 put: element4;
  54524.         yourself!
  54525.  
  54526. with: element1 with: element2 with: element3 with: element4 with: element5
  54527.     "Answer an instance of the receiver containing the <Object>
  54528.     arguments as its elements.
  54529.     N.B. This is not an ANSI standard method (up to 4 elements are supported
  54530.     by <Array factory> #with:&c messages, for more one must use #withAll:)."
  54531.  
  54532.     ^(self new: 5)
  54533.         at: 1 put: element1;
  54534.         at: 2 put: element2;
  54535.         at: 3 put: element3;
  54536.         at: 4 put: element4;
  54537.         at: 5 put: element5;
  54538.         yourself!
  54539.  
  54540. withAll: newElements
  54541.     "Answer a new instance of the receiver containing all of the 
  54542.     elements of the <collection> newElements."
  54543.  
  54544.     | answer |
  54545.     answer := self new: newElements size.
  54546.     newElements inject: 1 into: [:i :elem | answer at: i put: elem. i + 1].
  54547.     ^answer! !
  54548.  
  54549. !ArrayedCollection methodsFor!
  54550.  
  54551. add: newElement
  54552.     "ArrayedCollections are not, in general, extensible."
  54553.  
  54554.     ^self shouldNotImplement!
  54555.  
  54556. at: index
  54557.     "Answer the receiver's indexed element at the <integer> argument, index.
  54558.     Implementation Note: Subclasses are generally implemented as indexable objects,
  54559.     so we can use the indexable instance variable accessing primitive (i.e.
  54560.     revert to the Object implementation)."
  54561.  
  54562.     <primitive: 60>
  54563.     ^self errorAt: index!
  54564.  
  54565. at: index put: newElement
  54566.     "Replace the element of the receiver at the specified <integer> index with 
  54567.     the <Object> argument, newElement. If the index is out of bounds, raise 
  54568.     a BoundsError.
  54569.  
  54570.     Implementation Note: Subclasses are generally implemented as indexable objects,
  54571.     so we can use the indexable instance variable accessing primitive (i.e.
  54572.     revert to the Object implementation)."
  54573.  
  54574.     <primitive: 61>
  54575.     ^self errorAt: index put: newElement!
  54576.  
  54577. do: operation
  54578.     "Evaluate the <monadicValuable> argument, operation, for each of the elements of the 
  54579.     receiver. Answers the receiver. The elements are evaluated in index order.
  54580.     Implementation Note: Override the superclass for efficiency."
  54581.  
  54582.     1 to: self size do: [:i | operation value: (self at: i)]!
  54583.  
  54584. findFirst: discriminator
  54585.     "Answer the index of the first element of the receiver for which the monadic
  54586.     valuable argument, discriminator, evaluates to true. If there are no such elements,
  54587.     answer 0.
  54588.     Implementation Note: Override superclass to provide a more efficient implementation.
  54589.     ArrayedCollections have a very fast implementation of #at:, so it is better to inline
  54590.     the loop."
  54591.  
  54592.     1 to: self size do: [:i | (discriminator value: (self at: i)) ifTrue: [^i]].
  54593.     ^0!
  54594.  
  54595. identityIncludes: anObject
  54596.     "Answer whether the argument, anObject, is one of the receiver's elements.
  54597.     Override superclass to provide a more efficient implementation (hence the
  54598.     esoteric logic ops)."
  54599.  
  54600.     ^((self nextIdentityIndexOf: anObject from: 1 to: self size) == 0) == false!
  54601.  
  54602. includes: target
  54603.     "Answer whether the argument, target, is one of the elements of the receiver.
  54604.     Implementation Note: Override superclass to provide a more efficient implementation."
  54605.  
  54606.     1 to: self size do: [:i | target = (self at: i) ifTrue: [^true]].
  54607.     ^false!
  54608.  
  54609. nextIdentityIndexOf: anElement from: start to: stop
  54610.     "Answer the index of the next occurrence of anElement in the receiver's indexable
  54611.     variables between startIndex and stopIndex inclusive. If there are no such occurrences, answer 0.
  54612.     Override the inherited implementation to make use of the primitive"
  54613.  
  54614.     ^self basicIdentityIndexOf: anElement from: start to: stop    !
  54615.  
  54616. nextIndexOf: anElement from: start to: stop
  54617.     "Answer the index of the next occurrence of anElement in the receiver between 
  54618.     startIndex and stopIndex inclusive. If there are no such occurrences, answer 0.
  54619.     Implementation Note: Override the superclass to provide a more efficient
  54620.     inlined implementation."
  54621.  
  54622.     start to: stop do: [:i | (self at: i) = anElement ifTrue: [^i]].
  54623.     ^0!
  54624.  
  54625. replaceIdentity: anObject with: newElement
  54626.     "If the receiver contains an identity match for anObject replace the first with newElement, 
  54627.     otherwise increase the size of the receiver, and append newElement. Answer the index.
  54628.     This is a very useful method in many system support tasks (e.g. the Dependency mechanism)"
  54629.  
  54630.     | size index |
  54631.     size := self size.
  54632.     index := self basicIdentityIndexOf: anObject from: 1 to: size.
  54633.     index == 0 ifTrue: [ 
  54634.         index := size + 1.
  54635.         self resize: index ].
  54636.     self at: index put: newElement.
  54637.     ^index!
  54638.  
  54639. resize: anInteger
  54640.     "Override back to the primitive implementation for indexable objects (see Object>>resize:)"
  54641.  
  54642.     <primitive: 101>
  54643.     ^super resize: anInteger!
  54644.  
  54645. size
  54646.     "Answer the size of the collection. 
  54647.     Implementation Note: Subclasses are generally implemented as indexable objects,
  54648.     so we can use the indexable instance variable size primitive.
  54649.     This primitive should not fail."
  54650.  
  54651.     <primitive: 62>
  54652.     ^self primitiveFailed
  54653.  
  54654. ! !
  54655.  
  54656. Interval comment:
  54657. '<Interval>s represent a finite arithmetic progressions, that is a <sequencedReadableCollection> of numbers across a specified range and with a specified step between each element.
  54658.  
  54659. Instance Variables:
  54660.     start    <number>. First element in the collection.
  54661.     stop    <number>. Last element in the collection.
  54662.     step    <number>. Difference between elements of the collection (approximate where the elements are Floats)
  54663. '!
  54664. !Interval class methodsFor!
  54665.  
  54666. from: from to: to
  54667.     "Answer a new instance of the receiver representing the interval 
  54668.     between the <number> arguments from and to inclusive in increments
  54669.     of the <integer> one."
  54670.  
  54671.     ^self basicNew 
  54672.         setFrom: from to: to by: 1!
  54673.  
  54674. from: from to: to by: by
  54675.     "Answer a new instance of the receiver representing the interval 
  54676.     between the <number> arguments from and to inclusive in increments
  54677.     of the <number> by."
  54678.  
  54679.     ^self basicNew
  54680.         setFrom: from to: to by: by!
  54681.  
  54682. publishedAspectsOfInstances
  54683.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  54684.     
  54685.         ^(super publishedAspectsOfInstances)
  54686.             add: (Aspect integer: #start);
  54687.             add: (Aspect integer: #stop);
  54688.             add: (Aspect integer: #step);
  54689.             yourself! !
  54690.  
  54691. !Interval methodsFor!
  54692.  
  54693. - delta
  54694.     "Answer a new Interval the same as the receiver, but negatively offset by the specified delta."
  54695.  
  54696.     ^self class from: start - delta to: stop - delta by: step!
  54697.  
  54698. + delta
  54699.     "Answer a new Interval the same as the receiver, but positively offset by the specified delta."
  54700.  
  54701.     ^self class from: start + delta to: stop + delta by: step!
  54702.  
  54703. = anObject
  54704.     "Answer whether the receiver and the <Object>, comparand, 
  54705.     are considered equivalent (that is they contain the same number
  54706.     of equivalent objects in the same order, and are of like class).
  54707.     The supersend ensures that expressions such as '(1 to: 5) = #(1 2 3 4 5)' are true"
  54708.  
  54709.     ^(anObject class == self class)
  54710.         ifTrue: [
  54711.             start = anObject start and: [ stop = anObject stop and: [ step = anObject step]]]
  54712.         ifFalse: [ ^super = anObject ]!
  54713.  
  54714. add: newElement
  54715.     "Intervals are not extensible."
  54716.  
  54717.     ^self shouldNotImplement!
  54718.  
  54719. at: index
  54720.     "Answer the <number> at index position anInteger in the receiver.
  54721.  
  54722.     This should probably be refined into the Interval protocol, because the 
  54723.     return value is restricted to <number>."
  54724.  
  54725.     ^(index >= 1 and: [index <= self size])
  54726.         ifTrue: [start + (step * (index - 1))]
  54727.         ifFalse: [self errorSubscriptBounds: index]!
  54728.  
  54729. at: anInteger put: anObject
  54730.     "Replace the element at index anInteger of the receiver with anObject.
  54731.     Intervals are immutable."
  54732.  
  54733.     ^self shouldNotImplement!
  54734.  
  54735. collect: transformer 
  54736.     "Evaluate the <monadicValuable> argument, transformer, for each of the receiver's elements.
  54737.     Answer a new <sequencedReadableCollection> 'like' the receiver containing the values returned 
  54738.     by the transformer on each evaluation."
  54739.  
  54740.     "Implementation Note: Superclass implmementation works, so this override for efficiency only."
  54741.  
  54742.     | answer size |
  54743.     size := self size.
  54744.     answer := self copyLike: size.
  54745.     1 to: size
  54746.         do: [:each | answer at: each put: (transformer value: start + (step * (each - 1)))].
  54747.     ^answer!
  54748.  
  54749. displayOn: target 
  54750.     "Append, to the <puttableStream> argument, target, a string whose characters 
  54751.     are a description of the receiver as an end user would want to see it."
  54752.  
  54753.     target
  54754.         display: self start;
  54755.         nextPutAll: ' .. ';
  54756.         display: self stop!
  54757.  
  54758. first
  54759.     "Answer the first element of the receiver."
  54760.  
  54761.     self isEmpty ifTrue: [self errorSubscriptBounds: 1].
  54762.     ^start
  54763. !
  54764.  
  54765. from: startAt to: stopAt keysAndValuesDo: operation
  54766.     "Evaluate the <dyadicValuable>, operation, for each element of the receiver
  54767.     between the <integer> indices, start and stop, inclusive with the element and its
  54768.     index as respectively the second and first arguments. A BoundsError will be
  54769.     raised if either start or stop is out of bounds.
  54770.     Implementation Note: Override because #at: is relative slow on Intervals.
  54771.     By overriding this one method we effectively replace the implementation 
  54772.     of all the #do: family of enumerators."
  54773.  
  54774.     startAt to: stopAt do: [:i | operation value: i value: start + (step * (i-1))]!
  54775.  
  54776. hash
  54777.     "Answer the <integer> hash value for the receiver."
  54778.  
  54779.     ^(((start hash bitShift: 2) bitXor: stop hash) bitShift: 1) bitXor: step hash!
  54780.  
  54781. includes: anObject
  54782.     "Answer whether the <Object> argument, target, is one of the elements of the receiver.
  54783.     Implementation Note: This is based on John Brant's suggestion posted to comp.lang.smalltalk.dolphin,
  54784.     though it has been modified slightly to reduce the number of comparisons at the expense of some
  54785.     code clarity."
  54786.  
  54787.     anObject understandsArithmetic ifFalse: [^false].
  54788.     (step < 0 
  54789.         ifTrue: [anObject >= stop and: [anObject <= start]]
  54790.         ifFalse: [anObject >= start and: [anObject <= stop]]) ifFalse: [^false].
  54791.     ^step isInteger 
  54792.         ifTrue: [(anObject - start) \\ step = 0]
  54793.         ifFalse: [start + (step * ((anObject - start) / step) rounded) = anObject]!
  54794.  
  54795. isEmpty
  54796.     "Answer whether the receiver contains any elements.
  54797.     Implementation note: Override superclass for improved performance."
  54798.  
  54799.     ^step < 0 ifTrue: [start < stop] ifFalse: [stop < start]!
  54800.  
  54801. last
  54802.     "Answer the last <number> element of the receiver.
  54803.     This is not necessarily the same as the value of 'stop' 
  54804.     (e.g. if the step if non-integral)."
  54805.  
  54806.     self isEmpty ifTrue: [self errorSubscriptBounds: 1].
  54807.     ^stop - (stop - start \\ step)!
  54808.  
  54809. printOn: target
  54810.     "Append, to the <puttableStream> argument, target, a string whose characters 
  54811.     are a description of the receiver as a developer would want to see it."
  54812.  
  54813.     target
  54814.         nextPut: $(;
  54815.         print: self start;
  54816.         nextPutAll: ' to: ';
  54817.         print: self stop.
  54818.     self step = 1 ifFalse: [
  54819.         target
  54820.             nextPutAll: ' by: ';
  54821.             print: self step].
  54822.     target nextPut: $)!
  54823.  
  54824. publishedKeyedAspects
  54825.         "Answers a LookupTable of the published aspects of the receiver's keyed contents"
  54826.     
  54827.         ^LookupTable new
  54828.             !
  54829.  
  54830. setFrom: startInteger to: stopInteger by: stepInteger
  54831.     "Private - Initialize the receiver's instance variables."
  54832.  
  54833.     start := startInteger.
  54834.     stop := stopInteger.
  54835.     step := stepInteger
  54836. !
  54837.  
  54838. size
  54839.     "Answer the inclusive size of the receiver."
  54840.  
  54841.     ^self isEmpty 
  54842.         ifTrue: [0]
  54843.         ifFalse: [stop - start // step + 1]!
  54844.  
  54845. species
  54846.     "Answer the kind of <sequencedReadableCollection> that should result 
  54847.     from enumerations such as #collect: and #select: when applied against 
  54848.     the receiver.
  54849.     Note that this message helps to support the ANSI protocol refinements
  54850.     of the sequencedReadableCollection copying messages (e.g. #copyFrom:to:) 
  54851.     in the Interval protocol, without actually having to reimplement those 
  54852.     messages in the Interval class."
  54853.  
  54854.     ^Array!
  54855.  
  54856. start
  54857.     "Answer the first element of the receiver."
  54858.  
  54859.     ^start!
  54860.  
  54861. start: anInteger
  54862.     "Sets the first element of the receiver to anInteger"
  54863.  
  54864.     start := anInteger!
  54865.  
  54866. step
  54867.     "Answer the receiver's step."
  54868.  
  54869.     ^step
  54870. !
  54871.  
  54872. step: anInteger
  54873.     "Sets the step element of the receiver to anInteger"
  54874.  
  54875.     step := anInteger!
  54876.  
  54877. stop
  54878.     "Answer the end of the receiver's interval. Depending on the step, this is not necessarily
  54879.     the last element of the receiver."
  54880.  
  54881.     ^stop
  54882. !
  54883.  
  54884. stop: anInteger
  54885.     "Sets the last element of the receiver to anInteger"
  54886.  
  54887.     stop := anInteger! !
  54888.  
  54889. OLEEnumerator comment:
  54890. 'OLEEnumerator is a <sequencedReadableCollection> that wraps an OLE enumeration interface (IEnumXXXX). It provides an efficient way to treat an enumeration supplied by a COM object as a full-blown Smalltalk collection.'!
  54891. !OLEEnumerator class methodsFor!
  54892.  
  54893. onIEnum: anIEnum
  54894.     "Answer a new instance of the receiver which provides access via the Collection protocol 
  54895.     to the specified IEnum."
  54896.  
  54897.     ^self new
  54898.         interface: anIEnum
  54899.  
  54900.     ! !
  54901.  
  54902. !OLEEnumerator methodsFor!
  54903.  
  54904. add: newElement
  54905.     "OLE IEnums are immutable, and therefore not extensible."
  54906.  
  54907.     ^self shouldNotImplement!
  54908.  
  54909. approxSize
  54910.     "Private - Answer the approximate size of the receiver.
  54911.     Implementation Note: The size of enumerators must be calculated (no tally
  54912.     is kept), which is expensive, so we revert to the basic collection
  54913.     implementation."
  54914.  
  54915.     ^2!
  54916.  
  54917. at: index
  54918.     "Answer the element of the receiver at the specified index. If the index
  54919.     is out of bounds, raise an exception."
  54920.  
  54921.     | elem |
  54922.     elem := interface position: index-1; nextAvailable.
  54923.     ^elem isNil
  54924.         ifTrue: [self errorSubscriptBounds: index]
  54925.         ifFalse: [elem]!
  54926.  
  54927. at: index put: newElement
  54928.     "OLE IEnums are immutable."
  54929.  
  54930.     ^self shouldNotImplement!
  54931.  
  54932. basicFree
  54933.     "Private - Release any external resources held by the receiver."
  54934.  
  54935.     interface free!
  54936.  
  54937. collect: transformer
  54938.     "Evaluate the <monadicValuable> argument, transformer, for each of the 
  54939.     receiver's elements in the order defined by the receiver's implementation of #do:.
  54940.     Answer a new collection like the receiver containing the values returned by 
  54941.     transformer on each evaluation.
  54942.     Implementation Note: #size is very slow on an OLE enumerator (it has to be calculated
  54943.     by enumerating the collection), so override to avoid it."
  54944.  
  54945.     ^interface collect: [:elem | transformer value: elem]!
  54946.  
  54947. copyEmpty: anInteger
  54948.     "Private - Answer an empty copy of the receiver (which must be of the exact same class
  54949.     not just the same #species), with sufficient capacity for anInteger number of elements.
  54950.     Implementation Note: This is not possible for an OLEEnumerator, so answer an empty 
  54951.     <OrderedCollection>"
  54952.  
  54953.     ^self species new: anInteger!
  54954.  
  54955. copySize
  54956.     "Private - Answer the size of empty copy to create when performing various
  54957.     copying/collecting transformations against the receiver.
  54958.     Implementation Note: Override because #size is slow, and we copy into
  54959.     a dynamically extensible collection."
  54960.  
  54961.     ^self approxSize!
  54962.  
  54963. free
  54964.     "Release an external resources held by the receiver."
  54965.  
  54966.     interface notNil ifTrue: [
  54967.         self basicFree.
  54968.         interface := nil]!
  54969.  
  54970. from: start to: stop keysAndValuesDo: operation
  54971.     "Evaluate the <dyadicValuable>, operation, for each element of the receiver
  54972.     between the <integer> indices, start and stop, inclusive with the element and its
  54973.     index as respectively the second and first arguments. A BoundsError will be
  54974.     raised if either start or stop is out of bounds.
  54975.     Implementation Note: The superclass implementation would be very slow, because #at:
  54976.     is quite slow on IEnums due to the lack of easy random access."
  54977.  
  54978.     | elem index |
  54979.     index := start - 1.
  54980.     interface position: index.
  54981.     [(elem := interface nextAvailable) notNil and: [index < stop]] whileTrue: [
  54982.         operation value: (index:=index+1) value: elem].
  54983.     "Report any stop bounds error."
  54984.     stop > index
  54985.         ifTrue: [^self errorSubscriptBounds: stop].!
  54986.  
  54987. growSize
  54988.     "Private - Not growable."
  54989.  
  54990.     ^self shouldNotImplement!
  54991.  
  54992. interface: anIEnum
  54993.     "Private - Set the receiver's IEnum interface to be the argument."
  54994.  
  54995.     interface := anIEnum!
  54996.  
  54997. keysAndValuesDo: operation
  54998.     "Evaluate the <dyadicValuable>, operation, for each element of the receiver
  54999.     with the <integer> index of that element and the element itself as the arguments.
  55000.     Implementation Note: We must override this in order that #countElements can calculate
  55001.     the size without causing the infinite recursion
  55002.          #keysAndValuesDo:->#size->#countElements->#do:->#keysAndValuesDo: ... and so on."
  55003.  
  55004.     | index |
  55005.     index := 0.
  55006.     interface do: [:elem | operation value: (index := index + 1) value: elem]!
  55007.  
  55008. size
  55009.     "Answer the number of elements in the receiver.
  55010.     Implementation Note: We cannot cache the size because IEnums do not guarantee that 
  55011.     they remain constant, which is unfortunate since it is rather expensive to calculate."
  55012.  
  55013.     #todo "Use skip to advance over the collection in blocks until fails. Then reset to last known good 
  55014.         position and move forward in half the increment. Repeat until block size is 1 and reach the end.".
  55015.     ^self countElements!
  55016.  
  55017. species
  55018.     "Answer the class of object to be used when copying the receiver.
  55019.     For an OLEEnumerator, we copy to an appropriate Smalltalk class
  55020.     (Array because OLEEnumerators are fixed in size and typically static)."
  55021.  
  55022.     ^Array! !
  55023.  
  55024. SequencedGrowableCollection comment:
  55025. 'SequencedGrowableCollection is the abstract class of sequenceable, contractible, and extensible collections.
  55026.  
  55027. SequencedGrowableCollections comply with the ANSI protocols:
  55028.     Object
  55029.     collection
  55030.     extensibleCollection
  55031.     sequencedReadableCollection
  55032.     sequencedContractibleCollection
  55033.     sequencedCollection
  55034.     sequencedExtensibleCollection'!
  55035. !SequencedGrowableCollection methodsFor!
  55036.  
  55037. add: newElement
  55038.     "Append, and answer, newElement as the last element of the receiver."
  55039.  
  55040.     ^self addLast: newElement!
  55041.  
  55042. add: newElement after: target
  55043.     "Insert newElement as a new element of the receiver immediately after target. 
  55044.     Raise an exception if target is not present in the receiver. Answer newElement."
  55045.  
  55046.     ^self add: newElement afterIndex: 
  55047.         (self indexOf: target ifAbsent: [self errorNotFound: target])!
  55048.  
  55049. add: newElement afterIndex: index
  55050.     "Add newElement to the receiver immediately after the element currently at the
  55051.     specified <integer> index. index must be between 0 and the receiver's current 
  55052.     size (if not raise an exception). Answer newElement."
  55053.  
  55054.     ^self subclassResponsibility!
  55055.  
  55056. add: newElement before: target
  55057.     "Insert newElement as a new element of the receiver immediately before target. 
  55058.     Report an error if target is not present in the receiver. Answer newElement."
  55059.  
  55060.     ^self add: newElement beforeIndex: 
  55061.         (self indexOf: target ifAbsent: [self errorNotFound: target])!
  55062.  
  55063. add: newElement beforeIndex: index
  55064.     "Add newElement to the receiver immediately before the element currently at the specified
  55065.     <integer> index (i.e. the newElement will then have that index). index must be between 1 
  55066.     and the receiver's current size plus 1 (if not raise an exception). Answer newElement."
  55067.  
  55068.     ^self add: newElement afterIndex: index - 1!
  55069.  
  55070. addAll: newElements
  55071.     "Include all the elements of the argument, newElements, as the receiver's elements. 
  55072.     Answer newElements. Note that this modifies and answers the receiver, not a copy."
  55073.  
  55074.     ^self addAllLast: newElements!
  55075.  
  55076. addAll: newElements after: target
  55077.     "Insert the elements of the collection, newElements, as new elements of the 
  55078.     receiver immediately after target. Answer the newly added elements.
  55079.     Raise an exception if target is not present in the receiver.
  55080.     Implementation Note: We could use reverseDo: to avoid having to keep
  55081.     updating the index, but not all Collections understand #reverseDo:
  55082.     because they are not all ordered."
  55083.  
  55084.     | index |
  55085.     index := self indexOf: target ifAbsent: [^self errorNotFound: target].
  55086.     ^self addAll: newElements afterIndex: index!
  55087.  
  55088. addAll: newElements afterIndex: index
  55089.     "Add all of the elements in the <collection>, newElements, after the existing element of
  55090.     the receiver at the one-based <integer> index, index. Answer the newly added elements."
  55091.  
  55092.     newElements inject: index into: [:i :e | self add: e afterIndex: i. i + 1].
  55093.     ^newElements!
  55094.  
  55095. addAll: newElements before: target
  55096.     "Insert the elements of the collection, newElements, as a new element of the 
  55097.     receiver immediately before target. Answer the newly added elements.
  55098.     Report an error if target is not present in the receiver."
  55099.  
  55100.     | index |
  55101.     index := self indexOf: target ifAbsent: [^self errorNotFound: target].
  55102.     ^self addAll: newElements beforeIndex: index!
  55103.  
  55104. addAll: newElements beforeIndex: index
  55105.     "Add all of the elements in the <collection>, newElements, before the existing element of
  55106.     the receiver at the one-based <integer> index, index. Answer the newly added elements."
  55107.  
  55108.     ^self addAll: newElements afterIndex: index-1!
  55109.  
  55110. addAllFirst: newElements
  55111.     "Prepend all elements of the <collection> newElements to the receiver,
  55112.     in the order that they appear in newElements (as determined by
  55113.     its implementation of #do:). Answer newElements.
  55114.     Note that the ANSI standard specifies that newElements must comply with
  55115.     <sequencedCollection>, but we relax this to <collection> since this
  55116.     is implementable purely in terms of #do: (or #inject:into: as here)..
  55117.     Implementation Note: Avoid #reverseDo:, as not understood by all collections."
  55118.  
  55119.     newElements inject: 0 into: [:i :e | self add: e afterIndex: i. i + 1].
  55120.     ^newElements!
  55121.  
  55122. addAllLast: newElements
  55123.     "Append the elements of the <sequencedCollection>, newElements, to the receiver,
  55124.     in the order that they appear in newElements (as defined by its implementation
  55125.     of #do:). Answer newElements."
  55126.  
  55127.     newElements do: [:each | self addLast: each].
  55128.     ^newElements!
  55129.  
  55130. addFirst: newElement
  55131.     "Insert newElement as the first element of the receiver."
  55132.  
  55133.     ^self add: newElement afterIndex: 0
  55134. !
  55135.  
  55136. addLast: newElement
  55137.     "Insert newElement as the last element of the receiver."
  55138.  
  55139.     ^self add: newElement afterIndex: self size!
  55140.  
  55141. remove: oldElement ifAbsent: exceptionHandler
  55142.     "Remove oldElement from the receiver, and answer it. If oldElement is
  55143.     not present in the receiver, answer the result of evaluating 
  55144.     the niladic block, exceptionHandler."
  55145.  
  55146.     ^self removeAtIndex: (self indexOf: oldElement ifAbsent: [^exceptionHandler value])!
  55147.  
  55148. removeAll
  55149.     "Empty the receiver of all contents"
  55150.  
  55151.     ^self subclassResponsibility!
  55152.  
  55153. removeAtIndex: index
  55154.     "Remove, and answer, the element of the receiver at the specified 
  55155.     <integer> index, by shuffling elements which succeed it down one slot.
  55156.     Raise a <BoundsError> if there is no element with that index."
  55157.  
  55158.     ^self subclassResponsibility!
  55159.  
  55160. removeFirst
  55161.     "Remove and answer the first element of the receiver, 
  55162.     raising an exception if the receiver is empty."
  55163.  
  55164.     ^self removeFirstIfAbsent: [self errorSubscriptBounds: 1]!
  55165.  
  55166. removeFirstIfAbsent: exceptionHandler
  55167.     "Remove and answer the first element of the receiver, but if the
  55168.     receiver is empty answer the result of evaluating the <niladicValuable>,
  55169.     exceptionHandler."
  55170.  
  55171.     self isEmpty ifTrue: [^exceptionHandler value].
  55172.     ^self removeAtIndex: 1!
  55173.  
  55174. removeLast
  55175.     "Remove and answer the last element of the receiver, 
  55176.     raising an exception if the receiver is empty."
  55177.  
  55178.     ^self removeLastIfAbsent: [self errorSubscriptBounds: 1]!
  55179.  
  55180. removeLastIfAbsent: exceptionHandler
  55181.     "Remove and answer the last element of the receiver, but if the
  55182.     receiver is empty answer the result of evaluating the <niladicValuable>,
  55183.     exceptionHandler."
  55184.  
  55185.     self isEmpty ifTrue: [^exceptionHandler value].
  55186.     ^self removeAtIndex: self size! !
  55187.  
  55188. Array comment:
  55189. 'Array is the class of <ArrayedCollection>s whose elements are arbitraty <Object>s.
  55190.  
  55191. Array complies with the ANSI protocols:
  55192.     Object
  55193.     collection
  55194.     sequencedReadableCollection
  55195.     sequencedCollection
  55196.     Array'!
  55197. !Array class methodsFor!
  55198.  
  55199. with: element1 
  55200.     "Answer a new instance of the receiver containing the single 
  55201.     <Object> element, element1."
  55202.  
  55203.     <primitive: 157>
  55204.     ^super with: element1!
  55205.  
  55206. with: element1 with: element2 
  55207.     "Answer an instance of the receiver containing the <Object>
  55208.     arguments as its elements"
  55209.  
  55210.     <primitive: 157>
  55211.     ^super with: element1 with: element2!
  55212.  
  55213. with: element1 with: element2 with: element3 
  55214.     "Answer an instance of the receiver containing the <Object>
  55215.     arguments as its elements."
  55216.  
  55217.     <primitive: 157>
  55218.     ^super 
  55219.         with: element1
  55220.         with: element2
  55221.         with: element3!
  55222.  
  55223. with: element1 with: element2 with: element3 with: element4 
  55224.     "Answer an instance of the receiver containing the <Object>
  55225.     arguments as its elements."
  55226.  
  55227.     <primitive: 157>
  55228.     ^super 
  55229.         with: element1
  55230.         with: element2
  55231.         with: element3
  55232.         with: element4! !
  55233.  
  55234. !Array methodsFor!
  55235.  
  55236. addAnsweringIndex: newElement
  55237.     "Add newElement to the receiver by overwriting the first nil. If there are no nils
  55238.     then append it."
  55239.  
  55240.     ^self replaceIdentity: nil with: newElement!
  55241.  
  55242. asArray
  55243.     "Answer an instance of <Array> containing the same elements as the receiver.
  55244.     In this case, no conversion is required."
  55245.  
  55246.     ^self!
  55247.  
  55248. isLiteral
  55249.     "Answer whether the receiver can be represented as a literal (i.e. it has a printed
  55250.     representation which can be directly understood by the compiler)."
  55251.  
  55252.     ^self allSatisfy: [:element | element isLiteral]!
  55253.  
  55254. printPrefixOn: aStream
  55255.     "Private - Print a prefix string for the debug representation of the receiver on aStream."
  55256.  
  55257.     aStream nextPutAll: '#('!
  55258.  
  55259. refersToLiteral: anObject 
  55260.     "Private - Answer whether the receiver is a reference to the literal argument."
  55261.  
  55262.     self = anObject ifTrue: [^true].
  55263.     self do: [:each | (each refersToLiteral: anObject) ifTrue: [^true]].
  55264.     ^false!
  55265.  
  55266. storeOn: aStream 
  55267.     "Append to the <puttableStream> argument, target, an expression which when 
  55268.     evaluated will answer a collection similar to the receiver."
  55269.  
  55270.     "Implementation Note: The receiver has a literal form, so use that."
  55271.  
  55272.     aStream nextPutAll: '#('.
  55273.     self do: [:each | each storeOn: aStream] separatedBy: [aStream space].
  55274.     aStream nextPut: $)! !
  55275.  
  55276. ByteArray comment:
  55277. 'ByteArray is the class of <ArrayedCollection>s whose elements are bytes (i.e. <integer>s in the range 0..255).
  55278.  
  55279. ByteArray complies with the ANSI protocols:
  55280.     Object
  55281.     collection
  55282.     sequencedReadableCollection
  55283.     sequencedCollection
  55284.     ByteArray'!
  55285. !ByteArray class methodsFor!
  55286.  
  55287. elementSize
  55288.     "Private - Answer the size of the receiver's constituent elements in bytes."
  55289.  
  55290.     ^1.
  55291. !
  55292.  
  55293. fromAddress: anAddress length: anInteger
  55294.     "Answer a new instance of the receiver, of size anInteger, copied from the first anInteger
  55295.     bytes at the specified address."
  55296.  
  55297.     ^anAddress asExternalAddress
  55298.         replaceBytesOf: (self new: anInteger)
  55299.         from: 1 to: anInteger startingAt: 1
  55300. !
  55301.  
  55302. fromHexString: aString
  55303.     "Answer a new instance of the receiver instantiated from the contents of the hexadecimal <String> argument."
  55304.  
  55305.     | answer size |
  55306.     size := aString size / 2.
  55307.     size isInteger ifFalse: [self error: 'Invalid hex string (odd length)'].
  55308.     answer := self new: size.
  55309.     1 to: size do: [:i | | j |
  55310.         j := (i * 2)-1.
  55311.         answer at: i put: ((aString at: j) digitValue * 16) + ((aString at: j+1) digitValue)].
  55312.     ^answer
  55313.             
  55314. !
  55315.  
  55316. ±V.!! ░¥'*«Åà/ë;╗ö∙═∞╙┌╞╜▓¼]G╢⌐┼xgAY▄ùd₧Q@#|Hd¼┴
  55317. Xt!!J╖<>╦ΘΦ╫T╝▓≈╙╖ΦÆf_k █ⁿ~&╝▄├M]ç╙|½O▓=ö·XA,Φkæ₧TÖQg¡9ô¥═Γ├αgÇ▀╟âi║≡UHºSiçε>Çô≤@=╦Z╬Z₧G ╚jéVf┼Æ£éVf▓╖╕Φßí⌡bP╝á╢fT\    c6╬·W$yJò!!∞#«äjNb ╠Ç=Å_ò╝æ°δh≡▓┴┘Æ;⌡≡┘ ╠ 1ⁿrΘvZ≡±¬TΩF┬ê¥Ü┌O₧─¢ªK·9¿nΓ'╠Φ÷╠T%k#TφwÆσ?dêÜ]▄XDNfïclîΦ&τ6_êºπR<S    {û│╕░EÆΓE▓∞J▀╧┬╚-*TE┴░08éo╫∩▄╫»¢πñ╩Æà2÷1ΓºDXc┤╥¥╩&í{&·░┤┬└pÖâl¬çΓQQ░±·'├O~2Mâ┌∙NèΦ8éτ╝@╩ïUª+ùδ╩½@╨Γé?ÅúOΓ⌠ @-ºτÿò╒H)áSB╔▒≈X)╬Ü╛'÷Å⌡yò▌!!ß 3·═}OΣ:Hóä²╠╚W╔<ε±Öîñ╙ OS╫a
  55318. £E≥²ÇF°Ü╒Σñ-H£_'äΣæa½/¥╚OaéêΘ2▄┤á|¥r'╝╨░║ΩW╚plkπ¿τl%â@.N^@╠!!ΩXτ╠²^;─├óíN¬≤├╗jL    ─9╝Dh╗TWV╠(╣º₧{2ⁿ\P╜k ¼½-c¿ôÜü╘_g'W7M╖+╠╪╕Ñε>╧■▒h─╢≡g╟=jl#ûè«\≡Ü∩∙C╪≤ S▒&#∙àyjú╞▓∩Z■öM╬æ╙╩┌╕ß~ßn⌠    /Æ)C╧ìsdx⌐Σ·⌐≤*┤ENs█á~┴É┘'ìº]Wh{X∩bÜKv╪Æ¿rN╟=E 6⌐äçîRZá÷{ ·è╬3╘«êo┐2ª,0i┌╕w╕╠╣─Φ+∩≈@i%K(¿φ≤aôm²╧àùèD┘┘┤y░ñü{²pN₧■¢∞┐F─╫d≈ù≈g┼@ñ╛╫┌ùò0Å%M0╣>P @+÷uÅH█pX⌡+A@1òÆ£<}óë└ióXK├u╔é¼3╣o#V4Gï·░M╤Xσ├.L¬m╫,òWH)²>2╚Ω)╓:ÿ:║ ú««cl»▓V║▐/ú=RMò-ö╕≥+┘^zºµ╪²    èdÅ+4¼{ÿQ@=fp±τ*ó√^Ö.─╔c∩-┐ï└∙∙ô;- ∞ÿ!!╛πjΦ█╦#╟τb!
  55319.  
  55320. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ú╕3⌡▌K╝▓│▐α╞╫`V.r▀┐h;╕╠╥
  55321. °|■|ÉP│qûA≥PB ! !
  55322.  
  55323. !ByteArray methodsFor!
  55324.  
  55325. _sameAsString: comparand
  55326.     "Private - Answer whether the receiver collates the same as <readableString> 
  55327.     argument, comparand.
  55328.     This will only work if the receiver contains integers in the range of character
  55329.     values, if not an exception will be raised.
  55330.     Implementation Note: Double dispatched from String>>sameAs:."
  55331.  
  55332.     ^(comparand _collate: self asString) == 0!
  55333.  
  55334. = comperand
  55335.     "Answer whether the receiver is equivalent to the <Object>, comperand.
  55336.     Uses standard byte comparison primitive which checks for identical bytes and size.
  55337.  
  55338.     Primitive failure reasons:
  55339.         0 -    comperand is not the same class as the receiver."
  55340.  
  55341.     <primitive: 55>
  55342.     ^false!
  55343.  
  55344. addressAtOffset: anInteger
  55345.     "Answer the 32-bit address stored at the specified offset in the receiver."
  55346.  
  55347.     ^(self dwordAtOffset: anInteger) becomeAn: ExternalAddress!
  55348.  
  55349. asByteArray
  55350.     "Answer a <ByteArray> containing the same elements as the receiver.
  55351.     In this case no conversion is required."
  55352.  
  55353.     ^self!
  55354.  
  55355. αW;à╜â─µC╟∩╟°╔∞ù╦▌╗▓∙`bÖ₧ßIAioî─,WçMA9kUGj Äi ╖tV*░«# ╫T║∙┌⌠₧ßR<┘4jk ╚╣~'ó▌ÇNAÖ╙pεB÷nÖ√]JD<ΦiÜ╨JòMq¿@=┴Ç┬∩î»u╚ù₧╙j╝°VJ╢ ~Ʋ6═┌Q≤@;┼P╘₧G÷┴8╓JkÇ-┤▀åMb╢╝┐φáñ±mY╖⌠íFBdUFk;Çú8p[┌╬╩á9S^▀Æ*àNé∙▐╢╝h≈·æ┬ë-╝ß┼ üGZai╒B╧.Rz├â[ßT√èë▓é╙█┼└ΩD┤<┐fΣ=╤─⌠▐    U3$p    ╘!
  55356.  
  55357. asString
  55358.     "Answer a byte String containing the same elements as the receiver."
  55359.  
  55360.     | size |
  55361.     size := self basicSize.
  55362.     ^(String new: size) replaceFrom: 1 to: size with: self startingAt: 1!
  55363.  
  55364. basicDwordAtOffset: anInteger
  55365.     "Answer the unsigned 4 byte integer at offset (i.e. zero relative) 
  55366.     anInteger in the receiver.
  55367.  
  55368.     Primitive failure reasons:
  55369.         0 -    anInteger is not a SmallInteger
  55370.         1 -    anInteger is out of bounds (not in the range 1..receiver's size - 4)."
  55371.  
  55372.     | answer offset |
  55373.     <primitive: 120>
  55374.     offset := anInteger + 1.
  55375.     answer := 0.
  55376.     3 to: 0 by: -1 do: [:i |
  55377.         answer := (answer bitShift: 8) + (self basicAt: offset + i)].
  55378.     ^answer
  55379. !
  55380.  
  55381. basicDwordAtOffset: anInteger put: anObject
  55382.     "Private - Replace the internal contents of the receiver from offset anInteger with
  55383.     the first 4 bytes of anObject."
  55384.  
  55385.     <primitive: 121>
  55386.     (self validateOffset: anInteger) == 2 
  55387.         ifTrue: 
  55388.             ["Not a suitable value - could be non-Numeric, or not in unsigned 32-bit range.
  55389.             Atempt to coerce to Integer and retry. anObject may not understand asInteger."
  55390.  
  55391.             | intVal |
  55392.             intVal := anObject asInteger.
  55393.             (intVal >= 0 and: [intVal < 4294967295]) 
  55394.                 ifTrue: [^self basicDwordAtOffset: anInteger put: intVal]].
  55395.     ^self errorCantHold: anObject!
  55396.  
  55397. byteAtOffset: anInteger
  55398.     "Answer the byte at offset anInteger in the receiver"
  55399.  
  55400.     ^self basicAt: anInteger+1!
  55401.  
  55402. byteAtOffset: anInteger put: aByte
  55403.     "Replace the byte of the receiver at offset anInteger with aByte. Answer aByte."
  55404.  
  55405.     ^self basicAt: anInteger+1 put: aByte
  55406. !
  55407.  
  55408. bytesAtOffset: anInteger put: anExternalStructureOrByteObject
  55409.     "Replace the bytes of the receiver from offset anInteger (0 based)
  55410.     with those of the argument aVariableByteObject"
  55411.  
  55412.     self replaceFrom: anInteger+1 
  55413.         to: anInteger + anExternalStructureOrByteObject size
  55414.         with: anExternalStructureOrByteObject
  55415.         startingAt: 1!
  55416.  
  55417. byteSize
  55418.     "Private - Answer the size in bytes of this structure."
  55419.  
  55420.     ^self basicSize!
  55421.  
  55422. copy: aByteClass from: start to: stop
  55423.     "Private - Answer a copy of the bytes of the receiver starting at index start, 
  55424.     until index stop, inclusive, as an instance of the argument, aByteClass."
  55425.  
  55426.     | len answer |
  55427.     len := stop - start + 1.
  55428.     ^self replaceBytesOf: (aByteClass new: len)
  55429.         from: 1 to: len startingAt: start!
  55430.  
  55431. copyStringFrom: start to: stop
  55432.     "Answer a copy of the bytes of the receiver starting at index start, 
  55433.     until index stop, inclusive, as a String."
  55434.  
  55435.     ^self copy: String from: start to: stop!
  55436.  
  55437. copyToCOMTaskMemory
  55438.     "Answer a COMTaskMemory object containing a copy of the receiver's
  55439.     bytes."
  55440.  
  55441.     | size |
  55442.     size := self byteSize.
  55443.     ^(COMTaskMemory new: size)
  55444.         replaceFrom: 1 to: size with: self startingAt: 1!
  55445.  
  55446. doubleAtOffset: anInteger
  55447.     "Answer the double precision floating point value at offset (i.e. zero relative) 
  55448.     anInteger in the receiver, as a Smalltalk Float object (double precision).
  55449.  
  55450.     Primitive failure reasons:
  55451.         0 -    anInteger is not a SmallInteger
  55452.         1 -    anInteger is out of bounds (not in the range 1..receiver's size - 8)."
  55453.  
  55454.     <primitive: 128>
  55455.     self validateOffset: anInteger.
  55456.     ^self primitiveFailed!
  55457.  
  55458. doubleAtOffset: anInteger put: aFloat
  55459.     "Store the Smalltalk floating point Number, aFloat, as a double precision
  55460.     floating point value (e.g. a C double) at byte offset (i.e. zero based) anInteger 
  55461.     within the receiver. 
  55462.  
  55463.     Primitive failure reasons:
  55464.         0 -    anInteger is not a SmallInteger
  55465.         1 -    anInteger is out of bounds (not in the range 1..receiver's size - 8).
  55466.         2 -    aFloat is not a Float.
  55467.  
  55468.     If the argument is not a float, then the primitive is retried having converted it
  55469.     to a Float. This allows other number types to be passed as arguments."
  55470.  
  55471.     <primitive: 129>
  55472.     (self validateOffset: anInteger) == 2      "coerce to float and retry" 
  55473.         ifTrue: [^self doubleAtOffset: anInteger put: aFloat asFloat].
  55474.     ^self primitiveFailed!
  55475.  
  55476. dwordAtOffset: anInteger
  55477.     "Answer the unsigned 4 byte integer at offset (i.e. zero relative) 
  55478.     anInteger IN the receiver.
  55479.  
  55480.     Primitive failure reasons:
  55481.         0 -    anInteger is not a SmallInteger
  55482.         1 -    anInteger is out of bounds (not in the range 1..receiver's size - 4)."
  55483.  
  55484.     | answer |
  55485.     <primitive: 120>
  55486.     answer := 0.
  55487.     3 to: 0 by: -1 do: [:i |
  55488.         answer := (answer bitShift: 8) + (self byteAtOffset: anInteger + i)].
  55489.     ^answer!
  55490.  
  55491. dwordAtOffset: anInteger put: anObject
  55492.     "Store an unsigned 4 byte value at byte offset anInteger 
  55493.     within the receiver.
  55494.  
  55495.     Primitive failure reasons:
  55496.         0 -    anInteger is not a SmallInteger
  55497.         1 -    anInteger is out of bounds (not in the range 1..receiver's size - 4).
  55498.         2 -    anObject is not a SmallInteger or a 4-byte object
  55499.     "
  55500.     
  55501.     <primitive: 121>
  55502.     ^self retryDwordAtOffset: anInteger put: anObject!
  55503.  
  55504. floatAtOffset: anInteger
  55505.     "Answer the single precision floating point value at offset (i.e. zero relative) 
  55506.     anInteger in the receiver, as a Smalltalk Float object (double precision).
  55507.     N.B. To access a double precision value (e.g. a C double) use #doubleAt:
  55508.  
  55509.     Primitive failure reasons:
  55510.         0 -    anInteger is not a SmallInteger
  55511.     `    1 -    anInteger is out of bounds (not in the range 1..receiver's size - 4)."
  55512.  
  55513.     <primitive: 130>
  55514.     self validateOffset: anInteger.
  55515.     ^self primitiveFailed
  55516. !
  55517.  
  55518. floatAtOffset: anInteger put: aFloat
  55519.     "Store the Smalltalk floating point Number, aFloat, as a single precision
  55520.     floating point value (e.g. a C float) at byte offset (i.e. zero based) anInteger 
  55521.     within the receiver. N.B. Some loss of precision is likely, to store a Smalltalk
  55522.     Float as a double precision value in an ExternalBytes buffer, use #doubleAt:put:.
  55523.  
  55524.     Primitive failure reasons:
  55525.         0 -    anInteger is not a SmallInteger
  55526.         1 -    anInteger is out of bounds (not in the range 1..receiver's size - 4).
  55527.         2 -    aFloat is not a Float."
  55528.  
  55529.     <primitive: 131>
  55530.     (self validateOffset: anInteger) == 2     "coerce to float and retry" 
  55531.         ifTrue: [^self floatAtOffset: anInteger put: aFloat asFloat ].
  55532.     ^self primitiveFailed!
  55533.  
  55534. hash
  55535.     "Hash the bytes of the object using the standard byte hashing
  55536.     primitive (which should not fail)."
  55537.  
  55538.     <primitive: 106>
  55539.     ^VMLibrary default hashBytes: self count: self basicSize!
  55540.  
  55541. hexStoreOn: puttableStream
  55542.     "Print the literal string representation of the receiver to the <puttableStream>
  55543.     argument."
  55544.  
  55545.     puttableStream nextPut: $(; 
  55546.         print: self class; space; nextPutAll: #fromHexString:; space;
  55547.         nextPut: $'.
  55548.     self printHexOn: puttableStream.
  55549.     puttableStream nextPutAll: ''')'!
  55550.  
  55551. includes: target
  55552.     "Answer whether the argument, target, is one of the elements of the receiver.
  55553.     Implementation Note: Override superclass to provide a more efficient implementation."
  55554.  
  55555.     ^self identityIncludes: target!
  55556.  
  55557. indexOfSubCollection: targetSequence startingAt: start
  55558.     "Answer the <integer> index of the next occurrence within the 
  55559.     receiver of the <sequencedReadableCollection> targetSequence,
  55560.     starting at the <integer> index start. If there are no such occurrences, answer 0.
  55561.  
  55562.     Primitive Failure Reasons:
  55563.         0    - start is not a SmallInteger
  55564.         1    - start is out of bounds (not in the range 1..receiver's indexable size) 
  55565.         2    - targetSequence is not of the same class as the receiver.
  55566.  
  55567.     Implementation Note: The string search primitive is implemented using the 
  55568.     Boyer-Moore algorithm unless the receiver is less than 512 bytes long, in which
  55569.     case it isn't worth initializing the skip array in most cases, so a simple brute
  55570.     force search (much like that of the superclass) is used."
  55571.  
  55572.     <primitive: 149>
  55573.     ^super indexOfSubCollection: targetSequence startingAt: start!
  55574.  
  55575. isLiteral
  55576.     "Answer whether or not the receiver has a literal representation (probably its
  55577.     printString) which is directly recognised by the Compiler."
  55578.  
  55579.     ^true!
  55580.  
  55581. isNull
  55582.     "Answer whether the receiver is Null (i.e. equal to 0). 
  55583.     This message is useful way of testing for NULL pointers or handles."
  55584.  
  55585.     ^false!
  55586.  
  55587. longDoubleAtOffset: anInteger
  55588.     "Answer the 80-bit floating point value at offset (i.e. zero relative) anInteger in the 
  55589.     receiver, as a Smalltalk Float object (i.e. 64-bit precision, so some precision may be
  55590.     lost).
  55591.  
  55592.     Primitive failure reasons:
  55593.         0 -    anInteger is not a SmallInteger
  55594.         1 -    anInteger is out of bounds (not in the range 1..receiver's size - 8)."
  55595.  
  55596.     <primitive: 159>
  55597.     self validateOffset: anInteger.
  55598.     ^self primitiveFailed!
  55599.  
  55600. notNull
  55601.     "Answer whether the receiver is not Null (i.e. not equal to 0)"
  55602.  
  55603.     ^self isNull == false!
  55604.  
  55605. printHexOn: aStream
  55606.     "Append a hex string representation of the receiver to the <puttableStream> argument."
  55607.  
  55608.     self do: [:byte |
  55609.         aStream 
  55610.             nextPut: (Character digitValue: (byte // 16));
  55611.             nextPut: (Character digitValue: (byte \\ 16))]!
  55612.  
  55613. printHexString
  55614.     "Answer a hex string representation of the receiver to the <puttableStream> argument."
  55615.  
  55616.     | stream |
  55617.     stream := String writeStream: self size * 2+2.
  55618.     stream nextPut: $'.
  55619.     self printHexOn: stream.
  55620.     stream nextPut: $'.
  55621.     ^stream contents!
  55622.  
  55623. printPrefixOn: aStream
  55624.     "Private - Print a prefix string for the debug representation of the receiver on aStream."
  55625.  
  55626.     aStream nextPutAll: '#['!
  55627.  
  55628. printSuffixOn: aStream
  55629.     "Private - Print a suffix string for the debug representation of the receiver on aStream."
  55630.  
  55631.     aStream nextPut: $]!
  55632.  
  55633. qwordAtOffset: offset
  55634.     "Answer an <integer> representing the unsigned 8 byte integer at 
  55635.     <integer> offset (i.e. zero relative), offset, in the receiver."
  55636.  
  55637.     #todo "Add a primitive (easy)".
  55638.     ^((self dwordAtOffset: offset+4) bitShift: 32) +
  55639.         (self dwordAtOffset: offset)!
  55640.  
  55641. qwordAtOffset: offset put: value
  55642.     "Replace the unsigned 8 byte integer at <integer> offset (i.e. zero relative), offset,
  55643.     in the receiver, with the <integer> argument, value."
  55644.  
  55645.     self 
  55646.         dwordAtOffset: offset put: (value bitAnd: 16rFFFFFFFF);
  55647.         dwordAtOffset: offset+4 put: (value bitShift: -32)!
  55648.  
  55649. replaceBytesOf: aByteObject from: start to: stop startingAt: fromStart
  55650.     "Private - Standard method for transfering bytes from one variable
  55651.     byte object to another, normally double dispatched from #replaceFrom:to:with:startingAt:
  55652.  
  55653.     Primitive Failure Reasons:
  55654.         0     - fromStart is not a SmallInteger.
  55655.         1    - stop is not a SmallInteger.
  55656.         2    - start is not a SmallInteger.
  55657.         3    - aByteObject is not a byte object
  55658.         4    - 'from' or 'to' interval is out-of-bounds
  55659.     "
  55660.  
  55661.     | fromOffset |
  55662.     <primitive: 142>
  55663.     fromOffset := fromStart - start.
  55664.     stop to: start by: -1 do: [:i | aByteObject at: i put: (self basicAt: i + fromOffset)].
  55665.     ^aByteObject!
  55666.  
  55667. replaceFrom: start to: stop with: aByteObject startingAt: fromStart
  55668.     "Standard method for transfering bytes from one variable
  55669.     byte object to another. See String>>replaceFrom:to:with:startingAt:."
  55670.  
  55671.     aByteObject replaceBytesOf: self from: start to: stop startingAt: fromStart!
  55672.  
  55673. retryDwordAtOffset: anInteger put: anObject
  55674.     "Private - Fallback code for storing unsigned word into the reciever when a primitive fails.
  55675.     Either raises an appropriate error, or converts the argument to an Integer and retries."
  55676.  
  55677.     (self validateOffset: anInteger) == 2 
  55678.         ifTrue: 
  55679.             ["Not a suitable value - could be non-Numeric, or not in signed 16-bit range.
  55680.             Attempt to coerce to Integer and retry. anObject may not understand asInteger."
  55681.  
  55682.             | intVal |
  55683.             intVal := anObject asInteger.
  55684.             (intVal >= 0 and: [intVal < 4294967295]) 
  55685.                 ifTrue: [^self dwordAtOffset: anInteger put: intVal]].
  55686.     ^self errorCantHold: anObject!
  55687.  
  55688. retrySWordAtOffset: offset put: anObject
  55689.     "Private - Fallback code for storing signed word into the reciever when a primitive fails.
  55690.     Either raises an appropriate error, or converts the argument to an Integer and
  55691.     retries."
  55692.  
  55693.     | int |
  55694.     (self validateOffset: offset) == 2 ifTrue: [
  55695.         "Not a suitable value - could be non-Numeric, or not in signed 16-bit range.
  55696.         Attempt to coerce anObject and retry. anObject may not understand asInteger."
  55697.         int := anObject asInteger.
  55698.         (int >= -16r8000 and: [int < 16r8000])
  55699.             ifTrue: [^self swordAtOffset: offset put: int]].
  55700.     ^self errorCantHold: anObject!
  55701.  
  55702. retryWordAtOffset: offset put: anObject
  55703.     "Private - Fallback code for storing unsigned word into the reciever when a primitive fails.
  55704.     Either raises an appropriate error, or converts the argument to an Integer and retries."
  55705.  
  55706.     | int |
  55707.     (self validateOffset: offset) == 2 ifTrue: [
  55708.         "Not a suitable value - could be non-Numeric, or not in signed 16-bit range.
  55709.         Attempt to coerce to Integer and retry. anObject may not understand asInteger."
  55710.         int := anObject asInteger.
  55711.         (int >= 0 and: [int < 16rFFFF])
  55712.             ifTrue: [^self wordAtOffset: offset put: int]].
  55713.     ^self errorCantHold: anObject!
  55714.  
  55715. sbyteAtOffset: anInteger
  55716.     "Answer the signed 8-bit <Integer> at offset anInteger in the receiver"
  55717.  
  55718.     | answer |
  55719.     answer := self byteAtOffset: anInteger.
  55720.     ^answer >= 16r80
  55721.         ifTrue: [(16r100 - answer) negated]
  55722.         ifFalse: [answer]!
  55723.  
  55724. sbyteAtOffset: anInteger put: aByte
  55725.     "Replace the byte of the receiver at offset anInteger with aByte. Answer aByte."
  55726.  
  55727.     ^self byteAtOffset: anInteger put: (255 bitAnd: aByte)!
  55728.  
  55729. sdwordAtOffset: anInteger
  55730.     "Answers the signed 4 byte integer at byte offset anInteger in the receiver.
  55731.  
  55732.     Primitive failure reasons:
  55733.         0 -    anInteger is not a SmallInteger
  55734.         1 -    anInteger is out of bounds."
  55735.  
  55736.     | answer |
  55737.     <primitive: 122>
  55738.     answer := self dwordAtOffset: anInteger.
  55739.     ^answer >= 16r80000000
  55740.         ifTrue: [(answer bitXor: 16rFFFFFFFF) bitInvert]
  55741.         ifFalse: [answer]!
  55742.  
  55743. sdwordAtOffset: anInteger put: anObject
  55744.     "Store anObject as a signed integer at anInteger offset in the receiver. anInteger must 
  55745.     be representable in 32-bits. Uses the dwordAtOffset:put: primitive."
  55746.  
  55747.     <primitive: 123>
  55748.     anObject asInteger isSDWORD ifFalse: [self errorCantHold: anObject].
  55749.     1 to: 4 do: [:index | self basicAt: anInteger+index put: (anObject at: index)].
  55750.     ^anObject!
  55751.  
  55752. sqwordAtOffset: anInteger
  55753.     "Answer the signed 8 byte integer at offset (i.e. zero relative) 
  55754.     anInteger in the receiver."
  55755.  
  55756.     ^((self sdwordAtOffset: anInteger+4) bitShift: 32) +
  55757.         (self dwordAtOffset: anInteger)!
  55758.  
  55759. sqwordAtOffset: offset put: value
  55760.     "Replace the signed 64-bit integer at the specified <integer> offset (i.e. zero relative)
  55761.     in the receiver, with the <integer> argument, value."
  55762.  
  55763.     self 
  55764.         dwordAtOffset: offset put: (value bitAnd: 16rFFFFFFFF);
  55765.         sdwordAtOffset: offset+4 put: (value bitShift: -32)!
  55766.  
  55767. storeOn: puttableStream
  55768.     "Print the literal string representation of the receiver to the <puttableStream>
  55769.     argument."
  55770.  
  55771.     self printPrefixOn: puttableStream.
  55772.     1 to: self size do: [:i | 
  55773.         (self at: i) printDigitsOn: puttableStream base: 10.
  55774.         puttableStream nextPut: $ ].
  55775.     self printSuffixOn: puttableStream.!
  55776.  
  55777. swordAtOffset: anInteger
  55778.     "Answer the signed 2 byte integer at offset (i.e. zero relative) anInteger
  55779.     in the receiver."
  55780.  
  55781.     | answer |
  55782.     <primitive: 126>
  55783.     answer := self wordAtOffset: anInteger.
  55784.     ^answer >= 16r8000
  55785.         ifTrue: [(16r10000 - answer) negated]
  55786.         ifFalse: [answer]!
  55787.  
  55788. swordAtOffset: anInteger put: anObject
  55789.     "Store a signed 2 byte value at byte offset anInteger within the receiver (which is the 
  55790.     same as storing an unsigned value). If anObject is not representable as a 16-bit
  55791.     signed (Small)Integer, then raise a 'cannot hold' error.
  55792.  
  55793.     Primitive failure results:
  55794.         0 -    anInteger is not a SmallInteger
  55795.         1 -     anInteger is out of bounds
  55796.         2 -    anObject is not a SmallInteger
  55797.         3 -    anObject is not in the range -32768..32767 (i.e. out of signed 16-bit range)."
  55798.  
  55799.     <primitive: 127>
  55800.     ^self retrySWordAtOffset: anInteger put: anObject!
  55801.  
  55802. validateOffset: anInteger
  55803.     "Private - Primitive failure checking code for validating an offset argument to be
  55804.     called immediately after a buffer accessing primitive has failed. Raises an error
  55805.     if anInteger is not a valid offset, or the primitive error code."
  55806.  
  55807.     | code |
  55808.     code := Processor activeProcess primitiveFailureCode.
  55809.     code < 2 ifTrue: [    "Erroneous offset parameter"
  55810.         ^code == 0 
  55811.             ifTrue: [Error nonIntegerIndex: anInteger]
  55812.             ifFalse: [self errorSubscriptBounds: anInteger]].
  55813.     ^code!
  55814.  
  55815. wordAtOffset: anInteger
  55816.     "Answer the unsigned 2 byte integer at offset (i.e. zero relative) anInteger in the receiver. 
  55817.     On iX86 the high and low order bytes are reversed; i.e. the bytes are ordered least 
  55818.     significant first.
  55819.  
  55820.     Primitive failure reasons:
  55821.         0 -    anInteger is not a SmallInteger.
  55822.         1 -    anInteger is out of bounds."
  55823.  
  55824.     | answer |
  55825.     <primitive: 124>
  55826.     answer := 0.
  55827.     1 to: 0 by: -1 do: [:i |
  55828.         answer := (answer bitShift: 8) + (self byteAtOffset: anInteger + i)].
  55829.     ^answer!
  55830.  
  55831. wordAtOffset: anInteger put: anObject
  55832.     "Store an unsigned 16-bit value at byte offset anInteger within the receiver.
  55833.     If anObject is not representable as a 16-bit unsigned (Small)Integer, then 
  55834.     raise a 'cannot hold' error.
  55835.  
  55836.     Primitive failure reasons:
  55837.         0 -    anInteger is not a SmallInteger.
  55838.         1 -    anInteger is out of bounds.
  55839.         2 -    anObject is not a SmallInteger
  55840.         3 -    anObject is not in the range -32768..32767 (i.e. out of signed 16-bit range)."
  55841.  
  55842.     <primitive: 125>
  55843.     ^self retryWordAtOffset: anInteger put: anObject! !
  55844.  
  55845. RunArray comment:
  55846. ''!
  55847. !RunArray class methodsFor!
  55848.  
  55849. new
  55850.     "Answer a new, empty, instance of the receiver."
  55851.  
  55852.     ^self runs: Array new values: Array new!
  55853.  
  55854. new: anInteger
  55855.     "Answer a new instance of the receiver with anInteger nil elements."
  55856.  
  55857.     ^self new: anInteger withAll: nil!
  55858.  
  55859. new: anInteger withAll: anObject
  55860.     "Answer a new instance of the receiver with anInteger elements which are all 
  55861.     the argument, anObject."
  55862.  
  55863.     ^anInteger == 0 
  55864.         ifTrue: [self new]
  55865.         ifFalse: [self runs: (Array with: anInteger) values: (Array with: anObject)]!
  55866.  
  55867. runs: runsArray values: valuesArray
  55868.     "Answer a new instance of the receiver with the specified runs and values.
  55869.     N.B. The two arrays must be the same size."
  55870.  
  55871.     ^self basicNew
  55872.         runs: runsArray values: valuesArray! !
  55873.  
  55874. !RunArray methodsFor!
  55875.  
  55876. at: anInteger
  55877.     "Answer the element at index, anInteger, in the receiver."
  55878.  
  55879.     | index |
  55880.     index := 0.
  55881.     1 to: runs size do: [:i |
  55882.         index := index + (runs at: i).
  55883.         anInteger <= index
  55884.             ifTrue: [^values at: i]].
  55885.     ^self errorSubscriptBounds: anInteger!
  55886.  
  55887. at: index put: newElement
  55888.     "Replace the element of the receiver at the specified <integer> index with 
  55889.     the <Object> argument, newElement. If the index is out of bounds, raise 
  55890.     a BoundsError.
  55891.  
  55892.     Implementation Note: RunArrays are not mutable."
  55893.  
  55894.     ^self shouldNotImplement
  55895. !
  55896.  
  55897. postCopy
  55898.     "Apply any final flourish to the copy that may be required
  55899.     in order to ensure that the copy does not share any state with
  55900.     the original, apart from the elements. Answer the receiver.
  55901.     In the case of a RunArray we need to copy the runs and values arrays."
  55902.  
  55903.     super postCopy.
  55904.     values := values copy.
  55905.     runs := runs copy!
  55906.  
  55907. resize: anInteger
  55908.     "Run arrays are not extensible"
  55909.  
  55910.     ^self shouldNotImplement
  55911. !
  55912.  
  55913. runs: runsArray values: valuesArray
  55914.     "Private - Set the receiver's instance variables."
  55915.  
  55916.     runs := runsArray.
  55917.     values := valuesArray!
  55918.  
  55919. runsAndValuesDo: operation
  55920.     runs with: values do: operation!
  55921.  
  55922. runStartAndValueAt: anInteger
  55923.     "Private - Answer an association between the <dyadicValuable> 
  55924.     operation for the element of the receiver at the specified index 
  55925.     and the index of the start of the run in which that element occurs.
  55926.     The run-start is the key, the element the value."
  55927.  
  55928.     | runStart |
  55929.     runStart := 1.
  55930.     1 to: runs size do: [:i | | nextRun |
  55931.         nextRun := runStart + (runs at: i).
  55932.         nextRun > anInteger
  55933.             ifTrue: [^runStart -> (values at: i)].
  55934.         runStart := nextRun].
  55935.     ^self errorSubscriptBounds: anInteger!
  55936.  
  55937. runStartAt: anInteger
  55938.     "Answer the index of the start of the run which includes the index anInteger (i.e. the index of
  55939.     the first element in the receiver in the run of elements equal to the element at anInteger)."
  55940.  
  55941.     | index |
  55942.     index := 1.
  55943.     runs do: [:run |
  55944.         (index + run) > anInteger
  55945.             ifTrue: [ ^index ].
  55946.         index := index + run].
  55947.     ^self errorSubscriptBounds: anInteger
  55948. !
  55949.  
  55950. size
  55951.     "Answer the number of elements in the receiver."
  55952.  
  55953.     | tally |
  55954.     tally := 0.
  55955.     1 to: runs size do: [:i | tally := tally + (runs at: i)].
  55956.     ^tally! !
  55957.  
  55958. String comment:
  55959. 'String is the class of <ArrayedCollection>s whose elements are <Character>s.
  55960.  
  55961. N.B. Dolphin Strings are, unlike Smalltalk-80 strings, null terminated. Space for the null terminator is implicity included when a String is allocated, but is not reported when the size of the String is requested.
  55962.  
  55963. String complies with the following ANSI protocols:
  55964.     Object
  55965.     magnitude
  55966.     collection
  55967.     sequencedReadableCollection
  55968.     sequencedCollection
  55969.     readableString
  55970.     String'!
  55971. !String class methodsFor!
  55972.  
  55973. αV5, ╜ƒ7s·áé.î-≥╣àÑ╝τ═▄¿≤▒V≥√ßu`_S└─*ZÆG&oH@+≡┴[l#L╖<~╗╗)∙▀N ▒≈╢É╖ô9âqLol√«3╖ùÇJ]ùƒf╜
  55974. ÷iƒA■T+Σ`▀╩V▄/┼9├Ç╞σ╔«g╚ ìëÆeε■Q╢h;ÉΩ0█╓IΓSh▀▄÷!!e╣╙a╥G.╫6Ñ╘├P|╢εδεσí≥iY╜á╝gCGKi4╬φ9cJS▌┬Ö∩4UmC╬äoƒRé░╪╢╝u∞┐┴╬¢-░ú╞Åw8╡r√C4P∞┤)╠hMΘ
  55975. ▐Äò╬╓Fƒ▀╫πAα?┤+Φ àε⌡╧OlKJ    < 3╙π%`â1ÖA═Ufδ
  55976.     î≈"Γ6▌▒Ω%2OYN┘╨╞▄V'Ʊ]3≈δPÅÉ╤│FU:)/≥ -)ö~╢Θ╩╙!
  55977.  
  55978. elementSize
  55979.     "Answer the size of the elements of the receiver in bytes."
  55980.  
  55981.     ^1!
  55982.  
  55983. ΣH"06░╗+9┐≤╠#ï;Φ╞ⁿíö╛¥σ¼√│RW║√ì;RFE┼ü,âWAj2~K
  55984. ΣÅUU2]╢G░«~║▌N╗ñ≈è°Åçf[kn╬ⁿl ╝╚┘MÖ₧{║P÷rûAΦYFxî÷█AêGfó0ôå┌µ╔αdüù█çt
  55985. ε¡^J╢e~É▒s╫╤[εS*╧K╙²>-╣╬v╞K|╙q▄╢Ωj{º½╕ΩΦ╝┤oR╝á╛`J`rçτ"tLD└├Qâ▓d1S@╙ä+╦[ä⌡╨╝σ/ª╫δá≡WïΩ╟╞$KO^ⁿ,æe6δ╖]╥x^╢FÑÆûé┘u÷╝¼ÅK≥41╢xΣià▄δ┌@)_    @3σ2ü├4uö    !
  55986.  
  55987. empty
  55988.     "Answer an empty String instance. It is shared and should not be modified.
  55989.     N.B. The compiler generates reference to a shared empty string in any case
  55990.     so there should never be more than one empty literal string."
  55991.  
  55992.     ^''!
  55993.  
  55994. formatMessage: anIntegerId in: hModule withArguments: arguments
  55995.     "Answer a String which is a message formatted from the format String with the
  55996.     specified id in the specified module, with arguments substituted from
  55997.     argumentCollection."
  55998.  
  55999.     ^(self fromId: anIntegerId in: hModule) formatWithArguments: arguments!
  56000.  
  56001. formatMessage: anIntegerId withArguments: argumentCollection
  56002.     "Answer a String which is a message formatted from the format String with the
  56003.     specified id in the specified module, with arguments substituted from
  56004.     argumentCollection."
  56005.  
  56006.     ^self 
  56007.         formatMessage: anIntegerId
  56008.         in: SessionManager current defaultResourceLibrary
  56009.         withArguments: argumentCollection!
  56010.  
  56011. formatSystemMessage: anIntegerId withArguments: arguments
  56012.     "Answer a String which is a message formatted from the format String with the
  56013.     specified id in the specified module, with arguments substituted from
  56014.     argumentCollection."
  56015.  
  56016.     ^KernelLibrary default 
  56017.         formatMessage: anIntegerId 
  56018.         source: 0
  56019.         flags: FORMAT_MESSAGE_FROM_SYSTEM
  56020.         withArguments: arguments!
  56021.  
  56022. fromAddress: anAddress
  56023.     "Answer a new String instantiated from the null terminated string at anAddress.
  56024.     Implementation note: We can use the external library call primitive to do the 
  56025.     job for us by performing a simple nop which returns the original pointer (_strninc()
  56026.     has the useful property that it returns NULL for NULL argument too)."
  56027.  
  56028.     ^VMLibrary default stringFromAddress: anAddress!
  56029.  
  56030. fromAddress: anAddress length: anInteger
  56031.     "Answer a new String, of length anInteger, copied from the first anInteger
  56032.     characters of aString."
  56033.  
  56034.     ^anAddress isNull 
  56035.         ifFalse: [
  56036.             anAddress asExternalAddress
  56037.                 replaceBytesOf: (self new: anInteger)
  56038.                 from: 1 to: anInteger startingAt: 1 ]
  56039. !
  56040.  
  56041. fromAtomId: anInteger
  56042.     "Answer a new string which is a copy of the atom with id anInteger."
  56043.  
  56044.     | atomName |
  56045.     ^(atomName := String new: 255)
  56046.         leftString: (KernelLibrary default getAtomName: anInteger lpBuffer: atomName nSize: atomName basicSize)!
  56047.  
  56048. fromId: anInteger
  56049.     "Answer a new String loaded from resources."
  56050.  
  56051.     ^self fromId: anInteger in: SessionManager current defaultResourceLibrary!
  56052.  
  56053. fromId: resourceId in: anExternalLibraryOrHandle
  56054.     "Answer a new String loaded from the resources of the module with handle, anExternalLibraryOrHandle."
  56055.  
  56056.     | answer len |
  56057.     answer := self new: 256.
  56058.     (len := UserLibrary default 
  56059.         loadString: anExternalLibraryOrHandle asParameter 
  56060.         uID: resourceId 
  56061.         lpBuffer: answer 
  56062.         nBufferMax: answer size) isZero
  56063.             ifTrue: [UserLibrary default systemError].
  56064.     ^answer leftString: len!
  56065.  
  56066. fromString: aString
  56067.     "Answer a new instance of the receiver copied from aString."
  56068.  
  56069.     | size |
  56070.     size := aString size.
  56071.     ^aString
  56072.         replaceBytesOf: (self new: size)
  56073.         from: 1 to: size startingAt: 1!
  56074.  
  56075. fromUnicodeString: anAddressOrUnicodeString
  56076.     "Answer a single byte String representation of the Unicode string at the specified
  56077.     address."
  56078.  
  56079.     | answer size lib |
  56080.     lib := KernelLibrary default.
  56081.     (size := lib
  56082.         wideCharToMultiByte: 0
  56083.         dwFlags: 0
  56084.         lpWideCharStr: anAddressOrUnicodeString
  56085.         cchWideChar: -1
  56086.         lpMultiByteStr: nil
  56087.         cchMultiByte: 0
  56088.         lpDefaultChar: nil
  56089.         lpUsedDefaultChar: nil) == 0
  56090.             ifTrue: [lib systemError].
  56091.     answer := self new: size-1.
  56092.     lib
  56093.         wideCharToMultiByte: 0
  56094.         dwFlags: 0
  56095.         lpWideCharStr: anAddressOrUnicodeString
  56096.         cchWideChar: -1
  56097.         lpMultiByteStr: answer
  56098.         cchMultiByte: answer basicSize
  56099.         lpDefaultChar: nil
  56100.         lpUsedDefaultChar: nil.
  56101.     ^answer!
  56102.  
  56103. icon
  56104.     "Answers an Icon that can be used to represent this class"
  56105.  
  56106.     ^##(self) defaultIcon!
  56107.  
  56108. lineDelimiter
  56109.     "Answer an instance of the receiver containing the host system end-of-line 
  56110.     character sequence (a Cr/Lf pair). This is a method of String rather than
  56111.     Character because the answer will always be a String."
  56112.  
  56113.     ^self with: Character cr with: Character lf!
  56114.  
  56115. newAspect: aspectClass name: aSymbol 
  56116.         "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  56117.         which is appropriate for representing aspects of the receiver's type."
  56118.     
  56119.         ^aspectClass string: aSymbol!
  56120.  
  56121. ±K.!!=╢╗+9┐─µC╟∩╟°╔∞ù╦▌╗▓∙v[½╛╥urDe╞û+QâJV/0PgσÆ^Mif]ªlAo▒«.ε₧Rí╣ú¢σ▄\
  56122. ÿ4JgsÜ╣u&½█╬XD╒èpεT┐iÿAΦYJdRêeæ╤MöGf∞    2╫¢╤≤╧┤zç╤┘■b─ÿihÆS>I!
  56123.  
  56124. ±V.!!í¢:&╛ê₧-É2Σ┌√û╛╓═╥É≤¿V║╖┼vwME╤▐~W¢ZI.kHP+°àKc%[¬s]y°δ)⌠┌K╗≈╕É¡Åàs[
  56125. │■] º▀┴MM╒[╙1páFñ|ä╝PAI7⌠pÅ╦M▄Cf½1╓£╫╢┼«`£ æÅÜ}º■Y▒t oçΓ6╨╦ΦO;├╬÷m=Θ╥l╓Cl╠:é╚æAu╛≡┤╛ìl┴αaN╛σªFBcIGKr:ïJΓ7dBU╟ìÅ▓Z5AI▐┴-Æ₧⌡æΣ┘M┴ùÑΦ⌐δ»ë ├:GR▓x╝ qLßú`╨yT■J▐àû¥▄÷╝¿î+▌ ╢n∞6╦≤∙╦Ig(F)⌠m╙▐+%à<Ü▐
  56126. FWnânt═≥&ú +╟╖√G$.
  56127. Qz┘▄▐▄ÄτU8▓ⁿ]ûÜæ═%6SEQ═■!!C1özÆ≈╡╕gÑ╖ß║┬Ä╧▄OÑ─DE7╡ƒèS▀"¼v& ≤╗≡┴╨+aéÄl░üⁿXQªⁿ╗(ÅL4 ô╓╝BÇí#äó²WïùKª=_Éá⌐╞i≥ ñ?àîg∞òh+⌐║ÿª peL├)k┴ñ╨_1█╘≈Eƪæh[Γ▐6Hε/8⌐█8π5∩╠│Γ╒▐4░≡╨ê╡¥GEÖf ÉYσ²╙T°éî░÷%H îZJ*ÄΣòzεc┘¼(gîŬ;▌°σ7¥_╘i~╝╦ô½╩yqkª≤≤Nu4é9|F^╓o∙m¼ß¢8)à╩¬┤Gºá╟¡nOüq δMs¬]#Z╙'╣╗¢hq╛ZY▓8àº*tπ·░àp▒Ye\"Kπ}ê╪» ºΓ/╟Φ▒êσ⌡(└4|5G≥Σ²M⌠Ö∩ⁿ_╚πσ&7&≤å:`¡╟E┐∙╖îD╔ÆOìÆ╚Φ┼z3¬v⌠%9Ç3C εû
  56128. =░≥╙║δyíFeóëºÆ≥0ë╖Z['zZ·7Ü@"╬êΣ(╖iM#:»∞ε±>Pστav√─╬vÄ@╓∩╪6⌠h~|ôδ*╝tê▒╨╜{╖╣i-?9▓·╗$½X»█ï╝├@┘ß⌡t»└φç}╩─¿∙¿S¥Θnµì╙w├Gí╖Rôµ[╦╓[δI~Xo└d,jJSú7ò%ï5EX╗c$αδy╫|∞ë▄~εWΓ╡ α[╦z*)u«°¬W╦X∞╩%F║`₧oÆ6jÜ[½ÉP}▐-╞s⌐!!±±≈╓╪╓╗#¿ NL│x┴ìï+/┌^zuα$ß¿ É%╟pX∩^ÅQM1rp╡∞!!ú√pà,─Σ1Φt⌠∞å+Σ⌡₧;!!Γó└n ╧wZδ⌡╦<å±&╖òg[╗
  56129. FGÆk╓û╒b≈│ΘKcæ┼3┐╩₧┼ìPÑ╗Bî╪Z£üûΩΣ
  56130. p{iëZ╦PëÄ═╤ ║Ç.Ñ.÷5δß<Θ∞└X±φ╫ßìcày½Wb¢e+ O¬+█╓┐├Y▀6ÿ5²╡'{=_╖₧╦╢KFìπ ÉZ╤º╛αj└òT┘]$É┐84═?çTí(òvóΣ?.╠(r»╡▄╛öjµy╛Sn═5.█┼êá0ô╢_ì╨°uöIⁿ»1φ╣{Ωÿ▐╨ ß└Στ&┼N╡    v?█`»kΘ║j╤@7_=[2╥/6g▀╜"G°íwfæ'╜╤╛╔tG╩&╘∙─ÿ∙╤îí[J∞┘▀πìvBƒ\º╕o\Ä╬φ\Σ┘á|R²▒╩{å■º¼F3-%äl{ëj╧ⁿ=₧┬π╨¼Å8╬²Ze╨τP\PQn∙╥Æï┌)╡YÇ╩░ì8≡}ÿ¼≤{═ε╛╘-[oñÿ+╢²·╠╕Pⁿü]▐]╨º≡û÷╖ö║-┤╣Ä))d    M5mE5²┌p╖├/▓`╟α(½ÿτ⌐╖òò«┐╨SÇ¥░t¿-αù<ç^~└
  56131. ]Zna>≈≈|≈╥╝≤≤╖▌ ì╘S|@äoε2²»∞aöi╛Ö╞█╥s╬│G2áεâ│∞:▀┐≥séUT}3Ç╪RÆì*▐s4î≤╛`Ñ▌─p┼ⁿ ╒e■f╩C╚^ÄêS`V╢9«ç@⌡⌠┴╪ ╗Wì╤╖.Ä u÷∞f=εr@╜Lú4⌠"$2MΣ-b÷£2─oΣlq╢cQ┬▀$£┬u≤ªâ╧äö£*f#u≥π)≈¡≥ïeδ└!!åB■N╢Af¡X├>¥╫≥~Ñ≤╞╫╡¡¼╨ B░≡≥▓\J├┐√╢èa┌l
  56132. σ╨Oàgµ9æ½+7Ö,`mm37│l╙ ñH╫▄KkΩÇ4:Ω|╠⌡û╝2mσ▓f1+₧æ┐²·∙R{ΦdOgI╧&(^·,îΩÖ╓%ú5'à░eÿ┐╕≥µl╢t(.┐Pa    ■"b√ò)■7╦úΓ┐r/NfΣ1mù£≥≤,⌐≡0┬ä╜4iäp└!!«ÑóqäUÜ·[É∙X>ó wΩloY~rKP╗∩]\X╪┤è
  56133. 3Mb═!!Γ╧^═(┼ù+G▓Rä»i(X4fvüΓB₧eΦ?½╪°ä¢■▀}╞ú¬1qû⌡o M╡└╤ TcuT▀C7╚I¥°╞¿á▒<╞▒aû─µΦiüs ╕W%hì╙ô>îI⌠φπ}│≈a│¥≥ª`U?tΩx²2 ª°╢$'ò┴½ñ╖÷& iGÿÅN╖s'╢ΘM(Xºσ╔f*_ƵHⁿ╠│7v╗φ▓TÉ#@    ╙ÿ┬7 =oM÷pQ╫SÄ*└¿╪v    ╦@G°ö£ª┌╣[▐Σºfqε╣▒"≤;φ▒nx;u∩Θ\÷╒└4`╡`ßé≤o¿j3│W$88»╓ædiF
  56134. Æ
  56135. ZJwb{≡k1ºj1EIÑ≥|)[çV*ó┐ßF╚─¡qKoRPb╞Φ»µ╚£ë╬^(░L─·─»3▒n≤>IJñ√4a╜gd;░Æ»î▒ îg╞┘╩òEZ3 U* ■·üτΦ╨Jwⁿl¿i{▓NQL⌡╖φC₧u-│óz╖├[~⌡╩╖ºK!
  56136.  
  56137. ±V.!! ░¥'*«Åà/ë;╗ö∙═∞╙┌╞╜▓¼]G╢⌐┼xgAY▄ùd₧Q@#|Hd¼┴
  56138. Xt!!J╖9α¢2≤╚C¡≈·▐╨╩àuJ.aÜ»y ╗╩╘LZÉVòpóG÷yò⌡_F1εj▀╙\ÅQu½|▄£╫∙î┤{ìM├ïåh»≤[Aæt~âΓmƃKµS(╔Kû{ÖDg÷╒8╓JkÇ)░╬èEv┐½╕·σ½µi^╝Σ≥%R]&n╕+╤3BlàW█ÿÑ\~? Üû&ƒRBé°╘°∩qß╣ê╦ô;▒ú╟┬2R ║<ázKτ╢l╥36åoùÅùç═Mÿ┬╠ΘLτ\]╨╚>╒δ²╥H}N@2 w╜°9`╦t╝A╧F₧teƒ⌡4∩91N▌í√B#?^mû╙┬╒A àφH+ú÷Fæ█▌*┤AR9p╦■0/╖eÆ≈▄Æc╞╙ÿª┘é┼K¬Y▓ìDT(Ñ╚╧╩8⌐gu╗╙┌º¼+hçƒvτ└∙Z¡δΦi▀!!^dεæ;▓b╫íéó²XÅìB»x├á⌐┼ ├⌡ô*ƒêDFΦ╣h-»≡ܪ p8-ú3-⌠Ñ╓Ofï√φOÉαí)/╚╡Zaü'2£▀x[∩a├╫┐φ█═:¬√ää│ΘVYΣ-c1≈5∩÷─N∩ÿ╪¡╕;BÉUB/à╖┬a{zíl├üV}Äôè]╡ä!
  56139.  
  56140. readFrom: aStream
  56141.     "Answer a <String> read from the <gettableStream>, aStream
  56142.     Note that the string is expected to be in Smalltalk literal form, i.e.
  56143.     single quoted and with embedded quotes doubled."
  56144.  
  56145.     | answer newChar |
  56146.     answer := String writeStream: 16.
  56147.     aStream skipTo: $'.     "Skip any leading chars up to just after the first quote"
  56148.     [aStream atEnd] whileFalse: [ | ch |
  56149.         ch := aStream next.
  56150.         ch == $' ifTrue: [
  56151.             aStream atEnd ifTrue: [^answer contents].
  56152.             ch := aStream next.
  56153.             ch == $' ifFalse: [    "Single quote terminates string (else gobble the doubled quote)"
  56154.                 aStream pop. 
  56155.                 ^answer contents]].
  56156.         answer nextPut: ch].
  56157.     ^answer contents!
  56158.  
  56159. tab
  56160.     "Answer an instance of the receiver containing a tab character."
  56161.  
  56162.     ^##(self instanceClass with: Character tab)!
  56163.  
  56164. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  56165. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥╓α9s!
  56166.  
  56167. unicodeClass
  56168.     "Answer the class of String to use for Unicode."
  56169.  
  56170.     ^UnicodeString!
  56171.  
  56172. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  56173. m»g|jmT]x≈Å
  56174. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{Xâ¥╠╠⌐! !
  56175.  
  56176. !String methodsFor!
  56177.  
  56178. _beginsString: aString
  56179.     ^(CRTLibrary default 
  56180.         strncmp: aString
  56181.         string2: self
  56182.         count: self size) == 0!
  56183.  
  56184. _collate: comparand
  56185.     "Private - Answer the receiver's <integer> collation order with respect to 
  56186.     the <readableString> argument, comparand. The answer is < 0 if
  56187.     the receiver is lexically before the argument, 0 if lexically equivalent, or
  56188.     > 0 if lexically after the argument. The comparision is CASE INSENSITIVE.
  56189.     The comparison respects the currently configured default locale of the
  56190.     host operating system, and the performance may disappoint in some cases."
  56191.  
  56192.     <primitive: 56>
  56193.     "The primitive simply invokes the case-insensitive string collation method"
  56194.     ^KernelLibrary default lstrcmpi: self lpString2: comparand
  56195.  
  56196.     "If you really don't care about Locale sensitive collation, then this is
  56197.     even faster (C collation), especially if the C locale is set."
  56198.  
  56199. "    ^CRTLibrary default _stricmp: self string2: comparand."
  56200. !
  56201.  
  56202. _sameAsString: aString
  56203.     "Private - Answer whether the receiver collates the same as argument, aString.
  56204.     Implementation Note: Double dispatched from String>>sameAs:."
  56205.  
  56206.     ^self == aString or: [(aString _collate: self) == 0]!
  56207.  
  56208. _separateSubStringsIn: aReadableString 
  56209.     "Private - Answer an Array containing the substrings in aReadableString separated
  56210.     by the receiver."
  56211.  
  56212.     | start stop size answer subSize |
  56213.     (subSize := self size) == 0 
  56214.         ifTrue: [^self error: 'separator must consist of at least one character'].
  56215.     subSize == 1 
  56216.         ifTrue: [^(self at: 1) _separateSubStringsIn: aReadableString].
  56217.     start := 1.
  56218.     size := aReadableString size.
  56219.     answer := OrderedCollection new: 10.
  56220.     
  56221.     [stop := aReadableString indexOfSubCollection: self startingAt: start.
  56222.     stop == 0 
  56223.         ifTrue: 
  56224.             [answer addLast: (aReadableString copyFrom: start to: size).
  56225.             ^answer asArray].
  56226.     answer addLast: (aReadableString copyFrom: start to: stop - 1).
  56227.     (start := stop + subSize) > size] 
  56228.             whileFalse.
  56229.     ^answer asArray!
  56230.  
  56231. < comparand
  56232.     "Answer whether the receiver is lexically less than the <readableString>, comparand,
  56233.     ignoring case, according to the implementation defined collation sequence (see _collate:)."
  56234.  
  56235.     ^(self _collate: comparand) < 0!
  56236.  
  56237. <= comparand
  56238.     "Answer whether the receiver is lexically less than or equal to the <readableString>, 
  56239.     comparand, ignoring case, according to the implementation defined collation sequence 
  56240.     (see _collate:). Note that this is the equivalent to 
  56241.         'self < comparand or: [self sameAs: comparand]'
  56242.     and NOT
  56243.         'self < comparand or: [self = comparand]
  56244.     since String>>= is case sensitive."
  56245.  
  56246.     ^(self _collate: comparand) <= 0!
  56247.  
  56248. = comparand
  56249.     "Answer whether the receiver and the <Object> argument, comparand, 
  56250.     are both Strings containing identical characters (i.e. case sensitive).
  56251.  
  56252.     Primitive failure results:
  56253.         0 -    aString is not a byte object of the same class as the receiver."
  56254.  
  56255.     <primitive: 55>
  56256.     ^false!
  56257.  
  56258. > comparand
  56259.     "Answer whether the receiver is lexically greater than the <readableString>, comparand,
  56260.     ignoring case, according to the implementation defined collation sequence 
  56261.     (see _collate:)."
  56262.  
  56263.     ^(self _collate: comparand) > 0!
  56264.  
  56265. >= comparand
  56266.     "Answer whether the receiver is lexically greater than or equal to the 
  56267.     <readableString> comparand, ignoring case, according to the implementation 
  56268.     defined collation sequence (see _collate:)."
  56269.  
  56270.     ^(self _collate: comparand) >= 0!
  56271.  
  56272. asBSTR
  56273.     "Answer the BSTR (AX Automation string) representation of the receiver.
  56274.     This conversion will also work fine for UnicodeString."
  56275.  
  56276.     ^BSTR fromString: self!
  56277.  
  56278. asByteArray
  56279.     "Answer a <ByteArray> containing the Unicode representation of the characters of the
  56280.     receiver."
  56281.  
  56282.     | size |
  56283.     size := self basicSize.
  56284.     ^self
  56285.         replaceBytesOf: (ByteArray new: size) 
  56286.         from: 1 to: size startingAt: 1.
  56287. !
  56288.  
  56289. asDword
  56290.     "Answer the receiver in a form suitable for passing and returning as a
  56291.     32-bit integer value.
  56292.     N.B. Be careful that the receiver is not GC'd until the result is no
  56293.     longer required, or it will be a dangling pointer."
  56294.  
  56295.     ^self yourAddress!
  56296.  
  56297. asLowercase
  56298.     "Answer a <readableString> which is a copy of the receiver but
  56299.     with the contents converted to lowercase.
  56300.     Implementation Note: The Win32 function converts in place, so we 
  56301.     must first create a copy."
  56302.  
  56303.     | copy |
  56304.     copy := self basicCopy.
  56305.     UserLibrary default stringLower: copy.
  56306.     ^copy!
  56307.  
  56308. asNumber
  56309.     "Answer a Number constructed by interpreting the receiver's characters as the
  56310.     printString of a Number."
  56311.  
  56312.     ^Number fromString: self!
  56313.  
  56314. aspectDisplayOn: aStream
  56315.       "Private - Append a single-line textual representation of the receiver to the <puttableStream>
  56316.       argument in a form that a user viewing the receiver as the value of a published aspect would 
  56317.       like to see it. Typically we use #displayOn: but some classes of object can use alternate display 
  56318.       formats. In this case we want to keep to a reasonable length and remove line delimiters.
  56319.       N.B. This is a development time only method that supports the PublishedAspectInspector."
  56320.   
  56321.       | i max size lf cr |
  56322.       aStream nextPut: $'.
  56323.       size := self size.
  56324.       max := size min: Aspect maxDisplayCharacters - 2.
  56325.       i := 0.
  56326.       lf := Character lf.
  56327.       cr := Character cr.
  56328.       [i < max] whileTrue: 
  56329.               [| each |
  56330.               each := self at: (i := i + 1).
  56331.               (each == cr or: [each == lf]) 
  56332.                   ifTrue: [max := 0]
  56333.                   ifFalse: [aStream nextPut: each]].
  56334.       i < size ifTrue: [aStream nextPutAll: ' ...'].
  56335.       aStream nextPut: $'!
  56336.  
  56337. asRichText
  56338.     "Answer the receiver converted to a RichText instance"
  56339.  
  56340.     ^RichText fromString: self!
  56341.  
  56342. asString
  56343.     "Answer a <readableString> containing the same characters as the receiver,
  56344.     i.e. the receiver."
  56345.  
  56346.     ^self!
  56347.  
  56348. asSymbol
  56349.     "Answer the <symbol> corresponding to the receiver."
  56350.  
  56351.     ^Symbol intern: self!
  56352.  
  56353. asUnicodeString
  56354.     ^self class unicodeClass fromString: self!
  56355.  
  56356. asUppercase
  56357.     "Answer a <readableString> which is a copy of the receiver but with 
  56358.     the contents converted to uppercase.
  56359.     Implementation Note: The Win32 function converts in place, so we need 
  56360.     to create a copy first."
  56361.  
  56362.     | copy |
  56363.     copy := self basicCopy. 
  56364.     UserLibrary default stringUpper: copy.
  56365.     ^copy!
  56366.  
  56367. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣`▓▀6£êò¡├²UP·74fi╔ⁿz;ó┼ÇXDå╙z╝H÷{Ö∙I*íQæ╫ZôFqƒ.┌£─╕Ä═σg÷ÑÑ]=ç╨ypΓftÅ▄'╠╓Qαo▀Z╓!
  56368.  
  56369. at: index
  56370.     "Answer the <Character> at the <integer> index, in the receiver.
  56371.  
  56372.     Primitive failure reasons:
  56373.         0 -    anInteger is not a SmallInteger
  56374.         1 -    anInteger is out of bounds (not in the range 1..receiver's size)."
  56375.  
  56376.     <primitive: 63>
  56377.     ^self errorAt: index!
  56378.  
  56379. at: anInteger put: aCharacter
  56380.     "Replace the character at index, anInteger, in the receiver with aCharacter.
  56381.  
  56382.     Primitive failure reasons:
  56383.         0 -    anInteger is not a SmallInteger
  56384.         1 -    anInteger is out of bounds (not in the range 1..receiver's size).
  56385.         2 -    aCharacter is not a Character."
  56386.  
  56387.     <primitive: 64>
  56388.     ^(aCharacter isKindOf: Character) 
  56389.         ifTrue: [self errorAt: anInteger put: aCharacter]
  56390.         ifFalse: [self error: 'can''t hold ', aCharacter class name,'''s']
  56391. !
  56392.  
  56393. basicCopy
  56394.     "Private - Answer a copy of the receiver. Not to be overridden
  56395.     by subclasses. Should always answer a String."
  56396.  
  56397.     ^self species fromAddress: self yourAddress
  56398. !
  56399.  
  56400. beginsWith: comperand
  56401.     "Answer whether the receiver starts with the exact characters
  56402.     of the argument, comperand."
  56403.  
  56404.     ^comperand _beginsString: self!
  56405.  
  56406. between: min and: max
  56407.     "Answer whether the receiver is inclusively between the <magnitude> arguments, 
  56408.     min and max."
  56409.  
  56410.     ^self >= min and: [self <= max]!
  56411.  
  56412. byteSize
  56413.     "Private - Answer the size in bytes of this object, including the null terminator."
  56414.  
  56415.     ^self basicSize + 1!
  56416.  
  56417. capitalized
  56418.     "Answer a <readableString> which is a copy of the receiver but with 
  56419.     the first character converted to its uppercase equivalent."
  56420.  
  56421.     | answer |
  56422.     (answer := self basicCopy) isEmpty ifFalse: [
  56423.         answer at: 1 put: (self first asUppercase)].
  56424.     ^answer!
  56425.  
  56426. copyToClipboard
  56427.     "Private - Copy the #String format of the receiver to the clipboard."
  56428.  
  56429.     Clipboard current setText: self format: #String!
  56430.  
  56431. copyToCOMTaskMemory
  56432.     "Answer a COMTaskMemory object containing a copy of the receiver's
  56433.     characters."
  56434.  
  56435.     ^COMTaskMemory fromString: self!
  56436.  
  56437. displayOn: aStream
  56438.     "Append the receiver in end-user form to aStream. Since this message is intended
  56439.     for producing end-user text, the receiver is appended to the stream as-is."
  56440.  
  56441.     aStream nextPutAll: self!
  56442.  
  56443. displayString
  56444.     "Answer a String representation of the receiver in a form suitable for
  56445.     presentation to an end user.
  56446.     Implementation Note: This is implemented purely for performance reasons to
  56447.     avoid the Stream overhead when displaying strings because it is such a
  56448.     common operation."
  56449.  
  56450.     ^self!
  56451.  
  56452. equals: comperand
  56453.     "Answer whether the characters of the receiver are identical to those of 
  56454.     the argument, comperand. Should not be overridden by subclasses (a kind of basic=).
  56455.     Using this method strings and symbols compare equal if they contain the same
  56456.     character sequence - this was not true in releases prior to 3.0."
  56457.  
  56458.     | size |
  56459.     <primitive: 55>
  56460.     (self == comperand or: [self = comperand]) ifTrue: [^true].
  56461.     self species == comperand species ifFalse: [^false].
  56462.     (comperand size = (size := self size)) ifFalse: [^false].
  56463.     1 to: size do: [:i | (self at: i) = (comperand at: i) ifFalse: [^false]].
  56464.     ^true!
  56465.  
  56466. first: anInteger
  56467.     "Answer a new string comprising up to the leftmost anInteger characters of the receiver. 
  56468.     Implementation Note: Rather than implement in terms of the generic #copyFrom:to: method, 
  56469.     we can take advantage of the fact that this selector is specific to Strings, and implement more 
  56470.     efficiently."
  56471.  
  56472.     ^self 
  56473.         replaceBytesOf: (self species new: anInteger)
  56474.         from: 1 
  56475.         to: anInteger
  56476.         startingAt: 1!
  56477.  
  56478. formatWith: arg1
  56479.     "Answer a String which is a message formatted from the receiver (assumed to be a Win32 
  56480.     format String (see Win32 help)) with substituations from the remaining argument(s).
  56481.     See #formatWithArguments: for further details."
  56482.  
  56483.     ^self formatWithArguments: (Array with: arg1)
  56484. !
  56485.  
  56486. formatWith: arg1 with: arg2
  56487.     "Answer a String which is a message formatted from the receiver (assumed to be a Win32 
  56488.     format String (see Win32 help)) with substituations from the remaining argument(s).
  56489.     See #formatWithArguments: for further details."
  56490.  
  56491.     ^self formatWithArguments: (Array with: arg1 with: arg2)
  56492.  
  56493. !
  56494.  
  56495. formatWith: arg1 with: arg2 with: arg3
  56496.     "Answer a <readableString> which is a message formatted from the receiver (assumed to be a Win32 
  56497.     format String (see Win32 help)) with substituations from the remaining argument(s).
  56498.     See #formatWithArguments: for further details."
  56499.  
  56500.     ^self formatWithArguments: (Array with: arg1 with: arg2 with: arg3)!
  56501.  
  56502. formatWith: arg1 with: arg2 with: arg3 with: arg4
  56503.     "Answer a String which is a message formatted from the receiver (assumed to be a Win32 
  56504.     format String (see Win32 help)) with substituations from the remaining argument(s).
  56505.     See #formatWithArguments: for further details."
  56506.  
  56507.     ^self formatWithArguments: (Array with: arg1 with: arg2 with: arg3 with: arg4)
  56508.  
  56509. !
  56510.  
  56511. formatWithArguments: arguments
  56512.     "Answer a String which is a message formatted from the receiver (assumed to be a Win32 
  56513.     format String (see Win32 help)) with substituations from the collection, arguments.
  56514.     Note that floating point specifiers are not supported."
  56515.  
  56516.     ^KernelLibrary default 
  56517.         formatMessage: 0 
  56518.         source: self 
  56519.         flags: FORMAT_MESSAGE_FROM_STRING 
  56520.         withArguments: arguments!
  56521.  
  56522. hash
  56523.     "Hash the characters of the string using a built-in algorithm.
  56524.     Do NOT change this as the VM relies on this implementation.
  56525.     The primitive should not fail."
  56526.  
  56527.     <primitive: 106>
  56528.     ^VMLibrary default hashBytes: self count: self size!
  56529.  
  56530. hashCharacters
  56531.     "Private - Use the standard byte hashing algorithm to hash the characters of 
  56532.     the receiver. Used for doing lookup by value, e.g. in the Symbol table."
  56533.  
  56534.     <primitive: 106>
  56535.     ^VMLibrary default hashBytes: self count: self size
  56536. !
  56537.  
  56538. includes: target
  56539.     "Answer whether the <Character> argument, target, is one of the elements of the receiver.
  56540.     Implementation Note: Override superclass to provide a more efficient implementation."
  56541.  
  56542.     ^self identityIncludes: target!
  56543.  
  56544. includesAnyOf: characters
  56545.     "Answer whether the receiver includes any of the characters in the <readableString>, characters."
  56546.  
  56547.     ^(self indexOfAnyOf: characters startingAt: 1) ~~ 0!
  56548.  
  56549. indexOfAnyOf: characters startingAt: start
  56550.     "Answer the one-based integer index of the first encountered element of the receiver which 
  56551.     is equal to one of the characters in the <readableString>, characters, starting from the one-based
  56552.     <integer> index, start, in the receiver. If no occurrences are found, then answer 0."
  56553.  
  56554.     | span |
  56555.     span := CRTLibrary default strcspn: (self yourAddress + start - 1) strCharSet: characters.
  56556.     ^span + start > self size
  56557.         ifTrue: [0]
  56558.         ifFalse: [span+start]
  56559. !
  56560.  
  56561. indexOfSubCollection: targetSequence startingAt: start
  56562.     "Answer the <integer> index of the next occurrence within the 
  56563.     receiver of the <sequencedReadableCollection> targetSequence,
  56564.     starting at the <integer> index start. If there are no such occurrences, answer 0.
  56565.  
  56566.     Primitive Failure Reasons:
  56567.         0    - start is not a SmallInteger
  56568.         1    - start is out of bounds (not in the range 1..receiver's indexable size) 
  56569.         2    - targetSequence is not of the same class as the receiver.
  56570.  
  56571.     Implementation Note: The string search primitive is implemented using the 
  56572.     Boyer-Moore algorithm unless the receiver is less than 512 bytes long, in which
  56573.     case it isn't worth initializing the skip array in most cases, so a simple brute
  56574.     force search (much like that of the superclass) is used."
  56575.  
  56576.     <primitive: 149>
  56577.     ^super indexOfSubCollection: targetSequence startingAt: start!
  56578.  
  56579. isLiteral
  56580.     "Private - Answer whether the receiver can be represented as a literal (i.e. it has a printed
  56581.     representation which can be directly understood by the compiler)."
  56582.  
  56583.     ^true!
  56584.  
  56585. isString
  56586.     "Answer whether the receiver is a <String>."
  56587.  
  56588.     ^true!
  56589.  
  56590. leftString: anInteger
  56591.     "Answer a new string comprising up to the leftmost anInteger characters of the receiver. 
  56592.     If the receiver has less than anInteger characters, then copy only those characters in the 
  56593.     receiver."
  56594.  
  56595.     ^self first:( anInteger min: self size).
  56596. !
  56597.  
  56598. lines
  56599.     "Answer a SequenceableCollection containing the lines of the receiver (sequences of Characters
  56600.     separated by line delimiters. Blank lines are included.
  56601.     N.B. It is assumed that a line delimiter consists of two characters."
  56602.  
  56603.     ^self subStrings: String lineDelimiter!
  56604.  
  56605. match: target
  56606.     "Answer whether the receiver (which may contain wildcard characters) matches the 
  56607.     readable string argument, target, ignoring case differences.
  56608.     Note that the pattern matching characters are *, matching any sequence of characters 
  56609.     and # matching any single character. The latter differs from the usual ? for historical
  56610.     reasons."
  56611.  
  56612.     ^self match: target ignoreCase: true
  56613. !
  56614.  
  56615. match: target  ignoreCase: aBoolean
  56616.     "Answer whether the receiver (which may contain wildcard characters) matches the 
  56617.     readable string argument, target, ignoring or respecting case differences depending
  56618.     on the <Boolean> argument, aBoolean.
  56619.     Note that the pattern matching characters are *, matching any sequence of characters 
  56620.     and # matching any single character. The latter differs from the usual ? for historical
  56621.     reasons."
  56622.  
  56623.     ^self matchPatternFrom: 1 in: target from: 1 ignoreCase: aBoolean!
  56624.  
  56625. matchPatternFrom: patternStart in: source from: sourceStart ignoreCase: ignoreCase
  56626.     "Private - Answer whether the receiver matches 'source' (starting
  56627.     at patternStart in the receiver and sourceStart in source).
  56628.     The receiver may contain wildcards. Any differences in case between individual
  56629.     characters are ignored if the <boolean> argument, ignoreCase, is true."
  56630.  
  56631.     | p sourceSize |
  56632.     sourceSize := source size.
  56633.     patternStart > self size ifTrue: [
  56634.         "We've processed the whole pattern.
  56635.         If there is no more source, then we have a successful match,
  56636.         otherwise the match has failed."
  56637.         ^sourceStart > sourceSize].
  56638.  
  56639.     "Get the next character from the pattern."
  56640.     p := self at: patternStart.
  56641.  
  56642.     p == $* ifTrue: [
  56643.         "Handle the $* in the pattern."
  56644.         sourceStart to: sourceSize + 1 do: [:s |
  56645.             (self matchPatternFrom: patternStart + 1 in: source from: s ignoreCase: ignoreCase)
  56646.                 ifTrue: [^true]].
  56647.         ^false].
  56648.  
  56649.     sourceStart > sourceSize ifTrue: [
  56650.         "We've run out of source to be matched by the pattern."
  56651.         ^false].
  56652.  
  56653.     (p == $# or: [p == (source at: sourceStart)
  56654.             or: [ignoreCase and: [p asUppercase == (source at: sourceStart) asUppercase]]])
  56655.         "A character has been matched exactly, or matched by a $#."
  56656.         ifTrue: [^self matchPatternFrom: patternStart + 1 in: source from: sourceStart + 1 ignoreCase: ignoreCase].
  56657.     ^false.!
  56658.  
  56659. max: operand
  56660.     "Answer the greater of the receiver and the <magnitude>, operand.
  56661.      Implementation Note: #< is used since other relational operators are often implemented 
  56662.     in terms of it."
  56663.  
  56664.     ^self < operand
  56665.         ifTrue:  [operand]
  56666.         ifFalse: [self]!
  56667.  
  56668. midString: anIntegerLength from: anIntegerStart
  56669.     "Answer a new string comprising the anIntegerLength characters starting
  56670.     at anIntegerStart in the receiver."
  56671.  
  56672.     ^self copyFrom: anIntegerStart to: anIntegerStart + anIntegerLength - 1!
  56673.  
  56674. min: operand
  56675.     "Answer the lesser of the receiver and the <magnitude>, operand."
  56676.  
  56677.     ^self < operand
  56678.         ifTrue:  [self]
  56679.         ifFalse: [operand]!
  56680.  
  56681. nextIdentityIndexOf: anElement from: start to: stop
  56682.     "Answer the index of the next occurrence of anElement in the receiver's indexable
  56683.     variables between startIndex and stopIndex inclusive. If there are no such occurrences, answer 0.
  56684.     Implementation Note: Override the inherited implementation to make use of the primitive."
  56685.  
  56686.     <primitive: 52>
  56687.     ^anElement class == Character 
  56688.         ifTrue: [self basicIdentityIndexOf: anElement asInteger from: start to: stop]
  56689.         ifFalse: [0 "Can only contain characters"]!
  56690.  
  56691. nextIndexOf: anElement from: start to: stop
  56692.     "Answer the index of the next occurrence of anElement in the receiver between 
  56693.     startIndex and stopIndex inclusive. If there are no such occurrences, answer 0."
  56694.  
  56695.     <primitive: 52>
  56696.     ^self nextIdentityIndexOf: anElement from: start to: stop!
  56697.  
  56698. occurrencesOf: anObject 
  56699.     "Answer how many of the receiver's elements are equal to anObject.
  56700.     Implementation Note: Override for improved performance (superclass
  56701.     uses a serial search, which is appropriate where #nextIndexOf:from:to:
  56702.     is implemented in the same way, but we have a fast primitive for that."
  56703.  
  56704.     | occurrences start end |
  56705.     occurrences := 0.
  56706.     end := self size.
  56707.     start := 1.
  56708.     [start > end] whileFalse: [ | next |
  56709.         (next := self nextIndexOf: anObject from: start to: end) == 0
  56710.             ifTrue: [^occurrences].
  56711.         occurrences := occurrences + 1.
  56712.         start := next + 1].
  56713.     ^occurrences!
  56714.  
  56715. printOn: aStream
  56716.     "Append the receiver as a quoted string to aStream. Internal quotes are doubled 
  56717.     to produce a literal String."
  56718.  
  56719.     aStream nextPut: $'.
  56720.     1 to: self size do: [:i |
  56721.         (aStream nextPut: (self at: i)) == $' 
  56722.             ifTrue: [aStream nextPut: $']].
  56723.     aStream nextPut: $'!
  56724.  
  56725. publishedKeyedAspects
  56726.         "Answers a LookupTable of the published aspects of the receiver's keyed contents"
  56727.     
  56728.         ^LookupTable new
  56729.             !
  56730.  
  56731. refersToLiteral: anObject 
  56732.     "Private - Answer whether the receiver is a reference to the literal argument.
  56733.     This assumes that the receiver is in the role of a literal."
  56734.  
  56735.     ^self = anObject!
  56736.  
  56737. replaceBytesOf: aByteObject from: start to: stop startingAt: fromStart
  56738.     "Private - Standard method for transfering bytes from one variable
  56739.     byte object to another, normally double dispatched from #replaceFrom:to:with:startingAt:
  56740.  
  56741.     Primitive Failure Reasons:
  56742.         0     - fromStart is not a SmallInteger.
  56743.         1    - stop is not a SmallInteger.
  56744.         2    - start is not a SmallInteger.
  56745.         3    - aByteObject is not a byte object
  56746.         4    - 'from' or 'to' interval is out-of-bounds
  56747.     "
  56748.  
  56749.     | fromOffset |
  56750.     <primitive: 142>
  56751.     fromOffset := fromStart - start.
  56752.     stop to: start by: -1 do: [:i | aByteObject at: i put: (self at: i + fromOffset)].
  56753.     ^aByteObject!
  56754.  
  56755. replaceFrom: start to: stop with: replacementElements startingAt: startAt
  56756.     "Replace the characters of the receiver at the <integer> index positions 
  56757.     start through stop with consecutive characters of the <readableString>
  56758.     replacementElements beginning at <integer> index position startAt. 
  56759.     Answer the receiver."
  56760.  
  56761.     replacementElements replaceBytesOf: self from: start to: stop startingAt: startAt!
  56762.  
  56763. replaceSelectionIn: aTextEdit
  56764.     "Sent as part of a double dispatch from View objects to set their text from
  56765.     the receiver. The receiver is assumed to be plain text, so sends the 
  56766.     #replaceSelection message back to aTextEdit.
  56767.     The RichText protocol requires that aTextEdit must implement both #selectionPlainText:
  56768.     and #selectionRtf: methods."
  56769.  
  56770.     aTextEdit selectionPlainText: self!
  56771.  
  56772. reverse
  56773.     "Answer a copy of the receiver but with its elements in reverse order.
  56774.     Our Strings are null-terminated, so we can use the CRTLibrary (_strrev()
  56775.     works in place, so we must get a copy)."
  56776.  
  56777.     | copy |
  56778.     copy := self basicCopy.
  56779.     CRTLibrary default _strrev: copy.
  56780.     ^copy!
  56781.  
  56782. rightString: anInteger
  56783.     "Answer a new string comprising the rightmost anInteger characters of the receiver."
  56784.  
  56785.     ^self last: anInteger!
  56786.  
  56787. sameAs: comparand
  56788.     "Answer whether the receiver collates the same as the <sequencedReadableCollection>
  56789.      argument, operand, in the currently configured locale (case insensitively).
  56790.     Note that the ANSI standard definition of this function requires that the comparand
  56791.     complies with <readableString>, but we relax that to allow any <sequencedReadableCollection>
  56792.     although that collection must contain valid character code points, consequently the
  56793.     argument need not be the same class as the receiver.
  56794.     Implementation note: Similar to superclass implementation of #=, but we allow different
  56795.     species, and we need to use collating of the currently configured locale. This is easiest
  56796.     if we first construct a String from the argument, since Win32 provides no simple
  56797.     function for comparing two characters, and that is easiest if we double dispatch."
  56798.  
  56799.     ^comparand _sameAsString: self!
  56800.  
  56801. setTextInto: aView
  56802.     "Sent as part of a double dispatch from View objects to set their text from
  56803.     the receiver. The receiver is assumed to be plain text, so sends the #plainText
  56804.     message back to aView."
  56805.  
  56806.     aView plainText: self!
  56807.  
  56808. skipOver: aStream ignoreCase: ignoreCase
  56809.     "Private - Answer whether the receiver matches the contents of <sequencedStream> stream
  56810.     ignoring case differences if <boolean> ignoreCase is true. Answers true if a complete match is
  56811.     found, false otherwise. If a match is found then the stream is left pointing to the next character
  56812.     following the match. If not, the stream position is left unchanged."
  56813.  
  56814.     | originalPosition |
  56815.     ignoreCase ifFalse: [^self skipOver: aStream].
  56816.     originalPosition := aStream position.
  56817.     self do: 
  56818.             [:each | 
  56819.             (aStream atEnd or: [aStream next asUppercase ~= each asUppercase]) 
  56820.                 ifTrue: 
  56821.                     [aStream position: originalPosition.
  56822.                     ^false]].
  56823.     ^true!
  56824.  
  56825. sprintfWith: arg1
  56826.     "Answer a String which is a message formatted from the receiver (assumed to be a C-printf
  56827.     format String) with substituations from the remaining argument(s).
  56828.     Note: This is much faster than formatWith:."
  56829.  
  56830.     | n crt buf size |
  56831.     crt := CRTLibrary default.
  56832.     size := self size + 64.
  56833.     [
  56834.         buf := String new: size.
  56835.         n := crt _snprintf: buf count: size format: self with: arg1.
  56836.         n < 0] whileTrue: [size := size * 2].
  56837.     ^buf copyFrom: 1 to: n!
  56838.  
  56839. sprintfWith: arg1 with: arg2
  56840.     "Answer a String which is a message formatted from the receiver (assumed to be a C-printf
  56841.     format String) with substituations from the arguments.
  56842.     Note: This is much faster than formatWith:with:."
  56843.  
  56844.     | written lib buf size |
  56845.     lib := CRTLibrary default.
  56846.     size := self size + 128.
  56847.     
  56848.     [buf := String new: size.
  56849.     written := lib 
  56850.                 _snprintf: buf
  56851.                 count: size
  56852.                 format: self
  56853.                 with: arg1
  56854.                 with: arg2.
  56855.     written < 0] 
  56856.             whileTrue: [size := size * 2].
  56857.     ^buf copyFrom: 1 to: written!
  56858.  
  56859. startsWith: comperand
  56860.     "Answer whether the receiver starts with the exact characters
  56861.     of the argument, comperand."
  56862.  
  56863.     #deprecated.
  56864.     ^self beginsWith: comperand
  56865. !
  56866.  
  56867. storeOn: aStream 
  56868.     "Append to the <puttableStream> argument, target, an expression which when 
  56869.     evaluated will answer a collection similar to the receiver."
  56870.  
  56871.     self printOn: aStream!
  56872.  
  56873. subStrings
  56874.     "Answer an Array containing the substrings of the receiver which are separated by one or 
  56875.     more Characters which answer true to #isSeparator."
  56876.  
  56877.     | aStream answer wordStream next |
  56878.     answer := OrderedCollection new.
  56879.     aStream := self readStream.
  56880.     wordStream := self species writeStream: 10.
  56881.     [aStream atEnd] whileFalse: [
  56882.         wordStream reset.
  56883.         [aStream atEnd or: [(next:= aStream next) isSeparator]]
  56884.             whileFalse: [wordStream nextPut: next].
  56885.         next := wordStream contents.
  56886.         next isEmpty ifFalse: [answer add: next]].
  56887.     ^answer asArray!
  56888.  
  56889. subStrings: separator
  56890.     "Answer an array containing the substrings of the receiver separated by occurrences
  56891.     of the <Character> or <readableString> argument, separator.
  56892.     Repeated separators produce empty strings in the array (cf. #subStrings).
  56893.     The separators are removed."
  56894.  
  56895.     #todo "This does not comply with the current ANSI definition, which requires an Array of separators,
  56896.         each of which may individually be used as a separator".
  56897.     ^separator _separateSubStringsIn: self!
  56898.  
  56899. sunitAsSymbol
  56900.     ^self asSymbol!
  56901.  
  56902. sunitbAsProperNouns
  56903. "answer the string capitalized, with spaces in front of existing Upper Case letters" 
  56904.  
  56905.  
  56906.     | stream last |
  56907.  
  56908.     stream := WriteStream on: String new.
  56909.  
  56910.     self do: [:each |
  56911.         last isNil
  56912.             ifTrue: [stream nextPut: each asUppercase]
  56913.             ifFalse: [
  56914.                 each isUppercase
  56915.                     ifTrue: [
  56916.                         last isLowercase
  56917.                             ifTrue: [stream nextPut: $ ].
  56918.                         stream nextPut: each asUppercase]
  56919.                     ifFalse: [stream nextPut: each]].
  56920.         last := each].
  56921.  
  56922.     ^stream contents!
  56923.  
  56924. sunitMatch: aString
  56925.     ^self match: aString!
  56926.  
  56927. sunitSubStrings
  56928.     ^self subStrings!
  56929.  
  56930. trimBlanks
  56931.     "Answer a copy of the receiver with leading and trailing white space removed."
  56932.  
  56933.     | size first last |
  56934.     size := self size.
  56935.     first := 1.
  56936.     [first < size and: [(self at: first) isSeparator]]
  56937.         whileTrue: [first := first + 1].
  56938.     last := size.
  56939.     [last >= first and: [(self at: last) isSeparator]]
  56940.         whileTrue: [last := last - 1].
  56941.     ^self copyFrom: first to: last!
  56942.  
  56943. trimNulls
  56944.     "Answer a copy of the receiver with trailing nulls removed.
  56945.     Take advantage of some private knowledge about the implementation of
  56946.     #fromAddress:"
  56947.  
  56948.     ^self species fromAddress: self yourAddress!
  56949.  
  56950. trueCompare: comparand
  56951.     "Private - Answer the receiver's <integer> collation order with respect to 
  56952.     the <readableString> argument, comparand. The answer is < 0 if
  56953.     the receiver is lexically before the argument, 0 if lexically equivalent, or
  56954.     > 0 if lexically after the argument. The comparision is CASE SENSITIVE.
  56955.     Implementation Note: lstrcmp() is used, which is a word based comparison
  56956.     which keeps, for example, hyphenated words together with equivalent
  56957.     non-hyphenated words. This is useful, but slower than a basic string collation.
  56958.     Also the comparison respects the currently configured default locale of the
  56959.     host operating system, and the performance may disappoint in some cases."
  56960.  
  56961.     <primitive: 51>
  56962.     "The primitive simply invokes this OS case sensitive string collation function"
  56963.     ^KernelLibrary default lstrcmp: self lpString2: comparand!
  56964.  
  56965. unescapePercents
  56966.     "Answer a copy of the receiver with each %XY substring replaced by 
  56967.     the character with hex ASCII value XY and $+'s replaced by spaces."
  56968.  
  56969.     | answer pos oldPos specialChars |
  56970.     answer := self species writeStream: self size.
  56971.     oldPos := 1.
  56972.     specialChars := '+%'.
  56973.     [(pos := self indexOfAnyOf: specialChars startingAt: oldPos) > 0] 
  56974.         whileTrue: 
  56975.             [| char |
  56976.             answer 
  56977.                 next: pos - oldPos
  56978.                 putAll: self
  56979.                 startingAt: oldPos.
  56980.             char := self at: pos.
  56981.             char = $+ 
  56982.                 ifTrue: [answer nextPut: $ ]
  56983.                 ifFalse: 
  56984.                     [(char = $% and: [pos + 2 <= self size]) 
  56985.                         ifTrue: 
  56986.                             [| asciiVal |
  56987.                             asciiVal := (self at: pos + 1) asUppercase digitValue * 16 
  56988.                                         + (self at: pos + 2) asUppercase digitValue.
  56989.                             pos := pos + 2.
  56990.                             asciiVal > 255 ifTrue: [^self].    "not really an escaped string"
  56991.                             answer nextPut: (Character value: asciiVal)]
  56992.                         ifFalse: [answer nextPut: char]].
  56993.             oldPos := pos + 1].
  56994.     answer 
  56995.         next: self size - oldPos + 1
  56996.         putAll: self
  56997.         startingAt: oldPos.
  56998.     ^answer contents!
  56999.  
  57000. withNormalizedLineDelimiters
  57001.     "Answer a copy of the receiver with any line terminator convention converted to the windows (CR/LF) convention."
  57002.  
  57003.     | target cr lf eol stm |
  57004.     target := self species writeStream: self size.
  57005.     stm := self readStream.
  57006.     cr := Character cr.
  57007.     lf := Character lf.
  57008.     eol := self species lineDelimiter.
  57009.     stm do: 
  57010.             [:each | 
  57011.             each == lf 
  57012.                 ifTrue: [target nextPutAll: eol]
  57013.                 ifFalse: 
  57014.                     [each == cr 
  57015.                         ifTrue: 
  57016.                             [stm peekFor: lf.
  57017.                             target nextPutAll: eol]
  57018.                         ifFalse: [target nextPut: each]]].
  57019.     ^target contents! !
  57020.  
  57021. WeakArray comment:
  57022. ''!
  57023. !WeakArray class methodsFor!
  57024.  
  57025. new: anInteger
  57026.     "Answer a new instance of the receiver with anInteger indexed instance variables
  57027.     The new instance is registered with the memory manager as a weakling"
  57028.  
  57029.     ^(super new: anInteger) initialize! !
  57030.  
  57031. !WeakArray methodsFor!
  57032.  
  57033. add: newElement
  57034.     "Add newElement to the receiver by replacing any available Corpses, or failing that by
  57035.     appending it."
  57036.  
  57037.     self addAnsweringIndex: newElement.
  57038.     ^newElement
  57039. !
  57040.  
  57041. addAnsweringIndex: newElement
  57042.     "Add newElement to the receiver by overwriting the first corpse. If there are no corpses
  57043.     then append it. This is a very useful method in many system support tasks (e.g. the Dependency 
  57044.     mechanism)."
  57045.  
  57046.     ^self replaceIdentity: DeadObject current with: newElement
  57047. !
  57048.  
  57049. corpsesDo: aBlock 
  57050.     "Locate each indexable variable of the receiver which formally housed an Object
  57051.     which has sadly expired, and pass its index to aBlock for evaluation. This
  57052.     method is non-destructive and may be evaluated repeatedly. Should you require
  57053.     to clear the slots formerly occuppied by corpses so that they are not
  57054.     subsequently treated as deaths, use the #nilCorpsesAndDo: message"
  57055.  
  57056.  
  57057.     | deathAt size corpse |
  57058.     size := self basicSize.
  57059.     corpse := DeadObject current.
  57060.     deathAt := self basicIdentityIndexOf: corpse from: 1 to: size.
  57061.     [deathAt > 0] whileTrue: [
  57062.         aBlock value: deathAt.
  57063.         deathAt := self basicIdentityIndexOf: corpse from: deathAt+1 to: size]!
  57064.  
  57065. initialize
  57066.     "Initialize the receiver's state.
  57067.     By default the receiver only weakly references its elements."
  57068.  
  57069.     self beWeak!
  57070.  
  57071. nilCorpsesAndDo: aBlock 
  57072.     "Locate each indexable variable of the receiver which formally housed an Object
  57073.     which has sadly expired, nil the slot, and pass its index to aBlock for evaluation.
  57074.     This is destructive, and is suitable for use where each death is to be processed only
  57075.     once. Should you not wish to nil out the corpses, use #corpsesDo:.
  57076.     N.B. We allow for aBlock to modify the contents of the receiver by continuing the search
  57077.     from position of the Corpse we've just nilled, just in case aBlock moves a Corpse
  57078.     there. This can be useful behavior and has negligible effect on performance."
  57079.  
  57080.     | deathAt size corpse |
  57081.     size := self basicSize.
  57082.     corpse := DeadObject current.
  57083.     deathAt := self basicIdentityIndexOf: corpse from: 1 to: size.
  57084.     [deathAt > 0] whileTrue: [
  57085.         self at: deathAt put: nil.
  57086.         aBlock value: deathAt.
  57087.         deathAt := self basicIdentityIndexOf: corpse from: deathAt to: size]!
  57088.  
  57089. nonCorpsesDo: aBlock
  57090.     "Evaluate aBlock for all non-Corpse elements of the receiver. Answer the receiver."
  57091.  
  57092.     | element corpse |
  57093.     corpse := DeadObject current.
  57094.     1 to: self basicSize do: [:index |
  57095.         element := self at: index.
  57096.         element == corpse ifFalse: [aBlock value: element]]!
  57097.  
  57098. remove: oldElement ifAbsent: exceptionHandler
  57099.     "Private - Remove the argument, oldElement, as an element of the receiver by overwriting it with 
  57100.     the Corpse object, and answer oldElement. If oldElement is not an element of the receiver, then 
  57101.     answer the result of evaluating the niladic valuable, exceptionHandler."
  57102.  
  57103.     | index |
  57104.     index := self basicIdentityIndexOf: oldElement from: 1 to: self basicSize.
  57105.     ^index == 0 
  57106.         ifTrue: [exceptionHandler value]
  57107.         ifFalse: [self basicAt: index put: DeadObject current. oldElement]!
  57108.  
  57109. species
  57110.     "Answer the kind of Collection that should result from enumerations such as #collect:
  57111.     and #select: when applied against the receiver"
  57112.  
  57113.     ^Array! !
  57114.  
  57115. DWORDBytes comment:
  57116. ''!
  57117. !DWORDBytes class methodsFor!
  57118.  
  57119. atAddress: anAddress
  57120.     "Answer a new instance of the receiver with contents copied from
  57121.     the DWORD pointed at by anAddress."
  57122.  
  57123.     ^self fromInteger: (anAddress asExternalAddress dwordAtOffset: 0)!
  57124.  
  57125. elementSize
  57126.     "Private - Answer the size of the receiver's constituent elements in bytes."
  57127.  
  57128.     ^4
  57129. !
  57130.  
  57131. τM"1 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H g^_oQ╢òIcf[¼<QoΓ╛3 ┌º≈Ñ¢τ▌ÆzJ@zh▀ⁿ7¡╠╔OMçQÇVsºF║y╨σAJI1∩$≥┤0ôV|⌐|└å╤π╧┤fÜî╒╤e├¢>zåW%Iª╔:█╙[!
  57132.  
  57133. τM"1 ╜ƒ7s·áé.î-≥╣àÑ╝τ═▄¿≤▒V≥√ßu`_S└─*ZÆvOVy≈ì8Pc*K²<Gs▓«`ε╤¡≈óì≥╦\
  57134. ÿ4L~r▀»h<║ë╘QM╒ûpºU│o╫╝WF 4σ$ï╟IÖ╞i5▌╥╠Γ─Ña╚ïëå╗πRWΓwoè»'╓┌αH9╔Qܵ cⁿ╒8═D.£6┐╚åCqí≡╕≈εíµe_¡Θ╜+8a Xτ4Ω4x]CëJÉQ┌╠3UJJεô:ÄB¡π╘┤·!!Γ│ä┴₧
  57135. ¼≤╠4óo^bÜ}≡qóè¬2àÉàÜ£╠╞ïà╖ÖxY╙ê:├╙Ω╩)t6F4 #ûσ lö8¢s▓r(+
  57136. ∩if½·9≡≤Ä▀an?w╙┌∩░4à≤N/ñ·Gï╒₧T₧-6_N_é∙*4âiö∩╤▌εç!
  57137.  
  57138. fromAddress: anAddress
  57139.     "Answer a new instance of the receiver with contents *copied* from
  57140.     the DWORD pointed at by anAddress (this is not a reference object
  57141.     and so must copy in response to #fromAddress:)"
  57142.  
  57143.     ^self atAddress: anAddress!
  57144.  
  57145. fromInteger: anInteger
  57146.     "Answer a new instance of the receiver with contents copied from anInteger"
  57147.  
  57148.     ^self new value: anInteger!
  57149.  
  57150. fromPoint: aPoint
  57151.     "Private - Answer a new instance of the receiver with high and low
  57152.     words set from aPoint assuming its co-ordinates to be 16-bit signed
  57153.     integer values, with X in the low-word. This instantiator is somewhat
  57154.     similar to the Windows MAKEPOINT macro."
  57155.  
  57156.     ^self new
  57157.         lowSWord: aPoint x;
  57158.         highSWord: aPoint y!
  57159.  
  57160. initialize
  57161.     "Private - Initialize the receiver's class variables.
  57162.         DWORDBytes initialize
  57163.     "
  57164.  
  57165.     self withAllSubclassesDo: [:e | e extraInstanceSpec: 4]!
  57166.  
  57167. new
  57168.     "Answer a new instance of the receiver of the required size."
  57169.  
  57170.     ^self newFixed: 4!
  57171.  
  57172. newAspect: aspectClass name: aSymbol
  57173.     "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  57174.     which is appropriate for representing aspects of the receiver's type."
  57175.  
  57176.     ^aspectClass integer: aSymbol!
  57177.  
  57178. ±V.!! ░¥'*«Åà/ë;╗ö∙═∞╙┌╞╜▓¼]G╢⌐┼xgAY▄ùd₧Q@#|Hd¼┴
  57179. Xt!!J╖9α¢2≤╚C¡≈·▐╨╩àuJ.aÜ»y ╗╩╘LZÉVòpóG÷yò⌡_F1εj▀╙\ÅQu½|▄£╫∙î┤{ìM├ïåh»≤[Aæt~âΓmƃKµS(╔Kû{ÖDg÷╒8╓JkÇ)░╬èEv┐½╕·σ½µi^╝Σ≥%R]&n╕+╤3BlàW█ÿÑ\~? Üû&ƒRBé°╘°∩qß╣ê╦ô;▒ú╟┬2R ║<ázKτ╢l╥36åoùÅùç═Mÿ┬╠ΘLτ\]╨╚>╒δ²╥H}N@2 w╜°9`╦t╝A╧F₧teƒ⌡4∩91N▌í√B#?^mû╙┬╒A àφH+ú÷Fæ█▌*┤AR9╟ⁿ"C;ÿi¢ ∞╦⌐α▒┐┼Å┬MÅ═ε,?4▓¢ü²+┐kg≈╗ΩÄ╙>côƒ?ñ╚ΣMíú╗:åLvwë╫εEÜ⌡>â⌐«╩ÆIº1├ª⌐¢i┼±é9ôô'lî▐! !
  57180.  
  57181. !DWORDBytes methodsFor!
  57182.  
  57183. = anObject
  57184.     "Answer whether the receiver is equivalent to anObject."
  57185.  
  57186.     ^anObject = self asInteger!
  57187.  
  57188. asDword
  57189.     "Answer the receiver in a form suitable for passing/returning as 
  57190.     a 32-bit value."
  57191.  
  57192.     ^self value!
  57193.  
  57194. asInteger
  57195.     "Answer the 32-bit unsigned <integer> value of the receiver."
  57196.  
  57197.     ^self dwordAtOffset: 0!
  57198.  
  57199. αW?=º¢_C╙δ¡$û(Σ╞»╪÷╥ƒëæ≡»V@½σÇmrDC╫─,WçMA9kUGn ╢âr.JπnViºó6 ╠ B┼▌┌⌠₧±¢rol╧╣!
  57200.  
  57201. asSignedInteger
  57202.     "Answer the 32-bit, 2's complement, signed <integer> value of the receiver."
  57203.  
  57204.     ^self sdwordAtOffset: 0!
  57205.  
  57206. byteSize
  57207.     "Answer the size in bytes of this structure."
  57208.  
  57209.     ^self size!
  57210.  
  57211. clear
  57212.     "Initialize the receiver's value to zero."
  57213.  
  57214.     self value: 0!
  57215.  
  57216. displayOn: aStream
  57217.     "Append a textual representation of the receiver to aStream."
  57218.  
  57219.     self asInteger printOn: aStream base: 16 showRadix: true!
  57220.  
  57221. hash
  57222.     "Answer the SmallInteger hash value for the receiver."
  57223.  
  57224.     ^self asInteger hash!
  57225.  
  57226. isNull
  57227.     "Answer whether the receiver is Null (i.e. equal to 0). 
  57228.     This message is useful way of testing for NULL pointers or handles.
  57229.     Implementation Note: The speed of this test is important."
  57230.  
  57231.     <primitive: 171>
  57232.     ^self asInteger == 0!
  57233.  
  57234. printOn: aStream
  57235.     "Append a textual representation of the receiver to aStream."
  57236.  
  57237.     aStream
  57238.         basicPrint: self;
  57239.         nextPut: $(; display: self; nextPut: $)
  57240. !
  57241.  
  57242. publishedKeyedAspects
  57243.         "Answers a LookupTable of the published aspects of the receiver's keyed contents"
  57244.     
  57245.         ^LookupTable new
  57246.             !
  57247.  
  57248. value
  57249.     "Answer the 32-bit unsigned <integer> value stored in the receiver."
  57250.  
  57251.     ^self asInteger!
  57252.  
  57253. value: anObject
  57254.     "Set the 32-bit unsigned <integer> value stored in the receiver."
  57255.  
  57256.     self dwordAtOffset: 0 put: anObject! !
  57257.  
  57258. ExternalAddress comment:
  57259. ''!
  57260. !ExternalAddress class methodsFor!
  57261.  
  57262. alignment
  57263.     "Answer the natural alignment for instances of the receiver when 
  57264.     embedded in arrays or other structures."
  57265.  
  57266.     ^4!
  57267.  
  57268. τM"1 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H g^_oQ╢òIcf[¼<QoΓ╛3 ┌º≈Ñ¢τ▌ÆzJ@zh▀ⁿ7¡╠╔OMçQÇVsºF║y╨σAJI1∩$≥┤0ôV|⌐|└å╤π╧┤fÜî╒╤e├¢>zÄP<T½╦╫┌Sπ!
  57269.  
  57270. fromAddress: anAddress
  57271.     "Answer a new instance of the receiver with contents *copied* from
  57272.     the DWORD pointed at by anAddress (this is not a reference object
  57273.     and so must copy in response to #fromAddress:)"
  57274.  
  57275.     ^self fromInteger: anAddress!
  57276.  
  57277. fromBytes: aByteArray
  57278.     "Not quite sure what to do here, so assume ByteArray contains an address"
  57279.  
  57280.     ^self fromInteger: aByteArray!
  57281.  
  57282. fromInteger: anInteger
  57283.     "Answer a new instance of the receiver with contents copied from anInteger
  57284.     Implementation note: Override superclass to make use of the external call
  57285.     primitive coercion trick."
  57286.  
  57287.     ^VMLibrary default addressFromInteger: anInteger!
  57288.  
  57289. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  57290. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥╓σ"h²!
  57291.  
  57292. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  57293. m»g|jmT]x≈Å
  57294. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ÷Ω╖{Dç£┐╖! !
  57295.  
  57296. !ExternalAddress methodsFor!
  57297.  
  57298. approxSize
  57299.     "Private - Answer the approximate size of the receiver.
  57300.     Implementation Note: As we have no idea how large the item is we are pointing at,
  57301.     we revert to the Collection implementation."
  57302.  
  57303.     ^2!
  57304.  
  57305. asExternalAddress
  57306.     "Answer the receiver as an ExternalAddress"
  57307.  
  57308.     ^self!
  57309.  
  57310. asInteger
  57311.     "Answer the 32-bit unsigned integer value of the receiver. ExternalAddress 
  57312.     needs to be careful NOT to return the positive integer value of the first 4 bytes 
  57313.     of the object  at which the receiver points, but its own value, so we use the 
  57314.     basic version of the accessor."
  57315.  
  57316.     ^self basicDwordAtOffset: 0!
  57317.  
  57318. at: anInteger
  57319.     "Answer the byte at index, anInteger, based from the address stored as 
  57320.     the contents of the receiver."
  57321.  
  57322.     ^self byteAtOffset: anInteger-1!
  57323.  
  57324. at: anInteger put: anIntegerByteValue
  57325.     "Answer the byte at index anIntegerIndex based from the address stored 
  57326.     as the contents of the receiver"
  57327.  
  57328.     ^self byteAtOffset: anInteger-1 put: anIntegerByteValue!
  57329.  
  57330. byteAtOffset: anInteger
  57331.     "Answer the byte at offset anInteger based from the address stored as the 
  57332.     contents of the receiver.
  57333.     WARNING: The primitive assumes that the receiver is a byte object of size 4; 
  57334.     it does not check that the receiver is of the correct shape. The primitive
  57335.     works as specified for ExternalAddress, and any correctly defined subclasses, 
  57336.     but may produce unexpected results where used inappropriately (e.g. in the 
  57337.     methods of a pointer class).
  57338.  
  57339.     Primitive failure reasons:
  57340.         0 -    anInteger is not a SmallInteger."
  57341.  
  57342.     <primitive: 132>
  57343.     ^self primitiveFailed!
  57344.  
  57345. byteAtOffset: anInteger put: anIntegerByteValue
  57346.     "Replace the byte at offset anInteger from the base address stored as the 
  57347.     contents of the receiver with anIntegerByteValue.
  57348.     WARNING: Careless use of this method may result in unexpected behavior similar 
  57349.     to the results of     writing through unprotected pointers in other languages, 
  57350.     in particular it is possible to compromise    the VM by corrupting objects and 
  57351.     other areas of memory. If a GP Fault directly results, then operation should
  57352.     continue normally.
  57353.  
  57354.     Primitive failure reasons:
  57355.         0 -    anInteger is not a SmallInteger.
  57356.         2 -    anIntegerByteValue is not a SmallInteger.
  57357.         3 -    anIntegerByteValue is not in the range 0..255."
  57358.  
  57359.     <primitive: 133>
  57360.     ^self primitiveFailed!
  57361.  
  57362. deepCopy
  57363.     "ExternalAddresses do not know how to deep copy themselves in general, as they
  57364.     do not know the size of the object they point at. In order to deep copy objects
  57365.     containing external addresses correctly, you must implement #deepenShallowCopies:trail:
  57366.     in the parent/owning/referencing object"
  57367.  
  57368.     ^self shouldNotImplement!
  57369.  
  57370. detach
  57371.     "Detach the receiver from the object at which it is pointing, answering the address
  57372.     of that object. This is useful where one wishes to take-over ownership of an object
  57373.     which would otherwise be cleaned up when the receiver is finalized."
  57374.  
  57375.     | address |
  57376.     address := self asInteger.
  57377.     self value: 0. 
  57378.     self beUnfinalizable.    "reduce Memory Manager load"
  57379.     ^address asExternalAddress!
  57380.  
  57381. displayOn: aStream
  57382.     "Append a textual representation of the receiver to aStream."
  57383.  
  57384.     self isNull 
  57385.         ifTrue: [aStream nextPutAll: 'NULL']
  57386.         ifFalse: [super displayOn: aStream]!
  57387.  
  57388. dwordAtOffset: anInteger
  57389.     "Answer the unsigned 4 byte integer at offset (i.e. zero relative) 
  57390.     anInteger in the memory pointed at by the receiver.
  57391.  
  57392.     Primitive failure reasons:
  57393.         0 -    anInteger is not a SmallInteger"
  57394.  
  57395.     | answer |
  57396.     <primitive: 134>
  57397.     answer := 0.
  57398.     3 to: 0 by: -1 do: [:i |
  57399.         answer := (answer bitShift: 8) + (self byteAtOffset: anInteger + i)].
  57400.     ^answer!
  57401.  
  57402. dwordAtOffset: anInteger put: anObject
  57403.     "Store an unsigned 4 byte value at byte offset anInteger 
  57404.     within the receiver.
  57405.  
  57406.     Primitive failure reasons:
  57407.         0 -    anInteger is not a SmallInteger
  57408.         2 -    anObject is not a SmallInteger or a 4-byte object
  57409.     "
  57410.     
  57411.     <primitive: 135>
  57412.     ^self retryDwordAtOffset: anInteger put: anObject!
  57413.  
  57414. replaceBytesOf: aByteObject from: start to: stop startingAt: fromStart
  57415.     "Private - Standard method for transfering bytes from one variable
  57416.     byte object to another, normally double dispatched from #replaceFrom:to:with:startingAt:.
  57417.     Implementation Note: ExternalAddress uses a slightly different primitive for this
  57418.     purpose, as it is not the contents of the receiver that get replaced, but the
  57419.     object at which the receiver points.
  57420.     
  57421.     Primitive Failure Reasons:
  57422.         0     - fromStart is not a SmallInteger.
  57423.         1    - stop is not a SmallInteger.
  57424.         2    - start is not a SmallInteger.
  57425.         3    - aByteObject is not a byte object
  57426.         4    - 'from' or 'to' interval is out-of-bounds
  57427.     "
  57428.  
  57429.     | fromOffset |
  57430.     <primitive: 143>
  57431.     fromOffset := fromStart - start.
  57432.     stop to: start by: -1 do: [:i | aByteObject at: i put: (self at: i + fromOffset)].
  57433.     ^aByteObject!
  57434.  
  57435. resize: anInteger
  57436.     "Resize the receiver to accomodate anInteger bytes.
  57437.     We ignore the request, since we don't know how to resize the object
  57438.     pointed at (or even if it is resizable)."!
  57439.  
  57440. sdwordAtOffset: anInteger
  57441.     "Answers the signed 4 byte integer at byte offset anInteger in the receiver.
  57442.  
  57443.     Primitive failure reasons:
  57444.         0 -    anInteger is not a SmallInteger"
  57445.  
  57446.     | answer |
  57447.     <primitive: 136>
  57448.     answer := self dwordAtOffset: anInteger.
  57449.     ^answer >= 16r80000000
  57450.         ifTrue: [(answer bitXor: 16rFFFFFFFF) bitInvert]
  57451.         ifFalse: [answer]
  57452. !
  57453.  
  57454. sdwordAtOffset: anInteger put: anObject
  57455.     "Store anObject as a signed integer at anInteger offset in the receiver. anInteger must 
  57456.     be representable in 32-bits. Uses the dwordAtOffset:put: primitive."
  57457.  
  57458.     <primitive: 137>
  57459.     anObject asInteger isSDWORD ifFalse: [self errorCantHold: anObject].
  57460.     1 to: 4 do: [:index | self at: anInteger+index put: (anObject at: index)].
  57461.     ^anObject!
  57462.  
  57463. species
  57464.     "Answer the class of object to be used when copying the contents of the receiver. 
  57465.     As we are an untyped pointer, and we want to create a copy of the value pointed at,
  57466.     the best we can do is to create a ByteArray."
  57467.  
  57468.     ^ByteArray!
  57469.  
  57470. stbSaveOn: anSTBOutFiler
  57471.     "Save out a binary representation of the receiver to anSTBOutFiler.
  57472.     Output nil in place of the receiver as the future validity of an external address is uncertain."
  57473.  
  57474.     anSTBOutFiler saveObject: self as: nil!
  57475.  
  57476. swordAtOffset: anInteger
  57477.     "Answer the signed 2 byte integer at offset (i.e. zero relative) 
  57478.     anInteger in the memory pointed at by the receiver."
  57479.  
  57480.     | answer |
  57481.     <primitive: 140>
  57482.     answer := self wordAtOffset: anInteger.
  57483.     ^answer >= 16r8000
  57484.         ifTrue: [ (16r10000 - answer) negated ]
  57485.         ifFalse: [ answer ]
  57486. !
  57487.  
  57488. swordAtOffset: anInteger put: anObject
  57489.     "Store a signed 2 byte value at byte offset anInteger within the receiver (which is the 
  57490.     same as storing an unsigned value, except that the range of acceptable values is different).
  57491.     If anObject is not representable as a 16-bit signed (Small)Integer, then raise a 'cannot hold' error.
  57492.  
  57493.     Primitive failure results:
  57494.         0 -    anInteger is not a SmallInteger
  57495.         2 -    anObject is not a SmallInteger
  57496.         3 -    anObject is not in the range -32768..32767 (i.e. out of signed 16-bit range)."
  57497.  
  57498.     <primitive: 141>
  57499.     ^self retrySWordAtOffset: anInteger put: anObject!
  57500.  
  57501. value
  57502.     "Answer the value of the receiver (the address itself)"
  57503.  
  57504.     ^self!
  57505.  
  57506. value: anInteger
  57507.     "Set the receiver's address value to be anInteger. Answer the receiver.
  57508.     Use the basic version of the accessor to avoid the implicit indirection."
  57509.  
  57510.     self basicDwordAtOffset: 0 put: anInteger!
  57511.  
  57512. wordAtOffset: anInteger
  57513.     "Answer the unsigned 2 byte integer at offset (i.e. zero relative) anInteger in the 
  57514.     memory pointed at by the receiver.
  57515.     On iX86 the high and low order bytes are reversed; i.e. the bytes are ordered least 
  57516.     significant first. A GP Fault interrupt will occur if an attempt is made to read inaccessible
  57517.     memory via this method. This will not affect the stability of the system.
  57518.  
  57519.     Primitive failure reasons:
  57520.         0 -    anInteger is not a SmallInteger."
  57521.  
  57522.     | answer |
  57523.     <primitive: 138>
  57524.     answer := 0.
  57525.     1 to: 0 by: -1 do: [:i |
  57526.         answer := (answer bitShift: 8) + (self byteAtOffset: anInteger + i)].
  57527.     ^answer!
  57528.  
  57529. wordAtOffset: anInteger put: anObject
  57530.     "Store an unsigned 2 byte value at byte offset anInteger within the receiver.
  57531.     If anObject is not representable as a 16-bit unsigned (Small)Integer, then 
  57532.     raise a 'cannot hold' error.
  57533.  
  57534.     Primitive failure reasons:
  57535.         0 -    anInteger is not a SmallInteger.
  57536.         2 -    anObject is not a SmallInteger.
  57537.         3 -    anObject is not in the range 0..65535 (i.e. out of unsigned 16-bit range)."
  57538.  
  57539.     <primitive: 139>
  57540.     ^self retryWordAtOffset: anInteger put: anObject!
  57541.  
  57542. yourAddress
  57543.     "Answer the address at which the receiver points, rather than the address of 
  57544.     the receiver's bytes"
  57545.  
  57546.     ^self asInteger! !
  57547.  
  57548. ExternalHandle comment:
  57549. ''!
  57550. !ExternalHandle class methodsFor!
  57551.  
  57552. τM"1 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H g^_oQ╢òIcf[¼<QoΓ╛3 ┌º≈Ñ¢τ▌ÆzJ@zh▀ⁿ7¡╠╔OMçQÇVsºF║y╨σAJI1∩$≥┤0ôV|⌐|└å╤π╧┤fÜî╒╤e├¢>zèA$_«╩╫┌Sπ!
  57553.  
  57554. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  57555. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥╥²)mⁿ! !
  57556.  
  57557. !ExternalHandle methodsFor!
  57558.  
  57559. asExternalHandle
  57560.     "Answer the receiver as an ExternalHandle."
  57561.  
  57562.     ^self!
  57563.  
  57564. handle
  57565.     "Private - Please use #asPositiveInteger (or #asInteger) instead"
  57566.  
  57567.     ^self value!
  57568.  
  57569. stbSaveOn: anSTBOutFiler
  57570.     "Save out a binary representation of the receiver to anSTBOutFiler.
  57571.     Output nil in place of the receiver as the future validity of an external handle is uncertain."
  57572.  
  57573.     anSTBOutFiler saveObject: self as: nil! !
  57574.  
  57575. BSTR comment:
  57576. 'BSTR is an external structure to represent the OLE Automation string type of the same name.
  57577.  
  57578. BSTR is defined as:
  57579.     typedef OLECHAR FAR* BSTR;
  57580. That is, it is a pointer to a Unicode character string (although it cannot be used interchangeably with the latter - see below). 
  57581. As the underlying BSTR type is actually a pointer we define it here as a subclass of ExternalAddress, rather than try to squeeze it into the ExternalStructure hierarchy.
  57582.  
  57583. BSTRs are both null-terminated AND counted. They store their length as a 32-bit integer in the location immediately preceding the data of the string. BSTRs may also contain embedded nulls, which are included in the reported size, although the terminating null is not. Furthermore a BSTR may (validly) be null, in which case it behaves as if it were an empty string, as per the OLE Automation convention. It is worth noting that VB will usually pass a NULL pointer in place of the empty string.
  57584.  
  57585. BSTRs are stored in memory managed by the OLE Automation Library, which enables ownership to be passed from one function to another:  (down in the depths of OLEAut32.DLL the SysXXX functions map onto the services of the COM task memory allocator). Where a function is expecting a BSTR argument, then a BSTR allocated with SysAllocString must be passed rather than an ordinary Unicode string. The BSTR class can be used to create suitable parameters from other Smalltalk <readableString> classes.
  57586.  
  57587. BSTRs use finalization to safely manage the sys. alloc''d string, but they may be explicitly free''d too.'!
  57588. !BSTR class methodsFor!
  57589.  
  57590. clear: anExternalAddress
  57591.     OLEAutLibrary default sysFreeString: (anExternalAddress dwordAtOffset: 0)!
  57592.  
  57593. fromInteger: anAddress
  57594.     "Answer a new instance of the receiver that points at a copy of the 
  57595.     BSTR at the address, anInteger.
  57596.     Implementation Note: Override to answer a BSTR regardless of
  57597.     whether anAddress is null, since null is a valid BSTR value,
  57598.     also we must take a copy to avoid ownership problems."
  57599.  
  57600.     ^anAddress isNull 
  57601.         ifTrue: [self new]
  57602.         ifFalse: [ | answer |
  57603.             answer := OLEAutLibrary default sysAllocString: anAddress.
  57604.             answer isNull 
  57605.                 ifTrue: [OutOfMemoryError signal]
  57606.                 ifFalse: [answer beFinalizable; yourself]]!
  57607.  
  57608. fromString: aString 
  57609.     "Answer a new instance of the receiver with the same contents as aString."
  57610.  
  57611.     | wstr |
  57612.     aString size == 0 ifTrue: [^self new].
  57613.     wstr := aString asUnicodeString.
  57614.     ^self fromInteger: wstr yourAddress!
  57615.  
  57616. icon
  57617.     "Answers an Icon that can be used to represent this class"
  57618.  
  57619.     ^String icon!
  57620.  
  57621. initialize
  57622.     "Private - Initialize the receiver.
  57623.     Register with session events to clean up instances on startup.
  57624.     
  57625.         BSTR initialize
  57626.     "
  57627.  
  57628.     SessionManager current 
  57629.         when: #sessionStarted send: #onStartup to: self!
  57630.  
  57631. new
  57632.     "Answer a new instance of the receiver of the initially holding a null pointer."
  57633.  
  57634.     ^(self basicNew: 4)
  57635.         beFinalizable; 
  57636.         yourself!
  57637.  
  57638. newAspect: aspectClass name: aSymbol 
  57639.     "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  57640.     which is appropriate for representing aspects of the receiver's type."
  57641.  
  57642.     ^(aspectClass string: aSymbol) beImmutable!
  57643.  
  57644. newBuffer
  57645.     "Answer a new instance containing its own buffer (in this case the buffer
  57646.     is just for a pointer)."
  57647.  
  57648.     ^self new
  57649. !
  57650.  
  57651. ∩A0)ü«¢É╓jë:∩╙√─ô╜╢ùƒⁿ╢DF¡√┴;}MAÆ╖t▓~vObb òXj/Uªx~¡δ(⌡╥F@⌠╛╣è≥╚ ╔8 kn▌¿e~ε└╬J\öÉfεL░=ä    ∙] ;Σmë█K╥/┼0=┴åâ∙╩αr╚    ÉÄæp
  57652. π⌡^W▓axè»#╠╨KΦB └╒·*h≈╞l╦LiÇ6┐£░eRûÅ╩╠┴?÷¬lY╖τªX`JPc<Ü)∩#bñ}á{πƒjLfmΦ│▓ô■╓¼⌠;ñ╢ä├¥*╜ú▀òE$ⁿjΦOqSτ╝l╬yxαìÆ╔╬╠Mù╨!
  57653.  
  57654. onStartup
  57655.     "Private - Notify all the receiver's sub-instances of system startup."
  57656.  
  57657.     self primAllInstances do: [:i | i onStartup]!
  57658.  
  57659. ±V.!!íë3<╢╜║+ë*ΣÄ»═╚÷φⁿƒ▄æL▒ßÇzC]B╞à<^ÆlP8kZ^+b£Φ\j óo@o░┐z║σC6ëà₧┐┘√\ûfJ~eÜß0r╜╠╠_â«X─*╖MàΦPM=╥pì█Xæd╛    2╟╚â≈·üAí,▒»╙~║π!
  57660.  
  57661. ±V.!!í¢:&╛ê₧-É2Σ┌√û╛╓═╥É≤¿V║╖┼vwME╤▐~W¢ZI.kHP+°àKc%[¬s]y°δ)⌠┌K╗≈╕É¡Åàs[
  57662. │■] º▀┴MM╒[╙1páFñ|ä╝PAI7⌠pÅ╦M▄Cf½1╓£╫╢┼«`£ æÅÜ}º■Y▒t oçΓ6╨╦ΦO;├╬÷m=Θ╥l╓Cl╠:é╚æAu╛≡┤╛ìl┴αaN╛σªFBcIGKr:ïJΓ7dBU╟ìÅ▓Z5AI▐┴-Æ₧⌡æΣ┘M┴ùÑΦ⌐δ»ë ├:GR▓x╝ qLßú`╨yT■J▐àû¥▄÷╝¼╧OΣ5╖n∩'─≤±╨G@Lg▒£╖ `£;ìWƒ@Lbüemê⌡!!ú7S╩«ΩZ"zBl╙ZôÆ√w2▓úH+╝·Z▀û₧U█l7V╩±0Mⁿ·æ▒╫⌐╖⌡│╪êïVÅq«Θ/?M⌐ö╗▐/≈"]X╣ù╢Ä╠11ÿêl«å╜[░╣∩!!åN0=ö╟UΦH£í6₧á¿YÅòSπzrjΩ└╬â╘░ö1ÿ└^FΓ╗r!!╕αÿ┬üUQ─6.╙ñâh ≥┤
  57663. ╨ª₧lAú╔ ¿:<┐₧Be¬8E÷ä╛ε¥R╔uÑ⌠âòñ╧]+6░gOƒNß²╘∩â╪öó    E├G4Éèâe\~─ ≡¿KkÖöºiÿ╛á2█+_└|4∙Γ╟º┘tj/Φ╛ⁿRL"₧o6qéo∞vïÆúy⌡√┬╚+┬Θ╓ÖnSü9 ╟8ÇS5]ƒ$∞ºèkq│QPÑ8Ü⌐+mπ≡ΣñZ╓_o&∙tå╪┤│≈<═ΦΓc╟στ/╔xa'M∙Ω½\ε▄╗≈╔π πg7'∙╚hc▒└    ⌡æ3╫δzU┌åIïâÜùªMÖ_i⌠$;Y╙> ±ûF[{7∙│╡╡Γ}πw!
  57664.  
  57665. ±V.!!┤¢;&┤¿Çä-α┘Ω╪√┼àò┐ⁿÇfƃσHPY▄▐~SºJP>oY_n<ΓôXkf"╔@o«¡`Ω╠K╝ô▓ÿ÷┌
  57666. íuRk:Ü⌠l<ïσσtl░%░Vq½E╖h£╩PC=ímÖ≡PÉ4ù9▀öâπ┬│cìû¥Üy ₧≡EE»e~É┘2╥╩Z┌Bª6│²w!!°≈m╓Vo┬3┤∩ùVq▓ú╢ôèoα⌡nyò┼ƒ.'Veh6çµ$x@^┌WôQ┌ßXc8 ßÇ!!«v'╗╘⌠ï▀!!φ⌐«╪Ä~╗∞▌4åEZa{j╡z╚aZ╕±¬2à=ƒ▒åÜ╦IÖ┌└╒Vµ1╖ïZ¼Äæ╠
  57667. GjJ]$Wÿ^·₧)lé$ôO╞BbòBS╣╔!
  57668.  
  57669. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  57670. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥╪τ?!
  57671.  
  57672. uninitialize
  57673.     "Private - Uninitialize the receiver immediately prior to its removal from the system."
  57674.  
  57675.     VMLibrary default registryAt: #BSTR put: nil.
  57676.     SessionManager current removeEventsTriggeredFor: self!
  57677.  
  57678. ⌠J4
  57679. 0;¡ë;,╛Öì8ä2Σ└Ω▐╚╓╙└╗ƒ╧:}≈ìßIZixµ─0WÇ)@2EU╢ÆU`fY╖'>╦┬9⌡╦P¡╗▒!
  57680.  
  57681. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  57682. m»g|jmT]x≈Å
  57683. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{VÇÜ╩╖! !
  57684.  
  57685. !BSTR methodsFor!
  57686.  
  57687. asBSTR
  57688.     "Answer the receiver converted to an AX Automation string."
  57689.  
  57690.     ^self!
  57691.  
  57692. αW;à╜â─µC╟∩╟°╔∞ù╦▌╗▓∙`bÖ₧ßIAioî─,WçMA9kUGj Äi ╖tV*░«# ╫T║∙┌⌠₧ßR<┘4jk ╚╣~'ó▌ÇNAÖ╙pεB÷nÖ√]JD<ΦiÜ╨JòMq¿@=┴Ç┬∩î»u╚ù₧╙j╝°VJ╢ ~Ʋ6═┌Q≤@;┼P╘₧G÷┴8╓JkÇ-┤▀åMb╢╝┐φáñ±mY╖⌠íFBdUFk;Çú8p[┌╬╩á9S^▀Æ*àNé∙▐╢╝h≈·æ┬ë-╝ß┼ üGZai╒B╧.Rz├â[ßT√èë▓é╙█┼└ΩD┤<┐fΣ=╤─⌠▐    U35~├!
  57693.  
  57694. asString
  57695.     "Answer a String composed of the characters of the receiver, or
  57696.     the empty string if the receiver is a null pointer."
  57697.     
  57698.     ^self asUnicodeString asString!
  57699.  
  57700. asUnicodeString
  57701.     "Answer a UnicodeString composed of the characters of the receiver, or
  57702.     the empty string if the receiver is a null pointer (by convention a null BSTR 
  57703.     is treated the same as an empty string)."
  57704.  
  57705.     ^UnicodeString fromAddress: self length: self size!
  57706.  
  57707. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣`▓▀6£êò¡├²UP·74fi╔ⁿz;ó┼ÇXDå╙z╝H÷{Ö∙I*íQæ╫ZôFqƒ.┌£─╕Ä═σg÷ÑÑ]=ç╨ypΓftÅ▄'╠╓Qαo▀Z╓!
  57708.  
  57709. at: anInteger
  57710.     "Answer the character at index, anInteger, in the receiver."
  57711.  
  57712.     | index |
  57713.     index := anInteger+anInteger.
  57714.     ^Character value: (super at: index) * 256 + (super at: index-1)!
  57715.  
  57716. at: anInteger put: aCharacter
  57717.     "Replace the character at index, anInteger, in the receiver with aCharacter."
  57718.  
  57719.     ^super at: anInteger+anInteger-1 put: aCharacter!
  57720.  
  57721. attach: newValue
  57722.     "Private - Set the receiver to be a reference to the <bstr>, newValue.
  57723.     Answer the receiver."
  57724.  
  57725.     ^super value: newValue!
  57726.  
  57727. basicFree
  57728.     "Private - Free the receiver's external resources."
  57729.  
  57730.     OLEAutLibrary default sysFreeString: self.
  57731.     self value: 0!
  57732.  
  57733. byteSize
  57734.     "Answer the size in bytes of the string pointed at by the receiver, including any
  57735.     embedded nulls, but excluding the terminating null."
  57736.     
  57737.     ^OLEAutLibrary default sysStringByteLen: self!
  57738.  
  57739. copy
  57740.     "Answer an <Object> which is a copy of the receiver (by default a copy which shares the receiver's 
  57741.     instance variables). This may be reimplemented to return a deep copy, or some other 
  57742.     form of copy (e.g. a 2-level copy, or, for an identify object, the same object), whatever
  57743.     is appropriate for the receiver."
  57744.  
  57745.     ^self deepCopy!
  57746.  
  57747. deepCopy
  57748.     "Answer a 'deep copy' of the receiver. The 'deep copy' is a clone of the receiver,
  57749.     sharing only those parts which cannot be copied (e.g. classes, nil, true, false, 
  57750.     SmallIntegers, Symbols, Characters, etc).
  57751.     Implementation Note: Override #deepCopy rather than #_deepCopy: because this
  57752.     is a byte object and the sole purpose of which is to act as a reference to another
  57753.     object, and there is no point copying its body."
  57754.  
  57755.     ^OLEAutLibrary default sysAllocString: self!
  57756.  
  57757. displayOn: aStream
  57758.     "Append a developer friendly textual representation of the receiver to aStream."
  57759.  
  57760.     aStream 
  57761.         nextPutAll: self asString!
  57762.  
  57763. finalize
  57764.     "The receiver is about to expire, so free the sys. alloc'd string."
  57765.  
  57766.     self free!
  57767.  
  57768. free
  57769.     "Private - Frees the receiver's external resources by releasing the interface."
  57770.  
  57771.     self asInteger == 0
  57772.         ifFalse: [self basicFree]!
  57773.  
  57774. onStartup
  57775.     "Private - The system is starting. Modify the state of the receiver to account for the fact
  57776.     than any external memory allocated for the receiver during the previous session is no 
  57777.     longer accessible."
  57778.  
  57779.     self beUnfinalizable.
  57780.     super value: 0!
  57781.  
  57782. printOn: aStream
  57783.     "Append a developer friendly textual representation of the receiver to aStream."
  57784.  
  57785.     aStream 
  57786.         basicPrint: self;
  57787.         nextPut: $(;
  57788.         print: self asUnicodeString;
  57789.         nextPut: $)!
  57790.  
  57791. size
  57792.     "Answer the number of characters (including any embedded nulls, but excluding the 
  57793.     terminating null) in the receiver. If the receiver is a null pointer, then the answer will
  57794.     be zero."
  57795.     
  57796.     ^OLEAutLibrary default sysStringLen: self!
  57797.  
  57798. value
  57799.     "Answer the receiver's value as a Smalltalk <String>."
  57800.  
  57801.     ^self asString!
  57802.  
  57803. value: newValue
  57804.     "Set the contents of the receiver to be a BSTR (String) representation of the 
  57805.     representation of the specified object. If the argument is itself a BSTR, then a copy
  57806.     is taken. Answer the receiver."
  57807.  
  57808.     | bstr |
  57809.     newValue isInteger 
  57810.         ifTrue: [bstr := self class fromAddress: newValue]
  57811.         ifFalse: [
  57812.             bstr := newValue asBSTR.
  57813.             bstr == newValue ifTrue: [bstr := bstr copy]].
  57814.     super value: (bstr beUnfinalizable; yourself)! !
  57815.  
  57816. ExternalMemory comment:
  57817. ''!
  57818. !ExternalMemory class methodsFor!
  57819.  
  57820. Alloc: anInteger
  57821.     "Private - Allocate and answer anInteger bytes of memory from the process
  57822.     heap."
  57823.  
  57824.     ^KernelLibrary default 
  57825.         heapAlloc: self processHeap asParameter
  57826.         dwFlags: 0
  57827.         dwBytes: anInteger
  57828. !
  57829.  
  57830. allocator
  57831.     "Private - Answer the appropriate allocator for the receiver.
  57832.     The allocator must implement:
  57833.         #Alloc:
  57834.         #Free:
  57835.         #Realloc:cb:"
  57836.  
  57837.     ^self!
  57838.  
  57839. clear: anExternalAddress
  57840.     self free: anExternalAddress!
  57841.  
  57842. DidAlloc: anAddress
  57843.     "Private - Answer whether the specified memory block was allocated from the
  57844.     process heap (0 = no, 1 = yes, -1 = don't know).
  57845.     Implementation Note: About the best we can do is to attempt to validate the
  57846.     heap block. The answer may not be very reliable, and on a debug kernel
  57847.     may cause additional unspecified activity!!"
  57848.  
  57849.     anAddress isNull ifTrue: [^-1].
  57850.     ^(KernelLibrary default
  57851.         heapValidate: self processHeap asParameter
  57852.         dwFlags: 0
  57853.         lpMem: anAddress)
  57854.             ifTrue: [1]
  57855.             ifFalse: [0]!
  57856.  
  57857. free: anExternalMemoryAddress
  57858.     "Free the memory block (assumed to have been previously allocated via the receiver)
  57859.     at anExternalMemoryAddress."
  57860.  
  57861.     self assert: [(self allocator DidAlloc: anExternalMemoryAddress) ~~ 0].
  57862.     self allocator Free: anExternalMemoryAddress!
  57863.  
  57864. Free: anAddress
  57865.     "Private - Free the memory at the specified address (which must
  57866.     previously have been allocated from the process heap)."
  57867.  
  57868.     KernelLibrary default
  57869.         heapFree: self processHeap asParameter
  57870.         dwFlags: 0
  57871.         lpMem: anAddress!
  57872.  
  57873. fromInteger: anInteger
  57874.     "Answer a new instance of the receiver with contents copied from anInteger
  57875.     Implementation note: Override superclass to make use of the external call
  57876.     primitive coercion trick."
  57877.  
  57878.     ^(super fromInteger: anInteger) becomeA: self!
  57879.  
  57880. fromString: aString
  57881.     "Answer a new instance of the receiver pointing at a memory block containing
  57882.     the bytes of the argument, aString. There is no need to null terminate because
  57883.     ExternalMemory blocks are initialized with zeros."
  57884.  
  57885.     | answer size |
  57886.     size := aString byteSize.
  57887.     answer := self new: size.
  57888.     answer replaceFrom: 1 to: aString basicSize with: aString startingAt: 1.
  57889.     ^answer!
  57890.  
  57891. GetSize: anAddress
  57892.     "Private - Answer the size of the specified heap block, or -1
  57893.     (actually 16rFFFFFFFF) for failure)."
  57894.  
  57895.     ^KernelLibrary default 
  57896.         heapSize: self processHeap asParameter
  57897.         dwFlags: 0
  57898.         lpMem: anAddress!
  57899.  
  57900. HeapMinimize
  57901.     "Private - Minimize the size of the process heap."
  57902.  
  57903.     KernelLibrary default
  57904.         heapCompact: self processHeap asParameter
  57905.         dwFlags: 0!
  57906.  
  57907. new
  57908.     "Answer a new instance of the receiver of the initially holding a null pointer."
  57909.  
  57910.     ^(self basicNew: 4)
  57911.         beFinalizable; 
  57912.         yourself!
  57913.  
  57914. new: anInteger
  57915.     "Answer a new instance of the receiver of the 
  57916.     pointing at a block of memory of size anInteger bytes,
  57917.     allocated from a COM IMalloc allocator."
  57918.  
  57919.     ^self new 
  57920.         allocate: anInteger!
  57921.  
  57922. newFixed: anInteger
  57923.     "Answer a new instance of the receiver of the 
  57924.     pointing at an immovable block of memory of size anInteger bytes,
  57925.     allocated from an external heap."
  57926.  
  57927.     ^self new: anInteger!
  57928.  
  57929. processHeap
  57930.     "Private - Answer an object representing the process heap which
  57931.     can be passed to a Win32 HeapXXX() API call."
  57932.  
  57933.     ^KernelLibrary default getProcessHeap!
  57934.  
  57935. queryInterface: interfaceClass ifNone: exceptionHandler
  57936.     "Answer a new interface which supports the specified interface protocol
  57937.     (usually a class). If the receiver does not support the interface,
  57938.     answer the result of evaluating the niladic valuable, exceptionHandler.
  57939.     N.B. It is not necessary to answer an instance of the requested interface class,
  57940.     a subinstance will do, or even a completely different class, as long as the
  57941.     protocol of the requested class is supported.."
  57942.  
  57943.     ^interfaceClass == IMalloc
  57944.         ifTrue: [interfaceClass on: self]
  57945.         ifFalse: [exceptionHandler value]!
  57946.  
  57947. Realloc: anAddress cb: anInteger
  57948.     "Private - Resize the specified heap block, answering the new address,
  57949.     or 0 on failure."
  57950.  
  57951.     ^(KernelLibrary default
  57952.         heapReAlloc: self processHeap asParameter
  57953.         dwFlags: 0
  57954.         lpMem: anAddress
  57955.         dwBytes: anInteger) asInteger! !
  57956.  
  57957. !ExternalMemory methodsFor!
  57958.  
  57959. allocate: anInteger
  57960.     "Allocate anInteger bytes of memory through the receiver's
  57961.     allocator, freeing any existing allocation. Answer the receiver."
  57962.  
  57963.     self isNull
  57964.         ifFalse: [self basicFree].
  57965.     self basicAllocate: anInteger!
  57966.  
  57967. allocator
  57968.     "Private - Answer the appropriate allocator for the receiver.
  57969.     The allocator must implement:
  57970.         #Alloc:
  57971.         #Free:
  57972.         #Realloc:cb:"
  57973.  
  57974.     ^self class allocator!
  57975.  
  57976. basicAllocate: anInteger
  57977.     "Private - Allocate anInteger bytes of memory through the receiver's
  57978.     IMalloc interface. Answer the receiver. The memory is initialized with zeros.
  57979.     N.B. Does not free any existing allocation."
  57980.  
  57981.     | pBlock |
  57982.     pBlock := self allocator Alloc: anInteger.
  57983.     pBlock isNull ifTrue: [^OutOfMemoryError signal].
  57984.     KernelLibrary default zeroMemory: pBlock length: anInteger.
  57985.     self value: pBlock!
  57986.  
  57987. basicFree
  57988.     "Private - Free external resources held by the receiver."
  57989.  
  57990.     self allocator Free: self!
  57991.  
  57992. finalize
  57993.     "Private - Finalize the affairs of the receiver - certain death imminent.
  57994.     As the receiver points at memory allocated using a COM allocator,
  57995.     we must free it back using the appropriate IMalloc."
  57996.  
  57997.     self basicFree!
  57998.  
  57999. free
  58000.     "Free external resources held by the receiver, and leave in a clean state."
  58001.  
  58002.     self isNull ifFalse: [
  58003.         self beUnfinalizable.
  58004.         self basicFree.
  58005.         self clear]!
  58006.  
  58007. reallocate: anInteger
  58008.     "Resize the memory block pointed at by the receiver (may change the
  58009.     receiver's value) through the receiver's IMalloc. Answer the receiver."
  58010.  
  58011.     | newAddress |
  58012.     newAddress := self allocator Realloc: self cb: anInteger.
  58013.     newAddress isNull ifTrue: [^OutOfMemoryError signal].
  58014.     self value: newAddress!
  58015.  
  58016. resize: anInteger
  58017.     "Resize the memory block pointed at by the receiver. Answer the receiver.
  58018.     Implementation Note: This works via IMalloc::Realloc()."
  58019.  
  58020.     ^self reallocate: anInteger!
  58021.  
  58022. size
  58023.     "Answer the size of the memory block pointed at by the receiver."
  58024.  
  58025.     | sz |
  58026.     sz := self allocator GetSize: self.
  58027.     sz = 16rFFFFFFFF ifTrue: [self error: 'bad heap block'].
  58028.     ^sz! !
  58029.  
  58030. REFGUID comment:
  58031. 'REFGUID is a pointer class for referencing guids. It is mainly for use in situations where a GUID* pointer is passed back into Smalltalk, e.g. in block callbacks and COM method implementations.
  58032.  
  58033. Two distinct classes are provided for guids because, as of version 3.0, all classes in the system have an associated <GUID>. The GUID class is now a standard byte object subclassed directly from Object. The advantage of moving GUID itself out of the ExternalStructure hierarchy is that it avoids doubling the number of objects required to hold the per-class guids. The disadvantage is that GUID instances are no longer able to act as a pointer/references to externally stored guids, and hence we need this class to meet that requirement.
  58034.  
  58035. e.g.
  58036.  
  58037. REFGUID fromAddress: Object guid yourAddress'!
  58038. !REFGUID class methodsFor!
  58039.  
  58040. fromInteger: anInteger
  58041.     "Answer a new instance of the receiver with contents copied from anInteger"
  58042.  
  58043.     ^self new 
  58044.         basicDwordAtOffset: 0 put: anInteger;
  58045.         yourself! !
  58046.  
  58047. !REFGUID methodsFor!
  58048.  
  58049. _collate: comperand
  58050.     "Private - Answer the ordering relationship between the receiver
  58051.     and the argument, comperand."
  58052.  
  58053.     | status answer |
  58054.     status := ByteArray newFixed: 4.
  58055.     answer := RPCLibrary default uuidCompare: self uuid2: comperand status: status.
  58056.     status := status dwordAtOffset: 0.
  58057.     status == 0 ifFalse: [RPCError signalWith: status].
  58058.     ^answer!
  58059.  
  58060. = comperand
  58061.     "Answer whether the receiver is equivalent to the <Object>, comperand."
  58062.  
  58063.     ^self species = comperand species and: [(self _collate: comperand) == 0]!
  58064.  
  58065. asString
  58066.     "Answer a string representation of the receiver."
  58067.  
  58068.     ^self value asString!
  58069.  
  58070. displayOn: target
  58071.     "Append an 'end-user suitable' textual representation of the receiver to the
  58072.     <puttableStream> argument, target.
  58073.     GUIDs are a fairly technical concept, but they do appear in the registry in a
  58074.     certain format, which we use here."
  58075.  
  58076.     self value displayOn: target!
  58077.  
  58078. hash
  58079.     "Answer the SmallInteger hash value for the receiver.
  58080.     For correctness (we have overridden #= to use an external
  58081.     comparison) use the correct RPC library function."
  58082.  
  58083.     | status hash |
  58084.     status := ByteArray newFixed: 4.
  58085.     hash := RPCLibrary default uuidHash: self status: status.
  58086.     status := status dwordAtOffset: 0.
  58087.     ^status == 0 
  58088.         ifTrue: [hash]
  58089.         ifFalse: [RPCError signalWith: status]!
  58090.  
  58091. printOn: aStream
  58092.     "Append a developer friendly textual representation of the receiver to aStream."
  58093.  
  58094.     aStream 
  58095.         basicPrint: self;
  58096.         display: self value!
  58097.  
  58098. species
  58099.     "Answer the preferred class of the receiver - not always the same as the
  58100.     answer to #class."
  58101.  
  58102.     ^GUID!
  58103.  
  58104. value
  58105.     "Answer the <GUID> at which the receiver points."
  58106.  
  58107.     ^self species fromAddress: self!
  58108.  
  58109. value: guid
  58110.     "Set the 16-byte GUID pointed at by the receiver to the <GUID>, guid."
  58111.  
  58112.     self replaceFrom: 1 to: 16 with: guid startingAt: 1! !
  58113.  
  58114. COMTaskMemory comment:
  58115. ''!
  58116. !COMTaskMemory class methodsFor!
  58117.  
  58118. allocator
  58119.     "Private - Answer the appropriate allocator for the receiver.
  58120.     As we are representing a block of memory for the standard COM task allocator,
  58121.     answer that."
  58122.  
  58123.     ^IMalloc task!
  58124.  
  58125. initialize
  58126.     "Private - Initialize the receiver's class variables.
  58127.         COMTaskMemory initialize
  58128.     "
  58129.  
  58130.     self extraInstanceSpec: 4! !
  58131.  
  58132. WindowsShellMemory comment:
  58133. ''!
  58134. !WindowsShellMemory class methodsFor!
  58135.  
  58136. αH+69░Ç D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3IF┬û1BàVE>kRg∙éMi4ÑsA*╢ú%║╠G¡╛í¢σüqt■UM@yeÜ╜7ε█┼IZÉûaºM▒=æA■]@
  58137. 3íkÖ₧TÖO{╛|╒¥╤╢╪¿v╚ïÜ¥x╝⌡gìMJoâⁿ8₧▐SδN,═K╒┐@ É╞v╤Uk╥Ñ╘éP:±├Æôèoû╟hY╡∞₧wGG&6ï Γ<eQ┼┬ï╡V!
  58138.  
  58139. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐⌐■┴Çgmkl╓æh?í█┘A¢çtóJ¼x²kò"cUïî█UÜq┤.╥╗═σ╪í}ï¼ïûUεÑ! !
  58140.  
  58141. Symbol comment:
  58142. 'Symbol is the class of <String>s which are guaranteed to be unique throughout the system.
  58143.  
  58144. Symbol complies with the following ANSI protocols:
  58145.     Object
  58146.     magnitude
  58147.     collection
  58148.     sequencedReadableCollection
  58149.     readableString
  58150.     symbol'!
  58151. !Symbol class methodsFor!
  58152.  
  58153. addUnique: aSymbol
  58154.     "Private - Add the argument aSymbol as a new entry in the Symbol Table. This private method should only be 
  58155.     used for adding Symbols not already present in the symbol table. Please use Symbol>>intern: to obtain
  58156.     a Symbol from a String (or alternatively String>>asSymbol)."
  58157.  
  58158.     | bucket bucketIndex |
  58159.     bucketIndex := (aSymbol hashCharacters \\ Table basicSize) + 1.
  58160.     (bucket := Table basicAt: bucketIndex) isNil
  58161.         ifTrue: [Table basicAt: bucketIndex put: (WeakArray with: aSymbol)]
  58162.         ifFalse: [bucket replaceIdentity: DeadObject current with: aSymbol].
  58163.     ^aSymbol!
  58164.  
  58165. findInterned: aString
  58166.     "Answer the unique <Symbol> for aString if already defined, else nil.    
  58167.     N.B. This method previously had the selector #symbolAt:, and was private,
  58168.     but has been renamed and made public for compatibility with VisualWorks."
  58169.  
  58170.     | bucket corpse |
  58171.     bucket := Table basicAt: ((aString hashCharacters \\ Table basicSize) + 1).
  58172.     corpse := DeadObject current.
  58173.     bucket isNil ifFalse: [bucket do: [:s | ((s == corpse) == false and: [(aString trueCompare: s) == 0]) ifTrue: [^s]]].
  58174.     ^nil
  58175. !
  58176.  
  58177. fromString: aString
  58178.     "Answer a unique instance of the receiver whose contents are copied from aString."
  58179.  
  58180.     ^self intern: aString!
  58181.  
  58182. icon
  58183.     "Answers an Icon that can be used to represent this class"
  58184.  
  58185.     ^##(self) defaultIcon!
  58186.  
  58187. initialize
  58188.     "Initialize class variables of the receiver.
  58189.     
  58190.     Table    -    An Array which is used as a hash table containing WeakArray buckets, in which the currently used
  58191.                 instances of the receiver are kept."
  58192.  
  58193.     Table isNil ifTrue: [Table := Array new: 1706]!
  58194.  
  58195. intern: aString
  58196.     "Answer the unique Symbol for aString."
  58197.  
  58198.     | symbol |
  58199.     (symbol := self findInterned: aString) isNil
  58200.         ifTrue: [
  58201.             symbol := (super new: aString size) initialiseFrom: aString.
  58202.             self addUnique: symbol].
  58203.     ^symbol!
  58204.  
  58205. intern: aString cookie: cookie
  58206.     "Private - Callback from VM, returns the unique Symbol for aString.
  58207.     WARNING: Do not send this message from Smalltalk code. Do not modify or 
  58208.     remove this method."
  58209.  
  58210.     Processor callback: cookie evaluate: [self intern: aString]!
  58211.  
  58212. internCharacter: aCharacter
  58213.     "Answer the Character argument, aCharacter, as a single character unique symbol"
  58214.  
  58215.     ^self intern: aCharacter asString!
  58216.  
  58217. isLiteralSymbol: aSymbol
  58218.     "Private - Answer whether the <Symbol> argument is representable
  58219.     as an unquoted literal symbol."
  58220.  
  58221.     | size binChars |
  58222.     size := aSymbol basicSize.
  58223.     size == 0 ifTrue: [^false].
  58224.     binChars := '!!%&*+,/<=>?@\~|-'.
  58225.     (binChars identityIncludes: (aSymbol at: 1)) 
  58226.         ifTrue: 
  58227.             [aSymbol 
  58228.                 from: 2
  58229.                 to: size
  58230.                 do: [:each | (binChars identityIncludes: each) ifFalse: [^false]]]
  58231.         ifFalse: 
  58232.             [| lib includesColon initial |
  58233.             lib := CRTLibrary default.
  58234.             initial := true.
  58235.             includesColon := false.
  58236.             aSymbol 
  58237.                 from: 1
  58238.                 to: size
  58239.                 do: 
  58240.                     [:each | 
  58241.                     initial 
  58242.                         ifTrue: [(lib __iscsymf: each) ifTrue: [initial := false] ifFalse: [^false]]
  58243.                         ifFalse: 
  58244.                             [each == $: 
  58245.                                 ifTrue: [includesColon := initial := true]
  58246.                                 ifFalse: [(lib __iscsym: each) ifFalse: [^false]]]].
  58247.             (includesColon and: [aSymbol last ~~ $:]) ifTrue: [^false]].
  58248.     ^true!
  58249.  
  58250. new
  58251.     "Instances of the receiver can only be created by using the #intern: and #internCharacter:
  58252.     messages."
  58253.  
  58254.     ^self shouldNotImplement!
  58255.  
  58256. newAspect: aspectClass name: aSymbol
  58257.     "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  58258.         which is appropriate for representing aspects of the receiver's type."
  58259.  
  58260.     ^(aspectClass name: aSymbol) beImmutable
  58261. !
  58262.  
  58263. resizeTable
  58264.     "Private - Remove unused Symbols from the system - must be done to the exclusion of other processes, e.g:
  58265.         [Symbol resizeTable] forkAt: Processor timingPriority.
  58266.     By default we select a symbol table bucket size of about 6. This is appropriate for a development image, which
  58267.     interns a lot of symbols, but a runtime image could easily accomodate larger buckets to reduce the symbol table
  58268.     size. Answers the new size of the table."
  58269.  
  58270.     ^self resizeTable: 6
  58271. !
  58272.  
  58273. resizeTable: anInteger
  58274.     "Private - Change the size of the Symbol Table so that all of the existing symbols are in buckets
  58275.     the average length of which is approximately equal to the <integer> argument.
  58276.     N.B. The argument is not the size of the resulting symbol table, which is answered."
  58277.  
  58278.      | newSize insts |
  58279.     insts := self allInstances.
  58280.     newSize := (Integer primesUpTo: insts size // anInteger) last.
  58281.     Table := Array new: newSize.
  58282.     insts do: [:symbol | self addUnique: symbol].
  58283.     ^newSize!
  58284.  
  58285. stats
  58286.     "Private - Answer a String containing some statistics about the Symbol table
  58287.         self stats
  58288.     "
  58289.  
  58290.     | empty full count maxLen len l aStream corpses |
  58291.     empty := 0.
  58292.     full := 0.
  58293.     count := 0.
  58294.     maxLen := 0.
  58295.     corpses := 0.
  58296.     1 to: Table basicSize do: [ :i |
  58297.         (l := Table basicAt: i) isNil ifTrue: [ empty := empty + 1 ]
  58298.                 ifFalse: [
  58299.                     full := full + 1.
  58300.                     len := 0.
  58301.                     l do: [ :s | 
  58302.                         s == DeadObject current ifTrue: [ corpses := corpses + 1 ] ifFalse: [ len := len + 1 ]].
  58303.                     count := count + len.
  58304.                     len > maxLen ifTrue: [ maxLen := len ]]].
  58305.     aStream := String writeStream: 80.
  58306.     ^aStream
  58307.         nextPutAll: 'Empty buckets:    '; print: empty; cr;
  58308.         nextPutAll: 'Full buckets:    '; print: full; cr;
  58309.         nextPutAll: 'Empty slots:    '; print: corpses; cr;
  58310.         nextPutAll: 'Symbols:        '; print: count; cr;
  58311.         nextPutAll: 'Max Bkt Len:    '; print: maxLen; cr;
  58312.         nextPutAll: 'Avg Bkt Len:    '; print: (count/full asFloat);
  58313.         contents! !
  58314.  
  58315. !Symbol methodsFor!
  58316.  
  58317. = aSymbol
  58318.     "Symbols equality is the same as symbol identity since instances with the same
  58319.     characters are unique.
  58320.     The primitive should not fail."
  58321.  
  58322.     <primitive: 110>
  58323.     ^self primitiveFailed!
  58324.  
  58325. argumentCount
  58326.     "Answer the <integer> number of arguments required by a method with the
  58327.     receiver as its selector."
  58328.  
  58329.     | argCount ch |
  58330.     self basicSize == 0 ifTrue: [^0].
  58331.     argCount := self occurrencesOf: $:.
  58332.     ((ch := self at: 1) isLetter or: [ch == $_]) ifFalse: [
  58333.         argCount := argCount max: 1].
  58334.     ^argCount!
  58335.  
  58336. aspectDisplayOn: aStream
  58337.       "Private - Append a single-line textual representatin of the receiver to the <puttableStream>
  58338.       argument in a form that a user viewing the receiver as the value of a published aspect would 
  58339.       like to see it. Typically we use #displayOn: but some classes of object can use alternate display 
  58340.       formats. In this case we want to keep to use the printString format."
  58341.   
  58342.       self printOn: aStream!
  58343.  
  58344. asPhrase
  58345.     "Answer a <sequencedReadableCollection> of the 'words' in the receiver, as capitalized strings.
  58346.     The word boundaries are identified by colons (i.e. keywords) and capital letters."
  58347.  
  58348.     | stream last |
  58349.     stream := String writeStream: self size + 10.
  58350.     self do: 
  58351.             [:each | 
  58352.             last isNil 
  58353.                 ifTrue: [each == $: ifFalse: [last := stream nextPut: each asUppercase]]
  58354.                 ifFalse: 
  58355.                     [each == $: 
  58356.                         ifFalse: 
  58357.                             [last == $: 
  58358.                                 ifTrue: 
  58359.                                     [stream
  58360.                                         space;
  58361.                                         nextPut: each asUppercase]
  58362.                                 ifFalse: 
  58363.                                     [(each isUppercase and: [last isLowercase]) ifTrue: [stream space].
  58364.                                     stream nextPut: each]].
  58365.                     last := each]].
  58366.     ^stream contents!
  58367.  
  58368. asString
  58369.     "Answer a new <readableString> containing the characters of 
  58370.     the receiver."
  58371.  
  58372.     ^String fromString: self!
  58373.  
  58374. asSymbol
  58375.     "Answer the <symbol> containing the characters of the receiver
  58376.     (i.e. the receiver, since <symbol>s are unique)."
  58377.  
  58378.     ^self!
  58379.  
  58380. at: anInteger put: aCharacter
  58381.     "Symbols are immutable."
  58382.  
  58383.     ^self shouldNotImplement
  58384. !
  58385.  
  58386. basicAt: aSmallInteger put: value
  58387.     "Symbols are immutable."
  58388.  
  58389.     ^self shouldNotImplement!
  58390.  
  58391. deepCopy
  58392.     "Answer the receiver - Symbols are unique, so a copy with the same characters
  58393.     must not exist.
  58394.     N.B. This implementation may cause problems in generic code which attempts to
  58395.     modify copies of Strings!!"
  58396.     
  58397.     ^self!
  58398.  
  58399. displayString
  58400.     "Answer a String representation of the receiver in a form suitable for
  58401.     presentation to an end user.
  58402.     Implementation Note: Because our superclass implements #displayString to
  58403.     return self (for better performance), we must override back to a suitable
  58404.     implementation for Symbols which does not include the hash prefix."
  58405.  
  58406.     ^self basicCopy!
  58407.  
  58408. forwardTo: anObject
  58409.     "Send the <Object> argument the receiver as a niladic message,
  58410.     answering the result. Assumes the receiver is a unary selector."
  58411.  
  58412.     ^anObject perform: self!
  58413.  
  58414. hash
  58415.     "Answer the <integer> hash value for the receiver.
  58416.     Override back to the 16-bit identity hash which is temporally invariant,
  58417.     and very fast to calculate).
  58418.     The primitve should not fail (but must not be used for immediate objects).
  58419.     N.B. It is critical that this implementation is not changed."
  58420.  
  58421.     <primitive: 75>
  58422.     ^self primitiveFailed!
  58423.  
  58424. initialiseFrom: aString
  58425.     "Private - Initialize the receiver to contain the characters of aString.
  58426.     Sent to String because replaceFrom:with:startAt: is invalid for symbols"
  58427.  
  58428.     aString
  58429.         replaceBytesOf: self
  58430.         from: 1 to: aString size startingAt: 1
  58431. !
  58432.  
  58433. instVarAt: aSmallInteger put: value
  58434.     "Symbols are immutable."
  58435.  
  58436.     ^self shouldNotImplement!
  58437.  
  58438. isInfix
  58439.     "Answer whether the receiver is valid as an infix message selector."
  58440.  
  58441.     ^(Compiler isAValidInitialIdentifierChar: self first) not!
  58442.  
  58443. keywords
  58444.     "Answer a <sequencedReadableCollection> of the receiver's keywords."
  58445.  
  58446.     self isEmpty ifTrue: [^#()].
  58447.     ^self last == $:
  58448.         ifTrue: [(self subStrings: $:) collect: [:keyword | keyword, ':']]
  58449.         ifFalse: [Array with: self]!
  58450.  
  58451. printArgumentTypeOn: aStream
  58452.     "Private - Append a compilable argument type name, which is the receiver, to aStream."
  58453.  
  58454.     self displayOn: aStream!
  58455.  
  58456. printOn: aStream
  58457.     "Append a textual description of the receiver to aStream. If the receiver includes
  58458.     embedded spaces, then quote it. This may need to be extended to include other
  58459.     whitespace/non-printing characters."
  58460.  
  58461.     aStream nextPut: $#.
  58462.     (self class isLiteralSymbol: self)
  58463.         ifTrue: [aStream nextPutAll: self]
  58464.         ifFalse: [super printOn: aStream]!
  58465.  
  58466. refersToLiteral: anObject 
  58467.     "Private - Answer whether the receiver is a reference to the literal argument.
  58468.     This assumes that the receiver is in the role of a literal."
  58469.  
  58470.     ^self == anObject!
  58471.  
  58472. replaceFrom: start to: stop with: replacementCollection startingAt: repStart
  58473.     "Symbols are not mutable."
  58474.  
  58475.     ^self shouldNotImplement
  58476. !
  58477.  
  58478. shallowCopy
  58479.     "Answer the receiver - Symbols are unique, so we must not create a copy
  58480.     with the same characters."
  58481.  
  58482.     ^self!
  58483.  
  58484. species
  58485.     "Answer the generic type of String and its subclasses. Statically bind to
  58486.     the method's class so that subclasses will also answer that class."
  58487.  
  58488.     ^String!
  58489.  
  58490. stbSaveOn: anSTBOutFiler
  58491.     "Save out a binary representation of the receiver to anSTBOutFiler."
  58492.  
  58493.     anSTBOutFiler saveObject: self as: (STBSymbolProxy for: self)
  58494. !
  58495.  
  58496. sunitAsClass
  58497.     ^SUnitNameResolver classNamed: self! !
  58498.  
  58499. UnicodeString comment:
  58500. 'UnicodeString is a minimal class to support wide character (16-bit) Unicode strings. Natively Dolphin uses byte-character strings at present.
  58501.  
  58502. UnicodeStrings can be constructed from <String>s when needed by sending the #asUnicodeString message, and converted back again by sending the #asString message.'!
  58503. !UnicodeString class methodsFor!
  58504.  
  58505. elementSize
  58506.     "Answer the size of the elements of the receiver in bytes."
  58507.  
  58508.     ^2!
  58509.  
  58510. fromAddress: anAddress
  58511.     "Answer a new String instantiated from the null terminated string at anAddress."
  58512.  
  58513.     | len |
  58514.     len := KernelLibrary default lstrlenW: anAddress.
  58515.     ^self fromAddress: anAddress length: len!
  58516.  
  58517. fromAddress: anAddress length: anInteger
  58518.     "Answer a new UnicodeString, of length anInteger, copied from the first anInteger
  58519.     characters pointed at by anAddress."
  58520.  
  58521.     | answer |
  58522.     answer := self new: anInteger.
  58523.     anAddress asExternalAddress replaceBytesOf: answer from: 1 to: anInteger*2 startingAt: 1.
  58524.     ^answer!
  58525.  
  58526. fromString: aString
  58527.     "Answer a new instance of the receiver containing the same characters as the <String>
  58528.     argument.
  58529.     Implementation Note: CP_ACP is the only code page supported by Win95."
  58530.  
  58531.     | answer |
  58532.     answer := self new: aString size.
  58533.     (KernelLibrary default 
  58534.         multiByteToWideChar: CP_ACP
  58535.         dwFlags: 0
  58536.         lpMultiByteStr: aString
  58537.         cchMultiByte: -1
  58538.         lpWideCharStr: answer
  58539.         cchWideChar: answer basicSize) == 0 
  58540.         ifTrue: [^KernelLibrary default systemError].
  58541.     ^answer!
  58542.  
  58543. new: anInteger
  58544.     "Answer an instance of the receiver to accomodate exactly
  58545.     anInteger characters (plus a null-term)."
  58546.  
  58547.     ^super new: anInteger*2!
  58548.  
  58549. ±K.!!=╢╗+9┐─µC╟∩╟°╔∞ù╦▌╗▓∙v[½╛╥urDe╞û+QâJV/0PgσÆ^Mif]ªlAo▒«.ε₧Rí╣ú¢σ▄\
  58550. ÿ4JgsÜ╣u&½█╬XD╒èpεT┐iÿAΦYJdRêeæ╤MöGf∞    2╫¢╤≤╧┤zç╤┘■b─ÿihÆW9O░!
  58551.  
  58552. ±V.!!í¢:&╛ê₧-É2Σ┌√û╛╓═╥É≤¿V║╖┼vwME╤▐~W¢ZI.kHP+°àKc%[¬s]y°δ)⌠┌K╗≈╕É¡Åàs[
  58553. │■] º▀┴MM╒[╙1páFñ|ä╝PAI7⌠pÅ╦M▄Cf½1╓£╫╢┼«`£ æÅÜ}º■Y▒t oçΓ6╨╦ΦO;├╬÷m=Θ╥l╓Cl╠:é╚æAu╛≡┤╛ìl┴αaN╛σªFBcIGKr:ïJΓ7dBU╟ìÅ▓Z5AI▐┴-Æ₧⌡æΣ┘M┴ùÑΦ⌐δ»ë ├:GR▓x╝ qLßú`╨yT■J▐àû¥▄┘╗»ï(¥<┐fσ6╓Σ╕╓    i|[k#Tÿ>ò├?pön▀u╠QGq╞prä⌡!!╬1T╟ª╬E6/Gp┬@₧╙╦C(üεYj▓≤LÆæÜT▌vxUL╧⌠!!>╤eÖ ╤└ »«°╣┼ÿæòVñìWEd»£╒S▀+┐ec ╞╙┌º¼6w▒¢ ┤ì¬*░°Θ.åT09ƒ╟%ΘT╕φ;╓τ╝Fì╡F«=D@É╣ª┬,è░₧;Äôz⌡òh~Ω╖┘╪áXG┼>.≤ú╤C2╠²ô ±î!
  58554.  
  58555. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  58556. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥╓Σ>uδ!
  58557.  
  58558. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  58559. m»g|jmT]x≈Å
  58560. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{XâÖ╦╩╥O! !
  58561.  
  58562. !UnicodeString methodsFor!
  58563.  
  58564. asString
  58565.     "Answer a byte string representation of the receiver."
  58566.  
  58567.     | buf size bytes |
  58568.     size := self size.
  58569.     buf := String new: size+size.
  58570.     size == 0 ifTrue: [^buf].    "Avoid 'The Parameter is Incorrect' error"
  58571.     bytes := KernelLibrary default
  58572.         wideCharToMultiByte: 0
  58573.         dwFlags: 0
  58574.         lpWideCharStr: self
  58575.         cchWideChar: size
  58576.         lpMultiByteStr: buf
  58577.         cchMultiByte: buf size
  58578.         lpDefaultChar: nil
  58579.         lpUsedDefaultChar: nil.
  58580.     bytes == 0 ifTrue: [^KernelLibrary default systemError].
  58581.     buf resize: bytes.
  58582.     ^buf!
  58583.  
  58584. asUnicodeString
  58585.     "Answer a wide character String representation of the receiver."
  58586.  
  58587.     ^self!
  58588.  
  58589. at: anInteger
  58590.     "Answer the character at index, anInteger, in the receiver."
  58591.  
  58592.     | index |
  58593.     index := anInteger+anInteger.
  58594.     ^Character value: (self basicAt: index) * 256 + (self basicAt: index-1)!
  58595.  
  58596. at: anInteger put: aCharacter
  58597.     "Replace the character at index, anInteger, in the receiver with aCharacter."
  58598.  
  58599.     ^super at: anInteger+anInteger-1 put: aCharacter!
  58600.  
  58601. byteSize
  58602.     "Private - Answer the size in bytes of this object, including the null terminator."
  58603.  
  58604.     ^self basicSize + 2!
  58605.  
  58606. displayOn: aStream
  58607.     "Append the receiver in end-user form to aStream.
  58608.     We must convert to mbcs for display."
  58609.  
  58610.     aStream nextPutAll: self asString!
  58611.  
  58612. first: anInteger
  58613.     "Answer a copy of the receiver comprising the leftmost anInteger elements."
  58614.  
  58615.     ^self copyFrom: 1 to: anInteger!
  58616.  
  58617. indexOfAnyOf: aString startingAt: anInteger
  58618.     "Answer the one-based integer index of the first encountered element of the receiver which 
  58619.     is equal to one of the characters in the <readableString>, characters, starting from the one-based
  58620.     <integer> index, start, in the receiver. If no occurrences are found, then answer 0."
  58621.  
  58622.     | span |
  58623.     span := CRTLibrary default wcscspn: self yourAddress + ((anInteger - 1) * 2)
  58624.                 strCharSet: aString asUnicodeString.
  58625.     ^span + anInteger > self size ifTrue: [0] ifFalse: [span + anInteger]!
  58626.  
  58627. indexOfSubCollection: targetSequence startingAt: start
  58628.     "Answer the <integer> index of the next occurrence within the 
  58629.     receiver of the <sequencedReadableCollection> targetSequence,
  58630.     starting at the <integer> index start.
  58631.     If there are no such occurrences, answer 0."
  58632.  
  58633.     | size subSize firstElement j |
  58634.     subSize := targetSequence size.
  58635.     subSize == 0 ifTrue: [^0].
  58636.     firstElement := targetSequence at: 1.
  58637.     size := self size.
  58638.     subSize == 1
  58639.         ifTrue: [^self nextIndexOf: firstElement from: start to: size].
  58640.     start to: size - subSize + 1 do: [ :i |
  58641.         (self at: i) = firstElement
  58642.             ifTrue: [
  58643.                 j := 2.
  58644.                 [(self at: i + j - 1) = (targetSequence at: j)] whileTrue: [
  58645.                     j = subSize ifTrue: [^i].
  58646.                     j := j + 1]]].
  58647.     ^0!
  58648.  
  58649. nextIdentityIndexOf: anElement from: start to: stop
  58650.     "Answer the index of the next occurrence of anElement in the receiver's indexable
  58651.     variables between startIndex and stopIndex inclusive. If there are no such occurrences, answer 0.
  58652.     Implementation Note: Override the inherited implementation because the byte-character search
  58653.     primitives won't work."
  58654.  
  58655.     ^anElement class == Character 
  58656.         ifTrue: [self nextIndexOf: anElement from: start to: stop]
  58657.         ifFalse: [0 "Can only contain characters"]!
  58658.  
  58659. nextIndexOf: anElement from: start to: stop
  58660.     "Answer the index of the next occurrence of anElement in the receiver between 
  58661.     startIndex and stopIndex inclusive. If there are no such occurrences, answer 0."
  58662.  
  58663.     self from: start to: stop keysAndValuesDo: [:i :elem | elem = anElement ifTrue: [^i]].
  58664.     ^0!
  58665.  
  58666. replaceFrom: start to: stop with: replacementElements startingAt: repStart
  58667.     "Replace the characters of the receiver at index positions start through stop with 
  58668.     consecutive characters of aString beginning at index position startAt. Answer the 
  58669.     receiver."
  58670.  
  58671.     | offset |
  58672.     offset := repStart - start.
  58673.     (self == replacementElements and: [repStart < start]) 
  58674.         ifTrue: 
  58675.             ["Move within same object overlaps, so do backwards"
  58676.  
  58677.             stop to: start
  58678.                 by: -1
  58679.                 do: [:i | self at: i put: (replacementElements at: offset + i)]]
  58680.         ifFalse: 
  58681.             ["Non-overlapping moves are done forwards"
  58682.  
  58683.             start to: stop do: [:i | self at: i put: (replacementElements at: offset + i)]]!
  58684.  
  58685. resize: anInteger
  58686.     ^super resize: anInteger * 2!
  58687.  
  58688. size
  58689.     "Answer the number of characters in the receiver."
  58690.  
  58691.     ^self basicSize bitShift: -1! !
  58692.  
  58693. MourningWeakArray comment:
  58694. ''!
  58695. !MourningWeakArray class methodsFor!
  58696.  
  58697. elementsExpired: anInteger of: aWeakArray
  58698.     "Private - At least one of aWeakArray's elements has died, process the Corpses. The default is to
  58699.     do nothing but inform dependents. This message is sent to the aWeakArray's pathologist, 
  58700.     which is normally the receiver, but only if the receiver is marked as finalizable.
  58701.     The reason for making the default pathologist the receiver (i.e. the MourningWeakArray class)
  58702.     is to avoid creating a circular references in all MourningWeakArrays."
  58703.  
  58704.     aWeakArray trigger: #elementsExpired: with: anInteger!
  58705.  
  58706. initialize
  58707.     "Initialize the receiver."
  58708.  
  58709.     self makeMourner! !
  58710.  
  58711. !MourningWeakArray methodsFor!
  58712.  
  58713. elementsExpired: anInteger
  58714.     "Grieve for the loss of anInteger elements. Only objects marked as weak (see #beWeak) 
  58715.     will receive this message, and only then when objects that they are weakly referencing
  58716.     have no remaining strong references from objects reachable from the root objects (e.g.
  58717.     Smalltalk). By the time this message is received, the weakly referenced
  58718.     elements of the receiver will have been lost and replaced by Corpses.
  58719.     WeakArrays have no default behaviour for this message, so they forward it to
  58720.     their 'pathologist' so that it may perform whatever post mortem actions are necessary - e.g.
  58721.     to identify new corpses, and act accordingly (nil them out, or maintain a tally).
  58722.     Objects handling this message need to be aware that it is sent asynchronously, so they
  58723.     must not modify their contents except in a critical section which protects all access
  58724.     to that data from simultaneous access from other processes."
  58725.  
  58726.     self pathologist elementsExpired: anInteger of: self!
  58727.  
  58728. initialize
  58729.     "Private - Initialize the receiver's instance variables."
  58730.     
  58731.     super initialize.
  58732.     pathologist := self class!
  58733.  
  58734. pathologist
  58735.     "Private - Answer the receiver's 'pathologist'. #elementsExpired: messages sent
  58736.     to the receiver by the MemoryManager are forwarded to the pathologist for it to 
  58737.     do as it wishes with the receiver's Corpse elements. By default the pathologist 
  58738.     is the receiver's class, and the receiver does not expect to receiver any 
  58739.     #elementsExpired: messages."
  58740.  
  58741.     ^pathologist!
  58742.  
  58743. pathologist: anObject
  58744.     "Private - Set the receiver's 'pathologist' to anObject. See #pathologist."
  58745.  
  58746.     anObject isNil 
  58747.         ifTrue: [pathologist := self class]
  58748.         ifFalse: [pathologist := anObject]! !
  58749.  
  58750. LinkedList comment:
  58751. 'LinkedList is a class of <SequencedGrowableCollection> which is sequenced, ordered, contractible, expandable, readable and  writeable. The implementation is as an intrusively, singly, linked list (i.e. the elements hold the pointer to the next element), and requires that the elements of a LinkedList must be a kind of <Link> (or support the same protocol).
  58752.  
  58753. N.B. LinkedList is primarily present as an implementation artifact. The fact that it expects its elements to hold the makes it of limited use, since, unlike other SequenceableCollections, it cannot hold any type of object, and each element can only every exist in one linked list.
  58754.  
  58755. Instance Variables:
  58756.     firstLink        <Link>. Head of the list.
  58757.     lastList        <Link>. Tail of the list.'!
  58758. !LinkedList methodsFor!
  58759.  
  58760. addFirst: aLink
  58761.     "Add aLink at the head of the list; answer aLink."
  58762.  
  58763.     self isEmpty ifTrue: [lastLink := aLink].
  58764.     aLink nextLink: firstLink.
  58765.     ^firstLink := aLink!
  58766.  
  58767. addLast: aLink
  58768.     "Add aLink at then end of the list; answer aLink."
  58769.  
  58770.     self isEmpty 
  58771.         ifTrue: [firstLink := aLink]
  58772.         ifFalse: [lastLink nextLink: aLink].
  58773.     lastLink := aLink.
  58774.     ^aLink!
  58775.  
  58776. approxSize
  58777.     "Private - Answer the approximate size of the receiver.
  58778.     Implementation Note: The size of LinkedLists must be calculated (no tally
  58779.     is kept), which is expensive, so we revert to the basic collection
  58780.     implementation."
  58781.  
  58782.     ^2!
  58783.  
  58784. at: index
  58785.     "Answer the element that is the index'th Link of the linked list."
  58786.  
  58787.     | i aLink |
  58788.     i := 1.
  58789.     aLink := firstLink.
  58790.     [aLink isNil] whileFalse: [
  58791.         i = index ifTrue: [^aLink].
  58792.         i := i + 1.
  58793.         aLink := aLink nextLink].
  58794.     ^self errorSubscriptBounds: index
  58795. !
  58796.  
  58797. at: index put: anObject
  58798.     "Store anObject as the index'th element of the receiver.
  58799.     Not supported by LinkedLists at present."
  58800.  
  58801.     ^self shouldNotImplement!
  58802.  
  58803. do: operation
  58804.     "Evaluate the <monadicValuable> argument, operation, for each of the elements of the 
  58805.     receiver. Answers the receiver."
  58806.  
  58807.     | aLink |
  58808.     aLink := firstLink.
  58809.     [aLink isNil] whileFalse: [ 
  58810.         operation value: aLink.
  58811.         aLink := aLink nextLink]!
  58812.  
  58813. isEmpty
  58814.     "Answer whether the receiver contains no elements. 
  58815.     Implemenation Note: Override superclass to provide a more efficient implementation."
  58816.  
  58817.     ^firstLink isNil
  58818. !
  58819.  
  58820. remove: oldElement ifAbsent: exceptionHandler
  58821.     "Remove oldElement from the list and answer it, or evaluate the niladic
  58822.     valuable exceptionHandler if it's not found in the list.
  58823.     Implemenation Note: We use identity comparison, because the Links
  58824.     of a list are unique (necessitated by the 'intrusive' implementation)."
  58825.  
  58826.     | currLink |
  58827.     oldElement == firstLink 
  58828.         ifTrue: [ 
  58829.             firstLink := firstLink nextLink.
  58830.             firstLink isNil ifTrue: [lastLink := nil]]
  58831.         ifFalse: [ 
  58832.             currLink := firstLink.
  58833.             [currLink isNil ifTrue: [^exceptionHandler value]. currLink nextLink == oldElement] 
  58834.                 whileFalse: [currLink := currLink nextLink].
  58835.             currLink nextLink: oldElement nextLink.
  58836.             oldElement == lastLink ifTrue: [lastLink := currLink]].
  58837.     oldElement nextLink: nil.
  58838.     ^oldElement
  58839.  
  58840.     " A slightly neater, but slower (because of the need to use two locals), implementation"
  58841. "    | currLink prevLink |
  58842.     currLink := firstLink.
  58843.     [ currLink isNil ifTrue: [ ^exceptionHandler value ]. currLink == oldElement ] whileFalse: [
  58844.         prevLink := currLink.
  58845.         currLink := currLink nextLink ].
  58846.     currLink == firstLink 
  58847.         ifTrue: [ firstLink := currLink nextLink ]
  58848.         ifFalse: [ prevLink nextLink: currLink nextLink ].
  58849.     currLink == lastLink ifTrue: [ lastLink := prevLink ].
  58850.     oldElement nextLink: nil.
  58851.     ^oldElement"!
  58852.  
  58853. removeAll
  58854.     "Empty the receiver of all contents"
  58855.  
  58856.     firstLink := lastLink := nil!
  58857.  
  58858. removeAtIndex: index
  58859.     "Remove, and answer, the element of the receiver at the specified 
  58860.     <integer> index, by shuffling elements which succeed it down one slot.
  58861.     Raise an BoundsError if there is no element with that index."
  58862.  
  58863.     | currLink prevLink i |
  58864.     index < 1 ifTrue: [^self errorSubscriptBounds: index].
  58865.     currLink := firstLink.
  58866.     i := 1.
  58867.     [currLink isNil ifTrue: [^self errorSubscriptBounds: index].     "ran off the end"
  58868.      i = index] whileFalse: [
  58869.         i := i + 1.
  58870.         prevLink := currLink.
  58871.         currLink := currLink nextLink ].
  58872.     currLink == firstLink 
  58873.         ifTrue: [firstLink := currLink nextLink]
  58874.         ifFalse: [prevLink nextLink: currLink nextLink].
  58875.     currLink == lastLink ifTrue: [lastLink := prevLink].
  58876.     currLink nextLink: nil.
  58877.     ^currLink!
  58878.  
  58879. removeFirstIfAbsent: exceptionHandler
  58880.     "Remove and answer the first element of the receiver, but if the
  58881.     receiver is empty answer the result of evaluating the niladic valuable,
  58882.     exceptionHandler."
  58883.  
  58884.     | aLink |
  58885.     self isEmpty ifTrue: [^exceptionHandler value].
  58886.     aLink := firstLink.
  58887.     firstLink == lastLink
  58888.         ifTrue: [firstLink := nil. lastLink := nil]
  58889.         ifFalse: [firstLink := aLink nextLink].
  58890.     aLink nextLink: nil.
  58891.     ^aLink
  58892. !
  58893.  
  58894. removeLastIfAbsent: exceptionHandler
  58895.     "Remove and answer the last element of the receiver, but if the
  58896.     receiver is empty answer the result of evaluating the niladic valuable,
  58897.     exceptionHandler."
  58898.  
  58899.     | aLink temp |
  58900.     self isEmpty ifTrue: [^exceptionHandler value].
  58901.     aLink := lastLink.
  58902.     firstLink == lastLink
  58903.         ifTrue: [firstLink := nil. lastLink := nil]
  58904.         ifFalse: [
  58905.                 "The list is singly linked, so we must iterate through it"
  58906.             temp := firstLink.
  58907.             [temp nextLink == lastLink] whileFalse: [temp := temp nextLink].
  58908.             temp nextLink: nil.
  58909.             lastLink := temp].
  58910.     ^aLink!
  58911.  
  58912. size
  58913.     "Answer the number of elements in the receiver.
  58914.     Implementation Note: We maintain no kind of tally, so we must traverse
  58915.     the list to determine this - i.e. it's going to be quite SLOW."
  58916.  
  58917.     ^self countElements! !
  58918.  
  58919. ListModel comment:
  58920. 'ListModel implements the <listModel> protocol for identity based <sequencedCollecion>s. All of the manipulations that modify the list will trigger notification events such that Observers will be informed of the changes. The <listModel> protocol defines the following events:
  58921.  
  58922. #listChanged
  58923. #item:addedAtIndex:
  58924. #itemRemovedAtIndex:
  58925. #itemUpdatedAtIndex:
  58926.  
  58927. ListModel now uses a configurable policy to locate its elements, which means that EqualityListModel is redundant and should no longer be used.
  58928.  
  58929. Instance Variables:
  58930.     list        <sequencedCollection> which is the underlying list being managed.
  58931.     events        <EventsCollection>  holding the model''s event registrations.
  58932.     searchPolicy    <searchPolicy>. Policy used to search the receiver''s collection for elements.
  58933.  
  58934.  
  58935.  
  58936. '!
  58937. !ListModel class methodsFor!
  58938.  
  58939. defaultSearchPolicy
  58940.     "Answer the default <searchPolicy> used by instances of the receiver."
  58941.  
  58942.     ^SearchPolicy identity!
  58943.  
  58944. new
  58945.     "Answer a new initialized instance of the receiver, with the default search policy
  58946.     installed, on an empty OrderedCollection."
  58947.  
  58948.     ^self on: OrderedCollection new!
  58949.  
  58950. new: count
  58951.     "Answer a new instance of the receiver with an initial capacity of at least 
  58952.     <integer> count elements (i.e. the size is a hint)."
  58953.  
  58954.     ^self on: (OrderedCollection new: count)!
  58955.  
  58956. newEquality
  58957.     "Answer a new initialized instance of the receiver with the equality <SearchPolicy>."
  58958.  
  58959.     ^self newWithSearchPolicy: SearchPolicy equality!
  58960.  
  58961. newWithSearchPolicy: searchPolicy
  58962.     "Answer a new instance of the receiver with the specified <SearchPolicy>."
  58963.  
  58964.     ^self on: OrderedCollection new searchPolicy: searchPolicy!
  58965.  
  58966. on: aSequenceableCollection
  58967.     "Answer an instance of the receiver wrapped around the <sequencedCollection> argument
  58968.     and using the default <SearchPolicy>."
  58969.  
  58970.     ^self on: aSequenceableCollection searchPolicy: self defaultSearchPolicy!
  58971.  
  58972. on: list searchPolicy: searchPolicy
  58973.     "Answer a new initialized instance of the receiver, on the <sequencedReadableCollection>, list,
  58974.     and the <searchPolicy>, searchPolicy."
  58975.  
  58976.     ^super new
  58977.         setList: list searchPolicy: searchPolicy
  58978. !
  58979.  
  58980. publishedEventsOfInstances
  58981.         "Answer a Set of Symbols that describe the published events triggered
  58982.         by instances of the receiver."
  58983.     
  58984.         ^super publishedEventsOfInstances
  58985.             add: #itemUpdatedAtIndex:;
  58986.             add: #item:addedAtIndex:;
  58987.             add: #listChanged;
  58988.             add: #itemRemovedAtIndex:;
  58989.             yourself.
  58990.     !
  58991.  
  58992. stbConvertFrom: anSTBClassFormat
  58993.     "Convert from earlier version models.
  58994.     1: Added 'events' instance variable to ListModel.
  58995.     2: Added 'searchPolicy' instance variable."
  58996.  
  58997.     ^[:data | | newInst |
  58998.         newInst := self basicNew.
  58999.         newInst searchPolicy: self defaultSearchPolicy.
  59000.         data keysAndValuesDo: [:i :v | newInst instVarAt: i put: v].
  59001.         newInst]!
  59002.  
  59003. stbVersion
  59004.     ^2!
  59005.  
  59006. with: aSequenceableCollection
  59007.     "The superclass definition of this selector is to answer a new collection with the argument as the single
  59008.     initial element. This old definition in this class from 4.0 and earlier clashes with that meaning, and is therefore 
  59009.     deprecated. Use #on: instead."
  59010.  
  59011.     Notification deprecated. "Use #on:"
  59012.     ^self on: aSequenceableCollection!
  59013.  
  59014. with: list searchPolicy: searchPolicy
  59015.  
  59016.     Notification deprecated. "Use #on:searchPolicy:"
  59017.     ^self on: list searchPolicy: searchPolicy! !
  59018.  
  59019. !ListModel methodsFor!
  59020.  
  59021. add: newElement
  59022.     "Add newElement as a new element of the receiver. Answers newElement."
  59023.  
  59024.     self addAnsweringIndex: newElement.
  59025.     ^newElement!
  59026.  
  59027. add: newElement afterIndex: index
  59028.     "Add newElement to the receiver immediately after the element currently at the
  59029.     specified index. index must be between 0 and the receiver's current 
  59030.     size (if not raise an exception). Answer newElement."
  59031.  
  59032.     self list add: newElement afterIndex: index.
  59033.     self trigger: #item:addedAtIndex: with: newElement with: index+1.
  59034.     ^newElement!
  59035.  
  59036. addAll: newElements
  59037.     "Include all the elements of the <collection> argument, newElements, as the receiver's elements. 
  59038.     Answer newElements. This implementation is not particularly efficient since it falls
  59039.     back on adding the new elements one by one. This is to ensure that the #add:atIndex
  59040.     notifications are correctly triggered.
  59041.     Note that this modifies the and answers the receiver, not a copy."
  59042.  
  59043.     newElements do: [ :each | self add: each ].
  59044.     ^newElements!
  59045.  
  59046. addAnsweringIndex: newObject
  59047.     "Append newObject as the last element of the receiver. 
  59048.     Answer the index at which the object was added."
  59049.  
  59050.     | index |
  59051.     index := self list addAnsweringIndex: newObject.
  59052.     self trigger: #item:addedAtIndex: with: newObject with: index.
  59053.     ^index!
  59054.  
  59055. at: anInteger
  59056.     "Answer the element at index, anInteger, in the receiver."
  59057.  
  59058.     ^self list at: anInteger
  59059.  
  59060.  
  59061. !
  59062.  
  59063. at: index put: newElement
  59064.     "Replace the element of the receiver at the specified index with the argument, 
  59065.     newElement. If the index is out of bounds, raise an exception.
  59066.     Trigger the #itemUpdatedAtIndex: event to notify observers that the indexed
  59067.     item has been overwritten."
  59068.  
  59069.     self list at: index put: newElement.
  59070.     self notifyUpdatedAtIndex: index.
  59071.     ^newElement!
  59072.  
  59073. beSorted
  59074.     "Sort the collection held by the receiver using a default sort block"
  59075.  
  59076.     self list: self list asSortedCollection.
  59077. !
  59078.  
  59079. beSorted: aSortBlock
  59080.     "Sort the collection held by the receiver using aSortBlock"
  59081.  
  59082.     self list: (self list asSortedCollection: aSortBlock)
  59083. !
  59084.  
  59085. beUnsorted
  59086.     "Change the list in the receiver into an OrderedCollection. The
  59087.     existing ordering will still be intact so there is no need to trigger
  59088.     a #list change event"
  59089.  
  59090.     | newList |
  59091.     newList := OrderedCollection new: list size.
  59092.     newList addAll: list.
  59093.     list := newList
  59094. !
  59095.  
  59096. do: operation
  59097.     "Evaluate the <monadicValuable> argument, operation, for each of the 
  59098.     receiver's elements. Answers the receiver. The elements are evaluated in index order.
  59099.  
  59100.     Implementation Note: Implemented here only to improve performance."
  59101.  
  59102.     self list do: operation!
  59103.  
  59104. getEvents
  59105.     "Private - Answer the EventsCollection belonging to the receiver, or nil if the receiver
  59106.     has no events registered for it"
  59107.  
  59108.     ^events!
  59109.  
  59110. includes: target
  59111.     "Answer whether the argument, target, is one of the elements of the receiver.
  59112.     Implementation Note: Override in order to use the search policy."
  59113.  
  59114.     ^(self indexOf: target) ~= 0!
  59115.  
  59116. keyAtValue: value ifAbsent: operation
  59117.     "Answer the <integer> key of the <Object> argument, value. 
  59118.     If there is no such value, answer the result of evaluating the 
  59119.     <niladicValuable>, operation."
  59120.  
  59121.     ^searchPolicy keyAtValue: value in: self list ifAbsent: operation!
  59122.  
  59123. keysAndValuesDo: operation
  59124.     "Evaluate the <dyadicValuable>, operation, for each element of the receiver
  59125.     with the index of that element and the element itself as the arguments."
  59126.  
  59127.     self list keysAndValuesDo: operation
  59128. !
  59129.  
  59130. list
  59131.     "Answer the contents of the receiver"
  59132.  
  59133.     ^list!
  59134.  
  59135. list: aSequenceableCollection
  59136.     "Set the list of the receiver, i.e. the collection that it represents"
  59137.  
  59138.     list == aSequenceableCollection 
  59139.         ifFalse: 
  59140.             [list := aSequenceableCollection.
  59141.             self notifyListChanged]!
  59142.  
  59143. nextIdentityIndexOf: anElement from: start to: stop
  59144.     "Answer the index of the next occurrence of anElement in the receiver's indexable
  59145.     variables between startIndex and stopIndex inclusive. If there are no such occurrences, answer 0.
  59146.  
  59147.     Implementation Note: Implemented here only to improve performance, since the
  59148.     underlying 'list' may have a fast implementation of #nextIdentityIndexOf:from:to:"
  59149.  
  59150.     ^self list nextIdentityIndexOf: anElement from: start to: stop!
  59151.  
  59152. nextIndexOf: anElement from: start to: stop
  59153.     "Answer the index of the next occurrence of anElement in the receiver between 
  59154.     startIndex and stopIndex inclusive. If there are no such occurrences, answer 0.
  59155.     Implementation Note: We must delegate to our <searchPolicy>."
  59156.  
  59157.     ^self searchPolicy nextIndexOf: anElement in: self list from: start to: stop!
  59158.  
  59159. notifyListChanged
  59160.     self trigger: #listChanged!
  59161.  
  59162. notifyUpdatedAtIndex: anInteger
  59163.     self trigger: #itemUpdatedAtIndex: with: anInteger!
  59164.  
  59165. postCopy
  59166.     "Apply any final flourish to the copy that may be required
  59167.     in order to ensure that the copy does not share any state with
  59168.     the original, apart from the elements. Answer the receiver.
  59169.     In the case of a ListModel we need to ensure the contained collection
  59170.     is copied too, and the copy has no event registrations."
  59171.  
  59172.     super postCopy.
  59173.     list := list copy.
  59174.     events := nil!
  59175.  
  59176. removeAll
  59177.     "Empty the receiver of all contents.
  59178.     Implementation Note: We must be careful how we do this since we must preserve any
  59179.     attributes of the collection (e.g. the sort block of a sorted collection), but it must be empty
  59180.     even if an non-resizable collection such as an <Array>."
  59181.  
  59182.     self isEmpty ifFalse: [self list: (self list copyEmpty: 0)]!
  59183.  
  59184. removeAtIndex: anInteger
  59185.     "Remove, and answer, the element of the receiver at the specified 
  59186.     <integer> index, by shuffling elements which succeed it down one slot.
  59187.     Raise an BoundsError if there is no element with that index."
  59188.  
  59189.     | elem |
  59190.     elem := self list removeAtIndex: anInteger.
  59191.     self trigger: #itemRemovedAtIndex: with: anInteger.
  59192.     ^elem!
  59193.  
  59194. resize: anInteger
  59195.     "Private - Resize the receiver to accomodate anInteger elements.
  59196.     Answer the receiver."
  59197.  
  59198.     ^self list resize: anInteger!
  59199.  
  59200. searchPolicy
  59201.     "Answer the receiver's current <searchPolicy>."
  59202.  
  59203.     ^searchPolicy!
  59204.  
  59205. searchPolicy: policy
  59206.     "Set the receiver's <searchPolicy> to the argument."
  59207.  
  59208.     searchPolicy := policy!
  59209.  
  59210. select: discriminator
  59211.     "Evaluate the monadic valuable argument, discriminator, for each of the receiver's elements.
  59212.     Answer a new Collection like the receiver containing only those elements for which 
  59213.     the discriminator evaluates to true."
  59214.  
  59215.     ^self list select: discriminator!
  59216.  
  59217. setEvents: anEventsCollectionOrNil
  59218.     "Private - Set the EventsCollection of the receiver to be anEventsCollectionOrNil.
  59219.     Answer the receiver."
  59220.  
  59221.     events := anEventsCollectionOrNil!
  59222.  
  59223. setList: collection searchPolicy: policy
  59224.     "Private - Initialize the receiver's identity instance variables. Answer the receiver."
  59225.  
  59226.     list := collection.
  59227.     searchPolicy := policy!
  59228.  
  59229. size
  59230.     "Answer the number of elements in the receiver."
  59231.  
  59232.     ^self list size
  59233.  
  59234. !
  59235.  
  59236. species
  59237.     "Answer the class of object to be used when copying the receiver."
  59238.  
  59239.     ^OrderedCollection!
  59240.  
  59241. stbSaveOn: anSTBOutFiler
  59242.     "Output the receiver to anSTBOutFiler. We must ensure that the local events collection
  59243.     is NOT saved to the filer"
  59244.  
  59245.     anSTBOutFiler override: events with: nil.
  59246.     super stbSaveOn: anSTBOutFiler.!
  59247.  
  59248. updateAtIndex: anInteger
  59249.     "Update, and answer, an object in the receiver at anInteger index because 
  59250.     it's contents have changed. If anInteger index does not exist in the list 
  59251.     then raise a suitable exception. Answer anObject."
  59252.  
  59253.     | elem |
  59254.     elem := self list at: anInteger.
  59255.     self notifyUpdatedAtIndex: anInteger.
  59256.     ^elem!
  59257.  
  59258. updateItem: anObject
  59259.     "The <Object>, anObject, has been updated in some way. If anObject is an element of
  59260.     the receiver then notify observers of the index in the receiver that has been updated and
  59261.     answer that index, otherwise raise a <NotFoundError>."
  59262.  
  59263.     ^self updateItem: anObject ifAbsent: [self errorNotFound: anObject]!
  59264.  
  59265. updateItem: anObject ifAbsent: exceptionHandler
  59266.     "The <Object>, anObject, has been updated in some way. If anObject is an element of
  59267.     the receiver then notify observers of the index in the receiver that has been updated and
  59268.     answer that index, otherwise answer the result of evaluating the <niladicValuable>,
  59269.     eaxceptionHandler."
  59270.  
  59271.     | index |
  59272.     index := self indexOf: anObject.
  59273.     index == 0 ifTrue: [^exceptionHandler value].
  59274.     self notifyUpdatedAtIndex: index.
  59275.     ^index! !
  59276.  
  59277. OrderedCollection comment:
  59278. 'OrderedCollections store an ordered, contiguous sequence of elements. They are much like resizable arrays'!
  59279. !OrderedCollection class methodsFor!
  59280.  
  59281. new
  59282.     "Answer a new instance of the receiver with sufficient capacity (initially)
  59283.     for the default number of elements."
  59284.  
  59285.     ^self new: 5!
  59286.  
  59287. new: count
  59288.     "Answer a new instance of the receiver with sufficient initial capacity
  59289.     to hold the number of elements specified by the <integer> argument,
  59290.     count. The instance is initally empty (i.e.it reports 0 when sent #size)."
  59291.  
  59292.     ^(self basicNew: count) initialize!
  59293.  
  59294. ofSize: count
  59295.     "Private - Answer a new instance of the receiver with the number of
  59296.     nil elements specified by the <integer> argument, count.
  59297.  
  59298.     This method differs from OrderedCollection>>new:, as that
  59299.     method answers an <OrderedCollection> with the capacity for
  59300.     anInteger elements, but which is initially empty (i.e. it
  59301.     reports a size of 0)."
  59302.  
  59303.     ^(self basicNew: count)
  59304.         firstIndex: 1
  59305.         lastIndex: count! !
  59306.  
  59307. !OrderedCollection methodsFor!
  59308.  
  59309. add: newElement afterIndex: index
  59310.     "Add newElement to the receiver immediately after the element currently at the
  59311.     specified <integer> index. index must be between 0 and the receiver's current 
  59312.     size (if not raise an exception). Answer newElement."
  59313.  
  59314.     | basicIndex |
  59315.     basicIndex := index + firstIndex.
  59316.     (basicIndex > (lastIndex + 1) or: [basicIndex < firstIndex]) ifTrue: [^self errorSubscriptBounds: index].
  59317.     lastIndex == self basicSize ifTrue: [ 
  59318.         self makeRoomAtEndFor: 1.
  59319.         basicIndex := index + firstIndex].
  59320.     "Slide the elements down the collection toward the new end to make room for the insertion"
  59321.     lastIndex to: basicIndex by: -1 do: [:i | self basicAt: i + 1 put: (self basicAt: i)].
  59322.     lastIndex := lastIndex + 1.
  59323.     ^self basicAt: basicIndex put: newElement!
  59324.  
  59325. addAllFirst: newElements
  59326.     "Prepend all elements of the collection newElements to the receiver,
  59327.     in the order that they appear in newElements (as determined by
  59328.     its implementation of #do:). Answer newElements.
  59329.     Implementation Note: Override for better performance."
  59330.  
  59331.     | extra |
  59332.     extra := newElements size.
  59333.     firstIndex <= extra ifTrue: [self makeRoomAtFirstFor: extra - firstIndex + 1].
  59334.     newElements inject: 1 into: [:i :e | self basicAt: i put: e. i + 1].
  59335.     firstIndex := 1.
  59336.     ^newElements!
  59337.  
  59338. addAllLast: newElements
  59339.     "Append the elements of the <sequencedCollection>, newElements, to the receiver,
  59340.     in the order that they appear in newElements (as defined by its implementation
  59341.     of #do:). Answer newElements."
  59342.  
  59343.     | size |
  59344.     size := newElements size.
  59345.     self basicSize - lastIndex < size ifTrue: [self makeRoomAtEndFor: size].
  59346.     newElements 
  59347.         do: [:each | self basicAt: (lastIndex := lastIndex + 1) put: each].
  59348.     ^newElements!
  59349.  
  59350. addAnsweringIndex: newObject
  59351.     "Append newObject as the last element of the receiver. 
  59352.     Answer the index at which the object was added."
  59353.  
  59354.     self addLast: newObject.
  59355.     ^lastIndex - firstIndex + 1!
  59356.  
  59357. addFirst: newElement
  59358.     "Insert newElement as the first element of the receiver.
  59359.     Implementation Note: Override for performance."
  59360.  
  59361.     firstIndex == 1 ifTrue: [self makeRoomAtFirstFor: self growSize].
  59362.     firstIndex := firstIndex - 1.
  59363.     ^self basicAt: firstIndex put: newElement
  59364. !
  59365.  
  59366. addLast: newObject
  59367.     "Append newObject as the last element of the receiver. Answer newObject.
  59368.     Implementation Note: Override for performance."
  59369.  
  59370.     lastIndex == self basicSize ifTrue: [self makeRoomAtEndFor: 1].
  59371.     lastIndex := lastIndex + 1.
  59372.     ^self basicAt: lastIndex put: newObject!
  59373.  
  59374. asOrderedCollection
  59375.     "Answer an OrderedCollection containing the same elements as the receiver.
  59376.     No conversion is required in this case."
  59377.  
  59378.     ^self!
  59379.  
  59380. at: index
  59381.     "Answer the element at the specified <integer> index of the receiver."
  59382.  
  59383.     | basicIndex |
  59384.     ^(index < 1 or: [ (basicIndex := index + firstIndex - 1) > lastIndex ])
  59385.         ifTrue: [self errorSubscriptBounds: index]
  59386.         ifFalse: [self basicAt: basicIndex]!
  59387.  
  59388. at: index ifAbsent: exceptionBlock
  59389.     "Answer an <Object> which is the element of the receiver 
  59390.     at the specified index. If the index is out of bounds answer
  59391.     the result of evaluating the <niladicValuable> exceptionBlock."
  59392.  
  59393.     | basicIndex |
  59394.     ^(index < 1 or: [ (basicIndex := index + firstIndex - 1) > lastIndex ])
  59395.         ifTrue: [exceptionBlock value]
  59396.         ifFalse: [self basicAt: basicIndex]!
  59397.  
  59398. at: index put: storee
  59399.     "Replace the element at the <integer> index of the receiver with
  59400.     the <Object> argument, storee.
  59401.     Report an error if there is no such element."
  59402.  
  59403.     | basicIndex |
  59404.     ^(index < 1 or: [(basicIndex := index + firstIndex - 1) > lastIndex])
  59405.         ifTrue: [self errorSubscriptBounds: index]
  59406.         ifFalse: [self basicAt: basicIndex put: storee]!
  59407.  
  59408. copyWith: newElement
  59409.     "Answer a <sequencedReadableCollection> which is a copy of 
  59410.     the receiver that has newElement added in the correct position
  59411.     as defined by the receiver's sort order."
  59412.  
  59413.     ^self copy
  59414.         add: newElement;
  59415.         yourself!
  59416.  
  59417. copyWithout: oldElement
  59418.     "Answer a <sequencedReadableCollection> which is a copy of the receiver, but in
  59419.     which all occurrences of the <Object> oldElement have been removed."
  59420.  
  59421.     | answer |
  59422.     answer := self copyEmpty.
  59423.     self do: [:element | element = oldElement ifFalse: [answer add: element]].
  59424.     ^answer!
  59425.  
  59426. do: operation
  59427.     "Evaluate monadic value argument, operation, for each of the element of the 
  59428.     receiver. Answers the receiver.
  59429.     Implementation Note: Override to avoid error checking in #at: for better performance."
  59430.  
  59431.     firstIndex to: lastIndex do: [:i | operation value: (self basicAt: i)]!
  59432.  
  59433. firstIndex: first lastIndex: last
  59434.     "Private - Initialize the receiver's first and last indices."
  59435.  
  59436.     firstIndex := first.
  59437.     lastIndex := last
  59438. !
  59439.  
  59440. from: start to: stop keysAndValuesDo: operation
  59441.     "Evaluate the <dyadicValuable>, operation, for each element of the receiver
  59442.     between the <integer> indices, start and stop, inclusive with the element and its
  59443.     index as respectively the second and first arguments. A BoundsError will be
  59444.     raised if either start or stop is out of bounds."
  59445.  
  59446.     start to: stop do: [:i | operation value: i value: (self basicAt: i+firstIndex-1)]!
  59447.  
  59448. includes: target
  59449.     "Answer whether the argument, target, is one of the elements of the receiver.
  59450.     Implementation Note: Override superclass to provide a more efficient implementation."
  59451.  
  59452.     firstIndex to: lastIndex do: [:i | (self basicAt: i) = target ifTrue: [^true]].
  59453.     ^false!
  59454.  
  59455. initialize
  59456.     "Initialize the receiver after creation"
  59457.  
  59458.     firstIndex := 1.
  59459.     lastIndex := 0
  59460. !
  59461.  
  59462. insert: newElement before: anInteger 
  59463.     "Private - Insert the argument, newElement, into the receiver at the basic index
  59464.     specified by the argument, anInteger, shuffling any subsequent elements down.
  59465.     index must be between 0 and the receiver's current basic size (if not an exception
  59466.     is raised), however no check is made to ensure that it lies within the current
  59467.     first and last indices. Answer the index at which the element was actually
  59468.     inserted."
  59469.  
  59470.     | basicIndex |
  59471.     basicIndex := lastIndex == self basicSize 
  59472.                 ifTrue: 
  59473.                     [| offset |
  59474.                     offset := anInteger - firstIndex.
  59475.                     self makeRoomAtEndFor: 1.
  59476.                     firstIndex + offset]
  59477.                 ifFalse: [anInteger].
  59478.  
  59479.     "Slide the elements down the collection toward the new end to make room for the insertion"
  59480.     lastIndex to: basicIndex
  59481.         by: -1
  59482.         do: [:i | self basicAt: i + 1 put: (self basicAt: i)].
  59483.     lastIndex := lastIndex + 1.
  59484.     self basicAt: basicIndex put: newElement.
  59485.     ^basicIndex - firstIndex + 1!
  59486.  
  59487. isEmpty
  59488.     "Answer whether the receiver contains no elements. 
  59489.     Implementation Note: Override superclass to provide a more efficient implementation."
  59490.  
  59491.     ^firstIndex > lastIndex!
  59492.  
  59493. makeRoomAtEndFor: anInteger
  59494.     "Private - Make room at the end of the receiver to accomodate at least anInteger
  59495.     more elements. If there is insufficient free space in the receiver, then it is expanded 
  59496.     to accomodate    more elements."
  59497.  
  59498.     | shift capacity |
  59499.     capacity := self basicSize.
  59500.     (capacity - self size) < anInteger ifTrue: [
  59501.         "Too full, increase the receivers capacity. We don't bother shifting" 
  59502.         ^self resize: capacity + (anInteger roundUpTo: self growSize)].
  59503.     shift := 1 - firstIndex.    "N.B. shift < 0"
  59504.  
  59505.     "Move tail of collection towards head"
  59506.     firstIndex to: lastIndex do: [:i | self basicAt: i + shift put: (self basicAt: i)].
  59507.     "Nil out old slots"
  59508.     lastIndex + shift + 1 to: lastIndex do: [:i | self basicAt: i put: nil].
  59509.     firstIndex := 1.
  59510.     lastIndex := lastIndex + shift!
  59511.  
  59512. makeRoomAtFirstFor: anInteger
  59513.     "Private - Make room at the start of the receiver to accomodate anInteger elements."
  59514.  
  59515.     | newOrderedCollection |
  59516.     newOrderedCollection := self class new: self basicSize + anInteger.
  59517.     firstIndex to: lastIndex do: [:i | newOrderedCollection basicAt: anInteger + i put: (self basicAt: i)].
  59518.     newOrderedCollection 
  59519.         firstIndex: anInteger + firstIndex
  59520.         lastIndex: anInteger + lastIndex.
  59521.     ^self become: newOrderedCollection!
  59522.  
  59523. nextIdentityIndexOf: anElement from: start to: stop
  59524.     "Answer the index of the next occurrence of anElement in the receiver's indexable
  59525.     variables between startIndex and stopIndex inclusive. If there are no such occurrences, answer 0.
  59526.     Override the inherited implementation to make use of the primitive as the receiver's elements
  59527.     are contiguous between the first and last indices."
  59528.  
  59529.     | index offset |
  59530.     offset := firstIndex - 1.
  59531.     index := self basicIdentityIndexOf: anElement from: start+offset to: stop+offset.
  59532.     ^index == 0
  59533.         ifTrue: [0]
  59534.         ifFalse: [index - offset]!
  59535.  
  59536. nextIndexOf: anElement from: start to: stop
  59537.     "Answer the index of the next occurrence of anElement in the receiver between 
  59538.     startIndex and stopIndex inclusive. If there are no such occurrences, answer 0.
  59539.     Implementation Note: Override the superclass to provide a more efficient
  59540.     inlined implementation (important for serial searches)."
  59541.  
  59542.     start to: stop do: [:i | (self basicAt: i+firstIndex-1) = anElement ifTrue: [^i]].
  59543.     ^0!
  59544.  
  59545. removeAll
  59546.     "Empty the receiver of all contents"
  59547.  
  59548.     #todo "Implement more efficient mechanism (need a basic block write operation)".
  59549.     firstIndex to: lastIndex do: [:i | self basicAt: i put: nil].
  59550.     firstIndex := 1.
  59551.     lastIndex := 0!
  59552.  
  59553. removeAtIndex: index
  59554.     "Remove, and answer, the element of the receiver at the specified 
  59555.     <integer> index, by shuffling elements which succeed it down one slot.
  59556.     Raise an BoundsError if there is no element with that index."
  59557.  
  59558.     | element basicIndex |
  59559.     element := self at: index.
  59560.     (basicIndex := index + firstIndex - 1) == firstIndex
  59561.         ifTrue: [
  59562.             self basicAt: firstIndex put: nil.
  59563.             firstIndex := firstIndex + 1]
  59564.         ifFalse: [
  59565.             basicIndex + 1 to: lastIndex do: [:i | self basicAt: i - 1 put: (self basicAt: i)].
  59566.             self basicAt: lastIndex put: nil.
  59567.             lastIndex := lastIndex - 1].
  59568.     ^element!
  59569.  
  59570. resize: anInteger
  59571.     "Private - Override back to the basic implementation as our elements are contiguously located.
  59572.     This changes the capacity of the receiver, but has no other effect."
  59573.  
  59574.     <primitive: 101>
  59575.     ^super resize: anInteger!
  59576.  
  59577. select: discriminator
  59578.     "Evaluate the monadic valuable argument, discriminator, for each of the receiver's elements.
  59579.     Answer a new Collection like the receiver containing only those elements for which 
  59580.     the discriminator evaluates to true."
  59581.  
  59582.     | newCollection |
  59583.     newCollection := self copyEmpty.
  59584.     self do: [:each | (discriminator value: each) ifTrue: [newCollection add: each]].
  59585.     ^newCollection!
  59586.  
  59587. setSize: anInteger
  59588.     | newLast |
  59589.     newLast := firstIndex + anInteger - 1.
  59590.     "Nil out any slots after the new last index"
  59591.     newLast + 1 to: lastIndex do: [:each | self basicAt: each put: nil].
  59592.     "Resize if necessary"
  59593.     newLast > self basicSize ifTrue: [self makeRoomAtEndFor: newLast - lastIndex].
  59594.     "Making room may have shifted elements down so must recalc."
  59595.     lastIndex := firstIndex + anInteger - 1.!
  59596.  
  59597. size
  59598.     "Answer the number of elements in the receiver."
  59599.  
  59600.     ^lastIndex - firstIndex + 1
  59601. !
  59602.  
  59603. stbSaveOn: anSTBOutFiler
  59604.     "Save out a binary representation of the receiver to anSTBOutFiler."
  59605.  
  59606.     anSTBOutFiler saveObject: self as: (STBCollectionProxy for: self)! !
  59607.  
  59608. Semaphore comment:
  59609. ''!
  59610. !Semaphore class methodsFor!
  59611.  
  59612. boolean
  59613.     "Answer a new Boolean Semaphore, initially signalled.
  59614.     The communication messages #set, and #pulse are intended for use
  59615.     with Boolean Semaphores, rather than #signal."
  59616.  
  59617.     ^self new signal; yourself!
  59618.  
  59619. forMutualExclusion
  59620.     "Answer a new instance of the receiver with one excess signal (i.e a Boolean semaphore)."
  59621.  
  59622.     ^self boolean!
  59623.  
  59624. new
  59625.     "Answer a new semaphore which will block when the first wait is executed on it 
  59626.     (i.e. it's initial value is zero)."
  59627.  
  59628.     ^self basicNew initialize! !
  59629.  
  59630. !Semaphore methodsFor!
  59631.  
  59632. = anObject
  59633.     "Answer whether the receiver and anObject are considered equivalent.
  59634.     An equality comparison based on the list of processes waiting on the
  59635.     receiver does not make sense for a Semaphore, so override back to
  59636.     the default (identity-based) implementation from Object."
  59637.  
  59638.     <primitive: 110> 
  59639.     ^self primitiveFailed!
  59640.  
  59641. add: newElement afterIndex: index
  59642.     "Add newElement to the receiver immediately after the element currently at the
  59643.     specified <integer> index. index must be between 0 and the receiver's current 
  59644.     size (if not raise an exception). Answer newElement."
  59645.  
  59646.     ^self shouldNotImplement!
  59647.  
  59648. critical: aBlock
  59649.     "Evaluate aBlock as a critical section - i.e. aBlock is evaluated only when
  59650.     no other Blocks are being evaluated under the control of the receiver.
  59651.     Ensure semaphore does not remain decremented, even should an exception be thrown by aBlock.
  59652.     However note that the critical section will remain 'locked' until the exception is
  59653.     actually handled and the stack is unwound past this point.
  59654.  
  59655.     Implementation Note: It is possible that the VM may interrupt this process between
  59656.     the time that the #wait completes and any subsequent instructions being run
  59657.     (in fact it is quite likely in a low priority process). If the interrupt terminates the 
  59658.     process, then the Semaphore could be left locked. The simpler
  59659.     implementation in 2.1 and earlier (with the #wait outside the #ensure: block)
  59660.     thus had a very small window when the Semaphore could be left in an invalid
  59661.     state if the process was interrupted. This implementation fixes that bug - it
  59662.     is not possible for the process to be interrupted without a value having been
  59663.     assigned into the return value holder."
  59664.  
  59665.     | retHolder |
  59666.     retHolder := Array new: 1.
  59667.     ^[
  59668.         self wait: INFINITE ret: retHolder.
  59669.         aBlock value
  59670.     ] ensure: [
  59671.         (retHolder basicAt: 1) == WAIT_OBJECT_0 
  59672.             ifTrue: [self signal]]!
  59673.  
  59674. critical: aBlock atPriority: anInteger
  59675.     "Evaluate aBlock as a critical section - i.e. aBlock is evaluated only when
  59676.     no other Blocks are being evaluated under the control of the receiver.
  59677.     Ensure semaphore does not remain decremented, even should an exception be thrown by aBlock.
  59678.     The active processes priority is temporarily raised to the argument, anInteger,
  59679.     during the execution of the critical section.
  59680.     The purpose of this message is to avoid the starvation of a high priority process which can occur
  59681.     if it shares a critical section with a low priority process which never gets scheduled due to other
  59682.     process' activities."
  59683.  
  59684.     | activePriority waitResult |
  59685.     activePriority := Processor activeProcess priority: anInteger.
  59686.     waitResult := Array new: 1.
  59687.     ^[
  59688.         self wait: INFINITE ret: waitResult.
  59689.         aBlock value
  59690.     ] ensure: [
  59691.         (waitResult basicAt: 1) == WAIT_OBJECT_0 
  59692.             ifTrue: [self signal].
  59693.         Processor activeProcess priority: activePriority]!
  59694.  
  59695. excessSignals
  59696.     "Private - Answer the count of signals in excess of waits to the receiver"
  59697.  
  59698.     ^signals!
  59699.  
  59700. hash
  59701.     "Answer the SmallInteger hash value for the receiver. 
  59702.     A hash value based on the list of processes waiting on the
  59703.     receiver does not make sense for a Semaphore, so override back to
  59704.     the default (identity hash) implementation from Object."
  59705.  
  59706.     ^self identityHash!
  59707.  
  59708. initialize
  59709.     "Private - Initialize the instance variables of the receiver."
  59710.  
  59711.     signals := 0
  59712. !
  59713.  
  59714. primSetSignals: pulse
  59715.     "Private - Set the excess signal count of the receiver to the argument, anInteger,
  59716.     starting the first Waiting process, if any.
  59717.  
  59718.     Primitive failure reasons:
  59719.         0 -    pulse is not a SmallInteger."
  59720.  
  59721.     <primitive: 99>
  59722.     ^self primitiveFailed!
  59723.  
  59724. printOn: aStream
  59725.     "Print a string representation of self on aStream."
  59726.  
  59727.     self excessSignals > 0 
  59728.         ifTrue: [aStream basicPrint: self; nextPut: $(; print: self excessSignals; nextPutAll: ' signals)']
  59729.         ifFalse: [super printOn: aStream]!
  59730.  
  59731. pulse
  59732.     "As #set, except that the excess signal count of the receiver is always set to 0.
  59733.     This 'pulsing' behaviour is useful for signalling a process only if there is one
  59734.     waiting, and otherwise leaving the receiver unsignalled."
  59735.  
  59736.     self primSetSignals: 0!
  59737.  
  59738. reset
  59739.     "Reset the excess signals recorded by the receiver to zero. There is no effect on any waiting processes."
  59740.  
  59741.     signals := 0
  59742. !
  59743.  
  59744. set
  59745.     "As #signal, except that if there are no Processes waiting for the receiver
  59746.     then the excess signal count is set to one, no matter how many times #set 
  59747.     is sent, and no matter what its previous value. This is useful for
  59748.     implementing process synchronisation 'Events', whereby one wants to record
  59749.     that something has happened, but not how many times it has happened."
  59750.  
  59751.     self primSetSignals: 1!
  59752.  
  59753. signal
  59754.     "Send a signal through the receiver. If one or more Processes are Waiting on the receiver,
  59755.     then transition the first of those Processes (on a FIFO basis, independent of priority) 
  59756.     from Waiting to Ready. 
  59757.  
  59758.     If no Processes are Waiting on the receiver, then the excess signal is remembered so that 
  59759.     subsequent #waits will not cause the sending Process to Wait.
  59760.  
  59761.     The primitive should not fail.
  59762.  
  59763.     N.B. A signalled Process will not normally run immediately unless it is of a higher priority 
  59764.     than     the current active Process (i.e. does not yield), and there are not already Processes at 
  59765.     or above its priority which are also Ready (these will run instead)."
  59766.  
  59767.     <primitive: 85>
  59768.     ^self primitiveFailed!
  59769.  
  59770. terminateProcess
  59771.     "Terminate the first process waiting on the receiver"
  59772.  
  59773.     self isEmpty
  59774.         ifFalse: [self first terminate]!
  59775.  
  59776. wait
  59777.     "The active Process must receiver a signal through the receiver before proceeding.
  59778.     Waiting processes may be interrupted, but will return to waiting when they have
  59779.     finished processing the interrupt. See #wait: and #wait:ret: for further details."
  59780.  
  59781.     | ret |
  59782.     ret := Array new: 1.
  59783.     self wait: INFINITE ret: ret.
  59784.     ^ret basicAt: 1!
  59785.  
  59786. wait: timeout
  59787.     "The active Process must receive a signal through the receiver before 
  59788.     proceeding, or be interrupted (i.e. receive an interrupt from the VM), or timeout
  59789.     after anInteger milliseconds. See #wait:ret: for further details.
  59790.  
  59791.     The answer (written into the first slot of the return value holder by the primitive) could be 
  59792.     WAIT_OBJECT_0 if the wait completed successfully (either because the Semaphore had 
  59793.     excess signals, or because it was signalled), or WAIT_IO_COMPLETION if the primitive
  59794.     was interrupted, or WAIT_TIMEOUT if the wait timed out. BUT, the latter two results are
  59795.     not actually possible from this method since 
  59796.     1)     an interrupted process will either not return here (if the Semaphore>>wait is returned 
  59797.         over and unwound), or will be resumed when the interrupt complets.
  59798.     2)    we request an INFINITE timeout."
  59799.  
  59800.     | ret |
  59801.     ret := Array new: 1.
  59802.     self wait: timeout ret: ret.
  59803.     ^ret basicAt: 1!
  59804.  
  59805. wait: timeout ret: returnValueHolder
  59806.     "Private - The active Process must receive a signal through the receiver before 
  59807.     proceeding, or be interrupted (i.e. receive an interrupt from the VM), or timeout
  59808.     after anInteger milliseconds. Answer the argument, returnValueHolder, with its
  59809.     first instance variable updated to hold and <integer> return code. 
  59810.  
  59811.     At present the only valid values for timeout are,  INFINITE, meaning wait for ever, 
  59812.     and 0, meaning don't wait at all. The behaviour of these is as follows:
  59813.         INFINITE- Wait until the semaphore is signalled, answering WAIT_OBJECT_O.
  59814.         0        - If the receiver has excess signals, then decrement the count, and
  59815.                 answer WAIT_OBJECT_O, otherwise return immediately without waiting,
  59816.                 but answer WAIT_TIMEOUT. i.e this is a way to 'poll' a Semaphore.
  59817.  
  59818.     If no signal has been sent, then the active Process will be transitioned from Running
  59819.     to Waiting until one is sent, when it may be returned to the Ready state.
  59820.  
  59821.     The purpose the returnValueHolder argument is to allow #wait to atomically wait
  59822.     for the availablity of a Semaphore _and_ update a variable in the enclosing context
  59823.     as to the outcome of that wait. This is important to the correct implementation of 
  59824.     Semaphore>>critical:, for example, as otherwise it is not possible to reliably 
  59825.     determine    in unwind handling whether the Semaphore was grabbed or not - one
  59826.     can't rely on a normal return value, because the process may not yet have proceeded
  59827.     far enough to assign it back into a temporary in the calling context.
  59828.  
  59829.     Primitive failure reasons:
  59830.         0 -    One or other argument is not a SmallInteger
  59831.         1 -    receiver's excess signal count is not a SmallInteger (i.e. receiver corrupt).
  59832.         2 -    anInteger is not either INFINITE (-1) or 0.
  59833.         4 -    returnValueHolder is not of an appropriate shape to hold the return value
  59834.             (it must be a pointer object with at least one slot, e.g. a one element Array)"
  59835.  
  59836.     <primitive: 86>
  59837.     ^self primitiveFailed! !
  59838.  
  59839. EqualityListModel comment:
  59840. 'N.B. EqualityListModel is now deprecated, as ListModel itself supports a pluggable search policy. A ListModel with the same behaviour can be instantiated using ListModel class>>newEquality.
  59841.  
  59842. EqualityListModel implements the <listModel> protocol for equality based <sequencedCollecion>s. EqualityListModel uses equality searches to locate its elements. See ListModel if identity matching is required.
  59843.  
  59844. '!
  59845. !EqualityListModel class methodsFor!
  59846.  
  59847. defaultSearchPolicy
  59848.     "Answer the default <searchPolicy> used by instances of the receiver."
  59849.  
  59850.     ^SearchPolicy equality!
  59851.  
  59852. new
  59853.     "Answer a new initialized instance of the receiver, with the default search policy
  59854.     installed, on an empty OrderedCollection."
  59855.  
  59856.     Notification deprecated. "Class, not message, is deprecated"
  59857.     ^ListModel newEquality!
  59858.  
  59859. with: aSequenceableCollection
  59860.     "Answer an instance of the receiver wrapped around aSequenceableCollection"
  59861.  
  59862.     Notification deprecated. "Note that it is the class which is deprecated, rather than this message"
  59863.     ^ListModel on: aSequenceableCollection searchPolicy: self defaultSearchPolicy! !
  59864.  
  59865. SortedCollection comment:
  59866. 'SortedCollection is a class of <SequencedGrowableCollection>s whose elements are ordered in the sequence specified by a user-definable sort order function (the sort "block", actually a <dyadicValuable>).
  59867.  
  59868. SortedCollection complies with the ANSI protocols:
  59869.     Object
  59870.     collection
  59871.     extensibleCollection
  59872.     sequencedCollection
  59873.     sequencedContractibleCollection
  59874.     sequencedReadableCollection
  59875.     SortedCollection
  59876.  
  59877. Elements can be added, removed or inserted, and can be accessed using external integer keys. However, it is an error to attempt to insert or replace elements at specific indices using any of the methods such as #at:put:, as this might invalidate the sort order.
  59878.  
  59879. Instance Variables:
  59880.     sortBlock        <dyadicValuable>
  59881. '!
  59882. !SortedCollection class methodsFor!
  59883.  
  59884. caseSensitiveSortBlock
  59885.     "Answer a dyadic valuable which can be used to sort Strings into ascending
  59886.     order on a case sensitive basis."
  59887.  
  59888.     ^[:a :b | (a trueCompare: b) <= 0]!
  59889.  
  59890. defaultSortBlock
  59891.     "Answer a dyadic valuable to be used, by default, for sorting the
  59892.     elements of the receiver.
  59893.     Implementation Note: For maximum performance we implement #value:value:
  59894.     directly, so answer self."
  59895.  
  59896.     ^self!
  59897.  
  59898. new: anInteger
  59899.     "Answer an instance of the receiver with capacity for <integer> count
  59900.     elements, sorted according to the default sort block."
  59901.  
  59902.     ^(super new: anInteger)
  59903.         setSortBlock: self defaultSortBlock;
  59904.         yourself!
  59905.  
  59906. sortBlock: discriminator
  59907.     "Answer a new instance of the receiver which uses the <dyadicValuable> argument,
  59908.     discriminator, to sort its elements. When evaluated, discriminator should answer whether
  59909.     its first parameter should be ordered before the second parameter.
  59910.  
  59911.     Note: The discriminator does not need to be a BlockClosure (despite the #sortBlock:
  59912.     message, which is historic), it must simply understand the #value:value: message 
  59913.     from the dyadic valuable protocol."
  59914.  
  59915.     ^super new
  59916.         setSortBlock: discriminator; 
  59917.         yourself!
  59918.  
  59919. value: anObject1 value: anObject2
  59920.     "Private - Implement this part of the <dyadicValuable> protocol in order that
  59921.     the receiver can be its own default sort 'block' which improves sorting
  59922.     performance. Note however that it is usually faster to sort using #< (especially
  59923.     if the collection is already in sort order, or contains a large number of similar
  59924.     keys), but     historically Smalltalk has always used #<=."
  59925.  
  59926.     #todo "Draft ANSI standard specified #< as default sort block".
  59927.     ^anObject1 <= anObject2! !
  59928.  
  59929. !SortedCollection methodsFor!
  59930.  
  59931. , operand
  59932.     "This is the concatenation operation. Answer a copy of the receiver with
  59933.     each element of the <sequencedReadableCollection> argument, operand, 
  59934.     added, in the receiver's sort order."
  59935.  
  59936.     ^self copy
  59937.         addAll: operand;
  59938.         yourself!
  59939.  
  59940. add: newElement
  59941.     "Add the <Object>, newElement, as a new element of the receiver, 
  59942.     inserting it in the correct place to maintain the sort ordering 
  59943.     of the receiver. Answers newElement."
  59944.  
  59945.     self addAnsweringIndex: newElement.
  59946.     ^newElement!
  59947.  
  59948. add: newElement afterIndex: index
  59949.     "Add newElement to the receiver immediately after the element currently at the
  59950.     specified index. index must be between 0 and the receiver's current 
  59951.     size (if not raise an exception). Answer newElement.
  59952.     SortedCollections maintain their own ordering, so this is not a valid operation."
  59953.  
  59954.     ^self shouldNotImplement!
  59955.  
  59956. add: newElement beforeIndex: index
  59957.     "Add newElement to the receiver immediately before the element currently at the specified
  59958.     index (i.e. the newElement will then have that index). index must be between 1 and the 
  59959.     receiver's current size plus 1 (if not raise an exception). Answer newElement.
  59960.     SortedCollections maintain their own ordering, so this is not a valid operation."
  59961.  
  59962.     ^self shouldNotImplement!
  59963.  
  59964. addAll: aCollection 
  59965.     "Include all the elements of the <collection> argument as elements of the receiver.
  59966.     Answer aCollection."
  59967.  
  59968.     aCollection size > (self size // 3) 
  59969.         ifTrue: 
  59970.             [self addAllWithoutSorting: aCollection.
  59971.             self reSort]
  59972.         ifFalse: [aCollection do: [:each | self add: each]].
  59973.     ^aCollection!
  59974.  
  59975. addAllFirst: newElements
  59976.     "Prepend all elements of the collection newElements to the receiver,
  59977.     in the order that they appear in newElements (as determined by
  59978.     its implementation of #do:). Answer newElements.
  59979.     SortedCollections maintain their own ordering, so this is not a valid operation."
  59980.  
  59981.     ^self shouldNotImplement!
  59982.  
  59983. addAllLast: aCollection
  59984.     "Insert all elements of aCollection as the new first elements of the receiver, 
  59985.     in the order that they appear in aCollection. Answer aCollection.
  59986.     SortedCollections maintain their own ordering, so this is not a valid operation."
  59987.  
  59988.     ^self shouldNotImplement!
  59989.  
  59990. addAllWithoutSorting: aCollection 
  59991.     "Append the elements of the <collection> argument to the receiver
  59992.     without doing any sorting. Answer aCollection."
  59993.  
  59994.     self makeRoomAtEndFor: aCollection size.
  59995.     aCollection do: 
  59996.             [:each | 
  59997.             lastIndex := lastIndex + 1.
  59998.             self basicAt: lastIndex put: each].
  59999.     ^aCollection!
  60000.  
  60001. addAnsweringIndex: anObject 
  60002.     "Add anObject as a new element of the receiver, inserting it in the
  60003.     correct place to maintain the ascending ordering of the receiver
  60004.     as determined by sortBlock. Answer the index at which anObject 
  60005.     was added."
  60006.  
  60007.     | index low high |
  60008.     low := firstIndex.
  60009.     high := lastIndex.
  60010.     
  60011.     [index := (high + low) // 2.
  60012.     low > high] whileFalse: 
  60013.                 [(sortBlock value: (self basicAt: index) value: anObject) 
  60014.                     ifTrue: [low := index + 1]
  60015.                     ifFalse: [high := index - 1]].
  60016.     ^self insert: anObject before: low!
  60017.  
  60018. addFirst: anObject
  60019.     "Insert newObject as the first element of the receiver.
  60020.     SortedCollections maintain their own ordering, so this is not a valid operation."
  60021.  
  60022.     ^self shouldNotImplement
  60023. !
  60024.  
  60025. addLast: anObject
  60026.     "Append newObject as the last element of the receiver. Answer newObject.
  60027.     SortedCollections maintain their own ordering, so this is not a valid operation."
  60028.  
  60029.     ^self shouldNotImplement
  60030. !
  60031.  
  60032. asOrderedCollection
  60033.     "Answer an OrderedCollection containing the same elements as the receiver.
  60034.     The elements of the OrderedCollection will be sorted (at least initially) in the
  60035.     sort order of the receiver.
  60036.     Implementation Note: Revert to the Collection implementation."
  60037.  
  60038.     ^(OrderedCollection new: self size)
  60039.         addAll: self;
  60040.         yourself!
  60041.  
  60042. asSortedCollection
  60043.     "Answer a <SortedCollection> containing the same elements as the receiver
  60044.     with the same sort block (i.e the receiver)."
  60045.  
  60046.     ^self!
  60047.  
  60048. at: index put: newElement
  60049.     "Replace the element at the specified index of the receiver with newElement.
  60050.     Raise an exception if there is no such element.
  60051.     SortedCollections are not writeable via index."
  60052.  
  60053.     ^self shouldNotImplement!
  60054.  
  60055. collect: transformer
  60056.     "Evaluate the <monadicValuable> argument, transformer, for each of the receiver's elements.
  60057.     Answer a new collection like the receiver containing the values returned by the transformer
  60058.     on each evaluation.
  60059.     Implementation Note: Override to return an <sequencedCollection> (in fact an OrderedCollection).
  60060.     We can't use the #species/#copyLike mechanism, because in general we want our copies to remain sorted in 
  60061.     the current order."
  60062.  
  60063.     | answer |
  60064.     answer := OrderedCollection new: self size.
  60065.     self do: [:each | answer add: (transformer value: each)].
  60066.     ^answer!
  60067.  
  60068. copyEmpty: anInteger
  60069.     "Private - Answer an empty copy of the receiver, with enough space for anInteger
  60070.     number of elements. 
  60071.     Implementation Note: We must override in order to preserve the sortBlock."
  60072.  
  60073.     ^(super copyEmpty: anInteger)
  60074.         setSortBlock: sortBlock
  60075. !
  60076.  
  60077. copyFrom: start to: stop
  60078.     "Answer a copy of a subset of the receiver, starting from element at index start, until element 
  60079.     at index stop.
  60080.     Implementation Note: We must reimplement, because we disallow a number of the methods used by
  60081.     the superclass implementation."
  60082.  
  60083.     | answer offset size |
  60084.     stop < start ifTrue: [^self copyEmpty: 0].
  60085.     start < 1 ifTrue: [^self errorSubscriptBounds: start].
  60086.     stop > self size ifTrue: [^self errorSubscriptBounds: stop].
  60087.     size := stop - start + 1.
  60088.     answer := self copyLikeOfSize: size.
  60089.     "We assume the copy sorts in the same order"
  60090.     offset := start + firstIndex - 2.
  60091.     1 to: size do: [:i | answer basicAt: i put: (self basicAt: i + offset)].
  60092.     ^answer!
  60093.  
  60094. copyLikeOfSize: anInteger
  60095.     "Private - Answer an new collection of the same species as the receiver but with
  60096.     anInteger nil elements - i.e. not just with sufficient capacity for, but actually holding, 
  60097.     anInteger nil elements."
  60098.  
  60099.     ^(super copyLikeOfSize: anInteger) setSortBlock: sortBlock!
  60100.  
  60101. insertsortFrom: start to: stop 
  60102.     "Private - Sort the receiver internally using simple insertion sort algorithm.
  60103.     This is only useful for very short intervals."
  60104.  
  60105.     start + 1 to: stop
  60106.         do: 
  60107.             [:j | 
  60108.             | a t i |
  60109.             a := self basicAt: j.
  60110.             i := j.
  60111.             [i <= start or: [sortBlock value: (t := self basicAt: i - 1) value: a]] whileFalse: 
  60112.                     [self basicAt: i put: t.
  60113.                     i := i - 1].
  60114.             self basicAt: i put: a]!
  60115.  
  60116. quicksortFrom: start to: stop 
  60117.     "Private - Sort elements start through stop of self to be non-descending according to sortBlock.
  60118.     Note that this is not a stable sort, so any current ordering will be lost."
  60119.  
  60120.     "Implementation Note: This is a part iterative, part recursive, Quicksort implementation 
  60121.     based on that from 'Numerical Recipes in C', Press, Teukolsky, et al.. It is marginally faster 
  60122.     (about 5-15%) on average than the traditional Smalltalk-80 sort, which also seems to be 
  60123.     some kind of modified quicksort, and about twice as fast in some cases. In particular it
  60124.     exhibits better performance when used in conjunction with a #<= comparison, e.g. the
  60125.     default sort block, especially when the collection is already sorted."
  60126.  
  60127.     | up lo |
  60128.     up := stop.
  60129.     lo := start.
  60130.     [up - lo > 5] whileTrue: 
  60131.             ["Choose median and arrange so [lo+1] <= [lo] <= [up]"
  60132.  
  60133.             | i j k m temp a |
  60134.             k := lo + up bitShift: -1.
  60135.             m := lo + 1.
  60136.             temp := self basicAt: k.
  60137.             self basicAt: k put: (self basicAt: m).
  60138.             self basicAt: m put: temp.
  60139.             (sortBlock value: (self basicAt: up) value: temp) 
  60140.                 ifTrue: 
  60141.                     [self basicAt: m put: (self basicAt: up).
  60142.                     self basicAt: up put: temp].
  60143.             (sortBlock value: (self basicAt: up) value: (self basicAt: lo)) 
  60144.                 ifTrue: 
  60145.                     [temp := self basicAt: up.
  60146.                     self basicAt: up put: (self basicAt: lo).
  60147.                     self basicAt: lo put: temp].
  60148.             (sortBlock value: (self basicAt: lo) value: (self basicAt: m)) 
  60149.                 ifTrue: 
  60150.                     [temp := self basicAt: lo.
  60151.                     self basicAt: lo put: (self basicAt: m).
  60152.                     self basicAt: m put: temp].
  60153.  
  60154.             "Partition...(note we must test that i and j remain in bounds because the sort block may use <= or >=."
  60155.             i := m.    "i.e. start from lo+2"
  60156.             j := up.    "i.e. start from up-1"
  60157.             a := self basicAt: lo.
  60158.             
  60159.             [[i < j and: [sortBlock value: (self basicAt: (i := i + 1)) value: a]] whileTrue.
  60160.             [j >= i and: [sortBlock value: a value: (self basicAt: (j := j - 1))]] whileTrue.
  60161.             j < i] 
  60162.                     whileFalse: 
  60163.                         [temp := self basicAt: i.
  60164.                         self basicAt: i put: (self basicAt: j).
  60165.                         self basicAt: j put: temp].
  60166.  
  60167.             "Insert partitioning element"
  60168.             self basicAt: lo put: (self basicAt: j).
  60169.             self basicAt: j put: a.
  60170.  
  60171.             "Skip sort-equal elements to speed up worst cases - suggested by John Brant"
  60172.             [(j := j - 1) > lo and: [sortBlock value: a value: (self basicAt: j)]] whileTrue.
  60173.  
  60174.             "Recursively sort smaller sub-interval and process larger remainder on the next loop iteration"
  60175.             up - i < (j - lo) 
  60176.                 ifTrue: 
  60177.                     [self quicksortFrom: i to: up.
  60178.                     up := j]
  60179.                 ifFalse: 
  60180.                     [self quicksortFrom: lo to: j.
  60181.                     lo := i]].
  60182.  
  60183.     "When interval size drops below threshold perform an insertion sort (quicker for small numbers of elements)"
  60184.     ^self insertsortFrom: lo to: up!
  60185.  
  60186. reSort
  60187.     "Private - Resort the entire contents of the receiver in the order specified
  60188.     by the current sortBlock."
  60189.  
  60190.     self sortFrom: firstIndex to: lastIndex
  60191. !
  60192.  
  60193. reverse
  60194.     "Answer a copy of the receiver but with its elements in reverse order.
  60195.     Implementation Note: Refine in order to answer an OrderedCollection
  60196.     because obviously reversing the receiver's elements would require
  60197.     inverting the sort block if the answer was to remain a sorted collection."
  60198.  
  60199.     | answer |
  60200.     answer := OrderedCollection new: self size.
  60201.     self reverseDo: [:element | answer add: element].
  60202.     ^answer!
  60203.  
  60204. setSortBlock: discriminator
  60205.     "Private - Store down the dyadic valuable used by the receiver to sort its elements."
  60206.  
  60207.     sortBlock := discriminator
  60208. !
  60209.  
  60210. shellsortFrom: lo to: up
  60211.     "Private - Shell sort the receiver internally in the interval lo..up inclusive.
  60212.     Shell sort is somewhat slower than quick sort, but is quick for partially
  60213.     sorted files, and doesn't have a bad worst case."
  60214.  
  60215.     | d |
  60216.     d := up - lo + 1.
  60217.     [d > 1] whileTrue: [ | i |
  60218.         d < 5 ifTrue: [d := 1] ifFalse: [d := (0.45454*d) truncated].
  60219.         i := up - d.
  60220.         [i >= lo] whileTrue: [ | ei j ej |
  60221.             ei := self basicAt: i.
  60222.             j := i + d.
  60223.             [j <= up and: [(sortBlock value: (ej := self basicAt: j) value: ei)]] whileTrue: [
  60224.                 self basicAt: j-d put: ej.
  60225.                 j := j + d].
  60226.             self basicAt: j-d put: ei.
  60227.             i := i - 1]]!
  60228.  
  60229. sortBlock
  60230.     "Answer the <dyadicValuable> (not necessarily a block) which is evaluated 
  60231.     to sort elements of the receiver."
  60232.  
  60233.     ^sortBlock!
  60234.  
  60235. sortBlock: discriminator
  60236.     "Set the <dyadicValuable> which is evaluated to sort elements of the receiver to the argument,
  60237.     and then resort the receiver if necessary."
  60238.  
  60239.     sortBlock := discriminator.
  60240.     self isEmpty ifFalse: [self reSort]!
  60241.  
  60242. sortFrom: start to: stop 
  60243.     "Private - Sort elements i through stop of self to be nondescending according to sortBlock."
  60244.  
  60245.     self quicksortFrom: start to: stop!
  60246.  
  60247. stbSaveOn: anSTBOutFiler
  60248.     "Save out a binary representation of the receiver to anSTBOutFiler."
  60249.  
  60250.     sortBlock ~~ self class
  60251.         ifTrue: [^anSTBOutFiler saveObject: self as: (STBSortedCollectionProxy for: self)].
  60252.  
  60253.     super stbSaveOn: anSTBOutFiler
  60254.  
  60255.     ! !
  60256.  
  60257. Dictionary comment:
  60258. 'Class Dictionary represents a set of associations between keys and values. The values can be randomly accessed using the associated key. 
  60259.  
  60260. The elements of a Dictionary are instances of <Association>, a simple data structure for storing and retrieving the members of a key-value pair.
  60261.  
  60262. Conforms to the following ANSI protocols:
  60263.     collection
  60264.     abstractDictionary
  60265.     Dictionary'!
  60266. !Dictionary class methodsFor!
  60267.  
  60268. icon
  60269.     "Answers an Icon that can be used to represent this class"
  60270.  
  60271.     ^##(self) defaultIcon!
  60272.  
  60273. newAspect: aspectClass name: aSymbol 
  60274.         "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  60275.         which is appropriate for representing aspects of the receiver's type."
  60276.     
  60277.         ^aspectClass dictionary: aSymbol! !
  60278.  
  60279. !Dictionary methodsFor!
  60280.  
  60281. add: anAssociation
  60282.     "Add anAssociation to the receiver. Answer anAssociation.
  60283.     Although very similar to at:put:, we store the actual association passed
  60284.     as an argument here in order to maintain its references."
  60285.  
  60286.     | index element |
  60287.     index := self findKeyOrNil: anAssociation key.
  60288.     element := self basicAt: index.
  60289.     element isNil
  60290.         ifTrue: [self privateAt: index put: anAssociation]
  60291.         ifFalse: [element value: anAssociation value].
  60292.     ^anAssociation!
  60293.  
  60294. alternateInspectorClass
  60295.     "Answer the class of inspector to be used when the user requests to inspect
  60296.         the receiver with the Shift key held down."
  60297.  
  60298.     ^DictionaryInspector!
  60299.  
  60300. asSet
  60301.     "Answer a Set whose elements are the values stored in the receiver (any 
  60302.     duplicates are therefore eliminated).
  60303.     Revert to the Collection implementation."
  60304.  
  60305.     ^(Set new: self size) 
  60306.         addAll: self; 
  60307.         yourself!
  60308.  
  60309. associationAt: key
  60310.     "Answer the association named by the argument, key.  If key is not found,
  60311.     raise an exception."
  60312.  
  60313.     ^self associationAt: key ifAbsent: [self errorKeyNotFound: key]!
  60314.  
  60315. associationAt: key ifAbsent: exceptionHandler
  60316.     "Answer the association named by the argument, key. If key is not found,
  60317.     answer the result of evaluating the niladic valuable, exceptionHandler."
  60318.  
  60319.     | index element |
  60320.     index := self findKeyOrNil: key.
  60321.     ^(element := self basicAt: index) isNil
  60322.         ifTrue: [exceptionHandler value]
  60323.         ifFalse: [element]
  60324. !
  60325.  
  60326. associationAt: key ifPresent: operation
  60327.     "Answer the result of evaluating the monadic valuable, operation, if
  60328.     the argument, key, is the key of an element in the receiver, with that
  60329.     key and element pair as its argument. If the key is not present, then 
  60330.     answer nil."
  60331.  
  60332.     ^operation value: (self associationAt: key ifAbsent: [^nil])!
  60333.  
  60334. associationClass
  60335.     "Private - Answer the class of association to be used for holding
  60336.     key-value pairs in the receiver. Must respond to the Association protocol."
  60337.     
  60338.     ^Association!
  60339.  
  60340. associations
  60341.     "Answer an OrderedCollection containing the receiver's associations"
  60342.  
  60343.     | answer |
  60344.     answer := OrderedCollection new: self size.
  60345.     self associationsDo: [:assoc | answer add: assoc].
  60346.     ^answer!
  60347.  
  60348. associationsDo: operation
  60349.     "Evaluate the monadic valuable, operation, for each of the receiver's 
  60350.     key/value mappings."
  60351.  
  60352.     super do: [:assoc | operation value: assoc]!
  60353.  
  60354. associationsDo: operation separatedBy: separator
  60355.     "Evaluate the <monadicValuable> argument, operation, for each of the 
  60356.     {key,value} associations, interspersed with evaluations of the <niladicValuable>
  60357.     argument, separator. The separator is first evaluated after the first
  60358.     association, and is not evaluated after the last association (i.e. it is not evaluated
  60359.     at all if there are less than two associations)."
  60360.  
  60361.     | sep |
  60362.     sep := [sep := separator].    "Switch to the real separator after first eval."
  60363.     self associationsDo: [:assoc |
  60364.         sep value.
  60365.         operation value: assoc]!
  60366.  
  60367. at: key
  60368.     "Answer the value at the <Object> key in the receiver.  If not found report an error.
  60369.     It is important that the exception block passed as the parameter with the
  60370.     #ifAbsent: keyword does not contain an explicit (^) return, as this may
  60371.     upset some subclasses."
  60372.  
  60373.     ^self at: key ifAbsent: [self errorKeyNotFound: key]!
  60374.  
  60375. at: key ifAbsent: operation
  60376.     "Answer the value named by the <Object> argument, key.  If key is not found,
  60377.     answer the result of evaluating the <niladicValuable>, operation."
  60378.  
  60379.     | element |
  60380.     ^(element := self basicAt: (self findKeyOrNil: key)) isNil
  60381.         ifTrue: [operation value]
  60382.         ifFalse: [element value]!
  60383.  
  60384. at: key ifAbsentPut: operation
  60385.     "Answer the value of the receiver keyed by the <Object> argument, key.
  60386.     If key is not one of the receiver's keys, then add the result of evaluating 
  60387.     the <niladicValuable>, operation, at key, and answer that result."
  60388.  
  60389.     ^self at: key ifAbsent: [self at: key put: operation value]!
  60390.  
  60391. at: key ifPresent: operation
  60392.     "Answer the result of evaluating the monadic valuable, operation, if
  60393.     the argument, key, is the key of an element in the receiver, with that
  60394.     element as its argument. If the key is not present, then answer nil."
  60395.  
  60396.     ^operation value: (self at: key ifAbsent: [^nil])!
  60397.  
  60398. at: key put: newElement
  60399.     "Store the <Object> argument newElement at the <Object>
  60400.     key, in the receiver. Answer newElement."
  60401.  
  60402.     | index element |
  60403.     key isNil ifTrue: [^self error: 'key cannot be nil'].
  60404.     index := self findKeyOrNil: key.
  60405.     (element := self basicAt: index) isNil 
  60406.         ifTrue: [self privateAt: index put: (self associationClass key: key value: newElement)]
  60407.         ifFalse: [element value: newElement].
  60408.     ^newElement!
  60409.  
  60410. atAll: keys put: newElement
  60411.     "Replace the elements of the receiver at each of the keys in the <collection> 
  60412.     argument, keys, with the <Object> argument, newElement."
  60413.  
  60414.     keys do: [:key | self at: key put: newElement]!
  60415.  
  60416. bestSlotFor: element boundedBy: capacity
  60417.     ^self hash: element key max: capacity!
  60418.  
  60419. bindingFor: asString 
  60420.     "Answer the association whose key is equal to the argument in
  60421.     the receiver, or nil if the key is not present. Used by the Compiler"
  60422.  
  60423.     ^self associationAt: asString ifAbsent: []!
  60424.  
  60425. changeKey: key to: newKey
  60426.     "Private - Change the key of the element of the receiver with key, key, to
  60427.     newKey (e.g. rename a variable). Answer the <Association> whose
  60428.     whose key was changed."
  60429.  
  60430.     | assoc |
  60431.     assoc := self associationAt: key.
  60432.     self removeKey: key.
  60433.     assoc key: newKey.
  60434.     "We want to preserve the association of the element we're renaming, so we must
  60435.      remove any existing element with the same name"
  60436.     self removeKey: newKey ifAbsent: [].
  60437.     self add: assoc.
  60438.     ^assoc!
  60439.  
  60440. collect: transformer
  60441.     "Evaluate the monadic valuable argument, transformer, for each of the receiver's values.
  60442.     Answer a new collection like the receiver containing the same keys, and the values returned 
  60443.     by the transformer on each evaluation.
  60444.     N.B. Most Smalltalks implement this differently (each with their own, inconsistent, approaches)
  60445.     This is the ANSI Smalltalk definition."
  60446.  
  60447.     | answer |
  60448.     answer := self copyLike.
  60449.     self 
  60450.         keysAndValuesDo: [:key :value | answer at: key put: (transformer value: value)].
  60451.     ^answer!
  60452.  
  60453. copyElementsInto: newMe
  60454.     "Private - Add the receiver's elements into the argument, newMe.
  60455.     Part of the implementation of hashed collection resizing. Override
  60456.     to use associationsDo: to preserve the existing associations."
  60457.  
  60458.     self associationsDo: [:element | newMe uncheckedAdd: element]!
  60459.  
  60460. do: operation
  60461.     "Evaluate <monadicValuable> argument, operation, for each of the element of the 
  60462.     receiver. Answers the receiver.
  60463.     Implementation Note: Could use #associationsDo: (or keysAndValuesDo:), but 
  60464.     performance important here."
  60465.  
  60466.     | element |
  60467.     1 to: self basicSize do: [:i |
  60468.         (element := self basicAt: i) isNil
  60469.             ifFalse: [operation value: element value]]!
  60470.  
  60471. errorKeyNotFound: aKey
  60472.     "Private - Report that an attempt was made to look up a key which was not in the receiver"
  60473.  
  60474.     ^self errorNotFound: aKey
  60475. !
  60476.  
  60477. errorValueNotFound: aValue
  60478.     "Private - Report that an attempt was made to look up the key for a value which was not
  60479.     in receiver"
  60480.  
  60481.     ^self error: 'value not found: ', aValue printString
  60482. !
  60483.  
  60484. findElementOrNil: anAssociation
  60485.     "Private - Answer the index of the element with the a key equivalent to that
  60486.     of anAssociation. The elements of the receiver are Associations, so we look up
  60487.     by anAssociation's key."
  60488.  
  60489.     ^self findKeyOrNil: anAssociation key!
  60490.  
  60491. findKeyOrNil: anObject
  60492.     "Private - Answer the index of the given key in the receiver, or, if not found,
  60493.     the index of the first empty slot including and after that to which the key hashes"
  60494.  
  60495.     | capacity index element |
  60496.     capacity := self basicSize.
  60497.     index := self hash: anObject max: capacity.
  60498.     [(element := self basicAt: index) isNil or: [anObject = element key]] 
  60499.         whileFalse: [index := index \\ capacity + 1].
  60500.     ^index!
  60501.  
  60502. identityIncludes: anObject
  60503.     "Answer whether the argument, anObject, is one of the receiver's elements.
  60504.     Implementation Note: We must override back to the collection implementation 
  60505.     in order to search the associations for a matching value."
  60506.  
  60507.     self do: [ :each | anObject == each ifTrue: [ ^true ]].
  60508.     ^false
  60509. !
  60510.  
  60511. includes: target
  60512.     "Answer whether the argument, target, is one of the elements of the receiver.
  60513.     Implementation Note: Revert to the method used in Collection, as the elements 
  60514.     of dictionaries are either keys or Associations, and in either case we want
  60515.     to find an equal value."
  60516.  
  60517.     self do: [:each | target = each ifTrue: [^true]].
  60518.     ^false!
  60519.  
  60520. includesAssociation: anAssociation
  60521.     "Answer whether the receiver has an element (association between a key
  60522.     and a value) that is equal to the argument, anAssociation"
  60523.  
  60524.     | assoc |
  60525.     assoc := self associationAt: anAssociation key ifAbsent: [^false].
  60526.     ^assoc value = anAssociation value
  60527. !
  60528.  
  60529. includesKey: key
  60530.     "Answer whether the receiver has a key equal to the <Object>
  60531.     argument, key"
  60532.  
  60533.     ^(self basicAt: (self findKeyOrNil: key)) notNil!
  60534.  
  60535. keyAtEqualValue: value ifAbsent: exceptionHandler
  60536.     "Answer the name of the argument, value. If there is no such value, answer
  60537.     the result of evaluating the niladic valuable, exceptionHandler.
  60538.     Equality is used for comparison of the values (this increases the chances of 
  60539.     returning any duplicates the Dictionary might contain)."
  60540.  
  60541.     self keysAndValuesDo: [:k :v | value = v ifTrue: [^k]].
  60542.     ^exceptionHandler value!
  60543.  
  60544. keyAtValue: value
  60545.     "Answer the <Object> key of the <Object> argument, value. 
  60546.     If there is no such value, send #errorValueNotFound: to the receiver with 
  60547.     value as its argument.
  60548.     N.B. Since values are not necessarily unique, answer the name of the first one encountered 
  60549.     in the search."
  60550.  
  60551.     ^self keyAtValue: value ifAbsent: [self errorValueNotFound: value]!
  60552.  
  60553. keyAtValue: value ifAbsent: operation
  60554.     "Answer the <Object> key of the <Object> argument, value. 
  60555.     If there is no such value, answer the result of evaluating the 
  60556.     <niladicValuable>, operation. Identity is used for comparison of the values."
  60557.  
  60558.     #todo "ANSI standard states that #= be used rather than #==, but long established standard is the latter".
  60559.     self keysAndValuesDo: [:k :v | v == value ifTrue: [^k]].
  60560.     ^operation value!
  60561.  
  60562. keys
  60563.     "Answer a <collection> containing the receiver's keys.
  60564.     Implementation Note: We answer a <Set>, but that should
  60565.     not be relied upon in portable code."
  60566.  
  60567.     | aSet |
  60568.     aSet := self keysClass new: self size.
  60569.     self keysDo: [:key | aSet add: key].
  60570.     ^aSet!
  60571.  
  60572. keysAndValuesDo: operation
  60573.     "Evaluate the <dyadicValuable>, operation, for each key/value pair in the receiver.
  60574.     The key/values pairs are visited in an arbitray order.
  60575.     Implementation Note: Could use #associationsDo:, but performance important here."
  60576.  
  60577.     | element |
  60578.     1 to: self basicSize do: [:i |
  60579.         (element := self basicAt: i) isNil
  60580.             ifFalse: [operation value: element key value: element value]]!
  60581.  
  60582. keysClass
  60583.     "Private - Answer the class of Collection to be used for collecting the keys of the receiver"
  60584.     
  60585.     ^Set!
  60586.  
  60587. keysDo: operation
  60588.     "Evaluate the <monadicValuable>, operation, for each of the receiver's keys."
  60589.  
  60590.     self keysAndValuesDo: [:key :value | operation value: key]!
  60591.  
  60592. occurrencesOf: target
  60593.     "Answer the number of the receiver's values which are equal to aValue.
  60594.     Implementation Note: Override back to the Collection implementation."
  60595.  
  60596.     | count |
  60597.     count := 0.
  60598.     self do: [:element | element = target ifTrue: [count := count + 1]].
  60599.     ^count!
  60600.  
  60601. printOn: aStream
  60602.     "Print a string representation of self on aStream. 
  60603.     We must override because we'd like to print out the associations as this
  60604.     is more useful, otherwise this is the same as the superclass implementation."
  60605.  
  60606.     | printed |
  60607.     printed := Processor activeProcess _alreadyPrinted.
  60608.     (printed includes: self) ifTrue: [^self printCyclicRefOn: aStream].
  60609.     printed add: self.
  60610.     
  60611.     [| tooMany |
  60612.     tooMany := aStream position + self maxPrint.
  60613.     aStream
  60614.         basicPrint: self;
  60615.         nextPut: $(.
  60616.     self associationsDo: 
  60617.             [:each | 
  60618.             aStream position > tooMany 
  60619.                 ifTrue: 
  60620.                     [aStream nextPutAll: '... etc ...'.
  60621.                     ^self].
  60622.             each printOn: aStream]
  60623.         separatedBy: [aStream space].
  60624.     aStream nextPut: $)] 
  60625.             ensure: [printed remove: self ifAbsent: []]!
  60626.  
  60627. publishedAspects
  60628.     "Answer a <LookupTable> of the <Aspect>s published by the receiver."
  60629.  
  60630.     "This override is necessary to avoid implementation details being included by the 
  60631.         default implementation in Object>>publishedAspects for an empty Dictionary."
  60632.  
  60633.     ^(self publishedKeyedAspects)
  60634.         addAll: self class publishedAspectsOfInstances;
  60635.         yourself!
  60636.  
  60637. publishedKeyedAspects
  60638.     "Answers a <LookupTable> of the published aspects of the 
  60639.         receiver's keyed contents."
  60640.  
  60641.     | batchAccessor keys |
  60642.     keys := self keys.
  60643.     batchAccessor := KeyedAspectBatchAccessor 
  60644.                 subject: self
  60645.                 keys: ([keys asSortedCollection] on: Error do: [:ex | keys asOrderedCollection])
  60646.                 startingAt: 1
  60647.                 batchSize: self publishedKeyedAspectsBatchSize.
  60648.     ^(LookupTable new)
  60649.         addAll: (batchAccessor getBatchAccessors collect: [:each | each aspectDescriptor]);
  60650.         yourself!
  60651.  
  60652. remove: anObject ifAbsent: aBlock
  60653.     "Elements of Dictionaries must be removed by key."
  60654.  
  60655.     ^self shouldNotImplement
  60656. !
  60657.  
  60658. removeAllKeys: keys
  60659.     "Remove any elements from the receiver with the keys in the <collection> argument, keys.
  60660.     If any of the keys are not present in the receiver, or there are duplicates in
  60661.     keys, then raise an exception."
  60662.  
  60663.     keys do: [:k | self removeKey: k]!
  60664.  
  60665. removeAllKeys: keys ifAbsent: operation
  60666.     "Remove any elements from the receiver with the keys in the <collection>
  60667.     argument, keys. If any of the keys are not present in the receiver, or there 
  60668.     are duplicates in keys, then evaluate the <niladicValuable> argument, 
  60669.     operation, but do not stop the enumeration."
  60670.  
  60671.     keys do: [:k | self removeKey: k ifAbsent: operation]!
  60672.  
  60673. removeAssociation: anAssociation
  60674.     "Remove the key and value association, anAssociation, from the receiver. Answer anAssociation."
  60675.  
  60676.     self removeKey: anAssociation key.
  60677.     ^anAssociation
  60678. !
  60679.  
  60680. removeKey: key
  60681.     "Remove the <Object> key (and its associated value), from the receiver. 
  60682.     If key is not in the receiver, report an error. Otherwise, answer the value 
  60683.     named by key."
  60684.  
  60685.     ^self removeKey: key ifAbsent: [self errorKeyNotFound: key]!
  60686.  
  60687. removeKey: key ifAbsent: operation
  60688.     "Remove the <Object> key (and its associated value), from the receiver. If key is
  60689.     not in the receiver, answer the result of evaluating the <niladicValuable>,
  60690.     operation. Otherwise, answer the value named by key."
  60691.  
  60692.     | index element |
  60693.     index := self findKeyOrNil: key.
  60694.     ^(element := self basicAt: index) isNil
  60695.         ifTrue: [operation value]
  60696.         ifFalse: [
  60697.             self removeIndex: index.
  60698.             element value]!
  60699.  
  60700. searchPolicy
  60701.     "Answer the receiver's <searchPolicy>."
  60702.  
  60703.     ^SearchPolicy equality!
  60704.  
  60705. select: discriminator
  60706.     "Evaluate the monadic valuable argument, discriminator, for each of the receiver's elements.
  60707.     Answer a new Collection like the receiver containing only those elements for which 
  60708.     the discriminator evaluates to true.
  60709.     Implementation Note: Override to maintain both keys and values, and to use the same
  60710.     Associations where possible."
  60711.  
  60712.     | answer |
  60713.     answer := self newSelection.
  60714.     self associationsDo: 
  60715.             [:assoc | 
  60716.             (discriminator value: assoc value) ifTrue: [answer add: assoc]].
  60717.     ^answer!
  60718.  
  60719. stbSaveOn: anSTBOutFiler
  60720.     "Save out a binary representation of the receiver to anSTBOutFiler."
  60721.  
  60722.     anSTBOutFiler
  60723.         saveObject: self
  60724.         as: (STBCollectionProxy
  60725.             class: self class
  60726.             array: self associations asArray)!
  60727.  
  60728. storeOn: aStream 
  60729.     "Append to the <puttableStream> argument, target, an expression which when 
  60730.     evaluated will answer a collection similar to the receiver."
  60731.  
  60732.     | first |
  60733.     aStream nextPutAll: '(('.
  60734.     self class storeOn: aStream.
  60735.     aStream nextPutAll: ' new)'.
  60736.     first := true.
  60737.     self keysAndValuesDo: [:key :value |
  60738.         first
  60739.             ifTrue: [first := false]
  60740.             ifFalse: [aStream nextPut: $;].
  60741.         aStream nextPutAll: ' at: '.
  60742.         key storeOn: aStream.
  60743.         aStream nextPutAll: ' put: '.
  60744.         value storeOn: aStream].
  60745.     first ifFalse: [aStream nextPutAll: '; yourself'].
  60746.     aStream nextPut: $)!
  60747.  
  60748. values
  60749.     "Answer a <collection> containing the receiver's values (includes any duplicates)."
  60750.  
  60751.     | answer |
  60752.     answer := OrderedCollection new: self size.
  60753.     self do: [:value | answer addLast: value].
  60754.     ^answer! !
  60755.  
  60756. IdentitySet comment:
  60757. ''!
  60758. !IdentitySet methodsFor!
  60759.  
  60760. findElementOrNil: anObject
  60761.     "Private - Answer the index of the given object in the receiver, or, if not found,
  60762.     the index of the first empty slot including and after that to which the object hashes.
  60763.     Implementation Note: This is a clone of Set>>findElementOrNil: except for the comparison of the elements
  60764.     which use identity (#identityHash and #==) instead of equality (#hash and #=). 
  60765.     The entire method is copied for performance reasons.     We scale the hash value 
  60766.     for large collections to avoid excessive collisions caused by the small identity hash
  60767.     range (0..65535)."
  60768.  
  60769.     | capacity index element |
  60770.     capacity := self basicSize.
  60771.     index := self hash: anObject max: capacity.
  60772.     [(element := self basicAt: index) isNil or: [anObject == element]] 
  60773.         whileFalse: [index := index \\ capacity + 1].
  60774.     ^index!
  60775.  
  60776. hash: anObject max: anInteger
  60777.     ^anInteger < 8192 
  60778.         ifTrue: [anObject identityHash \\ anInteger + 1]
  60779.         ifFalse: [anObject identityHash * (anInteger bitShift: -12) \\ anInteger + 1]! !
  60780.  
  60781. PluggableSet comment:
  60782. 'PluggableSet is the class of <Set>s which support a pluggable <searchPolicy>, and which can thus be configured to behave in the same way as either standard <Set>s (equality search) or <IdentitySet>s (identity search), or indeed any user-defined search policy.
  60783.  
  60784. Instance Variables:
  60785.     searchPolicy        <searchPolicy>. The policy used to hash and compare elements of the receiver.'!
  60786. !PluggableSet class methodsFor!
  60787.  
  60788. defaultSearchPolicy
  60789.     "Answer the default <searchPolicy> used by instances of the receiver."
  60790.  
  60791.     ^SearchPolicy equality!
  60792.  
  60793. new: anInteger searchPolicy: aSearchPolicy
  60794.     "Answer a new instance of the receiver with an initial capacity of at least 
  60795.     <integer> count elements (i.e. the size is a hint), and with the specified <searchPolicy>."
  60796.  
  60797.     ^(self new: anInteger) setSearchPolicy: aSearchPolicy!
  60798.  
  60799. searchPolicy: policy
  60800.     "Answer a new, empty, instance of the receiver with the specified <searchPolicy>."
  60801.  
  60802.     ^self new setSearchPolicy: policy! !
  60803.  
  60804. !PluggableSet methodsFor!
  60805.  
  60806. copyEmpty: anInteger
  60807.     "Private - Answer an empty copy of the receiver, with enough space for anInteger
  60808.     number of elements. 
  60809.     Implementation Note: We must override in order to preserve the searchPolicy."
  60810.  
  60811.     ^(super copyEmpty: anInteger) setSearchPolicy: self searchPolicy!
  60812.  
  60813. findElementOrNil: anObject
  60814.     "Private - Answer the index of the given object in the receiver, or, if not found,
  60815.     the index of the first empty slot including and after that to which the object hashes.
  60816.     A pluggable <searchPolicy> is used for key comparisons and hashing."
  60817.  
  60818.     | capacity index element |
  60819.     capacity := self basicSize.
  60820.     index := self hash: anObject max: capacity.
  60821.     
  60822.     [(element := self basicAt: index) isNil 
  60823.         or: [searchPolicy compare: element with: anObject]] 
  60824.             whileFalse: [index := index \\ capacity + 1].
  60825.     ^index!
  60826.  
  60827. hash: anObject max: anInteger
  60828.     ^searchPolicy hash: anObject max: anInteger!
  60829.  
  60830. initialize
  60831.     "Private - Instance variable initialization. The tally records the number of elements."
  60832.  
  60833.     super initialize.
  60834.     searchPolicy := self class defaultSearchPolicy
  60835. !
  60836.  
  60837. newSelection
  60838.     "Private - Answer a new empty collection like the receiver to 
  60839.     contain a selection of the receiver's elements."
  60840.  
  60841.     ^self class searchPolicy: self searchPolicy!
  60842.  
  60843. preResize: newMe
  60844.     "This message is sent by the receiver when resizing, before the
  60845.     receiver's elements are added to newMe. We must assign across the
  60846.     search policy."
  60847.  
  60848.     newMe setSearchPolicy: self searchPolicy!
  60849.  
  60850. searchPolicy
  60851.     "Answer the receiver's <searchPolicy>."
  60852.  
  60853.     ^searchPolicy!
  60854.  
  60855. searchPolicy: aSearchPolicy
  60856.     "Set the receiver's <searchPolicy>."
  60857.  
  60858.     self setSearchPolicy: aSearchPolicy.
  60859.     self isEmpty ifFalse: [self rehash]!
  60860.  
  60861. setSearchPolicy: aSearchPolicy
  60862.     "Private - Set the receiver's <searchPolicy>. Answer the receiver."
  60863.  
  60864.     searchPolicy := aSearchPolicy.
  60865.     ^self!
  60866.  
  60867. species
  60868.     "Answer the class of object to be used when copying the receiver with #collect:, etc."
  60869.  
  60870.     ^Set
  60871. ! !
  60872.  
  60873. SharedSet comment:
  60874. 'SharedSet is a process safe subclass of <Set>, which has the same behavior. It''s instances make use of a <Mutex> (a mutual exclusion lock) to prevent more than one process from accessing their elements at the same time. Although process safe to the extent   that the invariants of the data structure are maintained, further synchronisation mechanisms will almost certainly be required if a <SharedSet> is used to buffer information between processes (e.g. see <SharedQueue>).
  60875.  
  60876. The following methods of Set are, or are not, overridden for the reasons given:
  60877.  
  60878.     add:        Overridden, public entry point
  60879.     addAll:        Implmented using #add:
  60880.     asArray        Overridden because must ensure size does not change between instantiating the             new Array and the #do: loop.
  60881.     asByteArray    ditto
  60882.     asBag        Bags size affects capacity only, so not overridden.
  60883.     asOrderedCollection    ditto
  60884.     asSet        atomic (answers self)
  60885.     asSortedCollection    Size affects capacity only, so not overridden
  60886.     asSortedCollection:    ditto
  60887.     at:        Not permitted on sets
  60888.     at:put:        Ditto
  60889.     capacity        atomic
  60890.     collect:        Implemented in terms of #do:. Result will be a Set.
  60891.     copyElementsInto:    ditto
  60892.     do:        Overridden, public entry point
  60893.     findElementOrNil:    private, used only within methods protected by mutex (e.g. add:)
  60894.     find:ifAbsent:    Overidden, public entry point
  60895.     fixCollisionsFrom:     ditto
  60896.     grow        ditto (sent only from maintainLoadFactor)
  60897.     identityIncludes:    Overridden, public entry point
  60898.     includes:        Overridden, public entry point
  60899.     initialize        overridden, but to instantiate the mutex, not for mutual exclusion
  60900.     isEmpty        uses #size, which is atomic
  60901.     moveFrom:to:    ditto
  60902.     occurrencesOf:    uses #includes: and otherwise accesses no shared data
  60903.     postResize:    private, used only within methods protected by mutex
  60904.     preResize:        ditto
  60905.     privateAt:put:    ditto
  60906.     rehash        uses #resize:, and otherwise accesses no shared data
  60907.     relocateElement:from:     private, used only within methods protected by mutex
  60908.     remove:ifAbsent:    Overridden, public entry point
  60909.     removeIndex:    private, used only within methods protected by mutex
  60910.     resize:        Overridden, public entry point
  60911.     shrink        Overridden, public entry point
  60912.     size        atomic
  60913.     tally        atomic
  60914.     uncheckedAdd:    private, used only within methods protected by mutex
  60915.  
  60916. Instance Variables:
  60917.     mutex        <Mutex> for ensuring mutually exclusive access to the collection.
  60918.  
  60919. Class Variables:
  60920.     AbsentCookie    <Object>. Unique cookie used internally to signal element absence.
  60921.  
  60922. '!
  60923. !SharedSet class methodsFor!
  60924.  
  60925. initialize
  60926.     "Private - Initialize the receiver's class variables.
  60927.         SharedSet initialize
  60928.     "
  60929.  
  60930.     AbsentCookie := Object new! !
  60931.  
  60932. !SharedSet methodsFor!
  60933.  
  60934. add: newObject
  60935.     "Include newObject as one of the elements of the receiver. Answer newObject."
  60936.  
  60937.     ^mutex critical: [super add: newObject]!
  60938.  
  60939. addAll: newElements
  60940.     "Include all the elements of the <collection> argument, newElements, as the receiver's elements. 
  60941.     Answer newElements. 
  60942.     Implementation Note: Override to avoid overhead of acquiring mutex for each addition."
  60943.  
  60944.     mutex critical: [newElements do: [:each | super add: each]].
  60945.     ^newElements!
  60946.  
  60947. asArray
  60948.     "Answer an Array whose elements are those of the receiver (ordering is possibly arbitrary).
  60949.     Must implement as critical section as otherwise Array size might be wrong."
  60950.  
  60951.     ^mutex critical: [super asArray]!
  60952.  
  60953. asByteArray
  60954.     "Answer a ByteArray whose elements are those of the receiver (ordering is possibly arbitrary).
  60955.     Must implement as critical section as otherwise the ByteArray size might be wrong."
  60956.  
  60957.     ^mutex critical: [super asByteArray]!
  60958.  
  60959. do: operation
  60960.     "Evaluate monadic value argument, operation, for each of the elements (non-nil members) 
  60961.     of the receiver. Answers the receiver.
  60962.     N.B. It is important that operation does not put the active process to sleep (i.e.
  60963.     wait on some Semaphore) as this will prevent other Smalltalk processes from accessing
  60964.     the receiver for a potentially long time, and if a weak subclass, may prevent the
  60965.     removal of Corpses from taking place. In the case of weak subclasses, if the putting the
  60966.     active process to sleep is unavoidable, then the weak status should be removed until
  60967.     the end of the critical block (e.g. send #beStrong at the start of the block, and
  60968.     #beWeakWithNotify at the end of the block)."
  60969.  
  60970.     mutex critical: [super do: operation]!
  60971.  
  60972. find: target ifAbsent: exceptionHandler
  60973.     "Answer the actual element of the receiver which matches (however 'match' is defined)
  60974.     the argument, target. If there is no such element, then the result of evaluating the
  60975.     niladic valuable, exceptionHandler, is answered."
  60976.  
  60977.     | answer |
  60978.     answer := mutex critical: [super find: target ifAbsent: [AbsentCookie]].
  60979.     ^answer == AbsentCookie
  60980.         ifTrue: [exceptionHandler value]
  60981.         ifFalse: [answer]!
  60982.  
  60983. identityIncludes: target
  60984.     "Answer whether the <Object> argument, target, is one of the receiver's elements."
  60985.  
  60986.     ^mutex critical: [super identityIncludes: target]!
  60987.  
  60988. includes: target
  60989.     "Answer whether the argument, target, is equal to one of the elements of the receiver."
  60990.  
  60991.     ^mutex critical: [super includes: target]!
  60992.  
  60993. initialize
  60994.     "Instance variable initialization. The mutex protects against concurrent access from multiple
  60995.     processes, but permits the same process to make multiple entries."
  60996.  
  60997.     super initialize.
  60998.     mutex := Mutex new!
  60999.  
  61000. mutex
  61001.     "Private - Answer the receiver's mutual exclusion object"
  61002.     
  61003.     ^mutex!
  61004.  
  61005. mutex: aMutex
  61006.     "Private - Set the receiver's mutual exclusion object to the argument, aMutex"
  61007.  
  61008.     mutex := aMutex!
  61009.  
  61010. postCopy
  61011.     "Apply any final flourish to the copy that may be required
  61012.     in order to ensure that the copy does not share any state with
  61013.     the original, apart from the elements. Answer the receiver.
  61014.     In the case of a SharedSet we need a new mutex."
  61015.  
  61016.     super postCopy.
  61017.     mutex := Mutex new!
  61018.  
  61019. preResize: newMe
  61020.     "This message is sent by the receiver when resizing, before the receiver's elements are added to newMe. 
  61021.     We must assign across the mutex so that process synchronisation is correctly preserved."
  61022.  
  61023.     newMe mutex: mutex!
  61024.  
  61025. printOn: aStream
  61026.     "Print a string representation of the receiver on aStream."
  61027.  
  61028.     mutex critical: [super printOn: aStream]!
  61029.  
  61030. remove: oldElement ifAbsent: exceptionHandler
  61031.     "If oldElement is one of the receiver's elements, then remove it from the 
  61032.     receiver and answer it (as Sets cannot contain duplicates, only one element is
  61033.     ever removed). If oldElement is not an element of the receiver (i.e.
  61034.     no element of the receiver is #= to oldObject) then answer the 
  61035.     result of evaluating the niladic valuable, exceptionHandler."
  61036.  
  61037.     | answer |
  61038.     answer := mutex critical: [super remove: oldElement ifAbsent: [AbsentCookie]].
  61039.     ^answer == AbsentCookie
  61040.         ifTrue: [exceptionHandler value]
  61041.         ifFalse: [answer]!
  61042.  
  61043. resize: anInteger
  61044.     "Private - Resize the receiver to have a capacity suitable for accomodating
  61045.     at least anInteger elements."
  61046.  
  61047.     mutex critical: [super resize: anInteger]!
  61048.  
  61049. shrink
  61050.     "Rebuild the collection with the optimal size for its current number of elements,
  61051.     as #rehash, but doesn't resize if already correct size."
  61052.  
  61053.     mutex critical: [super shrink]!
  61054.  
  61055. stbSaveOn: anSTBOutFiler
  61056.     "Save out a binary representation of the receiver to anSTBOutFiler."
  61057.  
  61058.     mutex critical: [super stbSaveOn: anSTBOutFiler]! !
  61059.  
  61060. LookupTable comment:
  61061. 'A LookupTable is a form of <Dictionary> that does not actually store <Assocation>s, but instead maintains parallel vectors of keys and values. This has the advantage of consuming less space and generally offering higher performance. 
  61062.  
  61063. Dictionary behaviour involving <Assocation>s (e.g. #associationsDo:, #associationAt:) is implemented by dynamically generating associations as required. This may adversely affect performance where such behaviour is used extensively, and the transient nature of the associations may not always be appropriate. In these (rare) cases a standard Dictionary should be used.
  61064.  
  61065. LookupTable itself uses equality-based hashing and comparisons. The subclass IdentityDictionary and its subclasses employ identity-based hashing and comparisons.
  61066.  
  61067. Instance Variables:
  61068.     values    <Array> of values associated with the same numbered keys in the indexable instance variables of the LookupTable.'!
  61069. !LookupTable methodsFor!
  61070.  
  61071. add: anAssociation
  61072.     "Add anAssociation to the receiver. Answer anAssociation. Unlike Dictionaries, 
  61073.     LookupTables do not actually store Associations, therefore we must 
  61074.     reimplement this in terms of #at:put:."
  61075.  
  61076.     self at: anAssociation key put: anAssociation value.
  61077.     ^anAssociation
  61078. !
  61079.  
  61080. associationAt: key ifAbsent: exceptionHandler
  61081.     "Answer a new Association between the key and value of
  61082.     the receiver at the argument, key.  If key is not found, answer the
  61083.     result of evaluating the niladic valuable exceptionHandler.
  61084.     Implementation Note: LookupTables do not actually store key-value pairs
  61085.     in Associations, so the answer is not state information."
  61086.  
  61087.     ^self associationClass
  61088.         key: key
  61089.         value: (self at: key ifAbsent: [^exceptionHandler value])!
  61090.  
  61091. associationsDo: operation
  61092.     "Evaluate the monadic valuable, operation, for each of the receiver's 
  61093.     key/value associations.
  61094.     Implemenation Note: We must override because the receiver does not 
  61095.     actually contain Associations."
  61096.  
  61097.     self keysAndValuesDo: [:k :v | 
  61098.         operation value: (self associationClass key: k value: v)]!
  61099.  
  61100. at: key ifAbsent: exceptionHandler
  61101.     "Answer the value named by the argument, key.  If key is not found, answer 
  61102.     the result of evaluating the niladic valuable, exceptionHandler."
  61103.  
  61104.     | index |
  61105.     index := self findKeyOrNil: key.
  61106.     ^(self basicAt: index) isNil
  61107.         ifTrue: [exceptionHandler value]
  61108.         ifFalse: [values basicAt: index]!
  61109.  
  61110. at: key put: newElement
  61111.     "Store the argument newElement with the external key, key,
  61112.     in the receiver. Answer newElement."
  61113.  
  61114.     | index |
  61115.     key isNil ifTrue: [^self error: 'key cannot be nil'].
  61116.     index := self findKeyOrNil: key.
  61117.     (self basicAt: index) isNil 
  61118.         ifTrue: 
  61119.             ["We must store the value first, as a resize may occur during privateAt:put:"
  61120.  
  61121.             values basicAt: index put: newElement.
  61122.             self privateAt: index put: key]
  61123.         ifFalse: [values basicAt: index put: newElement].
  61124.     ^newElement!
  61125.  
  61126. basicValues
  61127.     "Private - Answer the <ArrayedCollection> of values in the receiver."
  61128.  
  61129.     ^values!
  61130.  
  61131. bestSlotFor: element boundedBy: capacity
  61132.     ^self hash: element max: capacity!
  61133.  
  61134. copyElementsInto: newMe
  61135.     "Private - Add the receiver's elements into the argument, newMe.
  61136.     Private part of the implementation of hashed collection resizing. Override
  61137.     to use keysAndValuesDo: to enumerate through the keys as well as the values."
  61138.  
  61139.     self keysAndValuesDo: [:key :value | newMe uncheckedAt: key put: value]
  61140. !
  61141.  
  61142. do: operation
  61143.     "Evaluate <monadicValuable> argument, operation, for each of the elements (values) 
  61144.     of the receiver. Answers the receiver.
  61145.     Implementation Note: We could implement in terms of #keyAndValuesDo:, but 
  61146.     performance is important here."
  61147.  
  61148.     1 to: self basicSize do: [:i |
  61149.         (self basicAt: i) isNil
  61150.             ifFalse: [operation value: (values basicAt: i)]]!
  61151.  
  61152. findElementOrNil: anObject
  61153.     "Private - Answer the index of the specified key object in the receiver, 
  61154.     or nil if not present.
  61155.     Implementation Note: The directly held elements of a LookupTable
  61156.     are the keys. The values are held in a separate values <Array>."
  61157.  
  61158.     ^self findKeyOrNil: anObject!
  61159.  
  61160. findKeyOrNil: anObject
  61161.     "Private - Answer the index of the given key in the receiver, or, if not found,
  61162.     the index of the first empty slot including and after that to which 
  61163.     the key hashes. 
  61164.     Implementation Note: Similar to Dictionary>>findKeyOrNil:, except that the 
  61165.     private elements of the receiver are not associations, but the keys themselves.
  61166.     Subclasses which use identity for key comparison and hashing MUST override this method."
  61167.  
  61168.     | capacity index key |
  61169.     capacity := self basicSize.
  61170.     index := self hash: anObject max: capacity.
  61171.     [(key := self basicAt: index) isNil or: [key = anObject]] 
  61172.         whileFalse: [index := index \\ capacity + 1].
  61173.     ^index!
  61174.  
  61175. identityIncludes: comperand
  61176.     "Answer whether the <Object> argument, comperand, is one of the receiver's elements.
  61177.     Implementation Note: Override for improved performance."
  61178.  
  61179.     ^values identityIncludes: comperand!
  61180.  
  61181. includesAssociation: anAssociation
  61182.     "Answer whether the receiver contains the key/value pair in anAssociation"
  61183.  
  61184.     | index |
  61185.     index := self findKeyOrNil: anAssociation key.
  61186.     ^(self basicAt: index) notNil
  61187.         and: [(values basicAt: index) = anAssociation value]
  61188. !
  61189.  
  61190. initialize
  61191.     "Private - Initialize the receiver."
  61192.  
  61193.     super initialize.
  61194.     values := self valuesClass new: self basicSize
  61195. !
  61196.  
  61197. keyAtEqualValue: value ifAbsent: exceptionHandler
  61198.     "Answer the name of the argument, value. If there is no such value, answer
  61199.     the result of evaluating the niladic valuable, exceptionHandler.
  61200.     Equality is used for comparison of the values (this increases the chances of 
  61201.     returning any duplicates the Dictionary might contain).
  61202.     Implementation Note: Override the superclass implementation which is
  61203.     slow for LookupTables as they don't actually contain Associations.
  61204.     Lookup tables are implemented as a pair of parallel arrays, so we can
  61205.     do much better by a fast serial search through the value array."
  61206.  
  61207.     | i |
  61208.     i := values indexOf: value.
  61209.     ^i == 0
  61210.         ifTrue: [exceptionHandler value]
  61211.         ifFalse: [self basicAt: i]!
  61212.  
  61213. keyAtValue: value ifAbsent: operation
  61214.     "Answer the <Object> key of the <Object> argument, value. 
  61215.     If there is no such value, answer the result of evaluating the 
  61216.     <niladicValuable>, operation. Identity is used for comparison of the values.
  61217.     Implementation Note: Override superclass implementation to use the fast
  61218.     primitive identity search search through the values Array. This makes keyAtValue:
  61219.     several times faster in LookupTables than it is in Dictionaries."
  61220.  
  61221.     | index |
  61222.     index := values basicIdentityIndexOf: value from: 1 to: values basicSize.
  61223.     ^index == 0
  61224.         ifTrue: [operation value]
  61225.         ifFalse: [self basicAt: index]!
  61226.  
  61227. keysAndValuesDo: operation
  61228.     "Evaluate the dyadic valuable, operation, for each key/value pair in the receiver.
  61229.     Implementation Note: As LookupTables do not store Associations, we must
  61230.     override superclass implementation."
  61231.  
  61232.     | key |
  61233.     1 to: self basicSize do: [:i |
  61234.         (key := self basicAt: i) isNil
  61235.             ifFalse: [operation value: key value: (values at: i)]]!
  61236.  
  61237. moveFrom: fromIndex to: toIndex
  61238.     "Private - Destructively move the element at index, fromIndex, over
  61239.     the element (normally nil) at index, toIndex. Overridden to
  61240.     move both key and value which are stored separately in LookupTables"
  61241.  
  61242.     self basicAt: toIndex put: (self basicAt: fromIndex).
  61243.     values basicAt: toIndex put: (values basicAt: fromIndex).
  61244.     self basicAt: fromIndex put: nil.
  61245.     values basicAt: fromIndex put: nil
  61246. !
  61247.  
  61248. postCopy
  61249.     "Apply any final flourish to the copy that may be required
  61250.     in order to ensure that the copy does not share any state with
  61251.     the original, apart from the elements. Answer the receiver.
  61252.     In the case of a LookupTable we need to copy the values array too."
  61253.  
  61254.     super postCopy.
  61255.     values := values copy!
  61256.  
  61257. removeKey: key ifAbsent: exceptionHandler
  61258.     "Remove the key (and its associated value), from the receiver. If key is not in the 
  61259.     receiver, answer the result of evaluating the niladic valuable, exceptionHandler.
  61260.     Otherwise, answer the value named by key."
  61261.  
  61262.     | index value |
  61263.     index := self findKeyOrNil: key.
  61264.     ^(self basicAt: index) isNil
  61265.         ifTrue: [exceptionHandler value]
  61266.         ifFalse: [
  61267.             value := values basicAt: index.
  61268.             values basicAt: index put: nil.
  61269.             self removeIndex: index.
  61270.             value]!
  61271.  
  61272. select: discriminator
  61273.     "Evaluate the monadic valuable argument, discriminator, for each of the receiver's elements.
  61274.     Answer a new <collection> like the receiver (i.e. an <abstractDictionary>) containing only 
  61275.     those elements for which the discriminator evaluates to true.
  61276.     Implementation Note: Override for better performance (#associationsDo: is slow against
  61277.     LookupTables)."
  61278.  
  61279.     | answer |
  61280.     answer := self newSelection.
  61281.     self 
  61282.         keysAndValuesDo: [:k :v | (discriminator value: v) ifTrue: [answer at: k put: v]].
  61283.     ^answer!
  61284.  
  61285. stbSaveOn: anSTBOutFiler
  61286.     "Save out a binary representation of the receiver to anSTBOutFiler."
  61287.  
  61288.     anSTBOutFiler saveObject: self as: (STBIdentityDictionaryProxy for: self)!
  61289.  
  61290. uncheckedAt: key put: anObject
  61291.     "Private - Store the argument anObject with the external key, key, in the 
  61292.     receiver without checking to see if it is already an element of the receiver.
  61293.     Also, does not attempt to maintain the optimal load factor. Answer anObject.
  61294.     This is part of the implementation of resizing of hashed collections."
  61295.  
  61296.     | index |
  61297.     index := self findKeyOrNil: key.
  61298.     tally := tally + 1.
  61299.     self basicAt: index put: key.
  61300.     ^values basicAt: index put: anObject.
  61301. !
  61302.  
  61303. valuesClass
  61304.     "Answer the class of Collection to use to hold the values of the receiver's elements
  61305.     (N.B. This is a different concept from #keysClass, which is used for copying the keys of 
  61306.     the receiver)."
  61307.  
  61308.     ^Array! !
  61309.  
  61310. PoolDictionary comment:
  61311. ''!
  61312. !PoolDictionary class methodsFor!
  61313.  
  61314. named: aSymbol 
  61315.     ^(self new)
  61316.         name: aSymbol;
  61317.         yourself! !
  61318.  
  61319. !PoolDictionary methodsFor!
  61320.  
  61321. add: anAssociation
  61322.     "Add anAssociation to the receiver. Answer anAssociation.
  61323.     Although very similar to at:put:, we store the actual association passed
  61324.     as an argument here in order to maintain its references.
  61325.     The keys of associations stored in pool dictionaries must be strings."
  61326.  
  61327.     anAssociation key class == String
  61328.         ifFalse: [self error: 'Pools are keyed with Strings'].
  61329.     ^super add: anAssociation!
  61330.  
  61331. aspectDisplayOn: aStream
  61332.       "Private - Append a single-line textual representatin of the receiver to the <puttableStream>
  61333.       argument in a form that a user viewing the receiver as the value of a published aspect would 
  61334.       like to see it. Typically we use #displayOn: but some classes of object can use alternate display 
  61335.       formats. In this case we override back to the Object implementation.
  61336.       N.B. This is a development time only method that supports the PublishedAspectInspector."
  61337.   
  61338.       self displayOn: aStream!
  61339.  
  61340. at: key ifAbsent: exceptionHandler
  61341.     "Answer the value named by the argument, key.  If key is not found,
  61342.     answer the result of evaluating the niladic valuable, exceptionHandler.
  61343.     The keys of pools are Strings."
  61344.  
  61345.     ^super at: key asString ifAbsent: exceptionHandler
  61346. !
  61347.  
  61348. at: key put: anObject
  61349.     "Store the argument anObject with the external key, aKey,
  61350.     in the receiver. Answer anObject. Ensure the key is a String."
  61351.  
  61352.     ^super at: key asString put: anObject!
  61353.  
  61354. canFileOut
  61355.     "Answer true if the receiver can be filed out. At this stage we just check to ensure that
  61356.     the file out file is writeable"
  61357.  
  61358.     ^File isWriteable: self  fileOutName!
  61359.  
  61360. displayOn: aStream
  61361.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  61362.     would want to see it."
  61363.  
  61364.     self name displayOn: aStream
  61365. !
  61366.  
  61367. environment
  61368.     "Answer the receiver's controlling name space."
  61369.  
  61370.     ^Smalltalk
  61371. !
  61372.  
  61373. fileOut
  61374.     "File out the receiver to <name>.st"
  61375.  
  61376.     self class sourceManager fileOut: self.
  61377.     self isChanged: false!
  61378.  
  61379. fileOutName
  61380.     "Answer the receiver's default file name for file outs (<name>.st)."
  61381.  
  61382.     | path package |
  61383.     path := File composeStem: self name extension: Package sourceGlobalExtension.
  61384.     package := Package manager packageOfGlobalNamed: self name asSymbol.
  61385.     package notNil ifTrue: [
  61386.         path := File replacePath:  path with: package path ].
  61387.     ^path!
  61388.  
  61389. fileOutOn: aSourceFiler
  61390.     aSourceFiler fileOutPoolDictionary: self!
  61391.  
  61392. includesKey: key
  61393.     "Answer whether the receiver has a key equal to the argument, key.
  61394.     Override superclass to permit symbolic/string keys."
  61395.  
  61396.     ^super includesKey: key asString!
  61397.  
  61398. isChanged
  61399.     "Answer true if the receiver or any of it's contents have been changed since
  61400.     their changed flag was last reset."
  61401.  
  61402.     ^self propertyAt: #isChanged ifAbsent: [false]!
  61403.  
  61404. isChanged: aBoolean
  61405.     "Flag the receiver as changed or not changed, according to the value 
  61406.     of the <Boolean> argument. If the receiver is marked as changed, then
  61407.     its owning package (if any) is also so marked."
  61408.  
  61409.     "Note that we don't test the existing value of the change flag here, because
  61410.      we want to inform the package regardless (in case it isn't currently changed
  61411.      for some reason)"
  61412.     aBoolean 
  61413.         ifTrue: [ | package |
  61414.             self propertyAt: #isChanged put: true.
  61415.             (package := self owningPackage) notNil ifTrue: [
  61416.                 package isChanged: true]]
  61417.         ifFalse: [self removePropertyAt: #isChanged ifAbsent: []]!
  61418.  
  61419. name
  61420.     "Answer the receiver's name."
  61421.  
  61422.     ^self environment keyAtValue: self ifAbsent: ['Anon']!
  61423.  
  61424. name: aSymbol 
  61425.     !
  61426.  
  61427. owningPackage
  61428.     "Answers the package that owns the receiver or nil if it is not yet owned
  61429.     by any package"
  61430.  
  61431.     ^Package manager packageOfGlobalNamed: self name!
  61432.  
  61433. owningPackage: aPackage
  61434.     "Set the receiver's <Package> to be the argument. Any current package association is lost."
  61435.  
  61436.     aPackage addGlobalNamed: self name!
  61437.  
  61438. removeKey: key ifAbsent: exceptionHandler
  61439.     "Remove the key (and its associated value), from the receiver. If key is
  61440.     not in the receiver, answer the result of evaluating the niladic valuable,
  61441.     exceptionHandler. Otherwise, answer the value named by key.
  61442.     Override in order to accept Symbols/Strings."
  61443.  
  61444.     ^super removeKey: key asString ifAbsent: exceptionHandler! !
  61445.  
  61446. RegKeyAbstract comment:
  61447. ''!
  61448. !RegKeyAbstract class methodsFor!
  61449.  
  61450. πV&60çâ3:⌐─µC╟∩╟°╔∞ù╦▌╗▓ª_B¼¿ÇtuY╨Ä;QâP%.N@nO≡Ä d4N¡[o▒δ/ⁿ₧V¡≈Ñ¢≡╞
  61451. àm|e▀≥/_─ñ¬0vºö=p╖!
  61452.  
  61453. ΓH&    &=╖╜=&«─µC╟∩╟°╔∞ù▐ò░≈▓J▒¿╘z}KSÆï8âWAj|^Pnαä &4@¼hVnΓó.║÷i%æêö▓╓ⁿ/;ñKl/ATö╤[£╠┴]óÜpεP╛rà°M x≥qÖ╪PƒKqó|╒¥╤╢▐Ñtüï₧üu⌐▒YA╡     wâⁿ █╠Ñ,Eí5│(α(m ç{╬C}╙:óεîK`Θεδ√∞Φ≡eZ╕⌡╛/jBP!
  61454.  
  61455. ΓH&    &=╖╜=&«≤╠'è;Σ╣àÑ╝÷╤╞⌐≈╖B ╡┼l3AX┴É?\öZ%hGc
  61456. ╢ôZc/Yªn*░ñ/ε█F@í╣≈╢▄Ω%!!┤X3]EΘâ_ü²î4"ⁿÜ}εW╛x╨ RJ+ívû┘QêQ4┐9╨¢┼ ╔ñ3è▀Å¢yO≥┬NIáo%╬»>╤█Z⌐Bª2░═>d⌡┴8─Pa═ú┘çAr║á²·╦▒« æ╦ù3=Fjt8U╜5╤8E─╔╨ßTb8F!
  61457.  
  61458. ΓK)<?ûÇ==╫├σhñ1≥├Ω▐╛╓ƒ█╗σσZM¼»┴upM▌é~FƒZ8kXVb≤ôRt)@╖yW*½Ñ`╥⌡g9ùöé¼┼Ω2*¿Wq.HI²■X├ú⌐g[ÉòVs╝L╗Mé°TI6Σ`┤█@╞3ä+Ω¡α├■ÆVª9á╕╝R)ç╓»o~╪»p╠┌^π!
  61459.  
  61460. σA!! 4░ó=-┐─µC╟∩╟°╔∞ù╦▌╗▓íVE╛«╠o3[S╤æ,[âF+mXVx╢ô^n2\πnV{╖«3ε█F@º╣≈î≥╚âfG@ee├»#p├ú¡3!!½Uüt¬tñtä!
  61461.  
  61462. τV(*íï7/│ºë.«:°Ä»╟√╬▓┐╫░ä]P¿╛╥;rX╫ô~[ÖLP+`XV+≡┴
  61463. Qcf]ªVc┤«2╢₧Pºú▓Ü╖╞^â|[@}p▀┐d4º╠─ZÜçZ5╛Q│yò⌡_JxΩaåɱ(╞i└ù╧≡îªaç»ëûx
  61464. ¿°YAªKb╪»8█╞ΩN+╔Ü÷!!g╣├}─C{╠+£╙çA!
  61465.  
  61466. τV(*íï7/│ºë.«:°Ä»╟√╬ƒ╪▒÷á    ▓┤─~"?ÉÑ0AÇZVjo]n╢êJr'Aáyeñδ4≥█¡┤▓ùß╩R╫fQze▐ⁿd<ε▌╚\åû|¿J│y╨≤^[Ex±vÜ┌\ÜKz⌐|╪ù┌╕Ä═σg÷ÑÇy¿▒QV¡m:içδ6╪╓QΓE╔FÇV°(x╣¬½+}┴2δ£╦ew░½δφ═    ¼±s╕⌠ΦJjBPB!
  61467.  
  61468. τV(*íï7/│ºë.«:°Ä»╟√╬ƒ╞┐  P╛╢Σ~`AD╫ÇS8■t8gMR
  61469. ╢╠^xh5XªnkΓÑ%φ₧K╗ú╢É⌠╩\æ4Jk ╚╣n7º▀┼K╒£a½G÷t₧AΦYJI+±a£╫_òGp∞3▄åÅ╢▄▓vîÖÆ¥y ε·R]∞"g∩àZ┬ƒ^ΘR8╔MÜ
  61470. ₧G°╔k╒G|Çe∞£ÉAx╡ε·∞ß½ⁿCP╕≤íJ `Qf [░ φ't]ñ}ñxäáThfG▀ÿBß3kå±├╜≥u╘╗ò┼└~╗Ω┼dÑl^ ¿W∙.π┐z╫hIül≈ΦÇÅ╥█┼─δf±9¿nσh¿ìæ╢GgK
  61471. Lg▒ñ■#Wö3╝A╤ UCmÆs î∩oú Eü∙é=XSSk─    █▐▀!
  61472.  
  61473. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  61474. σäM&2G¬oi«¬3ΘÉ/j┴éñ¢╖█╫{P.f╚│`r║┴┼ZɃVBºM▓rç╝cJ1≥pì╟╣F}╕.ôö╠ΣîªfåC▌÷∙e╟╧Ωswäªs┌┌YµT#╪v┘²!
  61475.  
  61476. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐¼≥╚7ÄU\zr█┐yrº╟╔MAöÜ p├)▀?²kæ;&(;Γaî═tôFq┐@fÄ╥Ç╡ä═ßd╢ƒûrºσN`½crìß2╠╞ΘD8í5│Ü,uúç;╨Go─V╪╡ôQ`Θε╙█┘9Ü╤AxΓì╪ck GAQ&qÅ∩~Y_E▌Mì:»ÿfLos√ó «i1═¥╗╤òσ«█ì┘,░Γ═>▌ #{j¼iΦU4t╟êV≥Hz╚╡ñ¬▒Φz▓Γα╜/₧{Y╙j⌡iàñ∩═Rl&o -Σ#╔╖@¿ ¿|÷,d∞        Σ·!!╣JfY╨º∞B%?#pn├äÆ≥a?┐╞dö╩}║╬≥-╖EQCH╦■/XP√■Æ┴▌╛⌐⌠║═┬!
  61477.  
  61478. φK$Ñî: ┤¼╛%è+î╛åÄ▀┘╠┬╗ασR▒╛╫;zFE╞à0QÆK,.O[nOΣä\o0J▒0x¡ñ4 ┌    ª≈ƒ╡╥÷#2╕W,QM√ƒEÇ∞é4"°|·(f½O░=£ PC$9Γlû╨\«M{╕Z|└ù╧≡îñvÄ èùçQ¬⌠!
  61479.  
  61480. φK$Ñî: ┤¼╛%è+╗öΓ├·╥▓┐╫░ä]P¿╛╥;rX╫ô~[ÖLP+`XV+≡┴
  61481. Qcf]ªVc┤«2╢₧Pºú▓Ü╖╞^┐_{9QL⌡ƒLæΣßz`╝8╢T─.▄«∙]II>≤kÆεKÖFq¬    2╓ûΦ≤╒·3╧%┤╛¬C#ü╥vh¥M+X¬╞√ÿΩN+╔Üⁿ)d!
  61482.  
  61483. ∞]8(▒¢7;╫├σhñ1≥├Ω▐╛╓ƒ█╗σσZM¼»┴upM▌é~FƒZ8kXVb≤ôRt)@╖yW*½Ñ`ε╓KΦ┤╕ôτ┌àg3jr▀╗d!!║█┘
  61484. °|■|Éfñoƒ╝_@Σp╢╙IÉGy⌐(╓û!
  61485.  
  61486. ∩E*ox»è+«╗à$é±╒²╔≡├∩╘¬· Q░┤╘PvQe╞û7\ÉV%aOxn¼┴kc!!dªeyúªz║═Cî▓ñùσ╩s²0|i╠╜y7εäÇxFåû5»╕xçA⌡_\9∩gÜ₧VÜ`ñ|┴ù└≤┼╢vÜMûòÜh»²^^ºdgδ°:╩╫≤I*î^╚µ d≈╙kî¬R█╡╜Wq┐¿╕≡σ┼₧    5╖ß┐X%MPU&£φ]&9┘▀ä╡il(KÜô äN)ôΘΓ¼εhΩ╜∞º≤Wº∞╞Σ.QRÄy√$qFÅ█⌐~Zß\▐ÆÆâ√Mê▀╫πF!
  61487.  
  61488. ∩A0w_Qµ«<:¡¼₧jä∩╤°î≈┘╓┴╖≤⌐ZY║┐Çr}[B╙è=W╫PBjzSV+≤éPp#]φ>>╧┴I─ûQñ▒≈£÷▄╣qIZ.0ôⁿd<º▌╔XD£ û!
  61489.  
  61490. ≤K(&U╬µp┤║¢/ùα┌»═∞┼▐╠■²úW╖╛ÇkaMR╫é7\Æ[8k\ZxΣÿ^Ki)[░2╚╞Jôαc║╢«▐ÜÑuwÇ}J4 ╔╣a4ε╩╠X[åÇ$zíW█∙hδX[bíwÜ╥_▄Wg⌐▄¥╫¢ª╔ƒïô╔<½²Q«o    zÄ┬2▌╫VΘD├P╬{ÖDε╬l╩.╙:╜┌├Qg╢╝δ╠∩    ╝Ö
  61491. 5╨≈╗
  61492. ?Fj4╬    ∞6xHb╞┘!
  61493.  
  61494. ⌠W"7½¢_C╙δ¡$û(Σ╞»═╛┘┌┬■√½@W╛╡├~3GPÆÉ6W╫MA)kREn║┴ Vi2Jº<ZdΓâ ▀τ}#¥àà╗┘√#+ñQlN
  61495. │Åe=╗┼─IÖ£aεB║jæ∩G.Σ$ê╠PêG4¡?╓ü╨╢╪»3£ûê╙w
  61496. ╖┐)╚`╝ⁿ6╥┘ßS ┴o╚≈(g≡╔}╞ik┘e±¢½oQèæ█╦╥4ì┌Tcî╙ù8E%KZch╬IΓ<!
  61497.  
  61498. ⌠W"&
  61499. ½Ç&D╨└╬ ï,÷╤²î ù╤╨⌐▓¼]P½║╬xvY╘─*ZÆV/m^Z}
  61500. Σ═^Ki)[ªxc¼δ╤√{?¥äƼ─ìqt·7>}e╓║-'╜╠╥JzÜçL5φQ│|ö!
  61501.  
  61502. ⌠W"&
  61503. ½Ç&s·ñâ.ÇRï╜¡φ≡─╚╨¼▓ñM║¼Çr}[B╙è=W╫PBjzSV+≤éPp#]∩<Ae¡┐%■₧KΦƒ£╗╬≡)-▓FmB
  61504. ╖╓ ╜╠╠_ô£E╝F▓xû≥TK"=°>▀Öq╖gMô5÷á≡▒î¡|î┼█₧s ½! !
  61505.  
  61506. !RegKeyAbstract methodsFor!
  61507.  
  61508. ╝$8(í¥3'╛─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM#}Pdσê\t#KπyB½╜!!÷█LΦú╕▐π╟^ûfYce╘¿#p├ú¡3!!╓£zεæx₧εP[6µ$ï╓\▄Daá |├ô╫■î⌐`╚ ▀ÖÜhO½ΘGA¼smçús═╨Ω@6╬ZÜß(`≥ç|═U`Ç>┐╪├G{╛╛∙∞σF║√oH∙Φ│iCKv3Üú"~B█┬╞ßXc8B█î*╦Bà±▄╜╝`⌠¬ì─ƒ-⌡≈╞Iî6A≥ûfJLτ╜oÇ~KΘùäÇ╬é█╒╩δR±1┤oí ╒Γ√╓U)NMg▒ ■¥D é1ôHƒTNo╢atà╗hú    *Q╪º²V?>
  61509. k┌ε╙═L;!
  61510.  
  61511. α@#@u9¬«!!:╡¬à+æ6ε┌éªùò■╤║▓ñ]b¼¿╧xzIB█ï0âP>f^y
  61512. ⌡äOc4π]]y╡«2║▀L!!╗ñ╕¥■╬ÿz@Osܽhr»█┼G¢è{╟P┐pà²EF?íe▀é}òA`Ñ2╥Ç┌¿ÇαdìM¢ö╙r║▒VG╢u wÄ÷s═╦P⌡DoÉ~╔ⁿ.h°╙q═L0╙s±╚ïAf╢¿≈∞σF┐± Q¼≤ªJo/Go?₧µ5[▌─╩¿W-(F^╫Æoä\B╒±┼Γ∞t≡α╧Å≈T╪ëá╩    1Kµ<²UL±╛j╔lOσ    É┴ÿï╞ï├╤╝⌡⌐xε0╠µ∞╓H)YE(⌠y■¥D[É:╛]╠BKbÆioâ!
  61513.  
  61514. αW'9⌐è&,¿─µC╟∩╟°╔∞ù╦▌╗▓╖V@║▓╓~a_▄─?æPV'.HFb≈â\& @▒<Ck▒╕)⌠┘º≈╢É╖╩
  61515. ÆfPb ▄⌐c1║└╧W% â|úJótå╝\J0ε`▀ûJÖG4ë(╓Ç═≈└îzè₧ëè<á⌡W╖b    wâⁿ █╠⌐Bª2░α(m çj╟Cb╔%┤Æε.ìª∙≡Σ
  61516. ¡!
  61517.  
  61518. αW461Ñ¢;&┤êÿp┼4Σ═»┼°÷▌╞╗ⁿ▒    ║ú├~c\_▌èSÖ[H/|69M╫ÅNc4ó<]o╡δ|√═Q½╛╢è■└@╫v[ye▀▓-&ª╠ÇRMîVÆqεU╖qà╝^IdRêpù█ÄGw⌐    *╓Çâ≈╪αgÇ▀Üü{ú⌠YPε ~¢ís₧÷YºJ*╒╙│#nφç~═W`─s±▌ìWc╢╝╕ΩΦ┼₧    N╝≤º%ISKc$Å÷$xAWë┼╩²Wd0BH╙éèVù≥▌╜ó-ñ┐Ö╬ƒ.íΩ╞τ9«2╛b2ê╪W╙hWΩFƒò╔╬╘Méû╠αc÷5┤╗s■┘²╟Cy[F3┘6¥≤!!`âtëO╙D!
  61519.  
  61520. αW461Ñ¢;&┤║¿%▀ε─Ω▐ ├╓┌░ƒ╧:Ü¡┴wfIB╫─*ZÆI%`ZWb ╢ùUs'M»y*¡╗%Φ▀V    º╣√▐±└^Æu].o▄ⁿy:½ë╥\KÉàgΘP÷·h≈TVF.αhè█¥Qgú5╥å╩∙┬│=σg÷▓₧l½ⁿRJúttî»╤╦Z╜╔╫α9!!÷╤}╨Pg─:±▐åGuª╜²╛⌠¡┤rY║σ╗wQc!!╬∞p%9╚┘ï¡Ut|@C╘ò.éTB╖π┬╖ hσ«ê┬ö-√íñcóo^║<≈
  61521. mL├┐m÷lW∙ìÑ£╘ƒs┴▌à╝T┤p╫êZ╩≈²═R`@    +≡;å≥w%┘'ÜB┘X@Qpëciî∩<∞P╔▒ⁿ:?SC>▌Z╚╙╒Q┌úJcè!
  61522.  
  61523. αP}Z>=╜╧;/¢½ƒ/ï+╗öΩ╘²╥╧┴╖²½{B▒┐╠~a%<╗╞\äHA8.O[nOαÇLcfAóqVnΓ⌐9║╩JΦδÑ¢÷╦¢qm|i╘╗3r»█╟LEÉçZ5ÑF»3╨(·[=î÷╒\à}┐@5└╥═∙╪αuçæƒ╙}╜µRVΓt~┬²6═╩S≤ ╩▀≥!!t°╙q╠E.╘7┤£▀J}┐»ⁿ≈π0⌐°u]╗∞╖TN%+?bc*ì≤9~Ax╚╔Å│V*a█ÿoèVÖ░├╣⌡rß·Çì¡7╗░¢,▌8Rñ∙`Vφ┐)╔k■ÖêÇÜ═Q█╫╞σGτp╝jΦ?╓º■╨z@ LP¢^ü≥,v₧:╤ ▓r,(
  61524. ╕seü²u≡'_─úⁿD?Y    q╪    ╫╨╨Hö·!
  61525.  
  61526. αP}Z>=╜╧"<«≤╠+ïπ▐Ω╧Ω║╡╝ⁿ┴▒\Q║√╘svW└â+_ÆQPjoU|i≤é
  61527. q/[½<Gbºδ|Φ█C⌐╡╗¢─█Ös@kx╬╣<»┼ÇRMîZ╙p╖█∙≥[=ívÜ▌\òTq╛N|≥£╨ß╔▓3ë░ÖÖy ║│:.╧
  61528. cEæΩ?╪ƒL≥C,└^╔┴(rΘ╚v╤Kl╔3╕╚Ü!
  61529.  
  61530. πE46╢è7D╨└╬ù6≈╒√╔╛܃τ╗■áRP║√┼cgMD▄à2àZW%{IPn╢ëUbfM║<Gbºδ2 ▌G    ╛▓Ñ╨ÜÑu*ƒqkc▀╡{7╝ë╔J£àyºG÷|û∙C0Φw▀▌XÉN:┴jU²▄ß╕îü}æMÜëüs╜▒TH¡suà»'╓┌∩@!!╚S▀V≥?d╣╬╠M|┼; ₧ε.┘╟╞φσ
  61531. «┤rY╛Θí|j\    t3£ú5vl\╞╚:Å╕-4BB▐ì*!
  61532.  
  61533. πE46
  61534. íÄ> á¼ß@∞}╤╞µ┌ ├┌ò≤▓èCF▒√╘svD╫ç;[üZVm}Rx∙éXr#KπnVm½╕4Φ╟ ¡«∙▄ÜÑqt■hyE╚«-.├ú⌐QI¢ƒ5⌠÷Xê∙CA4╔eæ┌UÖz⌐r╛°¬≥█àaÜM┼╞╙o
  61535. ó≈Vºghû²*≥╓]⌡@=╒2░Ü?d■Φh╟LE┼&ö─┘g╢ó■╛≥    ºαKYáá│2dTTc&ïÄ}Y&\┘$╪íñ@7|PI╓ço¢[₧╓├╖±Sδ╡òá≡W▄è▄α#»&╝_5ï╪╙lV╚ìêüï██┼└ΩD┤1╖ïZ¼ÄΦ╫tl\E)½w¢÷#a¥1╤#╡qFtúrr═ªu╞8s·¥▄bo*Mûw┤╗░M┤±I/φ┐rùöæC╥)=*x½∙"%<¥ÆíÿΘc╞╙ÿ▀╧£εMIJ┘sÆ╜╜,φüGY6╘èÅΦΩ
  61536. _│┌A═ßÖ=x¡ ╧;ûE*w6ö╓·£≤%â╡ô[₧╜H╢6Z├║ó═/∞¥·W ε#τÆh7»«ÿ≡å]Bè(.╟╛╨^.╥∞≈HÄτÄp▒┼ φ#¿╠{Z░{@∩ß¿≤αf!
  61537.  
  61538. ΓV"!!=Åè+s·║Ö(╡>⌡▄éªùòⁿ╟╗≤▒V░⌐ÇtcMXÆà~@ÆXM9zIJ+≤ÿ^Lh"J▒<Gbºδ2 ▌G    ╛▓Ñ▐α╞╫`V.s╩╣n;¿└┼]% ╧a╝J╕z╬AεTC,ΦrÜ₧I¥V|∞.▄ƒâ■╔▓v╚EæöçyO║∙VPΓtræ»:╙╧SεD<îK╥τml÷╒}éVf┴1±╙ìA4┐½ε√∞F½⌡n1╙ë░BfTP
  61539. r7èJΓp~AS╠[ìäÑy4J_Üê<╦S Æ⌡╘╝╝u∞┐┴╬¢-░óÇGÅ$9«o╝|Zó┐l╫-PΘ╨├■Σ▓"≥╩à⌡W÷95ú+²^»Äδ╩mlVF`▒$û√+%ü&ûX▐ Daqâatê╨0·PeO▌á▀V%2t┐    ╦╨≥A└σN/▓▒$⌡ⁿíT╦.UY!
  61540.  
  61541. σM4
  61542. 99╜á<s·¿┐>ù:α┘éªùò■┼«≈½W╛√╙s|ZBÆÉ;JâJE&._Vx ΣêMo)AπsU*╢ú%║╠G¡╛í¢σÅ╫um|e█▒#p├ú¡3!!ö%çp»N÷yÖ∞]Nbíj₧╙\!
  61543.  
  61544. σK}Z:(í¥3=│ªéG∩Vú±∙═≥┬▐┴╗▓¿\M╛┐╔x3^W▐æ;ûMC?c^]C╢Ä\t'[¬s]&Γ¡/Φ₧G½┐≈æ±ÅÆ4[ km▀▓yrí╧ÇM@ÉV■|╝F╡xÖ∙CI∩wê█K▄V|⌐@.╓æ╞ ┌Ña╞O≥±■f╜⌠[BΓkbæ╬=┌Θ^δT*▀{╒L│;≥ç"╘rÇ0í┘æE`║í÷╛÷ñße∙÷Å!
  61545.  
  61546. τM+-░á<s·║ÿ8Ç>∞╣àÑ╝±╓┘╗▓¬FW »╚~3ZS╤ü7DÆM#`Gc
  61547. ╢ô^c"F╖<Go║┐`Φ█R¡ñ▓Éπ╬ÿza ╬┤hr≥┘╒M\öƒF║Q│|¥_╝P]-∞aæ╩▄Q`╛=▐▄ü¢ª═ß3î₧ƒzO╜ΣUG«ah░Ω ╬╨Q⌠H-┼S╙Ω!
  61548.  
  61549. τV"XR══,╢¼ì9ÇΣ╠√╔∞┘▐┘■αá@L¬⌐├~`^╫ê:òF>f^y
  61550. ⌡äOc4╬:^¬«`Φ█Aíí▓î╖╞^ä`W b ╠╜a;¬ë┴_\É╙}ºP÷~æ≡dRî÷═\ÉD4Ñ▄¥╫╢┼ªUëî₧╔<4├¢>-▒e}┬φ2═╓\┴S*╔Ü{ÖD±╞v╞NkÇe∞£ìMxÄ!
  61551.  
  61552. τQ+9░ç_C╙δ¡$û(Σ╞»╪÷╥ƒ╙½■⌐S╛»╚;gG╞î;àZG/gMVyA┤∞t4 Oq░y_lΓó3╚╤M┼▌▐≈■╔( éq@Un█▒h├ú⌐0Aô0Æf½÷Fé≤Ed !!íj₧╙\╨3ÉGpôü╞·╩αcëù╜üs£■XPƒ!
  61553.  
  61554. ΘE)9=╔σ[k¢ºƒ=Ç-í└τ╔╛┴▐┘½≈σ\E »╚~3ZS╤ü7DÆM9.R]x≈Å\&0N▒uRh««`≥▀Lñ▓∙≤¥ª(₧gkt╥│ir╣╚╙IÇ£t║J╡|£σH 6Σv₧╩\ÿ4«(ôƒ┬∩îóv╚ɃÜz½⌡╧
  61555. gδ╤;▀╤[δD!
  61556.  
  61557. ΘE)9=■╧3┐«à9æ-° Ω╒╓╓╤╤▓≈╚9*²ï╥reIB╫─sñZPjzSV+≤éPp#]ΣobúÑ$÷█º≈úû≥ÅÆwWge▐ⁿ7⌐└╙MZî{∙~½Z÷uæ°]JIpΣmï╓\Ä{ó|▄öâΓ─Ñ3ÿ܃ûzá⌠SèK/B╜╫ ₧▄PΘR;═Q╬┐@ É╚jéC.╚>┐╪ÅA4í½∞δ≥¡≡ Z½∩┐J0`Azc<Ñ·2(9ïzº|α╚Ql2G@▀┴u╓ñ⌡╓▒∩u÷ú¬╚â┤φ═╩!
  61558.  
  61559. ΘE4XR══'⌐╛ë8┼+Θ╤»▄±─╓┴╖Σá╢╡╘~tMDî─6SäW<oWFnO≡Ä r.JπnViºó6 ╠ B┼▌┌⌠₧±¢r{l╓îl&ªë╚X[¥!
  61560.  
  61561. ΦJ$ <í£,ú≤╠!!Ç&î╛åÄ▀┘╠┬╗ασDK║»╚~aB┌ü~@Æ\A#x^A+≈Æ^X&-J║<V{╖¬,║╩M@╝┐▓▐½▌ôu\ kS╬«d<⌐ùÇ4"ⁿü`úF╕i▄A≈TVGzî≥┤0óQqá|└ç┴⌡└í`¢?Üêâs╜°UM«ib!
  61562.  
  61563. ΦW:,╔σ[k¢ºƒ=Ç-í├τ╔Ω▀┌╟■µ¡V¡╛├~z^S└─7A╫^8aTG+≤ÿP L"╔mbúÑ$÷█]ΦÑ╕æπΣ╫|_jl▀!
  61564.  
  61565. ΩA>w_Qµ«<:¡¼₧jæ7Σöπ├±▄╩┼■∙áJ░╜Ço{M└ü=W₧IA8 >b£Φ Jc*IπrRgº!
  61566.  
  61567. ΩA>@u6íÿ(╖¼ß@∞}╥╤√îΩ▀┌ò▓²¬XV»√╦~jY╘─*ZÆV/m^Z}
  61568. Σ┴
  61569. V&2Gª<xº¬$√▄N¢úÑù∙╚BR╫z[@a╫╣#p├ú¡3!!╓£zεƒpÇ∙\J,ívÜ┘PÅVf╡@7╓ïâΣ╔«ràæ£╤2b─ÿia░ri┬ß<╩µZ≤h"▄S▀÷#uⁿ├!
  61570.  
  61571. ΩA>3;>½ΓX@°êé9Æ:≤ö√─√ù╔╘▓τáL╣√╘svD╫ç;[üZVm}ZeΓÇZcfYónZkáº%║╫Lº∙⌡≤¥óvw£qG)`f╒ⁿd!!Ç└╠Aô"üp⌠ìvò╒_Ix╗9▀═\ÉD4╜9┴ïΦ≤╒ë}Äó╒■fÉ·R]ïn t!
  61572.  
  61573. ΩA>    6á╣3%»¼ƒèeí█ ╔∞╓╦▄▒ⁿ╚9*²₧╓z]W╞ü~FƒZvjBRo⌡╖Us'M»y&Γñ0 ╠Cí╕╣╥╖╔ ╫q_f ╤╣t}╕╚╠LM╒ÆgεJ╕=ä    ∙] ;Σmë█K╥╞mV║¼╨≤└ª3âåê╖sUε╩OΓ|JtÆΩ!!▀╦VΦOo┌^╓÷w!!≥çn├N{┼e±öÉAx╡εΦ∞Θ⌐αe}¡║≥KX!
  61574.  
  61575. ΩA>    7■╧=9┐╗ì>î0∩╣àÑ╝≥╔╘▓τñGF »╚~3[▌è?V₧\r+bNRi≤▀Ri6J▒}Gc¡Ñl║╪MΦ▓╢¥ Å╫`V.r▀┐h;╕╠╥[╒å8ÑF»n▐Cæ;"cQ▀wÜ╥_▄Qa«0╥ü╨─╔│cçîÆæuºσN!
  61576.  
  61577. ∞K#ox⌐Ç6,ë░ü(è3î╛åÄ═╥╦ò¬·áB╝╕┼h`[▌Ç;àZU?gIVoO∙ç^Mn#▒yPo½╜%ΦƵ░∙▐┤▌ôCL    zeûⁿb εè╥\IæX╤{├)▀nò·\5╗$╫ ZƒGg┐-3╫ù╨╢═┤)╚ɃûOú≤XHδ`!
  61578.  
  61579. ∩E*XR══'⌐╛ë8┼+Θ╤»┌ █╩╨■²úW╖╛ÇivKS█Æ;@╨L#`HGj⌡ä^Og4Fó~_oΓÑ!!≈█ m┬▐âû■▄\Æ`Vj ═╜~r»▄╘VEöÜtóO»=ù≥T],Σ`╙₧[ëV4í%ôÉ╞╢┴»wü û₧ù2M├¢:.╦^zÅΩ!
  61580.  
  61581. ∩E*ox»è+«╗à$é±╒²╔≡├∩╘¬· Q░┤╘PvQe╞û7\ÉV%aOxn¼┴kc!!dªeyúªz║═Cî▓ñùσ╩s²0|i╠╜y7εäÇpF£ÜyºY│=ä    ∙] ;Σmë█K█Q4Ñ9▌å╩Γ╒αzåïÜ¥
  61582. ετVV½awçⁿ}£▓5è+F┬^╫│w<╣╠}█qz╥6┐█═)┌╛∙∞σ╝─aH▒áΦWBwIZM7ù9≈9Hñ}ñà«MF9Z Ç▄oèhæ█╘í▓ Ä╙Æ╠ù~∩╛ë╬
  61583. «y°!
  61584.  
  61585. εF-6,é¥=$î¿Ç?Çeí╓÷╪√─ƒ┴ºΓá    ½ó╨~3[_╚üdäV^/1:)?ΣêXr#ε<zd▒┐!!⌠╩K╝▓≈ƒ∙ÅçfQ|i█¿hrí╦╩\KüVç5╝Fªoò∙_[I,Θa▀╠\¢Kg╕%╛°¬α═¼fìMêÆçtO║∙R▒pxïΘ:██≤X?╔Üⁿ#uⁿ╔lÄo╬;±╧è^q²∞òöìl┴╖tS╜∩≥H#aBr:ïú5vFC▌╘Q₧╕Ih/╖δBß3JéΘ┴╜╝<╣·│Φ╜å┘ë▌_w0¼y╝R)╨öN Hc▄'░Ѽ╜σu╥û╠αvµ5α+┌╟■∞┌    j@Pg▒çσ$kûtÖ\╨2╞to╫╗}≡?Yà≤»Z0"Y.ƒ'É┐│-Ö≤YjΩó    ¡░╕x·bdQ╦÷(ö6╫└µ╨╕┐Γ÷╧£─Mÿy┤½CP7Ñå╒S¢π q∩ºá╦àb,╫¿    Ç╖╥}?à╦┬ièFD%éëU╟~¢°#ë┤²Wàï^à*┘Θ÷ü=▐¬╨-ƒ¥O;»┘e0│Σ▌ï╚Dv∩εÿφo|┬╞╩Xëπ╞)y£╥:╒`Y╨╖ZG■2B±╟╗⌡╘T╙u░ⁿùÅá╤E∞j^¥Sß÷╔Tε█▐í┐;]ÇP'¢▒ç( ½"ì╙G{
  61586. Å╟µ$ÿ∞Θ5▄TÅ9)⌡Ö╟┐█1n}∩╡≡uh%â@=3'8¼∩|╜ñäw=╟╓╢äPñφè >ï9 ∩L`¼!
  61587.  
  61588. ±E5;,Åè+D╨└╬ ï,÷╤²îΩ▀┌ò«≤╖VM½√╦~jY╘─*ZÆV/m^Z}
  61589. Σ═^VtfA¬pcñδ!!ε₧V¡≈Ñæ°█R\·3j|Ü»x"½█≡X\¥VÇpúÑtè╝AN0íh₧═M»Nu┐|╧ ⌐ƒ▀ÑÄMûêís║▒^Bûr~╪»α╤Vδ|aí5│≥9i╣¥%éQk╠9±╠éVq╜║╚ ⌠µÖ
  61590. 5¬Θ¿B?g&åJ≡*t=ú~▐Éñ0aÜê)┐Hô¬æâ┬rß╢çìê1║≈Γ ╓8yfxj░}∩GSπóaÇ7¼ƒò¢╬╧Z₧└∞ΦF±
  61591. ╝1íw∙º■═K3@'⌠wç°w%└z≥$╢@Qw╡la₧≤u╛We Ñ╚å>X3L-l├äÆΓWɵN╢δA▀╧┬ÖkvS╟²dY`╤|û∩╨∩c╞╙ÿ▀┬ìφ^ÉKÑ▐m7╡éè√+╣j&Bª■á╧╤71¢ƒ*│╗ΣF¬■íiÅAc#>ï╥⌠╘░yß═╘=π≥T╖=@┘⌠τ╤(┼°╨,ƒÇB╥ám*¡«ÿ╪£Tçz'┴ñ╫y0╩╙÷w╥ï÷|▒┘?¿=!!╕⌡qQ╔7Eδ╫╫ï┤2╙4«≡╩┴▓╔K1│gKƒNπ÷╘w■ôûΣú8L⌐ZR.·╬δ║I£╪V|
  61592. çüº%╫ß⌠╪ ┐¬╪▐ⁿW═triª¿σK!
  61593.  
  61594. ±E5;,öÄ&!!╫├σhñ1≥├Ω▐╛├╫╨■Σñ_V║√╧}3\^╫─,WöZM<kIxO ÅMg(Lª<Ek░ó!!°╥G@╕╢Ñ¢∙█,â|m    ε┤d!!ε─┼M@Ü╙t╜╖hä±P[;αhô╟¢Gz⌐=╟ù╟║îóf£MÆÜè<½▒ZKªi rçδ}£▓5è+F≥O█÷#u╔╞l╩!
  61595.  
  61596. ±E3*½é&╡╜ß@∞}└┌ⁿ█√┼ƒ┴╢≈σUV│╖Çkr\^ÆÉ1âWAj|^Pnαä $K%╬:T▒«,ⁿ₧KÜ╕╕èÜÑuw₧rj{eÇⁿVuΘ⌠¡3!!ⁿò0tóP│'╨:æ;&`Q±eì█Wêru╕|┌üµ√▄┤jσg÷≥·¿┼EQº:J@îε>█Γ2ì(FÑ6╙╒,mΩ┬"éy~┴-┤╥ùtuºª┤╛º:∩╕ R╕φ╖7?!
  61597.  
  61598. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR¼│╧igB╫£*GûS.kHPyµòVhf@Ñ<Gbºδ2 ▌G    ╛▓Ñ▐π└\ñ`Lomö■X├ú⌐X{üûxε.▄∙²BF
  61599. ≤mæ╩▄Qqágô ⌐ƒÑ«vÉ»Äç&OΩ╣ )╚    cuç≈'ε╩K╞M#ûÆ≥#e⌡┬8╦Q@╔3±╒àpfª½ó╛█Aå┴Lp■▌≥CGYch╬1δ>uCUë▐8ä╡\j9Q ╩ô&àN1éΓ╪╢√Sσ╛ê╒└~Σ╡⌠@öh]b{╣dΦ?aK├╜eÜ-¼K▐╞╚π╡!!≥╞╫∩LαHp⌐nφ5àßφ╙vh[P¢^·∙(}àèZàX !
  61600.  
  61601. ±V. 4,í¼ ,╗╜ëÇ&╗öΣ╔τ║╡╝ⁿ┬╖ZU╛»┼;>u└ü?FÆK8.TCn╢Ç^Kc!!F░hAsΓá%π₧W¼▓Ñ▐π╟^àq]gv▀«-%º▌╚\¥╙e½@┐{Ö°<%` ⌡vû╨^▄Pqá(┌ä╞╢▄ígÇMÖë£qOª⌠EAΓ(tûΩs╩╫^≤;─V╔V· q⌡╬}╤z╚>Ñ£ÄKf╢ε∞÷ßΦ√nY∙∞╖iV
  61602. h_Σcßpr]U╚╚╩áM-3MO▀═oèT╓Σ┘▒∩!!φ⌐┴─ö:░µ═I█2K»y╜F:├┐z╫hI Fèëû╬╤Mîû╬π[║Z╙E»ïº╠╫gJ    6⌠.╙■>%é ûB╙XNRfê aÖ╗!!δ6▄½ΓR}zKzû7δßφàúZ8▓·M╤╫≥-│FQL╫≥$╤hÇ▐╩└N╛│÷╛▀ÿïC±2╔ùPTÑï╧IûjêzrΘ░▒┬φ>ôû)τå⌡C_╔ôÆ;èGx#╟ëH╝S£φ1╠┤╝Y─÷-╩<%æ╗τ¢tæπò2É╟Xµ╜p6│╪╤╔çC]ºPB⌐Ñ╞M┘┼ ^Ö═Öpg║åsφ"2·▀gxδ)E⌡┴«Σ╧6╖\╩££æÆ╚mY└>NP¢EïÆ⌐.°₧▀íá-MX┘UO*·╬δbìnÿ╥QL/H╠Ωì^▒çΣ,≥Y▄v`¬âôö2∙NQ_╥Æ╦hCÑ`Ke~Σ─Iî╠²^Wí╒«»f«≤┘¡j[P─pN≡C:║TCY9╢BÉ┐èM2⌐MU¿a>£║,iΣδΣφ    édBJ"₧°ê╡Ƶ.╓∙°,╥░± ╔!!H'òè▒I°ïï±C█∙°(-u╝åsj∞╕os│δ|¼ÉSå╘k╝Ñq╕║£"zα:I┬h4╡1¢├1Y`~cΩª╨⌐⌡e╢
  61603. Tt╞ßföÉ▀)╝░\&f<èp▀
  61604. {l█ĬEyε'MiZ ΓΦⁿZúß/2°╤é~ÿF╫τöO▐L-xî■╖c═╡_║┬î Yl%?,╝Σ╝$ï@ε╬ùh█Ω(█Θ±*÷ëànâ}╖╒╗∞¿I╔╫jΩæ╣"─cí╜H├µ]─▐HΘAq:
  61605. ╣c/jh^(Nó╩EDïf\┤0>%WΦ⌐î_æá└múP╝ºπ╢%Φy*IÅ≈Σ    Ü│å3^╝NêuëaO*²>/╬∞+╥/─!
  61606.  
  61607. ≡Q",íû'╝ªß@∞}└┌ⁿ█√┼ƒ╘■≡░]@╖√╧}3AX╘ï,_ûKM%`Riπò^Mn#▒yPo½╜%ΦÉm┬┌▌≈δÅûgM3zr╙▓jr¡╦πUIå╙F╗A¥xë╝RM$9∙Wè▄rÖ[X⌐|╨Éε≈╘âëî╖ûrO¡╟VH╖e;üφ▀╟iµM:╔q█÷d≈¬½Alφ>⌐ΩéHa╢é²≡á¬╟e_¼≥╗ACFt;₧∞pw[|╚┘&ÿ¿MhJA▀┴+£ä░┴¬∙w╠╗Å╔û;⌡ ñcóo^I╜o∩<`Mδ┐nÇ7¼5èôÜÇ╪ò╙╥╝ªGf⌠ïZ╞σ█╙Uz\}╒╝┼    Gê Ü]ƒSMn»ntêⁿ0±Pe_─úⁿD.Xp╤Z▄╙╩M│ΩF/∙╜$⌡°⌡.▌-Rk█πdY`╤Há╘Ω÷,╡«⌠Ñïà╬H╥5╩φFT    íè╝╔¿{J⌡■ΩôàF╕¿àæΣQΣ≈■>═-^Oä╤8²X║φ6ƒ┤æQä█■x;7¼¢âπ0┼⌡â~ÿé]Hú┘e'¿┘┘╙ª So╧#┼╣âaïΣ╔e«┬╛pVº╧sφ9z╫┤KΦEα≈»π÷^─ª√╨█ⁿ¥;qsδ@,BèY⌡╕╬Bñ÷ª═Ç)E£H|╩Σª_$ 7î{ì─QVa
  61608. £╔è]▒φΓ▄{╘u{╝≈╥½≥tp/╝µñbK╕jd^W╓oπ`╛∩·]W╦─éúZ¥ß▄¬jsè#í^₧z|q╞?ⁿá┌p&≥26╒:è¥;c≤∞∙ⁿⁿ_y\.Xπ~â╪τSα╟
  61609. ∞0╔Çu╒áαg┬=dl æë╘_Φ░«δDⁿΣ ┼..*╝╥'&äⁿ)?â╒t¢┬D╠┌#Σ·4πò╜Oδt⌡$8B╔mC═àJoVyi╡±╗╓ì╬#Cj-┌≥*ö좽Éa)Gc└X  a,░δâ$ ╣ Vgiα⌐■α7Rσⁿj<²─£n░N┴≡─;⌠7;z▒φ:úhß╛╪âs½φPOe/yz╝√Ö ║MΓ╪Éúε+╝{ΦΣS║âôd┤5╥─⌐φ₧S╧εe∙⌠ë ╛j╜╕
  61610. ≡δH▀δªOA    ¼VCl&N(║"²Y╬gO╢*l$Q≡∩zⁿ[eΦ╩αy¼u╖ ·½í┤y8F9uΩ£âdÜΩ─JªVÿn∙    <oæYlü·;9╓;±o╣┤╢¢Bg╤█╓▐:¡:qX«ì╖⌡Rj╢9I\í▀Θ≡>▄%╪qqδT√{,Yhe÷╒.¬«yô`üδGΓ!!°±∩HƒÖæ?+∩üì6╚└Φ╘╪<├╥%∙└2L∙7FMÑg▀ù╒^╢│∙tr▀¬\╗╔√╝τ;ß·N▓╦Y£â▓»╔8ÑH╪u\Çû╟∩°¡W├φqσ▐E1∙√═ ⁿ╞Æτ¥tUö-ùQ*╬e=X¼╞╓Ñ╬x╚eö3┤á2g*rs╓≥¬╠$;╚ïq─y┬╜í]ûº∙g≡2`öá*C▐%Çr╝╨p╞Çr9 U.Ñ|<¡┌╖┴∞ ¥P╙5 îs█æ╘├_Γ╦jPìï┐qüRÖì╦àPv|·⌐ ÷7*╤ⁿ╚≥î-╦e┐ ≥ò╓;#∙ly_%R╜_V2d┐╥\δé,*╣bÑ╕âî5[]╫Vµhçφûσî┘éQP▐ÜèΓ¡`ä\á╢9⌡âß≡┘│U~H∞°┼l√ñ┬├k[Q'òL{┘G°╒q┼ÖÑï·¿ ?Ω▌}╨τP\0>!!æ╖ΦÇàqÜWåτ║┴p╡=╤╣⌡o└
  61611. Φ╛╨,Qu≈╞c╧Æ₧Ç├+pç▓t╠`╓à,¬O≡ùç╜ZƒC┤óä{@Nk!!zvU
  61612. +τ╟$î╙"╙|ÿ«/ßî┤▓πè╟╢ñÿ
  61613. ╙î┤w│d²Ö╠K]Φ^ZRê╢sⁿ╬ñ╞ª¬∩'·█╘W>QMτ{╨≡║ºJ£cæ╬]┴▄╤sσS╥7{⌐╞NèíóKAûε"│'YìZV}+£▀Röìf╞s&èµ╛n┤╞┬9┌ó┼╚æüµnH▀|╞o╘â▌[cD╔╙sàY⌡ετ▌¡├Ö·mÉu≡╙fmè.öw*┌DI≥,;oí-ô»««    ╠~█╞?£µ~·εƒ
  61614. aá·╙Ü3hRR+èüVÉ╨┴óKù½æR¬σKGöi┼(äíÜ├ê
  61615. ·üδ╥╟Æ`2⌡ß²·L╒ É╟╨dÿ╠═?æ`ε;ë]∞nbé`n@*?B>%│%╜M≥ æ░,X├Ω 2ⁿ:*ì⌡Ç£1FmΩñW+Äéα»σ≥|δd0hU╠#&G·,┤▒≥│Y╧Oì░e╠╫╒₧¥^▓w(N┤ek*·t*\ù░6┬r╤Z±⌡:╢*, F3±ëJ╣∙φy╝ú▐Ä╜(&⌐║óG┐üvÄE⌠┬8á╨2UµH╒xF{    f~&Kj┼Dê x24úå.⌠l^1èσ╪V═q⌡Ü=WÑò¿&36{25ô0αZëx∙4£¥úé╥╦τW∙╟Ä6;?Ä⌡~ Sº┬o┤╓*}uW█q~╒B¬²▐≈Mµô}╘╖Qæ└≈πI╩0c!
  61616.  
  61617. ≤A&<"íΓX@°¢ë+ë6√╤»ä²┼┌╘¬≈∞W╖╛Ç~k\S└è?^╫MA9aNAh
  61618. ╢ÇJi%FóhVnΓ╝)ε╓á▓≈î≥╠üqLL
  61619. │╛x&ε╞╬UQ╒òV{íW÷|£∙PKx≤a₧╥PåGpΓBQ╣ ⌐ƒ─í}îÜ█Üo!!º²MñTnç╡sσ╠ZδGo╬^╔≡d°╦q╪GS!
  61620.  
  61621. ≤A &,╢û ╕╗ì8£Rï╜¡ⁿ∞▐╔╘¬≈σ₧╡╙lvZ╞î;ƒPW>.HJx≤î^Jn']ªxNÄç`∩═G┼▌▐è°ÅöqM.t╥╣- ½╬╔J\ç▌T─.▄« °Gn1═m¥╠XÄ[4¿:╥ç╧Γ!
  61622.  
  61623. ≤A*#=Åè+s·óë3┼6τ⌡φ▀√┘╦Å■≈╜PF»»╔t}`W▄Ç2Wà2.C,iVfαä^Mn#¿yJ*Ω¬.■₧K╗≈╢ìΣ└û`[.v█░x7τàÇ_ZÜ╙}½ñxô⌡GJvíMÖ₧RÖ[4ÑQ╣√═∙╪αzåMïôû<½≥RM┤e7┬ε=═╚Z⌡;─ZÜ÷>t⌡╙8═D.┼)░╨ûE`║á ╛⌠¡┤<R░∞│ fpTs3îµI|%9╠╬Ü╡Pb2kM╘à#ÄHL╓▀┼░∙s≤│Æ╚╓~┤φ┌╩wⁿj²aZó┐h═h_¼ç┴ÿï╞┘╗»ï(¥,#┐gτs╓≥·▄Gz\4L.ß8¥Σ$gÿ8ûZ╞!
  61624.  
  61625. ≤A*#=ùÜ0┐░╓jä ⌡╞µ┬∙ù╓╙ƒ≡╢VM½ßÇ~kKS┬É7]ÖwE$jWVyb£Φ\kc+@╡y~¬«`Θ╬Gí▒╛¢≤Å ò9Uw ╒║-&ª╠ÇKMûÜp╝█∙/▓sI Θmî₧[ÖJu║/ôû╩≡╩Ñaìïùè<½σ@AºnJU╢»2╨█╛uîp╘Vτ%d╣┴w╨Ok╥Ñ╘èW4╡»±≥≤k┬¥iZ∙⌠║BnCLKn3¥J≡2<DU╨üQà»y4F ╓Ç;ƒ_╓±▌┤╝u∞┐┴▐Å<°Φ╠▄E6C╕y≡
  61626. `Zµ±}╧b«k⌠∞∙τ├ƒ┴α⌠P┤]╨σ$α⌡Ωƒ@)\E;▒%û≡$và&åb╓SCqƒ
  61627. ΣÆ'µY─º√R?SC>┼╥╘ÖE░ΓN+║·]Üç≥-╖E4@s└█!!g╤mñ∩╩█½⌠£▄óÿ╬Sܪû@Sj═°µ-╧=êptXª■òⁿ≈C¿⌐ä½╒g"╔ôÆ@èFD%éëU╟A¬⌡%à⌐║iτ±.╩1&éÑ┤─sæ╦²T ε#÷ævd≈┤²∙º6c{∞σêφe⌠µ╤▓┬±+╦╡Zε&»█.╤>\√┴¬⌡╘T╙ó√öìñ╧_P]╒q f≤6Åæ⌐.∞╜═¿│r    9è^J ╫╢ço╝{╡╚@nÆ╟⌠.╦·σ6°_┌k4∙▌─â╠LC!
  61628.  
  61629. ≤A*#=ùÜ0¿¼ëp┼>╥└²┼≡╨ƒ▄╕╙º@F▒»Ü;vPU╫ö*[ÿQl+`__n¢δwT#L╢n@c┤«,π₧PÑ╕í¢╖█╫gNmi▄╡h6ε┌╒[üû5íE÷iÿ╝CJ
  61630. =ΦrÜ╠▐/┴jU╧╥╨π╬ïvæMâ÷∙¥σEM¼gJræ┴:╥ƒVßu=┘ZÇV╚dß─}╥Vg╧1Ö▌ì@x╢╝╕Φß
  61631. ╜±]╘è█gmP&h╙J≡<wQ▌Mì╣╡Kd2D ╙çëIÿΣï°╟_ßóé╚è*╝∞╟!!╬ 3ⁿj²aZ▀ ¬H∙╡äè╬╘Mé┼àΓM«R αxí/à⌠φ▌1CpL0■!!û─8gÑ&ÜKàXRjÇAb₧■;≈Peg⌡ƒí:[SYr╨Z╠╫╘Kà╨I(£·P┼╒₧t╩>1^GQ╦÷.öbâíÿ╫»┐ßó┬ä┼w¥Vñê@Dj═°µ-╪?»Ic!
  61632.  
  61633. ≤A*#=ùÜ0╗ÑÖ/▀ατ√▐≈┘╪ò╖⌠äQP║╡╘!!3MN╤ü.F₧PJoUWg
  61634. Σ∞t0$J«sEoΓ┐( ₧Q¡┤╛ÿ■╩^äa\Mxa╓⌐hrí╧ÇM@ÉVüv½JáxéO╛<%dRêx▀┌N╣Pf∞Q╣√╟ßΘ▓a╚W┬█Çy¿▒EAÑioÉ÷╫▌MµS6í5│ß(f▌┬t╟Vk÷>╜╔å4á½⌠°á╗─aN╕φ╖w+?b>₧<Γ%taQ─ùQïÆM5MKö∞EΓIÜ÷æ╛εdß⌠∞º≤▒⌠∞▌EjK71ÄS╬0Gj┴ÆL≤^6åo≈êò║═]₧îà▌C╟"│eµ¿ìæ╢@ON
  61635. Z8½w¿ÜG °]¢Y·
  61636. S>╞ER┐╘▄, pφ¥┴xl6K°>│╕░-oΘΩZÑΩL┼╒ñB╞/=@T═■ 3ò`ÆΘÿ─á»⌠ïªßó6⌡1⌐écW(│ù╒S≡9¿n`XΘ╗╖╟╓+cÄ╢%ÑܱFΣΩΓ:ùE}ò▄ª¥÷₧╡Çi!
  61637.  
  61638. ≤A4/=■╧3'ôºÿ/é:≤╣àÑ╝τ═▄¿≤▒V≥√≥~`AL╫─*ZÆV/m^Z}
  61639. Σ┴
  61640. V&.N╡ykΓ¿!!Ω▀A    ╝«≈ìΓ╞òx[@ho╚ⁿl1¡╞═VLöÜr├)▀|äA≡TN,íeæ≈WêGs⌐|╓₧╞√╔«g¢C▀║¥o½πP¬eJiç∞6╫╔Z⌡g▐Z╔Θ(e░ë8÷JkÇ-┤▀åMb╢╝╕≈≤k┬¥rY▒ßíaGa3£∩#b_╧W┌Å╡Qh.E╬┴&ÿÜΓ╘╣°xñ╡çìÄ6░ú╩▌2C┐}∞wV÷¿)êySσ≤δ·ç╠Æ█╒ΘPα>«"»^»èÆ╢.Nl4L:°$çσ4%ÿ'▀O╤XDZwârnî≈uτ&H┴¡ßV##Y╪₧█═ôφ>≈φL₧Öô^₧#-B╫π-8é╫∩╫Æ ⌐╫¢▀╞è┬QêY⌐èLX#α¢¢ï#úvc
  61641. ⌡┐╝Ä╓+céÖ8▓Ü⌡S╔ôûCΩ~c2ü╛!
  61642.  
  61643. ≤K(9¬ï>,╫├σhñ1≥├Ω▐╛├╫╨■·ñ]G│╛ÇtuB┌ü~@Æ\A#x^A,╢ô^o5[▒eb½╜%┤£/j┼▌▐áσ└
  61644. ╝qG@fa╘╕a7!
  61645.  
  61646. ≤K(=╜ΓX@°êé9Æ:≤ö√─√ù╔╘▓τáL╣√╘svD╫ç;[üZVm}ZeΓÇZcfYónZkáº%║╠M╝£▓ç╣óvwú|W.m▀¿e=¬ë╫X[╒åzúBótô≡]VI?ΣjÜ╠XêGpα@>╞åâ√═╣3è▀û£x¿°R@∞"g∩àZα═PΦU╔F!
  61647.  
  61648. ≥E*w_Qµ«<:¡¼₧jæ7Σö∙═≥┬┌ò▒⌠σGK║√╥~pM_─ü,äM$}ORe ≤┴Xt/NípV*▒¬-┤│(i£┐╛ì╖┬
  61649. ƒ{Z@ya╔ⁿl'║╞═X\£Æy╖▒x₧εP[ <¡$¥╦M▄Ou╡@>╓╥╬∙╚⌐uü¢╒╤e├¢>z▒a!
  61650.  
  61651. ≥E*@u9¬ª<=┐«ë8ΦUêû▄╔Ωù╦▌╗▓╢V@¬⌐╔ojW╤ç;AäI%j^╢ò\&']ñi^o¼┐n║ΩJ    ╗≈┤æ∙█¢gfa╬ⁿ~7¡▄╥P\îVürªWÑ·h²CJI*Σuè█JêGp∞4╓£â∙▄Ñ}üÿ█çt
  61652. ε·R]∞ #}┬√;█ƒJ⌠D=î[╒αmo÷╙8╩Cx┼ó╒äJ}╡º√ εΦΣrU»Θ╛bCFf [ê±W$yJ█▄Å▓Mh8^╙å'ƒIN╓Σ┘╜≥!!σ┤┴╚ê,║±ë╞    ;Kⁿn²gZµ±~╚hU¼É┴ÆÜ╦Mû╞╤ªKτR=╗oΣs╤Φò╡sSzJF]5⌠wü≥.`ÿ"Ü\æZ,(∞    sî÷u╛J$Rß¼√R6?XYw╨<▀▐╩A\└╪1@▐û ¼┤▓╫?xRE╠≈d5ÉbÉ■▄₧Nó┐⌠▓ïƒ─Ä]»ö@Xf═°µz╪+á"<E╗┐╛τ╦+tɃ>ΘσÜ=x╖ⁿ≈/├Fb2║!
  61653.  
  61654. ≥L5;3╔σ[kê¼Ä?î3σö√─√ù▄┌▓■áPW╢┤╬;dAB┌─*ZÆK:zR^j╢ÆCcfI¼nc╢╕`∙╦P¡╣ú▐∙┌Æfh ▀░h?½╟╘J°|·"}½äxù∩E]xΦw▀▀W▄Gl╕.▌ô╧╢╚⌐p£ÉòÆnΓ▒VJª o┬µ ╨ÿKºS*═S╓│"tδçz╫Qg╬:ó╧├P{≤¼²ôèoÑ⌡iR¡ß╗ kAr!!╬φ5cAQ┼W▐ÿ┤Zy)QI¢├Bß7h ╬┬╜≡g!
  61655.  
  61656. ≥M=XR══'⌐╛ë8┼+Θ╤»┬δ┌▌╨¼▓¬U║╖┼vvFB┴─7\╫KL/.IVh
  61657.  ùK(d"╔9£╕%÷╪╜╡┤Æ÷▄,ÆgN`s╙╛d>º▌┘!
  61658.  
  61659. ≥T"<=╖ΓX@°êé9Æ:≤ö√─√ù▄┘┐ß╢L╣√╧yyMU╞─*]╫]Aj{HVoOßëW&%@│eZdÑδ4≥█¡┤▓ùß╩P╫4iYeÜ│{7╝█╔]M╒£VtáPíxéAáuF
  61660. ,Φkæ▀Kà8∞5▌æ╞╢═«j╚Éùƒy ║°XJΓo ;ÉΩ4╫╠K⌡Xo╟Z├₧G·╚v╤V|╒<Ñ┘çv¬εδ√∞½α:║∩╛fRK 1╬≡W>~\╞╩ÿß]d.FO╬ì6╦Hܱ┼╜°!!≡╡┴┘Æ;⌡Γ╩┌;fxj«y√gK≡¿)╚d^■îé¢ùæ
  61661. ÷╝¿î+╩69╣Φ<╦µΩ╞!
  61662.  
  61663. ≥Q%10!!çâ3:⌐─µC╟≤▌∙═Ω╥ƒÿ■╙½@T║⌐Ço{M╤ê?AäK,.Z@x⌡êMo)Aπh\*á«`∩═GΦ▒╕î╖╟ô}P
  61664. │╖h+π▀┴U]ÉVâ|╝P÷t₧AΦYJI*ΣgÜ╫OÖP:∞-)└åâΣ╔│cç¢█çsO║∙Râstüµ2╩╓PΘ?▐P╬≡"m╖à¿+¬VÅεåC_╢╖!
  61665.  
  61666. ≥Q%10!!èÄ?,⌐ìâp┼0±╤²═Ω▐╨█╙ÿ╠s¡▓╓zgMƒ─DûSQ+z^≤┴Vh'K¬|úº5√▄NΣ≈╕Ä≥▌
  61667. ₧{PL.f╒«-7»╩╚GôVçpεQ│~òΩT]N+íwè▄ùGm┐N~╛°«£Ñ╝3à ç¿Üf
  61668. ε°H½bJpç÷▀╥ZºE8ΘM╚V≡/O°╩}éJE┼&±└ε.╗à²τá\⌡┤sY╡µ≥ UGG
  61669. k7ܱYY3J^┌▀╩│\l0JV▀àoèNBàΣ╨¬Φ!!≈╡┴├ò*⌡α┼▄3KⁿmΘ
  61670. fF╔┤pΘc]πD≤δ·â▐P¿▀▀π«Op⌐nφ5à∞²╞3Ho@FD<Θå⌡`êÜ@öI/    ∩i ╫ªu│DH6í⌐ΩN;G>îG₧ß═VÄΣ$▓Φ▀ÿ₧_φ%"U|¿Ö'ÉaÆ╗éÅNêì▐ä∩⌐╥KÖKαè@Aj═°µ┬(φ8;XΦ╗╝╚à-tÉô?│ÜΘxªδ·;Ü]d╝╛ò)óΓ5óª░Q╩ìF»-Z├ñª┘╪Ωòu╟╔'lê▌G`3ŵ╩ï╧DH├8F¬▐â
  61671. |ïÇ╛
  61672. ▄Å⌡{GÑ∙=σ1ú√l¬3o²▌╫ï┤2┤1┤▄₧àñ┼EU┤g2≈P÷╓┴J░█╟í ÿ)D⌠1/O■¿Æk    <úg├üAAåéè]▒çë7═-H╞||»▄╫ⁿW╨xrî╥ì/p'⌐B;nYà!!Σi─╦■^W─╓¼áaºß├¼5ìo&û,└Y^2G≤*Ωº¡l%╣kU▒}E╚á7l»╛¡¿KÄHO2sg_ x¥¥ë╡µgâ9Ç╚¿╠Ü*═ @+T∙úτ╝æ«αc┬∞_ °3'⌡Än<ΓäKw▌ò0╫δD┬║OâÆÿÇ╝C╞E:ⁿ)%1Ü*;Q¼ΘcS`H½µ╡µºOûxhO7√╒Iφ⌡Φñ╧$[h4ú;ÜSEj╘ì∩+6╗,N^╫ÇäΩ+Q╖∩{2αÉÿvÉR╞╕F₧)▒<|ì²▓~╪⌐7┼º{Φ≈At,%z╛Ωç ÑI»▄ù,┐ùD╥÷╜>█ΦΘτ5Nâà│╛µî┌%ô≤èq╥j½√┴ΓLéò0ÅHT┐NC$~näßs!!µZk=ìYu╧┬} [±╧⌡móM⌠_¢╒▒3¡}SQ%aÄσ■Å4α─2J¼|═╦1FÖr$╙÷+Nù'╒_⌐ îß!
  61673.  
  61674. ≥Q%10!!╖ΓX@°êé9Æ:≤ö√─√ù▄┌▓■áPW╢┤╬;|N┴æ<£Z]9.N]o
  61675. Σ┴
  61676. Qcf]ªVc┤«2║ûC@Ü▓░╡≥╓UP╒4m    Σ»h>¿ë╙LJûÆf£FÑmƒ∩XM4Φpå!
  61677.  
  61678. ≥Q%,44▒è%╗║ƒG∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3\^╫─=^ûLWja]jσÄPg2F¼r~¡δ" ₧W¡│≈ÿ°▌\ÿxZ    `g╖╓9½╨ìOIÖûVe»Jñn╨≥[=ívÜ▌\òTq╛N|■ç╨Γî▓v¢Éòù<í▒CLº +hæα0╫▐KεN!!îO╚τ"b÷╦6Ç/⌐R█╡╜vq┤à²τ╓ñßeO!
  61679.  
  61680. ≥Q%,44▒è(╖¼ƒ ï;╫╒π┘√─√┌Σ▓¬CF¡║╘r|F;╕φ|wü^H?oOV+■ä^]'K¬|úº5√▄NΣ≈╕Ä≥▌
  61681. ₧{PL.f╒«-7»╩╚GôVçpεQ│~òΩT]N+î÷═L₧b¡ )╓üÅ╢▄í`¢æ£╙u╜▒YE»eJzîδs▀╤ΦC%╔\╬V≡"sδ┬k╥M`─6┐█├P{≤║≡√ìl┴µe[░≤ª%C[t+╬ ≡W$yJ╧▀₧ßXc8_▀é à^BùΓ╓¡±dΩ«Æìê;ª≤╠
  61682. █ !!≥>æe5ï¡)Ç{Zα¢»Æâ┌Æû╔∩@┤2îjφ&└╔∙╥mX#[/▒:Æ∩d£1¼G┼Ob₧DaÖ·Ω ┴¼ΘXq>Kû▄÷╪P└≈E:▓┐A┤Éå┬AR9IQÿ¡dSsⁿ■≤≤╫∞α¼÷╪Ä╟Y▄Y│┤DD%¡ù¢┘d└⌡╕┐ăb1䃠í╚√Qì≈²&═-^å╦;²M£╥>ûó²╫█N¡>@Ä¿┐≈(▌σòùèO*Σ║A    N├∙┘╙▒EE∙31┼≈Ö|┬╬°E▄δ¥qtú╨&─+:⌠│!!ⁿ:Hφ┴öα╨^¥o■╡úò│╘A╫a▐QταεF∩¿┼╛°A k≡2â╢ïf S»wì╬O{êåδ;┴«Θ5▐X╤|.¬╔╥Ñ₧wq}ª╡±Jpz₧K(p?»FΘd╜á╫mcêΣ╢╢Gè≥┬╛vüt╝H{▒qO R∞"π╢╘mX┐]j╜t
  61683. ìÇ?mπ╛¬╡ZⁿmE!!jQπté╪│ ╖¡P⌐kεáH└▒≥gûe3y╙╤Ö{σê¬δ┼≤
  61684. Qd¢N76∞ì:< ò!!-ÿ╬}£¢D╚╘@ïÇτ∩╞P┴_ ¼h.ƒ6C╞èsEnA░÷τ║⌡sΩ'-3Ñèº╙┘ÿ«[u[µ;╠^w╪█¬%╢E"┤≤ΦÑpδçRdçÆâbÅSâδ╒.í!!;=«φ3╜1▄╡┌íx│úN"NS╘δ½⌐Xε¥Æ╜ûDÅRΘ⌡hÆâöv▌|█ï╫ö─.┘≡N∞ïú8è&σ╖╤è#Ñæ3Å^F2 úH5@2D∞r╟w╥3q█E.O╒îÉ*3╕└╛╟7y╟░▌ú:┤~=B-c▌╢ⁿ Ü∞Φ!!F╗τ╗eLOäT4≈°5╥├w╛h±¼╡qh░ñæ╙'½U60▀KΦ║÷sCá2
  61685. º¿¿µ▄dª4ç3 U}e≡╣o▓ólàz¼ézç]±≥ª#Γ±╟o,∞╕ìnô½säô╒!!┼ⁿ÷Äs╗EqÆr╥╦₧▌╫ò\`⌠╒$Ʋ╖ë╓ π╔i╖ v¬ú¡Ö·H7{=╚    Ç╠ö╩╩≤⌠/┐k╗KIèç)[π∙┴
  61686. Σ÷₧√É&1εP±*fÅj*0∩S┬▐╜┬YπwÜ$²│)x!!9 ░ûⁿ£so≡à8ÉM╥é┤T╖ä²0╡tu$╝╜*q╦)å[+▀╝$╜δ#U.┌f7≥Ä╥▄ⁿ    è├h├*▀▌▌½o╦ªnÿ╩¼(╠µ 7²ºj^╩Ñ┬╤    ±└í─ ╓E√LgsÆ ╥└╥rJ╠}<U#⌡+6g▀√L¡¡mmΩ6┬╢╒π_B┬+▌Φü╫å╝≡¿IaΩç▀Rª¡@0ñ=#èû\}ßδ┴w┼¡ô8C*Æÿ¬|└╠«Ñ4bc╣e`╔G╢îGπ«ç£╫ë6ô╕J2ÿƒ+!
  61687.  
  61688. ≥Q%,44▒è(╖¼ƒèeí█ ╔∞╓╦▄▒ⁿ╚9*²₧╓z]W╞ü~FƒZ'aURo⌡┴Xj3NípV&Γñ0 ╠Cí╕╣╥╖╔ ╫q_f ╒║-&ª╠ÇKMûÜp╝Ñ·hΩPC=íj₧╙\Å 6┴jQ╣√▀╢î╢räÜ╡Æq
  61689. ε°H½bJxÇ┘2╥╩Z╔@"╔▐╓?s╣╩y┌qg┌:±╘¿Am≤▓òöëΦ«=Θ«▀`kmmP&h╙J≡<wQ┌'╠ï¼\y9Q╖δFå[Ñ∙╦╜╝;╣·Æ╚û8⌡Φ╠µ 1R╜d╩xJτƒh═hwΘ╨∞∙τ╔Iù├└╚C∙pα6í╤⌡±╤gJ}ⁿ6ï─$öz÷'╢q(PÆriâⁿ&ú 0H╟»εC89Kr╧Z╫▄┌Häµ9º■JÜ╒ÖH╠l6ELÅΣ!!0╙²Æ█╨8¡╢Σ│σè╞Z▄²─aa Æ╢¡
  61690. ▀/╛"h∞≡┘ú»V}₧ÿl²╒░G¿ ╗;åGy$ò╩9⌡Bïα%òΘ╨>πá*╔Qvüƒª═<╘▐æ3ô╟\φí
  61691. >dº⌡└°£Tüke⌐▐¬#Uë═δYêªògA«╔7¿!!╢╥4\∩)I±╩╗⌡╥IƒX╔£∙à╢°Tâ9NÆUΣò¬.â≥▐íô&\»ZJ3Æ■┬` 
  61692. ├≡¿+kóëπ2└┤á2░u$╝╡╔σº╦tPnδ╛╛j6å[?SK_└Bç └╚■;.╦─ÖúN╛σ■╛bZP─`I╩Dv╝P`5^┌Fô┌≤n=¼mY»}₧½::ª≡∙ΣZ╡0z'NDτEêê╕Tαφ4╧BÇ╚¿╠Ü+▄r6Oªú│P≡▄┬Æ9óƒt≥%.Φë &¼▄    S∙æ3╫δV■å\╬╩»╖¥8kⁿ,O╥ 1ánl_ü├J'7-«ⁿⁿ╖Γ^╢_B'H≤ìº╣╘.£░O!!{Xúm█Ggç┴ó    %ó<A &>╕⌐εΩ+Mâⁿ`6W«ü╬côâßα#╕0;Sü⌡:±p█Ö├¡q╖ÑYIS┤¿≤|ΦE»û─Tî═,┐{≈±|░┬åeδpZ│»╙·║b╧⌡+ú┘╞PσIƒä&ⁿ╪dπ╩┘ew(₧c/jhE!!g╖>▄YDïNU░0?3KΦç░ {≈█ë,¬I5╝¥Ñ╧\!
  61693.  
  61694. ≥Q%,44▒è!!D╨└╬ ï,÷╤²îΩ▀┌ò╜²⌐_F╝»╔t}Y╘─-GòR+bNVxOπÅ\tf[½yxº¿%≤╚GΦ ╢▐┼╩Æmhbu▀»$|∞ñ¬4"ⁿ(Çy¿ÑhÆ≡P\
  61695. ΣwÅ╤WÅKvÑ 5╟ï!
  61696.  
  61697. ≈E+0U╬µp┤║¢/ù⌡▄Ωî·╥┘╘½■▒U╛╖╒~3NY└─*ZÆV/m^Z}
  61698. Σ═^VtfA¬pcñδ.⌡╨GNΩ┌▌≤¥ª"ÆxX@xa╓⌐h║ôÇ╒ò7w╜F╕i╩A╟l!
  61699.  
  61700. ≈E+0bΣÄ(╢╝ëG∩VúτΩ╪╛├╫╨■÷áUB¬╖╘;eIZ╟ü~]æP"kAn ≤ê\tf[¼<Gbºδ2 ┘K╝Ñ«▐⌠└û`WbeÜ╤[≥µ┬SMû═Z5»u╖qà▓"cUïî█UÜb¡ )╓│╫¼îτ4╚èÅ╔<ÿ≡[Qº!
  61701.  
  61702. ≈E+0░╒r"┐░ß@∞}└┌ⁿ█√┼ƒ┴╢≈σAF╕▓╙oaQ─à2GÆW?lTAo°Ç
  61703. \&2@πh[oΓ╣%∙█K¡Ñ≈É÷┬╫vG@zh▀ⁿX╟ò╥\Iææp¥Wñt₧óN?⌠iÜ╨M╨⌐rô╥Ω≡î┤{ìMæÜ₧y ετVH╖eJræ»=╤╦ßN:┬[û{ÖDu±┬véPo╔,┤£éZ╝║▐±⌡¼╤rN╢≥ⁿJ/d_
  61704. j!!üJ±9bJ╚W·ä≥ H.QC╚┴*ôYåΣ╪╖≥!!φ╝┴á≡Wºµ╬▄%R┐∙gΣ░`╠~Ω    î┴Çü╥M█┘╤εGµR"┐j≥<╦⌐║▓p+&8Z8²1╙ß,iä1╛ZàXJGz╞if¼∙&µ1êÖⁿR=<
  61705. l─╠ⁿ╓P Å÷R.φ┐BÜîó!
  61706.  
  61707. ≈E+0░╒r"┐░╠#âπ╟Ω┬Ωìƒ╨ª±áCW╢┤╬SrFR▐ü,?²6 `HDn╢ò\&0N»iV*¼¬- ┌▒≈úû≥Å ÉaS`tûⁿf7╖çÇaôVÿl¥Wñt₧╝X\I6εp▀╪VëLpαmV║ô═σ█Ña╚ù₧╙n
  61708. ╜Σ[PΓo ;ç∙2╥╩^≤H!!╦╬÷mo≡╦y╞KmÇ)░╨ûEv┐½┤╛σ½±pH░∩╝"kBYt|π`è:1hB╚▐╩áZ5Mêñ=ÖU╓⌡╔╗∙q≡│Ä├┌7│ú█ ╚ $ⁿ}  qL±±o┴dW FÿÄü╬╠Gû╙¿î+µ1⌐d∩}çèÆ▓p/u@'⌠wçε=`╤0₧Z▐XWCoôeBÿ²u∩'╠╡╩E#zB2{╧Z┬┐│-Ö≤Yjφó    ╗ó░u·!!DEé■!!sⁿ■≤≤╫∞α¼÷╪Ä╟Y▄Y│┤DD%¡ù¢┘d└ ≥ñ╡ăb1䃠í╚√Qì≈²&├Mq/;å▀∙l£∩yß═╘BïùRª
  61709. ├≤·ü ╚ΣòäòKí║
  61710. sú∞▌╧╧YBM╨?e¡▌¬Y5╤┼╛┴ª╕^mÉ°ⁿ+'·╪fGτJ∞┴╜Σ╧¥&¬∩ò╧╠╖vBKⁿv─ªδ┼K¬ë╔úÑ<[╡RD4û╢¢a{z╝g₧≡W}╜åδ"▌╦°a¥f╨`╙░║╧╬Gc≤╛╩Gq2╨1xS?»Fä Ñ▒Ñ2-═╘╣ºF±á▐╢c2`φ
  61711. "≡UN░EKn╦2Θ╢≈nX╒SLÿy ë⌠~vτ≥σφ8═\y'N!!√aÆÜÖ┤ΓgâΣ╕iÅ╚ÖN▀=$·±╕\▓±┼æn╧ß8▒zc
  61712. ╬║UT¥µ09ö┘jì∩y(▓¥H║àKÅ▀∩,J╞|▒'?û3 ╬Ä<f[bhπ┤π║δíhR{H▄∙z╦è¢*Ç▓K[)gφo▀Wp¥Æπ!!⌠iW=6²Φ■╠5@áΘj)0â║τòAσπ
  61713. ┼'εeΩæV╪u▀ò┼Φ+≥Æ"nO@ö─îåc█Γó*ä¡eòÄ¥▀δëq┌g█ƒ·┼¿_▐Γ{ΩÉ∞l gú┐╓⌡    ┌∙V≤I~Xo─g,jJ@║!!╩^≡f\┤0>/_⌡æç+E±╦┴m╝GP╜│ º;äiL2<╟≥²(ä
  61714. ╘√!
  61715.  
  61716. ≈E+0░╒r?╗ÑÖ/½>∞╤»▄δ├àò┐ⁿèQI║╕╘!!ßü*âWAjxZ_~
  61717. ╢êr.JπnViºó6 ╠íú┐▐π╟^╦f[ja╪░h║█╔WO╦V¥x½÷kæΘTa5Σ(▀╩V±(╕9ô╬∞⌠╞Ñp£S╙█Ær ¼√RG╢.HΦéY╖├⌡D<┘S╬V≥>r÷─8└[z┼,±╒ìB{≤╜±ΣσF┤Ö
  61718. 5±÷│`hTcrç═<1N^═Mì*ï»vo6FO╬┴&ÿt Ü═ÿ╒ûì│ç∙ê+░╣ë2▄;R╣q≤ql≈│_┴aNΘ\▐ùÆé╩M╡╫╚π²╕xΣ=╤╜╕Σ')qG≤=û⌠9X▀Y⌡'▐ RM`╞:=═Φ0∩ eJ╔«·R(EQ╘█╤═Füφs(╜·Jï█≥-╖.!!DEé¬yC<éÿ°ÿ─á»⌠°ªßóLòBÑ─ dóï¢╪j»{r╚╖¬╦ïR■ê)┤¥ⁿ@Q■ñ╗çVQ'½┌εAï°wêó╗UƒùS╬RviΩ└╡─.Γ⌡äùï_─¼U$7»°▐ïö
  61719. aE╪;&┼ú╞X|ª¬ù#⌡ÅÉytú╨&╞/9┐ä4^δ7Q²Ω╗∞╪6╖\╩£∙ôñ╬TJ▄`T╬1îæ⌐.εî°╜│r    èHI%╫»çqfxz╟ ≡═R2nè▌º5┴·σ(░u$╝║█≈º▀+>|∩íß]πp(xYG╔;¡8⌠ß▓ τ⌠Éæwê├⌡î\gε
  61720. "⌡CN╗@KnΣFô┌≤?║Pµ%_¢½2fª⌡⌡±3╓\e]#M!!₧┘ï┤Ñúcâ πñcü¿≥?·97K╨µ│╝ò⌐╠B▐≤G_2°)% ╝à{~ö╘    ▓╨\░╪SR╥ÄK│┘3α∞╞~X═0x√->«]iov╚à,f[dhπ┤╬îεd≈bo╟≥*▌┘▄0ÿ«y<| úi▀Gn╔╝!
  61721.  
  61722. ≈E+0╢Ç?╕úë)æeí┬ε└δ╥ƒ╕╘¢τcQ╢¡┴ovÆ░6[äM9.URx∩═^[s2┤yn¡Ñgε₧Uªú≈è°Åô}X.t╥╣-0»┌┼KÖÇp╜ór╨ΘA_*⌡    ⌡╖X▄A{ó9┴ü╩∙┬αu¥£ÅÜsα┐╧
  61723. gδ¼'╤█Pº╚[Üτ%dδçj╟Eg╙+ú┼├Pmú½δ╝«k┬¥v]╡⌡╖J vh\&;ê>±5+k≈%Φ6╡ÅvCä┴l░g?╪¥╗╤┤wσ╢ö╚┌7ª╚└╦*1QR*▓h∙qM½±`╞YI∙─┴¿░φm╝Θß╤m╞6p≈5í{ß╨╫φ>o]    D #û≡(w╦tëO╙D ^╚
  61724. Σ│#Γ0Yê½ⁿ|84N6xîZφ╞╦Mç¬#▒╦[èÉ┼σ
  61725. ug.±╩dNc╤zû≈═╫3Γ╫¢▀⌡╣εxúzë¬ddα▀╤S▌+íwcX·¡Æ╫╤:Pàê-╛! !
  61726.  
  61727. SystemDictionary comment:
  61728. 'Class of the root of the system. SystemDictionary''s single instance (Smalltalk) 
  61729. provides associative access to all global objects in the system.'!
  61730. !SystemDictionary class methodsFor!
  61731.  
  61732. publishedEventsOfInstances
  61733.     "Answer a <Set> of <Symbol>s, being the names all the events published
  61734.         by instances of the receiver."
  61735.  
  61736.     "Note that there are currently no #globalAdded: and #protocolAdded: events"
  61737.  
  61738.     ^(super publishedEventsOfInstances)
  61739.         add: #methodAdded:;
  61740.         add: #methodUpdated:;
  61741.         add: #methodRemoved:;
  61742.         add: #methodCategorized:;
  61743.         add: #classAdded:;
  61744.         add: #classUpdated:;
  61745.         add: #classRemoved:;
  61746.         add: #classCategorized:;
  61747.         add: #globalRenamed:from:;
  61748.         add: #globalRemoved:;
  61749.         add: #protocolUpdated:;
  61750.         add: #protocolRemoved:;
  61751.         yourself! !
  61752.  
  61753. !SystemDictionary methodsFor!
  61754.  
  61755. add: anAssociation
  61756.     "Add anAssociation to the receiver. Answer anAssociation.
  61757.     Although very similar to at:put:, we store the actual association passed
  61758.     as an argument here in order to maintain its references.
  61759.     The keys of associations stored in pool dictionaries must be strings."
  61760.  
  61761.     ((anAssociation key isKindOf: Symbol) and: [anAssociation key notEmpty])
  61762.         ifFalse: [self error: 'SystemDictionaries are keyed with non-empty Symbols'].
  61763.     ^super add: anAssociation!
  61764.  
  61765. allBehaviors
  61766.     "Private - Answer a <sequencedReadableCollection> of all of the Behaviors 
  61767.     contained in the system in breadth first order, with instance classes preceeding
  61768.     metaclasses."
  61769.  
  61770.     | answer |
  61771.     answer := OrderedCollection new: 2000.
  61772.     self allBehaviorsDo: [:behavior | answer addLast: behavior].
  61773.     ^answer!
  61774.  
  61775. allBehaviorsDo: operation
  61776.     "Private - Evaluate the monadic valuable, operation, for each of the Behaviors in the system.
  61777.     N.B. No guarantee is made about ordering, except that the operation is evaluated
  61778.     for a subclass after its superclass."
  61779.  
  61780.     self allClasses do: [ :class |
  61781.         operation value: class.
  61782.         operation value: class class]!
  61783.  
  61784. allClasses
  61785.     "Answer a <sequencedReadableCollection> of all of the classes in the system, in breadth-first order.
  61786.     There is no particular ordering at a particular depth."
  61787.  
  61788.     allClasses isNil ifTrue: [allClasses := Class allClasses].
  61789.     ^allClasses!
  61790.  
  61791. allClassesDo: operation
  61792.     "Private - Evaluate the monadic valuable, operation, for each of the classes in the system.
  61793.     N.B. No guarantee is made about ordering, except that the block is evaluated
  61794.     for a subclass after its superclass."
  61795.  
  61796.     self allClasses do: operation!
  61797.  
  61798. allRoots
  61799.     "Answer a <sequencedReadableCollection> of all global root classes - ie. those that are subclasses of nil."
  61800.  
  61801.     allRoots isNil ifTrue: [allRoots := Class allRoots].
  61802.     ^allRoots!
  61803.  
  61804. associationAt: key ifAbsent: exceptionHandler
  61805.     "Answer the association named by the argument, key. If key is not found,
  61806.     answer the result of evaluating the niladic valuable, exceptionHandler."
  61807.  
  61808.     ^super associationAt: key asSymbol ifAbsent: exceptionHandler!
  61809.  
  61810. at: key ifAbsent: exceptionHandler
  61811.     "Answer the value named by the argument, key.  If key is not found,
  61812.     answer the result of evaluating the niladic valuable, exceptionHandler.
  61813.     The keys of pools are Strings."
  61814.  
  61815.     ^super at: key asSymbol ifAbsent: exceptionHandler!
  61816.  
  61817. at: key put: anObject
  61818.     "Store the argument anObject with the external key, aKey,
  61819.     in the receiver. Answer anObject. Ensure the key is a String."
  61820.  
  61821.     key isEmpty ifTrue: [self error: 'Invalid global name'].
  61822.     ^super at: key asSymbol put: anObject!
  61823.  
  61824. bindingFor: aString 
  61825.     "Answer the association whose key is equal to the argument in
  61826.     the receiver, or nil if the key is not present. Used by the Compiler."
  61827.  
  61828.     ^super bindingFor: aString asSymbol!
  61829.  
  61830. classAdded: class
  61831.     "Private - The new <Class>, class, has been added to the receiver.
  61832.     Clear down the all class cache and inform observers."
  61833.  
  61834.     self clearCachedClasses.
  61835.     ^self trigger: #classAdded: with: class.
  61836. !
  61837.  
  61838. classRemoved: aClass
  61839.     "Private - The <Class> argument has been removed from the system.
  61840.     Clear down the class caches and inform observers."
  61841.  
  61842.     self clearCachedClasses.
  61843.     self trigger: #classRemoved: with: aClass!
  61844.  
  61845. classUpdated: aClass
  61846.     "Private - The <Class>, aClass, has been updated. 
  61847.     Clear down the class caches and inform observers."
  61848.  
  61849.     self clearCachedClasses.
  61850.     ^self trigger: #classUpdated: with: aClass!
  61851.  
  61852. clearCachedClasses
  61853.     "Private - Clear down the all class cache."
  61854.  
  61855.     allRoots := allClasses := nil!
  61856.  
  61857. developmentSystem
  61858.     "Answer the current instance of <SmalltalkSystem> if installed, otherwise 
  61859.     a <DeafObject>."
  61860.  
  61861.     | devSys |
  61862.     devSys := self at: #SmalltalkSystem ifPresent: [:c | c current].
  61863.     ^devSys isNil
  61864.         ifTrue: [DeafObject current]
  61865.         ifFalse: [devSys]!
  61866.  
  61867. getEvents
  61868.     "Private - Answer the EventsCollection belonging to the receiver, or nil if the receiver
  61869.     has no events registered for it"
  61870.  
  61871.     ^events!
  61872.  
  61873. includesKey: key
  61874.     "Answer whether the receiver has a key equal to the argument, key.
  61875.     Override superclass to permit symbolic/string keys."
  61876.  
  61877.     ^super includesKey: key asSymbol!
  61878.  
  61879. postResize: oldMe
  61880.     "Private - This message is sent by the receiver when resizing, after the
  61881.     receiver's elements have been added to a new collection and the
  61882.     receiver has become that collection. It is a chance for the receiver
  61883.     to perform any final state changes needed."
  61884.  
  61885.     self setEvents: oldMe getEvents!
  61886.  
  61887. removeClass: aClass
  61888.     "Private - Remove aClass from the receiver. Report an error if there are any subclasses or
  61889.     instances of the receiver, or if the class is a standard system class."
  61890.  
  61891.     self removeKey: aClass name asSymbol ifAbsent: [].
  61892.     aClass removeFromSuper.
  61893.     "At this point it would be a good idea to make the class become:
  61894.     a special error reporting class"
  61895.     self classRemoved: aClass!
  61896.  
  61897. removeGlobalNamed: aSymbol
  61898.     "Remove the global identified by the <Symbol> argument 
  61899.     from this system dictionary."
  61900.  
  61901.     ^self removeKey: aSymbol!
  61902.  
  61903. removeKey: key ifAbsent: exceptionHandler
  61904.     "Remove the key (and its associated value), from the receiver. If key is
  61905.     not in the receiver, answer the result of evaluating the niladic valuable,
  61906.     exceptionHandler. Otherwise, answer the value named by key.
  61907.     Implementation Note:      Override in order to accept Symbols/Strings,
  61908.     and to trigger an event so that observers know that the global has been
  61909.     removed. Also #unitialize it if it directly implements #uninitialize and
  61910.     is not a class (or alias for a class)."
  61911.  
  61912.     | index element globalName |
  61913.     globalName := key asSymbol.
  61914.     index := self findKeyOrNil: globalName.
  61915.     ^(element := self basicAt: index) isNil 
  61916.         ifTrue: [exceptionHandler value]
  61917.         ifFalse: 
  61918.             [| global isClass |
  61919.             self removeIndex: index.
  61920.             global := element value.
  61921.             isClass := global class isMeta.
  61922.             (isClass not or: [global name ~~ globalName]) 
  61923.                 ifTrue: 
  61924.                     [self trigger: #globalRemoved: with: element.
  61925.                     "Uninitialize any global which is not a class name alias"
  61926.                     (isClass not and: [global respondsTo: #uninitialize]) ifTrue: [global uninitialize]].
  61927.             global]!
  61928.  
  61929. renameGlobal: oldName to: newName
  61930.     "Rename the global, informing the system of the change."
  61931.  
  61932.     | oldSymbol binding |
  61933.     oldSymbol := oldName asSymbol.
  61934.     self noEventsDo: [binding := self changeKey: oldSymbol to: newName asSymbol].
  61935.     self triggerGlobalRenamed: binding from: oldSymbol!
  61936.  
  61937. setEvents: anEventsCollectionOrNil
  61938.     "Private - Set the EventsCollection of the receiver to be anEventsCollectionOrNil.
  61939.     Answer the receiver."
  61940.  
  61941.     events := anEventsCollectionOrNil!
  61942.  
  61943. triggerGlobalRenamed: anAssociation from: oldSymbol
  61944.     "Private - Inform observers that a  system global object has been renamed."
  61945.  
  61946.     self 
  61947.         trigger: #globalRenamed:from:
  61948.         with: anAssociation
  61949.         with: oldSymbol! !
  61950.  
  61951. IdentityDictionary comment:
  61952. 'IdentityDictionaries are <LookupTable>s which use identity (#== and #identityHash) for key comparison.
  61953.  
  61954. IdentityDictionary conforms to the following ANSI protocols:
  61955.     Object
  61956.     collection
  61957.     abstractDictionary
  61958.     IdentityDictionary'!
  61959. !IdentityDictionary methodsFor!
  61960.  
  61961. findKeyOrNil: anObject
  61962.     "Private - Answer the index of the given key in the receiver, or, if not found,
  61963.     the index of the first empty slot including and after that to which 
  61964.     the key hashes."
  61965.  
  61966.     | capacity index key |
  61967.     capacity := self basicSize.
  61968.     index := self hash: anObject max: capacity.
  61969.     [(key := self basicAt: index) isNil or: [key == anObject]] 
  61970.         whileFalse: [index := index \\ capacity + 1].
  61971.     ^index!
  61972.  
  61973. hash: anObject max: anInteger
  61974.     ^anInteger < 8192 
  61975.         ifTrue: [anObject identityHash \\ anInteger + 1]
  61976.         ifFalse: [anObject identityHash * (anInteger bitShift: -12) \\ anInteger + 1]!
  61977.  
  61978. keysClass
  61979.     "Answer the class of <collection> to be used for collecting the keys of the receiver"
  61980.     
  61981.     ^IdentitySet!
  61982.  
  61983. searchPolicy
  61984.     "Answer the receiver's <searchPolicy>."
  61985.  
  61986.     ^SearchPolicy identity! !
  61987.  
  61988. PluggableLookupTable comment:
  61989. 'PluggableLookupTable is the class of <LookupTable>s which support a pluggable <searchPolicy>, and which can thus be configured to behave in the same way as either standard <LookupTable>s (equality search) or <IdentityDictionary>s (identity search), or indeed any user-defined search policy.
  61990.  
  61991. Instance Variables:
  61992.     searchPolicy        <searchPolicy>. The policy used to hash and compare elements of the receiver.
  61993.  
  61994. '!
  61995. !PluggableLookupTable class methodsFor!
  61996.  
  61997. defaultSearchPolicy
  61998.     "Answer the default <searchPolicy> used by instances of the receiver."
  61999.  
  62000.     ^SearchPolicy equality!
  62001.  
  62002. new: anInteger searchPolicy: aSearchPolicy
  62003.     "Answer a new instance of the receiver with an initial capacity of at least 
  62004.     <integer> count elements (i.e. the size is a hint), and with the specified <searchPolicy>."
  62005.  
  62006.     ^(self new: anInteger) setSearchPolicy: aSearchPolicy!
  62007.  
  62008. searchPolicy: policy
  62009.     "Answer a new, empty, instance of the receiver with the specified <searchPolicy>."
  62010.  
  62011.     ^self new setSearchPolicy: policy! !
  62012.  
  62013. !PluggableLookupTable methodsFor!
  62014.  
  62015. copyEmpty: anInteger
  62016.     "Private - Answer an empty copy of the receiver, with enough space for anInteger
  62017.     number of elements. 
  62018.     Implementation Note: We must override in order to preserve the searchPolicy."
  62019.  
  62020.     ^(super copyEmpty: anInteger) setSearchPolicy: self searchPolicy!
  62021.  
  62022. findKeyOrNil: anObject
  62023.     "Private - Answer the <integer> index of the given key in the receiver, or, if not found,
  62024.     the index of the first empty slot including and after that to which 
  62025.     the key hashes. A pluggable <searchPolicy> is used for key comparisons and hashing."
  62026.  
  62027.     | capacity index key |
  62028.     capacity := self basicSize.
  62029.     index := self searchPolicy hash: anObject max: capacity.
  62030.     [(key := self basicAt: index) isNil or: [self searchPolicy compare: key with: anObject]] 
  62031.         whileFalse: [index := index \\ capacity + 1].
  62032.     ^index!
  62033.  
  62034. hash: anObject max: anInteger
  62035.     ^self searchPolicy hash: anObject max: anInteger!
  62036.  
  62037. initialize
  62038.     "Private - Instance variable initialization. The tally records the number of elements."
  62039.  
  62040.     super initialize.
  62041.     self setSearchPolicy: self class defaultSearchPolicy
  62042. !
  62043.  
  62044. newSelection
  62045.     "Private - Answer a new empty collection like the receiver to 
  62046.     contain a selection of the receiver's elements."
  62047.  
  62048.     ^self class searchPolicy: self searchPolicy!
  62049.  
  62050. preResize: newMe
  62051.     "This message is sent by the receiver when resizing, before the
  62052.     receiver's elements are added to newMe. We must assign across the
  62053.     search policy."
  62054.  
  62055.     newMe setSearchPolicy: self searchPolicy!
  62056.  
  62057. searchPolicy
  62058.     "Answer the receiver's <searchPolicy>."
  62059.  
  62060.     ^searchPolicy!
  62061.  
  62062. searchPolicy: aSearchPolicy
  62063.     "Set the receiver's <searchPolicy>."
  62064.  
  62065.     self setSearchPolicy: aSearchPolicy.
  62066.     self isEmpty ifFalse: [self rehash]!
  62067.  
  62068. setSearchPolicy: policy
  62069.     "Private - Set the receiver's <searchPolicy>. Answer the receiver."
  62070.  
  62071.     searchPolicy := policy.
  62072.     ^self!
  62073.  
  62074. species
  62075.     "Answer the class of object to be used when copying the receiver with #collect:, etc."
  62076.  
  62077.     ^LookupTable
  62078. ! !
  62079.  
  62080. PoolConstantsDictionary comment:
  62081. ''!
  62082. !PoolConstantsDictionary class methodsFor!
  62083.  
  62084. named: aSymbol 
  62085.     ^(self new)
  62086.         name: aSymbol;
  62087.         yourself! !
  62088.  
  62089. !PoolConstantsDictionary methodsFor!
  62090.  
  62091. aspectDisplayOn: aStream
  62092.     "Private - Append a single-line textual representatin of the receiver to the <puttableStream>
  62093.       argument in a form that a user viewing the receiver as the value of a published aspect would 
  62094.       like to see it. Typically we use #displayOn: but some classes of object can use alternate display 
  62095.       formats. In this case we override back to the Object implementation.
  62096.       N.B. This is a development time only method that supports the PublishedAspectInspector."
  62097.   
  62098.       self displayOn: aStream!
  62099.  
  62100. at: key ifAbsent: exceptionHandler
  62101.     "Answer the value named by the argument, key.  If key is not found,
  62102.     answer the result of evaluating the niladic valuable, exceptionHandler.
  62103.     The keys of pools are Strings."
  62104.  
  62105.     ^super at: key asString ifAbsent: exceptionHandler!
  62106.  
  62107. at: key put: anObject
  62108.     "Store the argument anObject with the external key, aKey,
  62109.     in the receiver. Answer anObject. Ensure the key is a String.
  62110.     If the key already exists in the receiver, raise an exception
  62111.     because the receiver is supposed to contain constants."
  62112.  
  62113.     | value keyString |
  62114.     keyString := key asString.
  62115.  
  62116.     value := self at: keyString ifAbsent: [
  62117.         self isChanged: true.
  62118.         ^super at: keyString put: anObject].
  62119.  
  62120.     ^value = anObject
  62121.         ifTrue: [anObject    "No attempt was made to change the value"]
  62122.         ifFalse: [self errorModify: keyString value: anObject]!
  62123.  
  62124. browse
  62125.         "Open a browser on the receiver"
  62126.     
  62127.         Smalltalk developmentSystem browsePoolConstantsDictionary: self!
  62128.  
  62129. canFileOut
  62130.     "Answer true if the receiver can be filed out. At this stage we just check to ensure that
  62131.     the file out file is writeable"
  62132.  
  62133.     ^File isWriteable: self  fileOutName!
  62134.  
  62135. displayOn: aStream
  62136.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  62137.     would want to see it."
  62138.  
  62139.     self name displayOn: aStream
  62140. !
  62141.  
  62142. environment
  62143.     "Answer the receiver's controlling name space."
  62144.  
  62145.     ^Smalltalk
  62146. !
  62147.  
  62148. errorModify: key value: value
  62149.     "Private - An attempt was made to modify the value of the constant named, key."
  62150.  
  62151.     MessageBox
  62152.         confirm: ('Would you like to recompile references to ''%1''%nto reflect the new value %2 (currently %3)'
  62153.                     formatWith: key with: value displayString with: (self at: key) displayString)
  62154.         onYes: [
  62155.             super at: key put: value.
  62156.             self recompileReferencesTo: key.
  62157.             self isChanged: true ]
  62158.         onNo: [super at: key put: value]
  62159.         onCancel: ["Ignore the modification request"]!
  62160.  
  62161. fileOut
  62162.     "File out the receiver to <name>.st"
  62163.  
  62164.     self class sourceManager fileOut: self.
  62165.     self isChanged: false!
  62166.  
  62167. fileOutName
  62168.     "Answer the receiver's default file name for file outs (<name>.st)."
  62169.  
  62170.     | path package |
  62171.     path := File composeStem: self name extension: Package sourceGlobalExtension.
  62172.     package := Package manager packageOfGlobalNamed: self name asSymbol.
  62173.     package notNil ifTrue: [
  62174.         path := File replacePath:  path with: package path ].
  62175.     ^path!
  62176.  
  62177. fileOutOn: aSourceFiler
  62178.     aSourceFiler fileOutPoolDictionary: self!
  62179.  
  62180. includesKey: key
  62181.     "Answer whether the receiver has a key equal to the argument, key.
  62182.     Override superclass to permit symbolic/string keys."
  62183.  
  62184.     ^super includesKey: key asString!
  62185.  
  62186. isChanged
  62187.     "Answer true if the receiver or any of it's contents have been changed since
  62188.     their changed flag was last reset."
  62189.  
  62190.     ^self propertyAt: #isChanged ifAbsent: [false]!
  62191.  
  62192. isChanged: aBoolean
  62193.     "Flag the receiver as changed or not changed, according to the value 
  62194.     of the <Boolean> argument. If the receiver is marked as changed, then
  62195.     its owning package (if any) is also so marked."
  62196.  
  62197.     "Note that we don't test the existing value of the change flag here, because
  62198.      we want to inform the package regardless (in case it isn't currently changed
  62199.      for some reason)"
  62200.     aBoolean 
  62201.         ifTrue: [ | package |
  62202.             self propertyAt: #isChanged put: true.
  62203.             (package := self owningPackage) notNil ifTrue: [
  62204.                 package isChanged: true]]
  62205.         ifFalse: [self removePropertyAt: #isChanged ifAbsent: []]!
  62206.  
  62207. name
  62208.     "Answer the receiver's name."
  62209.  
  62210.     ^name ifNil: [self environment keyAtValue: self ifAbsent: ['Anon']]!
  62211.  
  62212. name: aSymbol 
  62213.     name := aSymbol asSymbol!
  62214.  
  62215. owningPackage
  62216.     "Answers the package that owns the receiver or nil if it is not yet owned
  62217.     by any package"
  62218.  
  62219.     ^Package manager packageOfGlobalNamed: self name!
  62220.  
  62221. owningPackage: aPackage
  62222.     "Set the receiver's <Package> to be the argument. Any current package association is lost."
  62223.  
  62224.     aPackage addGlobalNamed: self name!
  62225.  
  62226. preResize: newMe 
  62227.     "Private - This message is sent by the receiver when resizing, before the
  62228.     receiver's elements are added to newMe. We must assign across the
  62229.     search policy."
  62230.  
  62231.     name isNil ifFalse: [newMe name: name]!
  62232.  
  62233. recompileReferencesTo: keyString
  62234.     "Private - Recompile any methods which references the named key, assumed to
  62235.     be a variable name from the receiver."
  62236.  
  62237.     Notification signal: ('Recompiling references to ''%1'' in %2' 
  62238.                             formatWith: keyString with: self name).
  62239.     (self environment allClasses select: [:c | c allSharedPools includes: self]) do: [:c |
  62240.         self
  62241.             recompileReferencesTo: keyString in: c;
  62242.             recompileReferencesTo: keyString in: c class]!
  62243.  
  62244. recompileReferencesTo: keyString in: aBehavior
  62245.     "Private - Recompile any methods which references the named key, assumed to
  62246.     be a variable name from the receiver, in the specified Behavior's method dictionary."
  62247.  
  62248.     aBehavior methodDictionary do: [:m | 
  62249.         (m containsSource: keyString) ifTrue: [
  62250.             Notification signal: 'Recompiling ', m printString.
  62251.             m recompile]]
  62252. !
  62253.  
  62254. removeKey: key ifAbsent: exceptionHandler
  62255.     "Remove the key (and its associated value), from the receiver. If key is
  62256.     not in the receiver, answer the result of evaluating the niladic valuable,
  62257.     exceptionHandler. Otherwise, answer the value named by key.
  62258.     Override in order to accept Symbols/Strings."
  62259.  
  62260.     ^super removeKey: key asString ifAbsent: exceptionHandler! !
  62261.  
  62262. SharedLookupTable comment:
  62263. 'SharedLookupTable is the class of <LookupTable>s which permits only a single process to access its contents at any one time (it uses a <Mutex> object for this purpose). 
  62264.  
  62265. Instance Variables:
  62266.     mutex            <Mutex>. Protection lock to guard contents.
  62267.  
  62268. Class Variables:
  62269.     AbsentCookie        <Object>. Used to identity evaluation of exception handling block.
  62270.  
  62271. Certain methods are not overridden for the following reasons:
  62272.  
  62273.     add:            Immediate superclass implementation use #at:put:
  62274.     associationAt:        Implemented in terms of #assocationAt:ifAbsent:
  62275.     associationAt:ifAbsent:    Implemented in terms of #at:ifAbsent:
  62276.     associations        Implemented in terms of associationsDo:
  62277.     associationsDo:        Implemented in terms of keysAndValuesDo:
  62278.     at:            Implemented in terms of #at:ifAbsent:
  62279.     at:ifAbsent:        Overridden
  62280.     at:ifAbsentPut:        Overridden
  62281.     at:put:            ditto
  62282.     basicValues        atomic
  62283.     capacity            atomic
  62284.     collect:            Implemented in terms of #do:, result will be a LookupTable
  62285.     copyElementsInto:        private, uses only within critical sections
  62286.     copyEmpty        Implemented in terms of #copyEmpty:
  62287.     copyEmpty:        Private, used only within critical sections
  62288.     countElements        Implemented in terms of #do:
  62289.     detect:            Implemented in terms of #detect:ifNone:
  62290.     detect:ifNone:        Implemented in terms of #do:
  62291.     do:            Overridden, public entry point. Revokes weak status for duration of enumeration.
  62292.     emptyCheck        implemented in terms of #isEmpty
  62293.     errorNotFound, errorNotKeyed     Don''t access shared data apart from print (uses do:)
  62294.     findElementOrNil:        private, used only within methods protected by mutex (e.g. add:)
  62295.     findKeyOrNil:        ditto
  62296.     fixCollisionsFrom:         ditto
  62297.     grow            ditto (sent only from Set>>privateAt:put:)
  62298.     growSize            Private, used only within critical section (not used for Set''s?)
  62299.     identityIncludes:        Overridden
  62300.     includes:            Implemented in terms of #do:
  62301.     includesAssociation:        Overridden
  62302.     includesKey:        Overridden
  62303.     initialize            Overridden, but to instantiate the mutex, not for mutual exclusion
  62304.     inject:into:            Implemented in terms of do:
  62305.     inspect            Debug only
  62306.     intersection:        Implemented in terms of select:
  62307.     isEmpty            uses #size == 0, which is atomic
  62308.     keyAtEqualValue:ifAbsent:    Overridden
  62309.     keyAtValue:        Implemented in terms of keyAtValue:ifAbsent:
  62310.     keyAtValue:ifAbsent:        Overridden
  62311.     keysAndValuesDo:        Overridden. Revokes weak status for duration of enumeration.
  62312.     keysClass            Answers constant
  62313.     keys            Implemented in terms of #do:
  62314.     keysDo:            Implemented in terms of #keysAndValuesDo:
  62315.     lookupKey:        For private use of compiler
  62316.     maxPrint            Atomic
  62317.     moveFrom:to:        Private, used only within critical sections
  62318.     occurrencesOf:        Implemented in terms of #do
  62319.     printOn:            Overridden
  62320.     postResize:        private, used only within methods protected by mutex
  62321.     preResize:            ditto, but must override to maintain mutex
  62322.     privateAt:put:        private, used only within critical sections
  62323.     rehash            uses #resize:, and otherwise accesses no shared data
  62324.     reject:            Implemented in terms of #select:
  62325.     relocateElement:from:    private, used only within methods protected by mutex
  62326.     remove:            Not valid for dictionaries
  62327.     remove:ifAbsent:        ditto
  62328.     removeAssociation:        Implemented in terms of removeKey:
  62329.     removeIndex:        private, used only within methods protected by mutex
  62330.     removeKey:        Implemented in terms of removeKey:ifAbsent:
  62331.     removeKey:ifAbsent:        Overridden
  62332.     resize:            Overridden, public entry point
  62333.     shrink            Overridden, public entry point
  62334.     select:            Implemented in terms of keysAndValuesDo:
  62335.     size            atomic
  62336.     storeOn:            Overridden
  62337.     tally            atomic
  62338.     uncheckedAdd:        Not used by dictionaries.
  62339.     uncheckedAt:put:        Private, used only within critical sections
  62340.     values            Implemented in terms of #do:
  62341.     valuesClass    `    Answers constant'!
  62342. !SharedLookupTable class methodsFor!
  62343.  
  62344. initialize
  62345.     "Private - Initialize the receiver's class variable."
  62346.  
  62347.     AbsentCookie := Object new! !
  62348.  
  62349. !SharedLookupTable methodsFor!
  62350.  
  62351. asArray
  62352.     "Answer an Array whose elements are those of the receiver (ordering is possibly arbitrary).
  62353.     Must implement as critical section as otherwise Array size might be wrong."
  62354.  
  62355.     ^mutex critical: [super asArray]!
  62356.  
  62357. asByteArray
  62358.     "Answer a ByteArray whose elements are those of the receiver (ordering is possibly arbitrary).
  62359.     Must implement as critical section as otherwise the ByteArray size might be wrong."
  62360.  
  62361.     ^mutex critical: [super asByteArray]!
  62362.  
  62363. at: key ifAbsent: exceptionHandler
  62364.     "Answer the value named by the argument, key.  If key is not found,
  62365.     answer the result of evaluating the niladic valuable, exceptionHandler.
  62366.     Implementation Note: We avoid evaluating the exceptionHandler valuable
  62367.     inside the mutex to minimize the chances of throwing an exception
  62368.     with the mutex locked (#critical:'s ensure block would handle the case
  62369.     where the exceptionHandler performs a far return), HOWEVER this does
  62370.     mean it is not entirely safe to add a new item in the ifAbsent handler
  62371.     (#at:ifAbsentPut: should be used in this case)."
  62372.  
  62373.     | answer |
  62374.     answer := mutex critical: [super at: key ifAbsent: [AbsentCookie]].
  62375.     ^answer == AbsentCookie
  62376.         ifTrue: [exceptionHandler value]
  62377.         ifFalse: [answer]!
  62378.  
  62379. at: key ifAbsentPut: exceptionHandler
  62380.     "Answer the value named by the argument, key.  If key is not found,
  62381.     then add and answer the result of evaluating the niladic valuable,
  62382.     exceptionHandler.
  62383.     Implementation Note: If exceptionHandler is a block, it should not include 
  62384.     an explicit return (if it does then no value will be inserted, and the 
  62385.     Mutex could be left locked until the process is unwound).
  62386.     Note also that in this case we evaluate the exception handler within
  62387.     the mutex so that the particular key remain absent!!"
  62388.  
  62389.     ^mutex critical: [super at: key ifAbsentPut: exceptionHandler]!
  62390.  
  62391. at: key put: newElement
  62392.     "Store the argument, newElement, with the external key, key,
  62393.     in the receiver. Answer newElement."
  62394.  
  62395.     key isNil ifTrue: [^self error: 'key cannot be nil'].
  62396.     ^mutex critical: [super at: key put: newElement]!
  62397.  
  62398. changeKey: key to: newKey
  62399.     "Private - Change the key of the element of the receiver with key, key, to
  62400.     newKey (e.g. rename a variable). Answer the value of the element
  62401.     whose key was changed"
  62402.  
  62403.     ^mutex critical: [super changeKey: key to: newKey]!
  62404.  
  62405. do: operation
  62406.     "Evaluate monadic value argument, operation, for each of the elements (values) of the 
  62407.     receiver. Answers the receiver.
  62408.     If aBlock contains an explicit return, then the mutex will be unlocked by the #ensure:
  62409.     block in #critical:."
  62410.  
  62411.     mutex critical: [super do: operation]
  62412. !
  62413.  
  62414. identityIncludes: comperand
  62415.     "Answer whether the <Object> argument, comperand, is one of the receiver's elements."
  62416.  
  62417.     ^mutex critical: [super identityIncludes: comperand]!
  62418.  
  62419. includesAssociation: anAssociation
  62420.     "Answer whether the receiver contains the key/value pair in anAssociation"
  62421.  
  62422.     ^mutex critical: [super includesAssociation: anAssociation]!
  62423.  
  62424. includesKey: key
  62425.     "Answer whether the receiver contains the specified key."
  62426.  
  62427.     ^mutex critical: [super includesKey: key]!
  62428.  
  62429. initialize
  62430.     "Private - Initialize the state of the receiver."
  62431.  
  62432.     mutex := Mutex new.
  62433.     super initialize.!
  62434.  
  62435. keyAtEqualValue: value ifAbsent: exceptionHandler
  62436.     "Answer the name of the argument, value. If there is no such value, answer
  62437.     the result of evaluating the niladic valuable, exceptionHandler.
  62438.     Equality is used for comparison of the values (this increases the chances of 
  62439.     returning any duplicates the Dictionary might contain).
  62440.     Implementation Note: We avoid evaluating the exceptionHandler valuable
  62441.     inside the mutex to minimize the chances of throwing an exception
  62442.     with the mutex locked (#critical:'s ensure block would handle the case
  62443.     where the exceptionHandler performs a far return)."
  62444.  
  62445.     | answer |
  62446.     answer := mutex critical: [super keyAtEqualValue: value ifAbsent: [AbsentCookie]].
  62447.     ^answer == AbsentCookie
  62448.         ifTrue: [exceptionHandler value]
  62449.         ifFalse: [answer]!
  62450.  
  62451. keyAtValue: value ifAbsent: exceptionHandler
  62452.     "Answer the key of the first value in the receiver identical
  62453.     to the argument, value. If the receiver contains no such element,
  62454.     answer the result of evaluating the monadic valuable, exceptionHandler.
  62455.     Implementation Note: We avoid evaluating the exceptionHandler valuable
  62456.     inside the mutex to minimize the chances of throwing an exception
  62457.     with the mutex locked (#critical:'s ensure block would handle the case
  62458.     where the exceptionHandler performs a far return)."
  62459.  
  62460.     | answer |
  62461.     answer := mutex critical: [super keyAtValue: value ifAbsent: [AbsentCookie]].
  62462.     ^answer == AbsentCookie
  62463.         ifTrue: [exceptionHandler value]
  62464.         ifFalse: [answer]!
  62465.  
  62466. keysAndValuesDo: operation
  62467.     "Evaluate the dyadic valuable, operation, for each key/value pair in the receiver,
  62468.     to the exclusion of other threads."
  62469.  
  62470.     mutex critical: [super keysAndValuesDo: operation]!
  62471.  
  62472. mutex
  62473.     "Private - Answer the receiver's mutual exclusion object"
  62474.  
  62475.     ^mutex!
  62476.  
  62477. mutex: aMutex
  62478.     "Private - Set the receiver's mutual exclusion object to the argument, aMutex"
  62479.  
  62480.     mutex := aMutex !
  62481.  
  62482. postCopy
  62483.     "Apply any final flourish to the copy that may be required
  62484.     in order to ensure that the copy does not share any state with
  62485.     the original, apart from the elements. Answer the receiver.
  62486.     In the case of a SharedLookupTable we need a new mutex."
  62487.  
  62488.     super postCopy.
  62489.     mutex := Mutex new!
  62490.  
  62491. preResize: newMe
  62492.     "This message is sent by the receiver when resizing, before the
  62493.     receiver's elements are added to newMe. We must assign across the
  62494.     mutex so that process synchronisation is correctly preserved."
  62495.  
  62496.     newMe mutex: mutex!
  62497.  
  62498. printOn: aStream
  62499.     "Print a string representation of self on aStream."
  62500.  
  62501.     mutex critical: [super printOn: aStream]!
  62502.  
  62503. removeKey: key ifAbsent: exceptionHandler
  62504.     "Remove the key (and its associated value), from the receiver. If key is
  62505.     not in the receiver, answer the result of evaluating the niladic valuable
  62506.     exceptionHandler. Otherwise, answer the value named by key.
  62507.     Implementation Note: Avoid evaluating the exceptionHandler valuable
  62508.     inside the mutex to minimize the chances of throwing an exception
  62509.     with the mutex locked (#critical:'s ensure block would handle the case
  62510.     where the exceptionHandler performs a far return)."
  62511.  
  62512.     | answer |
  62513.     answer:= mutex critical: [super removeKey: key ifAbsent: [AbsentCookie]].
  62514.     ^answer == AbsentCookie
  62515.         ifTrue: [exceptionHandler value]
  62516.         ifFalse: [answer]!
  62517.  
  62518. resize: anInteger
  62519.     "Private - Resize the receiver to a capacity suitable for anInteger elements.
  62520.     We'll lose the mutex since this involves creating a new copy of the receiver
  62521.     and becoming it. Obviously we must restore the current mutex, or process
  62522.     synchronisation will be lost."
  62523.  
  62524.     mutex critical: [super resize: anInteger]!
  62525.  
  62526. shrink
  62527.     "Rebuild the collection with the optimal size for its current number of elements,
  62528.     as #rehash, but doesn't resize if already correct size."
  62529.  
  62530.     mutex critical: [super shrink]!
  62531.  
  62532. stbSaveOn: anSTBOutFiler
  62533.     "Save out a binary representation of the receiver to anSTBOutFiler."
  62534.  
  62535.     mutex critical: [super stbSaveOn: anSTBOutFiler]! !
  62536.  
  62537. MethodDictionary comment:
  62538. 'MethodDictionary is a specialized form of <IdentityDictionary> designed for ease and speed of access by the execution machinery. As the name implies, method dictionaries are used to map method selectors to the corresponding compiled method in a particular class.
  62539.  
  62540. The primary difference from an ordinary identity dictionary in the current implementation is that method dictionaries are a power of 2 in size to speed up the masking of hash values to the permissible range during method lookup.
  62541.  
  62542. You should not rely on the implementation details of this class, and nor should you change them or the instance shape.'!
  62543. !MethodDictionary class methodsFor!
  62544.  
  62545. sizeFor: capacity
  62546.     "Answer the <integer> size of collection that should be created to hold 
  62547.     the number of elements specified by the <integer> argument, capacity.
  62548.     Implementation Note: Round up to the nearest     power of 2, as required 
  62549.     by the VM, and avoid any dependency on the superclass sizing scheme."
  62550.  
  62551.     ^capacity < 2
  62552.         ifTrue: [2]
  62553.         ifFalse: [1 bitShift: (((capacity - 1 * 100 // 75)+1) highBit)]! !
  62554.  
  62555. !MethodDictionary methodsFor!
  62556.  
  62557. hash: anObject max: anInteger
  62558.     "Implementation Note: This must match the selector hashing implementation used by the VM."
  62559.  
  62560.     ^(anObject hash bitAnd: anInteger - 1) + 1!
  62561.  
  62562. removeKey: key ifAbsent: exceptionHandler
  62563.     "Remove the key (and its associated value), from the receiver. If key is not in the 
  62564.     receiver, answer the result of evaluating the niladic valuable, exceptionHandler.
  62565.     Otherwise, answer the value named by key.
  62566.     Implementation Note: Override to perform the update in a copy which is then
  62567.     swapped with the receiver. This is to avoid any problems with removing methods
  62568.     from the Dictionary hierarchy causing the method dictionaries of these classes
  62569.     to become temporarily invalid."
  62570.  
  62571.     | index value |
  62572.     index := self findKeyOrNil: key.
  62573.     ^(self basicAt: index) isNil
  62574.         ifTrue: [exceptionHandler value]
  62575.         ifFalse: [ | newMe |
  62576.             value := values basicAt: index.
  62577.             newMe := self copy.
  62578.             newMe basicValues basicAt: index put: nil.
  62579.             newMe removeIndex: index.
  62580.             self become: newMe.
  62581.             value]! !
  62582.  
  62583. DeferredValueTable comment:
  62584. ''!
  62585. !DeferredValueTable methodsFor!
  62586.  
  62587. at: key ifAbsent: exceptionHandler
  62588.     "Answer the value named by the argument, key.  If key is not found,
  62589.     answer the result of evaluating the niladic valuable, exceptionHandler."
  62590.  
  62591.     ^(super at: key ifAbsent: [exceptionHandler]) value!
  62592.  
  62593. at: key put: newElement
  62594.     "Store the argument, newElement, with the external key, key,
  62595.     in the receiver. Answer newElement."
  62596.  
  62597.     ^super at: key put: (newElement deferredValueAt: priority)!
  62598.  
  62599. do: operation
  62600.     "Evaluate monadic value argument, operation, for each of the elements (values) of the 
  62601.     receiver. Answers the receiver."
  62602.  
  62603.     #todo "Provide more efficient implementation".
  62604.     super keysAndValuesDo: [:k :v | operation value: v value]!
  62605.  
  62606. initialize
  62607.     "Private - Initialize the state of the receiver."
  62608.  
  62609.     super initialize.
  62610.     priority := Processor activePriority!
  62611.  
  62612. keyAtEqualValue: value ifAbsent: exceptionHandler
  62613.     "Answer the name of the argument, value. If there is no such value, answer
  62614.     the result of evaluating the niladic valuable, exceptionHandler.
  62615.     Equality is used for comparison of the values (this increases the chances of 
  62616.     returning any duplicates the Dictionary might contain).
  62617.     Implementation Note: Optimized superclass implementation must be overridden
  62618.     back to one implemented in terms of keysAndValuesDo:"
  62619.  
  62620.     self keysAndValuesDo: [:k :v | value = v value ifTrue: [^k]].
  62621.     ^exceptionHandler value!
  62622.  
  62623. keyAtValue: value ifAbsent: operation
  62624.     "Answer the <Object> key of the <Object> argument, value. 
  62625.     If there is no such value, answer the result of evaluating the 
  62626.     <niladicValuable>, operation. Identity is used for comparison of the values."
  62627.  
  62628.     self keysAndValuesDo: [:k :v | v value == value ifTrue: [^k]].
  62629.     ^operation value!
  62630.  
  62631. keysAndValuesDo: operation
  62632.     "Evaluate the dyadic valuable, operation, for each key/value pair in the receiver,
  62633.     to the exclusion of other threads."
  62634.  
  62635.     super keysAndValuesDo: [:k :v | operation value: k value: v value]!
  62636.  
  62637. priority
  62638.     "Answer the <Process> priority at which the deferred values will be calculated."
  62639.  
  62640.     ^priority!
  62641.  
  62642. priority: anInteger
  62643.     "Set the <Process> priority at which the deferred values will be calculated."
  62644.  
  62645.     priority := anInteger! !
  62646.  
  62647. SharedIdentityDictionary comment:
  62648. ''!
  62649. !SharedIdentityDictionary methodsFor!
  62650.  
  62651. findKeyOrNil: anObject
  62652.     "Private - This method is a copy of IdentityDictionary>>findKeyOrNil:"
  62653.  
  62654.     | capacity index key |
  62655.     capacity := self basicSize.
  62656.     index := self hash: anObject max: capacity.
  62657.     [(key := self basicAt: index) isNil or: [key == anObject]] 
  62658.         whileFalse: [index := index \\ capacity + 1].
  62659.     ^index!
  62660.  
  62661. hash: anObject max: anInteger
  62662.     ^anInteger < 8192 
  62663.         ifTrue: [anObject identityHash \\ anInteger + 1]
  62664.         ifFalse: [anObject identityHash * (anInteger bitShift: -12) \\ anInteger + 1]!
  62665.  
  62666. keysClass
  62667.     "Answer the class of Collection to be used for collecting the keys of the receiver"
  62668.     
  62669.     ^IdentitySet!
  62670.  
  62671. searchPolicy
  62672.     "Answer the receiver's <searchPolicy>."
  62673.  
  62674.     ^SearchPolicy identity! !
  62675.  
  62676. WeakLookupTable comment:
  62677. ''!
  62678. !WeakLookupTable class methodsFor!
  62679.  
  62680. initialize
  62681.     "Initialize the receiver.
  62682.     The receiver's instances need bereavement notifications to repair themselves."
  62683.  
  62684.     self makeMourner!
  62685.  
  62686. new: anInteger
  62687.     "Answer a new instance of the receiver sufficient capacity for anInteger elements. Both keys and values
  62688.     can be weakly referenced. By default instances of the receiver have strong key and weak value references."
  62689.  
  62690.     ^self newWithWeakValues: anInteger!
  62691.  
  62692. newWithWeakKeys: anInteger
  62693.     "Answer a new instance of the receiver sufficient capacity for anInteger elements. The keys are weakly
  62694.     referenced, but the values have normal strong references. This can be changed later by sending the instance
  62695.     a message."
  62696.  
  62697.     ^(super new: anInteger)
  62698.         haveWeakKeys;
  62699.         haveStrongValues;
  62700.         yourself
  62701. !
  62702.  
  62703. newWithWeakValues: anInteger
  62704.     "Answer a new instance of the receiver sufficient capacity for anInteger elements. The values are weakly
  62705.     referenced, but the keys have normal strong references. This can be changed later by sending the instance
  62706.     a message."
  62707.  
  62708.     ^super new: anInteger
  62709. ! !
  62710.  
  62711. !WeakLookupTable methodsFor!
  62712.  
  62713. copyEmpty: anInteger
  62714.     "Private - Answer an empty copy of the receiver, with enough space for anInteger
  62715.     number of elements. 
  62716.     Implementation Note: We must override in order to copy the weak/strong state of 
  62717.     the receiver and its values."
  62718.  
  62719.     | answer |
  62720.     answer := super copyEmpty: anInteger.
  62721.     answer setSpecialBehavior: self getSpecialBehavior.
  62722.     answer basicValues setSpecialBehavior: self basicValues getSpecialBehavior.
  62723.     ^answer!
  62724.  
  62725. do: operation
  62726.     "Evaluate monadic value argument, operation, for each of the elements (values) of the 
  62727.     receiver. Answers the receiver.
  62728.     Implementation Note: Override in order to revoke the weak status of the receiver    
  62729.     for the duration of the enumeration."
  62730.  
  62731.     mutex critical: [ | keysMask valuesMask |
  62732.         keysMask := self beStrong.
  62733.         valuesMask := self basicValues beStrong.
  62734.         [super do: operation]
  62735.             ensure: [
  62736.                 self setSpecialBehavior: keysMask.
  62737.                 self basicValues setSpecialBehavior: valuesMask]]!
  62738.  
  62739. elementsExpired: losses
  62740.     "Private - Handle the loss of <integer>, losses, keys from the receiver. We must repair the hash 
  62741.     table to maintain the set invariants, and we also nil out the corresponding values to allow them 
  62742.     to expire if they've no other references. Similar to WeakSet>>elementsExpired:.
  62743.     N.B. It is possible for the receiver to lose values AND keys during the same finalization cycle. It 
  62744.     is even possible that     the key corresponding to a value may be lost at the same time as that 
  62745.     value. This means we cannot rely on the argument telling us the correct number of losses, since 
  62746.     some of these may overlap with value losses (which might already have been dealt with)."
  62747.  
  62748.     | deathAt capacity corpse |
  62749.     corpse := DeadObject current.
  62750.     mutex critical: [
  62751.         capacity := self basicSize.
  62752.         deathAt := self basicIdentityIndexOf: corpse from: 1 to: capacity.
  62753.         (losses > (self size // 4))
  62754.             ifTrue: [ "Rehash the collection if a large number of losses (don't need to nil values)..."
  62755.                 [deathAt > 0] whileTrue: [
  62756.                     tally := tally - 1.
  62757.                     self basicAt: deathAt put: nil.
  62758.                     deathAt := self basicIdentityIndexOf: corpse from: deathAt+1 to: capacity ].
  62759.                 self rehash ]
  62760.             ifFalse: [ "... otherwise remove the losses individually"
  62761.                 [deathAt > 0] whileTrue: [
  62762.                     tally := tally - 1.
  62763.                     self basicAt: deathAt put: nil.
  62764.                     values basicAt: deathAt put: nil.    "nil the corresponding value too"
  62765.                     self fixCollisionsIgnoringCorpsesFrom: deathAt.
  62766.                     deathAt := self basicIdentityIndexOf: corpse from: deathAt+1 to: capacity]]]!
  62767.  
  62768. elementsExpired: losses of: aWeakArray
  62769.     "Private - Handle the loss of <integer>, losses, values from the receiver (values are stored 
  62770.     externally). We must remove the corresponding keys and repair the hash table to maintain the 
  62771.     set invariants. Similar to WeakSet>>elementsExpired:.
  62772.     N.B. It is possible for the receiver to lose values AND keys during the same finalization cycle, so 
  62773.     aWeakArray may no longer be the receiver's value array (if the #elementsExpired: message 
  62774.     informing of the loss of keys was received first). It is even possible that the key corresponding to 
  62775.     a value may be lost at the same time as that value. This means we cannot rely on either 
  62776.     argument to be terribly useful."
  62777.  
  62778.     | capacity |
  62779.     mutex critical: [
  62780.         (losses > (self size // 4))
  62781.             ifTrue: [ "Rehash the collection if a large number of losses (don't need to nil values)..."
  62782.                 self basicValues nilCorpsesAndDo: [ :deathAt | 
  62783.                     tally := tally - 1.
  62784.                     self basicAt: deathAt put: nil ].
  62785.                 self rehash ]
  62786.             ifFalse: [ "... otherwise remove the losses individually"
  62787.                 self basicValues nilCorpsesAndDo: [ :deathAt |
  62788.                     tally := tally - 1.
  62789.                     self basicAt: deathAt put: nil.
  62790.                     self fixCollisionsIgnoringCorpsesFrom: deathAt]]]!
  62791.  
  62792. fixCollisionsIgnoringCorpsesFrom: index
  62793.     "Private - Rehashes objects in the collection after index to see if any of
  62794.     them hash to index.  If so, that object is copied to index, and the
  62795.     process repeats with that object's index, until a nil is encountered.
  62796.     Corpse objects are not relocated, on the assumption that these will
  62797.     be nilled and fixed up later themselves."
  62798.  
  62799.     | slotIndex capacity element corpse |
  62800.     slotIndex := index.
  62801.     capacity := self basicSize.
  62802.     corpse := DeadObject current.
  62803.     [slotIndex := slotIndex \\ capacity + 1.
  62804.       (element := self basicAt: slotIndex) isNil]
  62805.         whileFalse:  [ | hashIndex |
  62806.             element == corpse ifFalse: [
  62807.                 hashIndex := self findElementOrNil: element.
  62808.                 (self basicAt: hashIndex) isNil ifTrue: [self moveFrom: slotIndex to: hashIndex]]]!
  62809.  
  62810. hasWeakKeys
  62811.     "Answer whether the receiver has weak references to its keys (the default)."
  62812.  
  62813.     ^self isWeak!
  62814.  
  62815. hasWeakValues
  62816.     "Answer whether the receiver has weak references to its values (the default)."
  62817.  
  62818.     ^self basicValues isWeak!
  62819.  
  62820. haveStrongKeys
  62821.     "Mark the receiver as having strong references to its keys. Answer the receiver."
  62822.  
  62823.     self beStrong!
  62824.  
  62825. haveStrongValues
  62826.     "Mark the receiver as having strong references to its values. Answer the receiver."
  62827.  
  62828.     self basicValues beStrong!
  62829.  
  62830. haveWeakKeys
  62831.     "Mark the receiver as having weak references to its keys (the default).
  62832.     Answer the receiver."
  62833.  
  62834.     self beWeak!
  62835.  
  62836. haveWeakValues
  62837.     "Mark the receiver as having weak references to its values (the default).
  62838.     Answer the receiver."
  62839.  
  62840.     self basicValues beWeak!
  62841.  
  62842. initialize
  62843.     "Private - Initialize the receiver's state."
  62844.  
  62845.     super initialize.
  62846.     self basicValues pathologist: self!
  62847.  
  62848. keysAndValuesDo: operation
  62849.     "Evaluate the dyadic valuable, operation, for each key/value pair in the receiver,
  62850.     to the exclusion of other threads.
  62851.     Implementation Note: Override in order to revoke the weak status of the receiver    
  62852.     for the duration of the enumeration."
  62853.  
  62854.     mutex critical: [ | keysMask valuesMask |
  62855.         keysMask := self beStrong.
  62856.         valuesMask := self basicValues beStrong.
  62857.         [super keysAndValuesDo: operation]
  62858.             ensure: [
  62859.                 self setSpecialBehavior: keysMask.
  62860.                 self basicValues setSpecialBehavior: valuesMask]]!
  62861.  
  62862. postResize: oldMe
  62863.     "Private - This message is sent by the receiver when resizing, after the receiver's elements have 
  62864.     been added to a new Collection and the receiver has become that collection. It is a chance for the 
  62865.     receiver to perform any final state changes needed. In this case we must ensure that the new value
  62866.     array has the correct pathologist - because of the use of a two way become:, it would otherwise keep
  62867.     the oldMe as it's pathologist."
  62868.  
  62869.     self basicValues pathologist: self!
  62870.  
  62871. species
  62872.     "Answer the class of object to be used when copying the receiver. There isn't much
  62873.     point answering a weak collection, as elements may expire after selection/collection, etc, 
  62874.     which is less than useful."
  62875.  
  62876.     ^LookupTable!
  62877.  
  62878. valuesClass
  62879.     "Answer the class of Collection to use to hold the values of the receiver's elements
  62880.     (N.B. This is a different concept from #keysClass, which is used for copying the keys of 
  62881.     the receiver). For a WeakIdentityDictionary we always use a MourningWeakArray to hold the values,
  62882.     but we may turn off its weakness if the dictionary only has weak values. The MourningWeakArray
  62883.     is configured to inform the receiver when it suffers losses."
  62884.  
  62885.     ^MourningWeakArray! !
  62886.  
  62887. EventsCollection comment:
  62888. ''!
  62889. !EventsCollection methodsFor!
  62890.  
  62891. addEvent: anEventSymbol message: anEventMessageSend
  62892.     "Private - Adds anEventMessageSend as the response for anEventSymbol but only if it is
  62893.     not already present."
  62894.  
  62895.     mutex critical: 
  62896.             [| messages |
  62897.             messages := self at: anEventSymbol ifAbsent: [EventMessageSequence new].
  62898.             "Check for existing registration"
  62899.             (messages includes: anEventMessageSend) 
  62900.                 ifFalse: 
  62901.                     [messages add: anEventMessageSend.
  62902.                     self at: anEventSymbol put: messages]]!
  62903.  
  62904. asMinimumRepresentation
  62905.     "Private - Answers nil if the receiver is empty, otherwise self."
  62906.  
  62907.     ^self isEmpty ifFalse: [self]!
  62908.  
  62909. removeEventsTriggeredFor: anObject
  62910.     "Private - Removes all events where the target is anObject.
  62911.     If the receiver becomes empty, answers nil, otherwise answers self."
  62912.  
  62913.     ^mutex critical: 
  62914.             [| empty |
  62915.             empty := IdentitySet new.
  62916.             self keysAndValuesDo: 
  62917.                     [:eachKey :eachValue | 
  62918.                     eachValue isNil 
  62919.                         ifFalse: 
  62920.                             [| messages |
  62921.                             messages := eachValue removeMessagesFor: anObject.
  62922.                             messages isEmpty ifTrue: [empty add: eachKey] ifFalse: [self at: eachKey put: messages]]].
  62923.             self removeAllKeys: empty.
  62924.             self asMinimumRepresentation]!
  62925.  
  62926. triggerEvent: anEventSymbol
  62927.     "Private - Evaluate the sequence of MessageSends registered for the event, 
  62928.     anEventSymbol.  Answer the result of the last evaluation, or nil if none."
  62929.  
  62930.     ^(self at: anEventSymbol ifAbsent: [^nil]) value!
  62931.  
  62932. triggerEvent: aSymbol with: anObject
  62933.     "Private - Evaluate the sequence of MessageSends registered for the event named by
  62934.     the <Symbol> argument, with a single argument, anObject..
  62935.      Answer the result of the last evaluation, or nil if none."
  62936.  
  62937.     ^(self at: aSymbol ifAbsent: [^nil]) 
  62938.         valueWithArguments: (Array with: anObject)!
  62939.  
  62940. triggerEvent: aSymbol with: anObject with: anotherObject
  62941.     "Private - Evaluate the sequence of MessageSends registered for the event named by
  62942.     the <Symbol> argument, with the pair of arguments, anObject, and, anotherObject.
  62943.      Answer the result of the last evaluation, or nil if none."
  62944.  
  62945.     ^(self at: aSymbol ifAbsent: [^nil]) 
  62946.         valueWithArguments: (Array with: anObject with: anotherObject)!
  62947.  
  62948. triggerEvent: aSymbol withArguments: anArray
  62949.     "Private - Evaluate the sequence of MessageSends registered for the event named by
  62950.     the <Symbol> argument, with the <Array> of arguments, anArray.
  62951.     with the specified arguments. Answer the result of the last evaluation, or nil if none."
  62952.  
  62953.     ^(self at: aSymbol ifAbsent: [^nil]) valueWithArguments: anArray! !
  62954.  
  62955. WeakIdentityDictionary comment:
  62956. ''!
  62957. !WeakIdentityDictionary class methodsFor!
  62958.  
  62959. initialize
  62960.     "Initialize the receiver.
  62961.     Class initialize methods are ignored by the SourceManager unless directly implemented
  62962.     so we must implement to get the bereavement notifications."
  62963.  
  62964.     super initialize!
  62965.  
  62966. new: anInteger
  62967.     "Answer a new instance of the receiver sufficient capacity for anInteger elements. Both keys and values
  62968.     are weakly referenced. By default WeakIdentityDictionaries have both weak key and weak value references."
  62969.  
  62970.     ^(super new: anInteger)
  62971.         haveWeakKeys;
  62972.         yourself! !
  62973.  
  62974. !WeakIdentityDictionary methodsFor!
  62975.  
  62976. findKeyOrNil: anObject
  62977.     "Private - This method is a copy of IdentityDictionary>>findKeyOrNil:"
  62978.  
  62979.     | capacity index key |
  62980.     capacity := self basicSize.
  62981.     index := self hash: anObject max: capacity.
  62982.     [(key := self basicAt: index) isNil or: [key == anObject]] 
  62983.         whileFalse: [index := index \\ capacity + 1].
  62984.     ^index!
  62985.  
  62986. hash: anObject max: anInteger
  62987.     ^anInteger < 8192 
  62988.         ifTrue: [anObject identityHash \\ anInteger + 1]
  62989.         ifFalse: [anObject identityHash * (anInteger bitShift: -12) \\ anInteger + 1]!
  62990.  
  62991. keysClass
  62992.     "Answer the class of Collection to be used for collecting the keys of the receiver"
  62993.     
  62994.     ^IdentitySet!
  62995.  
  62996. searchPolicy
  62997.     "Answer the receiver's <searchPolicy>."
  62998.  
  62999.     ^SearchPolicy identity!
  63000.  
  63001. species
  63002.     "Answer the class of object to be used when copying the receiver. There isn't much
  63003.     point answering a weak collection, as elements may expire after selection/collection, etc, 
  63004.     which is less than useful."
  63005.  
  63006.     ^IdentityDictionary! !
  63007.  
  63008. RegKey comment:
  63009. 'RegKey is the class of objects which represent individual keys in the Windows Registration Database. The keys may themselves have sub-keys which are in turn represented by instances of RegKey. A RegKey is also a dictionary of registry values represented in Dolphin by instances of <RegKeyValues>.
  63010.  
  63011. RegKey implements the <abstractDictionary> protocol as operations against its sub-keys. In order to operate on the values under the key one must first acquire an instance of RegKeyValues using the #subValues message.'!
  63012. !RegKey class methodsFor!
  63013.  
  63014. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  63015. σäM&2G¬oi«¬3ΘÉ/j┴éñ¢╖█╫{P.f╚│`r║┴┼ZɃVBºM▓rç╝cJ1≥pì╟╣F}╕.ôö╠ΣîªfåC▌÷∙e╟╧Ωswäªs┌┌YµT#╪v┘²! !
  63016.  
  63017. !RegKey methodsFor!
  63018.  
  63019. αP}Z>=╜╧;/¢½ƒ/ï+╗öΩ╘²╥╧┴╖²½{B▒┐╠~a%<╗╞\äHA8.O[nOαÇLcfAóqVnΓ⌐9║╩JΦδÑ¢÷╦¢qm|i╘╗3r»█╟LEÉçZ5ÑF»3╨A╒W0Σ$ö█@▄Kg∞3╟╥┼∙┘«w─`⌡≥Ær╣⌠E╢h;ÉΩ ╦╙KºN)îZ╠ 8`φ╬v┼z╚:±╥èHu╖º√╛÷ñßa^╡σ■J}EPr;ü╦>uCU█Yá{πîXt|B@╔ÄoÖ[ à⌡æ╣╝Vφ┤╥ƒ┐,º∞█I╩4╡s≥O}Yóúl╟dH°ç┴Æì▄Mê┼àαC²#·mε!!à⌠≈╥{JZ2 y╤ÜG√]í╠MD#Åncüε1µY╤°»\4#t┐s╫╘φVà╣ñ·EÖ╒ÅU╫:9DE0╓¬d8êQ·æ▒╗¬£≡║╪Äæº]╕ç@F0⌐¥ü;╩$⌐nc
  63020. ╗¿▒┬╨:L!
  63021.  
  63022. αP}Z>=╜╧"<«≤╠+ïπ▐Ω╧Ω║╡╝ⁿ┴▒\Q║√╘svW└â+_ÆQPjoU|i≤é
  63023. q/[½<Gbºδ|Φ█C⌐╡╗¢─█Ös@
  63024. │╣u&½█╬XD╒û9εH│d▄A⌡_0Σ$ì█ZÖKb⌐rô│═σ█Ña╚ æ┤æv
  63025. ¡σ)╚    ,tÉ»2₧═ZαH<╪M├V°(x╡çl╩K}Ç+ú▌ìWx▓║²φáº┤sY¡⌠╗%R]&6ï Γ<eF╚╪τ╦0b:X╥äoÿO╜⌡╚°≥`Θ┐àü┌5░·àI█
  63026. w
  63027. ,╛v∙ `Å█Θ`Kαôä¥Ü▐\Æ┘╦ªl√5α+╚5àµ÷≡LlL    4Γw¥■!!)╤ ùK╤X@Lz╞exäΦ!!Ω"1ó╦δR7;_jû ▀▐╠AFå∞Njú≈L▀₧Ü^₧!!-CTQ└⌡d8£cü■▄ÆF┐┐⌠÷ê¥╩Së]üÉF1┤╚╞]ëG╟ qτ■ú█╟tÄ┌0╩ΓÖGª╥■0├-wé▀╝PïΦ!!ì│╕wÿ₧F╖=4Ü≤τ╩,╚╛²T ö_╩▒$2½°═╬┤ ─3'Ǻ╓^fï┴≡e₧∞ÖjV∞▒Ya√;6æ█m∞)A²è╫ï┤e▄;î≈Üäó╔!
  63028.  
  63029. τM+-░á<s·¿┐>ù:α┘éªùò∙▄▓≈σ\V½√╘svD╫ç;[üZVjgU≤┴ \a#K¬h~º│4║╠G║▓ñ¢∙█
  63030. ₧{P@zoÜ¿e7εò╨L\üæp¥Wñxæ óN?⌠iÜ╨M╥╞mV║ô≡Γ▐Ñrà`⌡≥·r
  63031. ╢σgQ╢:J?╣┤^┤╢6ΘD7╪o╧╥!!múçk╟NhÇ9ñ╨Åtuºªúôèo┴·eD¡╨ºX%hP Xτcα~%9┌┴╩▓Lo
  63032. B@╧ä<╦\ Ü⌡■¡ΦNΩα┴╠⌐*ºµ╚üh]b0¿n∙yßú'¡2 Æç╙è╨█φƒ⌡I┤p⌐`í5╠δ²≡RFA\    <┬#ü≥,h¼!
  63033.  
  63034. ΦJ$ <í£,ú≤╠!!Ç&╥└²┼≡╨▓┐╫░ä]P¿╛╥;d@S╞î;@╫KL/.IVh
  63035.  ùK&.N░<R*⌐«9║█S⌐╗≈è°ÅÆ4_iu╫╣c&Γë╦\Q╫{∙{╟_÷nà╫TVI<÷Aì╠ÉKv∞Q╣√╨π╬ïvæM┼╞╙Y║⌠EJúl"zîδ?█ƒQΓVaí5│·/!!úÜ8╤Gb╞ú┘äMgº╝ß╥Θ║⌡rE≈ì╪crcG&h╙J∩2%9á╚Ñ▒\cFU Öu╦IÜ÷æ╣∩Qσ¿Ç└ƒ*░±ñcªl^0⌐~╫
  63036. mó║l┘^O■Éå■Σ╢!!≥├╔╔Rα?┤x╗sòèÆ╢s/zN m8Γ>ü≥)?╤║wα*dcGδ
  63037.     ΣÆ%δY█╖πCkzY |²╟£┤.oîΩ^jÑ·N╝ÖÉT█=IQ╤σ&(8ê"·æ▒┴ á╝▒░┘Ä╬±2╔║AA▓Ç╧NïƒPI*─ìàφµBñ!
  63038.  
  63039. ΩA>    7■╧=9┐╗ì>î0∩╣àÑ╝≥╔╘▓τñGF »╚~3EY▄à:[öR+bNRi≤═^Vv#]óhZe¼τ`ⁿ╤P@¡╢┤û╖└^â|[@|e┘╣d$½█çJåæ[~½ZÑ3╥lû<%`≥aô╪ÅWvç%²ô╬≤▀ä|╥MÉïûn║°XJ!
  63040.  
  63041. ±V. 4,í«&s·óë3ΦUêû▀▐≈┴▐┴╗▓Φb▒¿╫~aB┌ü~\ûRA..HFiB²äi ╖tV*░«# ╫T║≈áùπ╟ â4[|o╚ⁿn:½╩╦PFÆX╤{├)▀Câ≡W9φqܲU¥Qg┴jU║£┬√╔·3âå÷∙f╛≡EA¼t:zûτi₧╠ZδGo▄^╬╒?n⌠⌡w═V¬V╪╬îK`ÿ½ßñá¡°f½∩╜)`_8a[¥ εMpbJ\╧W▐çßUE╘ë*ÖSà░├▒√i≡⌐┴╦ê1╕ú─ ì!
  63042.  
  63043. ≤A*#=Åè+s·óë3┼6τ⌡φ▀√┘╦Å■≈╜PF»»╔t}`W▄Ç2Wà2.C,iVfαä^Mn#¿yJ*Ω¬.■₧K╗≈╢ìΣ└û`[.v█░x7τàÇ_ZÜ╙}½ñxô⌡GJvíMÖ₧RÖ[4ÑQ╣√═∙╪αzåMïôû<½≥RM┤e7┬ε=═╚Z⌡;─ZÜ÷>t⌡╙8═D.┼)░╨ûE`║á ╛⌠¡┤nU╡ß╢%PTs3îµ[]&U╤╚₧¿VcBB▐ì*ÖB╣Σ┘╜εvφ⌐äü┌?╗≡▐ ▌E#C¬}≡q∞░d┼iε▐èûùæ%±┐δ¿`║R«+±!!└⌠²╤~JFM8²2ç≥mqÖ1▀K╤ HPf╞suÅ╢!!± ╩ºπX&z^{û    ╬╫┌MëµXG▌ûBÜî╙╔$1SHQ⌡∙*2å╫óìÆ
  63044. ú┐Γ÷╩à╥H¥Aε╞(<I╩√▒╬&½"t÷▒ª╦÷*súê)ó╥░_╜╣≥/óBc2ôëU∙XÜΣ'ÿ«▓ZóÜIº4!
  63045.  
  63046. ≥M=XR══'⌐╛ë8┼+Θ╤»┬δ┌▌╨¼▓¬U║╖┼vvFB┴─7\╫KL/.IVh
  63047.  ùK(K%╩UU*½Ñ3∩╪D    ½╛▓ÉπÅöqM.i╔ⁿl$»└╠XJÖ╙zεG│iò±XA x⌡lÜ₧RÖ[4Ñ:▄▐âΓ─Ñ}╚ ûùƒ<b─ÿ^PΓi;äµ?╥┌[ºN:╪═τ%!!Ω┬v╤Kl╠:±╥ûHx≤╕∙≥⌡╗║"1╙ì╪c<vCY&9ï╩6~C▄µôéVx2W!
  63048.  
  63049. ≥Q%10!!╖ΓX@°êé9Æ:≤öε┬╛ï▐╫¡µ╖R@½ƒ╔xgAY▄à,K╔K,.HFiB²äJ&/Aπh[oΓ╣%∙█K¡Ñ≈╓÷Å.É_['.ÿ╤_─á■JMÖ!
  63050.  
  63051. ≥Q%,44▒è!!D╨└╬ ï,÷╤²î ┘ƒë┐≡╢GQ╛╕╘_zKB█ï0SàFja]x⌠╠\5¬r~¬«`Φ█Aíí▓î╖ç^ÑqY+ky∞╜a'½┌ë
  63052. °|■|É Ñx£╝BZ αhè█zÉCg┐mV║√═≈┴Ñ)╚Üùò<»ⁿR)╚    ckâ²6╨╦oµU'û╔ +!!Θ╞j╟Lz≡>Ñ╘ε.┌╝≈±⌠-¡φ:¬σ╛ BwIZM7ùgë~YbN]ôW▐åº~=N╖δFΓ3
  63053. ù■╒┤∙;ñ⌐ä┴£~╜Γ╟├lfxj╒σaM±┤e╞1à!
  63054.  
  63055. ≈E+0¿Ä!!:╫├σhñ1≥├Ω▐╛├╫╨■±⌐RP¼√╧}3GT╪ü=F╫JW/jGdOΣäKc5J¡h~¬«`∞▀N¡ñ≈ù∙óvwâ|[@|e┘╣d$½█Ä% {∙K╜F║{╨ΘSd !!┬h₧═J! !
  63056.  
  63057. RegKeyValues comment:
  63058. 'RegKeyValues is the class of objects which represent the dictionary of named values under a particular key in  the Windows Registration Database.
  63059.  
  63060. RegKeyValues implements the <abstractDictionary> protocol mapping value names to keys and the registry values to dictionary values.'!
  63061. !RegKeyValues class methodsFor!
  63062.  
  63063. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  63064. σäM&2G¬oi«¬3ΘÉ/j┴éñ¢╖█╫{P.f╚│`r║┴┼ZɃVBºM▓rç╝cJ1≥pì╟╣F}╕.ôö╠ΣîªfåC▌÷∙e╟╧Ωswäªs┌┌YµT#╪v┘²! !
  63065.  
  63066. !RegKeyValues methodsFor!
  63067.  
  63068. αW461Ñ¢;&┤êÿp┼4Σ═»┼°÷▌╞╗ⁿ▒    ║ú├~c\_▌èSÖ[H/|69M╫ÅNc4ó<]o╡δ|√═Q½╛╢è■└@╫v[ye▀▓-&ª╠ÇRMîVÆqεU╖qà╝^IdRêpù█ÄGw⌐    *╓Çâ≈╪αgÇ▀Üü{ú⌠YPε ~¢ís₧÷YºJ*╒╙│#nφç~═W`─s±▌ìWc╢╝╕ΩΦ┼₧    N╝≤º%ISKc$Å÷$xAWë┼╩²Wd0BH╙éèVù≥▌╜ó-ñ┐Ö╬ƒ.íΩ╞τ9«2╛b2ê╪W╙hWΩFƒÆÇü▄AÜ┬╠ΘL╫1⌐xîY¼Ä≤┌)DPP¢^·ß,iä1┼ù DNe╞at╫╗>µeU╬âφD44^C>φ$█╩┌AöΩS$ƒ■G¢ÖÜU₧:9\U ╣!
  63069.  
  63070. αP}Z>=╜╧;/¢½ƒ/ï+╗öΩ╘²╥╧┴╖²½{B▒┐╠~a%<╗╞\äHA8.O[nOαÇLcfAóqVnΓ⌐9║╩JΦ╢ÑÖΓ┬â8 kyöⁿ-¿ë╦\Qªü{⌐┐n╨≤E7⌠j¢Æ4÷+uó+╓ÇâΓ─Ñ3ÜîăhOí≈A┤anâ√:╨╪≤I*îQ╙≥)h·çn├N{┴=╜┘╧q½¡²ε⌠º·H]╖Σ╛++?bK3ùJΓ#~B╚▐╩áZ5Mêñ=ÖU╓⌡╔╗∙q≡│Ä├┌7│ú█ ╚ $ⁿ}  qL±±o┴dW FÿÄü╬╠Gû╙¿î+µ1⌐d∩}çèÆ▓p/W\E;▒!!Æ√8`░ ┼╘XjÇAb₧■;≈PeY╨íΩG%3EV╫┌▐▄V!
  63071.  
  63072. αP}Z>=╜╧"<«≤╠+ïπ▐Ω╧Ω║╡╝ⁿ┴▒\Q║√╘svW└â+_ÆQPjoU|i≤é
  63073. q/[½<Gbºδ%Γ╩Gª╢╗▐ⁿ╩R╫uuw,╖╓;áë╘QM╒ûpºU│o▐A▌_\=≤$₧╨v₧Hq»~╛°«£Ñ₧`ìÖ█à}╗⌠vP° ~¢»#╦╦º@!!π]╨≡9!
  63074.  
  63075. ΓL&2=Åè+s·óë3┼+εÄ»┬√└⌠╨ºƒ╧:Å⌐╔mr\SÆ╔~qƒ^J-kGc
  63076. ╢è@&)Iπh[oΓ«, ╙G╝≈╕ÿ╖█╫f[ki╠╣r╣└╘Q₧èZ5ÑF»1╨≤<%`6Σs┤█@▄
  63077. qΓrôÇ╞°═¡v╚ ▀█üyºΓCV╗ zÄ·6ùæ╞O<█Z╚Vτ%d╣╤y╬WkÇ0╖£ùLq≤½⌠√φªα6╨≈║`^rÖ ≡W3yN^╬╔_╚╠3V*PÜÇ<ÿU╓∞╝╥ò`≈⌐Ä╬┌dΦú┌ ├w
  63078. │⌡`Vφ┐H╘7τç╧■Σ╢Iê┼╩σ )α+∩6╥╠²╞T+&L1≈wÆ≤)?╤5î]╨/    ∩seü²u±(S▐º─R(`
  63079. {╧T│╕░zô≡S)!
  63080.  
  63081. τM+-░á<s·║ÿ8Ç>∞╣àÑ╝±╓┘╗▓¬FW »╚~3ZS╤ü7DÆM#`Gc
  63082. ╢ô^c"F╖<Go║┐`Φ█R¡ñ▓Éπ╬ÿza ╬┤hr≥┘╒M\öƒF║Q│|¥_╝P]-∞aæ╩▄Q`╛=▐▄ü¢ª═ß▀îü}ÅσX╧
  63083. chçπ5₧╘Z■R┬[∞ 8dΩπwÿ¬V╪╡╕≤⌠ε╛ⁿF┼₧    5╨≈á DRQ;r¥±1|@╞─â«W-wî╧Bß3k √æ▒∩DΘ¬ò╘┌S▀èá`ª 1?╣&╝4gK≡┤h═-UΘè▒åÜà▀÷°ï(¥{Y╙bτ─δδ┌@%o Tÿ^¿Σ9wö5Æ#╡q(+
  63084. ∩    nêπ!!╙1굡 \P#p┐s╖▄▄\░÷H ╗≤▀₧─*┤EQ9)x½■!!)íyâíÿûLæ⌠£▄óΓóLêJÑàH*Ñè¢#▐>≈""E╡╙┌º¼Vg╫ô?ÄåΣQíδ╗DΘ)^dÄ╒!!εU£╗wß═╘=π≥.ÿ+ 忬¼C╕Ö∙W εD∙á?q0ï°╘æ╒^US┼(/Ü≡ÿ'Vó⌐ù#⌡ÅÆlZ╢∞&╔"8α₧<»kαâ·≥═I╘;╖≤ºê╡╒EJÉYc1≈5Åæ╔A0δù▀íO÷E#k≡2/O¼∞ö(8ºl¥εDL/<ƒòε9▀ºáV╖v$╝╨╨╒Æ╦t$/ï╤ì/^π'SFYF╫*∞h─╦■^Wí»╞╦+Ñσ╚½_J▐#╛├<']:╢BÉ┌ö{%îJH¥t╥ε(;ïöÖüs▒3z')M∩eíì⌐Tαº■oç╦¿╠ÜN┼>U#B∩µτæ÷╞æ9óƒtv2Γ31*²à:hº═*óΦx▓ÄI££Kû═─Φ┼~0¬vÿA+Bù?YFr½Ωc>╨¥£Ç╜hΣVbíëº╣▓W≡╦]:qWε;╩Ak╔êσd≡iS&#£²¡êQ=╠çRdç╣τòA≈≡╙x⌠HTΘæV╪í┘x╛┴MíúYa.P╘ü└H┴%å┤φl╪ΩO╨
  63085. ≡─eó╪└3╥.y┤¼╙ù─.┤Äù≡è ╘t÷╓b║Ä Ñæ3Å%*\l─UI|,▄[ª5wó0q█ECK∞âÉ|Æá║╟7y╟v╔é╦!!│zb4&▌½¬é
  63086. ∞╟- «j₧e╞*M╘vû¡Z║I½╥[╪╞▐.»Ñ║╙'ε6YAóöó╟MJΘw[[τUá≡»]├4┘kS·\íQ8>5≈¬╦╤ΘS¿üzç'°≥â0≈Σÿ+
  63087. ⌠÷╠φ╒a∞≈Ö?├µ4╟Åf╗^ h«[¥∩║▐╫∩Le╘╞;Æúσæ!
  63088.  
  63089. ΦJ$ <í£,ú≤╠!!Ç&╥└²┼≡╨▓┐╫░ä]P¿╛╥;d@S╞î;@╫KL/.IVh
  63090.  ùK&.N░<R*⌐«9║█S⌐╗≈è°ÅÆ4_iu╫╣c&Γë╦\Q╫{∙{╟P│qûA²EI3Σ}¼╩KòLs∞    :≥É╨≤┬┤)╚6í¥Æp½╠)╚    4oÉ·6!
  63091.  
  63092. ΩA>    6á╣3%»¼ƒèeí█ ╔∞╓╦▄▒ⁿ╚9*²₧╓z]W╞ü~FƒZ'aURo⌡┴Xj3NípV&Γñ0 ╠Cí╕╣╥╖╔ ╫q_f ╒║-&ª╠ÇKMûÜp╝Ñ=²kò_N=≥$₧╨]▄Tuá9└▄ü¢ª═ß3îÄâyεΓBFöanç┴2╙┌L╞O+·^╓÷>E÷¥8═Rk╥>Ñ╒îJ!
  63093.  
  63094. ΩA>    7■╧=9┐╗ì>î0∩╣àÑ╝≥╔╘▓τñGF »╚~3EY▄à:[öR+bNRi≤═^Vv#]óhZe¼τ`ⁿ╤P@¡╢┤û╖└^â|[@|e┘╣d$½█çJåæ[~½ZÑ3╥lû<%`≥qÅ█K▄Qa«6=▀ç╞╪═¡v¢)É┴╙s½πVP½o!
  63095.  
  63096. ≤A*#=Åè+s·óë3┼6τ⌡φ▀√┘╦Å■≈╜PF»»╔t}`W▄Ç2Wà2.C,iVfαä^Mn#¿yJ*Ω¬.■₧K╗≈╢ìΣ└û`[.v█░x7τàÇ_ZÜ╙}½ñxô⌡GJvíMÖ₧RÖ[4ÑQ╣√═∙╪αzåMïôû<½≥RM┤e7┬ε=═╚Z⌡;─ZÜ÷>t⌡╙8═D.┼)░╨ûE`║á ╛⌠¡┤nU╡ß╢%PTs3îµ[]&U╤╚₧¿VcBB▐ì*ÖB╣Σ┘╜εvφ⌐äü┌?╗≡▐ ▌E#C¬}≡q∞░d┼iε▐èûùæ%±┐δ¿`║R«+±!!└⌠²╤~JF\.⌠wç (%ò1ôK╦Vkâ eâ∩<±eO▌áóC#?OY|╙╤┼ÖPàúO:▓ⁿ@Ö£ÜC│FQ[EÄ░3 4Æd╫╠╤▄
  63097. ú¡Γ÷Æ▐ï[ô]│─DX=╖ôû]ëG╟ q┼¡╡┬├cÆù#▒ì├AÆ°≈<å0<₧ô·a¢≥2é│τÅâDª(     îºÅ└'╒ⁿò,!
  63098.  
  63099. ≥M=XR══'⌐╛ë8┼+Θ╤»┬δ┌▌╨¼▓¬U║╖┼vvFB┴─7\╫KL/.IVh
  63100.  ùK(d"╔9£╕%÷╪ ¡«₧ɱ└\ûxKMo╧▓y!
  63101.  
  63102. ≥Q%10!!╖ΓX@°êé9Æ:≤öε┬╛ï▐╫¡µ╖R@½ƒ╔xgAY▄à,K╔K,.HFiB²äJ&/Aπh[oΓ╣%∙█K¡Ñ≈╓÷Å.É_['.ÿ╤_─á■[ÉòVf╗A¥xë"≡P\Uï÷╨XæG.∞9▀öâ°═¡vσg÷≥â}½ Ctút!!┬ⁿ6╥┘≈@;─y╚■n÷╙¿+╥0╛╚¿AmΘεδ√∞ΦµoS¡╦╖o/<g?╘J≡<wC╚ä|α╚04BB▐ì*╤ôⁿ╫°⌠`Ω╛ì╚┴S▀èá`╓
  63103. "░z!
  63104.  
  63105. ≥Q%,44▒è!!D╨└╬ ï,÷╤²î ┘ƒë┐≡╢GQ╛╕╘_zKB█ï0SàFja]x⌠╠\5¬r~¬«`Φ█Aíí▓î╖ç^ÑqY+ky∞╜a'½┌ë
  63106. °|■|ÉP│qû! !
  63107.  
  63108. SharedIdentitySet comment:
  63109. ''!
  63110. !SharedIdentitySet methodsFor!
  63111.  
  63112. findElementOrNil: anObject
  63113.     "Private - This method is a copy of IdentitySet>>findElementOrNil:"
  63114.  
  63115.     | capacity index element |
  63116.     capacity := self basicSize.
  63117.     index := self hash: anObject max: capacity.
  63118.     [(element := self basicAt: index) isNil or: [anObject == element]] 
  63119.         whileFalse: [index := index \\ capacity + 1].
  63120.     ^index!
  63121.  
  63122. hash: anObject max: anInteger
  63123.     ^anInteger < 8192 
  63124.         ifTrue: [anObject identityHash \\ anInteger + 1]
  63125.         ifFalse: [anObject identityHash * (anInteger bitShift: -12) \\ anInteger + 1]! !
  63126.  
  63127. WeakSet comment:
  63128. 'A WeakSet is a <Set> which only weakly references the elements that it contains. That is, subject to the <MemoryManager>s intervention, if any of a weak set''s elements have only weak references remaining, then they may be garbage collected, in which case that weak set will receive a bereavement notification, and be given a chance to adjust to it''s loss(es), which it does by nilling out the corpses
  63129. and rehashing. Bereavement notification is performed asynchronously by separate (high priority) process, and WeakSet is accordingly a subclass of <SharedSet>.'!
  63130. !WeakSet class methodsFor!
  63131.  
  63132. initialize
  63133.     "Initialize the receiver.
  63134.     Bereavement notifications are required by the receiver's instances to
  63135.     effect repairs."
  63136.  
  63137.     self makeMourner!
  63138.  
  63139. publishedEventsOfInstances
  63140.         "Answer a Set of Symbols that describe the published events triggered
  63141.         by instances of the receiver."
  63142.     
  63143.         ^super publishedEventsOfInstances
  63144.             add: #elementsExpired:;
  63145.             yourself.
  63146.     ! !
  63147.  
  63148. !WeakSet methodsFor!
  63149.  
  63150. copyEmpty: anInteger
  63151.     "Private - Answer an empty copy of the receiver, with enough space for anInteger
  63152.     number of elements. 
  63153.     Implementation Note: We must override in order to copy the weak/strong state of 
  63154.     the receiver."
  63155.  
  63156.     ^(super copyEmpty: anInteger)
  63157.         setSpecialBehavior: self getSpecialBehavior;
  63158.         yourself!
  63159.  
  63160. do: operation
  63161.     "Evaluate monadic value argument, operation, for each of the element of the 
  63162.     receiver. Answers the receiver.
  63163.     Implementation Note: We override this message because if the user supplied operation
  63164.     puts the active process to sleep (i.e. wait on some Semaphore) a GC may occur, losses may be 
  63165.     suffered, and because the mutex prevents the undertaker from entering the critical section in 
  63166.     #elementsExpired: we may subsequently enumerate over Corpses and treat them as elements. 
  63167.     In order to guard against this we temporarily revoke the receiver's status as a weak
  63168.     object. Note that GC's which nil weak references can only be initiated from idle time, so
  63169.     there is no danger of corpses appearing in the receiver if operation does not put the active
  63170.     process to sleep."
  63171.  
  63172.     | mask |
  63173.     mutex critical: [ 
  63174.         mask := self beStrong. 
  63175.         [super do: operation]
  63176.             ensure: [self setSpecialBehavior: mask]]!
  63177.  
  63178. elementsExpired: anInteger
  63179.     "Private - Handle the bereavement(s) that the receiver suffered by maintaing 
  63180.     the <Set> invariants (mainly that collision chains are terminated by nils)."
  63181.  
  63182.     | deathAt capacity corpse |
  63183.     corpse := DeadObject current.
  63184.     mutex critical: [
  63185.         capacity := self basicSize.
  63186.         tally := tally - anInteger.
  63187.         deathAt := self basicIdentityIndexOf: corpse from: 1 to: capacity.
  63188.         (anInteger > (self size // 4))
  63189.             ifTrue: [ "Rehash the collection if a large number of losses..."
  63190.                 [deathAt > 0] whileTrue: [
  63191.                     self basicAt: deathAt put: nil.
  63192.                     deathAt := self basicIdentityIndexOf: corpse from: deathAt+1 to: capacity].
  63193.                 self rehash]
  63194.             ifFalse: [ "... otherwise remove the losses individually"
  63195.                 [deathAt > 0] whileTrue: [
  63196.                     self basicAt: deathAt put: nil.
  63197.                     self fixCollisionsIgnoringCorpsesFrom: deathAt.
  63198.                     deathAt := self basicIdentityIndexOf: corpse from: deathAt+1 to: capacity]]].
  63199.  
  63200.     "Inform any dependents"
  63201.     self trigger: #elementsExpired: with: anInteger!
  63202.  
  63203. fixCollisionsIgnoringCorpsesFrom: index
  63204.     "Private - Rehashes objects in the collection after index to see if any of
  63205.     them hash to index.  If so, that object is copied to index, and the
  63206.     process repeats with that object's index, until a nil is encountered.
  63207.     Corpse objects are not relocated, on the assumption that these will
  63208.     be nilled and fixed up later themselves."
  63209.  
  63210.     | slotIndex capacity element corpse |
  63211.     slotIndex := index.
  63212.     capacity := self basicSize.
  63213.     corpse := DeadObject current.
  63214.     [slotIndex := slotIndex \\ capacity + 1.
  63215.       (element := self basicAt: slotIndex) isNil]
  63216.         whileFalse:  [ | hashIndex |
  63217.             element == corpse ifFalse: [
  63218.                 hashIndex := self findElementOrNil: element.
  63219.                 (self basicAt: hashIndex) isNil ifTrue: [self moveFrom: slotIndex to: hashIndex]]]!
  63220.  
  63221. initialize
  63222.     "Private - Instance variable initialization. Ensure the receiver is weak."
  63223.  
  63224.     super initialize.
  63225.     self beWeak!
  63226.  
  63227. species
  63228.     "Answer the class of object to be used when copying the receiver. There isn't much
  63229.     point answering <WeakSet>, as elements may expire after selection/collection, etc, 
  63230.     which is less than useful, so we answer <Set>."
  63231.  
  63232.     ^Set! !
  63233.  
  63234. WeakIdentitySet comment:
  63235. ''!
  63236. !WeakIdentitySet class methodsFor!
  63237.  
  63238. initialize
  63239.     "Initialize the receiver.
  63240.     Class initialize methods are ignored by the SourceManager unless directly implemented
  63241.     so we must implement to get the bereavement notifications."
  63242.  
  63243.     super initialize! !
  63244.  
  63245. !WeakIdentitySet methodsFor!
  63246.  
  63247. findElementOrNil: anObject
  63248.     "Private - This method is a copy of IdentitySet>>findElementOrNil:"
  63249.  
  63250.     | capacity index element |
  63251.     capacity := self basicSize.
  63252.     index := self hash: anObject max: capacity.
  63253.     [(element := self basicAt: index) isNil or: [anObject == element]] 
  63254.         whileFalse: [index := index \\ capacity + 1].
  63255.     ^index!
  63256.  
  63257. hash: anObject max: anInteger
  63258.     ^anInteger < 8192 
  63259.         ifTrue: [anObject identityHash \\ anInteger + 1]
  63260.         ifFalse: [anObject identityHash * (anInteger bitShift: -12) \\ anInteger + 1]! !
  63261.  
  63262. ColorRef comment:
  63263. 'ColorRef is the abstract class of palette independent (absolute) color values used with most Win32 APIs.
  63264.  
  63265. Instance Variables:
  63266.     code        <SmallInteger>. The COLORREF value. e.g. an RGB value.
  63267.  
  63268. '!
  63269. !ColorRef class methodsFor!
  63270.  
  63271. default
  63272.     "Answer the special PseudoColor respresenting the default colour."
  63273.  
  63274.     Default isNil ifTrue: [Default := self basicNew setCode: 16rFF000000 "CLR_DEFAULT"].
  63275.     ^Default!
  63276.  
  63277. fromInteger: anInteger
  63278.     "Private - Answer an instance with the specified colorref code value."
  63279.  
  63280.     ^((anInteger bitShift: -24) == 16rFF ifTrue: [self] ifFalse: [RGB]) 
  63281.         basicNew
  63282.             setCode: anInteger
  63283.             yourself!
  63284.  
  63285. none
  63286.     "Answer the special PseudoColor respresenting no colour."
  63287.  
  63288.     None isNil ifTrue: [None := self basicNew setCode: 16rFFFFFFFF "CLR_NONE"].
  63289.     ^None!
  63290.  
  63291. onPreStripImage
  63292.     "Private -  Assist in the image stripping process by clearning down any
  63293.     lazily initialized variables held by the receiver."
  63294.  
  63295.     self uninitialize!
  63296.  
  63297. uninitialize
  63298.     "Private -  The receiver is about to be removed from the system, clean up."
  63299.  
  63300.     None := Default := nil! !
  63301.  
  63302. !ColorRef methodsFor!
  63303.  
  63304. = aColorRef
  63305.     "Answer true if the argument and the reciever are equal (i.e. they are represent the
  63306.     same colour value)."
  63307.  
  63308.     ^self species == aColorRef species and: [self code = aColorRef code]!
  63309.  
  63310. asColorRef
  63311.     "Answer the receiver as a ColorRef (an RGB value or one of the standard pseudo-colour constants)"
  63312.  
  63313.     ^self!
  63314.  
  63315. asIndexedColor
  63316.     "Answer the receiver as an IndexedColour using the default palette."
  63317.  
  63318.     ^self asIndexedColorUsingPalette: self defaultPalette
  63319. !
  63320.  
  63321. asIndexedColorUsingPalette: hPalette
  63322.     "Answer the receiver as an IndexedColour using hPalette"
  63323.  
  63324.     ^self asRGB asIndexedColorUsingPalette: hPalette!
  63325.  
  63326. asParameter
  63327.     "Answer the receiver such that it can be used for an API call."
  63328.  
  63329.     ^self code!
  63330.  
  63331. asRGB
  63332.     "Answer the <RGB> colour equivalent to the receiver."
  63333.  
  63334.     ^self becomeA: RGB!
  63335.  
  63336. code
  63337.     "Private - Answer the value of the receiver's ''code'' instance variable."
  63338.  
  63339.     ^code!
  63340.  
  63341. errorNotARealColor
  63342.     "Private - Raise an error to the effect that the receiver does not represent a real colour
  63343.     value, and cannot therefore be converted to type of <Color>."
  63344.  
  63345.     ^self error: 'Cannot convert to another type of Color'!
  63346.  
  63347. hash
  63348.     "Answer the <integer> hash value for the receiver."
  63349.  
  63350.     ^self code!
  63351.  
  63352. setCode: anInteger
  63353.     "Private - Set the <integer> value of the ColorRef (i.e. that value passed to API calls
  63354.     to represent the color)."
  63355.  
  63356.     code := anInteger! !
  63357.  
  63358. IndexedColor comment:
  63359. ''!
  63360. !IndexedColor class methodsFor!
  63361.  
  63362. initialize
  63363.     "Initialise the map of standard colour names to indices.
  63364.         IndexedColor initialize
  63365.     "
  63366.  
  63367.     StdColours := ##((IdentityDictionary new: 16)
  63368.         at: #black        put: 16r1000000;
  63369.         at: #darkRed        put: 16r1000001;
  63370.         at: #darkGreen        put: 16r1000002;
  63371.         at: #brown        put: 16r1000003;
  63372.         at: #darkBlue        put: 16r1000004;
  63373.         at: #darkMagenta    put: 16r1000005;
  63374.         at: #darkCyan        put: 16r1000006;
  63375.         at: #gray            put: 16r1000007;
  63376.  
  63377.         at: #darkGray        put: 16r100000C;
  63378.         at: #red            put: 16r100000D;
  63379.         at: #green        put: 16r100000E;
  63380.         at: #yellow        put: 16r100000F;
  63381.         at: #blue            put: 16r1000010;
  63382.         at: #magenta        put: 16r1000011;
  63383.         at: #cyan            put: 16r1000012;
  63384.         at: #white        put: 16r1000013;
  63385.     
  63386.         shrink)
  63387. !
  63388.  
  63389. stdColor: aSymbol
  63390.     "Answer an instance whose name is aSymbol."
  63391.  
  63392.     ^self withIndex: (StdColours at: aSymbol)
  63393. !
  63394.  
  63395. withIndex: anInteger
  63396.     "Answer an instance whose index is anInteger."
  63397.  
  63398.     ^self basicNew
  63399.         setIndex: anInteger;
  63400.         yourself
  63401. ! !
  63402.  
  63403. !IndexedColor methodsFor!
  63404.  
  63405. = anIndexedColour
  63406.     "Answer true if anIndexedColour is equal to (has the same index as) the receiver."
  63407.  
  63408.     ^self species == anIndexedColour species and: [self index = anIndexedColour index]!
  63409.  
  63410. asIndexedColor
  63411.     "Answer the receiver as anIndexedColour."
  63412.  
  63413.     ^self!
  63414.  
  63415. asParameter
  63416.     "Answer the receiver such that it can be used for an API call."
  63417.  
  63418.     ^index!
  63419.  
  63420. asRGB
  63421.     "Answer the receiver as an RGB using the default palette."
  63422.  
  63423.     ^self asRGBUsingPalette: self defaultPalette
  63424. !
  63425.  
  63426. asRGBUsingPalette: hPalette
  63427.     "Answer the receiver as an RGB using hPalette."
  63428.  
  63429.     | paletteEntry |
  63430.     paletteEntry := PALETTEENTRY new.
  63431.     ^((GDILibrary default
  63432.             getPaletteEntries: hPalette
  63433.             iStartIndex: index
  63434.             nEntries: 1
  63435.             lppe: paletteEntry) == 0)
  63436.         ifTrue: [ GDILibrary default systemError ]
  63437.         ifFalse: [ paletteEntry asColor ]
  63438. !
  63439.  
  63440. hash
  63441.     "Answer the SmallInteger hash value for the receiver."
  63442.  
  63443.     ^index hash!
  63444.  
  63445. index
  63446.     "Answer the receiver's index."
  63447.  
  63448.     ^index!
  63449.  
  63450. printOn: aStream 
  63451.     "Put an ASCII representation of receiver onto aStream."
  63452.  
  63453.     | stdcolor |
  63454.     stdcolor := StdColours keyAtEqualValue: self index ifAbsent: [].
  63455.     aStream
  63456.         nextPut: $(;
  63457.         display: self class name.
  63458.     stdcolor notNil 
  63459.         ifTrue: 
  63460.             [aStream
  63461.                 display: ' stdColor: ';
  63462.                 print: stdcolor]
  63463.         ifFalse: 
  63464.             [aStream
  63465.                 display: ' withIndex: ';
  63466.                 print: self index].
  63467.     aStream nextPut: $)!
  63468.  
  63469. setIndex: anInteger
  63470.     "Private - Set the receiver's index to anInteger."
  63471.  
  63472.     index := anInteger! !
  63473.  
  63474. SystemColor comment:
  63475. ''!
  63476. !SystemColor class methodsFor!
  63477.  
  63478. fromId: anInteger
  63479.     "Answers an instance of the receiver from anInteger system id"
  63480.  
  63481.     ^self basicNew
  63482.         setId: anInteger! !
  63483.  
  63484. !SystemColor methodsFor!
  63485.  
  63486. = aSystemColor
  63487.     "Answer true if aSystemColor is equal to (has the same id as) the receiver."
  63488.  
  63489.     ^self species == aSystemColor species and: [self id == aSystemColor id]!
  63490.  
  63491. asIndexedColor
  63492.     "Answer the receiver as an IndexedColour."
  63493.  
  63494.     ^IndexedColor fromInteger: self asParameter!
  63495.  
  63496. asParameter
  63497.     "Answer the receiver in a form suitable for an API call."
  63498.  
  63499.     ^UserLibrary default getSysColor: self id
  63500. !
  63501.  
  63502. asRGB
  63503.     "Answer the receiver as an RGB"
  63504.  
  63505.     ^RGB fromInteger: self asParameter!
  63506.  
  63507. brush
  63508.     "Answer a Brush configured for solid painting of the receiver's color."
  63509.  
  63510.     ^self brushClass fromId: self id!
  63511.  
  63512. brushClass
  63513.     "Private - Answer the class of Brush to be used in conjunction with the receiver."
  63514.  
  63515.     ^SysColorBrush!
  63516.  
  63517. hash
  63518.     "Answer the SmallInteger hash value for the receiver."
  63519.  
  63520.     ^self id hash!
  63521.  
  63522. id
  63523.     "Private - Answer the system id of the receiver"
  63524.  
  63525.     ^id!
  63526.  
  63527. idName
  63528.     "Private - Answer the Win32Constants name of the receiver"
  63529.  
  63530.     ^((Win32Constants select: [:each | each=self id ]) keys asArray
  63531.         select: [:key | 'COLOR_*' match: key asString ]) 
  63532.             at: 1 ifAbsent: [self id displayString ].!
  63533.  
  63534. printOn: aStream
  63535.     "Put an ASCII representation of receiver onto aStream."
  63536.  
  63537.     aStream
  63538.         nextPut: $(;
  63539.         display: self class;
  63540.         display: ' fromId: ';
  63541.         display: self idName;
  63542.         nextPut: $)!
  63543.  
  63544. setId: anInteger
  63545.     "Private - Set the system id of the receiver"
  63546.  
  63547.     id := anInteger! !
  63548.  
  63549. RGB comment:
  63550. ''!
  63551. !RGB class methodsFor!
  63552.  
  63553. fromInteger: anInteger
  63554.     "Answer an instance whose three component colour values are embedded in anInteger."
  63555.  
  63556.     ^self basicNew
  63557.         setCode: (16rFFFFFF bitAnd: anInteger);
  63558.         yourself!
  63559.  
  63560. initialize
  63561.     "Private - Initialise the map of standard colour names to #(R G B) values."
  63562.  
  63563.     StdColours := ##((IdentityDictionary new: 16)
  63564.         at: #red            put:    #(255 0 0);
  63565.         at: #darkRed        put:    #(128 0 0);
  63566.         at: #blue            put:    #(0 0 255);
  63567.         at: #darkBlue        put:    #(0 0 128);
  63568.         at: #green        put:    #(0 255 0);
  63569.         at: #darkGreen    put:    #(0 128 0);
  63570.         at: #yellow        put:    #(255 255 0);
  63571.         at: #brown        put:    #(128 128 0);
  63572.         at: #magenta        put:    #(255 0 255);
  63573.         at: #darkMagenta    put:    #(128 0 128);
  63574.         at: #cyan            put:    #(0 255 255);
  63575.         at: #darkCyan        put:    #(0 128 128);
  63576.  
  63577.         at: #white        put:    #(255 255 255);
  63578.         at: #gray            put:    #(204 204 204);
  63579.         at: #darkGray        put:    #(128 128 128);
  63580.         at: #black        put:    #(0 0 0);
  63581.         yourself)!
  63582.  
  63583. red: redValue green: greenValue blue: blueValue
  63584.     "Answer an instance whose three component colour values are given."
  63585.  
  63586.     ^self fromInteger: 
  63587.         ((((redValue max: 0) min: 16rFF) asInteger) 
  63588.             bitOr: (((((greenValue max: 0) min: 16rFF) asInteger) bitShift: 8) 
  63589.                 bitOr: ((((blueValue max: 0) min: 16rFF) asInteger) bitShift: 16)))
  63590. !
  63591.  
  63592. stbConvertFrom: anSTBClassFormat
  63593.     "Convert from earlier version models.
  63594.     1: Separate red/green/blue instance variables replaced by a single inst. var in superclass."
  63595.  
  63596.     ^[:data | self red: (data at: 1) green: (data at: 2) blue: (data at: 3)]!
  63597.  
  63598. stbVersion
  63599.     "Answer the current binary filer version number for instances of the receiver."
  63600.  
  63601.     ^1!
  63602.  
  63603. stdColor: aSymbol
  63604.     "Answer an instance whose name is aSymbol."
  63605.  
  63606.     | rgbValue |
  63607.     rgbValue := StdColours at: aSymbol.
  63608.     ^self
  63609.         red: (rgbValue at: 1)
  63610.         green: (rgbValue at: 2)
  63611.         blue: (rgbValue at: 3)
  63612. ! !
  63613.  
  63614. !RGB methodsFor!
  63615.  
  63616. asIndexedColorUsingPalette: hPalette
  63617.     "Answer the receiver as an IndexedColour using hPalette"
  63618.  
  63619.     | index |
  63620.     index := GDILibrary default getNearestPalette: hPalette crColor: self asParameter.
  63621.     ^(index = CLR_INVALID)
  63622.         ifTrue: [GDILibrary default systemError]
  63623.         ifFalse: [IndexedColor withIndex: (index bitOr: 16r1000000)]
  63624. !
  63625.  
  63626. asRGB
  63627.     "Answer the <RGB> colour equivalent to the receiver."
  63628.  
  63629.     ^self!
  63630.  
  63631. blue
  63632.     "Answer the receiver's blue component (a SmallInteger in the range 0..255)."
  63633.  
  63634.     ^code bitShift: -16!
  63635.  
  63636. green
  63637.     "Answer the receiver's green component (a SmallInteger in the range 0..255)."
  63638.  
  63639.     ^(code bitShift: -8) bitAnd: 16rFF!
  63640.  
  63641. printOn: aStream
  63642.     "Put an ASCII representation of receiver onto aStream."
  63643.  
  63644.     aStream
  63645.         nextPut: $(;
  63646.         display: self class;
  63647.         display: ' red: ';
  63648.         print: self red;
  63649.         display: ' green: ';
  63650.         print: self green;
  63651.         display: ' blue: ';
  63652.         print: self blue;
  63653.         nextPut: $)!
  63654.  
  63655. red
  63656.     "Answer the receiver's red component (a SmallInteger in the range 0..255)."
  63657.  
  63658.     ^code bitAnd: 16rFF!
  63659.  
  63660. setCode: anInteger
  63661.     "Private - Set the <integer> value of the ColorRef (i.e. that value passed to API calls
  63662.     to represent the color)."
  63663.  
  63664.     code := anInteger bitAnd: 16rFFFFFF! !
  63665.  
  63666. COMFunction comment:
  63667. 'COMFunction is the generic class of <COMFunctionAbstract> used to represent the majority of COM functions which are forwarded to the implementing <Object> (COM server) rather than the <COMObjectStub> or any other object.
  63668.  
  63669. Instance Variables:
  63670.     selector        <Symbol>. Selector to be forwarded.
  63671.     descriptor        <ExternalDescriptor>. Argument type descriptions.
  63672. '!
  63673. !COMFunction class methodsFor!
  63674.  
  63675. prototype: anExternalMethod
  63676.     "Answer a new instance of the receiver appropriate for dispatching callbacks
  63677.     to the argument, aCompiledMethod (which must be a callback method)."
  63678.  
  63679.     ^self 
  63680.         selector: anExternalMethod selector
  63681.         descriptor: anExternalMethod descriptor!
  63682.  
  63683. selector: aSymbol descriptor: anExternalDescriptor
  63684.     "Answer a new instance of the receiver appropriate for dispatching callbacks
  63685.     with the specified prototype, using the specified message selector."
  63686.  
  63687.     ^self new
  63688.         selector: aSymbol;
  63689.         descriptor: anExternalDescriptor!
  63690.  
  63691. uninitializeBeforeRemove
  63692.     "Private - The receiver is about to be removed from the system."
  63693.  
  63694.     Smalltalk at: #Debugger ifPresent: [:dbg | dbg unskipSelectorsOf: self].
  63695.     super uninitializeBeforeRemove
  63696. ! !
  63697.  
  63698. !COMFunction methodsFor!
  63699.  
  63700. callback: stub interface: aCOMInterface withArgumentsAt: anAddress
  63701.     "Private - Forward a COM virtual function call as a message to the appropriate implementing
  63702.     object stored in the interface, aCOMInterface, with arguments instantiated from memory pointed 
  63703.     at by anAddress, corresponding to the receivers argument types. Answer the result.
  63704.     Implementation Note: This is the normal form of COM dispatch. It isn't necessary to override
  63705.     this, but we do so purely to avoid two message sends for performance reasons."
  63706.  
  63707.     ^aCOMInterface implementor
  63708.         perform: selector 
  63709.         withArgumentsAt: anAddress 
  63710.         descriptor: descriptor
  63711. !
  63712.  
  63713. descriptor
  63714.     "Private - Answer the descriptor object which described the external function represented
  63715.     by the receiver."
  63716.  
  63717.     ^descriptor!
  63718.  
  63719. descriptor: anExternalDescriptor
  63720.     "Private - Set the receiver's external function descriptor."
  63721.  
  63722.     descriptor := anExternalDescriptor!
  63723.  
  63724. selector
  63725.     "Private - Answer the selector sent when the receiver is evaluated."
  63726.  
  63727.     ^selector!
  63728.  
  63729. selector: aSymbol
  63730.     "Private - Record the selector which the receiver will send to the object
  63731.     implementing the COM virtual function when that function is called."
  63732.  
  63733.     selector := aSymbol! !
  63734.  
  63735. UnkAddRefFunction comment:
  63736. 'COMAddRefFunction is a specialized class of <COMFunction> intended to represent the IUnknown::AddRef() method.
  63737.  
  63738. As IUnknown is implemented entirely by the <COMObjectStub>, a COMAddRefFunction sends a #AddRef message to the relevant stub.'!
  63739. !UnkAddRefFunction class methodsFor!
  63740.  
  63741. initialize
  63742.     "Private - Initialize the receiver's class variables.
  63743.         self initialize
  63744.     "
  63745.  
  63746.     Descriptor := IUnknown descriptorClass
  63747.                 callingConvention: IUnknown stdMethodCallType
  63748.                 returnType: 'dword'
  63749.                 argumentTypes: ''!
  63750.  
  63751. uninitialize
  63752.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  63753.  
  63754.     Descriptor := nil! !
  63755.  
  63756. !UnkAddRefFunction methodsFor!
  63757.  
  63758. callback: stub interface: aCOMInterface withArgumentsAt: pArgs
  63759.     "Private - Send an IUnknown::AddRef() call as an #AddRef message back to 
  63760.     the <COMObjectStub>, stub. Answer the resulting reference count.
  63761.  
  63762.     Implementation Note: This method is called very frequently, so we have a special function
  63763.     class just to improve performance."
  63764.  
  63765.     ^stub AddRef!
  63766.  
  63767. descriptor
  63768.     "Private - Answer the descriptor object which described the external function represented
  63769.     by the receiver."
  63770.  
  63771.     ^Descriptor!
  63772.  
  63773. selector
  63774.     "Private - Answer the selector sent when the receiver is evaluated."
  63775.  
  63776.     ^#AddRef! !
  63777.  
  63778. UnkQIFunction comment:
  63779. 'COMQueryInterfaceFunction is a specialized class of <COMFunction> intended to represent the IUnknown::QueryInterface() method.
  63780.  
  63781. As IUnknown is implemented entirely by the <COMObjectStub>, a COMQueryInterfaceFunction sends a #QueryInterface:ppvObject: message to the relevant stub.'!
  63782. !UnkQIFunction class methodsFor!
  63783.  
  63784. initialize
  63785.     "Private - Initialize the receiver's class variables.
  63786.         self initialize
  63787.  
  63788.     N.B. We frequently expect E_NOINTERFACE from QueryInterface() (i.e. it is NOT an exceptional condition),
  63789.     therefore we suppress the automatic exception raising provided by the virtual call primitive for
  63790.     HRESULTs by declaring QueryInterface as returing a signed integer. This must then be tested explicitly.
  63791.     "
  63792.  
  63793.     Descriptor := IUnknown descriptorClass
  63794.                 callingConvention: IUnknown stdMethodCallType
  63795.                 returnType: 'sdword'
  63796.                 argumentTypes: 'GUID* void**'!
  63797.  
  63798. uninitialize
  63799.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  63800.  
  63801.     Descriptor := nil! !
  63802.  
  63803. !UnkQIFunction methodsFor!
  63804.  
  63805. callback: stub interface: aCOMInterface withArgumentsAt: anAddress
  63806.     "Private - Send an IUnknown::QueryInterface() call as a #QueryInterface:ppvObject: 
  63807.     message back to the <COMObjectStub>, stub, with arguments instantiated from the 
  63808.     machine stack at the <integer> address, pArgs, corresponding to the receiver's argument 
  63809.     types. Answer the result."
  63810.  
  63811. "    This is slightly slower since the VM can instantiate the arguments more quickly,
  63812.     which more than makes up for the extra overhead of the indirect invocation via #perform.
  63813.  
  63814.     | va |
  63815.     va := anAddress asExternalAddress.
  63816.     ^aCOMObject 
  63817.         QueryInterface: (REFGUID fromAddress: (va dwordAtOffset: 0))
  63818.         ppvObject: (LPVOID fromAddress: (va dwordAtOffset: 4))
  63819.  
  63820. "
  63821.  
  63822.     ^stub perform: #QueryInterface:ppvObject: withArgumentsAt: anAddress descriptor: Descriptor!
  63823.  
  63824. descriptor
  63825.     "Private - Answer the descriptor object which described the external function represented
  63826.     by the receiver."
  63827.  
  63828.     ^Descriptor!
  63829.  
  63830. selector
  63831.     "Private - Answer the selector sent when the receiver is evaluated."
  63832.  
  63833.     ^#QueryInterface:ppvObject:! !
  63834.  
  63835. UnkReleaseFunction comment:
  63836. 'COMReleaseFunction is a specialized class of <COMFunction> intended to represent the IUnknown::Release() method.
  63837.  
  63838. As IUnknown is implemented entirely by the <COMObjectStub>, a COMReleaseFunction sends a #Release message to the relevant stub.'!
  63839. !UnkReleaseFunction class methodsFor!
  63840.  
  63841. initialize
  63842.     "Private - Initialize the receiver's class variables.
  63843.         self initialize
  63844.     "
  63845.  
  63846.     Descriptor := IUnknown descriptorClass
  63847.                 callingConvention: IUnknown stdMethodCallType
  63848.                 returnType: 'dword'
  63849.                 argumentTypes: ''!
  63850.  
  63851. uninitialize
  63852.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  63853.  
  63854.     Descriptor := nil! !
  63855.  
  63856. !UnkReleaseFunction methodsFor!
  63857.  
  63858. callback: stub interface: aCOMInterface withArgumentsAt: pArgs
  63859.     "Private - Send an IUnknown::AddRef() call as an #AddRef message back to 
  63860.     the <COMObjectStub>, stub. Answer the resulting reference count.
  63861.  
  63862.     Implementation Note: This method is called very frequently, so we have a special function
  63863.     class just to improve performance."
  63864.  
  63865.     ^stub Release!
  63866.  
  63867. descriptor
  63868.     "Private - Answer the descriptor object which described the external function represented
  63869.     by the receiver."
  63870.  
  63871.     ^Descriptor!
  63872.  
  63873. selector
  63874.     "Private - Answer the selector sent when the receiver is evaluated."
  63875.  
  63876.     ^#Release! !
  63877.  
  63878. COMInterfaceFunction comment:
  63879. 'COMInterfaceFunction is now deprecated, having been replaced by UnkAddRefFunction, UnkQIFunction, and UnkReleaseFunction.'!
  63880. !COMInterfaceFunction methodsFor!
  63881.  
  63882. ΓE+79ºähi⌐╜Ö(┼6∩└Ω▐°╓▄╨Σ▓ñplÆÆ╬ovZP╙ç;ÇVP"OIT~≤Å
  63883. JG2π}]Kª»2 ═Qm┬▐⌡«σ╞
  63884. âqM.F╒«z3╝═ÇX╢9╛VcºQóhæ╝WZ;⌡mÉ╨ƒCxá@=└╥┬╢┴Ñ`¢ ÿ₧╙~¡·P¡ sç»o²≡r╬O;╔M▄≡(?╡ç¿+oπ£⌡ìPqí¿∙²σJΦαhN╢⌡╡BrN\nrçú"cFF╠ìY₧⌐\-5MX▀ô)èY╓∙▄¿≡dΘ┐Å┘ë~íδ└Å6
  63885. ┐i≡f⌠╕{╘xZαFÿö¥ì╦Aö╪î¿/₧{┤x÷6╫º∞╫{J\1σy■¥@°╤læXuM#çvoä uα+Z▌▒µX?z]j▐Z╩┌▄űN/ñ∩FææûI┘l_U ░"3Æx₧⌠╓₧N╕▓⌠÷≡é┼b▄^╡èFB-»£╧╩9└╗║╣╚├:cÆö8τ¢⌡Xºφ⌠;├It2ô┌⌡E¥í5òτ⌐\Å█N¡+ ì¬óü?╨ΓÖ?öïOJí╜t»°▌╚üC
  63886. è-Çú╦O|┘┼²Oò≡Ö{/╚╡!!°<1⌐█z\∙{E╕┬»∩▐O╘:¡╡ææ▒╪TU╫cNRÉτ÷Ç|Σªî½║1     ùOC4æÑümGRªgùüVf╦öΓ;▌φ⌠4╧_N┌lb╜Ö╤úz┤jgπ√≈Gq2╩O)=^Z─;¡lºß₧9-▄╟ííGδ÷╤¡f^êf╝VÑPM \═e╗▐≡mXé^ôU6å║;rα ≤φZ╡0z^"Z±~âòτN⌐ε-≡ߺo╒¬ßgíRKY⌡≈╡xε¢║⌡U┼Γ>½g"!!▌î~tº╞w▌ò0║çB╔¥^ÜÿL╨┼½J└sß<2!
  63887.  
  63888. ΦI7)04íî&&¿≤╠+ïπ▐Ω╧Ω║╡╝ⁿ┬╖ZU╛»┼;>e╫É~FƒZ<oWFnO∙ç^Mn#▒yPo½╜%ΦÖQ@∩≡╛ôτⁿÆwJ|'¥ⁿd<╜▌┴WKÉVàgºB┤qòAΦ^0Σ$₧╠^ëOqópôô═┘╬¬vï╤┘■b─ÿ^I▓Swç∞'╤═╜o═Q⌡∙(bφ! !
  63889.  
  63890. DispFunction comment:
  63891. ''!
  63892. !DispFunction methodsFor!
  63893.  
  63894. ΓE+79ºähi⌐╜Ö(┼6∩└Ω▐°╓▄╨Σ▓ñplÆÆ╬ovZP╙ç;ÇVP"OIT~≤Å
  63895. JG2π}]Kª»2 ═Qm┬▐⌡«σ╞
  63896. âqM.F╒«z3╝═ÇX╢9╛VcºQóhæ╝WZ;⌡mÉ╨ƒCxá@=└╥┬╢┴Ñ`¢ ÿ₧╙hεσ_AΓoqç∞'₧╚WεB'îV╫ (lⁿ╔l╤/⌐+╣┘├mP║╜Φ ⌠á┤iR¡σá fCs<ìΩ>bY╟W┘ÅßNne╘ò*Ö\ò⌡Å⌠╝`╟ò¼Σö*░±╧╠{K
  63897. ¿t╝fX≈╝l╬yH¼k⌠ΦÜÇ╠\Ü╪╤∩Cα4·m≤<╚º∞╫dNA4 2╙Σ9dÆ?▀O╦XUJf╞<iâ∩0Σ7êúδS#?Y
  63898. 2û╨≤▌@à≡Of≈ⁿFìçÜT╬#6TI┼░0 }àdÆû▓╗⌐╣⌠┐▌Ä┘L▄Y▓âP[!!«å╧╥:¿q(X┌░ú┘└-1âÆ)τÜ⌡G¿φ╡DΘ-^$è├∙M£∩#ì│┤[ä█i¼,Z├Çâ╚:┴±ä=₧╟Cíát-⌐⌡╘╟îYXI┌6.═▓═^9╧Ç≈D▄τ▄zG▓▌!!    ⁿ+t╡▄~MΘ/∞╠╗∩¥X╚&╖·¥∞╦┤HH▄vZ¥Y⌡╕êH¬Å─íU╡=ZûV6û╢û(S»"¥╘C/àôΓ%▐∩π>öS╞p`║▄ô▓█1wb÷╖ßKy9₧O.tE\à&■%╜╕ç>=╔╩ú╗╞è╣╕jQûjH░~áF^5G▄#≡╜¥>8¿WY«8 çε*hπ╛≤²    ╠UgSK)L╖~ù╪╝Nñ÷<╧BΣ¼x─╖⌡&╧=36Fε∞¿^⌠▄å╠I█≤4■kc ε╚ ╦┴╕Θ^╢┬N╓æüâVÅù∩V╬u h0É8╥ÄD
  63899. =H½µ·⌐⌠*ÑXB=╟⌠*┌┬┌.ëºJ[)`≈s╙n╪ù∩d¼,G2 ╕⌐─δ-[«δ'rMµ╤¥7ÅW╞ß╫.⌠ ,oÅΩút╪┐├íx╡≈Ng6r?│ⁿ║L┬%√╒à±ÄT╞ñ÷u÷äë{Γp₧╩»Ωπ░ìö≡ "╙o╛½    ╟ΣA╔Ω·!!)\;σ
  63900. LM3B╛7▌Dû5X;¥]$L∙Éö1l╕═┌╛_¡ëµ▓:ñvM4iò┐¬Ö ╟╧, ╙Σ█
  63901. QüRlü┬T~╛J½~▓!!í«úDa╣ú{╒╗C╟QL\ñ$Äñδá2í²·¿p║Mó 4∙Séd"c`°µ!!▓¿]ö`üΘ2Ω0∩τæ1╢¥≈FAä┼ê+φ┬a²ε╓#£╛$≥ëq]≥
  63902. SZü[╛Φ╣╛╕┌Y{┬┬lÆ¢╥ô╩°╥{┤µhΣ∞! !
  63903.  
  63904. AXDispatchImpAbstract comment:
  63905. ''!
  63906. !AXDispatchImpAbstract class methodsFor!
  63907.  
  63908. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  63909. σäM&2G¬oi«¬3Θ£/j┼▌▐á▐δçuJf ╙┐b<! !
  63910.  
  63911. !AXDispatchImpAbstract methodsFor!
  63912.  
  63913. ΣV5'¡£"(«¬ä#ï8╗öδ┼φ╟╓╤■≈╜PF»»╔t}╙è@àPVjkCPn▀ÅV<f_ådPo▓é.ⁿ╤/j┴⌡çî■┘
  63914. Æ4@OnÜ╣ í█ÇVKûåg½G÷yÖ∞P[
  63915. 0Φjÿ₧_ÄMy∞)2┼¥╚≤äΘ?╚₧òùp
  63916. ε°CáyJnÆδ2╩╓Qα;─Z╖|ÜqD┴Σ]≥k@µ∩É├TQ½¡²ε╔«√,╕ε╢J`R@h;Çú8tQ┘▀Ü│Pl(F ≥│
  63917. ╕o.ó░╥╖°d¬╫δñ«6╝≡ë▄E6 ⁿh⌠
  63918. 4Oφ╕g╘-LΘF¥Ç¥╬╧Zö╥╨σG┤p¡jφ8╟µ√╘ZOg    9⌠!!û√"u£1æZƒ DQpÅonαæ\½ YêßßX%3LZ▀    ╬╙═GѱN%ÑÑ@æâÉL╫"?
  63919.     _Ç¥NnW°p╫≤╩Æ┴╨ÿÑ╬ç═ÆW┤ìCO⌐üƒ▀)ÑGt
  63920. ⌠¼ΩÄ─1Tàê#╡╚∙Z½≥≥'ä03ö├°⌠ï^ä╡²╫█F¡î╗τ╔;╘πà2é╔'lêñ*|'»Σ±┼ôJ┼.╒╗╧
  63921. 5═⌠∞_Ö╝▄R/╚╡Z═67┐╬]F∞4δ╟╡σ╪¥=▒╡æÆê╙ C[▄v@6⌠5ÅΦσ_∩ïσ¬╣hKìIb#äºÉaíl├ü
  63922. 4\;╣╟ß%╫π╙/╧C╥#.╕╫÷┤╤c>kπ¿τTu'₧G5s┴*∙d¬⌐¬ySó»æ¬P!
  63923.  
  63924. ╞A33+ïë(╖¼ƒp┼8Σ└╞Φφ°┘√┐ á@¡╝╙a]I[╫ùdàXW0@Z^n╢∞t0%aóqVy°δ#╘▀O╗≈╗¥■╦F^¢wW.r▌╕d!!╛└─çùf╛J▓·h╛xB4ΣiÜ╨M▄V|⌐@≈¢╨µ═┤pÇW┼╝ûh&èΓxBîa~æºz₧╓Q≤D=╩^┘│+t≈─l╦M`ÄR█▒Θ-¢£▌═╒*£┤_c¬⌠╢    iJ,c&º.≡86_N]╠à|α╚0JBτ┴╛s&▄░├▒⌡e¿╫δñ≤WÄΩ╟4Å?
  63925. I÷<εgE╠░d┼~ül≈Φ·╡╓Fªû╨ΦQ²>┐oí:╦≤╕▄4GdJP¢^·₧lƒ    ▀[╤ HEmâd ü⌠;ΣJ)_┴ªú:[S#pE┘╩∩ÖH    ÄΣjÑ°MûåÅN┌ec=*xÇ¥NjP√ï╗╓╙⌐⌐▒┐╧ÿïOÿQ│öLR7αÄΓyó$¼oc ╗ΣφÄì eàÅ/│¥ΓQ0╢δ·0├Fb8ª╫εEè≥m╠╡║GÉ╡F«= @ܪ▓╙╒⌠é;àö
  63926.  
  63927. Σ║p,≡┤█σöTWè?'┼║╞D(Φ╠ YÅ╝▄Erò∩:íC^╙╖Kσ7H²╟«╗¥`ç0πΘ╨äß▄ uH╦m\úïÆ⌐N∙█û∙UÑ-E┘RB5╕ó¼i⌠"ù└O|O£ÅΓ9÷ß⌠╙Z█#.éâ▌º█1b/╪ƒ═uL»qSa|Ω├Kêî▓
  63928. pѼ╞▓Fó≤└╢kLJ▐> ╧aMågjA═*α≤£l<¥[X«} ¢⌠~rß·∙√
  63929. ╤^*
  63930. A2Z╓uòè╕│¡P⌐kΣªü«÷>▀}&x²∩¿\∩╕áó≡¼_S°#c3╝ÿ~o▒┼ ñ╝X¬╪SH¢ä[Ü═âüÆY4⌐vD┬)!
  63931.  
  63932. ╞A3.,(íª</╡≤╠#æ6∩╥αî≥╘╓╤Σ▓⌐PJ╗√╨kgAX╘ïdçOP#`]\eƒ├7Tv*J«y]~Γ┐( ₧k$íñºƒπ╠D═S[Zy╩╣D<¿╞ê£çg¿B╡x╨Θ_L1εj╤│3⌡uq∞3▌╒╫╢┬ÑvîMïö╙líτ^@º  u¢»'╟╧ZºH!!╩P╚≥9h÷╔8╤K`├:±╚ïMg≤ºδ╛ß┼₧    Y»σ╝BvO[*rÅτW$yJ╩┴Å│f2L[╔┴.çVBù≥▐¡Φ!!≡▓äìô0íµ█╬2Ei╤ò&yOε┤d┼cOφùÄ¥╬±GÅ╙ƒªcαR ¿n≥6╦≤╕╚`HF/⌠wç (%¥;£O╙tÄicà╗<≡J5Y┌»µC%?NC>╗p╖ò K└αP+ñ∞Lî╒ïO▀8xTOQ╠ 0C.ä|ç⌠╩╞Ná╡≥╖╟é╤Zÿ¡üHT!!▓╥ü╞/╛.& ≤╖úÄ¿Uç¢>ªà⌡@╢╣°(ìr2MÄ╘≤R£σp┬τ⌡RÿöJπ╨√τ╔,▌α┘|√φ'lê¿Ot-₧²ÿ╫°s8T┌."╬▒╠
  63933. *╩╠δO╞ª╠'/╚╡:ß 2╡₧)¬k±┬£α╤H╪oπ╬«Ñêε/yyµF/╖r┬▌°zXç±Ñ┤é!!    X─5Æ¿ä( ½Kù╟ML/êÄπw╤Φ╬4╙òBPìαπâ(√N[C├û┴hHÑzR|ßñ%¿▓º6,╔╦¬╢G╣«╜╒OÉjE·J:┐TB!!VàkΘ║«wG3ÑKY»6rΓ╟.i╥≈░╔▄hoJ"₧OóºÆ%!
  63934.  
  63935. ╞A3.,(íª</╡èâ?ï+╗ö∞├δ┘╦╕╘¢τzN»╖┼vvFBÆÉ6W╫v`#}KR ■█D~c2{║lVC¼¡/┘╤W╝ ■▐■┴àr_k ▄⌐c1║└╧W°|■|╟käXú4╨e6≥p¢▌XÉN4ï(τï╙≤σ«uç.ÉÄ¥hG├¢>-╦[nû╥s╦╤LεF!!╔[ܲ9+╣╫{╓K`╞0°ç┴)▐─æ²∩ªα J╕∞ºX%UP`rÜ≤I_Ω╪₧∩4U}σ«Γ!
  63936.  
  63937. Φ@453Ñé7:αΘì$ñ-≤╒÷îΘ▀┌█ɲ▒xM░¼╬!!3MN╫ç;BâVK$FZ]o≤ôs3dn¡oDo░δ!!║éQ╣ó▓É⌠╩,ÆuZll▀ƒb>ó╠├MAÜ═Vz¿ΩN¥≡]f,ΣcÜ╠▄@qÑ;ôå╦≤îñz¢₧ÅÉtOº⌡D)╚    }┬Ω2▌╫ΦGo╪W▀V»?d°├y└Nk≤+ú╒ìC*≤á∙≤σΦ²n¡Φ╖JwA@c<ÜJ┐6"cNIù[ìäÇK=Z╖δF«LÜσ╨¼∙!!≡▓äì╞3║φ╚╞
  63938. ╜~≡
  63939. *ó┤q├hK°æÅ╗Å╤Lù╙╫¬≥"·nα0═º≈┘ZRaJFG<ⁿ2Ç╖:mÿ7ù#╡q@Pf╞noÖ╗'µ    *[╞½ⁿR5tt╗p╖∞╩A
  63940. åúO?╡ⁿE₧åîu█?(_N╦≥-4àu■!
  63941.  
  63942. ╚J1>=■╧6 ⌐╣à.┼-Φ▌δû╛┼╓▄║▓⌐PJ╗ßÇwpARÆô^ûXWp.Lug±Æ^Ib/\│lRxúª3á₧R$íñº«÷▌ä4NorΦ╣~'ó▌ÜXúü$p╜V║i╨∙IL (ΦjÖ╤▄RQ┤9├╗═≡├αc¥,ì£╢n⌠▒GQâr^ɲ^┤╢╬L?└Z╫²9!!φ╧}éPo╫ÿ°èWd▓║√÷║\ü·vS▓σ·CBlHAt4Å    µW6dAS▌┬─╠3N\╓ä"ÄTùΣ╪╖≥!!╩╡ò╚└~éµë└ pRñl≡wV÷╜pÇ~Nⁿæôç╬╥]ù┬╠÷N±R<╗eµ&─α²╠Vz@F^8▒>ö∙"wötïF┌XMM`çle═≥1¡HH6Ñ╚åKq2XYb╗p╖┐│-=£ú]$ñΦLì╒₧U┘?xQR┴░8nW°.╡ε╤▐
  63943. ∞«∙│ïè┘XëUÑèQ%▓ÇÄ
  63944. ïgφmv ≥│╣╘└wÿêl╜ìΓ[QÑδⁿiÇAc2OΩ╣|┤Aïµ4╠²αÜ┐N░(/濬╥i╥╤é9à╬
  63945. [╝⌠_$I└¥▒┬ô-CQ╧`k√╢╤M/ïÜú
  63946. ▀«╒T/╚╡Zε5╢═q¬V.æ¡╙┌┴╧2╡⌠éåß┴r,5░\ê]⌠ ÇK¬ïΦ¡ªHÿVUfàúöi]├≡¿+}ÿ╟╜jÿ╧≥)▄█|yπÖ╥┤▌?Å╥ìh8ÄAt}╨(σqΘ╡ÿw=╟├╜íGδß┬╕zRèwX╝QuΘPV$V▄?ⁿ╖┌j!!╣N╜lì╝~tε ■¿╦IG)O╖eÖ¥ñNí±8âΓ░~─ªτeíRK'εΣ½Xε¢∩ⁿ_æ╢pu`ÿNJF╟╥lg░╥E≈æ3╫δz(▓ò\ëäïæ⌡WX╤y▒8(╔p╞├f[bh≈Öƒ╥Ä═#Fo╦á0ôÉ┌,₧íVh%k▐5╖y?┤├┌6¿&Vg'╡∞¡≈>E░δ|/ΩÉçyèH└π▀-║gSΘ∙1óf═óQì⌡6í▓Z NS╘ü└(ªZα╓ü,╡┘╤≈Σy▓∩Ωç}╪╔╗∙╛¥≡M≥ÿΣq║ ─╥a║≡@╪≡{⌠KV8úVYAM5FÑ|ó6w█CX
  63947. Çu??TΦ┬å|⌠┼ôe¿xó Ñ▒Γ▒MQcöπµ╓Φ╩5NΣ%îb┴ Q⌐[½öS}ò╫y╕7┤½▓C+╤█╖└j⌠ejë¬ïª,,┌^z¼_▓═·▀6ª4ç3Æp    £èF╧Ç&à"ü⌠1~ä]öïδ*Σ░╟rh■⌐Ç(╛¼säô░X»ù%σê}]▀TEÆr╨è┘~░Σ╝\~┬╫?╓═¥┼ìPÑÆ?φ╧MèâÄ╛╬*Sa=ìQ¡)4σΩ½¬|ƒ┼%⌐k±"|ßΓrⁿ╠▄α≥╛·ÿia╩T≥*Nåt!
  63948.  
  63949. ΦJ1>=ìïhi╛áƒ:î;í╥π═∙─àò╜≤⌐_wª½┼]IQ┴─)[âWe8iN^nΓÆDg4HénAk╗╞Jô£k╛╕╝¢╖█╫f[ki╠╣u╜ë═\\¥ùVbºW╛=╠≥EJ=≤:▀┌PÅRu╕4ô¢╟║îñz¢ûƒ▀<á⌡P¬eJ'ú²!!▀╞ºN)í5│Jσ,s≡╞v╓aa═/░╚èFx╢≡╕ ≥╜∙eR¡≤■JwAtt3ùDízZ%9≈╚îßJx>@@█Æ<╣_å ▀½⌡cφ╢ê┘â!
  63950.  
  63951. ∩K33!!Çå!!9╗╜Å"á-≤█²û╛╓╤≡¼α¬A╢╡╓txAX╒▐~V₧LT#jr]
  63952. ±ä 4 OônZ|ú┐%║ô!!ª≈▓îσ└^ÿw]{r╚╣ir¬└╙IIü¢{⌐░oƒ ╝xA7Ωa╫ù▄L{╕    :╩╥╫■╔α`ìîÆ£rA├¢>gúnJyç»<╚┌M⌡H+╚Z╘V±4!!Ω╥z┴No╙,┤╧├P|▓║╕ΘΘá┤tS∙≤ºwCF&7£∞#1L_─┴₧ñUt|PC╖δFƒRé░┼░∙xñ╗ô╚┌1╗∩╨I▌'╣x╝u\Θ±}╧-OΣ▐éÆé╙MëÜàεMπ&┐yí:╤º±╠ZSzJ\1▒1£σmaö6èI╪OE∞    pÿΘ%∞ Oê╢α3?
  63953. |┌₧╞╓Å∞Wj╛±    ₧╒êF╥':QCé°!!8▀.·æ╡╕gé╡σ┐═é╚^êQ»èE-º£Äæjσ%C
  63954. Θ▒óÄ┴6bç¢8ñÇ∙ZΣ≡ a╞1t]╓â╜    ├íw╔⌠±îëH«xZT─Θ╩½@╕Ö∙WÉêX αá8m0ó«ÿ╧£
  63955. AM╬%╘▓─O.ï¡ö#⌡Å⌡+╡╒'▓n5┤√fZσ)≡╓┐≥╚W╔u╬ƒ∙Φ╚┤v/K╨p▐]Φ▌╥U°█▄╢╕<zïRH!!╫╔Φb{z╟ Ä╚V5Oÿéδ1ÿ■≥2╙ ~┴kg╖▐ÜΦz┤!
  63956.  
  63957. ≥Q7
  63958. :*░è6┤╜ë8â>Γ╤ⁿíö╛¥⌠░ß▓VQ »╚~3[S╞─1T╫VJ>kIUj ≤┴Ug5\ªoy╖╗0⌡╠V¼≈╡ç╖█╫f[ki╠╣|∞ñ¬4"ⁿ(▓g»Z÷jÖ⌠  ΦwÅ▀MƒJ!
  63959.  
  63960. ⌡]76óÇhi╢¬à.┼6τ·α┬√ìƒ╨ª±áCW╢┤╬SrFR▐ü,?²6|REj≤┴SG(\┤yA*úÑ`ª≈v╕▓₧ɱ└B^ÿzfeÜ¿t"½ë╔WNÜ₧aºL╕=ûε[1≥$¢╫JîKz╕.╒ô└≤Ç═ßì█ÜzOá■YAΓi;â∙2╫╙^σM*îK╥│?dΩ╥t╓a╞┤╩éHa▓║±≡τF╝ⁿeσε╗aOV=g>¢ ß/╠╬Ü╡Pb2kM╘à#ÄHL╘¥╗╒û┌┐Ö╬ƒ.íΩ╞τ9«<ΩxJτ!
  63961.  
  63962. ⌡]76óÇ&»ºÿG∩Vú⌡ß▀Θ╥═ò∩▓¼U½ó╨~3AX╘ï,_ûKM%`ZxO≈ùPj'M»y*ºº3 ₧NΩ┌▌≤¥ª"N! !
  63963.  
  63964. COMClassFactory comment:
  63965. 'COMClassFactory is Dolphin''s standard implementation of IClassFactory. It can serve up instances of a particular coclass (possibly also a subclass of COMInterfaceImp), and having been registered once for any paricular coclass it will re-register the availability of that coclass with COM each time that Dolphin is started.
  63966.  
  63967. Subclasses can provide specialized services to support coclasses with particular instantiation requirements, and they can even implement alternative class factory interfaces (contrary to common believe IClassFactory is not mandatory).
  63968.  
  63969. Instance Variables:
  63970.     serverClass     - the coclass <object>. Any class which exposes COM interfaces.
  63971.     clsid         - the <CLSID> of the coclass.
  63972.     registration    - <integer> cookie supplied by COM to identify a coclass registration so that it can subsequently be revoked.
  63973.  
  63974. Class Variables:
  63975.     Factories         - previously set up <COMClassFactory> instances which, in a running image, will be registered with COM.
  63976.     Instances        - a <WeakSet> containing all outstanding instances of all registered coclasses. Used to control server lifetime.
  63977.     LockCount    - <integer> lock count reflecting calls to LockServer().
  63978. '!
  63979. !COMClassFactory class methodsFor!
  63980.  
  63981. basicOn: serverClass clsid: aCLSID
  63982.     "Private - Answer an instance of the receiver for the specified server class and CLSID."
  63983.  
  63984.     ^self new
  63985.         serverClass: serverClass;
  63986.         clsid: aCLSID!
  63987.  
  63988. canUnloadNow
  63989.     "Private - Answer whether the COM factory server is no longer in use, and can therefore
  63990.     be unloaded (according to COM rules)."
  63991.  
  63992.     ^LockCount <= 0 and: [Instances isEmpty]!
  63993.  
  63994. clearAll    
  63995.     "Private - Clear down all registered instances of the receiver."
  63996.  
  63997.     Factories do: [:f | f clear]!
  63998.  
  63999. decrementLockCount
  64000.     "Private - Increment the server lock count."
  64001.  
  64002.     LockCount := LockCount - 1.
  64003.     LockCount <= 0
  64004.         ifTrue: [self shutdownIfDead]
  64005. !
  64006.  
  64007. freeAll
  64008.     "Private - Free all the existing class factories (revoking registrations
  64009.     and removing them from the registry of factories)."
  64010.  
  64011.     self initializeFactoryRegister!
  64012.  
  64013. incrementLockCount
  64014.     "Private - Increment the server lock count."
  64015.  
  64016.     LockCount := LockCount + 1
  64017. !
  64018.  
  64019. initialize
  64020.     "Private - Initialize the receiver's instance variables.
  64021.         COMClassFactory initialize
  64022.     "
  64023.  
  64024.     LockCount := 0.
  64025.     self initializeFactoryRegister.
  64026.     Instances := WeakSet new.
  64027.     Instances when: #elementsExpired: send: #onElementsExpired: to: self!
  64028.  
  64029. initializeFactoryRegister
  64030.     "Private - Initialize the receiver's Factory register."
  64031.  
  64032.     Factories isNil ifFalse: [self revokeAll].
  64033.     Factories := LookupTable new!
  64034.  
  64035. lockCount
  64036.     "Answer the total class factory lock count (locks result from calls to IClassFactory::LockServer)."
  64037.  
  64038.     ^LockCount!
  64039.  
  64040. on: aServerClass
  64041.     "Answer an instance of the receiver registered as a class factory for
  64042.     manufacturing instances of aServerClass."
  64043.  
  64044.     ^self on: aServerClass clsid: aServerClass clsid!
  64045.  
  64046. on: serverClass clsid: aCLSID
  64047.     "Answer an instance of the receiver for the specified server class and CLSID."
  64048.  
  64049.     | factory |
  64050.     Factories at: serverClass ifPresent: [:f | ^f].
  64051.     factory := self basicOn: serverClass clsid: aCLSID.
  64052.     factory register.
  64053.     ^Factories at: serverClass put: factory!
  64054.  
  64055. onElementsExpired: anInteger
  64056.     "Private - At least one of server instances created by instances of the receiver has died.
  64057.     We handle this notification by determining if it is now possible to shut down the server
  64058.     (if opened for embedding only)."
  64059.  
  64060.     self shutdownIfDead!
  64061.  
  64062. onExit
  64063.     "Private - The system is shutting down. Revoke all known class factories.
  64064.     N.B. This event is sent by COMInterface, rather than being registered with
  64065.     SessionManager, because the order of shutdown is important."
  64066.  
  64067.     self revokeAll!
  64068.  
  64069. onStartup    
  64070.     "Private - The system is starting. Register all known class factories."
  64071.  
  64072.     LockCount := 0.
  64073.     Factories do: [:f | f clear].
  64074.     SessionManager current isDLL ifFalse: [self registerAll].
  64075. !
  64076.  
  64077. registerAll
  64078.     "Private - Register all the existing class factories.
  64079.     We register the receiver with the session as a 'server' to keep the image
  64080.     alive if required. This server registration will be revoked when the Instances
  64081.     weak collection is empty (collection of instances created by instances of the 
  64082.     receiver) and the LockCount drops to zero. This implements the COM Class Factory
  64083.     server lifetime rules."
  64084.  
  64085.     Factories isEmpty ifFalse: [
  64086.         Factories do: [:f | f register].
  64087.         SessionManager current registerServer: self ].
  64088.  
  64089. !
  64090.  
  64091. revokeAll
  64092.     "Private - Revoke all the existing class factories."
  64093.  
  64094.     Factories do: [:f | f revoke]
  64095. !
  64096.  
  64097. revokeOn: serverClass
  64098.     "Answer an instance of the receiver for the specified server class and CLSID."
  64099.  
  64100.     (Factories at: serverClass ifAbsent: [^self]) revoke!
  64101.  
  64102. shutdownIfDead
  64103.     "Private - Shutdown the class factory as it is no longer required."
  64104.  
  64105.     self canUnloadNow ifTrue: [SessionManager current unregisterServer: self]!
  64106.  
  64107. unregister: serverClass
  64108.     "Revoke and unregister any class factories for the specified server class."
  64109.  
  64110.     | f |
  64111.     f := Factories removeKey: serverClass ifAbsent: [^self].
  64112.     f revoke! !
  64113.  
  64114. !COMClassFactory methodsFor!
  64115.  
  64116. basicFree
  64117.     "Private - clean up external resources held by the receiver."
  64118.  
  64119.     self revoke.
  64120.     SessionManager current unregisterServer: self!
  64121.  
  64122. clear
  64123.     "Private - Clear down any external resource handles held by the receiver."
  64124.  
  64125.     registration := nil!
  64126.  
  64127. clsid
  64128.     "Answer the CLSID which identifies the receiver's server class in the registry."
  64129.  
  64130.     ^clsid!
  64131.  
  64132. clsid: aCLSID
  64133.     "Private - Record the CLSID which identifies the receiver's server class in the registry."
  64134.  
  64135.     clsid := aCLSID!
  64136.  
  64137. createInstance: pUnkOuter
  64138.     "Private - Answer a new instance of the Smalltalk class the receiver represents,
  64139.     with the specified controlling unknown: A subclass may choose to use pUnkOuter
  64140.     for some purpose, but the standard framework doesn't pay it any heed here since
  64141.     COMObjectStub implements a delegating unknown when aggregated into an outer
  64142.     object."
  64143.  
  64144.     ^serverClass new!
  64145.  
  64146. CreateInstance: pUnkOuter riid: riid ppvObject: ppvObject 
  64147.     "Private - Implement IClassFactory::CreateInstance().
  64148.     Manufacture an object of the receiver's server class, answering an interface
  64149.     of the specified IID on it through ppvObject. ppvObject is nulled if an
  64150.     error occurs.
  64151.     Answers an HRESULT with success/failure value as appropriate.
  64152.     E_NOINTERFACE is returned if the requested interface is not recognised or is
  64153.     not implemented by instances of the receiver's server class."
  64154.  
  64155.     | object pUnk interfaceClass inst |
  64156.     ppvObject value: 0.
  64157.     interfaceClass := COMInterface classForIID: riid ifNone: [^E_NOINTERFACE].
  64158.     [inst := self createInstance: pUnkOuter] 
  64159.         on: Error do: [:e | ^e hresult asInteger].
  64160.     pUnk := pUnkOuter yourAddress isNull
  64161.         ifTrue: [inst queryInterface: interfaceClass ifNone: [^E_NOINTERFACE]]
  64162.         ifFalse: [
  64163.             "Aggregation request"
  64164.             riid = IUnknown iid ifFalse: [^E_NOINTERFACE "must request IUnknown when aggregating"].
  64165.             IUnknown on: inst outerUnknown: pUnkOuter].
  64166.     ppvObject value: pUnk detach.
  64167.     self registerInstance: inst.
  64168.     ^S_OK!
  64169.  
  64170. CreateInstanceLic: pUnkOuter pUnkReserved: pUnkReserved riid: riid bstrKey: bstrKey ppvObject: ppvObject
  64171.     "Implement the IClassFactory2::CreateInstanceLic() interface function."
  64172.  
  64173.     ^self CreateInstance: pUnkOuter riid: riid ppvObject: ppvObject
  64174. !
  64175.  
  64176. free
  64177.     "Free any external resources/and or references."
  64178.  
  64179.     | factory |
  64180.     factory := Factories at: serverClass ifAbsent: [].
  64181.     factory == self ifTrue: [
  64182.         Factories removeKey: serverClass.
  64183.         self basicFree].!
  64184.  
  64185. GetLicInfo: getLicInfo
  64186.     "Implement the IClassFactory2::GetLicInfo() interface function.
  64187.     Implementation Note: Licensing is not supported by this class factory."
  64188.  
  64189.     getLicInfo value: 0.
  64190.     ^E_UNEXPECTED!
  64191.  
  64192. LockServer: aBoolean
  64193.     "Private - Implement IClassFactory::LockServer - not intended for internal use.
  64194.     (Un)Lock the server in memory (depending on aBoolean).
  64195.     Answers an HRESULT indicating success/failure."
  64196.  
  64197.     aBoolean 
  64198.         ifTrue: [self class incrementLockCount ]
  64199.         ifFalse: [self class decrementLockCount].
  64200.     ^S_OK!
  64201.  
  64202. printOn: target
  64203.     "Append, to the <puttableStream>, target, a string whose characters are a 
  64204.     the same as those which would result from sending a #printString
  64205.     message to the receiver."
  64206.  
  64207.     target
  64208.         basicPrint: self;
  64209.         nextPutAll: ' for ';
  64210.         print: serverClass!
  64211.  
  64212. register
  64213.     "Private- (Re)Register the receiver with OLE as a local server class object (any existing
  64214.     registration is revoked)."
  64215.  
  64216.     | iClassFactory dwCookie |
  64217.     self revoke.                            "revoke any existing registration"
  64218.     dwCookie := DWORDBytes new.
  64219.     iClassFactory := IClassFactory on: self.
  64220.     [OLELibrary default
  64221.         coRegisterClassObject: clsid
  64222.         pUnk: iClassFactory asParameter
  64223.         dwClsContext: CLSCTX_LOCAL_SERVER    "Only context currently supported"
  64224.         flags: REGCLS_MULTIPLEUSE            "We can support multiple classes"
  64225.         lpdwRegister: dwCookie
  64226.     ] ensure: [
  64227.         registration := dwCookie asInteger.
  64228.         iClassFactory free]!
  64229.  
  64230. registerInstance: anObject
  64231.     "Private - Register the newly created instance, anObject. The instance registers
  64232.     is used to determine when server shutdown is possible (it is weak, so it will empty
  64233.     when there are no more instances)."
  64234.  
  64235.     Instances add: anObject
  64236.  
  64237.     !
  64238.  
  64239. RequestLicKey: dwReserved pBstrKey: pbstrKey
  64240.     "Implement the IClassFactory2::RequestLicKey() interface function.
  64241.     Implementation Note: Return E_NOTIMPL to indicate that this class factory does not support licensing."
  64242.  
  64243.     pbstrKey value: 0.
  64244.     ^E_NOTIMPL!
  64245.  
  64246. revoke
  64247.     "Private - Revoke the receiver's COM class object registration."
  64248.  
  64249.     registration notNil ifTrue: [
  64250.         OLELibrary default coRevokeClassObject: registration.
  64251.         registration := nil]!
  64252.  
  64253. serverClass
  64254.     "Private - Answer the class for which the receiver is acting as a factory."
  64255.  
  64256.     ^serverClass!
  64257.  
  64258. serverClass: aClass
  64259.     "Private - Record the class for which the receiver is acting as a factory."
  64260.  
  64261.     serverClass := aClass!
  64262.  
  64263. supportedInterfaces
  64264.     "Answer the set of interface classes supported by the receiver."
  64265.  
  64266.     ^#(##(IClassFactory))! !
  64267.  
  64268. COMEnumerator comment:
  64269. 'COMEnumerator is Dolphin''s generic implementation of COM enumerators, i.e. IEnumXXXX. It can enumerate over any sequenceable collection of externally representable objects.
  64270.  
  64271. Instance Variables:
  64272.     enumClass    <IEnumXXXX>
  64273.     contents        <ReadStream>
  64274.  
  64275. '!
  64276. !COMEnumerator class methodsFor!
  64277.  
  64278. newEnumerator: enumClass on: sequence
  64279.     "Answer a new COM interface which is an instance of the <IEnumXXXX> subclass, enumClass,
  64280.     onto a new instance of the receiver that enumerates over the contents of the     <sequencedReadableCollection>, sequence."
  64281.  
  64282.     ^self newEnumerator: enumClass onStream: sequence readStream!
  64283.  
  64284. newEnumerator: enumClass onStream: stream
  64285.     "Answer a new COM interface which is an instance of the <IEnumXXXX> subclass, enumClass,
  64286.     onto a new instance of the receiver that enumerates over the <gettableStream>, stream."
  64287.  
  64288.     ^self new
  64289.         setEnumClass: enumClass contents: stream;
  64290.         queryInterface: enumClass! !
  64291.  
  64292. !COMEnumerator methodsFor!
  64293.  
  64294. arrayBufferAt: buf length: count
  64295.     "Private - Answer a suitable <ExternalArray> wrapping the buffer at <ExternalAddress>,
  64296.     buf, of <integer> length, count."
  64297.  
  64298.     ^StructureArray fromAddress: buf length: count elementClass: enumClass elementClass.
  64299. !
  64300.  
  64301. Clone: ppEnum 
  64302.     "Implement the IEnumXXXX::Clone() interface function, i.e.
  64303.     answer a copy of the receiver, via the output IEnumXXXX**
  64304.     argument, ppEnum, that enumerates over the same collection
  64305.     but which has an independent stream position."
  64306.  
  64307.     | iEnum |
  64308.     iEnum := self class newEnumerator: enumClass on: contents contents.
  64309.     "We must detach the temporary interface to prevent automatic Release()
  64310.     of the new EnumRect on finalization of iEnum"
  64311.     ppEnum value: iEnum detach.
  64312.     ^S_OK!
  64313.  
  64314. copyElements: buf length: count
  64315.     "Private - Copy up to <integer>, count, elements from the receiver's contents
  64316.     into the buffer at <ExternalAddress>, buf. Answer the number of elements
  64317.     copied."
  64318.  
  64319.     | array copied |
  64320.     array := self arrayBufferAt: buf length: count.
  64321.  
  64322.     copied := 0.
  64323.     [copied < count and: [contents atEnd not]] whileTrue: [
  64324.         array at: (copied := copied + 1) put: self nextElement].
  64325.  
  64326.     ^copied!
  64327.  
  64328. Next: celt rgelt: rgelt pceltFetched: pceltFetched
  64329.     "Implement the IEnumXXXX::Next() interface function,
  64330.     i.e. copy up to the next <integer>, celt, elements from the
  64331.     receiver's stream into the buffer at <ExternalAddress>,
  64332.     rgelt, answering the number of elements actually copied
  64333.     there via the DWORD* output argument, pceltFetched."
  64334.  
  64335.     | results count |
  64336.     pceltFetched yourAddress isNull
  64337.         ifTrue: [celt ~= 1 ifTrue: [^S_FALSE]]
  64338.         ifFalse: [pceltFetched value: 0].
  64339.  
  64340.     (rgelt isNull or: [contents atEnd])
  64341.         ifTrue: [^S_FALSE].
  64342.  
  64343.     count := self copyElements: rgelt length: celt.
  64344.  
  64345.     pceltFetched yourAddress isNull ifFalse: [pceltFetched value: count].
  64346.  
  64347.     ^S_OK!
  64348.  
  64349. nextElement
  64350.     "Private - Answer a copy of the next element of the receiver."
  64351.  
  64352.     ^contents next.!
  64353.  
  64354. Reset
  64355.     "Implement the IEnumXXXX::Reset() interface function."
  64356.     
  64357.     contents reset.
  64358.     ^S_OK!
  64359.  
  64360. setEnumClass: class contents: stm
  64361.     "Private - Initialize the receiver's instance variables."
  64362.  
  64363.     enumClass := class.
  64364.     contents := stm.!
  64365.  
  64366. Skip: cSkip
  64367.     "Implement the IEnumXXXX::Skip() interface function,
  64368.     i.e. skip backwards or forwards over the stream of elements."
  64369.  
  64370.     | result |
  64371.     result := S_OK.
  64372.     [contents skip: cSkip] on: BoundsError do: [:e | result := S_FALSE].
  64373.     ^result
  64374. !
  64375.  
  64376. supportedInterfaces
  64377.     "Answer the set of interface classes supported by the receiver.
  64378.     This will vary on a per-instance basis."
  64379.  
  64380.     ^Array with: enumClass! !
  64381.  
  64382. EnumRECT comment:
  64383. 'EnumRECT is a sample implementation of the generic COM enumeration interface, IEnumXXX, specialized to enumeration RECT (rectangle) structures.'!
  64384. !EnumRECT class methodsFor!
  64385.  
  64386. initialize
  64387.     "Private - Initialize the receiver's class variables."
  64388.  
  64389.     CRECTS := 15!
  64390.  
  64391. new
  64392.     "Answer a new initialized instance of the receiver."
  64393.  
  64394.     ^super new initialize! !
  64395.  
  64396. !EnumRECT methodsFor!
  64397.  
  64398. Clone: ppEnum 
  64399.     "Implement the IEnumXXXX::Clone() interface function.
  64400.     See: Inside OLE2, Kraig Brockschmidt, Microsoft Press.
  64401.     N.B. For clarity this is a fairly direct port of Kraig's 
  64402.     code to Smalltalk, and doesn't really implement the Clone()
  64403.     function correctly (Clone() should return a cloned enumerator
  64404.     over the same collection, not a separate but equal collection)."
  64405.  
  64406.     | enum iEnum |
  64407.     enum := self class new.
  64408.     iEnum := enum queryInterface: IEnumRECT.
  64409.     "We must detach the temporary interface to prevent automatic Release()
  64410.     of the new EnumRect on finalization of iEnum"
  64411.     ppEnum value: iEnum detach.
  64412.     ^S_OK!
  64413.  
  64414. initialize
  64415.     "Initialize the array of rectangles."
  64416.  
  64417.     m_iCur := 0.
  64418.     m_rgrc := StructureArray length: CRECTS elementClass: RECT.
  64419.     (0 to: CRECTS-1) with: m_rgrc do: [:i :rect |
  64420.         rect
  64421.             top: i;
  64422.             left: i*2;
  64423.             bottom: i*3;
  64424.             right: i*4]!
  64425.  
  64426. Next: next rgelt: rgelt pceltFetched: pdwRects 
  64427.     "Implement the IEnumXXXX::Next() interface function.
  64428.     See: Inside OLE2, Kraig Brockschmidt, Microsoft Press.
  64429.     N.B. For clarity this is a fairly direct port of Kraig's 
  64430.     code to Smalltalk, and is certainly not the simplest or
  64431.     most efficient way to copy back a range of elements."
  64432.  
  64433.     | cRect cRectReturn prc |
  64434.     cRectReturn := 0.
  64435.     cRect := next.        "can't assign to args in Smalltalk"
  64436.     pdwRects yourAddress isNull
  64437.         ifTrue: [cRect ~= 1 ifTrue: [^S_FALSE]]
  64438.         ifFalse: [pdwRects value: 0].
  64439.  
  64440.     (rgelt isNull or: [m_iCur >= CRECTS])
  64441.         ifTrue: [^S_FALSE].
  64442.  
  64443.     prc := StructureArray fromAddress: rgelt length: cRect elementClass: RECT.
  64444.  
  64445.     [m_iCur < CRECTS and: [cRect > 0]] whileTrue: [
  64446.         cRectReturn := cRectReturn + 1.
  64447.         m_iCur := m_iCur + 1.
  64448.         prc at: cRectReturn put: (m_rgrc at: m_iCur).
  64449.         cRect := cRect - 1].
  64450.  
  64451.     pdwRects yourAddress isNull ifFalse: [pdwRects value: cRectReturn].
  64452.  
  64453.     ^S_OK!
  64454.  
  64455. Reset
  64456.     "Implement the IEnumXXXX::Reset() interface function.
  64457.     See: Inside OLE2, Kraig Brockschmidt, Microsoft Press."
  64458.  
  64459.     m_iCur := 0.
  64460.     ^S_OK!
  64461.  
  64462. Skip: cSkip
  64463.     "Implement the IEnumXXXX::Skip() interface function.
  64464.     See: Inside OLE2, Kraig Brockschmidt, Microsoft Press."
  64465.  
  64466.     m_iCur+cSkip >= CRECTS
  64467.         ifTrue: [^S_FALSE].
  64468.  
  64469.     m_iCur := m_iCur + cSkip.
  64470.     ^S_OK
  64471. !
  64472.  
  64473. supportedInterfaces
  64474.     "Answer the set of interface classes supported by the receiver."
  64475.  
  64476.     ^Array with: IEnumRECT! !
  64477.  
  64478. OLELockBytesAbstract comment:
  64479. 'OLELockBytesAbstract is an abstract superclass which provides common behaviour for implementations of the OLE Structured Storage <ILockBytes> interface. <ILockBytes> is the abstraction used by OLE to represent an array of bytes.
  64480. '!
  64481. !OLELockBytesAbstract methodsFor!
  64482.  
  64483. ΓK)06░£_C╙δ¡$û(Σ╞»╪÷╥ƒ╓▒ⁿ▒VM½¿ÇtuB┌ü~@Æ\A#x^A+GΓëd?[ª<Rx░¬9│£/j┼▌▐áΣ╩╫gKml█»~½┌╨VFåæyºW»!
  64484.  
  64485. ΓK7!!░è!!┤╜âp┼=⌠╥»╩∞╪╥Å■ß▒RQ½√╘t)S▄ÇS8■t8gMR
  64486. ╢╠^zi6Vπh[oΓ╣!!⌠┘G@º▒≈£ε█╫rLc ╬┤hr╝╠├\AâüVf║BñiÖ√Nx⌡lÜ₧VÆG9«/╓û«£ÑⁿzåÜ£ûnQε■QB▒e7┬ⁿ'▀═K½;├╬÷mn≈┬5└C}┼;±ÇèJ`╢⌐²∞╛Fº≥fO╝⌠■JkBKo<Üú8t δ┘½│Kl%!!░ΦgäHB¢⌡▄╖εxñ¬Ä─ö*░τë█E5R▓<á*lKτúg┴azΦîäÇ¥ü╫û╟≤D║Z╙J∩ ╥ΓΩƒNl\0≤2ü╖"c╤6åZ┌ UkÅch═∞0±e]╦╢·V=6SY}┘
  64487. ╫╫▌
  64488. Dφë1@▐┴ZÜÖÖ═9:SL╤π.ücÖΦ╤╨á│σ»!
  64489.  
  64490. ╟H2    =U╬µp¿áÜ+æ:íÖ»σ≤╟╙╨│≈½G½│┼;ZdY╤ÅKâZWp4}_~■╔Wo([ªnUkí«`ⁿ╦L╝╛╕É╣óvw╢4M`s╙╛a7ε═┼_IÇçV|úS║x¥≥EN1εj▀╫J▄V{∞3ô£╠Γ─⌐}ÅC▌÷∙e╟╧d{ìK!
  64491.  
  64492. ═K$=úå='αΘá%å4╙╤Φ┼±┘ƒ╓╝¿σPA ┐╫W|K]µ¥.W═@=BTP`;∩æ L&ßLAc┤¬4 ₧@ü║ºÆ≥┬â4Jk ≤Éb1Ñδ┘MMåL╔:z¡Häxù≤_@xΦjï█KÜCw⌐@:╞£└Γ┼»}╞`⌡≥║qó⌠ZA¼t oïα=₧±P≤Duîh▀V≈"!!≈╚léQ{╨/╛╬ùx╝¡≤≈εΣ┤bI¡¼≥vV\crÖΓpeGUë╚Ü╠3/BU╔┴8Äâπ┼°≥n≡·Ç├ë)░±ë:√".-*ÆJ▌#]{─äGπYr├(▐âûì▐]ê╙à∩V┤"┐}Σ=╤⌠ò╡sI|]FE2≥<╙⌡4qö'▀H═Laâinè╗4α     L▄úφ[4z^>σ┘±╦Aöµx%┤∙@ôÉ░I≈7SK3█Σ!!s╤_ÿû▓╗⌐·⌡╣ï£├^ê┤î@7╣ü¢╞m╛"N?╫æÆ∩ΘxÜè óà⌡ZÑφ≥&ìt8öƒUδHÉΓ?╠ª▒Gà█C¼= ─╜╩½@┬σÇ.Öò^Fφ╗ o-ñ≤öïöU╞3.Ç╡┌
  64493. =┼╙ΘOÄ∩Ænæπ#ªlY╨│!!╘{╫∩╫ïƒ2πù╥»ñ₧⌠1p}⌡M*}½r┼╠Θh8¿!
  64494.  
  64495. ╙A&,■╧=/╝║ë>┼/≈Ä»▄▄┬┘ò╜≡ @╜√╨xqzS╙Çdç\FkZWeƒ├.Ko0N╖y'Γé-Ω╥G¡╣ú▐π╟^╛XQeB├¿h!!⌠ô≥\Iæ7ç^<εJ╕iò·PL xτqæ▌MòMzΓmV║Ñ╞╢╚»3åï█öu½▒VJΓeiì²s╫┘≤I*îM▀µ(rφçy╓Vk═/Ñ╧├P{≤╝² ΣFºßt╢µ≥pHQ Xτ÷pxAC▌╠╩│\l8M╔┴"₧Y
  64496. ╓±┬°δdñ╣Ç├╓~┤φ┌╩>C¿t∙OzJ∩│l╥-TΩF£ÿçï╠%±┐─σVß<╢rí!!└µⁿƒN{@N5▒#¢≥mvÿ.Üa╩ Rböamê∩0±Jm]êå╪xP0öw┤┐│-└ε]2≈π$⌡ⁿÆF╞lb╟ⁿ"C.ÿvÆ╡╡╕g╝╣≤ä╬è╧èY¼æ@ dΦüè═j«mv┘ºñ╦╓âòvτÿ╥AΣ Θ&Ä0Eê╒∩Eì¬f┼τ░]ä┴«9I├╜¿¢iÖ╕ƒ8ÉöO¬╖-dº²╓æ╒P\âse¡▌¬t⌠∩╒'÷!
  64497.  
  64498. ≤A74;í⌐ &╖≤╠9æ>≤└»╪±ìƒ╨░÷σDJ½│Ü;cjC╘ΘT;╒oV#xZGnO╗┴,\v*Náyh╗┐%Θ₧MΦú┐¢╖▌Æ}H.i╘ⁿy:½ë╙IMûòp¬ñ|₧∙X,Θ$ï╓VÅG╞i:┴¥╬╢┴Ñ~çå█ÆhO║∙R■Eoç²=▀╙~πE=╔L╔H┐mq█╥~îZ╚6ó£ÉQdúíΩΩ≤F╝ⁿe╘è█#.jE^)&ï╣McFD╠6┘Y╩Φ`9WD╒àa╔7h√Ü╕å∩dΦ╝┴▐Å<╢∩╚▄72 ▓o⌡}SδÑp!
  64499.  
  64500. ≤A4/=■╧3'ôºÿ/é:≤╣àÑ╝τ═▄¿≤▒V≥√≥~`AL╫─*ZÆF3z^jΣÇr)½}EoΓ┐( ₧Q¡┤╛ÿ■╩^╦}Pkg▀«3r¡╚╨XK£èX─*éuÖ╝\Nxπa▀╘LÅV4¡@4┌£╫║îí`╚Éûû<╖σRúrz¢ⁿs▀═ZºE6┬^╫≡,m⌡▐8┼Pa╫>│╨å)┌╜≈╛Σ    Φ·oH▒Θ╝BdRn;¥J∩&tCïzº|α!
  64501.  
  64502. ╥A3)<"í╒r(┤Çé>Ç8Σ╞éªùò∩╟╖ΣñGF ÷ÇR~XZ╫ë;\âP"kzG⌡è<@r#\∙&`o╢ÿ)α█
  64503. IΦ╛╣è≥▌öq{n┘¿d=áç¡3!!íÜ5ºP÷|╨    ⌡_[I,ε$Å╠\¥Nxú=╟ùâΓ─Ñ3¢ÜÿÜz½⌡E»ouû»<╪ƒL≈@,╔ÿ{Ö@ É╘}╬D.╥:ó╒ÖA.≤»÷╫ε¡≤eN≈ì╪c<Vyz !
  64504.  
  64505. ≥M=XR══'⌐╛ë8┼+Θ╤»▀≈═┌ò▒⌠σGK║√┬bgM╙û,SÄV/~IVx
  64506. °ò]&$Vπh[oΓ╣%∙█K¡Ñ∙▄ÜÑqt■JMbfÜ»x0¡┼┴J[ºÇzáP┐Ö⌡EV!
  64507.  
  64508. ╥P&ox┤╝ÄÜ╕┼8≤╥▄╪ ├∙┘┐⌡ B▒Æ╬ovOS└ΘT;╒oV#xZGnO╗┴7Tv*J«y]~Γ┐( ₧k,º┤╝╝ε█═.motÆ⌡-;á▌┼KNöûVs╗M╡iÖ≥"cQ╒lÜ╠\▄Kg∞=┌Ç╧∩î¼z£ô₧╙u¿■EIúttî»$█ƒ\µOo┘L▀µ!!mαçh╨Mx╔;┤£éP4ºª±φák┬¥lY»σ╛JJoSF&&åú)aJ╚╔QÖ¿Chu φäoé] ÖΓ╘°Φiß·ç┴¢9⌡α╞▀    2Ñ2╛b2ê╪y≤Yz╪5¬ª■Σ╢!!Å╧╒π┤!!¥_╪ Θ╚█⌠8]j5P¢^·⌠/Vÿ.܃ DNe╞siù■nÄ`L5╧░Θ{>9A
  64509. M├
  64510. ╬▌╦Pä╣z∙Æ#÷½¼x±!
  64511.  
  64512. ≥Q7
  64513. :*░è6┤╜ë8â>Γ╤ⁿíö╛¥⌠░ß▓VQ »╚~3[S╞─1T╫VJ>kIUj ≤┴Ug5\ªoy╖╗0⌡╠V¼≈╡ç╖█╫f[ki╠╣|∞ñ¬4"ⁿ(╨^6φ ƒQƒ≈sV=≥-╓!
  64514.  
  64515. ╘J+63ûè5 ╡º╓j░1φ█∞╟╠╥╪▄▒ⁿσPAσ√├y3LA■ï=YúFT/4W|#∙ém6Jπ9α¢2≤╚C¡≈·▐▐┬ Æy[z ╬┤hrçσ╧ZC╖çf⌠âs£ Z} ?Φkæû▄Kz╕.╒ô└≤îªfåïÆ£rA├¢>wºeJWì∞8∞┌XεN!!é╖|₧G╟⌠Gφi¬}╪Γ░pSîï╟╫╬0ë╪Ixƒ╒£)6Li{I!
  64516.  
  64517. ╓V.0░╒r&╝»ƒ/æ±┬╡îε⌡╩╙■±º    ╝╣ÇkpJa└ì*FÆQj~XQ\ ò
  64518. \hf"╔Z░ó6√╩G@σ≈₧ôτ├ÆzJ@zh▀ⁿDí╩╦{QüÇL/ÖQ┐iò ΦI1∩pÜ╠_¥Aq∞)▌æ╫ ├«=σg÷╡£h
  64519. εσ_E╢ ~┬Φ!!╤╚≤No╩V╬V·+!!φ╧}éPk╤*┤╧ùAp≤╣Ω≈⌠ΦµaR╛σ≥%I@u;èú8p[╩▀Å»Ma%.&│Ç#çUùΣ╘╝░!!σ┤àìì;⌡Γ┼╬$K»k∙4KΩ░}Çz^½¢┴ä£╓\Å╙╦ªVⁿp¿n≡&└⌠∞┌gZ K8πw£±mgê Ü]▓r(@fàau₧■yú7N╟░ⁿ!!?Xw┬╫▄▐Fùµ=╛≤E▀¥₧Q█bxdH╤░7 2ä`ô╗┘▐∞╕⌠÷█Ö╬KêAαéDE0αô£S┬>└·¼╖╦╔&1₧ö:¿äµQΣΘΘ ÄId>éô∞Eïα#à¿│G─┘*╔UuiƒΘó╧-æ∞²T éDíεR$+¼≥╦╬üRRFäWA⌐▓═N|òÇφOÉα▄zK╕┘sε&»█.╤(A⌠┬·≤╪H╘/ª»╨ä»┘"1│^ÆZªΩ┼Wδÿ╔é╣%Bû]@5Æ░╔9K⌠"£╧FVxƒÅ╜w╚╠⌡=ôr'╝im╗ε┴»╩tp/≡║ΦSym╩M83'8¼▐Zåè! !
  64520.  
  64521. AXDualImp comment:
  64522. 'AXDualImp provides a generic implementation of IDispatch for dual interfaces with type information (i.e. a type library). It makes use of ITypeInfo''s ability to invoke the dual part of a dispatch interface when called via the late-bound IDispatch methods.
  64523.  
  64524. AXDualImp implements IDispatch in a very simple and efficient manner, but cannot be used for dispatch only interfaces (dispinterfaces), such as most connection points, or where no type library is available.
  64525. '!
  64526. !AXDualImp methodsFor!
  64527.  
  64528. ╞A33+ïë(╖¼ƒp┼-Φ▌δî∞╨╠╧É≤¿VPσ√╥|`Rx╙ë;A╫2.CX}j≤ÆDeN«y@*«¿)■ä ½╛│▐σ╚ädW4 ╚╗I;╜┘╔]% ╤?x╛O│pòΦ[=íM╗╫JîC`»fë╡╞Γσä`º ▒Ü₧yµ╕M¼tiäε0█ƒY≥O,╪V╒╜@ Éεu╥Nk═:┐╚éP}╝á╕╨∩¡« k╝á║ `A& ï∞51N┼█åßVk|JB▐ê=ÄYƒ ▀°·sδ╖┴┘Æ;⌡±╬╒+6ⁿ}εuFó│l╞bIΘk⌠Φòü═_Ü─┴∩L≤^p╗xí'═Γ╕Θ7`BE4≥>ç√4%ÿ:¢G═BVp╞voä ⌐J$N╧▒í\P'sΦ    █▐▀Ö≤Y╣∙F▀öîw▀>9]E╟ΓIiT°KÆ∩±÷â╝▀╖╞Ä╪▄Jºù_x%¡ù£S▌+íwcXû╘┘º╞p܃?²╚≤z⌐ⁿΦiε*^¬╓╒D├í%ïâ┤GÜÆC!
  64529.  
  64530. ╞A3.,(íª</╡èâ?ï+╗ö∞├δ┘╦╕╘¢τzN»╖┼vvFBÆÉ6W╫v`#}KR ■█D~c2{║lVC¼¡/┘╤W╝ ■▐■┴àr_k ▄⌐c1║└╧W╫{∙{╟ƒ{╨∙X *Σ$₧╠\▄Wz¡0╓╥╫∙îípïîê╙h╛⌠M¼f;äα!!₧╦WΓ&┬K▀⌡,bⁿçl╩G`Ç(┤£ÄQgºε∙≡≤¡µ  ≈ó▀`kfI@rrÿ ∩5+ü╚îßMt,Fe╘ç ╤Ö≤╨┤∙!!φ╝»┬ö;∩ú≥4åh]b{
  64531. »R⌡4VΣà{╒h¼=╬╝╙ç┘nÜ┌╓π┤)aç"»^»èÆ╢$uV`-$W!
  64532.  
  64533. ΦJ3'>Ñî7D╨└╬ ï,÷╤²îΩ▀┌ò¿≤⌐FF ┤╞;g@SÆû;QÆVR/|@+H Å
  64534. \t Náy*½Ñ3ε▀L¡≈íƒσ╞¢qB
  64535. ╖╓;á▌┼KNöûV|╜m┐q╨·e]=╗$ñ╫WêGf¬?╓╥Ö½î│vä ▀èåy╖╪YPºr züΩi₧╠ZδGo┼Q╬ß+`·┬[╬C}╙ ▒Θ-J║á∞√≥⌐≈e!
  64536.  
  64537. ΦJ3'>Ñî7s·¿éç5Σ╫√íö╛¥σ¼√│RW║√ì;@MBÆÉ6W╫IE&{^d    ╢ò\&4JáyZ|º╣gΘ₧Gí╣ú¢σ╔Æ3@gn╔¿l<¡╠ÇOIçÆy½ór╨⌠T*µqÆ█Wê4¡╤ÿ╞⌡╪ε1σg≥±·u║⌠EBúc;╪▓s▀╤pσK*╧K!
  64538.  
  64539. ΦJ3'>Ñî7
  64540. ╢¿ƒ9ΦUêû╬┬φ└┌╟■µ¡V╢╡╘~aNW╤ü~Q¢^W9.L[b ■┴J&/B│pVgºÑ4 ┌▒≈úû≥ÅöqWkrö■X├ú⌐g[ÉòVf╗A╡qæ∩cJ(εjî╫[òN}╕!
  64541.  
  64542. ╚J1>=■╧6 ⌐╣à.┼≤▌µ╚ñù═▄╖÷σ_@╢┐Ü;K_╓─)t¢^C94DM≈åv"F░lCk░¬-Θä¼╛ñÄτ╬Ügxa╚Äh!!╗┼╘à ÆG½PúqäA∞TW
  64543. =±mæ╪V╞dë?╓éΩ°╩»3ÿ╛ëöY╝½T╖A|º²!!│╡6Ñh"▄S▀÷#u╣╙p╟GΣ6ó╠éPw╗⌠ó╫εº e≡á╗`TS
  64544. e7╬ ÷3eF_╟Yá{πçV+B^▐┴;ä₧⌡æ¬∙bß│ù╚êyªúα=╓2"│<δ}\Ω±~╔aW¼æ┴çå┌ô╫╫Γπ"▒+τ<╫ºφ╠T%k#T╧$û√+%à-ÅK÷GM#çsPîΘ4ε1Y┌╧à>X)K{ ╚▌╥A\└≡Y&▒┐@æüÜU╪-;U-{½Ö)0ÿh═╗▄█╝│⌡÷ªßó6ï~¼àBE~αà⌐╩-╛" rÆ╫áΩ╠,aº¢>ªàπQ┤²≥:ôPq% è└Uæ*≡ê'║ª»fÅêR»,E@ôƒª╙╘πà2é╟'lê▌A<⌐±╚Γ¢^è*╪┤╞Z┼╞±
  64545. ±î⌡R╖²!!═<&α₧d]╦)C▌╓¿!
  64546.  
  64547. ±M%=ìü4&αΘì$¬=δ╤∞╪ô╜╢ùÄα¼EB½╛Ç63{S╞─*ZÆR+bNV+≡┴
  64548. Qcf]ªVc┤«2╜═G∩º╛¬ε▀7ÖrQG) ╙▓~&»╟├\âüt¼O│=ä╝EG xαvÿ╦TÖL`α@=▌╜┴ⁿ╔úg╞O≥±■f╛°c]▓e#uäαsäéµO╬U▀τ!
  64549.  
  64550. ≥Q7
  64551. :*░è6┤╜ë8â>Γ╤ⁿíö╛¥⌠░ß▓VQ »╚~3[S╞─1T╫VJ>kIUj ≤┴Ug5\ªoy╖╗0⌡╠V¼≈╡ç╖█╫f[ki╠╣|├ú⌐m@£╙fεjÆtâ²ELx±hè═êJq∞)┌ü╙≈╪ú{╚èÖÉp╜ΓKñ sç»7╦▐SºH!!╪Z╚≥.d╖à¿/⌐É╬æEm≤├Æùëíαh∙╔ûuGAn_Σcè9eG
  64552. ë╚îßPc(F^▄Ç,Äyùπ┬!
  64553.  
  64554. ⌡]76óÇ_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;Z|O┬ü\æP=kFx
  64555. ╢òg%[╢}_f╗δ)≈╬NÑ▓╣è╖█ä4w$gs╩╜y1ªñ¬0A¢ûs»@│3╥lû<%`≥aô╪ê[d⌐)2╒¥Ö╢└»pëÜ█Üz!!í RΓ["Iº▄≥δz⌡S ▐╔⌠#`⌡≡q╓J4ÇÄ·ómXÄ!
  64556.  
  64557. ⌡]76óÇhi╢¬à.┼6τ·α┬√ìƒ╨ª±áCW╢┤╬SrFR▐ü,?²6|REj≤┴SG(\┤yA*╢ú%║≈v╕▓₧ɱ└\    Æ4Kk ╬│-3¡▌╒XDÖ╙x╛O│pòΦ[1≥$╢·PÅRu╕4╛°¬ ┬┤vÜ ₧ÿû0OíπMñ tîΩs╫╠µW.┼S█ (!!φ╧}éPk╙*╜╚├Kr≤½ε ∞⌐αiR╛áª%[j3èα!!1}ZQ╦╚O╞╠39[O▀æ;éU ╛±▀╝≡d÷⌠├á≡S▀è┘√';║s╝gq≈╜eÇ1àoù纣╩M┴û■ï(¥{Y╢dΓ2╔Γ╕àGeLMs£]·₧D&à;¢AƒZoGfé té╗4≡eZ╟░»G0(^}├▀└ÖPɵ#╣∙F▌█≥-╖EQ@I%█α!!*3ùc╫íàÆ⌐╢≈÷┬à▀ZÄ^íç@u(íü£S▀3╜gO²▒Ö╚δ0Æ└l£╢⌡LíΘ∩ îNX6â▀εÅα;ÖóÇiτ±.╩1&éÑ┤─sæ╦²T ε#Nφ╖`dúτ÷▐ÖK╪`k√╗└C8ï┴φz¥⌠¥dG╢┘!!H╡n8╡▌uD∩{Eδ⌠╗≤▄V╪!!ªτ¡╚╠╖v/5░m}ƒP⌡²Ü-╘₧╘ºª<@ùsG(ô¿çzKów£ⁿXeΓ╣≈>∞≈≡>⌠K┌! !
  64558.  
  64559. AXEventSink comment:
  64560. 'AXEventSink is a generic connection point callback interface (i.e. event sink) implementation for event dispinterfaces. AXEventSink itself handles incoming events by triggering a same named Smalltalk event, the selector of which is generated from the function description in the type library. The primary keyword of the selector is the name of the event (unchanged in any way), with subsequent keywords the name of the corresponding argument from the library, or just an underscore & colon pair (_:) if the argument is unnamed. In-only arguments are converted from the variant parameter to the equivalent Smalltalk object, whereas output arguments are passed around as a <VARIANT> which can be updated with the value to pass out.
  64561.  
  64562. AXEventSink implements <IDispatch> (mostly via inheritance), but only the Invoke() method. All other methods are associated with requesting type information about the interface, which it wouldn''t make sense for the caller to do, since it defines the interface and ought therefore to be well aware of its specification.
  64563.  
  64564. Note that COM components "source" interfaces are almost always dispinterfaces because VB is restricted to this type, although connection point interface can be vtbl based interfaces too. Some components (e.g. ADO) support both types. Where an event interface is specified as a dual it can be more efficiently implemented using <AXForwardingDualImp>. Where a custom interface is employed, this can simply be implemented against the object which is to receive the events.
  64565.  
  64566. '!
  64567. !AXEventSink class methodsFor!
  64568.  
  64569. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐ì≥├^₧zWga╓╡w7├ú⌐% {∙A╝B╡x╜∩ZSeí5╔╠╥/┼'9▌ù╤ ╧àeìï╢Æoε½
  64570. ≤6)╠éY╖±P╬O+┼I╙µ,m▄╤}╠V}φ>ó╫├)≤ «∞┤H!
  64571.  
  64572. ∩A0w_Qµª<:«¿é)Ç,í█ΘîΩ▀┌ò¼≈ªVJ⌐╛╥;~]E╞─<W╫VJ9zZ]≈ò]&1F╖t)╢¬2²█VZ╗╕óî⌠╩(çqwhoÇ■X├ú⌐g[ÉòVfªLúqö/≤Ef(φaÆ█Wê!
  64573.  
  64574. ⌡E50,■╧3'ò½å/å+í╟α┘∞╘┌ߺΓázM╣┤Ü;rFwΩ¡0FÆMB+m^gr≤áXj?Uªn>╦Θ⌠═U║≈╢▐∙╩ ^₧zMon┘╣-=¿ë╘QM╒ûpºU│o╨⌠XLtísù█W▄A{ó9╨å╞≥ÇαrÜ₧òöyε≈XVΓt~┬Ω%█╤K⌠,EÑ[▀≡?h√┬|é@wÇ+╣┘├Uïç÷Ωσ«⌡cYì∙ó#kGY|7£Tú?1MUë┬¥áKi9G █ÆoƒH æ≈╘¬∙eñëî╠û2íΓ┼óo^▓h∩O{YΣ±}╚h░)£ïûì╦█┬─⌠E±~·B∩s╩≤≡┌~@M.▒k▓╧kà1ìH▐DvzûeAâ·9· NûΓδR"9X|╙    ₧╞╤AFφë5/í·Gï╒╫H╠lCO╨≤!!Dt╤eÖ∩▌└¡╣⌠÷▀â╩K▄Yαºj{d»Éà╚>φrs≈╖ú╞└,?╫┐:óåΣGQ¬°÷,çq1é┴UΦH£í:ë│╡[Äê*╔Q├╜»└=æ∙₧*ôòLΓ▒Os-ª°ÿ╔ÉYEV├=,┼Ñ╞N|─╞°
  64575. êεÖ)ì▐9δ:j·╩uZφ>P╕┼⌐í▄U┘u┤²òÅß╔C·K#æ^∞²├S{Ç≥╪½Uí @æR.₧╖┬{εkèüAaÄä≤2▄«Θ5╦F╨j.¡╤╓µ█ev`Γ¿¬]τ$SCYG╒* %ºñÇw-═╥¢úP¼σ─σ/^½aA∙FnΘFA!!A▄.═¬è{.?║Pⁿy⌐ûn≥√Γε█_^
  64576. ^"i∙p¥üº ▓! !
  64577.  
  64578. !AXEventSink methodsFor!
  64579.  
  64580. ΓK)0;░╒r(┤Ç╣$Ä1ε├ßíö╛¥÷▒ⁿ½V@½√╘svD╫ç;[üZVjzTjµôIt/N╖yi¡Ñ. ▌V    º╣≈Ä°╞
  64581. ╫{X@zh▀ⁿy:½ëπve╒æp¡W·=Ç≥Z|-≤gÜÉ4÷+Uó+╓ÇâΓ─Ñ3ë    ëÆÇyO¡■XO½eDΦå╤╦Z╜╩╬÷m@·╙q╘G#°╛▐ëAwºε≡ ≤F¬±eR∙Θ┐`KPr7èJ÷9HΦ#ß]╩╢Qd?K ╙ÆoêU¢ ▀⌠╝u∞┐Åìò0░ú╞óo^»y╝`^∞╡h╥iΘîÄü╬▄Gƒ╙╓ªO⌡ p¿n≥&╔≤ó▓p/míc├Ñ}5╤]╥'ⁿ7olFÑT_¿─╠)
  64582. rµç╠cdt┐s╖µ╤M└ΩR.╛ⁿHïÉî╩$9D╩⌡6}ÿ╫⌡╫Æ╣╣∙÷╚ä┼QÖ[┤ìJXd░¥å▀jól& ≤╗≡▌╩*cöƒb╩ΓÖ=A╝í½y╫"g_╟╛ò)≡╒?à┤²]äƒNá9 ÉΘ│╔(┼░ä6ô╟Y    ⌠ª adó⌡╦ïä TV├?/Ç╡┬I7ï╞±X▄≥öl▒╒=¿':«█fNδ8A╕╦╝τ¥O╒0πτòéñ╘    CN┤g2≈]ΦⁿÇUΘ₧┼▓▓hH ┘~y╕ì¼\. 5ÅA╝üP|äë⌠2û«╘3╘ ╞qa¼╒╫µ╤e>`σ╕±T<5ÅM;hYWà δ%╜⌐Æw,═┼¬½T«≥ù¼5cφ
  64583. B±Uv¼XK:G▐?≡╝ö>7ⁿO⌐hç╝*eΓ╫■ⁿ╩\kK4Ü°┌╨d═ëT▀Bε¡b╒ñ·)╔*3+G°╨▓L僬╕Lª£t ²!!c+⌡¢yi¼█ú▓4╘δQv▐╘C¢äJ╩ù¬P╨ πh)
  64584. ûp*/;üé'V7i░τσ▓Θ~íXA| ═ák▌É╘*æº\ !!gSúj╧@{¥âδ/ε/V*s«µ°≈8Qσ∙f7«╓Å~É«êo⌡Ö 0iàΩ9░r═≡╥»íúND*l*┤µ╜$║Jε▐ü_±ùHµ±µs│┬ë~Ω;y┤¼╣±úS▄εe√ïú8è&¼╡!!µΘB┬≈MΦ R ┐lI5G╖1╩^ΓVV╝u/>Q≤î Ü;g∞Ω▄b║_á▓Ñ╧\╚xM.cäΓσ╓B┤å#D░qîe▄    7Æ^8┼┌6┘&┴n▓=┐ƒ╕Ng¿δV½█í-NZ│l∞▄ÅBI╝<Γ_»¿δ▐*╬aIßH╓A&mf≡╣oε¿yî<ü∙dⁿ-╘∞û'Σ÷£,-╖∞Ñ
  64585. ≈╥c∙∙╤xêôJ₧╪F]·TVüo├ûÉ~▓ªΦhb┼µ:▐·╖δ╟6┬⌡Sç▐Pì╞┘±ç5O2s£ÇPXÇàÖâΣÄ╟ê5qΦΓK;Θ!
  64586.  
  64587. σM4:6¬è1=╫├σhí6≥╫α┬≡╥▄┴■µ¡V¡╛├~z^S└─8@ÿR>f^h°ÅZr/@¡<Ce½Ñ4║╩M@┐┐╛¥ Å
  64588. ╫|_.p╚╣{;í▄╙UQ╒û{├)▀~ƒ≥TL=σ*▌│3±(»2▌ù└Γ├▓3åï╡åpε°Qp░u!!┬╘^┤╢6Ñu=═Q╔ß$qφçv╟Zz≡*ѲÅH.≤Θ▄≈≤º·nY║⌠╗%Kv ç≈MpbJ\╧Lìÿ∩V*%┘Ä!!à_é ├°╔oσ╛ù─ë;∩ú╩└>\j╤òfwP∞┐l├yT■Fÿôûïæ%±┐¼σM·5╣ε!!à╜уOerk#T!
  64589.  
  64590. ΣR"!!Ñé7:╫├σhñ1≥├Ω▐╛╓ƒë╜²⌐_F╝»╔t}▌é~ñFI(aWxOΓëM&']ª<Gbºδ.√╙GΦ╕▒▐π╟^Æb[zsÜ¿e3║ë╘QM°|·p¡F┐kò╝BF3≥*▌│3±(Æ    8■ô╙╢┌í¥î!
  64591.  
  64592. ΘE)9=üÖ7'«≤╠+╢&∞╓α└╛└╓┴╢╙╖TV▓╛╬o`╙è@à^]G2MΣûKbf[½yy▓«#≤╪K¼≈▓ê≥┴^ÿza ╬┤hr║╚╥^MüVäaªóuòA∩D_4Φa¢₧XÄEaí2╟ü좪╔Pë▀Öû<╕⌠EV½d~î»1╟ƒL≥C,└^╔÷>!!φ╧y╓y╔,╣£ùK4╗»÷·∞ΦαhY∙σñ q\&3╬Ω6t]U╟ìï╕%9Kö┴-Æ7h ÷▐¬δ`÷╛ê├¥~╝≈ë└E6K«h⌡ aSπú)╧oQΘè┴Æ¥ƒI██└⌡Q⌡5·yα'═ΓΩƒNhAFH3▒2à≥#q╪z▀g╤XUJjò cîΦ0Ä`LK═ΓσB".
  64593. l▀┘╫╦ÄúY<▓±]▀ÜÖA₧80U╫α44öh╫∩┘└    ⌐«┐⌠ªßª5⌡KÑêC0▓¢ê╬8èghΘ╖│δ╙:â┌%í╝ΓA■╣└DΘ)$ï╒UΦAïµ2ÿτ⌐Fâ£@ª*E@└¿┐Σ?╘■ädüÄ^└ªq)»·╠╪╧YFM▐2qÇ╢≡S1╔╧≥
  64594. ï∩êaΓ▌=)·<5úπ:%ÇRW²╚╝í╔I╘2ñ≡é¿»┘PU▌qW╗Jπ÷╘TVπ¥°╢│r    9⌠1/OäíÄnK╝e£╒}îÇΓ%é«ß─O┌u.«╨╟«6╠vkbπ╡≡U&wï@oXS▄ú├╚⌐τφ┬╚!
  64595.  
  64596. ΦJ1>=ìïhi╛áƒ:î;í╥π═∙─àò╜≤⌐_wª½┼]IQ┴─)[âWe8iN^nΓÆDg4HénAk╗╞Jô£k╛╕╝¢╖█╫f[ki╠╣u╜ë═\\¥ùVbºW╛=╠≥EJ=≤:▀┌PÅRu╕4ô¢╟║îñz¢ûƒ▀<á⌡P¬eJ'ú²!!▀╞ºN)í5│Jσ,s≡╞v╓aa═/░╚èFx╢≡╕ ≥╜∙eR¡≤■JwAtt3ùDízZ%9╒W▐åñZy3Q ╞∞EΓIÜ⌡╥¼≤sñα▄ìô:ÿΓ┘I╬mK
  64597. »l⌡ 4VΣÉk╙hU°\▐║¡ªφm¿πΘ╥gµ?¿+≥:┬Θ∙╙-O}G\    ╬╝├Híó▓r(Qfèf äΦ± &U╞Ñ╩Y08Fzû╪µ╦Q┌úg9▓≤O▀üìF▌)FE╓¬d8¥iö∩╫└N╗│σ╛ΩÖ╠Jæ]«ÉV díÇê2┘8¼{[Vû╘┘≡╓:}æ┌$ªå⌠Xü∩■'ù0$ï╓ΦOïí à│╡uÿ£R«=É≤τ└;╓╤é,ù₧!
  64598.  
  64599. ΦW4;¡ü5 ┤¿Ä&Ç;î╛åÄ▀┘╠┬╗ασDK║»╚~aR╫å+U╫KV+mR]lO∙ç^Ph%@«u]mΓ«6 ╨VΦ╛ñ▐≥┴¢qZN,░╤[É╧╠XOåVÆyâBÑv╩A╚CN
  64600. =╠eî╒!
  64601.  
  64602. ΦW4;¡ü5 ┤¿Ä&Ç;╗öεε±╪╙╨┐ⁿ╚9*²Å╒i}R╫å+U╫[A({\≈éWaf@Ñ<Zdíñ-≤╨E@¡í▓Éπ▄\Ö4Q.o▄║#p├ú¡3!!ôÆfεδ=û²V\I5αwöä¿Pu»╥ü╚╢▀Ñg╥M₧╣£s½≡Y!
  64603.  
  64604. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σWF╜«╟;zFP▌─?PÿJPjzSV+≤éPp#]πh\*úÿ4Φ█Cµ⌡┌⌠ÜÑuñ`Lom╖╓[¼╚╙PKÑÜa⌠Ñx£º<%`Q∩aç╩iëV.∞Dtê ⌐ƒÑ░aüï┴╙4º┬XQ░c;ïⁿ╦╙SºH)°M╧⌐mZ╨ε\éL{╠3î£èBR▓óδ√║Fôαio╢⌡á    %O\[{╒gë~Yb_Q╩û|α╚0}.JB╬█oêU¥∙╘πæ ì╙Å╚é*à÷▌SÅA~!
  64605.  
  64606. ±Q%<+¼è6 ¼¼é>½>∞╤ⁿíö╛¥⌠░ß▓VQ ║Ç'pGZ▐ü=F₧PJt.TU+S┼ÿ[i*░<Gbú┐`√╠G@╝┐▓▐∙╬ä4Q.t╥╣-7╕╠╬M[╒¢aεW╛x²kòCJ
  64607. =ΦrÜ╠ïKxá@(┴¢─±╔▓3ç Ö█ÜhεσVVÑe;âⁿs▌╩M⌡D!!╪S├V≡"o ╬╫Pk─q≤▒Θ)┌▓╕ ε┐±rÑì╪ckUBtr╘Wú8"uJB╠εå¡\n(JC╘┴!!ÄML√Ü╕½∙mΓ·ò▀ô9▓µ█.╩ 2Öj∙`δ╖]╥x^╢FÑÇ¥¥╚Mëû─ΓF«Rs╗s─%└Θ∞àO}G'[:Σ:û∙9v╦    ╤#╡qRGoÇ tƒ≥2Σ7u╞ªµA8>_r≤ █▄═WFëσh8ó·▀«₧I═;=B╞⌠1╦,ä■╘╘N⌐¼⌠╕▀Ñ╩RÖK¥╩(<M₧ôü▄/┐!
  64608.  
  64609. ≥A3.4*úè&s·¿éç5Σ╫√îφ╪╩╟╜≈æJS║Æ╬}|╙èj╛QP/|]Rh
  64610. ┬ÿ\G(N»eIo░╞Jô£ríí╢è≥ÅQ^╛zWga╓╡w7ε▌╚\çÉ|╕Fñ:âA⌡UJ,Φpå₧PÆQ`¡?╓╥╒≈▐⌐rèÜê▌>b─£=-╛  uæ»/│╡6ßM.╦LÜL«m1╖¬½Vo╥8┤╚├)≤»÷╤Γ ¡≈t╘è█ VI@e7╬P╛W1nhα┘ÿºXn9wU╩äà[ÅΩ╘¬▓ Ä╫δñ╪íú┘╩2C½y╝zS√±a╧a_¼ûä╙¥┌D₧╒╤ΘPτR9┤+⌡;└º⌡▐
  64611.  
  64612. )M]}≡w₧°?`╤'É^╫RVjàatê u≡+Wê╡αB=>
  64613. {╙
  64614. ₧▀╓V└Ä6C≈÷GÖÜ▀N╨l7BD╨░0 }ÆcÆΘ█╫N╕▓⌠÷╩Ö╠Jæ]«ÉVf═°µ┼9φ8;X∩╖â┴╨-rÆ┌*▓å≤@½≈Φgε*>    ¬╥╝─íâ¿╢AÜ»Fí4@ì¼░¢i╫■â~àÄP»┘e"ñτÿ╧ÜCÉ<k▄≈╩N╩╨╛Kê╝▄o»┘>∞n$»╩.∞{W²╚┐Γ╔T╧╬ƒ!
  64615.  
  64616. ≥K26=Éû",ôºè%ΦUêû╬┬φ└┌╟■µ¡VπÅδr}Lr█ù.Sâ\L `Z_r≤ô@q.Fátnº╕#Φ╫@╗≈úû≥Åéf].i╘¿h ¿╚├\% ä|¡K÷tâA■TF?íl₧╨]ÉGp∞%ôå╦≤î▓vïûìûnA∞£=)╚    4oï▄<╦═\Γ!
  64617.  
  64618. ⌡E50,╔σ[k¢ºƒ=Ç-í└τ╔╛├▐╟╣≈▒W░√╫szK^ÆÉ6W╫MA)kREn╢àJv'[átVyΓ┐( ₧K½╕║ù∙╚\û`[@lo╧▓ir¡╚╠U[█T■|─*êiæ√T[!
  64619.  
  64620. ⌡E50,■╧3'ò½å/å+î╛åÄ═╥╦ò¬·áW╛⌐╟~gB▌─)Z₧\LjzSV+≤éPp#]πxZy▓¬4∙╓GΦú┐¢╖╞ÿyWi ╓╜y7ε╦╧LFæVÉyóP°?²kæ;&9≤cÜ╩╞4¡╤ÿ╞⌡╪!
  64621.  
  64622. ⌡V&0▓è<=αΘì£2π█πîΘ▐╦▌ƒαóFN║╡╘h)W▄Ñ,@ûF)@cyαÇ
  64623. \&kÉuTdúº`√₧L╝╛▒ù⌠╬ÿzHyh╙┐erº╧ÇLF¥¥y½G÷jÖ≡M x÷vû╩MÖL4╕|╟Ü╞╢╧╡aÜæÅ╙o
  64624. ╜Γ^K¼';∩àZ╩═^ΣDo╚Z╠≡(-╣┬6┼ .╘7┤£╖Vu╜╜√∞Θ╝╜ K░⌠║J`RTj!!╬σW$yJ┌╚âºPh8I╠ä!!ƒ@√Ü╝╥òOδ«ê╦ô=┤≈└┴EZa{j»u√uS╕±!!ê^O■Éå╙Ö═AÅ╙÷≥P±=α+╣cîèÆ╢s/AQ)┴"ç╓!!i╦t╪k╔OV9╞';═û_ècL5╪░µY%`
  64625. M╧▄▌╒Fφë5C▐ûGÜìïw╦8\LKé╖d/û═╗ƒëN┴╨ÿ▀óΓ█MòV┤▐W*üÇ¥╥qφ qÆ╫┘═╩1eÆö8┤┴¥>x═ε≥=ï0$ï╒UΦAïµ2ÿ!
  64626.  
  64627. ⌡V.2=╢¿7'┐╗à)á)Σ┌√íö╛¥⌠░ß▓VQ ¼╚~g@S└─*ZÆV/m^Z}
  64628. Σ┴    Pj*╖nZmÑ«2║╩JΦ░▓É≥▌╫7_Kv▀▓yh╣└╘QiçåpáWÑ'╨ΩTAxεbÖ│3⌡K`┐@(╥Ç─≤╪α|åMì₧Éy╛σKñ mçß'═ƒY⌡N"îK╥│N╘ç}╘G`╘ó╙ûVw╢α╕▄∙F¼±f]¼∞ªJmOFKo!!╬σ~3":ñ}ñ/î¡Xj/M╓ìèI    ╠░÷╜≥d÷│éΦî;╗≈Σ▄!
  64629.  
  64630. ⌡V.2=╢¿7'┐╗à)á)Σ┌√û╛╓²┌▒■áRM╥╤⌐9@MBÆô6WâWA8.O[nOΣä\o0J▒<Dc«º`ε╠K»▓Ñ▐π╟^ÉqP|i┘ⁿ.3╢∞╓\FüLäaªbñzà ∙_[bíaë█Wê{¬Q╣√╩Γ▀αgëÿ₧ç<á▒EAíekû»<╪ƒZ±D!!╪LÜß"l╣╙p╟M∩±┘òAzºεδ±⌡½±.╘è▀`kcJT ur╘Wú<pHCë╠ü√J9MI╚ê,«LÿΣⁿ╣∩jñ⌐ä┘└~┤┴╞├6!
  64631.  
  64632. ⌡V.2=╢ª<-│┐à.É>φ±∙╔≡├╠╕╘¢τrM¼¼┼i3_^╫É6WàP"kAn ≤ê\tfX¬p_*╢╣)²┘GΦú┐¢╖╚ÆfW.#█ñH$½╟╘_£¢7g⌐V╗x₧∩  .Σjï₧VÜD╞i5╟üâΓ═▓tì▀ö¥<½≥RM▓tJtä»6╚┌Q≤Ro╩M╒│9iⁿç[φo.┼)┤╥ùg╝╗Ω²σHΦ╓y╜σ┤ iRn;¥JΩp~Aïzº|α╚gk0BK╔┴!!äwà√ï°╥n═┤à─î7▒÷╚Ω2æ}∩!
  64633.  
  64634. ⌡V.2=╢ª<-│┐à.É>φ±∙╔≡├╠Å■≤ç\L│╛┴u"?ÉÑ0AÇZVjySV≤ô^Mn#▒yPo½╜%Φ₧U    ñ╗≈èσ╞ÆffeÜ╗h<½█╔Z╓ï3c½Mó'çΦYn?⌠iÜ╨MÅ4⌐9▌åâ∙╩ªΓdûÅÇ<»πPA╢ u┬²6▌┌V≈Uo├YÜσ(oφ╘8─Pa═Ñ╘åW£â╕√÷ªα O╢⌡á    +w&6ï Γ<eD┴▐Qâ▓b2╖δBß3ܱ╓½╝;╣·ç┴¢9ªú─▄mK< òr°bVµñh╠HMΘèÆ╛Å╠C█┼└≥┤╡dφ6─Θ╕╤R! !
  64635.  
  64636. AXForwardingDualImp comment:
  64637. ''!
  64638. !AXForwardingDualImp methodsFor!
  64639.  
  64640. ΦJ3'>Ñî7
  64641. ╢¿ƒ9ΦUêû╬┬φ└┌╟■µ¡V╢╡╘~aNW╤ü~Q¢^W9.L[b ■┴J&/B│pVgºÑ4 ┌▒≈úû≥ÅöqWkrö■X├ú⌐gA¢ûs»@│^£∩B!
  64642.  
  64643. ΦJ3'>Ñî7
  64644. ╢¿ƒ9▀α┌└╬⌠╥▄┴╙ÿ╠p║»Ço{M─à2GÆK,.O[nOΣä\o0J▒;@*σ∞)⌠╩G«╢┤¢╘├ä3@gn╔¿l<¡╠ÇOIçÆy½ór╨⌠T*µqÆ█Wê4¡╤ÿ╞⌡╪ε1σg≥±·u║⌠EBúcXÄε ═ƒ║.┬p╪÷.u!
  64645.  
  64646. ≥A5 0*╔σ[k¢ºƒ=Ç-í└τ╔╛─┌╟¿≈╖L╜▒┼xgY▄─<Wƒ^H,.TU+■êQ&2Gª<Aoí«)∞█P@íñ≈ù·▀ÜqPgn▌ⁿl<├ú⌐PFüüt¡F÷réA⌡_[ *τe£█J╥V╡@8╓ö┬π└┤3£ûê╙uεσ_AΓrxçµ%█═εU<╔S▄Z│/tφçk╫@m╠>ó╧åW┘╟⌡ ∙Fí∙pP╝φ╖%O[c ê α#1@^ë╚ï¡_-3E ╒ò'ÄHBÖ≥█╜ u≈·ê├┌1ºτ╠Å?
  64647. C╜rσOd^≡Ñ`├xWφ≤δ·¥┌Zì╙╫ªM÷5╣í0─Θ╕╠Vy@]}≡9è╖#p£6Ü\ƒGjêteƒ²4α6▀½√_q>Cx╙█▄═ì≤P/║·GïÜìTÉnU:-{½╬7/çià╗╤┴ Ñ╢▒┐═┐┘JÖα┐VS(ª»╧═ ¼nuí■ï▌└-gÆê!
  64648.  
  64649. ≥A5 0*■╧3'ò½å/å+î╛åÄ═╥╦ò¬·áP║⌐╓~aY╨Ä;QâK$.YVc·ç^V`fX½uPbΓ┐( ₧P½▓╛ê≥▌\ä4W~l▀▒h<║└╬^ö■|ºMóxé²RJI7≤$û╨MÖPr¡9└▄â╫┬╣3üëöÉ}º■YWΓo ;ÅΩ'╓╨[⌠&┬╬÷me∞╞téK`╘:ú┌éGq▐─æ∞σ║±sY╖⌠╖Bg_n7╬µ5xYU█W┌å¡o9J╒ô8èHô⌠æ¼≤!!≡▓ê▐┌1╖Θ╠
  64650. █Iw
  64651. ⌐q⌡s÷╣l¡2°¢┴Çï═^₧─à∩Q┤5«+π6├ΦΩ┌ZRaJF@3σ2ü±,fötû]ƒ    TGqÅed├╣XëgO5█º²A4(
  64652. C#û╨²█Nâ≈! !
  64653.  
  64654. COMRandomStream comment:
  64655. 'COMRandomStream is part of the COM Random Stream sample. See the "RandomStream sample" package for further details.'!
  64656. !COMRandomStream class methodsFor!
  64657.  
  64658. clsid
  64659.     "Answer the receiver's CLSID."
  64660.  
  64661.     ^CLSID fromString: '{A1D42F35-E6C0-11D2-833B-0020AFAB8EFE}'!
  64662.  
  64663. progID
  64664.     "Answer the receiver's programmatic ID, typically used from scripting or macro languagues to 
  64665.     create instances of the receiver, e.g. 'Dolphin.Object.1'"
  64666.  
  64667.     ^'Dolphin.RandomStream.1'! !
  64668.  
  64669. !COMRandomStream methodsFor!
  64670.  
  64671. get_LowerBound: plLowerBound
  64672.     "Private - Implement IRandomStream::LowerBound().
  64673.     Answer the receiver's lower bound via the [out] parameter, plLowerBound."
  64674.  
  64675.     plLowerBound value: lowerBound.
  64676.     ^S_OK!
  64677.  
  64678. get_Seed: plSeed 
  64679.     "Private - Implement IRandomStream::Seed().
  64680.     Answer the receiver's seed through the [out] parameter, seed"
  64681.  
  64682.     plSeed value: stream seed.
  64683.     ^S_OK!
  64684.  
  64685. get_UpperBound: plUpperBound
  64686.     "Private - Implement IRandomStream::get_UpperBound().
  64687.     Answer the receiver's upper bound via the [out] parameter, plUpperBound."
  64688.  
  64689.     plUpperBound value: upperBound.
  64690.     ^S_OK!
  64691.  
  64692. initialize
  64693.     "Private - Initialize the reciever's instance variables (suitably for the lottery)."
  64694.  
  64695.     lowerBound := 1.
  64696.     upperBound := 49.
  64697.     stream := Random new.
  64698.     !
  64699.  
  64700. interfaceClass
  64701.     "Answer the dual interface supported by the receiver."
  64702.  
  64703.     ^IRandomStream!
  64704.  
  64705. Next: next 
  64706.     "Private - Implement IRandomStream::Next().
  64707.     Answer the next pseudo-random number in the sequence defined by the receiver
  64708.     via the [out] parameter, next."
  64709.  
  64710.     next value: (stream next * (upperBound-lowerBound) + lowerBound) asInteger.
  64711.     ^S_OK!
  64712.  
  64713. put_LowerBound: value
  64714.     "Private - Implement IRandomStream::put_LowerBound().
  64715.     Set the receivers lowerBound from the [in] parameter, value."
  64716.  
  64717.     lowerBound := value.
  64718.     ^S_OK!
  64719.  
  64720. put_Seed: newValue
  64721.     "Private - Implement IRandomStream::put_Seed().
  64722.     Set the receiver's seed from the [in] parameter, dwValue."
  64723.  
  64724.     stream seed: newValue.
  64725.     ^S_OK!
  64726.  
  64727. put_UpperBound: value
  64728.     "Private - Implement IRandomStream::put_UpperBound.
  64729.     Set the receiver's upperBound from the [in] parameter, value."
  64730.  
  64731.     upperBound := value.
  64732.     ^S_OK! !
  64733.  
  64734. COMSingletonClassFactory comment:
  64735. 'COMSingletonClassFactory is simple specialization of COMClassFactory which always serves up the same instance of its registered coclass.
  64736.  
  64737. Note that although this is a useful concept (it is supported by the ATL for example), it is not strictly supported by COM which expects every call to CoCreateInstance() to answer a brand new instance of the coclass. This can break the apartment threading model when sharing an object since COM assumes that the object is created in the apartment of the caller, and where multiple apartments exist this can result in one apartment erroneously holding an unmarshalled interface pointer to an object in another apartment.
  64738.  
  64739. Dolphin''s standard implementation of IClassFactory. It can serve up instances of a particular coclass (possibly also a subclass of COMInterfaceImp), and having been registered once for any paricular coclass it will re-register the availability of that coclass with COM each time that Dolphin is started.
  64740.  
  64741. Instance Variables:
  64742.     current        - the lazily instantiated singleton instance of the receiver''s coclass.
  64743.  
  64744. Class Variables:
  64745.     None
  64746. '!
  64747. !COMSingletonClassFactory methodsFor!
  64748.  
  64749. createInstance: pUnkOuter
  64750.     "Private - Answer the singleton instance of the receiver's server class."
  64751.  
  64752.     current isNil ifTrue: [
  64753.         current := super createInstance: pUnkOuter].
  64754.     ^current! !
  64755.  
  64756. COMInterfaceEnumerator comment:
  64757. 'COMInterfaceEnumerator is Dolphin''s generic implementation of COM enumerators for collections of interface pointers, i.e. IEnumUnknown.
  64758. '!
  64759. !COMInterfaceEnumerator class methodsFor!
  64760.  
  64761. newEnumeratorOn: sequence
  64762.     "Answer a new <IEnumUnknown> onto a new instance of the receiver
  64763.     that enumerates over the contents of the <sequencedReadableCollection>, 
  64764.     sequence."
  64765.  
  64766.     ^self newEnumerator: IEnumUnknown on: sequence! !
  64767.  
  64768. !COMInterfaceEnumerator methodsFor!
  64769.  
  64770. arrayBufferAt: buf length: count
  64771.     "Private - Answer a suitable <ExternalArray> wrapping the buffer at <ExternalAddress>,
  64772.     buf, of <integer> length, count."
  64773.  
  64774.     ^DWORDArray fromAddress: buf length: count
  64775. !
  64776.  
  64777. nextElement
  64778.     "Private - Answer a copy of the next element of the receiver.
  64779.     Implementation Note: We must add a reference as we are copying
  64780.     interface pointers into an output argument."
  64781.  
  64782.     | pi |
  64783.     pi := contents next.
  64784.     pi _addRef.
  64785.     ^pi yourAddress
  64786. ! !
  64787.  
  64788. COMVariantEnumerator comment:
  64789. 'COMInterfaceEnumerator is Dolphin''s implementation of <IEnumVARIANT>.'!
  64790. !COMVariantEnumerator methodsFor!
  64791.  
  64792. ∩A?4íé7'«─µC╟≤▌∙═Ω╥ƒÿ■╙½@T║⌐Çz3KY┬¥~]æP"k]nΓ┴Uc+J¡heñδ4≥█¡┤▓ùß╩P·7)cp╓╣`7á▌┴MAÜ╙8z║F∞=º╝\Z,íqî█¬CfÑ2╟▒╠µ╒Φ:╚É█ûr╗πR)╚    ~┬Φ6╩ƒ^ºU=┘ZÜⁿ=x╣┴w╨o╬╛╔ùTaºε∙∞τѱnH≈ó▀`o/ki<Üφ#1AU╤ìà▒@-8FX█é'! !
  64793.  
  64794. OLELockBytes comment:
  64795. 'OLELockBytes is an implementation of the ILockBytes interface on a Smalltalk <ByteArray>. It is primarily intended for testing and development purposes (it is a handy way to see exactly what is being written to a stream), and also as an example implementation of a system COM interface.
  64796.  
  64797. OLELockBytes is similar to the system provided ILockBytes implementation on top of a global memory handle, except that the underlying storage mechanism is a ByteArray and it is somewhat slower. It doesn''t support locking.'!
  64798. !OLELockBytes class methodsFor!
  64799.  
  64800. εJ}Z7!!░è!!D╨└╬ ï,÷╤²î ┘ƒëù▐¬PH¥ó╘~`▌è~S╫QA=.R]x≈Å\&)Iπh[oΓ╣%∙█K¡Ñ≈æτ╩â}P
  64801. ││cr║┴┼╖çT╝Q╖d╬M╝SV=≥*▌│3±(Æ9▀öâ⌠═│zï#Üî■f╟≤NPºsP;Ç÷'█╠è+FÑN╧ß4H≈╙}╨Do├:䣬h{░Ñ┌τ⌠╗! !
  64802.  
  64803. !OLELockBytes methodsFor!
  64804.  
  64805. π]3&bΣÄ<╕úë)æRï╜¡ⁿ∞▐╔╘¬≈σî╛╘;g@SÆÆ?^éZ%hGc
  64806. ╢ôZc/YªnyΓ∞g°╟V╗≡≡▐■┴
  64807. ûz].v█«d3¼┼┼\ÜVçpεBñzà ∙_[Exαj░▄SÖA`ΓBQ╣ ⌐ƒ╬╣gì▀┴╬<á▐UNºc!
  64808.  
  64809. ΓK)06░£_C╙δ¡$û(Σ╞»╪÷╥ƒ╓▒ⁿ▒VM½¿ÇtuB┌ü~@Æ\A#x^A+GΓëd?[ª<Rx░¬9│£/j┼▌▐á⌡╓ä!
  64810.  
  64811. ΓK7!!░è!!┤╜âp┼=⌠╥»╩∞╪╥Å■ß▒RQ½√╘t)S▄ÇS8■t8gMR
  64812. ╢╠^zi6Vπh[oΓ╣!!⌠┘G@º▒≈£ε█╫rLc ╬┤hr╝╠├\AâüVf║BñiÖ√Nx⌡lÜ₧VÆG9«/╓û«£ÑⁿzåÜ£ûnQε■QB▒e7┬ⁿ'▀═K½;├╬÷mn≈┬5└C}┼;±ÇèJ`╢⌐²∞╛Fº≥fO╝⌠■JkBKo<Üú8t δ┘½│Kl%!!░ΦgäHB¢⌡▄╖εxñ¬Ä─ö*░τë█E5R▓<á*lKτúg┴azΦîäÇ¥ü╫û╟≤D║Z╙J∩ ╥ΓΩƒNl\0≤2ü╖"c╤6åZ┌ UkÅch═∞0±e]╦╢·V=6SY}┘
  64813. ╫╫▌
  64814. Dφë1@▐π    £ÜèI╩l$=*x┴ 1)╤6╩╗▌▄
  64815. ß⌐σ╖┘ƒÇ╥5╩φGC"αÇè╟+«g@
  64816. ⌠│ΩÄöeÿ└lñçσZΣε≥=ï05ô╓╝Sìα%ÿ«│S½Åπ+ æ╜Θ¼C╕╬ô1âë^kï!
  64817.  
  64818. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢Æ
  64819. Xr#╡}Acú⌐, ═ B┼▌┌⌠₧═
  64820. ÆgZ3 °Ñy7Å█╥XQ╒û!
  64821.  
  64822. ≤A74;í⌐ &╖≤╠9æ>≤└»╪±ìƒ╨░÷σDJ½│Ü;cjC╘ΘT;╒oV#xZGnO╗┴,\v*Náyh╗┐%Θ₧MΦú┐¢╖▌Æ}H.i╘ⁿy:½ë╙IMûòp¬ñ|₧∙X,Θ$ï╓VÅG╞i:┴¥╬╢┴Ñ~çå█ÆhO║∙R■Eoç²=▀╙~πE=╔L╔H┐mq█╥~îZ╚6ó£ÉQdúíΩΩ≤F╝ⁿe╘è█#.jE^)&ï╣McFD╠6┘Y╩Φ`9WD╒àa╔7h√Ü╕║σuß⌐┴▀ƒ.╣Γ╩ Θ8HC»h²`÷╛3ÇhUΦFëêçåàï⌠╨ατ1¿Φ=┬╞∞àZ'"l$W!
  64823.  
  64824. ≤A4/=■╧3'ôºÿ/é:≤╣àÑ╝τ═▄¿≤▒V≥√≥~`AL╫─*ZÆF3z^jΣÇr)½}EoΓ┐( ₧Q¡┤╛ÿ■╩^╦}Pkg▀«3r¡╚╨XK£èX7├)█∙σEJx≤aî╫CÖ4¡▌å╞±╔▓!
  64825.  
  64826. ≥M=XR══'⌐╛ë8┼+Θ╤»▀≈═┌ò▒⌠σGK║√┬bgM╙û,SÄV/~IVx
  64827. °ò]&$Vπh[oΓ╣%∙█K¡Ñ∙▄ÜÑqt■J\ze╔ⁿ~;┤╠!
  64828.  
  64829. ╓V.0░╒r&╝»ƒ/æ±┬╡îε⌡╩╙■±º    ╝╣ÇkpJa└ì*FÆQj~XQ\ ò
  64830. \hf"╔Z░ó6√╩G@σ≈₧ôτ├ÆzJ@zh▀ⁿDí╩╦{QüÇL/ÖQ┐iò ΦI1∩pÜ╠_¥Aq∞)▌æ╫ ├«=σg÷╡£h
  64831. εσ_E╢ ~┬Φ!!╤╚≤No╩V╬V·+!!φ╧}éPk╤*┤╧ùAp≤╣Ω≈⌠ΦµaR╛σ≥%I@u;èú8p[╩▀Å»Ma%.&│Ç#çUùΣ╘╝░!!σ┤àìì;⌡Γ┼╬$K»k∙4KΩ░}Çz^½¢┴ä£╓\Å╙╦ªVⁿp¿n≡&└⌠∞┌gZ K8πw£±mgê Ü]▓r(@fàau₧■yú7N╟░ⁿ!!?Xw┬╫▄▐Fùµ=╛≤E▀¥₧Q█bxdH╤░7 2ä`ô╗┘▐∞╕⌠÷█Ö╬KêAαéDE0αô£S┬>└·¼╖╦╔&1₧ö:¿äµQΣΘΘ ÄId>éô∞Eïα#à¿│G─┘*╔UuiƒΘó╧-æ∞²T éDíεR$+¼≥╦╬üRRFäWA⌐▓═N|òÇⁿSêπÅ)Q½╞6Hß(¿╦q¬W²╚╝í╧^╬<╣≡╩┴ñ╙{┤gH¢Pα╕╥BµÜ╧í3ñ'DX┘T@ äíû#ZRí8┘─L/éô∩mÿ■┬.█Q ┐~║█Σ┤╩e{aª¡σJi2╨9?»F╙VûÄ╝! !
  64832.  
  64833. OLELockFileBytes comment:
  64834. 'OLELockFileBytes is an implementation of the <ILockBytes> interface on to an arbitrary <File>. It is useful because the system does not provide a standard implementation of ILockBytes against a file, which makes it difficult to connect an <IStream> to an arbitrary file without first copying its contents into a global memory block.'!
  64835. !OLELockFileBytes class methodsFor!
  64836.  
  64837. εJ}Z4¡â7D╨└╬ ï,÷╤²î ┘ƒëù▐¬PH¥ó╘~`▌è~S╫QA=.R]x≈Å\&)Iπh[oΓ╣%∙█K¡Ñ≈ƒπ█ƒqZ@zoÜ¿e7εñ¬0Gà¥V)êJ║x╬M╝Pi4Σ*▌│3±(Æ9▀öâ°╔╖Γd÷¥Üp
  64838. ⌠▒Vb½l ∩àZ╖╬JΓS6σQ╬ß+`·┬"ékB╧<║■ÜPqá! !
  64839.  
  64840. !OLELockFileBytes methodsFor!
  64841.  
  64842. ΓK)06░£_C╙δ¡$û(Σ╞»╪÷╥ƒ╓▒ⁿ▒VM½¿ÇtuB┌ü~@Æ\A#x^A+GΓëd?[ª<Rx░¬9│£/j┼▌▐á±╞╫wQze╘¿~!
  64843.  
  64844. ΓK7!!░è!!┤╜âp┼=⌠╥»╩∞╪╥Å■ß▒RQ½√╘t)S▄ÇS8■t8gMR
  64845. ╢╠^zi6Vπh[oΓ╣!!⌠┘G@º▒≈£ε█╫rLc ╬┤hr╝╠├\AâüVf║BñiÖ√Nx⌡lÜ₧VÆG9«/╓û«£ÑⁿzåÜ£ûnQε■QB▒e7┬ⁿ'▀═K½;├╬÷mn≈┬5└C}┼;±ÇèJ`╢⌐²∞╛Fº≥fO╝⌠■JkBKo<Üú8t δ┘½│Kl%!!░ΦgäHB¢⌡▄╖εxñ¬Ä─ö*░τë█E5R▓<á*lKτúg┴azΦîäÇ¥ü╫û╟≤D║Z╙J∩ ╥ΓΩƒNl\0≤2ü╖"c╤6åZ┌ UkÅch═∞0±e]╦╢·V=6SY}┘
  64846. ╫╫▌
  64847. Dφë1@▐π    £ÜèI╩l$=*x┴ 1)╤6╩╗▌▄
  64848. ß⌐σ╖┘ƒÇ╥5╩φC_(Ñ╥ΓyóC╜mu∩╖┐└ƒbâ¢>│┼í|╬ÉÆ;åAtmMà╞╝Cû⌠9ÿ²²WàÄI╖vrjΩùñ╬<▀Σ²T!
  64849.  
  64850. τM+XR══;│┐ì>Ǽö╬┬φ└┌╟■µ¡V⌐║╠nvY╘─*ZÆV/m^Z}
  64851. Σ╞!!aI¬pV-σδ)⌠═Vª┤▓▐ß╬ûvR "╖╓X╟≈╞PDÉ!
  64852.  
  64853. τM+oxÑü+░¼Å>ΦUêû▀▐≈┴▐┴╗▓Φp║»Ço{M─à2GÆK,.O[nOΣä\o0J▒;@*σ∞&≤╥GG∩≈╛ÉΣ█öqor╙╜o>½ë╘VüûVt╝DúpòΦ6╬fò█Zê 6┴jQ╣√┼ └Ñ3╥P▀Ü¥Sñ⌠TP!
  64854.  
  64855. ≤A74;í⌐ &╖≤╠9æ>≤└»╪±ìƒ╨░÷σDJ½│Ü;cjC╘ΘT;╒oV#xZGnO╗┴,\v*Náyh╗┐%Θ₧MΦú┐¢╖▌Æ}H.i╘ⁿy:½ë╙IMûòp¬ñ|₧∙X,Θ$ï╓VÅG╞i:┴¥╬╢┴Ñ~çå█ÆhO║∙R■Eoç²=▀╙~πE=╔L╔H┐mq█╥~îZ╚6ó£ÉQdúíΩΩ≤F╝ⁿe╘è█#.jE^)&ï╣McFD╠6┘Y╩Φ`9WD╒àa╔7h√Ü╕╛⌡mß·æ┬ë7íΩ╞òE$¿1¡T5ï╪~╥dOΘ\▐æ▒¢┘ÿ┘╨ΦV«Rx┐eσsêºδ╦T}M    l╕!
  64856.  
  64857. ≥M=XR══'⌐╛ë8┼+Θ╤»▀≈═┌ò▒⌠σGK║√┬bgM╙û,SÄV/~IVx
  64858. °ò]&$Vπh[oΓ╣%∙█K¡Ñ∙▄ÜÑqt■JX    beÜ»d(½!
  64859.  
  64860. ╥P&ox┤╝ÄÜ╕┼8≤╥▄╪ ├∙┘┐⌡ B▒Æ╬ovOS└ΘT;╒oV#xZGnO╗┴7Tv*J«y]~Γ┐( ₧k,º┤╝╝ε█═.motÆ⌡-;á▌┼KNöûVs╗M╡iÖ≥"cQ╒lÜ╠\▄Kg∞=┌Ç╧∩î¼z£ô₧╙u¿■EIúttî»$█ƒ\µOo┘L▀µ!!mαçh╨Mx╔;┤£éP4ºª±φák┬¥lY»σ╛JJoSF&&åú)aJ╚╔QÖ¿Chu φäoé] ÖΓ╘°Φiß·ç┴¢9⌡α╞▀    2Ñ2╛b2ê╪z╒}^■F¡òÆÜàïσ±╟v╟&·l≤5÷≤∙╦<JhH\    < ¥π(bö&╤#╡qGKoâ gê∩Ω OÆΓ d~*J±Z▌╞╨Iφë5C╢δ@ÆÉ┼╬ qt"÷╫d)ÿaÆû▓╗gí«°╗╬╤ïO»lü░vbαƒ¢╞/π q│┐╛τ╦+tɃ>τëⁿX<ÑΩ≡s├sD9í 4█╖╬¡èÿ╩ÆAà9å≤τ·D╗Ö∙.Ñ│k2╥Ç($*½∙▌æ╒XH╧z%┴║╞wrª¬ùt»┘│B! !
  64861.  
  64862. ClosedCommandDescription comment:
  64863. 'ClosedCommandDescription is the class of <CommandDescription>s that have a pluggable implementation of #queryCommand: such that they can be completely self contained, both describing the command to be performed, where to send it, and also managing enablement/disablement.
  64864.  
  64865. Instance Variables:
  64866.     queryBlock    <monadicValue> implementation of #queryCommand:. Can be nil.
  64867.     receiver        <Object> to which the command will be sent. Can be nil, in which case queryBlock determines receiver. 
  64868.     
  64869. '!
  64870. !ClosedCommandDescription class methodsFor!
  64871.  
  64872. command: commandMessage description: aString queryBlock: aMonadicValuable
  64873.     "Answer a new instance of the receiver to send the specified <commandMessage>. The 
  64874.     <readableString> description, aString, is used for bubble help, etc. The <monadicValuable> 
  64875.     argument, aMonadicValuable, is evaluated with a <CommandQuery> argument to determine 
  64876.     the status of the command, and it should also set the desired receiver."
  64877.  
  64878.     ^self command: commandMessage description: aString queryBlock: aMonadicValuable receiver: nil!
  64879.  
  64880. command: commandMessage description: aString queryBlock: aMonadicValuable receiver: anObject
  64881.     "Answer a new instance of the receiver pre-targeted to the receiver, anObject,
  64882.     to send the specified <commandMessage>. The <readableString> description,
  64883.     aString, is used for bubble help, etc. The <monadicValuable> argument, aMonadicValuable,
  64884.     is evaluated with a <CommandQuery> argument to determine the status of the command, and 
  64885.     can also override the pre-specified receiver if desired."
  64886.  
  64887.     ^(super command: commandMessage description: aString)
  64888.         queryBlock: aMonadicValuable;
  64889.         receiver: anObject;
  64890.         yourself!
  64891.  
  64892. command: commandMessage description: aString receiver: anObject
  64893.     "Answer a new instance of the receiver pre-targeted to the receiver, anObject,
  64894.     to send the specified <commandMessage>. The <readableString> description,
  64895.     aString, is used for bubble help, etc. The resulting command description will
  64896.     always be enabled (unless the query block is subsequently modified), and will
  64897.     always be sent to anObject."
  64898.  
  64899.     ^self command: commandMessage description: aString queryBlock: nil receiver: anObject! !
  64900.  
  64901. !ClosedCommandDescription methodsFor!
  64902.  
  64903. queryBlock: aMonadicValuable
  64904.     queryBlock := aMonadicValuable!
  64905.  
  64906. queryCommand: aCommandQuery
  64907.     "Update the <CommandQuery> argument with status and target details about the 
  64908.     receiver's own command. Answer whether the command query has been handled."
  64909.  
  64910.     ^queryBlock isNil 
  64911.         ifTrue: 
  64912.             [(self command class conformsToProtocol: #commandTarget) 
  64913.                 ifTrue: [self command queryCommand: aCommandQuery]
  64914.                 ifFalse: 
  64915.                     ["If no query block and dumb command, such as a Symbol, enable if
  64916.                     the receiver was specified when this closed command was created."
  64917.  
  64918.                     self receiver 
  64919.                         ifNil: [false]
  64920.                         ifNotNil: 
  64921.                             [:target | 
  64922.                             aCommandQuery
  64923.                                 isEnabled: true;
  64924.                                 receiver: target.
  64925.                             true]]]
  64926.         ifFalse: 
  64927.             [queryBlock value: aCommandQuery.
  64928.             "If the queryBlock has not set the receiver, then default to the pre-set receiver."
  64929.             aCommandQuery receiver isNil ifTrue: [aCommandQuery receiver: self receiver].
  64930.             true]!
  64931.  
  64932. receiver
  64933.     ^receiver!
  64934.  
  64935. receiver: anObject
  64936.     receiver := anObject! !
  64937.  
  64938. DelegatingCommandPolicy comment:
  64939. ''!
  64940. !DelegatingCommandPolicy methodsFor!
  64941.  
  64942. visitPresenter: presenter
  64943.     "Visit the <presenter>, presenter, as the next in the chain-of-command, 
  64944.     adding its contributions to that chain. Answer the next <presenter> to visit,
  64945.     or answer the argument to get the default behaviour which is to move up
  64946.     to the parent presenter."
  64947.  
  64948.     ^presenter addToCommandRoute: self! !
  64949.  
  64950. LegacyCommandPolicy comment:
  64951. ''!
  64952. !LegacyCommandPolicy methodsFor!
  64953.  
  64954. queryCommand: query
  64955.     "Private - Enter details about a potential command into the <CommandQuery>, query.
  64956.     Typically this involves visiting each potential <commandTarget> on the
  64957.     chain-of-command.
  64958.     Implementation Note: Override the superclass behaviour to implement the pre
  64959.     Dolphin 4.0 command routing pattern, which did not include the command itself
  64960.     in the route."
  64961.  
  64962.     self commandPath do: [:each | 
  64963.         each queryCommand: query.
  64964.         query isEnabled ifTrue: [
  64965.             "If the accepting target has not specified the receiver, then default to it."
  64966.             query receiver isNil ifTrue: [query receiver: each]].
  64967.         "Early out if a receiver was found irrespective of whether the command is actually enabled."
  64968.         query receiver notNil ifTrue: [^query]].
  64969.  
  64970.     ^query.
  64971.  
  64972.     
  64973.     !
  64974.  
  64975. visitPresenter: presenter
  64976.     "Visit the <presenter>, presenter, as the next in the chain-of-command, 
  64977.     adding its contributions to that chain. Answer the next <presenter> to visit,
  64978.     or answer the argument to get the default behaviour which is to move up
  64979.     to the parent presenter."
  64980.  
  64981.     self appendPresenter: presenter.
  64982.     ^presenter! !
  64983.  
  64984. CompiledExpression comment:
  64985. ''!
  64986. !CompiledExpression methodsFor!
  64987.  
  64988. asDebugMethod
  64989.         "Private - Answer a debug version of the receiver with breakpoints after each 
  64990.         expression/statement."
  64991.     
  64992.         | debugMethod |
  64993.         debugMethod := self compilerClass 
  64994.                         compileDebugExpression: self getSource 
  64995.                         in: self methodClass
  64996.                         evaluationPools: self evaluationPools.
  64997.         "Copy across some bits we need as we are an unbound expression"
  64998.         debugMethod sourceDescriptor: self sourceDescriptor.
  64999.         ^debugMethod!
  65000.  
  65001. evaluate: aString for: anObject evaluationPools: anArrayOfPools
  65002.     "Evaluate the receiver (whose source is aString), with the receiver, anObject, 
  65003.     within the additional compilation context, anArrayOfPools.
  65004.     N.B. This message is sent by the compiler to evaluate constant expressions
  65005.     DO NOT REMOVE IT."
  65006.  
  65007.     self storeSourceString: aString evaluationPools: anArrayOfPools logged: false.
  65008.     ^self value: anObject!
  65009.  
  65010. evaluationPools
  65011.     "Answer the evaluation pools used to compiler the receiver."
  65012.  
  65013.     ^self sourceDescriptor at: 2!
  65014.  
  65015. getColoredSource: aString
  65016.         "Private - Answer an RTF format source string from the source, aString,
  65017.         for the receiver."
  65018.     
  65019.         ^self compilerClass syntaxColorOfExpression: aString in: methodClass evaluationPools: self evaluationPools!
  65020.  
  65021. getDebugInfo
  65022.     "Private - Invoke the compiler to answer a compilation result containing a 
  65023.     recompilation of the receiver, RTF, a map between IP ranges and expressions 
  65024.     in the source, and a map between IP ranges     and an OrderedCollection of 
  65025.     Associations between IP positions and temporaries up to that position in 
  65026.     the receiver, ordered by IP."
  65027.  
  65028.     ^self compilerClass 
  65029.         debugInfoForExpression: self getSource 
  65030.         in: self methodClass
  65031.         evaluationPools: self evaluationPools
  65032.         debug: self isDebugMethod!
  65033.  
  65034. getSource
  65035.     "Answer the source of the receiver."
  65036.  
  65037.     ^self sourceDescriptor at: 1!
  65038.  
  65039. isExpression
  65040.     "Private - Answer whether the receiver is a standalone (unbound) expression as opposed to 
  65041.     a method."
  65042.  
  65043.     ^true!
  65044.  
  65045. storeSourceString: aString evaluationPools: pools logged: aBoolean
  65046.     "Private - Ask the receiver's source manager to record its expression 
  65047.     source, aString, logging the evaluation to the change log if requested."
  65048.  
  65049.     aBoolean ifTrue: [self class sourceManager logEvaluate: aString].
  65050.     self sourceDescriptor: (Array with: aString with: pools)!
  65051.  
  65052. value: anObject
  65053.     "Evaluate the receiver with the argument, anObject, 
  65054.     as its receiver, answering the result."
  65055.  
  65056.     ^self value: anObject withArguments: #()! !
  65057.  
  65058. CompiledMethod comment:
  65059. ''!
  65060. !CompiledMethod class methodsFor!
  65061.  
  65062. defaultSortBlock
  65063.     "Private - Answer a dyadic valuable (sort block) suitable for comparing two instances
  65064.     of the receiver"
  65065.  
  65066.     ^[:x :y | (x methodClass==y methodClass)
  65067.         ifTrue: [x selector <= y selector]
  65068.         ifFalse: [x methodClass <= y methodClass]] !
  65069.  
  65070. deprecatedIcon
  65071.     "Private - Answers an Icon that can be used to represent a deprecated instance of this class"
  65072.  
  65073.     ^Icon fromId: 'COMPILEDMETHOD_DEPRECATED.ICO'
  65074. !
  65075.  
  65076. fromString: aString
  65077.     "Answers the CompiledMethod identified by aString or nil if none is found."
  65078.  
  65079.     | className selector stream theClass isMeta |
  65080.     stream := aString readStream.
  65081.     className := stream upToAll: '>>'.
  65082.     stream atEnd ifTrue: [^nil].
  65083.     (isMeta := className endsWith: ' class') 
  65084.         ifTrue: [className := className allButLast: ' class' size].
  65085.     theClass := self environment at: className ifAbsent: [^nil].
  65086.     isMeta ifTrue: [theClass := theClass class].
  65087.     selector := stream upToEnd asSymbol.
  65088.     ^theClass compiledMethodAt: selector ifAbsent: []!
  65089.  
  65090. icon
  65091.     "Answer an Icon representing the receiver."
  65092.  
  65093.     ^##(self) defaultIcon!
  65094.  
  65095. overriddenIcon
  65096.     "Private - Answers an Icon that can be used to represent an overridden instance of this class"
  65097.  
  65098.     ^Icon fromId: 'OVERRIDDEN.ICO'!
  65099.  
  65100. privateIcon
  65101.     "Private - Answers an Icon that can be used to represent a private instance of this class"
  65102.  
  65103.     ^Icon fromId: 'COMPILEDMETHOD_PRIVATE.ICO'!
  65104.  
  65105. publicIcon
  65106.     "Private - Answers an Icon that can be used to represent a public instance of this class"
  65107.  
  65108.     ^Icon fromId: 'COMPILEDMETHOD_PUBLIC.ICO'!
  65109.  
  65110. publishedAspectsOfInstances
  65111.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  65112.     
  65113.         ^(super publishedAspectsOfInstances)
  65114.             add: (Aspect name: #selector) beReadOnly;
  65115.             yourself
  65116.     ! !
  65117.  
  65118. !CompiledMethod methodsFor!
  65119.  
  65120. asDebugMethod
  65121.         "Private - Answer a debug version of the receiver with breakpoints after each 
  65122.         expression/statement."
  65123.     
  65124.         | debugMethod |
  65125.         self isDebugMethod ifTrue: [^self].
  65126.         debugMethod := self compilerClass compileDebugMethod: self getSource in: self methodClass.
  65127.         "Copy across some bits we need as we are an unbound method"
  65128.         debugMethod 
  65129.             sourceDescriptor: self sourceDescriptor;
  65130.             selector: self selector;
  65131.             isPrivate: self isPrivate.
  65132.         ^debugMethod!
  65133.  
  65134. browse
  65135.         "Open a suitable browser onto the receiver."
  65136.     
  65137.         Smalltalk developmentSystem browseMethod: self!
  65138.  
  65139. categories
  65140.     "Answer a <Collection> of all the method categories in which the receiver is
  65141.     included."
  65142.  
  65143.     ^self methodClass categoriesOfMethod: self!
  65144.  
  65145. categories: categories
  65146.     "Private - Set the categories of the receiver to the <Collection> of
  65147.     <methodCategory>s, categories. Remove the receiver from any method 
  65148.     categories it is currently associated with. If the set of method categories
  65149.     has changed, then triggers a #methodCategorized: event.
  65150.     Implementation Note: The receiver has no knowledge of categories, so fires
  65151.     this request straight off to the category system."
  65152.  
  65153.     (self methodClass methodCategoryClass setMethod: self categories: categories) 
  65154.         ifTrue: [self methodClass environment trigger: #methodCategorized: with: self]!
  65155.  
  65156. changeManager
  65157.     "Private - Answer the receiver's change manager.
  65158.     At present change management is purely change log based."
  65159.  
  65160.     ^self class sourceManager!
  65161.  
  65162. ΓM70*æ£;'╜≤╠+╢&∞┘Ω╪∞▐▄÷╖Γ¡VQ╥╤⌐9CZ_─à*W╫`XArΓÆQ}c%]║lGyΓ┐( ₧P½▓╛ê≥▌\ ä}P.aΘÑ`?½▌╥PK╢âp╝█∙lû8\ 4τ$î╩VÄGGú.╨ù≡Γ▐⌐}ÅW▀╙ÆOúⁿRP░i    Xï ;█═ΣH?─Z╚%τ?h≈└"éQk╠9±█åPG╝╗Ω²σOµÖ
  65163. 1╙ì╪c!
  65164.  
  65165. displayOn: aStream 
  65166.     aStream
  65167.         print: self methodClass;
  65168.         nextPutAll: '>>';
  65169.         nextPutAll: self selector!
  65170.  
  65171. getColoredSource: aString
  65172.         "Private - Answer an RTF format source string from the source, aString,
  65173.         for the receiver."
  65174.     
  65175.         ^self compilerClass syntaxColorOfMethod: aString in: self methodClass!
  65176.  
  65177. getDebugInfo
  65178.     "Private - Invoke the compiler to answer a compilation result containing a 
  65179.     recompilation of the receiver, RTF, a map between IP ranges and expressions 
  65180.     in the source, and a map between IP ranges and an OrderedCollection of 
  65181.     Associations between IP positions and temporaries up to that position in 
  65182.     the receiver, ordered by IP."
  65183.  
  65184.     ^self compilerClass 
  65185.         debugInfoFor: self getSource 
  65186.         in: self methodClass 
  65187.         debug: self isDebugMethod!
  65188.  
  65189. getSource
  65190.     "Answer the source of the receiver.
  65191.     This task is delegated to the SourceManager."
  65192.  
  65193.     ^self class sourceManager getSourceOfMethod: self!
  65194.  
  65195. hasChanged
  65196.     "Private - Answer whether the receiver has been 'changed' (i.e. it has source in
  65197.     the change log)."
  65198.  
  65199.     ^self changeManager hasMethodChanged: self!
  65200.  
  65201. icon
  65202.     "Answers an Icon that can be used to represent this object."
  65203.  
  65204.     self isDeprecated ifTrue: [^self class deprecatedIcon].
  65205.  
  65206.     ^self isPrivate
  65207.         ifTrue: [self class privateIcon]
  65208.         ifFalse: [self class publicIcon]
  65209. !
  65210.  
  65211. infoTip
  65212.     "Private - Answer a suitable 'info tip' for the receiver."
  65213.  
  65214.      | prots stream method |
  65215.     stream := String writeStream: 32.
  65216.     stream
  65217.         display: self;
  65218.         nextPutAll: ' ('.
  65219.     self categories asSortedCollection asArray, 
  65220.             (self protocols asSortedCollection: [:a :b | a asSymbol < b asSymbol])
  65221.         do: [:category | stream display: category]
  65222.         separatedBy: [stream nextPutAll: ', '].
  65223.     stream nextPut: $).
  65224.     ^stream contents
  65225.  
  65226. !
  65227.  
  65228. isClassMethod    
  65229.     "Answer true if the receiver is a class method."
  65230.  
  65231.     ^self methodClass isMeta!
  65232.  
  65233. isDeprecated
  65234.     "Answer whether the receiver is marked as being deprecated.
  65235.     This is based on whether a reference to the symbol, #deprecated, is found
  65236.     in the method, for which we use a ReferencesCategory."
  65237.  
  65238.     ^MethodCategory deprecatedMethods includesMethod: self!
  65239.  
  65240. isExpression
  65241.     "Private - Answer whether the receiver is a standalone (unbound) expression as opposed to 
  65242.     a method."
  65243.  
  65244.     ^false!
  65245.  
  65246. isExternalCall
  65247.     "Private - Answer whether the receiver is an external library call (foreign function invocation)."
  65248.  
  65249.     ^false!
  65250.  
  65251. isGetter
  65252.     "Answer true if the receiver is an instance variable getter method."
  65253.  
  65254.     ^self extraIndex=6!
  65255.  
  65256. isLoose
  65257.     "Answer whether the receiver is owned by a package different from that of its class."
  65258.  
  65259.     ^Package manager isLooseMethod: self!
  65260.  
  65261. isOverridden
  65262.     "Answer whether the receiver is overridden in a subclass."
  65263.  
  65264.     | sel |
  65265.     sel := self selector.
  65266.     self methodClass allSubclassesDo: [:sub | (sub includesSelector: sel) ifTrue: [^true]].
  65267.     ^false!
  65268.  
  65269. isOverride
  65270.     "Answer whether the receiver is overriding a method in a superclass."
  65271.  
  65272.     | methodSuper |
  65273.     methodSuper := self methodClass superclass.
  65274.     ^methodSuper notNil and: [methodSuper canUnderstand: self selector]
  65275. !
  65276.  
  65277. isUnbound
  65278.     "Answer whether the receiver is unbound (i.e. not linked into a class' method dictionary)."
  65279.  
  65280.     ^(self methodClass compiledMethodAt: self selector ifAbsent: [^true])    
  65281.         sourceDescriptor ~= self sourceDescriptor!
  65282.  
  65283. loseSource
  65284.     "Private - Set the source object of the receiver to a suitable message informing
  65285.     that the source data for the receiver has been lost. This is typically from saving
  65286.     an image from an executable, as the executable will have no associated .sml
  65287.     file."
  65288.  
  65289.     self sourceDescriptor: '"Source unavailable for this method"' !
  65290.  
  65291. name
  65292.     ^self methodClass name -> self selector!
  65293.  
  65294. owningPackage
  65295.     "Answers the package that owns the receiver or nil if it is not yet owned
  65296.     by any package"
  65297.  
  65298.     ^Package manager packageOfMethodOrItsClass: self!
  65299.  
  65300. owningPackage: aPackage
  65301.     "Set the receiver's <Package> to be the argument. Any current package association is lost."
  65302.  
  65303.     aPackage addMethod: self!
  65304.  
  65305. owningPackageIfLoose
  65306.     "Answers the package that owns the receiver as a loose method,
  65307.     or nil if it is not loose."
  65308.  
  65309.     ^Package manager packageOfMethod: self!
  65310.  
  65311. parseTree
  65312.     ^SmalltalkParser parseMethod: self getSource in: self methodClass
  65313. !
  65314.  
  65315. printOn: aStream 
  65316.     "Append a textual description of the receiver to aStream."
  65317.  
  65318.     self displayOn: aStream!
  65319.  
  65320. privacyCategory
  65321.     ^self isPrivate 
  65322.         ifTrue: [self methodClass methodCategoryClass private]
  65323.         ifFalse: [self methodClass methodCategoryClass public]!
  65324.  
  65325. protocols
  65326.     "Answer a <Collection> of all the method protocols in which the receiver is included."
  65327.  
  65328.     ^self methodClass allProtocols select: [:p | p includesSelector: self selector]
  65329. !
  65330.  
  65331. realCategories
  65332.     "Answer a <Collection> of all the 'real' (i.e. non-virtual) method categories in which 
  65333.     the receiver is included. Note that this does include the public/private categories."
  65334.  
  65335.     ^self methodClass realCategoriesOfMethod: self!
  65336.  
  65337. recompile
  65338.     "Private - Recompile the receiver."
  65339.  
  65340.     self methodClass recompile: self selector!
  65341.  
  65342. storeCategories
  65343.     "Private - Record the categories of the receiver.
  65344.     The job is simply delegated to the receiver's source manager."
  65345.  
  65346.     self class sourceManager storeCategoriesForMethod: self.!
  65347.  
  65348. storeSourceString: aString
  65349.     "Private - Record aString as the source for the receiver. Delegate to the receiver's source manager"
  65350.  
  65351.     self class sourceManager storeSourceString: aString forMethod: self! !
  65352.  
  65353. CompileFailedMethod comment:
  65354. 'In certain situations (package loading, method dropping etc) a method compilation will fail and yet a stub CompileFailedMethod is still installed in the class. This stub is useful since it allows the original method source to be accessible via the browsers and allows category information to be maintained for the failed method.
  65355.  
  65356. If you want to locate all of these compilation failures remaining in your image siimply evaluate:
  65357.  
  65358. SmalltalkSystem current browseCompileFailedMethods'!
  65359. !CompileFailedMethod class methodsFor!
  65360.  
  65361. icon
  65362.     "Answer an Icon representing the receiver."
  65363.  
  65364.     ^##(self) defaultIcon! !
  65365.  
  65366. !CompileFailedMethod methodsFor!
  65367.  
  65368. accessesInstVar: aString at: anInteger
  65369.     "Answer whether the receiver accesses the instance variable named, aString, which
  65370.     is the instance variable of its method class with the specified <integer> index."
  65371.  
  65372.     ^self refersToVariable: aString!
  65373.  
  65374. asDebugMethod
  65375.         "Private - Answer a debug version of the receiver with breakpoints after each 
  65376.         expression/statement."
  65377.     
  65378.     ^self!
  65379.  
  65380. icon
  65381.     "Answers an Icon that can be used to represent this class"
  65382.  
  65383.     ^self class icon
  65384. !
  65385.  
  65386. isCompilationFailure
  65387.     ^true! !
  65388.  
  65389. ExternalMethod comment:
  65390. 'ExternalMethod is the class of primitive <CompiledMethod>s which represent native, or external, function calls, such as those in the Win32 API. ExternalMethods mediate between the dynamically typed Smalltalk world of objects and the static value based world of C prevailing elsewhere.
  65391.  
  65392. The first literal of each ExternalMethod holds a <ByteArray> which contains a descriptor for the function call. The byte array format is understood by the <ExternalDescriptor> class, but essentially there are details of the return and argument types, the name of function, and space to cache the procedure address.
  65393. '!
  65394. !ExternalMethod class methodsFor!
  65395.  
  65396. initialize
  65397.     "Private - Initialize the receiver's class variables.
  65398.  
  65399.         ExternalMethod initialize.
  65400.  
  65401.     The format of the descriptor is:
  65402.         
  65403.         Proc                                Return                ArgN            ...    (Arg1)            External
  65404.         Address        Calling        Args    Literal    Return        Literal    ArgN    ...    (Literal)    Arg1    Function
  65405.         Cache        Convention    Length    Index        Type        Index        Type    ...    (Index)    Type    Name
  65406.  
  65407.         00 00 00 00    00            00        00        00        00        00    ...    (00)        00    AAAAAAAAAAA00
  65408.  
  65409.     The literal indices referred to are the indices of the (optional) argument types stored in the literal frame.
  65410.     The standard, built-in, types (such as #lpvoid, #dword) do not have these indices, or entries in the literal
  65411.     frame, but the types for passing/returning structures by value (#struct:) and by reference (#lp:) do - the
  65412.     entry in the literal frame is the relevant ExternalStructure class.
  65413.     Note that the arguments/return type are stored in reverse order for easier and faster processing by the VM
  65414.     external call primitives.
  65415.     "
  65416.  
  65417.     CallingConventionIndex := 5.
  65418.     ArgsLenIndex := 6.                "index of size of arguments descriptions (i.e. offset of proc. name string)"
  65419.     ReturnTypeIndex := 8.
  65420.     ReturnParmIndex := 7.
  65421.     ArgumentStartIndex := 9!
  65422.  
  65423. publishedAspectsOfInstances
  65424.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  65425.     
  65426.         ^(super publishedAspectsOfInstances)
  65427.             add: (Aspect name: #descriptor) beReadOnly;
  65428.             yourself
  65429.     ! !
  65430.  
  65431. !ExternalMethod methodsFor!
  65432.  
  65433. argsLen
  65434.     "Private - Answer the size of the argument description bytes in the receivers descriptor."
  65435.  
  65436.     ^self descriptorLiteral at: ArgsLenIndex!
  65437.  
  65438. argumentTypes
  65439.     "Private - Answer a Collection of the names of the argument types in the receiver
  65440.     in left to right order."
  65441.  
  65442.     ^self descriptor argumentTypes!
  65443.  
  65444. clear
  65445.     "Private - Clear down temporary information cached in the receiver.
  65446.     Here we clear down the proc. address cache."
  65447.  
  65448.     self descriptorLiteral replaceFrom: 1 to: 4 withObject: 0!
  65449.  
  65450. descriptor
  65451.     "Private - Answer an ExternalDescriptor generated from the receivers descriptor literal (which has
  65452.     a more compact, but more complex, format)."
  65453.  
  65454.     | descriptor typeinfo i type descriptorClass size |
  65455.     descriptor := self descriptorLiteral.
  65456.     i := self argsLen.
  65457.     size := i+4.
  65458.     typeinfo := ByteArray new: size.
  65459.     typeinfo
  65460.         at: 1 put: (descriptor at: CallingConventionIndex);
  65461.         at: 2 put: self argumentCount;
  65462.         at: 3 put: (descriptor at: ReturnTypeIndex);
  65463.         at: 4 put: (descriptor at: ReturnParmIndex);
  65464.         replaceFrom: 5 to: size with: descriptor startingAt: ArgumentStartIndex.
  65465.  
  65466.     descriptorClass := self descriptorClass.
  65467.     i := size.
  65468.     [i > 4] whileTrue: [
  65469.         type := typeinfo at: i.
  65470.         i := i - 1.
  65471.         (descriptorClass typeHasArgument: type) ifTrue: [
  65472.             typeinfo at: i + 1 put: (typeinfo at: i).
  65473.             typeinfo at: i put: type.
  65474.             i := i - 1]].
  65475.     ^descriptorClass descriptor: typeinfo literals: self literals
  65476.  
  65477. "
  65478. (UserLibrary compiledMethodAt: #childWindowFromPoint:point:) descriptor
  65479.  
  65480. descriptorLiteral at: 11
  65481. "!
  65482.  
  65483. descriptorClass
  65484.     "Private - Answer the class of descriptor to use for the receiver."
  65485.  
  65486.     ^ExternalDescriptor!
  65487.  
  65488. descriptorLiteral
  65489.     "Private - Answer the argument type descriptor literal from the receiver's 'literal frame'.
  65490.     The VM considers the descriptor part of the literal frame (for performance and VM simplicity
  65491.     a fixed offset is assumed for the literal frame), but we know better - all ExternalMethods 
  65492.     must have a descriptor, so it is an inst. var."
  65493.  
  65494.     ^self literalAt: 1!
  65495.  
  65496. functionName
  65497.     "Private - Answer the functionName."
  65498.  
  65499.     | bytes |
  65500.     bytes := self descriptorLiteral.
  65501.     ^String fromAddress: bytes yourAddress + ArgumentStartIndex + self argsLen - 1!
  65502.  
  65503. isExternalCall
  65504.     "Private - Answer whether the receiver is an external library call (foreign function invocation)."
  65505.  
  65506.     ^true!
  65507.  
  65508. isVirtualFunction
  65509.     ^self primitiveIndex = 80!
  65510.  
  65511. printOn: aStream
  65512.     "Append a textual description of the receiver to aStream."
  65513.  
  65514.     super printOn: aStream.
  65515.     aStream nextPut: $(; print: self functionName; nextPut: $)
  65516. !
  65517.  
  65518. procAddress
  65519.     "Private - Answer the receiver's proc. address. The cache will hold zero
  65520.     if a call has not yet been made through the function, so we detect this
  65521.     and use the appropriate KernelLibrary function."
  65522.  
  65523.     | address |
  65524.     address := self descriptorLiteral addressAtOffset: 0.
  65525.     ^address isNull
  65526.         ifTrue: [self methodClass default getProcAddress: self functionName]
  65527.         ifFalse: [address]
  65528. !
  65529.  
  65530. returnType
  65531.     "Private - Answer the return type for the receiver."
  65532.  
  65533.     ^self descriptor returnType!
  65534.  
  65535. stbSaveOn: anSTBOutFiler
  65536.     "Output the receiver to anSTBOutFiler. We must ensure that the cached proc. address is cleared."
  65537.  
  65538.     | descriptor |
  65539.     descriptor := self descriptorLiteral.
  65540.     anSTBOutFiler override: descriptor with: (descriptor copy replaceFrom: 1 to: 4 withObject: 0; yourself).
  65541.     super stbSaveOn: anSTBOutFiler.
  65542.  
  65543. ! !
  65544.  
  65545. SUnitDelay comment:
  65546. ''!
  65547. DolphinSureCertificate comment:
  65548. 'A DolphinSureCertificate can be used when signing a piece of DolphinSureTrustedData.  It can be used to guarantee that the trusted data is from a particular publisher and because it contains a public key that is used to encode the data one can feel confident that the data has not been modified in transit. Note that, a DolphinSureCertificate is also trusted data itself.  This prevents an attacker from forging the certificate.
  65549.  
  65550. If you wish to be able to make use of DolphinSureTrustedData within your applications, either directly or when you wish to digitally sign Dolphin web applets, then you will need to apply for a publisher''s certificate.  These are available from Object Arts Ltd at http://www.object-arts.com/DolphinSure.'!
  65551. !DolphinSureCertificate class methodsFor!
  65552.  
  65553. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  65554. σäM&2G¬oi«¬3Θ£/j┼▌▐á┤îTÆxXI.d▀║l'ó▌ΘZG¢!
  65555.  
  65556. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐ì≥├^₧zWga╓╡w7├ú⌐% {∙@áWñhâ∙Ul6⌡aæ╩n¥PzÑ;ô╚₧╢√íaåæ£áuá≡[ªexɵ#╩╓PΘoïj╘ß8rφ┬|éaa╬+┤╥ù1ΓΘ!
  65557.  
  65558. ∞]39▒â&D╨└╬ ï,÷╤²▀╛╓ƒ╤╗⌠ñFO½√╔u`\W▄ç;ÿY>f^y
  65559. ⌡äOc4»sRnº»`ⁿ╠MΦú┐¢╖Γ^┤qLgf╙┐l&½┌ÇJ\ÜûT─.▄«%≤]_1∩Wè╠\┐Gf╕    :┌æ┬Γ╔ôgçÜ█₧e,½πCMñi    zûΩ ₧█Zß@:└K!
  65560.  
  65561. ∩A0w_Qµ┐  ¼¿ÿ/┼ríßⁿ╔╛ö╓█╕² .╒╓¬`MZ╘─-ZÿJH.@TGBµìTc([!
  65562.  
  65563. ±Q%<+¼è 
  65564. ┐╗ÿ#â6Γ╒√╔ñù▄╨¼µ¼UJ╝║╘~3XD█Æ?FÆtA34Cyα¬@ L&ßLAc┤¬4 ₧@¥ñ▓▐┤╞ÿ.m░╒~7ó╧ÇJ@܃[íWƒpÇ∙\J,î!
  65565.  
  65566. ⌠J3 +░è6
  65567. ╡ºÿ/ï+╓╒²┬≈┘╪╕╘¢τrM¼¼┼i3IXÆ╪;JöZT>gT]X
  65568. ·äMi4πh[k╢δ#√╨¡≈óì≥╦\
  65569. ÿ4JopÜ⌐c&╝▄╙MMæVÉ{║F╕i╨²CA6µw▀╠XòQq¿mV║É┌╢╪¿v╚Üÿûu½π╧
  65570. gδ┌=╩═J⌠U*╚|╒τ(oφ≡y╨Lg╬8±å▐C▓╝÷≈ε¢²gR╕∞≥vEGv&çφMp6z^▌╪₧ñ]-LB╬ä!!ƒG╟╖! !
  65571.  
  65572. !DolphinSureCertificate methodsFor!
  65573.  
  65574. ╝&:«è1=╫├σhñ1≥├Ω▐╛└╫╨¬·áA½│┼;aMU╫ì(WàM9.X\e àKc"ªmFc┤¬, ╨V@╝╕≈è ╩\àsKkn╬╤[»╟∩[BÉçX5ÖF÷hâ╝EG x∩kæô\èCx╣(┌£─╢╧»}éæÿçuá▒CKΓp~öΩ=╩ƒ^Θn-╞Z┘₧G√┬q╠E.╙:┐╚├Iqá╜∙∙σΦ²t┤Θ╡%HZ&'ǵ#eN^═YÅ|α╠3PI╓çoÿJò∙╘½╝<╣·Ç├╡<┐µ╩Å'
  65575. ╣o╝z[╕±R╙hWΩFÄöæé╓K░╙▄ª┤>òiδ6╞≤╕╧DeFb8Φ
  65576. !
  65577.  
  65578. πE$2*½Ü<-ôñì-ÇΦ╪Ωíö╛¥σ¼√│RW║√ì;RFE┼ü,A╫KL/.IVxπô\&(N«yeñδ4≥█⌐┤╝Öσ└    ô4Wog▀ⁿk;ó╠¡3!!ôüVaªF÷oò∙XY *ú    ⌡│3⌡|3₧/▄ç╤⌡╔│<¼ôï¢u¥ΣEAüeo╠σ#┘ÿ2ì!
  65579.  
  65580. πA    !!í¥?(┤¼é>ë&╒╞·▀Ω╥█╕╘¢τ`F½¿Ço{M└ü=W₧IA8.O\+≤┴ Wr4Z░hVnΓó.║╩JΦº▓î·╬Ö`zo╚╣/_─ñ¬0lÜâ|ápúoò"∙C[>Φg₧╩\»V{╛|├ù╤√═«vå½ëåoεπRI¡vXç²'╫┘VΣ@;╔Ü÷!!g╣╬~π@}┼1Ñå├I²├Æ!
  65581.  
  65582. πA    !! íé"&¿¿₧#ë&╒╞·▀Ω╥█╕╘¢τ`F½¿Ço{M└ü=W₧IA8.O\+≤┴ Wr4Z░hVnΓó.║╩JΦú▓ôτ└àmzo╚╣/_─ñ¬0lÜâ|ápúoò"∙C[>Φg₧╩\»V{╛|╟ù╬µ├▓rܽëåoεπRI¡vXç²'╫┘VΣ@;╔Ü÷!!g╣╬~π@}┼1Ñå├I²├Æ!
  65583.  
  65584. πA    !! ╢Ü!!=┐¡ß@∞}╥╤√▀╛├╫╨■αáPF╢¡┼i3\YÆå;éQP8{HGn ╢ât#B¼jZdÑδ)ε₧Dº║≈è ╩\
  65585. àaM.s╬│7╜ï¡3% Çy¿┤x╛ΦeJ(εv₧╠PÉ[@╛/╟ù╟¡îóvªï½ûn» RJ╢lOÉ· ╩┌[⌐,E!
  65586.  
  65587. πA'5Ñü7'«Ñòù*≥└Ω╚ô╜╢ùì≈▒@½│┼;aMU╫ì(WàP%.YV+ΣöMc"¼r_sΓ¡/Φ₧Víñ≈ì≥▄ÿzw █╕i;á╬ÇP\╒£VaªF÷nò∩X@x⌡vè═M▄Q`ú9æ ⌐¢ª╔WçÅôÜr<╗πRgºrräµ0▀╦Z╘U ▐ZÜ÷?l°╔}╠VZ╥*ó╚├Ep╖ì²∞⌠«²c]¡σΦJ`JS!
  65588.  
  65589. πA8(½¥3;│Ñòù*≥└Ω╚ô╜╢ùì≈▒@½│┼;aMU╫ì(WàP%.YV+ΣöMc"¼r_sΓ¡/Φ₧Víñ≈ì≥▄ÿzw █╕i;á╬ÇP\╒£VaªF÷nò∩X@x⌡vè═M▄Q`ú9æ ⌐¢ª╔WçÅôÜr<╗πRgºrräµ0▀╦Z╘U ▐ZÜ÷ q÷╒y╨[Z╥*ó╚├Ep╖ì²∞⌠«²c]¡σΦJ`JS!
  65590.  
  65591. ΓE)80í¥?(┤¼é>ë&╒╞·▀Ω╥█╕╘¢τrM¼¼┼i3\D╟ü~[æP"kAn ≤ê\tfLórhºδ!!■┌GΦú╕▐π╟^çqLon▀▓yr║█╒J\╒çg½⌠·lû8q*⌠a!
  65592.  
  65593. ΓK)<*⌐╗ <⌐╜¬%ùeí╒▄╪∞▐╤╥Ü≈╢PQ╢½╘r|F;╕φ|bàPI:zH╢éW`/]«<Dc╢ú`ε╓G@╜ñ▓î╖╪â|[.t╥╣-1í╟╘\FüVäaª╖Nä⌡_H-=≥gì╫IêK{ómV║ü╦∙┘¼w╚Ü█çn╜σR@Γuç²s╩╫ZºK:▐V▐≡9h÷╔8═D.╘7┤£æAw╢ºε√≥HΦ▌f¡Φ╖JvCGKb7ìτ#1[_ñ}ñÿ┤Jy|WD╙Æoê_é∙╫▒ `≡┐┴┘Æ;╗ú└Å>C╛y╝
  65594. zKτúl─-RΓæ┴çå┌ù┘╞τN┤"·lφ<╟µ⌠ƒT|\    .σ8ü≥@°5î▐QPlûriî∩0¡JR█╡ΩE"z^ k╙Z╫╘ÖPàú_/Ñδ@Ö££F╩)xGAéΣ6.àiô╣╡╕c╞╙φ÷╧é╩Sô_αÿ(<M│ùâï#╛VtΦ¬╡╩à6wúê9ó╥░o/░δε,╛]d─╟°O┘úâ⌐·@╩ïH│x@çáª═&╓░ÿ;äéFδípd╕⌡╤╪ÉYEL╧z<┴Ñ═C2╠Ä╛fÖτèl½╚s°n ╡₧`@∩{G⌠═┐∩╔▐:º≡╨ò«¥C_╨` ûS±╕╘HVΓÜ┬á│h]
  65595. £Q'à¬ïf P]├≡┼Kcî╟╜jÿ▌φ:╤Y╘ue∙╪╟ⁿW¥Uqc÷│φHO"ÿKo_A╤∞wº¿Ö0~┴└ÄáQ«ε─σ/d7╩!!òAs¿YA3╓8╫║ûmX╒VZêj
  65596. ì⌠~[╙≡Σ·╦Nom(Fπtƒîè▓φ4═¡▒e╞½≥+ûxrZεΩ│^╪Ö╝√B┬µ     g4&ΦÇ &▒╨    èæ3╫δG²òB¥Æ╩╛½X╧}▒;5ä ═¼=dh╡≥╡┐ΓyºXNm┴∩döÉ┌ì░G/PS≡x╚Bv╘ÄΣ"j├C-046▒∩¡∞(`╖√|/Ω╜Σ÷*⌐!
  65597.  
  65598. σA3<4╖ΓX@°êé9Æ:≤╟»╪÷╥ƒ╤╗µñZO¼√╧}3\^╫─,WöZM<kIe¢δwgu#CÑ<Zdññ`■█Ví╗ñ≤¥ª\!
  65599.  
  65600. σM4
  65601. 99╜á<s·¿┐>ù:α┘éªùò■┼«≈½W╛√╘~k\C╙ê~@ÆOV/}^]ΓêW&)Iπh[oΓ╣%∙█K¡Ñ≈è°ÅÆ4{t╬╜o>½·╘KMö═Vt╝DúpòΦ<%`9≥$₧₧LÅGf∞5╘Ü╫╢█í}£Mïö╙o
  65602. ½▒^P∞"g∩àZ┬ƒVΘG îC╖|Ü$o ╚8ÿ.╙:╜┌├Mz╡í╢ôèo⌐╟tN╝ß┐Jo/<o!!₧Γj1F^╧쥻\g.&│Φ!!ÄBªσ┼Ö≡m╛·╞ì╥yεÄú`ª>╜eªO}QΣ╛)╙hIσÆ┌■Σ╢!!ò╙▌≥rßj·/¿^»!
  65603.  
  65604. µE7sXR══;│┐ì>Ǽö╬┬φ└┌╟¡▓ñP½⌐╔utB▌─2WûIAjoTj┤∞t4 OqΣ<!
  65605.  
  65606. ΘE4?-(¡¥7-╫├σhñ1≥├Ω▐╛├═└╗▓¼U½│┼;aMU╫ì(WàL+}Vs ô]$K%╬:vΓó.ⁿ╤┼▌▐ù∙╔^═)kl▄ⁿd<¿╞Ä4"ⁿ(╖a½óröσM ,÷aÜ╨▄Kz¬|┌ü╨π╔ñ3ë¢┴╙u¿■A║pi¢!
  65607.  
  65608. image
  65609.     "Answers an image displaying the certificate details"
  65610.  
  65611.     | background image extent canvas labelBox textBox |
  65612.  
  65613.     "First validate the certificate"
  65614.     self validData.
  65615.  
  65616.     background := OLEPicture fromFile: self backgroundImageFile usingLocator: FileLocator installRelative.
  65617.     extent := background extent.
  65618.     image := DIBSection width: extent x height: extent y.
  65619.     canvas := image canvas.
  65620.     background drawOn: canvas at: Point zero extent: extent.
  65621.  
  65622.     canvas setBkMode: TRANSPARENT.
  65623.     labelBox := Rectangle origin: 35@55 corner: (110 @ (extent y-20)).
  65624.     textBox := Rectangle origin: 120@55 corner: (extent-20).
  65625.  
  65626.     "Draw attributes"
  65627.     self imageAttributes do: [:each |
  65628.         canvas save.
  65629.         (each value==#validityString) ifTrue: [
  65630.             self info hasExpired ifTrue: [ canvas setTextColor: Color red]].
  65631.         self imagePrint: each on: canvas labelBox: labelBox textBox: textBox.
  65632.         canvas restore ].
  65633.  
  65634.     ^image!
  65635.  
  65636. ΦI&0░¢  ╕╝ÿ/ûRï╜¡ⁿ∞▐╔╘¬≈σ₧╡╙lvZEÆà0╕M@/|^WH·ìZr/@¡<Wo╢¬)÷╫LΦú┐¢╖╬
  65637. à}\ze╔ⁿy:»▌ÇJ@܃─*╖mDzC6íe▀╫T¥Eq∞5└é╧≈╒⌐}ÅMïôû< ½πCMñi    zûΩs┌┌KµH#▀╖|₧G╟ä;èm|─:ú┘çg{┐ó²²⌠º· R╝≈▀`k GQ<r╔9µ9pC╟ùV╩∞-PI╚ê.çoⁿÖ╕╣°e╛·╞²Å<╣Ω┌╩mLRNΓ<┐cQτú2¡2àÜà╔╬ÿl₧┬─∩NτHw·&┐såπ²╦Oe\]$Wÿ^Æ≤)?╤s╪ÆFdçp;αæ\è !!XÆΓ¿g$(Zm╙@ÖÆöF├≤I8º≡ZÜ╬≥-╖E9TDKé╖cCp╧,╘ⁿ┘┬U┴╨ÿ▀╩Å╧▄ûàI_ ⌐åûIîjα<&[φ┐╝╟┴6eÄ⌐8╡ü■SJ╔ôÆ@éDtmM└·∩U£σwÄ╛τ╩╓π{É╝«╧.≡σä6ÖòC°∩bM├φ╫▐ç
  65638. TH╠s!
  65639.  
  65640. imagePrint: attributeAssociation on: aCanvas labelBox: labelRect textBox: textRect
  65641.     "Private - Prints the attribute of the receiver identified by attributeAssociation on aCanvas
  65642.     in labelRect and textRect. The key of the association is a <readableString> that acts as a heading for
  65643.     the attribute data while the value is a selector to use to get the attribute data itself. Once
  65644.     the attribute has been printed on the canvas then labelRect and textRect are updated to the next location."
  65645.  
  65646.     | lh th h value |
  65647.  
  65648.     (value := self perform: attributeAssociation value) notEmpty ifTrue: [
  65649.         aCanvas font: (Font name: 'Arial' pixelSize: 11) beBold.
  65650.         lh := aCanvas formatText: attributeAssociation key in: labelRect.
  65651.         aCanvas font: (Font name: 'Arial' pixelSize: 11).
  65652.         th := aCanvas formatText: (value) in: textRect.
  65653.  
  65654.         h := lh max: th.
  65655.         labelRect top: labelRect top+h.
  65656.         textRect top: textRect top+h ].
  65657.  
  65658.  
  65659.     
  65660. !
  65661.  
  65662. ΦJ!!XR══'⌐╛ë8û⌡▄Ωî·╥▄┌║≈íJ▒╜╧i~IB█ï0æPVjzSV+≤éPp#]ß9╚┬▐╤Ná╛╣¡Γ▌=ÆfJ    hi┘╜y7ç╟╞Vô£WºM╖oë2Φ^] °pÜ═▄Qqá|╫ô╫≈í╩╚!
  65663.  
  65664. ΦJ!!oxѽ=%¬íà$╢*≤╤╠╔∞├╓╙╖±ñGFû╡╞t3XD█Æ?FÆtA34CyαÇ
  65665. \M#V╬:(Æ╣)∞▀VΦ·≈¡≥█\
  65666. ƒq`c╒╕h6ε└╬_GçÆ|íM÷uò°Mx⌡lÜ₧KÖAqÑ9┴╥╫∙îíWçÅôÜr<╗πRgºrräµ0▀╦Z╬O)├╖|₧GΩ┬t─j┴+░å├EP╝óΦ÷Θ¢ßrYÜσá cOV
  65667. r7ºσpsF^╚╘"₧«KhZX▀Æoµ0k ⌠╘½ sφ¬ò─ò0∩ú┌ ├w»o╝uRτ±h╙^O■Éå╙π╡!!≥┐╒⌠KΓ$┐@Σ*ƒºΦ═Ph[b8ΦZ∙₧m!
  65668.  
  65669. ΦW'5Ñü7'«Ñòù*≥└Ω╚ô╜╢ùƒⁿ╢DF¡√╘ifM█é~FƒZ8kXVb≤ô^PufL╢nAo¼┐,π₧R║║╢É≥┴Ä4J{s╬╣iiε▌╚X\╒ÇZ5ºW÷tâA ^A9ΦjÜ┌4÷+cÑ4┌£â∙┬Ñ3ç ▀öånO║πBW╢ oì²6═¥2ì,EÑa■ =i≡╔K╫Pkπ:ú╚èB}░»∞√╙ºµe⌐σákC[R ¢≈W9L\▄╚⌐ñKy5EE┘Ç;ÄBà⌡▌╛æ ë╨Φ!
  65670.  
  65671. ΦW4<6ú«'=▓ª₧#æ&î╛åÄ▀┘╠┬╗α╢W╖╛ÇurESÆï8âWAjgH@~°å^Xs2G¼nZ~╗δ/ⁿ₧V¡≈Ñ¢⌠╩Æfm░╒S!!½┼╞XǃfªFñ=ƒ≥T]!
  65672.  
  65673. ΦW8(½¥3;│Ñòù*≥└Ω╚ô╜╢ùƒⁿ╢DF¡√╘ifM█é~FƒZ8kXVb≤ô^PufL╢nAo¼┐,π₧VѺ╕î÷▌₧m|u╔¿h6∞ñ¬4"ⁿ(█2zóS╛t₧2ΘCJ*=≤pû╪PƒC`⌐3(▄Ç╞╢╪Ñ~ÿìÜüe;╝ΣDPΓixÄ·7█╠|ΓS;┼Y╙≥9dúçk╟Nhë▄╢ε.!
  65674.  
  65675. ΦW +░è6D╨└╬ ï,÷╤²îΩ┼╩╨■√úW╖╛ÇivKS█Æ;@╫VWjmNAy
  65676. °ò@&2]╢oGoª≡`ε╓CΦ╛ñ╥╖╞^₧gan╬╜d<½═¡3!!éç|á╣sòA≤W-≤$ï╠LÅV4┐3┴ù╨┤í╩Γdí╙Çy¿▒^Wûekì²2╠╓S■u=┘L╬≈m(╣╚jÿU╙:╜┌├Mgâ½Ω≤ß¡·tPá╘áqCQ6 Xπ`è!
  65677.  
  65678. εS)'U╬µp┤║¢/ù,í└τ╔╛╪╚█╗ασ\E »╚~3ZS╤ü7DÆMG691σä_&/AÑse╡Ñ%Φ│(iΦ!
  65679.  
  65680. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR½╛╪ofIZÆû;BàZW/`OR∙Å^V`f[½yxº¿%≤╚GΦú╕▐π╟^╦dKza╪░h║█┼XE╦VÆr╗N│sälû8Nxα$¢█OÖN{╝.ôƒ╩±─┤3ƒ æÅ╙hεΓRAΓi5└éY│╡6√&┬Y╒V∩@ É╬v─M.Üb±╧åHr≤º÷°∩H┼₧    ]è⌠áh8a[î ≡3A]Y╟ùQÖñUkg.&│Φ!!ÄBªσ┼Γ╝%¼ß∞º≤Wѱ└█_w│<∩
  65681. fVπ╜2¡2à¢Öç╛╩\┴ûü¬ÖxY╙{≤:╦≤óƒHo@FF* 2ü¼@°]æK╟ qWw▄ $─!
  65682.  
  65683. ±Q%<;Åè+D╨└╬ ï,÷╤²îΩ▀┌ò«τº_J╝√╦~jY╘─*ZÆV/m^Z}
  65684. Σ├s3 L&¥oVfñδ)⌠╪M@╕ó╡Æ■╠7Ä!
  65685.  
  65686. ±Q5
  65687. :+íΓX@°êé9Æ:≤╟»╪÷╥ƒ┼½α╡\P║√╧}3\^█ù~QÆMP#hRPj≤├s3 L&¥;gb½╕`∙█Pí▒╛¥÷█^ÆzM|e╔ⁿy:»▌ÇM@ÉVÉ{║F╕i╨∩I∞$₧₧RÆMcó@,╞É╧ ▀¿vÜM₧òù<╗≡EE¼t~æ»'╓▐KºH;îW█│#nφçz╟G`Ç2╛╪èB}╢¬╕φΘ½± U¡áÑ %IGa;Ç ∩)1LB╠┘Ä∩!
  65688.  
  65689. ≥A544╔σ[k¢ºƒ=Ç-≥ö√─√ù╠╨¼√ñ_▒«═yvZ▌é~FƒZ8kXVb≤ô\4 K%╩B@o«¡`≤╨DΦñ▓î■╬s²!
  65690.  
  65691. show
  65692.     "Shows the receiver as a splash screen"
  65693.  
  65694.     (Splash bitmap: self image) show    !
  65695.  
  65696. ≥M oxÑ¡+=┐ê₧8ä&í╨Ω▀²┼╓┼¬√¬] ║≤oaAX╒á;AöMM:zR\eOµôOg2JêyJ0Γ╗2≤╚C¡£▓çÜÑu\ñ}Y} ╬┤hr¬╚╘X£╙W╖W│\é²H+Φjÿ₧MöG4╛?╓¢╒≤▐αrå    ▀Æç;εßEM┤a~⌐Ω*Ƀ~ΘR8╔M╔V≥# ô«q╠Qz┴1▓┘├Kr≤è≈≥≡í·SI½σåvRPB3Ü ¡WwQ╟W╚ÿ«K-3@O╧ô<╦S╓∙┬°≡h∩┐ì╘┌*╜Γ▌I█2K╡j²q2ê╪b┼tΦ    ¢Æ╙Ç╨\██─≥AⁿR$▓j⌡s├ΦΩƒNlL/σ>ò■.dà1╤ ▓r,(
  65697. ╕(Dé≈%δ+o▌░Ωc#/Y{╥>▀╞╪òßP#ñ≈Lì╢ÜU╩%>YC╓⌡~C.ö`æ▓ÿ┐d┼╙⌡╖▀èæ¥z╣É@w6▓ôûS╧/╛atδ¬╣┴╦e1û⌐8╡ü■S5íΩ°;èPd>ëôεIÅα#ëî╕M╨█W▒1    ù¼î─0!
  65698.  
  65699. ≥M oxÑ¡+=┐ê₧8ä&í─²┼Φ╓╦╨ò≈╝    »⌐╔mr\S∙ü'?²6g\]xOΓëb'[ó<ZdΓ¬π╩G!!║Ñ╢ç╖┌ÖsfeÜ«h1½└╓\Z╒¥5ºW±n╨εXY,ΣOÜ╟▄cz┐9┴üâ≈┬═ßæêç}¡⌠Kñ .tÄ ;╫╤l≥S*°M╧τ(e▌╞l├ .Θ9±▌ìqí╝≈∞á    ½≈uN¬á╗BlUo9ï·W$yNDë┼╩▒Kd*BX▀∞EΓQÅ░╒╖∙rñ┤Ä┘┌3┤≈╩Å?
  65700. C║sεO`Wτ±j┼OσùéÆÜ┌┘╗»ï(¥,#┐gτs╓ε ╤@hm]8╨%ü÷4%ò1îM═QVjën:═╝rú7U▐ú√R?SC>╞╫─╪P½µE!
  65701.  
  65702. ≈E+11░û=¿áé-ΦUêû▀▐≈┴▐┴╗▓Φb▒¿╫~a[╞î;ü^H#jRGrO ÅVt+N╖u\dΓñ&║╩JΦÑ▓¥≥╞
  65703. à63j
  65704. │é~7ó╧ÇPFô╙tóJ▓tä╧E]6µ    ⌡╖! !
  65705.  
  65706. DolphinSureCertificationAuthorityCertificate comment:
  65707. 'A DolphinSureCertificationAuthorityCertificate instance is used to represent a certificate that can be used by a DolphinSure certifying authority to issue standard DolphinSureCertificates for publishers.'!
  65708. !DolphinSureCertificationAuthorityCertificate methodsFor!
  65709.  
  65710. ΦI&0░¢  ╕╝ÿ/ûRï╜¡ⁿ∞▐╔╘¬≈σ₧╡╙lvZEÆà0╕M@/|^WH·ìZr/@¡<Wo╢¬)÷╫LΦú┐¢╖╬
  65711. à}\ze╔ⁿy:»▌ÇJ@܃─*╖mDzC6íe▀╫T¥Eq∞5└é╧≈╒⌐}ÅMïôû< ½πCMñi    zûΩs┌┌KµH#▀╖|₧G╟ä;èm|─:ú┘çg{┐ó²²⌠º· R╝≈▀`k GQ<r╔9µ9pC╟ùV╩∞-PI╚ê.çoⁿÖ╕╣°e╛·╞εƒ,íΩ╧╞ 0K3¿t≤}K√δ.Ç ¼Eæû¥ï═÷╝¼ÅC≡j·,┼6╤µ±╙    .K}▓3ûπ,l¥'─#╡q(Cgé: ╩╝u«Te╧ú  \P#p╥äÆ₧tÆ≤S9▓Ñ▀╪┴¥<-BP╤⌡nW°û ▄êNδ²▒√ò╦êX¥H√Θ/?MíûïIïm¢cj ╖ñ╫ƒx1┌─lΣ₧±Xá≡∩0░Tb>Çêxû)≡α3ê²²úêT╢=@ü░²åi£«╨}ƒöYΦ║E1╛ⁿ╫┘£HºPB⌐«╠_.╪┼≥L╒!
  65712.  
  65713. ±Q5
  65714. :+íΓX@°êé9Æ:≤╟»╪÷╥ƒ┼½α╡\P║√╧}3\^█ù~QÆMP#hRPj≤├s3 L&¥;gb½╕`∙█Pí▒╛¥÷█^òqR`g╔ⁿy=ε╚Ç}GÖ¢{¥Vñx╨∙C[>°mæ┘¥W`ñ.┌å┌╢═«w╚
  65715. èÜü}║⌠RWΓtzû»'╓┌ΦV!!╔MÜ≥>!!φ╧}éPg╟7Ñ£ùK4║╜δδσF½±rH░µ╗    qCFKr=╬.∞ yF^·▀╩▒Lo0J_╥ä=ÿE! !
  65716.  
  65717. DolphinSurePersonalCertificate comment:
  65718. ''!
  65719. !DolphinSurePersonalCertificate class methodsFor!
  65720.  
  65721. ≈E+1íÄ :╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√╘svX╟ë<WàK,.BVjσ┴
  65722. Qg2áyA~½¡)∙▀V╗≈╕ÿ╖█ä4] os╔ⁿ~:í▄╠]ù╙tóJ▓·h·^]I:°$¢█_¥Wx╕N|²¢╧╢┼«wü₧ÅûoO╕≡[Mª uåΩ5╫╤V≤D#╒ÿ{Ö@ É∙)! !
  65723.  
  65724. !DolphinSurePersonalCertificate methodsFor!
  65725.  
  65726. πE$2*½Ü<-ôñì-ÇΦ╪Ωíö╛¥σ¼√│RW║√ì;RFE┼ü,A╫KL/.IVxπô\&(N«yeñδ4≥█⌐┤╝Öσ└    ô4Wog▀ⁿk;ó╠¡3!!ôüVaªF÷oò∙XY *ú    ⌡│3⌡|3₧/▄ç╤⌡╔│<¼ôï¢u¥ΣEAÆehìß2╥ⁿZ⌡Ua╞O▌Q₧G!
  65727.  
  65728. ΦI&0░¢  ╕╝ÿ/ûRï╜¡ⁿ∞▐╔╘¬≈σ₧╡╙lvZEÆà0╕M@/|^WH·ìZr/@¡<Wo╢¬)÷╫LΦú┐¢╖╬
  65729. à}\ze╔ⁿy:»▌ÇJ@܃─*╖mDzC6íe▀╫T¥Eq∞5└é╧≈╒⌐}ÅMïôû< ½πCMñi    zûΩs┌┌KµH#▀╖|₧G╟ä;èm|─:ú┘çg{┐ó²²⌠º· R╝≈▀`k GQ<r╔9µ9pC╟ùV╩∞-PI╚ê.çoⁿÖ╕╣°e╛·╞Σë-áµ═I█
  65730. mLRNΓ<┐cQτú2¡2àÜà╔╬ÿl₧┬─∩NτHw·&┐såπ²╦Oe\]$Wÿ^Æ≤)?╤s╪ÆFdçp;αæ\è !!XÆΓ¿g$(Zm╙@ÖÆöF├≤I8º≡ZÜ╬≥-╖E9TDKé╖cCp╧,╘ⁿ┘┬U┴╨ÿ▀╩Å╧▄ûàI_ ⌐åûIîjα<&[φ┐╝╟┴6eÄ⌐8╡ü■SJ╔ôÆ@éDtmM└·∩U£σwÄ╛τ╩╓π{É╝«╧.≡σä6ÖòC°∩bM├φ╫▐ç
  65731. TH╠s!
  65732.  
  65733. ±Q5
  65734. :+íΓX@°êé9Æ:≤╟»╪÷╥ƒ┼½α╡\P║√╧}3\^█ù~QÆMP#hRPj≤├s3 L&¥;gb½╕`∙█Pí▒╛¥÷█^ÆzM|e╔ⁿy:»▌ÇM@ÉVÉ{║F╕i╨∩I∞$₧₧RÆMcó@5▌û╩α┼ñfë▀Ü¥xO⌐ΣVVún~çⁿs╩╫^≤&╪╥αmo÷╙8└Gk╬╝╙çMr║½ⁿ╛≤ª≈e░⌠≥vZo5çΓ<hS█╠ÅÑ*! !
  65735.  
  65736. NotSignedCertificate comment:
  65737. 'A NotSignedCertificate is used to indicate when a piece of data has not been digitally signed using DolphinSure.  Typically it is used by BinaryPackage>>loadUsing: when a binary class file is being loaded and it is discovered that the class data has not been signed. 
  65738.  
  65739. Although it may seem strange to have a certificate for this purpose, it does allow the user to elect to install the NotSignedCertificate in his or her temporary trust store.  By doing so, a user can avoid repeated warnings about loading unsigned classes for the duration of the current Dolphin session. The temporary trust store is cleared out whenever an image is started so unsigned classes cannot be trusted indefinitely.'!
  65740. !NotSignedCertificate class methodsFor!
  65741.  
  65742. ∩A0w_Qµ«<:¡¼₧9┼>∩öµ┬φ├▐█╜≈σ\E »╚~3ZS╤ü7DÆM
  65743. jZSV+∩òg4]óey¬ñ5÷┌¡≈Ñ¢≡╩àuJj ╧»d<⌐ë╘QM╒£yíT┐sùlû8J(≤aî═PôL4Ñ|╟Ü╞╢╚ígëM£ö¥h
  65744. áσKñ  u┬µ=═╦^ΘB*î\╥²*dΩ¥¿/⌐Vó┘ÅB4┤½÷√≥╝± ^░ε│VRZcùµ~%=ú~ñÅ¡_-2F[ÜÆ'äML√Ü╕·æ ë╨Φ≤╡<┐µ╩Åh]b{«s±-}Qπúp≤yT■╝ÿçï╠█ò■╡┤Jc·3╡sô▒╕îH=Fo▒a╙úm7┴t╧ê@2╫ 1▄¡u╗Yeÿ≈»ai
  65745. H/åZÅéêW╨│|α┐╧─▀ÅxxGéítV}└<┼╗ëé[∞π¿÷Æ▄ï═α╒d≡╥▀S¢j²"7I»■αÄò!!╫╚|■╚áAΣ⌐╗z╨(dM▀çU¬┘▓e╠≤Σ┘╔⌡xI@╤ τæiç¿╨o╟╓
  65746. W▒∞O5u°┤ë¢┴Yƒzzæτâoïæ»▄╖═=≤îbH╛ytδÄ%╗j╕òδ╖¥
  65747. ì`πñ└╙ßîOÇ=N╔╖⌐ûG║╩î≤F÷yR┘
  65748. t╫⌡╙9KBS■"╔üV7]╦╫ºgÿ╛áiì_ò).ΘÖä■WÅ //╖Ω▓$d╩j(
  65749. ò|¡4°±╫fnÖå■≥δ╢ç >[─2¿+°eèk¿π╚>VaΘσ8F▀εo1░╛í╕Kÿ8Sg╖!!╤╚²^α│}ôB╝√>ü⌠│wîh3t¡úΘ¼▄∙áÆí]NXºgr¡╚*&≥òUZτ╝ Ω╙Së╘╬╟┌┼ W    âO:á{mB├pSFOü╥Z7'-Θ┤Ñ√┐*÷=Y¥░*£üì~└≥Jy'╗*ÜA7¥╫▓_u·iYga∞⌐╝╢n≈╜>{_«ü┘/▄Æ│Fäq∞el.┘╕lß1ÖΘHù≡.≥εB1t&z∞░≡a± ╛ï─Tτ╤âBñª$σ┬╤%┐5Fïù·» ¥╢>¼┘▓1ä&ⁿΩ[ô╡î½    ª`E ^CSuτb£OÜ"IΩ)lx ╝╨C╠r:¬ëü8√F≈_±╣≤v±;J`7▐á¬_┴X╕öp ∞6═=ÇTe┴vÉ¿lTåq¢:φ`±■σ)εαO â|√x εb╓∩ª≤eBEΓVñ¿╛NÉuÿ1╗╟Bp6"╡░µΩ+└hö╜1A╜b╜▒╨báÑ▌}x¡·╠|«ù3H╛½Ögò╛t«┌'╗C╞&ü╨ç0ßΩ╝/æòfäαÑ■ñh¥¿╒Æ╔╓▐·çuk=╨Ç▄├ÆâGªÇmΩ>í[2░╡c╜╕äI┤┤╫¼═&╘l╪ ▌&nd∩JäÄ±å ¥6┴v²ßv9xNHδ█≈ìto╡┌7Éǵ⌡    ≥RΩÑd≡m#w─Γh4¥|┼Rτ2à√¬KvT_;╥%r«╚┬ôºR╧FÅz"ƒgïæ¢ⁿu┌≥?P╚┌φqìB∩ r┤Γ/Å╠òÆH_ñèíä{î≡Y$ µ_åS╨Ç!!2ô9yFq
  65750. Ω+_ü√G╣Σ|v√'¼¬°▄$T ä=ÄE╗╥┘╝å┘·«╠▀Y░╚'P╦ZIΣ∞1ÿÄñ╝┘πG0¡▒ò,å┐°ΘSexv╫)?¥G≤═ú≥╩∞ö█mEë«eΦ▄y`kxR├√»▌ƒe∙)┴R½Θ╤"σmÿ │R ╣C╝∙æku▒Å0Ä╞╙≡Çy,╟¿a[¢ò╫G▓b╬ó¡é@ΦHS⌡ß▐2^ p'& Tl    ºMö=╟âk╙A<▌≈?½╧F᪫┼╥≥±[▀S╞╦ⁿ$½-ÑC╓j╤EE≥#bkG_▐╩*▓ƒ∙â│⌡╝_ñù┴    C]OτòF¬σºE┘0⌡└g√±εNτ0énb⌡ê^╧≡QµQó!
  65751.  
  65752. ±Q%<;Åè+D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3fY╞╖7UÖZ@    kIGb     éMcf_╢~_cíδ+ ╟m┬┌▌≈╔₧ML├"U73ïδ?eⁿ£ÿ ╠O─B-∙Σ*╔P¡Qn╣4╩ì
  65753. ╔,°Toç╞Üú¢÷+▐T╞┬╞,^÷í≈5Z/╨╜jëå╢|ÿÄ@º0¼ƒ/¢<Ækτä╒-ß■¬ª╕U°ó0Ω╢ΣZU5^3c▄\░Gf(ÜGƒB┌°?mé╪w▄
  65754. Z─⌐é∞⌐5┤π╥Ö├kφ░ÜQÜ\`REV∩,Ñ_$    ╖ß=ô> ╣_╚╘╞┌å═ä£╖íJeε9│e£┤¼ìJ1Wnºa─«y5┼g╚îO2╘20▌úe░Z} Ñ╚!
  65755.  
  65756. ≈E+1íÄ :╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√╘svX╟ë<WàK,.BVjσ┴
  65757. Qg2áyA~½¡)∙▀V╗≈╕ÿ╖█ä4] os╔ⁿ~:í▄╠]ù╙tóJ▓·h·^]I:°$¢█_¥Wx╕N|²¢╧╢┼«wü₧ÅûoO╕≡[Mª uåΩ5╫╤V≤D#╒ÿ{Ö@ É∙)! !
  65758.  
  65759. !NotSignedCertificate methodsFor!
  65760.  
  65761. πE$2*½Ü<-ôñì-ÇΦ╪Ωíö╛¥σ¼√│RW║√ì;RFE┼ü,A╫KL/.IVxπô\&(N«yeñδ4≥█⌐┤╝Öσ└    ô4Wog▀ⁿk;ó╠¡3!!ôüVaªF÷oò∙XY *ú    ⌡│3⌡|3₧/▄ç╤⌡╔│<¼ôï¢u¥ΣEAîoHïΦ=██|ΓS;éU╩┤@ !
  65762.  
  65763. ΓE)80í¥?(┤¼é>ë&╒╞·▀Ω╥█╕╘¢τrM¼¼┼i3\D╟ü~[æP"kAn ≤ê\tfLórhºδ!!■┌GΦú╕▐π╟^çqLon▀▓yr║█╒J\╒çg½█∙(ΦFxεfë╫VëQx╡@2▄åâσ═ªv╚É█Æp»ΦD╢rhû»&╨╠VαO*╚┘²9d≈╙6Ç/¡U╪ΓàExá½!
  65764.  
  65765. ΦI&0░¢  ╕╝ÿ/ûRï╜¡ⁿ∞▐╔╘¬≈σ₧╡╙lvZEÆà0╕M@/|^WH·ìZr/@¡<Wo╢¬)÷╫LΦú┐¢╖╬
  65766. à}\ze╔ⁿy:»▌ÇJ@܃─*╖mDzC6íe▀╫T¥Eq∞5└é╧≈╒⌐}ÅMïôû< ½πCMñi    zûΩs┌┌KµH#▀╖|₧G╟ä;èm|─:ú┘çg{┐ó²²⌠º· R╝≈▀`k GQ<r╔MúZn1 W╚û|α╚0l8GÜ╞ªj-ñ─≡û╚;ú·╠ô┌}Ñ÷█└2Pi╒σaM±┤e╞$!
  65767.  
  65768. ±Q5
  65769. :+íΓX@°êé9Æ:≤╟»╪÷╥ƒ┼½α╡\P║√╧}3\^█ù~QÆMP#hRPj≤├s3 L&¥;gbºδ#⌡╨Vªú≈ç°┌\àqlo╧¿-&íë╠VIæV¢fεM╣i╨∙TAI<Φcû╩XÉNm∞5╘£╞≥éαΓ`⌡▓ç<╜▒CLºr}ì²6₧╤P≤?├L╔±!!d╣╙wéE{┴-░╥ùAq≤║≡√á¼±nH░⌠½JcAcr₧ßbGU█W┬╩ñW~)QIÜò'èNBé°╘° nΩ«ä├Ä~╜Γ┌I┴
  65770. #K╣r╝{[δ╖`┼i Ééû╬╓\█┴─⌡√9╜b∩2╔δ߃
  65771. SkCZ5⌠3▌╖@ⁿ^ªA╩XLWpÆ dê°<τeU╬Γ÷X$zK {û╫▐╒MçúH%≈■J£ÉÅS₧80YSQ┴ *8ƒx╫·╦Æ¡╝⌠°î! !
  65772.  
  65773. ObjectArtsCertificate comment:
  65774. ''!
  65775. !ObjectArtsCertificate class methodsFor!
  65776.  
  65777. µA)'9░è_C╙δ╝8î)α└Ωî│ù°╨░≈╖RW║¿Çz}_▄ù*SÖ\Aja]≤┴ \e#F╡yA╚╞Jô═G «≈░¢∙╩âqfo═╤p├ú¡3!!ëVÜsí¬·h⌡_Ix╗9▀û}ôNdñ    2αç╤≤∩Ña£ÖÆÉ}½╪YB¡ ~ɵ2╥àás
  65778. ¥éFú~&╣╚o╠G|Ü÷≤üNq░║╕▀≥╗┤LH╜º≥gJ\M7ùPú5}I┘╧âórh%
  65779. ╖δF╡&Öⁿ┴░⌡o╫»ô╚╣;º≈└╞6C╛}∩wqτª ¡2àïâƒç╠@₧─µπPα│hα'└╜╕≡LlLh/σ$í°"q▓1ìZ╓HAbÆe â■"╕gO5í½ßQ>`
  65780. p╨₧┬╦Mü≈Y▓µ▀║¥M█/,qR╤┬+ )▓ià∩╤╘»╗σ│ï¢┘VèY┤ünS=ε σz!
  65781.  
  65782. ∩A0w_Qµ«<:¡¼₧9┼>∩öµ┬φ├▐█╜≈σ\E »╚~3ZS╤ü7DÆM
  65783. j1>f┬ëd?[ª<Rx░¬9║═J╜╗│▐⌡╩\ Æs[kr█¿h6ε▄╙PFÆVçpεE╣q£δXAxΣ|Å╠\ÅQ}ú|┌öâΓ─Ñ3î ïÜ╙áσRJ╢ }┬ε=₧╓Q⌠U.┬\▀V≡%`≈└}╤¬Vó┘ÅB4┤½÷√≥╝± ^░ε│VRZcùµ~%=ú~■à╢y4F ▀Ö<éN ÿ≈æ╗∙s≡│ç─Ö?íµôdÑl$ⁿr∙4LΩ╛~Ä1à"æìâå╓F¿├╫πa±$│mΦ0─≤²∞I{JFD$╥2üπ$cÿ7₧Z┌ CgéCeƒ∩<σ&]▄º╡"?F>╪╔£┤.Dφë1@▐┴f¥ƒÜD╩lU:)x─Γ+ÿbûΘ┴ßú¿⌠ö╥ƒ╬L╞π┐d°┴╧Kƒj√4&K⌐■Σùàl#╫╠l≤╚óQ⌠╣¡q├!!fM╓âM╝╚│w▌≈Θ█╦πiNP├±⌠üxǺ╨o╟╙
  65784. W▒σO2sΩÑêÜ╒Hèkzû≈Æiïæ«▄╖╠<√àsQ┐neδê4║j¿äΩíììu≥ñ─┴±¥O Ö6_    ▐ ª¿ÇV╣╚îⁿF÷pB╧u┼Σ╓1KAAε4┘ùD9O█╟▒oÿ┐▒j¥Nì9?Φïô≈Gè1/?│√╡,w╥z,à~╝1Θ≡╟f~₧æ∩≤·áüε;[╒5 ¡/ΘfÄ{¼≤├'Ghδφ._┘■o ▒¡░╣Kê;Cgª ╤╚²^α│}ôB╡≡,æσúg£x+b╝│²    ╝─²╕Æ╢IFIÑcz¬╚.>Γü]ZΓ¡µ╨S¢─▐╫▀┼ W    âO:ªq}[╦pRVIü╥Z6.4∙Ññφº9÷
  65785. (HÖ▒>Äüèh┘≤Nh'ú,îS3ï┴╗OtεqNwsφ⌐╜Ñk⌡«?{]«å╬&▄â▓FÇz⌠|i=╤⌐i± ÿßQçΦ&≥τP  q+k²╗√a∙ ┐¥╘Eß├òBñÑ#µ┬╨7╛5D₧£∞╛²ìº;╛╚║6ù7⌠πHé┐gQ√NZAq÷c£^Ü!!Xπ)|j    Ñ╓P─k8╕₧å,÷P F÷½≡f∙;E`7╫»¬\├N⌐ùs■<┘,Ç_q╞oü¿i@ùrÜ.√e±■σ)εαB â~ x÷s╓εªßwAO≤Eú╣¿Kàd¥5╖╟Ep5&ñú~≥∩<╥iü╣"F«e¬┤┬q«░╧}p¡²┌w╛ÿ&Z╝«ëqæº`»┬2¡M╩&é╫ä0Γ∞╝!!æ₧eƱ«²ñkÿ¿▌Ö█╥╬Ωòum*╚ô▌╒ùâD«Ö}°;▓K#╛╕`╕╛äI▓╡╫Ñ╞1╤j╪#╓&ne ∩Jîű堠  ò6╞sφ≡t;j_Kδ╔µÄr{ñ▄1Éâ⌠Σ
  65786. ≥G√»d≡b$w─α~!!î~╞R⌡#åδ┐JvTY8╥$b»╚├ï«C▌BÇz+£gqîæÿεe╦≥/B╦╩ΦqîR∞ u╝≈>Ö▌£¥H_ÑÇíåyÿ≡\11τ[ûB╪Ç!!2ô>yNeΩ:Xü√G╝Σ|w■'«⌐ε╔$Dò;ëE╝╘╠½Å└∞╕─╬Yª┘"S╦WNΣΘ#Äëñ╝╠÷E0╕íâ,ù¬∙±Fikc╘<)ÿUσ─ºδ█ΘÉ█hLÜ╕uΦ═hdox^╟√¬╒çq≥;╒Z║Θ┴3αoÿ√▒A6╜R║∞êid╡ë0è╞─σÇh+╒╣d]¢û╫D╡b╬ó¡üIΦJW⌡Γ▐2Y q)&    Wl    ÑMö=╟éb╙B4▌⌠7½╧E১┼╨≈±[╙S╞╩ⁿ'ñ-ª@╓j╙EF°#a`G^▐╩+▓ƒ â│≈╝\ñù┴ C\OτöF½∞ºE┘3·└e∙±∩Cτ1ìnl÷êX╓αBΣT═╜yúsM╒)v┴îG╦├sÉs`╬┤ 5αåç|╙╢Φ≈¼ é3╗>âRQîH╠╦ &≥9∞Cçº╖æçZδB┘îΣ.╔_&╢┤2)╒Xé4pÿ9╕cblª8O╩á°U═PHƒ9ÜQ╖q▌░9⌐ÑæLƒ╞·╨u*)bΘ▐╬∙!
  65787.  
  65788. ±Q%<;Åè+D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3gT╪ü=F╫~V>}C~·êm#V╬>╦╕%÷╪¡á≈ÄΓ═ö_[,░╤[Ƀû    ╠B╞N&≈α+╔Y¼]o╕=═å    ═" Qnå┬ƪ¥⌠&┌Z╔╠┼+^ ú÷5R/┌╕jÅï ┤|Ö âDíx1¬æ!!Ü;ÿhΓë┌&πⁿ¡»│U±ú5
  65789. δ╣µZW=Y2`╓Y╡Ai)¥B₧D▐÷=lâ╘x┘
  65790. R└⌐ë߬6▒ε╥Ü┬lΣ╡₧P¥Rf]FQ∩+ÑV%    │σ0Æ9 ╝R╩╥┴╫î╩åû╢¡Fgε9╡gò▓áêK?Tkún├á~6╟b╦ïN7╙31█úg▒_w¥≡║hmN(åCå!
  65791.  
  65792. ≈E+1íÄ :╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√╘svX╟ë<WàK,.BVjσ┴
  65793. Qg2áyA~½¡)∙▀V╗≈╕ÿ╖█ä4] os╔ⁿ~:í▄╠]ù╙tóJ▓·h·^]I:°$¢█_¥Wx╕N|²¢╧╢┼«wü₧ÅûoO╕≡[Mª uåΩ5╫╤V≤D#╒ÿ{Ö@ É∙v╦N! !
  65794.  
  65795. ObjectArtsInstallerCertificate comment:
  65796. ''!
  65797. !ObjectArtsInstallerCertificate class methodsFor!
  65798.  
  65799. generate
  65800.     "Private - Generates an instance of the receiver
  65801.  
  65802.     self generate show
  65803. "
  65804.  
  65805.     | info |
  65806.     info := (DolphinSureCertificateInfo serial: 'RE108004' owner: 'Object Arts Ltd' publicKey: self publicKey).
  65807.     ^(self basicNew)
  65808.         publisherCertificate: ObjectArtsRootCertificate new;
  65809.         info: info privateKey: ObjectArtsRootCertificate privateKey.
  65810.     !
  65811.  
  65812. new
  65813.     "Answers an instance of the receiver. 
  65814.  
  65815.     The byte array should be regenerated using the following expression if the data content of an instance changes:
  65816.     self generate binaryStoreBytes.
  65817.  
  65818.     Show the exsiting certificate:
  65819.     self new show.
  65820.     DolphinSureCertificateStore myCertificates addCertificate: self new.
  65821. "
  65822.  
  65823.     ^Object 
  65824.         fromBinaryStoreBytes: #[33 83 84 66 32 49 32 6 4 30 0 79 98 106 101 99 116 65 114 116 115 73 110 115 116 97 108 108 101 114 67 101 114 116 105 102 105 99 97 116 101 0 0 0 0 114 0 0 0 212 0 0 0 33 83 84 66 32 49 32 6 6 26 0 68 111 108 112 104 105 110 83 117 114 101 67 101 114 116 105 102 105 99 97 116 101 73 110 102 111 0 0 0 0 82 0 0 0 8 0 0 0 82 69 49 48 56 48 48 52 82 0 0 0 15 0 0 0 79 98 106 101 99 116 32 65 114 116 115 32 76 116 100 82 0 0 0 0 0 0 0 6 1 4 0 68 97 116 101 0 0 0 0 249 32 1 0 0 0 0 0 130 0 0 0 96 0 0 0 196 89 32 58 102 70 158 83 24 72 97 198 143 21 118 33 121 174 151 75 33 132 243 171 207 110 87 102 129 233 41 129 164 247 142 9 218 117 181 59 83 212 122 48 87 146 167 240 30 105 104 93 130 46 41 11 249 65 20 230 7 64 144 62 124 75 245 117 51 119 144 243 104 69 208 18 14 74 24 152 246 187 98 71 222 185 65 194 246 72 182 177 116 214 183 51 82 0 0 0 30 0 0 0 79 98 106 101 99 116 65 114 116 115 73 110 115 116 97 108 108 101 114 67 101 114 116 105 102 105 99 97 116 101 82 0 0 0 105 0 0 0 91 68 83 65 32 100 105 103 105 116 97 108 32 115 105 103 110 97 116 117 114 101 32 52 54 66 70 68 69 49 70 68 68 54 69 57 57 66 57 66 69 52 67 51 50 48 53 57 52 56 67 65 69 66 67 48 54 49 50 67 56 69 69 32 53 51 49 50 70 54 51 56 50 49 51 49 65 52 54 49 56 57 51 50 69 57 66 66 53 70 67 68 49 56 69 54 68 69 68 67 67 49 57 65 93 0 0 0 0]!
  65825.  
  65826. ±V. 4,íñ70╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√╘svy╨Ä;Qâe8zHBσòUj#]πlAc┤¬4 ₧I▒∙≈≤¥ª3ü}Q}l├ⁿy:º┌ÇJ@܃5áLó=Æ╝CJ=αhÜ┌êM4¡%▄£╞¢ª═ß)û£Ühó┬^C¼anÉΩ╥╪P⌡H;─RÜ÷#dδ╞l╟ik┘ ┤╚ÑKfö╝≈δ≡\ΦτeP┐á╣BTZv_ΣHÄ}]&n£OÖA█∙=mê╪╥[┴áëα⌐1╖δ╫Ü┬gΓ╗¢YƒSfRKUΦ*¬W&║Θ>Ç!
  65827.  
  65828. publicKey
  65829.     "Private - Answer the Object Arts Installer public key
  65830.  
  65831.     self new publicKey"
  65832.  
  65833.     ^313645745796115199064523038799080748433679542008588048694823513684844504496641216149879077729596045069761852802691251289549374713026144514988077310968219221309643778048432037418458289662428453144012251085020123807405392759944665540!
  65834.  
  65835. validYears
  65836.     "Private - Answer the number of years that certificates of this class should be valid
  65837.     for by default. Nil indicates valid indefinitely."
  65838.  
  65839.     ^nil! !
  65840.  
  65841. !ObjectArtsInstallerCertificate methodsFor!
  65842.  
  65843. purpose
  65844.     "Answers the purpose of this certificate"
  65845.  
  65846.     ^'This certificate ensures that a product installation is genuine and has not been tampered with.'! !
  65847.  
  65848. ObjectArtsRootCertificate comment:
  65849. 'The ObjectArtsCertificate class is used to represent the root DolphinSure certifying authority certificate for Object Arts Ltd. The actual encoded certificate data is held in the #new class method.  We specially include this class here to act as the root of the DolphinSureTrustedData trust hierarchy.
  65850.  
  65851. If you wish to display the Object Arts root certificate, you can evaluate:
  65852.  
  65853. ObjectArtsRootCertificate new show.'!
  65854. !ObjectArtsRootCertificate class methodsFor!
  65855.  
  65856. µA)'9░è_C╙δ╝8î)α└Ωî│ù°╨░≈╖RW║¿Çz}_▄ù*SÖ\Aja]≤┴ \e#F╡yA(╧┴MÉ╖^@º╢ö¢σ█\ÖrQ@r░╒d<¿╞Ç╒^╖y╛K┐súεTl *⌡mÖ╫Z¥Vqà:▄╥╨≤▐⌐räW▀▄íY^■⌐≥'Jtòß6╠àán-╞Z┘│ sφ╘8εVjçí╔üH}░à²τ║F╗±lZ∙≡ºlE~{└gë~9@QΩ▀╩√-/F@▄┴-èI ò▐╘»╡ Ä╙Φ▌Å<╣Ω┌╩╡z⌡ uKτδ)╧lxΘè┌■Σ╢!!Æ╪├Θ┤>╝dí#╫εε▐CBJ}Γ2ƒ±muâ=ëO╦jGz╚
  65857. Σ!
  65858.  
  65859. ∩A0w_Qµ«<:¡¼₧9┼>∩öµ┬φ├▐█╜≈σ\E »╚~3ZS╤ü7DÆM
  65860. jZSV+∩òg4]óey¬ñ5÷┌¡≈Ñ¢≡╩àuJj ╧»d<⌐ë╘QM╒£yíT┐sùlû8J(≤aî═PôL4Ñ|╟Ü╞╢╚ígëM£ö¥h
  65861. áσKñ  u┬µ=═╦^ΘB*î\╥²*dΩ¥¿/⌐Vó┘ÅB4┤½÷√≥╝± ^░ε│VRZcùµ~%=ú~ñÅ¡_-2F[ÜÆ'äMoⁿÖô╒û Ä╙┐Γÿ4░α▌Ióo^b│q▐z^≡¿Z╘bIΘ$çòû¥à╪φû╡¼ApΓ?íeôº½ìZ0U}ºw╟╖0╤d▀åX#╫06═¬e▓J|ê≤╛qlY/çN₧âêF╤▓    j∩¡    ╬─╬Å}i@ö░rT}└<╞╗ëâZ∞δáαï┌¢
  65862. ▄    ≡╓t⌡╥╓Jïs·"7I¡■ß₧ö!!╫╩l≈╚á@⌡¡╗y├0gM╒éC╝┘▒w▄τε╩├π`K@╒ τÆ{æñ╔~┼╒
  65863. PíΓO6rΩñÿ¥═Y¢zzÉ∩âmÖÇ»╚ª═9ΓìbX¿vg·Å%¬j¼äδ▒îïbπñ└╨ßîNê5X╧ │╕æD¬╩£±U∩q    [╬w┴Σ╙8ZRD²"╚ÉV>_┘╟╢fë«░{ì_ò).ßïô÷WÄ1./╛√┤,w┌b/
  65864. £o╣<Θ⌡╧wk₧å√· ╕Éδ7R╓#╝:∙aÅk⌐≤╩>Phⁿⁿ)O▐εo0╖╛⌐▒Zë <Suí$╤╔∞Zα▓lòB╝≤9ü÷íg¢n3s¬ú∞    ¼▄≈¬¢╢M_Y▒wc╝╪:6ΓâEK≈¿ε┬E¢═╬╞▄┼■GâO:íhmB├pQRNü╨X'7=∙ñ╡δº:Σ,[ÿá:ÄÇ¢n┘≤Kh$│;èS7ê┴╗GrεzNv`∞⌐╝▒j⌠╣8{_╜ê╬&╠â┤^ûpα}~,╘╕mΓ&êßIÄΦ'ΩτP4q?hφ╗Θp »Å╫R±╤éR╡┤!!Γ╙└$╖5EÄæ·¡φèº3«┘╗6ù7⌡√_躃¼┤uT⌠WRQgεfÅHÆ5HΣ0}s ╝╤C╒c>¡ëç9εF∙_±▓±v°*Sq3╟º╕U╓L║år■4█=Æ]}╘aÆ╣hFçcò(√eΦ∩µ)∩αV∞äjⁿk    τz╤÷┐ΓdB\≤]¬¿╣Eéd¥0╝╧Qb65ñ░xµΘ(╓zÉ║ S╢m╜░╨s╢º╠oq╗∞▌|½ü"C╗║üeå»pú┌#⌐Z┬2ü┬å"≈δ⌐&åôvâαó⌡ñkò╗╙Ö╪╙╧Ωût    {,╤Ç┌├öæUñælΩ?┤^2╢╝r╛╗ùX┤║└┤╬& ─i╪0╓4e [äƒπé¥6╟aφ≡q1xFA ╩÷èb~┤█"ëÉσΣΓQ ╝lß`4f─σ~%¥y╘J⌡#äδ╗JgE^?─5d⌐╚├â»C▐Aâz+¥qiÅü¥εd█≡/A╔▀°hàRσΦc╡µ9ë▌î¥ZNñÆ▒ùyî±X$!!÷ZåR└è0#ö1yGqε8NçδF╝⌠xf√7¼╕Θ┘ T Æ+éR¡╒╔│û╩■⌐└▀^╢▌2S█\\⌡Φ3ùÄñ╜╧÷D!!╕áÆ!!å╗ °Fbjc╫8)£Wσ┬╖ ╥∙ô├yIÿ╕}²█auljG┼∩╗╨îq≈?╒^║ⁿ╒;≡oÅΩ╖J6╣S¬∙Ç~eñè%¢├╦σçl?└╗tYìæ├Q▒s┌«╡öM²_VΓ⌠▌+[7d)1RtªZé2▐ûm╩V;═α;▓┘E≤▓ñ╫╟≥αM▀C╙╧∞2Ñ;│@─╫SS²3tfUH╬▐'ñèⁿܪ⌡¬IÑÇ╘ SJX≡ù^╝Ω░ F═&√╨p Θ√L $Å~{≡ÉN┌≥QΓA╩¿lífY┘;c└ÿR╚╓fædu╦Ñδ;°ôåk┼╡²Γ¡φö=«<öFPÜN╠═6⌠D!
  65865.  
  65866. ±Q%<;Åè+D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3gT╪ü=F╫~V>}C~·êm#Vß9╚┬½ÅY√Γε╔»ÿNI┴"
  65867. V?0ïφ?d∙ƒö┴B╩G#√τ+╞Q¼_j│5╩ï═#ⁿSeä╩ùíö⌡!!┌\╦╔└(V÷Ñ÷1](╘║açå▓xÖ    ëOª|9½₧(û>ùhτì╥%α ¼¡┤Tⁿí1∞╕δ_S=Z2k▐S╗Nb'ÿGƒB▄≡ :mâ┘z┌ [╟¿à∩½6┤Γ┘Ü╚oπ▓ÜQ¥Pa[JQσ(Ñ],║τ1ù>┐T╬╫┼█ï═àÉ│ª@cΩ;╡jù╖íèC:Rjñg┼ñz6┼l╦èM3╤!
  65868.  
  65869. ≈E+1íÄ :╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√╘svX╟ë<WàK,.BVjσ┴
  65870. Qg2áyA~½¡)∙▀V╗≈╕ÿ╖█ä4] os╔ⁿ~:í▄╠]ù╙tóJ▓·h·^]I:°$¢█_¥Wx╕N|²¢╧╢┼«wü₧ÅûoO╕≡[Mª uåΩ5╫╤V≤D#╒ÿ{Ö@ É∙v╦N! !
  65871.  
  65872. !ObjectArtsRootCertificate methodsFor!
  65873.  
  65874. ±Q%<;Åè+D╨└╬ ï,÷╤²îΩ▀┌ò«τº_J╝√╦~jY╘─*ZÆV/m^Z}
  65875. Σ├s3 L&¥oVfñδ#÷▀QΦºó£√╞5Æm!
  65876.  
  65877. ±Q%<+¼è »½Ç#åΣ═éªùò∩╟╖ΣñGF ÷ÇZ}[A╫û~FƒZ:{Y_b■ä uf_╢~_cíδ+ ╟m┬┌▌≈╔▄æ4Nll╙┐F7╖! !
  65878.  
  65879. InternalDragDropObject comment:
  65880. ''!
  65881. !InternalDragDropObject methodsFor!
  65882.  
  65883. availableFormats
  65884.     "Answer an ordered collection of strings identifying each of the receiver's available formats."
  65885.  
  65886.     ^availableFormats keys!
  65887.  
  65888. format: formatIdentifier
  65889.     "Answer the receiver's data in the format identified by formatIdentifier. If the requested format is
  65890.     unavailable then signals an error."
  65891.  
  65892.     ^availableFormats at: formatIdentifier!
  65893.  
  65894. format: formatIdentifier data: formattedDataObject
  65895.     "Set the receiver's format data for the format identified by formatIdentifier to formattedDataObject."
  65896.  
  65897.     availableFormats at: formatIdentifier put: formattedDataObject!
  65898.  
  65899. format: formatIdentifier ifAbsent: aNiladicValuable
  65900.     "Answer the receiver's data in the format identified by formatIdentifier. If the requested format is
  65901.     unavailable then evaluate aNiladicValuable."
  65902.  
  65903.     ^availableFormats at: formatIdentifier ifAbsent: aNiladicValuable!
  65904.  
  65905. initialize
  65906.     "Private - Initialize the receiver."
  65907.  
  65908.     availableFormats := Dictionary new!
  65909.  
  65910. isFormatAvailable: formatIdentifier
  65911.     "Answer whether the receiver can render itself in the format identified by formatIdentifier."
  65912.  
  65913.     ^availableFormats includesKey: formatIdentifier! !
  65914.  
  65915. InternalDragDropSession comment:
  65916. ''!
  65917. !InternalDragDropSession methodsFor!
  65918.  
  65919. cancelTrackingAt: anObject
  65920.     "The drag & drop operation has been cancelled."
  65921.  
  65922.     dropTarget isNil ifFalse: [self dropTargetLeave].
  65923.     imageList notNil 
  65924.         ifTrue: 
  65925.             [imageList
  65926.                 dragLeave: nil;
  65927.                 endDrag.
  65928.             Cursor current: oldCursor].
  65929.     Current := nil!
  65930.  
  65931. continueTrackingAt: aPoint from: lastPoint
  65932.     "Move the representation of the DragDropObject from lastPoint to aPoint."
  65933.  
  65934.     | newDropTarget |
  65935.     dragPoint := aPoint.
  65936.     (newDropTarget := View fromPoint: dragPoint) = dropTarget
  65937.         ifTrue: [self dropTargetOver]
  65938.         ifFalse: [
  65939.             self dropTargetLeave.
  65940.             dropTarget := newDropTarget.
  65941.             self dropTargetEnter].
  65942.     self giveFeedback.
  65943.     ^dragPoint!
  65944.  
  65945. defaultDragColorDepth
  65946.     "Private - Answer the color depth to use for drag icon images. Only XP can handle >24 bit depths"
  65947.  
  65948.     ^WinImageList defaultColorDepth 
  65949.         min: (OSVERSIONINFO current isWinXP ifTrue: [32] ifFalse: [8])!
  65950.  
  65951. doDragDropAt: aPoint button: buttonSymbol
  65952.     "Initiate a drag and drop operation at the screen coordinates, aPoint, active while the mouse button
  65953.     identified by buttonSymbol remains pressed. The buttonSymbol indicates which button up event will be used to
  65954.     terminate the drag and whether it is a simple drag operation or an extended drag operation. Answer whether a
  65955.     drag and drop operation completed successfully. Note that a drag may never actually start unless the user moves 
  65956.     the mouse cursor outside the hysteresis rectangle around aPoint."
  65957.  
  65958.     (self class isADragButton: buttonSymbol) ifFalse: [^false].
  65959.     dragButton := buttonSymbol.
  65960.     dragPoint := aPoint.
  65961.     (MouseTracker forPresenter: self dragSource presenter startingAt: aPoint)
  65962.         dragButton: buttonSymbol;
  65963.         origin: aPoint;
  65964.         startTracking: self.
  65965.     ^true!
  65966.  
  65967. dragObjectClass
  65968.     ^InternalDragDropObject!
  65969.  
  65970. endTrackingAt: aPoint
  65971.     "Attempt a drop of the dragObject on the drapTarget at aPoint."
  65972.  
  65973.     dragPoint := aPoint.
  65974.     self continueTrackingAt: aPoint from: aPoint.
  65975.     imageList
  65976.         dragLeave: nil;
  65977.         endDrag.
  65978.     Cursor current: oldCursor.
  65979.     operation isNil
  65980.         ifTrue: [self dropTargetLeave]
  65981.         ifFalse: [
  65982.             (self dropTargetDrop and: [operation == #move])
  65983.                 ifTrue: [self dragSourceCut]].
  65984.     Current := nil!
  65985.  
  65986. getExtendedOperation
  65987.     "Private - An extended drop has occurred - query the drop target for a list of supported operations
  65988.     so that we may present these as a context menu to allow the user to choose the operation."
  65989.  
  65990.     | supported |
  65991.     self dropTarget isDropTarget ifTrue: [dropTarget ddOperations: self].
  65992.     (supported := self supportedOperations) isEmpty 
  65993.         ifTrue: [self operation: nil]
  65994.         ifFalse: 
  65995.             [| popup defaultOp i default opNames |
  65996.             defaultOp := self operation.
  65997.             popup := Menu new.
  65998.             i := 1.
  65999.             default := 0.
  66000.             opNames := self operationDescriptions.
  66001.             supported do: 
  66002.                     [:opSymbol | 
  66003.                     opSymbol == defaultOp ifTrue: [default := i].
  66004.                     popup addCommand: (MessageSend 
  66005.                                 receiver: self
  66006.                                 selector: #operation:
  66007.                                 argument: opSymbol)
  66008.                         description: (opNames at: opSymbol).
  66009.                     i := i + 1].
  66010.             popup
  66011.                 addSeparator;
  66012.                 addCommand: (MessageSend 
  66013.                             receiver: self
  66014.                             selector: #operation:
  66015.                             argument: nil)
  66016.                     description: 'Cancel'.
  66017.             popup setDefault: default.
  66018.             self operation: nil.
  66019.             popup showIn: self dropTarget position: Cursor position.
  66020.             "Allow the command selected from the menu to be dispatched before returning"
  66021.             SessionManager inputState pumpMessages].
  66022.     ^operation!
  66023.  
  66024. giveFeedback
  66025.     "Private - Set the drag cursor to indicate the effect of a drop on the current target."
  66026.  
  66027.     | imageKey |
  66028.     (imageKey := self imageKey) ~~ lastImageKey 
  66029.         ifTrue: 
  66030.             [| dragIm |
  66031.             dragIm := dragImages at: imageKey.
  66032.             imageList 
  66033.                 setDragCursorImage: dragIm key
  66034.                 hotSpotX: dragIm value x
  66035.                 hotSpotY: dragIm value y.
  66036.             lastImageKey := imageKey].
  66037.     imageList dragMoveTo: dragPoint!
  66038.  
  66039. hideDragImage
  66040.     "Hide the current drag image. This may be useful to targets wishing to draw some sort of emphasis."
  66041.  
  66042.     imageList dragShow: false!
  66043.  
  66044. isExtendedDrag
  66045.     "Answer whether this drag was initiated with the 'right' mouse button."
  66046.  
  66047.     ^dragButton == self class extendedDragButton!
  66048.  
  66049. operationDescriptions
  66050.     "Answer an <abstractDictionary> that maps the standard drag and drop operations symbols
  66051.     to menu item names for the purposes of an extended drag and drop (i.e. these are used as the
  66052.     descriptions on the right drag popup menu)."
  66053.  
  66054.     operationDescriptions isNil ifTrue: [operationDescriptions := super operationDescriptions].
  66055.     ^operationDescriptions!
  66056.  
  66057. operationDescriptions: aLookupTable
  66058.     "Set the <abstractDictionary> that maps the standard drag and drop operations symbols
  66059.     to menu item names for the purposes of an extended drag and drop to the argument."
  66060.  
  66061.     operationDescriptions := aLookupTable!
  66062.  
  66063. showDragImage
  66064.     "Show the current drag image. This may be useful to targets wishing to draw some sort of emphasis."
  66065.  
  66066.     imageList dragShow: true!
  66067.  
  66068. solidifyOperation
  66069.     "Private - Time to make up our minds on the actual drag operation to be performed.
  66070.     By default we assume it has already solidified."
  66071.  
  66072.     self isExtendedDrag ifTrue: [
  66073.         self getExtendedOperation]!
  66074.  
  66075. startTrackingAt: aPoint
  66076.     "Start position tracking at aPoint. This is part of the 
  66077.     <MouseTracker> target protocol. Answers the actual position achieved,
  66078.     or nil if no drag objects were forthcoming (we lazily request the drag
  66079.     objects only when a drag is actually initiated)"
  66080.  
  66081.     | maxImageExtent i dragIm |
  66082.     dragPoint := aPoint.
  66083.     self dragSource isDragSource ifTrue: [self dragSource ddGetObjects: self].
  66084.     (dragObjects isNil or: [dragObjects isEmpty]) 
  66085.         ifTrue: 
  66086.             ["Cancel the drag&drop operation"
  66087.  
  66088.             ^nil].
  66089.  
  66090.     "Put all of the images into an ImageList and convert the drag images into imageList indices."
  66091.     self getCustomDragImages.
  66092.     maxImageExtent := Point new.
  66093.     dragImages do: [:image | maxImageExtent := maxImageExtent max: image extent].
  66094.     imageList := WinImageList 
  66095.                 newExtent: maxImageExtent
  66096.                 depth: self defaultDragColorDepth
  66097.                 initialSize: dragImages size
  66098.                 growBy: 1
  66099.                 masked: true.
  66100.     i := 0.
  66101.     dragImages := dragImages collect: 
  66102.                     [:image | 
  66103.                     imageList addImage: image.
  66104.                     i := i + 1.
  66105.                     i - 1 -> image hotspot].
  66106.     Current := self.
  66107.     dropTarget := dragSource.
  66108.     self dropTargetEnter.
  66109.     oldCursor := Cursor current: nil.
  66110.     dragIm := dragImages at: #Object.
  66111.     imageList
  66112.         beginDragImage: dragIm key
  66113.             hotSpotX: 0
  66114.             hotSpotY: 0;
  66115.         dragEnter: nil at: dragPoint.
  66116.     self giveFeedback.
  66117.     ^dragPoint! !
  66118.  
  66119. SelectionChangeEvent comment:
  66120. ''!
  66121. !SelectionChangeEvent methodsFor!
  66122.  
  66123. canIntercept
  66124.     ^self subclassResponsibility!
  66125.  
  66126. cause
  66127.     ^cause ifNil: [#unknown]!
  66128.  
  66129. cause: aSymbol
  66130.     "Record the cause of the selection changing, one of:
  66131.          #unknown (e.g. for programmatic changes)
  66132.         #mouse or
  66133.         #keyboard (for user initiated actions through those input devices)."
  66134.  
  66135.     cause := aSymbol!
  66136.  
  66137. newSelection
  66138.     ^self newSelections isEmpty ifFalse: [self newSelections first]!
  66139.  
  66140. newSelection: anObject
  66141.     self newSelections: (Array with: anObject)!
  66142.  
  66143. newSelections
  66144.     ^newSelections ifNil: [#()]!
  66145.  
  66146. newSelections: anArray
  66147.     newSelections := anArray!
  66148.  
  66149. oldSelection
  66150.     ^self oldSelections isEmpty ifFalse: [self oldSelections first]!
  66151.  
  66152. oldSelection: anObject
  66153.     self oldSelections: (Array with: anObject)!
  66154.  
  66155. oldSelections
  66156.     ^oldSelections ifNil: [#()]!
  66157.  
  66158. oldSelections: anArray
  66159.     oldSelections := anArray!
  66160.  
  66161. value
  66162.     ^self subclassResponsibility! !
  66163.  
  66164. WindowsEvent comment:
  66165. ''!
  66166. !WindowsEvent class methodsFor!
  66167.  
  66168. fromMSG: aMSG
  66169.     "Answer an instance of the receiver instantiated from the Win32 message, aMSG."
  66170.  
  66171.     ^self
  66172.         message: aMSG message
  66173.         handle: aMSG hwnd
  66174.         wParam: aMSG wParam
  66175.         lParam: aMSG lParam!
  66176.  
  66177. message: msgInteger handle: wndHandle wParam: wInteger lParam: lInteger
  66178.     "Answer an instance of the receiver containing the message details
  66179.     specified by the parameters."
  66180.  
  66181.     ^self new
  66182.         message: msgInteger
  66183.         handle: wndHandle
  66184.         wParam: wInteger
  66185.         lParam: lInteger! !
  66186.  
  66187. !WindowsEvent methodsFor!
  66188.  
  66189. hwnd
  66190.     "Private - Answer the receiver's raw hWnd."
  66191.  
  66192.     ^hWnd!
  66193.  
  66194. lParam
  66195.     "Private - Answer the receiver's raw wParam."
  66196.  
  66197.     ^lParam!
  66198.  
  66199. lParamX
  66200.     "Answer the Y-value signed 16-bit integer packed into the high word of the receiver's 
  66201.     lParam field."
  66202.  
  66203.     ^self lParam lowSWord!
  66204.  
  66205. lParamY
  66206.     "Answer the Y-value signed 16-bit integer packed into the high word of the receiver's 
  66207.     lParam field."
  66208.  
  66209.     ^self lParam highSWord!
  66210.  
  66211. message
  66212.     "Private - Answer the receiver's raw hWnd."
  66213.  
  66214.     ^message!
  66215.  
  66216. message: msgInteger handle: wndHandle wParam: wInteger lParam: lInteger
  66217.     "Private - Initialize the receiver's instance variables from the
  66218.     parameters."
  66219.  
  66220.     hWnd := wndHandle.
  66221.     message := msgInteger.
  66222.     wParam := wInteger.
  66223.     lParam := lInteger!
  66224.  
  66225. printLParamOn: aStream
  66226.     "Private - Append a textual representation of the receiver's lParam
  66227.     to aStream, in a format appropriate for the type of event."
  66228.  
  66229.     aStream
  66230.         print: self lParam
  66231. !
  66232.  
  66233. printOn: aStream 
  66234.     "Append a textual representation of the receiver to aStream."
  66235.  
  66236.     | msg window |
  66237.     self basicPrintOn: aStream.
  66238.     msg := View selectorForMessage: self message.
  66239.     aStream nextPut: $(.
  66240.     window := self window.
  66241.     aStream
  66242.         print: (window isNil ifTrue: [self hwnd] ifFalse: [window]);
  66243.         space.
  66244.     message isNil 
  66245.         ifTrue: [self message printOn: aStream base: 16]
  66246.         ifFalse: [aStream nextPutAll: msg].
  66247.     aStream
  66248.         space;
  66249.         print: self wParam;
  66250.         space.
  66251.     self printLParamOn: aStream.
  66252.     aStream nextPut: $)!
  66253.  
  66254. wParam
  66255.     "Private - Answer the receiver's raw wParam."
  66256.  
  66257.     ^wParam! !
  66258.  
  66259. SelectionChangedEvent comment:
  66260. ''!
  66261. !SelectionChangedEvent methodsFor!
  66262.  
  66263. canIntercept
  66264.     ^false!
  66265.  
  66266. value
  66267.     ^true! !
  66268.  
  66269. SelectionChangingEvent comment:
  66270. ''!
  66271. !SelectionChangingEvent class methodsFor!
  66272.  
  66273. new
  66274.     ^self shouldNotImplement! !
  66275.  
  66276. !SelectionChangingEvent methodsFor!
  66277.  
  66278. canIntercept
  66279.     ^true!
  66280.  
  66281. setSource: aWindow
  66282.     permit := true.
  66283.     super setSource: aWindow!
  66284.  
  66285. value
  66286.     ^permit!
  66287.  
  66288. value: aBoolean
  66289.     permit := aBoolean! !
  66290.  
  66291. ColorEvent comment:
  66292. ''!
  66293. !ColorEvent methodsFor!
  66294.  
  66295. canvas
  66296.     "Answer the canvas to setup for the color"
  66297.  
  66298.     ^Canvas withNonOwnedDC: self wParam.! !
  66299.  
  66300. FindEvent comment:
  66301. ''!
  66302. !FindEvent methodsFor!
  66303.  
  66304. winStruct
  66305.     "Private - Answer a Windows structure containing the Find/Replace information
  66306.     for the receiver."
  66307.  
  66308.     ^FINDREPLACE fromAddress: self lParam! !
  66309.  
  66310. KeyEvent comment:
  66311. ''!
  66312. !KeyEvent class methodsFor!
  66313.  
  66314. initialize
  66315.     "Initialize the receiver's class variables.
  66316.         KeyEvent initialize
  66317.     "
  66318.  
  66319.     AltKeyMask         := 1 bitShift: 29.
  66320.     PrevStateMask         := 1 bitShift: 30.
  66321.     TransitionMask     := 1 bitShift: 31.
  66322.     ExtendedKeyMask    := 1 bitShift: 24! !
  66323.  
  66324. !KeyEvent methodsFor!
  66325.  
  66326. code
  66327.     "Answer the code part of the message."
  66328.  
  66329.     ^self wParam!
  66330.  
  66331. data
  66332.     "Answer the data part of the message."
  66333.  
  66334.     ^self lParam!
  66335.  
  66336. isAlreadyDown
  66337.     "Answer whether the key was already down."
  66338.  
  66339.     ^self data allMask: PrevStateMask!
  66340.  
  66341. isAltKeyDown
  66342.     "Answer whether the alt key is down."
  66343.  
  66344.     ^self data allMask: AltKeyMask!
  66345.  
  66346. isBeingReleased
  66347.     "Answer whether the key is being released."
  66348.  
  66349.     ^self data allMask: TransitionMask!
  66350.  
  66351. isExtended
  66352.     "Answer whether the key is an extended key."
  66353.  
  66354.     ^self data allMask: ExtendedKeyMask!
  66355.  
  66356. printLParamOn: aStream
  66357.     "Append a textual representation of the receiver's lParam
  66358.     to aStream, in a format appropriate for the type of event."
  66359.  
  66360.     aStream
  66361.         print: (Keyboard keyNameFromLParam: self lParam)!
  66362.  
  66363. repeatCount
  66364.     "Answer the repeat count."
  66365.  
  66366.     ^self data lowWord!
  66367.  
  66368. scanCode
  66369.     "Answer the scan code."
  66370.  
  66371.     ^self data highWord bitAnd: 16rFF! !
  66372.  
  66373. PaintEvent comment:
  66374. ''!
  66375. !PaintEvent class methodsFor!
  66376.  
  66377. handle:  hWnd wParam: wParam hdc: hdc paintStruct: ps
  66378.     "Answer an instance of the receiver with the given properties."
  66379.  
  66380.     ^self new handle: hWnd wParam: wParam hdc: hdc paintStruct: ps! !
  66381.  
  66382. !PaintEvent methodsFor!
  66383.  
  66384. canvas
  66385.     "Answer a Canvas using the hdc associated with the paint event."
  66386.  
  66387.     ^Canvas withNonOwnedDC: hdc
  66388. !
  66389.  
  66390. handle: anExternalHandle wParam: anInteger hdc: dcExternalHandle paintStruct: aPAINTSTRUCT
  66391.     "Private - Initialize the receiver's instance variables. Answer the receiver."
  66392.  
  66393.     message := WM_PAINT.
  66394.     hWnd := anExternalHandle.
  66395.     wParam := anInteger.
  66396.     lParam := 0.
  66397.     hdc := dcExternalHandle.
  66398.     paintStruct := aPAINTSTRUCT!
  66399.  
  66400. paintStruct
  66401.     "Answer the <PAINTSTRUCT> associated with the receiver."
  66402.  
  66403.     ^paintStruct!
  66404.  
  66405. printOn: aStream
  66406.     "Append a textual representation of the receiver to aStream."
  66407.  
  66408.     aStream
  66409.         basicPrint: self;
  66410.         nextPut: $(;
  66411.         print: self paintStruct;
  66412.         nextPut: $)! !
  66413.  
  66414. PointEvent comment:
  66415. ''!
  66416. !PointEvent methodsFor!
  66417.  
  66418. position
  66419.     "Private - Answer the point stored in the receiver's lParam."
  66420.  
  66421.     ^self x @ self y!
  66422.  
  66423. screenPosition
  66424.     "Answer the point stored in the receiver's lParam mapped to screen coordinates"
  66425.  
  66426.     ^self window mapPoint: self position to: View desktop!
  66427.  
  66428. x
  66429.     "Answer the x-position of the pointer."
  66430.  
  66431.     ^self lParamX!
  66432.  
  66433. y
  66434.     "Answer the y-position of the pointer."
  66435.  
  66436.     ^self lParamY! !
  66437.  
  66438. PositionEvent comment:
  66439. 'PositionEvent is the class of <Event> associated with a window reposition event originating from a WM_WINDOWPOSCHANGING or WM_WINDOWPOSCHANGED message.'!
  66440. !PositionEvent class methodsFor!
  66441.  
  66442. fromMSG: aMSG
  66443.     "Answer an instance of the receiver instantiated from the Win32 message, aMSG."
  66444.  
  66445.     ^(super fromMSG: aMSG) makeStruct! !
  66446.  
  66447. !PositionEvent methodsFor!
  66448.  
  66449. extent
  66450.     "Answer the extent of the window after the size event.
  66451.     N.B. This is not the width of the client area, but the external dimension.
  66452.     If the client area is required, it can be requested by simply sending an
  66453.     #clientExtent message to the window."
  66454.  
  66455.     ^self width @ self height!
  66456.  
  66457. extent: aPoint
  66458.     "Set the extent of the window for the size event.
  66459.     N.B. This is not the width of the client area, but the external dimension."
  66460.  
  66461.     self width: aPoint x; height: aPoint y!
  66462.  
  66463. flags
  66464.     "Answer an <integer> containing the SWP_XXX flags associated with 
  66465.     this position change event."
  66466.  
  66467.     ^lpwp flags!
  66468.  
  66469. height
  66470.     "Answer the height of the window after the size event.
  66471.     N.B. This is not the height of the client area, but the external dimension.
  66472.     If the client area is required, it can be requested by simply sending an
  66473.     #clientExtent message to the window."
  66474.  
  66475.     ^lpwp cy!
  66476.  
  66477. height: anInteger
  66478.     "Set the height of the window for the size event.
  66479.     N.B. This is not the height of the client area, but the external dimension."
  66480.  
  66481.     ^lpwp cy: anInteger!
  66482.  
  66483. isActivate
  66484.     "Answer whether the receiver is describing a window activation event."
  66485.  
  66486.     ^lpwp flags noMask: SWP_NOACTIVATE!
  66487.  
  66488. isMove
  66489.     "Answer whether the receiver is describing a move event."
  66490.  
  66491.     ^lpwp flags noMask: SWP_NOMOVE!
  66492.  
  66493. isRectangleChanged
  66494.     "Answer whether the receiver is describing a position change
  66495.     event which has really affected the layout of the window."
  66496.  
  66497.     ^(lpwp flags allMask: ##(SWP_NOMOVE|SWP_NOSIZE)) not!
  66498.  
  66499. isResize
  66500.     "Answer whether the receiver is describing a resize event."
  66501.  
  66502.     ^lpwp flags noMask: SWP_NOSIZE!
  66503.  
  66504. lpwp
  66505.     "Private - Answer the value of the receiver's 'lpwp' instance variable."
  66506.  
  66507.     ^lpwp!
  66508.  
  66509. makeStruct
  66510.     "Private - Create the WINDOWPOS structure from the message lParam."
  66511.  
  66512.     lpwp := WINDOWPOS fromAddress: lParam.!
  66513.  
  66514. position
  66515.     "Answer the position of the window origin."
  66516.  
  66517.     ^self x @ self y!
  66518.  
  66519. width
  66520.     "Answer the width of the window after the size event.
  66521.     N.B. This is not the width of the client area, but the external dimension.
  66522.     If the client area is required, it can be requested by simply sending an
  66523.     #clientExtent message to the window."
  66524.  
  66525.     ^lpwp cx!
  66526.  
  66527. width: anInteger
  66528.     "Set the width of the window forthe size event.
  66529.     N.B. This is not the width of the client area, but the external dimension."
  66530.  
  66531.     ^lpwp cx: anInteger!
  66532.  
  66533. x
  66534.     "Answer the x-position of the window origin."
  66535.  
  66536.     ^lpwp x!
  66537.  
  66538. y
  66539.     "Answer the y-position of the window origin."
  66540.  
  66541.     ^lpwp y! !
  66542.  
  66543. ScrollEvent comment:
  66544. ''!
  66545. !ScrollEvent methodsFor!
  66546.  
  66547. bottom
  66548.     "Answer whether the scroll event is to the far bottom/right."
  66549.  
  66550.     ^self scrollCode = SB_BOTTOM!
  66551.  
  66552. endScroll
  66553.     "Answer whether the scroll event is the end of the scroll."
  66554.  
  66555.     ^self scrollCode = SB_ENDSCROLL!
  66556.  
  66557. lineDown
  66558.     "Answer whether the scroll event is one unit down."
  66559.  
  66560.     ^self scrollCode = SB_LINEDOWN!
  66561.  
  66562. lineLeft
  66563.     "Answer whether the scroll event is one unit left."
  66564.  
  66565.     ^self scrollCode = SB_LINELEFT!
  66566.  
  66567. lineRight
  66568.     "Answer whether the scroll event is one unit right."
  66569.  
  66570.     ^self scrollCode = SB_LINERIGHT!
  66571.  
  66572. lineUp
  66573.     "Answer whether the scroll event is one unit up."
  66574.  
  66575.     ^self scrollCode = SB_LINEUP!
  66576.  
  66577. pageDown
  66578.     "Answer whether the scroll event is one page down."
  66579.  
  66580.     ^self scrollCode = SB_PAGEDOWN!
  66581.  
  66582. pageLeft
  66583.     "Answer whether the scroll event is one page left."
  66584.  
  66585.     ^self scrollCode = SB_PAGELEFT!
  66586.  
  66587. pageRight
  66588.     "Answer whether the scroll event is one page right."
  66589.  
  66590.     ^self scrollCode = SB_PAGERIGHT!
  66591.  
  66592. pageUp
  66593.     "Answer whether the scroll event is one page up."
  66594.  
  66595.     ^self scrollCode = SB_PAGEUP!
  66596.  
  66597. pos
  66598.     "Answer the scroll bar position.
  66599.     Implementation Note: Ignore the position passed with the event since it is limited to a 16-bit
  66600.     co-ordinate space. Instead the current trackbar position is queried using GetScrollInfo()."
  66601.  
  66602.     | struct |
  66603.     struct := (SCROLLINFO new)
  66604.                 maskIn: SIF_TRACKPOS;
  66605.                 yourself.
  66606.     ^(UserLibrary default 
  66607.         getScrollInfo: hWnd
  66608.         fnBar: (message = WM_HSCROLL ifTrue: [SB_HORZ] ifFalse: [SB_VERT])
  66609.         lpsi: struct) ifTrue: [struct nTrackPos] ifFalse: [wParam highWord]!
  66610.  
  66611. scrollBar
  66612.     "Answer the View which received the scroll command or the ScrollBar
  66613.     if the scrollBar is a scroll bar control."
  66614.  
  66615.     ^SessionManager inputState windowAt: self lParam ifAbsent: []!
  66616.  
  66617. scrollCode
  66618.     "Answer the scroll bar value."
  66619.  
  66620.     ^wParam lowWord!
  66621.  
  66622. thumbPosition
  66623.     "Answer whether the scroll event has been generated by dragging the thumb pos."
  66624.  
  66625.     ^self scrollCode = SB_THUMBPOSITION!
  66626.  
  66627. thumbTrack
  66628.     "Answer whether the scroll event has resulted from dragging the thumb pos."
  66629.  
  66630.     ^self scrollCode = SB_THUMBTRACK!
  66631.  
  66632. top
  66633.     "Answer whether the scroll event is to the far top/left."
  66634.  
  66635.     ^self scrollCode = SB_TOP! !
  66636.  
  66637. SizeEvent comment:
  66638. ''!
  66639. !SizeEvent methodsFor!
  66640.  
  66641. extent
  66642.     "Answer the extent of the client area after the size event."
  66643.  
  66644.     ^self width @ self height!
  66645.  
  66646. height
  66647.     "Answer the height of the client area after the size event."
  66648.  
  66649.     ^self lParamY!
  66650.  
  66651. type
  66652.     "Answer the type of size event."
  66653.  
  66654.     ^self wParam!
  66655.  
  66656. width
  66657.     "Answer the width of the client area after the size event."
  66658.  
  66659.     ^self lParamX! !
  66660.  
  66661. MouseEvent comment:
  66662. ''!
  66663. !MouseEvent methodsFor!
  66664.  
  66665. button
  66666.     "Answer the symbolic name of the button which was down when this event occurred (or
  66667.     nil if just a move)."
  66668.  
  66669.     ^##(IdentityDictionary new
  66670.         at: MK_LBUTTON put: #left;
  66671.         at: MK_RBUTTON put: #right;
  66672.         at: MK_MBUTTON put: #middle;
  66673.         shrink;
  66674.         yourself) at: (self keys bitAnd: ##(MK_LBUTTON|MK_RBUTTON|MK_MBUTTON))
  66675.                 ifAbsent: []!
  66676.  
  66677. isCtrlDown
  66678.     "Answer whether the control key is down."
  66679.  
  66680.     ^self keys anyMask: MK_CONTROL!
  66681.  
  66682. isLButtonDown
  66683.     "Answer whether the left mouse button is down."
  66684.  
  66685.     ^self keys anyMask: MK_LBUTTON!
  66686.  
  66687. isMButtonDown
  66688.     "Answer whether the middle mouse button is down."
  66689.  
  66690.     ^self keys anyMask: MK_MBUTTON!
  66691.  
  66692. isRButtonDown
  66693.     "Answer whether the right mouse button is down."
  66694.  
  66695.     ^self keys anyMask: MK_RBUTTON!
  66696.  
  66697. isShiftDown
  66698.     "Answer whether the shift key is down."
  66699.  
  66700.     ^self keys anyMask: MK_SHIFT!
  66701.  
  66702. keys
  66703.     "Private - Answer the keys flags from the message."
  66704.  
  66705.     ^self wParam!
  66706.  
  66707. wheelRotation
  66708.     "Answer the <number> of notches that the mouse wheel was rotated to generate this
  66709.     event (assuming that this is a WM_MOUSEWHEEL event)."
  66710.  
  66711.     self assert: [message == WM_MOUSEWHEEL].
  66712.     ^self wParam highSWord / WHEEL_DELTA! !
  66713.  
  66714. Error comment:
  66715. ''!
  66716. !Error class methodsFor!
  66717.  
  66718. beep
  66719.     "Sound an appropriate beep to draw the users attention."
  66720.  
  66721.     Sound errorBeep!
  66722.  
  66723. icon
  66724.     "Answer the default icon for the receiver and its instances."
  66725.  
  66726.     ^Icon error!
  66727.  
  66728. nonIntegerIndex: anObject
  66729.     "Private - Raise an Error to the effect that anObject was used as an 
  66730.     integer index, but it isn't!!"
  66731.  
  66732.     ^self signal: 'Index: ', anObject printString, ' is not an integer'!
  66733.  
  66734. notIndexable: anObject
  66735.     "Private - Raise an error that some attempt was made to index a non-indexable Object."
  66736.  
  66737.     ^self signal: 'not indexable'!
  66738.  
  66739. notYetImplemented
  66740.     "Private - Raise an error that some method is not implemented yet but should 
  66741.     be in future."
  66742.  
  66743.     ^self signal: 'Not implemented yet'
  66744. !
  66745.  
  66746. perform: selector failedFor: receiver withArgs: arguments
  66747.     "Private - A primitive perform call failed, generate an appropriate error."
  66748.  
  66749.     | argCount |
  66750.     ^(selector isMemberOf: Symbol)
  66751.         ifTrue: [
  66752.             (arguments isMemberOf: Array)
  66753.                 ifTrue: [
  66754.                     "This should not fail, because if not understood does not fail primitive"
  66755.                     argCount := ((receiver class whichClassIncludesSelector: selector)
  66756.                         compiledMethodAt: selector) argumentCount.
  66757.                     argCount = arguments size
  66758.                         ifTrue: [receiver primitiveFailed    "unrecognised failure"]
  66759.                         ifFalse: [receiver error: 'Incorrect number of arguments: ', 
  66760.                                     arguments size displayString, ', expected ', argCount displayString]]
  66761.                 ifFalse: [receiver error: 'Arguments not Array: ', arguments printString]]
  66762.         ifFalse: [receiver error: 'Invalid selector ', selector printString]!
  66763.  
  66764. severityClass
  66765.     "Answer an exception class describing the severity of the notification."
  66766.  
  66767.     ^Error!
  66768.  
  66769. subclassResponsibility: selector
  66770.     "Private - Raise an error that some message was sent to an abstract class."
  66771.  
  66772.     ^SubclassResponsibilityError signal: selector printString, ' is the responsibility of the subclass'! !
  66773.  
  66774. !Error methodsFor!
  66775.  
  66776. asWarning
  66777.     "Private - Answer the receiver as a generic Warning message."
  66778.  
  66779.     ^Warning new 
  66780.         messageText: self description!
  66781.  
  66782. defaultAction
  66783.     "Perform the default action for the receiver if it is not handled
  66784.     (forward to the SessionManager for application specific handling."
  66785.  
  66786.     ^SessionManager current onUnhandledError: self!
  66787.  
  66788. hresult
  66789.     "Answer the <HRESULT> error code associated with the receiver.
  66790.     Overridden by subclasses to answer more specified HRESULT codes."
  66791.  
  66792.     ^HRESULT fail!
  66793.  
  66794. isUserResumable
  66795.     "Answer whether the user should be given the option of resuming when
  66796.     prompted with regard to this exception.
  66797.     Implementation Note: We want to avoid the user being given the option to
  66798.     resume errors in a runtime system, as it is almost certainly not desired (e.g.
  66799.     if they hit OK in response to a MessageNotUnderstood, then they will almost
  66800.     certainly get a knock on error occurring)."
  66801.  
  66802.     ^false!
  66803.  
  66804. notify
  66805.     "Signal a <Notification> with the receiver's description. Generally used to provide
  66806.     a trace showing that an error has been suppressed."
  66807.  
  66808.     ^Notification signal: 'Error: ', self description!
  66809.  
  66810. resignalAsWarning
  66811.     "Private - Resignal the receiver as if it had originally been raised as a generic Warning.
  66812.     This should be used only to get out of sticky situations (e.g. recursive walkbacks)."
  66813.  
  66814.     self resignalAs: self asWarning!
  66815.  
  66816. warningClass
  66817.     "Private - Answer the class of Warning to which the receiver is converted by #asWarning."
  66818.     
  66819.     ^Warning! !
  66820.  
  66821. Notification comment:
  66822. 'Notification is the class of exceptional conditions which are not considered errors.'!
  66823. !Notification class methodsFor!
  66824.  
  66825. beep
  66826.     "Sound an appropriate beep to draw the users attention."
  66827.  
  66828.     Sound informationBeep!
  66829.  
  66830. deprecated
  66831.     "Raise a warning to the effect that the sender is a deprecated method."
  66832.  
  66833.     | sender |
  66834.     sender := Processor activeProcess topFrame sender.
  66835.     ^self signal: 'Deprecated message sent: ', sender method printString, ' from: ', sender sender method printString!
  66836.  
  66837. icon
  66838.     "Answer the default icon for the receiver and its instances."
  66839.  
  66840.     ^Icon information!
  66841.  
  66842. severityClass
  66843.     "Answer an exception class describing the severity of the notification."
  66844.  
  66845.     ^Notification! !
  66846.  
  66847. !Notification methodsFor!
  66848.  
  66849. defaultAction
  66850.     "The receiver is an unhandled notification, perform the default action
  66851.     (forward to the SessionManager for application customisation).
  66852.     N.B. The ANSI standard states that no action is taken, which seems a little
  66853.     lacking in imagination."
  66854.  
  66855.     ^SessionManager current onUnhandledNotification: self!
  66856.  
  66857. isResumable
  66858.     "Answer whether the receiver represents a resumable exception. 
  66859.     Notifications are almost always resumable."
  66860.  
  66861.     ^true! !
  66862.  
  66863. ProcessTermination comment:
  66864. ''!
  66865. !ProcessTermination methodsFor!
  66866.  
  66867. _descriptionFormat
  66868.     "Answer the Win32 format String to be used to format the description for the receiver."
  66869.     
  66870.     ^'Terminating %2'!
  66871.  
  66872. defaultAction
  66873.     "The receiver is an unhandled notification, perform the default action.
  66874.     In the case of ProcessTermination signals, we'll only get here on attempts to
  66875.     terminate processes which have no base handler, which will only happen if
  66876.     the process has not yet completed its initialization, or if it has been
  66877.     incompletely terminated. The defaultAction here is to do nothing, and
  66878.     if the process is still running, it will shut itself down."
  66879. ! !
  66880.  
  66881. ArithmeticError comment:
  66882. ''!
  66883. BoundsError comment:
  66884. ''!
  66885. !BoundsError methodsFor!
  66886.  
  66887. _descriptionFormat
  66888.     "Answer the description format string for the receiver."
  66889.  
  66890.     ^'Index %2 is out of bounds'!
  66891.  
  66892. receiver
  66893.     "Answer the object which generated the bounds error."
  66894.     
  66895.     ^receiver!
  66896.  
  66897. receiver: anObject
  66898.     "Set the object which generated the bounds error to be anObject"
  66899.     
  66900.     receiver := anObject! !
  66901.  
  66902. ClassRemovalError comment:
  66903. ''!
  66904. !ClassRemovalError methodsFor!
  66905.  
  66906. isResumable
  66907.     "Answer whether the receiver represents a resumable error. 
  66908.     An individual problem removing a class is not considered fatal, 
  66909.     so allow resumption to attempt so the class can be removed regardless."
  66910.  
  66911.     ^true!
  66912.  
  66913. originalError
  66914.     "Answer the original <Error>, or nil if none."
  66915.  
  66916.     ^originalError!
  66917.  
  66918. originalError: anError
  66919.     "Set the original <Error> which occurred when attempting to remove the class
  66920.     in the receivers tag field."
  66921.  
  66922.     originalError := anError! !
  66923.  
  66924. CRTError comment:
  66925. ''!
  66926. !CRTError methodsFor!
  66927.  
  66928. _descriptionArguments
  66929.     "Answer the arguments to be substituted into the receiver's Win32 description format String."
  66930.  
  66931.     ^Array 
  66932.         with: self errno
  66933.         with: self messageText 
  66934.         with: self strerror
  66935. !
  66936.  
  66937. _descriptionFormat
  66938.     "Answer the Win32 format String to be used to format the description for the receiver."
  66939.  
  66940.     ^'%2 (16r%1!!X!!: %3)'!
  66941.  
  66942. errno
  66943.     "Answer the <integer> C-runtime library error number."
  66944.  
  66945.     ^self tag!
  66946.  
  66947. initialize
  66948.     "Private - Initialize the receiver's instance variables.
  66949.     Set the details to be the last error code reported
  66950.     by a system library (i.e. that retried by KernelLibrary>>getLastError)."
  66951.  
  66952.     self tag: CRTLibrary default errno
  66953. !
  66954.  
  66955. messageText
  66956.     "Answer the <readableString> message text supplied when the receiver was signalled,
  66957.     or nil if none was provided."
  66958.  
  66959.     (messageText isNil or: [messageText isEmpty])
  66960.         ifTrue: [messageText := self strerror].
  66961.     ^messageText!
  66962.  
  66963. strerror
  66964.     "Answer a <readableString> description of the receiver's error number."
  66965.  
  66966.     ^CRTLibrary default strerror: self errno! !
  66967.  
  66968. HRESULTError comment:
  66969. ''!
  66970. !HRESULTError class methodsFor!
  66971.  
  66972. initialize
  66973.     "Private - Initialize the receiver's class variables.
  66974.         HRESULTError initialize
  66975.     "
  66976.  
  66977.     FacilityClasses := 
  66978.         IdentityDictionary new
  66979.             at: FACILITY_NULL put: Win32Error;
  66980.             at: FACILITY_WIN32 put: Win32Error;
  66981.             yourself!
  66982.  
  66983. registerFacility: anInteger class: anExceptionClass
  66984.     "Register the specified exception class as the exception type
  66985.     to be raised for HRESULTs with the facility code, anInteger.
  66986.     Normally anExceptionClass will be a subclass of the receiver."
  66987.  
  66988.     FacilityClasses at: anInteger put: anExceptionClass!
  66989.  
  66990. signal: messageText with: anInteger
  66991.     "Raise a new instance of the receiver, with the error message, msg, initiating a search for an 
  66992.     ExceptionHandler prepared to handle instances of the receiver. This method will not return to its 
  66993.     sender, unless the new instance is resumable, and the handler which catches it directs that it 
  66994.     should be resumed."
  66995.  
  66996.     self signalHRESULT: (HRESULT fromInteger: anInteger)!
  66997.  
  66998. signalCode: statusCode facility: facilityCode
  66999.     "Raise a new instance of the receiver, with the error message, msg, initiating a search for an 
  67000.     ExceptionHandler prepared to handle instances of the receiver. This method will not return to its 
  67001.     sender, unless the new instance is resumable, and the handler which catches it directs that it 
  67002.     should be resumed."
  67003.  
  67004.     ^self signalHRESULT: (HRESULT status: statusCode facility: facilityCode)!
  67005.  
  67006. signalHRESULT: anHRESULT
  67007.     "Raise a new Error subinstance, with the argument, anHRESULT, of an appropriate type 
  67008.     (depending on the facility of that argument)."
  67009.  
  67010.     (FacilityClasses at: anHRESULT facilityCode ifAbsent: [self])
  67011.         new signalWith: anHRESULT!
  67012.  
  67013. unregisterFacilityClass: anExceptionClass
  67014.     "Unregister the specified exception class, if registered."
  67015.  
  67016.     FacilityClasses removeKey: (FacilityClasses keyAtValue: anExceptionClass ifAbsent: [^self])
  67017. ! !
  67018.  
  67019. !HRESULTError methodsFor!
  67020.  
  67021. _descriptionArguments
  67022.     "Answer the arguments to be substitued into the receiver's Win32 description format String."
  67023.  
  67024.     | hresult |
  67025.     hresult := self hresult.
  67026.     ^Array with: hresult with: self messageText with: hresult facility!
  67027.  
  67028. _descriptionFormat
  67029.     "Answer the Win32 format String to be used to format the description for the receiver."
  67030.  
  67031.     ^'HRESULT Error: %2 (%3)'!
  67032.  
  67033. errorInfo: err
  67034.     "Private - Set the IErrorInfo/EXCEPINFO associated with the receiver."
  67035.  
  67036.     errorInfo := err!
  67037.  
  67038. hresult
  67039.     "Answer the HRESULT error code associated with the receiver."
  67040.  
  67041.     ^self tag!
  67042.  
  67043. hresult: hr
  67044.     "Set the HRESULT error code associated with the receiver to the <integer>
  67045.     argument, hr."
  67046.  
  67047.     ^self tag: (HRESULT fromInteger: hr)!
  67048.  
  67049. messageText
  67050.     "Answer the <readableString> message text supplied when the receiver was signalled,
  67051.     or nil if none was provided."
  67052.  
  67053.     messageText isNil ifTrue: [
  67054.         errorInfo notNull ifTrue: [messageText := errorInfo description trimBlanks]].
  67055.     (messageText isNil or: [messageText isEmpty])
  67056.         ifTrue: [messageText := self osErrorMessage].
  67057.     ^messageText!
  67058.  
  67059. osErrorMessage
  67060.     "Answer a String representation of the OS error code."
  67061.  
  67062.     ^self hresult displayString!
  67063.  
  67064. source
  67065.     "Answer the 'source' of the error (by convention the Prog ID of the component which raised the error).
  67066.     This is only available if extended error information is associated with the receiver."
  67067.  
  67068.     ^errorInfo notNull ifTrue: [errorInfo source]!
  67069.  
  67070. statusCode
  67071.     "Answer the error status code from the receiver's details."
  67072.  
  67073.     ^self hresult statusCode! !
  67074.  
  67075. InvalidExternalCall comment:
  67076. 'Exception to represent an invalid attempt to invoke an external procedure call, perhaps because of passing an invalid object type as an argument.
  67077.  
  67078. See <ExternalDescriptor>''s class comment for a description of the argument types supported by Dolphin.'!
  67079. !InvalidExternalCall class methodsFor!
  67080.  
  67081. invalidArgument: anInteger got: anObject expected: type
  67082.     "Private - Validate the attempted invocation of the ExternalMethod in
  67083.     the StackFrame argument, raising an appropriate Error if validation of an 
  67084.     argument fails."
  67085.  
  67086.     ##(ExternalDescriptor initialize).    "cause ExternalDescriptor to be initialized during boot"
  67087.  
  67088.     ^self new
  67089.         argument: anObject;
  67090.         type: type;
  67091.         signalWith: anInteger! !
  67092.  
  67093. !InvalidExternalCall methodsFor!
  67094.  
  67095. _descriptionArguments
  67096.     "Answer the set of arguments to be substitued into the receiver's descriptionFormat
  67097.     String."
  67098.  
  67099.     ^super _descriptionArguments, 
  67100.         (Array 
  67101.             with: argument basicPrintString
  67102.             with: type displayString)!
  67103.  
  67104. _descriptionFormat
  67105.     "Private - Answer a string which is the message format for the receiver's description.
  67106.     Implementation Note: Parameter 1 is the message text, which we don't use in this
  67107.     case, 2 is the index of the offending argument, 3 the object passed, and 4 the type
  67108.     expected."
  67109.  
  67110.     ^'Invalid arg %2: Cannot coerce %3 to %4'!
  67111.  
  67112. argument: anObject
  67113.     "Private - Set the arguments passed to the invalid call which the receiver represents to anArray."
  67114.  
  67115.     argument := anObject!
  67116.  
  67117. type: anObject
  67118.     "Private - Set the type expected by the argument for which the receiver represents an
  67119.     invalid call to anObject."
  67120.  
  67121.     type := anObject! !
  67122.  
  67123. InvalidFormat comment:
  67124. ''!
  67125. !InvalidFormat methodsFor!
  67126.  
  67127. _descriptionFormat
  67128.     "Private - Answer a string which is the message format for the receiver's description."
  67129.  
  67130.     ^'Invalid format for %2'! !
  67131.  
  67132. InvalidInstallationError comment:
  67133. ''!
  67134. !InvalidInstallationError methodsFor!
  67135.  
  67136. _descriptionFormat
  67137.     "Answer the Win32 format String to be used to format the description for the receiver."
  67138.  
  67139.     ^'This copy of Dolphin Smalltalk has not been installed correctly; please re-install from the original source medium.'
  67140. ! !
  67141.  
  67142. MessageNotUnderstood comment:
  67143. ''!
  67144. !MessageNotUnderstood class methodsFor!
  67145.  
  67146. receiver: anObject message: aMessage
  67147.     "Raise a new instance of the receiver reporting that the <object>, anObject, did not understand
  67148.     the <failedMessage>, aMessage."
  67149.  
  67150.     ^super new
  67151.         receiver: anObject;
  67152.         tag: aMessage;
  67153.         signal! !
  67154.  
  67155. !MessageNotUnderstood methodsFor!
  67156.  
  67157. _descriptionArguments
  67158.     "Answer an string describing the extra information supplied when the receiver
  67159.     was raised. Here we answer the classic does not understand error."
  67160.  
  67161.     ^Array with: self receiver basicClass name with: self selector printString!
  67162.  
  67163. _descriptionFormat
  67164.     "Answer the Win32 format String to be used to format the description for the receiver.
  67165.     We answer the classic does not understand error format."
  67166.  
  67167.     ^'%1 does not understand %2'!
  67168.  
  67169. isResumable
  67170.     "Answer whether the receiver represents a resumable error. Message not understood errors are
  67171.     considered resumable, as there are a number of circumstances in which we might want to
  67172.     perform #doesNotUnderstand: handling and continue."
  67173.  
  67174.     ^true!
  67175.  
  67176. message
  67177.     "Answer the <failedMessage> associated with the receiver."
  67178.  
  67179.     ^self tag!
  67180.  
  67181. receiver
  67182.     "Answer the object which did not understand the receiver's
  67183.     <failedMessage>."
  67184.     
  67185.     ^receiver!
  67186.  
  67187. receiver: anObject
  67188.     "Set the object which did not understand the message to be anObject"
  67189.     
  67190.     receiver := anObject!
  67191.  
  67192. selector
  67193.     "Answer the selector that was not understood from the receiver's
  67194.     <failedMessage>."
  67195.  
  67196.     ^self message selector! !
  67197.  
  67198. NotFoundError comment:
  67199. ''!
  67200. !NotFoundError methodsFor!
  67201.  
  67202. _descriptionFormat
  67203.     "Answer the Win32 format String to be used to format the description for the receiver."
  67204.  
  67205.     ^'Not found: %2'!
  67206.  
  67207. receiver
  67208.     "Answer the object which generated the error."
  67209.     
  67210.     ^receiver!
  67211.  
  67212. receiver: anObject
  67213.     "Set the object which generated the error to be anObject"
  67214.     
  67215.     receiver := anObject! !
  67216.  
  67217. NotTrustedError comment:
  67218. 'A NotTrustedError is signalled to indicate when the load of a binary class file has been prevented by the end-user due to a lack of trust in the publisher of the class. It is either signalled when a digital certificate for a signed class has been refused (in SignedClassStub>>reifyClassUsing:) or when an unsigned class is being loaded and the standard NotSignedCertificate has been refused instead.
  67219.  
  67220. Normal policy is to let the error propagate unimpeded and, either bring up a walkback in the development system, or display a warning MessageBox in a run-time system.  However, one might consider trapping this error and performing some other action when an untrusted class load is refused.'!
  67221. !NotTrustedError methodsFor!
  67222.  
  67223. ▐@"    6*¡ƒ& ╡º¬%ù2α└éªùò■█¡σáA½│┼;DAXü╓~TÿMI+z` År)íy▒«$║╩M@«╕Ñô÷█\
  67224. ƒqks┘«d"║└╧WôüVaªF÷oò∙XY *»&≥┤4÷+Jδ44╓╥╓σ╔α|ÄMïôû<áσEQ▒t┬∞<╨╦ZΘUoäï_│%`Ωçz╟G`Ç/ú┘òAzº½ⁿ░ºk┬! !
  67225.  
  67226. OperationAborted comment:
  67227. 'Generic exception that can be signalled when the user aborts an operation, for example in response to pressing the cancel button in a dialog.'!
  67228. !OperationAborted methodsFor!
  67229.  
  67230. messageText
  67231.     "Answer the <readableString> message text for the receiver."
  67232.  
  67233.     ^messageText ifNil: ['Operation aborted']! !
  67234.  
  67235. RaisedSignal comment:
  67236. ''!
  67237. !RaisedSignal methodsFor!
  67238.  
  67239. _descriptionFormat
  67240.     "Answer the Win32 format String to be used to format the description for the receiver -
  67241.     we delegate this back to the Signal instance we are representing."
  67242.  
  67243.     ^self signalType description!
  67244.  
  67245. defaultAction
  67246.     "The receiver is an unhandled notification, perform the default action
  67247.     (forward to the SessionManager for application customisation)."
  67248.  
  67249.     ^self signalType defaultAction: self!
  67250.  
  67251. isResumable
  67252.     "Answer whether the receiver represents a resumable error. This depends on the originating Signal."
  67253.  
  67254.     ^self signalType isResumable!
  67255.  
  67256. signalType
  67257.     "Private - Answer the instance of Signal for which the receiver is representing
  67258.     a raise event."
  67259.  
  67260.     ^signalType!
  67261.  
  67262. signalType: aSignal
  67263.     "Private - Set the instance of Signal for which the receiver is representing
  67264.     a raise event."
  67265.  
  67266.     signalType := aSignal! !
  67267.  
  67268. SmalltalkCompilerError comment:
  67269. 'SmalltalkCompilerError is an <Error> class to represent lexical, syntax, and semantic errors detected by the <SmalltalkParser>.
  67270.  
  67271. Instance Variables:
  67272.     range        <Interval>. Range of the source text to which the error applies (e.g. used to select offending text in browser)
  67273.     line        <integer>. Line number on which error detected.
  67274.     position        <integer>. Position in source text at which error detected.
  67275.  
  67276. N.B. The inherited''tag'' instance variable is used to hold the <integer> error code, but the inherited ''messageText'' instance variable is unused.
  67277.  
  67278. Class Variables:
  67279.     ErrorMessages    <sequencedReadableCollection>. Map from error codes to <readableString> error messages.
  67280.  
  67281. '!
  67282. !SmalltalkCompilerError class methodsFor!
  67283.  
  67284. errorCode: anInteger in: aString position: posInteger line: lineInteger range: anInterval 
  67285.     ^(super new)
  67286.         errorCode: anInteger
  67287.             in: aString
  67288.             position: posInteger
  67289.             line: lineInteger
  67290.             range: anInterval;
  67291.         yourself!
  67292.  
  67293. initialize
  67294.     "
  67295.     SmalltalkCompilerError initialize
  67296.     "
  67297.  
  67298.     | n |
  67299.     n := 0.
  67300.     "    Smalltalk at: #SmalltalkParseErrorCodes put: PoolConstantsDictionary new."
  67301.     "Lexical errors"
  67302.     SmalltalkParseErrorCodes
  67303.         at: 'LErrBadChar' put: (n := n + 1);
  67304.         at: 'LErrCommentNotClosed' put: (n := n + 1);
  67305.         at: 'LErrStringNotClosed' put: (n := n + 1);
  67306.         at: 'LErrExpectConst' put: (n := n + 1);
  67307.         at: 'LErrExpectExtendedLiteral' put: (n := n + 1);
  67308.         at: 'LErrExpectMetaVariable' put: (n := n + 1);
  67309.         at: 'LErrExpectChar' put: (n := n + 1);
  67310.         at: 'LErrInvalidQualifier' put: (n := n + 1);
  67311.         at: 'LErrQualifiedRefNotClosed' put: (n := n + 1).
  67312.     SmalltalkParseErrorCodes at: 'SyntaxErrorStart' put: 32.
  67313.     self assert: [n < 32].
  67314.     n := 31.
  67315.     "Parse errors"
  67316.     SmalltalkParseErrorCodes
  67317.         at: 'CErrBadMessagePattern' put: (n := n + 1);
  67318.         at: 'CErrTempListNotClosed' put: (n := n + 1);
  67319.         at: 'CErrInvalExprStart' put: (n := n + 1);
  67320.         at: 'CErrNonsenseAtMethodEnd' put: (n := n + 1);
  67321.         at: 'CErrNonsenseAtExprEnd' put: (n := n + 1);
  67322.         at: 'CErrBraceNotClosed' put: (n := n + 1);
  67323.         at: 'CErrParenNotClosed' put: (n := n + 1);
  67324.         at: 'CErrExpectMessage' put: (n := n + 1);
  67325.         at: 'CErrUnterminatedStatement' put: (n := n + 1);
  67326.         at: 'CErrExpectVariable' put: (n := n + 1);
  67327.         at: 'CErrBlockArgListNotClosed' put: (n := n + 1);
  67328.         at: 'CErrBlockNotClosed' put: (n := n + 1);
  67329.         at: 'CErrExpectPrimIdx' put: (n := n + 1);
  67330.         at: 'CErrBadPrimIdx' put: (n := n + 1);
  67331.         at: 'CErrExpectCloseTag' put: (n := n + 1);
  67332.         at: 'CErrBadPrimCallType' put: (n := n + 1);
  67333.         at: 'CErrUnsupportedCallConv' put: (n := n + 1);
  67334.         at: 'CErrExpectFnName' put: (n := n + 1);
  67335.         at: 'CErrExpectExtType' put: (n := n + 1);
  67336.         at: 'CErrArgTypeCannotBeVoid' put: (n := n + 1);
  67337.         at: 'CErrNotIndirectable' put: (n := n + 1);
  67338.         at: 'CErrUndefinedClass' put: (n := n + 1);
  67339.         at: 'CErrInvalidStructArg' put: (n := n + 1);
  67340.         at: 'CErrBadExtTypeQualifier' put: (n := n + 1);
  67341.         at: 'CErrInsufficientArgTypes' put: (n := n + 1);
  67342.         at: 'CErrTooManyArgTypes' put: (n := n + 1);
  67343.         at: 'CErrExpectVfn' put: (n := n + 1);
  67344.         at: 'CErrBadVfn' put: (n := n + 1);
  67345.         at: 'CErrBadTokenInArray' put: (n := n + 1);
  67346.         at: 'CErrArrayNotClosed' put: (n := n + 1);
  67347.         at: 'CErrBadValueInByteArray' put: (n := n + 1);
  67348.         at: 'CErrByteArrayNotClosed' put: (n := n + 1).
  67349.  
  67350.     "        at: 'CErrInvalidRetStruct' put: (n := n + 1);
  67351.         at: 'CErrExpectPlaceholder' put: (n := n + 1);
  67352.         at: 'CErrBadStructSize' put: (n := n + 1);
  67353.         at: 'CErrBlockArgMissing' put: (n := n + 1);
  67354.         at: 'CErrTooManyArgs' put: (n := n + 1);
  67355.         at: 'CErrTooManyTemps' put: (n := n + 1);
  67356.         at: 'CErrNotAClass' put: (n := n + 1);
  67357.         at: 'CErrBadPools' put: (n := n + 1);
  67358.         at: 'CErrNoLeftParen' put: (n := n + 1);
  67359.         at: 'CErrTooManyMessages' put: (n := n + 1);
  67360.         at: 'CErrNotImpNonLiteralBlock' put: (n := n + 1);
  67361.         at: 'CErrBadContext' put: (n := n + 1);
  67362.         at: 'CErrMethodTooLarge' put: (n := n + 1);
  67363.         at: 'CErrTooManyLiterals' put: (n := n + 1);
  67364.         at: 'CErrAssignConstant' put: (n := n + 1);
  67365.         at: 'CErrUndeclared' put: (n := n + 1);
  67366.         at: 'CErrInvalidArgname' put: (n := n + 1)"
  67367.     ErrorFormats := Array new: SmalltalkParseErrorCodes values asSortedCollection last
  67368.                 withAll: 'unknown error'.
  67369.     ErrorFormats
  67370.         at: LErrBadChar put: 'illegal character';
  67371.         at: LErrCommentNotClosed put: 'comment not closed';
  67372.         at: LErrStringNotClosed put: 'literal string not closed';
  67373.         at: LErrExpectConst put: 'constant expected';
  67374.         at: LErrExpectExtendedLiteral put: 'extended literal expected';
  67375.         at: LErrExpectMetaVariable put: 'meta variable expected';
  67376.         at: LErrExpectChar put: 'character expected';
  67377.         at: LErrInvalidQualifier put: 'invalid identifier in qualified reference';
  67378.         at: LErrQualifiedRefNotClosed put: 'qualified reference not closed'.
  67379.  
  67380.     "'Unmatched ' in string literal.'"
  67381.     ErrorFormats
  67382.         at: CErrBadMessagePattern put: 'expecting message pattern';
  67383.         at: CErrTempListNotClosed put: 'temporary list not closed';
  67384.         at: CErrInvalExprStart put: 'invalid expression start';
  67385.         at: CErrNonsenseAtMethodEnd put: 'nonsense at end of method';
  67386.         at: CErrNonsenseAtExprEnd put: 'nonsense at end of expression';
  67387.         at: CErrBraceNotClosed put: 'expecting ''}''';
  67388.         at: CErrParenNotClosed put: 'expecting '')''';
  67389.         at: CErrExpectMessage put: 'expecting message';
  67390.         at: CErrUnterminatedStatement put: 'no period at end of statement';
  67391.         at: CErrExpectVariable put: 'variable name expected';
  67392.         at: CErrBlockArgListNotClosed put: 'block argument list not closed';
  67393.         at: CErrBlockNotClosed put: 'expecting '']''';
  67394.         at: CErrExpectPrimIdx put: 'primitive index expected';
  67395.         at: CErrBadPrimIdx put: 'primitive index out of range';
  67396.         at: CErrExpectCloseTag put: 'expecting ''>''';
  67397.         at: CErrBadPrimCallType put: 'invalid primitive call type';
  67398.         at: CErrUnsupportedCallConv put: 'unsupported calling convention';
  67399.         at: CErrExpectFnName put: 'function name or ordinal expected';
  67400.         at: CErrExpectExtType put: 'external type expected';
  67401.         at: CErrArgTypeCannotBeVoid put: 'argument type can''t be void';
  67402.         at: CErrNotIndirectable put: 'too many indirections for type';
  67403.         at: CErrUndefinedClass put: 'undefined class';
  67404.         at: CErrInvalidStructArg put: 'invalid structure class type';
  67405.         at: CErrBadExtTypeQualifier put: 'invalid external type qualifier';
  67406.         at: CErrInsufficientArgTypes put: 'insufficient argument types';
  67407.         at: CErrTooManyArgTypes put: 'too many argument types';
  67408.         at: CErrBadVfn put: 'virtual function index out of range (1..1024)';
  67409.         at: CErrExpectVfn put: 'virtual function number expected';
  67410.         at: CErrBadTokenInArray put: 'illegal token in literal array';
  67411.         at: CErrBadValueInByteArray put: 'illegal value in byte array';
  67412.         at: CErrByteArrayNotClosed put: 'expecting '']''';
  67413.         at: CErrArrayNotClosed put: 'literal array not closed'.
  67414.  
  67415.     "    at: CErrInvalidRetStruct put: 'invalid return structure class'; 
  67416.     at: CErrExpectPlaceholder put: 'placeholder name expected'
  67417.     at: CErrBadStructSize put: 'structure size must be > 0'; 
  67418.     at: CErrBlockArgMissing put: 'block argument name missing'; 
  67419.     at: CErrTooManyArg put: 'too many arguments'; 
  67420.     at: CErrTooManyTemps put: 'too many temporaries'; 
  67421.     at: CErrNotAClass put: 'Not a class (%s)'; 
  67422.     at: CErrBadPools put: 'The workspace pools array is invalid'; 
  67423.     at: CErrNoLeftParen put: 'expecting ''('''; 
  67424.     at: CErrTooManyMessages put: 'too many messages'; 
  67425.     at: CErrNotImpNonLiteralBlock put: 'not yet implemented for non-literal blocks';
  67426.     at: CErrBadContext put: 'Unable to determine compilation context for ''%s''' 
  67427.     at: CErrMethodTooLarge put: 'method too large'; 
  67428.     at: CErrTooManyLiterals put: 'too many literals'; 
  67429.     at: CErrAssignConstant put: 'assignment to constant ''%s'''; 
  67430.     at: CErrUndeclared put: 'undeclared ''%s'''; 
  67431.     at: CErrInvalidArgname put: 'invalid argument name'; 
  67432.     at: CErrExpectConstant put: 'constant expected'; "
  67433.     SmalltalkParseErrorCodes 
  67434.         keysAndValuesDo: [:eachKey :each | self assert: [(ErrorFormats at: each) ~= 'unknown error']]! !
  67435.  
  67436. !SmalltalkCompilerError methodsFor!
  67437.  
  67438. _descriptionArguments
  67439.     "Answer a <sequencedReadableCollection> of the  arguments to be substitued 
  67440.     into the receiver's Win32 description format string when constructing the receivers 
  67441.     #description.
  67442.     By default the arguments to the message formatting are the message text and 
  67443.     the tag supplied by the exception signaller, but if additional fields are available,
  67444.     then this should be overridden.
  67445.  
  67446.     N.B. This is part of the implementation of the ANSI standard message 
  67447.     #description and therefore it requires an underscore prefix in order
  67448.     to avoid the fragile base class problem where subclasses may 
  67449.     inadvertantly override a superclass method."
  67450.  
  67451.     ^Array 
  67452.         with: self severityClass name
  67453.         with: self errorMessage!
  67454.  
  67455. _descriptionFormat
  67456.     "Answer the Win32 format String to be used to format the description for the receiver."
  67457.  
  67458.     ^'%1: %2'
  67459. !
  67460.  
  67461. errorCode
  67462.     ^self tag!
  67463.  
  67464. errorCode: anInteger in: aString position: posInteger line: lineInteger range: anInterval 
  67465.     self tag: anInteger.
  67466.     source := aString.
  67467.     position := posInteger.
  67468.     line := lineInteger.
  67469.     range := anInterval!
  67470.  
  67471. errorMessage
  67472.     "Answer the <readableString> message text describing this compilation error."
  67473.  
  67474.     ^ErrorFormats at: self errorCode ifAbsent: ['unrecognised error']!
  67475.  
  67476. line
  67477.     "Answer the line in the source text where the error was detected."
  67478.  
  67479.     ^line!
  67480.  
  67481. okToContinue
  67482.     "Throw up an OK/Cancel message box with the receiver's compilation error/warning
  67483.     message, answering true if the user pressed OK to contine the compilation."
  67484.  
  67485.     ((MessageBox new)
  67486.         caption: 'Compilation ' , self severityClass name;
  67487.         text: 'line ' , self line displayString , ': ' , self errorMessage;
  67488.         icon: self severityClass icon;
  67489.         ok;
  67490.         open).
  67491.     ^false!
  67492.  
  67493. position
  67494.     ^range start!
  67495.  
  67496. range
  67497.     "Answer an <Interval> specifying the range of character positions in the source text
  67498.     to which the error applies."
  67499.  
  67500.     ^range!
  67501.  
  67502. source
  67503.     ^source! !
  67504.  
  67505. STBError comment:
  67506. ''!
  67507. !STBError methodsFor!
  67508.  
  67509. _descriptionFormat
  67510.     "Answer the Win32 format String to be used to format the description for the receiver."
  67511.  
  67512.     ^'STBFiler - %1'! !
  67513.  
  67514. SubclassResponsibilityError comment:
  67515. ''!
  67516. !SubclassResponsibilityError methodsFor!
  67517.  
  67518. hresult
  67519.     "Answer the <HRESULT> error code associated with the receiver.
  67520.     Overridden by subclasses to answer more specified HRESULT codes."
  67521.  
  67522.     ^HRESULT notImplemented!
  67523.  
  67524. initialize
  67525.     "Private - Initialize the receiver's instance variables"
  67526.  
  67527.     messageText := 'Not implemented'! !
  67528.  
  67529. TestFailure comment:
  67530. 'Signaled in case of a failed test (failure). The test framework distinguishes between failures and errors. A failure is anticipated and checked for with assertions. Errors are unanticipated problems like a division by 0 or an index out of bounds'!
  67531. TrustedDataError comment:
  67532. 'A TrustedDataError is signalled if an instance of DolphinSureTrustedData cannot correctly decode its contents.  This is probably an indication that the trusted data has been tampered with in transit.'!
  67533. !TrustedDataError methodsFor!
  67534.  
  67535. ▐@"    6*¡ƒ& ╡º¬%ù2α└éªùò■█¡σáA½│┼;DAXü╓~TÿMI+z` År)íy▒«$║╩M@«╕Ñô÷█\
  67536. ƒqks┘«d"║└╧WôüVaªF÷oò∙XY *»&≥┤4÷+Jδ)(ôà┬σî«|£MÅöÇo¼²R╢oJç∞<┌┌⌠N"╔╬µ>uⁿ├8╤Ki╬:╡£çE`▓α╕╩ΦΦ≡aH╕á╗B`OAc ╬    ∞"d_Dë▀QéáJ->FI╘┴;èWôΓ╘╝╝vφ«ëâ▌S▀! !
  67537.  
  67538. FloatingPointException comment:
  67539. ''!
  67540. !FloatingPointException methodsFor!
  67541.  
  67542. _descriptionArguments
  67543.     "Answer the arguments to be subsituted into the receiver's description 
  67544.     format string."
  67545.  
  67546.     ^super _descriptionArguments copyWith: self _ieeeRecord causeName!
  67547.  
  67548. _descriptionFormat
  67549.     "Answer the Win32 format String to be used to format the description for the receiver."
  67550.  
  67551.     ^'Floating point error: %3'!
  67552.  
  67553. _ieeeRecord
  67554.     "Private - Answer the IEEE exception record associated with the receiver."
  67555.  
  67556.     ^self tag!
  67557.  
  67558. isOverflow
  67559.     "Answer whether receiver represents a floating point overflow error."
  67560.  
  67561.     ^self tag isOverflow
  67562. !
  67563.  
  67564. isUnderflow
  67565.     "Answer whether receiver represents a floating point underflow error."
  67566.  
  67567.     ^self tag isUnderflow
  67568. ! !
  67569.  
  67570. ZeroDivide comment:
  67571. 'ZeroDivide is the class of <Error> for representing attempts at integer division by zero.
  67572. Floating point division by zero exceptions are raised as instances of <FloatingPointException>.
  67573.  
  67574. For an example of ZeroDivide in action, evaluate the following:
  67575.     1/0'!
  67576. !ZeroDivide class methodsFor!
  67577.  
  67578. dividend: argument
  67579.     "Signal the occurrence of an integer division by zero."
  67580.  
  67581.     ^self signalWith: argument! !
  67582.  
  67583. !ZeroDivide methodsFor!
  67584.  
  67585. _descriptionFormat
  67586.     "Answer the description format string for the receiver."
  67587.  
  67588.     ^'Division by zero of %2'!
  67589.  
  67590. dividend
  67591.     "Answer the <number> that was divided by zero."
  67592.  
  67593.     ^self tag!
  67594.  
  67595. isResumable
  67596.     "Answer whether the receiver represents a resumable error. 
  67597.     Division by zero is not considered fatal, so allow resumption."
  67598.  
  67599.     ^true! !
  67600.  
  67601. Win32Error comment:
  67602. ''!
  67603. !Win32Error class methodsFor!
  67604.  
  67605. signal: messageText with: anInteger
  67606.     "Raise a new instance of the receiver, with the error message, msg, initiating a search for an 
  67607.     ExceptionHandler prepared to handle instances of the receiver. This method will not return to its 
  67608.     sender, unless the new instance is resumable, and the handler which catches it directs that it 
  67609.     should be resumed."
  67610.  
  67611.     self signalHRESULT: (HRESULT severity: SEVERITY_ERROR facility: FACILITY_WIN32 code: anInteger)! !
  67612.  
  67613. !Win32Error methodsFor!
  67614.  
  67615. _descriptionArguments
  67616.     "Answer the arguments to be substituted into the receiver's Win32 description format String."
  67617.  
  67618.     ^Array 
  67619.         with: self statusCode 
  67620.         with: self messageText 
  67621.         with: self osErrorMessage
  67622. !
  67623.  
  67624. _descriptionFormat
  67625.     "Answer the Win32 format String to be used to format the description for the receiver."
  67626.  
  67627.     ^'%2 (16r%1!!X!!: %3)'!
  67628.  
  67629. initialize
  67630.     "Private - Initialize the receiver's instance variables.
  67631.     Set the details to be the last error code reported
  67632.     by a system library (i.e. that retried by KernelLibrary>>getLastError)."
  67633.  
  67634.     self tag: (HRESULT status: KernelLibrary default getLastError facility: FACILITY_WIN32)! !
  67635.  
  67636. FileException comment:
  67637. ''!
  67638. !FileException class methodsFor!
  67639.  
  67640. on: aFile 
  67641.     "Answer an instance of the receiver detailing an operating system error
  67642.     on the given file."
  67643.  
  67644.     ^self on: aFile resumable: false!
  67645.  
  67646. on: aFile resumable: aBoolean 
  67647.     ^(self new)
  67648.         setFile: aFile resumable: aBoolean;
  67649.         yourself!
  67650.  
  67651. signalOn: aFile 
  67652.     "Signal an instance of the receiver detailing an operating system error
  67653.     on the given file."
  67654.  
  67655.     ^self signalOn: aFile resumable: false!
  67656.  
  67657. signalOn: aFile resumable: aBoolean 
  67658.     ^(self on: aFile resumable: aBoolean) signal! !
  67659.  
  67660. !FileException methodsFor!
  67661.  
  67662. _descriptionArguments
  67663.     "Answer the arguments to be substitued into the receiver's Win32 description format String."
  67664.  
  67665.     ^super _descriptionArguments copyWith: file name!
  67666.  
  67667. _descriptionFormat
  67668.     "Answer the Win32 format String to be used to format the description for the receiver."
  67669.  
  67670.     ^'''%4'' - %3'!
  67671.  
  67672. file
  67673.     "Answer the receiver's file instance var."
  67674.  
  67675.     ^file
  67676. !
  67677.  
  67678. isResumable
  67679.     "Answer whether the receiver represents a resumable error."
  67680.  
  67681.     ^resumable!
  67682.  
  67683. setFile: aFile resumable: aBoolean 
  67684.     file := aFile.
  67685.     resumable := aBoolean! !
  67686.  
  67687. OutOfMemoryError comment:
  67688. ''!
  67689. !OutOfMemoryError class methodsFor!
  67690.  
  67691. signal: messageText with: anObject
  67692.  
  67693.     ^self shouldNotImplement! !
  67694.  
  67695. !OutOfMemoryError methodsFor!
  67696.  
  67697. initialize
  67698.     "Private - Initialize the receiver's instance variables."
  67699.  
  67700.     self tag: (HRESULT fromInteger: E_OUTOFMEMORY)! !
  67701.  
  67702. RPCError comment:
  67703. 'Exception class for errors associated with the RPCLibrary'!
  67704. Win32Fault comment:
  67705. ''!
  67706. !Win32Fault class methodsFor!
  67707.  
  67708. initialize
  67709.     "Private - Initialize the receiver's class variables.
  67710.         self initialize
  67711.     "
  67712.  
  67713.     ExceptionNames := LookupTable new.
  67714.     ExceptionNames 
  67715.         at: 16rC0000005 put: (HRESULT fromInteger: ERROR_NOACCESS) displayString;
  67716.         at: 16r80000002 put: (ExceptionNames at: 16rC0000005);
  67717.         at: 16rC0000017 put: (HRESULT fromInteger: 8) displayString;
  67718.         at: 16rC000008C put: 'Array subscript out of bounds';
  67719.         at: 16rC0000092 put: 'Floating point stack underflow/overflow';
  67720.         at: 16rC0000095 put: (HRESULT fromInteger: 534) displayString;
  67721.         at: 16rC0000096 put: 'Priviledged instruction';
  67722.         at: 16rC0000006 put: (HRESULT fromInteger: 999) displayString;
  67723.         at: 16rC000001D put: 'Illegal instruction';
  67724.         at: 16rC0000026 put: 'Invalid disposition';
  67725.         at: 16rC0000008 put: (HRESULT fromInteger: 6) displayString;
  67726.         shrink!
  67727.  
  67728. signal: messageText with: anEXCEPTION_RECORD
  67729.     "Raise a new instance of the receiver, representing an invalid attempt to access
  67730.     the memory at the location, anAddress."
  67731.  
  67732.     ^self new 
  67733.         exceptionRecord: anEXCEPTION_RECORD;
  67734.         signal! !
  67735.  
  67736. !Win32Fault methodsFor!
  67737.  
  67738. _descriptionArguments
  67739.     "Answer the arguments to be substitued into the receiver's Win32 description format String."
  67740.  
  67741.     | info address wasWriting |
  67742.     info := exceptionRecord ExceptionInformation.
  67743.     ^super _descriptionArguments, 
  67744.         (Array
  67745.         "4" with: self exceptionName
  67746.         "5"    with: exceptionRecord ExceptionAddress
  67747.         "6"    with: exceptionRecord moduleFileName)!
  67748.  
  67749. _descriptionFormat
  67750.     "Answer the Win32 format String to be used to format the description for the receiver."
  67751.  
  67752.     ^'%4 at IP 0x%5!!X!! (%6)'!
  67753.  
  67754. exceptionCode
  67755.     "Answer the <integer> Win32 exception code associated with the receiver."
  67756.  
  67757.     ^exceptionRecord ExceptionCode!
  67758.  
  67759. exceptionName
  67760.     "Answer the <readableString> name of the Win32 exception code associated with the receiver."
  67761.  
  67762.     ^ExceptionNames
  67763.         at: self exceptionCode ifAbsent: [self exceptionCode hex]!
  67764.  
  67765. exceptionRecord: anEXCEPTION_RECORD
  67766.     "Private - Set the EXCEPTION_RECORD from the Win32 exception."
  67767.  
  67768.     exceptionRecord := anEXCEPTION_RECORD.
  67769.     self tag: (self tagFromExceptionCode: anEXCEPTION_RECORD ExceptionCode)
  67770. !
  67771.  
  67772. initialize
  67773.     "Override the superclass implementation as we don't need to do any initialization."
  67774. !
  67775.  
  67776. tagFromExceptionCode: anInteger
  67777.     "Private - Answer the HRESULT tag for the receiver from the Win32 exception
  67778.     code, anInteger."
  67779.  
  67780.     ^HRESULT ntStatusCode: anInteger! !
  67781.  
  67782. GPFault comment:
  67783. ''!
  67784. !GPFault methodsFor!
  67785.  
  67786. _descriptionArguments
  67787.     "Answer the arguments to be substitued into the receiver's Win32 description format String."
  67788.  
  67789.     | info address wasWriting |
  67790.     info := exceptionRecord ExceptionInformation.
  67791.     ^super _descriptionArguments, 
  67792.         (Array
  67793.         "7"    with: ((info at: 1) == 0 ifTrue: ['Reading']  ifFalse: ['Writing'])    
  67794.         "8"    with: (info at: 2) asExternalAddress)                                        
  67795. !
  67796.  
  67797. _descriptionFormat
  67798.     "Answer the Win32 format String to be used to format the description for the receiver."
  67799.  
  67800.     ^'%4 %7 0x%8!!X!!, IP 0x%5!!X!! (%6)'! !
  67801.  
  67802. ResumableTestFailure comment:
  67803. 'A ResumableTestFailure triggers a TestFailure, but lets execution of the TestCase continue. This is useful when iterating through collections, and #assert: ing on each element. In combination with methods like TestCase>>#assert:description:, this lets you run through a whole collection and note which tests pass.
  67804.  
  67805. Here''s an example:
  67806.  
  67807.     aCollection do: [ :each |
  67808.         self assert: each isFoo description: each printString resumable: true]
  67809.  
  67810. For each element where #isFoo returns <false>, the element will be printed to the Transcript. '!
  67811. !ResumableTestFailure methodsFor!
  67812.  
  67813. isResumable
  67814.     "Of course a ResumableTestFailure is resumable ;-)"
  67815.  
  67816.     ^true
  67817. !
  67818.  
  67819. sunitExitWith: aValue
  67820.     self resume: aValue
  67821. ! !
  67822.  
  67823. CompilerNotification comment:
  67824. ''!
  67825. !CompilerNotification class methodsFor!
  67826.  
  67827. beep
  67828.     "Sound a beep describing the severity of the notification."
  67829.  
  67830.     self severityClass beep!
  67831.  
  67832. icon
  67833.     "Answer the default icon for the receiver and its instances."
  67834.  
  67835.     ^self severityClass icon!
  67836.  
  67837. text: textString line: lineNumber range: anInterval selector: selector in: codeString for: aClass
  67838.     "Answer a new instance of the receiver."
  67839.  
  67840.     ^self new
  67841.         text: textString line: lineNumber range: anInterval selector: selector in: codeString for: aClass! !
  67842.  
  67843. !CompilerNotification methodsFor!
  67844.  
  67845. _descriptionArguments
  67846.     "Answer the arguments to be substitued into the receiver's Win32 description format String."
  67847.  
  67848.     ^Array 
  67849.         with: self severityClass name
  67850.         with: self methodClass displayString
  67851.         with: self selector
  67852.         with: self line
  67853.         with: self errorMessage.!
  67854.  
  67855. _descriptionFormat
  67856.     "Answer the Win32 format String to be used to format the description for the receiver."
  67857.  
  67858.     ^'%1: %2>>%3 at line %4!!d!!: %5'!
  67859.  
  67860. code
  67861.     "Answer the <readableString> of code which caused this notification to be
  67862.     raised while it was being compiled."
  67863.  
  67864.     ^code!
  67865.  
  67866. displayOn: aStream
  67867.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  67868.     would want to see it."
  67869.  
  67870.     aStream
  67871.         nextPutAll: self severityClass name;
  67872.         nextPutAll: ': ';
  67873.         nextPutAll: self errorMessage
  67874. !
  67875.  
  67876. errorMessage
  67877.     "Answer a String describing the nature of the notification."
  67878.  
  67879.     ^text!
  67880.  
  67881. line
  67882.     "Answer the line in the text from where the notification originated."
  67883.  
  67884.     ^line!
  67885.  
  67886. methodClass
  67887.     "Answer the Class context which the code was being compiled in."
  67888.  
  67889.     ^forClass!
  67890.  
  67891. okToContinue
  67892.     "Throw up an OK/Cancel message box with the receiver's compilation error/warning
  67893.     message, answering true if the user pressed OK to contine the compilation."
  67894.  
  67895.     | mb severity |
  67896.     severity := self severityClass.
  67897.     mb := (MessageBox new)
  67898.                 caption: 'Compilation ' , severity name;
  67899.                 text: 'line ' , self line displayString , ': ' , self errorMessage;
  67900.                 icon: severity icon;
  67901.                 yourself.
  67902.     ^severity == Error 
  67903.         ifTrue: 
  67904.             [mb
  67905.                 ok;
  67906.                 open.
  67907.             false]
  67908.         ifFalse: [(mb
  67909.                 okCancel;
  67910.                 open) == #ok]!
  67911.  
  67912. range
  67913.     "Answer the Interval of character positions in the code
  67914.     which raised the notification."
  67915.  
  67916.     ^range!
  67917.  
  67918. selector
  67919.     "Answer the selector of the code which raised the notification."
  67920.  
  67921.     ^selector!
  67922.  
  67923. severity
  67924.     #deprecated.
  67925.     ^self severityClass name!
  67926.  
  67927. text
  67928.     #deprecated.
  67929.     ^self errorMessage!
  67930.  
  67931. text: textString line: lineNumber range: anInterval selector: aSymbol in: codeString for: aClass
  67932.     "Private - Initialize the receiver's instance variables. Answer the receiver."
  67933.  
  67934.     text := textString.
  67935.     line := lineNumber.
  67936.     range := anInterval.
  67937.     selector := aSymbol.
  67938.     code := codeString.
  67939.     forClass := aClass.
  67940.  
  67941.     ^self! !
  67942.  
  67943. HRESULTNotification comment:
  67944. ''!
  67945. !HRESULTNotification methodsFor!
  67946.  
  67947. _descriptionArguments
  67948.     "Answer the arguments to be substitued into the receiver's Win32 description format String."
  67949.  
  67950.     | hresult |
  67951.     hresult := self hresult.
  67952.     ^Array with: hresult with: hresult displayString with: hresult facility!
  67953.  
  67954. _descriptionFormat
  67955.     "Answer the Win32 format String to be used to format the description for the receiver."
  67956.  
  67957.     ^'HRESULT Success: %2 (%3)'!
  67958.  
  67959. hresult
  67960.     "Answer the HRESULT error code associated with the receiver."
  67961.  
  67962.     ^self tag! !
  67963.  
  67964. MethodCompileFailed comment:
  67965. 'A MethodCompileFailed notification is signalled when a method compilation fails. Handlers can trap this if they wish to replace the original failed compilation with a stub method. This is useful so that the failed method source can be seen in the browsers or to retain category information. To install a stub method the handler should call #resumeWithStubMethod.'!
  67966. !MethodCompileFailed class methodsFor!
  67967.  
  67968. new
  67969.     "Private - Use #with:"
  67970.  
  67971.     self shouldNotImplement!
  67972.  
  67973. with: aCompilerErrorNotification
  67974.     "Answer an instance of the receiver that indicates that a method compilation failed
  67975.     due to aCompilerErrorNotification"
  67976.  
  67977.     ^super new compilerErrorNotification: aCompilerErrorNotification
  67978. ! !
  67979.  
  67980. !MethodCompileFailed methodsFor!
  67981.  
  67982. compilerErrorNotification: aCompilerErrorNotification
  67983.     "Private - Set the value of the receiver's instance variable compilerErrorNotification to 
  67984.     aCompilerErrorNotification."
  67985.  
  67986.     compilerErrorNotification := aCompilerErrorNotification.!
  67987.  
  67988. defaultAction
  67989.     "The receiver is an unhandled notification, perform the default action
  67990.     which is nothing but to answer a nil method"
  67991.  
  67992.     ^nil!
  67993.  
  67994. resumeWithStubMethod
  67995.     "Create a stub method which causes an error if evaluated but has the source of the
  67996.     proposed method that did not compile. Answer this as the result of resuming the
  67997.     notification"
  67998.  
  67999.     | selector methodClass definitionStream result keywords argc |
  68000.     selector := compilerErrorNotification selector asSymbol.
  68001.     selector isEmpty ifTrue: [^nil].
  68002.     methodClass := compilerErrorNotification methodClass.
  68003.     definitionStream := String writeStream: 128.
  68004.  
  68005.     "First create a method definition with the correct parameters"
  68006.     keywords := selector keywords.
  68007.     (argc := selector asSymbol argumentCount) == 0 
  68008.         ifTrue: [definitionStream nextPutAll: selector]
  68009.         ifFalse: 
  68010.             [(argc == 1 and: [selector isInfix]) 
  68011.                 ifTrue: 
  68012.                     ["Assume a binary selector"
  68013.  
  68014.                     definitionStream
  68015.                         nextPutAll: selector;
  68016.                         nextPutAll: ' operand']
  68017.                 ifFalse: 
  68018.                     [| argNameStem argNames argName |
  68019.                     argNameStem := 'arg'.
  68020.                     argNames := Set withAll: methodClass allInstVarNames.
  68021.                     keywords do: 
  68022.                             [:keyword | 
  68023.                             | x |
  68024.                             definitionStream
  68025.                                 nextPutAll: keyword;
  68026.                                 space.
  68027.                             x := 1.
  68028.                             
  68029.                             [argName := argNameStem , (x := x + 1) displayString.
  68030.                             argNames includes: argName] 
  68031.                                     whileTrue.
  68032.                             argNames add: argName.
  68033.                             definitionStream
  68034.                                 nextPutAll: argName;
  68035.                                 space]]].
  68036.  
  68037.     "Now compile the source into a CompileFailedMethod"
  68038.     definitionStream
  68039.         cr;
  68040.         nextPutAll: ' self error: ''This method did not compile'''.
  68041.     result := methodClass compilerClass 
  68042.                 compile: definitionStream contents
  68043.                 in: methodClass
  68044.                 flags: 0.
  68045.     result method becomeA: CompileFailedMethod.
  68046.  
  68047.     "Resume with this stub"
  68048.     self resume: result! !
  68049.  
  68050. RaisedNotificationSignal comment:
  68051. 'RaisedNotificationSignal is the class of Error whose instances are used to represent NotificationSignal instances when raised. That is it enables instance based notifications (NotificationSignals) to be raised within Dolphin''s class based exception framework.
  68052.  
  68053. Instances Variables:
  68054.     signalType        <Signal>. The signal instance which originated this exception.'!
  68055. !RaisedNotificationSignal methodsFor!
  68056.  
  68057. _descriptionFormat
  68058.     "Answer the Win32 format String to be used to format the description for the receiver -
  68059.     we delegate this back to the Signal instance we are representing."
  68060.  
  68061.     ^self signalType description!
  68062.  
  68063. defaultAction
  68064.     "The receiver is an unhandled notification, perform the default action
  68065.     (forward to the SessionManager for application customisation)."
  68066.  
  68067.     ^self signalType defaultAction: self!
  68068.  
  68069. isResumable
  68070.     "Answer whether the receiver represents a resumable error. This depends on the originating Signal."
  68071.  
  68072.     ^self signalType isResumable!
  68073.  
  68074. signalType
  68075.     "Private - Answer the instance of Signal for which the receiver is representing
  68076.     a raise event."
  68077.  
  68078.     ^signalType!
  68079.  
  68080. signalType: aSignal
  68081.     "Private - Set the instance of Signal for which the receiver is representing
  68082.     a raise event."
  68083.  
  68084.     signalType := aSignal! !
  68085.  
  68086. Warning comment:
  68087. 'Warning is the class of <Notification>s which represent exceptional conditions that are not considered errors, but which should still be reported to the user with the option to continue or abort the computation.'!
  68088. !Warning class methodsFor!
  68089.  
  68090. beep
  68091.     "Sound an appropriate beep to draw the users attention."
  68092.  
  68093.     Sound warningBeep!
  68094.  
  68095. icon
  68096.     "Answer the default icon for the receiver and its instances."
  68097.  
  68098.     ^Icon warning!
  68099.  
  68100. severityClass
  68101.     "Answer an exception class describing the severity of the notification."
  68102.  
  68103.     ^Warning! !
  68104.  
  68105. !Warning methodsFor!
  68106.  
  68107. defaultAction
  68108.     "Perform the default action for the receiver if it is not handled
  68109.     (forward to the SessionManager for application specific handling).
  68110.     N.B. The ANSI standard states that the user should be given the option to
  68111.     either continue or abort the computation, and indeed that is what the
  68112.     standard SessionManager implementation does.    "
  68113.  
  68114.     "Will not return unless execution is to be resumed"
  68115.     ^SessionManager current onUnhandledWarning: self! !
  68116.  
  68117. CompilerErrorNotification comment:
  68118. ''!
  68119. !CompilerErrorNotification class methodsFor!
  68120.  
  68121. beep
  68122.     "Sound a beep describing the severity of the notification."
  68123.  
  68124.     Sound woofFor: #onCompileFailed ifAbsent: [ super beep ].
  68125. !
  68126.  
  68127. severityClass
  68128.     "Answer an exception class describing the severity of the notification."
  68129.  
  68130.     ^Error! !
  68131.  
  68132. CompilerWarningNotification comment:
  68133. ''!
  68134. !CompilerWarningNotification class methodsFor!
  68135.  
  68136. severityClass
  68137.     "Answer an exception class describing the severity of the notification."
  68138.  
  68139.     ^Warning! !
  68140.  
  68141. ExceptionHandler comment:
  68142. ''!
  68143. !ExceptionHandler methodsFor!
  68144.  
  68145. actionFor: exception
  68146.     "Private - Answer a <monadicBlock> handler for the <exceptionDescription> 
  68147.     argument, exception or nil if the receiver has no appropriate handler."
  68148.  
  68149.     ^(selector handles: exception) ifTrue: [handler]!
  68150.  
  68151. on: exceptionSelector do: monadicBlock
  68152.     "Private - Record the <exceptionSelector> and <monadicBlock> to be
  68153.     used as the receivers exception selector and handler block respectively."
  68154.  
  68155.     selector := exceptionSelector.
  68156.     handler := monadicBlock
  68157. ! !
  68158.  
  68159. ExceptionHandlerSet comment:
  68160. ''!
  68161. !ExceptionHandlerSet class methodsFor!
  68162.  
  68163. new
  68164.     "Answer a new, initialized, instance of the receiver."
  68165.  
  68166.     ^super new initialize! !
  68167.  
  68168. !ExceptionHandlerSet methodsFor!
  68169.  
  68170. actionFor: exception
  68171.     "Private - Answer a <monadicBlock> handler for the <exceptionDescription> 
  68172.     argument, exception or nil if the receiver has no appropriate handler."
  68173.  
  68174.     ^(handlers detect: [:h | h key handles: exception] ifNone: [^nil]) value!
  68175.  
  68176. initialize
  68177.     "Private - Initialize the instance variables of the receiver."
  68178.  
  68179.     handlers := OrderedCollection new!
  68180.  
  68181. on: exceptionSelector do: monadicBlock
  68182.     "Private - Record the <exceptionSelector> and <monadicBlock> to be
  68183.     used as the receivers exception selector and handler block respectively."
  68184.  
  68185.     handlers addLast: (exceptionSelector -> monadicBlock)
  68186. ! !
  68187.  
  68188. BlockCallback comment:
  68189. ''!
  68190. !BlockCallback methodsFor!
  68191.  
  68192. block: aBlockClosure
  68193.     "Private - Record the block to be evaluated when the callback represented
  68194.     by the receiver is entered.
  68195.     N.B. The argument really must be a BlockClosure - other valuables are not
  68196.     acceptable."
  68197.  
  68198.     block := aBlockClosure!
  68199.  
  68200. free
  68201.     "Explicitly free any resources consumed by the receiver as it is no longer required.
  68202.     Implementation Note: If explicitly sent, we may help the GC by nilling out the block,
  68203.     as blocks can sometimes result in large trees of objects being referenced."
  68204.  
  68205.     super free.
  68206.     block := nil!
  68207.  
  68208. printOn: aStream
  68209.     "Append, to aStream, a String whose characters are a description of the receiver."
  68210.  
  68211.     aStream
  68212.         basicPrint: self;
  68213.         nextPut: $(;
  68214.         print: block;
  68215.         space;
  68216.         print: self argumentTypes;
  68217.         nextPut: $)!
  68218.  
  68219. valueWithArgumentsAt: anAddress
  68220.     "Private - Evaluate the receiver with arguments instantiated from the raw data at anAddress.
  68221.     For performance and consistency (with outbound external calls) reasons, we use a VM supplied
  68222.     primitive to instantiate and push the arguments and perform the message, but there is no reason
  68223.     that this cannot be done in Smalltalk if different argument conversions are required. The standard
  68224.     conversions are the same as those performed for return types by the external call primitive (see
  68225.     the ExternalLibrary class)."
  68226.  
  68227.     ^block valueWithArgumentsAt: anAddress descriptor: descriptor! !
  68228.  
  68229. MessageCallback comment:
  68230. ''!
  68231. !MessageCallback methodsFor!
  68232.  
  68233. closure
  68234.     "Answer the user supplied 'closure' object supplied when the receiver was created.
  68235.     This can be anything appropriate to the callbacks purposes."
  68236.  
  68237.     ^closure!
  68238.  
  68239. closure: anObject
  68240.     "Set the user supplied 'closure' object. 
  68241.     This can be anything appropriate to the callbacks purposes.
  68242.     Answer the receiver."
  68243.  
  68244.     closure := anObject!
  68245.  
  68246. printOn: aStream
  68247.     "Append, to aStream, a String whose characters are a description of the receiver."
  68248.  
  68249.     aStream
  68250.         basicPrint: self;
  68251.         nextPut: $(;
  68252.         print: receiver;
  68253.         space;
  68254.         print: selector;
  68255.         space;
  68256.         print: self argumentTypes;
  68257.         nextPut: $)!
  68258.  
  68259. receiver: anObject
  68260.     "Private - Record the receiver of the callback."
  68261.  
  68262.     receiver := anObject!
  68263.  
  68264. selector: aSymbol
  68265.     "Private - Set the selector to send when the receiver is evaluated."
  68266.  
  68267.     selector := aSymbol!
  68268.  
  68269. valueWithArgumentsAt: anAddress
  68270.     "Private - Evaluate the receiver with arguments instantiated from the raw data at anAddress."
  68271.  
  68272.     ^receiver perform: selector withArgumentsAt: anAddress descriptor: descriptor! !
  68273.  
  68274. AdvApiLibrary comment:
  68275. 'AdvApiLibrary is the <ExternalLibrary> class to represent the Win32 system DLL, ADVAPI32.DLL.
  68276.  
  68277. This DLL contains functions mainly to do with accessing the registry, high-level access to which is available via Dolphin''s RegKey classes.
  68278. '!
  68279. !AdvApiLibrary class methodsFor!
  68280.  
  68281. fileName
  68282.     "Answer the host system file name for the library"
  68283.  
  68284.     ^'ADVAPI32'! !
  68285.  
  68286. !AdvApiLibrary methodsFor!
  68287.  
  68288. deregisterEventSource: anExternalHandle 
  68289.     <stdcall: bool DeregisterEventSource handle>
  68290.     ^self invalidCall!
  68291.  
  68292. getUserName: buffer nSize: pBufSize 
  68293.     "Retrieve the user name of the current thread. This is the name of the user currently 
  68294.     logged onto the system. 
  68295.         BOOL GetUserName(
  68296.               LPTSTR lpBuffer,    // address of name buffer 
  68297.             LPDWORD nSize         // address of size of name buffer 
  68298.         );"
  68299.  
  68300.     <stdcall: bool GetUserNameA lpstr DWORD*>
  68301.     ^self invalidCall!
  68302.  
  68303. regCloseKey: hKey
  68304.     "Release the handle of the specified registry key.
  68305.  
  68306.         LONG RegCloseKey( 
  68307.             HKEYhKey     // handle of key to close 
  68308.         );"
  68309.  
  68310.     <stdcall: sdword RegCloseKey handle>
  68311.     ^self invalidCall!
  68312.  
  68313. regConnectRegistry: lpMachineName hKey: hKey phkResult: phkResult
  68314.     "
  68315.         LONG RegConnectRegistry( 
  68316.             LPTSTRlpMachineName,    // address of name of remote computer 
  68317.             HKEYhKey,            // predefined registry handle 
  68318.             PHKEYphkResult         // address of buffer for remote registry handle);
  68319.     "
  68320.  
  68321.     <stdcall: sdword RegConnectRegistryA lpstr handle lpvoid>
  68322.     ^self invalidCall!
  68323.  
  68324. regCreateKeyEx: hKey lpSubKey: lpSubKey reserved: reserved lpClass: lpClass dwOptions: dwOptions samDesired: samDesired lpSecurityAttributes: lpSecurityAttributes phkResult: phkResult lpdwDisposition: lpdwDisposition 
  68325.     "Create or opens the specified registry key. Answers appropriate Win32 extended error code.
  68326.  
  68327.         LONG RegCreateKeyEx( 
  68328.             HKEY hKey,             // handle of an open key 
  68329.             LPCTSTR lpSubKey,         // address of subkey name 
  68330.             DWORD Reserved,         // reserved 
  68331.             LPTSTR lpClass,             // address of class string 
  68332.             DWORD dwOptions,        // special options flag 
  68333.             REGSAM samDesired,         // desired security access 
  68334.             LPSECURITY_ATTRIBUTES lpSecurityAttributes, // address of key security structure 
  68335.             PHKEY phkResult,         // address of buffer for opened handle 
  68336.             LPDWORD lpdwDisposition    // address of disposition value buffer 
  68337.         ); "
  68338.  
  68339.     <stdcall: sdword RegCreateKeyExA handle lpstr dword lpstr dword dword lpvoid lpvoid DWORD*>
  68340.     ^self invalidCall!
  68341.  
  68342. regDeleteKey: hKey lpSubKey: lpSubKey
  68343.     "Delete the specified sub-key of the key whose handle is hKey.
  68344.  
  68345.     Note that the exact behaviour depends on the host OS:
  68346.         Windows 95:    The RegDeleteKeyfunction deletes a subkey and all its descendants. 
  68347.         Windows NT:    The RegDeleteKeyfunction deletes the specified subkey. 
  68348.                 The subkey to be deleted must not have subkeys. 
  68349.  
  68350.         LONG RegDeleteKey( 
  68351.             HKEYhKey,         // handle of open key 
  68352.             LPCTSTRlpSubKey    // address of name of subkey to delete 
  68353.         );"
  68354.  
  68355.     <stdcall: sdword RegDeleteKeyA handle lpstr>
  68356.     ^self invalidCall!
  68357.  
  68358. regDeleteValue: hKey lpValueName: lpValueName
  68359.     "Delete the specified registry value of the key whose handle is hKey.
  68360.  
  68361.         LONG RegDeleteValue(
  68362.             HKEYhKey,            // handle of key 
  68363.             LPCTSTRlpValueName    // address of value name 
  68364.         );"
  68365.  
  68366.     <stdcall: sdword RegDeleteValueA handle lpstr>
  68367.     ^self invalidCall!
  68368.  
  68369. regEnumKeyEx: hKey dwIndex: dwIndex lpName: lpName lpcbName: lpcbName lpReserved: lpReserved lpClass: lpClass lpcbClass: lpcbClass lpftLastWriteTime: lpftLastWriteTime 
  68370.     "Get details for the sub-key of hKey with the specified index.
  68371.  
  68372.         LONG RegEnumKeyEx(
  68373.             HKEY hKey,             // handle of key to query 
  68374.             DWORD dwIndex,         // index of subkey to query 
  68375.             LPTSTR lpName,             // address of buffer for subkey name 
  68376.             LPDWORD lpcbName,         // address for size of subkey buffer 
  68377.             LPDWORD lpReserved,
  68378.             LPTSTR lpClass,            // address of buffer for class string 
  68379.             LPDWORD lpcbClass,         // address for size of class buffer 
  68380.             PFILETIME lpftLastWriteTime    // address for time key last written to 
  68381.         );"
  68382.  
  68383.     <stdcall: sdword RegEnumKeyExA handle sdword lpstr DWORD* DWORD* lpstr DWORD* FILETIME*>
  68384.     ^self invalidCall!
  68385.  
  68386. regEnumValue: hKey dwIndex: dwIndex lpValueName: lpValueName lpcbValueName: lpcbValueName lpReserved: lpReserved lpType: lpType lpData: lpData lpcbData: lpcbData 
  68387.     "
  68388.         LONG RegEnumValue( 
  68389.             HKEY hKey,             // handle of key to query 
  68390.             DWORD dwIndex,         // index of value to query 
  68391.             LPTSTR lpValueName,         // address of buffer for value string 
  68392.             LPDWORD lpcbValueName,    // address for size of value buffer 
  68393.             LPDWORD lpReserved,         // reserved 
  68394.             LPDWORD lpType,         // address of buffer for type code 
  68395.             LPBYTE lpData,             // address of buffer for value data 
  68396.             LPDWORD lpcbData         // address for size of data buffer 
  68397.         ); "
  68398.  
  68399.     <stdcall: sdword RegEnumValueA handle dword lpstr DWORD* DWORD* DWORD* lpvoid DWORD*>
  68400.     ^self invalidCall!
  68401.  
  68402. registerEventSource: stringUNCServerName lpSourceName: stringSourceName 
  68403.     "HANDLE RegisterEventSource(
  68404.         LPCTSTR lpUNCServerName,    // server name for source 
  68405.         LPCTSTR lpSourceName     // source name for registered handle  
  68406.     );"
  68407.  
  68408.     <stdcall: handle RegisterEventSourceA lpstr lpstr>
  68409.     ^self invalidCall!
  68410.  
  68411. regOpenKeyEx: hKey lpSubKey: lpSubKey ulOptions: ulOptions samDesired: samDesired phkResult: phkResult 
  68412.     "Opens the specified registry key. Answers appropriate Win32 extended error code.
  68413.         LONG RegOpenKeyEx(
  68414.               HKEY hKey,        // handle of open key 
  68415.             LPCTSTR lpSubKey,    // address of name of subkey to open 
  68416.             DWORD ulOptions,    // reserved 
  68417.             REGSAM samDesired,    // security access mask 
  68418.             PHKEY phkResult     // address of handle of open key 
  68419.         );"
  68420.  
  68421.     <stdcall: sdword RegOpenKeyExA handle lpstr dword dword lpvoid>
  68422.     ^self invalidCall!
  68423.  
  68424. regQueryInfoKey: hKey lpClass: lpClass lpcbClass: lpcbClass lpReserved: lpReserved lpcSubKeys: lpcSubKeys lpcbMaxSubKeyLen: lpcbMaxSubKeyLen lpcbMaxClassLen: lpcbMaxClassLen lpcValues: lpcValues lpcbMaxValueNameLen: lpcbMaxValueNameLen lpcbMaxValueLen: lpcbMaxValueLen lpcbSecurityDescriptor: lpcbSecurityDescriptor lpftLastWriteTime: lpftLastWriteTime 
  68425.     "Answer (a lot of) information about a specified registry key. 
  68426.  
  68427.         LONG RegQueryInfoKey ( 
  68428.             HKEY hKey,                     // handle of key to query 
  68429.             LPTSTR lpClass,                     // address of buffer for class string 
  68430.             LPDWORD lpcbClass,                 // address of size of class string buffer 
  68431.             LPDWORD lpReserved,                 // reserved 
  68432.             LPDWORD lpcSubKeys,             // address of buffer for number of subkeys 
  68433.             LPDWORD lpcbMaxSubKeyLen,    // address of buffer for longest subkey name length 
  68434.             LPDWORD lpcbMaxClassLen,            // address of buffer for longest class string length 
  68435.             LPDWORD lpcValues,                 // address of buffer for number of value entries 
  68436.             LPDWORD lpcbMaxValueNameLen,    // address of buffer for longest value name length 
  68437.             LPDWORD lpcbMaxValueLen,         // address of buffer for longest value data length 
  68438.             LPDWORD lpcbSecurityDescriptor,// address of buffer for security descriptor length 
  68439.             PFILETIME lpftLastWriteTime            // address of buffer for last write time 
  68440.      ); "
  68441.  
  68442.     <stdcall: sdword RegQueryInfoKeyA handle lpstr DWORD* DWORD* DWORD* DWORD* DWORD* DWORD* DWORD* DWORD* DWORD* FILETIME*>
  68443.     ^self invalidCall!
  68444.  
  68445. regQueryValueEx: kKey lpValueName: lpValueName lpReserved: lpReserved lpType: lpType lpData: lpData lpcbData: lpcbData 
  68446.     "Retrieves the type and data for a specified value name associated with an open registry key.
  68447.         LONG RegQueryValueEx(
  68448.             HKEY hKey,            // handle of key to query 
  68449.             LPTSTR lpValueName,        // address of name of value to query 
  68450.             LPDWORD lpReserved,        // reserved 
  68451.             LPDWORD lpType,        // address of buffer for value type 
  68452.             LPBYTE lpData,            // address of data buffer 
  68453.             LPDWORD lpcbData         // address of data buffer size 
  68454.         );"
  68455.  
  68456.     <stdcall: sdword RegQueryValueExA handle lpstr DWORD* DWORD* lpvoid DWORD*>
  68457.     ^self invalidCall!
  68458.  
  68459. regSetValueEx: kKey lpValueName: lpValueName reserved: dwReserved dwType: dwType lpData: lpData cbData: cbData 
  68460.     "Store the type and data for a specified value name associated with an open registry key.
  68461.         LONG RegSetValueEx( 
  68462.             HKEY hKey,        // handle of key
  68463.             LPTSTR lpValueName,    // address of name of value
  68464.             DWORD lpReserved,    // reserved 
  68465.             DWORD lpType,        // value type 
  68466.             CONST BYTE *lpData,     // address of data buffer 
  68467.             DWORD lpcbData     // data buffer size 
  68468.         );"
  68469.  
  68470.     <stdcall: sdword RegSetValueExA handle lpstr dword dword lpvoid dword>
  68471.     ^self invalidCall!
  68472.  
  68473. reportEvent: hEventLog wType: wType wCategory: wCategory dwEventId: dwEventId lpUserSid: lpUserSid wNumStrings: wNumStrings dwDataSize: dwDataSize lpStrings: lpStrings lpRawData: lpRawData 
  68474.     "
  68475.         BOOL ReportEvent(
  68476.             HANDLE hEventLog,    // handle returned by RegisterEventSource 
  68477.             WORD wType,        // event type to log 
  68478.             WORD wCategory,    // event category 
  68479.             DWORD dwEventID,    // event identifier 
  68480.             PSID lpUserSid,        // user security identifier (optional) 
  68481.             WORD wNumStrings,    // number of strings to merge with message  
  68482.             DWORD dwDataSize,    // size of binary data, in bytes
  68483.             LPCTSTR *lpStrings,    // array of strings to merge with message 
  68484.             LPVOID lpRawData     // address of binary data 
  68485.         );"
  68486.  
  68487.     <stdcall: bool ReportEventA handle word word dword lpvoid word dword lpvoid lpvoid>
  68488.     ^self invalidCall! !
  68489.  
  68490. ComDlgLibrary comment:
  68491. 'ComDlgLibrary is the <ExternalLibrary> class to represent the Win32 system DLL, COMDLG32.DLL.
  68492.  
  68493. This DLL implements Windows'' standard "common" dialogs, such as the File Open/Save, Find, Find/Replace, Font, Color and Print dialogs. See subclasses of <CommonDialog>, which wrap these behind a Smalltalk API in Dolphin.'!
  68494. !ComDlgLibrary class methodsFor!
  68495.  
  68496. fileName
  68497.     "Answer the host system file name for the library"
  68498.  
  68499.     ^'COMDLG32'! !
  68500.  
  68501. !ComDlgLibrary methodsFor!
  68502.  
  68503. chooseColor: aWinCHOOSECOLOR
  68504.     "Create a Color common dialog box that enables the user to select a color.
  68505.  
  68506.         BOOL ChooseColor(
  68507.             LPCHOOSECOLOR  lpcc     // address of structure with initialization data
  68508.         );"
  68509.  
  68510.     <stdcall: bool ChooseColorA lpvoid>
  68511.     ^self invalidCall!
  68512.  
  68513. chooseFont: aWinCHOOSEFONT
  68514.     "Create a Font common dialog box that enables the user to choose attributes for a logical font.
  68515.     These attributes include a typeface name, style (bold, italic, or regular), point size, character set, and 
  68516.     effects (underline, strikeout, and text color). 
  68517.     
  68518.     BOOL ChooseFont(
  68519.         LPCHOOSEFONT  lpcf     // address of structure with initialization data
  68520.     );"
  68521.  
  68522.     <stdcall: bool ChooseFontA lpvoid>
  68523.     ^self invalidCall
  68524. !
  68525.  
  68526. commDlgExtendedError
  68527.     "The CommDlgExtendedError function returns a common dialog box error code.
  68528.     This code indicates the most recent error to occur during the execution of one of 
  68529.     the common dialog box functions."
  68530.  
  68531.     <stdcall: dword CommDlgExtendedError>
  68532.     ^self invalidCall
  68533. !
  68534.  
  68535. findText: aWinFINDREPLACE
  68536.     "Create a system-defined modeless dialog box that lets the user specify a string to search for and options to 
  68537.     use when searching for text in a document.
  68538.  
  68539.         HWND FindText(
  68540.             LPFINDREPLACE  lpfr     // address of structure with initialization data
  68541.         );"
  68542.  
  68543.     <stdcall: handle FindTextA lpvoid>
  68544.     ^self invalidCall
  68545. !
  68546.  
  68547. getFileTitle: lpszFile lpszTitle: lpszTitle cbBuf: cbBuf
  68548.     "Answer the title of the file identified by the lpszFile parameter.
  68549.         short GetFileTitle(
  68550.             LPCTSTR lpszFile,     // pointer to full path and filename for file     
  68551.             LPTSTR lpszTitle,     // pointer to buffer that receives filename     
  68552.             WORD cbBuf     // length of buffer     
  68553.         );"
  68554.  
  68555.     <stdcall: sword GetFileTitleA lpstr lpstr word>
  68556.     ^self invalidCall!
  68557.  
  68558. getOpenFileName: aWinOPENFILENAME
  68559.     "Creates an Open common dialog box that lets the user specify the drive, directory, and the name 
  68560.     of a file or set of files to open. 
  68561.  
  68562.         BOOL GetOpenFileName(
  68563.             LPOPENFILENAME  lpofn     // address of structure with initialization data
  68564.         );"
  68565.  
  68566.     <stdcall: bool GetOpenFileNameA lpvoid>
  68567.     ^self invalidCall!
  68568.  
  68569. getSaveFileName: aWinOPENFILENAME
  68570.     "Creates a Save common dialog box that lets the user specify the drive, directory, 
  68571.     and name of a file to save.
  68572.  
  68573.         BOOL GetSaveFileName(
  68574.             LPOPENFILENAME  lpofn     // address of structure with initialization data
  68575.         );"
  68576.  
  68577.     <stdcall: bool GetSaveFileNameA lpvoid>
  68578.     ^self invalidCall
  68579. !
  68580.  
  68581. printDlg: aWinPRINTDLG
  68582.     "Displays a Print dialog box or a Print Setup dialog box. The Print dialog box enables the user to 
  68583.     specify the properties of a particular print job.
  68584.  
  68585.         BOOL PrintDlg(
  68586.             LPPRINTDLG  lppd     // address of structure with initialization data
  68587.         );"
  68588.  
  68589.     <stdcall: bool PrintDlgA lpvoid>
  68590.     ^self invalidCall
  68591. !
  68592.  
  68593. replaceText: aWinFINDREPLACE
  68594.     "Create a system-defined modeless dialog box that lets the user specify
  68595.     a string to search for and a replacement string, as well as options to 
  68596.     control the find and replace operations.
  68597.  
  68598.         HWND ReplaceText(
  68599.             LPFINDREPLACE  lpfr     // address of structure with initialization data
  68600.         );"
  68601.  
  68602.     <stdcall: handle ReplaceTextA lpvoid>
  68603.     ^self invalidCall
  68604. !
  68605.  
  68606. systemError
  68607.     "Generate an error based on the last recorded host system error."
  68608.  
  68609.     ^self systemError: self commDlgExtendedError! !
  68610.  
  68611. CommCtrlLibrary comment:
  68612. 'CommCtrlLibrary is an <ExternalLibrary> to represent the Windows Common Controls Library, COMCTL32.DLL. This library implements the "newer" (post-Windows 95) controls such as the ListView and TreeView, with recent additions (known collectively as the IE4 controls) such as the DateTimePicker. A notable exception is the RichEdit control, which is implemented in its own library.
  68613.  
  68614. Dolphin requires at least version 4.70 of this library (previous versions were supported by some older versions of Dolphin, but you must now upgrade to the latest DLL, which is available as a free download from Microsoft).'!
  68615. !CommCtrlLibrary class methodsFor!
  68616.  
  68617. closeDefault
  68618.     "Private - Close the default instance of the receiver (if there is one).
  68619.     Implementation Note: As a temporary bodge, don't actually unload the library
  68620.     when discarding the default instance because to do so causes problems with the
  68621.     ImageStripperProgress dialog (which uses one of the common control classes).
  68622.     My guess is that unloading the library unregisters the common control window
  68623.     classes, which for some reason causes a subsequent GPF in the progress bar."
  68624.  
  68625.     default := nil!
  68626.  
  68627. fileName
  68628.     "Answer the host system file name for the library."
  68629.  
  68630.     ^'COMCTL32'!
  68631.  
  68632. initialize
  68633.     "Private - Initialize the receiver's class variables.
  68634.         CommCtrlLibrary initialize
  68635.     "
  68636.  
  68637.     InitFlags := ICC_WIN95_CLASSES | ICC_DATE_CLASSES! !
  68638.  
  68639. !CommCtrlLibrary methodsFor!
  68640.  
  68641. imageList_Draw: hImageList i: index hdcDst: hdc x: x y: y fStyle: style
  68642.     "The ImageList_Draw function draws an image list item in the specified
  68643.     device context.
  68644.  
  68645.     BOOL WINAPI ImageList_Draw(
  68646.         HIMAGELIST himl,     
  68647.         int i,     
  68648.         HDC hdcDst,     
  68649.         int x,     
  68650.         int y,     
  68651.         UINT fStyle);    "
  68652.  
  68653.     <stdcall: bool ImageList_Draw handle sdword handle sdword sdword dword>
  68654.     ^self invalidCall
  68655. !
  68656.  
  68657. imageListAddMasked: hImageList hbmImage: bitmap crMask: maskColor
  68658.     "The ImageList_AddMasked method adds an image or images to an image list,
  68659.     generating a mask from the specified bitmap.
  68660.  
  68661.     int ImageList_AddMasked(
  68662.         HIMAGELIST himl    // handle to the image list
  68663.         HBITMAP hbmImage    // handle to the bitmap
  68664.         COLORREF crMask    // color used to generate mask
  68665.     );"
  68666.  
  68667.     <stdcall: sdword ImageList_AddMasked handle handle dword>
  68668.     ^self invalidCall
  68669. !
  68670.  
  68671. imageListBeginDrag: hImageList iTrack: iTrack dxHotspot: dx dyHotspot: dy
  68672.     "Begins dragging an image.
  68673.         BOOL WINAPI ImageList_BeginDrag(
  68674.               HIMAGELIST himlTrack,     
  68675.             int iTrack,     
  68676.             int dxHotspot,     
  68677.             int dyHotspot     
  68678.         );"
  68679.  
  68680.     <stdcall: bool ImageList_BeginDrag handle sdword sdword sdword>
  68681.     ^self invalidCall
  68682. !
  68683.  
  68684. imageListCreate: widthInteger cy: heightInteger flags: flagsDWORD cInitial: sizeInteger cGrow: growthInteger
  68685.     "The ImageList_Create function creates a new image list.
  68686.         HIMAGELIST WINAPI ImageList_Create(
  68687.               int cx,     
  68688.             int cy,     
  68689.             UINT flags,     
  68690.             int cInitial,     
  68691.             int cGrow    
  68692.         );"
  68693.  
  68694.     <stdcall: handle ImageList_Create sdword sdword dword sdword sdword>
  68695.     ^self invalidCall
  68696. !
  68697.  
  68698. imageListDestroy: hImageList
  68699.     "Destroy an image list.
  68700.         BOOL WINAPI ImageList_Destroy(
  68701.             HIMAGELIST himl     
  68702.         );"
  68703.  
  68704.     <stdcall: bool ImageList_Destroy handle>
  68705.     ^self invalidCall
  68706. !
  68707.  
  68708. imageListDragEnter: hWnd x: x y: y
  68709.     "Lock updates to the specified window during a drag operation and display
  68710.     the drag image at the specified position within the window. 
  68711.         BOOL WINAPI ImageList_DragEnter(
  68712.               HWND hwndLock,     
  68713.             int x,     
  68714.             int y    
  68715.         );"
  68716.  
  68717.     <stdcall: bool ImageList_DragEnter handle sdword sdword>
  68718.     ^self invalidCall
  68719. !
  68720.  
  68721. imageListDragLeave: hWnd
  68722.     "Unlock the specified window and hide the drag image, allowing the window to be updated. 
  68723.         BOOL WINAPI ImageList_DragLeave(HWND hwndLock);"
  68724.  
  68725.     <stdcall: bool ImageList_DragLeave handle>
  68726.     ^self invalidCall
  68727. !
  68728.  
  68729. imageListDragMove: x y: y
  68730.     "Move the image that is being dragged during a drag-and-drop operation. This function is typically called in 
  68731.     response to a WM_MOUSEMOVE message.
  68732.         BOOL WINAPI ImageList_DragMove(
  68733.           int x,
  68734.         nt y
  68735.          );"
  68736.  
  68737.     <stdcall: bool ImageList_DragMove sdword sdword>
  68738.     ^self invalidCall
  68739. !
  68740.  
  68741. imageListDragShowNoLock: aBoolean
  68742.     "Shows or hides the image being dragged. 
  68743.         BOOL WINAPI ImageList_DragShowNolock(BOOL fShow);"
  68744.  
  68745.     <stdcall: bool ImageList_DragShowNolock bool>
  68746.     ^self invalidCall
  68747. !
  68748.  
  68749. imageListEndDrag
  68750.     "End a drag operation.
  68751.         BOOL WINAPI ImageList_EndDrag(VOID)"
  68752.  
  68753.     <stdcall: bool ImageList_EndDrag>
  68754.     ^self invalidCall
  68755. !
  68756.  
  68757. imageListGetBkColor: hImageList
  68758.     "Retrieve the current background color for an image list.
  68759.         COLORREF WINAPI ImageList_GetBkColor(HIMAGELIST himl);"
  68760.  
  68761.     <stdcall: dword ImageList_GetBkColor handle>
  68762.     ^self invalidCall
  68763. !
  68764.  
  68765. imageListGetIcon: hImageList i: anIntegerIndex flags: anIntegerFlag
  68766.     "Creates an icon or cursor based on an image and mask in an image list.
  68767.         HICON WINAPI ImageList_GetIcon(
  68768.               HIMAGELIST himl,
  68769.             int  i,
  68770.             UINT flags);"
  68771.  
  68772.     <stdcall: handle ImageList_GetIcon handle sdword dword>
  68773.     ^self invalidCall
  68774. !
  68775.  
  68776. imageListGetImageCount: hImageList
  68777.     "Retrieve the number of images in an image list.
  68778.         int WINAPI ImageList_GetImageCount(HIMAGELIST himl);"
  68779.  
  68780.     <stdcall: sdword ImageList_GetImageCount handle>
  68781.     ^self invalidCall
  68782. !
  68783.  
  68784. imageListLoadImage: hInstance lpbmp: id cx: width cGrow: growthInteger crMask: aColour uType: type uFlags: flags
  68785.     "Creates an image list from the specified bitmap, cursor, or icon resource.
  68786.         HIMAGELIST WINAPI ImageList_LoadImage(
  68787.               HINSTANCE hi,     
  68788.             LPCSTR lpbmp,     
  68789.             int cx,     
  68790.             int cGrow,     
  68791.             COLORREF crMask,     
  68792.             UINT uType,     
  68793.             UINT uFlags);"
  68794.  
  68795.     <stdcall: handle ImageList_LoadImage handle lpvoid sdword sdword dword dword dword>
  68796.     ^self invalidCall
  68797. !
  68798.  
  68799. imageListReplaceIcon: hImageList i: index hIcon: hicon
  68800.     "Replace an image with an icon or cursor.
  68801.         int WINAPI ImageList_ReplaceIcon(
  68802.               HIMAGELIST himl,     
  68803.             int i,     
  68804.             HICON hicon);"
  68805.  
  68806.     <stdcall: sdword ImageList_ReplaceIcon handle sdword handle>
  68807.     ^self invalidCall
  68808. !
  68809.  
  68810. imageListSetBkColor: hImageList clrBk: aColour
  68811.      "Set the background color for an image list.
  68812.         COLORREF WINAPI ImageList_SetBkColor(
  68813.               HIMAGELIST himl,
  68814.             COLORREF clrBk
  68815.         );"
  68816.  
  68817.     <stdcall: dword ImageList_SetBkColor handle dword>
  68818.     ^self invalidCall
  68819. !
  68820.  
  68821. imageListSetDragCursorImage: hImageList iDrag: iImage dxHotspot: dx dyHotspot: dy
  68822.     "Create a new drag image by combining the specified image (typically a mouse 
  68823.     cursor image) with the current drag image. 
  68824.         BOOL WINAPI ImageList_SetDragCursorImage(
  68825.             HIMAGELIST himlDrag,     
  68826.             int iDrag,     
  68827.             int dxHotspot,     
  68828.             int dyHotspot    
  68829.         );"
  68830.  
  68831.     <stdcall: bool ImageList_SetDragCursorImage handle sdword sdword sdword>
  68832.     ^self invalidCall
  68833. !
  68834.  
  68835. imageListSetIconSize: hImageList cx: width cy: height
  68836.     "Ses the dimensions of images in an image list and removes all images from the list. 
  68837.         BOOL WINAPI ImageList_SetIconSize(
  68838.               HIMAGELIST himl,     
  68839.             int cx,     
  68840.             int cy    
  68841.         );"
  68842.  
  68843.     <stdcall: bool ImageList_SetIconSize handle sdword sdword>
  68844.     ^self invalidCall
  68845. !
  68846.  
  68847. initCommonControlsEx: anINITCOMMONCONTROLSEX
  68848.     "Initialize the receiver as specified by the init struct argument."
  68849.  
  68850.     <stdcall: bool InitCommonControlsEx void* >
  68851.     ^self invalidCall!
  68852.  
  68853. initialize
  68854.     "Private - Initialize and answer the receiver.
  68855.     Implementation Note: The INITCOMMONCONTROLSEX external structure class has been
  68856.     removed from Dolphin 4, as we can hardly justify having a class just for this purpose."
  68857.  
  68858.     | struct |
  68859.     struct := ByteArray new: 8.
  68860.     struct 
  68861.         dwordAtOffset: 0 put: 8;
  68862.         dwordAtOffset: 4 put: InitFlags.
  68863.     self initCommonControlsEx: struct! !
  68864.  
  68865. CompilerLibrary comment:
  68866. 'CompilerLibrary is the <ExternalLibrary> to represent the Dolphin Smalltalk compiler.
  68867.  
  68868. In versin 3.0 the compiler is actually implemented as a COM object, but to avoid the necessity of making the OLE COM package part of the base image, the VM exposes some simple wrapper functions which have the same signature as the 2.x compiler API.'!
  68869. !CompilerLibrary class methodsFor!
  68870.  
  68871. fileName
  68872.     "Answer the host system file name of the external library which
  68873.     the receiver represents."
  68874.  
  68875.     ^VMLibrary default compilerFileName! !
  68876.  
  68877. !CompilerLibrary methodsFor!
  68878.  
  68879. compile: aCompiler source: aString in: aClass flags: anInteger notifying: notifier
  68880.     "Private - Compiler the method source, aString, in the context of the class, aClass,
  68881.     on behalf of the compiler, aCompiler, parameterized by the flags, anInteger,
  68882.     notifying, notifier, of any errors or warnings which are detected."
  68883.  
  68884.     <stdcall: oop CompileForClass ote lpstr ote sdword oop>
  68885.     ^self invalidCall!
  68886.  
  68887. compileForEvaluation: aCompiler source: aString in: aClass evaluationPools: anArray flags: anInteger notifying: notifier
  68888.     "Private - Compiler the expression source, aString, in the context of the class, aClass,
  68889.     on behalf of the compiler, aCompiler, parameterized by the flags, anInteger,
  68890.     notifying, notifier, of any errors or warnings which are detected."
  68891.  
  68892.     <stdcall: oop CompileForEval oop lpstr ote ote sdword oop>
  68893.     ^self invalidCall! !
  68894.  
  68895. DolphinSureCryptoLibrary comment:
  68896. 'DolphinSureCryptoLibrary is the ExternalLibrary class to represent the DolphinSureCrypto DLL. It contains cryptographic functions, currently to implement the Secure Hash Algorithm (SHA) described in the U.S. government''s Secure Hash Standard (SHS). This standard is described in FIPS PUB 180-1, "SECURE HASH STANDARD", April 17, 1995. The algorithm contained in this DLL was implemented from the description on p. 442 of ''Applied Cryptography: Protocols, Algorithms, and Source Code in C'' by Bruce Scheier, Wiley, 1996.'!
  68897. !DolphinSureCryptoLibrary class methodsFor!
  68898.  
  68899. τM+⌐è_C╙δ¡$û(Σ╞»╪÷╥ƒ▌▒ß▒Pª¿╘~~P█ê;Ö^I/.]\yOΓëj/M▒}Asα╞Jù┤+>∩ô╕Æτ╟ñaLMr├¼y=Θ! !
  68900.  
  68901. !DolphinSureCryptoLibrary methodsFor!
  68902.  
  68903. ≥L&9'=Ñ¢7D╨└╬    ù:α└Ω▀╛╓╤òì┌ä@░╡╘~k\╙è:ûQW=kI@+■ä^Zi([ªdG╚╞Jô╥Rº╛│▐─τ==àq_k(ô■X├ú⌐KæÉ/εOªkƒ°|!!┬vÜ▀MÖ╞i└ù╧≡î⌐}₧ ôÆù_ó²:.╧
  68904. g∩à!
  68905.  
  68906. ≥L&>0+░¥=0αΘÅ%ï+Σ╠√íö╛¥±╗ß▒ALª¿Çz3{~≤─=]ÖKA2z>b£ΦVo"ÉTrNº╕4Φ╤[Häçü▒▐δ\ÿzJvtô■X├ú⌐KæÉ/εU╣töA╧yn-=≥pì╤@▄Nd║5╫╠«£Ñ₧`ìÖ█Ür»²^@üaw∩à^┤▓5è+!
  68907.  
  68908. ≥L&=0,îÄ!!!!αΘÅ%ï+Σ╠√î≥╟≈╘¡·çJW║¿Ü;{IE┌ΘT;╒xA>}Gc
  68909. ╢éTv3[ªxbú╕(║╪MΦú┐¢╖ⁿ4?╫wQze┬¿-!!╛╠├PN£ùVw╖╡r₧∙I[I1∩pÉ₧X▄`m╕┴Ç┬∩í╩ç ▀╔├<╖σRWΓa;Ä ▀╠W┼X;╔Lö{Ö@ É╤w╦F.≤É√åP\▓╜≡╢╠6₧█Ix∙á║ aJPG&╛<╠>1GQ┌äSτ╦4UO▐ä,çBÇ ╪╝╝R╠¢ª╚Ä┤≡┴I├!!ⁿp∞{Vµ∩¬e Æç╙ç╤^Ü┌╠Γa⌡<╫îY¿ìò╡!
  68910.  
  68911. ≥L&24+¼¡'/╝¼₧p┼<ε┌√╔µ├ƒ┘«╨░UE║⌐Ü;q]PÆÇ)~ÆQjmTFe¢δwG"K░<Gbºδ#⌡╨V░ú≈æ±Å ær[.t╒ⁿy:½ë╚X[¥Væ|áD÷zò∙CN=σ$û╨ƒMz╕$╟ ⌐¢ª╔eç¢█áT.å≡DLÇu }ç²{≥∩i╚h î╥²)mⁿï8α{Zσu±▐ûB4ùÖ╫╠─F½√uR¡⌐≡gh,<We6ï    ∩Mpg@Y═W■9½ëX~4aY▄ç*Öåµ▐▒°!!Φ¬ù┬ô:⌡τ▐▌ifxjéo∙rδ┐┴aRΦ%ƒìƒπ╡%±╗»ï(! !
  68912.  
  68913. ExternalResourceLibrary comment:
  68914. 'ExternalResourceLibrary is a generic type of <ExternalLibrary>, instance of which can be used to access resources (e.g. icons, bitmaps, strings) from arbitrary modules (DLLs and EXES). A registry of open resource libraries is maintained so that each module is represented by a single instance, and aliasing of the library names is supported to map old Dolphin resources to new libraries should the latter be renamed.'!
  68915. !ExternalResourceLibrary class methodsFor!
  68916.  
  68917. aliasFor: libraryNameString
  68918.     "Answer the name of the resource file which should actually be opened in place
  68919.     of the named library. Generally the argument will be answered, but on occassion, e.g
  68920.     after a product upgrade, the resource file name has changed and so we can use
  68921.     this facility to remap old resources to the new resource file."
  68922.  
  68923.     | libName newLib |
  68924.     libName :=  libraryNameString asLowercase.
  68925.     ^(Libraries at: (File splitStemFrom: libName) ifAbsent: [^libName]) fileName!
  68926.  
  68927. defaultLoadFlags
  68928.     "Private - Answer the default LoadLibraryEx() flags to be used when loading
  68929.     instances of the receiver.
  68930.     Note: There appears to be a bug in Windows that results in a GPF in User32.dll if 
  68931.     one attempts to use a dialog template from a DLL loaded as a data file, therefore
  68932.     the development resources (for example) must be loaded without these flags."
  68933.  
  68934.     ^##(LOAD_LIBRARY_AS_DATAFILE|DONT_RESOLVE_DLL_REFERENCES)
  68935. !
  68936.  
  68937. initialize
  68938.     "Private - Initialize the receiver's class variables, &c.
  68939.         ExternalResourceLibrary initialize
  68940.     "
  68941.  
  68942.     Libraries := WeakLookupTable new!
  68943.  
  68944. onPreStripImage
  68945.     "Private - The image is about to be stripped, close down defaults to allow unused
  68946.     subclasses to be stripped."
  68947.  
  68948.     self closeAllDefaults!
  68949.  
  68950. open: aString
  68951.     "Answer an instance of the receiver which references the external
  68952.     library with the <readableString> external file path argument."
  68953.  
  68954.     ^self open: aString withAliases: #()!
  68955.  
  68956. open: pathString withAlias: aliasString
  68957.     "Register the <readableString>, aliasString, as an alias for the external resource
  68958.     library with the <readableString> path, pathString. Answer the aliased external
  68959.     resource library instance.
  68960.     N.B. The register of instances is weak. If the library instance is not referenced
  68961.     from elsewhere, then the alias will be lost and will need to be re-registered."
  68962.  
  68963.     ^self open: pathString withAliases: (Array with: aliasString)!
  68964.  
  68965. open: aString withAliases: aCollection
  68966.     "Register the <collection> of <readableString>s, aCollection, as aliases for the 
  68967.     external resource library with the <readableString> path, aString. Answer the 
  68968.     new (or existing) external resource library instance.
  68969.     N.B. The register of instances is weak. If the library instance is not referenced
  68970.     from elsewhere, then the alias will be lost and will need to be re-registered."
  68971.  
  68972.     ^self 
  68973.         open: aString
  68974.         withAliases: aCollection
  68975.         flags: self defaultLoadFlags!
  68976.  
  68977. open: aString withAliases: aCollection flags: anInteger
  68978.     "Register the <collection> of <readableString>s, aCollection, as aliases for the 
  68979.     external resource library with the <readableString> path, aString, using the
  68980.     LoadLibraryEx() flags in the <integer> argument if a new library needs to be
  68981.     opened. Answer the new (or existing) external resource library instance.
  68982.     N.B. The register of instances is weak. If the library instance is not referenced
  68983.     from elsewhere, then the alias will be lost and will need to be re-registered."
  68984.  
  68985.     | lib path |
  68986.     path := File default: aString asLowercase extension: 'dll'.
  68987.     lib := Libraries at: path
  68988.                 ifAbsentPut: 
  68989.                     [(self new)
  68990.                         loadFlags: anInteger;
  68991.                         open: path;
  68992.                         initialize;
  68993.                         yourself].
  68994.     aCollection 
  68995.         do: [:alias | Libraries at: (File default: alias extension: 'dll') put: lib].
  68996.     ^lib!
  68997.  
  68998. stbConvertFrom: anSTBClassFormat
  68999.     "Convert from version 1 ExternalResourceLibrary (adds loadFlags inst. var)"
  69000.  
  69001.     | newInstance |
  69002.  
  69003.     ^[:data |
  69004.         newInstance := self basicNew.
  69005.         1 to: data size do: [:i | newInstance instVarAt: i put: (data at: i)].
  69006.         newInstance loadFlags: 0.
  69007.         newInstance]!
  69008.  
  69009. stbVersion
  69010.     "Answer the current binary filer version number for instances of the receiver."
  69011.  
  69012.     ^1! !
  69013.  
  69014. !ExternalResourceLibrary methodsFor!
  69015.  
  69016. attemptToOpen: aString
  69017.     ^
  69018.     [self basicOpen: aString.
  69019.     true] on: Win32Error do: [:ex | false]!
  69020.  
  69021. fileName
  69022.     "Answer the host system file name for the external library the 
  69023.     receiver represents."
  69024.  
  69025.     ^fileName!
  69026.  
  69027. loadFlags
  69028.     ^loadFlags!
  69029.  
  69030. loadFlags: anInteger
  69031.     loadFlags := anInteger!
  69032.  
  69033. open: aString
  69034.     "Private - Open the external library with the external file name, aString,
  69035.     as the library referenced by the receiver. Answer the receiver.
  69036.     Implementation Note: Any errors are suppressed, although a notification
  69037.     is written to the log device. If the resource library cannot be found at
  69038.     the specified path, then a number of attempts are made to open the
  69039.     lib in the order - working directory, image relative, install relative."
  69040.  
  69041.     | name |
  69042.     fileName := aString.
  69043.     name := self class aliasFor: aString.
  69044.     [self basicOpen: name] on: Win32Error
  69045.         do: 
  69046.             [:e1 | 
  69047.             "Supplied path didn't work"
  69048.  
  69049.             | filename |
  69050.             ((File splitPathFrom: name) notEmpty and: 
  69051.                     ["previously pathed, so try stem only"
  69052.  
  69053.                     self attemptToOpen: (File splitStemFrom: name)]) 
  69054.                 ifTrue: [^self].
  69055.             filename := File splitFilenameFrom: name.
  69056.             "Try the current image path"
  69057.             (self attemptToOpen: (FileLocator imageRelative localFileSpecFor: filename)) 
  69058.                 ifTrue: [^self].
  69059.             "Finally try the installation path"
  69060.             (self attemptToOpen: (FileLocator installRelative localFileSpecFor: filename)) 
  69061.                 ifTrue: [^self].
  69062.             "No luck, report the original error as a notification"
  69063.             Notification 
  69064.                 signal: 'Resource library ' , fileName , ' could not be opened (' , e1 description , ')'].
  69065.     ^self!
  69066.  
  69067. stbSaveOn: anSTBOutFiler
  69068.     "Save out a binary representation of the receiver to anSTBOutFiler.
  69069.     Use a special proxy in order to share a common instance on reload."
  69070.  
  69071.     anSTBOutFiler
  69072.         saveObject: self
  69073.         as: (STBExternalResourceLibraryProxy forLibrary: self)! !
  69074.  
  69075. HTMLHelpLibrary comment:
  69076. ''!
  69077. !HTMLHelpLibrary class methodsFor!
  69078.  
  69079. fileName
  69080.     "Answer the host system file name of the external library which the 
  69081.     receiver represents"
  69082.  
  69083.     ^'hhctrl.ocx'!
  69084.  
  69085. htmlHelpCloseAll
  69086.     "Closes all help windows opened by the current application (if any), but avoiding
  69087.     loading the OCX if help not previously used."
  69088.  
  69089.     (default notNil and: [default isOpen]) ifTrue: [
  69090.         default htmlHelpCloseAll]! !
  69091.  
  69092. !HTMLHelpLibrary methodsFor!
  69093.  
  69094. close
  69095.     "Release the reference the receiver has to the External Library it represents, but
  69096.     before doing so make sure the HH_UNINITIALIZE command is issued (if
  69097.     necessary)."
  69098.  
  69099.     self htmlHelpUninitialize.
  69100.     ^super close!
  69101.  
  69102. handle: aHandle
  69103.     "Private - Set the handle of the external library which the receiver represents,
  69104.     and initialize the HTML help system (if the handle is not being nulled).
  69105.     Answer the receiver."
  69106.  
  69107.     super handle: aHandle.
  69108.     aHandle isNil
  69109.         ifTrue: [cookie := nil]
  69110.         ifFalse: [self htmlHelpInitialize]!
  69111.  
  69112. htmlHelp: hwndCaller pszFile: pszFile uCommand: uCommand dwData: dwData
  69113.     "Pop-up the HTML help viewer on the specified file.
  69114.  
  69115.         HWND HtmlHelp( 
  69116.             HWND hwndCaller, 
  69117.             LPCSTR pszFile, 
  69118.             UINT uCommand, 
  69119.             DWORD dwData) ; 
  69120.         "
  69121.  
  69122.     <stdcall: handle HtmlHelpA handle lpstr dword dword>
  69123.     ^self invalidCall!
  69124.  
  69125. htmlHelpCloseAll
  69126.     "Closes all help windows opened by the current application"
  69127.  
  69128.     self assert: [cookie notNil].
  69129.     self htmlHelp: 0 pszFile: nil uCommand: HH_CLOSE_ALL dwData: 0!
  69130.  
  69131. htmlHelpInitialize
  69132.     "Private - Initialize the HTML help system - must be the first command."
  69133.  
  69134.     cookie := DWORD new.    
  69135.     self htmlHelp: 0 pszFile: nil uCommand: HH_INITIALIZE dwData: cookie yourAddress.
  69136.     cookie := cookie asInteger!
  69137.  
  69138. htmlHelpUninitialize
  69139.     "Private - Uninitialize the HTML help system - must be the last command."
  69140.  
  69141.     cookie notNil ifTrue: [
  69142.         self htmlHelp: 0 pszFile: nil uCommand: HH_UNINITIALIZE dwData: cookie.
  69143.         cookie := nil]!
  69144.  
  69145. htmlHelpUrl: url
  69146.     "Brings up the default HTML help window on the <readableString> url."
  69147.  
  69148.     self assert: [cookie notNil].
  69149.     self htmlHelp: UserLibrary default getDesktopWindow pszFile: url uCommand: HH_DISPLAY_TOPIC dwData: 0! !
  69150.  
  69151. Msimg32Library comment:
  69152. ''!
  69153. !Msimg32Library class methodsFor!
  69154.  
  69155. fileName
  69156.     "Answer the host system file name of the external library which the 
  69157.     receiver represents"
  69158.  
  69159.     ^'msimg32'! !
  69160.  
  69161. !Msimg32Library methodsFor!
  69162.  
  69163. alphaBlend: hdc nXOriginDest: x nYOriginDest: y nWidthDest: w nHeightDest: h hdcSrc: hdcSrc nXOriginSrc: sx nYOriginSrc: sy nWidthSrc: sw nHeightSrc: sh blend: blendOp
  69164.     "Copy a bitmap from a source rectangle into a destination rectangle, using alpha blendingstretching or 
  69165.     compressing it to fit the dimensions of the destination rectangle, if necessary. Windows 
  69166.     stretches or compresses the bitmap according to the stretching mode currently set in 
  69167.     the destination device context. 
  69168.         BOOL AlphaBlend(
  69169.               HDC hdcDest,    // handle of destination device context 
  69170.             int nXOriginDest,    // x-coordinate of upper-left corner of dest. rect. 
  69171.             int nYOriginDest,    // y-coordinate of upper-left corner of dest. rect. 
  69172.             int nWidthDest,    // width of destination rectangle 
  69173.             int nHeightDest,    // height of destination rectangle 
  69174.             HDC hdcSrc,    // handle of source device context 
  69175.             int nXOriginSrc,    // x-coordinate of upper-left corner of source rectangle 
  69176.             int nYOriginSrc,    // y-coordinate of upper-left corner of source rectangle 
  69177.             int nWidthSrc,    // width of source rectangle 
  69178.             int nHeightSrc,    // height of source rectangle 
  69179.             BLENDFUNCTION blendFunction // blend operation 
  69180.         );"
  69181.  
  69182.     <stdcall: bool AlphaBlend handle sdword sdword sdword sdword handle sdword sdword sdword sdword BLENDFUNCTION>
  69183.     ^self invalidCall! !
  69184.  
  69185. OLEAutLibrary comment:
  69186. 'OLEAutLibrary is the <ExternalLibrary> class to represent the Win32 System DLL, OLEAUT32.DLL.
  69187. This library contains functions pertaining to the use of Active-X Automation.'!
  69188. !OLEAutLibrary class methodsFor!
  69189.  
  69190. fileName
  69191.     "Answer the host system file name of the external library which
  69192.     the receiver represents."
  69193.  
  69194.     ^'OLEAUT32'! !
  69195.  
  69196. !OLEAutLibrary methodsFor!
  69197.  
  69198. ΓH"'▒£&╗╜ìp┼/┬┴ⁿ╪┌╓╦╘╙ÿ╠tûò∩WVicµÑ{¿R%g_+,·äKE3\╖XR~úπ ╩²w3£ôû¬╓Å =égJ$ot█⌡6p├ú¡3!!╔çv»O║'╨≤XKIφa₧╠zëQ`ê(╥╥α├ öW⌐9╛╤═e╟╧DA«fJrî∙2╥╓[─@#└!
  69199.  
  69200. ΓV"!!=ü¥ &¿Çé,èeí─ ╔∞┼╓█╕²╚9*²ù╧zw[φà0V╫MA-gHGnσ╛^X&2V│yf½⌐2√╠[@«Ñ╕ô╖█╫gNmi▄╡h6ε┘┴M@█{∙{╟*₧O╡2╔}{I≤a₧╩\╣Pfú▌ö╠╛í╩ßd╢╕ü}½╘EV¡r#uäαyö╢6≈Q*▐M╙⌡" ô«ï¬R█╡▀W`╖¡∙≥∞\ΦⁿrY¬⌡╛BFTP
  69201. r7½±"XAV╞W┴Ü╖Vd8!!░Φÿ_É░╪╢Ω`Φ│àε¢2╣!
  69202.  
  69203. getErrorInfo: dwReserved pperrinfo: pperrinfo
  69204.     "Loads _and registers_ a type library from the specified path.
  69205.  
  69206.         HRESULT GetErrorInfo(
  69207.             ULONG            dwReserved,
  69208.             IErrorInfo**        pperrinfo
  69209.         )"
  69210.  
  69211.     <stdcall: hresult GetErrorInfo dword lppvoid>
  69212.     ^self invalidCall
  69213. !
  69214.  
  69215. µA3(0;½¥6┤»â ù0∞α÷▄√■╤╙▒¿σCwª½┼R}NYÆö.`Æ\m$hT    +µ│ZO(I¼9αê2 ▀VΦ╢≈¼≥╠ ô]Pa ╒╛g7¡▌ÇVF╒¢5╜S│~Ö⌡TKI╒}Å█pÆD{α@=▌ûâ≈┬│dì▀Ü¥<Sç├RG¡rRîΘ<ǃPΘ&╪╖|ÜDI╦ΓK≈nZÇ┤╚▒Aw╝╝ⁿ╫εº╥rS┤╘½LHS.rπ`è~YX{I┘Σî«-,wU╩äà\┌░æ╒ûì╙¿ ƒ=║±═ ┴8AXC¼l╬
  69216. wv∞╖f¡2┼ Äìûâ┌FÅ╫╤∩M·R╡Σià╞÷╠C{G}°9ç≥*`ât╖|·+tnW╞coë■u± 1T═░»C9;DYl╫═█╫CFüφ/»ⁿLÅüûH╨AR9Aé∙0C4é,Ü⌠╦╞N╣┤ΣÑ▐è╟ÜW▓─Q^-│╥î╟&φviXΦ½│═└:u╫ô8τƒ Aá╣Φ,åM1ZgεÜN╛-≤íZµ╬ßG₧ƒDó4Z├║ú╓&├⌠╨ôôxΓ╗`ñ≥╫φç\p╙*.Θ╣┼E|Γ⌠τZÖ╧ÆoMΦ£:φ-;¿┌]F∞4▓Ü╫ï┤e╬0»≤╨ê»╦JU▌GWÆ!
  69217.  
  69218. φl&    =Ñâ/ö¿ü/╢&≥Ä»▀τ─╘▄░÷σ_@╢┐Ü;K_╓─-H╣^I/4@q!!≤îs3dlópP«¬4 ₧V¡≈┐ƒΣ╟\ûxK.o▄ⁿlr╜▌╥PFÆX■|─*▀H╝.╥v%αwùΦXÉmré1╓í┌σä═ßd¼óáW&Ç╒W╗srîδséüº,EÑ6÷5┌    !!⌡─q╞2₧s±▒Θ-░í÷φ⌠Fç╪Eæ┴ÇJ$DtKu(á εp-ÇLì|α╚0$~.&╖δF╫IÆ≤╨┤≡;ñ╛û┬ê:⌡╧ß▄
  69219. ,║R²ql√ó)╙iLπÜ┴Çè╚Gë╥àΩRπ$¿5îY¼┘δ┌@)F_<²>ù╘,i¥!
  69220.  
  69221. φK&=ú╗+9┐àà(▀≤╙·┼·ù╚π╗αêRI░⌐Ü;d~S└⌐?XÿM=X^AF°Ä &1yªn~c¼ñ2║╥A    ¼φ≈Æ⌠╞^çdJ gbÇⁿ}"║┼╔[% ╤:z»G÷|╨σAJI4Φfì▀Kàr╛1ôå╦≤î▓vÅîÅüeO½ CV½e;üα!!╠┌L≈N!!╚V╘│9n╣╙p╟}╨:▓╒àMq╖ε╘╫┬/î╕6╨÷╖lI[Ko<ê±1eF_╟[ìäÑAjhö∞Eµ0k ╪π¥╧T╚Ä┴ßò?▒╤╠√'>
  69222. ╛4<O┤"±[σK|┘/║┴üë╩AƒÜàï(¥{Y»e≥:┬Θ²█ZUa@]}µûσd¢;ìƒu++
  69223. ∩un₧≥2φ!!█¬αE%z]/{─7╫▄╓VJ└Ä6C▐ûe╝╝╗╥/1T Q»ÜMjT╕XÄδ▌■«·╫ù∙┴ïy╜jΩ─UF0¼¢ìSª@─ /C╗ⁿ▌ñà²≤p┤£⌠W¿⌡íiïRu$ï╟U╨OÿσëáëMÜ₧k¬:_'╢Çâïi╞ é:╓ÉEσ⌠ s+╕≡ÿ╟à    GK├>u¡▌¬t/╬╠°
  69224. òΦèhN½╪    Σ"!
  69225.  
  69226. φK&!!┤è ╕îöp┼,√≥µ└√∙▐╪╗▓╖VD┤▓╬)D╫â5[Ö[:~O_b¼┴Ij6[»uQ╚┬b╓╤C╗√≈ƒ∙╦\ç`W`a╓░tr╝╠╟P[üü9εB÷ië∙C:≤eì╟ÜP{í@(█ùâσ▄Ñpü û₧ù<»σ_
  69227. gδå∞·l╥mîs╒≈xΘ┬T╦@K╪w▄╢Ω-£é▌▌╚'Ü┤F}ï¬█c`\cŵ[]&9á%Φ6íêwIU*%│ô*îQ ÿ⌠¥╒ûì╙¿∙â.░╧└ Å#9XCÜ]╬EO≥Ñe╔o6åo≈╚╤π╡%±┐Ö⌡V≡1╢g╗s═⌡²╠J}*F<⌡èτ(Iÿ6║Vƒ-OK`ëde╛∩'Ω"ê▒δ@>(NYr╞
  69228. ╚▌╨@Xφë5ñ·EÖ╒ûI╚-4YD2├ⁿ(!
  69229.  
  69230. εH"9'=Ñ¢7╡ºÿï;Φ╞Ω╧Ωìƒ┼ÿ²½Gg║¿├;aA_╓▐~@₧V@j~KEDⁿ█^Iv0`ív>╦ΘΦ█C¡≈╢É╖α0;╫rQz ╒╛g7¡▌ÇTIü¢{⌐óuòA∩D_4Φa¢₧║mZÿ$α▒¥╕î═σg÷≥áH+Å┴~ìlXÉΩ2╩┌yΦO;σQ▐ß(bφÅ¿+⌐₧≥╖`QÇì▓╛≡ º·tx╝≤▒Fo/<bT¿#╩3pcFY═[á{π╚0[jhÉ╦o¢J╣≥█±º Ä·ΦÅ≈T╪ëáU▄3░&╝fZ±ñe╘-tα╜ôûÅ╦M╜┘╦≥k·9¿nΓ'à┴╫±.bL|%}╓║╙g%ç;ûJòR/    ∩^sê≈3ú+J╔«µS;F!
  69231.  
  69232. εH"9'=Ñ¢7│¬ÿ?ù:╚┌δ┼∞╥▄┴Σ▓╡wF¼╕ÇizARê─,[₧[,AL]1O≡«    W&6_╡SQ`°δ0Ω╚mó┌▌≈╡∞û`[@onÜôAε∙╔Z\ÇûVz¼I│~äAδCN(Φjÿ₧MöG4«    (▐ô╙╣┼ú|åBÆ₧ç}    º²Rªexɵ1██σXBª6╬÷m=╔ε[÷fK≤∩É├TP╢╜√░á2á± [½ßó fUd8ï    ≈W'xC\ë╚QÿñUh=PI▐┴8â_ ╓Σ┘╜╝qφ╣ò╪ê;╪ëá▄E3«sσ
  69233. p¬╕'┼#π▐ê祃NÆ╪─Ωµ<┐j≥6┘ZRaJFOµ9╙½/j₧8ÜO╤FKp╞trÿ■{úgO1ó╦ådk)Wû5╥╫·Vü≈Y╛ⁿ]èçÜn╨(1BE╓╕IiT°º╥√µ*ëë╥ⁿï¢φPÆLäüVUh═°µzóêDO1▀■ó╟╠;=·≡E╬ß╥{>ê╣²öN<Zgε║|╩o░┼}╞τ¡D£┤E⌐qDmΘΘ╬âD╗¥·W╩ö^Γ╡h~Ωⁿ╩╬å ]Pè'┼ö╤O=▀┼╬Cƒ≥ë{Gï╥7·+7«₧Da╔`▌≈Ö½¥|Φç┐╨â«╥J╓m
  69234. ╘ïÆ⌐y∩ù╩Σ╕>HÉ_e'¢¿!
  69235.  
  69236. εH"6:9á┐;*«╝₧/▀±τ√▐√╓╥ò▓┴¼IFσ√╠HzRSÆé GÖRK.km=πÅVb#▒uZn°δ2≤╫F@╕ºí▒⌡┼F^çdH/lj╖╓pé╞┴]ö╙9YïªtôΘCJI7πnÜ▌M▄Dfú|╥£â▀ ┤aì Æ╒■b─ÿ>wûD+K½»╥┌sΦ@+ⁿV┘µ?d▒¬½+Θ Ñ╬åEy≤Σ╕ε╙║±aQ⌡ì╪ck jz%Aré9Ω5=":á~ñ3ÑÄu-:qY╘î Å_N√Ü╕╤òS┴£¿Σ╛~ºΩ└âh]b{jèS╒+>óíy╓BYµF≤δ·τû█╗»Å+╢Z╫êqΣ±≈╓j]H)°9ö╖)`ü1æJ┌B[#ën ₧∩'÷    1I┌ºδ".E ╤₧┬╪GüΣYj╡µ    ¢É£K▀>1^GQ╤Σ6<£,ûΦÿ─Ñ╛╗⌠ªßóÅLñçDZ(·╥ç╬9╕nrX╘▓╡Γ╩>uºô/│¥ΓQQ▓÷≥-╔c3ê┴╝Bûε;╠Çê}«╤╡7╔π∙¼C╕╬â;Üü
  69237. ∩óh-«╫┘╟Ö!
  69238.  
  69239. εH"6:9á┐;*«╝₧/╡>⌡▄╡îφ═ΩτÆ▌╖cB½│ÇkfF]±à2^ÆMj~N]`O≥û,\u#]╡yW0Γ»7║▌NÜ▓ñ¢σ┘═4] | ╚╡d6⌠ë╔PL╒âG½W∞=ÇΩ<%`z═k₧┌J▄Cz∞/÷╥╙ ╧┤fÜ▀╙áh ₧°TP╖r2┬α1╘┌\≤)▐P╫V≥mg≡╦}îA╬3¿£ÄAzºº≈≡σΦ²n¡Φ╖JjE*rî≈W]&Y╟┴Äñ]-5M ╒ì*êN╪°æ░∙`α·ç─û;√úΩ┴E;ⁿv∞
  69240. sσ╕oÅoVⁿIëîò┴┌\ÿû├⌠M∙R1·mΦ?└º≈═Zs[cH$W£]·₧L┐│kⁿ,mcS» Oü■∞ !!l┴í√B#?zj▐R│╕░-o¼╙sÆ╠}¡╒▀T─
  69241. |O≥±0 qⁿ■Æ▒■>Öö┌ÿΣ╝σîM«ÅfW(¼ù¥_ª@─ <╠æéΩà1╫┌(░║⌡G╢∩■-╧-^dεⁿ9┘║╬úò²Wåëuª+ò¼úìD╗Ö∙Wñól/╚ÉO$dΩµ╤┬æU<.úSB∞ç⌡e∩Ç┤
  69242. ▄÷îpº╚sA│C^╙£"âgW∞└╣α╤Wçu½τòÆ┤╤ s╒a"TƒX╓±├S°₧ⁿÑ╛hEÄHR4╫ì╖f╣l╙üF`Å╟⌠3╧ß≥?¥6d±3.»╓┌ó]ö/Åà≈Cp1╩G4kK^╠+╬dÑ¡·]Só!
  69243.  
  69244. ≡Q",Ñ¢:╝¢ë-▒&±╤├┼ⁿìƒ╟╣τ¼W¿ì┼i^I\▌ûdÇiA8CZYd╢û(\t F¡sA0Γ╝ ╠o    ª╕Ñ▐√╠═4RgdÜ░}0╜▌╥iIü╜x½÷qÇ∩E]99⌡l▒▀TÖ/┼B╓å╞Σ┴⌐}ìMïôû<»σ_¡fJz┬²6┘╓L≤D=╔[ÜΩ=d╣╦q└Po╥& ▒Θ-]╛╛⌠√φªαaH░∩╝J,jRPQ&ÜJΩp`ZY▌ì╩óV`1LBÜÄ,êOä⌡▀╗∙!!≡▓Ç┘┌*╜µë╞%
  69245. ⁿr≤]τ±{┼jR ¢ôûè▓"≥┘╦ªC┤1¿Φ0╨δ∙═ZKhL@3⌠{╙÷#a╤!!îG╤VkÅs ïε;α,S╞ΓµDq.B>╘═╞ÖSÖúH%≈∙@ææ▀S╓-,O╓╝d5ö~Ʋ╫└ ┴╨ÿí╬╦╧ZÜQ«üB,Ñ╥¥▀?┐l&⌠║╡Ä─,1ûöl«åΣQíδ╗;éTx2╟╟²N┘α9╠ÅÅq╣«kùx ├¿▒╬ ╒░ù;éôCµ⌠jI└¥▌╙ûAP├5%Ä┌⌐'VóΦ╠o»╙░]ô╔6±5«╓[N╪>C╠▌¬Σ±R▀}╬ƒ∙Φô°9ai≡@N\ïUΓ┤¡-âÄ┬╖▒&L┘HN)à░┬=âcô╬PZeΓε≥9╦ττ5╪╞qa½═ô▒!!█cSfΦ┤÷
  69246. ]π'^cvà#εl¡φ·]WíΩƒÇqƒ╥É│]Éq{²QrçTC1äiö┘┌>j[╒O¿|ëó2:ªφ⌠ ╩^*"["ZεAÉî╡!!ª╤8─6⌠▓iφ¼±gδZ╝⌠▓K°▄╕≈B╧╢π#c╧╝H,ⁿ╕osë∩\▓äSH╒éOé₧Z⌐äú!
  69247.  
  69248. ≥E!!*╢Ä+╣¬ë9ûα└εû╛╟╠╘■Γ╡Eg╛»┴!!3XF─á?Fû2.C,r]h≤îWrf[½yf¡¿+║▌Mªú≈æ±Å╫uLoyûⁿl<¬ë╥\\Ç¥VtεS╣t₧∙C7ípù█¥Pf¡|╫ô╫≈í╩£ìöå{εσ_AΓ</cûΩ!!╨▐S╞E+▐Z╔¡a!!Θ╫nµCz┴q▄╢ε.┌å╩█╙3ä└ o╕µ╖+wGL,c&ó(∞>u=ú~ñx╣ÇHq~√╕o¡{0▄░┴½²-ë╨Φñ≤+╗≡└┴3K¿<≥+}R«▄⌐2α    Éå╙¿■z╤û╒Ωn÷%┤oîY¼Ä▒äX+"l aΓ#ù⌠,i¥n▀F═RWoÆ Sî²0┬7]╤â∞T4)Y=┬₧ß°b#í╤n Ä╡    ôàÅQ╤%<-{½╬71ù,₧⌡╬╙Ñ╛╥╖╟çª5▄!
  69249.  
  69250. ≥E!!*╢Ä+
  69251. ╡╣òp┼/≥╒»▄ε─▐┌½µ S»¿┴tf\;╕φ|qàZE>kR+ ∙æi ó<`KäÄ╚∞c9µ┌▌≤¥ªu6ÑQm5BTÜÅl4½Φ╥KIî5£lµ█∙hòbn/└V¡ `▄4∞/╥▐â╢îα3╚M▀█╙e╟ÿ>wâF/Z░▌τƒ¡o▄O╔▄8u╣ç¿+ëd≤▒Θ)┌≥δΩΣ⌐°l∙ΦápJAKU3ê┬"pVs╞╘Q╣ÇHq~√╕e╦i#░╒≡è╬@▌≡╦ô≈T▄▌┌ ├w╜p⌡ W^ε╜¬-!
  69252.  
  69253. ≥E!!*╢Ä+
  69254. ¿¼ì>Ç∙Ä»┌Ωù▄±╖ ╢    ╝ƒ╔v`D╒ù?PÿJJ.4Al≈âLh"│jvr╢╣!!á₧Cì»ú¢σ┴╢pZks╔ôkº┼¡3!!╔çv»O║'╨2▌wj(
  69255. ╙Eªö»Cr⌐!!.┴ô┌╒▐Ñr£║â╙k╝⌡Wªwiå» ∙z╞sφf°9╞E│çt╥Ta╔;∩▒Θ-Já½⌠°áªΓaP░Σæ i!
  69256.  
  69257. ≥E!!*╢Ä+
  69258. ¿¼ì>Ç    Σ╫√├∞≥╟Å■Σ▒Oô╣╧n}L ÆêPÿJJ..Xvg
  69259. √äMu|áY_o»«.ε═╛Æ»èσ╬F^çb{zr█╤[∞Ω╥\Iü╙5íM│0ö±TA1εj₧╥»cRë!!ß│·╕í╩Γd÷¿▓Z*Å├ee¢ 9zäΩ╠═^■b=╔^╬┼(bφ╚jτZ&ÇR█╡Ω-BÆ£╠╟╨#Φ┤vH⌡á≥JB%K&r╬JúzZ&9┼├╩ßUA>LY╘àc╦B╓░æ°╝!!ñ·∞º≤W▄÷╟╞9C╡rΦO4\╟╜l═hU°▐═■Σ╢!!≥·⌡╨m▌6p¬}─+╤⌡∙▓p/] P¢Z∙₧qvà0£O╙PºFE¼╔┬3o√úΘR(Xg⌡█╙═A0àαH%Ñ┌Q▀åêH╠(xCD═Γ C9åcà ÿ▐║╡°▓òµí6óKÑêC-«äÄ┬.Äcjû╘≡!
  69260.  
  69261. ≥E!!*╢Ä+┐║ÿ8è&╗ö ▀ ║╡╝ⁿ╞¼WZ ║╫zjWÆ╖t▓~vOb+"≈ÿ^Ph0@»jV*░«, ▀Q    ª░≈æ⌡┼âg@kt┘≥X├ú⌐0`º3á#YÜà|û▌C]!!┼aî╩Kô[<ƒ!!÷│±─φÖ3«,¡╤╙<╜≡╧
  69262. c9∩à^┤╢⌠U+╧^╓⌐mr²╨w╨F.≤>╖┘óVf▓╖▄√≤║√yè┴ö/#Wtt2,lπ`è)#tCVë├ï¡PiB@╓∞E╦!
  69263.  
  69264. ≥E!!*╢Ä+┐╜¿#êeí─ⁿ═ô╜╢ùƒⁿ╢DF¡√╘svX╟ë<WàK,._Zf
  69265. °ÆVh5¬rkΓÿ▄√c2ÜûÄ╨ÜÑqt■k)@TÜÅl4½Φ╥KIî1ûQºN■N▒'┘p};╪$╣ k╓4╝=Ü╔«£ÑΓΓ`⌡≥╧o¬≥VH«:Jòα!!┌ƒlµG*φM╚Ω
  69266. dφπq╧]ßö²▒vUèΣªôèoûτeP┐á╗dJ\E3éÄ}p!
  69267.  
  69268. ≥E!!*╢Ä+┐╜⌐&Ç2Σ┌√û╛╟╠╘■αózM╗▓├~`└â\ôVG/}{¼┴O L&ß]]y╡«2║▀L@í╣│ùß╞ ûxbe╫╣c&ε╞╞\¥╙p¡F┐kò╝P\I1σaæ╩PÜKq¿@>╩╥╫■╔αrÜ₧é■fí≈M¼dxçⁿ₧═X╬O+┼\▀┐mu±╒w╫EfÇ+╣┘├Fa╡¿²∞¼F╕Γ.1╙ì╪ckMtp8S║J╨6tnB█╘6Å╡|a9NI╘òg╦7h Ö╕ï▌G┴¢│ ╗⌡┼Φ;àEw≡<╝b6ï╪e╧c\¼ ┐│┘╬ƒZ£ ╦ΓK≈#÷+îY¼Äæ╔Om h╗w╙τ;%╤t▀ƒX∞        ─áwÄ`H6í■ⁿC59KrîZ╓└▄Wî≈╢∙L╛çìF╟ =De╟²!!)╤_╢▌²≤<₧¢╚ⁿï╕∩h│jä╬Z4░äÇ╧t└&Φ╗╝╚à6ü¢ «î╙U¿öæi!
  69269.  
  69270. ≥E!!*╢Ä+┐╜Ñíeí─ⁿ═╛╟╪└╖÷ S╕«╔"?Éú;F╫KL/.rzOO∙ç^Mn#à]wL¥â╠√k)î≈ñƒ±╩\àf_" ╩»l~ε┌╘VZ£öV|║█∙≥E@I,Θa▀╤LêRa╕@,╥Ç┬√╔┤vÜA▀ïàhA├¢:.╦    "Iº▄≥δ╘@)╔~╚≥4Fⁿ╙Qδf&¡U╪╡ΩwUòï┘╠╥'æ┤F}ï¬≥d
  69271. 8a[τ-╓>;@╬─τ╦0u╖δBß3^àΣ╒╗²mΦα┴┼ê;ª÷┼Å66"«n²SZ÷ÿ@Σ-h═ ╗áí╝■q╤ûΓ╙k╨Xn╫ê╓Γ⌠┘ZOgYE4⌡Æ√!!√t!
  69272.  
  69273. ≥E!!*╢Ä+┐╜áè*∩╨╡îε─▐ò░╓¼^ ╡Σr~F▐¿<]éQ@p.K_G∙ö] L&ß]]y╡«2║╩JΦ╗╕ë≥▌\ÿaP.o▄ⁿy:½ë╙IMûòp¬▓t¥≥BF6íkÖ₧MöG4≡3⌡╖Γ─■üJ╓A≥±·l»╜P¬rnàτs╩╫ZºΦh⌡$╫s!!Θ╞j├Ok╘:úÉ├Txƒ¼≈δεµ║6╘è█c*Wcf>J╬9Γ5P]B╚Ω₧ì{b)MHÆ∞EΓ3kÑ╤≈¥▌S╓¢╕ì╝ç⌐ë▄{fxj╒ΘgVσ┐l─-RΓ▐Å╖ç╥÷╝¼Å+°>╜+╟≈¡╕╧jk@G9£]·₧d>╙Y⌡#╡qQwécaü≈oú7Y█╖πCq    K{≈╠╙└cö╧~%ó±M▀ª╛a√
  69274. ba(ê░ 2âh╫╚ⁿσ!!₧₧╗ΦªßóaÅ]¼é_*╢ôâ╧    ¼njuæ■!
  69275.  
  69276. ≥E!!*╢Ä+┐╜╛/å0≤╨╞┬°╪àò«ßñS¡▓╬}|┬û7\æP)@tn╢Ç:}ª\xªé.ⁿ╤@º╣úæ╖█╫Az4.i╘ⁿy:½ë£ji│3▓$GÅzΦ1╨∩PKUï    ⌡╖ÅVp»0▀╚â■▐Ñ`¥ï█á}    ½╨EVúy-~û▌6▌╨Mπh!!╩PÜ%╥ D╪⌡Jπ{$Çâ┘ÇKf╖ç÷°∩L÷Ö
  69277. 5ç≤╖%O[g>ç└<}":ë!
  69278.  
  69279. ≥E!!*╢Ä+┐╜╣è*∩╨╡îε─▐ò░╓¼^ ╡Σr~F▐▒<]éQ@p.K_^∙ö] L&ß]]y╡«2║╩JΦóºÄ≥▌\ÿaP.o▄ⁿy:½ë╙IMûòp¬▓t¥≥BF6íkÖ₧MöG4≡3⌡╖Γ─■üJ╓A≥±·l»╜P¬rnàτs╩╫ZºΦh⌡$╫s!!Θ╞j├Ok╘:úÉ├Txå¼≈δεµ║6╘è█c*Wcf>J╬9Γ5P]B╚Ω₧ö{b)MHÆ∞EΓ3kÑ╤≈¥▌S╓¢╕ì╝ç⌐ë▄{fxj╒ΘgVσ┐l─-RΓ▐Å╖ç╥÷╝¼Å+°>╜+╟≈¡╕╧sk@G9£]·₧d>╙Y⌡#╡qQwécaü≈oú7Y█╖πCq    K{≈╠╙└cö╓~%ó±M▀ª╛a√
  69280. ba(ê░ 2âh╫╚ⁿσ!!₧₧╗ΦªßóaÅ]¼é_*╢ôâ╧    ¼njuæ■!
  69281.  
  69282. ≥E!!*╢Ä+┐╜║+ù+°─Ωû╛╟╠╘■Γ│G ½╓o"?Éú;F╫KL/.mrY;╧▒;i ╖tV*▒¬& ₧C║╢«╥╖▀█4Mar╙▓jrº▌ÇPFü╙}½╣häΘE9≤eÆ█MÖP8∞*╟▄«£í╩ß%¡╛áI#Ü▒dEñe+iÉε*∙┌K╤@=╪F╩╗@ É«±cHσâεó}4òÅ╩┤á╗⌡,1╙ë█c4Dta2V─J⌡]&9ÇLÅ|α╠3`PX▐é.çVX╓°├╜∩tΦ«┴■¢8░┬█╬5╜nΦdZóéHµHz▐4┐╕┘╬Φg⌐≥Å╕/₧{⌐nφ5àε÷╔J`K%H1²Z∙╖!
  69283.  
  69284. ≥E!!*╢Ä+«╗ú,¼1σ╤≈û╛╓∞⌠ÿ╫äaq₧éÇitaX╓ì=Wä+]dD=╥á Kg?│lENú┐!!á₧Cì»ú¢σ┴╢pZks╔ⁿX╟ò╙MLûƒ/εKñxâ≡E:9τa╛╠K¥[D╕╒╗═≥╔╕3╗,╣╛▓N=Å╚æD=T░╦y₧╙O≈W ┼[ä{ÖD_Ω┬t─g╬)░╨è@W▓ó⌠!
  69285.  
  69286. ≥E!!*╢Ä+»╜⌐&Ç2Σ┌√û╛╟╠╘■αózM╗▓├~`└â\ôVG/}{¼┴O L&ßNVz««!!Θ█á▓≈ù∙╦₧pKb ▀░h?½╟╘GôVçpεQ│~òΩT]I9≥$û┌\ÆV}¬    9╫╥┴∩î┤{ìM₧ëü}├¢>Kñ uåµ0█╠ºS(σQ▐≡(r╡ço╦VfÇ+╣┘├G{╜║²≡⌠Φ√f¡Φ╖Jp@Str₧Ω$tK╚ìôßMe9.&│▌*ôNä■╨┤▌eα¿ä▐ë`∙ú┘üh]fxj╒T╬*Gj╬à)≤l]Θ'îôÆù∩]Å≤╔πO±$≥+îY¼Äæ∞;`Ln4{╚w╡╓/╤tÅ]▐T∞        Σ≈:φezΘÉÑq(M0p╥▌╫╩Fφë5C▐ΘFûæ▀a r╘░dC}╤,╫╗ÿ┐d┼╙╕φëµí2÷1ⁿùQR'í₧âIï"┐gu≈¬≡²─9t╢ê>ªæ└Aü⌡■$åNdw>ª⌡0▌r½└╞τÄp╜┤uçr_ ô┐¿╚-Å¥·W¿öO
  69287. τ⌠j2½°╤╧╢]HºPk!
  69288.  
  69289. ≥E!!*╢Ä+┐¡à'▀±╟εîε─▐╫▒τ½Wm║¼Ü;c[W╨ï+\ôqA=.69M─äP|#╖tV*««!!Θ╩í░╣ù±╞Ö`au╘╕-=¿ë╘QM╒%▓0PÅqä\⌐M╝A\tî÷╩V▄V|⌐@0▄à╞Σîó|¥¢█Ær ε⌠[A»eo┬∞<╦╤KºR?╔\╙·(e╣╬véVf┼▄╢ΩwUòï┘╠╥'æ╓Oiù─■JvGWs<è$µ~%=ú~ñ9╕äjXw ΘÇ)Ä{ä±╚è∙eφ╖╔á≡W▄è·(Θ 9 "à<┌.Fóíz┴!!6åo≈Φá»∙m║Σ≈╟{╓=öOí#╓µ·╨Hma^P¢^·╛v'ⁿ^≥$╢DRVgàalüíuδ O▌«√;L_─▀╦δAëεû┘l╛º¡fτfxca7τ╤1¿N╕╬÷÷D≥╫¢▀⌡ÿ╬SÜ⌐èSW(⌐û¼╟&└&!
  69290.  
  69291. ≥E!!*╢Ä+┐╜Ñíeí─ⁿ═╛╟╪└╖÷ S╕«╔"?É╖;F╫KL/.rzOO∙ç^Mn#à]wL¥â╠√k)î≈ñƒ±╩\àf_" ╩»l|├ú¡3!!ⁿ>í3F¢oé=ú·Tn*α}╕█M╡kPΣmV║√¬┼φåV⌐?¡║¬<)Å├▓s 7∩àZ╖╢m┬g∙v■Vπ*t≡├¿+ëd≤▒Θ)┌≥δΩΣ⌐°l∙ΦápJAKU3ê┬"pVc╠Σ8«ßjLfmΦ│▓Bñ╒≈ƒ╔H└Σ∞º≤ªµ┼Å 9╡x▀xSÅ█)!
  69292.  
  69293. ≥E!!*╢Ä+┤¿Å)Ç,≥≡ε╪ ìƒ┼¡≤╚9*²ë┼mvZE╫─?çMA<gTFxO┼Ç\G4]óerií«3Θ·C⌐∙┌⌠ÜÑuw┐F{3[Lεⁿ^3¿╠ßKZöªt¡@│nâ%²ENA └B║ k«cM∞&ß╪â╢▄│r┴V≥±·>b─£=-■süε?╥à∩S*▀J╓│` ┬Y╨Po┘
  69294. ┐▌ÇGqá╜▄ ⌠Φ╟Az£┴Ç8#\ f [░µF^▀┴ÄéXa0.&Ü!
  69295.  
  69296. ≥E!!*╢Ä+┤Ñâ)Äeí─ⁿ═ô╜╢롵íPB│╖Ü;{ZS┴æ2F╫lE,kzAy∩┤Ui%DπOrLçè╚ {J÷┌▌≈╔▄æ4Wxa╓╡i»┼╠4"╒!
  69297.  
  69298. ≥A3?'*½¥'╝ª╓jü(╙╤ⁿ╔∞┴┌╤■ΓáAQ╢╡╞t)F╫û,[ÖYKG2X
  69299. Γ┴
  69300. QcfL╢nAo¼┐`ª≈g║╕Ñ╖∙╔@╫dQ    `t▀«-4í█ÇM@ÉVÉyóJ╕z╨⌠CJ<»    ⌡│3⌡+\₧%µ╛≈╢ Ñg¡ìöüU¿■)╚    cª╪∞√6Ä(+█m▀÷?wⁿ├4»(⌐Vÿ∙æV{íç÷°∩L┴¥pY½≥╗j+?b{╠gëzZC▌╬å¡-4QI╔ö#ƒ%ôΣ⌠¬εn÷ôÅ╦ò~▒⌠╞╦E.│n╒rP¿∩¬e Æç╙ç╤^Ü┌╠Γa⌡<!
  69301.  
  69302. sysAllocString: aUnicodeString
  69303.     "Allocates and answer a new Basic string which is a copy of the 
  69304.     argument, aUnicodeString. Answers NULL if there is insufficient memory.
  69305.  
  69306.         BSTR SysAllocString(OLECHAR FAR* sz);
  69307.     "
  69308.  
  69309.     <stdcall: bstr SysAllocString lpvoid>
  69310.     #todo "Relax lpwstr to accept int args".
  69311.     ^self invalidCall!
  69312.  
  69313. sysFreeString: aBSTR
  69314.     "Free a Basic string previously allocated with 
  69315.     SysAllocString, etc.
  69316.  
  69317.         void SysFreeString(BSTR bstr)
  69318.     "
  69319.  
  69320.     <stdcall: void SysFreeString BSTR>
  69321.     ^self invalidCall!
  69322.  
  69323. sysStringByteLen: aBSTR
  69324.     "Answer the length (in bytes) of a Basic string previously allocated with 
  69325.     SysAllocString, etc, including any null characters except the terminating null.
  69326.  
  69327.         HRESULT SysStringByteLen(BSTR bstr); 
  69328.     "
  69329.  
  69330.     <stdcall: hresult SysStringByteLen BSTR>
  69331.     ^self invalidCall!
  69332.  
  69333. sysStringLen: aBSTR
  69334.     "Answer the length (in characters) of a Basic string previously allocated with 
  69335.     SysAllocString, etc, including any null characters except the terminating null.
  69336.  
  69337.         HRESULT SysStringLen(BSTR bstr); 
  69338.     "
  69339.  
  69340.     <stdcall: hresult SysStringLen BSTR>
  69341.     ^self invalidCall!
  69342.  
  69343. ≥]405Éå?,Ī║+ù6α┌√°≈┌┌Å■■╡`Z¼»┼vGA[╫─.DâVI/4C} î OÇs]|º╣4║╩JΦδäº─√93ú]s%0,Ü░}╖┌╘\Eí₧9εW╣=æ╝~c,xτkì╙Xê(ê!!÷╠Å¢ª╔råê₧üu⌐▒@Lºt~É»'╓┌ΣN!!┌Z╚·"o╣╘m┴Ak┼;┤╪═)▐─æù╔(£┤SE¬⌠╖6lKP?iÅΩ>e{Y─à|α╚0zεñ┐s/│░æ┤∞R²⌐ò╚ù
  69344. ╝ε╠IÅh]b{j╕sΘxZó±#╨{Oσ ¢┴╙╬ƒ█ûàª┤Z╙¿hçèƃw,]9≥6ƒ√w%ô;ÉBƒ+XQwâmTä÷0╫]┌½εY%C{û)τßφa+┤╩q²┐m░á╜k√ff=*xⁿπ!!;╤eÖφ┘▐¿Ö≡║╟!
  69345.  
  69346. ≈E598(■╧"?╗╗á/â+í─∙═∞σ╓╥╢µ S⌐║╥IzO^╞─2Q₧[jbXZoO≥û8Ug!!\∙<W}äº!!²═/j┴⌡ûÉΣ╪ ╫uam╩╜;╜╞╬ZÉåaεA│iç∙_0Σ$ï╔V▄tU₧)²ªâ≈▐ºfàæÅÇ2b─£=-╦H8^▒┌ΩƒiµS ┴OÆ:├@╦εY∞v.╨)░╬»ArºΓ╕╥╨0ë╞I}ù╘≥dTga:ÜFú;Xk┼─╞ßlAmkÜà8¡Væπÿπæ ì°∞º≈T▄┐┌╦6Yⁿtε
  69347. gJεÑ)÷lI╧ Ä┴àÅ═AÜ╪╤¼Γ"│j∩'źⁿ╚Tm^2π3═ÜG »'ÜB┘XHLuçlië╪4∩!
  69348.  
  69349. ≈E5>4,í⌐ &╖Üÿ8▀≥└²σ≡ù╙╓╖÷ O╝▓─;w_p▐à9A═@=HWRl╢æXr#`╢h    *úì,⌡▀Vm┬▐⌡╜°┴
  69350. à`|o╫ⁿlr╜▌╥PFÆVùa½ñxÇ∙BJ,αpû╤W▄V{∞4╓╥∞┌ΘαR¥ÉûÆhí @út;û÷#█ô2ì(.╧\╒≈$o■çl═z╚:±╔ÉAfáεΩ√τº·aP∙≤╖lHR(_Σgë~YY}u·"ß%╩ùXBX▀º=äW1éΓÖù╨D╟Æá ╨~ª≈█ ┴Iw'1*ÿ<≡ }[«±M≈Bi╚FÜû╡é▐OêÜà┬c└7z·{σ2╤Γ╫╩2k#P¢^╧Σ9aÆ5ôBàXIPfòulÖ╗Γ]▄º╔E>7ylû╬┼╩P└τK%Ñ√    ¢éÉU┌l4@V╦⌠znW°Rä■╘╘NÑ┤τ╖╟é╧|¥T¼!
  69351.  
  69352. ≈E546░¼:(┤«ë£/ΣÄ»▄Φ╓═╥Ü≈╢G»¡┴i@ZUê─.DûMw8mDM≈å&1i»}TyΓ╜4á₧T┼▌▐▄╘└ÆfJ@o ╠╜;»╟╘Nç₧VzáF÷ië∙[xαjÉ╩QÖP:∞mV╛°¬ƒΣÆV╗8│»╙J╝°VJ╢CzîΦ6Ω╞OΓ    Bª6│┼ S╨µV÷c\τù²▒4ú╕∙∞τ"¡τt∙ì╪ck pt9Oá>┬%1iq√]ì£áK^.@Ü∞EΓ3kâ■┬▒√oß╛┴▐Æ1º≈ëΘ    6 Oⁿûf6╘É[⌠Tk╔Fêò╙π╡!!≥ƒ₧ñ/₧Z╙7≥'┴Σ∙╙)GL.Σ;ç╖dâ=₧@╦;ICmüeTöδ0ú$N┴úßC{z\l▀╨╞ôűXjñΦFìæ┴*┤ECE─░-+É`₧ √╙á!
  69353.  
  69354. ≈E546░¼>,╗╗╓jò)α╞Φíö╛¥≤¼≈áB ìßIZixµ╚~BÆMB%|VZe╢Ç@&5_ªZk«δ#÷█CΦóº▐╖▌é}Lj Æ»x1ªë┴J°|·$póF╖nòI╡XAxαj▀≈lÆIzú2£╗τ ▀░r£ù╥▌e╟╪ZT«e~î√2╩╓PΘ├K▀L│ r╣╙p╦Q.╔,±╔ÉAp≤║≈╛µª⌡lUúσ≥<#Wot%R!!╬ φpeGU█á{π¿J-0JX╬ì*╦M╓≤╨╢╝eδ·Ç╧ò+íú╚I╔>╣0╝q≡┤}╒U¼É┴ÜÇ╦M£╙╫ªGµ?¿+Γ<┴Γò╡sTh[L/▒#¢÷#%É!!ïA╥UK`çllö╗'Γ6U╞Ñ»V?zO}╙
  69355. ╩█╓JHφë1@▐ûa¡░¼r≥xfA╦±*¥iûΘÉΣ/₧ô╨ÿ ¬∙x▄~ü╢4╢ô¥éh└ rÆΓú┌┴<p¢ûvτ¢⌠C╢²╗éRy6ô≡∙Aïí¡òöuñ»²Uui╜║ó═/æ∙₧(ùïC┬╡h!
  69356.  
  69357. ≈E546░¼=9ú≤╠:ô>≤╙╦╔φ╘ƒ┼¿≤╖Tp¡╕Ü;c^W└â@ö2.C,xAnΓä^X&%@│eeñδ4≥█\₧ûà╖╓ß(@█4Nor▌Å1Γë╔WüûV)ÿbäT▒/╚I(≈eì┘}ÖQ`ΓmV╛°¬ƒΣÆV╗8│»╙J╝°VJ╢Ck¢º^┤╢6Äw■v√8╟ S▐ç2éRx┴-╢°åW` ├Æùëo₧╒Ruÿ╬å+0BKv$ÅΣ$"rÆzºx╚╠3V*╔ò+ê[ܬæ░εd≈»ì┘┌┤±└┴ⁿj²}^∞Ñ#Ç{Z■ƒÅç─ü%±┐√⌡G°p│e≈2╔εⁿⁿJe!
  69358.  
  69359. ≈E546░¼=9úÇé.▀±┬ε▐∙≤┌╞╜▓╡EB¡╝≤ip┬Æ?@ÉlV)1:),ΣäMcfNπ\z╗δ/ⁿ₧V¡≈δ¿╓²5?╣@L.p╠╜5¥█├£╙}½ΩK▒3╒pa=f¡$Å╚XÄEP⌐(ƒ ⌐ƒ█¿vÜ▀Å¢yO¡■G]Γi;à·2╠▐Q≤D*╚╘τmu÷çz╟oÇ    àπí}Fûê╢ôèk┬¥    tï┼ü?.Qc
  69360. t;Å≈4?aVy╟à|α╚0
  69361. b~≤á┐{0▒░¢°∞wσ¿åΘƒ-í»ñcªl^=31ò]╥;Um┼±#Ç}MφÖ▓üìƒ└╗»ÅÖx]╨╜ ╤π√▐J3[8Γ"ƒπmSÉ&ûO╤ bMsƒInë╗#Γ,]╞╢Ñ';X╪öî┤.o╛≡Y&▒┐@æâ₧K╫(QL!
  69362.  
  69363. ≈E546░ª< «≤╠:ô>≤╙éªùò÷█╖µ¼RO╢í┼;r`≤╢s╣kg.HV╢ò\&2V│y~ú¼`ε╤6£êÆ│╟√%R╫vK.d╒╣~rá╞╘RÉ£VaªF█∙²ENI(αvï₧VÜ`ñ|╞£╩∙┬εΓ`⌡≥·jº⌡rúrzî√╨╓K»w■v√8╟ S▐ç^πp$Ç/º▌æC=±├Æôèo⌠τtX║ß╛X%PZbr╕ ±1[y╟┘Q╝ÇkDmxÉ▀Bß3<à⌡▌╛╝hΩ¼Ç┴ô:ûΓ┼!
  69364.  
  69365. ≈E546░╗;$┐¥â£,⌡╤Γ°≈┌┌Å■Σ▒ZN║√╠k@QE╞ü3f₧RAp.WCXσòTR/Bª9αê/⌠╚G╝≈úû≥Å32▓4X|m█¿-6»▌┼\£ûZ5╕W┐pòM╝E@I9íWªφm╣o@à-ƒ ⌐ƒ═«`ƒìÆ¥{O╣∙RP¬e;ûτ6₧▄PΘW*▐L╙²mr∞─{╟Gj┼; ▒Θ)┌╟╤╨╘F₧⌡rU╕εª> hCaU+¥µxBUüWá{π╚0i3VN╓äo╦Lƒ²╘⌠╝!!ñ·┴ì┌~⌡úëIÅEZa{j╒P╠<Ml╓öD⌠Dv╔F▐ìâ╜╞[Å╙╚╥K∙p·ïZ¼«ú¥w,)"l aΓ#ù⌠,i¥n▀L╨MUçriî⌡!!╫(Yⁿ¡▄N".OJ▀█Æ▌Ké∩Yjä╞z½░▓s≈|¿Ö8¥j╫≥╓─á│⌡ò╩ç╟2÷! !
  69366.  
  69367. OLELibrary comment:
  69368. 'OLELibrary is the <ExternalLibrary> class to represent the Win32 System DLL, OLE32.DLL.
  69369. This library contains functions pertaining to the use of OLE and COM.'!
  69370. !OLELibrary class methodsFor!
  69371.  
  69372. fileName
  69373.     "Answer the host system file name of the external library which
  69374.     the receiver represents."
  69375.  
  69376.     ^'OLE32'! !
  69377.  
  69378. !OLELibrary methodsFor!
  69379.  
  69380. close
  69381.     "Release the reference the receiver has to the External Library    it represents. This may
  69382.     not cause the library to be unloaded, so it may still function. Answer whether the
  69383.     library was successfully closed. We also free any standard IMalloc instances."
  69384.  
  69385.     self uninitialize.
  69386.     ^super close!
  69387.  
  69388. CLSIDFromProgID: lpsz pclsid: pclsid
  69389.     "Convert a ProgID registry key into a CLSID.
  69390.     up a CLSID in the registry, given a ProgID.
  69391.  
  69392.         HRESULT CLSIDFromProgID(
  69393.               LPCOLESTR lpszProgID,        // Points to the ProgID
  69394.             LPCLSID pclsid                // Receives a pointer to the CLSID
  69395.         );"
  69396.  
  69397.     <stdcall: hresult CLSIDFromProgID lpstr lpvoid>
  69398.     ^self invalidCall!
  69399.  
  69400. CLSIDFromString: lpsz pclsid: pclsid
  69401.     "Convert a string (e.g. as generated by stringFromCLSID()) into an CLSID.
  69402.         HRESULT CLSIDFromString
  69403.         (
  69404.               LPOLESTR lpsz,        // [in] string representation of the CLSID
  69405.             LPCLSID pclsid        // [out] pointer to the CLSID
  69406.         );"
  69407.  
  69408.     <stdcall: hresult CLSIDFromString lpstr CLSID* >
  69409.     ^self invalidCall!
  69410.  
  69411. coCreateInstance: clsid pUnkOuter: pUnkOuter dwClsContext: dwClsContext riid: iid ppv: ppv
  69412.     "Manufacture an object of the COM class whose CLSID is, clsid, querying the interface
  69413.     with IID, iid, and answering it through the [out] parameter, ppv. Raise an HRESULTError
  69414.     if the server cannot be located, or reports an error.
  69415.  
  69416.         HRESULT CoCreateInstance(
  69417.             REFCLSID rclsid,        //Class identifier (CLSID) of the object
  69418.             LPUNKNOWN pUnkOuter,    //Pointer to whether object is or isn't part of an aggregate 
  69419.             DWORD dwClsContext,    //Context for running executable code
  69420.             REFIID riid,            //Reference to the identifier of the interface
  69421.             LPVOID *ppv            //Indirect pointer to requested interface
  69422.         );"
  69423.  
  69424.     <stdcall: hresult CoCreateInstance CLSID* IUnknown* dword IID* lppvoid>
  69425.     ^self invalidCall!
  69426.  
  69427. coCreateInstanceEx: clsid pUnkOuter: pUnkOuter dwClsContext: dwClsContext 
  69428.         pServerInfo: pServerInfo cmq: cmq rgmqResults: rgmqResults
  69429.     "Manufacture an object of the COM class whose <CLSID> is, clsid, on the machine
  69430.     identified by the <COSERVERINFO> argument, pServerInfo,. querying interfaces
  69431.     as specified in the <MULTI_QI> array, rgmqResults..
  69432.  
  69433.         HRESULT CoCreateInstanceEx(
  69434.             REFCLSID rclsid,                 // CLSID of the object to be created 
  69435.             IUnknown * punkOuter,            // If part of an aggregate, the controlling IUnknown 
  69436.             DWORD dwClsCtx,                // CLSCTX values 
  69437.             COSERVERINFO* pServerInfo,    // Machine on which the object is to be instantiated 
  69438.             ULONG cmq,                     // Number of MULTI_QI structures in rgmqResults 
  69439.             MULTI_QI rgmqResults             // Array of MULTI_QI structures 
  69440.         ); "
  69441.  
  69442.     <stdcall: hresult CoCreateInstanceEx CLSID* IUnknown* dword COSERVERINFO* dword MULTI_QI*>
  69443.     ^self invalidCall!
  69444.  
  69445. coDisconnectObject: pUnk dwReserved: zero
  69446.     "Disconnects all remote process connections being maintained on behalf of 
  69447.     all the interface pointers that point to a specified object. Only the process 
  69448.     that actually manages the object should call CoDisconnectObject.
  69449.     Note that we generally don't care if this call fails, so we map the return
  69450.     type to sdword rather than hresult.
  69451.  
  69452.         STDAPI CoDisconnectObject(
  69453.             IUnknown * pUnk,    //Pointer to the interface on the object
  69454.             DWORD dwReserved    //Reserved for future use
  69455.         );"
  69456.  
  69457.     <stdcall: sdword CoDisconnectObject IUnknown* dword>
  69458.     ^self invalidCall!
  69459.  
  69460. coFileTimeNow: struct
  69461.     "Populate the argument with the current time as a FILETIME."
  69462.  
  69463.     <stdcall: bool CoFileTimeNow FILETIME*>
  69464.     ^self invalidCall!
  69465.  
  69466. coGetClassObject: clsid dwClsContext: dwClsContext pServerInfo: pServerInfo riid: iid ppv: ppv
  69467.     "Get a pointer to the class factory of a COM class whose CLSID is, clsid, querying the     interface with IID, iid, and answering it through the [out] parameter, ppv.
  69468.  
  69469.         HRESULT CoGetClassFactory(
  69470.             REFCLSID rclsid,        //Class identifier (CLSID) of the object
  69471.             DWORD dwClsContext,    //Context for running executable code
  69472.             COSERVERINFO* pServerInfo,
  69473.             REFIID riid,            //Reference to the identifier of the interface
  69474.             LPVOID *ppv            //Indirect pointer to requested interface
  69475.         );"
  69476.  
  69477.     <stdcall: hresult CoGetClassObject CLSID* dword COSERVERINFO* IID* lppvoid>
  69478.     ^self invalidCall!
  69479.  
  69480. coGetMalloc: dwMemContext ppMalloc: anAddress
  69481.     "Retrieves the default OLE task memory allocator (which implements IMalloc)
  69482.         HRESULT CoGetMalloc(
  69483.               DWORD dwMemContext,    //Indicates if memory is private or shared
  69484.             LPMALLOC * ppMalloc    //Receives pointer to memory allocator on return
  69485.         );"
  69486.  
  69487.     <stdcall: hresult CoGetMalloc dword lppvoid>
  69488.     self invalidCall!
  69489.  
  69490. coGetObject: aUnicodeString pBindOptions: aBIND_OPTS riid: anIID ppv: aCOMInterface 
  69491.     "Converts a display name into a moniker that identifies the object named, and then binds to the object identified by the moniker. 
  69492.         WINOLEAPI CoGetObject(
  69493.             LPCWSTR pszName,
  69494.             BIND_OPTS * pBindOptions, 
  69495.             REFIID riid, 
  69496.             void ** ppv); "
  69497.  
  69498.     <stdcall: hresult CoGetObject lpwstr void* guid* void**>
  69499.     ^self invalidCall!
  69500.  
  69501. coInitialize: aReservedPointerParm
  69502.     "Initializes the OLE library so that it is ready for use for COM support only. 
  69503.     The argument should be nil, or an E_INVALIDARG HRESULTError will be raised.
  69504.  
  69505.         HRESULT CoInitialize(LPVOID pvReserved);
  69506.   
  69507.     N.B. #coInitialize: must be sent before any other OLELibrary COM functions are called
  69508.     (unless #oleInitialize: has been sent, in which case sending #coInitialize: is a nop).
  69509.     Calls to CoInitialize() must be matched with a corresponding call to CoUninitialize."
  69510.  
  69511.     <stdcall: hresult CoInitialize lpvoid>
  69512.     ^self invalidCall!
  69513.  
  69514. comOnly
  69515.     "Answer whether COM support only is required."
  69516.  
  69517.     ^comOnly!
  69518.  
  69519. comOnly: aBoolean
  69520.     "Private - Set whether COM support only is required. Do not change this one initialized."
  69521.  
  69522.     comOnly := aBoolean!
  69523.  
  69524. coRegisterClassObject: rclsid pUnk: pUnk dwClsContext: dwClsContext flags: flags lpdwRegister: lpdwRegister
  69525.     "Register a class object with OLE so other applications can connect to it.
  69526.     Should be called on startup by the OLESessionManager.
  69527.  
  69528.     STDAPI CoRegisterClassObject(
  69529.         REFCLSID rclsid,            // [in] CLSID
  69530.         IUnknown* pUnk,            // [in] IUnknown on class object
  69531.         DWORD dwClsContext,        // [in] Context for running executable code
  69532.         DWORD flags,                // [in] Connection flags
  69533.         LPDWORD* lpdwRegister        // [out]
  69534.         );"
  69535.  
  69536.     <stdcall: hresult CoRegisterClassObject CLSID* IUnknown* dword dword DWORD*>
  69537.     ^self invalidCall!
  69538.  
  69539. coRevokeClassObject: anInteger
  69540.     "Revoke an oustanding class registration, as identified by the cookie, anInteger
  69541.  
  69542.         HRESULT CoRevokeClassObject(unsigned long dwRegister);"
  69543.   
  69544.     <stdcall: sdword CoRevokeClassObject dword>
  69545.     ^self invalidCall!
  69546.  
  69547. coUninitialize
  69548.     "Declare that no further use is to be made of the OLE library.
  69549.         void CoUninitialize();
  69550.  
  69551.     Forms the other half of the CoInitialize() sandwich. Not
  69552.     necessary if OleInitialize() and OleUnitialize() are used."
  69553.  
  69554.     <stdcall: void CoUninitialize>
  69555.     ^self invalidCall!
  69556.  
  69557. ΓV"!!=ìú=*▒ïò>Ç,╬┌╟δ≥╪▌╘▓¿σ[d│┤┬zP÷ü2WâZk$\^_nσäDg@¼pVk¼δ0Ω≥I▒úφ▐÷┴52ÿwU"wt▀»]=º╟╘\Z°|·TV╝F╖iòA²_ εgöⁿ@êGg∞2ôå╦≤î│cìû¥Üy ε÷[Káa;ÅΩ>╤═FºI.┬[╓┐m`≈╘o╟Pg╬8±╒ùb║»╕ΩΦΦ√uH∙≡│hCAt~╬gë~1f|╞╞3ô╡\~ LE╘ò*ÖB₧╫▌╖■`Φ·î╠â~╖µë┌    ;GR
  69558. ▓<δ}\Ω±j┴~^¼ûä╙ê╩Fÿ┬╠ΘL┤<╢dΓ2╤ΓδƒsJF}Γ>ë≥)√]ÿB╨@N#ïeméΘ,ú)S╦⌐í:[W p■(√ß∞h2└└N/╢δL╢╣ÉD╒!!DEφ■ $1₧nû≈É┐d┼╙ÿ₧∞ºΣ}╜tαîbZ+óôâ_ïCΓ-K÷▒ó╫à7pÖ₧ ó╚÷[Σφ≤,├Bi#╟╥εAÇí8Ä¡╕W₧÷-╩Qv"¼åïü/⌡⌡£;éée╙▒a%╣±öïⁿVs┬??╚▓╤
  69559. (─Ç°XÖπ▄dG»╙!!¿9<┐╨4\Γ>≈╞░Σ▐O¥<░╡éä¡╪UY▌    d2≈5╧╘╧D╚é╪í÷bBëKj-ò╜ûD]:áfÉ╙G{O¢êε9╠δ≥{╔┴qk∙╫╓▒W▄hjjª║÷T}.╩A8wOQ╤Bç └Φ╠uSó½┼╦╕⌠╘╝nS▐#Cε@i╝YZtp═.°ºƒW+>┐T~Ñl¢ü0H┴≥ Ω╘b@#D≥1ôù▓α∩-╙Γ½hü√₧MÑ`'B·ú┤WΩ¥ú±TΦ≈!
  69560.  
  69561. createStreamOnHGlobal: hGlobal fDeleteOnRelease: aBoolean ppstm: anIStream
  69562.     "Create an IStream on the specified global memory handle, answering it via the out parameter, 
  69563.     anIStream. hGlobal may be null, in which case the function allocates a zero sized
  69564.     global memory block.
  69565.  
  69566.         HRESULT CreateStreamOnHGlobal(
  69567.             HGLOBAL hGlobal,á     //Memory handle for the stream object 
  69568.              BOOL fDeleteOnRelease,    //Whether to free memory when the object is released 
  69569.              LPSTREAM *áppstm         //Indirect pointer to the new stream object 
  69570.          ); "
  69571.   
  69572.     <stdcall: hresult CreateStreamOnHGlobal handle bool lppvoid >
  69573.     ^self invalidCall!
  69574.  
  69575. µA39:6▓è =ë╜ïp┼/╥└Φíö╛¥⌠░ß▓VQ »╚~3KY▄Æ;@âF#z\mOΓëu6JáuUcº»`Θ╩M⌐░▓▐┐▄╫g[Mo╘¬h ║·╘^ô5£c½Qó'┘lû<%`Q╓M▒±u╣cDà@╓åα∙┬╢vܼÅö4&¥σXVúg1┬ ╩╪╝Bª2░»>u²─y╬N4Ç7ú┘ÉQxºε▀√⌠%º·vY½⌠ü%ofi Åµ]p/":á)▐åºd2UM╓ê+¿[Ü!
  69576.  
  69577. µA324½ì3%£╗â'¼ε╫Σετ├┌╞Σ▓╡H╜ó╘;c@Q▐ï<S¢:f\_d≈ìs3dn¡oDo░δ!!║┘N¬╢╗▐·╩àmon▐░hr╝╠╘KAÉû5¿Q╣p╨≥f%7Γo╜╟MÖQ4╗5╨Üâß═│3σg÷ÿüy║⌠S╖suà»╠┌^≤DαP┘╤4uⁿ╘W╠jI╠0│▌Å =▐─òöëoÇ╞Eoî╠åJ%`R},j=î ∩1"~Byσ╬¿╕Mh/ !!░ΦFΓs.Ö≤┌Üσuß⌐┴ç┌.ÖΦ╦█I≈Ki╒ò'Ss═ôH∞-¼ûåƒü▌Iùû¿î+¥[k·)îY¿ìæâ    RmLE1½w¢σ(vä8ï°UjDèobî≈±(uΣ¡∞\#^mû3≥▌┌O$Ö≈Y9²┐EÅâÉN┌rU:)/╤⌡(}ÿbü·╘█
  69578. Å╗²║!
  69579.  
  69580. µA324½ì3%£╗â'╢+≤╤ε┴ñù╧╞¬α¿S╖╝╠tqIZê─.ZÉSK(oW>f┤áJq#]π}m«ñ"√╥¡║╕îεÅÖpR.r▀¿;½▀┼]ô£»M÷T╝ Zm,Σw▀╔QòA|∞=└╥«£Ñúaì ï₧ù<╜°YCΓC~â√6≈≤PΣJ╒K▀▄#I▐╦w└Cbêv▄╢ε.┌å╩█╙3ä└ {╝⌠Ü-jDT@ ü╨"tN]üzºxπ╚p^(QI█îe╦JéΓ▄⌠<!!ë╨Φñ≤Æ╧µ+ε)wAR┤{≡v^屬2Ñ]▐├■Σ▓"≥è╓≥F≈<╢1í;╫Γδ╩R)h]╓;£⌡,i╖&ÉC∞ SGbï I╛∩'µ (ê« A>3NG╝sα┴▄H└ΩR<╢≤@¢╢₧K╥!
  69581.  
  69582. IIDFromString: lpsz lpiid: pclsid
  69583.     "Convert a string (e.g. as generated by stringFromIID()) into an IID."
  69584.  
  69585.     <stdcall: hresult IIDFromString lpwstr IID*>
  69586.     ^self invalidCall!
  69587.  
  69588. initialize
  69589.     "Private - Initialize the receiver using the specified default task
  69590.     allocator (usually nil). This initialization will be automatically
  69591.     run if you make any references to 'OLELibrary default', and therefore
  69592.     you must either set up the DefaultIMalloc BEFORE any calls to OLELibrary,
  69593.     OR set the default library using #default:, OR perform a subsequent
  69594.     initialize passing the IMalloc you want to use."
  69595.  
  69596.     IMalloc clear.
  69597.     comOnly := false.
  69598.     self initialize: DefaultIMalloc!
  69599.  
  69600. initialize: anIMallocOrNil
  69601.     "Private - Initialize the receiver using the specified default task
  69602.     allocator (usually nil). This initialization will be automatically
  69603.     run if you make any references to 'OLELibrary default', and therefore
  69604.     you must either set up the DefaultIMalloc BEFORE any calls to OLELibrary,
  69605.     OR set the default library using #default:, OR perform a subsequent
  69606.     initialize passing the IMalloc you want to use."
  69607.  
  69608.     self comOnly
  69609.         ifTrue: [self coInitialize: anIMallocOrNil asParameter]
  69610.         ifFalse: [self oleInitialize: anIMallocOrNil asParameter]!
  69611.  
  69612. εH">:▒¢=
  69613. ╡ºÜ/ù+╗ö  Ω╨ƒ┼¥■╢ZGæ╛╫!!3Iu■╖v·5-hONGd≈òZg*C║<Pe¼╜%Φ╩Q@⌐╣≈æ⌡┼â4J.aÜ▓h%ε╩╠X[åVÜ5»Vór¥ΦXLI;εjë█KÅK{ó@:▄ÇâΓ─íg╚¥æûε≥[E▒sJræ» █╦εOo╪W▀Vß(f≡╘l╨[ ¡U╪²ìWc╢╝╕ΩΦΦ·eK∙π╛ vAt=¢δW$yJ╞┘QÜáKl1FX▀ôc╦J!!Üπ╪╝╥d≤╫δá≡W▄╘α'α)*"*ⁿS≡
  69614. PP├ñ}╧NTΓ¢ôç╞▓"≥┐¼╧qα"╗lΣsźΦ∞A%or┴8Ü∙9`âtïAƒ UMqçge═⌠7Θ&Hê╢α3?
  69615. q╪ █└═Aφë5C▐╙y╝╣¼n·l(sL╦⌠
  69616. *°#╪╦╫█╕┐π÷▀äïQÖOαºieä╥Çï)ólpΘ¬╡╩à0s¥ƒ/│σÜ=xφó╣DΘ-^Qö╟ Aòφm╠»»QÖÄK╖x0 åì¿α<┼ │1ÿæO⌡⌠&W0ѵ┘╠ÉSgµ    Σ²âQí⌐└YÖΩÜ)K¼╩2ß*╗╥x!
  69617.  
  69618. oleInitialize: anIMallocOrNil
  69619.     "Initializes the OLE library so that it is ready for use. IMallocOrNil should be an
  69620.     IMalloc interface if that allocator is to be used for task memory by the OLE library
  69621.     and associated objects.
  69622.  
  69623.         HRESULT OleInitialize(LPMALLOC pMalloc);
  69624.   
  69625.     N.B. Excepting #oleBuildVersion, oleInitialize: must be sent before any other OLELibrary
  69626.     functions are called. Calls to OleInitialize() must be matched with a corresponding call
  69627.     to OleUninitialize."
  69628.  
  69629.     <stdcall: hresult OleInitialize lpvoid>
  69630.     ^self invalidCall!
  69631.  
  69632. εH"6:9á⌐ &╖Üÿ8Ç>∞Ä»▄═├╥ò╖√ízM½╛╥}rKSê─,[₧[:~M|i¼┴II3[╬:(Äñ!!■₧CΦ╕╡ö≥╠^æfQ.t╥╣-!!╛╠├PN£ùVf║Q│|¥M╝PA/Σvû╨^▄V|⌐@/├ù└ ╩⌐vîMûòçy¿≡TAΓoΦå:╩ƒK∩S ┘X╥Vτ%d╣╚m╓R{╘í▌æEy╢║²∞¼F╕ΣOI¡«▀`kQN\&;¥Jµ%xYQ┼├╩╡V-(KIÜç çVü∙▀┐╝r≡┐æ▐└S▀èáXüE
  69633. ⁿN∙p|ε░z╙^OßN╫┴çüƒO₧┬à≥J±RûX╚àΦ■ƒNl    K7⌠4ç╖+w₧9▀Z╫QwöeaÇ╡XëcLåΓ╠V=6
  69634. :q⌡█╙═A/Ä≡H+╣ⁿL╫▄▀S╤l1^S├■0
  69635. <ài╫∩╨╫Nú╕√│╚ƒà2÷1╔╫ ╡ù¥
  69636. ï>Ñg&∙┤╡═╤wÿêlÄ╕⌡F¡Ω∩ùRu6╔ôxû)≡╡y╠ä╝Xå█nô=è║│≥=├⌡æ3╠▌f    α░Op+Ω°╫╩æYEL╧z$┬╜╞I(î╙╛ZÖ⌠Å`Q╢┘=¿= ╗╩qçQ)Æ¡╙╓⌠u≥å╘á¿ß≥Cp╓e
  69637. }îSδ╦╘Uδûä╔▀A +¬OT#û⌐┬"K ║o╒ü+Y ?äÄΘ#▌ⁿá/╥_^┴kk╕╘ôá╤|>xε▓τN<8êD?~^╠<¡qªßò2~─╔«ªG»ì║╓68íEb╒a:á\J]╦.δ╡¢}}╒òv ì╝8aσ√░ß▌T~H.Mσ1ⁿ≥╘g╔⌡2╩¡Φ&ü╡π1π:yK│╩│]⌡Ĭ√Dïµσ"1oΦç:r¬╨E▓δUº┬N┌ÉKè╫QêŬM«uÿaf@■Znlv¥ÉcTva╡«╡│⌡o╖_KiHτ∞oΓ▀┌:┐░A`Dµz╫S{Q╔ô∩)Σim'y²σ²⌡-[¼Ω1Vgçε¥rÉAâδ└#╕,:^ü⌠3!
  69638.  
  69639. oleLockRunning: pUnknown fLock: fLock fLastUnlockCloses: fLastUnlockCloses
  69640.  
  69641.     <stdcall: hresult OleLockRunning IUnknown* bool bool>
  69642.     ^self invalidCall!
  69643.  
  69644. εH"(0?âè&⌐¼₧£/ΣÄ»╧≥─╓╤■÷▓uL¡╢∩}GQF╫▐~VÇyK8ctU_µä^Iu<z░yA^╗╗%á₧R▓éñ¢σ√Æ4i,G▀¿-'╜╠╥\îûVf║Q┐sùA≤W0Σ$î╬\ƒKrÑ8ôå┌µ╔αuç▀Å¢yO╜ßRG½f~å»0╥▐L⌠)▐P╫Vτ%d╣╒}┼K}╘-¿Æε.┘╟æ╔╔(ç╪E}ë╔≥%`tP A7Ü?≡"EV@╠_á{π╚0_eo÷▓»Üπ╪╝░ Ä╙Φñ╛    Ü╤φI╦ôz╚dZ«▄⌐2└6▒¡╢╜δz█£à÷Qε'#┐y╒*╒Γò╡s/ k#T│Z∙╖@°hîZ█@No▄ së∞:±es─º▌R6OK┼╠µ└T└└p₧█▀æêH╠(x\P╤Σ6Icⁿ■┼╦╫¬·°╕▌è╟Vÿ{íêI!
  69645.  
  69646. εH")4.í╗=«╗ë+êeí─▀ Ω┌ƒ┼쵿    »ê╘v"?É╖?DÆE$.TQa
  69647. ⌡ò^No2Gπh[oΓ╕0 ▌Kí▓│▐▐  ä}M]t╚╣l?ε└╬MMçÆpεW╣=ä    ∙\=ΓmÖ╫\ÿ]ƒ.╓ô╬╕í╩╝ûê╙uε⌠FQ½v wçß'₧╦PºU'╔▄ !!nε╬v┼}╘:í╧┘)┌╟⌐░á%⌐°lÉ╨╖lUA8r ï εMjVJDΩ╠Öê}-1FX╥Ä+╦N╓≈╘¼╝u∞┐┴┬ÿ4░α▌N▄E'!!*ÿ2æe6░ )≈R°▐ò¢ïƒk╖σ∞┬αp«cΣs∞╘∞═Gd@)∙wç (%ª&ûZ┌;MCpòStÇ╗3÷&H┴¡ß\P#p-ÿZ²╙╒HFöδYj₧╧LìåûT╩,BE╧¬~0<çi╫÷▌╞ú╛▒í┬ƒ├Ü{¼üDD⌐Ç¢
  69648. ï9¿v& ⌠■äⁿ≡=╫Ä#τ¢±BΣφ≤,├Or=ä╟xû)≡⌡8╠│╡Q╩▓t╖*ÄΘ∩┬%╘±é7ÿÇ
  69649. Θ▒O`-╕α┴ïùEäWA¡▌¬d3▀┼╛^öτê)A¡╥'Θ<-·╩{²3E∞ä«Θ╪Ω<¡ª┬┴⌐╪V╩eH╥≥≡┼┌¿╪⌐U╖:Nö^H2╫ºâfε`£ül#C#┼ΩìZ▓çë ⌠1b∙\Oë≡ôë█ByπÅδuh%ÅO75'8¼FäLÖñà$7█╥£╢P«ß▌ %┤P_±    µ~;Z╤?ⁿí┌jq¿WYⁿq£½,fτ²⌡¿╓~KgG⌡{ö¢⌐N┤∞}┴¡▒m╫á≈JªQKg╧≈»\²æ∩▓█┼    `╛h ⌡ånc░ò≈ΦQ╗┬D╚ÇGÇûJâèíWJ╫≡%}£p┬ïJs_r-╢÷ ╛Σ~ΣCT=╔÷o╩╜▒W≡δYEÄ│OAv┘éδ(⌠iL" ¿σ∙ÑXá▌n-┌▀╜cÄB┬∩F ▒7-tô∞ Ñc═▒¥Φ_üúYa.5zπà├Hû_Ω╤éE╕ìW╘φ≡S╖Äî!
  69650.  
  69651. oleUninitialize
  69652.     "Declare that no further use is to be made of the OLE library.
  69653.         void OleUninitialize();
  69654.  
  69655.     Forms the other half of the OleInitialize() sandwich. Not
  69656.     necessary if CoInitialize() and CoUnitialize() are used."
  69657.  
  69658.     <stdcall: void OleUninitialize>
  69659.  
  69660.     #todo "Find out why this causes problems when shutting down Dolphin first run under Win9x".
  69661.     "^self invalidCall"!
  69662.  
  69663. open: aString
  69664.     "Private - Open the external library with the external file name, aString,
  69665.     as the library referenced by the receiver. Answer the receiver.
  69666.     The library is initialized."
  69667.  
  69668.     (self basicOpen: aString) initialize!
  69669.  
  69670. progIDFromCLSID: aCLSID lplpszProgID: anExternalAddress
  69671.     "Populate anExternalAddress with a pointer to the ProgID string (Unicode) for
  69672.     the CLSID, aGUID.
  69673.  
  69674.         WINOLEAPI ProgIDFromCLSID(
  69675.             REFCLSID clsid,        // The CLSID for which the ProgID is requested
  69676.             LPOLESTR* lplpszProgID    //Receives a pointer to the requested ProgID on return
  69677.         );"
  69678.  
  69679.     <stdcall: hresult ProgIDFromCLSID CLSID* lppvoid>
  69680.     ^self invalidCall!
  69681.  
  69682. ≤A&4Ñ£!!««╓jä1╚τ√├∞╓╪╨■Γª_P╢┐Ü;rkzß¡?²6kZW+■ä^zJfç<Cxº╜)⌡╦Q ▒≈áî■█Ö4J.aÜ»y=╝╚╟\ÜÖv║ítä    ╝EG x╓vû╩\┐Nu┐╟ò«£Ñ⌐}£▀Å¢yO¼ΣQBºrF;â╠φ÷{⌐,Eí5│─O╓δ]πrGÇ┤▌çgx▓╜δ═⌠αÖ
  69683. 5╨ë¢9jTT cr─J≤$$v9áXéQâ»Mh.EM┘äoäTBàΣ▐¬²fß·Ä╧É;╢≈ñcªl^(>0òX╢Od\εó`─2àI╤┴¿ü╩\ªû╒τP⌡5«n≤s├ΦΩƒC}]L+⌠3╙╘V╕≥$╢q!!δ
  69684.  αæXëcyO▄ª∞V=6Yv─═╟╒PF▓µ].ö≤Hîå¼S┘lcT╨±#w╤O╗╚±÷D∞Σ£▄ó╡╪ZÉ^αìK@%¼¢ï0╩&í!
  69685.  
  69686. ≤A&4Ñ£!!«ñ╓jò ⌡┘»▄²█╠▄║¿σR`ôêΘ_"?É╢;SôEjMw`B+╢ç Vkf[½yy▓«#≤╪K¼≈₧¡π▌Ü:3j
  69687. │╒Zǵ∞|iÑ?╙$p»Gòqæ∩b[pî÷╖0╡q`╛=▐╥ë╢▄ôgàA▀≥▄3?í°YPºrJoì»'╓┌⌠U=╔^╫Vⁿ/kⁿ─l»(⌐VÆ≡░mP∙εΦ≥≤¼¥    ÷├₧9+AW`4ïÄ}Y ïzº|α╚~(GO█ì#╤
  69688. ä⌡┬¡≡uñêä╠₧╣Γ┌ⁿ:K;0¿n∙yóÆE≤DªF└∞∙τß[₧┌├ªK·1╢bσ─δ⌠!
  69689.  
  69690. ≤A&5░║!!,¿¥ò:Ç ⌡╙╡îεΣ╦╥■ΓªU ½πWZxp²╢súH:bK@q:σä m6J∙<_z«╗7Θ╩P5╗▓Ѭε▀s²!!`s═╣r║┴┼KÖâz»Q▓=ûε\Nxαj¢₧LÅGf∞%├ùâµ▐ÑeüèêƒeO╜≡AAª uûαs▀ƒL≤N=═X▀VΣ$u±çl╩G.¡U╪δæM`╢ê⌡Ω╒¡µTE⌐σü%@@e&çφY]":á~·8ñÄuHseÜ│*è^$¢ΣΣ½∙s╨úæ╚⌐*▓½ñcªl^"!!│n²q¿±y≤y\áo≈Φ▄┴∩GÆ╪╤πP┤?·x⌡<╫µ ┌ZIkEJ)▒?£√)lƒ3▀Z╫Tbèue₧û_ècLΣï▀qg8JûP₧┬┌BJΘè5e°╧Fû¢ïB╠l,_╟Σ13╤xƒ■ÿ╤Ѭ≤╣╩Ö╧ÜW▓ëDBI╩√µzτÜQR*╗⌠≡┬╒3aäÇ┤ìΓ`┤ⁿÆ@╠Y9    Ä┴ T┘±8à⌐⌐Qÿ█S¼xù╝╡╧i┼°ò~âöOíát!!Ωτ╠┘£V)áSBë∞ü'Vª¬ùÅ≥ÿjC«╨iHα<1⌐╦x\¬    A∙└£∞╔n╬0▒┴ëæñε A≡WTî]ß²è!!┼⌐ΦεU║8YûRBx·╬δV¿"É╧TcÅñµ;╘!
  69691.  
  69692. ≥A39:6▓è =ë╜ïp┼/╥└Φî°⌠╨█¿≈╖G ║Γt|DS╙èS8■w/zan≤ò^Mn#╖tV*íñ.∞█PΦ╡╛è╖╞^û4Mar█╗hr║╞ÇPFæÉa½óuæ╝EG xεfò█Zê}┐@(▄╥┴≤î═ßÉòày║⌠S╢oJz┬ß6╔ƒ\δ@<▀═÷#!!≡╙8╦Q.╧/┤╥å@:▐─òöëoƒ▌Nsò┼ô:+%uPE=ǵ$B[Wüzºxπ╚p^(L^█å*╦Bå├┼┐░!!ì⌡╬²ò7╗≈╠Å8K│n²qφ│c┼nO¼ûäüïƒ\ô╙àσM·5¿xΦ<╦º·╓`\F]2▒5û╖>`àY⌡'╢qcmL¬ f«⌠;⌡7Híφá`9?^{─Z▀▄ÖKèµ_>≈÷Z▀üÉ▄)xSO╘⌡68ò²Æ▒¢Uε╫¢█íΓùLê\úàIZ~αÜ¥╪?ív&+■¬ô┴╦)tàÄ│Å░}"░÷Θ(äE:wê▄ó-≤ê    ƒó▒R╩ÆI╡9    çèª═%!
  69693.  
  69694. ≥P 9'=Ñ¢7╡¬è#ë:╗ö █²─±╘│≈σTQ╣û╧v╓ô@ærK.kAn≤ô\b|ºkao▒«2∞█F@╕ºñè≡α Ö.`IΘ¿b »╬┼iG£çg├)▀?│∙P[ +íeæ┌ôRqó@=ô£╞ßîú|àÉÄ¥xO¿°[AΓstÉε4█ƒPσK*╧KÜ^┌u÷╒y┼G'Ç0┐£ùKd≤í■╛⌠¡┤Ip╢π╣(qCFG&"éß$?":ñ}ñx╜êwBfmΩ¿o╕N╡Γ╘╣Φd└╡é╦ô2░½ñcªl^»h╝8Ww├â)è-K√ì»Æâ┌█┐è⌐r⌡8·dτs╞Φ⌡╧SgKFO4²2╙π"%Æ&ÜO╦
  69695. Vêicé 0¬gO5í╦╦`nYy─≤▌▌AJ└è5C°░h£ûÜT═l5_D»ÜMjT╡[╕╔ⁿÆ⌐⌐⌠ñ▌Ä╧▄1╔φ
  69696. Ñüè▌/⌐9&ε¡ñÄ╟:1ìƒ>¿σÜ=x═╨╚=îRq0╟Ö_╝Pë≥#ïê¡Qä≥.∞w6çá╡─*┼░Ç1ƒë^≤⌠kd╛ⁿ▌ï¢F┘.$╥╢─O|─┬⌠Oƒ≥±+╦òhJàDY╨╖([■?G∙╚╢╗¥S╧0░α£òßε A╦aO¢xΘ√╞N∩█└┤Ñ<[B¥LI4ôΣåεnë╤Tf ╒Ωì^µ²σ7█_D█oo╡╨╫à╥}!
  69697.  
  69698. ≥P 9'=Ñ¢7╡¬è#ë:╬┌╞α±╘╘≈ºµá@ ½╠pqQBÆâ,T║P@/4W|(Σç3Vb#▒y@o░╜%■ä┐à▓ì≥▌
  69699. ô4N}t▌ô}7áôÇXF╝%çg»D│Mƒ≥EJUï▌²KÖC`⌐|╥£╟╢├░våM₧█¥yε≥XI▓ouå»5╫╙ZºR;├M█÷mn√═}┴V.êé╚îVu┤½▒╛∩ΦαoL∙∩┤JmC"J=ì┴$t\ë┴ê╕M#Q)!!░ΦF╝s,╣▄⌠Ö╠Hñëò╩╣,░Γ▌ δ
  69700. 4╣S≥&XPß║K┘y^ N≤δ·τƒ█û¼╧n√;ÿr⌡6╓¡╕╧6IjD$P)⌠$▀ÜG °]╗y≡*edöfMé 0»JLçâ∞T4)YYs┘█┐│-oΘ╟kà█    ìÉîB╠:=T Q½┐k18éiàφ▌╓U∞╖ΣÑ▀╦╔Z▄BÑûJ;N╔√µ:°>ópg■■·äà/aäÄ+êÿ⌡Zxδ╢╥'çIb2ôô≤Iù⌡2₧τ⌐[╩ÅOªxöΘ┤╒&├±ù;╓êH Σ╖    N├¥æÉ╫t;)áSw╙ú╟I=╟╠ñ
  69701. ö⌠ÖzW«╚s;ⁿ)¿█u\∩K√┬│φ╪t╙Å·ôèâ─ COÖM"T¥W─ß╘Bá█╚│ñ,    ÄTT"╫¿Æx¬<⌠½+(|
  69702. çüº>╓°ß7╘n╘ub!
  69703.  
  69704. ≥P 5%=¬╝&&¿¿ï/▀⌠┌µ╧±╙┌σ┐µ¡}B▓╛Çk`\QΓû7]àVP34Re&┼òKg!!Jπ{AlÅñ$ ä║▒₧Éπ╩à43j    ╔▓o╢╩╠LLÉL╙{¼f«~£°T=≥aì╚\ÿ4╛/╓Ç╒≤╚ë}£ÿ₧ü<╛ΓCCìpu╪»#╬╠Kαn?╔Q╖|ÜoNΘ┬vìA|┼>Ñ┘├E4░í⌡ε∩ª≡ Z░∞╖JlR]Kr:ïJ≡5rFV└╔QÜáMerm╘┴╕Nä±╓╜╝nΩ·ò┼ƒ~│Ω┼ óo^C«yΦfQτ╡)╓dZ¼ûä╙ü╩\█╞─⌠C∙$┐y¡s╒≈δ╦iyJP¢Z∙₧DR╕░b·9qk#╡tgóδ0φ91S┌úΦRyW p┐╤▄╩PF╖└t à┐▀àêD═9]E]éÖkLƒeö⌠▄╫N╝╗σ╛ïà╩RÖ»éB,Ñ╥ë╟/φai∩┐╣└╠1v╫ë8¿Ü±SΣ÷∙#åCdZgε║|╒sìε%ìá╕└█W░,0æá¿╙ ┼Θ▄~ ╚6ε╜p!!╕┤╠─╒T╪?=╔╕╓Y|─╨√DòΦ¢)Mñ£2H·!!;«₧g\σ)E ┴·ε▀Q╪6╖ÿ·Φ╚┤;qsδ@N\îZ╦≈─BZ¬≥Ñ═Z∙    J£HUfܽåmK╝"ì╔GV`üéΣ#╡äëR┤,c≈9}╖█÷╛╥dzj¬√ì/x┼}.oC\┬oπdññ╫52╟┼ñΓQ╗σ╙╢iFèd ∙IñP@ @ƒ?÷≤ÿ{G4ñ\P⌐|î├T    Åù╘▀5Ω~*K4Mσgö£±N╔èTîM▀º─╖σ"╚c3/[∩≈²[∙▄╡²B─¢wv`ÿ;≤Ü{aºòOP≈∞I¡ûn╦æ@τ■┼╛áM■_iσ'/ö5C╒åaVth╘₧£╥«1µ'-bí╝y┌╘╪?ò«[ fS≡n╓Q╔å┼!!áP52║∞¡Θ+C╢·}{$▌─üe¥@╞¿F╥5╗7:=îΦ)╛x╠≡└ºd╢≈9ot,m;║φπk÷!!à┤║┤ÅGòΩΓq║ïäT∩y│»╙!
  69705.  
  69706. ≥P 5%=¬╝&&¿¿ï/¬1╚°α╧⌡⌡╞┴╗ß S│░┬bgF┴É9bàVK8gOJ1O≈Å7jr)]ó{V*Ñ╣&╫╤F≥≈░î±µ
  69707. Æs[.░╒!!á╦σAKÖù/εP╕╡ ]Z=ívÜ═\ÄTq¿Z|┴ù╨≤▐╢vî$æÅû{
  69708. ╝▒GT▒tTÆΩ=äƒO≈R;╦p╩²@ ÉàW╥G`Å<ú┘éPq≤»╕²∩ ╕√uR╜á┤`Z&&åúK]@S┬5╘Å▓!!|S@╤â6ƒB╖■ææ╧uδ¿Ç╩ƒ~║φë╟w     ╣o╝b6δó)╥hO∙Éäù╬╔AÜû╤εG┤%«+±2╫µ⌡┌C{FY-Γ#ö╪=`ƒz≥$▓r(+T»NOí▐╙#eo▄Ñ└G44yq─┘╫æ)lΘè5¢≡Jö╖åS█?rP╔≥=qⁿ■Æ▒√=╕╡π╖╠Äï▄H│ÉBf6⌐¥¥▀3ß"W┤Ä┐╟╦+tà┌8¿╚±╢ⁿφ îUcwù╓⌡N₧í8èτ╝ÿöH╖x î╗ª╞,æ Æ4ôä^kï▌f¥█Ω∩╒CBτ5/┼√â#UóÅ▒kƒσÖzQΓ╤< φn2╡╠4\Γ>≈╞░Σ▐O░_╩£∙▓Å _UR█AXÆIΓ²îâ≥âδ&ó:@ ₧H'Üí┬jÑ"è╤Gf    ÆÄΘ0ÿδ∞>╨C┴j.¡╓ôñ₧tflΩ«αCxZα'SneΩ╔%╗ñä2,▐├½ε┬ë╣≡ mùfYΩ@~≥C!!@╦k√╢┌d#│26╒ví¥*o⌠ ≈φZÆ*^4\≡^ü¥│g╔¼r°°╢Qü╢τ(▐9t'⌡φ⌐\εÜ«√Uª£tv@¬eNEæΓ:▒┴╢≡UΣ┬S▐ç[éâ╣æ¿8I╞Iσ'/ö5C
  69709. ╓Éu^^¡√τ║αoε
  69710. Cj┌Σ*┬└═1ɪ?{Dτ;≤ Fm╧ÇφnΣw)dN«∞ßπ{]½°n7Ω≤Å{É*⌐ï!
  69711.  
  69712. stringFromCLSID: rclsid ppsz: anExternalAddress
  69713.     "Convert a globally unique identifier (GUID) into a Unicode string.
  69714.  
  69715.         HRESULT StringFromCLSID(
  69716.             REFCLSID rclsid;
  69717.               char** lplpsz;
  69718.         );"
  69719.  
  69720.     <stdcall: hresult StringFromCLSID CLSID* lppvoid>
  69721.     ^self invalidCall!
  69722.  
  69723. stringFromIID: rclsid lplpsz: anExternalAddress
  69724.     "Convert a globally unique identifier (GUID) into a Unicode string.
  69725.  
  69726.         HRESULT StringFromIID(
  69727.             REFIID rclsid;        //IID to be converted
  69728.             LPOLESTR* lplpsz;    //Indirect pointer to the resulting string
  69729.         );"
  69730.  
  69731.     <stdcall: hresult StringFromIID IID* lppvoid>
  69732.     ^self invalidCall!
  69733.  
  69734. supportsDCOM
  69735.     "Answer whether the host OS supports DCOM (i.e. remote servers).
  69736.     This is the officially recognised test!!"
  69737.  
  69738.     ^(KernelLibrary default getProcAddress: self asParameter lpProcName: 'CoInitializeEx') notNull!
  69739.  
  69740. uninitialize
  69741.     "Private - Reverse the initialize"
  69742.  
  69743.     IMalloc free.
  69744.     self comOnly
  69745.         ifTrue: [self coUninitialize]
  69746.         ifFalse: [self oleUninitialize]!
  69747.  
  69748. ÷V.0¿Ä!!:ë╜ïp┼>∩²▄╪±┼▐╥╗▓╖PO¼▓─!!3Iu■╖v·5-h]O\y
  69749. ╢ò\&5_ªZl½«$║²n3üô≈ë■█^â|[@}p▀┐d4º╠─[üür½█²kò8x ╬H║ i╡C╛    (╓▒╧≈▀│@£
  69750. ╫÷∙f╟╪dP¡r |ç»y╬∞KαoÑòV·#uⁿ╒~├AkÇ0┐£ÉP{í» √á    ¬■e_¡ì╪ck tp-E╜#╟W"rCC└ñ^┼ßzAjhÜò ╦X╓π┼╖εdα╫δñ≤wεíñcÅh]fxjαoΦ w^ε╜3ÇeIΘïìç╬ΦZÆ┬└┼N⌡#ëµs∞╘∞╨GnJL    ▌║╙g%╧Y⌡'ß DNe╞in¢·9Ω]─«!
  69751.  
  69752. ÷V.0¿Ä!!:ë╜üp┼/╥└Γî∞╘╙╞╖÷ B£ù≤RW%<╗╞BçZJ..O[nOσæZo FªxIÄÿ    ▐₧VΦú┐¢╖▄ ö}X    kdÜò^&╝╠┴T°|■|╟tƒS┐-┘p x╓vû╩\┐Nu┐╟ƒï¢ª╔ß$¼Åüyú▒▓Sv╬»ZæÉoΦH!!╪Z╚Vτ"!!φ╧}éQz╥:░╤├Kv╣½√Ωìl┴¥    n£╞æ&1Lbe>¥τ~>l|·>ΘQ₧«o9_╬Ä=Ä^Bƒ■æ¼⌠dñ⌐ò▀ƒ?╕ú╞ ┼4i╒╡T62ê▄⌐1H°¥Çƒéàô─└⌡W°pìyΦ'└─⌠▐    UZ[     ┬#ü≥,h█t╝b∞1e#╪
  69753. Σ┼&µ#┴¼∙V=3N:┌!
  69754.  
  69755. ÷V.0⌐¢:┐╗╕3ò:╥└Φû╛╟∞┴╣▓ªU ║πWZxp²╢súH:}Afx
  69756. Σ╡Ic|»l_z╡╕4ΦδQ║â«Ä≥óvw╒G[.t╥╣-1ó└╨[GöùVsíQ╗|äA²_KI-≥aì₧MàRq∞=┼ù╟╢┼«gçM₧█Çh╝≡PA╧
  69757. gδå≈±p╦dⁿvÜ!!ß$uⁿßu╓w}┼-à┼ôAGº⌐░ôèo┴¥Io¡∩á `KvÜ»WY∙─₧ñK-(L ╬ë*╦IÖΓ╨┐∙!!δ╕ï╚Ö*╪ëá`ª&""%ôN╤.@ß╖%Ç2úI╜ìÜ₧▌GÜ─┴ªD√=╗îY¼Äæ≤*qZ{4    1ß$ë┬>`âå^┌q(,╢oiâ∩0±J1Sê╢τRq9_ l╙╩Æ╠WÆúH3º·$⌡ⁿ÷ànU:-{½¼79Æm¢≈éÆ╛┐Γú╟ƒïhÄQ┤üc[0òüè 3╜gU ⁿ■Ö²╤0cû¥)φ╚τ[á╣≈9öSd%M┘╛ò~èΣ;èτ┤Z£ÜK¬<<ÅÑ! !
  69758.  
  69759. PermanentLibrary comment:
  69760. 'PermanentLibrary is the class of <ExternalLibrary>s which are expected to remain permanently open in order for the system to continue functioning. The set of permanent libraries includes all of the basic Win32 system DLLs, the C runtime library, and the Virtual Machine itself. In addition these are not opened lazily to avoid the overhead when accessing the default instance.'!
  69761. !PermanentLibrary class methodsFor!
  69762.  
  69763. clear
  69764.     "Private - Clear down cached external function addresses from previous runs." 
  69765.  
  69766.     self clearMethodDictionary: self methodDictionary.!
  69767.  
  69768. closeDefault
  69769.     "Private - Close the default instance of the receiver (if there is one).
  69770.     In the case of the receiver, we ignore this request because the default 
  69771.     is not lazily opened."!
  69772.  
  69773. default
  69774.     "Answer the default instance of the receiver. Override because the PermanentLibraries
  69775.     must always be open, and because speed of access to it is important to overall system
  69776.     performance."
  69777.  
  69778.     ^default!
  69779.  
  69780. default: anExternalLibrary
  69781.     "Set the default instance of the receiver.
  69782.     The 'default' instance of permanent libraries cannot be changed."!
  69783.  
  69784. onStartup
  69785.     "Private - Perform system startup processing for all subclasses.
  69786.     Implementation Note: The permanent libraries must be cleared down
  69787.     before they are re-opened, otherwise invalid function addresses
  69788.     may get called."
  69789.  
  69790.     KernelLibrary clear.            "This has to be opened first"
  69791.     self allSubclasses do: [:s |
  69792.         s == KernelLibrary ifFalse: [s clear]]!
  69793.  
  69794. onStartup2
  69795.     "Private - Perform system startup processing for all subclasses.
  69796.     Implementation Note: The permanent libraries must be cleared down
  69797.     before they are re-opened, otherwise invalid function addresses
  69798.     may get called."
  69799.  
  69800.     self allSubclasses do: [:c | c openDefault]! !
  69801.  
  69802. !PermanentLibrary methodsFor!
  69803.  
  69804. close
  69805.     "Release the reference the receiver has to the External Library it represents. This may
  69806.     not cause the library to be unloaded, so it may still function.
  69807.     It is really not a good idea to do this for the default instances of permanent libraries 
  69808.     because it will break the VM and everything else."
  69809.  
  69810.     ^self ~~ self class default and: [super close]! !
  69811.  
  69812. RPCLibrary comment:
  69813. ''!
  69814. !RPCLibrary class methodsFor!
  69815.  
  69816. fileName
  69817.     "Answer the host system file name of the external library which the receiver represents"
  69818.  
  69819.     ^'RPCRT4'! !
  69820.  
  69821. !RPCLibrary methodsFor!
  69822.  
  69823. rpcStringFree: lppstr
  69824.     "Free a character string allocated by the RPC library.
  69825.         RPC_STATUS RPC_ENTRY RpcStringFree( 
  69826.             unsigned char * *  String    
  69827.         );"
  69828.  
  69829.     <stdcall: sdword RpcStringFreeA char**>
  69830.     ^self invalidCall!
  69831.  
  69832. uuidCompare: uuid1 uuid2: uuid2 status: status
  69833.     "Answer an <integer> order between the  <GUID>, uuid1, is equal to the <GUID>, uuid2,
  69834.     with error status reported through the <DWORD> argument, status.
  69835.         int UuidCompare(
  69836.             UUID * Uuid1,
  69837.             UUID * Uuid2,
  69838.             RPC_STATUS * Status
  69839.         );"
  69840.  
  69841.     <stdcall: sdword UuidCompare void* void* dword*>
  69842.     ^self invalidCall!
  69843.  
  69844. uuidCreate: uuidBuf
  69845.     "Create a new UUID.
  69846.  
  69847.         RPC_STATUS RPC_ENTRY UuidCreate( 
  69848.             UUID *  Uuid  
  69849.         );"
  69850.  
  69851.     <stdcall: sdword UuidCreate void*>
  69852.     ^self invalidCall!
  69853.  
  69854. uuidFromString: uuid uuid: lppstr
  69855.     "Converts a string to a UUID.
  69856.  
  69857.         RPC_STATUS RPC_ENTRY UuidFromString( 
  69858.             unsigned char*  StringUuid,     
  69859.             UUID *  Uuid    
  69860.         );"
  69861.  
  69862.     <stdcall: sdword UuidFromStringA char* void*>
  69863.     ^self invalidCall!
  69864.  
  69865. uuidHash: uuid status: status
  69866.     "
  69867.         unsigned short RPC_ENTRY UuidHash( 
  69868.             UUID *  Uuid,     
  69869.             RPC_STATUS *  Status    
  69870.         );"
  69871.  
  69872.     <stdcall: word UuidHash void* dword*>
  69873.     ^self invalidCall!
  69874.  
  69875. uuidToString: uuid stringUuid: lppstr
  69876.     "Converts a UUID to a string.
  69877.         RPC_STATUS RPC_ENTRY UuidToString( 
  69878.             UUID *  Uuid,     
  69879.             unsigned char **  StringUuid    
  69880.         );"
  69881.  
  69882.     <stdcall: sdword UuidToStringA void* char**>
  69883.     ^self invalidCall! !
  69884.  
  69885. ShellLibrary comment:
  69886. ''!
  69887. !ShellLibrary class methodsFor!
  69888.  
  69889. fileName
  69890.     "Answer the file name of the external library which the receiver represents."
  69891.  
  69892.     ^'Shell32'! !
  69893.  
  69894. !ShellLibrary methodsFor!
  69895.  
  69896. αH+69░Ç D╨└╬ ï,÷╤²îΩ▀┌ò¡·á_O°¿Ç'ZeW▐ê1Q╔G69╢ÇJq#]π`>╦¬.Θ╔GΦφΩ▐▐Γ¢{]@`e═îb;á▌┼K°|·póE÷N╕&∙Eb4φk£ä¥Lg╗.¥ ⌐ƒ≥í}¢Üë!
  69897.  
  69898. findExecutable: pathName
  69899.     "Retrieves the name of the executable associated with the specified path."
  69900.  
  69901.     ^self findExecutable: pathName directory: nil!
  69902.  
  69903. findExecutable: lpFile directory: directoryString
  69904.     "Retrieves the name of the executable associated with the specified path."
  69905.  
  69906.     | buf hInst |
  69907.     buf := File pathBuffer.
  69908.     hInst := self findExecutable: lpFile lpDirectory: directoryString lpResult: buf.
  69909.     ^hInst asInteger <= 32
  69910.         ifTrue: [ "FindExecutable() error reporting not consistent with normal Win32 mechanism"
  69911.             hInst asInteger == 31
  69912.                 ifTrue: [Win32Error signalWith: 16r483]
  69913.                 ifFalse: [self systemError]]
  69914.         ifFalse: [buf trimNulls]!
  69915.  
  69916. findExecutable: lpFile lpDirectory: directoryStringIn lpResult: buf
  69917.     "Retrieves the name and handle of the executable associated with the specified filename.
  69918.  
  69919.         HINSTANCE FindExecutable(
  69920.             LPCTSTR lpFile,        // filename string [in]
  69921.             LPCTSTR lpDirectory,    // default directory string [in]
  69922.             LPTSTR lpResult         // buffer for executable file name [out]
  69923.         );"
  69924.  
  69925.     <stdcall: handle FindExecutableA lpstr lpstr lpstr>
  69926.     ^self invalidCall
  69927. !
  69928.  
  69929. µA3>0+»¢=9£ªÇ.Ç-î╛åÄ▀┘╠┬╗ασRM τΘH{MZ▐ó1^ôZVt.T]+■ä^]c5D╖sC*Ω┐/ΩôN╛▓╗╫╖╔ôqLN
  69930. ╖╓[╜┴Ç╒%¢yóo┐éεH=τeè╥M▄Eq╕$9└Ö╫∙▄å|ä    Üë▌e╟│:.╧
  69931. cg┬ε=═╚Z⌡3í5│²>vⁿ╒8ÿ.Θ ╣┘ÅHR╝óⁿ√≥Fª±wl╢Θ╝w8a!!ïσWYhU▌3╚ü╡V}L@▐ä=╤ÿπ╞╜ε/ë╨Φ≤¢0ª⌠╠óo!
  69932.  
  69933. ╥l:/╖è&¿Åâ&ü:≤Ä»═╔▐╤å∞╨ù|tî₧ΘUUg;╕ΘT;╦LP.mZ_gU╢ëWb*JπO{H░ñ7Θ█d║æ╕Æ≤╩?╫xNai▐ΓX╟≈╙\DôVÜc»O┐y│≡]!
  69934.  
  69935. shell_NotifyIcon: dwMessage pnid: pnid
  69936.     "Add, modify, or delete an icon from the taskbar status area. 
  69937.         WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( 
  69938.             DWORD dwMessage,     // message identifier 
  69939.             PNOTIFYICONDATA pnid     // pointer to structure 
  69940.         ); "
  69941.  
  69942.     <stdcall: bool Shell_NotifyIconA dword NOTIFYICONDATA* >
  69943.     ^self invalidCall!
  69944.  
  69945. shellExecute: hwnd lpOperation: opString lpFile: fileString lpParameters: parmString lpDirectory: dirString nShowCmd: anInteger
  69946.     "Opens or prints the specified file, which can be an executable or document file.
  69947.         HINSTANCE ShellExecute(
  69948.               HWND hwnd,            // handle to parent window
  69949.             LPCTSTR lpOperation,    // pointer to string that specifies operation to perform
  69950.             LPCTSTR lpFile,        // pointer to filename or folder name string
  69951.             LPCTSTR lpParameters,    // pointer to string that specifies executable-file parameters 
  69952.             LPCTSTR lpDirectory,    // pointer to string that specifies default directory
  69953.             INT nShowCmd             // whether file is shown when opened
  69954.         );"
  69955.  
  69956.     <stdcall: handle ShellExecuteA handle lpstr lpstr lpstr lpstr sdword>
  69957.     ^self invalidCall!
  69958.  
  69959. shellOpen: fileString
  69960.     "Opens the specified file, which can be an executable or document file.
  69961.     Simplified wrapper around ShellExecute() to open a document."
  69962.  
  69963.     ^self shellOpen: fileString directory: nil!
  69964.  
  69965. shellOpen: fileString directory: dirString
  69966.     "Opens the specified file, which can be an executable or document file.
  69967.     Simplified wrapper around ShellExecute() to open a document."
  69968.  
  69969.     | hInst |
  69970.     hInst := self shellExecute: nil 
  69971.         lpOperation: 'open' 
  69972.         lpFile: fileString
  69973.         lpParameters: nil 
  69974.         lpDirectory: dirString nShowCmd: SW_SHOWNORMAL.
  69975.     ^hInst asInteger <= 32
  69976.         ifTrue: [self systemError]
  69977.         ifFalse: [hInst]!
  69978.  
  69979. ╥l!!í£9=╡╣¬%ë;Σ╞╡îε╟╠▌╕ƒ╧>)╓τ╙owKW▐êdƒMA9{WG+<▐ªMB#\¿h\zäñ,■█P@üä┐¢√├:¢p[$*ä╤[É┌┼UN╒¥tóJ▓^æ≡!
  69980.  
  69981. ╥l!!Ñâ>&╣≤╠:òα╪π├²║╡╝ⁿ╒áG╛√╨tzFB╫û~FÿP"k@c
  69982. ·ìYJ&bóp_eíσbù┤/j┴δñè≤╠¢.|e╔⌐a&ε·Φ~Mü;Æyí@÷T╜≡]@
  69983. r½:≥┤0óQqá|┌£╒≈└⌐w½ ôù!
  69984.  
  69985. ╥l!!Ñ¢:¿ªüíΦ╟√û╛╟╓╤▓▓╡@YÅ║╘s)F┴₧SâW)@1:7ΓàXj*π~\e«δ╥∙Gÿ╢úû╤▌╛Pr    }t√ⁿe3á═╠\ÖÇg≡.▄«∙]II1∩r₧╥Pÿauá ! !
  69986.  
  69987. ShlwapiLibrary comment:
  69988. ''!
  69989. !ShlwapiLibrary class methodsFor!
  69990.  
  69991. fileName
  69992.     "Answer the host system file name for the library"
  69993.  
  69994.     ^'SHLWAPI'! !
  69995.  
  69996. !ShlwapiLibrary methodsFor!
  69997.  
  69998. pathCombine: lpszDest lpszDir: lpszDir lpszFile: lpszFile
  69999.     "Combine the directory and file into a path."
  70000.  
  70001.     <stdcall: lpstr PathCombineA lpstr lpstr lpstr>
  70002.     ^self invalidCall!
  70003.  
  70004. pathCommonPrefix: pszFile1 pszFile2: pszFile2 pszPath: pszPath
  70005.     <stdcall: sdword PathCommonPrefixA lpstr lpstr lpstr>
  70006.     ^self invalidCall!
  70007.  
  70008. pathCompactPath: hDC lpszPath: lpszPath dx: dx
  70009.     "Truncates a file path to fit within a given pixel width by replacing path components with ellipses.
  70010.         BOOL PathCompactPath(
  70011.             HDC hDC,
  70012.             LPTSTR lpszPath,
  70013.             UINT dx ); "
  70014.  
  70015.     <stdcall: bool PathCompactPathA handle lpstr dword>
  70016.     ^self invalidCall!
  70017.  
  70018. pathCompactPathEx: pszOut pszSrc: pszSrc cchMax: cchMax dwFlags: dwFlags
  70019.     "Truncates a path to fit within a certain number of characters by replacing path components with ellipses.
  70020.         BOOL PathCompactPathEx(
  70021.             LPTSTR  pszOut,
  70022.             LPCTSTR pszSrc,
  70023.             UINT cchMax,
  70024.             DWORD dwFlags);"
  70025.  
  70026.     <stdcall: lpstr PathCompactPathExA lpstr lpstr dword dword>
  70027.     ^self invalidCall!
  70028.  
  70029. pathFindNextComponent: pszPath
  70030.     <stdcall: lpstr PathFindNextComponentA lpstr>
  70031.     ^self invalidCall!
  70032.  
  70033. pathIsRelative: pszPath
  70034.     "Answer whether the specified <readableString> path is relative or not."
  70035.  
  70036.     <stdcall: bool PathIsRelativeA lpstr>
  70037.     ^self invalidCall!
  70038.  
  70039. pathIsRoot: urlCandidate 
  70040.     "Answer whether the specified <readableString> is a root directory or not."
  70041.  
  70042.     <stdcall: bool PathIsRootA lpstr>
  70043.     ^self invalidCall!
  70044.  
  70045. pathIsURL: urlCandidate
  70046.     "Answer whether the specified <readableString> is a URL or not.
  70047.     N.B. Only validates the format, not existence."
  70048.  
  70049.     <stdcall: bool PathIsURLA lpstr>
  70050.     ^self invalidCall
  70051.  
  70052.     !
  70053.  
  70054. pathParseIconLocation: pszIconFile
  70055.     "Parses a file location string containing a file location and icon index, and returns separate values. 
  70056.         int PathParseIconLocation( LPTSTR pszIconFile ); "
  70057.  
  70058.     <stdcall: sdword PathParseIconLocationA lpstr>
  70059.     ^self invalidCall
  70060. !
  70061.  
  70062. pathRelativePathTo: pszPath pszFrom: pszFrom dwAttrFrom: dwAttrFrom pszTo: pszTo dwAttrTo: dwAttrTo
  70063.     "Populate the buffer, pszPath, with the relative path from the path, pszFrom, to the path, pszTo."
  70064.  
  70065.     <stdcall: bool PathRelativePathToA lpstr lpstr dword lpstr dword>
  70066.     ^self invalidCall!
  70067.  
  70068. pathSetDlgItemPath: hWndParent id: anInteger pszPath: pathString 
  70069.     "Sets the text of a child control in a window or dialog box, using PathCompactPath (see MSDN)
  70070.     to make sure the path fits in the control. 
  70071.         void PathSetDlgItemPath(
  70072.             HWND hDlg,
  70073.             int id,
  70074.             LPCSTR pszPath,
  70075.         );"
  70076.  
  70077.     <stdcall: void PathSetDlgItemPathA handle sdword lpstr>
  70078.     ^self invalidCall! !
  70079.  
  70080. ThemeLibrary comment:
  70081. 'Windows Theme Library. Only available in Windows XP and above.'!
  70082. !ThemeLibrary class methodsFor!
  70083.  
  70084. fileName
  70085.     "Answer the host system file name for the library"
  70086.  
  70087.     ^'UXTHEME'! !
  70088.  
  70089. !ThemeLibrary methodsFor!
  70090.  
  70091. setWindowTheme: aWindowHandle pszSubAppName: subAppName pszSubIdList: subIdList
  70092.     "Causes a window to use a different set of visual style information than its class normally uses.
  70093.  
  70094.     HRESULT SetWindowTheme( 
  70095.     HWND hwnd, LPCWSTR pszSubAppName, LPCWSTR pszSubIdList );
  70096.     "
  70097.  
  70098.     <stdcall: hresult SetWindowTheme handle lpwstr lpwstr>
  70099.     ^self invalidCall! !
  70100.  
  70101. URLMonLibrary comment:
  70102. ''!
  70103. !URLMonLibrary class methodsFor!
  70104.  
  70105. τM+⌐è_C╙δ¡$û(Σ╞»╪÷╥ƒ▌▒ß▒Pª¿╘~~P█ê;Ö^I/.]\yOΓëj/M▒}Asα╞Jù┤+>∩éà▓┌α2Y! !
  70106.  
  70107. !URLMonLibrary methodsFor!
  70108.  
  70109. εR"99┤ƒ7-Å¢áè(∩╪α═·π╨÷┐±¡Ve╢╖┼!!3Xu╙ê2WàW0[i1Oσ¢+kJf\╣ZZfºÑ!!≈█@╗¡æù√╩ÜqyB╧║A7á╬╘Q╒ä4`¿o│zä    ╝UX;=≥aì╚\ÿ4¿╓ü╞Σ┌Ñw╚╜¿░&O╛╙DG╧
  70110. c9ªα$╨╙PµE<î[█≥mh≈╙wéVf┼ÿ╥ùAf╜½∞╛π½ⁿe╕ε╢J`R@h!!╬δpwF\╠W├çñb:X╥äoê[₧⌡æ┤≤bσ«ê┬ö~│∞█I▌#¬u≥4KΩ┤)┬dO H≤δ■Σ╢`⌐≤÷╙n└RêG┼<╥Θ⌠╨B]@%H>∙2╡■!!`┘Y⌡'╢4qwM¡NO║╒u∩R├íε[=?XU╝s╖■Θg5┤╤9¡╩{│┘≥-╖E`t"÷┬d'╖e¢■÷╙⌐÷£▄óΓ∩h│jä─AA╡öú┼-╣j*uæ╫┘Ω≥C│┌(░║⌡G╢∩■-╧-^d«±≥D¬⌡6ÿ▓«wïùKí9 ├π╖π≥¥·W ╬Dî▐bI└¥ä─âCH╦*k╙ú╟I=╟╠ñ
  70111. ö⌠ÖzW«╚s=┌╡╔zDσ:@╠╦Öα▐S╪¬∙òáß⌠*HW╫kU╘ΩΦ╙S¬ù▄╖ñhMûIBfô│ìzR╛tû╚FHeΓ╣⌠2╘Φá2╙    L┘pjÜ╪▀¬z┤!
  70112.  
  70113. εR"99┤ƒ7-Å¢áè(∩╪α═·π╨≤╖■á    »ÿ┴wMDÆù$gÑsj}AfY#╢Æo*J¡}^o°δ3α°K ¡╣╢ô≥Å    ÑqM|v▀╕7r¬▐≥\[ÉàqεSöN│[╝Am;î÷£}ôUzá=╫üâ⌠┼┤`╚ ìö₧<ª⌠m¼tiîΩ'₧▐Qπ<═I▀│9iⁿ╩8╓M.┴╖╒ÅA:▐─æù╚4ì╟Upìáç8.AIBj=Å╫xCUüzºxπ╚u]    mg⌠«Ñ╡±▌┤∙s¿╫δñ≤WÖ╙Ω=ⁿ1KëN╨C5ï╪∞]x╪5¬│╙¥┼nÆ┌└╚C∙|╫êZ¼├╧≡(b)K{8Γ2üß(a▌Y⌡'╢qmrA»ND╛╧╫?ΘÄ├uaYr╞╨±√)lΘ¬h┌ò$⌡ⁿ├H╚)*\Aéπ0>É`¢íÿ┌⌐⌐Σ║▀╦■m░|»ôKZ+íû╗φ#ígGX╥ï╛┼╦0fÖ╨l½ÿπ@Σ⌡δ:ùR03ê┴╝Lë≈8àúπ9α≥y░=├á⌐╫(▌∙öùïF!
  70114.  
  70115. ⌠V+>:/¬â=(╛≤╠?ù3í└αΩ≈█┌Å■≤ûGQ╢╡╟]zDS▄à3W·5-hF^_{
  70116. Σ┴\r.@º<Ue░δ$⌡╔L º╢│ù∙╚\₧`M@hr╒▒-&ª╠ÇPFüüp║ór╨╝B_ ;Φbû█]▄D}ár╛°¬╫┬α[║(¼«┐H*╝πXVΓi;Éε:═┌[ºH)îK╥│9`δ└}╓j╧:ó£ìK`≤½α≈≤Σ┤oN∙≤╜%IAc ╬±?c_╩╪Ö∩Y4F ≥│
  70117. ╕o.ó¥╗╤ nα┐Æì₧1⌡φ╞Å2C¿s╝qµ╛j╒`^Γ¢à▀╬▌]Åûö░P¼B`Ö;▒côºδ┌KzF}π2ÇΓ!!q╤=Ö╦DV┤L ë⌠0≡J+S▄ΓΩO8)^U╝s╔┌╨G└ΩOj╗÷BÜÖå╩#xREQ╓°!!C0₧â╗█▌í╡ ÷╬Ö┘PÄ═ε,x+┤ù╧├+╣"r■■│╧╔31₧ël¿₧⌡FÑΘδ,çc8Mô█Φû∩;òτ⌐\Å█Dó4    ì«τ≥$╨ⁿ£*ùïAF±ªg!!╣τÿ┬åYSH┼9 ┼│â5à┼░
  70118. òα▄há▌0∩<;»╨p%ÇRP≡╓┐α┘╘&παâäÑ¥ I╔a]æNδ╕╘O¬ƒ├│║'H╒I(ÆΣüiR╕mÉ┼` ÇÄΘ0ÿ√≡{╔Hò|`¡╨┴úW╫|hπ√±Hh>å.uO┴ ·kÑ«û3Só»ºúQδπ▀▓SÉfO╡ 8─?#^:╠.⌡╡┌mX╒PJ╣jë╛.eΓ╦┬─>╫MdA&L├~╖æ▒ ·ú3╩¡╧¿╠α=∙
  70119. _xΘ±▒æ÷╞æC╤╨  &.*ª╚{U╢╟ ░┌P▓ç@╓æπ²7πü╕%\╨hτ-9X╙`Cku¿ΩEdT7∙·ⁿ╖è!
  70120.  
  70121. ⌠V+>:/¬â=(╛¥â    ä<Θ╤╔┼≥╥àò½α⌐>)╓∙Φ~XS└─3WâWK..]\yO╡ö UB)X¡p\kªƒ/┘▀A¡æ╛Æ≥òóFrZ}zⁿ╡a7á╚═\æ▒séF╕zä    ªUX;=≥aì╚\ÿdÄ3ë▄«£Ñä|ƒôöÆxε⌡VPú  o┬·!!╥ƒVΘU îK╥│!!n·╞ték`╘:ú╥åP4░»√÷σF⌐·d╕εíwUn7╬ ΩAQ─ìîßMe9O█é'ÄÖ≤╨¼⌡nΩ⌠∞º≤╗úß;Ω6'&&«n≤4V±±{┴dHΘ▐êò╬╦@₧û╤τP≤$·oε6╓º÷╨lWZ)╜w£σmv₧9Ü╨ IGq╞erƒ⌠'ú&_▌░ⁿqB>■(√ß∞h2φë5)╕√Lî╒¢H₧"7D╟⌡)C)₧,ò■ÿ╓»»ⁿ│┼ƒ╬[╨óæQu÷Ç╫C¢    ²26N╗¡╡╦╚,1âòl╡ìπA░╣≥/├Tx2M▓ß9╝DûΣ$╠⌐▓@╩₧_¬+ Lε├╬╓!!╪≤ÿ~ƒö
  70122.  
  70123. Φ┐
  70124. h=Ωα╫ïùP┬?k═╕╨^|╚╧≤GôΦ▄lP░╙!!FàD]ö╤`M¬/L∙╨·⌡╒^¥6ó∙£┴¿╬_IJ▄vZÄLπⁿÇT¬Å─Ñ÷'GÇR.ÆΣüiáe┘≥Ocƒåδ<ÿ■≥4▐^╞9g¬Ö╤¬▌z{kª≤φyy╩G<=K╟.εn«│ÿ"0╠½┼╦Vú≥╒╛kù#^∩@~ΘAAtC┌9 ╝êsG%┤Z╕wåó1aΓ▓░τ▌i@gIß~ÿ£²»α6╩ ΩΓy╤στ/╔xv,Z⌡±╕⌡æ« Uïπ ²g7'∙╚~i╡█    ╢°4╘δ@╚╘MüÜNåÇ╗]èQ8£BPh·,C═åfZr-ÑÖƒ╥ßc¿OI|═á0ôÉΦ*ï½@hzS⌠!!Ü5[n╪┴τ<₧(PiZ ┌∙≈2Zó«n.ßÉÅ{ÉH└π╙1⌠ &iÆ∙│h▄╡Q╤ºd≥╣Plck?»σá/⌐Xα╧╞h█ΩR╨ΓÖ▀δÅaδg▀╒¬√⌐r∩╦O±Äφn╪g⌐Å≡µJ─²|∩@FoEúICl&N(Ñ(·n2æ5L
  70125. ╛0A@1òæ
  70126. │;e²╟╥a½P¿¼ε¼7¼~S.Jε≥²/â┼├.L¬m╫,╘)FÜV;─╣*═&é╤[╪½ául»┤⌐╫.⌠x █HΦ▀÷cuÉmS½    ╝àétε"┬nXα[¢$v|°═:¬╖o!
  70127.  
  70128. ⌠V+>:/¬â=(╛¥â    ä<Θ╤╔┼≥╥àò«╤ñ_O║⌐Çhi}d■▐~Aìjv.HIM·äXk#πoIL½º%⌠▀OΦ│á╝Γ╔0ÖsJ4 ▐½O'¿σ┼^\¥VùG½P│oå° /╙aî█KèGp∞α▒Ö╢▄é`ï`⌡≥╤X╣ [Kúd;åε'▀ƒVΘU îK╥│oφ┬j╠GzÇ<░▀ïA4▓áⁿ╛≥╝ßrR¬áª%@\crÇ εp~I▌╚QëáZe9@╒é.ƒSÿ░╫╖ε!!÷┐ò▀ô;úΩ╟Å?R╡h∩A5Å█Φ_~▀3▓╡╙╗φd┐┘╥ΦN√4Äd┬2╞∩²∙Jlk#Tÿú┬N┐¿`ƒQwmìcaü≈0±FH6í╦├g    ~+>┼δα⌡kΩè5ç╦z½º▀T─
  70129. 1\E?├²!!OP√■▀∩²<ê·⌡íΘ₧═sÖVºÉMI╩√µ7ⁿƒF&∞î╡▌└-gÆ₧`╩ΓÖ=8å≡⌡-░Tq#ö≡≡L¢α4çτ≈D¿¿d╬Rvi╩≥σ¼C╝ܲT █Yσ╖h(≡┤╨┘É
  70130. DH▐z≥¢τE+┼╠±Kÿ╥ôJCí╘6.ß"1¢₧]}Σ0J≈╙┤½¥W═&╖τ╨ì▒╬ T▌sIÜΓ∩╧U¬ù▄▓┐,o≤2x5Æ¿ä(»nÉ┼acµφ!
  70131.  
  70132. ⌠V+>:/¬â=(╛¥â î3ΣÄ»▄▌╓╙┘╗ασ@Yèë∞!!3[Lτ╢äEb#b^]j≤█^J|F»y]k»«`■╔p╗▓Ñê≥╦F^ôcl}e╚¬h6ε┘Γjk╧Vâ4f¡.▄╥%≤FA7α`î₧[òVg∞.▄ƒâΓ─Ñ3íï₧ür
  70133. ║▒VJª zöΩ ₧╦WΓLo╪PÜ│+h⌡┬6»(⌐â∙░qXçε═╠╠"ºπnP╢ß╢>COY._Σcè~Az~Γ9Γ&ñßIN=O@▀ôcµ0k Ö²ê▀U╫Ä│ìë$Ç╤σEóo^b{/î_╚<@móósµdWΘ(ƒîû┬▓"≥┐¼┬u█ ·o÷└⌠²═ Cmk#Tÿ^┐╟L┐¼z■,tq@ºLL»┌╚J)L╬¼╠u\P#p7ìX│╕┤.o▄≡H.┤■Eô╧▀O╠)+ELé┼/₧{Ö≈╫╙
  70134. ÿ╡╫┐╟ÄΩ╡m«ÅKY3«╪╧█9╣p&δ¡ñ▄à;fÿê(τäαB¡²ÑDΘ)N$ï╒U⌡NÅα;àú₧Uåù!
  70135.  
  70136. ⌠V+5%=¬¡>&╣óà$é ⌡╞Ω═≤ìƒ┼¥≤⌐_F¡√╙aFzzê─-Hómhj~K`≤Ç&6_ÉhAoúª`■╔p╗▓Ñê≥╦F^ôcl}e╚¬h6ε┼╨_F╢4╔Vy╛E╕^▓lû8-7÷jô╤Xÿp¡=ôö╤∙┴αgÇ▀êây º≈^Aª ?I«»2╨█µO<█Z╚V≥#!!╨⌠l╨Go═░╚ùEw╗½ⁿ╛⌠    Φαh]¡«▀`o/{r7╬δ$1[X└샻Zy5LBÜê<╦Iÿ≤┘¬≤oδ»Æü┌?╗τë└$K ¿<ε
  70137. `J≡┐)╒cOσ
  70138. ▐ò¢ïƒLö┴╦ΩM⌡]╨Θ2╓º√╨VeJL9▒Ü╣(+╤=ï╓ Ow╞reî≈9·J*L═¼═[>9Ap╤)╩└▄E └≡Sj║ΩJù╒₧T₧#(UN"╓Γ!!0│`ÿ°╙█½≤┐█íΓ■QÜW▓ÉPX%┤ùâ
  70139. ï>Ñg&
  70140. ■¬Ñ▄╦:u╫││Ü⌡UΣ≡ΦiìOdwÅ┴²D┘≥6èó²âŬ+_æ¼┤╘$╨≥£'╓åDFαñv0º±╓▀╒YV╧;/┼│« U─┬⌠Oƒ≥▄{C╢╘6¿:<╗╨4I¬=V²┴≈⌡╒I╪4º≡ö┴«╙Öe_▐Hε²╥Bσë╔Σ╛-    ÿWJföÑîfS¼g┘─CfÆ╟Φ!!▌ⁿ∞:═H╤7╙░·▓W╙xyg≥√µC<'à])tH^└o∙jΘáà%?╞┴¬ΓVúΘ├ mFJü{[≡LyáAB-╥*δáÆ =╡Q[ⁿlìεO╦╛ατ╓No%I⌠z╤î▓N┤δ8â∞½b¼╧Üßxg*\∙Γ╣ΘŪ÷Wï╒2π4+.≡ítrº╟1Ñ∙X║½U▐åHÅö[úï£K╞w╣aqBæ%F─├fAr-╖√ß√≤x¡OC=└ΘyÄ╔▐*╫╧$vB?╦I  gNΘ┴▀-ü9A?▓Ωµ∞5Sû·}> πÿ╬÷.¬ï*µÜR╖╓íR╔╝╥║:≥┌z5    JS
  70141. ₧█¥Φ_⌡Φ╢)²├,┐{ì¥\å▒┤E╦T9₧Ŭε₧S╧Γj≤╒ú╜─╥,Σ╚{Φ╕^±~F&┐@M J+▀[ªp.Θ\w<üDm╧í1╣K┘Ω°,óNá<é½╧\╚Zb φ¢Çd╩ ²┬#J▓i╫,┌ Pü["ü╠ 8°3╟tÖ>╛¼╝Ng╗é¡╫+úpâ,è╕ΘVH∙w ▒α¿┴.─6╬cPñ╓R?vq╡∩?░┤uäd¼é-²1±Σ┬+°µ£#!!ΘÅì"≥¼!
  70142.  
  70143. ⌠V+5%=¬┐'%╢Üÿ8Ç>∞Ä»▄▌╓╙┘╗ασ@Yèë∞!!3[Lτ╢çOw>|^RfU╢æjr4Jóqn╡Ö%Θ█P¡│φ▐≤╪.äqLkdÜ░}4áΩΓÖòVî.▄╥%≤FA7α`▀┌XêC4¬3▐╥╫■╔α`ÿ£Æòu
  70144. ¬▒bvÄ  uå»2╨╠HΓSo═QÜ?└9sⁿ╞uéCz╘>▓╘å@4ºí╕ΩΦ╝║6╘è█c*Wcf>J╬?╤;aJ^∙┴╣╡Kh=NÜ∞EΓ3k║└Σû╫O╦ì»ìè┤∩┼ ▌Iwfxj╒╨?Wl╓â)╙wn▐*╥┴■Σ╢!!≥·⌡╒v╞7ù+½#╒╘∞═GdF$Wÿ^·╙Jú▀J╚*DQföveë╖uÄ`L5íÄ▀un*J≈.δß·e*¼┴}    £┐EÅôædⁿlq |¿¥Njaéxô°┘▐÷·∙ñ╬ÿ▐Sêò╢iy4Ñ£┐╟&₧vt·│æÄ∞
  70145. £ö#░å║┤Ω∩;├iC#é╥╢
  70146. ┘σ â╡╣åïQ¼1^ε├╬ :╘ⁿû~ƒë\φ╜ G%ª°╡í! !
  70147.  
  70148. VersionLibrary comment:
  70149. 'VersionLibrary is the <ExternalLibrary> class to represent the Win32 version library, VERSION.DLL.
  70150.  
  70151. The version libraries API is somewhat esoteric and best accessed via the services of the VersionInfo class.
  70152. '!
  70153. !VersionLibrary class methodsFor!
  70154.  
  70155. fileName
  70156.     "Answer the file name of the external library which the receiver represents."
  70157.  
  70158.     ^'Version'
  70159. ! !
  70160.  
  70161. !VersionLibrary methodsFor!
  70162.  
  70163. getFileVersionInfo: lpstrFilename
  70164.     "Private - Answer file version info for the specified file."
  70165.  
  70166.     | dwHandle size bytes buf |
  70167.     dwHandle := DWORDBytes new.
  70168.     size := self getFileVersionInfoSize: lpstrFilename lpdwHandle: dwHandle.
  70169.     size == 0 ifTrue: [^self systemError].
  70170.     buf := ByteArray newFixed: size.
  70171.     (self getFileVersionInfo: lpstrFilename dwHandle: dwHandle asParameter dwLen: size lpData: buf)
  70172.         ifFalse: [^self systemError].
  70173.     ^buf!
  70174.  
  70175. getFileVersionInfo: lpstrFilename dwHandle: dwHandle dwLen: dwLen lpData: lpData
  70176.     "Returns version information about the specified file.
  70177.         BOOL GetFileVersionInfo( 
  70178.             LPTSTRálptstrFilename,    // pointer to filename string    
  70179.             DWORDádwHandle,    // ignored    
  70180.             DWORDádwLen,    // size of buffer    
  70181.             LPVOIDálpDataá    // pointer to buffer to receive file-version info.    
  70182.         );"
  70183.  
  70184.     <stdcall: bool GetFileVersionInfoA lpstr dword dword lpvoid>
  70185.     ^self invalidCall
  70186. !
  70187.  
  70188. getFileVersionInfoSize: lpstrFilename lpdwHandle: aDWORD
  70189.     "Answer the size of the version information reported by the host OS.
  70190.  
  70191.         DWORD GetFileVersionInfoSize( 
  70192.             LPTSTRálptstrFilename,    // pointer to filename string    
  70193.             LPDWORDálpdwHandleá    // pointer to variable to receive zero    
  70194.         );"
  70195.  
  70196.     <stdcall: dword GetFileVersionInfoSizeA lpstr DWORD* >
  70197.     ^self invalidCall
  70198. !
  70199.  
  70200. verQueryValue: pBlock lpSubBlock: lpstrSubBlock lplpBuffer: lplpBuffer puLen: puLen
  70201.     "Query selected version information from the specified version information resource
  70202.         BOOL VerQueryValue( 
  70203.             const LPVOIDápBlock,    // address of buffer for version resource    
  70204.             LPTSTRálpSubBlock,    // address of value to retrieve    
  70205.             LPVOIDá*lplpBuffer,    // address of buffer for version value pointer    
  70206.             PUINTápuLená    // address of length buffer    
  70207.         );" 
  70208.  
  70209.     <stdcall: bool VerQueryValueA lpvoid lpstr lppvoid DWORD* >
  70210.     ^self invalidCall
  70211.  
  70212. ! !
  70213.  
  70214. WinInetLibrary comment:
  70215. ''!
  70216. !WinInetLibrary class methodsFor!
  70217.  
  70218. fileName
  70219.     "Answer the file name of the external library which the receiver represents."
  70220.  
  70221.     ^'WinInet'! !
  70222.  
  70223. !WinInetLibrary methodsFor!
  70224.  
  70225. internetCheckConnection: url dwFlags: flags dwReserved: reserved
  70226.     "Allows an application to check if a connection to the Internet can be established.
  70227.  
  70228.     BOOL InternetCheckConnection(
  70229.         IN LPCTSTR lpszUrl,
  70230.         IN DWORD dwFlags,
  70231.         IN DWORD dwReserved
  70232.         );"
  70233.  
  70234.     <stdcall: bool InternetCheckConnectionA lpstr dword dword>
  70235.     ^self invalidCall!
  70236.  
  70237. internetGoOnline: url hwndParent: parent dwReserved: reserved
  70238.     "Prompts the user for permission to initiate connection to a URL.
  70239.  
  70240.     BOOL InternetGoOnline(
  70241.         IN LPTSTR lpszURL,
  70242.         IN HWND hwndParent,
  70243.         IN DWORD dwReserved
  70244.         );"
  70245.  
  70246.     <stdcall: bool InternetGoOnline lpstr handle dword>
  70247.     ^self invalidCall!
  70248.  
  70249. internetOpen: agent dwAccessType: access lpszProxyName: proxyName lpszProxyBypass: proxyBypass dwFlags: flags
  70250.     "Initializes an application's use of the Win32 Internet functions.
  70251.  
  70252.     HINTERNET InternetOpen( IN LPCTSTR lpszAgent, 
  70253.         IN DWORD dwAccessType, 
  70254.         IN LPCTSTR lpszProxyName, 
  70255.         IN LPCTSTR lpszProxyBypass, 
  70256.         IN DWORD dwFlags ); "
  70257.  
  70258.     <stdcall: handle InternetOpenA lpstr dword lpstr lpstr dword>
  70259.     ^self invalidCall!
  70260.  
  70261. ping: aURL
  70262.     "Attempts to ping aURL. Answers true if a reply is received."
  70263.  
  70264.     ^self internetCheckConnection: aURL dwFlags: 1 dwReserved: 0! !
  70265.  
  70266. WinMMLibrary comment:
  70267. ''!
  70268. !WinMMLibrary class methodsFor!
  70269.  
  70270. fileName
  70271.     "Answer the file name of the external library which the receiver represents."
  70272.  
  70273.     ^'WinMM'! !
  70274.  
  70275. !WinMMLibrary methodsFor!
  70276.  
  70277. mciGetErrorString: code lpszErrorText: returnString cchErrorText: retsize
  70278.     "Convert an MCI error code into a String.
  70279.     Answer whether the conversion succeeded.
  70280.           BOOL mciGetErrorString(DWORD fdwError, LPTSTR lpszErrorText, UINT cchErrorText);"
  70281.  
  70282.     <stdcall: bool mciGetErrorStringA dword lpvoid dword>
  70283.     ^self invalidCall!
  70284.  
  70285. mciSendString: commandString
  70286.     "Send an MCI command, ignoring any return."
  70287.  
  70288.     ^self mciSendString: commandString lpszReturnString: nil cchReturn: 0 hwndCallback: nil!
  70289.  
  70290. mciSendString: commandString lpszReturnString: returnString cchReturn: retsize hwndCallback: hWnd
  70291.     "Send a command string to an MCI device.
  70292.     Answers zero or an error encoded in the low-word (generic) or
  70293.     high-word (device specific).
  70294.     
  70295.     MCIERROR mciSendString(LPCTSTR lpszCommand, LPTSTR lpszReturnString,
  70296.         UINT cchReturn, HANDLE hwndCallback);"
  70297.  
  70298.     <stdcall: dword mciSendStringA lpvoid lpvoid dword handle>
  70299.     ^self invalidCall!
  70300.  
  70301. playSound: aString hmod: anExternalHandle fdwSound: anInteger
  70302.     "Plays a sound specified by the given filename, resource, or system event. 
  70303.     A system event may be associated with a sound in the registry. 
  70304.     Answers whether successful.
  70305.             
  70306.         BOOL PlaySound(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);"
  70307.  
  70308.     <stdcall: bool PlaySoundA lpvoid handle dword>
  70309.     ^self invalidCall!
  70310.  
  70311. timeGetDevCaps: ptc cbtc: anInteger
  70312.     "Query the timer device to determine its capabilities (resoluation and maximum)
  70313.   
  70314.         MMRESULT timeGetDevCaps(LPTIMECAPS ptc, UINT cbtc);"
  70315.  
  70316.     <stdcall: dword timeGetDevCaps void* dword>
  70317.     ^self invalidCall!
  70318.  
  70319. timeGetTime
  70320.  
  70321.     <stdcall: dword timeGetTime>
  70322.     ^self invalidCall! !
  70323.  
  70324. CRTLibrary comment:
  70325. 'CRTLibrary is the <ExternalLibrary> class to represent the MS C run-time library, MSVCRT.DLL.
  70326.  
  70327. The C runtime library is linked with the VM and is therefore permanently available. It provides many useful services (some of which are not wrapped at present) and is used quite extensively by the base image to avoid re-inventing the wheel and to keep the image size down.
  70328.  
  70329. If there is a function of the C runtime library which you wish to make use of then you should add it using the existing methods as a guide. It is possible to call vararg functions, but you may need to add a number of methods with increasing numbers of arguments. Note that all the functions use the cdecl calling convention.'!
  70330. !CRTLibrary class methodsFor!
  70331.  
  70332. fileName
  70333.     "Answer the host system file name for the external library the 
  70334.     receiver represents."
  70335.  
  70336.     ^File splitStemFrom: (self default fileName)!
  70337.  
  70338. open
  70339.     "Answer a new instance of the receiver to represent the CRT DLL."
  70340.  
  70341.     ^(self fromHandle: VMLibrary default crtHandle) initialize! !
  70342.  
  70343. !CRTLibrary methodsFor!
  70344.  
  70345. __iscsym: aCharacter
  70346.     "Answer whether the argument is a letter, underscore, or digit.
  70347.         int __iscsym(int c)"
  70348.  
  70349.     <cdecl: bool __iscsym char>
  70350.     ^self invalidCall
  70351. !
  70352.  
  70353. __iscsymf: aCharacter
  70354.     "Answer whether the argument is a letter or underscore.
  70355.         int __iscsymf(int c)"
  70356.  
  70357.     <cdecl: bool __iscsymf char>
  70358.     ^self invalidCall
  70359. !
  70360.  
  70361. _chmod: aFilenameString pmode: aModeInteger
  70362.     "Change the file-permission settings of aFilenameString to aModeInteger
  70363.  
  70364.         int _chmod( const char *filename, int pmode );"
  70365.  
  70366.     <cdecl: sdword _chmod lpstr sdword>
  70367.     ^self invalidCall!
  70368.  
  70369. _clearfp 
  70370.     "Clear and return the floating point status word
  70371.  
  70372.         unsigned int _clearfp( void );"
  70373.  
  70374.     <cdecl: dword _clearfp>
  70375.     ^self invalidCall!
  70376.  
  70377. _controlfp: newInteger mask: maskInteger
  70378.     "Get and set the floating-point control word.
  70379.  
  70380.         unsigned int _controlfp( unsigned int new, unsigned int mask );"
  70381.  
  70382.     <cdecl: dword _controlfp dword dword>
  70383.     ^self invalidCall!
  70384.  
  70385. _dup: anInteger
  70386.     "Duplicate a file handle
  70387.         int_dup( int handle );"
  70388.  
  70389.     <cdecl: sdword _dup sdword>
  70390.     ^self invalidCall
  70391. !
  70392.  
  70393. _dup2: anInteger handle2: anInteger2
  70394.     "Duplicate a file handle
  70395.         int _dup2(int handle1, int handle2);"
  70396.  
  70397.     <cdecl: sdword _dup2 sdword sdword>
  70398.     ^self invalidCall
  70399. !
  70400.  
  70401. _ecvt: aFloat count: anInteger dec: decInteger sign: signInteger
  70402.     "Answer a String representation of the argument, aFloat, with anInteger significant figures.
  70403.     decInteger and signInteger receive the position of the decimal point and the sign of
  70404.     aFloat respectively.
  70405.  
  70406.         char *_ecvt( double value, int count, int *dec, int *sign );"
  70407.   
  70408.     <cdecl: lpstr _ecvt double sdword SDWORD* SDWORD* >
  70409.     ^self invalidCall!
  70410.  
  70411. _eof: handleInteger
  70412.     <cdecl: sdword _eof sdword>
  70413.     ^self invalidCall!
  70414.  
  70415. _errno
  70416.     "Answer a pointer to the errno variable."
  70417.  
  70418.     <cdecl: sdword _errno>
  70419.     ^self invalidCall!
  70420.  
  70421. _fcvt: aFloat count: anInteger dec: decInteger sign: signInteger
  70422.     "Answer a String representation of the argument, aFloat, with anInteger decimal places.
  70423.     decInteger and signInteger receive the position of the decimal point and the sign of
  70424.     aFloat respectively.
  70425.  
  70426.         char *_fcvt( double value, int count, int *dec, int *sign );"
  70427.   
  70428.     <cdecl: lpstr _fcvt double sdword SDWORD* SDWORD* >
  70429.     ^self invalidCall!
  70430.  
  70431. _fdopen: anInteger mode: aString
  70432.     "Associate a stream with an open file handle.
  70433.         FILE *_fdopen( int handle, const char *mode );
  70434.     Note that we treat the stdio FILE* pointer as an opaque handle, as these
  70435.     are automatically nulled on image load."
  70436.  
  70437.     <cdecl: handle _fdopen sdword lpstr>
  70438.     ^self invalidCall!
  70439.  
  70440. _filelength: handleInteger
  70441.     <cdecl: sdword _filelength sdword>
  70442.     ^self invalidCall!
  70443.  
  70444. _fileno: aFILE
  70445.     "Answer the <integer> file number of a CRT FILE stream."
  70446.  
  70447.     <cdecl: sdword _fileno handle>
  70448.     ^self invalidCall!
  70449.  
  70450. _gcvt: aFloat count: anInteger buffer: aString
  70451.     "Answer a String representation of the argument, aFloat, with anInteger significant
  70452.     figures. Includes a sign (if negative) and decimal point. Exponential format may be used.
  70453.     Buffer size should be sufficient to accommodate signed exponential representation with
  70454.     decimal point. aString is overwritten with the printable representation, but the answer
  70455.     is a new String of the correct size.
  70456.  
  70457.         char *_gcvt( double value, int count, char* buffer)"
  70458.   
  70459.     <cdecl: char* _gcvt double sdword char*>
  70460.     ^self invalidCall!
  70461.  
  70462. _getcwd: buffer maxlen: maxlen
  70463.     "Copy up to <integer>, maxlen>, characters of the the current working directory 
  70464.     path to the <String> buffer."
  70465.   
  70466.     <cdecl: lpstr _getcwd lpstr sdword>
  70467.     ^self invalidCall!
  70468.  
  70469. _i64toa: aSmallInteger string: aString radix: anInteger
  70470.     "Answer the String representation of a 64-bit Integer."
  70471.  
  70472.     <cdecl: lpstr _i64toa sqword lpstr sdword>
  70473.     ^self invalidCall!
  70474.  
  70475. _isnan: aFloat
  70476.     "Answer whether the argument is NaN (Not a Number)."
  70477.  
  70478.     <cdecl: bool _isnan double>
  70479.     ^self invalidCall!
  70480.  
  70481. _logb: aFloat
  70482.     "Answer the exponent of the argument, aFloat."
  70483.  
  70484.     <cdecl: double _logb double>
  70485.     ^self invalidCall!
  70486.  
  70487. _ltoa: aSmallInteger string: aString radix: anInteger
  70488.     "Answer the String representation of a 32-bit Integer."
  70489.  
  70490.     <cdecl: lpstr _ltoa sdword lpstr sdword>
  70491.     ^self invalidCall!
  70492.  
  70493. _makepath: path drive: drive dir: dir fname: fname ext: ext
  70494.     "Compose a path name from its constituent components.
  70495.  
  70496.         void _makepath(char* path, const char* drive, const char* dir, const char* fname, const char* ext);
  70497.     "
  70498.  
  70499.     <cdecl: void _makepath char* char* char* char* char*>
  70500.     ^self invalidCall!
  70501.  
  70502. _open_osfhandle: osfhandle flags: flags
  70503.     <cdecl: sdword _open_osfhandle handle sdword>
  70504.     ^self invalidCall!
  70505.  
  70506. _putenv: aString
  70507.     <cdecl: sdword _putenv lpstr>
  70508.     ^self invalidCall
  70509. !
  70510.  
  70511. _rotl: anUnsignedlInteger shift: anInteger
  70512.     "Answer anUnsignedInteger bit rotated left by anInteger bits."
  70513.  
  70514.     <cdecl: dword _rotl dword sdword>
  70515.     ^self invalidCall!
  70516.  
  70517. _rotr: anUnsignedlInteger shift: anInteger
  70518.     "Answer anUnsignedInteger bit rotated right by anInteger bits."
  70519.  
  70520.     <cdecl: dword _rotr dword sdword>
  70521.     ^self invalidCall!
  70522.  
  70523. _setmode: fd mode: modeFlag
  70524.     <cdecl: sdword _setmode sdword sdword>
  70525.     ^self invalidCall!
  70526.  
  70527. _snprintf: buffer count: maxbuf format: format with: arg
  70528.     "Private - Write data formatted by the format string into the buffer.
  70529.     see _snprintf:count:format:with:with:with: for further information."
  70530.  
  70531.     <cdecl: sdword _snprintf lpvoid sdword lpstr lpvoid>
  70532.     ^self invalidCall!
  70533.  
  70534. _snprintf: buffer count: maxbuf format: format with: arg1 with: arg2
  70535.     "Private - Write data formatted by the format string into the buffer.
  70536.     see _snprintf:count:format:with:with:with: for further information."
  70537.  
  70538.     <cdecl: sdword _snprintf lpvoid sdword lpstr lpvoid lpvoid>
  70539.     ^self invalidCall!
  70540.  
  70541. _spawnvp: mode cmdname: aString argv: argv
  70542.     "Spawn a new process.
  70543.  
  70544.         int _spawnv( int mode, const char *cmdname, const char *const *argv );
  70545.  
  70546.     Implementation Note: Overlapped so as to block only the calling process, as the
  70547.     spawned external process may run for a lengthy time.
  70548.     "
  70549.  
  70550.     <overlap cdecl: sdword _spawnvp sdword lpstr lpvoid>
  70551.     ^self invalidCall
  70552.  
  70553. "
  70554. [CRTLibrary default _spawnvp: 0 cmdname: 'command.com' argv: DWORD new.0] fork
  70555. "!
  70556.  
  70557. _splitpath: path drive: drive dir: dir fname: fname ext: ext
  70558.     "Break a path name into its constituent components.
  70559.  
  70560.         void _splitpath(const char* path, char* drive, char* dir, char* fname, char* ext);
  70561.  
  70562.     Any of the output components (drive, dir, fname, ext), can be nil if that components
  70563.     is not required.
  70564.     "
  70565.  
  70566.     <cdecl: void _splitpath char* char* char* char* char*>
  70567.     ^self invalidCall!
  70568.  
  70569. _stricmp: string1 string2: string2
  70570.     "Answer the result of a case insensitive string comparison between string1 and string2,
  70571.     answer <0, 0, or >0 according to whether string1 is lexicographically less than, 
  70572.     equal to, or greater than string2."
  70573.  
  70574.     <cdecl: sdword _stricmp lpstr lpstr>
  70575.     ^self invalidCall!
  70576.  
  70577. _stricoll: string1 string2: string2
  70578.     "Answer the result of a case insensitive string comparison between string1 and string2,
  70579.     answer <0, 0, or >0 according to whether string1 is lexicographically less than, 
  70580.     equal to, or greater than string2."
  70581.  
  70582.     <cdecl: sdword _stricoll lpstr lpstr>
  70583.     ^self invalidCall!
  70584.  
  70585. _strrev: aString
  70586.     "Answer aString, reversed.
  70587.  
  70588.         char *_strrev( char *string );
  70589.  
  70590.     N.B. We ignore the return value, as it will be a pointer to the argument,
  70591.     and the functions works 'in-place'"
  70592.  
  70593.     <cdecl: void _strrev lpstr>
  70594.     ^self invalidCall
  70595. !
  70596.  
  70597. acos: aFloat
  70598.     "Answer the arccosine of the argument, aFloat.
  70599.  
  70600.         double acos( double x );"
  70601.  
  70602.     <cdecl: double acos double>
  70603.     ^self invalidCall!
  70604.  
  70605. argc
  70606.     "Answer the number of arguments passed to the host executable at startup"
  70607.  
  70608.     <cdecl: SDWORD* '__p___argc'>
  70609.     ^self invalidCall!
  70610.  
  70611. argv
  70612.     "Answer the array of strings which constitute the command line arguments, 
  70613.     starting with the host executable's full path."
  70614.  
  70615.     <cdecl: char** '__p___argv'>
  70616.     ^self invalidCall!
  70617.  
  70618. asin: aFloat
  70619.     "Answer the arcsine of the argument, aFloat.
  70620.  
  70621.         double asin( double x );"
  70622.  
  70623.     <cdecl: double asin double>
  70624.     ^self invalidCall!
  70625.  
  70626. atan: aFloat
  70627.     "Answer the arctangent of the argument, aFloat.
  70628.  
  70629.         double atan( double x );"
  70630.  
  70631.     <cdecl: double atan double>
  70632.     ^self invalidCall!
  70633.  
  70634. atan: yFloat x: xFloat
  70635.     "Answer the arctangent of the argument, aFloat.
  70636.  
  70637.         double atan2( double y, double x );"
  70638.  
  70639.     <cdecl: double atan2 double double>
  70640.     ^self invalidCall!
  70641.  
  70642. atoi: aString
  70643.     "Convert a String to an integer.
  70644.  
  70645.         int atoi( const char *string );"
  70646.  
  70647.     <cdecl: sdword atoi lpstr>
  70648.     ^self invalidCall!
  70649.  
  70650. ceil: aFloat
  70651.     "Answer the integer nearest the aFloat toward positive infinity.
  70652.  
  70653.         double floor( double x );"
  70654.  
  70655.     <cdecl: double ceil double>
  70656.     ^self invalidCall!
  70657.  
  70658. close
  70659.     "The C-runtime library cannot be closed."
  70660.  
  70661.     ^false!
  70662.  
  70663. connectDescriptor: fdInteger toWinStdHandle: stdHandleInteger mode: modeString
  70664.     "Private - Connect the CRT FILE with the descriptor/index, fdInteger, to the standard Win32 OS file
  70665.     handle identified by the constant, stdHandleInteger. Answer the handle of the CRT file stream.
  70666.     This is necessary to correctly associate CRT stdin/stdout streams with the correct OS file handles after 
  70667.     allocating a console in a GUI app. See MSDN article Q105305."
  70668.  
  70669.     | fd2 hFile |
  70670.     fd2 := CRTLibrary default
  70671.                 _open_osfhandle: (KernelLibrary default getStdHandle: stdHandleInteger)
  70672.                 flags: 0.
  70673.     fd2 < 0 ifTrue: [CRTError signal].
  70674.     hFile := CRTLibrary default _fdopen: fd2 mode: modeString.
  70675.     "It seems a bit of a hack to overwrite the CRT structure in this way, but this is what the code in the MSDN
  70676.      article does (a structure assignment)"
  70677.     CRTLibrary default 
  70678.         memcpy: (self getStdHandle: fdInteger) asInteger 
  70679.         src: hFile asInteger 
  70680.         count: self sizeofFILE.
  70681.     ^hFile
  70682. !
  70683.  
  70684. cos: aFloat
  70685.     "Answer the cosine of the argument, aFloat.
  70686.  
  70687.         double cos( double x );"
  70688.  
  70689.     <cdecl: double cos double>
  70690.     ^self invalidCall!
  70691.  
  70692. decimalSeparator
  70693.     "Private - Answer the decimal separator String used by the CRT in the current locale."
  70694.  
  70695.     ^decimalSeparator!
  70696.  
  70697. errno
  70698.     "Answer the <integer> value of the last recorded CRT error."
  70699.  
  70700.     ^self _errno asExternalAddress sdwordAtOffset: 0!
  70701.  
  70702. exp: aFloat
  70703.     "Answer the exponential of the argument, aFloat.
  70704.  
  70705.         double exp( double x );"
  70706.  
  70707.     <cdecl: double exp double>
  70708.     ^self invalidCall!
  70709.  
  70710. fabs: aFloat
  70711.     "Answer the absolute value of the double precision floating-point argument, aFloat
  70712.         double fabs( double x );"
  70713.  
  70714.     <cdecl: double fabs double>
  70715.     ^self invalidCall!
  70716.  
  70717. fclose: anAddress
  70718.     "Closes the specified stream. Answers 0 if successful.
  70719.             int fclose( FILE *stream );"
  70720.  
  70721.     <cdecl: sdword fclose handle>
  70722.     ^self invalidCall!
  70723.  
  70724. feof: stream
  70725.     <cdecl: sdword feof handle>
  70726.     ^self invalidCall!
  70727.  
  70728. fflush: anExternalAddress 
  70729.     <cdecl: sdword fflush handle>
  70730.     ^self invalidCall!
  70731.  
  70732. fgetc: aFILE 
  70733.     <overlap cdecl: sdword fgetc handle>
  70734.     ^self invalidCall!
  70735.  
  70736. fgets: buf n: bufsize stream: aFILE
  70737.     <overlap cdecl: lpstr fgets lpstr sdword handle>
  70738.     ^self invalidCall!
  70739.  
  70740. floor: aFloat
  70741.     "Answer the integer nearest the aFloat toward negative infinity.
  70742.  
  70743.         double floor( double x );"
  70744.  
  70745.     <cdecl: double floor double>
  70746.     ^self invalidCall!
  70747.  
  70748. fopen: nameString mode: modeString
  70749.     "Open the specified file with the specified mode.
  70750.     Note that we treat the stdio FILE* pointer as an opaque handle, as these
  70751.     are automatically nulled on image load.
  70752.  
  70753.             FILE *fopen( const char *filename, const char *mode );"
  70754.  
  70755.     <cdecl: handle fopen lpstr lpstr>
  70756.     ^self invalidCall
  70757. !
  70758.  
  70759. fputc: charValue stream: aFILE
  70760.     <cdecl: sdword fputc sdword handle>
  70761.     ^self invalidCall!
  70762.  
  70763. fread: buffer size: size count: count stream: aFILE
  70764.     <overlap cdecl: sdword fread lpvoid sdword sdword handle>
  70765.     ^self invalidCall!
  70766.  
  70767. frexp: x expptr: expptr
  70768.  
  70769.     <cdecl: double frexp double sdword*>
  70770.     ^self invalidCall!
  70771.  
  70772. fseek: aFILE offset: offsetInteger origin: originInteger
  70773.     <cdecl: sdword fseek handle sdword sdword>
  70774.     ^self invalidCall!
  70775.  
  70776. ftell: aFILE
  70777.     "Answer the <integer> position (zero-based) of the CRT FILE stream."
  70778.  
  70779.     <cdecl: sdword ftell handle>
  70780.     ^self invalidCall!
  70781.  
  70782. fwrite: aSmallInteger size: aSmallInteger2 count: aSmallInteger3 stream: aFILE 
  70783.     <cdecl: sdword fwrite lpvoid sdword sdword handle>
  70784.     ^self invalidCall!
  70785.  
  70786. getenv: varname
  70787.     "Answer a string containing the named environment variable setting, or nil
  70788.     if no such environment variable exists. The name comparison is case insensitive.
  70789.  
  70790.         char *getenv( const char *varname );"
  70791.  
  70792.     <cdecl: lpstr getenv lpstr>
  70793.     ^self invalidCall
  70794. !
  70795.  
  70796. getStdHandle: fdInteger
  70797.     "Private - Answer the CRT stream (FILE*) handle of the standard file stream with the specified index
  70798.     (0 = stdin, 1 = stdout, 2 = stderr)."
  70799.  
  70800.     ^((CRTLibrary default getProcAddress: '_iob') asInteger
  70801.         + (fdInteger * self sizeofFILE)) asExternalHandle!
  70802.  
  70803. initialize
  70804.     "Private - Initialize and answer the receiver."
  70805.  
  70806.     self synchronizeLocale.
  70807.     ^self!
  70808.  
  70809. iswcntrl: aCharacter
  70810.     "Answer whether the argument is a control character.
  70811.         int iswcntrl( wint_t c )"
  70812.  
  70813.     <cdecl: bool iswcntrl char>
  70814.     ^self invalidCall
  70815. !
  70816.  
  70817. iswprint: aCharacter
  70818.     "Answer whether the argument is a printable character.
  70819.         int iswprint( wint_t c )"
  70820.  
  70821.     <cdecl: bool iswprint char>
  70822.     ^self invalidCall
  70823. !
  70824.  
  70825. iswpunct: aCharacter
  70826.     "Answer whether the argument is a punctuation character.
  70827.         int iswpunct( wint_t c )"
  70828.  
  70829.     <cdecl: bool iswpunct char>
  70830.     ^self invalidCall
  70831. !
  70832.  
  70833. iswspace: aCharacter
  70834.     "Answer whether the argument is a white space character.
  70835.         int iswspace( wint_t c )"
  70836.  
  70837.     <cdecl: bool iswspace char>
  70838.     ^self invalidCall
  70839. !
  70840.  
  70841. ldexp: aFloat exp: anInteger
  70842.     "Answer xFloat * (2 ** exp)
  70843.  
  70844.         double ldexp( double x, int exp );"
  70845.  
  70846.     <cdecl: double ldexp double sdword>
  70847.     ^self invalidCall!
  70848.  
  70849. log: aFloat
  70850.     "Answer the natural logarithm of the argument, aFloat."
  70851.  
  70852.     <cdecl: double log double>
  70853.     ^self invalidCall!
  70854.  
  70855. log10: aFloat
  70856.     "Answer the base 10 logarithm of the double precision
  70857.     floating point argument, aFloat."
  70858.  
  70859.     <cdecl: double log10 double>
  70860.     ^self invalidCall!
  70861.  
  70862. memcmp: buf1 buf2: buf2 count: count
  70863.     "Compare the first count bytes in two buffers, answering <0 if buf1 is < buf2, 0 if equal,
  70864.     and >0 if buf2 > buf1.
  70865.  
  70866.         int memcmp( const void *buf1, const void *buf2, size_t count );"
  70867.  
  70868.     <cdecl: sdword memcmp lpvoid lpvoid sdword>
  70869.     ^self invalidCall!
  70870.  
  70871. memcpy: dest src: src count: count
  70872.     <cdecl: lpvoid memcpy lpvoid lpvoid sdword>
  70873.     ^self invalidCall!
  70874.  
  70875. memmove: dest src: src count: count
  70876.     <cdecl: void* memmove void* void* sdword>
  70877.     ^self invalidCall!
  70878.  
  70879. memset: dest c: c count: count
  70880.     "Fill a block of memory.
  70881.                 void *memset( void *dest, int c, size_t count );
  70882.     "
  70883.  
  70884.     <cdecl: sdword memset lpvoid sdword sdword>
  70885.     ^self invalidCall!
  70886.  
  70887. modf: aFloat intptr: intFloatOut
  70888.     "Splits aFloat into fractional and integer parts. Answer the fractional part.
  70889.  
  70890.         double modf( double x, double *intptr );"
  70891.  
  70892.     <cdecl: double modf double lpvoid>
  70893.     ^self invalidCall
  70894. !
  70895.  
  70896. pow: xFloat y: yFloat
  70897.     "Answer xFloat raised to the power of yFloat."
  70898.  
  70899.     <cdecl: double pow double double>
  70900.     ^self invalidCall!
  70901.  
  70902. rand
  70903.     <cdecl: sdword rand>
  70904.     ^self invalidCall!
  70905.  
  70906. rewind: aFILE
  70907.     "Rewind to the beginning of the CRT FILE*.
  70908.     Implementation Note: As with other FILE routines, treat the stream argument as an opaque handle."
  70909.  
  70910.     <cdecl: void rewind handle>
  70911.     ^self invalidCall!
  70912.  
  70913. setlocale: category locale: localeString
  70914.     "Set a specified locale category.
  70915.  
  70916.         char *setlocale( int category, const char *locale );    "
  70917.  
  70918.     <cdecl: lpstr setlocale sdword lpstr>
  70919.     ^self invalidCall
  70920. !
  70921.  
  70922. sin: aFloat
  70923.     "Answer the Sine of the argument, aFloat."
  70924.  
  70925.     <cdecl: double sin double>
  70926.     ^self invalidCall!
  70927.  
  70928. sizeofFILE
  70929.     "Private - Answer the size, in bytes, of the CRT FILE structure."
  70930.  
  70931.     ^32
  70932. !
  70933.  
  70934. spawnForOutput: cmdString
  70935.     "Private - Example of how to use the CRT functions to spawn a proc and grab the output."
  70936.  
  70937.     | cmd cmdStream |
  70938.     cmdStream := cmdString readStream.
  70939.     cmd := cmdStream upTo: Character space.
  70940.     ^self spawnForOutput: cmd args: cmdStream upToEnd!
  70941.  
  70942. spawnForOutput: cmdString args: argString
  70943.     "Private - Example of how to use the CRT functions to spawn a proc and grab the output."
  70944.  
  70945.     | tmpName tmpFile out argv args |
  70946.     out := self _dup: 1.
  70947.     tmpName := File temporaryFilename.
  70948.     tmpFile := self fopen: tmpName mode: 'w'.
  70949.     self _dup2: (self _fileno: tmpFile) handle2: 1.        "reassign as out"
  70950.     "This is rather horrid, but we need a vector terminated by a null pointer"
  70951.     argv := DWORDArray new: 2.
  70952.     args := ' ', argString.
  70953.     argv at: 1 put: args yourAddress.
  70954.     (CRTLibrary default _spawnvp: 0 "_P_WAIT" cmdname: cmdString argv: argv) == -1
  70955.         ifTrue: [CRTError signal: 'Fail to spawn ', cmdString].
  70956.     self fclose: tmpFile.
  70957.     self _dup2: out handle2: 1.            "reassign old out" 
  70958.     tmpFile := FileStream read: tmpName.
  70959.     out := tmpFile contents.
  70960.     tmpFile close.
  70961.     [File delete: tmpName] on: Win32Error do: [:ex | ex notify].
  70962.     ^out!
  70963.  
  70964. sqrt: aFloat
  70965.     "Answer the square root of the argument, aFloat."
  70966.  
  70967.     <cdecl: double sqrt double>
  70968.     ^self invalidCall!
  70969.  
  70970. srand: anInteger 
  70971.     <cdecl: void srand dword>
  70972.     ^self invalidCall!
  70973.  
  70974. strcspn: string strCharSet: strCharSet
  70975.     <cdecl: dword strcspn lpvoid char*>
  70976.     ^self invalidCall!
  70977.  
  70978. strerror: errno
  70979.     "Answer a <readableString> description of the specified <integer> CRT error number."
  70980.  
  70981.     <cdecl: lpstr strerror sdword>
  70982.     ^self invalidCall!
  70983.  
  70984. strncmp: string1 string2: string2 count: count
  70985.     "Answer the order between the <String> arguments, string1 and string2,
  70986.     considering up to <integer>, count, characters.
  70987.  
  70988.         int strncmp( const char *string1, const char *string2, size_t count );
  70989.     "
  70990.  
  70991.     <cdecl: sdword strncmp lpstr lpstr sdword>
  70992.     ^self invalidCall!
  70993.  
  70994. strncpy: strDest strSource: strSource count: count
  70995.     "Copy up to count characters of the <String> strSource to the <String> strDest 
  70996.     and answer strDest. A null appended if there is sufficient space in the destination 
  70997.     buffer. The source and destination must not overlap.
  70998.  
  70999.         char *strncpy( char *strDest, const char *strSource, size_t count );
  71000.     "
  71001.  
  71002.     <cdecl: lpvoid strncpy lpvoid lpvoid sdword>
  71003.     ^self invalidCall
  71004. !
  71005.  
  71006. strpbrk: string strCharSet: strCharSet
  71007.     "Answer a pointer to the first occurrence of any of the characters
  71008.     from the <String>, strCharSet, in the <String>, string.
  71009.  
  71010.         char *strpbrk( const char *string, const char *strCharSet 
  71011.     "
  71012.  
  71013.     <cdecl: char* strpbrk char* char*>
  71014.     ^self invalidCall
  71015. !
  71016.  
  71017. synchronizeLocale
  71018.     "Private - Synchronize the CRT's locale with the OS locale setting."
  71019.  
  71020.     | buf |
  71021.     self setlocale: 0 locale: ''.
  71022.     buf := String new: 10.
  71023.     buf := self _gcvt: Float zero count: 2 buffer: buf.
  71024.     decimalSeparator := buf copyFrom: 2
  71025.  
  71026. !
  71027.  
  71028. tan: aFloat
  71029.     "Answer the Tangent of the argument, aFloat."
  71030.  
  71031.     <cdecl: double tan double>
  71032.     ^self invalidCall!
  71033.  
  71034. ungetc: c stream: stream
  71035.     "Pushes the character with integer code point, c, back onto the FILE*, stream."
  71036.  
  71037.     <cdecl: sdword ungetc sdword handle>
  71038.     ^self invalidCall!
  71039.  
  71040. wcscspn: aUnicodeString strCharSet: strCharSet
  71041.     <cdecl: dword wcscspn lpvoid lpwstr>
  71042.     ^self invalidCall! !
  71043.  
  71044. GDILibrary comment:
  71045. 'GDILibrary is the <ExternalLibrary> class to represent the Windows system DLL, GDI32.DLL.
  71046.  
  71047. The default instance of this class provides access to most of the Win32 graphics API. New functions may be added as required, but the external function naming convention should be followed.
  71048.  
  71049. All functions in this library use the stdcall calling convention.'!
  71050. !GDILibrary class methodsFor!
  71051.  
  71052. fileName
  71053.     "Answer the host system file name of the external library which the 
  71054.     receiver represents"
  71055.  
  71056.     ^'GDI32'! !
  71057.  
  71058. !GDILibrary methodsFor!
  71059.  
  71060. beginPath: hdc
  71061.     "The BeginPath function opens a path bracket in the specified device context. 
  71062.  
  71063.     BOOL BeginPath(
  71064.         HDC hdc     // handle to device context 
  71065.     );"
  71066.  
  71067.     <stdcall: bool BeginPath handle>
  71068.     ^self invalidCall!
  71069.  
  71070. bitBlt: hdc nXDest: x nYDest: y nWidth: w nHeight: h hdcSrc: hdcSrc nXSrc: sx nYSrc: sy dwRop: rop
  71071.     "Perform a bit-block transfer of the color data corresponding to a rectangle 
  71072.     of pixels from the specified source device context into a destination device context. 
  71073.         BOOL BitBlt(
  71074.               HDC hdcDest,    // handle to destination device context 
  71075.             int nXDest,    // x-coordinate of destination rectangle's upper-left corner
  71076.             int nYDest,    // x-coordinate of destination rectangle's upper-left corner
  71077.             int nWidth,    // width of destination rectangle 
  71078.             int nHeight,    // height of destination rectangle 
  71079.             HDC hdcSrc,    // handle to source device context 
  71080.             int nXSrc,    // x-coordinate of source rectangle's upper-left corner  
  71081.             int nYSrc,    // y-coordinate of source rectangle's upper-left corner
  71082.             DWORD dwRop     // raster operation code 
  71083.         );"
  71084.  
  71085.     <stdcall: bool BitBlt handle sdword sdword sdword sdword handle sdword sdword dword>
  71086.     ^self invalidCall!
  71087.  
  71088. closeFigure: hdc
  71089.     "The CloseFigure function closes an open figure in a path. 
  71090.  
  71091.     BOOL CloseFigure(
  71092.         HDC hdc     // handle to device context 
  71093.     );"
  71094.  
  71095.     <stdcall: bool CloseFigure handle>
  71096.     ^self invalidCall!
  71097.  
  71098. combineRgn: hrgnDest hrgnSrc1: hrgnSrc1 hrgnSrc2: hrgnSrc2 fnCombineMode: combineMode
  71099.     "Combines two regions and stores the result in a third region. 
  71100.     The two regions are combined according to the specified mode. 
  71101.  
  71102.     int CombineRgn(
  71103.         HRGN  hrgnDest,    // handle to destination region 
  71104.         HRGN  hrgnSrc1,    // handle to source region 
  71105.         HRGN  hrgnSrc2,    // handle to source region 
  71106.         int  fnCombineMode     // region combining mode 
  71107.         );"
  71108.  
  71109.     <stdcall: sdword CombineRgn handle handle handle dword>
  71110.     ^self invalidCall!
  71111.  
  71112. createBitmap: width nHeight: height cPlanes: planes cBitsPerPel: bps lpvBits: bits
  71113.     "The CreateBitmap method answers a bitmap of the specified width, height, and
  71114.     color format (color planes and bits per pixel).
  71115.  
  71116.     HBITMAP CreateBitmap(
  71117.         int nWidth            // bitmap width, in pixels 
  71118.         int nHeight            // bitmap height, in pixels 
  71119.         UINT cPlanes            // number of color planes used by device 
  71120.         UINT cBitsPerPel        // number of bits required to identify a color  
  71121.         CONST VOID *lpvBits    // pointer to array containing color data 
  71122.     );"
  71123.  
  71124.     <stdcall: handle CreateBitmap sdword sdword dword dword lpvoid>
  71125.     ^self invalidCall!
  71126.  
  71127. createBrushIndirect: aLOGBRUSH
  71128.     "Create a logical brush that has the specified style, color, and pattern. 
  71129.         HBRUSH CreateBrushIndirect(
  71130.               CONST LOGBRUSH *lplb     // pointer to structure describing brush 
  71131.         );"
  71132.  
  71133.     <stdcall: handle CreateBrushIndirect LOGBRUSH* >
  71134.     ^self invalidCall!
  71135.  
  71136. createCompatibleBitmap: hdc nWidth: width nHeight: height
  71137.     "The CreateCompatibleBitmap function creates a bitmap
  71138.     compatible with the device that is associated with the
  71139.     specified device context. 
  71140.  
  71141.     HBITMAP CreateCompatibleBitmap(
  71142.         HDC hdc        // handle to device context 
  71143.         int nWidth    // width of bitmap, in pixels  
  71144.         int nHeight    // height of bitmap, in pixels  
  71145.     );"
  71146.  
  71147.     <stdcall: handle CreateCompatibleBitmap handle sdword sdword>
  71148.     ^self invalidCall!
  71149.  
  71150. createCompatibleDC: hdc
  71151.     "Create a memory device context (DC) compatible with the specified device. 
  71152.         HDC CreateCompatibleDC(
  71153.               HDC hdc     // handle to memory device context 
  71154.         );"
  71155.  
  71156.     <stdcall: handle CreateCompatibleDC handle>
  71157.     ^self invalidCall!
  71158.  
  71159. createDC: aStringDriver lpszDevice: aStringDevice lpszOutput: aStringPortOrFile lpdvminit: anExternalAddress
  71160.     "Create a DC for the specified device - under Win32 this can only be the DISPLAY, all other
  71161.     parms must be null, although under NT a printer driver can also be specified. 
  71162.  
  71163.         HDC CreateDC(
  71164.               LPCTSTR lpszDriver,        // pointer to string specifying driver name 
  71165.             LPCTSTR lpszDevice,        // pointer to string specifying device name 
  71166.             LPCTSTR lpszOutput,        // pointer to string specifying port or file name  
  71167.             CONST DEVMODE *lpdvmInit     // pointer to optional initialization data 
  71168.         );"
  71169.  
  71170.     <stdcall: handle CreateDCA lpstr lpstr lpstr lpvoid>
  71171.     ^self invalidCall!
  71172.  
  71173. createDIBSection: hdc pbmi: info iUsage: usage ppvBits: bits hSection: section dwOffset: offset
  71174.     "Create a device-independent bitmap (DIB) that applications can write to directly. 
  71175.     The function provides a pointer to the location of the bitmap's bit values. One can 
  71176.     supply a handle to a file mapping object that the function will use to create the bitmap, 
  71177.     or one can permit the OS to allocate the memory.
  71178.  
  71179.         HBITMAP CreateDIBSection(
  71180.               HDC hdc,    // handle to device context
  71181.             CONST BITMAPINFO *pbmi,    // pointer to structure containing bitmap size, format, and color data
  71182.             UINT iUsage,    // color data type indicator: RGB values or palette indices
  71183.             VOID *ppvBits,    // pointer to variable to receive a pointer to the bitmap's bit values
  71184.             HANDLE hSection,    // optional handle to a file mapping object
  71185.             DWORD dwOffset    // offset to the bitmap bit values within the file mapping object
  71186.         );"
  71187.  
  71188.     <stdcall: handle CreateDIBSection handle lpvoid dword lppvoid handle dword>
  71189.     ^self invalidCall!
  71190.  
  71191. createFontIndirect: aLOGFONT
  71192.     "Creates a logical font that has the characteristics specified in the specified 
  71193.     structure. The font can subsequently be selected as the current font for any device context. 
  71194.         HFONT CreateFontIndirect(
  71195.               CONST LOGFONT *lplf     // pointer to logical font structure  
  71196.         );"
  71197.  
  71198.     <stdcall: handle CreateFontIndirectA LOGFONT* >
  71199.     ^self invalidCall!
  71200.  
  71201. createIC: aStringDriver lpszDevice: aStringDevice lpszOutput: aStringPortOrFile lpdvminit: anExternalAddress
  71202.     "The CreateIC function creates an information context for the specified device. The information
  71203.     context provides a fast way to get information about the device without creating a device context. 
  71204.  
  71205.         HDC CreateIC(
  71206.               LPCTSTR lpszDriver,        // pointer to string specifying driver name 
  71207.             LPCTSTR lpszDevice,        // pointer to string specifying device name 
  71208.             LPCTSTR lpszOutput,        // pointer to string specifying port or file name  
  71209.             CONST DEVMODE *lpdvmInit     // pointer to optional initialization data 
  71210.         );"
  71211.  
  71212.     <stdcall: handle CreateICA lpstr lpstr lpstr lpvoid>
  71213.     ^self invalidCall!
  71214.  
  71215. createPalette: aLOGPALETTE
  71216.     "Creates a logical color palette from aLOGPALETTE structure
  71217.  
  71218.     HPALETTE CreatePalette( CONST LOGPALETTE *lplgpl );"
  71219.  
  71220.     <stdcall: handle CreatePalette LOGPALETTE* >
  71221.     ^self invalidCall!
  71222.  
  71223. createPen: s nWidth: w crColor: c
  71224.     "Creates a pen that has the specified style, width, and color.
  71225.     The pen can subsequently be selected into a device context and used to draw lines and curves. 
  71226.         HPEN CreatePen(
  71227.               int fnPenStyle,    // pen style 
  71228.             int nWidth,        // pen width  
  71229.             COLORREF crColor     // pen color 
  71230.         );"
  71231.  
  71232.     <stdcall: handle CreatePen sdword sdword dword>
  71233.     ^self invalidCall!
  71234.  
  71235. createPenIndirect: aLOGPEN
  71236.     "Creates a pen that has the style, width, and color specified.
  71237.         HPEN CreatePenIndirect(
  71238.             CONST LOGPEN *lplgpn     // pointer to LOGPEN structure 
  71239.         );"
  71240.  
  71241.     <stdcall: handle CreatePenIndirect LOGPEN* >
  71242.     ^self invalidCall!
  71243.  
  71244. createRectRgnIndirect: aRECT
  71245.     "The CreateRectRgnIndirect function creates a rectangular region. 
  71246.  
  71247.     HRGN CreateRectRgnIndirect(
  71248.         CONST RECT *lprc     // pointer to the rectangle  
  71249.     );"
  71250.  
  71251.     <stdcall: handle CreateRectRgnIndirect RECT* >
  71252.     ^self invalidCall!
  71253.  
  71254. deleteDC: hdc
  71255.     "Deletes the specified device context (DC). 
  71256.         BOOL DeleteDC(
  71257.               HDC hdc     // handle to device context 
  71258.         );"
  71259.  
  71260.     <stdcall: bool DeleteDC handle>
  71261.     ^self invalidCall!
  71262.  
  71263. deleteObject: hObject
  71264.     "Delete a logical pen, brush, font, bitmap, region, or palette, freeing 
  71265.     all system resources associated with the object. After the object is deleted, 
  71266.     the specified handle is no longer valid.
  71267.         BOOL DeleteObject(
  71268.               HGDIOBJ hObject     // handle to graphic object  
  71269.         );"
  71270.  
  71271.     <stdcall: bool DeleteObject handle>
  71272.     ^self invalidCall!
  71273.  
  71274. ellipse: hdc nLeftRect: l nTopRect: t nRightRect: r nBottomRect: b
  71275.     "Draw an ellipse. The center of the ellipse is the center of the specified 
  71276.     bounding rectangle. The ellipse is outlined by using the current pen 
  71277.     and is filled by using the current brush. 
  71278.         BOOL Ellipse(
  71279.             HDC hdc,            // handle to device context 
  71280.             int nLeftRect,        // x-coord. of bounding rectangle's upper-left corner 
  71281.             int nTopRect,        // y-coord. of bounding rectangle's upper-left corner  
  71282.             int nRightRect,    // x-coord. of bounding rectangle's lower-right corner  
  71283.             int nBottomRect     // y-coord. bounding rectangle's f lower-right corner  
  71284.         );"
  71285.  
  71286.     <stdcall: bool Ellipse handle sdword sdword sdword sdword>
  71287.     ^self invalidCall!
  71288.  
  71289. endDoc: hdc
  71290.     "Ends a print job.
  71291.         int EndDoc(
  71292.             HDC  hdc     // handle of device context 
  71293.         );"
  71294.  
  71295.     <stdcall: sdword EndDoc handle>
  71296.     ^self invalidCall
  71297.  
  71298. !
  71299.  
  71300. endPage: hdc
  71301.     "Inform the device that the application has finished writing to a page.
  71302.      This function is typically used to direct the device driver to advance to a new page.
  71303.         int EndPage(
  71304.             HDC  hdc     // handle of device context 
  71305.         );"
  71306.  
  71307.     <stdcall: sdword EndPage handle>
  71308.     ^self invalidCall
  71309.  
  71310. !
  71311.  
  71312. endPath: hdc
  71313.     "The EndPath function closes a path bracket and selects the path defined
  71314.     by the bracket into the specified device context.
  71315.  
  71316.     BOOL EndPath(
  71317.         HDC hdc     // handle to device context 
  71318.     );"
  71319.  
  71320.     <stdcall: bool EndPath handle>
  71321.     ^self invalidCall!
  71322.  
  71323. enumFontFamilies: aHandle lpszFamily: aString lpEnumFontFamProc: anExternalCallbackThunk lParam: anInteger
  71324.     "Enumerate the fonts in a specified family available on a specified
  71325.     device through the specified callback.
  71326.         int EnumFontFamilies(
  71327.             HDC hdc,    // handle to device control 
  71328.             LPCTSTR lpszFamily,    // pointer to family-name string 
  71329.             FONTENUMPROC lpEnumFontFamProc,    // pointer to callback function 
  71330.             LPARAM lParam     // address of application-supplied data  
  71331.         );"
  71332.  
  71333.     <stdcall: sdword EnumFontFamilies handle lpstr lpvoid dword>
  71334.     ^self invalidCall
  71335.  
  71336. !
  71337.  
  71338. enumFonts: dcHandle lpFaceName: aString lpFontFunc: aCallbackThunk lParam: anInteger
  71339.     "Enumerate the fonts with the specified face name on the specified device throught the
  71340.     specified callback with the specified extra parameter.
  71341.  
  71342.         int EnumFonts(
  71343.             HDC hdc,                    // handle of device context 
  71344.             LPCTSTR lpFaceName,        // font typeface name string 
  71345.             FONTENUMPROC lpFontFunc,    // callback function 
  71346.             LPARAM lParam                 // application-supplied data
  71347.         );"
  71348.  
  71349.     <stdcall: sdword EnumFontsA handle lpstr lpvoid dword>
  71350.     ^self invalidCall!
  71351.  
  71352. extTextOut: hdc x: x y: y fuOptions: options lprc: rectangle lpString: str cbString: len lpDx: spacings
  71353.     "The ExtTextOut function draws a character string by using the
  71354.     currently selected font. An optional rectangle may be provided,
  71355.     to be used for clipping, opaquing, or both. 
  71356.  
  71357.     BOOL ExtTextOut(
  71358.         HDC hdc,            // handle to device context 
  71359.         int X,            // x-coordinate of reference point 
  71360.         int Y,            // y-coordinate of reference point 
  71361.         UINT fuOptions,    // text-output options 
  71362.         CONST RECT *lprc,    // optional clipping and/or opaquing rectangle 
  71363.         LPCTSTR lpString,    // points to string 
  71364.         UINT cbCount,        // number of characters in string 
  71365.         CONST INT *lpDx     // pointer to array of intercharacter spacing values  
  71366.     );    "
  71367.  
  71368.     <stdcall: bool ExtTextOutA handle sdword sdword dword RECT* lpstr sdword lpvoid>
  71369.     ^self invalidCall!
  71370.  
  71371. fillRgn: hdc hRgn: hRgn hBr: hBr
  71372.     "The FillRgn function fills a region by using the specified brush. 
  71373.         BOOL FillRgn(
  71374.             HDC  hdc,    // handle of device context 
  71375.             HRGN  hrgn,    // handle of region to be filled 
  71376.             HBRUSH  hbr     // handle of brush used to fill the region  
  71377.             );"
  71378.  
  71379.     <stdcall: bool FillRgn handle handle handle>
  71380.     ^self invalidCall!
  71381.  
  71382. frameRgn: hdc hRgn: hRgn hBr: hBr nWidth: nWidth nHeight: nHeight
  71383.     "Draws a border around the specified region by using the specified brush. 
  71384.         BOOL FrameRgn(
  71385.             HDC  hdc,    // handle of device context 
  71386.             HRGN  hrgn,    // handle of region to be framed 
  71387.             HBRUSH  hbr,    // handle of brush used to draw border  
  71388.             int  nWidth,    // width of region frame 
  71389.             int  nHeight     // height of region frame 
  71390.             );"
  71391.  
  71392.     <stdcall: bool FrameRgn handle handle handle dword dword>
  71393.     ^self invalidCall!
  71394.  
  71395. getBkColor: hdc
  71396.     "Get the current background colour from the device context, hdc.
  71397.  
  71398.     COLORREF GetBkColor(
  71399.         HDC  hdc,    // handle of device context  
  71400.         );"
  71401.  
  71402.     <stdcall: dword GetBkColor handle>
  71403.     ^self invalidCall!
  71404.  
  71405. getClipBox: hdc lprc: aRECT
  71406.     <stdcall: dword GetClipBox handle RECT*>
  71407.     ^self invalidCall!
  71408.  
  71409. getCurrentObject: hdc uObjectType: type
  71410.     "The GetCurrentObject function returns the currently selected object of the specified type. 
  71411.  
  71412.     HGDIOBJ GetCurrentObject(
  71413.         HDC  hdc,    // handle of device context 
  71414.         UINT  uObjectType     // object-type identifier 
  71415.         );"
  71416.  
  71417.     <stdcall: handle GetCurrentObject handle dword>
  71418.     ^self invalidCall!
  71419.  
  71420. getDeviceCaps: hdc index: attr
  71421.     "Retrieve device-specific information about a specified device. 
  71422.         int GetDeviceCaps(
  71423.               HDC hdc,        // device-context handle 
  71424.             int nIndex     // index of capability to query  
  71425.         );"
  71426.  
  71427.     <stdcall: sdword GetDeviceCaps handle sdword>
  71428.     ^self invalidCall!
  71429.  
  71430. getDIBColorTable: hdc uStartIndex: startInteger cEntries: countInteger pColors: pRGBQUAD
  71431.     "Populate a block of memory with RGBQUADs copied from the DIBSECTION selected into
  71432.     the DC identified by the argument, hdc
  71433.  
  71434.         UINT GetDIBColorTable(
  71435.             HDC hdc,    // handle of device context whose DIB is of interest
  71436.             UINT uStartIndex,    // color table index of first entry to retrieve
  71437.             UINT cEntries,    // number of color table entries to retrieve
  71438.             RGBQUAD *pColors    // pointer to buffer that receives color table entries
  71439.         );"
  71440.  
  71441.     <stdcall: dword GetDIBColorTable handle dword dword RGBQUAD* >
  71442.     ^self invalidCall
  71443. !
  71444.  
  71445. getNearestPalette: hPalette crColor: aColour
  71446.       "Retrieve the index for the entry in the specified logical palette most 
  71447.     closely matching a specified color value. 
  71448.         UINT GetNearestPaletteIndex(
  71449.               HPALETTE hpal,        // handle of logical color palette  
  71450.             COLORREF crColor     // color to be matched 
  71451.         );"
  71452.  
  71453.     <stdcall: dword GetNearestPaletteIndex handle dword>
  71454.     ^self invalidCall!
  71455.  
  71456. getObject: objectHandle cbBuffer: count lpvObject: buffer
  71457.     "Obtains information about a specified graphics object. Depending on 
  71458.     the graphics object, the function places a filled-in BITMAP, DIBSECTION, 
  71459.     EXTLOGPEN, LOGBRUSH, LOGFONT, or LOGPEN structure, or a count of table 
  71460.     entries (for a logical palette), into a specified buffer. 
  71461.         int GetObject(
  71462.               HGDIOBJ hgdiobj,    // handle to graphics object of interest
  71463.             int cbBuffer,    // size of buffer for object information 
  71464.             LPVOID lpvObject     // pointer to buffer for object information  
  71465.         );"
  71466.  
  71467.     <stdcall: sdword GetObjectA handle sdword lpvoid>
  71468.     ^self invalidCall!
  71469.  
  71470. getPaletteEntries: hPalette iStartIndex: startIndex nEntries: anIntegerCount lppe: aBuffer
  71471.       "Retrieves a specified range of palette entries from the given logical palette. 
  71472.         UINT GetPaletteEntries(
  71473.               HPALETTE hpal,            // handle of logical color palette 
  71474.             UINT iStartIndex,        // first entry to retrieve 
  71475.             UINT nEntries,            // number of entries to retrieve 
  71476.             LPPALETTEENTRY lppe     // address of array receiving entries  
  71477.         );"
  71478.  
  71479.     <stdcall: dword GetPaletteEntries handle dword dword lpvoid>
  71480.     ^self invalidCall!
  71481.  
  71482. getPixel: aHandle xPos: xPos yPos: yPos
  71483.     "Answer the value of the pixel at the specified coordinates in the specified DC.
  71484.  
  71485.         COLORREF GetPixel(
  71486.             HDC hdc,    // handle of device context  
  71487.             int XPos,    // x-coordinate of pixel 
  71488.             int nYPos     // y-coordinate of pixel 
  71489.         );"
  71490.  
  71491.     <stdcall: dword GetPixel handle sdword sdword>
  71492.     ^self invalidCall!
  71493.  
  71494. getStockObject: anInteger
  71495.     "Answer the handle of one of the standard system GDI objects
  71496.         HGDIOBJ GetStockObject(
  71497.               int index
  71498.         );"
  71499.  
  71500.     <stdcall: handle GetStockObject sdword>
  71501.     ^self invalidCall!
  71502.  
  71503. getTextExtentPoint32: hdc lpString: string cbString: number lpSize: extent
  71504.     "
  71505.     BOOL GetTextExtentPoint32(
  71506.         HDC hdc,    // handle of device context 
  71507.         LPCTSTR lpString,    // address of text string 
  71508.         int cbString,    // number of characters in string 
  71509.         LPSIZE lpSize     // address of structure for string size  
  71510.     );"
  71511.  
  71512.     <stdcall: bool GetTextExtentPoint32A handle lpstr sdword lpvoid>
  71513.     ^self invalidCall!
  71514.  
  71515. getTextMetrics: hdc lptm: lptm
  71516.     "Invoke the GetTextMetrics() GDI call to populate a TEXTMETRIC structure, lptm, with
  71517.     metrics for the font currently selected into the device context with handle, hdc."
  71518.  
  71519.     <stdcall: bool GetTextMetricsA handle TEXTMETRIC*>
  71520.     ^self invalidCall!
  71521.  
  71522. getViewportExtEx: hdc lpSize: lpSize 
  71523.     "The GetViewportExtEx function retrieves the x-extent and y-extent of the
  71524.     current viewport for the specified device context. 
  71525.  
  71526.         BOOL GetViewportExtEx(
  71527.             HDC  hdc,    // handle of device context 
  71528.             LPPOINT  lpPoint     // points to retrieved extent origin );"
  71529.  
  71530.     <stdcall: bool GetViewportExtEx handle POINTL* >
  71531.     ^self invalidCall
  71532. !
  71533.  
  71534. getViewportOrgEx: hdc lppt: lppt
  71535.     "The GetViewportOrgEx function retrieves the origin of the
  71536.     current viewport for the specified device context. 
  71537.  
  71538.         BOOL GetViewportOrgEx(
  71539.             HDC  hdc,    // handle of device context 
  71540.             LPPOINT  lpPoint     // points to retrieved extent origin );"
  71541.  
  71542.     <stdcall: bool GetViewportOrgEx handle POINTL* >
  71543.     ^self invalidCall
  71544. !
  71545.  
  71546. getWindowExtEx: hdc lpSize: lpSize 
  71547.     "The GetWindowExtEx function retrieves the x-extent and y-extent of the
  71548.     current window for the specified device context. 
  71549.  
  71550.         BOOL GetWindowExtEx(
  71551.             HDC  hdc,    // handle of device context 
  71552.             LPPOINT  lpPoint     // points to retrieved extent origin );"
  71553.  
  71554.     <stdcall: bool GetWindowExtEx handle POINTL* >
  71555.     ^self invalidCall
  71556. !
  71557.  
  71558. getWindowOrgEx: hdc lppt: lppt
  71559.     "The GetWindowOrgExfunction retrieves the origin of the
  71560.     current window for the specified device context. 
  71561.  
  71562.         BOOL GetWindowOrgEx(
  71563.             HDC  hdc,    // handle of device context 
  71564.             LPPOINT  lpPoint     // points to retrieved extent origin );"
  71565.  
  71566.     <stdcall: bool GetWindowOrgEx handle POINTL* >
  71567.     ^self invalidCall
  71568. !
  71569.  
  71570. intersectClipRect: hdc nLeftRect: left nTopRect: top nRightRect: right nBottomRect: bottom
  71571.     "The IntersectClipRect function creates a new clipping region from the intersection
  71572.     of the current clipping region and the specified rectangle. 
  71573.  
  71574.     int IntersectClipRect(
  71575.         HDC hdc            // handle of device context 
  71576.         int nLeftRect        // x-coordinate of upper-left corner of rectangle 
  71577.         int nTopRect        // y-coordinate of upper-left corner of rectangle 
  71578.         int nRightRect    // x-coordinate of lower-right corner of rectangle  
  71579.         int nBottomRect    // y-coordinate of lower-right corner of rectangle  
  71580.     );"
  71581.  
  71582.     <stdcall: sdword IntersectClipRect handle sdword sdword sdword sdword>
  71583.     ^self invalidCall!
  71584.  
  71585. lineTo: hdc nXEnd: newX nYEnd: newY
  71586.     "The LineTo function draws a line from the current position up to, but not including, the specified point. 
  71587.         BOOL LineTo(
  71588.               HDC hdc,    // device context handle 
  71589.             int nXEnd,    // x-coordinate of line's ending point  
  71590.             int nYEnd     // y-coordinate of line's ending point  
  71591.         );"
  71592.  
  71593.     <stdcall: bool LineTo handle sdword sdword>
  71594.     ^self invalidCall!
  71595.  
  71596. moveToEx: hdc x: newX y: newY lpPoint: oldPoint
  71597.     "Updates the current position to the specified point and optionally 
  71598.     return the previous position.
  71599.         BOOL MoveToEx(
  71600.               HDC hdc,    // handle of device context 
  71601.             int X,    // x-coordinate of new current position  
  71602.             int Y,    // y-coordinate of new current position  
  71603.             LPPOINT lpPoint     // address of old current position 
  71604.         );"
  71605.  
  71606.     <stdcall: bool MoveToEx handle sdword sdword POINTL* >
  71607.     ^self invalidCall!
  71608.  
  71609. paintRgn: hdc hRgn: hRgn
  71610.     "Paints the specified region by using the brush currently selected into the device context. 
  71611.     BOOL PaintRgn(
  71612.         HDC  hdc,    // handle of device context 
  71613.         HRGN  hrgn     // handle of region to be painted  
  71614.         );"
  71615.  
  71616.     <stdcall: bool PaintRgn handle handle>
  71617.     ^self invalidCall!
  71618.  
  71619. patBlt: hdc nXLeft: x nYLeft: y nWidth: width nHeight: height dwRop: rop
  71620.     "
  71621.     BOOL PatBlt(
  71622.         HDC hdc        // handle to device context 
  71623.         int nXLeft    // x-coord. of upper-left corner of rect. to be filled 
  71624.         int nYLeft    // y-coord. of upper-left corner of rect. to be filled 
  71625.         int nWidth    // width of rectangle to be filled 
  71626.         int nHeight    // height of rectangle to be filled 
  71627.         DWORD dwRop    // raster operation code 
  71628.     );"
  71629.  
  71630.     <stdcall: bool PatBlt handle sdword sdword sdword sdword dword>
  71631.     ^self invalidCall!
  71632.  
  71633. polygon: hdc lpPoints: points nCount: count
  71634.     "Draw a Polygon consisting of 2 or more straight sides, and then fill in the shape.
  71635.  
  71636.     BOOL Polygon(
  71637.         HDC hdc                // handle to device context 
  71638.         CONST POINT *lpPoints    // pointer to polygon's vertices 
  71639.         int nCount            // count of polygon's vertices 
  71640.     );"
  71641.  
  71642.     <stdcall: bool Polygon handle lpvoid sdword>
  71643.     ^self invalidCall!
  71644.  
  71645. ptInRegion: hdc x: x y: y
  71646.     "Determines whether the specified point is inside the specified region. 
  71647.         BOOL PtInRegion(
  71648.             HRGN  hrgn,    // handle of region 
  71649.             int  X,    // x-coordinate of point  
  71650.             int  Y     // y-coordinate of point  
  71651.             );"
  71652.  
  71653.     <stdcall: bool PtInRegion handle sdword sdword>
  71654.     ^self invalidCall!
  71655.  
  71656. realizePalette: hdc
  71657.     "Maps palette entries from the current logical palette of hdc
  71658.     to the system palette. Answers the number of palette entries
  71659.     maped to the system palette or GDI_ERROR if the operation fails.
  71660.  
  71661.     UINT RealizePalette( HDC hdc );"
  71662.  
  71663.     <stdcall: dword RealizePalette handle>
  71664.     ^self invalidCall!
  71665.  
  71666. rectangle: hdc nLeftRect: l nTopRect: t nRightRect: r nBottomRect: b
  71667.     "Draw a rectangle. The rectangle is outlined by using the current 
  71668.     pen and filled by using the current brush. 
  71669.         BOOL Rectangle(
  71670.             HDC hdc,            // handle of device context 
  71671.             int nLeftRect,        // x-coord. of bounding rectangle's upper-left corner 
  71672.             int nTopRect,        // y-coord. of bounding rectangle's upper-left corner 
  71673.             int nRightRect,    // x-coord. of bounding rectangle's lower-right corner  
  71674.             int nBottomRect     // y-coord. of bounding rectangle's lower-right corner  
  71675.         );"
  71676.  
  71677.     <stdcall: bool Rectangle handle sdword sdword sdword sdword>
  71678.     ^self invalidCall!
  71679.  
  71680. rectVisible: hdc lprc: aRECT
  71681.     "The RectVisible function determines whether any part of the specified rectangle
  71682.     lies within the clipping region of a device context. 
  71683.  
  71684.     BOOL RectVisible(
  71685.         HDC hdc            // handle of the device context 
  71686.         CONST RECT *lprc     // address of rectangle structure  
  71687.     );"
  71688.  
  71689.     <stdcall: bool RectVisible handle RECT* >
  71690.     ^self invalidCall!
  71691.  
  71692. restoreDC: hDC nSavedDC: nSavedDC
  71693.     "Restores a device context (DC) to the specified state.
  71694.     The DC is restored by popping state information off a stack 
  71695.     created by earlier calls to the SaveDC function.
  71696.         BOOL RestoreDC(
  71697.               HDC hdc,    // handle of device context 
  71698.             int nSavedDC     // specifies state to be restored  
  71699.         );"
  71700.  
  71701.     <stdcall: bool RestoreDC handle sdword>
  71702.     ^self invalidCall!
  71703.  
  71704. roundRect: hdc nLeftRect: l nTopRect: t nRightRect: r nBottomRect: b nWidth: rx nHeight: ry
  71705.     "Draw a rectangle with rounded corners. The rectangle is outlined by using 
  71706.     the current pen and filled by using the current brush. 
  71707.         BOOL RoundRect(
  71708.             HDC hdc,            // handle of device context 
  71709.             int nLeftRect,        // x-coord. of bounding rectangle's upper-left corner 
  71710.             int nTopRect,        // y-coord. of bounding rectangle's upper-left corner 
  71711.             int nRightRect,    // x-coord. of bounding rectangle's lower-right corner 
  71712.             int nBottomRect,    // y-coord. of bounding rectangle's lower-right corner 
  71713.             int nWidth,        // width of ellipse used to draw rounded corners  
  71714.             int nHeight         // height of ellipse used to draw rounded corners  
  71715.         );"
  71716.  
  71717.     <stdcall: bool RoundRect handle sdword sdword sdword sdword sdword sdword>
  71718.     ^self invalidCall!
  71719.  
  71720. saveDC: hDC
  71721.     "The SaveDC function saves the current state of the specified device context 
  71722.     (DC) by copying data describing selected objects and graphic modes (such as the bitmap, 
  71723.     brush, palette, font, pen, region, drawing mode, and mapping mode) to a context stack.
  71724.         int SaveDC(
  71725.               HDC hdc     // handle of device context 
  71726.         );"
  71727.  
  71728.     <stdcall: sdword SaveDC handle>
  71729.     ^self invalidCall!
  71730.  
  71731. selectClipPath: hdc iMode: iMode
  71732.     "The SelectClipPath function selects the current path as a clipping region
  71733.     for a device context, combining the new region with any existing clipping
  71734.     region by using the specified mode. 
  71735.  
  71736.     BOOL SelectClipPath(
  71737.         HDC hdc        // handle of device context  
  71738.         int iMode     // clipping mode 
  71739.     );"
  71740.  
  71741.     <stdcall: bool SelectClipPath handle sdword>
  71742.     ^self invalidCall!
  71743.  
  71744. selectClipRgn: hdc hrgn: hRegion
  71745.     "The SelectClipRgn function selects a region as the current clipping region
  71746.     for the specified device context. 
  71747.  
  71748.     int SelectClipRgn(
  71749.         HDC hdc        // handle of device context 
  71750.         HRGN hrgn        // handle of region to be selected  
  71751.     );"
  71752.     <stdcall: sdword SelectClipRgn handle handle>
  71753.     ^self invalidCall!
  71754.  
  71755. selectObject: hdc hgdiobj: hgdiobj
  71756.     "Selects an object into the specified device context answering the old
  71757.     (replaced) object.
  71758.         HGDIOBJ SelectObject(
  71759.             HDC hdc,            // handle of device context 
  71760.             HGDIOBJ hgdiobj     // handle of object  
  71761.         );"
  71762.  
  71763.     <stdcall: handle SelectObject handle handle>
  71764.     ^self invalidCall!
  71765.  
  71766. selectPalette: hdc hPal: hPal bForceBackground: forceBackground
  71767.     "Selects the logical palette hPal into a device context, hdc.
  71768.     The forceBackground parameter specifies whether the logical palette 
  71769.     is forced to be a background palette. If true, realizing the palette
  71770.     causes the logical palette to be mapped to the colors already in the
  71771.     physical palette in the best possible way. If false, realizing the
  71772.     palette causes it to be copied into the device palette when the 
  71773.     application is in the foreground. 
  71774.  
  71775.     Answers the previous palette handle or nil if the operation fails.
  71776.  
  71777.     HPALETTE SelectPalette( 
  71778.         HDC hdc, 
  71779.         HPALETTE hpal, 
  71780.         BOOL bForceBackground);"
  71781.  
  71782.     <stdcall: handle SelectPalette handle handle bool>
  71783.     ^self invalidCall!
  71784.  
  71785. setBkColor: hdc crColor: color
  71786.     "The SetBkColor function sets the current background color to the specified 
  71787.     color value, or to the nearest physical color if the device cannot represent 
  71788.     the specified color value. 
  71789.  
  71790.     COLORREF SetBkColor(
  71791.         HDC  hdc,    // handle of device context  
  71792.         COLORREF  crColor // background color value
  71793.         );"
  71794.  
  71795.     <stdcall: dword SetBkColor handle dword>
  71796.     ^self invalidCall!
  71797.  
  71798. setBkMode: hdc iBkMode: mode
  71799.     "The SetBkMode function sets the background mix mode of the specified device context. 
  71800.     The background mix mode is used with text, hatched brushes, and pen styles that are 
  71801.     not solid lines. 
  71802.         int SetBkMode(
  71803.               HDC hdc,        // handle of device context
  71804.             int iBkMode     // flag specifying background mode
  71805.         );"
  71806.  
  71807.     <stdcall: sdword SetBkMode handle sdword>
  71808.     ^self invalidCall!
  71809.  
  71810. setBrushOrgEx: hdc nXOrg: x nYOrg: y lppt: aPOINT
  71811.     "Sets the brush origin that GDI assigns to the next brush an application selects into the specified device context. 
  71812.         BOOL SetBrushOrgEx(
  71813.             HDC  hdc,    // handle of device context 
  71814.             int  nXOrg,    // x-coordinate of new origin 
  71815.             int  nYOrg,    // y-coordinate of new origin 
  71816.             LPPOINT  lppt     // points to previous brush origin );"
  71817.  
  71818.     <stdcall: bool SetBrushOrgEx handle sdword sdword POINTL* >
  71819.     ^self invalidCall
  71820.     !
  71821.  
  71822. setDIBColorTable: hdc uStartIndex: startInteger cEntries: countInteger pColors: pRGBQUAD
  71823.     "Sets RGB (red, green, blue) color values in a range of entries in the color table of the 
  71824.     device-independent bitmap (DIB) that is     currently selected into a specified device context. 
  71825.  
  71826.         UINT SetDIBColorTable( 
  71827.             HDC hdc,         // handle of device context whose DIB is of interest     
  71828.             UINT uStartIndex,     // color table index of first entry to set     
  71829.             UINT cEntries,         // number of color table entries to set     
  71830.             CONST RGBQUAD *pColors // pointer to array of color table entries     
  71831.         );"        
  71832.  
  71833.     <stdcall: dword SetDIBColorTable handle dword dword RGBQUAD* >
  71834.     ^self invalidCall!
  71835.  
  71836. setMapMode: hdc fnMapMode: mode
  71837.     "The SetMapMode function sets the mapping mode of the specified device context. 
  71838.     The mapping mode defines the unit of measure used to transform page-space units
  71839.     into device-space units, and also defines the orientation of the device's x and y axes. 
  71840.     
  71841.     int SetMapMode(
  71842.           HDC hdc <>,        // handle to device context
  71843.           int fnMapMode <>   // new mapping mode
  71844.         );"
  71845.  
  71846.     <stdcall: sdword SetMapMode handle sdword>
  71847.     ^self invalidCall!
  71848.  
  71849. setPixelV: hdc x: x y: y crColor: pixelColor
  71850.     "The SetPixelV function sets the pixel at the specified coordinates to the
  71851.     closest approximation of the specified color. The point must be in the
  71852.     clipping region and the visible part of the device surface. 
  71853.  
  71854.     BOOL SetPixelV(
  71855.         HDC hdc            // handle of device context  
  71856.         int X            // x-coordinate of pixel 
  71857.         int Y            // y-coordinate of pixel 
  71858.         COLORREF crColor    // new pixel color 
  71859.     );"
  71860.  
  71861.     <stdcall: bool SetPixelV handle sdword sdword dword>
  71862.     ^self invalidCall!
  71863.  
  71864. setTextAlign: hdc fMode: mode
  71865.     "
  71866.     UINT SetTextAlign(
  71867.         HDC hdc,    // handle of device context 
  71868.         UINT fMode     // text-alignment flag 
  71869.     );"
  71870.  
  71871.     <stdcall: dword SetTextAlign handle dword>
  71872.     ^self invalidCall!
  71873.  
  71874. setTextColor: hdc crColor: colour
  71875.     "The SetTextColor function sets the text color for the specified
  71876.     device context to the specified color. 
  71877.  
  71878.     COLORREF SetTextColor(
  71879.         HDC hdc            // handle of device context  
  71880.         COLORREF crColor    // text color 
  71881.     );"
  71882.  
  71883.     <stdcall: dword SetTextColor handle dword>
  71884.     ^self invalidCall!
  71885.  
  71886. setViewportExtEx: hdc nXExtent: nXExtent nYExtent: nYExtent lpSize: lpSize 
  71887.     "The SetViewportExtEx function sets the horizontal and vertical extents
  71888.     of the viewport for a device context by using the specified values. 
  71889.  
  71890.         BOOL SetViewportExtEx(
  71891.             HDC  hdc,    // handle of device context 
  71892.             int  X,    // x-coordinate of new origin 
  71893.             int  Y,    // y-coordinate of new origin 
  71894.             LPPOINT  lpPoint     // points to previous origin );"
  71895.  
  71896.     <stdcall: bool SetViewportExtEx handle sdword sdword POINTL* >
  71897.     ^self invalidCall
  71898. !
  71899.  
  71900. setViewportOrgEx: hdc nXOrg: x nYOrg: y lppt: aPOINT
  71901.     "The SetViewportOrgEx function specifies which device point maps to the window origin (0,0). 
  71902.  
  71903.         BOOL SetViewportOrgEx(
  71904.             HDC  hdc,    // handle of device context 
  71905.             int  X,    // x-coordinate of new origin 
  71906.             int  Y,    // y-coordinate of new origin 
  71907.             LPPOINT  lpPoint     // points to previous origin );"
  71908.  
  71909.     <stdcall: bool SetViewportOrgEx handle sdword sdword POINTL* >
  71910.     ^self invalidCall
  71911.     !
  71912.  
  71913. setWindowExtEx: hdc nXExtent: nXExtent nYExtent: nYExtent lpSize: lpSize 
  71914.     "The SetWindowExtEx function sets the horizontal and vertical extents of the
  71915.     window for a device context by using the specified values. 
  71916.  
  71917.         BOOL SetWindowExtEx(
  71918.             HDC  hdc,    // handle of device context 
  71919.             int  X,    // x-coordinate of new origin 
  71920.             int  Y,    // y-coordinate of new origin 
  71921.             LPPOINT  lpPoint     // points to previous origin );"
  71922.  
  71923.     <stdcall: bool SetWindowExtEx handle sdword sdword POINTL* >
  71924.     ^self invalidCall
  71925. !
  71926.  
  71927. setWindowOrgEx: hdc nXOrg: x nYOrg: y lppt: aPOINT
  71928.     "The SetWindowOrgEx function specifies which window point maps to the viewport origin (0,0). 
  71929.  
  71930.         BOOL SetWindowOrgEx(
  71931.             HDC  hdc,    // handle of device context 
  71932.             int  X,    // x-coordinate of new origin 
  71933.             int  Y,    // y-coordinate of new origin 
  71934.             LPPOINT  lpPoint     // points to previous origin );"
  71935.  
  71936.     <stdcall: bool SetWindowOrgEx handle sdword sdword POINTL* >
  71937.     ^self invalidCall
  71938.     !
  71939.  
  71940. startDoc: hdc lpdi: info
  71941.     "Start a print job.
  71942.         int StartDoc(
  71943.               HDC hdc,                // handle of device context 
  71944.             CONST DOCINFO *lpdi     // address of structure with file names  
  71945.         );"
  71946.  
  71947.     <stdcall: sdword StartDocA handle DOCINFO* >
  71948.     ^self invalidCall
  71949.  
  71950. !
  71951.  
  71952. startPage: hdc
  71953.     "Prepares the printer driver to accept data. 
  71954.         int StartPage(
  71955.             HDC  hDC        // handle of device context  
  71956.         );"
  71957.  
  71958.     <stdcall: sdword StartPage handle>
  71959.     ^self invalidCall
  71960.  
  71961. !
  71962.  
  71963. stretchBlt: hdc nXOriginDest: x nYOriginDest: y nWidthDest: w nHeightDest: h 
  71964.     hdcSrc: hdcSrc nXOriginSrc: sx nYOriginSrc: sy nWidthSrc: sw nHeightSrc: sh dwRop: dwRop
  71965.       "Copy a bitmap from a source rectangle into a destination rectangle, stretching or 
  71966.     compressing it to fit the dimensions of the destination rectangle, if necessary. Windows 
  71967.     stretches or compresses the bitmap according to the stretching mode currently set in 
  71968.     the destination device context. 
  71969.         BOOL StretchBlt(
  71970.               HDC hdcDest,    // handle of destination device context 
  71971.             int nXOriginDest,    // x-coordinate of upper-left corner of dest. rect. 
  71972.             int nYOriginDest,    // y-coordinate of upper-left corner of dest. rect. 
  71973.             int nWidthDest,    // width of destination rectangle 
  71974.             int nHeightDest,    // height of destination rectangle 
  71975.             HDC hdcSrc,    // handle of source device context 
  71976.             int nXOriginSrc,    // x-coordinate of upper-left corner of source rectangle 
  71977.             int nYOriginSrc,    // y-coordinate of upper-left corner of source rectangle 
  71978.             int nWidthSrc,    // width of source rectangle 
  71979.             int nHeightSrc,    // height of source rectangle 
  71980.             DWORD dwRop     // raster operation code 
  71981.         );"
  71982.  
  71983.     <stdcall: bool StretchBlt handle sdword sdword sdword sdword handle sdword sdword sdword sdword dword>
  71984.     ^self invalidCall!
  71985.  
  71986. stretchDIBits: hdc xDest: x yDest: y nDestWidth: w nDestHeight: h 
  71987.     xSrc: xs ySrc: ys nSrcWidth: sw nSrcHeight: sh lpBits: bits lpBitsInfo: bitsinfo
  71988.     iUsage: usage dwRop: dwRop
  71989.  
  71990.     "Copies the color data for a rectangle of pixels in a device-independent bitmap (DIB) to the 
  71991.     specified destination rectangle. If the destination rectangle is larger than the source rectangle, 
  71992.     this function stretches the rows and columns of color data to fit the destination rectangle. 
  71993.     If the destination rectangle is smaller than the source rectangle, this function compresses the
  71994.     rows and columns by using the specified raster operation. 
  71995.  
  71996.     int StretchDIBits(
  71997.         HDC hdc,    // handle of device context 
  71998.         int XDest,    // x-coordinate of upper-left corner of dest. rect. 
  71999.         int YDest,    // y-coordinate of upper-left corner of dest. rect. 
  72000.         int nDestWidth,    // width of destination rectangle 
  72001.         int nDestHeight,    // height of destination rectangle 
  72002.         int XSrc,    // x-coordinate of upper-left corner of source rect. 
  72003.         int YSrc,    // y-coordinate of upper-left corner of source rect. 
  72004.         int nSrcWidth,    // width of source rectangle 
  72005.         int nSrcHeight,    // height of source rectangle 
  72006.         CONST VOID *lpBits,    // address of bitmap bits 
  72007.         CONST BITMAPINFO *lpBitsInfo,    // address of bitmap data 
  72008.         UINT iUsage,    // usage 
  72009.         DWORD dwRop     // raster operation code 
  72010.         );"
  72011.  
  72012.     <stdcall: sdword StretchDIBits handle sdword sdword sdword sdword sdword sdword sdword sdword lpvoid lpvoid dword dword>
  72013.     ^self invalidCall!
  72014.  
  72015. textOut: hdc nXStart: x nYStart: y lpString: str cbString: len
  72016.     "Writes a character string at the specified location, using the currently 
  72017.     selected font. 
  72018.         BOOL TextOut(
  72019.               HDC hdc,    // handle of device context 
  72020.             int nXStart,    // x-coordinate of starting position  
  72021.             int nYStart,    // y-coordinate of starting position  
  72022.             LPCTSTR lpString,    // address of string 
  72023.             int cbString     // number of characters in string 
  72024.         );"
  72025.  
  72026.     <stdcall: bool TextOutA handle sdword sdword lpstr sdword>
  72027.     ^self invalidCall! !
  72028.  
  72029. KernelLibrary comment:
  72030. 'KernelLibrary is the <ExternalLibrary> which represents the Win32 System DLL, KERNEL32.DLL. 
  72031.  
  72032. The default instance of this class provides access to most of the base operating system services. New functions may be added as required, but the external function naming convention should be followed.
  72033.  
  72034. KernelLibrary is a special case in that its handle is cached by the VM on startup into the VM registry, and it is the means by which all other libraries are opened.
  72035.  
  72036. All functions in this library use the stdcall calling convention.'!
  72037. !KernelLibrary class methodsFor!
  72038.  
  72039. clear
  72040.     "Private - Clear down cached external function addresses and any default 
  72041.     instances of the receiver from previous runs. etc."
  72042.  
  72043.     super clear.
  72044.     OSVERSIONINFO clear
  72045. !
  72046.  
  72047. fileName
  72048.     "Answer the host system file name of the external library which
  72049.     the receiver represents."
  72050.  
  72051.     ^'KERNEL32'!
  72052.  
  72053. open
  72054.     "Answer a new instance of the receiver to represent the Kernel32 DLL. Special handling 
  72055.     is required for this library because opening a library is normally done through the 
  72056.     receiver's singleton instance. The VM stores the current Kernel32 handle into the 
  72057.     VM object registry on startup."
  72058.  
  72059.     ^self fromHandle: VMLibrary default kernelHandle! !
  72060.  
  72061. !KernelLibrary methodsFor!
  72062.  
  72063. addAtom: aString
  72064.     "The AddAtom function adds a character string to the local atom table and returns a unique value (an atom) identifying the string. 
  72065.     Answer the value is the newly created atom or zero if the function fails.
  72066.  
  72067.         ATOM AddAtom(
  72068.             LPCTSTR  lpString     // address of string to add 
  72069.         );"
  72070.  
  72071.     <stdcall: word AddAtomA lpstr>
  72072.     ^self invalidCall!
  72073.  
  72074. allocConsole
  72075.     "Allocate a new console.
  72076.         BOOL AllocConsole(VOID)"
  72077.  
  72078.     <stdcall: bool AllocConsole>
  72079.     ^self invalidCall!
  72080.  
  72081. beep: anInteger dwDuration: dwDuration
  72082.     "Generates simple tones on the speaker. 
  72083.         BOOL Beep(
  72084.               DWORD dwFreq,    // sound frequency, in hertz 
  72085.             DWORD dwDuration     // sound duration, in milliseconds 
  72086.         );
  72087.     Implementation Note:  One might be tempted to make this an overlapped
  72088.     call, and that might indeed be usful when buzzing for long durations, however
  72089.     that would reduce the usefulness of Sound>>bell as a debugging aid by
  72090.     slowing it down and introducing the complication of process switching.
  72091.     It would also make it unsuitable for use from the idle process, which really
  72092.     shouldn't be made to wait on Semaphores (which causes a VM idle panic
  72093.     interrupt, handled by starting a new idle process). Of course you can always
  72094.     add a new overlapped entry point if you wish."
  72095.  
  72096.     <stdcall: bool Beep dword dword>
  72097.     ^self invalidCall!
  72098.  
  72099. close
  72100.     "The kernel library cannot be closed."
  72101.  
  72102.     ^false!
  72103.  
  72104. closeHandle: aHandle
  72105.     "Close an open Win32 object handle, freeing any resources held by it.
  72106.     Once closed a handle is no longer valid. Answer whether the function
  72107.     succeeds.     See Win32 SDK help for more information.
  72108.  
  72109.     BOOL CloseHandle(
  72110.         HANDLE  hObject     // handle of object to close  
  72111.     );"
  72112.  
  72113.     <stdcall: bool CloseHandle handle>
  72114.     ^self invalidCall
  72115. !
  72116.  
  72117. copyFile: fromString lpNewFileName: toString bfailIfExists: fail
  72118.     "Copies the file named fromString to a file named toString. If
  72119.     toString already exists then the copy will only proceed if fail
  72120.     is false.
  72121.  
  72122.     BOOL    CopyFileA(
  72123.         LPCSTR lpExistingFileName,
  72124.         LPCSTR lpNewFileName,
  72125.         BOOL bFailIfExists
  72126.         );"
  72127.  
  72128.     <overlap stdcall: bool CopyFileA lpstr lpstr bool>
  72129.     ^self invalidCall!
  72130.  
  72131. createDirectory: path lpSecurityAttributes: aSECURITYATTRIBUTES 
  72132.     "Create a new directory with the specified <String> path, 
  72133.     answering whether successful.
  72134.  
  72135.         BOOL CreateDirectory(
  72136.             LPCTSTR lpPathName,
  72137.             LPSECURITY_ATTRIBUTES lpSecurityAttributes
  72138.         );"
  72139.  
  72140.     <stdcall: bool CreateDirectoryA lpstr lpvoid>
  72141.     ^self invalidCall!
  72142.  
  72143. createEvent: aSECURITYATTRIBUTES bManualReset: aBoolManual bInitialState: aBoolState lpName: aStringPathName
  72144.     "Answer a new Win32 Event object (for thread synchronisation), with the specified
  72145.     security attributes (if aSECURITYATTRIBUTES is nil then the default security 
  72146.     attributes are used), mode (manual or automatic), initial state 
  72147.     (signalled/not-signalled), and name (if aStringPathName is nil, then unnamed).
  72148.     Please see Win32 SDK help for more information."
  72149.  
  72150.     "HANDLE CreateEvent(
  72151.         LPSECURITY_ATTRIBUTES  lpEventAttributes,    // address of security attributes  
  72152.         BOOL  bManualReset,    // flag for manual-reset event 
  72153.         BOOL  bInitialState,    // flag for initial state 
  72154.         LPCTSTR  lpName     // address of event-object name  
  72155.     );"
  72156.  
  72157.     <stdcall: handle CreateEventA lpvoid bool bool lpstr>
  72158.     ^self invalidCall!
  72159.  
  72160. createFile: aStringFileName dwDesiredAccess: anIntegerAccessMode dwSharedMode: anIntegerShareMode 
  72161.         lpSecurityAttributes: aSECURITYATTRIBUTES dwCreationDistribution: anIntegerCreateMode 
  72162.         dwFlagsAndAttributes: anIntegerAttributeFlag hTemplateFile: aHandle
  72163.     "The CreateFile function creates, opens, or truncates a file, pipe, communications resource, disk device,
  72164.     or console. Answer a handle that can be used to access the object. It can also open and return a handle to a directory.
  72165.  
  72166.     HANDLE CreateFile(
  72167.         LPCTSTR lpFileName, // address of name of the file 
  72168.         DWORD dwDesiredAccess, // access (read-write) mode 
  72169.         DWORD dwShareMode, // share mode 
  72170.         LPSECURITY_ATTRIBUTES lpSecurityAttributes, // address of security descriptor 
  72171.         DWORD dwCreationDistribution, // how to create 
  72172.         DWORD dwFlagsAndAttributes, // file attributes 
  72173.         HANDLE hTemplateFile // handle of file with attributes to copy  
  72174.     );
  72175.     Please see Win32 SDK help for more information."
  72176.  
  72177.     <stdcall: handle CreateFileA lpstr dword dword lpvoid dword dword handle>
  72178.     ^self invalidCall!
  72179.  
  72180. createProcess: aStringFileName lpCommandLine: cl lpProcessAttributes: pa lpThreadAttributes: ta
  72181.     bInheritsHandles: ih dwCreationFlags: flags lpEnvironment: env lpCurrentDirectory: cd
  72182.     lpStartupInfo: si lpProcessInformation: pi
  72183.  
  72184.     "The CreateProcess function creates a new process and its primary thread. 
  72185.     The new process runs the specified executable file. 
  72186.  
  72187.     BOOL CreateProcess(
  72188.         LPCTSTR lpApplicationName,  // name of executable module
  72189.         LPTSTR lpCommandLine,       // command line string
  72190.         LPSECURITY_ATTRIBUTES lpProcessAttributes,  // process security attributes
  72191.         LPSECURITY_ATTRIBUTES lpThreadAttributes,   // thread security attributes
  72192.         BOOL bInheritHandles,  // handle inheritance flag
  72193.         DWORD dwCreationFlags, // creation flags
  72194.         LPVOID lpEnvironment,  // pointer to new environment block
  72195.         LPCTSTR lpCurrentDirectory,   // pointer to current directory name
  72196.         LPSTARTUPINFO lpStartupInfo,  // pointer to STARTUPINFO
  72197.         LPPROCESS_INFORMATION lpProcessInformation  // pointer to PROCESS_INFORMATION
  72198.     );
  72199.  
  72200.      Please see Win32 SDK help for more information."
  72201.  
  72202.     <stdcall: bool CreateProcessA lpstr lpstr SECURITY_ATTRIBUTES* SECURITY_ATTRIBUTES*
  72203.         bool dword lpvoid lpstr STARTUPINFO* PROCESS_INFORMATION*>
  72204.  
  72205.     ^self invalidCall!
  72206.  
  72207. deleteFile: aStringFileName
  72208.     "The DeleteFile function deletes an existing file. Answer true if the function succeeds.
  72209.  
  72210.     BOOL DeleteFile(
  72211.         LPCTSTR lpFileName // address of name of file to delete  
  72212.     );
  72213.  
  72214.     If the file does not exist, the DeleteFile function fails.
  72215.     Windows 95:
  72216.         This function deletes a file even if it is open for normal I/O or as a memory-mapped file.
  72217.         To prevent loss of data, close files before attempting to delete them.
  72218.  
  72219.     Windows NT:
  72220.         This function fails if an application attempts to delete a file that is open for normal I/O or as a memory-mapped file."
  72221.  
  72222.     <stdcall: bool DeleteFileA lpstr>
  72223.     ^self invalidCall!
  72224.  
  72225. duplicateHandle: sourceProcHandle hSourceHandle: sourceHandle hTargetProcessHandle: targetProcHandle 
  72226.     lpTargetHandle: targetHandle dwDesiredAccess: accessFlagsInteger bInheritHandle: inheritBool
  72227.     dwOptions: optionsFlagInteger
  72228.         "Duplicate a Win32 handle, sourceHandle, belonging to a Win32 Process, 
  72229.         sourceProcHandle, for another Win32 Process, targetProcHandle, writing
  72230.         the result into targetHandle, with the specified access (accessFlagsInteger),
  72231.         inheritance (inheritBool), and options (optionsFlagInteger). Answer whether
  72232.         the functions succeeds or fails. See Win32 SDK help for more information.
  72233.         BOOL DuplicateHandle(
  72234.             HANDLE  hSourceProcessHandle,    // handle of process with handle to duplicate 
  72235.             HANDLE  hSourceHandle,    // handle to duplicate 
  72236.             HANDLE  hTargetProcessHandle,    // handle of process to duplicate to 
  72237.             LPHANDLE  lpTargetHandle,    // address of duplicate handle 
  72238.             DWORD  dwDesiredAccess,    // access for duplicate handle 
  72239.             BOOL  bInheritHandle,    // handle inheritance flag
  72240.             DWORD  dwOptions     // optional actions 
  72241.         );"
  72242.     <stdcall: bool DuplicateHandle handle handle handle lpvoid dword bool dword>
  72243.     ^self invalidCall
  72244. !
  72245.  
  72246. enumDateFormats: aCallbackThunk locale: locale dwFlags: dwFlags
  72247.     "Enumerates the long or short date formats that are available for the specified locale, including 
  72248.     date formats for any alternate calendars. The argument, dwFlags, determines whether the long 
  72249.     or short date formats are enumerated. The function enumerates the date formats by passing 
  72250.     date format string pointers, one at a time, to the callback thunk, aCallbackThunk, continuing
  72251.     until all date formats are enumerated, or the callback returns false.
  72252.  
  72253.         BOOL EnumDateFormats(
  72254.             DATEFMT_ENUMPROC lpDateFmtEnumProc,    // pointer to enumeration callback function
  72255.             LCID Locale,                        // locale whose date formats are of interest
  72256.             DWORD dwFlags                         // date formats to enumerate
  72257.         );"
  72258.  
  72259.     <stdcall: bool EnumDateFormatsA lpvoid dword dword>
  72260.     ^self invalidCall!
  72261.  
  72262. enumSystemLocales: aCallbackThunk dwFlags: dwFlags
  72263.     "Enumerates the locales that are either installed on or supported by a system, depending on the 
  72264.     dwFlags parameter. The callback is invoked repeatedly until all locales are exhausted, or the
  72265.     callback function returns false.
  72266.  
  72267.         BOOL EnumSystemLocales(
  72268.             LOCALE_ENUMPROC lpLocaleEnumProc,    // pointer to enumeration callback function
  72269.             DWORD dwFlags     // indicates which locales to enumerate
  72270.         );"
  72271.  
  72272.     <stdcall: bool EnumSystemLocalesA lpvoid dword>
  72273.     ^self invalidCall!
  72274.  
  72275. enumTimeFormats: aCallbackThunk locale: locale dwFlags: dwFlags
  72276.     "Enumerates the time formats that are available for the specified locale. The function passes
  72277.     the time format strings, one at a time, to the callback thunk, aCallbackThunk, continuing
  72278.     until all time formats are enumerated, or the callback returns false.
  72279.  
  72280.         BOOL EnumTimeFormats(
  72281.             TIMEFMT_ENUMPROC lpTimeFmtEnumProc,    // pointer to enumeration callback function
  72282.             LCID Locale,                        // locale whose time formats are of interest
  72283.             DWORD dwFlags                         // unused
  72284.         );"
  72285.  
  72286.     <stdcall: bool EnumTimeFormatsA lpvoid dword dword>
  72287.     ^self invalidCall!
  72288.  
  72289. expandEnvironmentStrings: lpSrc lpDst: lpDst nSize: bufSize
  72290.     "Replace environment-variable strings with their defined values. 
  72291.         DWORD ExpandEnvironmentStrings(
  72292.             LPCTSTR lpSrc,
  72293.             LPTSTR lpDst,
  72294.             DWORD nSize);"
  72295.  
  72296.     <stdcall: dword ExpandEnvironmentStringsA lpstr lpstr dword>
  72297.     ^self invalidCall!
  72298.  
  72299. fileTimeToLocalTime: lpFileTime lpLocalFileTime: lpLocalFileTime
  72300.     "Convert a UTC FILETIME to a local FILETIME, answering whether the conversion succeeded.
  72301.         BOOL FileTimeToLocalTime(
  72302.               CONST FILETIME *lpFileTime,    // pointer to UTC file time to convert 
  72303.             LPFILETIME lpLocalFileTime        // pointer to structure to receive local time  
  72304.         );
  72305.     Implenentation Note: In order to prevent FILETIME>>displayOn: acting as the root of a 
  72306.     dependency tree which keeps FILETIME and SYSTEMTIME in the image regardless of
  72307.     whether they are referenced elsewhere, we have to use void* arguments here to break
  72308.     the  dependencies."
  72309.  
  72310.     "<stdcall: bool FileTimeToLocalFileTime FILETIME* FILETIME*>"
  72311.     <stdcall: bool FileTimeToLocalFileTime void* void*>
  72312.     ^self invalidCall
  72313. !
  72314.  
  72315. fileTimeToSystemTime: lpFileTime lpSystemTime: lpSystemTime
  72316.     "Convert a FILETIME to a SYSTEMTIME, answering whether the conversion succeeded.
  72317.         BOOL FileTimeToSystemTime(
  72318.               CONST FILETIME *lpFileTime,    // pointer to file time to convert 
  72319.             LPSYSTEMTIME lpSystemTime         // pointer to structure to receive system time  
  72320.         );
  72321.  
  72322.     Implenentation Note: In order to prevent FILETIME>>displayOn: acting as the root of a 
  72323.     dependency tree which keeps FILETIME and SYSTEMTIME in the image regardless of
  72324.     whether they are referenced elsewhere, we have to use void* arguments here to break
  72325.     the  dependencies."
  72326.  
  72327.     "<stdcall: bool FileTimeToSystemTime FILETIME* SYSTEMTIME*>"
  72328.     <stdcall: bool FileTimeToSystemTime void* SYSTEMTIME*>
  72329.     ^self invalidCall!
  72330.  
  72331. findClose: hFindFile
  72332.     "Close the specified find file handle returned by a previous call to FindFirstFile().
  72333.  
  72334.         BOOL FindClose( 
  72335.             HANDLE hFindFile
  72336.         );"
  72337.  
  72338.     <stdcall: bool FindClose handle>
  72339.     ^self invalidCall!
  72340.  
  72341. findFirstFile: lpFileName lpFindFileData: aWIN32_FIND_DATA
  72342.     "Search a directory for a file or subdirectory whose name matches the specified filename.
  72343.  
  72344.         HANDLE FindFirstFile( 
  72345.             LPCTSTR lpFileName, 
  72346.             LPWIN32_FIND_DATA lpFindFileData 
  72347.         );"
  72348.  
  72349.     <stdcall: handle FindFirstFileA lpstr WIN32_FIND_DATA* >
  72350.     ^self invalidCall!
  72351.  
  72352. findNextFile: hFindFile lpFindFileData: aWIN32_FIND_DATA
  72353.     "Continue a file search initiated by a previous call to FindFirstFile()
  72354.     which returned the handle, hFindFile. Answer whether the call succeeded.
  72355.     No more files is determined by a false return value with GetLastError()
  72356.     returning ERROR_NO_MORE_FILES.
  72357.  
  72358.         BOOL FindNextFile( 
  72359.             HANDLE hFindFile, 
  72360.             LPWIN32_FIND_DATA lpFindFileData 
  72361.         );"
  72362.  
  72363.     <stdcall: bool FindNextFileA handle WIN32_FIND_DATA* >
  72364.     ^self invalidCall!
  72365.  
  72366. findResource: anInstanceHandle lpName: anIntegerId lpType: anIntegerType
  72367.     "Determine the location of a resource with the specified type and name in the specified module. 
  72368.         HRSRC FindResource(
  72369.               HMODULE hModule,    // resource-module handle 
  72370.             LPCTSTR lpName,    // pointer to resource name  
  72371.             LPCTSTR lpType     // pointer to resource type 
  72372.         );"
  72373.  
  72374.     <stdcall: handle FindResourceA handle lpvoid lpvoid>
  72375.     ^self invalidCall
  72376. !
  72377.  
  72378. flushFileBuffers: aHandle
  72379.     "The FlushFileBuffers function clears the buffers for the specified file
  72380.     and causes all buffered data to be written to the file. 
  72381.     Answer a boolean indicating if the operation was successful.
  72382.  
  72383.     BOOL FlushFileBuffers(
  72384.         HANDLE hFile // open handle to file whose buffers are to be flushed 
  72385.         );"
  72386.  
  72387.     <stdcall: bool FlushFileBuffers handle>
  72388.     ^self invalidCall
  72389.  
  72390. !
  72391.  
  72392. formatMessage: dwFlags 
  72393.         lpSource: aStringOrHandleOrNil
  72394.         dwMessageId: dwMessageId
  72395.         dwLanguageId: dwLanguageId
  72396.         lpBuffer: aBufString
  72397.         nSize: nBufSize
  72398.         arguments: vaArgs
  72399.     "Format a message string from a message definition, from the format string or module handle specified
  72400.     by the argument, aStringOrHandleOrNil. If the flags specify a system message, aStringOrHandle may be nil,
  72401.     and the function finds the appropriate message in the system message table resource.
  72402.     The function copies the formatted message text to an output buffer, populating any embedded insert 
  72403.     sequences with arguments from vaArgs if requested.
  72404.         DWORD FormatMessage(
  72405.             DWORD dwFlags,    // source and processing options 
  72406.             LPCVOID lpSource,    // pointer to  message source 
  72407.             DWORD dwMessageId,    // requested message identifier 
  72408.             DWORD dwLanguageId,    // language identifier for requested message 
  72409.             LPTSTR lpBuffer,    // pointer to message buffer 
  72410.             DWORD nSize,    // maximum size of message buffer 
  72411.             va_list *Arguments     // address of array of message inserts 
  72412.         );"
  72413.  
  72414.     <stdcall: dword FormatMessageA dword lpvoid dword dword lpvoid dword lpvoid>
  72415.     ^self invalidCall!
  72416.  
  72417. formatMessage: messageId source: aHandleOrString flags: dwFlag withArguments: arguments
  72418.     "Answer a <readableString> which is a message formatted from the specified Win32 format
  72419.     string (see Win32 help) and the arguments in the <sequencedReadableCollection>, arguments,
  72420.     which will be substitued for the argument identified as %1..%n in the format string."
  72421.  
  72422.     | ptr len msg args |
  72423.     ptr := ExternalMemory new.
  72424.     args := DWORDArray new: arguments size.
  72425.     arguments keysAndValuesDo: [:i :a | args at: i put: (a isInteger ifTrue: [a] ifFalse: [a yourAddress])].
  72426.     len := self
  72427.             setLastError: 0;    "To enable us to distinguish the error case from the empty string case"
  72428.             formatMessage: (dwFlag bitOr: ##(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY))
  72429.                 lpSource: aHandleOrString
  72430.                 dwMessageId: messageId dwLanguageId: 0
  72431.                 lpBuffer: ptr basicYourAddress nSize: 0
  72432.                 arguments: args.
  72433.  
  72434.     "FormatMessage() unhelpfully treats the empty string result as an error, so we must handle specially."
  72435.     len == 0 
  72436.         ifTrue: [
  72437.             self getLastError ~~ 0 ifTrue: [self systemError].
  72438.             msg := String new]
  72439.         ifFalse: [
  72440.             msg := String fromAddress: ptr length: len.
  72441.             ptr free].
  72442.     ^msg.
  72443.  
  72444. "
  72445. 'Blah %1 blah %2!!d!!' formatWithArguments: #('abc' 123)
  72446. "!
  72447.  
  72448. freeConsole
  72449.     "Detach from the current console.
  72450.         BOOL FreeConsole(VOID)"
  72451.   
  72452.     <stdcall: bool FreeConsole>
  72453.     ^self invalidCall!
  72454.  
  72455. freeLibrary: anExternalHandle
  72456.     <stdcall: bool FreeLibrary handle>
  72457.     ^self invalidCall!
  72458.  
  72459. getAtomName: id lpBuffer: aString nSize: anInteger
  72460.     "The GetAtomName function retrieves a copy of the character string associated with the specified local atom.
  72461.     This function replaces the GetAtomHandle function. 
  72462.  
  72463.         UINT GetAtomName(
  72464.             ATOM  nAtom,        // atom identifying character string 
  72465.             LPTSTR  lpBuffer,    // address of buffer for atom string  
  72466.             int  nSize         // size of buffer 
  72467.             );    
  72468.  
  72469.     Return Value
  72470.     If the function succeeds, the return value is the length of the string copied to the buffer, in characters, not including the terminating null character.
  72471.     If the function fails, the return value is zero. To get extended error information, call GetLastError."
  72472.  
  72473.     <stdcall: dword GetAtomNameA word lpstr sdword>
  72474.     ^self invalidCall
  72475. !
  72476.  
  72477. getCommandLine
  72478.     "Answer a pointer to the command-line string.
  72479.  
  72480.         LPTSTR GetCommandLine(VOID)"
  72481.   
  72482.     <stdcall: lpstr GetCommandLineA>
  72483.     ^self invalidCall!
  72484.  
  72485. getComputerName: buffer nSize: pBufSize
  72486.     "Retrieves the computer name of the current system into the argument, buffer (which must be large
  72487.     enough to contain MAX_COMPUTERNAME_LENGTH+1 characters). Answers whether the name
  72488.     was successfully retrieved. If successful then the value of pBufSize will be the number of characters
  72489.     in the name.
  72490.  
  72491.         BOOL GetComputerName(
  72492.             LPTSTR lpBuffer,    // address of name buffer 
  72493.             LPDWORD nSize         // address of size of lpBuffer
  72494.         );"
  72495.  
  72496.     <stdcall: bool GetComputerNameA lpstr DWORD* >
  72497.     ^self invalidCall
  72498.  
  72499. !
  72500.  
  72501. getCurrentProcess
  72502.     "Answer handle of the Dolphin process.
  72503.  
  72504.         HANDLE GetCurrentProcess()"
  72505.  
  72506.     <stdcall: handle GetCurrentProcess>
  72507.     ^self invalidCall
  72508.  !
  72509.  
  72510. getCurrentThread
  72511.     "Answer the handle of the current thread
  72512.  
  72513.         DWORD GetCurrentThread()"
  72514.  
  72515.     <stdcall: handle GetCurrentThread>
  72516.     ^self invalidCall
  72517.  !
  72518.  
  72519. getCurrentThreadId
  72520.     "Answer thread identifier of the currently executing thread (like Processor activeProcess).
  72521.  
  72522.         DWORD GetCurrentThreadId(VOID)"
  72523.  
  72524.     <stdcall: dword GetCurrentThreadId>
  72525.     ^self invalidCall
  72526.  !
  72527.  
  72528. getDateFormat: locale dwFlags: dwFlags lpDate: aWinSYSTEMTIME lpFormat: formatString lpDateStr: outputStringOutput cchDate: anInteger
  72529.     "Format a date as a date string for a specified locale. If formatString is null then the current locale 
  72530.     is used. If aWinSYSTEMTIME is null then the current local date is used.
  72531.  
  72532.         int GetDateFormat(
  72533.             LCID  Locale,    // locale for which date is to be formatted 
  72534.             DWORD  dwFlags,    // flags specifying function options 
  72535.             CONST SYSTEMTIME *  lpDate,    // date to be formatted 
  72536.             LPCTSTR  lpFormat,    // date format string 
  72537.             LPTSTR  lpDateStr,    // buffer for storing formatted string 
  72538.             int  cchDate     // size of buffer 
  72539.         );"
  72540.  
  72541.     "Avoid creating indirect ref. to SYSTEMTIME from its own #displayOn: by using void* parm instead"
  72542.     <stdcall: sdword GetDateFormatA dword dword void* lpstr lpstr sdword>
  72543.     ^self invalidCall
  72544.  
  72545. !
  72546.  
  72547. getDiskFreeSpace: lpRootPathName
  72548.     lpSectorsPerCluster: lpSectorsPerCluster
  72549.     lpBytesPerSector: lpBytesPerSector
  72550.     lpNumberOfFreeClusters: lpNumberOfFreeClusters
  72551.     lpTotalNumberOfClusters: lpTotalNumberOfClusters
  72552.     "
  72553.         BOOL GetDiskFreeSpace( 
  72554.             LPCTSTR lpRootPathName,
  72555.             LPDWORD lpSectorsPerCluster,
  72556.             LPDWORD lpBytesPerSector,
  72557.             LPDWORD lpNumberOfFreeClusters,
  72558.             LPDWORD lpTotalNumberOfClusters
  72559.         );
  72560.     "
  72561.  
  72562.     <stdcall: bool GetDiskFreeSpaceA lpstr dword* dword* dword* dword*>
  72563.     ^self invalidCall!
  72564.  
  72565. getDiskFreeSpaceEx: lpDirectoryName
  72566.     lpFreeBytesAvailable: lpFreeBytesAvailable
  72567.     lpTotalNumberOfBytes: lpTotalNumberOfBytes
  72568.     lpTotalNumberOfFreeBytes: lpTotalNumberOfFreeBytes
  72569.     "
  72570.         BOOL GetDiskFreeSpaceEx( 
  72571.             LPCTSTR lpDirectoryName,
  72572.             LPQWORD  lpFreeBytesAvailable,
  72573.             LPQWORD lpTotalNumberOfBytes,
  72574.             LPQWORD lpTotalNumberOfFreeBytes
  72575.         );
  72576.     "
  72577.  
  72578.     <stdcall: bool GetDiskFreeSpaceExA lpstr qword* qword* qword*>
  72579.     ^self invalidCall!
  72580.  
  72581. getEnvironmentVariable: nameString lpBuffer: bufString nSize: bufSize
  72582.     "Populate bufString with the value of the specified environment variable.
  72583.         DWORD GetEnvironmentVariable(
  72584.             LPCTSTR lpName,    // address of environment variable name 
  72585.             LPTSTR lpBuffer,    // address of buffer for variable value 
  72586.             DWORD nSize     // size of buffer, in characters 
  72587.         );"
  72588.  
  72589.     <stdcall: dword GetEnvironmentVariableA lpstr lpstr dword>
  72590.     ^self invalidCall!
  72591.  
  72592. getFileAttributes: aFileName
  72593.     "Answer attributes for the specified file or directory. 
  72594.         DWORD GetFileAttributes(
  72595.             LPCTSTR  lpFileName     // address of the name of a file or directory  
  72596.         );"
  72597.  
  72598.     <stdcall: sdword GetFileAttributesA lpstr>
  72599.     ^self invalidCall!
  72600.  
  72601. getFileSize: aHandle lpFileSizeHigh: aDWORD
  72602.     "Answers the low-order dword of the size, in bytes, of the specified file. 
  72603.  
  72604.         DWORD GetFileSize(
  72605.             HANDLE hFile, // handle of file to get size of
  72606.             LPDWORD lpFileSizeHigh, // address of high-order word for file size if required.
  72607.         );"
  72608.  
  72609.     <stdcall: dword GetFileSize handle DWORD* >
  72610.     ^self invalidCall!
  72611.  
  72612. getFileTime: hFile 
  72613.         lpCreationTime: lpCreationTime 
  72614.         lpLastAccessTime: lpLastAccessTime 
  72615.         lpLastWriteTime: lpLastWriteTime
  72616.     "Answer file times for the File with the specified handle.
  72617.         BOOL GetFileTime(
  72618.             HANDLE hFile, // 
  72619.             LPFILETIME lpCreationTime, 
  72620.             LPFILETIME lpLastAccessTime, 
  72621.             LPFILETIME lpLastWriteTime 
  72622.         );"
  72623.  
  72624.     <stdcall: bool GetFileTime handle FILETIME* FILETIME* FILETIME*>
  72625.     ^self invalidCall!
  72626.  
  72627. getFullPathName: fname nBufferLength: anInteger lpBuffer: path lpFilePart: aDWORD
  72628.     "Retrieves the full path and filename of the file with name fname, into the buffer, path.
  72629.  
  72630.         DWORD GetFullPathName(
  72631.               LPCTSTR  lpFileName,    // address of name of file to find path for 
  72632.             DWORD  nBufferLength,    // size, in characters, of path buffer 
  72633.             LPTSTR  lpBuffer,        // address of path buffer 
  72634.             LPTSTR  *lpFilePart     // address of filename in path 
  72635.         );"
  72636.  
  72637.     <stdcall: dword GetFullPathNameA lpstr dword lpstr lpvoid>
  72638.     ^self invalidCall!
  72639.  
  72640. getLastError
  72641.     "Answer the last Win32 error code which occurred.
  72642.         DWORD GetLastError(VOID)"
  72643.   
  72644.     <stdcall: dword GetLastError>
  72645.     ^self invalidCall!
  72646.  
  72647. getLocaleInfo: locale lCType: lcType lpLCData: outputStringOutput cchData: anInteger
  72648.     "Answer information about a locale. 
  72649.         int GetLocaleInfo(
  72650.               LCID  Locale,        // locale identifier 
  72651.             LCTYPE  LCType,    // type of information 
  72652.             LPTSTR  lpLCData,    // address of buffer for information 
  72653.             int  cchData         // size of buffer 
  72654.         );"
  72655.  
  72656.     <stdcall: sdword GetLocaleInfoA dword dword lpstr sdword>
  72657.     ^self invalidCall!
  72658.  
  72659. getLocalTime: aWinSYSTEMTIME
  72660.     "Retrieve the current local date and time.
  72661.         VOID GetLocalTime(
  72662.               LPSYSTEMTIME  lpSystemTime     // address of system time structure  
  72663.         );"
  72664.  
  72665.     <stdcall: void GetLocalTime SYSTEMTIME* >
  72666.     ^self invalidCall!
  72667.  
  72668. getModuleFileName: aHandle lpFilename: aString nSize: anInteger
  72669.     "Retrieve the full path and filename for the executable file containing the specified module.
  72670.  
  72671.         DWORD GetModuleFileName(
  72672.               HMODULE  hModule,        // handle to module to find filename for 
  72673.             LPTSTR  lpFilename,    // pointer to buffer for module path 
  72674.             DWORD  nSize             // size of buffer, in characters 
  72675.         );"
  72676.  
  72677.     <stdcall: dword GetModuleFileNameA handle lpstr dword>
  72678.     ^self invalidCall
  72679.  
  72680.  
  72681. !
  72682.  
  72683. getModuleHandle: aString
  72684.  
  72685.     <stdcall: handle GetModuleHandleA lpstr>
  72686.     ^self invalidCall
  72687.  
  72688.  
  72689. !
  72690.  
  72691. getProcAddress: aHandle lpProcName: aString
  72692.     "Answer the address of an exported function with name, aString, in the
  72693.     module with handle, aHandle. If the function fails, NULL is returned,
  72694.     and #getLastError should be used to retrieve extended error information.
  72695.  
  72696.         FARPROC GetProcAddress(
  72697.             HMODULE  hModule,    // handle to DLL module  
  72698.             LPCSTR  lpProcName     // name of function 
  72699.         );"
  72700.  
  72701.     <stdcall: lpvoid GetProcAddress handle lpvoid>
  72702.     ^self invalidCall!
  72703.  
  72704. getProcAddressDWORD: aHandle lpProcName: aString
  72705.     "Private - As #getProcAddress:name:, but answers the result as a Windows DWORD (unsigned
  72706.     double word). This is useful in conjunction with SetWindowLong() etc."
  72707.  
  72708.     <stdcall: dword GetProcAddress handle lpvoid>
  72709.     ^self invalidCall!
  72710.  
  72711. getProcessHeap
  72712.     "Answer the handle of the heap of the calling process for use with other
  72713.     memory management functions.
  72714.  
  72715.         HANDLE GetProcessHeap()"
  72716.  
  72717.     <stdcall: handle GetProcessHeap>
  72718.     ^self invalidCall
  72719.  
  72720.   
  72721. !
  72722.  
  72723. getShortPathName: lpszLongPath lpszShortPath: lpszShortPath cchBuffer: cchBuffer
  72724.     "Answers the short pathname form of lpszLongPath in lpszShortPath"
  72725.  
  72726.     <stdcall: dword GetShortPathNameA lpstr lpstr dword>
  72727.     ^self invalidCall!
  72728.  
  72729. getStdHandle: nStdHandle
  72730.     "Get the handle for the standard input, standard output, or standard error device.
  72731.         HANDLE GetStdHandle(
  72732.               DWORD nStdHandle,    // input, output, or error device 
  72733.         );"
  72734.  
  72735.     <stdcall: handle GetStdHandle dword>
  72736.     ^self invalidCall!
  72737.  
  72738. getSystemDefaultLCID
  72739.       "Answer the system default locale identifier. 
  72740.  
  72741.             LCID GetSystemDefaultLCID(VOID)"
  72742.   
  72743.     <stdcall: dword GetSystemDefaultLCID>
  72744.     ^self invalidCall!
  72745.  
  72746. getSystemDirectory: lpBuffer uSize: uSize
  72747.       "Answer the path of the windows system directory.
  72748.  
  72749.         UINT GetSystemDirectory(
  72750.             LPTSTRálpBuffer, 
  72751.             UINTáuSize); "
  72752.   
  72753.     <stdcall: dword GetSystemDirectoryA lpstr dword>
  72754.     ^self invalidCall!
  72755.  
  72756. getTempFileName: pathString lpPrefixString: prefixString uUnique: anInteger lpTempFileName: bufferString
  72757.     "Generate a temporary file name by concatenating the specified path and prefix strings, and a hexadecimal string formed from 
  72758.     the Integer, unique, and the .TMP extension. If anInteger is zero, the function generates a suitable value and creates
  72759.     the temporary file in the specified directory, otherwise the function generates the name (using the specified value) but does
  72760.     not create the file.
  72761.  
  72762.         UINT GetTempFileName(
  72763.               LPCTSTR  lpPathName,        // address of directory name for temporary file 
  72764.             LPCTSTR  lpPrefixString,    // address of filename prefix 
  72765.             UINT  uUnique,    // number used to create temporary filename 
  72766.             LPTSTR  lpTempFileName     // address of buffer that receives the new filename 
  72767.         );"
  72768.  
  72769.     <stdcall: dword GetTempFileNameA lpstr lpstr dword lpstr>
  72770.     ^self invalidCall!
  72771.  
  72772. getTempPath: nBufferLength lpBuffer: lpBuffer
  72773.     "Populate the <String> buffer, lpBuffer, with the system directory designated for temporary files.
  72774.     Answers the number of characters written to the buffer."
  72775.  
  72776.     <stdcall: dword GetTempPathA dword lpstr>
  72777.     ^self invalidCall!
  72778.  
  72779. getTimeFormat: locale dwFlags: dwFlags lpTime: aWinSYSTEMTIME lpFormat: formatString lpTimeStr: outputStringOutput cchBuf: anInteger
  72780.     "Format a time as a date string for a specified locale. If formatString is null then the current locale 
  72781.     is used. If aWinSYSTEMTIME is null then the current local time is used.
  72782.  
  72783.         int GetTimeFormat(
  72784.             LCID  Locale,                    // locale for which time is to be formatted 
  72785.             DWORD  dwFlags,                // flags specifying function options 
  72786.             CONST SYSTEMTIME *  lpTime,    // time to be formatted 
  72787.             LPCTSTR  lpFormat,                // time format string 
  72788.             LPTSTR  lpTimeStr,                // buffer for storing formatted string 
  72789.             int  cchTime                    // size of buffer 
  72790.         );"
  72791.  
  72792.     "Avoid creating indirect ref. to SYSTEMTIME from its own #displayOn: by using void* parm instead"
  72793.     <stdcall: sdword GetTimeFormatA dword dword void* lpstr lpstr sdword>
  72794.     ^self invalidCall
  72795.  
  72796. !
  72797.  
  72798. getTimeZoneInformation: lpTimeZoneInformation
  72799.     "Populate the fields of lpTimeZoneInformation with the current
  72800.     time-zone parameters. These parameters control the translations between 
  72801.     Coordinated Universal Time (UTC) and local time. Answers an integer from 
  72802.     the TIME_ZONE_XXXX enumeration.
  72803.  
  72804.         DWORD GetTimeZoneInformation(
  72805.             LPTIME_ZONE_INFORMATION lpTimeZoneInformation
  72806.         );
  72807.  
  72808.     Implementation Note: The error return value is 0xFFFFFFFF so to make stay
  72809.     within SmallInteger range we declare a signed integer return type so that the
  72810.     error return is instead -1."
  72811.  
  72812.     <stdcall: sdword GetTimeZoneInformation TIME_ZONE_INFORMATION*>
  72813.     ^self invalidCall!
  72814.  
  72815. getUserDefaultLCID
  72816.       "Answer the user default locale identifier. 
  72817.  
  72818.         LCID GetUserDefaultLCID(VOID)"
  72819.   
  72820.     <stdcall: dword GetUserDefaultLCID>
  72821.     ^self invalidCall!
  72822.  
  72823. getVersionEx: anOSVERSIONINFO
  72824.     "Populate the argument with extended OS version information. Answers whether the request succeeded.
  72825.         BOOL GetVersionEx(
  72826.             LPOSVERSIONINFO lpVersionInformation 
  72827.         );"
  72828.  
  72829.     <stdcall: bool GetVersionExA OSVERSIONINFO* >
  72830.     ^self invalidCall!
  72831.  
  72832. getVolumeInformation: lpRootPathName
  72833.     lpVolumeNameBuffer: lpVolumeNameBuffer
  72834.     nVolumeNameSize: nVolumeNameSize
  72835.     lpVolumeSerialNumber: lpVolumeSerialNumber
  72836.     lpMaximumComponentLength: lpMaximumComponentLength
  72837.     lpFileSystemFlags: lpFileSystemFlags
  72838.     lpFileSystemNameBuffer: lpFileSystemNameBuffer
  72839.     nFileSystemNameSize: nFileSystemNameSize
  72840.  
  72841.     "
  72842.         BOOL GetVolumeInformation(
  72843.             LPCTSTR lpRootPathName,
  72844.             LPTSTR lpVolumeNameBuffer,
  72845.             DWORD nVolumeNameSize,
  72846.             LPDWORD lpVolumeSerialNumber, 
  72847.             LPDWORD lpMaximumComponentLength,
  72848.             LPDWORD lpFileSystemFlags,
  72849.             LPTSTR lpFileSystemNameBuffer,
  72850.             DWORD nFileSystemNameSize);
  72851.     "
  72852.  
  72853.     <stdcall: bool GetVolumeInformationA lpstr lpstr dword dword* dword* dword* lpstr dword>
  72854.     ^self invalidCall!
  72855.  
  72856. getWindowsDirectory: lpBuffer uSize: uSize
  72857.       "Answer the path of the windows directory.
  72858.  
  72859.         UINT GetWindowsDirectory(
  72860.             LPTSTRálpBuffer, 
  72861.             UINTáuSize); "
  72862.   
  72863.     <stdcall: dword GetWindowsDirectoryA lpstr dword>
  72864.     ^self invalidCall!
  72865.  
  72866. globalAlloc: uFlags dwBytes: dwBytes
  72867.     "Allocates the specified number of bytes from the heap.
  72868.  
  72869.         HGLOBAL GlobalAlloc( 
  72870.             UINTáuFlags,         // object allocation attributes 
  72871.             DWORDádwBytesá     // number of bytes to allocate 
  72872.         );"
  72873.  
  72874.     <stdcall: handle GlobalAlloc dword dword>
  72875.     ^self invalidCall!
  72876.  
  72877. globalLock: hGlobal
  72878.     "Answer a pointer to a block of global memory object that was allocated 
  72879.     by the GlobalAlloc(...GMEM_MOVEABLE flag), incrementing its lock count."
  72880.  
  72881.     <stdcall: lpvoid GlobalLock handle>
  72882.     ^self invalidCall!
  72883.  
  72884. globalUnlock: hGlobal
  72885.     "Decrement the lock count of a global memory object that was allocated 
  72886.     by the GlobalAlloc(...GMEM_MOVEABLE flag)."
  72887.  
  72888.     <stdcall: bool GlobalUnlock handle>
  72889.     ^self invalidCall!
  72890.  
  72891. heapAlloc: aHandle dwFlags: flagsInteger dwBytes: byteSizeInteger
  72892.     "Allocate a block of memory from a heap.
  72893.  
  72894.         LPVOID HeapAlloc(
  72895.             HANDLE hHeap,    // handle to the private heap block 
  72896.             DWORD dwFlags,    // heap allocation control flags 
  72897.             DWORD dwBytes     // number of bytes to allocate 
  72898.         );"
  72899.  
  72900.     <stdcall: lpvoid HeapAlloc handle dword dword>
  72901.     ^self invalidCall!
  72902.  
  72903. heapCompact: aHandle dwFlags: anInteger
  72904.     "Minimize the size of the specified heap. Answer the size of the largest
  72905.     available free block (fairly meaningless), or zero on failure.
  72906.         UINT HeapCompact(
  72907.             HANDLE hHeap,    // handle to the heap to compact
  72908.             DWORD dwFlags     // control flags
  72909.         );"
  72910.  
  72911.     <stdcall: dword HeapCompact handle dword>
  72912.     ^self invalidCall!
  72913.  
  72914. heapFree: aHandle dwFlags: flagsInteger lpMem: byteSizeInteger
  72915.     "Free a block of memory to a heap, answering whether it succeeed.
  72916.     N.B. There is no distinction under Win32 between memory blocks allocated
  72917.     with GlobalAlloc(), LocalAlloc(), or from the default process heap using
  72918.     HeapAlloc(). We therefore standardise on the HeapXXX() set of functions
  72919.     (which are more powerful and allow multiple heaps), and use HeapFree() to
  72920.     free memory blocks where LocalFree()/GlobalFree() are specified.
  72921.  
  72922.         LPVOID HeapFree(
  72923.             HANDLE hHeap,    // handle to the heap
  72924.             DWORD dwFlags,    // heap freeing flags 
  72925.             LPVOID lpMem     // pointer to the memory to free
  72926.         );"
  72927.  
  72928.     <stdcall: bool HeapFree handle dword lpvoid>
  72929.     ^self invalidCall!
  72930.  
  72931. heapReAlloc: aHandle dwFlags: flagsInteger lpMem: anAddress dwBytes: byteSizeInteger
  72932.     "Resize an block of heap memory, answering the new block address (which may or may not change).
  72933.  
  72934.         LPVOID HeapReAlloc(
  72935.             HANDLE hHeap,    // handle of a heap 
  72936.             DWORD dwFlags,    // heap reallocation flags 
  72937.             LPVOID lpMem,    // pointer to the memory to reallocate 
  72938.             DWORD dwBytes     // number of bytes to reallocate 
  72939.         );"
  72940.  
  72941.   
  72942.     <stdcall: lpvoid HeapReAlloc handle dword lpvoid dword>
  72943.     ^self invalidCall!
  72944.  
  72945. heapSize: aHandle dwFlags: flagsInteger lpMem: anAddress
  72946.     "Answer the size of the block of memory allocated at the specified address.
  72947.   
  72948.         DWORD HeapSize(
  72949.             HANDLE hHeap,    // handle to a heap
  72950.             DWORD dwFlags,    // heap size control flags
  72951.             LPCVOID lpMem,    // pointer to the memory block of interest
  72952.         );"
  72953.  
  72954.   
  72955.     <stdcall: dword HeapSize handle dword lpvoid>
  72956.     ^self invalidCall!
  72957.  
  72958. heapValidate: aHandle dwFlags: anInteger lpMem: anAddress
  72959.     "Answer whether the specified heap/memory block in a heap, is valid.
  72960.  
  72961.         BOOL HeapValidate(
  72962.             HANDLE hHeap,    // handle to the heap of interest
  72963.             DWORD dwFlags,    // bit flags that control heap access during function operation
  72964.             LPCVOID lpMem     // optional pointer to individual memory block to validate
  72965.         );"
  72966.  
  72967.     <stdcall: bool HeapValidate handle dword lpvoid>
  72968.     ^self invalidCall!
  72969.  
  72970. loadLibraryEx: aString hFile: reserved dwFlags: anInteger
  72971.     "Map the specified executable module into the address space of the calling process, and answer the module
  72972.     handle. If the function fails, the return value is nil.
  72973.  
  72974.         HINSTANCE LoadLibraryEx(
  72975.             LPCTSTR lpLibFileName,    // points to name of executable module
  72976.             HANDLE hFile,    // reserved, must be NULL 
  72977.             DWORD dwFlags     // entry-point execution flag 
  72978.         );
  72979.     
  72980.     The library is loaded from either the directory from which Dolphin was loaded, the current directory, 
  72981.     the Windows system directory, the Windows directory, or a directory on the path (in that order)."
  72982.  
  72983.     <stdcall: handle LoadLibraryExA lpstr handle dword>
  72984.     ^self invalidCall!
  72985.  
  72986. loadResource: anInstanceHandle hResInfo: aResourceHandle
  72987.     "Load the specified resource into global memory. 
  72988.         HGLOBAL LoadResource(
  72989.               HMODULE hModule,    // resource-module handle  
  72990.             HRSRC hResInfo     // resource handle 
  72991.         );"
  72992.  
  72993.     <stdcall: handle LoadResource handle handle>
  72994.     ^self invalidCall!
  72995.  
  72996. localFileTimeToFileTime: lpLocalFileTime lpFileTime: lpFileTime
  72997.     "Convert a UTC FILETIME to a local FILETIME, answering whether the conversion succeeded.
  72998.         BOOL LocalFileTimeToFileTime(
  72999.               CONST FILETIME *lpLocalFileTime,    // pointer to UTC file time to convert 
  73000.             LPFILETIME lpFileTime            // pointer to structure to receive UTC
  73001.         );"
  73002.  
  73003.     <stdcall: bool LocalFileTimeToFileTime FILETIME* FILETIME* >
  73004.     ^self invalidCall!
  73005.  
  73006. lockResource: anExternalHandle
  73007.     "Lock the specified resource in memory. 
  73008.         LPVOID LockResource(
  73009.               HGLOBAL hResData     // handle to resource to lock 
  73010.         );"
  73011.  
  73012.     <stdcall: dword LockResource handle>
  73013.     ^self invalidCall!
  73014.  
  73015. lstrcmp: aString1 lpString2: aString2
  73016.       "Answer -1, 0 or 1 depending on whether aString collates before, the same as, 
  73017.     or after aString2 sensitive to case (respectively).
  73018.         int lstrcmp(
  73019.               LPCTSTR lpString1,    // address of first string 
  73020.             LPCTSTR lpString2     // address of second string 
  73021.         );
  73022.  
  73023.     N.B. If you need more flexibility, implement the CompareStrings() call (which
  73024.     this probably just layers on top of anyway)."
  73025.  
  73026.     <stdcall: sdword lstrcmpA lpstr lpstr>
  73027.     ^self invalidCall!
  73028.  
  73029. lstrcmpi: aString1 lpString2: aString2
  73030.       "Answer -1, 0 or 1 depending on whether aString collates before, the same as, 
  73031.     or after aString2 ignoring case (respectively).
  73032.         int lstrcmpi(
  73033.               LPCTSTR lpString1,    // address of first string 
  73034.             LPCTSTR lpString2     // address of second string 
  73035.         );
  73036.  
  73037.     N.B. If you need more flexibility, implement the CompareStrings() call (which
  73038.     this probably just layers on top of anyway)."
  73039.  
  73040.     <stdcall: sdword lstrcmpiA lpstr lpstr>
  73041.     ^self invalidCall!
  73042.  
  73043. lstrlenW: aUnicodeString
  73044.     "Answer the length in characters of the parameter (assumed to point
  73045.     at a null-terminated unicode String."
  73046.  
  73047.     <stdcall: sdword lstrlenW lpvoid>
  73048.     ^self invalidCall!
  73049.  
  73050. moveFile: aStringOldFileName lpNewFileName: aStringnewFileName
  73051.     "The MoveFile function will move (rename) either a file or a directory (including all its children)
  73052.     either in the same directory or across directories. The one caveat is that the MoveFile function will
  73053.     fail on directory moves when the destination is on a different volume. 
  73054.     Answer true if the function succeeds. 
  73055.  
  73056.     BOOL MoveFile(
  73057.         LPCTSTR lpExistingFileName, // address of name of the existing file  
  73058.         LPCTSTR lpNewFileName // address of new name for the file 
  73059.         );"
  73060.  
  73061.     <stdcall: bool MoveFileA lpstr lpstr>
  73062.     ^self invalidCall!
  73063.  
  73064. moveFileEx: aStringOldFileName lpNewFileName: aStringnewFileName dwFlags: flags
  73065.     "The MoveFileEx function will move (rename) either a file or a directory (including all its children)
  73066.     either in the same directory or across directories. The one caveat is that the MoveFile function will
  73067.     fail on directory moves when the destination is on a different volume. 
  73068.     Answer true if the function succeeds. 
  73069.  
  73070.     BOOL MoveFile(
  73071.         LPCTSTR lpExistingFileName, // address of name of the existing file  
  73072.         LPCTSTR lpNewFileName // address of new name for the file 
  73073.         DWORD dwFlags <> // move options 
  73074.         );"
  73075.  
  73076.     <stdcall: bool MoveFileExA lpstr lpstr dword>
  73077.     ^self invalidCall!
  73078.  
  73079. multiByteToWideChar: intCP dwFlags: intFlags lpMultiByteStr: aStringIn 
  73080.     cchMultiByte: intLenIn
  73081.     lpWideCharStr: aUnicodeStringOut
  73082.     cchWideChar: intLenOut
  73083.  
  73084.     "Maps a string to a wide-character (Unicode) string. 
  73085.     Despite the name, aStringIn, need not contain MBCS characters.
  73086.  
  73087.         int MultiByteToWideChar(
  73088.             UINT CodePage,    // code page 
  73089.             DWORD dwFlags,    // character-type options 
  73090.             LPCSTR lpMultiByteStr,    // address of string to map 
  73091.             int cchMultiByte,    // number of characters in string 
  73092.             LPWSTR lpWideCharStr,    // address of wide-character buffer 
  73093.             int cchWideChar     // size of buffer 
  73094.         );"
  73095.  
  73096.     <stdcall: sdword MultiByteToWideChar dword dword lpstr sdword lpstr sdword>
  73097.     ^self invalidCall!
  73098.  
  73099. outputDebugString: aString
  73100.     "Send aString to the debugger.
  73101.  
  73102.         VOID OutputDebugString(
  73103.               LPCTSTR  lpOutputString     // address of string to be displayed  
  73104.         );"
  73105.  
  73106.     <stdcall: void OutputDebugStringA lpstr>
  73107.     ^self invalidCall!
  73108.  
  73109. pulseEvent: aHandle
  73110.     "Set to its 'signalled' state the Win32 Event identified by aHandle, 
  73111.     then reset it to its 'non-signalled' state. Answer whether the function 
  73112.     succeeded or failed. Manual reset Events release all waiting threads when
  73113.     pulsed, auto-reset events release a single waiting thread. If no threads
  73114.     are waiting for the event, then the effect is to reset the Event to its
  73115.     non-signalled state."
  73116.  
  73117.     "BOOL PulseEvent(
  73118.         HANDLE  hEvent     // handle of event object 
  73119.     );"
  73120.  
  73121.     <stdcall: bool PulseEvent handle>
  73122.     ^self invalidCall!
  73123.  
  73124. queryPerformanceCounter: aLargeInteger
  73125.     "The QueryPerformanceCounter function retrieves the current value of the high-resolution performance counter, if one exists. 
  73126.         BOOL QueryPerformanceCounter(
  73127.             LARGE_INTEGER *lpPerformanceCount     // address of current counter value
  73128.         );"
  73129.  
  73130.     <stdcall: bool QueryPerformanceCounter LARGE_INTEGER* >
  73131.     ^self invalidCall
  73132.  
  73133. !
  73134.  
  73135. queryPerformanceFrequency: aLargeInteger
  73136.     "The QueryPerformanceFrequency function retrieves the frequency of the high-resolution performance counter, if one exists. 
  73137.         BOOL QueryPerformanceFrequency(
  73138.               LARGE_INTEGER *lpFrequency     // address of current frequency
  73139.         );"
  73140.  
  73141.     <stdcall: bool QueryPerformanceFrequency LARGE_INTEGER*>
  73142.     ^self invalidCall!
  73143.  
  73144. raiseException: dwExceptionCode dwExceptionFlags: dwExceptionFlags nNumberOfArguments: nNumberOfArguments lpArguments: lpArguments
  73145.  
  73146.     <stdcall: void RaiseException dword dword dword DWORD*>
  73147.     ^self invalidCall
  73148.  
  73149. "
  73150. | parms |
  73151. parms := DWORDArray new: 1.
  73152. parms at: 1 put: 'Hello' yourAddress.
  73153. KernelLibrary default raiseException: 16r20000002 dwExceptionFlags: 0 
  73154.     nNumberOfArguments: 1 lpArguments: parms
  73155. "!
  73156.  
  73157. readFile: aHandle lpBuffer: anAddress nNumberOfBytesToRead: anIntegerBytesToRead
  73158.         lpNumberOfBytesRead: anAddressBytesRead lpOverlapped: anOVERLAPPED
  73159.     "The ReadFile function reads data from a file, starting at the position indicated by the file pointer.
  73160.     After the read operation has been completed, the file pointer is adjusted by the number of bytes actually read,
  73161.     unless the file handle is created with the overlapped attribute. If the file handle is created for overlapped
  73162.     input and output (I/O), the application must adjust the position of the file pointer after the read operation. 
  73163.  
  73164.     BOOL ReadFile(
  73165.         HANDLE hFile, // handle of file to read 
  73166.         LPVOID lpBuffer, // address of buffer that receives data  
  73167.         DWORD nNumberOfBytesToRead, // number of bytes to read 
  73168.         LPDWORD lpNumberOfBytesRead, // address of number of bytes read 
  73169.         LPOVERLAPPED lpOverlapped // address of structure for data 
  73170.         );
  73171.  
  73172.     Answer a boolean indicating whether the function succeeds. If successful and bytesRead is left set to zero,
  73173.     the file pointer was beyond the current end of the file at the time of the read operation."
  73174.  
  73175.     <stdcall: bool ReadFile handle lpvoid dword DWORD* lpvoid>
  73176.     ^self invalidCall!
  73177.  
  73178. removeDirectory: aStringFileName
  73179.     <stdcall: bool RemoveDirectoryA lpstr>
  73180.     ^self invalidCall!
  73181.  
  73182. resetEvent: aHandle
  73183.     "Set the specified Win32 Event object to its 'signalled' state.
  73184.     Answer whether the function succeeded or failed. Manual reset
  73185.     Events remain in the signalled state until explicitly reset (e.g.
  73186.     using #resetEvent:), auto-reset events remain in the signalled state
  73187.     until a single thread waiting for the event is released.
  73188.  
  73189.         BOOL ResetEvent(
  73190.             HANDLE  hEvent     // handle of event object 
  73191.         );"
  73192.  
  73193.     <stdcall: bool ResetEvent handle>
  73194.     ^self invalidCall!
  73195.  
  73196. setConsoleCtrlHandler: pHandlerRoutine add: aBoolean
  73197.     "Set the handler function which receives console control events."
  73198.  
  73199.     <stdcall: bool SetConsoleCtrlHandler void* bool>
  73200.     ^self invalidCall!
  73201.  
  73202. setEndOfFile: anExternalHandle
  73203.     <stdcall: bool SetEndOfFile handle>
  73204.     ^self invalidCall!
  73205.  
  73206. setEnvironmentVariable: lpName lpValue: lpValue
  73207.     "Sets the value of an environment variable for the current process. Answer whether the
  73208.     request was successful.
  73209.         BOOL SetEnvironmentVariable(
  73210.             LPCTSTR lpName,    // address of environment variable name  
  73211.               LPCTSTR lpValue     // address of new value for variable 
  73212.         );"
  73213.  
  73214.     <stdcall: bool SetEnvironmentVariableA lpstr lpstr>
  73215.     ^self invalidCall!
  73216.  
  73217. setEvent: aHandle
  73218.     "Set the specified Win32 Event object to its 'signalled' state.
  73219.     Answer whether the function succeeded or failed. Manual reset
  73220.     Events remain in the signalled state until explicitly reset (e.g.
  73221.     using #resetEvent:), auto-reset events remain in the signalled state
  73222.     until a single thread waiting for the event is released.
  73223.  
  73224.         BOOL SetEvent(
  73225.             HANDLE  hEvent     // handle of event object 
  73226.         );"
  73227.  
  73228.     <stdcall: bool SetEvent handle>
  73229.     ^self invalidCall!
  73230.  
  73231. setFilePointer: aHandle lDistanceToMove: loInteger lpDistanceToMoveHigh: anAddress dwMoveMethod: senseOfMove
  73232.     "Moves the file pointer of an open file. 
  73233.  
  73234.     DWORD SetFilePointer(
  73235.         HANDLE hFile,                 // handle of file 
  73236.         LONG lDistanceToMove,         // number of bytes to move file pointer 
  73237.         PLONG lpDistanceToMoveHigh, // address of high-order word of distance to move  
  73238.         DWORD dwMoveMethod             // how to move 
  73239.         );"
  73240.  
  73241.     <stdcall: dword SetFilePointer handle sdword lpvoid dword>
  73242.     ^self invalidCall!
  73243.  
  73244. setLastError: anInteger
  73245.     "Set the last Win32 error code which occurred.
  73246.         VOID SetLastError(DWORD dwErrCode)"
  73247.   
  73248.     <stdcall: void SetLastError dword>
  73249.     ^self invalidCall!
  73250.  
  73251. setStdHandle: nStdHandle hHandle: aHandle
  73252.     "Set the handle for the standard input, standard output, or standard error device.
  73253.         BOOL SetStdHandle(
  73254.               DWORD nStdHandle,    // input, output, or error device 
  73255.             HANDLE hHandle     // handle to be a standard handle  
  73256.         );"
  73257.  
  73258.     <stdcall: bool SetStdHandle dword handle>
  73259.     ^self invalidCall!
  73260.  
  73261. setVolumeLabel: lpRootPathName lpVolumeName: lpVolumeName
  73262.     "Set the label of a a file system volume. Answer whether the operation succeeded.
  73263.         BOOL SetVolumeLabel( 
  73264.             LPCTSTR lpRootPathName,
  73265.             LPCTSTR lpVolumeName
  73266.         );"
  73267.  
  73268.     <stdcall: bool SetVolumeLabelA lpstr lpstr>
  73269.     ^self invalidCall!
  73270.  
  73271. sizeOfResource: anExternalHandleInstance hResInfo: anExternalHandleResource
  73272.     "Answer the byte size of the specified resource. 
  73273.         DWORD SizeofResource(
  73274.             HMODULE hModule,    // resource-module handle  
  73275.             HRSRC hResInfo     // resource handle 
  73276.         );"
  73277.  
  73278.     <stdcall: dword SizeofResource handle handle>
  73279.     ^self invalidCall!
  73280.  
  73281. sleep: anInteger
  73282.     "Put the calling Win32 thread to sleep for anInteger milliseconds.
  73283.         void Sleep(
  73284.             DWORD dwMilliseconds    // sleep duration in millisecs
  73285.         );
  73286.     N.B. This is an overlapped call, and will not interrupt the execution
  73287.     of Dolphin's background threads since it is performed on a separate
  73288.     thread. Only the calling Process will be delayed.!!
  73289.     "
  73290.  
  73291.     <overlap stdcall: void Sleep dword>
  73292.     ^self invalidCall!
  73293.  
  73294. system: aCommandString
  73295.     "Execute aCommandString"
  73296.  
  73297.     | proc |
  73298.     #deprecated.
  73299.     SessionManager current openConsole.
  73300.     proc := self winExec: aCommandString asParameter
  73301.                 uCmdShow: SW_SHOWDEFAULT.
  73302.     "self freeConsole."
  73303.     ^proc < 32
  73304.         ifTrue: [ self systemError ]
  73305.         ifFalse: [ proc ]!
  73306.  
  73307. systemTimeToFileTime: lpSystemTime lpFileTime: lpFileTime
  73308.      "Convert a SYSTEMTIME to a FILETIME, answering whether the conversion succeeded.
  73309.         BOOL SystemTimeToFileTime(
  73310.             CONST SYSTEMTIME *lpSystemTime,    // address of system time to convert 
  73311.             LPFILETIME lpFileTime     // address of buffer for converted file time 
  73312.         );"
  73313.  
  73314.     <stdcall: bool SystemTimeToFileTime SYSTEMTIME* FILETIME* >
  73315.     ^self invalidCall!
  73316.  
  73317. virtualQuery: lpAddress lpBuffer: aMEMORY_BASIC_INFORMATION dwLength: anInteger
  73318.     "Populate aMEMORY_BASIC_INFORMATION with information about 
  73319.     the range of pages in the virtual address space of the calling process
  73320.     around lpAddress. 
  73321.  
  73322.         DWORD VirtualQuery( 
  73323.             LPCVOID lpAddress, 
  73324.             PMEMORY_BASIC_INFORMATION lpBuffer, 
  73325.             DWORD dwLength);
  73326.     "
  73327.  
  73328.     <stdcall: dword VirtualQuery lpvoid MEMORY_BASIC_INFORMATION* dword>
  73329.     ^self invalidCall!
  73330.  
  73331. wideCharToMultiByte: codePage
  73332.     dwFlags: dwFlags
  73333.     lpWideCharStr: lpWideCharStr
  73334.     cchWideChar: cchWideChar
  73335.     lpMultiByteStr: lpMultiByteStr
  73336.     cchMultiByte: cchMultiByte
  73337.     lpDefaultChar: lpDefaultChar
  73338.     lpUsedDefaultChar: lpUsedDefaultChar
  73339.  
  73340.     "Maps a Unicode string to a multi-byte character string. 
  73341.     Despite the name, aStringOut, need not contain MBCS characters.
  73342.  
  73343.         int WideCharToMultiByte(
  73344.             UINT CodePage,            // code page 
  73345.             DWORD dwFlags,            // performance and mapping flags 
  73346.             LPCWSTR lpWideCharStr,    // address of wide-character string 
  73347.             int cchWideChar,        // number of characters in string 
  73348.             LPSTR lpMultiByteStr,    // address of buffer for new string 
  73349.             int cchMultiByte,        // size of buffer 
  73350.             LPCSTR lpDefaultChar,    // address of default for unmappable characters  
  73351.             LPBOOL lpUsedDefaultChar// address of flag set when default char. used 
  73352.         );"
  73353.  
  73354.     <stdcall: sdword WideCharToMultiByte dword dword UnicodeString* sdword lpstr sdword lpstr lpvoid>
  73355.     ^self invalidCall!
  73356.  
  73357. winExec: lpstrCmdLine uCmdShow: nCmdShow
  73358.     "Spawn the specified application. 
  73359.         UINT WinExec(
  73360.               LPCSTR lpCmdLine,    // address of command line 
  73361.             UINT uCmdShow     // window style for new application 
  73362.         );
  73363.     Note that this is run as an overlapped call to avoid delaying the entire
  73364.     Smalltalk image."
  73365.  
  73366.     <overlap stdcall: dword WinExec lpstr dword>
  73367.     ^self invalidCall!
  73368.  
  73369. writeFile: aHandle lpBuffer: anAddress nNumberOfBytesToWrite: anIntegerBytesToWrite 
  73370.         lpNumberOfBytesWritten: anAddressBytesWritten lpOverlapped: anOVERLAPPED
  73371.     "The WriteFile function writes data to a file and is designed for both synchronous and asynchronous operation.
  73372.     The function starts writing data to the file at the position indicated by the file pointer. After the write
  73373.     operation has been completed, the file pointer is adjusted by the number of bytes actually written, except when
  73374.     the file is opened with FILE_FLAG_OVERLAPPED. If the file handle was created for overlapped input and output
  73375.     (I/O), the application must adjust the position of the file pointer after the write operation is finished. 
  73376.  
  73377.     BOOL WriteFile(
  73378.         HANDLE hFile, // handle of file to write to 
  73379.         LPCVOID lpBuffer, // address of data to write to file 
  73380.         DWORD nNumberOfBytesToWrite, // number of bytes to write 
  73381.         LPDWORD lpNumberOfBytesWritten, // address of number of bytes written 
  73382.         LPOVERLAPPED lpOverlapped // addr. of structure needed for overlapped I/O  
  73383.         );
  73384.  
  73385.     Answer a boolean indicating whether the function succeeds."
  73386.  
  73387.     <stdcall: bool WriteFile handle lpvoid dword DWORD* lpvoid>
  73388.     ^self invalidCall!
  73389.  
  73390. zeroMemory: pvDest length: cBytes
  73391.     <stdcall: void RtlZeroMemory void* dword>
  73392.     ^self invalidCall! !
  73393.  
  73394. UserLibrary comment:
  73395. 'UserLibrary is the <ExternalLibrary> class to represent the Windows system DLL, User32.DLL.
  73396.  
  73397. The default instance of this class provides access to most of the Win32 window management API. New functions may be added as required, but the external function naming convention should be followed.
  73398.  
  73399. All functions in this library use the stdcall calling convention.'!
  73400. !UserLibrary class methodsFor!
  73401.  
  73402. clear
  73403.     "Private - Clear down cached external function addresses and any default 
  73404.     instances of the receiver from previous runs. etc."
  73405.  
  73406.     super clear.
  73407.     self environment at: #NONCLIENTMETRICS ifPresent: [:c | c clear]!
  73408.  
  73409. fileName
  73410.     "Answer the host system file name of the external library which 
  73411.     the receiver represents."
  73412.  
  73413.     ^'USER32'! !
  73414.  
  73415. !UserLibrary methodsFor!
  73416.  
  73417. adjustWindowRectEx: rect dwStyle: styleFlags bMenu: menuPresent dwExStyle: exStyleFlags
  73418.       "Calculates the required size of the rectangle of a window with extended style based 
  73419.     on the desired client-rectangle size. The window rectangle can then be passed to the 
  73420.     CreateWindowEx function to create a window whose client area is the desired size. 
  73421.  
  73422.     BOOL AdjustWindowRectEx(
  73423.         LPRECT lpRect,        // pointer to client-rectangle structure
  73424.         DWORD dwStyle,        // window styles
  73425.         BOOL bMenu,        // menu-present flag
  73426.         DWORD dwExStyle     // extended style
  73427.         );"
  73428.  
  73429.     <stdcall: bool AdjustWindowRectEx RECT* dword bool dword>
  73430.     ^self invalidCall!
  73431.  
  73432. beginPaint: hWindow lpPaint: aPAINTSTRUCT
  73433.     "Prepare the specified window for painting, filling aPAINTSTRUCT
  73434.     structure with information about the painting required. 
  73435.         HDC BeginPaint(
  73436.               HWND hwnd,            // handle to window
  73437.             LPPAINTSTRUCT lpPaint    // pointer to structure for paint information
  73438.         );"
  73439.  
  73440.     <stdcall: handle BeginPaint handle PAINTSTRUCT* >
  73441.     ^self invalidCall!
  73442.  
  73443. bringWindowToTop: hWnd
  73444.     "Bring the specified window to the top of the Z order, activating it if it is a
  73445.     frame window, or its parent frame if it is not. 
  73446.         BOOL BringWindowToTop(
  73447.             HWND hWnd     // handle to window
  73448.         );"
  73449.  
  73450.     <stdcall: bool BringWindowToTop handle>
  73451.     ^self invalidCall!
  73452.  
  73453. callWindowProc: lpPrevWndFunc hWnd: hWnd msg: msg wParam: wParam lParam: lParam
  73454.     "Pass a message to the specified window procedure. 
  73455.         LRESULT CallWindowProc(
  73456.               WNDPROC lpPrevWndFunc,    // pointer to previous procedure
  73457.             HWND hWnd,            // handle to window
  73458.             UINT Msg,                // message
  73459.             WPARAM wParam,            // first message parameter
  73460.             LPARAM lParam             // second message parameter
  73461.         );
  73462.     N.B. As we don't want to pass the address of a Smalltalk object containing
  73463.     the WNDPROC's address to the function, we specify the first parameter
  73464.     as being a DWORD as this allows us to pass a wider range of types."
  73465.  
  73466.     <stdcall: sdword CallWindowProcA dword handle dword dword dword>
  73467.     ^self invalidCall!
  73468.  
  73469. charLower: aCharacter
  73470.     "Answer the lowercase equivalent of aCharacter. This will be dependent on the semantics of the 
  73471.     language selected by the user during setup or by using Control Panel.
  73472.     N.B. We ignore the return value as it will be a pointer to the argument.
  73473.  
  73474.         LPTSTR CharLower(LPTSTR  lpsz);     // single character or pointer to string"
  73475.  
  73476.     <stdcall: char CharLowerA char>
  73477.     ^self invalidCall!
  73478.  
  73479. charUpper: aCharacter
  73480.     "Answer the uppercase equivalent of aCharacter. This will be dependent on the semantics 
  73481.     of the language selected by the user during setup or by using Control Panel.
  73482.  
  73483.         LPTSTR CharUpper(LPTSTR  lpsz);     // single character or pointer to string "
  73484.  
  73485.     <stdcall: char CharUpperA char>
  73486.     ^self invalidCall!
  73487.  
  73488. childWindowFromPointEx: hwnd pt: aPOINTL uFlags: flags
  73489.     "Answers the handle of the window that contains the specified point. 
  73490.         HWND ChildWindowFromPointEx(
  73491.             HWND hwndParent,     // handle to parent window
  73492.             POINT pt,     // structure with point coordinates
  73493.             UINT uFlags    // skipping flags
  73494.         );"
  73495.  
  73496.     <stdcall: handle ChildWindowFromPointEx handle POINTL dword>
  73497.     ^self invalidCall!
  73498.  
  73499. clientToScreen: aWindowHandle lpPoint: aPOINT
  73500.     "Converts the client coordinates in aPOINT to screen coordinates.
  73501.         BOOL ClientToScreen(
  73502.             HWND hWnd,        // window handle for source coordinates 
  73503.             LPPOINT lpPoint     // pointer to structure containing screen coordinates  
  73504.         );"
  73505.  
  73506.     <stdcall: void ClientToScreen handle POINTL* >
  73507.     ^self invalidCall!
  73508.  
  73509. closeClipboard
  73510.     "Close the clipboard. Answers 0 if fails.
  73511.  
  73512.         BOOL CloseClipboard(VOID)"
  73513.  
  73514.     <stdcall: bool CloseClipboard>
  73515.     ^self invalidCall!
  73516.  
  73517. countClipboardFormats
  73518.     "Answer the number of registered clipboard formats.
  73519.         int CountClipboardFormats(VOID)"
  73520.  
  73521.     <stdcall: sdword CountClipboardFormats>
  73522.     ^self invalidCall!
  73523.  
  73524. createAcceleratorTable: pTable cEntries: tableSize
  73525.     "Create an accelerator table. 
  73526.         HACCEL CreateAcceleratorTable(
  73527.               LPACCEL lpaccl,    // pointer to structure array with accelerator data
  73528.             int cEntries         // number of structures in the array
  73529.         );"
  73530.  
  73531.     <stdcall: handle CreateAcceleratorTableA lpvoid sdword>
  73532.     ^self invalidCall!
  73533.  
  73534. createDialog: hInstance lpTemplate: template hWndParent: hParent lpDialogFunc: dlgProc dwInitParam: lParam
  73535.     "Create a modeless dialog box from a dialog box template resource. 
  73536.         HWND CreateDialog(
  73537.               HINSTANCE hInstance,        // handle of module containing template
  73538.             LPCTSTR lpTemplate,        // resource identifier
  73539.             HWND hWndParent,            // handle of owner window
  73540.             DLGPROC lpDialogFunc,         // address of dialog proc
  73541.             LPARAM dwInitParam         // value passed to wmInitDialog:
  73542.         );"
  73543.  
  73544.     <stdcall: sdword CreateDialogParamA handle lpvoid handle lpvoid sdword>
  73545.     ^self invalidCall!
  73546.  
  73547. createMenu
  73548.     "Create an empty menu.
  73549.         HMENU CreateMenu(VOID)"
  73550.  
  73551.     <stdcall: handle CreateMenu>
  73552.     ^self invalidCall!
  73553.  
  73554. createPopupMenu
  73555.     "Create an empty popup menu.
  73556.         HMENU CreateMenu(VOID)"
  73557.  
  73558.     <stdcall: handle CreatePopupMenu>
  73559.     ^self invalidCall!
  73560.  
  73561. createWindowEx: exstyle lpClassName: classname lpWindowName: windowname dwStyle: style 
  73562.         x: x y: y nWidth: width nHeight: height 
  73563.         hWndParent: parent hMenu: menu hInstance: instance lpParam: lpParam
  73564.     "Creates an overlapped, pop-up, or child window with the specified the parent or owner (if any), class, 
  73565.     title, menu, style (and extended style), position and extent. Answer the handle of the
  73566.     new window, or nil if the create fails.
  73567.     N.B. In order to correctly subclass controls so that Dolphin receive's creation messages
  73568.     for those controls, View>>hookWindowCreate should be called before this function.
  73569.         HWND CreateWindowEx(
  73570.             DWORD dwExStyle,        // extended window style
  73571.             LPCTSTR lpClassName,    // pointer to registered class name
  73572.             LPCTSTR lpWindowName,    // pointer to window name
  73573.             DWORD dwStyle,            // window style
  73574.             int x,                // horizontal position of window
  73575.             int y,                // vertical position of window
  73576.             int nWidth,            // window width
  73577.             int nHeight,            // window height
  73578.             HWND hWndParent,        // handle to parent or owner window
  73579.             HMENU hMenu,            // handle to menu, or child-window identifier
  73580.             HINSTANCE hInstance,    // handle to application instance
  73581.             LPVOID lpParam         // pointer to window-creation data
  73582.         );"
  73583.  
  73584.     <stdcall: handle CreateWindowExA dword lpvoid lpvoid dword sdword sdword sdword sdword handle handle handle lpvoid>
  73585.     ^self invalidCall
  73586. !
  73587.  
  73588. defDlgProc: hWnd msg: msg wParam: wParam lParam: lParam
  73589.     "Call the default dialog procedure to provide default processing for 
  73590.     any window messages that an application does not process. 
  73591.  
  73592.         LRESULT DefDlgProc(
  73593.             HWND hDlg,    // handle to dialog box
  73594.             UINT Msg,    // message
  73595.             WPARAM wParam,    // first message parameter
  73596.             LPARAM lParam     // second message parameter
  73597.         );"
  73598.  
  73599.  
  73600.     <stdcall: sdword DefDlgProcA handle dword dword dword>
  73601.     ^self invalidCall!
  73602.  
  73603. defWindowProc: hWnd msg: msg wParam: wParam lParam: lParam
  73604.     "Call the default window procedure to provide default processing for 
  73605.     any window messages that an application does not process. 
  73606.     
  73607.         LRESULT DefWindowProc(
  73608.             HWND hWnd,    // handle to window
  73609.             UINT Msg,    // message identifier
  73610.             WPARAM wParam,    // first message parameter
  73611.             LPARAM lParam     // second message parameter
  73612.         );"
  73613.  
  73614.     <stdcall: sdword DefWindowProcA handle dword dword dword>
  73615.     ^self invalidCall!
  73616.  
  73617. deleteMenu: hMenu uPosition: uPosition uFlags: uFlags
  73618.     "Deletes an item from the the Menu with handle, hMenu.
  73619.  
  73620.         BOOL DeleteMenu(
  73621.             HMENU hMenu,
  73622.             UINT uPosition,
  73623.             UINT uFlags);"
  73624.  
  73625.     <stdcall: bool DeleteMenu handle dword dword>
  73626.     ^self invalidCall!
  73627.  
  73628. destroyAcceleratorTable: hAcceleratorTable
  73629.     "Destroys an accelerator table.
  73630.         BOOL DestroyAcceleratorTable(
  73631.           HACCEL hAccel     // handle to accelerator table
  73632.         );"
  73633.  
  73634.     <stdcall: bool DestroyAcceleratorTable handle>
  73635.     ^self invalidCall!
  73636.  
  73637. destroyIcon: hIcon
  73638.     "Destroy the specified icon.
  73639.         BOOL DestroyIcon(
  73640.               HICON hIcon     // handle to icon to destroy
  73641.         );"
  73642.  
  73643.     <stdcall: bool DestroyIcon handle>
  73644.     ^self invalidCall!
  73645.  
  73646. destroyMenu: hMenu
  73647.     "Destroy the specified menu.
  73648.         BOOL DestroyMenu(
  73649.             HMENU hMenu    // handle to menu to destroy
  73650.             );"
  73651.  
  73652.     <stdcall: bool DestroyMenu handle>
  73653.     ^self invalidCall!
  73654.  
  73655. destroyWindow: aWindowHandle
  73656.     "Destroys the specified window. WM_DESTROY and WM_NCDESTROY messages are sent
  73657.     to the window to deactivate it, and remove the keyboard focus. The window's menu
  73658.     is destroyed, the owning threads message queue flushed, outstanding timers are 
  73659.     destroyed, clipboard ownership is revoked, the clipboard viewer chain is broken 
  73660.     (if the window is at the top of the viewer chain). All owned and child windows
  73661.     are also destroyed. Can also be used to destroys modeless dialog boxes created 
  73662.     by the CreateDialog function. 
  73663.         BOOL DestroyWindow(
  73664.             HWND  hWnd     // handle of window to destroy  
  73665.         );"
  73666.  
  73667.     <stdcall: bool DestroyWindow handle>
  73668.     ^self invalidCall!
  73669.  
  73670. dispatchMessage: aMSG
  73671.     "Dispatch a message to a window procedure.
  73672.         LONG DispatchMessage(
  73673.               CONST MSG *lpmsg     // pointer to structure with message
  73674.         );"
  73675.  
  73676.     <stdcall: sdword DispatchMessageA MSG* >
  73677.     ^self invalidCall!
  73678.  
  73679. drawFocusRect: hdc lprc: aRECT
  73680.     "Draw a rectangle in the style used to indicate focus.
  73681.         BOOL DrawFocusRect(
  73682.               HDC hDC,            // handle to device context
  73683.             CONST RECT *lprc    // pointer to structure for rectangle
  73684.         );"
  73685.  
  73686.     <stdcall: bool DrawFocusRect handle RECT* >
  73687.     ^self invalidCall!
  73688.  
  73689. drawIconEx: hDC xLeft: x yTop: y hIcon: hIcon cxWidth: w cyHeight: h istepIfAniCur: anInteger hbrFlickerFreeDraw: brush diFlags: flags
  73690.     "Draws an icon or cursor on the specified device context as specified by the flags
  73691.     argument, and and stretching or compressing the icon or cursor as specified by the extent.
  73692.  
  73693.         BOOL DrawIconEx(
  73694.             HDC hdc,                    // handle to device context
  73695.             int xLeft,                    // x-coordinate of upper left corner
  73696.             int yTop,                    // y-coordinate of upper left corner
  73697.             HICON hIcon,                // handle to icon to draw
  73698.             int cxWidth,                // width of the icon
  73699.             int cyWidth,                // height of the icon
  73700.             UINT istepIfAniCur,            // index of frame in animated cursor
  73701.             HBRUSH hbrFlickerFreeDraw,    // handle to background brush (or nil)
  73702.             UINT diFlags                // icon-drawing flags
  73703.         );"
  73704.  
  73705.     <stdcall: bool DrawIconEx handle sdword sdword handle sdword sdword dword handle dword>
  73706.     ^self invalidCall!
  73707.  
  73708. drawMenuBar: aWindowHandle
  73709.     "Draw the menu bar of the specified window (e.g. when the bars contents
  73710.     are altered).
  73711.         BOOL DrawMenuBar(
  73712.             HWND hWnd    // handle to window with menu bar to redraw  
  73713.         );"
  73714.  
  73715.     <stdcall: bool DrawMenuBar handle>
  73716.     ^self invalidCall!
  73717.  
  73718. drawTextEx: hdc lpchText: lpchText cchText: cchText lprc: lprc dwDTFormat: dwDTFormat lpDTParams: lpdtParams
  73719.     "Draw text in the specified rectange with the specified options (see Win32 docs)
  73720.  
  73721.         int DrawTextEx(
  73722.             HDC hdc,                                     // handle to device context
  73723.             LPTSTR lpchText,                            // pointer to string to draw 
  73724.             int cchText,                                // length of string to draw 
  73725.             LPRECT lprc,                                // pointer to rectangle coordinates 
  73726.             UINT dwDTFormat,                        // formatting options 
  73727.             LPDRAWTEXTPARAMS lpDTParams    // pointer to struct with options 
  73728.         );
  73729.     " 
  73730.     <stdcall: sdword DrawTextExA handle lpstr sdword RECT* dword lpvoid>
  73731.     ^self invalidCall!
  73732.  
  73733. emptyClipboard
  73734.     "Empty the (open) clipboard. Answers 0 if fails.
  73735.  
  73736.         BOOL EmptyClipboard(VOID)"
  73737.  
  73738.     <stdcall: bool EmptyClipboard>
  73739.     ^self invalidCall!
  73740.  
  73741. enableWindow: aWindowHandle bEnable: aBoolean
  73742.     "Enable or disable mouse and keyboard input to the specified window.
  73743.         BOOL EnableWindow(
  73744.             HWND hWnd,    // handle to window
  73745.             BOOL bEnable     // flag for enabling or disabling input
  73746.         );"
  73747.  
  73748.     <stdcall: bool EnableWindow handle bool>
  73749.     ^self invalidCall
  73750.  
  73751. !
  73752.  
  73753. endDialog: dialogHandle nResult: anInteger
  73754.     "Destroy a modal dialog box, causing the system to end any processing for the dialog box. 
  73755.         BOOL EndDialog(
  73756.             HWND hDlg,    // handle to dialog box
  73757.             int nResult     // value to return
  73758.         );"
  73759.  
  73760.     <stdcall: bool EndDialog handle sdword>
  73761.     ^self invalidCall!
  73762.  
  73763. endPaint: hWindow lpPaint: aPAINTSTRUCT
  73764.     "Mark the end of painting in the specified window (other half of BeginPaint() sandwich).
  73765.         BOOL EndPaint(
  73766.             HWND hWnd,                // handle to window
  73767.             CONST PAINTSTRUCT *lpPaint // pointer to structure for paint data  
  73768.         );"
  73769.  
  73770.     <stdcall: bool EndPaint handle PAINTSTRUCT* >
  73771.     ^self invalidCall!
  73772.  
  73773. enumClipboardFormats: knownFormat
  73774.     "Enumerate the data formats that are currently available on the clipboard, beginning
  73775.     with that specified (set to 0 to start).  Answers 0 at end (in which case GetLastError()
  73776.     will return NO_ERROR), and also if an error occurs.
  73777.  
  73778.         UINT EnumClipboardFormats(
  73779.             UINTáformatá    // specifies a known available clipboard format 
  73780.         );"
  73781.  
  73782.     <stdcall: dword EnumClipboardFormats dword>
  73783.     ^self invalidCall!
  73784.  
  73785. enumWindows: aCallbackThunk lParam: lParam
  73786.     "Enumerate all top-level windows on the screen by passing the handle of each window, in turn, to 
  73787.     the callback function thunk aCallbackThunk. EnumWindows continues until the last top-level window 
  73788.     is enumerated or the callback function returns false.
  73789.  
  73790.         BOOL EnumWindows(
  73791.             WNDENUMPROC lpEnumFunc,    // pointer to callback function
  73792.             LPARAM lParam     // application-defined value
  73793.         );"
  73794.  
  73795.     <stdcall: bool EnumWindows lpvoid dword>
  73796.     ^self invalidCall!
  73797.  
  73798. fillRect: hdc lprc: aRECT hbr: hBrush
  73799.     "Fill a rectangle using the specified brush. Left and top borders are inclusive, 
  73800.     right and bottom exclusive.
  73801.             int FillRect(
  73802.             HDC hDC,            // handle to device context 
  73803.             CONST RECT *lprc,    // pointer to structure with rectangle  
  73804.             HBRUSH hbr         // handle to brush
  73805.         );"
  73806.  
  73807.     <stdcall: bool FillRect handle RECT* handle>
  73808.     ^self invalidCall!
  73809.  
  73810. findWindow: lpClassName lpWindowName: lpWindowName
  73811.     "Find and answer the handle of the top-level window with matching class name and caption."
  73812.  
  73813.     <stdcall: handle FindWindowA lpstr lpstr>
  73814.     ^self invalidCall!
  73815.  
  73816. flashWindow: hWnd bInvert: bInvert
  73817.     "Flash the window with handle, hWnd."
  73818.  
  73819.     <stdcall: bool FlashWindow handle bool>
  73820.     ^self invalidCall!
  73821.  
  73822. flashWindowEx: pfwi
  73823.     "BOOL FlashWindowEx( PFLASHWINFO pfwi // flash status information );"
  73824.  
  73825.     <stdcall: bool FlashWindowEx FLASHWINFO*>
  73826.     ^self invalidCall
  73827. !
  73828.  
  73829. frameRect: hdc lprc: aRECT hbr: hBrush
  73830.     "Draw a border around the specified rectangle using the specified brush.
  73831.     The borders are one logical unit wide and high.
  73832.         int FrameRect(
  73833.             HDC hDC,            // handle to device context 
  73834.             CONST RECT *lprc,    // pointer to rectangle coordinates  
  73835.             HBRUSH hbr         // handle to brush 
  73836.         );"
  73837.  
  73838.     <stdcall: bool FrameRect handle RECT* handle>
  73839.     ^self invalidCall!
  73840.  
  73841. getActiveWindow
  73842.     "Answer the handle of Dolphin's active window (nil if none active)."
  73843.  
  73844.     <stdcall: handle GetActiveWindow>
  73845.     ^self invalidCall!
  73846.  
  73847. getAsyncKeyState: virtualKeyCodeInteger
  73848.     <stdcall: sword GetAsyncKeyState sdword>
  73849.     ^self invalidCall
  73850.  
  73851. !
  73852.  
  73853. getCapture
  73854.     "Retreive the handle of the current window with mouse capture.
  73855.         HANDLE GetCapture(VOID)."
  73856.  
  73857.     <stdcall: handle GetCapture>
  73858.     ^self invalidCall!
  73859.  
  73860. getClassLong: aWindowHandle offset: zeroBasedIntegerOffset
  73861.     "The GetClassLong function retrieves the specified 32-bit (long) value 
  73862.     from the WNDCLASS structure associated with the specified window.
  73863.         DWORD GetClassLong(
  73864.             HWND hWnd,    // handle of window
  73865.             int nIndex     // offset of value to retrieve 
  73866.         );
  73867.     N.B. Note inconsistent return type cf. GetWindowLong()."
  73868.  
  73869.     <stdcall: dword GetClassLongA handle sdword>
  73870.     ^self invalidCall!
  73871.  
  73872. getClassName: aWindowHandle lpClassName: aByteBuffer nMaxCount: anInteger
  73873.     "Retrieves the name of the Windows class to which the specified window belongs.
  73874.         int GetClassName(
  73875.             HWND hWnd,            // handle of window
  73876.             LPTSTR lpClassName,    // address of buffer for class name
  73877.             int nMaxCount             // size of buffer, in characters
  73878.         );"
  73879.  
  73880.     <stdcall: sdword GetClassNameA handle lpvoid sdword>
  73881.     ^self invalidCall!
  73882.  
  73883. getClientRect: aWindowHandle lpRect: aRECT
  73884.     "Retrieve the coordinates of hWnd's client area into aRECT.
  73885.     The client coordinates specify the upper-left and lower-right corners 
  73886.     of the client area. The coordinates of the upper-left corner are always 0@0.
  73887.  
  73888.         BOOL GetClientRect(
  73889.             HWND hWnd,    // handle of window
  73890.             LPRECT lpRect     // address of structure for client coordinates
  73891.         );"
  73892.  
  73893.     <stdcall: bool GetClientRect handle RECT* >
  73894.     ^self invalidCall!
  73895.  
  73896. getClipboardData: format
  73897.       "Answer a global memory handle for the clipboard data in the specified format. 
  73898.     
  73899.         HANDLE GetClipboardData(UINT format);"
  73900.  
  73901.     <stdcall: handle GetClipboardData dword>
  73902.     ^self invalidCall!
  73903.  
  73904. getClipboardFormatName: format lpszFormatName: lpszFormatName cchMaxCount: cchMaxCount
  73905.     "Copy the name of the specified registered clipboard format into the
  73906.     supplied buffer.
  73907.  
  73908.         int GetClipboardFormatName( 
  73909.             UINTáformat,                // clipboard format to retrieve 
  73910.             LPTSTRálpszFormatName,     // address of buffer for name 
  73911.             intácchMaxCountá             // length of name string in characters 
  73912.         );"
  73913.  
  73914.     <stdcall: sdword GetClipboardFormatNameA dword lpstr sdword>
  73915.     ^self invalidCall!
  73916.  
  73917. getCursor
  73918.     "Retrieve the handle of the current system cursor.
  73919.         HCURSOR GetCursor(VOID)."
  73920.  
  73921.     <stdcall: handle GetCursor>
  73922.     ^self invalidCall!
  73923.  
  73924. getCursorPos: aPOINT
  73925.     "Retrieve the cursor's position, in screen coordinates. Answer whether the request succeeds.
  73926.         BOOL GetCursorPos(
  73927.             LPPOINT  lpPoint
  73928.            );"
  73929.  
  73930.     <stdcall: bool GetCursorPos POINTL* >
  73931.     ^self invalidCall!
  73932.  
  73933. getDC
  73934.     "Answer a DC for drawing on the desktop.
  73935.     N.B. This is one half of the <dcSource> protocol, and must be matched with 
  73936.     a call to #releaseDC: to delete the DC.
  73937.         dc := self getDC.
  73938.         self releaseDC: dc.
  73939.     "
  73940.  
  73941.     ^self getWindowDC: self getDesktopWindow!
  73942.  
  73943. getDC: aWindowHandle
  73944.     "Answer the handle of a display device context (DC) which can be used to draw
  73945.     in the client area of the specified window.
  73946.     The DC may be a common, class, or private device context depending on the class 
  73947.     style specified for the window. Common DCs are reinitialized with default 
  73948.     attributes each time, but class and private device contexts are answered
  73949.     in their current state.
  73950.  
  73951.         HDC GetDC(HWND hWnd);"
  73952.  
  73953.     <stdcall: handle GetDC handle>
  73954.     ^self invalidCall!
  73955.  
  73956. getDesktopWindow
  73957.     "Answer the handle of the desktop (ultimate parent) window. Answer that handle. 
  73958.     N.B. Although the desktop window is logically the parent
  73959.     of all top-level windows, its handle is not, sadly, that answered by GetParent()
  73960.     for such windows. View>>parentView does, however, return the desktop window as the
  73961.     parent of top level windows."
  73962.  
  73963.     <stdcall: handle GetDesktopWindow>
  73964.     ^self invalidCall!
  73965.  
  73966. getDlgItem: aWindowHandle nIDDlgItem: anIntegerId
  73967.     "Retrieves the handle of a control in a dialog box. 
  73968.   
  73969.         HWND GetDlgItem(
  73970.               HWND  hDlg,        // handle of dialog box
  73971.             int  nIDDlgItem     // identifier of control
  73972.         );"
  73973.  
  73974.     <stdcall: handle GetDlgItem handle sdword>
  73975.     ^self invalidCall!
  73976.  
  73977. getFocus
  73978.     "Answers the handle of the keyboard focus window associated with the thread that called the function,
  73979.     or nil if the thread does not own the focus window
  73980.     
  73981.         HWND GetFocus(VOID);"
  73982.  
  73983.     <stdcall: handle GetFocus>
  73984.     ^self invalidCall!
  73985.  
  73986. getForegroundWindow
  73987.     "Answer the handle of the window with which the user is currently working.
  73988.         HWND GetForegroundWindow(VOID)"
  73989.  
  73990.     <stdcall: handle GetForegroundWindow>
  73991.     ^self invalidCall!
  73992.  
  73993. getIconInfo: hIcon piconinfo: anICONINFO
  73994.     "Populate the argument, anICONINFO, with information about the  icon or cursor
  73995.     whose handle is hIcon.
  73996.         BOOL GetIconInfo( 
  73997.             HICONáhIcon,            // icon handle    
  73998.             PICONINFOápiconinfoá    // address of icon structure    
  73999.         );"
  74000.  
  74001.     <stdcall: bool GetIconInfo handle ICONINFO* >
  74002.     ^self invalidCall!
  74003.  
  74004. getKeyboardState: a256ByteArray
  74005.     "Copies the status of the 256 virtual keys to the specified buffer. 
  74006.         BOOL GetKeyboardState(
  74007.             PBYTE lpKeyState     // address of array to receive status data
  74008.         );"
  74009.  
  74010.     <stdcall: bool GetKeyboardState lpvoid>
  74011.     ^self invalidCall!
  74012.  
  74013. getKeyNameText: lParam lpString: aString nSize: anInteger
  74014.     "Populate a string with the name of a virtual key code
  74015.         int GetKeyNameText( 
  74016.             LONGálParam,    // second parameter of keyboard message    
  74017.             LPTSTRálpString,    // address of buffer for key name    
  74018.             intánSizeá    // maximum length of key-name string length    
  74019.         );"
  74020.  
  74021.     <stdcall: sdword GetKeyNameTextA dword lpstr sdword>
  74022.     ^self invalidCall
  74023. !
  74024.  
  74025. getKeyState: virtualKeyCodeInteger
  74026.     "Answer the status of the virtual key, virtualKeyCodeInteger. See the Keyboard class.
  74027.  
  74028.         SHORT GetKeyState(int  nVirtKey);"
  74029.  
  74030.     <stdcall: sword GetKeyState sdword>
  74031.     ^self invalidCall!
  74032.  
  74033. getLastActivePopup: aHandle
  74034.     "Answer the handle of the pop-up window owned by the specified window 
  74035.     which was most recently active.
  74036.         HWND GetLastActivePopup(
  74037.             HWND hWnd     // handle of owner window
  74038.         );"
  74039.  
  74040.     <stdcall: handle GetLastActivePopup handle>
  74041.     ^self invalidCall!
  74042.  
  74043. getMessage: aMSG hWnd: aWindowHandle wMsgFilterMin: anIntFilterMin wMsgFilterMax: anIntFilterMax
  74044.     "Retrieves the next message from the Win32 input queue in the range integerFilterMin
  74045.     integerFilterMax, for the window with handle aWindowHandle (if Null then for all windows)
  74046.     into the Win32 MSG structure, aMSG.
  74047.  
  74048.     BOOL GetMessage(
  74049.         LPMSG  lpMsg,    // address of structure with message
  74050.         HWND  hWnd,    // handle of window
  74051.         UINT  wMsgFilterMin,    // first message
  74052.         UINT  wMsgFilterMax     // last message
  74053.     );    
  74054.  
  74055.     Answers 1 if a message was retrieved, 0 if WM_QUIT was retrieved, or -1 if some
  74056.     error occurred. N.B. Though Win32 declares GetMessage() as returning a BOOL,
  74057.     it doesn't really (because of the error return value) so to avoid errors, as
  74058.     suggested in the help), we have it return a signed integer)"
  74059.  
  74060.     <stdcall: sdword GetMessageA MSG* handle dword dword>
  74061.     ^self invalidCall!
  74062.  
  74063. getNextDlgGroupItem: p1 hCtl: p2 bPrevious: p3
  74064.     "HWND GetNextDlgGroupItem(
  74065.         HWND hDlg,    // handle of dialog box
  74066.         HWND hCtl,    // handle of control
  74067.         BOOL bPrevious     // direction flag
  74068.         );"
  74069.  
  74070.     <stdcall: handle GetNextDlgGroupItem handle handle bool>
  74071.     ^self invalidCall!
  74072.  
  74073. getNextDlgTabItem: p1 hCtl: p2 bPrevious: p3
  74074.     "HWND GetNextDlgTabItem(
  74075.         HWND hDlg,    // handle of dialog box
  74076.         HWND hCtl,    // handle of known control
  74077.         BOOL bPrevious     // direction flag
  74078.         );"
  74079.  
  74080.     <stdcall: handle GetNextDlgTabItem handle handle bool>
  74081.     ^self invalidCall!
  74082.  
  74083. getParent: hWnd
  74084.     "Answer the handle of the parent window of the specified window.
  74085.     If the window is a top level window (whose parent is really the Desktop
  74086.     window) then answer 0 (which is not the handle of the real Desktop window, but
  74087.     is the handle of the Dolphin Desktop window). Confused? Me too."
  74088.  
  74089.     <stdcall: dword GetParent handle>
  74090.     ^self invalidCall!
  74091.  
  74092. getProp: aWindowHandle lpString: name
  74093.     "Answer a data handle which is the previously added (with #setProp:etc) named property 
  74094.     of the given window.
  74095.         HANDLE GetProp(
  74096.             HWND hWnd,    // handle of window
  74097.             LPCTSTR lpString     // atom or address of string
  74098.         );.
  74099.  
  74100.     N.B. The return specification HANDLE here indicates that the value is an opaque 32-bit
  74101.     (DWORD) value, so we use #dword, as we reserve #handle for real handles."
  74102.  
  74103.     <stdcall: dword GetPropA handle lpvoid>
  74104.     ^self invalidCall
  74105.  
  74106. !
  74107.  
  74108. getQueueStatus: integerFlags
  74109.     "Answer a 32-bit set of flags which indicates the type of messages currently present in
  74110.     the in the calling thread's message queue. 
  74111.         DWORD GetQueueStatus(
  74112.             UINT  flags     // queue-status flags
  74113.         );
  74114.     See MSDN for further details."
  74115.  
  74116.     <stdcall: dword GetQueueStatus dword>
  74117.     ^self invalidCall!
  74118.  
  74119. getScrollInfo: aWindowHandle fnBar: flag lpsi: struct
  74120.     "Retrieve the parameters of a scroll bar, including the minimum and maximum 
  74121.     scrolling positions, the page size, and the position of the thumb.
  74122.         BOOL GetScrollInfo(
  74123.               HWND hwnd,    // handle of window with scroll bar
  74124.             int fnBar,    // scroll bar flag
  74125.             LPSCROLLINFO lpsi    // pointer to structure for scroll parameters
  74126.         );"
  74127.  
  74128.     <stdcall: bool GetScrollInfo handle sdword SCROLLINFO* >
  74129.     ^self invalidCall!
  74130.  
  74131. getSysColor: index
  74132.     "Answer the current color of the specified display element. Display elements are 
  74133.     the parts of a window and the Windows display that appear on the system display screen
  74134.     (configurable from DisplayProperties/Appearance)
  74135.         DWORD GetSysColor(
  74136.             int nIndex     // display element
  74137.         );"
  74138.  
  74139.     <stdcall: dword GetSysColor sdword>
  74140.     ^self invalidCall!
  74141.  
  74142. getSysColorBrush: anInteger
  74143.     "Answer the handle of one of the standard system colour brushes
  74144.         HBRUSH GetSysColorBrush(
  74145.               int index
  74146.         );"
  74147.  
  74148.     <stdcall: handle GetSysColorBrush sdword>
  74149.     ^self invalidCall!
  74150.  
  74151. getSystemMetrics: index
  74152.     "Answer the dimension of some display elememnt (in pels) or system configuration setting.
  74153.         int GetSystemMetrics(
  74154.             int nIndex     // system metric or configuration setting to retrieve  
  74155.         );"
  74156.  
  74157.     <stdcall: sdword GetSystemMetrics sdword>
  74158.     ^self invalidCall!
  74159.  
  74160. getTopWindow: aHandle
  74161.     "Answer the handle of the top-most child of the window with the specified handle.
  74162.         HWND GetTopWindow(
  74163.             HWND hWnd     // handle of parent window
  74164.         );"
  74165.  
  74166.     <stdcall: handle GetTopWindow handle>
  74167.     ^self invalidCall!
  74168.  
  74169. getUpdateRect: hWnd lpRect: lpRect bErase: bErase
  74170.     "Get the update rectangle for the Window with handle, hWnd. If the update
  74171.     region is empty then answers false, else true. The lpRect parameter can be
  74172.     null if the caller only wants to determine whether the window requires any
  74173.     repainting.
  74174.  
  74175.         BOOL GetUpdateRect(
  74176.             HWND hWnd, // handle of window 
  74177.             LPRECT lpRect , // address of update rectangle coordinates 
  74178.             BOOL bErase <> // erase flag 
  74179.         ); "
  74180.  
  74181.     <stdcall: bool GetUpdateRect handle RECT* bool>
  74182.     ^self invalidCall!
  74183.  
  74184. getWindow: hWnd uCmd: flags
  74185.     "Answer the handle of a window that has the specified relationship to hWnd.
  74186.         HWND GetWindow(
  74187.             HWND hWnd,    // handle of original window
  74188.             UINT uCmd     // relationship flag
  74189.         );"
  74190.  
  74191.     <stdcall: handle GetWindow handle dword>
  74192.     ^self invalidCall!
  74193.  
  74194. getWindowDC: aWindowHandle
  74195.     "Answer the handle of a display device context (DC) which can be used to draw
  74196.     in the entire non-client area of the specified window. GetWindowDC assigns 
  74197.     default attributes to the window device context each time it retrieves the 
  74198.     device context. Previous attributes are lost. 
  74199.  
  74200.         HDC GetWindowDC(HWND hWnd);"
  74201.  
  74202.     <stdcall: handle GetWindowDC handle>
  74203.     ^self invalidCall!
  74204.  
  74205. getWindowDWORD: aWindowHandle nIndex: zeroBasedIntegerOffset
  74206.     "Answer various unsigned DWORD values retrieved from the window
  74207.     with handle, aWindowHandle. See getWindowLong:offset: for more details"
  74208.  
  74209.     <stdcall: dword GetWindowLongA handle sdword>
  74210.     ^self invalidCall!
  74211.  
  74212. getWindowLong: aWindowHandle nIndex: zeroBasedIntegerOffset
  74213.     "Answer various signed 32-bit values retrieved from the window
  74214.     with handle, aWindowHandle. Can be used to retrieve DWORD values from the
  74215.     Windows extra memory. If an unsigned 32-bit value is required,
  74216.     use getWindowDWORD:nIndex:
  74217.  
  74218.         LONG GetWindowLong(
  74219.             HWND  hWnd,    // handle of window
  74220.             int  nIndex     // offset of value to retrieve
  74221.         );    
  74222.  
  74223.     Valid offsets are in the range 0 to the number of bytes of extra window memory, 
  74224.     minus the size of a DWORD (four), or one of the following values:
  74225.         GWLExStyle    Extended window styles (WsExXXX)
  74226.         GWLStyle        Window styles (WsXXX)
  74227.         GWLWndProc    Address of the Window Procedure
  74228.         GWLHInstance    Handle of the application instance which owns the window.
  74229.         GWLHWndParent    Handle of the parent window, if any.
  74230.         GWLId        Identifier of the window.
  74231.         GWLUserData    A 32-bit value associated with the window by the owning application.
  74232.  
  74233.         The following values are also available for dialog windows:
  74234.         DWLDlgProc    Address of the dialog box procedure.
  74235.         DWLMsgResult    The return value of a message processed in the dialog box procedure.
  74236.         DWLUser        Extra information private to the application.
  74237.  
  74238.  
  74239.     Answers 0 if the function fails."
  74240.  
  74241.     <stdcall: sdword GetWindowLongA handle sdword>
  74242.     ^self invalidCall!
  74243.  
  74244. getWindowPlacement: hWnd lpwndpl: lpwndpl
  74245.     "Retrieve the show state and restored, minimized, and maximized positions 
  74246.     of the specified window.
  74247.         BOOL GetWindowPlacement(
  74248.             HWND hWnd,                // handle of window
  74249.             WINDOWPLACEMENT *lpwndpl     // address of structure for position data
  74250.         );"
  74251.  
  74252.     <stdcall: bool GetWindowPlacement handle WINDOWPLACEMENT* >
  74253.     ^self invalidCall!
  74254.  
  74255. getWindowRect: aWindowHandle lpRect: aRECT
  74256.     "Retrieves the dimensions of the bounding rectangle of the specified window
  74257.     (in screen coordinates, relative to the upper-left corner of the screen).
  74258.  
  74259.         BOOL GetWindowRect(
  74260.             HWND hWnd,    // handle of window
  74261.             LPRECT lpRect     // address of structure for window coordinates
  74262.         );"
  74263.  
  74264.     <stdcall: bool GetWindowRect handle RECT* >
  74265.     ^self invalidCall!
  74266.  
  74267. getWindowText: aWindow lpString: aBuffer nMaxCount: len
  74268.     "Copy the text of the specified window (its title bar, or other appropriate text)
  74269.     into the supplied buffer, up to the specified maximum length
  74270.         int GetWindowText(
  74271.             HWND hWnd,        // handle of window or control with text
  74272.             LPTSTR lpString,    // address of buffer for text
  74273.             int nMaxCount         // maximum number of characters to copy
  74274.         );"
  74275.  
  74276.     <stdcall: sdword GetWindowTextA handle lpvoid sdword>
  74277.     ^self invalidCall
  74278. !
  74279.  
  74280. getWindowTextLength: hWnd
  74281.     "Answer the length, in characters, of the specified window's title 'text'
  74282.         int GetWindowTextLength(
  74283.             HWND hWnd     // handle of window or control with text
  74284.         );"
  74285.  
  74286.     <stdcall: sdword GetWindowTextLengthA handle>
  74287.     ^self invalidCall
  74288. !
  74289.  
  74290. insertMenuItem: hMenu uItem: anInteger fByPosition: aBoolean lpmii: aMENUITEMINFOA
  74291.     "Insert a new item into a menu.
  74292.  
  74293.         BOOL InsertMenuItem(
  74294.             HMENU hMenu,
  74295.             UINT uItem,
  74296.             BOOL fByPosition,
  74297.             LPCMENUITEMINFO lpmii
  74298.         );"
  74299.  
  74300.     <stdcall: bool InsertMenuItemA handle dword bool MENUITEMINFOA*>
  74301.     ^self invalidCall!
  74302.  
  74303. invalidate: hWnd lpRect: aRECT bErase: aBoolean
  74304.     "Add aRECT to hWnd's update region (that portion of the
  74305.     windows client area that requires repainting).
  74306.         BOOL InvalidateRect(
  74307.               HWND hWnd,            // handle of window with changed update region  
  74308.             CONST RECT *lpRect,    // address of rectangle coordinates 
  74309.             BOOL bErase            // erase-background flag 
  74310.         );"
  74311.  
  74312.     <stdcall: bool InvalidateRect handle RECT* bool>
  74313.     ^self invalidCall!
  74314.  
  74315. invalidateRgn: hWnd hRgn: aRegion bErase: aBoolean
  74316.     "Invalidates the client area within the specified region by adding it to the current update region of a window. 
  74317.     The invalidated region, along with all other areas in the update region, is marked for painting when the 
  74318.     next paint message occurs. 
  74319.  
  74320.         BOOL InvalidateRgn(
  74321.           HWND  hWnd,    // handle of window with changed update region  
  74322.         HRGN  hRgn,    // handle of region to add
  74323.         BOOL  bErase     // erase-background flag
  74324.         );"
  74325.  
  74326.     <stdcall: bool InvalidateRgn handle handle bool>
  74327.     ^self invalidCall!
  74328.  
  74329. invertRect: hdc lprc: aRECT
  74330.     "The InvertRect function inverts a rectangle in a window by performing a logical 
  74331.     NOT operation on the color values for each pixel in the rectangle's interior.
  74332.  
  74333.     BOOL InvertRect( 
  74334.         HDC hDC,    // handle of device context    
  74335.         CONST RECT *lprc    // address of structure with rectangle    
  74336.         ); "
  74337.  
  74338.     <stdcall: bool InvertRect handle RECT* >
  74339.     ^self invalidCall!
  74340.  
  74341. isCharAlpha: aCharacter
  74342.     "Answer whether a character is an alphabetic character. This will dependent on the semantics of the 
  74343.     language selected by the user during setup or by using Control Panel.
  74344.         BOOL IsCharAlpha(
  74345.             TCHAR  ch     // character to test  
  74346.         );"
  74347.  
  74348.     <stdcall: bool IsCharAlphaA char>
  74349.     ^self invalidCall!
  74350.  
  74351. isCharAlphaNumeric: aCharacter
  74352.     "Answer whether a character is an alphabetic character or a digit. This will dependent on the 
  74353.     semantics of the language selected by the user during setup or by using Control Panel.
  74354.         BOOL IsCharAlphaNumeric(
  74355.             TCHAR  ch     // character to test  
  74356.         );"
  74357.  
  74358.     <stdcall: bool IsCharAlphaNumericA char>
  74359.     ^self invalidCall!
  74360.  
  74361. isCharLower: aCharacter
  74362.     "Answer whether a character is a lowercase letter. This will dependent on the semantics of the 
  74363.     language selected by the user during setup or by using Control Panel.
  74364.         BOOL IsCharLower(
  74365.             TCHAR  ch     // character to test  
  74366.         );"
  74367.  
  74368.     <stdcall: bool IsCharLowerA char>
  74369.     ^self invalidCall!
  74370.  
  74371. isCharUpper: aCharacter
  74372.     "Answer whether a character is an uppercase letter. This will dependent on the semantics of 
  74373.     the language selected by the user during setup or by using Control Panel.
  74374.         BOOL IsCharUpper(
  74375.             TCHAR  ch     // character to test  
  74376.         );"
  74377.  
  74378.     <stdcall: bool IsCharUpperA char>
  74379.     ^self invalidCall!
  74380.  
  74381. isChild: hWndParent hWnd: hWnd
  74382.     "Answer whether the window identified by the handle, hWnd, is 
  74383.     a child of the window identified by the handle, hWndParent."
  74384.  
  74385.     <stdcall: bool IsChild handle handle>
  74386.     ^self invalidCall!
  74387.  
  74388. isClipboardFormatAvailable: format
  74389.       "Answer whether the clipboard contains data in the specified format. 
  74390.     
  74391.         BOOL IsClipboardFormatAvailable(UINT format);"
  74392.  
  74393.     <stdcall: bool IsClipboardFormatAvailable dword>
  74394.     ^self invalidCall!
  74395.  
  74396. isDialogMessage: aHandle lpMsg: aMSG
  74397.     "Determine whether a message is intended for the specified dialog 
  74398.     box and, if it is, process the message. 
  74399.         BOOL IsDialogMessage(
  74400.               HWND hDlg,    // handle of dialog box
  74401.             LPMSG lpMsg    // address of structure with message
  74402.         );"
  74403.  
  74404.     <stdcall: bool IsDialogMessageA handle MSG* >
  74405.     ^self invalidCall!
  74406.  
  74407. isIconic: aWindowHandle
  74408.     "Answer whether the specified window is iconic (minimized). 
  74409.         BOOL IsIconic(
  74410.             HWND hWnd     // handle of window
  74411.         );"
  74412.  
  74413.     <stdcall: bool IsIconic handle>
  74414.     ^self invalidCall!
  74415.  
  74416. isWindow: hWnd
  74417.     "Answer whether the window handle, hWnd, is currently valid"
  74418.  
  74419.     <stdcall: bool IsWindow handle>
  74420.     ^self invalidCall!
  74421.  
  74422. isWindowEnabled: hWnd
  74423.     "Answer whether the window with handle, hWnd, is currently enabled (i.e.
  74424.     prepared to accept user input"
  74425.  
  74426.     <stdcall: bool IsWindowEnabled handle>
  74427.     ^self invalidCall!
  74428.  
  74429. isWindowVisible: hWnd
  74430.     "Answer whether the window with handle, hWnd, is currently visible (i.e. not hidden)."
  74431.  
  74432.     <stdcall: bool IsWindowVisible handle>
  74433.     ^self invalidCall!
  74434.  
  74435. isZoomed: aWindowHandle
  74436.     "Answer wether a window is zoomed (maximized). See also #isIconic:.
  74437.         BOOL IsZoomed(
  74438.             HWND hWnd     // handle of window
  74439.         );"
  74440.  
  74441.     <stdcall: bool IsZoomed handle>
  74442.     ^self invalidCall!
  74443.  
  74444. killTimer: aWindowHandle uIDEvent: anInteger
  74445.     "Destroy the specified timer. Any pending wmTimer: messages for the receiver
  74446.     are also removed.
  74447.         BOOL KillTimer(
  74448.             HWND hWnd,    // handle of window that installed timer
  74449.             UINT uIDEvent     // timer identifier
  74450.         );"
  74451.  
  74452.     <stdcall: bool KillTimer handle dword>
  74453.     ^self invalidCall!
  74454.  
  74455. loadAccelerators: anExternalHandle lpTableName: anIntegerOrString
  74456.     "Load the specified accelerator table from the resources of the application identified
  74457.     by the instance handle, aHandle. The argument anIntegerOrString may be a 16-bit integer
  74458.     resource id, or a String name. Answer the handle of the resource, or nil if the function
  74459.     fails. Loaded accelerator tables will be freed automatically when Dolphin terminates.
  74460.  
  74461.         HACCEL LoadAccelerators(
  74462.                 HINSTANCE  hInstance,    // handle of application instance
  74463.                 LPCTSTR  lpTableName     // address of table-name string
  74464.             );"
  74465.  
  74466.     <stdcall: handle LoadAcceleratorsA handle lpvoid>
  74467.     ^self invalidCall!
  74468.  
  74469. loadCursor: anInstanceHandle lpCursorName: anIntegerID
  74470.     "Loads the specified cursor resource from the module with the specified handle
  74471.     Under Win32 it is not necessary to destroy cursors loaded in this manner.
  74472.  
  74473.         HCURSOR LoadCursor(
  74474.               HINSTANCE  hInstance,    // handle of application instance
  74475.             LPCTSTR  lpCursorName     // name string or cursor resource identifier  
  74476.         );"
  74477.  
  74478.     <stdcall: handle LoadCursorA handle lpvoid>
  74479.     ^self invalidCall!
  74480.  
  74481. loadCursorFromFile: aFilename
  74482.     "Creates a cursor based on data contained in the specified file, and answer the handle, 
  74483.     or NULL if it fails. Can load standard (.CUR) or animated (.ANI) cursors.
  74484.  
  74485.         HCURSOR LoadCursorFromFile (
  74486.               LPCTSTR  lpFileName    // pointer to name of cursor file, or system cursor identifier
  74487.        );"
  74488.  
  74489.     <stdcall: handle LoadCursorFromFileA lpvoid>
  74490.     ^self invalidCall!
  74491.  
  74492. loadIcon: anInstanceHandle lpIconName: anIntegerID
  74493.     "Loads the specified icon resource from the specified module.
  74494.         HICON LoadIcon(
  74495.             HINSTANCE hInstance,    // handle of application instance
  74496.             LPCTSTR lpIconName     // icon-name string or icon resource identifier
  74497.         );"
  74498.  
  74499.     <stdcall: handle LoadIconA handle lpvoid>
  74500.     ^self invalidCall
  74501. !
  74502.  
  74503. loadImage: hInst lpszName: filename uType: type cxDesired: w cyDesired: h fuLoad: flags
  74504.     "Load an icon, cursor, or bitmap.
  74505.         HANDLE LoadImage(
  74506.             HINSTANCE hinst,     // handle of the instance that contains the image
  74507.             LPCTSTR lpszName,    // name or identifier of image
  74508.             UINT uType,        // type of image
  74509.             int cxDesired,        // desired width
  74510.             int cyDesired,        // desired height
  74511.             UINT fuLoad        // load flags
  74512.         );"
  74513.  
  74514.     <stdcall: handle LoadImageA handle lpvoid dword sdword sdword dword>
  74515.     ^self invalidCall!
  74516.  
  74517. loadMenu: anExternalHandle lpMenuName: anIntegerOrString
  74518.     "Load the specified menu from the resources of the application identified
  74519.     by the instance handle, aHandle. The argument anIntegerOrString may be a 16-bit integer
  74520.     resource id, or a String name. Answer the handle of the resource, or nil if the function
  74521.     fails.
  74522.  
  74523.         HMENU LoadMenu(
  74524.             HINSTANCE  hInstance,    // handle of application instance
  74525.             LPCTSTR  lpMenuName    // menu name string or menu-resource identifier  
  74526.             );"
  74527.  
  74528.     <stdcall: handle LoadMenuA handle lpvoid>
  74529.     ^self invalidCall!
  74530.  
  74531. loadString: anExternalHandle uID: anIntegerID lpBuffer: aString nBufferMax: anIntegerLength
  74532.     "Load a string resource from the executable file associated with 
  74533.     the specified module, into the specified buffer appending
  74534.     a terminating null character. Answer the length of the string, or 0 
  74535.     if it does not exist.
  74536.         int LoadString(
  74537.             HINSTANCE hInstance,    // handle of module containing string resource 
  74538.             UINT uID,                // resource identifier 
  74539.             LPTSTR lpBuffer,        // address of buffer for resource 
  74540.             int nBufferMax         // size of buffer
  74541.         );"
  74542.  
  74543.     <stdcall: sdword LoadStringA handle dword lpstr sdword>
  74544.     ^self invalidCall!
  74545.  
  74546. lockWindowUpdate: hWnd
  74547.     "The LockWindowUpdate function disables or reenables drawing in the
  74548.     specified window. Only one window can be locked at a time. "
  74549.  
  74550.     <stdcall: bool LockWindowUpdate handle>
  74551.     ^self invalidCall!
  74552.  
  74553. makeDragList: aWindowHandle
  74554.     "The MakeDragList function changes the specified single-selection list box 
  74555.     to a drag list box.
  74556.  
  74557.     BOOL MakeDragList( HWND hLB);"
  74558.  
  74559.     <stdcall: bool MakeDragList handle>
  74560.     ^self invalidCall!
  74561.  
  74562. mapVirtualKey: keyCode uMapType: mapType
  74563.     "Map a virtual-key code into a scan code or character value, or translate a scan code into a virtual-key code. 
  74564.  
  74565.     The Meaning of keycode and the result of the translation depends on the maptype:
  74566.  
  74567.         keyCode                    Answer
  74568.     0    virtual key code        ->    scan code
  74569.     1    scan code                ->    virtual key code
  74570.     2    virtual key code        ->    character value
  74571.     3    scan code                ->    virtual key code    
  74572.  
  74573.         UINT    MapVirtualKey(
  74574.             UINT uCode,
  74575.             UINT uMapType);"
  74576.  
  74577.     <stdcall: dword MapVirtualKeyA dword dword>
  74578.     ^self invalidCall!
  74579.  
  74580. mapWindowPoints: fromHwnd hWndTo: toHwnd lpPoints: points cPoints: count
  74581.     "Map a set of points from a coordinate space relative to one window 
  74582.     to a coordinate space relative to another window.
  74583.  
  74584.         int MapWindowPoints(
  74585.               HWND hWndFrom,        // handle of window to be mapped from 
  74586.             HWND hWndTo,        // handle of window to be mapped to 
  74587.             LPPOINT lpPoints,    // address of structure array with points to map 
  74588.             UINT cPoints         // number of structures in array 
  74589.        );"
  74590.  
  74591.     <stdcall: sdword MapWindowPoints handle handle lpvoid dword>
  74592.     ^self invalidCall!
  74593.  
  74594. messageBeep: anInteger
  74595.     "Plays a waveform identified by the argument, anInteger, in the registry.
  74596.             BOOL MessageBeep(
  74597.             UINT uType     // sound type  
  74598.             );"
  74599.     
  74600.     <stdcall: bool MessageBeep dword>
  74601.     ^self invalidCall!
  74602.  
  74603. messageBoxIndirect: aMSGBOXPARAMS
  74604.     "Open a message box with the details specified in the structure.
  74605.  
  74606.         int MessageBox(
  74607.             LPMSGBOXPARRAMS lpMsgBoxParams;
  74608.         );"
  74609.  
  74610.     <stdcall: sdword MessageBoxIndirectA MSGBOXPARAMS*>
  74611.     ^self invalidCall!
  74612.  
  74613. modifyMenu: hMenuDrop uPosition: position uFlags: styleFlags uIDNewItem: menuId lpNewItem: menuText
  74614.     "Changes an existing menu item the specified menu with the specified
  74615.     style, identifier and text.
  74616.  
  74617.         BOOL ModifyMenu(
  74618.             HMENU hMenu,    // handle to menu
  74619.             UINT uPosition,    // menu item to modify
  74620.             UINT uFlags,        // menu item flags
  74621.             UINT uIDNewItem,    // menu item identifier or pop-up menu handle 
  74622.             LPCTSTR lpNewItem    // menu item content
  74623.         );"
  74624.  
  74625.     <stdcall: bool ModifyMenuA handle dword dword dword lpstr>
  74626.     ^self invalidCall!
  74627.  
  74628. msgWaitForMultipleObjects: countInteger pHandles: handles fWaitAll: aBoolean 
  74629.         dwMilliseconds: millisecsInteger dwWakeMask: maskInteger
  74630.     "Waits until when one of the following occurs: 
  74631.         ╖    either any one of, or all of (the number of handles being specified 
  74632.             by the argument, countInteger, and whether to wait for a single object
  74633.             or all of the objects being specified by the argument, waitBoolean), 
  74634.             the objects whose handles are specified by the argument, handles 
  74635.             (which may be a single handle, or an (TBD) ExternalHandleArray) are 
  74636.             in the signaled state; or
  74637.         ╖    A Win32 message of a type which matches the type mask specified by
  74638.             the argument, maskInteger, becomes available in the message queue (
  74639.             uses the same flags as #getQueueStatus:); or
  74640.         ╖    the number of milliseconds specified by the argument, millisecsInteger,
  74641.             elapses.
  74642.  
  74643.     MsgWaitForMultipleObjects should only be called when there are no further messages
  74644.     waiting in the input queue, because it only detects the arrival of new messages.
  74645.  
  74646.     N.B. Under NT, the handles in the argument, handles, must have SYNCHRONIZE access.
  74647.  
  74648.     If successful, answer the event that cause the function to return. See Win32 documentation
  74649.     for specific return values. If the function fails, answers -1. KernelLibrary>>getLastError
  74650.     can be used to get extended error information
  74651.  
  74652.         DWORD MsgWaitForMultipleObjects(
  74653.             DWORD  nCount,                // number of handles in handle array  
  74654.             LPHANDLE  pHandles,            // address of object-handle array 
  74655.             BOOL  fWaitAll,                // wait for all or wait for one 
  74656.             DWORD  dwMilliseconds,        // time-out interval in milliseconds 
  74657.             DWORD  dwWakeMask             // type of input events to wait for 
  74658.         );"
  74659.  
  74660.     <stdcall: sdword MsgWaitForMultipleObjects dword lpvoid bool dword dword>
  74661.     ^self invalidCall!
  74662.  
  74663. msgWaitForMultipleObjectsEx: countInteger pHandles: handles 
  74664.         dwMilliseconds: millisecsInteger 
  74665.         dwWakeMask: maskInteger
  74666.         dwFlags: aBoolean 
  74667.     "Waits until when one of the following occurs: 
  74668.         ╖    either any one of, or all of (the number of handles being specified 
  74669.             by the argument, countInteger, and whether to wait for a single object
  74670.             or all of the objects being specified by the argument, waitBoolean), 
  74671.             the objects whose handles are specified by the argument, handles 
  74672.             (which may be a single handle, or a DWORDArray) are 
  74673.             in the signaled state; or
  74674.         ╖    A Win32 message of a type which matches the type mask specified by
  74675.             the argument, maskInteger, becomes available in the message queue (
  74676.             uses the same flags as #getQueueStatus:); or
  74677.         ╖    the number of milliseconds specified by the argument, millisecsInteger,
  74678.             elapses.
  74679.  
  74680.     MsgWaitForMultipleObjects should only be called when there are no further messages
  74681.     waiting in the input queue, because it only detects the arrival of new messages (this is fixed
  74682.     in Win98 and NT5 with the addition of the MWMO_INPUTAVAILABLE flag).
  74683.  
  74684.     N.B. Under NT, the handles in the argument, handles, must have SYNCHRONIZE access.
  74685.  
  74686.     If successful, answer the event that cause the function to return. See Win32 documentation
  74687.     for specific return values. If the function fails, answers -1. KernelLibrary>>getLastError
  74688.     can be used to get extended error information
  74689.  
  74690.         DWORD MsgWaitForMultipleObjectsEx(
  74691.             DWORD nCount,
  74692.             LPHANDLE pHandles,
  74693.             DWORD dwMilliseconds,
  74694.             DWORD dwWakeMask,
  74695.             DWORD dwFlags)
  74696.     "
  74697.  
  74698.     <stdcall: sdword MsgWaitForMultipleObjectsEx dword lpvoid dword dword dword>
  74699.     ^self invalidCall!
  74700.  
  74701. openClipboard: hWnd
  74702.     "Open the clipboard, associating it with the specified window.
  74703.     Answers 0 if fails.
  74704.  
  74705.         BOOL OpenClipboard(HWND)"
  74706.  
  74707.     <stdcall: bool OpenClipboard handle>
  74708.     ^self invalidCall!
  74709.  
  74710. overlappedMsgBoxIndirect: aMSGBOXPARAMS
  74711.     "Private - Open a message box with the details specified in the structure
  74712.     as an overlapped call (i.e. on a separate thread).
  74713.     N.B. Don't use for MB_TASKMODAL message boxes.
  74714.  
  74715.         int MessageBox(
  74716.             LPMSGBOXPARRAMS lpMsgBoxParams;
  74717.         );"
  74718.  
  74719.     <overlap stdcall: sdword MessageBoxIndirectA MSGBOXPARAMS* >
  74720.     ^self invalidCall!
  74721.  
  74722. peekMessage: aMSG hWnd: aWindowHandle uMsgFilterMin: anIntFilterMin uMsgFilterMax: uMsgFilterMax wRemoveMsg: anIntFlags
  74723.     "Check the threads message queue for messages for the Window with
  74724.     handle aWindowHandle (all windows if nil/0, app messages if -1) in the range
  74725.     anIntFilterMin..anIntFilterMax (all messages if 0..0), retrieving 
  74726.     the first (if any) of such messages into aMSG, answering whether 
  74727.     a message was found. The message is optionally removed from the 
  74728.     queue depending on the value of the argument, anIntFlags (PM_REMOVE/
  74729.     PM_NOREMOVE). The flag value PmNoYield is obsolete, and has no effect
  74730.     in Win32.
  74731.  
  74732.         BOOL PeekMessage(
  74733.             LPMSG  lpMsg,            // address of structure for message
  74734.             HWND  hWnd,            // handle of window
  74735.             UINT  uMsgFilterMin,    // first message
  74736.             UINT  uMsgFilterMax,    // last message
  74737.             UINT  wRemoveMsg         // removal flags
  74738.         );"
  74739.  
  74740.     <stdcall: bool PeekMessageA MSG* handle dword dword dword>
  74741.     ^self invalidCall!
  74742.  
  74743. postMessage: aWindowHandle msg: msg wParam: wParam lParam: lParam
  74744.     "Post a message to aWindowHandle.
  74745.  
  74746.     LRESULT PostMessage(
  74747.         HWND hWnd,         // handle of destination window
  74748.         UINT Msg,         // message to send
  74749.         WPARAM wParam,     // first message parameter
  74750.         LPARAM lParam         // second message parameter
  74751.        );"
  74752.  
  74753.     <stdcall: sdword PostMessageA handle dword dword dword>
  74754.     ^self invalidCall !
  74755.  
  74756. postQuitMessage: anInteger
  74757.     "Post a WM_QUIT message to the current thread, initiating system shutdown.
  74758.         VOID PostQuitMessage(
  74759.             int  nExitCode     // exit code
  74760.         );"
  74761.  
  74762.     <stdcall: void PostQuitMessage sdword>
  74763.     ^self invalidCall !
  74764.  
  74765. postThreadMessage: anIntegerId msg: msg wParam: wParam lParam: lParam
  74766.     "Post a message to the message queue of the specified thread for asynchronous processing.
  74767.         BOOL PostThreadMessage(
  74768.               DWORD  idThread,    // thread identifier
  74769.             UINT  Msg,        // message to post
  74770.             WPARAM  wParam,    // first message parameter
  74771.             LPARAM  lParam     // second message parameter);"
  74772.  
  74773.     <stdcall: bool PostThreadMessageA handle dword dword sdword>
  74774.     ^self invalidCall !
  74775.  
  74776. redrawWindow: hWnd lprcUpdate: lprcUpdate hrgnUpdate: hrgnUpdate flags: flags
  74777.     "Update the specified rectangle or region in a window's client area. 
  74778.         BOOL RedrawWindow(
  74779.             HWND hWnd,                // handle to window
  74780.             CONST RECT *lprcUpdate,    // update rectangle
  74781.             HRGN hrgnUpdate,            // handle to update region
  74782.             UINT flags                // array of redraw flags
  74783.         );
  74784.     "
  74785.  
  74786.     <stdcall: bool RedrawWindow handle RECT* handle dword>
  74787.     ^self invalidCall!
  74788.  
  74789. registerClass: aWNDCLASS
  74790.     "Registers a window class for subsequent use in calls to the CreateWindow or 
  74791.     CreateWindowEx functions. Answers the class atom, or zero if fails.
  74792.         ATOM RegisterClass(
  74793.             CONST WNDCLASS  *lpwc     // address of structure with class data
  74794.         );"
  74795.  
  74796.     <stdcall: word RegisterClassA WNDCLASS* >
  74797.     ^self invalidCall!
  74798.  
  74799. registerClipboardFormat: formatName
  74800.     "Register a new clipboard format name, answering its system wide identifier.
  74801.  
  74802.         UINT RegisterClipboardFormat( 
  74803.             LPCTSTRálpszFormatá // address of name string 
  74804.         );"
  74805.  
  74806.     <stdcall: dword RegisterClipboardFormatA lpstr>
  74807.     ^self invalidCall!
  74808.  
  74809. registerHotKey: aWindowHandle id: anIntegerId fsModifiers: anIntegerFlags vk: anIntegerVk
  74810.     "Define a hot key for the current thread.
  74811.         BOOL RegisterHotKey(
  74812.               HWND  hWnd,        // window to receive hot-key notification
  74813.             int  id,            // identifier of hot key
  74814.             UINT  fsModifiers,    // key-modifier flags
  74815.             UINT  vk             // virtual-key code
  74816.         );"
  74817.  
  74818.     <stdcall: bool RegisterHotKey handle sdword dword dword>
  74819.     ^self invalidCall!
  74820.  
  74821. registerWindowMessage: aString
  74822.     "Defines a new window message that is guaranteed to be unique system wide.
  74823.  
  74824.         UINT RegisterWindowMessage(
  74825.             LPCTSTR  lpString     // address of message string
  74826.         );"
  74827.  
  74828.     <stdcall: dword RegisterWindowMessageA lpstr>
  74829.     ^self invalidCall!
  74830.  
  74831. releaseCapture
  74832.     "Release the mouse capture from a window, restoring normal mouse input processing.
  74833.         BOOL ReleaseCapture(VOID)"
  74834.   
  74835.     <stdcall: bool ReleaseCapture>
  74836.     ^self invalidCall!
  74837.  
  74838. releaseDC: hDC
  74839.     "Release the specified device context. This is the second half of the 'DC source' protocol,
  74840.     and is intended to release the desktop DCs created by the receiver's implementation of #getDC.
  74841.     Answer whether the DC was indeed released."
  74842.  
  74843.     ^(self 
  74844.         releaseDC: self getDesktopWindow
  74845.         hDC: hDC asParameter) == 1!
  74846.  
  74847. releaseDC: hWnd hDC: hDC
  74848.     "Releases a device context (DC) (if a common or window device context -
  74849.     class and private DCs are unaffected).
  74850.  
  74851.         int ReleaseDC(
  74852.             HWND hWnd,    // handle of window 
  74853.             HDC hDC         // handle of device context  
  74854.         );"
  74855.  
  74856.     <stdcall: sdword ReleaseDC handle handle>
  74857.     ^self invalidCall
  74858. !
  74859.  
  74860. removeMenu: aMenu uPosition: idOrPos uFlags: flags
  74861.     "Delete a menu item from the specified menu. If the menu item activates a pop-up menu, 
  74862.     RemoveMenu does not destroy the pop-up menu or its handle, allowing the menu to be reused. 
  74863.     Before this function is called, the GetSubMenu function should retrieve the handle of the pop-up menu. 
  74864.         BOOL RemoveMenu(
  74865.             HMENU hMenu,    // handle of menu
  74866.             UINT uPosition,    // menu item identifier or position
  74867.             UINT uFlags    // menu item flag
  74868.         );"
  74869.  
  74870.     <stdcall: bool RemoveMenu handle dword dword>
  74871.     ^self invalidCall!
  74872.  
  74873. removeProp: aWindowHandle lpString: name
  74874.     "Remove an the entry identified by lpString from the property list of 
  74875.     the specified window.
  74876.         HANDLE RemoveProp(
  74877.             HWND hWnd,    // handle to window
  74878.             LPCTSTR lpString     // atom or address of string
  74879.         );"
  74880.  
  74881.     <stdcall: handle RemovePropA handle lpvoid>
  74882.     ^self invalidCall
  74883.  
  74884. !
  74885.  
  74886. screenToClient: aWindowHandle lpPoint: aPOINT
  74887.     "Converts the screen coordinates in aPOINT to client coordinates.
  74888.         BOOL ScreenToClient(
  74889.               HWND hWnd,        // window handle for source coordinates 
  74890.             LPPOINT lpPoint     // address of structure containing coordinates  
  74891.         );"
  74892.  
  74893.     <stdcall: bool ScreenToClient handle POINTL* >
  74894.     ^self invalidCall!
  74895.  
  74896. scrollWindowEx: aWindowHandle dx: horizontalScrolling dy: verticalScrolling prcScroll: scrollRECT prcClip: clipRECT
  74897.     hrgnUpdate: hUpdateRegion prcUpdate: update flags: flags
  74898.     "The ScrollWindowEx function scrolls the content of the specified window's client
  74899.     area. This function is similar to the ScrollWindow function, but it has additional features. 
  74900.  
  74901.     int ScrollWindowEx(
  74902.         HWND hWnd                // handle of window to scroll
  74903.         int dx                // amount of horizontal scrolling
  74904.         int dy                // amount of vertical scrolling
  74905.         CONST RECT *prcScroll    // address of structure with scroll rectangle
  74906.         CONST RECT *prcClip    // address of structure with clip rectangle
  74907.         HRGN hrgnUpdate        // handle of update region
  74908.         LPRECT prcUpdate        // address of structure for update rectangle
  74909.         UINT flags            // scrolling flags
  74910.     );"
  74911.  
  74912.     <stdcall: sdword ScrollWindowEx handle sdword sdword RECT* RECT* handle lpvoid dword>
  74913.     ^self invalidCall!
  74914.  
  74915. sendDlgItemMessage: aWindowHandle nIDDlgItem: anIntegerId msg: aString wParam: wParam lParam: lParam
  74916.     "Send a message to the specified control in a dialog box. 
  74917.         LONG SendDlgItemMessage(
  74918.             HWND  hDlg,        // handle of dialog box
  74919.             int  nIDDlgItem,    // identifier of control
  74920.             UINT  Msg,        // message to send
  74921.             WPARAM  wParam,    // first message parameter
  74922.             LPARAM  lParam     // second message parameter
  74923.            );"
  74924.  
  74925.     <stdcall: sdword SendDlgItemMessageA handle sdword dword dword sdword>
  74926.     ^self invalidCall!
  74927.  
  74928. sendMessage: aWindowHandle msg: msg wParam: wParam lParam: lParam
  74929.     "The SendMessage function sends the specified message to a window or windows.
  74930.     The function calls the window procedure for the specified window and does not
  74931.     return until the window procedure has processed the message. The PostMessage
  74932.     function, in contrast, posts a message to a thread's message queue and returns
  74933.     immediately. 
  74934.  
  74935.     Implementation Note: Although LPARAM is defined as a signed parameter, more often
  74936.     than not it is used to pass an unsigned 32-bit value. As we have a strict definition
  74937.     of what can be passed to a 32-bit signed parameter (i.e. only valid 32-bit two's
  74938.     complement numbers), we used the slightly more relaxed DWORD specification. This
  74939.     allows 32-bit LargeIntegers > 16r7FFFFFFF to be passed.
  74940.  
  74941.     LRESULT SendMessage(
  74942.         HWND hWnd,         // handle of destination window
  74943.         UINT Msg,         // message to send
  74944.         WPARAM wParam,     // first message parameter
  74945.         LPARAM lParam         // second message parameter
  74946.        );"
  74947.  
  74948.     <stdcall: sdword SendMessageA handle dword dword dword>
  74949.     ^self invalidCall !
  74950.  
  74951. sendMessage: aWindowHandle msg: msg wParam: wParam lpParam: lParam
  74952.     "As sendMessage:msg:wParam:lParam, but implicit conversion of lParam
  74953.     to pointer."
  74954.  
  74955.     <stdcall: sdword SendMessageA handle dword dword lpvoid>
  74956.     ^self invalidCall !
  74957.  
  74958. sendMessage: aWindowHandle msg: msg wpParam: wParam lpParam: lParam
  74959.     "As sendMessage:msg:wParam:lParam, but implicit conversion of lParam
  74960.     and wParam to pointers."
  74961.  
  74962.     <stdcall: sdword SendMessageA handle dword lpvoid lpvoid>
  74963.     ^self invalidCall !
  74964.  
  74965. setActiveWindow: aHandle
  74966.       "Makes the specified top-level window associated with the current thread the active window. 
  74967.         HWND SetActiveWindow( HWND hWnd);"
  74968.  
  74969.     <stdcall: handle SetActiveWindow handle>
  74970.     ^self invalidCall!
  74971.  
  74972. setCapture: aWindowHandle
  74973.     "Set the mouse capture to the specified window. Once a window has captured the mouse, it receivers all
  74974.     mouse input (unless a button is down while the mouse if over another thread's window).
  74975.         HWND SetCapture(
  74976.             HWND hWnd     // handle of window to receive mouse capture
  74977.         );"
  74978.  
  74979.     <stdcall: handle SetCapture handle>
  74980.     ^self invalidCall!
  74981.  
  74982. setClassLong: aWindowHandle nIndex: offset dwNewLong: value
  74983.     "Change an attribute of the specified window class, setting 
  74984.     a signed 32-bit (long) value at the specified offset into 
  74985.     the extra window memory of a window.
  74986.     Note: This is declared as returning a DWORD.
  74987.  
  74988.         DWORD SetClassLong(
  74989.             HWND hWnd,        // handle of window
  74990.             int nIndex,        // offset of value to set
  74991.             LONG dwNewLong     // new value
  74992.         );"
  74993.  
  74994.     <stdcall: dword SetClassLongA handle sdword sdword>
  74995.     ^self invalidCall!
  74996.  
  74997. setClipboardData: uFormat hMem: hMem
  74998.     "Places data on the clipboard in the specified clipboard format.
  74999.     The clipboard must previously have been opened unless responding to a WM_RENDERXXX
  75000.     message.
  75001.  
  75002.         HANDLE SetClipboardData( 
  75003.             UINTáuFormat,        // clipboard format 
  75004.             HANDLEáhMem    // data handle 
  75005.         );"
  75006.  
  75007.     <stdcall: handle SetClipboardData dword handle>
  75008.     ^self invalidCall!
  75009.  
  75010. setCursor: aWindowHandle
  75011.     "Set the current system cursor to the argument. N.B. This has only a temporary effect, as the system will
  75012.     change the cursor whenever it moves over a window which either has a class Cursor set, or responds to the
  75013.     the WM_SETCURSOR message. See the Cursor class.
  75014.  
  75015.         HCURSOR SetCursor(
  75016.               HCURSOR  hCursor     // handle of cursor
  75017.         );"
  75018.  
  75019.     <stdcall: handle SetCursor handle>
  75020.     ^self invalidCall!
  75021.  
  75022. setCursorPosX: x y: y
  75023.     "Move the cursor to the specified screen coordinates. The coordinates are clipped to 
  75024.     the rectangle set by the most recent invocation of the ClipCursor function.
  75025.  
  75026.         BOOL SetCursorPos(
  75027.               int  X,    // horizontal position  
  75028.             int  Y     // vertical position
  75029.         );"
  75030.  
  75031.     <stdcall: bool SetCursorPos sdword sdword>
  75032.     ^self invalidCall!
  75033.  
  75034. setDlgItemInt: hDlg nIDDlgItem: anIntegerId uValue: uValue bSigned: bSigned
  75035.     "Sets the title or text of a control in a dialog box. 
  75036.         BOOL SetDlgItemInt(
  75037.             HWND hDlg, // handle to dialog box
  75038.             int nIDDlgItem, // control identifier 
  75039.             UINT uValue, // value to set 
  75040.             BOOL bSigned // signed or unsigned indicator 
  75041.         );"
  75042.  
  75043.     <stdcall: bool SetDlgItemInt handle sdword dword bool>
  75044.     ^self invalidCall!
  75045.  
  75046. setDlgItemText: aWindowHandle nIDDlgItem: anIntegerId lpString: aString
  75047.     "Sets the title or text of a control in a dialog box. 
  75048.         BOOL SetDlgItemText(
  75049.               HWND  hDlg,        // handle of dialog box
  75050.             int  nIDDlgItem,    // identifier of control
  75051.             LPCTSTR  lpString     // text to set
  75052.             );"
  75053.  
  75054.     <stdcall: bool SetDlgItemTextA handle sdword lpvoid>
  75055.     ^self invalidCall!
  75056.  
  75057. setFocus: aWindowHandle
  75058.     "Transfer the keyboard focus to the specified window. All keyboard input 
  75059.     is directed to the window with focus.
  75060.     Answers the handle of the window which previously had focus, or nil if none.
  75061.         HWND SetFocus(
  75062.               HWND hWnd     // handle of window to receive focus
  75063.         );"
  75064.  
  75065.     <stdcall: handle SetFocus handle>
  75066.     ^self invalidCall!
  75067.  
  75068. setForegroundWindow: aHandle
  75069.       "Makes the specified top-level window associated with the current thread the active window
  75070.     and force it to the foreground.. 
  75071.         HWND SetForegroundWindow( HWND hWnd);"
  75072.  
  75073.     <stdcall: handle SetForegroundWindow handle>
  75074.     ^self invalidCall!
  75075.  
  75076. setKeyboardState: a256ByteArray
  75077.     "Copy the specified 256-byte array of keyboard key states into the 
  75078.     keyboard-input state table (also accessed by the GetKeyboardState and 
  75079.     GetKeyState functions). Changes made to the table affect only the calling
  75080.     thread.
  75081.         BOOL SetKeyboardState(
  75082.               LPBYTE lpKeyState     // address of array with virtual-key codes
  75083.            );"
  75084.  
  75085.     <stdcall: bool SetKeyboardState lpvoid>
  75086.     ^self invalidCall!
  75087.  
  75088. setMenu: windowHandle hMenu: menuHandle
  75089.     "Assign a new menu to the specified window.
  75090.         BOOL SetMenu(
  75091.               HWND hWnd,    // handle of window
  75092.             HMENU hMenu    // handle of menu
  75093.         );"
  75094.  
  75095.     <stdcall: bool SetMenu handle handle>
  75096.     ^self invalidCall!
  75097.  
  75098. setMenuDefaultItem: hMenu uItem: uItem fByPos: fByPos
  75099.     "Set the default item for the menu with handle, hMenu
  75100.  
  75101.         BOOL SetMenuDefaultItem(
  75102.             HMENU hMenu, 
  75103.             UINT uItem, 
  75104.             UINT fByPos
  75105.         );"
  75106.  
  75107.     <stdcall: dword SetMenuDefaultItem handle dword dword>
  75108.     ^self invalidCall
  75109.  
  75110. !
  75111.  
  75112. setMenuInfo: hMenu lpcmi: aMenuItemInfo
  75113.     "Set various information about a menu.
  75114.         BOOL SetMenuInfo(
  75115.             HMENU hMenu,
  75116.             LPMENUINFO lpcmi
  75117.         );"
  75118.  
  75119.     <stdcall: bool SetMenuInfo handle MENUINFO*>
  75120.     ^self invalidCall
  75121.  
  75122. !
  75123.  
  75124. setMenuItemInfo: hMenu uItem: anInteger fByPosition: aBoolean lpmii: aMenuItemInfo
  75125.     "Set various information about a menu item.
  75126.         BOOL SetMenuItemInfo(
  75127.             HMENU hMenu,
  75128.             UINT uItem,
  75129.             BOOL fByPosition,
  75130.             LPMENUITEMINFO lpmii
  75131.         );"
  75132.  
  75133.     <stdcall: bool SetMenuItemInfoA handle dword bool MENUITEMINFOA*>
  75134.     ^self invalidCall
  75135.  
  75136. !
  75137.  
  75138. setParent: hWndChild hWndNewParent: hWndParent
  75139.     "Set the parent window of the window with handle hWnd.
  75140.     If the function succeeds, answer the handle of the original parent window.
  75141.         HWND SetParent(
  75142.             HWND hWndChild,        // handle of window whose parent is changing
  75143.             HWND hWndNewParent     // handle of new parent window
  75144.         );"
  75145.  
  75146.     <stdcall: dword SetParent handle handle>
  75147.     ^self invalidCall!
  75148.  
  75149. setProp: aWindowHandle lpString: name hData: anObject
  75150.     "Answer true if name and anObject are successfully added to the property list.
  75151.     The SetProp function adds a new entry or changes an existing entry in the property list of the specified window.
  75152.     The function adds a new entry to the list if the specified character string does not exist already in the list.
  75153.     The new entry contains the string and the handle. Otherwise, the function replaces the string's current handle with the specified handle. 
  75154.         
  75155.         BOOL SetProp(
  75156.             HWND      hWnd,        // handle of window
  75157.             LPCTSTR  lpString,        // atom or address of string
  75158.             HANDLE      hData         // handle of data
  75159.         );
  75160.  
  75161.     Before destroying a window (that is, before processing the WM_DESTROY message), an application must remove all entries it has added
  75162.     to the property list. The application must use the RemoveProp function to remove the entries."
  75163.  
  75164.     <stdcall: bool SetPropA handle lpvoid handle>
  75165.     ^self invalidCall
  75166.  
  75167. !
  75168.  
  75169. setScrollInfo: aWindowHandle fnBar: flag lpsi: struct fRedraw: redraw
  75170.     "Set the minimum and maximum scrolling positions, the page size, and the position 
  75171.     of thumb, of a scroll bar, redrawing if requested.
  75172.         int SetScrollInfo(
  75173.             HWND hwnd,        // handle of window with scroll bar
  75174.             int fnBar,        // scroll bar flag
  75175.             LPSCROLLINFO lpsi,    // pointer to structure with scroll parameters
  75176.             BOOL fRedraw        // redraw flag
  75177.         );"
  75178.  
  75179.     <stdcall: sdword SetScrollInfo handle sdword SCROLLINFO* bool>
  75180.     ^self invalidCall!
  75181.  
  75182. setTimer: aWindowHandle nIDEvent: anIntegerId uElapse: anInteger lpTimerFunc: callbackProc
  75183.     "Create a timer with the specified time-out value.
  75184.     N.B. The preferred method of performing time triggered activities in Dolphin is to make
  75185.     use of Delays in conjunction with Processes. These are more portable, powerful, flexible, 
  75186.     and have a higher resolution capability.
  75187.         UINT SetTimer(
  75188.             HWND hWnd,    // handle of window for timer messages
  75189.             UINT nIDEvent,    // timer identifier
  75190.             UINT uElapse,    // time-out value
  75191.             TIMERPROC lpTimerFunc     // address of timer procedure
  75192.         );"
  75193.  
  75194.     <stdcall: dword SetTimer handle dword dword lpvoid>
  75195.     ^self invalidCall
  75196. !
  75197.  
  75198. setWindowDWORD: aWindowHandle nIndex: offset dwNewDWORD: value
  75199.     "See getWindowDWORD:nIndex:. Answers the previous value."
  75200.  
  75201.     <stdcall: dword SetWindowLongA handle sdword dword>
  75202.     ^self invalidCall!
  75203.  
  75204. setWindowLong: aWindowHandle nIndex: offset dwNewLong: value
  75205.     "Change an attribute of the specified window, setting 
  75206.     a signed 32-bit (long) value at the specified offset into 
  75207.     the extra window memory of a window.
  75208.         LONG SetWindowLong(
  75209.             HWND hWnd,        // handle of window
  75210.             int nIndex,        // offset of value to set
  75211.             LONG dwNewLong     // new value
  75212.         );"
  75213.  
  75214.     <stdcall: sdword SetWindowLongA handle sdword sdword>
  75215.     ^self invalidCall!
  75216.  
  75217. setWindowPlacement: aWindowHandle lpwndpl: aWinWINDOWPLACEMENT
  75218.     "Set the show state and the restored, minimized, and maximized positions 
  75219.     of the specified window. Answer whether the request succeeded.
  75220.         BOOL SetWindowPlacement(
  75221.             HWND hWnd,                    // handle of window
  75222.             CONST WINDOWPLACEMENT *lpwndpl     // address of structure with position data
  75223.             );"
  75224.  
  75225.     <stdcall: bool SetWindowPlacement handle lpvoid>
  75226.     ^self invalidCall!
  75227.  
  75228. setWindowPos: aWindowHandle
  75229.     hWndInsertAfter: hwndInsertAfter
  75230.     x: x
  75231.     y: y
  75232.     cx: cx
  75233.     cy: cy
  75234.     uFlags: flags
  75235.     
  75236.     "Change the size, position, and Z order of a child, pop-up, or top-level window.
  75237.     Windows are ordered according to their appearance on the screen. The topmost window 
  75238.     receives the highest rank and is the first window in the Z order. 
  75239.         BOOL SetWindowPos(
  75240.             HWND hWnd,            // handle of window
  75241.             HWND hWndInsertAfter,    // placement-order handle
  75242.             int X,                // horizontal position
  75243.             int Y,                // vertical position
  75244.             int cx,                // width
  75245.             int cy,                // height
  75246.             UINT uFlags             // window-positioning flags
  75247.         );"
  75248.  
  75249.     <stdcall: bool SetWindowPos handle dword sdword sdword sdword sdword dword>
  75250.     ^self invalidCall
  75251.         !
  75252.  
  75253. setWindowText: aWindowHandle lpString: aString
  75254.     "Set the 'text' of the specified window.
  75255.         BOOL SetWindowText(
  75256.             HWND hWnd,    // handle of window or control
  75257.             LPCTSTR lpString     // address of string
  75258.         );"
  75259.  
  75260.     <stdcall: bool SetWindowTextA handle lpvoid>
  75261.     ^self invalidCall!
  75262.  
  75263. showCursor: aBoolean
  75264.     "Show or hide the cursor. N.B. A count is maintained of the number of times 
  75265.     the cursor has been hidden/shown (which is answered), so there may be no visual effect.
  75266.  
  75267.         int ShowCursor(
  75268.               BOOL  bShow     // cursor visibility flag  
  75269.         );"
  75270.  
  75271.     <stdcall: sdword ShowCursor bool>
  75272.     ^self invalidCall!
  75273.  
  75274. showWindow: aWindowHandle nCmdShow: flags
  75275.     "Set the specified window's show state. 
  75276.         BOOL ShowWindow(
  75277.             HWND hWnd,    // handle of window
  75278.             int nCmdShow     // show state of window
  75279.         );"
  75280.  
  75281.     <stdcall: bool ShowWindow handle sdword>
  75282.     ^self invalidCall!
  75283.  
  75284. stringLower: aString
  75285.     "Convert aString to lower case IN PLACE. This will be dependent on the semantics of the 
  75286.     language selected by the user during setup or by using Control Panel.
  75287.     N.B. We ignore the return value as it will be a pointer to the argument.
  75288.  
  75289.         LPTSTR CharLower(LPTSTR  lpsz);     // single character or pointer to string "
  75290.  
  75291.     <stdcall: void CharLowerA lpvoid>
  75292.     ^self invalidCall!
  75293.  
  75294. stringUpper: aString
  75295.     "Convert aString to uppercase IN PLACE. This will be dependent on the semantics of the 
  75296.     language selected by the user during setup or by using Control Panel.
  75297.     N.B. We ignore the return value as it will be a pointer to the argument.
  75298.  
  75299.         LPTSTR CharUpper(LPTSTR  lpsz);     // single character or pointer to string "
  75300.  
  75301.     <stdcall: void CharUpperA lpvoid>
  75302.     ^self invalidCall!
  75303.  
  75304. systemParametersInfo: uiAction uiParam: param1 pvParam: param2 fWinIni: update
  75305.     "
  75306.     BOOL SystemParametersInfo(
  75307.         UINT uiAction,    // system parameter to query or set
  75308.         UINT uiParam,    // depends on action to be taken
  75309.         PVOID pvParam,    // depends on action to be taken
  75310.         UINT fWinIni     // user profile update flag
  75311.     );"
  75312.  
  75313.     <stdcall: bool SystemParametersInfoA dword dword lpvoid dword>
  75314.     ^self invalidCall!
  75315.  
  75316. trackPopupMenu: hMenu uFlags: uFlags x: x y: y nReserved: reserved hWnd: hWnd prcRect: aRect
  75317.     "Display a pop-up menu at the specified location (anywhere on the screen) and track the selection of 
  75318.     items on that menu.
  75319.             BOOL TrackPopupMenu(
  75320.               HMENU hMenu,            // handle of pop-up menu
  75321.             UINT uFlags,            // screen-position and mouse-button flags
  75322.             int x,                // horizontal position, in screen coordinates
  75323.             int y,                // vertical position, in screen coordinates
  75324.             int nReserved,            // reserved, must be zero
  75325.             HWND hWnd,            // handle of owner window
  75326.             CONST RECT *prcRect    // points to RECT that specifies no-dismissal area
  75327.         );"
  75328.  
  75329.     <stdcall: bool TrackPopupMenu handle dword sdword sdword sdword handle RECT* >
  75330.     ^self invalidCall!
  75331.  
  75332. translateAccelerator: handleWindow haccl: handleAccelerators lpmsg: aMSG
  75333.     "Translate accelerator keys for menu commands, translating WM_KEYDOWN or WM_SYSKEYDOWN 
  75334.     messages to WM_COMMAND or WM_SYSCOMMAND messages if there is an entry for the key in the 
  75335.     accelerator table with handle, handleAccelerators, sending the WM_COMMAND or WM_SYSCOMMAND 
  75336.     message directly to the window procedure of the window identified by the handle, handleWindow,
  75337.     returning only when the window procedure returns.
  75338.  
  75339.         int TranslateAccelerator(
  75340.             HWND  hwnd,    // handle of destination window
  75341.             HACCEL  haccl,    // handle of accelerator table
  75342.             LPMSG  lpmsg     // address of structure with message
  75343.         );    
  75344.  
  75345.     Answers true if the function succeeds, and has consumed the message. Answers false if the 
  75346.     functions fails. The exact error is available by sending KernelLibrary>>getLastError."
  75347.  
  75348.     <stdcall: bool TranslateAccelerator handle handle MSG* >
  75349.     ^self invalidCall
  75350. !
  75351.  
  75352. translateMessage: aMSG
  75353.     "Translates virtual-key messages into character messages, posting them to the message queue to
  75354.     be read by subsequent calls to #getMessage:etc or #peekMessage:etc.
  75355.  
  75356.         BOOL TranslateMessage(
  75357.             CONST MSG *lpMsg     // address of structure with message
  75358.         );"
  75359.  
  75360.     <stdcall: bool TranslateMessage MSG* >
  75361.     ^self invalidCall!
  75362.  
  75363. unregisterClass: classAtomOrStringName hInstance: instanceHandle
  75364.     "Remove a window class.
  75365.         BOOL UnregisterClass(
  75366.             LPCTSTR lpClassName,    // address of class name string
  75367.             HINSTANCE hInstance     // handle of application instance
  75368.         );"
  75369.  
  75370.     <stdcall: bool UnregisterClassA lpvoid handle>
  75371.     ^self invalidCall!
  75372.  
  75373. updateWindow: hWnd
  75374.     "Repaint the client area of the specified window by sending a wmPaint: directly to
  75375.     the window if its update region is not empty.
  75376.         BOOL UpdateWindow(
  75377.             HWND hWnd     // handle of window  
  75378.         );"
  75379.  
  75380.     <stdcall: bool UpdateWindow handle>
  75381.     ^self invalidCall!
  75382.  
  75383. validate: hWnd lpRect: aRECT
  75384.     "Remove aRECT from hWnd's update region (that portion of the
  75385.     windows client area that requires repainting).
  75386.         BOOL ValidateRect(
  75387.               HWND hWnd,            // handle of window with changed update region  
  75388.             CONST RECT *lpRect        // address of rectangle coordinates 
  75389.         );"
  75390.  
  75391.     <stdcall: bool ValidateRect handle RECT* >
  75392.     ^self invalidCall!
  75393.  
  75394. vkKeyScan: aChar
  75395.     "Translate a character to the corresponding virtual-key code 
  75396.     and shift state for the current keyboard.
  75397.         SHORT VkKeyScan(
  75398.             TCHAR ch     // character to translate
  75399.        );"
  75400.  
  75401.     <stdcall: sword VkKeyScanA char>
  75402.     ^self invalidCall
  75403.  
  75404. !
  75405.  
  75406. windowFromPoint: aPOINTL
  75407.     "The WindowFromPoint function retrieves the handle of the window that contains the
  75408.     specified point. 
  75409.         HWND WindowFromPoint(
  75410.             POINT Point);     // structure with point
  75411.  
  75412.     Return Values:
  75413.     If the function succeeds, the return value is the handle of the window that contains the 
  75414.     point. If no window exists at the given point, the return value is NULL. 
  75415.  
  75416.     Remarks:
  75417.     The WindowFromPoint function does not retrieve the handle of a hidden or disabled 
  75418.     window, even if the point is within the window. Use the ChildWindowFromPoint function 
  75419.     for a nonrestrictive search."
  75420.  
  75421.     <stdcall: handle WindowFromPoint POINTL>
  75422.     ^self invalidCall! !
  75423.  
  75424. VMLibrary comment:
  75425. 'VMLibrary is an <ExternalLibrary> to represent the Dolphin Smalltalk Virtual Machine (VM). 
  75426.  
  75427. The VM contains, for example, a number of exports to implement pseudo-primitive operations, in particular to simplify the interface to other external library functions, and external call methods to access these exported functions are implemented here.
  75428.  
  75429. Instance Variables:
  75430.     wndProc         - <Integer> address of the VM''s window procedure.
  75431.     dlgProc         - <ExternalAddress>. Pointer to the VM''s dialog procedure.
  75432.     genericCallback     - <Integer> address of the VM''s common callback entry point.
  75433.     vtable        - <ExternalAddress>. Pointer to the VM''s common virtual table (for implementing C++/COM objects).
  75434.  
  75435. Class Variables:
  75436.     Registry        - <Array> of <Object>s shared between the VM and the image.     N.B. It is not possible to modify this object directly, as it is read-only.
  75437.     RegistryKeys    - <LookupTable> mapping symbolic names to the <Integer> indices of objects in the VM registry.
  75438. '!
  75439. !VMLibrary class methodsFor!
  75440.  
  75441. fileName
  75442.     "Answer the host system file name of the library. This may vary."
  75443.  
  75444.     ^self shouldNotImplement!
  75445.  
  75446. initialize
  75447.     "Private - Initialize the receiver's class variables - see class comment for further details.
  75448.  
  75449.         VMLibrary initialize
  75450.     "
  75451.  
  75452.     "Registry := DO NOT ASSIGN ME."
  75453.  
  75454.     RegistryKeys := (IdentityDictionary new)
  75455.                 at: #Smalltalk put: 9;
  75456.                 at: #Processor put: 10;
  75457.                 at: #arithmeticSelectors put: 16;
  75458.                 at: #commonSelectors put: 31;
  75459.                 at: #Metaclass put: 81;
  75460.                 at: #Character put: 82;
  75461.                 at: #Array put: 83;
  75462.                 at: #String put: 84;
  75463.                 at: #Symbol put: 85;
  75464.                 at: #SmallInteger put: 86;
  75465.                 at: #Process put: 87;
  75466.                 at: #CompiledMethod put: 88;
  75467.                 at: #MethodContext put: 89;
  75468.                 at: #BlockClosure put: 90;
  75469.                 at: #Message put: 91;
  75470.                 at: #ByteArray put: 92;
  75471.                 at: #UnicodeString put: 93;
  75472.                 at: #CompiledExpression put: 94;
  75473.                 at: #ExternalMethod put: 95;
  75474.                 at: #Float put: 96;
  75475.                 at: #UndefinedObject put: 97;
  75476.                 at: #Association put: 98;
  75477.                 at: #Semaphore put: 99;
  75478.                 at: #ExternalAddress put: 100;
  75479.                 at: #ExternalHandle put: 101;
  75480.                 at: #Dispatcher put: 102;
  75481.                 at: #LPVOID put: 103;
  75482.                 at: #Point put: 104;
  75483.                 at: #PoolConstantsDictionary put: 105;
  75484.                 at: #CompilationResult put: 106;
  75485.                 at: #LargeInteger put: 107;
  75486.                 at: #VARIANT put: 108;
  75487.                 at: #BSTR put: 109;
  75488.                 at: #DATE put: 110;
  75489.                 at: #Corpse put: 111;
  75490.                 at: #InputSemaphore put: 112;
  75491.                 at: #FinalizeSemaphore put: 113;
  75492.                 at: #BereavementSemaphore put: 114;
  75493.                 at: #FinalizeQueue put: 118;
  75494.                 at: #BereavementQueue put: 119;
  75495.                 at: #GUID put: 120;
  75496.                 at: #KernelHandle put: 121;
  75497.                 at: #VMHandle put: 122;
  75498.                 at: #DolphinHandle put: 123;
  75499.                 at: #IUnknown put: 124;
  75500.                 at: #WakeupEvent put: 125;
  75501.                 at: #RtfStyles put: 127;
  75502.                 at: #IDispatch put: 128;
  75503.                 at: #ImageVersionMajor put: 129;
  75504.                 at: #ImageVersionMinor put: 130;
  75505.                 at: #CRTHandle put: 132;
  75506.                 at: #MemoryManager put: 133;
  75507.                 at: #BYTE put: 134;
  75508.                 at: #SBYTE put: 135;
  75509.                 at: #WORD put: 136;
  75510.                 at: #SWORD put: 137;
  75511.                 at: #DWORD put: 138;
  75512.                 at: #SDWORD put: 139;
  75513.                 at: #FLOAT put: 140;
  75514.                 at: #DOUBLE put: 141;
  75515.                 at: #VARIANT_BOOL put: 142;
  75516.                 at: #CURRENCY put: 143;
  75517.                 at: #DECIMAL put: 144;
  75518.                 at: #LPBSTR put: 145;
  75519.                 shrink;
  75520.                 yourself!
  75521.  
  75522. open
  75523.     "Answer the singleton instance of the receiver (it cannot be re-opened)"
  75524.  
  75525.     ^default!
  75526.  
  75527. registryKeys
  75528.     "Private - Answer the map between symbolic names and VM registry indices."
  75529.  
  75530.     ^RegistryKeys! !
  75531.  
  75532. !VMLibrary methodsFor!
  75533.  
  75534. addressFromInteger: anInteger
  75535.     "Private - Answer a new ExternalAddress instantiated from the argument.
  75536.     Implementation Note: AnswerDWORD() is a simple function which returns its 32-bit argument.
  75537.     By appropriately specifying the argument and return types, we can use external call
  75538.     primitive's argument coercion and return object instantiation, to perform useful type
  75539.     conversions very quickly."
  75540.  
  75541.     <stdcall: lpvoid AnswerDWORD dword>
  75542.     ^self invalidCall!
  75543.  
  75544. applicationHandle
  75545.     "Answer the handle of the Dolphin application instance."
  75546.  
  75547.     ^Registry at: 123!
  75548.  
  75549. α\;¬å&D╨└╬ï6⌡▌ε└≈═┌ò¬·ábç√╚t`\┼ì0VÿH9zNUmA┤∞t4 O░hWiúº,á₧@º╗≈┐π├=á}P)`i╬ΓX╟≈╙\DôVÜc»O┐y│≡]!
  75550.  
  75551. basePatchLevel
  75552.     "Private - Answer the base patch level of this image. We can assume that the image already
  75553.     incorporates patches to this level so we don't allow patches below this to be installed"
  75554.  
  75555.     ^0!
  75556.  
  75557. bytecodeVersion
  75558.     "Answer the <integer> bytecode version number.
  75559.         VMLibrary default bytecodeVersion
  75560.     "
  75561.  
  75562.     ^Integer fromString: (self versionInfo at: 'PrivateBuild')!
  75563.  
  75564. compilerFileName
  75565.     "Private - Answer the name of the compiler library."
  75566.  
  75567.     ^self fileName!
  75568.  
  75569. crashDump: message
  75570.     "Private - Write a full VM state log to the crash dump file with the <readableString>,
  75571.     message, as an exception argument which will appear in the dump.
  75572.     This can be handy for debugging in run-time systems when you detect an
  75573.     unexpected situation and want the sort of information available in the crash
  75574.     dump (the stack state at the time, etc), but you don't actually want to raise a
  75575.     non-continuable exception.
  75576.         VMLibrary default crashDump: 'Hello'
  75577.     N.B. In order for a crash dump to be produced the registry on the machine
  75578.     must be appropriately configured."
  75579.  
  75580.     | parms |
  75581.     parms := DWORDArray new: 1.
  75582.     parms at: 1 put: message yourAddress.
  75583.     KernelLibrary default 
  75584.             raiseException: 16r20000002    "Special exception code recognised by the VM"
  75585.             dwExceptionFlags: 0 
  75586.         nNumberOfArguments: 1 
  75587.         lpArguments: parms!
  75588.  
  75589. crtHandle
  75590.     "Private - Answer the handle of the CRTLibrary. This cannot be obtained in the normal way
  75591.     as we do not necessarily know which CRT library the VM is itself using."
  75592.  
  75593.     ^self registryAt: #CRTHandle!
  75594.  
  75595. debugDump: msgString
  75596.     "Write a VM state log with unconstrained stack and walkback dumps to 
  75597.     the OS debug trace device with <readableString> message, 
  75598.     msgString, as the header description"
  75599.  
  75600.     <stdcall: void DebugDump lpstr>
  75601.     ^self invalidCall
  75602. !
  75603.  
  75604. defaultProductDetails
  75605.     "Private - Answers a five element<Array> describing the default
  75606.      version of the development environment as based on the VM version.
  75607.  
  75608.     1. <readableString> Product name 
  75609.     2. <readableString> Short product name
  75610.     3. <Float> Version number
  75611.     4. <readableString> Version special
  75612.     5. <Integer> Image patch level"
  75613.  
  75614.     | version |
  75615.     version := self versionInfo.
  75616.     ^(Array new: 5)
  75617.         at: 1 put: (version formatVersionString: '%1 %2!!d!!');
  75618.         at: 2 put: (version formatVersionString: '%1');
  75619.         at: 3 put: (Float fromString: (version formatVersionString: '%3!!d!!.%4!!d!!%5!!d!!'));
  75620.         at: 4 put: version specialBuild;
  75621.         at: 5 put: self basePatchLevel;
  75622.         yourself!
  75623.  
  75624. displayDesktopMessage: aString 
  75625.     <stdcall: handle DisplayDesktopMessage lpstr>
  75626.     ^self invalidCall
  75627. !
  75628.  
  75629. dump: msgString path: pathString stackDepth: slotsInteger walkbackDepth: framesInteger
  75630.     "Write a VM state log to the file with <readableString> path, pathString, with the 
  75631.     <readableString> message, msgString, as the header description, and with the
  75632.     stack and walkback depths constrained to the depths specified by the <integer>s, 
  75633.     slotInteger and framesInteger, respectively (-1 can be used for unconstrained
  75634.     dumps). If either depth is less than that required to dump the entire stack, then
  75635.     stack slots or frames (respectively) will be omitted from the dump. In the case of
  75636.     the raw stack dump, slots are omitted from the middle of the stack. In the case
  75637.     of the walkback, frames are omitted at the bottom of the stack.
  75638.     This method can be handy for debugging in run-time systems when you detect an
  75639.     unexpected situation and want the sort of information available in the crash
  75640.     dump (the stack state at the time, etc), but you don't actually want to raise a
  75641.     non-continuable exception, and you want want to output a crash dump using
  75642.     parameters (such as the log file) other than those in the registry."
  75643.  
  75644.     <stdcall: void Dump lpstr lpstr sdword sdword>
  75645.     ^self invalidCall
  75646. !
  75647.  
  75648. errorIntegerMoreThan32Bits: anInteger
  75649.     "Private - Raise an exception to the effect that anInteger cannot be represented
  75650.     as a 32-bit two's complement integer (it's too 'large')."
  75651.  
  75652.     ^self error: anInteger displayString, ' is too large for 32-bit two''s complement representation.'!
  75653.  
  75654. fullVersion
  75655.     "Answer a String which describes the full name and version number of the VM."
  75656.  
  75657.     ^self versionInfo formatVersionString: '%1 %2!!d!! release %3!!d!!.%4!!d!!%5!!d!!'!
  75658.  
  75659. getDlgProc
  75660.     "Private - Answer a pointer to the VM's dialog window procedure.
  75661.     The dialog window procedure does nothing except return 0. It's purpose is to act
  75662.     as the target of a CallDefaultProc() in order to regularize the interface
  75663.     so that there is no difference in handling between dialogs and non-dialogs."
  75664.  
  75665.     dlgProc isNil ifTrue: [ dlgProc := self getProcAddress: 'DlgProc' ].
  75666.     ^dlgProc!
  75667.  
  75668. getGenericCallback
  75669.     "Private - Answer a pointer to the VM's generic callback function."
  75670.  
  75671.     genericCallback isNil ifTrue: [ 
  75672.         genericCallback := KernelLibrary default 
  75673.                 getProcAddressDWORD: self asParameter lpProcName: 'GenericCallback'].
  75674.     ^genericCallback!
  75675.  
  75676. µA374;¼å<,ô¡ß@∞}╤╞µ┌ ├┌ò≤▓ä]P¿╛╥;g@SÆ▓äM.kUGb∩┴Lk$J▒<Ue░δ4≥█ºñú▐·╬₧z[N,░╤[≥┘╥PE£Üp⌠τ(╟_æ;&7+ΣhÖ₧IÄKyÑ5┼ùσ≈┼¼vî!
  75677.  
  75678. getVTable
  75679.     "Private - Answer a pointer to the VM's vtable (a fixed size virtual
  75680.     function pointer table for use in conjunction with the COM implementation)."
  75681.  
  75682.     vtable isNil ifTrue: [vtable := self getProcAddress: 'VTable'].
  75683.     ^vtable!
  75684.  
  75685. getWndProc
  75686.     "Answer a pointer to the VM's window procedure. The VM's window procedure does very little
  75687.     except forward messages to Smalltalk for dispatching to the appropriate Window. It
  75688.     calls the windows default proc (either the proc. before the window was subclassed by Dolphin
  75689.     or the DefWindowProc if a Dolphin Window) if a non-integer value is returned to it."
  75690.  
  75691.     "There is not point throwing an error here if it fails, because that will be terminal anyway."
  75692.     wndProc isNil ifTrue: [ 
  75693.         wndProc := KernelLibrary default 
  75694.             getProcAddressDWORD: self asParameter lpProcName: 'WndProc' ].
  75695.     ^wndProc!
  75696.  
  75697. handleFromInteger: anInteger
  75698.     "Private - Answer a new ExternalHandle instantiated from the argument.
  75699.     Implementation Note: AnswerDWORD() is a simple function which returns its 32-bit argument.
  75700.     By appropriately specifying the argument and return types, we can use external call
  75701.     primitive's argument coercion and return object instantiation, to perform useful type
  75702.     conversions very quickly."
  75703.  
  75704.     <stdcall: handle AnswerDWORD dword>
  75705.     ^ExternalHandle new value: anInteger asInteger!
  75706.  
  75707. hashBytes: bytes count: count
  75708.     "Private - Hash the specified number of bytes at the specified address using the
  75709.     function which implements the standard byte hashing primitive (106).
  75710.     Implementation Notes: The algorithm is from Aho, Sethi, and Ullman. 
  75711.     The Smalltalk code is included for documentary purposes only."
  75712.  
  75713.     | hash |
  75714.     <cdecl: sdword HashBytes lpvoid dword>
  75715.  
  75716.     hash := 0.
  75717.     1 to: count do: [:i |
  75718.         hash := (hash bitShift: 4) + (bytes basicAt: i).
  75719.         hash > 16rFFFFFFF ifTrue: [
  75720.             hash := (hash bitAnd: 16rFFFFFFF) bitXor: ((hash bitShift: -24) bitAnd: 16rF0)]].
  75721.     ^hash!
  75722.  
  75723. highBit: anInteger
  75724.     "Answer the index of the high bit of the argument."
  75725.  
  75726.     <stdcall: sdword highBit dword>
  75727.     ^self invalidCall!
  75728.  
  75729. indexOfSpecialSelector: aSymbol ifAbsent: exceptionHandler
  75730.     "Private - Answer the index of the special selector, aSymbol, or 
  75731.     the result of evalating the niladic valuable, exceptionHandler,
  75732.     if aSymbol is not a Special Selector."
  75733.  
  75734.     | index |
  75735.     index := Registry 
  75736.                 nextIdentityIndexOf: aSymbol
  75737.                 from: specialSelectorStart
  75738.                 to: specialSelectorStart + 31.
  75739.     ^index == 0 
  75740.         ifTrue: [exceptionHandler value]
  75741.         ifFalse: [index - specialSelectorStart + 1]!
  75742.  
  75743. isSlowMachine
  75744.     "Answer true if this machine is judged to be slow."
  75745.  
  75746.     ^(UserLibrary default getSystemMetrics: SM_SLOWMACHINE) ~~ 0
  75747.  
  75748. "
  75749.     VMLibrary default isSlowMachine
  75750. "!
  75751.  
  75752. kernelHandle
  75753.     "Private - Answer the handle of the KernelLibrary. This cannot be obtained in the normal way
  75754.     because there is a bit of a chicken and egg problem."
  75755.  
  75756.     ^self registryAt: #KernelHandle!
  75757.  
  75758. largeSignedFromUnsigned: anInteger
  75759.     "Private - Answer a 64-bit signed integer value instantiated from the unsigned integer
  75760.     argument. Use the VM's external call primitive to perform the conversion very quickly."
  75761.  
  75762.     <stdcall: sqword AnswerQWORD qword>
  75763.     ^self invalidCall!
  75764.  
  75765. largeUnsignedFromSigned: anInteger
  75766.     "Private - Answer a 64-bit signed integer value instantiated from the signed integer
  75767.     argument. Use the VM's external call primitive to perform the conversion very quickly."
  75768.  
  75769.     <stdcall: qword AnswerQWORD sqword>
  75770.     ^self invalidCall!
  75771.  
  75772. makeLargeSigned: aLARGE_INTEGER
  75773.     "Private - Answer an Integer (a SmallInteger or a LargeInteger, whichever is the minimum
  75774.     representation) instantiated from the 64-bit signed integer argument.
  75775.     This routine is used by the external call primitives, and is exported from the VM
  75776.     for reuse from Smalltalk or external primitives."
  75777.  
  75778.     <stdcall: sqword AnswerQWORD qword>
  75779.     ^self invalidCall!
  75780.  
  75781. makeLargeSigned: highSDWORD highPart: lowSDWORD
  75782.     "Private - Answer an Integer of up to 64 bits, as necessary, to represent the signed
  75783.     integer formed from the high and low order DWORD arguments. The result will be zero
  75784.     if highSDWORD has its high bit set.
  75785.     This routine is an example of a function returing a signed 8-byte integer (sqword)."
  75786.  
  75787.     <stdcall: sqword AnswerQWORD sdword dword>
  75788.     ^self invalidCall!
  75789.  
  75790. makeLargeUnsigned: eightBytes
  75791.     "Private - Answer a positive Integer (i.e. a SmallInteger or a LargeInteger)
  75792.     instantiated from the 64-bit argument."
  75793.  
  75794.     <stdcall: qword AnswerQWORD qword>
  75795.     ^self invalidCall!
  75796.  
  75797. makeLargeUnsigned: lowDWORD highPart: highDWORD
  75798.     "Private - Answer an Integer of up to 64 bits, as necessary, to represent the unsigned
  75799.     integer formed from the high and low order DWORD arguments.
  75800.     This routine is an example of a qword (8-byte Integer) return type."
  75801.  
  75802.     <stdcall: qword AnswerQWORD dword dword>
  75803.     ^self invalidCall!
  75804.  
  75805. onStartup
  75806.     "Initialize the receiver immediately following system startup.
  75807.     THIS MUST BE DONE FIRST."
  75808.  
  75809.     handle := Registry at: 122.
  75810.     specialSelectorStart :=  RegistryKeys at: #arithmeticSelectors.
  75811.     wndProc := dlgProc := vtable := genericCallback := nil!
  75812.  
  75813. primRegistryAt:  anInteger put: anObject
  75814.     "Private - Generic VM object registering primitive. Used to register cookies, Semaphores,
  75815.     the Corpse object, etc.
  75816.  
  75817.     Equivalent to 'Registry at: anInteger put: anObject', but allows the VM to reload any
  75818.     information it caches.
  75819.  
  75820.     Primitive failure reasons:
  75821.         0 -    anInteger is not a SmallInteger
  75822.         1 -    anInteger is out of the bounds of the registry
  75823.         2 -    anObject is not of the appropriate class for the object being registered."
  75824.     
  75825.     <primitive: 93>
  75826.     ^self primitiveFailed!
  75827.  
  75828. productName
  75829.     "Answer the localised name for Dolphin."
  75830.  
  75831.     ^self versionInfo productName
  75832. !
  75833.  
  75834. registerEventSource: aString
  75835.     <stdcall: handle RegisterAsEventSource lpstr>
  75836.     ^self invalidCall
  75837. !
  75838.  
  75839. registry
  75840.     "Private - Answer the VM registry of objects."
  75841.  
  75842.     ^Registry!
  75843.  
  75844. registryAt: aSymbol
  75845.     "Private - Answer the VM registered object with the name, aSymbol."
  75846.     
  75847.     ^Registry at: (RegistryKeys at: aSymbol)!
  75848.  
  75849. registryAt: aSymbol put: anObject
  75850.     "Private - Register the argument, anObject, as the VM registered object with the name,
  75851.     aSymbol."
  75852.     
  75853.     self primRegistryAt: (RegistryKeys at: aSymbol) put: anObject.
  75854.     ^anObject!
  75855.  
  75856. removeDesktopMessage: anExternalHandle
  75857.     <stdcall: void RemoveDesktopMessage handle>
  75858.     ^self invalidCall!
  75859.  
  75860. shortName
  75861.     "Answer the localised short name for Dolphin."
  75862.  
  75863.     ^String fromId: 129 in: self!
  75864.  
  75865. signedFromUnsigned: anInteger
  75866.     "Private - Answer a 32-bit signed integer value instantiated from the unsigned 32-bit integer
  75867.     argument. Use the VM's external call primitive to perform the conversion very quickly."
  75868.  
  75869.     <stdcall: sdword AnswerDWORD dword>
  75870.     ^anInteger isInteger
  75871.         ifTrue: [self errorIntegerMoreThan32Bits: anInteger]
  75872.         ifFalse: [self invalidCall]!
  75873.  
  75874. specialSelectors
  75875.     "Private - Answer the 32 special selectors.
  75876.         VMLibrary default specialSelectors
  75877.     "
  75878.  
  75879.     ^self registry copyFrom: specialSelectorStart to: specialSelectorStart+31!
  75880.  
  75881. stringFromAddress: pointer
  75882.     "Private - Answer a new String instantiated from the null-terminated String pointed 
  75883.     at by the argument.
  75884.     Implementation Note: AnswerDWORD() is a simple function which returns its 32-bit argument.
  75885.     By appropriately specifying the argument and return types, we can use external call
  75886.     primitive's argument coercion and return object instantiation, to perform useful type
  75887.     conversions very quickly."
  75888.  
  75889.     | addr len |
  75890.     <stdcall: lpstr AnswerDWORD lpvoid>
  75891.     addr := pointer isInteger ifTrue: [pointer asExternalAddress] ifFalse: [pointer].
  75892.     len := pointer indexOf: 0.
  75893.     ^pointer copyStringFrom: 1 to: len-1!
  75894.  
  75895. ⌠J+63Æóhi¬╗â.É<⌡²δî√╧╧▄¼≈äUW║⌐Ü;~GX╞î-æSE-}m≈å4 OônZ|ú┐%║ô!!╝ú▓ôτ█^â{`l╒┐fr║┴┼Aÿö;εq│zÖΦT]x⌡lÜ₧^òTqó@`·£╫≤╦Ña╓MÅë£x¡σ~@Γwoèµ=₧╦WΓ&┴^▌₧G°╔|éGv╘:┐╪É`╗½╕√°íµy⌐σáaW&nº≈7t]ë┬₧⌐J#|jJÜî àN
  75896. à░╪½╝{ß¿ÄìÄ6░φë╟w
  75897. ╡nσOdZ≡╕f─-R k⌠Φûû╦Mò╥└Γ²4┐mΦ=╠≤²╙){L}¡>¥π(bö&┴ƒMCdò, ₧δ0α#U═▒»A0(Ck┼Z╪▐╪C╬ú}>≈∩[ÜåÜI╩l,XEQ═■(}ù`ûⁿÿ█┴╨ÿτ¥ÖÜ▄UÑàK_*º╥¢╩>φvn╗╖╜╧┬:1₧ël│ç░VΣ⌠·*ïI~2Mï▄≈E¥íàΘ╕╩ÜÑ1çΘ╡└=┘⌡é~éÅKí▓k%╛²╓╠╒XG╧48┼■ìQí¡ö#└÷Ä`O½╚:φttπì*%ÇRzδ┴╢τ¥^╧'¼τ╩┴µΦG^╒aNOæ≤÷╠Hß█┼⌐▒-    O┘KJ#û╖ç(║cÜ╒2`¢Åε9ÿ▌⌡+═_┴>!
  75898.  
  75899. unsignedFromSigned: anInteger
  75900.     "Private - Answer a 32-bit unsigned integer value instantiated from the signed 32-bit integer
  75901.     argument.
  75902.     Implementation Note: AnswerDWORD() is a simple function which returns its 32-bit argument.
  75903.     By appropriately specifying the argument and return types, we can use external call
  75904.     primitive's argument coercion and return object instantiation, to perform useful type
  75905.     conversions very quickly."
  75906.  
  75907.     <stdcall: dword AnswerDWORD sdword>
  75908.     ^anInteger isInteger
  75909.         ifTrue: [self errorIntegerMoreThan32Bits: anInteger]
  75910.         ifFalse: [self invalidCall]!
  75911.  
  75912. versionFormatString
  75913.     "Private - Answer a String containing the version format used by the receiver."
  75914.  
  75915.     ^'%3!!d!!.%4!!d!!%5!!d!!'! !
  75916.  
  75917. _FPIEEE_RECORD comment:
  75918. '_FPIEEE_RECORD is an <ExternalStructure> class to represent the Win32 structure of the same name. _FPIEEE_RECORD is used in the reporting of IEEE compliant floating point exceptions.'!
  75919. !_FPIEEE_RECORD class methodsFor!
  75920.  
  75921. defineFields
  75922.     "Define the fields of the _FPIEEE_RECORD 'structure'. The _FPIEEE_RECORD is a
  75923.     rather complex structure containing details of a floating point exception.
  75924.  
  75925.         self compileDefinition
  75926.     "
  75927.  
  75928.     self
  75929.         defineField: #flags type: DWORDField readOnly;
  75930.         defineField: #cause type: DWORDField readOnly;
  75931.         defineField: #enable type: DWORDField readOnly beUncompiled;
  75932.         defineField: #status type: DWORDField readOnly beUncompiled;
  75933.         defineField: #operand1 type: (StructureField type: _FPIEEE_VALUE) beReadOnly;
  75934.         defineField: #operand2 type: (StructureField type: _FPIEEE_VALUE) beReadOnly;
  75935.         defineField: #result type: (StructureField type: _FPIEEE_VALUE) beFiller
  75936. ! !
  75937.  
  75938. !_FPIEEE_RECORD methodsFor!
  75939.  
  75940. cause
  75941.     "Answer the receiver's cause field as a Smalltalk object."
  75942.  
  75943.     ^(bytes dwordAtOffset: 4)!
  75944.  
  75945. causeCode
  75946.     "Answer an <integer> which identifies the cause of the exception."
  75947.  
  75948.     ^(self cause bitAnd: 16r1F) highBit!
  75949.  
  75950. causeName
  75951.     "Answer the symbolic name of the type of floating point exception the receiver
  75952.     represents."
  75953.  
  75954.     ^self nameOfCode: self causeCode!
  75955.  
  75956. flags
  75957.     "Answer the receiver's flags field as a Smalltalk object."
  75958.  
  75959.     ^(bytes dwordAtOffset: 0)!
  75960.  
  75961. isDivide
  75962.     "Answer whether a division operation was being attemped when the exception occurred."
  75963.  
  75964.     ^self operation == 4!
  75965.  
  75966. isOverflow
  75967.     "Answer whether this IEEE FP exception record represents a floating point
  75968.     underflow error."
  75969.  
  75970.     ^self causeCode == 3
  75971. !
  75972.  
  75973. isUnderflow
  75974.     "Answer whether this IEEE FP exception record represents a floating point
  75975.     underflow error."
  75976.  
  75977.     ^self causeCode == 2
  75978. !
  75979.  
  75980. isZeroDivide
  75981.     "Answer whether this IEEE FP exception record represents a floating point
  75982.     division by zero error.
  75983.     Implementation Note: Division by zero is signalled as either a ZeroDivide
  75984.     or InvalidOperation, the latter cause identifying 0 is divided by 0.
  75985.     When dividing by integer 0, it appears that the value of the second
  75986.     operand is not reliably set up, so we assume that any invalid divide
  75987.     of zero is a division by zero."
  75988.  
  75989.     ^self causeCode == 4 or: [self isDivide and: [self operand1 value isZero]]
  75990. !
  75991.  
  75992. nameOfCode: anInteger
  75993.     "Private - Answer the FP exception type name from the _FPIEEE_EXCEPTION_FLAGS
  75994.     value anInteger."
  75995.  
  75996.     ^#('Inexact' 'Underflow' 'Overflow' 'ZeroDivide' 'InvalidOperation')
  75997.             at: anInteger ifAbsent: [#Unknown]!
  75998.  
  75999. operand1
  76000.     "Answer the receiver's operand1 field as a Smalltalk object."
  76001.  
  76002.     ^_FPIEEE_VALUE fromAddress: (bytes yourAddress + 16)!
  76003.  
  76004. operand2
  76005.     "Answer the receiver's operand2 field as a Smalltalk object."
  76006.  
  76007.     ^_FPIEEE_VALUE fromAddress: (bytes yourAddress + 40)!
  76008.  
  76009. operation
  76010.     "Answer an <integer> which identifies the type of operation being attemped when the exception
  76011.     occurred. See fpieee.h in the MS Win32 SDK for further information."
  76012.  
  76013.     ^(self flags bitShift: -5) bitAnd: 16rFFF! !
  76014.  
  76015. _FPIEEE_VALUE comment:
  76016. '_FPIEEE_VALUE is an <ExternalStructure> class to represent the Win32 structure of the same name. _FPIEEE_VALUE is used in the reporting of IEEE compliant floating point exceptions.'!
  76017. !_FPIEEE_VALUE class methodsFor!
  76018.  
  76019. defineFields
  76020.     "Define the fields of the _FPIEEE_VALUE 'structure'.
  76021.  
  76022.         self compileDefinition
  76023.     "
  76024.  
  76025.     self
  76026.         defineField: #value type: (FillerField byteSize: 16);
  76027.         defineField: #flags type: DWORDField readOnly;
  76028.         defineField: #filler type: DWORDField filler! !
  76029.  
  76030. !_FPIEEE_VALUE methodsFor!
  76031.  
  76032. flags
  76033.     "Answer the receiver's flags field as a Smalltalk object."
  76034.  
  76035.     ^(bytes dwordAtOffset: 16)!
  76036.  
  76037. isValid
  76038.     ^(self flags allMask: 1)!
  76039.  
  76040. value
  76041.     "Answer the <Number> value stored in the receiver, of nil if the receiver is not a valid value
  76042.     or is of an unsupported format."
  76043.  
  76044.     ^self isValid ifTrue: [
  76045.         bytes 
  76046.         perform: (#(
  76047.             floatAtOffset: 
  76048.             doubleAtOffset:
  76049.             longDoubleAtOffset:    "80-bit float"
  76050.             dwordAtOffset:        "128-bit float - not supported on Intel h/w"
  76051.             swordAtOffset:
  76052.             sdwordAtOffset:
  76053.             sqwordAtOffset
  76054.             wordAtOffset:
  76055.             dwordAtOffset:
  76056.             qwordAtOffset:
  76057.             dwordAtOffset: "BCD"
  76058.             dwordAtOffset: "compare?"
  76059.             dwordAtOffset: "string?")
  76060.                 at: (self valueType + 1))
  76061.         with: 0]!
  76062.  
  76063. valueType
  76064.     "Answer an <integer> which identifies the type of value stored in the receiver."
  76065.  
  76066.     ^(self flags bitAnd: 16r1E) bitShift: -1! !
  76067.  
  76068. COMInterface comment:
  76069. ''!
  76070. !COMInterface class methodsFor!
  76071.  
  76072. addFunction: functionClass selector: aSymbol descriptor: anExternalDescriptor
  76073.     "Private - Add a function call definition to the receivers dispatch table."
  76074.  
  76075.     functions add: (functionClass
  76076.                     selector: aSymbol
  76077.                     descriptor: anExternalDescriptor)!
  76078.  
  76079. argSizes
  76080.     "Private - Answer the DWORD array of arg sizes."
  76081.  
  76082.     ^argSizes!
  76083.  
  76084. atAddress: anAddress
  76085.     "Answer a new instance of the receiver instantiated from the
  76086.     data at the specified address. 
  76087.     Implementation Note: Since COMInterfaces always have reference
  76088.     form (except in rare cases for the stubs that Dolphin uses internally
  76089.     when acting as a COM server), it is assumed that the specified address
  76090.     contains an interface pointer, so the address is dereferenced to get
  76091.     the actual address."
  76092.  
  76093.     ^self fromAddress: (anAddress asExternalAddress dwordAtOffset: 0)!
  76094.  
  76095. attach: interfaceAddress
  76096.     "Attach the a new pointer instance of the receiver to the interface at 
  76097.     the specified address. 
  76098.     Note that this effectively takes ownership of an orphan interface
  76099.     pointer in that no further reference is added to that pointer, and the 
  76100.     interface pointer will be released when the instance is GC'd."
  76101.  
  76102.     ^self basicNew attach: interfaceAddress!
  76103.  
  76104. attachInterface: interface
  76105.     "Attach a new pointer instance of the receiver to the <COMInterface>,
  76106.     interface, which is detached. If interface is instead nil, then answer nil."
  76107.  
  76108.     ^interface isNil ifFalse: [self attach: interface detach]!
  76109.  
  76110. calcArgSizes
  76111.     "Private - Work through the callback array, building an table of argument sizes
  76112.     corresponding to each virtual callback function. This table is linked into the
  76113.     instance thunks of the receiver's instances and used to clean off the stack."
  76114.  
  76115.     | sizes count |
  76116.     "self instanceCount > 0 ifTrue: [ Warning signal: 'Attempting to redefine COM Interface with outstanding instances' ]."
  76117.     sizes := functions collect: [ :cb | cb argumentsSize ].
  76118.     count := functions size.
  76119.     argSizes := ByteArray newFixed: count*4.
  76120.     1 to: count do: [ :i |
  76121.         argSizes dwordAtOffset: (i-1*4) put: (sizes at: i) ].!
  76122.  
  76123. classForIID: aGUID
  76124.     "Answer the COM interface class (a subclass of the receiver) which
  76125.     provides the COM interface identified by the argument, aGUID.
  76126.     Note that in general, instances of the class do not actually implement the
  76127.     interface, they are just a facade. Raise an error if the GUID is not
  76128.     recognised."
  76129.  
  76130.     ^self classForIID: aGUID 
  76131.         ifNone: [self error: 'There is no interface registered for the IID ', aGUID displayString]
  76132.     !
  76133.  
  76134. classForIID: aGUID ifNone: exceptionHandler
  76135.     "Answer the COM interface class (a subclass of the receiver) which
  76136.     provides the COM interface identified by the argument, aGUID.
  76137.     Note that in general, instances of the class do not actually implement the
  76138.     interface, they are just a facade. Answer nil if the GUID is not recognised."
  76139.  
  76140.     ^InterfaceClasses at: aGUID ifAbsent: exceptionHandler
  76141.  
  76142.     !
  76143.  
  76144. clear: addressOrBytes
  76145.     "Finalize an instance of the structure which instances of the receiver wrap
  76146.     which resides at the specified address. Note that this is not about freeing
  76147.     the specified memory block, but any resources which it references."
  76148.  
  76149.     (IUnknown attach: addressOrBytes) free!
  76150.  
  76151. clearGuid
  76152.     "Private - Set the receiver's GUID to be the null <GUID>.
  76153.     Override because we must retain our GUID, which is actually the <IID> of the interface."
  76154.  
  76155. !
  76156.  
  76157. clsid
  76158.     "Answer the component id for the receiver's COM class."
  76159.  
  76160.     ^CLSID null!
  76161.  
  76162. ΓK$4+╖╗+9┐Çé,èRï╜¡φ≡─╚╨¼▓ñ]Z »┘kv_▄é1@Ü^P#aU≈ò^\~/\╖ol¡╣`ε╓G@º╡╜¢⌠█\Ö4Igc╥ⁿy:½ë╥\KÉàgεJÑ=æ╝XA=≤b₧▌\╥╞mV║¼╨≤└ª3ï£ùÆoÜΦGAïn t½Θ╤╤Z╜▀Z╓│(sδ╚j∞MZ┘/┤⌡ìB{Ä!
  76163.  
  76164. ΓK$4+╖╗+9┐Çé,èτ·α┬√ìƒ╨ª±áCW╢┤╬SrFR▐ü,·5-hOU@|
  76165. Σ┴Wf[║lV*½Ñ&⌡╠O╝╛╕É╖█â4[gs╬»-4í█ÇM@ÉV£½@ó=ƒ╝FG;Θ$ï╓\▄Pq»5┼ù╤╢┼│3£Ü█ùy    »Σ[PΓioç²5▀▄Z⌐,EÑk╥αmm≡╔séAo╬╛╥Å]4▒½╕≤ß¡┤iZ∙⌠║B&EYo6╬µ8~K└ìźPc9G █Å+╦[BéΘ┴╜╝mφ╕ô╠ê'⌡⌠└╟E#C«y≡
  76166. b^∞ѬRΓæô₧Å╦Aö╪à∩Q┤&╗bφ2╟δ²æX+"l !!▒#ƒ⌡myⁿ^÷pù M@#▄= ₧■9σJ1E╪º├^3s
  76167. m°╥Æ┤.oΘΩZÑΩL┼╒ñB╞/=@T═■ 3ò`ÆΘÿ─á»⌠ïªßó6ò^åàIE!!·╥┤╟(φv■ù╛╚╩~à╜9«î¬í⌡²iÇLc>    ╟┌╥OùΣm╠£âQÆÿB│,ìüª╧-▌⌡é~ÇåFΣë2!
  76168.  
  76169. comObjectClass
  76170.     "Answer the class of COMObjectStub to use for wrapping objects which instantiate
  76171.     interfaces which are instances of the receiver."
  76172.  
  76173.     ^COMObjectStub!
  76174.  
  76175. compileFunction: anInteger 
  76176.     "Private - Generate a suitable compiled method for the specified COM function."
  76177.  
  76178.     | aStream fn |
  76179.     fn := self functions at: anInteger.
  76180.     aStream := WriteStream on: (String new: 512).
  76181.     aStream
  76182.         nextPutAll: fn messageSelectorAndArgumentNames;
  76183.         cr;
  76184.         tab;
  76185.         nextPutAll: '"Callout for the ';
  76186.         nextPutAll: self name;
  76187.         nextPutAll: '::';
  76188.         nextPutAll: (fn selector upTo: $:);
  76189.         nextPutAll: '() interface function.';
  76190.         cr;
  76191.         tab;
  76192.         nextPutAll: 'N.B. This method has been automatically generated from ';
  76193.         cr;
  76194.         tab;
  76195.         nextPutAll: 'the vtable defined in ';
  76196.         nextPutAll: self name;
  76197.         nextPutAll: '>>defineFunctions. DO NOT MODIFY!!"';
  76198.         cr;
  76199.         cr;
  76200.         tab;
  76201.         nextPutAll: '<virtual ';
  76202.         nextPutAll: fn callingConvention;
  76203.         space;
  76204.         nextPutAll: fn returnType;
  76205.         space;
  76206.         display: anInteger.
  76207.     fn argumentTypes do: 
  76208.             [:t | 
  76209.             aStream
  76210.                 space;
  76211.                 nextPutAll: t].
  76212.     aStream
  76213.         nextPut: $>;
  76214.         cr;
  76215.         tab;
  76216.         nextPutAll: '^self invalidCall'.
  76217.  
  76218.     "    Notification signal: aStream contents."
  76219.     self compile: aStream contents categories: self generatedFunctionCategories!
  76220.  
  76221. compileFunctions
  76222.     "Initialize the receiver class' structure template and callback table.
  76223.     Send this to subclasses of the receiver when you want to be able to invoke functions
  76224.     in an interface supplied by a third party (CALL OUT)."
  76225.  
  76226.     self removeCompiledFunctions.
  76227.     self defineVTable.
  76228.     superclass functions size+1 to: functions size do: [:i | self compileFunction: i].
  76229.     self subclasses do: [:s | s compileFunctions]!
  76230.  
  76231. compileFunctionsIntoImplementor: aClass
  76232.     "Helper to compile a set of method templates for the receiver's interface
  76233.     into the implementing class, aClass. These methods are of the form:
  76234.  
  76235.         <selector_arglist>
  76236.             "
  76237.  
  76238.     "Implement the <interface_name>::<function_name> function."
  76239.  
  76240.     "
  76241.  
  76242.             ^E_NOTIMPL
  76243.  
  76244.         IEnumXXXX compileFunctionsIntoImplementor: EnumRECT
  76245.     "
  76246.  
  76247.     | aStream cat |
  76248.     cat := self generatedFunctionCategories first.
  76249.     ((aClass includesCategory: cat) and: 
  76250.             [(MessageBox 
  76251.                 confirm: ('%1 already includes the method category ''%2''
  76252. The generated template methods may overwrite existing methods in the class.
  76253. Are you sure you want to proceed?' 
  76254.                         formatWith: aClass name
  76255.                         with: cat asString)) 
  76256.                     not]) 
  76257.         ifTrue: [^self].
  76258.     aStream := (String new: 256) writeStream.
  76259.     functions 
  76260.         from: superclass functions size + 1
  76261.         to: functions size
  76262.         do: 
  76263.             [:fn | 
  76264.             aStream
  76265.                 nextPutAll: fn messageSelectorAndArgumentNames;
  76266.                 cr;
  76267.                 tab;
  76268.                 nextPutAll: '"Implement the ';
  76269.                 nextPutAll: self name;
  76270.                 nextPutAll: '::';
  76271.                 nextPutAll: (fn selector upTo: $:);
  76272.                 nextPutAll: '() interface function."';
  76273.                 cr;
  76274.                 cr;
  76275.                 tab;
  76276.                 nextPutAll: '^E_NOTIMPL.';
  76277.                 cr;
  76278.                 tab;
  76279.                 nextPutAll: '#todo "Implement me"';
  76280.                 cr.
  76281.             aClass compile: aStream contents categories: self generatedFunctionCategories.
  76282.             aStream reset]!
  76283.  
  76284. createContextFlags
  76285.     "Answer a combination of flags from the CTX_ enumeration which specify the types of servers
  76286.     acceptable when creating COM objects.
  76287.     Implementation Note: As a default we no longer include the inproc-handler option, because
  76288.     that appears to result in useless instances with a lot of Microsoft out-of-proc. servers."
  76289.  
  76290.     ^IClassFactory ctxServer
  76291. !
  76292.  
  76293. createObject: progID
  76294.     "Answer an instance or subinstance of the receiver on an instance of the COM component 
  76295.     registered under the specified <readableString> progID, which can be either a ProgID or
  76296.     the standard string representation of a CLSID (i.e. a long hex number in curly brackets).
  76297.     This is a simplified interface for creating COM objects which is similar to that in VB."
  76298.  
  76299.     | clsid |
  76300.     clsid := progID first == ${
  76301.             ifTrue: [CLSID fromString: progID]
  76302.             ifFalse: [CLSID fromProgID: progID].
  76303.     ^self onCLSID: clsid!
  76304.  
  76305. defineFields
  76306.     "Define the fields of the IUnknown 'structure'.
  76307.  
  76308.         COMInterface compileDefinition; allSubclasses do: [ :c | c defineTemplate ]
  76309.     "
  76310.  
  76311.     self 
  76312.         defineField: #vtbl                 type: LPVOIDField new;
  76313.         defineField: #argSizes            type: LPVOIDField new;
  76314.         defineField: #objectCookie        type: DWORDField new;
  76315.         defineField: #interfaceCookie    type: DWORDField new!
  76316.  
  76317. defineFunction: aSymbol
  76318.     "Declare a virtual function supported by the receiver and implemented in the object
  76319.     on which instances of the receiver are actually created (the 'client' or 'implementor')."
  76320.  
  76321.     self
  76322.         defineFunction: aSymbol
  76323.         argumentTypes: ''!
  76324.  
  76325. defineFunction: aSymbol argumentTypes: aString
  76326.     "Declare a virtual function supported by the receiver and implemented in the object
  76327.     on which instances of the receiver are actually created (the 'client' or 'implementor')."
  76328.  
  76329.     self
  76330.         defineFunction: aSymbol 
  76331.         returnType: self stdMethodReturnType
  76332.         argumentTypes: aString
  76333.  
  76334. !
  76335.  
  76336. defineFunction: aSymbol descriptor: anExternalDescriptor
  76337.     "Declare a virtual function supported by the receiver and implemented in the object
  76338.     on which instances of the receiver are actually created (the 'client' or 'implementor')."
  76339.  
  76340.     self
  76341.         addFunction: COMFunction
  76342.         selector: aSymbol
  76343.         descriptor: anExternalDescriptor!
  76344.  
  76345. defineFunction: aSymbol returnType: retString
  76346.     "Declare a virtual function supported by the receiver and implemented in the object
  76347.     on which instances of the receiver are actually created (the 'client' or 'implementor')."
  76348.  
  76349.     self 
  76350.         defineFunction: aSymbol
  76351.         returnType: retString
  76352.         argumentTypes: ''!
  76353.  
  76354. defineFunction: aSymbol returnType: retString argumentTypes: argString
  76355.     "Declare a virtual function supported by the receiver and implemented in the object
  76356.     on which instances of the receiver are actually created (the 'client' or 'implementor')."
  76357.  
  76358.     self 
  76359.         defineFunction: aSymbol
  76360.         descriptor: 
  76361.             (self descriptorClass
  76362.                 callingConvention: self stdMethodCallType
  76363.                 returnType: retString
  76364.                 argumentTypes: argString)
  76365.  
  76366. !
  76367.  
  76368. defineFunction: aSymbol type: functionClass returnType: retString argumentTypes: argString
  76369.     "Declare a virtual function supported by the receiver and implemented in the receiver
  76370.     using the <COMFunction> class, functionClass, to represent the function."
  76371.  
  76372.     self
  76373.         addFunction: functionClass
  76374.         selector: aSymbol 
  76375.         descriptor: 
  76376.             (self descriptorClass
  76377.                 callingConvention: self stdMethodCallType
  76378.                 returnType: retString
  76379.                 argumentTypes: argString)
  76380. !
  76381.  
  76382. defineFunctions
  76383.     "Declare the virtual functions supported by the receiver.
  76384.     You must override this to declare an interface class."
  76385.  
  76386.     ^self subclassResponsibility!
  76387.  
  76388. defineTemplate
  76389.     "Initialize the receiver class' structure template and VTable."
  76390.  
  76391.     self byteSize: 16.
  76392.     super defineTemplate.
  76393.     self defineVTable!
  76394.  
  76395. defineVTable
  76396.     "Initialize the receiver class' structure template and callback table.
  76397.     Send this to the subclasses of the receiver to define the VTable when
  76398.     implementing COM interfaces (CALL IN)."
  76399.  
  76400.     self == ##(self) 
  76401.         ifTrue: 
  76402.             [functions := #().
  76403.             argSizes := nil]
  76404.         ifFalse: 
  76405.             [| inherited |
  76406.             functions := OrderedCollection new.
  76407.             inherited := self superclass functions.
  76408.             functions addAll: inherited.
  76409.             (self class includesSelector: #defineFunctions) ifTrue: [self defineFunctions].
  76410.             functions := functions asArray.
  76411.             self calcArgSizes]!
  76412.  
  76413. elementSize
  76414.     "Answer the size (in bytes) of the structure the receiver represents
  76415.     when used as an array element."
  76416.  
  76417.     ^4!
  76418.  
  76419. functions
  76420.     "Private - Answer the array of functions definitions."
  76421.  
  76422.     ^functions!
  76423.  
  76424. generatedFunctionCategories
  76425.     "Answer the base category into which COMInterface functions are compiled
  76426.     during the autogeneration process.
  76427.     N.B. It is important that the main category appears first in the list."
  76428.  
  76429.     | catClass |
  76430.     catClass := self methodCategoryClass.
  76431.     ^Array 
  76432.         with: (catClass name: 'COM Interfaces', '-', self name)
  76433.         with: catClass public!
  76434.  
  76435. getObject: aString 
  76436.     "Answer an instance or subinstance of the receiver on an instance of the COM component 
  76437.     instantiated by binding the moniker with display name equivalent to the <readableString>
  76438.     argument. This is a simplified interface for binding to COM objects 
  76439.     through monikers, which is similar to the GetObject function in VB."
  76440.  
  76441.     | answer |
  76442.     answer := self newPointer.
  76443.     OLELibrary default 
  76444.         coGetObject: aString asUnicodeString
  76445.         pBindOptions: nil
  76446.         riid: self iid
  76447.         ppv: answer.
  76448.     ^answer!
  76449.  
  76450. icon
  76451.     "Answers an Icon that can be used to represent this class"
  76452.  
  76453.     ^##(self) defaultIcon!
  76454.  
  76455. iid
  76456.     "Answer the receiver's globally unique interface id (IID)"
  76457.  
  76458.     ^self guid!
  76459.  
  76460. ΦM#)!!*¡ü5s·¿┐>ù6∩╙éªùò∞╨¬▓▒[F ⌐┼xvA@╫ûyA╫vm.]Ad╢ò\&']ñi^o¼┐l║▀q║╛╣Ö╗Åô4Lii╔¿h ε▌╚\çÉ|╕Fñ·h²B0Σ$£╥XÅQ4┐,├¥╤Γ┼«t╚ùÜç<,ü▄M¼tiäε0█æ2ì(▐Z╔²9!! ╚jé@o├4ª▌æ@g≤¡≈≤≡╝²bU╡ΘªN%D@&<üJ∩>vJBë╚ƒ¿Kh8N▀é.₧I╓⌡╟╜εxñ╣ì╠ë-╪ëá└wⁿ}╝(Av╞²)┴c_¼É┴çå┌ÿ╫╓π√pÖD╠╦≤²═GjJ    )∙>Ç╖*pÿ0▀G╠XUJf╞II⌐╗:σJ1T═ΓµY%?X╒É┐│-2êµ)╗■ZîÉî∙tSQ┼⌡0C-ö~ä≥╦╞ ¿·°╕ïƒ├Z▄^⌐ê@+╡å╧─8ácrT╗┐╛╩à,~╫Ä$ó╚┘}5Σ≈■,ç9₧ô∙-≤ê$ë│²[äÿB∩xçΘñ└'æΣÿ;ÿ╟Hí▓v#Ñα╠╬¢W)áWA⌐ñ╞F:ï╟δCÿ╝▄!!kï°s·!!9ë╩fAΣ<╕┼ë⌡╧R╙2Ω╗²δ╚≤RU▀mZèUΘ÷ÇC·ë╔ºó-M!
  76461.  
  76462. implementor: implementor
  76463.     "Private - Answer a new  instance of the receiver suitable for use
  76464.     as a reference to an interface implemented by the object, implementor.
  76465.     N.B. Use #on:(implementor:) in any implementations of #queryInterface:ifNone:,
  76466.     this is for basic instantiation only, and answers the non-pointer form, which
  76467.     is not intended for use outside the OLE framework."
  76468.  
  76469.     ^self newInternal
  76470.         implementor: implementor!
  76471.  
  76472. initialize
  76473.     "Private - Initialize the receiver.
  76474.         COMInterface initialize
  76475.         COMInterface registerSubclasses
  76476.     Implementation Note: Unusually for an initialize method, this implementation
  76477.     must work for all subclasses."
  76478.  
  76479.     self == ##(self)
  76480.         ifTrue: [ "Initialize COMInterface itself"
  76481.             functions := #()]
  76482.         ifFalse: [self initializeInterface]!
  76483.  
  76484. initializeAfterLoad
  76485.     "Perform any post-load initialisation for the class.
  76486.     In this case we set up the function table now to avoid overhead of lazy init. test
  76487.     init. on every virtual function callback."
  76488.  
  76489.     "Superclass method only initializes direct implementors, so we must initialize others"
  76490.     (self class includesSelector: #initialize) ifFalse: [self initialize].
  76491.     super initializeAfterLoad.!
  76492.  
  76493. initializeInterface
  76494.     "Private - Initialize aspects common to all COM interface classes in Dolphin
  76495.     (the IID, type lib reference, and virtual function table)."
  76496.  
  76497.     self initializeTypeLib.
  76498.     self defineTemplate.!
  76499.  
  76500. initializeRegister
  76501.     "Private - Initialize the register of IIDs to interface classes."
  76502.  
  76503.     InterfaceClasses := LookupTable new
  76504.  
  76505. !
  76506.  
  76507. initializeTypeLib
  76508.     "Private - Establish a connection to the receiver's type library (if any)."
  76509.  
  76510.     typeLib := nil!
  76511.  
  76512. interfaceClasses
  76513.     "Private - Answer the map between IID's and classes."
  76514.  
  76515.     ^InterfaceClasses!
  76516.  
  76517. new
  76518.     "Answer a new instance of the receiver and associated component instance
  76519.     (created via CoCreateInstance)."
  76520.  
  76521.     ^self onCLSID: self clsid.
  76522. !
  76523.  
  76524. newBuffer
  76525.     "Answer a instance of the receiver suitable for use as a buffer to hold the
  76526.     external structure type which the subclass wraps.
  76527.     Implementation Note: COMInterfaces are always pointers."
  76528.  
  76529.     ^self newPointer!
  76530.  
  76531. newInternal
  76532.     "Answer a new instance of the receiver suitable for use as a interface
  76533.     to some Dolphin object (the 'implementor'). The receiver (in conjunction
  76534.     with a COMObject instance) takes care of the boilerplate implementation
  76535.     of the Common Object Model, but it is generally up to the implementor to
  76536.     implement the rest of a particular interface.
  76537.     Implementation Note: The answered interface instance is not finalizable
  76538.     since it is strongly referenced from a COMObject, which is strongly referenced
  76539.     from a PermanentRegistry. The COMObject will not become a candidate for GC
  76540.     until it is sent #release sufficient times to reduce its ref. count to zero, 
  76541.     at which point all outstanding interfaces registered with it will be GC'd."
  76542.  
  76543.     ^super newBuffer!
  76544.  
  76545. ∩A0)ü«¢É╓jë:∩╙√─ô╜╢ùƒⁿ╢DF¡√┴;}MAÆ╖t▓~vObb òXj/Uªx~¡δ(⌡╥F@⌠╛╣è≥╚ ╔8 kn▌¿e~ε└╬J\öÉfεL░=ä    ∙] ;Σmë█K╥╞mV║¼≡╫ΩàR║?╛ó╙p
  76546. á÷CL° ~îΦ'╓ƒVΘU*▐Y█÷m°╘kÿ}┼3╖!
  76547.  
  76548. on: server
  76549.     "Answer an instance (new or existing) of the receiver suitable for use 
  76550.     as a reference to an internally implemented interface on the argument, server,
  76551.     (assumed to be an exported server Object). This may result in the creation and 
  76552.     registration of a private COMObject instance which wraps anObject to provide basic 
  76553.     support for the Common Object Model, such as reference counting, and the boilerplate of 
  76554.     interface querying (if one does not already exist). The reference count of the 
  76555.     COMObject will be increased to reflect the existence of the new interface reference.
  76556.     This is the simple case where the server implements not only the server functionality,
  76557.     but also the interface functions too.
  76558.     N.B. It is assumed that the object, server, does actually implement the interface
  76559.     which the receiver represents - use the #queryOn: method to conditionally
  76560.     create an interface pointer."
  76561.  
  76562.     ^self on: server implementor: server!
  76563.  
  76564. on: server implementor: implementor
  76565.     "Answer a pointer to a (new or existing) instance of the receiver suitable for use
  76566.     as a reference to an internally implemented interface on the argument, server,
  76567.     (assumed to be an exported server Object), but where the interface functions are actually
  76568.     implemented in the argument, implementor. This may result in the creation 
  76569.     and registration of a private COMObject instance which wraps the server object to provide 
  76570.     basic support for the Common Object Model, such as reference counting, and the boilerplate of 
  76571.     interface querying (if one does not already exist). The reference count of the 
  76572.     COMObject will be increased to reflect the existence of the new interface pointer.
  76573.     This instantiator is for the case where the server does not implement the COM
  76574.     interface functions, but instead relies on an interface implementor which (presumably)
  76575.     knows about the server and can call on it to implement the interface."
  76576.  
  76577.     ^(self comObjectClass on: server)
  76578.         findInterface: self 
  76579.         ifNoneAdd: [self implementor: implementor]!
  76580.  
  76581. on: server implementor: implementor outerUnknown: pUnkOuter
  76582.     "Private - Answer a pointer to a new instance of the receiver suitable for use
  76583.     as a reference to an internally implemented interface on the argument, server,
  76584.     (assumed to be an exported server Object), but where the interface functions are actually
  76585.     implemented in the argument, implementor. This may result in the creation 
  76586.     and registration of a private COMObject instance which wraps the server object to provide 
  76587.     basic support for the Common Object Model, such as reference counting, and the boilerplate of 
  76588.     interface querying (if one does not already exist). The reference count of the 
  76589.     COMObject will be increased to reflect the existence of the new interface pointer.
  76590.     This instantiator is for the case where the server does not implement the COM
  76591.     interface functions, but instead relies on an interface implementor which (presumably)
  76592.     knows about the server and can call on it to implement the interface."
  76593.  
  76594.     ^(self comObjectClass on: server outerUnknown: pUnkOuter)
  76595.         findInterface: self 
  76596.         ifNoneAdd: [self implementor: implementor]!
  76597.  
  76598. onCLSID: aCLSID
  76599.     "Answer an instance or subinstance of the receiver on an instance of the specified COM component 
  76600.     class (instantiated by its registered server using CoCreateInstance). We don't care about the
  76601.     server context, so it could be in/out of process, even remote."
  76602.  
  76603.     ^self onCLSID: aCLSID outerIUnknown: nil!
  76604.  
  76605. onCLSID: aCLSID hostName: aString
  76606.     "Answer an instance or subinstance of the receiver on an instance of the 
  76607.     specified COM component class, instantiated using CoCreateInstanceEx() 
  76608.     on the specified remote host."
  76609.  
  76610.     ^self onCLSID: aCLSID outerIUnknown: nil hostName: aString!
  76611.  
  76612. onCLSID: aCLSID outerIUnknown: anIUnknown
  76613.     "Answer an instance or subinstance of the receiver on an instance of the specified 
  76614.     COM component class (instantiated by its registered server using CoCreateInstance), 
  76615.     with the specified outer (controlling) unknown. We don't care about the server context, 
  76616.     so it could be in/out of process, even remote."
  76617.  
  76618.     ^self onCLSID: aCLSID outerIUnknown: anIUnknown hostName: nil licenseKey: nil!
  76619.  
  76620. onCLSID: aCLSID outerIUnknown: anIUnknown hostName:aString
  76621.     "Answer an instance or subinstance of the receiver on an instance of the specified 
  76622.     COM component class, instantiated by its registered server via CoCreateInstanceEx, 
  76623.     with the specified outer (controlling) unknown, on the specified remote host."
  76624.  
  76625.     ^self onCLSID: aCLSID outerIUnknown: anIUnknown hostName:aString licenseKey: nil!
  76626.  
  76627. onCLSID: aCLSID outerIUnknown: pUnkOuter hostName: hostNameString licenseKey: licenseString 
  76628.     "Answer an instance or subinstance of the receiver on an instance of the specified COM 
  76629.     component class, instantiated by its registered server, with the specified outer (controlling) 
  76630.     unknown, on the specified remote host, and using the specified license string (or nil if not 
  76631.     licensed)."
  76632.  
  76633.     | hr pUnk pFactory license |
  76634.     pFactory := IClassFactory onCLSID: aCLSID hostName: hostNameString.
  76635.     pUnk := self newPointer.
  76636.     hr := pFactory 
  76637.                 CreateInstance: pUnkOuter
  76638.                 riid: self iid
  76639.                 ppvObject: pUnk.
  76640.     hr >= 0 ifTrue: [^pUnk].
  76641.     "Failed for some reason, perhaps it needs a license"
  76642.     hr = CLASS_E_NOTLICENSED ifFalse: [^HRESULTError signalWith: hr].
  76643.     pFactory := pFactory queryInterface: IClassFactory2.
  76644.     pFactory isNil ifTrue: [^HRESULTError signalWith: hr].
  76645.  
  76646.     "If a license key was not supplied, then try and get a runtime license"
  76647.     license := licenseString isNil 
  76648.                 ifTrue: [pFactory requestLicenseKey]
  76649.                 ifFalse: [licenseString].
  76650.     pFactory 
  76651.         CreateInstanceLic: pUnkOuter
  76652.         pUnkReserved: nil
  76653.         riid: pUnk iid
  76654.         bstrKey: license
  76655.         ppvObject: pUnk.
  76656.     ^pUnk!
  76657.  
  76658. onExit
  76659.     "Ensure all the receiver's subinstances are in their clean state on exit
  76660.     so that they have released any external resources they are holding."
  76661.  
  76662.     COMClassFactory onExit.
  76663.     self primAllSubinstances do: [:i | i onExit].
  76664.     COMObjectStub onExit
  76665.     !
  76666.  
  76667. onStartup
  76668.     "Ensure all the receiver's subinstances are in their clean state on startup
  76669.     rather than attempting to use an old interface hanging around from the sesssion 
  76670.     when the image was saved."
  76671.  
  76672.     self primAllSubinstances do: [:i | i onStartup].
  76673.     Processor unregisterCOMStubs.                    "remove old COM stubs (now invalid)"
  76674.     COMObjectStub onStartup.                        "clear down any old registy entries"
  76675.     COMClassFactory onStartup                    "now safe to register class factories"!
  76676.  
  76677. ±V.!!í¢:&╛ê₧-É2Σ┌√û╛╓═╥É≤¿V║╖┼vwME╤▐~W¢ZI.kHP+°àKc%[¬s]y°δ)⌠┌K╗≈╕É¡Åàs[
  76678. │■] º▀┴MM╒[╙1páFñ|ä╝PAI7⌠pÅ╦M▄Cf½1╓£╫╢┼«`£ æÅÜ}º■Y▒t oçΓ6╨╦ΦO;├╬÷m=Θ╥l╓Cl╠:é╚æAu╛≡┤╛ìl┴αaN╛σªFBcIGKr:ïJΓ7dBU╟ìÅ▓Z5AI▐┴-Æ₧⌡æΣ┘M┴ùÑΦ⌐δ»ë ├:GR▓x╝ qLßú`╨yT■J▐àû¥▄÷╝¼╧OΣ5╖n∩'─≤±╨G@Lg▒û╖#`ç1ì╤DF#Æo ÿΦ0ú)
  76679. qêûεD:zgs┘╟Æ▀K└ΩR>▓φO₧ûÜ╬#1^T╨πhC<é·æ▒╞⌐ú▒╖┘ÄïOôQ«É@D7αôüï>Ñg&■│┐▄▄xä┌!!ªå±Sá╣∙0├Ru1C╟╨ΘNìΦ9ïτ⌡]─₧    π,├║«█,æ∙â~ù╟Aεú$w°╣┌┬ü
  76680. 
  76681. êWA¡▌¬O0╬═·OÅσ▄`Qï╥^büG=╝Ωf]∩a├ä°╚█╘;π·é┴¿╙RII═$S¢Rª≥╒T¬ï═╖÷<A┘TD,ƺû(
  76682. Sºq┘ëC}
  76683. èâ■w┘«≥>█_╨wm╝Éæ╦}╖{τ⌐πChwäK"izG╤ßi≤ßû%9µ╟óº╞è╣╓fY,àoX∙:Æ Uƒ*≈≤òk!!⌐K│væε?rßδ²φ╠*K"L╖pƒ╪┤│≈<═ΦΓc╟στ/╔xa'M∙Ω½\ε▄╗≈╔π πg7'∙╚hc▒└    ⌡æ3╫δzR▐ÿH╬ûMÖÇ╜â$s ,4Çp^[_ôΩH\Xbyä┤ⁿ╡≤o╢LF~ê≡e╟▐╧;ï▒=gBún╔f╥öΦ!!ε J
  76684. .!!╕Ω∙∞4Zτ╙!!Vgç╣τc¥U─τû2ª,0i┌╕,┤}╬δQ┘¡nªçHA/s`²»Θ/¡[▀╥ì ÑåSÆ/!
  76685.  
  76686. ±V.!!┤¢;&┤¿Çä-α┘Ω╪√┼àò┐ⁿÇfƃσHPY▄▐~SºJP>oY_n<ΓôXkf"╔RZ╖┐4√▄N¢úÑ¢÷┬qt■Ngn╬µ-!!½┼╞% ·e»@│&²kò8K+±h₧╟▄z⌐ ▄¢═Γ╔▓!
  76687.  
  76688. queryOn: server
  76689.     "Answer a pointer to a (new or existing) instance of the receiver suitable for use
  76690.     as a reference to an internally implemented interface on the argument, server,
  76691.     (assumed to be an exported server Object), where the interface functions are 
  76692.     implemented by that object. If the interface is not supported by the 
  76693.     specified implementor, then the answer will be nil.
  76694.     Note that you cannot specify the implementor when querying the interface, because
  76695.     this is really up to the server object."
  76696.  
  76697.     ^(self comObjectClass on: server)
  76698.         queryInterface: self!
  76699.  
  76700. ≤A&*½é«╗ë+êeí╒ßσ═├═╨┐ ╚9*²Ü╬hdMDÆà~\ÆH#`HGj⌡ä^V`f[½yxº¿%≤╚GΦ╕╣▐÷Å àgWze╘¿-=¼├┼Z\╒£q½G÷{é±[=íeì┘LæGz╕L|╥£Ω┼╪▓vë╤┘■b─ÿKúnlç²s┬▓5Ä@!!▀H▀│w<╣╘}╬D.╬:ª∞îMzº½Ω░ìl┴█LyòΘ░w_c4Å∩p~CUσ╠¼│V`W^▀Ç"╤ÿ┘Γ¼εdσ╖┴─ô:£φ▌ ▌6Yⁿo∙rδ╕mÇ}K·)£ï╔╬▐Fê┴└⌠ ÖxYäj∩ ╥ΓΩ!
  76701.  
  76702. register
  76703.     "(Re)Register the receiver's as COM interface classes with
  76704.     the appropriate GUIDs. This is intended as a helper function when
  76705.     developing, and has no run-time significance."
  76706.  
  76707.     self registerClass: self forIID: self iid!
  76708.  
  76709. registerClass: anInterfaceClass forIID: aGUID
  76710.     "Register the specified interface class, which must support the COM interface protocol
  76711.     (basically that defined in IUnknown)."
  76712.  
  76713.     | existingKey |
  76714.     InterfaceClasses isNil ifTrue: [self initializeRegister].
  76715.     existingKey := InterfaceClasses keyAtValue: anInterfaceClass ifAbsent: [].
  76716.     existingKey isNil ifFalse: [InterfaceClasses removeKey: existingKey].
  76717.     InterfaceClasses at: aGUID put: anInterfaceClass!
  76718.  
  76719. ≤A &,í¥ ⌐╣à$æ:≤╥ε╧√ìƒ╘░█îw.╒╥éIvO_┴É;@╫KL/.HCn  ç\bfèUw4Γ¬3║▀L╝┐▓î╖╦ç}Pkr▄╜n7εü╔M█VÆ5çjÆ=Ö ∞]J=∩pÜ┌₧[4à$5└é┬Γ╧¿:╞O≥±■fç CA░f xç╠?▀╠LΓRo═KÇV≥#H╨π8╥WzÜÿ°èWd▓║√÷!
  76720.  
  76721. registerSubclasses
  76722.     "(Re)Register the receiver's subclasses as COM interface classes with
  76723.     their appropriate GUIDs. This is intended as a helper function when
  76724.     developing, and has no run-time significance.
  76725.  
  76726.         COMInterface registerSubclasses
  76727.     "
  76728.  
  76729.     self initializeRegister.
  76730.     self allSubclassesDo: [:c | c register]!
  76731.  
  76732. removeCompiledFunctions
  76733.     "Remove the functions generated automatically from the receiver's function table."
  76734.  
  76735.     [self removeCategory: self generatedFunctionCategories first] on: NotFoundError do: [:e|e notify]!
  76736.  
  76737. setGuid: id
  76738.     "Private - Set the value of the receiver's 'guid' instance variable to the 
  76739.     <GUID>, id."
  76740.  
  76741.     super setGuid: (id becomeAn: IID)!
  76742.  
  76743. stdMethodCallType
  76744.     "Private - Answer the standard calling convention for a COM function."
  76745.     
  76746.     ^'stdcall:'!
  76747.  
  76748. stdMethodReturnType
  76749.     "Private - Answer the standard method return type for a COM function call (HRESULT)."
  76750.     
  76751.     ^'hresult'!
  76752.  
  76753. supportsInterface: anInterfaceClass
  76754.     "Answer whether instances of the receiver support the requested interface class."
  76755.  
  76756.     ^self == anInterfaceClass or: [self inheritsFrom: anInterfaceClass]!
  76757.  
  76758. typeInfoIfNone: exceptionHandler
  76759.     "Answer an <AXInterfaceTypeAnalyzer> on the receiver's type information,
  76760.     or if no type information is available the result of evaluating the
  76761.     <niladicValuable>, exceptionHandler."
  76762.  
  76763.     | tlb |
  76764.     ^(tlb := self typeLib) isNil 
  76765.         ifTrue: [exceptionHandler value]
  76766.         ifFalse: [(tlb typeInfoForGuid: self guid ifNone: [^exceptionHandler value]) asImplType]!
  76767.  
  76768. ⌡]71ªΓX@°êé9Æ:≤öε┬╛ï■φèδ╡Vo╢╣╥zaQw▄à2KìZVt.T]+■ä^Kc%J¬jVxσ╕`ε╟RΦ╗╛£σ╬█4iarÜ▓d>ε└╞\¥╙p¡F┐kò╝U@ +íjÉ╩öCb⌐@=ôå┌µ╔αüìÜüeA∞£=)╚    4o¢ 6≥╓]!
  76769.  
  76770. uninitialize
  76771.     "Private - Unitialize the receiver as it is about to be removed."
  76772.  
  76773.     SessionManager current removeEventsTriggeredFor: self.
  76774.     Smalltalk at: #Debugger ifPresent: [:dbg | dbg unskipSelectorsOf: self].
  76775.     Processor unregisterCOMStubs
  76776.  
  76777. !
  76778.  
  76779. uninitializeBeforeRemove
  76780.     "Perform any pre-removal uninitialisation for the class."
  76781.  
  76782.     typeLib := argSizes := functions := nil.
  76783.     super uninitializeBeforeRemove.
  76784. !
  76785.  
  76786. unregister
  76787.     "Unregister the receiver's as COM interface classes with
  76788.     the appropriate GUIDs. This is intended as a helper function when
  76789.     developing (primarily for deinstalling packages), and has no run-time 
  76790.     significance."
  76791.  
  76792.     InterfaceClasses removeKey: self iid ifAbsent: []! !
  76793.  
  76794. !COMInterface methodsFor!
  76795.  
  76796. = anObject
  76797.     "Answer whether the receiver is equivalent to the <Object>, anObject.
  76798.     Two COMInterfaces are only considered equal if they have the same IID and
  76799.     the the same address (but see also #isSameCOMObject: which is a more
  76800.     expensive comparison which tests for the same underlying COM object)."
  76801.  
  76802.     ^self == anObject or: [
  76803.         self species == anObject species and: [
  76804.             bytes = anObject bytes]]!
  76805.  
  76806. argSizes
  76807.     "Answer the receiver's argSizes field as a Smalltalk object.
  76808.     Automatically generated get method - do not modify"
  76809.  
  76810.     ^(bytes dwordAtOffset: 4) asExternalAddress!
  76811.  
  76812. argSizes: anObject
  76813.     "Set the receiver's argSizes field to the value of anObject.
  76814.     Automatically generated set method - do not modify"
  76815.  
  76816.     bytes dwordAtOffset: 4 put: anObject!
  76817.  
  76818. asParameter
  76819.     "Answer the receiver in a form suitable for passing
  76820.     to an ExternalLibrary call, as itself in fact."
  76821.  
  76822.     ^self!
  76823.  
  76824. attach: interfaceAddress
  76825.     "Attach the receiver to the interface at the specified address.    
  76826.     Note that this effectively takes ownership of an orphan interface
  76827.     pointer in that no further reference is added to that pointer."
  76828.  
  76829.     bytes := interfaceAddress asExternalAddress.
  76830.     self beFinalizable
  76831. !
  76832.  
  76833. basicFree
  76834.     "Private - Free the receiver's external resources by releasing the interface."
  76835.  
  76836.     | refs |
  76837.     refs := self Release.
  76838.     "Notification signal: 'Releasing ', self printString, ' ref count=', refs printString."
  76839.     (self isPointer or: [refs == 0]) ifTrue: [bytes := nil]
  76840.         
  76841.  
  76842.     !
  76843.  
  76844. callback: stub vfn: vfnIndex withArgumentsAt: pArgs
  76845.     "Private - On behalf of the <COMObjectStub>, stub, invoke the 
  76846.     appropriate callback function identified by vfnIndex within the receiver's 
  76847.     class' callback table, instantiating any arguments from the machine
  76848.     stack starting at <integer> address, pArgs."
  76849.  
  76850.     ^(self class functions basicAt: vfnIndex)
  76851.         callback: stub interface: self withArgumentsAt: pArgs!
  76852.  
  76853. ΓK$4+╖╗+9┐Çé,èRï╜¡φ≡─╚╨¼▓ñ]Z »┘kv_▄é1@Ü^P#aU≈ò^\~/\╖ol¡╣`ε╓G@º╡╜¢⌠█\Ö4Igc╥ⁿy:½ë╥\KÉàgεJÑ=æ╝XA=≤b₧▌\╥╞mV║¼╨≤└ª3ï£ùÆoÜΦGAïn t½Θ╤╤Z╜▀Z╓│(sδ╚j∞MZ┘/┤⌡ìB{Ä!
  76854.  
  76855. ΓK$4+╖╗+9┐Çé,èτ·α┬√ìƒ╨ª±áCW╢┤╬SrFR▐ü,?²6 `HDn╢Ç@&2V│yc¼¡/Φ╙Cí╕╣▐π╟
  76856. ╫qF    }t╔ⁿk=╝ë╘QM╒æp¡W÷r₧AδYF
  76857. 0ípù█ÄGw⌐    *╓Çâ ▀αråMûòçy¿≡TA∞"g∩àZαùLΓM)îN╧ß4H≈╙}╨Do├:䣬tf╝╕±·σ%ñ⌡sOÉε┤K%+?b;ê$Ωj1tC╠╦Që¡X~/O╒é#èIóΘ┴╜╒oΓ╡¿╦┤1╗µôI⌠;2¼h⌡zwπ┐m╠hI¼ƒìåïΓu÷╝¼ÅK≥<?«EΦ?ƒºò╡s/t\@-≥wÅ╖@°]÷u■ u[sâInï⌠φ )E╥º²>4~n╙3╨╘╓Fë≤_j░·]╝Ö₧T═6VO,é *Y}╣^▓╚φ■:ë¿π╣┘µí6⌡1╔ÇJ d¢╚è ï6φ\c°╗á┌╠0┐¢"úä⌡FQ▓°≈<å}M!
  76858.  
  76859. copy
  76860.     "Answer a suitable copy of the receiver, which does not share the same byte data."
  76861.  
  76862.     ^self shallowCopy postCopy!
  76863.  
  76864. detach
  76865.     "Detach the receiver from the interface at which it is pointing, answering the address
  76866.     of that interface. This is useful where one wishes to take-over an interface
  76867.     reference (e.g. to pass it to some external party), and to assume the reference count."
  76868.  
  76869.     ^self isPointer 
  76870.         ifTrue: 
  76871.             [| pInterface |
  76872.             pInterface := self bytes.
  76873.             bytes := nil.
  76874.             self beUnfinalizable.    "reduce Memory Manager load"
  76875.             pInterface]
  76876.         ifFalse: 
  76877.             [self AddRef.
  76878.             self yourAddress asExternalAddress]!
  76879.  
  76880. ΣV5'½╗+9┐Çé,èRï╜¡ⁿ∞▐╔╘¬≈σì║╔hvW▄─;JöZT>gT]+∙┴
  76881. QcfJÑzVi╢δ4≥▀V@╝┐▓▐σ╩₧b[.h█»-<íë┴J[ÜÜa½G█∙σAJI1∩bÉ╠T¥V}ú|╥ä┬ └íqä╤┘■b─ÿiWºl ;ç²!!╤═º├╬π(!!≡╔~═Pc┴+╕╙ìuÑ»±≥ßñ±.!
  76882.  
  76883. free
  76884.     "Private - Frees the receiver's external resources by releasing the interface. 
  76885.     Normally inside Smalltalk we have no need to call #AddRef and #Release explicitly 
  76886.     since we can rely on the internal garbage collection and finalization to do the same job.
  76887.     We can rely on the reference count of internally implemented interfaces being correct,
  76888.     but not those we access via pointers."
  76889.  
  76890.     (bytes notNil and: [(bytes basicDwordAtOffset: 0) ~~ 0])
  76891.         ifTrue: [self basicFree].
  76892.     self beUnfinalizable        
  76893.  
  76894.     !
  76895.  
  76896. hash
  76897.     "Answer the SmallInteger hash value for the receiver."
  76898.  
  76899.     ^bytes hash!
  76900.  
  76901. hresultError: hr
  76902.     "Signal that a member function in the receiver returned the specified hresult.
  76903.     Include the COM object's extended error information, if available."
  76904.  
  76905.     | excep |
  76906.     excep := HRESULTError new.
  76907.     excep hresult: hr.
  76908.     self supportsErrorInfo
  76909.         ifTrue: [ | errorInfo |
  76910.             errorInfo := IErrorInfo newPointer.
  76911.             (OLEAutLibrary default getErrorInfo: 0 pperrinfo: errorInfo) == S_OK
  76912.                 ifTrue: [excep errorInfo: errorInfo]].
  76913.     ^excep signal!
  76914.  
  76915. identity
  76916.     "Answer an Integer that uniquely identifies the object onto which the receiver is an interface.
  76917.     The COM specification guarantees this ability of IUnknown pointers only."
  76918.  
  76919.     | iUnk id |
  76920.     self class == IUnknown ifTrue: [^self yourAddress].
  76921.     iUnk := self queryInterface: IUnknown.
  76922.     id := iUnk yourAddress.
  76923.     iUnk free.    "Explicitly free this to avoid generating excessive garbage"
  76924.     ^id!
  76925.  
  76926. iid
  76927.     "Answer the receiver's globally unique interface id (IID).
  76928.     In general this is fixed across all instances of the receiver's class."
  76929.  
  76930.     ^self class iid!
  76931.  
  76932. implementor
  76933.     "Answer the receiver's implementing object."
  76934.  
  76935.     ^implementor!
  76936.  
  76937. implementor: anObject
  76938.     "Set the receiver's implementor to anObject."
  76939.  
  76940.     implementor := anObject!
  76941.  
  76942. initialize: anInteger
  76943.     "Private - Create an external buffer in the receiver of the specified size.
  76944.     The receiver (which is being created as an interface on a Dolphin COMObject)
  76945.     contains an instance thunk which starts with a pointer to the generic
  76946.     virtual function table. The id/subId fields are filled out later when the 
  76947.     interface is registered."
  76948.  
  76949.     super initialize: anInteger.
  76950.     self vtbl: VMLibrary default getVTable.
  76951.     self argSizes: self class argSizes yourAddress!
  76952.  
  76953. initializeAtAddress: anAddress
  76954.     "Private - Initialize the receiver to be a reference to a COMInterface at 
  76955.     the specified address i.e. as a pointer to some interface which is probably
  76956.     implemented outside Dolphin (though not necessarily).
  76957.     Note that an OLE reference is added, which will be removed by finalization
  76958.     if the receiver is not explicitly freed."
  76959.  
  76960.     super initializeAtAddress: anAddress.
  76961.     self beFinalizable.
  76962.     self _addRef!
  76963.  
  76964. interfaceCookie
  76965.     "Answer the receiver's interfaceCookie field as a Smalltalk object.
  76966.     Automatically generated get method - do not modify"
  76967.  
  76968.     ^(bytes dwordAtOffset: 12)!
  76969.  
  76970. interfaceCookie: anObject
  76971.     "Set the receiver's interfaceCookie field to the value of anObject.
  76972.     Automatically generated set method - do not modify"
  76973.  
  76974.     bytes dwordAtOffset: 12 put: anObject!
  76975.  
  76976. isSameCOMObject: aCOMInterface
  76977.     "Answer true if aCOMInterface has the same underlying COMObject as the receiver."
  76978.  
  76979.     ^self identity = aCOMInterface identity!
  76980.  
  76981. objectCookie
  76982.     "Answer the receiver's objectCookie field as a Smalltalk object.
  76983.     Automatically generated get method - do not modify"
  76984.  
  76985.     ^(bytes dwordAtOffset: 8)!
  76986.  
  76987. objectCookie: anObject
  76988.     "Set the receiver's objectCookie field to the value of anObject.
  76989.     Automatically generated set method - do not modify"
  76990.  
  76991.     bytes dwordAtOffset: 8 put: anObject!
  76992.  
  76993. onExit
  76994.     "Clean up the external interface pointer on image exit to free external resources"
  76995.  
  76996.     (self isPointer and: [self isFinalizable]) ifTrue: [self free]!
  76997.  
  76998. onStartup
  76999.     "Clean up the external interface pointer on image startup so that it isn't left
  77000.     pointing at an invalid object."
  77001.  
  77002.     self isPointer
  77003.         ifTrue: [
  77004.             self beUnfinalizable.
  77005.             bytes := nil]
  77006.  
  77007.     !
  77008.  
  77009. postCopy
  77010.     "Apply any final flourish to the copy that may be required.
  77011.     In this case we may need to AddRef()."
  77012.  
  77013.     self isPointer ifTrue: [self _addRef].
  77014.     ^self!
  77015.  
  77016. printOn: aStream
  77017.     "Append a developer friendly textual representation of the receiver to aStream.
  77018.     As OLE interfaces are opaque, pure, interfaces, we revert to the basic
  77019.     implementation, but include the address as this may help."
  77020.  
  77021.     aStream 
  77022.         basicPrint: self;
  77023.         nextPut: $(;
  77024.         print: bytes;
  77025.         nextPut: $)!
  77026.  
  77027. queryInterface: interfaceClass
  77028.     "Query, via the receiver, for the specified interface class, answering a new pointer
  77029.     to that interface, or nil if it is not implemented by the receiver."
  77030.  
  77031.     ^self queryInterface: interfaceClass ifNone: []!
  77032.  
  77033. queryInterface: anInterfaceClass ifNone: exceptionHandler
  77034.     "Query, via the receiver, for the specified interface class, answering a new pointer
  77035.     to that interface, or the result of evaluating the niladic valuable, exceptionHandler,
  77036.     if it is not implemented by the receiver.
  77037.     Implementation Note: We do not consider E_NOINTERFACE to be an error, or even an 
  77038.     exceptional condition - S_FALSE would seem a more suitable answer to a query."
  77039.  
  77040.     | pUnk hresult |
  77041.     pUnk := anInterfaceClass newPointer.
  77042.     hresult := self QueryInterface: anInterfaceClass iid ppvObject: pUnk.
  77043.     ^hresult < 0 
  77044.         ifTrue: [
  77045.             (hresult = E_NOINTERFACE or: [hresult = -2147023179])
  77046.                 ifTrue: [exceptionHandler value]
  77047.                 ifFalse: [self hresultError: hresult]]
  77048.         ifFalse: [pUnk]!
  77049.  
  77050. referenceCount
  77051.     "Private - Answer the current reference count of the receiver.
  77052.     N.B. FOR DEBUGGING ONLY."
  77053.  
  77054.     ^self isNull
  77055.         ifTrue: [0]
  77056.         ifFalse: [self AddRef; Release]!
  77057.  
  77058. supportsErrorInfo
  77059.     "Answer whether the receiver supports extended Automation error information."
  77060.  
  77061.     ^self supportsErrorInfo: self class!
  77062.  
  77063. ≥Q7
  77064. :*░£;¿ª₧ï9εÄ»┼≡├┌╟╕≤ªV.╒╥éZ}[A╫û~EƒZP"kI≤┴BzI f¡hVxñ¬# Ç@í╣ú¢σ╔Æ8} ╙▒}>½─┼W\É╙lεW╛x╨∙RJ.Σv▀═LîR{╛/╛°¬≤╘┤vå    Üƒ╙]║■ZE╢iu┬Ω!!╠╨MºH!!╩P╚≥9h÷╔6»(Θ2í╨åIq╜║∙ΩΘ    ª┤NS¡σΦJ1jKPKEúJ╠:tLD┌Wà─ª-JO╚Ä<ä\╓╤╓╜≥uñΦ╚ìÆ?úµëÅ" R┤yε
  77065. vFó▄⌐ySΘ▐éƒÅ╓E█╪╩≥αp⌐~±#╩⌡∞ƒT{@    4 1£╖,q╤ ùK╓
  77066. Olòt ë■'Ω Xê½ßC4(L}╙    ₧Ü▄
  77067. ╬úu ░·Gï╢ïK√4qB╓░IiTÆdû⌡▀╫N╕▓⌠┐┘╦╞VÆ\│─R^!!«╥µ┼/φoi■¡≡█╒eƒƒl«å°Q¡φ·'ÇE04å┌▓«Σw£╡▓BâƒBπ9_åºó╙(▌░²T ÉEΩ╡k1ñ≡ÿ═Ü P┬38Ç╡╓M|├┼∞O▄Σà)C▒╫:∩n1╗▌|π5P²╓╝α▐^¥ │╡äÄßòSHÖjO▐UΦ√╠Rπò╦φUƒG    ùTQ(┘╔Φ%½"ÿ═Q/âå≤w╧δá8▄AòH{╝╦╩Å╩tliτ╕ß5wÄG(xIF╔6¡qªßû!!1┴┬∩╢J«á└░|LåjG⌡QcΘZHtRƒ9ⁿ░Ål8¬Z╣jç╝S
  77068. Å π¿╨SySC"\ ~ò╪┤α÷.╓ß«uü¼²1├3v&δδ╕W╝ö«÷T╟ I≡)c*εÜut∞ùhp┌û0ó┬HΦ▒g╬ƒL╩Ö┬}0╙I╘}X╬p*5
  77069. ╤ôuCR½√τÆΘl½
  77070. Ix°∩c└─▐,╫╧$r f╣&ÜWn█┴█
  77071. !!╝0m36»∩∞µ>σ╟\.■▀£c╣U╤φ ,▓*~tëⁿía▐ƒ▌¡uªφPLiZ≤à├Há^»Ç┘Eé╝n■Rφ≥Dñùà-«NT┬à│Ω½d╤µxφ┘ ╜─▓╒─E═δIªu ú@M$D°_Ñ5w≡|Mæ|-9K╝▀M╒\÷┬▌c╣P-ε¿Γ«3çzP%<╟═çg qÇÄ0Bì@ñ,√1FåQ7┬ⁿ
  77072. ╟3═h»!!ö╜ÑH{ò┐░êjº,Zz║#ÆѪHO╖~SA E┴╫╟6É-═VO√_╠Q~pgαµΦ╓ΘS¿ße═8ⁿ±æb¼¡▌&<δÅÇ/φ╥3    °Ω▄#┼≥!!ΣëOr╡w-<¡`╥Ä├u!
  77073.  
  77074. supportsIID: anIID
  77075.     "Answer whether the receiver supports the interface identified by the IID, anIID.
  77076.     The default is to support only those interfaces with an exactly matching IID."
  77077.  
  77078.     ^self iid = anIID" or: [ anIID iid = IUnknown iid ]"!
  77079.  
  77080. supportsInterface: anInterfaceClass
  77081.     "Answer whether the receiver supports the interface identified by the argument."
  77082.  
  77083.     ^self class == anInterfaceClass "isKindOf: anInterfaceClass"!
  77084.  
  77085. ⌡]76óÇ_C╙δ¡$û(Σ╞»═≡╬ƒ┴ºΓáJ▒╜╧i~IB█ï0âWE>.^KbΓÆ^_i4╖tV*░«# ╫T║∙┌⌠₧ß
  77086. ╫uR .c╧»y=úë╔W\Éòv½P÷uæ∙Nxαwî╤ZòC`⌐|╟ï╙≤î¼zè₧ëè0O¼ΣC»ab┬δ<É¥2ì,EÑa╔ +!!φ▐h╟k`╞0ÿ┌¡Kz╢⌠╕┼≤ñ≥ Y½≥╜,jrLcÇ ∞*!
  77087.  
  77088. ⌡]76óÇ/öªé/▀Σ╠∞╔ε├╓┌░┌ñ]G│╛╥!!≤è-EÆM+`Bµä^Ph @▒qR~½ñ.║╩J╝≈▓å■▄╫rQ.t╥╣- ½╩┼P^É▌{╟m╣i╨≡]
  77089. -≥pÉ╙òL`⌐:╥æ╞σî¿r₧▀Ü¥<╜ΓXG½a~å»'╟╧ZºM&╬M█Ωa!!√╥léOo╬&±╪î
  77090. 6▐─òöë8ατeP┐á▒iGFR+₧╩6~fVτ├╨ßbS9[O▀æ;éU ╛±▀╝≡d÷·ù╠û+░▐ÇI╦1
  77091. ¿U≥qMΣ░j┼!
  77092.  
  77093. vtbl
  77094.     "Answer the receiver's vtbl field as a Smalltalk object.
  77095.     Automatically generated get method - do not modify"
  77096.  
  77097.     ^(bytes dwordAtOffset: 0) asExternalAddress!
  77098.  
  77099. vtbl: anObject
  77100.     "Set the receiver's vtbl field to the value of anObject.
  77101.     Automatically generated set method - do not modify"
  77102.  
  77103.     bytes dwordAtOffset: 0 put: anObject! !
  77104.  
  77105. DOUBLE comment:
  77106. 'DOUBLE is an <ExternalStructure> class to represent double precision (64-bit) floating point numbers in native format'!
  77107. !DOUBLE class methodsFor!
  77108.  
  77109. αV5, ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3KZ╙ù-ÿY%lQVh╢╔
  77110. @v/Lóp_sΓ¬.║ég╝▓ÑÉ÷├= àuG^.s╧╛n>»┌╙ü╙pεVÑxöAΦ^dRêvÜ╬KÖQqó|╥Ç╤≈╒│3ç ▀Å¢yO╝⌠TA½vi┼ⁿs╪╓ZδEo╪F╩│$o╣╚l╩G|Ç,Ñ╬ûG`ª╝²φ«D┼₧6╨▐û%7Gjp*t ÅÄ}!
  77111.  
  77112. defineFields
  77113.     "Define the fields of the DOUBLE 'structure'.
  77114.  
  77115.         DOUBLE compileDefinition
  77116.     "
  77117.  
  77118.     self defineField: #value type: DOUBLEField new!
  77119.  
  77120. τM"1 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H g^_oQ╢òIcf[¼<QoΓ╛3 ┌º≈Ñ¢τ▌ÆzJ@zh▀ⁿ7¡╠╔OMçQÇVsºF║y╨σAJI1∩$≥┤0ôV|⌐|└å╤π╧┤fÜî╒╤e├¢>zåO?Y«╩╫┌Sπ!
  77121.  
  77122. icon
  77123.     "Answer a suitable iconic representation for the receiver."
  77124.  
  77125.     ^Float icon!
  77126.  
  77127. initialize
  77128.     "Private - Initialize the receiver's class variables.
  77129.         self initialize
  77130.     "
  77131.  
  77132.     VMLibrary default registryAt: self name put: self!
  77133.  
  77134. newAspect: aspectClass name: aSymbol 
  77135.         "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  77136.         which is appropriate for representing aspects of the receiver's type."
  77137.     
  77138.         ^aspectClass float: aSymbol!
  77139.  
  77140. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  77141. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥▐µ/mⁿ!
  77142.  
  77143. uninitialize
  77144.     "Private - Uninitialize the receiver prior to its removal from the image."
  77145.  
  77146.     VMLibrary default registryAt: self name put: nil!
  77147.  
  77148. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  77149. m»g|jmT]x≈Å
  77150. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{Fδτ! !
  77151.  
  77152. !DOUBLE methodsFor!
  77153.  
  77154. asFloat
  77155.     "Answer a <Float> of the same value as the receiver's contents."
  77156.  
  77157.     ^(bytes doubleAtOffset: 0)!
  77158.  
  77159. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òΓ─äaj₧ò⌠%3ZS┬û;AÆQP+zR\eO∙ç^Mn#▒yPo½╜%ΦÉm┬┌▌≈╔∙=,╛Up4.n▀½X╟á╓M╒^Çy¿ái╨⌡E`bí'▄ûxñca╕1╥å╩∙┬â|åïÜ¥hε≡CΓ'<O╜═
  77160. ∞·yáfù2░Ü?d ┬j╟Lm┼e±╧åHr!
  77161.  
  77162. displayOn: target
  77163.     "Append a textual representation of the receiver onto the <puttableStream> argument,
  77164.     target, in the format that an end-user might want to see it."
  77165.  
  77166.     target display: (self isNull ifFalse: [self value])!
  77167.  
  77168. value
  77169.     "Answer the receiver's value field as a Smalltalk object."
  77170.  
  77171.     ^(bytes doubleAtOffset: 0)!
  77172.  
  77173. value: anObject
  77174.     "Set the receiver's value field to the value of anObject."
  77175.  
  77176.     bytes doubleAtOffset: 0 put: anObject! !
  77177.  
  77178. ExternalArray comment:
  77179. 'ExternalArray is a specialized class of <ExternalStructure> to represent contiguous heterogeneous arrays of external types, be they scalar of structured. The various subclasses can be used for external interfacing tasks such as where C arrays are expected.
  77180.  
  77181. StructureArray is the most general of the subclasses in that it supports arbitrary element types (represented by other ExternalStructures), and can in fact perform the task of the other subclasses such as DWORDArray. The more specialized subclasses do, however, offer much greater efficiency where they are applicable.
  77182.  
  77183. Specialized subclasses are provided for most standard intrinsic types; signed and unsigned integers of 16 and 32-bits, single and double precision floating point numbers, etc. Note that there is no subclass for arrays of bytes, since the standard ByteArray class already fulfills that requirement.
  77184.  
  77185. Instance Variables:
  77186.     length        <integer>. Number of elements in the instance.
  77187.  
  77188. '!
  77189. !ExternalArray class methodsFor!
  77190.  
  77191. alignment
  77192.     "Answer the alignment required for instances of the receiver when 
  77193.     embedded in arrays or other structures. This is the alignment of the
  77194.     largest field in the receiver."
  77195.  
  77196.     ^self elementSize!
  77197.  
  77198. elementSize
  77199.     "Private - Answer the size of the receiver's instances' constituent 
  77200.     elements in bytes."
  77201.  
  77202.     ^1!
  77203.  
  77204. fromAddress: anAddress length: anInteger
  77205.     "Answer a new instance of the receiver that points at an
  77206.     array of anInteger elements of type elementClass at anAddress.
  77207.     Implementation Note: If the length is zero, then we ignore the address (even if invalid).
  77208.     If the length is non-zero then we answer nil if the address is the Null pointer."
  77209.  
  77210.     ^anInteger == 0 
  77211.         ifTrue: [self basicNew basicLength: 0]
  77212.         ifFalse: [
  77213.             anAddress isNull ifFalse: [
  77214.                 self basicNew
  77215.                     initializeAtAddress: anAddress;
  77216.                     basicLength: anInteger]]!
  77217.  
  77218. icon
  77219.     "Answers an Icon that can be used to represent this class"
  77220.  
  77221.     ^Array icon!
  77222.  
  77223. length: count elementSize: bytes
  77224.     "Private - Answer a new instance of the receiver allocated 
  77225.     with space for count elements of bytes size."
  77226.  
  77227.     ^(super new: count*bytes)
  77228.         basicLength: count!
  77229.  
  77230. new: anInteger
  77231.     "Answer a new instance of the receiver allocated at an immovable location."
  77232.  
  77233.     ^self length: anInteger elementSize: self elementSize!
  77234.  
  77235. newAspect: aspectClass name: aSymbol 
  77236.         "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  77237.         which is appropriate for representing aspects of the receiver's type."
  77238.     
  77239.         ^aspectClass sequenceableCollection: aSymbol!
  77240.  
  77241. ±V.!! ░¥'*«Åà/ë;╗ö∙═∞╙┌╞╜▓¼]G╢⌐┼xgAY▄ùd₧Q@#|Hd¼┴
  77242. Xt!!J╖9α¢2≤╚C¡≈·▐╨╩àuJ.aÜ»y ╗╩╘LZÉVòpóG÷yò⌡_F1εj▀╙\ÅQu½|▄£╫∙î┤{ìM├ïåh»≤[Aæt~âΓmƃKµS(╔Kû{ÖDg÷╒8╓JkDZ▌æVu¬εε ≥⌐÷lY∙Σ╖wOWbrîú8t  6 5»Æz3pZ█ô+ÄI┌░æ»⌡u∞·ò┼ƒ~ª≤╠
  77243. ╞>C▓i±qMó▄⌐b]¼ZùÅçï╪Mëêà∩L≡"┐h⌡:╩ΘδæX+"l !!▒6üσ,|╡1îMƒ,(
  77244. çrrîΓµ&Æ »A0(Nm╒Z╩╓▄W└≈X/ñⁿhìç₧^ÉAR92├■c}âiû≈╘╦Nñ╗ ▓╟Äï^ÆAαëJD!!αåç┼jólcX ╖╜╦╦,xÿölª£░DíΩ■'ù]då┴²Y╜Σ$Åτ╛pâûTπf_Q├áí⌡;─⌡╩~¡Ω oêâv*ú·▀ïåVJ╦6qÇ≡ε_0▀╔│NòδÖgQ½╙=∞n6ú╩qδ)V∙▌·⌡╧^▄!!ª±╨Ç▓¥ OR▐h ÜUδ²╬Tσò╔áO÷oBÅZT"Æ╖ü(áv¬╒Pa╢╔è]▒·ß)┌Yòwkí═π│ä1:'╜√ë,^Ü\3s^àgΣk¡¿à$~ò¢∩≥╞è╣╓6éWYΘ@ Θno&A▐2▀║ƒr ⁿ65╒vß∞nª√²Ω▄^o&Zσpê┌╨d╔èT¬ δäm═╢÷}îR0\²·ìV⌡Æ╗²Bφ ╠gJF╛╕uo¼┴≈ΦV■âS┌ì ╟╠3α∞╞\█ JΣ<ƒjCA_╒Üb7*ΓÖƒ╥Äz╢CIiRê≤o┬╓ÇS≤╦'-lB╙n╬2^nç┴¡_(½'C/i²«╢êQ=╠Ωf(Γ╤ù-▄F╤≡╧▒6==à⌠:╝t╞ñ2╪╜xª∞}6    Jq?ÑⁿÖ4╝»Ö═h█!
  77245.  
  77246. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  77247. m»g|jmT]x≈Å
  77248. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{WÆ£╩▀┘O!
  77249.  
  77250. with: element1
  77251.     "Answer a new instance of the receiver containing the single 
  77252.     <Object> element, element1."
  77253.  
  77254.     ^(self new: 1)
  77255.         at: 1 put: element1;
  77256.         yourself!
  77257.  
  77258. withAll: newElements
  77259.     "Answer a new instance of the receiver containing all of the 
  77260.     elements of the <collection> newElements.
  77261.     An error will be raised if any of the elements of newElements
  77262.     cannot be stored in instances of the receiver."
  77263.  
  77264.     | answer |
  77265.     answer := self new: newElements size.
  77266.     newElements inject: 1 into: [:i :elem | answer at: i put: elem. i + 1].
  77267.     ^answer! !
  77268.  
  77269. !ExternalArray methodsFor!
  77270.  
  77271. asArray
  77272.     "Answer an <Array> containing the constituent elements of the receiver."
  77273.  
  77274.     ^self collect: [:each | each]!
  77275.  
  77276. asByteArray
  77277.     "Answer a ByteArray containing the constituent elements of the receiver."
  77278.  
  77279.     ^self copy: ByteArray from: 1 to: self byteSize!
  77280.  
  77281. asOrderedCollection
  77282.     "Answer an <OrderedCollection> whose elements are those of the receiver
  77283.     The ordering is that of the #do: operation as implemented by the receiver,
  77284.     and the answer will normally be the same size as the receiver.
  77285.     Implementation Note: Although we might be able to perform this operation 
  77286.     faster for collections which keep a tally of their size (or can otherwise 
  77287.     access it without calculation) we must be careful NOT to provide a default 
  77288.     implementation which will cause a double enumeration for collections which must
  77289.     count their elements to determine their size, which may be very slow."
  77290.  
  77291.     | answer |
  77292.     answer := OrderedCollection new: self size.
  77293.     self do: [:elem | answer addLast: elem].
  77294.     ^answer!
  77295.  
  77296. αW;à╜â─µC╟∩╟°╔∞ù╦▌╗▓∙`bÖ₧ßIAioî─,WçMA9kUGj Äi ╖tV*░«# ╫T║∙⌡≤¥óvw⌐G&KAΦÄL ε▐╔M@┤ƒL5╜F║{╨≡TB 6⌡Gô▀JÅ4┐0╒╥╞·╔¡vå╝ùÆo!
  77297.  
  77298. at: anInteger
  77299.     "Answer the 32-bit unsigned integer value at the specified index in the receiver."
  77300.  
  77301.     ^self subclassResponsibility!
  77302.  
  77303. at: index ifAbsent: exceptionBlock
  77304.     "Answer an <Object> which is the element of the receiver 
  77305.     at the specified index. If the index is out of bounds answer
  77306.     the result of evaluating the <niladicValuable> exceptionBlock."
  77307.  
  77308.     ^(index > 0 and: [index <= self size])
  77309.         ifTrue: [self at: index]
  77310.         ifFalse: [exceptionBlock value]!
  77311.  
  77312. at: index put: value
  77313.     "Replace the value at the specified index in the receiver
  77314.     with the argument."
  77315.  
  77316.     ^self subclassResponsibility!
  77317.  
  77318. basicLength: anInteger
  77319.     "Private - Set the length (in elements, not bytes) of the receiver."
  77320.     
  77321.     length := anInteger!
  77322.  
  77323. byteSize
  77324.     "Answer the total size in bytes of this array."
  77325.  
  77326.     ^self elementSize * self length!
  77327.  
  77328. collect: transformer
  77329.     "Evaluate the <monadicValuable> argument, transformer, for each of the 
  77330.     receiver's elements in the order defined by the receiver's implementation of #do:.
  77331.     Answer a new collection like the receiver containing the values returned by 
  77332.     transformer on each evaluation.
  77333.     Implementation Note: We use the special instance creation method 
  77334.     #copyLikeOfSize: because the transformation block may evaluate to objects
  77335.     which cannot be stored as elements of this type of array and therefore we
  77336.     must store them in an <Array>."
  77337.  
  77338.     | answer |
  77339.     answer := self copyLikeOfSize: self size.
  77340.     self 
  77341.         keysAndValuesDo: [:i :each | answer at: i put: (transformer value: each)].
  77342.     ^answer!
  77343.  
  77344. copyLikeOfSize: anInteger
  77345.     "Private - Answer a new collection of the same species as the receiver but with
  77346.     anInteger nil elements - i.e. not just with sufficient capacity for, but actually holding, 
  77347.     anInteger    elements. Subclasses should override to preserve additional instance variables.
  77348.     Note: This message differs from #copyEmpty: since an instance of the receivers species
  77349.     (rather than exact class, although this is usually the same) is returned which does not
  77350.     just have sufficient capacity for anInteger elements, but actually has that many elements."
  77351.  
  77352.     ^self species ofSize: anInteger!
  77353.  
  77354. detect: discriminator
  77355.     "Evaluate the <monadicValuable> argument, discriminator, for each of the receiver's elements
  77356.     in the order defined by the receiver's implementation of #do:.
  77357.     Answer the first element for which discriminator evaluates to true. If none evaluates to true,
  77358.     report an error."
  77359.  
  77360.     ^self detect: discriminator ifNone: [self errorNotFound: discriminator]!
  77361.  
  77362. detect: discriminator ifNone: exceptionHandler
  77363.     "Evaluate the <monadicValuable> argument, discriminator, for each of the receiver's 
  77364.     elements.  Answer the first element (in the #do: order) for which discriminator evaluates 
  77365.     to true. If none evaluates to true answer the result of evaluating the <niladicValuable> 
  77366.     argument, exceptionHandler.
  77367.     Implementation Note: It is important for Shared subclasses that the exceptionHandler is 
  77368.     not evaluated inside the enumeration in case it is a niladic block containing an explicit 
  77369.     return (we try to avoid explicit returns from critical sections, as these require an unwind)."
  77370.  
  77371.     self do: [:each | (discriminator value: each) ifTrue: [^each]].
  77372.     ^exceptionHandler value!
  77373.  
  77374. displayOn: target
  77375.     "Append a textual representation of the receiver onto the <puttableStream> argument,
  77376.     target, in the format that an end-user might want to see it."
  77377.  
  77378.     target
  77379.         nextPut: $(.
  77380.     self isNull ifFalse: [
  77381.         self 
  77382.             do: [:element | target display: element]
  77383.             separatedBy: [target nextPut: $,; space]].
  77384.     target  nextPut: $).!
  77385.  
  77386. do: operation
  77387.     "Evaluate monadic value argument, operation, for each of the elements of the 
  77388.     receiver. Answers the receiver. The elements are evaluated in index order.
  77389.     Implementation Note: Implemented in terms of keysAndValuesDo: to reduce
  77390.     the burden of subclassing. Where performance is an issue subclasses may 
  77391.     want to override this."
  77392.  
  77393.     self keysAndValuesDo: [:i :elem | operation value: elem]!
  77394.  
  77395. do: operation separatedBy: separator
  77396.     "Evaluate the <monadicValuable> argument, operation, for each of the 
  77397.     receiver's elements, interspersed with evaluations of the <niladicValuable>
  77398.     argument, separator. The separator is first evaluated after the first
  77399.     element, and is not evaluated after the last element (i.e. it is not evaluated
  77400.     at all if there are less than two elements)."
  77401.  
  77402.     | sep |
  77403.     sep := [sep := separator].    "Switch to the real separator after first eval."
  77404.     self do: [:e |
  77405.         sep value.
  77406.         operation value: e]!
  77407.  
  77408. elementClass
  77409.     "Answer the class of <ExternalStructure> used to represent elements of the receiver."
  77410.  
  77411.     ^self subclassResponsibility!
  77412.  
  77413. elementSize
  77414.     "Answer the size in bytes of the indidividual elements of the receiver."
  77415.  
  77416.     ^self elementClass elementSize!
  77417.  
  77418. first
  77419.     ^self at: 1!
  77420.  
  77421. from: start to: stop keysAndValuesDo: operation
  77422.     "Evaluate the <dyadicValuable>, operation, for each element of the receiver
  77423.     between the <integer> indices, start and stop, inclusive with the element and its
  77424.     index as respectively the second and first arguments.
  77425.     Implementation Note: Subclasses should override this method in order to
  77426.     replace all #do: family enumerators (#do:, #keysAndValuesDo:, #from:to:do:, and,
  77427.     of course, #from:to:keysAndValuesDo:)."
  77428.  
  77429.     start to: stop do: [:i | operation value: i value: (self at: i)]!
  77430.  
  77431. includes: target
  77432.     "Answer whether the argument, target, is one of the elements of the receiver.
  77433.     Implementation Note: Override superclass to revert to element search."
  77434.  
  77435.     1 to: self size do: [:i | target = (self at: i) ifTrue: [^true]].
  77436.     ^false!
  77437.  
  77438. includesKey: anInteger
  77439.     ^anInteger between: 1 and: self size!
  77440.  
  77441. inject: initialValue into: operation
  77442.     "Evaluate the <dyadicValuable> argument, operation, once for each element in the receiver, with
  77443.     that element as the second argument; and with the first argument as the value of the previous 
  77444.     evaluation, starting with the <Object> argument, initialValue. The operation must answer the value
  77445.     it wishes to have passed as its first argument the next time it is evaluated. The traversal is in the #do: 
  77446.     order. Answer the final value of the operation.
  77447.     This enumeration is particularly useful for performing summations and other statistical operations."
  77448.  
  77449.     | nextValue |
  77450.     nextValue := initialValue.
  77451.     self do: [:each | nextValue := operation value: nextValue value: each].
  77452.     ^nextValue!
  77453.  
  77454. isEmpty
  77455.     "Answer whether the receiver contains no elements."
  77456.  
  77457.     ^self size == 0
  77458. !
  77459.  
  77460. keys
  77461.     "Answer a <collection> containing the receiver's keys."
  77462.  
  77463.     ^1 to: self size!
  77464.  
  77465. keysAndValuesDo: operation
  77466.     "Evaluate the <dyadicValuable>, operation, for each element of the receiver
  77467.     with the index of that element and the element itself as the arguments.
  77468.     Implementation Note: Subclasses should override #from:to:keysAndValuesDo: rather 
  77469.     than this method, unless they have a slow implementation of #size."
  77470.  
  77471.     self from: 1 to: self size keysAndValuesDo: operation!
  77472.  
  77473. last
  77474.     ^self at: self size!
  77475.  
  77476. length
  77477.     "Answer the number of elements in the receiver."
  77478.  
  77479.     ^length!
  77480.  
  77481. length: anInteger
  77482.     "Set the length (in elements, not bytes) of the receiver, resizing the
  77483.     bytes of the receiver to accomodate the new length.
  77484.     This is not private as it can be used to adjust the length of 
  77485.     pointer instances after creation."
  77486.     
  77487.     self basicLength: anInteger.
  77488.     self bytes resize: self byteSize!
  77489.  
  77490. notEmpty
  77491.     "Answer whether the receiver contains any elements."
  77492.  
  77493.     ^self isEmpty not!
  77494.  
  77495. printOn: aStream
  77496.     "Print a string representation of self on aStream."
  77497.  
  77498.     | tooMany |
  77499.     tooMany := aStream position + #() maxPrint.
  77500.     aStream
  77501.         basicPrint: self;
  77502.         nextPut: $(.
  77503.     self isNull 
  77504.         ifTrue: [aStream nextPutAll: 'NULL']
  77505.         ifFalse: 
  77506.             [self do: 
  77507.                     [:each | 
  77508.                     aStream position > tooMany 
  77509.                         ifTrue: 
  77510.                             [aStream nextPutAll: '... etc ...'.
  77511.                             ^self].
  77512.                     each printOn: aStream]
  77513.                 separatedBy: [aStream space]].
  77514.     aStream nextPut: $)!
  77515.  
  77516. publishedAspects
  77517.         "Answer a <LookupTable> of the <Aspect>s published by the receiver.
  77518.         Implementation Note: By adding superclass aspects to the keyed aspect
  77519.         table we get much better performance because it reduces the number 
  77520.         of rehashes that are necessary due to resizing."
  77521.     
  77522.         ^(self publishedKeyedAspects)
  77523.             addAll: super publishedAspects;
  77524.             yourself!
  77525.  
  77526. publishedKeyedAspects
  77527.     "Answers a <LookupTable> of the published aspects of the 
  77528.         receiver's keyed contents."
  77529.  
  77530.     | batchAccessor keyedAspects |
  77531.     batchAccessor := KeyedAspectBatchAccessor subject: self
  77532.                 batchSize: self publishedKeyedAspectsBatchSize.
  77533.     keyedAspects := batchAccessor getBatchAccessors collect: [:each | each aspectDescriptor].
  77534.     ^(LookupTable new)
  77535.         addAll: keyedAspects;
  77536.         yourself!
  77537.  
  77538. publishedKeyedAspectsBatchSize
  77539.         "Private - Answers the number of keyed aspects to display in the PAI return at a time"
  77540.     
  77541.         ^100
  77542.     !
  77543.  
  77544. replaceBytesOf: aByteObject from: start to: stop startingAt: fromStart
  77545.     "Private - Standard method for transfering bytes from one variable
  77546.     byte object to another, normally double dispatched from #replaceFrom:to:with:startingAt:"
  77547.  
  77548.     ^bytes replaceBytesOf: aByteObject from: start to: stop startingAt: fromStart-1*self elementSize+1!
  77549.  
  77550. replaceFrom: start to: stop  with: aByteObject startingAt: fromStart
  77551.     "Standard method for transfering bytes from one variable
  77552.     byte object to another. See String>>replaceFrom:to:with:startingAt:"
  77553.  
  77554.     | elemSize offset |
  77555.     elemSize := self elementSize.
  77556.     offset := start-1 * elemSize.
  77557.     aByteObject 
  77558.         replaceBytesOf: self bytes 
  77559.         from: 1+offset
  77560.         to: stop * elemSize
  77561.         startingAt: fromStart!
  77562.  
  77563. select: discriminator
  77564.     "Evaluate the <monadicValuable> argument, discriminator, for each of the receiver's elements.
  77565.     Answer a new <collection> like the receiver containing only those elements for which 
  77566.     the discriminator evaluates to true."
  77567.  
  77568.     | aStream |
  77569.     aStream := self species writeStream.
  77570.     self keysAndValuesDo: [:i :elem | 
  77571.         (discriminator value: elem) ifTrue: [aStream nextPut: elem]].
  77572.     ^aStream contents!
  77573.  
  77574. size
  77575.     "Answer the number of elements in the receiver."
  77576.     
  77577.     ^self length!
  77578.  
  77579. species
  77580.     "Answer the class of object to be used when copying the receiver."
  77581.  
  77582.     ^Array! !
  77583.  
  77584. ExternalInteger comment:
  77585. 'ExternalInteger is an abstract class of ExternalStructures to represent machine native integer formats. Various subclasses are defined to represent the signed and unsigned forms with varying numbers of bits:
  77586.  
  77587. 8-bit
  77588.     signed    SBYTE
  77589.     unsigned    BYTE
  77590. 16-bit
  77591.     signed    SWORD
  77592.     unsigned    WORD
  77593. 32-bit
  77594.     signed    SDWORD
  77595.     unsigned    DWORD
  77596. 64-bit
  77597.     signed    LARGE_INTEGER
  77598.     unsigned    ULARGE_INTEGER
  77599. '!
  77600. !ExternalInteger class methodsFor!
  77601.  
  77602. decompileDefinition
  77603.     "Don't allow the receiver and its subclasses to be decompiled since they are
  77604.     required by fundamental aspects of the system such as streaming"
  77605.     !
  77606.  
  77607. defineTemplate
  77608.     "Initialize the receiver class' structure template."
  77609.  
  77610.     super defineTemplate.
  77611.     alignment := self elementSize!
  77612.  
  77613. fromInteger: anInteger
  77614.     "Answer a new instance of the receiver with contents copied from anInteger"
  77615.  
  77616.     ^self new value: anInteger!
  77617.  
  77618. icon
  77619.     "Answer a suitable iconic representation for the receiver."
  77620.  
  77621.     ^Integer icon!
  77622.  
  77623. newAspect: aspectClass name: aSymbol 
  77624.         "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  77625.         which is appropriate for representing aspects of the receiver's type."
  77626.     
  77627.         ^aspectClass integer: aSymbol!
  77628.  
  77629. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  77630. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥L▀⌡mr∞┼{╬C}╙┤╧ôKzặ≈∞╝φ!
  77631.  
  77632. ≈PJp\zö¥;?╗╜ëj╚└┌ⁿ█√┼ƒ┴╢≈σebìÆßUGB╦ö;àZU?gIVoOΓÄ^Kc6]ªoVd╢δ4≥█¡┤▓ùß╩P╒4m    Σ»h>¿ë╙LJûÆf£FÑmƒ∩XM4Φpå! !
  77633.  
  77634. !ExternalInteger methodsFor!
  77635.  
  77636. = anObject
  77637.     "Answer whether the receiver is equivalent to anObject."
  77638.  
  77639.     ^anObject = self value!
  77640.  
  77641. asDword
  77642.     "Answer the receiver in a form suitable for passing or returning as 
  77643.     a 32-bit value (e.g. as the result of a window procedure)."
  77644.  
  77645.     ^self value!
  77646.  
  77647. asInteger
  77648.     "Answer the Integer value of the receiver, signed or
  77649.     unsigned depending on the subclass"
  77650.  
  77651.     ^self value!
  77652.  
  77653. asSignedInteger
  77654.     "Answer the signed 32-bit Integer value of the receiver.
  77655.     This can be useful where functions return values declared as unsigned, but with signed
  77656.     values in them (a typical C programmers' trick for notifying error conditions).
  77657.     Implementation Note: This should really be a subclass responsibility,
  77658.     but this saves some space."
  77659.  
  77660.     ^self value!
  77661.  
  77662. asUnsignedInteger
  77663.     "Answer the unsigned Integer value of the receiver.
  77664.     This can be useful where unsigned values are stored in signed values.
  77665.     Implementation Note: This should really be a subclass responsibility,
  77666.     but this saves some space."
  77667.  
  77668.     ^self value!
  77669.  
  77670. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òΓ─äaj₧ò⌠%3ZS┬û;AÆQP+zR\eO∙ç^Mn#▒yPo½╜%ΦÉm┬┌▌≈╔∙=,╛Up4.n▀½X╟á╓M╒^Çy¿ái╨⌡E`bí'▄ûxñca╕1╥å╩∙┬â|åïÜ¥hε≡CΓ'<O╜═
  77671. ∞·yáfù2░Ü?d ┬j╟Lm┼e±╧åHr!
  77672.  
  77673. hash
  77674.     "Answer the SmallInteger hash value for the receiver."
  77675.  
  77676.     ^self value hash!
  77677.  
  77678. isNull
  77679.     "Answer whether the receiver is Null (i.e. equal to 0). 
  77680.     This message is useful way of testing for NULL pointers or handles."
  77681.  
  77682.     ^super isNull or: [self value == 0]!
  77683.  
  77684. printOn: aStream
  77685.     "Append a textual representation of the receiver to aStream."
  77686.  
  77687.     | hex |
  77688.     hex := self isNull
  77689.             ifTrue: ['0']
  77690.             ifFalse: [self value printStringRadix: 16].
  77691.     aStream
  77692.         basicPrint: self;
  77693.         nextPut: $(; display: hex; nextPut: $)!
  77694.  
  77695. value
  77696.     "Answer the receiver's value as a Smalltalk <Integer>.
  77697.     Note: All subclasses defining this as a structure member named #value
  77698.     must mark that field as an override (send it #beOverride) as otherwise
  77699.     the necessary accessor will not be generated."
  77700.  
  77701.     ^self subclassResponsibility!
  77702.  
  77703. value: anObject
  77704.     "Set the receiver's value field to the value of anObject."
  77705.  
  77706.     ^self subclassResponsibility! !
  77707.  
  77708. FLOAT comment:
  77709. 'FLOAT is an <ExternalStructure> class to represent single precision (32-bit) floating point numbers in native format.'!
  77710. !FLOAT class methodsFor!
  77711.  
  77712. αV5, ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3KZ╙ù-ÿY%lQVh╢╔
  77713. @v/Lóp_sΓ¬.║ég╝▓ÑÉ÷├= àuG^.s╧╛n>»┌╙ü╙pεVÑxöAΦ^dRêvÜ╬KÖQqó|╥Ç╤≈╒│3ç ▀Å¢yO╝⌠TA½vi┼ⁿs╪╓ZδEo╪F╩│$o╣╚l╩G|Ç,Ñ╬ûG`ª╝²φ«D┼₧6╨▐ö&-Drtt3ùgë!
  77714.  
  77715. defineFields
  77716.     "Define the fields of the FLOAT 'structure'.
  77717.  
  77718.         FLOAT  compileDefinition
  77719.     "
  77720.  
  77721.     self defineField: #value type: FLOATField new!
  77722.  
  77723. τM"1 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H g^_oQ╢òIcf[¼<QoΓ╛3 ┌º≈Ñ¢τ▌ÆzJ@zh▀ⁿ7¡╠╔OMçQÇVsºF║y╨σAJI1∩$≥┤0ôV|⌐|└å╤π╧┤fÜî╒╤e├¢>zäL%Z╢╔:█╙[!
  77724.  
  77725. fileOutStem
  77726.     "Private - Answer standard file name stem for the class to file out on."
  77727.  
  77728.     ^'FLOAT2'
  77729. !
  77730.  
  77731. icon
  77732.     "Answer a suitable iconic representation for the receiver."
  77733.  
  77734.     ^Float icon!
  77735.  
  77736. initialize
  77737.     "Private - Initialize the receiver's class variables.
  77738.         self initialize
  77739.     "
  77740.  
  77741.     VMLibrary default registryAt: self name put: self!
  77742.  
  77743. maximum
  77744.     ^self fromBytes: #[255 255 127 127]!
  77745.  
  77746. minimum
  77747.     ^self fromBytes: #[0 0 128 0]
  77748. !
  77749.  
  77750. newAspect: aspectClass name: aSymbol 
  77751.         "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  77752.         which is appropriate for representing aspects of the receiver's type."
  77753.     
  77754.         ^aspectClass float: aSymbol!
  77755.  
  77756. ±V.!!íë3<╢╜║+ë*ΣÄ»═╚÷φⁿƒ▄æL▒ßÇzC]B╞à<^ÆlP8kZ^+b£Φ\j óo@o░┐z║σC6ëà₧┐┘√\â4].s▀░kr╕▌²% Æ T£jùSñAΩPC=ítì╫Wêmz÷@=πç╫Γ═óì>ïëû}εΓ^C¼i rüε=╩∙VαT=╔LÇVÑ!
  77757.  
  77758. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  77759. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥▄ⁿ,u!
  77760.  
  77761. uninitialize
  77762.     "Private - Uninitialize the receiver prior to its removal from the image."
  77763.  
  77764.     VMLibrary default registryAt: self name put: nil!
  77765.  
  77766. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  77767. m»g|jmT]x≈Å
  77768. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{Fττ! !
  77769.  
  77770. !FLOAT methodsFor!
  77771.  
  77772. asFloat
  77773.     "Answer a <Float> of the same value as the receiver's contents."
  77774.  
  77775.     ^(bytes floatAtOffset: 0)!
  77776.  
  77777. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òΓ─äaj₧ò⌠%3ZS┬û;AÆQP+zR\eO∙ç^Mn#▒yPo½╜%ΦÉm┬┌▌≈╔∙=,╛Up4.n▀½X╟á╓M╒^Çy¿ái╨⌡E`bí'▄ûxñca╕1╥å╩∙┬â|åïÜ¥hε≡CΓ'<O╜═
  77778. ∞·yáfù2░Ü?d ┬j╟Lm┼e±╧åHr!
  77779.  
  77780. value
  77781.     "Answer the receiver's value field as a Smalltalk object."
  77782.  
  77783.     ^(bytes floatAtOffset: 0)!
  77784.  
  77785. value: anObject
  77786.     "Set the receiver's value field to the value of anObject."
  77787.  
  77788.     bytes floatAtOffset: 0 put: anObject! !
  77789.  
  77790. LPVOID comment:
  77791. 'LPVOID is an <ExternalStructure> class useful for representing pointers to arbitrary external memory blocks. In most respects LPVOID behaves like <ExternalAddress>, except that instances may be allocated using #newBuffer which can be passed to #lpvoid arguments without the VM implicitly dereferencing the address (i.e. the behaviour will be the same as if an ExternalAddress had been passed to an lppvoid parameter). LPVOID is also a pointer object, and can thus add instance variables to hold additional state.
  77792.  
  77793. LPVOID is useful, for example, where references to pointers (i.e. VOID**) are required, an example being COM [out] pointer parameters. The VM also passes instances of LPVOID as lpvoid input parameters to callbacks and COM method implementations.
  77794.  
  77795. It is important to realise that LPVOID (and subclasses) are unlike other ExternalStructures in that they are already pointers, and therefore they already incorporate one level of indirection. Thus:
  77796. 1) #value answers the pointed at address in the case of doubly-indirect (reference) instances, or the address itself for internal buffer instances.
  77797. 2) The class method #fromAddress: will answer a pointer to a pointer, i.e. a double-indirection. This means that, for example, the subclass LPWSTR is useful as an element class for a <StructureArray> of LPWSTR pointers (as expected), but that ''LPWSTR fromAdddress: aUnicodeString yourAddress'' is not valid.'!
  77798. !LPVOID class methodsFor!
  77799.  
  77800. defineFields
  77801.     "Define the fields of the LPVOID 'structure'.
  77802.         LPVOID compileDefinition
  77803.     "
  77804.  
  77805.     self defineField: #value type: LPVOIDField new!
  77806.  
  77807. new
  77808.     "Answer a new instance of the receiver.
  77809.     Implementation Note: LPVOID and its subclasses represent pointers, and are typically
  77810.     used for double indirections, thus a reference is normally required."
  77811.  
  77812.     ^self newPointer!
  77813.  
  77814. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  77815. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+FÅK╒ⁿm#╨╘8╓Jg╙ú╒äL`∞∞╢ôèoû╖vS░Σ!
  77816.  
  77817. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  77818. m»g|jmT]x≈Å
  77819. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿP¡d;└╞ ₧╦WεRo▐V▌τr#╖¬½|-âwÉΣóQ`╝ú∙ΩΘ    ª╫oR¬⌠│vT<r═<╫(^ftÇ! !
  77820.  
  77821. !LPVOID methodsFor!
  77822.  
  77823. asExternalAddress
  77824.     "Answer the address contained in or referenced by the receiver."
  77825.  
  77826.     ^self value!
  77827.  
  77828. value
  77829.     "Answer the receiver's value field as a Smalltalk object."
  77830.  
  77831.     ^(bytes dwordAtOffset: 0) asExternalAddress!
  77832.  
  77833. value: anObject
  77834.     "Set the receiver's value field to the value of anObject."
  77835.  
  77836.     bytes dwordAtOffset: 0 put: anObject! !
  77837.  
  77838. MINMAXINFO comment:
  77839. '<MINMAXINFO> is an <ExternalStructure> class to wrap the struct ''Win.MINMAXINFO'' from type information in the ''Windows API (ANSI)'' library.
  77840.  
  77841. The type library contains no documentation for this struct
  77842.  
  77843. Warning: This comment was automatically generated from the struct''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.
  77844.  
  77845. IDL definition follows:
  77846.  
  77847. typedef struct tagMINMAXINFO {
  77848.     POINTL ptReserved;
  77849.     POINTL ptMaxSize;
  77850.     POINTL ptMaxPosition;
  77851.     POINTL ptMinTrackSize;
  77852.     POINTL ptMaxTrackSize;
  77853. } MINMAXINFO;
  77854. '!
  77855. !MINMAXINFO class methodsFor!
  77856.  
  77857. defineFields
  77858.     "Define the fields of the MINMAXINFO structure.
  77859.         MINMAXINFO compileDefinition
  77860.     
  77861.         typedef         struct tagMINMAXINFO {
  77862.             POINTL ptReserved;
  77863.             POINTL ptMaxSize;
  77864.             POINTL ptMaxPosition;
  77865.             POINTL ptMinTrackSize;
  77866.             POINTL ptMaxTrackSize;
  77867.         } MINMAXINFO;
  77868. "
  77869.  
  77870.     self
  77871.         defineField: #ptReserved type: (StructureField type: POINTL) beFiller offset: 0;
  77872.         defineField: #ptMaxSize type: (StructureField type: POINTL) beUncompiled offset: 8;
  77873.         defineField: #ptMaxPosition type: (StructureField type: POINTL) beUncompiled offset: 16;
  77874.         defineField: #ptMinTrackSize type: (StructureField type: POINTL) offset: 24;
  77875.         defineField: #ptMaxTrackSize type: (StructureField type: POINTL) offset: 32.
  77876.     self byteSize: 40! !
  77877.  
  77878. !MINMAXINFO methodsFor!
  77879.  
  77880. ptMaxTrackSize
  77881.     "Answer the receiver's ptMaxTrackSize field as a Smalltalk object."
  77882.  
  77883.     ^POINTL fromAddress: (bytes yourAddress + 32)!
  77884.  
  77885. ptMaxTrackSize: anObject
  77886.     "Set the receiver's ptMaxTrackSize field to the value of anObject."
  77887.  
  77888.     anObject replaceBytesOf: bytes from: 33 to: 40 startingAt: 1!
  77889.  
  77890. ptMinTrackSize
  77891.     "Answer the receiver's ptMinTrackSize field as a Smalltalk object."
  77892.  
  77893.     ^POINTL fromAddress: (bytes yourAddress + 24)!
  77894.  
  77895. ptMinTrackSize: anObject
  77896.     "Set the receiver's ptMinTrackSize field to the value of anObject."
  77897.  
  77898.     anObject replaceBytesOf: bytes from: 25 to: 32 startingAt: 1! !
  77899.  
  77900. OLEStructure comment:
  77901. 'OLEStructure is an <ExternalStructure> the primary purpose of which is to group all OLE/COM related structure classes. OLEStructure also provides the basic boilerplate initialization needed for structures which have a ''sizeof'' member at offset 0 (see LICINFO for an example).'!
  77902. !OLEStructure methodsFor!
  77903.  
  77904. dwSize: anInteger
  77905.     "Store the size of the structure into itself (a common feature of Win32 structures,
  77906.     but unfortunately not all, so the default is to do nothing)"!
  77907.  
  77908. initialize: anInteger
  77909.     "Private - Initialize the state of the receiver."
  77910.  
  77911.     super initialize: anInteger.
  77912.     self dwSize: anInteger! !
  77913.  
  77914. POINTF comment:
  77915. '<POINTF> is an <ExternalStructure> class to wrap the struct of the same name.
  77916.  
  77917. POINTF is a cartesian coordinate with single precision floating point x and y values.'!
  77918. !POINTF class methodsFor!
  77919.  
  77920. defineFields
  77921.     "Define the fields of the POINTF structure.
  77922.         POINTF compileDefinition
  77923.     
  77924.         typedef         struct tagPOINTF {
  77925.             single x;
  77926.             single y;
  77927.         } POINTF;
  77928.  
  77929.     "
  77930.  
  77931.     self
  77932.         defineField: #x type: FLOATField new offset: 0;
  77933.         defineField: #y type: FLOATField new offset: 4.
  77934.     self byteSize: 8! !
  77935.  
  77936. !POINTF methodsFor!
  77937.  
  77938. x
  77939.     "Answer the receiver's x field as a Smalltalk object."
  77940.  
  77941.     ^(bytes floatAtOffset: 0)!
  77942.  
  77943. x: anObject
  77944.     "Set the receiver's x field to the value of anObject."
  77945.  
  77946.     bytes floatAtOffset: 0 put: anObject!
  77947.  
  77948. y
  77949.     "Answer the receiver's y field as a Smalltalk object."
  77950.  
  77951.     ^(bytes floatAtOffset: 4)!
  77952.  
  77953. y: anObject
  77954.     "Set the receiver's y field to the value of anObject."
  77955.  
  77956.     bytes floatAtOffset: 4 put: anObject! !
  77957.  
  77958. StructurePointer comment:
  77959. ''!
  77960. !StructurePointer class methodsFor!
  77961.  
  77962. byteSize
  77963.     ^4!
  77964.  
  77965. elementClass: elementClass
  77966.     "Answer a new instance of the receiver that will contain a pointer to
  77967.     an <ExternalStructure> or the specified type."
  77968.  
  77969.     ^self new
  77970.         elementClass: elementClass;
  77971.         yourself!
  77972.  
  77973. fromAddress: anAddress elementClass: elementClass
  77974.     "Answer a new instance of the receiver that contains a pointer to
  77975.     an <ExternalStructure> of the specified type."
  77976.  
  77977.     ^anAddress isNull ifFalse: [
  77978.         self basicNew
  77979.             initializeAtAddress: anAddress;
  77980.             elementClass: elementClass;
  77981.             yourself]!
  77982.  
  77983. newNull: pointerClass elementClass: elementClass
  77984.     "Answer a new instance of the receiver that contains an
  77985.     initially null memory pointer of the specified class pointer to 
  77986.     an <ExternalStructure> of the specified type."
  77987.  
  77988.     ^self basicNew
  77989.         initializeAtAddress: pointerClass new;
  77990.         elementClass: elementClass;
  77991.         yourself! !
  77992.  
  77993. !StructurePointer methodsFor!
  77994.  
  77995. elementClass
  77996.     "Private - Answer the value of the receiver's ''elementClass'' instance variable."
  77997.  
  77998.     ^elementClass!
  77999.  
  78000. elementClass: anObject
  78001.     "Private - Set the value of the receiver's ''elementClass'' instance variable to the argument, anObject."
  78002.  
  78003.     elementClass := anObject!
  78004.  
  78005. printOn: aStream
  78006.     "Print a string representation of self on aStream."
  78007.  
  78008.     aStream
  78009.         basicPrint: self;
  78010.         nextPut: $(.
  78011.     self isNull 
  78012.         ifTrue: [aStream nextPutAll: 'NULL']
  78013.         ifFalse: [aStream print: self value].
  78014.     aStream nextPut: $).!
  78015.  
  78016. value
  78017.     "Answer the receiver's value field as a Smalltalk object."
  78018.  
  78019.     ^self elementClass fromAddress: bytes! !
  78020.  
  78021. VOID comment:
  78022. 'VOID is an <ExternalStructure> class to represent unspecified, null, or opaque types. 
  78023.  
  78024. VOID is only useful in pointer form, and mainly intended to provided a unified type scheme for auto-generation of structures from type libraries.'!
  78025. !VOID class methodsFor!
  78026.  
  78027. αV5, ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H |IRrQ╢éXu5╖shºδ5Θ█F@╝╕≈î≥▀äqP.CÜ╜ »╨╙GôVçpεQ│~òΩT]N+ípå╬\╥/┼)1├₧╞√╔«gëûö¥<!!íσRΓAiâ÷ ₧╨Yºπv■H│,sⁿçv═V.╓>╜╒ç4áº÷²σFª√ O░·╖J v^i%ÇDú#8t]Uë╪₧╠3>F █òoç_àΣæ╖≥dñ╢ä█ƒ2⌡∞╧I╞ 3┐h⌡zá▄¡2╥¢ìò╬╠@ö├╔Γl√╖{φ6╚Γ÷╦w,%k#!
  78028.  
  78029. τM"1 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H g^_oQ╢òIcf[¼<QoΓ╛3 ┌º≈Ñ¢τ▌ÆzJ@zh▀ⁿ7¡╠╔OMçQÇVsºF║y╨σAJI1∩$≥┤0ôV|⌐|└å╤π╧┤fÜî╒╙J ç╒M▒ }┬∞<╦═LΓ ┬S├Vσ,m≡├8╒Jk╬╕╥çMf╢¡∞√ΣHΩÖ
  78030. 1╙ëîi@n=¢τ9?ef]┘╚Å»M!
  78031.  
  78032. new
  78033.     "Answer a new instance of the receiver.
  78034.     Implementation Note: VOID and its are intended to represent pointers
  78035.     thus a reference is always required."
  78036.  
  78037.     ^self newPointer!
  78038.  
  78039. ±K.!!=╢⌐;,╢¡╕3ò:î╛åÄ▀┘╠┬╗ασGK║√£^k\S└è?^▒VA&jh≈Ær)▒yCxº╕%⌠╩º╛╣è≥▌^â{fi╔ⁿh*║╠╥WIÖVçe½ítä    ╝EG UïÉ╨\▄Kz¿    .╓æ╫ ├«=╩`⌡÷∙1é┴akïD,rçπ7!
  78040.  
  78041. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  78042. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥╠·)!
  78043.  
  78044. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  78045. m»g|jmT]x≈Å
  78046. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{B£ç▄╖! !
  78047.  
  78048. Win32Structure comment:
  78049. 'Win32Structure is the abstract superclass of all classes that describe <ExternalStructure>s that are a part of the Win32 API. For the most part, these structures hold a <DWORD> byte size as the first field which Windows can use as version information to determine how the structure is to be interpreted. Where available,  this is set using #dwSize:.
  78050. '!
  78051. !Win32Structure methodsFor!
  78052.  
  78053. dwSize: anInteger
  78054.     "Store the size of the structure into itself (a common feature of Win32 structures,
  78055.     but unfortunately not all, so the default is to do nothing)"!
  78056.  
  78057. initialize: anInteger
  78058.     "Private - Initialize the state of the receiver."
  78059.  
  78060.     super initialize: anInteger.
  78061.     self dwSize: anInteger! !
  78062.  
  78063. IUnknown comment:
  78064. '<IUnknown> is a wrapper class for the COM interface ''stdole.IUnknown'' originally generated from type information in the ''OLE Automation'' library. It contains methods to invoke the member functions exposed by that interface.
  78065.  
  78066. IUnknown is the fundamental interface supported by all COM objects and is therefore ubiquitous for any component regardless of implementation. IUnknown includes behaviour to control object lifetime by reference counting, and for  interface negotiation using QueryInterface.
  78067.  
  78068. Note that most of Dolphin''s supporting behaviour wrapping IUnknown is implemented in the superclass in order not to overwhelm the fundamental simplicity of IUnknown.'!
  78069. !IUnknown class methodsFor!
  78070.  
  78071. defineFunctions
  78072.     "Declare the virtual function table for the COM interface 'stdole.IUnknown'
  78073.  
  78074.     Implementation Note: These functions are the core of COM and are crucial to good performance,
  78075.     therefore they are implemented as special classes of function which don't need to use the 
  78076.     generic Object>>perform:withArgumentsAt:descriptor: primitive."
  78077.  
  78078.     functions 
  78079.         add: UnkQIFunction new;
  78080.         add: UnkAddRefFunction new;
  78081.         add: UnkReleaseFunction new!
  78082.  
  78083. on: server outerUnknown: pUnkOuter
  78084.     "Private - Answer a pointer to a new instance of the receiver acting as a non-delegating
  78085.     unknown for the object, server, and whose outer unknown is referenced by the
  78086.     argument, pUnkOuter.
  78087.     Implementation Note: As IUnknown is implemented entirely by the COM object stub
  78088.     we have no need of a pointer to the implementor."
  78089.  
  78090.     | stub if |
  78091.     stub := self comObjectClass on: server.
  78092.     if := self newInternal.
  78093.     stub 
  78094.         outerUnknown: pUnkOuter;
  78095.         addInterface: if.
  78096.     ^self fromAddress: if yourAddress!
  78097.  
  78098. uninitialize
  78099.     "Private - Uninitialize the receiver prior to its removal from the image."
  78100.  
  78101.     VMLibrary default registryAt: self name put: nil!
  78102.  
  78103. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  78104. m»g|jmT]x≈Å
  78105. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{A¥à╓╤╫(ß! !
  78106.  
  78107. !IUnknown methodsFor!
  78108.  
  78109. _addRef 
  78110.     "Private - Increment the receiver's reference count, ignoring the request
  78111.     if null."
  78112.  
  78113.     self isNull ifFalse: [self AddRef]
  78114. !
  78115.  
  78116. addRef 
  78117.     "Increment the receiver's reference count.
  78118.     Raises an HRESULTError if the receiver is null."
  78119.  
  78120.     self isNull ifTrue: [^HRESULTError signalWith: E_POINTER].
  78121.     self AddRef
  78122. !
  78123.  
  78124. AddRef
  78125.     "Invoke the AddRef() method of the COM object wrapped by the receiver.
  78126.  
  78127.         unsigned long __stdcall AddRef();
  78128.     "
  78129.  
  78130.     <virtual stdcall: dword 2>
  78131.     ^self invalidCall!
  78132.  
  78133. asObject
  78134.     "Answer a suitable Smalltalk object to represent the receiver's value."
  78135.  
  78136.     ^self notNull ifTrue: [self]!
  78137.  
  78138. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣n╕│(m┬▐ë¿╓²5?╣@|o╫ëc9á╞╫W╒ûs!
  78139.  
  78140. displayOn: aStream 
  78141.     "Append a user-friendly textual representation of the receiver to the 
  78142.     <puttableStream>, target."
  78143.  
  78144.     self isNull ifTrue: [aStream print: nil] ifFalse: [self printOn: aStream]!
  78145.  
  78146. QueryInterface: riid ppvObject: ppvObject
  78147.     "Invoke the QueryInterface() method of the object wrapped by the receiver.
  78148.     
  78149.         HRESULT __stdcall QueryInterface(
  78150.             [in] GUID* riid,
  78151.             [out] void** ppvObject);
  78152.  
  78153.     Implementation Note: Return integer hresult value rather than have exception thrown, as
  78154.     E_NOINTERFACE is not really an exceptional condition at all."
  78155.  
  78156.     <virtual stdcall: sdword 1 GUID* void**>
  78157.     ^self invalidCall!
  78158.  
  78159. Release 
  78160.     "Invoke the Release() method of the COM object wrapped by the receiver.
  78161.  
  78162.         unsigned long __stdcall Release();
  78163.     "
  78164.  
  78165.     <virtual stdcall: dword 3>
  78166.     ^self invalidCall
  78167. ! !
  78168.  
  78169. IAxWinHostWindow comment:
  78170. '<IAxWinHostWindow> is a wrapper class for the COM interface ''DolphinVMLib.IAxWinHostWindow'' generated from type information in the ''Dolphin Smalltalk'' library. It contains methods to invoke the member functions exposed by that interface.
  78171.  
  78172. The type library contains the following helpstring for this interface
  78173.     "IAxWinHostWindow Interface"
  78174.  
  78175. This interface is very similar to ATL defined interface of the same name, with the slight difference that the CreateControlEx() method takes an additional parameter which allows one to specify a license key for instantiating licensed controls. The IID is also different of course.'!
  78176. !IAxWinHostWindow class methodsFor!
  78177.  
  78178. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3zbp╥╡câσ╔[╝7ï!!|ák╣nä6⌡_K/ª    ⌡╖0╡cl¢    2√¥╨Γ√⌐}îê█ùy    º Rpºmwâ√6│╡6Ñ,Eí5│÷!!gö¡½Fk╞6┐┘ÑQz░║±±ε\Φ╖CN╝ߪ!!jHAi>╘╘4+_c▌╚ç√4U*%█ô(₧WÿΣσí∞d≈α┴èû.ó≡▌Å6╣<╒<`Mτ░dè*ül≈Φùï┘Aò╙π≤L≈9╡e╗så─Ω┌Rll    G)π8ƒ╥5?ÖæJàrVqâam╫δ%╓.┌½µS>\m╙@╬╟╫O'ä⌡U9▓ÑKîüìk╫/=^SΘ⌡=YP√■Æ┘└    ╣╖⌠╕▀┐╥OÖK·─Z4╖ü¢ï"¼lb■■Ö²╤-tûùfτí┼Z¬÷∞'╔
  78179. 08«≈_╝i¼∩<鿬Z└█E░,G╪─═¿@╒⌡û7ÿél∩╖m+ñ«ÿê┤EE╔2╧╣╫X3╟Ü÷}ÆΓ╞(╦╡Z    ·)!!╖█z\▐"T²╫αíÜrΦ;¿√ƒû»ù_N]╫`^┘ïÆ⌐.∩¥┼¬É=GìRI(═Σ┴Y╖Aû╧V`╤ù≈!!≈∞Ω>▐ ╕╨░╥┤╦|{a≥ŲVy$╨}Z{ße¡sª¿ô}tÅ¥┬╚+┬Σ╒╣fQóvE Qsª[t∞.φûéj#▓^Pÿq ÿ»*cεñ¥és▒3kI2E≥à¼ñÑ≡gâE─åe╥╡≥3╧09eæë╘0°Ö⌐±^╬╨
  78180. σ.,!!ª╚9Uº┴ ú∙K░ât≥╝OÇôRÅù⌡z3¬v≡::₧5+╪ôt7*É╨ⁿ¿≈k░IO7OÑè! !
  78181.  
  78182. !IAxWinHostWindow methodsFor!
  78183.  
  78184. └P3çÇ<=¿ªÇp┼/╘┌Σ∩±┘╦╟▒■σ[t▒┐Ü;{X╓ΘT;╒oV#xZGnO╗┴7Wp)Dª<Gbºδε╩Cáö╕Éπ▌▀=kt╥│irí╧ÇM@ÉV░9XεL┤wòΦX±tÜ┌₧[4╕9ôÇ╞⌡╔⌐eì╤÷∙e╟ÿvçS?W╢» ß╠KπB.└SÜ7τ9`·╧[═Lz╥0╜öε.┌╟├≈ε;Φ▌UR▓ε╜ /E>h9¡φ"~Cñ}ñxπÜPcdφ» ╦R5ÿ⌠ÿπæ ì°∞º≈T▄┐▀▌"
  78185. C»h° uSεδ)╚^ Æò╙╪ƒa«╪╬ΦMπz·cα=┴δ²üw,qL1≈wÜ∙;d¥=¢m▐M/    !
  78186.  
  78187. ┬V"!!=çÇ<=¿ªÇp┼3±α²┼²─√╘¬≤σ[t▒┐Ü;{X╓─.aâMA+c{<ΓôXkK%╩>cx½╜!!ε█MΦ₧╣ê°─^â|[@Mr▀╜y7ì╞╬MZÜ█_5úFóuƒ╝^II,Θa▀²v▒{«
  78188. 9╨åâß▐ícÿ¢█æeO║∙R░e    ~ï∙6╠æ2ì,EÑ6≥$╓T╒≤8²}}╘;▓▌ÅH4É╝² ⌠ï√nH½∩╛Bo/<b];Ç7ú;F|d√W┴╛│Pn/gM╬Çcµ0k ÖΩ▒≥\ñÆ╢π╛~╜╘╟âh]b{jçu≥24v╤Ñ{┼lVªFÄ▓ç£┌Iûƒ₧ï(¥P]╨ïZÖ±±═ShCFZ)⌡4Æ√!!?╤<ìK╠MV#╥ l¥∞&≈eT╔¼δ[4zc*j─▀▀ôkΩèb9▓≤O▀£æQ▀ 1Tc╬ⁿIi!
  78189.  
  78190. ┬V"!!=çÇ<=¿ªÇ¥eí╪ °∞▐▄╞Ü≤▒R╖î╬)^σè:çlP8kZ^1Oµ▓
  78191. Kc'BπlC_¼áz║╬R5ª╝≈î■╞?ôbWk:Ü«d;¬Φ─OAå╙`áHùyå∩TI(⌠jö ]èKg⌐@>└å╤┌┼úvåÜ░ûeUε≤DP░Lxçß █⌠Z■,EÑΩ·;`φ┬8ÅG╬)╛╫å`╗½╕▌≥⌐αe╢εªicMC/râ≈?u_╧W┘ÅßzBC╪ï*êNBüΓ╨¿∞dα·â╘┌*╜µë╩2«2æe5ï╪A≥Hh┘*¬┴¼▒╠\ƒ╒─ΩN┤1"┐j⌡6µΦ÷╦IejP¢^·₧lƒ    ▀b∩/rvQ╞lp╣Θ<α]▄úú:[S#pE▀πƱs(ñúT╣√≥ ÷.╖1^}Qδ├08Éa▌╗╚ß╛┐≡╗çµí6⌡1¢ïPBα╗║└$óuhR▒■á▐≡1z█≈F╬ßÖo¬─╗╢iT}Mò┌°a¥≈>ƒó±9α≥.╩╛ΘÄ⌠'┌■ƒ)ÿ═
  78192. ⌠║E ╝²╦╬┘t;-úS╔╣■
  78193. °⌠╠
  78194. ₧⌡ê{n½▀6√+┐╟=çQ-║⌐╨î╖2ü#¬τäöá╤_UH▌gWƪ≡╥B ù╪Σ@÷$YèOTfƒÑîlSçQì╙GbE╦«╥9╙α∩,╙Uò^[ɲֵ>δuaΘ¼Ω <5ÖZ(#'8¼■`Ѻ╫>0▐╟ú½Fêß▄│5!
  78195.  
  78196. ΓV"!!=çÇ<=¿ªÇ¥eí╪ °∞▐▄╞Ü≤▒R╖î╬)^σè:çlP8kZ^1Oµ▓
  78197. Kc'Bπi]aâ»6≤═GZΦó╣ò╓╦
  78198. äq gc▀▓~7à╠┘ÖÉ{╜F¥xë2ΦCF?î÷£xÆQc⌐|╟Ü╞╢ÉëFåæöärQεπRW╖l;ìΘs╫╤IΦJ&┬XÜ√(!!┌ΦUéml╩:▓╚─W4É╝² ⌠ï√nH½∩╛/-c&åτYr%=ú~╤Qâ¿]-=M_═ä=╦FoⁿÖ╪▒°!!╛τ┴╪ö5öτ▀▄w-╡p╝rk≡ñlÜ-`┼/║┴¥¢╙Dªû╠αd⌡#┐1í╨Θ≤■P`\    4°3«╣@°5æ]╚S9█ I╕⌡>φ2Rê¼Ω@5Cj╙É┐│-à∩ZG▌û ╝çÜF╩)_N╨ (&%╦,¢δ∞└»⌐╒╖▀èï^Åm«ìFY Ñí¢┬$¬ qÆ╢ç└┴e1ƒ¡"úσÜ=x┤╩∩;åA}mMùαεEÿ∞Zµ╬╘DÜ«I¿b_ì║░─;╝Ü∙WäÄC└░m7»«ÿ┬£<.úS;╒╣╚k8▌╔φO╞ªëgIâ╪%√+Y╨╖J∙/V╘═╣Σ╙H╪ª∞╩┴¡╘CR╩a%^ço≥Ω╔Iñ÷ª═+╖&Z£I+L!
  78199.  
  78200. ╨Q",½ü&;╡Ñ╓jù6Φ╨»▄ε┴≡╫┤≈ªG ½╨m\J\╫ç*?²6|REj≤┴SO(Y¼wV*╢ú%║∩W║«öæ∙█¢<@ce╬┤b6ε╞╞\¥╙5Zâ╣Ü E*αtÅ█]▄@m∞4╓╥╤≤╧Ñz₧ì╒■b─ÿ>lÉE9N«█sßαL≤E,═S╓V┬8dδ▐[═Lz╥0╜öε.┌╟├≈ε;Φ╙Uu¥¬≥ lBf [τc╪%er▀─└δ},Uc╪ï*êNK═¥╗╤╛ Ä╫δñ╞(╝±▌╬    w┐}≡.Ωúl╙xW°F╔┴┤╗÷l╤û╙ΘK≡XzΣïZ√⌠²╙`AH1°3░÷!!iⁿ^!
  78201.  
  78202. ╥A3?-,í¥<(╢ìà9ò>⌡╫τû╛╟√▄¡Γ╚9*²ï╥reIB╫─s╛QR%e^≤┴-\rW╖yAdúº≤═R╝┤┐╓╛Åâ|Q.o▄ⁿy:½ëπve╒æp¡W÷jé∞AJxπ}▀╩QÖf⌐9┌ä╞Σé═σg÷≥╗N*¥─{pΓ_5hûδ0▀╙Sºr*╪z┬÷?o°╦\╦Q~┴+▓╘╦)┌╟æ┼Θò┤Ix░≤ó fNKvç≤^k%9ïzº|α╚{5QX╧Ç#╦IÆ≤╨┤≡;ñ▓ô╚ë+╣≈ëQÅ,╜h >Å█■~^α▐ê¥ÿ▐DÆ╥µτN°Z!
  78203.  
  78204. ╥A3?-,í¥<(╢£Ñä1σ╪Ω▐ñù╧±╖ß╡>)╓∙≡iz^W╞ü~╫vJ<aPV+■ä^jc2j╗hVx¼¬,╧≈jª│╗¢σçU^ÜqJadÜ│kr║┴┼k║;╙wñF╡i╨εP_=σ$¥╟êJq∞9╨ù╩α╔▓=σg≥±·'£╘dqÄTJD╜ⁿ'┌▄^δMo Z╬3δ9dδ╔y╬wGΦ>┐╪ÅAf√├Æùëoô²na∙╔ûuGAnx╬╟#a ñ}ñSτ╦4UZ╙ô;₧[╓π┼╝ `Φ╢█ìÆ,░≡▄█EnK;'╡o∞`\Ω√7¡2╥¢ìò╬╓Fì╫╔∩F╫<╢ï! !
  78205.  
  78206. ICatInformation comment:
  78207. '<ICatInformation> is a wrapper class for the COM interface ''COMCAT.ICatInformation'' generated from type information in the ''OLE Component Categories Library'' library. It contains methods to invoke the member functions exposed by that interface.
  78208.  
  78209. ICatInformation provides methods for obtaining information about the categories implemented or required by a certain class, as well as information about the categories registered on a given machine.
  78210.  
  78211. See MSDN for further information about COM Component Categories.
  78212.  
  78213. Class Variables:
  78214.     CatMan        <ICatInformation>. Singleton instance.
  78215.     Controls        <Array>. Cached <COMObjectRegistration>s for all controls registered on the machine.
  78216.  
  78217. '!
  78218. !ICatInformation class methodsFor!
  78219.  
  78220. ΓH41U╬µp┤║¢/ù⌡▄Ωîó⌠≤µù╓√L╣√╘svE╞à0VûM@j}B@
  78221. √┴Tv*J«y]~ú┐)⌡╨«≈úû■▄\Ö`[ha┘╣#p├ú¡3!!½5┐%\è░oƒ ╧E]6µ>▀ÖB╠$■%lâ╟Ī£≡#┼]╧╦├1,■í    ≥0Z+╥┐cÄÅ│2ï!
  78222.  
  78223. ΓK)'7¿£_C╙δ¡$û(Σ╞»═╛ï▄┌▓■áPW╢┤╬%3GPÆ╪}║pF kXGY
  78224. ±êMt'[¬s]4▒δ$ ═Aí╡╛É≡Å¢4Lii╔¿h ½═ÇxKüà8û█∙≤_[φw▀╠\¢Kg╕.╓ûâ∙┬αgÇ▀ô£oεⁿVG¬i~╠»╤╦ZºU'═KÜ√(!!·╚t╬Gm╘6╛╥├Mg≤¡∙²Φ¼┤bY║ߺ%OAKr3à≡W11":á┬ìßNe5OIÜò ╦]ÿ⌡├╣Φd¬°∞º≈T▄ ë
  78225. ╬:
  78226. Cáûfw^÷╝h╬-▒FìäƒêƒKÄ─╫πLα\]╨┬<╦≤Ω╨U)Fg4²wܱwä1┼ΣX]làxcî∩<τJ91ó╦åX2"Ij▀₧ÆâF╚─iô┐OìÜÆt╩>1^GKé╖?Wm╖O┴▐ⁿåC■εóεå┌Ü|║ü╫ati≡╩▀Cÿ|ï34M½∞¡ëîq²≤Eäç■@½⌡Φi┘0Eä╥±Aùí4Ǫ«GÅên¡å«¿╙0ï░ƒ=ÄäKΦ░F$I└¥▒óⁿpPW∙59╘▓╟i3╟╠√Iê∩ôgΓτi    ¿t6·┬4I¬?Aδ╟¿Φ═O╘:¡╡╠┴ú¥CO┌vKèUΘ÷²Vδêφ╢╖1tL⌠1/┤½î|╜≤¼(!
  78227.  
  78228. ΓQ506░ΓX@°êé9Æ:≤ö√─√ù╠▄░⌡⌐VW░╡Çr}[B╙è=W╫PBjzSV+≤éPp#]φ>>╧┴I┘▀V-⌐╣≈ùΣß    ¢4WZr╧╣7ròñ¬0!!╢¥gíOÑ=╩\╝_Fvî÷╖z¥VY¡|ë╧âσ┘░vÜMæ₧äAA├¢>züaVâß!
  78229.  
  78230. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3}/CC√ê#ì╚╘pFôüt║J╣s╫lû8& αp╢╨_ôPy¡5▄£â≥╔ªzå½₧₧l»σR)╚    HΦéY╖╠ZδGBª6│÷+h≈┬^╫Lm╘6╛╥┘7ûáφ≤├╝±gS½Θ╖XuVPs?¡ ≈7~]Iα╦╨╠3U*M╚å:å_ é─╚¿∙r╛·╞╔ì1ºτë Ω "1"êY█ Ff╦ƒO∩'½]≤δ·τ█M¥▀╦πdß3«bε=ƒº╗°RJNL:■%è╙(vÆnôM╓Rp£De₧°oÄ`L5íú²P$7OjΓ╬╫╩F╟─iô╡    ¢éÉU┌l4@W╓ΓnDfⁿ■Æ▄╫Ñ┤⌠É▐à╚KòW«▐«çé0╟+╛qc ╘╕ô╧╤:vÿê%ó¢¬Fº°∩ çi}'▌╨'∙QîΦ%ëúτFìÿF╖1å╕²╤9╘■à3╡ïYσεbM├¥┘┘Æ \A─.┘º╞Yfïç·]ô⌠ÿ)eù⌡B¿*#╡╠p═m▄Ä·╚°U╚8ä└╣ÑδùX1│g_¢Z∩÷┼aΣÿ╪¡╕r    A░He*û╖æG1║g₧╬Pj╤ä╬:╚Γσ6╪Y╨}4½▐╨º╫uWb÷╖╛EN2¢[3oOVƒ=Ωf¿╡₧3 ═╫⌡╧(┬ë╣╛}XëfEΦqc╣P]nÿ ╠Ü╛4G5½PN╕88╜ç*ª·ττ▄M&g░*ⁿ≥╘gñµ;╩ Φäy╧ªτ.├6)b┘φ¿T╒æ┐⌠s╩Γπ.&<╙ÄYjú╞@º∞\░ùb┌ÇGè═3α∞╞~X╤oⁿ-3º) ¢├M@b^I≤┤▄₧Θ⌐mrT,é¬-ò╜▒W≡ªK!!zS┼n╘Fk╥Å░_gï'Q6¼╩∞±>S¬ⁿf>┴╓¡{¥T╨╕╞'║03^ü∞6╡+Ñ┌x╛┴wá░Qe-kñ°¼2≥ ¿·▒,ò╔ⁿ7Ωß}æ╖⌐Sñ?S│»!
  78231.  
  78232. ∩A0w_Qµ╗:,·╗ë)Ç6≈╤²î≈─ƒ╘■ß¼]D│╛╘t}┐εS8■aW/b]x∙ö]H)[èqCfºª%⌠╩!
  78233.  
  78234. εJ0 ░¥;9ôñì-ÇRï╜¡ⁿ∞▐╔╘¬≈σ Ü╙hz[BÆì0âWAjgVRl
  78235. ╢Æ
  78236. Ko6_¬rT*▓╣/∙█QΦ╡«▐⌠├àzWi ▐│z<ε╚╬@% ƒoºO»=Ö⌡EF4Φ~Ü┌èCfÑ>▀ù╨╢─ÑîM¥é╙h½▒EAíemç²}£▓5è+F▀Z╓│8o≡╔q╓Ko╠6½┘!
  78237.  
  78238. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓σfM╢╡╔ozIZ█₧;âWAj|^Pnαä g5¬hc▒δ!!°╤WΦú╕▐⌡╩\ ÆyQkdÜ║=úë╘QM╒₧r½⌠·lû8l,╠eæ₧┴Wú(┴¥╧σî·.╚ûù▌! !
  78239.  
  78240. !ICatInformation methodsFor!
  78241.  
  78242. αH+94,íê=;│¼ƒG∩Vú⌡ß▀Θ╥═ò┐▓∙PL│╖┼xgAY▄┌~]æ    OovL ─╕7w@    πoGx╖¿4∩╠GΦ│▓ì⌠▌₧zY@ol╓ⁿb4ε▌╚\çöf║FñxöA P[ ?εvû█J±(¬.ôå╦≤îñvÄ èùç<╖ΓCA» tüε?█æè+Bª6Σ÷!!g╣╞t╬ao╘:╢╙æMqá⌠╕«!
  78243.  
  78244. αH+94,íê=;│¼ƒp┼3ε╫ε└√║╡╝ⁿ╙½@T║⌐Çz3U▌ê2WöKM%`d    ╢▌=xRhîNjCîìñ₧Q║ó┤èΓ▌╫p[mr╙╛d<⌐ë┴UD╒òVaªF÷oò⌡B[ *Σ`▀▌XêGsú5╓ü«£Ñª|ÜMïôû<╛⌠TMñi┬│╤▄^δDqî╒│qh≈╙}┼G|₧╜▀è@= ε⌠±πñ±.╘è▀`k[iy.C<¢µ1e@Bë├8»»L`f╔ä#ìÿσ▄¢²uß╜Ä▀ô;ª╣ë└6J!
  78245.  
  78246. πQ.1▒å6¿╗ì3▀µ┴µ╚φ║╡╝ⁿ┬╖ZU╛»┼;>w▄ù)WàE$.vs≤ôXj]▒}J4Γñ&║ée5üôΘ▐⌡┌â4XamÜ¿e7εò├VDÖÉ|íMΦ=ƒ╝h<┼:îƱ(½5╫üì┤í╩Γdâ█Æn»ΦMΓ|gδε!!╠▐Fºrîl╬µ.u∞╒}πP|┴&±╨åJsºªó╛τí≡s¬Θ¿B`JPc<Ü)∩#bε"Σ5─╠35ç┴~┼7h ≈─▒°rñ╛Äù┌∩ΣëÅ%ⁿ}ΦU4Vóí|╘7δH▐ê╙╘éÆûĪ╔\]╨▀4╨εⁿ╠!
  78247.  
  78248. ΓE327╢å7:ò»»&ä,≥Ä»▐²█╠▄║▓╚9*²Ü╬hdMDÆà~öPH&kXGb°▀^V`fäIzNⁿ╕`≤┌G╝╛▒ç■┴^ûxR@ma╬╣j=╝└┼J£âpúF╕iò╝SVI,Θa▀²v▒/┼3▐é╠°╔«g╚ûÅ¢<Sì▌dmå>F;É∞?═╓[⌐Bª2░∩m`≈╘o╟P.▄R█╡éJgñ½Ω╛║[Φ▌ER¼φò?+A[qüφ5c=ú~▐åº4U*i╘ö"óWÜ╙╨¼∙fδ¿ê╚ë│└┼▄mK░o⌡ 5ï╪y╨hU∙ ╜Ççç██╫╦⌡U±~╫êΩ╦▌·SdJH)■%╙°#L┤:èCàX@Lpæerαæ!
  78249.  
  78250. ΓH&    &=╖ª<
  78251. ╗╜ë-è-Φ╤ⁿû╛▐╥┼▓≈¿VM½╛─Xr\S╒ï,K░jm}Anπê Ph!!πnV{╖ó2 ┌a╝▓░æσ╓;+╛PMm    ÿ¥c!!╣╠╥I╒JÉyóF╡iÖ≥>ípù█└aXƒ)ìüâ∙╩αrä▀ÿ£qí RJ╢sJiçΦ:═╦Z⌡D+îP╘Vτ%d╣╘a╤Vk═R█╡ùLuºεδδ≡ºµt¡Φ╖JdRP i ç≡W9uJ^▌╦ÅÑo%X╥äo╫YÜⁿ╘╗Φhδ┤▀ìò8⌡┐ε<µ!!i^C╡q∞qRτ┐}┼ixφ¢å££╞o« ß⌡┤Z╙j∩7à≡≡╓N)]X(°%û╖9möt├M╨MG`ÆioâÑu∞ e∩ù╞so)Yl╙ ╦█╦AúΓH/░≡[å▓¬n·?tAéΣ,}Æmâ■▀▌Ñ┐Γ÷┬å█SÖUÑèQS ═°µ┼j¼"v∩╗╛┌╠>}╫Æ#┤£╛|╬öæ@╜c2üô≥Uö┬;ì┤«QÖ┤AÇ9 äª╡╚,┬¬╨7¢ùF∞▒p!!«╫┘▀É^V╙Θô╨
  78252. .╬╤δCÄ∩ÆnΓ╬6²'&┐┌WI■>C≈╓ú╞Φr∙&Ω╡²δ╚┤IP╒aO─▌ó┼
  78253. ¬╕πë:┤"LìiC!!₧╖ûz
  78254. íl┘┬Nf ╤╟»2ÿ∞σ8╥H⌠#.Ü⌡αÅ3ùL!
  78255.  
  78256. ΓH&    &=╖ª<
  78257. ╗╜ë-è-°Ä»┼≤╟╙╨│≈½GF╗ÿ┴ovOY└¥S8■e$}LVyO≈┴BZi*CªGc¡Ñ~║╤D@╝┐▓▐½∞0-╛P.o▄ⁿl>óë├VEà¥{║P÷oò⌡B[ *Σ`▀╤W▄V|⌐@/╩ü╫≤┴═ßùÜç<╗ßGK░tJoèΩs▌▐KΓF ▐FÜ≈(oφ╬~╦GjÇ=¿£áe@Üè╕ó╟3ü╨>∙Θ┐`KPr7è)Γ5v@B╨YÅ|α╠3PI╓çoêVàπ╘½╒o╟╗ò╚¥1ºΩ╠òE*╜e╝}KΩδ)╔`Kαôä¥Ü┌L╕╫╤πE√)≤+≤6╘≥±═HnF
  78258. u╕!
  78259.  
  78260. σA4'1┤¢;&┤åè    ä+Σ╙α▐τìƒ╓┐µ¼W.╒╥éZ}[A╫û~S╫V/o_Ri≤▓
  78261. Ko(H²<Wo▒¿2≤╬V    º╣≈æ±ÅÆ4]ze▌│+ε▐╔M@╒J┤#\è÷töM╝RN1σ(≥┤0ÉMw¡ 5╔ù╟╢╧»aܣŃeO¿■E╢h;åΩ5▀╩S≤:▀Z╚V "b°╦}î¬R█╡╜Wq┐¿╕·σ½µiL¡Θ╜-ceTc5ü·MprND└ìàóXa9 ÷Ä,èV╓σ┬╜εEß╝Ç╪û*!
  78262.  
  78263. σA4'1┤¢;&┤åè    ä+Σ╙α▐τìƒ╓┐µ¼W│┤├zM Æê1QûSAG2JσûK&' nVkª¬"÷█q║╛╣Ö⌐ÅäwL    ~t╙│crí╧ÇM@ÉVÉa½D╣oëAδX[x╜C¬≈}┬}¿L|╨ô╫ ╚∞ΓdôöÉ}ºδR@ΓciÉΩ0╩╙FºG ▐╬÷m=╒╚{├Nk₧∙╙æ(║á∞√τ║¬ P╢π│%OQU*réα<tñ}á{π╜o)E ╞∞EΓXÉ░ïσ╝)╫«ô╪Ö*á±╠9└ 9ⁿr∙ZJε╜3ÇNt┴2ƒÆÿú┌Eö─▄ªG°=┐e⌡╔µδ╠@\AJ2⌡2áπ?lƒ3╓▓r(QfèfτÆ\─1╔╢ΩP>(S={┼äÆ┌Eëτ1@▐ûE££¢₧ 7SA╟░%É~û÷▌╞ ╛╫¢▀ó¢╪E╕]│ç&╡ö┴~íCô`s╗¿▒┬╨:1ûë│Ü∙Z!
  78264.  
  78265. ΣJ29░è5&¿áë9▀φ█∞═≥╥▓┐╫░ä]P¿╛╥;rFÄ¡\éRg Z~tD=╧¿0IxªrFgº╣!!ε╤P@º╣≈ƒ√├\
  78266. ƒqot▀╗b º╠╙ZÉÜa½Q│y²kò^AI,Θa▀╓VÅV4┐/╟ù╬╢╩»a╚ù₧╙ #í≥VHº>J3ì²sé╓Q≤D(╔MäV "b°╦}éKjës±╨îGu┐½╢╝ìl┼₧    @∙ß╝`T Xτ φ't]ôJì8»»L`bx ª╣c+╕╓■°≥d≤èÄ─ö*░±çdÑl$╤òfQQ≈╝J┴y^δ    îêû¥àù┘╞τN±R1⌐[α!!─Ω²╦T%o -ß2¥Γ FÉ ÜI╨
  78267. XkmÇo:═·;≡ Nå╧à>;D
  78268. i╙│╕!
  78269.  
  78270. ─J29░è5&¿áë9▀φ╫µ╚╛╟╧╨░τ¿pB½╛╟taQ▄é1╫OT/`N^HΓäVt?f¡z\╚┬b╩╠K⌐ú▓▐║Å5ü{U.t╥╣-á▄═zIüögºFÑ5┘A±T[7σ$É╪êJq∞#■╥╠⌠╞Ñp£MêëÆl½⌡F╗ sç»!!█▄ZεW*▐╖|₧GÉ∩Jτq[∞ ±π╝W`╖¡∙≥∞Fì·uQÜߪjT\uzπ`è~YJF^⌠W╪Ö¿^c9G ╓Ä!!îò∙╒⌠æ ì╙Φ÷ò+í▐ë Ω "1"êY█ Ff╦ƒO∩'¼Ä䥢╥kÜ┬└ßMµ ┤mεz₧èÆ╢X+"l aτ>üπ8d¥tîZ█@No▄ hƒ■&÷1£Γδ@>(NYW≤╦▀·e2Ñ─sÄ╓g╣║╒ÇAR9~╟ⁿ"C4ƒzû≈╤╓-¡╢²█í!
  78271.  
  78272. ΣJ24Ñ£!!,⌐åè    ä+Σ╙α▐≈╥╠Å■√¿CO║╢┼ugMR±à*WÉPV3InzO╢ôHs/]¬rT0Γ╣%δ╦K¡│öƒπ╩àmy5GD╔╤[∞Φ╬J_É╙{εƒX₧±vz ┐$Ü╨LæGf¡3┴╥╠°î┤{ìM├╕┐O&è»D¡fJzÄπs▌╨R≈N!!╔Q╬│?d■╬k╓G|┼;±╙ì`╗½╕φ∙╝±m1╙ëªqFv"ü≈W$yJ╩┘ì«Kd9P ╙à*àN É∙╘╝╝c²·ò┼ƒ~Θα╞├4 ▓"╝r╛û\ΘI J▐ê₧₧╙Mû╙╦≥G≡11«nµ<╫■▀Ω3bzF$Wÿ6¥≤mrÖ=£Fƒ
  78273. DSvÅre═∩=µJy_╟«πR2.CpêZ╤╘Ö!!╡╩xtñ│    ìÉÄR╫>=Tc╓⌡# /êKó╥ⁿ┴B∞╗Γ÷▀â╬ƒY┤üBY6⌐ù£S┬'╜nc■░ñ╦┴R■ô"τë░D░ⁿ⌡=èA|wê└▓⌠ïZµ╬íïòT┤=@æ«ñ└=╪⌠╣3åï
  78274. ╚╣h!!º±╓▀ÉG°?:╒╛╤O8ï╥∙I¥≥òmpº═sàD]╗╨g_∩)óÖ·╚°U╚8ä└╣Ñß╙Ql╓mO¢N¿ò¬.τï└í│&]¥xG2Æúìz5&çFèüKJ¢ô■w╡äëR╘y╟lkπÖΦÑ>╙arjδ╛ΩRy3╩g=°Bç └¿æ?─╒¬°Éì║╓6â`JΦL~ÇX^8àv╣áƒrq╛JU░|8¥º:A⌠∞±±@ÿSgB"E≥à¥╣-í≈8─ ╗K⌠î╫4éUK'òαöT∞ɬ⌡U┼ΓI½zc&±ÿvc»╨ ▓°z┐ûF╘åW⌐ów«û∩P┘G┐EWkü5╙åDVch╛√τó└_ìnT=█┼g▐─┬~⌠╚'r!!rb±n▀IY▐│∩1º;A
  78275. giα⌐á┤9╧ç2 ╚╤édÖâ┘k╝K▌L,zâ∙+╕u·╡ù≥+≥ñPfc}/┤Σ¡╜Eδⁿû░Üòßσe┐Éàs═t█┬╡∞┤`Φ╬Oφ╫Ä╛─╕:╓÷\┼Ω_Γ hE┐ T^"Eò3█Y─g@?çY9∩ï
  78276. É'òú║½R├u╔éç8┤v0O!!uö≤∙"É;Φ╥%L▒wäi┴Ve@╜Z&═ⁿ4┘7╟~╓X╪╞Ñ@j╜Ñ╗√'╛4ñ%é╖≥HBÜ:╧o¢üδ/╒5▐kOδ^╠QFadαΩ=ú┐ΩS¿·v∩ ⌠µ░'τ¬▌=/ε¡ÿ'·≤v ÇÉ░X╓ε%∙Ål≈    NQ╔&╥î├g▓¼▓5╕∙7▄│α⌐÷Tª!
  78277.  
  78278. ─J24Ñ£!!,⌐åè    ä+Σ╙α▐≈╥╠Å■±î^S│╛═~}\S╓─,Uö^P#jr^{¼┴ ^e'[¬xzg▓º`∙∞G╜╛Ñ¢≤ò\ÑqOgr▀╕- ⌐╩┴MAæ$û/εQ▒~æ⌡U} )ítÅ█WëOWá5╫╚âµ▄Ñ}¥╝ùÇu ├¢>Ærmâ√6₧Æ╬O9├T▀Vτ%d╣Γv╫OM╠>ó╧åW[╡ì∙ΩσºµiY¬¿√J`R]brü ú8tsµ:ìê½\n([╚Ç?¢_╓≥╚°Φiß·ô╚Ö;╝⌡╠üh]fxj╒T╬*Gj╬à) RH°¥Çƒéƒmò├╚┼N⌡#┐x╬5µµ∞┌I{FZu£]·₧D^ÿ:ó╩RKdêed═≈:φe_ß» [47Oj╙Æ┐│-oΘ╪U$è┐n¬╝╗₧>?SA╦⌠-¥ ·æ▒╗gù│ ïï₧┼Lò_«üA(»£êS╚¿ssΘ╗┤é¿U■≤«å═6æ╨▀c├Rw4 ô┌╬Eê¡Zµ╬╘=▒öR╖_)ªº▓╠Σ┘┤t▄╟ZΣ║iªτ╤╧▄B<.úxF¬┌⌐#`▌╔∞^ëτÉ)Q╢╪0    Σ"n·╓fM∙.H∞ä∞í┘L╥'º╡╖┤ê∙UX╬k_▐{╙╤ΣV├╛┬▒æ`&╙K²═╝{εkù╫Cf ¿åδ;╡ä!
  78279.  
  78280. ─J25┤â(«¼ï%ù6Σ╟└╩▌█▐╞¡¿σA@│¿╔3XF╫è+_┤^P#j{≤Å TE'[¬x>╦ΘΦ╫T╝▓≈╙╖µÿ[@zh▀ⁿH<╗─ΘTXÖ5Æp⌐Lñtò╙Wl9≥w╫ùæG`ñ8ô¥┼╢╪¿v╚.░╢╙sñ⌠TPΓwzÆ 6┌ƒ]■;─ZÜ÷.d≡╤}╨ ¬R█╡ΩlFû¥═╥╘Fù╦sH╜π│%c[kâ∩41eJW╞─ÖÄ_N0B_╔╔Bß3k ╦╪╢┴!!├Å¿Θ╨~ºα┼╞{fxj╒╟aK▀±@σcNß!!½¿╖─òï╞└ΦW∙11«bσz₧èÆ╢X+"l aτ>üπ8d¥tîZ█@No▄ hƒ■&÷1ÉΓ╚bYW≤╦▀■q/ñ⌐t┌ò íåÜK╪l1^V╬∙  <¥`·æ!
  78281.  
  78282. ─J2=╡¼3=┐«â8î:≥√Θ∩≥╓╠╞Σ▓╖PO¼▓─;cXS▄æ3qûKM.4C{
  78283. °özg2Fº9α¢2≤╚C¡≈·▐▐┴
  78284. £qfeÜÖc'ú√┼Hköûz╝J│n┐▀]N+⌐-▀╙\êJ{¿@3╒╥╫■╔αPº ▀öæv
  78285. ¡σS░akçδs▄╞≤I*îM▀÷$wⁿ╒6»(¬V╪⌠▒aGåé╠╛▀9╗αd_╕∞╛J'kSX9c#¡ ≈7~]Y╠Γ⌐¡X~/ !!░ΦFΓa ÿ═æƒ╔H└≡┴▀Ö2ªΩ═Eóo^b{8│iΦ24v╟┐|═Jn┼"╘╦╙₧╧Mò├╚┼Cα≤0îY¼Ñò╡w,@/σ"Æ√mvà0£O╙köesÿ≈!!úSe{²ï╦qok█=δ√²L▐Ä6Cë∞Lôô▀N╨:9\Iß±(P√!
  78286.  
  78287. ╞A394,íê=;úìë9åeí╞∞═Ω▐█ò▓±¼W ╖├rwF┴₧Wä\j~HIO
  78288. σés3d▒uEk╢«`╖₧k╛╕╝¢╖█╫S[Ma╬╣j=╝╨Σ\[û^┌Vx½W╛röA≤W0Σ$╝±t▄Mvª?╟╥╘Σ═░cì    ▀Öè<ª⌠VºcröΩ!!É▓5è+FÑwΦ3└M═çG²Qz─<░╨ÅS╢║█ ⌠»√rE¥σí    J,<b    ç▐WDftâW▀ï╡Pip.&│ΦF░S ½░─╢∩hπ┤ä╔┌2║φ╬I├>^n╓òfOP≈ÑTÇAk█5¬│┘╬╧[ü≥└⌡A╜I]╨ú^»èÆ╢FP`]\<²wÇπ)fÉ8ôƒSGpôlt═«u─? xéΓδ@>(NYr╞═╞╦Xφë5ñ·EÖ╒ûI╚-4YD2├ⁿ(nW!
  78289.  
  78290. ╚W4+╖á4
  78291. ╗╜ë-è-Φ╤ⁿû╛┼▄┘¡√í@û╢╨wvES▄É;V═GcK_n≤Å
  78292. \bf]ñR~½»    ≈╬NZΦÑ░¥÷█╛yN .cΦ╣|'º█┼]╒íd╗JñxöAεVL,Φ`¡█H╞f½=╟¢╟─╔▒Γd▌½üu»σR∩ #uöα8█ƒK∩DoσL∙≥>r╓┴[├Vk╟0ú╒åW<·ε⌡√⌠º≡ S┐áª%ez&&=îµ$1XB╚▌Äß[t|WD▀┴=ÄYƒµ╘¬▓ Ä╫δñ≤ç╞·<π1w4-¿x xSóÿzπaZ ▒ç░Å╦M£┘╫∩GτZ]╨êZ■ε÷ΓZa\f"}π4ƒΣ$a▌Y⌡'╢qzKm╗ uâΦ<Σ Xê«αY6zI0s╞█▀▄JàτG▌û ÷«ûIπlei5ê░6>Éx₧ ±▀á÷£▄óΓódòV¥─PX7⌐òü╧jímh╗╜é╦╘*xàƒ(δσÜ=x═┬≥'╛W$úÖUεGÜα#àúÅQ¢╥╬RvBε├╩½@ìµÖ,éÆK
  78293. íº`'½°╘æ╒CA┘/'╘≈ö
  78294. ■Θ┌▄ΓïfPª£=┴
  78295. ~·┌cG°?▀±ô┼ù░_╩╦âä¡█_OR╧eRÜτ⌠╠*|!
  78296.  
  78297. ≤A6<*íï(«¼ï%ù6Σ╟└╩▌█▐╞¡¿σA@│¿╔3%<╗╞\äHA8.Z7 ∙ì\e2F¼r*¡¡`ª∙w)îΘñ▐■╦â}Xgn▌ⁿl>óë├X\É£|½P÷oòΘX] <í,É╪ƒN}⌐(└█â⌠╒αgÇ▀╕╝Qb─ÿTK»puçß'₧╚V≤IoÉ|÷%┌    ?╡çj┴N}╔; ₧ε.┘╟Σ╛ß╗πeN∙ⁿ▀`kdHFc ╬P╛WTAE─0°8«ßWh+sC╙Å;ÄHL√Ü╕½∙mΓ╫δñ≤╗÷─;╩
  78298. ╗sεqL═╖J╠lH \▐ôÉé╠Aƒ╗»Å+Σ5┤~∞─≤±█@hA^8πy■¥D[╛║k╤LGqçtoƒ╗:φ#R▌»╡04Y{─! !
  78299.  
  78300. ICatRegister comment:
  78301. '<ICatRegister> is a wrapper class for the COM interface ''COMCAT.ICatRegister'' generated from type information in the ''OLE Component Categories Library'' library. It contains methods to invoke the member functions exposed by that interface.
  78302.  
  78303. ICatRegister provides methods for registering and unregistering component category information in the Registry. This includes both the human-readable names of categories and the categories implemented/required by a given component or class.
  78304. '!
  78305. !ICatRegister class methodsFor!
  78306.  
  78307. ΓQ506░ΓX@°êé9Æ:≤ö√─√ù╠▄░⌡⌐VW░╡Çr}[B╙è=W╫PBjzSV+≤éPp#]φ>>╧┴I─≈a╝₧╣ÿ°▌â}Q.c╧«7á▌ÇH]Éè?{║Fñ{æ∙ =φb!
  78308.  
  78309. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3}/CC√ê#ì╚╘kMÆÇp╝█∙h╒rN
  78310. Σcû═MÖP4¿:┌£╞┬╔¡cä ï₧■f∞£=)╚    ~ÄΘ^┤╢6πD)┼Q▀0µ#bφ╬w╠.â┤█èW`╢╝█ ⌠»√rU╝≤ΦFGAa=£╩6~=ú~ñxï│^x1FB╬╡6¢_╠░û╝δn÷╛┴ε╗
  78311. É─µ;÷,-=I√'æe6µ┤o╔c^╩Ééçç╨F┴ûå╙L╞7│x⌡6╫─∙╦Af]L.½%ö⌠,qÿ0┼#╡q(+böguÇ■;≈><L═▒╡v>]l╥Z∙τ≡`L╟╕1@▐ûMÜôûI█
  78312. -^C╦ *Y}╥^Æⁿ╤┴⌐¿╥║╩ÿ╪væH¼ºDB!!º¥¥╬9≈aE∩╗╖┴╫6tä└>áï±@áúûCΩ)6Ç╞∙Nì╒.£ó«╩▄`û;J├¡░╬;╒░╖ ┐úA║┘eM«±▐┬¢wQ─9?╔╕═|ê⌡≡xÖßòzVº╬Θ='ô╙dD╔:P²├╡≤╘^╬oá╓æòñ┌TU▄wTIÖ_τ∞╔CLç±Ñ═|╖:Nö^H2ú╜ÆmHSΘE¼Φf\/ £ê⌡3ÿ╔╒∙U
  78313. Ä╨░╫ú╫{I≤╡τRu8äz>xW┬&■q¼│┤;?█╒¥ºSêß─║hPìfXªFY¿AK3\═"ⁿá└l2╜KU╕"rΓ╟W    τ∞≈²▌T~'W7MΣ+╤▀Ü;ë╟wâ·¡~┼σ╘σ9eæë╘0°Ö⌐±^╬╨
  78314. σ.,!!ª╚9S¼τ╛∩M╗É0M┌ç]╝ÆO⌐ä╗^╠s⌠;g░1╬æbD-╛≈⌠»εn■'-aíßx╔┼╓;ù╢z8qE╣;¥4gK∙╦¬í;@Nö═ºóV>!
  78315.  
  78316. Σ\&%4í▐_C╙δ⌐2ä2±╪Ωî±╤ƒ└¡≤óV░╜ÇRPIBαü9[äKA8.Z]oO▀óMO(I¼n^k╢ó/⌠É/j┴Æíƒ√┌
  78317. Æ4Jk ╓╡c7╜ë╧WM╪è[záF÷iƒA°X\4α}▀╩QÖf⌐)▀å╨╕Ä═σg÷ç╙n
  78318. ⌐▒TE╢i;üπ ╫█εO)├╞{ÖDsⁿ└8ÿ.Θ░╚▒As║╜∞√≥F½ßrN╝εªDo/V
  78319. r;èJ╣JpVzyφW├¥öWd-VIö∞EΓHæ░├╜√h≈«ä▀╣?íµ╬▌mK¿u°OpZ±▓{╔}Oσ    É█╙╔∩Gî╙╫πF┤)·Oε?╒∩±╤]%[8≡#û╖9möt£O╦FMqƒ"τÆ6∩,Xê°▓y0Zû█┼∞Jæ÷Yd▐û ╛╒¢R╙!!!!C┴ⁿ%.╙²Æ╩╫    ∞¿⌠▒┬ÿ▀ZÄ{»ºIW7│╚╧╟9ñf&·¬╡╔╩-h═┌/ª£∙P_═╗╔,äIc#òôΦ⌠ïZµ╬┤Zîö∙e_)á¿│Φ'╫ é3ùôC    ∩⌠ q6╕±╓▀█t;-├4-╧≈╟O/╚╥≈Zê∩ôgmñ 2φ);¿╟.Θ:P±└⌠êƒj╚0▒∞╨âá▐H╤aNUƒQπ╕╧AV■ô╔Σ╖<LûI_d·╬δaεaò└Qjóë─6╠δτ4╧òzo¡╨╫Φ~╖3[a≤╢ßT}#Å.uO╞ εi¿▓ä2-êï∩íMÑ⌠╤╢aLJïmGσníP0F╥&α±≈j[╒MY╗8ì╕1kπ▌ ╦┘IyI$DΣxò╪╛┤µ:╠⌠°,┬ñτ.╚vH'⌡φ╗V╝ƒú∙C╪≤6╥&7*√çh°òú⌡]≡δz■Ü[âÆLïæ¬WX─s hpBÇ8 ┼├br`⌐α∞√Θe│*eóëx╦╫¢,£┤A-WW≈~▌@{ç┴Θ0º-
  78320. gNqÅ∞αΩ-Qσ·g>Mφ╤Ür¢H╤√D╗H▌,0{Å╕;┤b╦ó╟╝╜╣?ZC"k?║τ╗8≥ ∞▄É ╡═(ù7ⁿΣu╡û└vα5╠╫╡∞∩!
  78321.  
  78322. ∩A0w_Qµ╗:,·╗ë)Ç6≈╤²î≈─ƒ╘■ß¼]D│╛╘t}┐εS8■aW/b]x∙ö]H)[èqCfºª%⌠╩! !
  78323.  
  78324. !ICatRegister methodsFor!
  78325.  
  78326. πQ.1Ñ¢-¢╗₧+£eí╫ε╪≈╙╠╕╘¢τcQ╢¡┴ovƪ+[¢[+`Reßä g( YK~º╣.√╥c║╢«└╖└^╦Sk)J>╔ⁿk í─ÇM@ÉV■|≥@╣q£ EF6┐$É╪└eAà$b└▐â⌡═┤zî╤╒╤e├¢>XΓrxâ√:┌ƒVºB ═K▀ⁿ?hⁿ╘8▐/⌐<Æ▌ùAs╝╝±√≤F≥⌐ _╕⌠╗%U\c|π`è7rND└ìK╫ßjy.VO╬ö=Ä{ä±╚°≡dΩ╜ò┼└~╢└╚╩8»<∙qRτ┐}πaZ ─┴┤╗÷l╒╗»ÅK┤Hm·:»^»Ä√▐Om\FM2½w¿¡.dà=¢├XSE`çtië╗4≈PeUê▓·CkzIj▀ÉÆ╨\▌úUjⁿ┐ó█≥-╖*WC╓∙ !
  78327.  
  78328. ≤A &,í¥(«¼ï%ù6Σ╟╡î²╓╦╨╣²╖Jj▒╜╧h"?É╢;U₧LP/|Gc
  78329. ╢Æ\e/I¬yW*■¿/÷╥G╝╛╕É⌐Å╫(}!!ZE²ô_ çτµv┘VüV»W│zƒσxA7»&≥┤4÷+h∞;≡ô╫≤╦»aæ$楣<εφ:.╦rXâ√6┘╨M■h!!╩PÜL«mRφ╒m┴V{╥:É╬æEm≤ó²≡τá« _╕⌠╖w_|`=¥J≡*tU┼└ä╡za=P_Ç┴ ¬n'▒▀πü╒O┬ò╧á≡W╝úôTÅTyfxj┐}Φ
  78330. sP≡¿@╬kT FÜÄ╔╬Σÿ╫╤ª^┤7Öj⌡6┬ΦΩ╞3Ho@FH)½wÜ╖=pàn▀M▐ Cp╢arî÷0≈7ê½»lzCY5ûKπ£┤.oôµP,┌ò ÷ºÜ@╫?,UR2├Σ!!2âeÆΦéÆ¡«⌠▒─Ö╥vÆ^»ùE-║ùΓyóC┐eE∩╗╖┴╫&XÖ£#²╚ΓS2Ñφ■.îRiü▄xû!
  78331.  
  78332. ╙A &,í¥(«¼ï%ù6Σ╟╡î²⌠▐┴╗⌡¬AJ║¿ÇitkW╞ü9]àFm$hT    +±óMc!!@▒ezdññMÉ╖0║╛íƒπ╩\S╫]Pak▀ⁿy:½ë≥\O£çgìBóxùεXJp¿$Æ█MöMp∞:ôå╦≤îâ\ÑMÉÖÖy ║▒@Vúp~å»1╟ƒK∩Do▐Z┘·;dδë¿/⌐VÖεªwAƒÜ╕┴▀╝≡c]╡∞≥8bOFc ¡ ≈7~]Y╠à|α╚0JBτ┴:àI æ■╘╝╝mδ┤åìÖ┤≈╠└>O╤òfdδ┐TÇNz╪#╣«í╖÷f╜∙ŪP≤11«nµ<╫■╤╤I k#T│Z∙ÜG ═"û\╦@N#òtdÄ·9∩PeT┌ºⁿB=.
  78333. M>╥╤└▌%í╫yÿ═p╢╗╣hörU:)/╤⌡(}ÿbü·╘█
  78334. Å╗²║ªß!
  78335.  
  78336. ≤A &,í¥(«¼ï%ù&╗ö∞═Ω▐█ò║≈╢PQ╢½╘r|F ÆÇ;Aö2.C,iVlσòK&'░u]m««`∙▀V»╕Ñç╖╪
  78337. ƒ4Jk å¢XèùîKöÜ9εñxæ²SC ⌡vû╨^┬p⌐?┴¢╙Γ┼»}─M¢₧ÇCε£=-ño;ûτ6₧█Zß@:└KÜⁿ.`⌡┬6Ç/¡U╪╧åHr≤╝²∙Θ╝±r╕⌠╖w_Ke3ÜτW4t\S█▌â«W7|GI╔éoçUùⁿ╘Γ╝Mδ╣Ç┴ƒ~á≡╠δ1
  78338. ¿!
  78339.  
  78340. ≤A &,í¥(«¼ï%ù&╗ö∞═Ω▐█ò║≈╢PQ╢½╘r|F ÆÇ;AöH%mZ_nU╢ìZg*J╬:(É«'≤═V║≈╢▐Σ╞¢qot▀╗b ╖ë╫P\¥VçpεæH╣%ó
  78341. 9⌡m¢Æ└Pq¡=╤₧╞┼╪▓zå
  78342. ┴█ùy¡π^T╢iu╬»7█╠\½Bª6█≈m=╒╚{├Nk₧∙╙æ(║á∞√τ║¬ P╢π│%OQB*réα<tñ}á{π╜n=W ╞∞EΓYé░ïσ╝B┼ÄñΩ╡ î╩τ/αE9M╤ò uKó▄⌐Xφùà╔╬▄IÅ▀┴╜/₧{Y╛n≥0╫εΦ╦IgFM8Γ4╚ÜG °8ÉM▐D#èocî≈0¡gO5█ºπQ\P#pL╙╫┴═AúΓH/░≡[ûÉî₧}U:)x╨≈)ökÿΘ┴√¬╡½÷╚è▀2÷!
  78343.  
  78344. ╙A &,í¥%╗║ƒê/φ≈ε╪√╨╨╟╖≈╢    ¡╕╠hzL╤º?FÆXK8g^@1O⌡óMc!!@▒uVyΓ╣'∙▀V    ¼φ≈î≡╠
  78345. ₧p3j"Ω«d$»▌┼╒?¥zÑF÷iÿ╝cJ1≥pÜ╠zÉCg┐)1├₧α≈╪Ñtçû₧Ç4FεⁿRP¬o;ìΘs╩╫Zºbß╒∙(bφço╨C~╨:╡£ü]4ºª²╛≥½±iJ╝≥ⁿgh,<bN½9╓;1po┌╔ï¡U-FK╙Æ;ÄH!!ܱ┬½╒l⌠╢ó╠Ä;▓∞█╩fxj╒╟zbóû\ΘI¼¥ìÇç█÷╝¼Å+╧>ç+⌠=╓ε ╤B)C    G:▒4░÷9`û;ìG┌ /    ∩        ╢≥;▐JißåÑ#=Ij▀ùë┤.o┬Ä6G▌ûë£ìS╦-4S╞≤%1╦,ƒΘ▌┴á«▒αï¼■v╕αÇRY6ñ╥¿&Γτ< rÆÇú╦╔91₧ö:ªä∙P2Ñ⌡≈DΘ!
  78346.  
  78347. ╙A &,í¥%╗║ƒÇ.┬╒√╔∙╪═▄╗ß Q╝╖╙rwU±à*WÉPV#kH    + ╒Ç
  78348. \a)]¬y@*░¼#√╩K≥≈ÑÖ⌠╬ô4i,P╚╡{3║╠Ç╝à~½óuòA╬TH+⌡aì²U¥Qg₧-≡ô╫≤╦»aüî╙┌<½σ_Kª }┬√;█ƒ|╚lo├]╨≡9!!ε╒y╥Rk─│┼├P|╢εΩ√πíΓeN≈ì╪gh /}9C╗&╫WN\D═╠åßkh;J_╬ä=¿Vàππ╜φBσ«ä╩ò,╝µ┌Aóo^b{8╡r┴OSj╦ò#ÇXαùà▀π╡!!≥┐■∩L╔R%┤xΦ4╦ΓⁿƒIgHFJ≡#û≡"wÿ1î▓r(+
  78349. ╜in░╗╓#ê░ΦT0.C7ìw┤╗¢)lφë5ví÷[ïÇ₧K₧?,TC╬ⁿ~C5âiäε╘╞N⌠·╓âΓ»üÿO»ûAò╗½YòG╟ X ■▓╢Ä╠1gûû%ú½±X╔ô!
  78350.  
  78351. ≤A &,í¥&ÖÑì9ûeí╞∞└φ▐█ò╜≤▒VD░⌐╔~`╤à*[ôL)@an Æ
  78352. \tf[½yIìå`∙╤Oº╣▓ÉπÅ â|\MLΘòIlΓë╥ZDåùZ5»P÷|₧A⌡\_=∞aæ╩VÄ{¬@(█ù«£Ñúr£ÿöüu
  78353. ╜▒[M▒t┬µ=₧╦WΓs╧P╓÷.u≡╚v£a╞φ√╢mPφ╜┤╛π╝²dO≈ó▀`o/IKt5ì ≈41S=ú~▀ëáMd8ç┴<ÄV╓≥─▒≡e╟╗òΣ₧º±╚òE4
  78354. 
  78355. ╕o▓b6±┤e╞1ào¼äöç╠\₧─µΩCτ╖{φ─≤²╪T`J}π4ƒΣ$aⁿ^÷'▄;@Vfüorä■&╣J7[╦ú√^5zYd╙w┤╗░VâΓH#│Ñ    ìÆ£F╩%<=*!
  78356.  
  78357. ≤A &,í¥&ÖÑì9ûeí╞∞└φ▐█ò╜≤▒VD░⌐┘!!3KW╞ì:?²6k\Zx≤ô^Mn#ÇS~*íñ-Ω╤Lªú≈ë■█^╦Wr3GDä≡- ¡┼╙PL┘VÆ5»M÷t¥≡TB 6⌡kì₧VÜ`ñQ╣√└≈╪Ñtçå█Üx
  78358. áσ^B½e;Ç÷s╩╫Zº∙v■H┐mb°╙q╞ ,¡U▄╢ΩWq┐¿òöëoܱgU¬⌠╖!!iGFO?₧└$tH_█╚╨ßKn0PE▐∞EΓ3╡±┼╜√n÷│ä▐└~ΣÄú`ª0╡xªOw^÷╕m¡!
  78359.  
  78360. ≤A &,í¥&ÖÑì9ûeí╞∞└φ▐█ò¼≈┤FJ¡╛─Xr\S╒ï,[ÆLjmZGb σ∞t0$Jñu@~º╣`ε╓G@ïÿÜ▐⌠└ÿz[z ═╡y:εòπu{╝2═Z5╝@║nÖ░Nx≤aÄ╦PÄKz½@(█ù⢪╔pëÜ££n½ΓH½s~å»:╨ƒK∩DoÉ\╒ (bφ╬w╠.╧9±Çñq]ù≡δ▓á⌐αiX¬¼≥ jKr!!╬    ∩5[CçUá{τ╦0q|QK┘Ç;é^Bè¥╗╤εfτ╗ò─₧~∩╛ë╩    1K╡p°,uK╦╡H╥Z⌡\▐éÆÜ╓Lêÿ¿î+τ<╝ïZ¼╒²╪U}Jj1≡$Ç┼(t▓5ïK╪SKfò: ƒ°9≡!!1ó╦åT;^y┘╫╫╩FÆΣ_+ú÷M▀åû]█AR9)┼≤%4ò6╫Θ▀╤╕│⌡█í!
  78361.  
  78362. ≤A1>=çÄ&,╜ª₧#Ç,╗ö∞═Ω▐█╞╙ÿ╠q║¡╧pvB┌ü~@ÆXM9zIR∙Åi ╖tV*╢ú%║▌C¡░╕î■╩^₧p[zi▄╡h6ε╦┘\¥╙{╟╡r£∙R[7∩:▀╤_▄SÖ)ìüÅ╢╧ígü    î╒╤e├¢>XΓrxâ√:┌ƒCè+F▐X┘τ$e╣¥%éQk╠9±▐ûMx╖ì∙Ω╔ëµr]á║≥    qOQ(_Σc≡<w":á~°╕ñ^d/WI╚ó.ƒ_ÖΓ╪╜∩;ñ¿å╬¢*╝τë╞2fxj╒n√ uKδ╡3Ç\∩èêùπ╡!
  78363.  
  78364. ≤A1>=çÄ&,╜ª₧3▀Γ╒√┼·║╡╝ⁿ╟½AF╕▓╙ovZ╞î;ö^P/iTArO àWr/I¬yW*á▓`ε╓G@⌠Éé╖╙æP^öuJ    j.ÿ╤_─á╙\Dô{∙¢Mäxù∩EJαpÜ┘VÄKq┐Z|é ⌐ƒÑ▓tï ïÆù&O¡≡CMª`!
  78365.  
  78366. ≤A1>=çÇ%╗║ƒp┼-Γ╪ⁿ┼·ù▄╘¬≈ó\Q╢╛╙!!3KW╞ì:A·5-h\^^d≤┴
  78367. Qcf]ª{Zy╢╣!!ε╫MΦ╕▒▐π╟^â|[@MO≈ⁿn=ú┘╧WM¢╙|║K÷!!│-╧xkWtív£╥JòF8∞mV║ö╤∙┴αgÇ▀ÿÆh
  78368. ⌐■EMºsJwïⁿ'██εOo╪W▀V».n⌡╦}┴Vg╧1∩£îB4∩ë═╫─X╗╕ _╕⌠╗+8a Xτú7rND└ìτ╦0;@M╬ê+╦_╓π╘┤·!!µ»ê┴₧┤≈αε%
  78369. Yⁿ²}[± ¬HΘ
  78370. ÿ∞∙τ╢}òΣ└ßKτ5¿Hφ2╓⌠╤╥
  78371. JJNL:■%Ü≥>?╤&£B╠E/    ∩    c«·!!µ*N┴ºⁿq(M┬┌Æ╩MàÄ6C▐φN£öïN┌vxBG├Σ-P√!
  78372.  
  78373. ≤A1>=çÇ%╗║ƒp┼-Γ╪ⁿ┼·ù▄╘¬≈ó\QªßÇxr\_╓ΘT;╒mA<aPV+■ä^Kc!!F░hAk╢ó/⌠₧MΦú┐¢╖█╫Wq-.c╒▒}=á╠╬Méç5≥`ÜN╣%óφwû┌▄/┼.▄ƒâΓ─Ñ3ï ï₧ös╖▒@M╢hJ'Ñ┌·üºB.╪V▐X▒@ ö¡╤Gb╞R█╡Ωqzü½ ≈≤¡µCP╕≤í#uJv
  78374. r7ë±5b█┴âÑ4U*O∙Ç;Ä]ä∙╘½ª!!╡╫δñ≤,▓α╚╞mK¿u°b!
  78375.  
  78376. ≤A1>=çÇ%╗║ƒp┼-Γ╪ⁿ┼·ù═╨»τ¼AF╗ÿ┴ovOY└ì;A═G+zRWxb£Φ\kc0@¿y~¬«`Φ█E    ╗úуπ╞ä4Q.t╥╣-1»▌┼^Gçû5óJÑiò╝XAI,Θa▀éZôNx⌐(┌¥═¿î»u╚Q╕«║XQ╜╜)╚        zûµ7═ôßS ┴╬÷mm≡╘léAo╘:╢╙æMqáε∞÷ßΦ≈o_╡ßíBrOA&n¡&╨>/█┴âÑ-9[\▀é;ÿ7h  ╫°⌡u≈·é┴ô;╗≈┌Gìh]fxjá<εw^÷╕mÇq6åoîåÉÅ╦Aƒûƒ╗τ<╝+π&╠δⁿⁿR@K'[/≡.╔╖.dà=¢]æu++pâlfαæ\è?+n═ѵD%?X:r╫    ═α▄U%ü≈Y-╕φ@Üå┼╠/4CI»ÜMj>▓mâ■▀▌Ñ┐Γ∞ïÖ╠\¥L⌐ÇE-║ùΓyóC┐ee∩╖┤öà-vö¢8«î¥>!
  78377.  
  78378. ╘J21╖¢7;Ö¿ÿ/é0≤▌Ω▀ñù▄÷┐µáTL¡▓┼h3ZQ╤à*[ô8iXR≥∞t0$]¬jR~ºδm║≈Lº╝▓▐π╟^ózlii╔¿h ì╚╘\OÜÜfµ
  78379. ÷pò⌠^KI7τ$ï╓\▄a[ü@3╤ÿ╞⌡╪αdÜ ÅïûxO¼ΦP¬eJiç∞6╫╔Z⌡Bª2░ÜS▄⌠Mεv. ó╚çGu┐ó╕╦ε4¡≤iO¡σá)qCRt;ï½zZ&9≥├,╩┤W~5DB▀àoçU æ░╥¢²uß╜Ä▀ô;ª»ñcªl^0ü<█:]{¿±{╟nZ°Ü╚╚π╡!!┘╗»ï(¥N&│y⌡&─δ╕╠BjN
  78380. Eg▒?ü≥>p¥ ▀ƒVMqé G╕╥⌐TH6í£ⁿR=<
  78381. p└╥█▌gî∩1@!
  78382.  
  78383. ╘J21╖¢7;ÖÑì9û∞─π∩ ├┌╥▒α¼VPσ√╥x[_╓─=qûKA-aIZn¼┴zg2JñsAcº╕`Φ┘A╝╛│─╖▌û`W
  78384. │■] º▀┴MM╒[╙?{╕L╜x╨⌠T<6╙aÿ╫JêGfÅ =└üΩ√▄¼PëÜ££n½ΓΓmoèα7₧╨YºU'╔∙9▐mn√═}┴V.╫-░╠ôAp≤¼ß╛⌠¡┤rY║σ╗w8a Xτc╦%Bz|²W≥.Ö╡]n=O@Ü┤!!╣_ƒπ┼╜εBΦ╗Æ▐│3Ñ∩Ω█0
  78385. ╣o┤b6ï╪R╔cf¼!!½¿╖─ƒZÿ┌╓∩F╕Z╙ê╠Θ┼ƒHzFG8⌡wƒ°#b╤7╝O╦FMqÅes┴û_ècLg┴¼╥c=4û┘╤╪Pä¬G▌û ≥ ≥-╖p.YR╫±(C.àhö·╘▐T∞▓π│╪₧╟K▄αúpΩ╥ï─8⌐"A-╥Ü·É¿U⌐ë)½Ä░]▓°≈ çcq;Ω╣!
  78386.  
  78387. ╘J21╖¢7;ÖÑì9ûΣ┼╠═Ω╥╪┌¼√á@ ⌐├w`ARÆçSâZC%|RVxU╢é=Xr#H¼nZo▒δ2²▌Cí│φ▐σ╚â}Zm    ÿî;╕╚╘\╪V║cíH│=ä    ∙z
  78388. Σcû═MÖPWá/└á╞τ∩ígì
  78389. ÉëÜyµ╕Iºttå»<╪ƒK∩Do∩p≈Vⁿ/kⁿ─léU|┴/í┘çv¬ε∞÷σF║±cY░÷╖L,8a[ª8╞$]{÷(▐ÄóXa0y╘│*îSé⌡├¢≡`≈⌐│╚ï┤≈╠└>K╤òfdδ┐TÇJn┼"╘┴üì╙[Æ╥ëï(¥{Yüb∩à≥÷╠AgJ    1■9ö╖.FÉ ÜI╨
  78390. HGp╩
  78391. ΣÆ\╪+aêà┌~p
  78392. y╒╩█▌]φë5h┌ò$⌡ⁿ├Q╫>,EAéπ0>É`¢íÿ┌⌐⌐Σ║▀╦Æ╗mëá ╖¥¥ïÿKBRÑ╙┌º√,t¢£l«åµU¡²╪(ÅL]! !
  78393.  
  78394. IClassFactory comment:
  78395. '<IClassFactory> is a wrapper class for the custom interface ''UNKNWN.IClassFactory'' from type information in the ''IUnknown Type Library'' library. It contains methods to invoke the member functions exposed by that interface.
  78396.  
  78397. The type library contains no documentation for this interface.
  78398.  
  78399. WARNING: This comment was automatically generated from the interface''s type information and any changes made here may be overwritten the next time this wrapper class is so generated.'!
  78400. !IClassFactory class methodsFor!
  78401.  
  78402. ctxAll
  78403.     "Answer the flags to be used to specify instance creation from any source.
  78404.     N.B. This varies depending on whether the operating system supports remote
  78405.     servers, and so is not strictly a constant (thanks guys)."
  78406.  
  78407.     ^self ctxServer | CLSCTX_INPROC_HANDLER!
  78408.  
  78409. ctxServer
  78410.     "Answer the flags to be used to specify instance creation from any type of server.
  78411.     N.B. This varies depending on whether the operating system supports remote
  78412.     servers, and so is not strictly a constant (thanks guys)."
  78413.  
  78414.     ^CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER |
  78415.         (OLELibrary default supportsDCOM ifTrue: [CLSCTX_REMOTE_SERVER] ifFalse: [0])!
  78416.  
  78417. defineFunctions
  78418.     "Declare the virtual function table for the COM interface 'UNKNWN.IClassFactory'
  78419.         IClassFactory defineTemplate
  78420.     "
  78421.  
  78422.     self
  78423.         defineFunction: #CreateInstance:riid:ppvObject:
  78424.             returnType: 'sdword'
  78425.             argumentTypes: 'IUnknown* GUID* IUnknown**';
  78426.         defineFunction: #LockServer:
  78427.             argumentTypes: 'bool'!
  78428.  
  78429. onCLSID: aCLSID hostName: aString 
  78430.     "Answer an <IClassFactory> for the COM object with the specified <CLSID> on the named
  78431.     remote host. If the host name is nil, or empty, then the component is assumed to be on the
  78432.     local machine."
  78433.  
  78434.     | pFactory pServerInfo dwClsContext |
  78435.     dwClsContext := self createContextFlags.
  78436.     (aString notNil and: [aString notEmpty]) 
  78437.         ifTrue: 
  78438.             [pServerInfo := COSERVERINFO new.
  78439.             pServerInfo hostName: aString.
  78440.             dwClsContext := dwClsContext bitOr: CLSCTX_REMOTE_SERVER].
  78441.     pFactory := self newPointer.
  78442.     OLELibrary default 
  78443.         coGetClassObject: aCLSID
  78444.         dwClsContext: dwClsContext
  78445.         pServerInfo: pServerInfo
  78446.         riid: pFactory iid
  78447.         ppv: pFactory.
  78448.     ^pFactory! !
  78449.  
  78450. !IClassFactory methodsFor!
  78451.  
  78452. createInstance: pUnkOuter iid: iid
  78453.     "Create and a new instance of the class represented by the receiver, aggregating
  78454.     it with the object whose <IUnknown> is specified by the argument, pUnkOuter, and
  78455.     answering an instance of the interface class identified by the <IID>, iid.
  78456.     If aggregation is not required, then pUnkOuter can be nil."
  78457.  
  78458.     | ifClass answer hr |
  78459.     ifClass := COMInterface classForIID: iid.
  78460.     answer := ifClass newPointer.
  78461.     hr := self CreateInstance: pUnkOuter riid: iid ppvObject: answer.
  78462.     ^hr < 0 
  78463.         ifTrue: [HRESULTError signalWith: hr]
  78464.         ifFalse: [answer]!
  78465.  
  78466. CreateInstance: pUnkOuter riid: riid ppvObject: ppvObject
  78467.     "Invoke the CreateInstance() method of the object wrapped by the receiver.
  78468.     
  78469.         HRESULT __stdcall CreateInstance(
  78470.             [in] IUnknown* pUnkOuter,
  78471.             [in] GUID* riid,
  78472.             [out] IUnknown** ppvObject);
  78473.  
  78474.     "
  78475.  
  78476.     <virtual stdcall: sdword 4 IUnknown* GUID* IUnknown**>
  78477.     ^self invalidCall!
  78478.  
  78479. LockServer: fLock
  78480.     "Invoke the LockServer() method of the object wrapped by the receiver.
  78481.     
  78482.         HRESULT __stdcall LockServer(
  78483.             [in] long fLock);
  78484.  
  78485.     "
  78486.  
  78487.     <virtual stdcall: hresult 5 sdword>
  78488.     ^self invalidCall! !
  78489.  
  78490. IConnectionPoint comment:
  78491. '<IConnectionPoint> is a wrapper class for the custom interface ''OBJIDL.IConnectionPoint'' generated from type information in the ''ObjIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  78492.  
  78493. The type library contains no documentation for this interface.
  78494.  
  78495. WARNING: This comment was automatically generated from the interface''s type information and any changes made here may be overwritten the next time this wrapper class is so generated.'!
  78496. !IConnectionPoint class methodsFor!
  78497.  
  78498. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q"DI■É#ì╞╬WMûÜ{₧L┐säFæ;&`┬kæ╨\ƒV}ú ▄¢═ΓîñvÄæ₧ºy╛²VPº`└éY│╡6⌠D#╩2░Ü)d ╬v╟d{╬<Ñ╒îJ.≤φ▀√⌠%º·nY║⌠╗ LHAt4Å    µM]&9á▀ƒ¼\c(wU╩ä<╤E▒┼°£╢&┐╫δñ≤:░σ└╩#"╡s≥U4┼┤}πbUΓ¥òÜü╤xö▀╦≥a√$╗b∩6╫╜ò╡s/NN(ⁿ2¥π|ü1îƒ_halêneÄ∩<∞S┴¼√t>4^w╪╠ÿô]φë5C│·Oû¢Üa╦";DI╠¬d@òz₧Φ▌ê¿¡╥╣─Ç┬Z╞5╩φ,?%▓òÜ╬$╣V■¡ΩÄéDÖæ"¿ƒ■Qáε⌠;ç
  78499. 7l`φ║|°EƒΦ9ëü¿ZëÅN¼6E@└£⌐└-╟∙â;╠Ω oê▌v#┐∙▌┼ü-HT╧)qÇ≡╟]3┘─╣±î⌡Fº┌:φ!!┤▌`Aσ5╕çƒ∩╚V■:¡√òé╡╘HOâ    d2≈5τΩ╟R∩ò╪É ª-ZX┘oÖ▒ÅK½aì╚M|E┴└è]! !
  78500.  
  78501. !IConnectionPoint methodsFor!
  78502.  
  78503. α@1&=■╧1%│¼é>ΦUêû╠├≡┘┌╓¬▓ñ@│▓┼ug[╤ï0\Æ\P#aU{ Å
  78504. e'C»~Ri⌐δ)⌠╩G«╢┤¢╖ç ₧wV@gsÜ⌐~'»┼╠@öVùf╛J╕iò·PL qî÷╩V▄V|⌐@.╓æ╞ ┌Ña╞M½ôû< ó°RJ╢ rÄπs╠┌\ΓH9╔█Ωmd∩┬v╓Q.╙:┐╚├P|ííφ∙ΦF╝ⁿe½σ▒ sCGKs<Ü∩W]&T└╬ä»\n(FHÜû&ƒRB╒σ▀╣°wφ⌐äâ╪S▀Äú`╙E4╡y╝5ï▓f╧fRΘF─▄╙¬Φg⌐≥àΦGπ\]╨≥6╔ß╕■P`\}≥;Ü≥#q╤$¢YⁿNIjâ: Ä⌠:Φ Ñ╚åi25Ew╙Z▀┴≡JàΣY8!
  78505.  
  78506. └@1&=■╧"┤ó┐#ï4í─δ█▌╪╨▐╖≈ S╗¼πt|C_╫ΘT;╒oV#xZGnO╗┴7Wp)Dª<Gbºδ■╚K¡ ■▐·╩ÿph ╬┤hrìµφGùûaεTñ|Ç∙U !!ípù█ÄGw⌐    *╓Ç좪═ßd╖⌐╢O:é┼{¥süε?╥ƒ~πW&▀ZÆ{ÖDÉⁿq╠.Θ
  78507. ┐╫ìKc╜Σ╕ε╒ú╟iR▓¼▀`k /ns&│J÷#xH^╠ìà»^'|SH═ó äQ ô╣è╒ûª╫δá≡WΘ⌡└█6R¿x xS╕±a╥hH∙
  78508. è┴┼╬÷}ò▌╦ΘU·Xp╛|ε!!┴¡ª▓p/W\E;▒>¥ß,iÿ0╝O╙,(!
  78509.  
  78510. ΓK)0;░å='ôÇ¿G∩Vú⌡ß▀Θ╥═ò¬·ájûƒÇtuB┌ü~@Æ\A#x^A,╢éWh#L╖u\dΓ╗/≤╨V║≈╛Éπ╩ûw[N,░╤[▓ë┴W[éüVi├)▀|₧δT]Ib╝$╢≈}▄Lq╗NQ╣√╨≤└ª3»ï╕£r½≥CM¡n#uûΩ!!╪▐\Γo═Q╔÷?/ö¡ⁿC`╙(┤╬ε.!
  78511.  
  78512. ΓK)0;░å='⌐─µC╟∩╟°╔∞ù▐ò╜²⌐_F╝»╔t}Y╘─*ZÆ    Au}N,┬Ñ?mGx░hAí┐5Φ█Q@¼▓ñ¥σ╞Ös3jt╥╣-!!º╟╦JûüpáW║d╨ΦEN
  78513. 0Σ`▀╩V▄V|⌐@.╓æ╞ ┌Ña╞O≥±■fÉ▐{açnvç²2╩╨MºN!!σz╘■w!!Ω┬t─k╬*╝ îJz╢¡∞≈∩╗!
  78514.  
  78515. ΣJ27¬ü7*«áâ$ûRï╜¡φ≡─╚╨¼▓▒[F τΘ^}][±ï0\Æ\P#aU@5OΣäLj2¼zc¼╜/±╫LΦú┐¢╖∞33╫[\
  78516. kc╬√~rï╟╒TkÜ¥v║J╣sâI╡B ,Θk¢É±(╞i ôô═σ█Ña╚≥±·}╜µRVΓ:W;½╩=╦╥|ΦO!!╔\╬ⁿ#r╣╔}╒ra╔1Ñ┘æ
  78517. ┘╟δ√∞┼₧    5£εº!!jH[e&çφj1N^┌╚─╠3BB╔û*Öà▀╙▓∙b≡╫δ!
  78518.  
  78519. ─J27¬ü7*«áâ$ûeí─ ╔≡┬╥╕╘¢τcQ╢¡┴ovÆ¡0DÿTAjzSV+*°özi(AªGc¡Ñ3▓ù¡ú┐æ≤Å╫`V.C⌡æ-=¼├┼Z\╒üe╛F▓=Æ╝EG x≤a£█PèGfΓmV╛°¬ƒΣÆV╗8│»╙C0╜σSGúl;ºß&╙ⁿPΘO*╧K╙²>)ö¡½+U╧*Ñß├mQ╜╗⌡▌∩ª±cH░∩╝H/Ec<¢¬L]&ñ}á{π²Od.WY█ìoÿNò±▌┤ª!!∞¿ä▐Å2íúæIµ 9 │r≥
  78520. wKδ╛g╙'▓k⌠Φ¡¥┌D¥û╠ΦT⌡9╛Hα?╔èÆ!
  78521.  
  78522. µA39:6¬è1=│ªéï+Σ╞Θ═²╥▓┐╫░ä]P¿╛╥;g@SÆ╪g╛{j|^@~Γ┴_&/A╡sXc¼¼`ε╓G@ïÿÜ▐╪═ö`.G▀¿N=á╟┼Z\£¥?{║Fñ{æ∙I5Σpù╤]╥╞mV║Äâ≈┬│dì▀ç■f» DSºrJ!!▀»δ÷{ºO*█╖|Ü>d⌡┴¿+τ:Ñ îJz╢¡∞≈∩ü·tY½µ│    ?Tu%ï¡zZqQ╟┌ÿßX~AF▀é;µ0!
  78523.  
  78524. ╞A39:6¬è1=│ªéï+Σ╞Θ═²╥àò«█îw.╒╥éKaA@╙É;┌m$xTXnOΓëA#[Çs]dº¿4≤╤L)ªú▓î±╬▀=kt╥│irí╧ÇM@ÉV░9XεL┤wòΦX±tÜ┌₧[4╕9ôÇ╞⌡╔⌐eì╤÷∙e╟ÿvçS?W╢» ß╠KπB.└SÜ1÷9B÷╔v╟Az╔0┐⌡ìPqí¿∙²σN┼₧    5╨█╜Xr>O─J≤>U ñ}ñSτ╦4UZ╙ô;₧[╓π┼╝ `Φ╢█ìÆ,░≡▄█EcK56òX╢Q5ïÅz┼a]¼ÉùÆé╓L╕╫╔Ω/₧!
  78525.  
  78526. µA39:6¬è1=│ªéè6∩└╠├≡├▐▄░≈╖>)╓∙ßu`_S└─*ZÆMT]e
  78527. ⌡òVh@¬rGI¡Ñ4√╫L║Θ≈î≥▄    â4Q.i╘¬b9º╟╟\¥╙5ZâÖÜ Ex╞aï²VÆLq»5▄£≤∙┼«g½æÅÆu½πΓmoèα7É¥2ì,EÑCܲ>vⁿ╒8▐/⌐>┐╧öAf≤⌠Ñ╛╔%º·nY║⌠╗ UI\rü≈9JBë╚║«Pc(F^ö∞EΓIÜ÷╝╥ò├┐òεò0╗µ╩╞
  78528. 9;
  78529. ▓h▀zKπ╕g┼¼ÉÆäï═÷╝¼╪C·'┐yí2╓╚·╒E}"l!
  78530.  
  78531. ╞A39:6¬è1=│ªéè6∩└╠├≡├▐▄░≈╖    »½πKP%<╗╞@₧IE>k+&°ùRcf[½yMº┐⌡╨L½ú╛æ∙ Ö`}`t█╡c7╝üëEÉ¢qεL░=ä    ∙l&ík¥╘\ƒV4╗=├é╞≥îój╚ù₧╙n
  78532. ¡⌠^RºrDΦéY╖╢w╒d∙sεV╠rφ├{├NbÇ┤╚áKz╜½√ΩΘ    ª─oU╖⌠æ qG\c ╞gë~Yt_▄≡QúéVc2FO╬ê àjƒ■┼¢≤o≡╗ê├ƒ, ⌐ë▀&([X╤òM5Å█£{R■ïǃ╬╠\ƒ╒─ΩN«R8¿n≥&╔≤╕èZoJ@G8≥#Ü°#U₧=æZⁿOVbÅneƒ▒╜gO5÷▒Ω[7zCh╫╫╓·E
  78533. îÄ6!
  78534.  
  78535. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR╗╛╓~GF╫û~TàVA$jWJ+≤Ö
  78536. Lg*▒yCxº╕%⌠╩Cí╕╣▐°╔\
  78537. ƒqkc▀╡{7╝ë╘Vö%çp»N°?²kæ;& ⌡vÜ▀T▄/┼i>╥ü╩⌡ⁿ▓zå┼█Çy¿¬:.╦    ~Ü√╦╦ºgù2░Ü=s≡╔lÿ&╙:╜┌├Mg¥╗⌠≥á«└rI╝║≥1EKsy'!!╬σ11}\UôW÷Å¡_-?LB╘ä,ƒSÿ┘°£┴(┐╫δñ≤0░√▌9┌mKVJ!
  78538.  
  78539. ⌠J&#1╖èhi╛╛»%è4Φ╤»íö╛¥ⁿ░Σ¬XF »╚~3}X╙Ç([äZ c.VV∙à^V`f[½yIìå`╒▄H½ú∙▄ÜÑqt■g[ h░╒á╚─OAå╔Vq╣`╣r¢∙<%!
  78540.  
  78541. ╘J&#1╖èhi╛╛»%è4Φ╤éªùò∩╟╖ΣñGF ÷ÇR}^Y┘ü~FƒZ`ZW}σäV&+J╖t\nΓñ&║╩JΦöÿ│╖└ÆwJ@yr█¼}7¬ë┬@üûVg½@│tåε"cUï÷÷k╣qAÇ4|∞¡╨Γ╚úrä▀«¥} ╕°DAΩ`δå╫╤bºT!!▀V▌÷)!!⌡╚v┼j╫╛╙êMq·⌡òöìl┴▌mL╡σ┐ qGAi<╬$∞5+g╠W▀ï¡Ut|GC╘╞;╦Yä⌡æ╣■n±«┴╚ê,║±┌I╟%^C»s╝q≈ólÇlU¼Üû££█ë╙╤≤P·R$ú{Σ^»ÄΩ▐Nl]F]5≡9╙π%`╤5èZ╨UDZ`âptä⌠;ú$U█½ßPq2Xm├╩£░)lΘí1@┌ò ├âûU╩99\╓⌠'1¥6╫Φ▄┼╛╛▒ßïÅ▄PÄ\■Θ/?│ùâï#útg≥║ô╧╔3²! !
  78542.  
  78543. IConnectionPointContainer comment:
  78544. '<IConnectionPointContainer> is a wrapper class for the custom interface ''OBJIDL.IConnectionPointContainer'' generated from type information in the ''ObjIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  78545.  
  78546. The type library contains no documentation for this interface.
  78547.  
  78548. WARNING: This comment was automatically generated from the interface''s type information and any changes made here may be overwritten the next time this wrapper class is so generated.'!
  78549. !IConnectionPointContainer class methodsFor!
  78550.  
  78551. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q"DI■É#ì╞╬WMûÜ{₧L┐sä"≤_[1∩aìÖ4÷+à#3▌£╞⌡╪⌐|å=ÉÆ¥h,í CE½ni┬δ6╪╓QΓu*┴O╓τ( ô«:»(¬Vó┘ÅB┘╟æ·σí·ez¼ε▒ jHK%Çε4?AU╩─äæVd2W_Ç∞EΓ3kùΓ╓¡±dΩ«╡╘è;ª╣ëNµ 9 │r≥
  78552. wKδ╛g≡bRΓì╦┘╔ä%±┐¼ΓG≥>┐M⌠=╞≤±╨)  @3⌡£∙#`Æ ûA╤(NKmÆ:p¥╪╣gO5í╦εE6/Gp┬.╟┬▄W\└ñ{₧█▀╝╝H╨"=ST═■ 4ƒx▌▒ƒ┐d! !
  78553.  
  78554. !IConnectionPointContainer methodsFor!
  78555.  
  78556. ΓK)0;░å='ôÇ¿9ΦUêû╬┬φ└┌╟■≤σPL│╖┼xgAY▄─1T╫KL/.rzO╢Är.JπsF~Ññ)⌠┘    ªú▓î±╬ä4Igc╥ⁿn3áë┬\çöf║FñxöAδX[UïÜ▀Zö{¬@(█ùâ⌡├«}ìïÆ£rO╛■^J╢sJrî»'╓┌⌡D,╔V╠ßa!!≡ë}îz╚:ó┘├Ef╢ε÷±⌠F╝ⁿeÉ╔ûBj@n7╬    ∞>tLD└├|α╚Ib5MX╔┴;â_à⌡▌«∙r¿·â╪Ä~║σë╟w╣n·wZ±±~╚dXΣFì룢╙L█╘└ªR⌡#┐oí'╩ºò╡soJ@G8≥#Ü°#U₧=æZüF@FuÅse╫╖u≈7S▌Ñτ&2Cvû╓╫ÖG
  78557. ëµR>≈Φ@ôÖ▀U█/=YVé■+4ùeö·╠█ó⌐┐⌠ªßª5⌡f│üIPdú¥ü╬)╣ki╦▒╣└╤,1öò ½ì≤@KΣ┬í*├\04Mä▄≥EÜ⌡>â⌐ö}«ª!
  78558.  
  78559. ΓK)0;░å='èªà$æ,î╛åÄ▀┘╠┬╗ασRM τ∩WVmX╟ë;@ûKK80\eOΓë:l¼r]oí┐)⌡╨rí╣ú└ΣÅä`[.b├ⁿ-_─á╘QM╒ûpºU│o▐Cæ;"cQ▀K│√|ÆWy⌐=╟¥╤╢├«Z¡èû╔<½²Qºnvíα=╨┌\≤H ┬o╒²9r!
  78560.  
  78561. ΣJ27¬ü7*«áâ$╡0Φ┌√▀ô╜╢ùƒⁿ╢DF¡√╘sv
  78562. √í0GÜ|K$`^P∙Å.Vo([░"xº╕5÷╩«≈╛Éß└Ösfe܃Bεµ┬SMû╘5ïMúp│≥_J
  78563. ,ΦkæεVòL`┐Huôƒ╞Γ─»w╞O≥±■f▓▒VJ▒wi┬≤^┤╢^ΘR8╔MÜL«mH▄╔m╧aa╬1┤▀ùM{╜₧≈≈ε╗┤nY«╨╜ qCGE Xτµ%9á2├çéVc2FO╬ê àjƒ■┼½ª!!σ┤Æ┌ƒ,√Äú`±9«<²[]Φ┤j╘1!
  78564.  
  78565. ─J27¬ü7*«áâ$╡0Φ┌√▀ñù╧┼╗ⁿ░^.╒╥éKaA@╙É;┌m$xTXnOΓëC(Z«_\d¼«#ε╫Mÿ╕╛Éπ▄TW╫y[fo▐ⁿb4ε▌╚\╢9╛Vz¼I│~äAδCN(Σ`▀▄@▄V|⌐@.╓æ╞ ┌Ña╞`⌡÷∙få├rwùL>;╜╨ ╩█\µM#îz╘■n≈╔}┴Vg╧1ü╙èJ`áµòöëo┴╧oI¡▌≥#'kSX(i<Çα9~A`╞├Öδ-,SI╘ö"┬oⁿÖô╒û Ä╙▌█ô,í÷╚Å#░pªO|Mτó|╠y╕F╖ñ¥¢╥kö╪╦πAα?┤[ε:╦≤δòP%ow.⌠;ò╖$kç5ôG█;@Noδ
  78566. !
  78567.  
  78568. τM)7¬ü7*«áâ$╡0Φ┌√û╛▐╤┴╗αúR@║ÿ╠z`[;╕φ|sÖLS/|Gc
  78569. ╢éWh#L╖u\dΓ╗/≤╨V@«╕Ñ▐π╟^äd[gf╙╣ir≥Ω∩ta¢ûs»@│#╨ΘSL9≥w╙₧PÆVq╛=╨ùα·═│`╞O≥±■f▓▒VJ▒wi┬≤^┤╢^ΘR8╔MÜL«mH┌╚v╠Gm╘6╛╥│K}╜║╕≡σÿ√iR¡σáDo/Fj4╬,Ω4R@^╟╬â«W]3JB╬█oéTôΓ╫╣ d╟╢Ç▐ë~╝Ω═I▀;HC╜r∩qM¼▄⌐SZΓëäü!
  78570.  
  78571. ╟M)7¬ü7*«áâ$╡0Φ┌√û╛┼╓▄║▓╡C`ÅßÇkckf┐εWºMM<oOV+B╢¿Oi-Jπh[oΓì)⌠┌aª╣▓¥π╞º{Wz(ôⁿ`7║┴╧]Ü╙}½òR╜A≤SE ;⌡$ê╠XîRq¿@>╩╥╫■╔αaìÜÆàyα£=)╚    cS░╩δ≤kº~▀K▐≥!!m╣ßq╠FM╧1┐┘ÇP}╝á╚±Θ╝╝6╨ë█1 k{,S¬@ú9xKñ}ñxπÜVx(~ ≤ó àTòΣ╪╖≥Qδ│Å┘╨t⌡≤┘* Llfxj■ûb6╛º`╥yNφ
  78572. ▐Æçè▄Iù┌ƒªJµ#»g⌡sɺ▀Ω3b#/j2 9û⌠9l₧:»A╓U)╪
  78573. Σ┼&µ#┴¼∙V=3N:┌│╕! !
  78574.  
  78575. ICreateErrorInfo comment:
  78576. '<ICreateErrorInfo> is a wrapper class for the custom interface ''OAIDL.ICreateErrorInfo'' from type information in the ''Ole Automation Type Library'' library. It contains methods to invoke the member functions exposed by that interface.
  78577.  
  78578. The type library contains no documentation for this interface.'!
  78579. !ICreateErrorInfo class methodsFor!
  78580.  
  78581. defineFunctions
  78582.     "Declare the virtual function table for the COM interface 'OAIDL.ICreateErrorInfo'
  78583.         ICreateErrorInfo defineTemplate
  78584.     "
  78585.  
  78586.     self
  78587.         defineFunction: #SetGuid:
  78588.             argumentTypes: 'GUID*';
  78589.         defineFunction: #SetSource:
  78590.             argumentTypes: 'lpwstr';
  78591.         defineFunction: #SetDescription:
  78592.             argumentTypes: 'lpwstr';
  78593.         defineFunction: #SetHelpFile:
  78594.             argumentTypes: 'lpwstr';
  78595.         defineFunction: #SetHelpContext:
  78596.             argumentTypes: 'dword'
  78597. !
  78598.  
  78599. fromEXCEPINFO: excepInfo guid: id
  78600.     "Answer a new instance of the receiver on a system extended error object
  78601.     with details from the <EXCEPINFO> structure, excepInfo."
  78602.  
  78603.     | answer |
  78604.     answer := self new.
  78605.     id notNull ifTrue: [answer SetGuid: id].
  78606.     ^answer
  78607.         SetSource: excepInfo wstrSource;
  78608.         SetDescription: excepInfo wstrDescription;
  78609.         SetHelpContext: excepInfo dwHelpContext;
  78610.         SetHelpFile: excepInfo wstrHelpFile;
  78611.         yourself!
  78612.  
  78613. new
  78614.     "Answer a new instance of the receiver on a new error info. object (implemented by the system)"
  78615.  
  78616.     | answer |
  78617.     answer := self newPointer.
  78618.     OLEAutLibrary default createErrorInfo: answer.
  78619.     ^answer! !
  78620.  
  78621. !ICreateErrorInfo methodsFor!
  78622.  
  78623. errorInfo
  78624.     "Answer an IErrorInfo on the receiver's object."
  78625.  
  78626.     ^self queryInterface: IErrorInfo!
  78627.  
  78628. SetDescription: szDescription
  78629.     "Invoke the SetDescription() method of the object wrapped by the receiver.
  78630.     
  78631.         HRESULT __stdcall SetDescription(
  78632.             [in] LPWSTR szDescription);
  78633.  
  78634.     "
  78635.  
  78636.     <virtual stdcall: hresult 6 lpwstr>
  78637.     ^self invalidCall
  78638. !
  78639.  
  78640. SetGuid: rguid
  78641.     "Invoke the SetGuid() method of the object wrapped by the receiver.
  78642.     
  78643.         HRESULT __stdcall SetGuid(
  78644.             [in] GUID* rguid);
  78645.  
  78646.     "
  78647.  
  78648.     <virtual stdcall: hresult 4 GUID*>
  78649.     ^self invalidCall
  78650. !
  78651.  
  78652. SetHelpContext: dwHelpContext
  78653.     "Invoke the SetHelpContext() method of the object wrapped by the receiver.
  78654.     
  78655.         HRESULT __stdcall SetHelpContext(
  78656.             [in] unsigned long dwHelpContext);
  78657.  
  78658.     "
  78659.  
  78660.     <virtual stdcall: hresult 8 dword>
  78661.     ^self invalidCall
  78662. !
  78663.  
  78664. SetHelpFile: szHelpFile
  78665.     "Invoke the SetHelpFile() method of the object wrapped by the receiver.
  78666.     
  78667.         HRESULT __stdcall SetHelpFile(
  78668.             [in] LPWSTR szHelpFile);
  78669.  
  78670.     "
  78671.  
  78672.     <virtual stdcall: hresult 7 lpwstr>
  78673.     ^self invalidCall
  78674. !
  78675.  
  78676. SetSource: szSource
  78677.     "Invoke the SetSource() method of the object wrapped by the receiver.
  78678.     
  78679.         HRESULT __stdcall SetSource(
  78680.             [in] LPWSTR szSource);
  78681.  
  78682.     "
  78683.  
  78684.     <virtual stdcall: hresult 5 lpwstr>
  78685.     ^self invalidCall
  78686. ! !
  78687.  
  78688. IDispatch comment:
  78689. '<IDispatch> is a wrapper class for the standard AX automation dynamic dispatch interface of the same name. It was generated from type information in the ''OLE Automation'' library, stdole2.tlb. It contains methods to invoke the member functions exposed by that interface.'!
  78690. !IDispatch class methodsFor!
  78691.  
  78692. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3Mjo╓╣#è└╙IIü¢Q─*▀T┤∩AN;Θ$ê╫Möcxá3)╤æ╧≈▀│v¢)É┴╙GU½▒Kº ~äµ=█ΘkµC#╔b╖|₧G╫ëZîZ╚6ó£öEg≤íΩ≈τª⌡lPáá╡ `TTc6╬ ±=1N▌▌╩¡Po.B^├═oëO╓°╨½╝r±╕Æ╚ï+░φ▌╓E5ⁿq≤ }Yδ┤mî1à¢ÅÉïƒEö└└Γ√$·dτsé¡▓▐RfL3⌠%Æπ(a█~╪▄UGdëry═∩:ú 3S┴ª»U43D>┘ █└╬Vö≈Y$≈÷G▀ôèS╦>=-{½▓IiP√ä■╘╘c╞╙ÿ▓╬ì┬QÖ~╡èFB-»£╒Sê¿vRδ╗Ö└├0RÿÅ"│╥¥>x═É∩0ôE*w)Ä└┌UùΓ#à¿│9α≥.╩*û╗⌐⌡0┴⌡╩~╤ÅX≥ípc╟₧▒óⁿCC▀7.╬ú≈S,╬╙ñ
  78693. █ΓïfPªûtSàD]╙┌qNπ5A▐╤┤Γ╔R╥;∙╡╙ªñ╔+_L▄M]æΩ√╔CL·ï╪¡░'o≤2/Oâ╜ÆmQR7ºqëτWléêΘZ▓çëR╧Y└k`ì└├úM₧6mk±┤÷B;^╚c;sS╩-τ`¬╡äw6╔╨¬ΓLñá─ªZJìmM≤├<']R═,∞╛ƒpÑOY»"_╧¬)o⌠·░∞╫HnSX(A≤;█▀µc╩èT╟δ½b─âµ)╧,z-@ªú■~∙êå▄CΣ≡3⌠4y=√¢`Hú╪    φ w┐ÅRüÿMçôÿé½J╙~½EWk·Y─┘JC^d}ƒß√╕≤c½D*aíëx╦─╬,ùûW -.ñh▐]p┘╞â]» H"s┤·¡µ4Y¿ßawM²▀╬sôIä÷F┴#║1~|ò∞0╝p▄╣ù¡n▒▓Hi,qx╨é└H┴M²┌æ┤ìUß ⌠±c∞┬╟P█\0öà╣÷¼Uù¡+·Ä∞p╙&⌐¼┴π    ▀ⁿMΘ^GB÷c/jhH"G┐<╩z ┼vM╜~vj╒îÜ9ló█┌e¬¡ñ▒╡¡zPzvâ ∙å√╟-XΣu¢m└> Pü["¢Θ< ╘&╥s╡4╛⌡ºRH«╢3¡└p├R50▀6ÿªπù> äⁿδⁿ▀*ª4ç3äQ%v{┴·?úß<╟)┼ ~Ωsöï└ Σë jÇ╞σGù└a°≈▄?╥╩9τƒa╗]TQäi┴åÉWéù╪7╒╨9└ñ╖╗δ+╚╗r¡∙e╣º¼ïΩ{K⌐{Θbs╕╔éµ-╒σâ@╟$8ºΘW=■φÄ_!
  78694.  
  78695. Σ\&%4í▐_C╙δß@∞V╚≡µ▀ε╓╦╓╢▓áKB▓½╠~"%<╗╞S8·5-6.KWbµ┴4 O_ºu@zΓ±}║≈f    ╗º╢è⌠╟\àq_kO╪╢h1║ôÇa¢û{½W°U╕"ΦCCGiª*≥┤0▐d}╛|▄ö┼╢═α~ìùöù<áτXGúttî»%╫▐ñE ╔L⌠τo²┬j╤Vo╬;≤▒Θ-d╖ºδεá2¡∞tl╢≡ºX%}qrÅ∞$1N┼┘åñ}3SY╩┴'ÄV╤░╝╥ò█α┴è╖7╢±╞└#K!!▓o╝<qMδ╖%ÿ!!σƒìÜìÿ≥öπΘLαR6╗hΣ╒Φ±╤zFLq≥?Æσmvö ╙H╨
  78696. LCw╞opÖ≥:φg1ó╦åhkzt┐sßêÖkΩè5φ┐╬ⁿ▌c█*9ELé÷+8û~ÿε╓╓N»╡²╣▐Öë2÷1╔╗i±√═7╬,¼wj ╗╝▒═╬8cÿÅ"ú╚≤[½∞Θkε*!
  78697.  
  78698. Σ\&%4í▌_C╙δ╕"Ç╠▌∞▐±─╨╙¬▓üZQ║╕╘;GMN╞╔*]┌lT/kX[+ ∙Å
  78699. Ki*δuU*╗ñ5║╓C¡≈╛è╖╞âuR kdô≥X╟áΘ}AåÆvª│eæ ∞]J[Uï▌│3±(░@8ôÄ«£ÑΓw╚W┬█║X╜ßVPíhJxÉΩ2╩┌pσK*╧KÇV┤    hδ┬{╓q]Ä╕╬åG`Ç¥╢»ºHΩÖ
  78700. 5╜áΦWBLb\v3Ü    δW?l|·>ΘK╩ΘzAjhÜç=äW1éΓ╪╢√;ñ²ÜΦ┐Γ╗£P₧H.@Q±-¡+$║ôLµ  ╝P╬╤╦▀ç╩≥α√╜\]╨σs÷≈²▐))F-Γ{╙▐mkö5ìB╞XGMqüot╩╡Xëc!!Σº≈^25D=r╤@₧Σ╨A└Γ_>╛ΘL╖öæC╥)xQS8╠Σ!!8â,¿íÿò*ú╢ß╛┬àî2÷5╩!
  78701.  
  78702. Σ\&%4í▄_C╙δ┐#ê/φ╤»═δ├╨╪┐µ¼\M ┤╞;^AU└ï-]æKaIWeƒΦ7}o5_óhPbΓ«8√╙R ¡Σ┌⌠₧√ä4KksÜ¿e7ε╞┬SMû╙z¬F║=ûεB[I1∩pì╤]ëAq¿@+┌å╦╢√»aîM╞╠▀<ª°TLΓi;ÉΩ0╤╥RΓO+╔[ܲmqδ┬~╟Pk╬<┤£ùK4ºª²╛∩
  78703. ¼±r1╙ëàaw
  78704. u;ìJΓ$~BQ▌┬╩¿Wy9QJ█é*╦BƒΣæ▒∩!!σ«┴┴ƒ?ª≈ë┴E8    ┐h╝{[τ╜%ÇlUΦFùç╙è┌[Æ─└Γα5·b∩'└⌡■▐CzH3▒5û╖*`ƒ1ìO╦E∞    aü∩=∞"TêáΩ&;X{╥Z╩┌╪PFöδYjÑ·ZèÖï╙-!!Bé±d(£nÆΘÿ▌∞⌐°¼╬è╔SÖ░àF]%ºù£]ª@─  rû╘┘╥à(~à₧lúç≤GQ¬ⁿ∞îC0+`φ║≤R¥ím╤τöpâêWó,├¬╡─(┼⌡┐<£éI╗⌠HS+╕≡ûΩà    ]M╔;?╔╕═rª¬ô ⌡ΓôjQΓånH !!&╛₧sM■ V≈╘┐≤╔BçuΣ╤ƒé┤╨HH╩#@6⌠5Φ²╫cΘ█û∙U▓'J┘RH0ÿ»ç2KU2¬f▐Å/|M¬ï≤2╩αß/╘    H┘`"∙┌╥¿W┌~>nΩ╖ñRt2╩O8r\Wà-⌠%¬│Æ6*┴╚¿ΓCÑá┘▒|K è`N╝J|Θy;A█e▌╝Ök
  78705. 4▓K■uß∞0e±┌ δZé*:j.[τpà¢╡Nú±8┬Φìn╦á≡3ûx4Aετ≤}≤ƒ║⌡U┼ΓZQIµ(1+╝╥'&¼╨>╕ ╣çq╔¢^ïàJô▀∩Px╙v°+<Ü?A]¼Θg>5L╜≡╡¿Φgí
  78706. Sx▄óú║▓vÄ¡\hsS≈K╚Bg╧ò≤EdΘA"0⌐αΓδ|στa-σ╒╘7█s┌≥Γ'¼1y=ù±+╣+ê≈%▀íe≥╛s,r?²ⁿ¼9╝¿ôΘo▄Θ(òRñ╢C╖öà7·}₧┴╡²╕J╪Θ╛ÿφfùeí┤╓º@╪║7î% "
  78707. XS╣"╩N
  78708. ╥/_ôs8#N∙ªû'd²╟╟+τá    »αºlß< B6cªσ¡Mü²╬z ∙YÇu╓&ÉX5å╖T~╛-╟mƒ=▓∩╛I│║σÆmì4SJ│e╧█î,,┌u!!∩
  78709. Γφµ]▀1┘"U∩TÆR?v~╡Γ!!ó√qü1─¿x«"⌠±ï ·⌡▀BBä¿â-φüz√⌡╥4£╛g╪èwA╝ZP\çnë┬ùL║º°Wtƒ├9╤τ╣┴ÄP█⌠DÇèFîÆ«╕╚5X)iæÇkàÉ╦┴≤ç}╝oφw╜¡T ∙∞èuÅï·₧≈$mæ0îGüt;w0┼r├╨ú╙─xü.╢╡|(. ╢ÅßÆOEëα Æz┘░¼╧m├δ2ó04m╚≤:{╧?╘H⌡|╨ZÅσv_R.£|>ôΓ!
  78710.  
  78711. Σ\&%4í█_C╙δ¡$è+Θ╤²î≤╪═╨■±¬^S│╛╪;vPW▀ö2W╫^Q>aVR∙Å^V`fb¬Ae▒ñ&ε₧u║│≈£÷▄╫{P@o ╔╜`"ó╠ÇPF╒¢5âpÆS╨εEF
  78712. 4Σ$«Å─$⌠mV║√Ω╥┼│cë£ô╙y»ⁿGHº4gδ├:╒┌ΓY.┴O╓ámu±╬kéW}┼,±╚ïA4╝¼≥√πΦ∙oX╝∞≥ wUAKo<Ü∞%rJTë─éßnb.G â╓c╦M
  78713. ƒ≤┘°⌡rñ¿ä╬ò3╕µ╟╩wC¼n∙    qMτ┐j┼-OπFèëû╬╨Dƒ╙╫ï(¥%?¿o»─⌠±▄ZG|[    D<σ>£∙mlƒ Ü\┘BG#╦ iÖ╗<≡J$Hê«ΩV".
  78714. pû▄╪▄G└εS.▓≤▀öæC₧%>D╤∙69╤xƒ■ÿ█╕┐π░╩ê╬L▄[íèT!!αòè╬8¼vc╖╙┌º─3eƒò9áÇ░VΣε·;ìEtwÅ╥╝TæΣw₧ó«AåÅ«9@ü¼τ└i▀σ¥<ôò
  78715.     τ⌠m>»⌡┌╟ÉYAE╔1*╟▓╨Qí⌐╝'÷ï÷^Γ╦<∞n0╡▌4N /QΩ┴╛α╔^¥&½⌠Çä▓¥ CP▄gRæRªΣ¡-²ö▐áU∞u    +╜RU6û░ü`K½cì─me
  78716. êô╜wƒ┘∩)┘Ql┼ib░┌╥▓╤9!!ï╤ìQs%Ä)x^b╫ ²`╗╡Äm~Å≡ª▒K⌐∞╒°/I êvNªn╗@Kz>╡B ªÄk4╕^H╣8E╒εa≥√░ⁿ▄[sSO#L╙pêïτN±╖s«hÇ╚âåß"═,vbO╝φ╕N╝ÿá√E╞≤ K£MJ+≤ï:< òM╕ε]■àUδåA₧ÆL₧£⌡WτyΣ%8 ç#DO_╚ìh\r7∙│╘┐π-Ω'-bíóK╩╘¢?┘▓G<aDµ;ùSFj╪┴╬(╛!!Mg=┤εσ±{G╡Γn(¼╜ΣÅO┬≥┼bεx~yÅ√╢t▄Ç╪╕sáú     dL2╝°¼2∩é╖φ╣éQ╨ñ²~áìïr┤5S ┴╛╬ñD╔≥y√▐Ä╛║▓█╜    ä▐SΩIo:¼JAE)Ró3├P,╬yX ╗f)jT≤üÖ`⌠╠α|½]6í·½σñhV2eéσ╓)Ö∙╬)E∩+ç|╒Kl∙=[½É{9╓(╟:»:┤∩╣B~ⁿí╝Æ#á,Só*ä÷τBR║!!\▒■φδ    ┘+┼ 0ä3▐M1tpµú&¿¡sï?¢¿6:·1≡Ñ┬5 Σòuh¬£à-Ω╘a¡¿₧xå≈.ßòyJíZfûj╓ü─7∙╙û1d╘╦3╤┤■úΩyûªô┼Gì╞Ö»╙O4mì[╘Z╠─±╞≤├)úa∩L<èç)z ∞╚µ÷₧√É&[ü-¿Q₧c-!!D⌡[ô∞╣╓L╚Dû/║╡a!!Uup╓êú╚=δÜg┬Z╔ε⌡ɪ²)╣"qÜí7n├"ÇJà}╞D┐π8BOxôy'√╥╥üÑnσy╛)╪;╤┴═╝!!Æ°/W½Å┤0╚¬║ßÑ{^\╪Çⁿ╩α█ε┘nîVáqt∞JûYφ╣
  78717. ╤l-/B>K╛TFTûⁿ:Pδ░jf╝f≤φ╜╙5@ä!!¢R┐▀⌠ü┐≡┐[P╚çÉπÜf╤O[É╢sÄ╧σD∙£∞U ò¢¬╒∩╗Ö>(&É}pæGΓ╣[⌠á½╖╞ô6Ä╕X$▒ÿ<oy,à╛╡∞¥«ÉK┐≥╙"╣4█óΣ6⌠C╜■æ.G<Ω╦cö₧¥ª┘{ ü'    ╫@╟âδ,≈Éä╜ª     ╛▒╤2#o2zTU$H┤V»ε┐2¥cûÑ5½▐9«ß≥ùôù░ïüÖ¼z╥kτäx┘hy├
  78718. ==\¢─2╡τº╒πç≤²É┌3ic MCóC╫≤▓ºKìV╛Å «ú»²$¥4¿▄I╞═{▀*ÜΘµ<    ëDNX3c╥ΓÉåaç%4Æß«7αö±.îßñσú╥╛&²l╫6I╩₧ëL<π[╡├░ß┼▌╗M┘═á{ÖU ëëlå ╞{5╧O{∙yvr{∙w
  78719. █╡M¼
  78720. ÿBƒ5╖oå"ì∩|ⁿΦN╦FLº∙╙α/doX9¼╘┘φò±    jûì0ÇN4π≤%$Ω½:ƒε )Ωª ¥▄ïàöH⌠ñ≈ñ╬╦ê╞ñe ┌lΘ▄ %╨"ëX≈1úxu╒=dgP d&▓9âIφ1ñ∩bE│Φ'4÷6ä└£ó9I9¼■>6ƒ╡≈▓«╡}¢Wf./L└'_┤+≈æ≥│Y╧▌φ%V√╫▄Åèƒ@3╝&vÆk:U╝▓/ßy▓j╪g■í=$f│pùJçΦ╙8»▒6┬üÖ<i┴cö:┬,╬▐~îF╙┬l║╫X▌L:∞nD)B'ACx╙aâ7i<>┐¥D¢P-ƒΓ▐Fâ(û»/F╢ù╜9)<,s"╓J@≡JÅA "¿¥óëü¢┤yτÄê+4öΣ>eW²î█σ":-ìld╒Nÿφær╟d≤│y─╖oî╟Äî¬4hn▐5I[?úô│%₧p÷■÷`╝ºz¢£Φ╕}NsΘV├6ñ≤δ    #:¢┼é«┤²sΣCj┤&┴ßs*≤÷_'8Θ≤¢CN7    ε⌐J╒╟ßvO≥¼╖▐NFjm┐É┬2o?~W┐W_üU╜/╦Ñ▐qFs¡& Ωà¥E░╞░SP╦í╝P#⌠ºº Γ!!╛≈ [6Sx ¡ε\»╖¼o«xφ¥ :µm╛_o@├«ôdoK╙ANuc8τm:π-#Cxºφi>SG╔bö≡¿,oµΣ⌐rKo,0p┴áΓQúÆ ⌠»aÑVÖöN╚┐g«h⌡q]g╦Ü[a'Ö`jl╝₧»àóGöL▀└ÅæK>WVuo=@v₧φà╡α█[w    ßp╕s+│@V╣áG≈BºlL╢║`Γö\uóî╩ëbπτ─¥≥ö÷εà╝6Ä▐≤┴N²ä]≥ù▀ñ╬T$₧╟¬úDLΦKZ²Ω)Åα ╖╡≥æPBV▄ùî╘±▒¼╤u9ÉR@:▀ïI╕ÿ1σO╕Ω°╔┐Lñp┌_ÿlæz#ù«:vêè╛zÅî`v1╙Ö⌐φ╜Ωbº╔á¬é╘╒┐6TIq╚╧π─ápùeⁿ▄■ ¿ôKà₧╣ö8┼C!!ƒdáK^╓B╕fêº`àM┐'qKDÖÉ▄Ö7⌐t⌐°ßç1é╙≤≥∙⌐ö`√ ╟vJ⌡+╓DÑA■ìXöla#`ç¬D^
  78721. TYW▐·LC aα°A<(uù╝╙ô|R⌐=h▀[+ë║/┐╜úwÆ ┐;dò╥¢└é▄,S ù∩EL┌|@¥i%τ┼¼≡
  78722. ßσ1╠╞╓AôU╢■à╥±í▌|;B█æ-y╟ 9    ~/L▓_óτéj8ÆE║(. Å▐■îU└CD╞╧°æΘ`i▀É╟÷░öòfu4ï├≥·Ñ┴3p¡&í╣α
  78723. ╨L £}ü$┤∙g▓╥∩╗ìΣ│ε═D╫g▌8─ε,iGëΦ'}îΩ)─√█Σ¿▒■ àëúé∙j}¥Ç¿BC|÷┴8δ[└⌠└π3wnαZº[l╧'Å*≡Go?+ƒ╨B╠┬Usó┤¥╟┼τuS≡Kv⌐p²j⌡95&Æ&≥╒∩J{i=═Xz|σ╚┤τIñ,ñ▌ε┴;÷Lä7/┌;Y°_rZñá¡IZ3±RTÆ╨`H@∩∙;1╡⌡föxD{┐òπ╝ÉPH&ƒ ₧ôw.rñ&¬úY¼ü╝Γ▓┤m╫≤╖φ]┌Tn+åT\(¥≡Jb&¢╟ ?⌡▒éÅ,╤ê*á ╘¬₧░&f▄ª╖äφ▌Q 'σ|ö╔ùü■∙:U2»_WÉ╖në░Γ∞î    JíSY¥!!∙+Auwr╧ E├τÅüK╡┤*hcΦsÄW╤¥'┐╠≈4rtσcj═%┴W╩>aÅUtväOÿ#┴$öäàu∙Hó├yS;u¼ÿK)C▓÷áf    P╦╡▄ï`╖&ƒƒ:4╦╫x²H¿ÿº≈«sUé(╘#hWΦ½j╒εP∩^/ƲΦ░4òτª║┤°÷ot∞¬└ZL┌ΩÇn7So╖├Ñ2>*┤oΓr└Ñ1╨τÆ╓╘6╡«ïs≥ù*
  78724. ég~ƒ╫▓mߣ9└h┌┤é|╣╨∞,Çσ«B╟)╜Åv┬ê¼é╤⌠LQDri╔¢╩«HÄÉY!!¼Rτ÷▄≈╥ëⁿ└g8}CFó╒/╖╙σF&┌═ñ-₧Y│Na5_Æ╙?º%N ╢Γ&<Γ┘─E9à1─╕L n∞ε⌠π|    √JïuäTM¿uÖi┤╤▄▄d[▀h┐^.ªµÉrn !!y²îî└Æñ╕τvºG╫9-ZÉ▒ü|╓╕▐xî╤}ó═]ûv¢/Gα[óti÷╛φ÷╩╥≤²∙ZÑΦ{φ[ö≥C├ ,─╟UDû┼kOì╜╕ö3╡sjèz╙ÜE÷╓I0Σ·%z H f ╟"ëα+äüauⁿT╔∩å╬⌐ α»R01&ç╞δ╡⌠⌐₧╝▐TV½èε╦É─x(û¥à°Q4UεÉY;╤L¬æt┼b╧IRñà&:1ôZ¬ΓM?■l¥Wû;DW╧G<!!SΦM[-(î<▄¿τ¥╬░b■háö|█`*d▌/Qï▄?▀Ä┐r»é¿▐yπ≈LLα╫▓xû╦╓#Qñ╪b╬√║ê╟╔CC"π²6Θí╕┼¢çèΘá╚╢ò╤╠Gn╩▓Tr≥üd]ê∞┬Vσe$\⌡%aWj≤â╧╙¡▌êLíùB┌k%¢╚τ#τ║╚F═╙6╥≈τò'ªα: òE"I╦└ÿj╜º½│▐~╦üÄ⌠Kè?sä?Ω╖k╗}╩±╥>ƒ£Φ╗╡Jâ<φé░∙ÆìEd+^T⌠µÅ√∞ôf⌡Å┘¢_vKΩ]öéxuFòÅùΦìδÿa7│è▐⌠▐v0SE:─▐▐É┴&«^╟┼<g╬ª▒╒ΩÆ╙d╣ô:≈ò╬■O│═φ╙lú)╡╟ë
  78725. 3Æ╦Σδ@x≡ky╣┘É⌡╧0·&8Åα°╨∩|Ä╫ÆùHlY-c⌡Ω╙!!ñôÇ▀╤,
  78726. /|Pë▌╧O( å=ⁿ£╤C≤tÄöC╖÷╩╢╣l┐╠Ö«(∞Éxu1òùdâ≥0qç≡°╚²OI4`√v!!ÿeò┘ÿ¡RëQ)fß▀b∙1╛╖¬Xâ'1/▒K▓[╧╗óδìU▄z■<g±uσhæΩxn╬┘> ■Mîe]ê▐¼,╜▄Gs~çV╛ô≡╗zYàw?z╘É⌐CWτΦ 2òQè▒▄wöëÜ╥>4É7A-ΦΩ3┐░!
  78727.  
  78728. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  78729. σäM&2G¬oi«¬3Θ£/j┼▌▐á┤îTÆxXI.d▀║l'ó▌ΘZG¢!
  78730.  
  78731. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]J▒▓╘rrD_╚ü~FƒZ8kXVb≤ô^It/@▒<GeΓó4Θ₧PÑ╕íƒ√Å ÿyfeÜ╡`3⌐╠Ä% {∙Câo┐éεH=τeè╥M▄Pq½    /╟Ç┌╫╪·3¢ô¥╙rú⌠T╖tP;îµ?!
  78732.  
  78733. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  78734. m»g|jmT]x≈Å
  78735. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿirû_.R▒▀Ωⁿw! !
  78736.  
  78737. !IDispatch methodsFor!
  78738.  
  78739. ▐J"6▒é_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;/ac▄Å0]ÇQja]j╢á Mi+N╖u\dΓ«.∩╙G⌐ú╕î╖çPÆ:` ╒╛g7¡▌ÇN@£¢Vf╗Sªré∩<%`─jè╙o╜p]ì.ì▐âΓ─íg╚₧ò╙~
  78740. εΣDAª t┬Ω=╦╥Z⌡@;╔╬÷md⌡┬u╟Lz╙╛┌├P|╢εΩ√πíΓeN≈ì╪c,+dKR:çú9}C█─ÅßXc|F^╚Ä=╦S╓Σ┘╜╝sß╣ä─î;ºú└Å 8Rⁿ≤xZßÑ`╧cül≈▓åî▄DÜ┼╓πQ┤5┤n≤2╤Γⁿƒ_)[L}╨4ç■;`▄ ▀╚[Cqé mîΓu∞ N┌½δRq.Bmû█╞╤K└⌠U>┐┐H▀ÿÉU█l=VF┴∙!!)ⁿ■ ═╙∞│ ó╬Ö═^ƒ]αçDZ(∞╥Ä╧j╣jg ╗¬┐┴à(x¢ûlªåπC╢╣·'├Yî▌δN╟»uß═╨>πÑ░=├«ó╒├ Ç;äôS/σεO@Ö─±∩¬7ts∩φ■!
  78741.  
  78742. αH3'6Ñ¢7┤║£/å+ε╞╠└ ─╠╕╘¢τrM¼¼┼i3\^╫─=^ûLWja]bσæZr)]πh\*á«`∩═GΦá┐¢∙ÅÆ4KkrÜ«h#╗╠╙M[╒£V|áPªxôæ;Ixíï╓\▄Pq»5┼ù╤╢█⌐gÇMïôû<<ª°QPΓkb┬τ6╥█πN8┬ÿ{Ö@ É∙Y·k`╙/┤▀ùKf!
  78743.  
  78744. αW%4Éû",╫├σhñ+⌡╤Γ▄Ωù╦┌■╡ªRP½ⁿÇo{M└ü=W₧IA8._\|╢ç Vkffçu@zú┐#≥₧VΦ╛úì╖╬
  78745. éuR@je╚╡{7¬ë╔W\Éòv½.▄ô²B\I1τ$ï╟IÖ}ó3┴ƒ┬Γ┼»}╚î█Æjº²VF«eF;âß7₧▐≡S.▄O▀│.m°╘kéJo╙í╬åR}╝╗δ≥∙F¬±eR∙τ╖wGAb_Σcσ"1[X╠W─₧ñKk=@Iö┴âS╓²╨í╝cß·Çìÿ7íú┌└{K ╡⌠O}Lóªa┘-LΘFÜÄ¥╔╦ƒ┘à∩V┤)·oΣ5─≥⌠╦ZOgk#T▓6Ç╪/oö7ïƒTV#Åt Ä·;ú ▐º²Nq2Kz╧Z▀▄▌ôú_%║∩EÜüÜK╟l+QFî▓IiP√⌐Φ▌▐∞┤■óσ₧╟S▄Qª░WC!!·╥┤~íC─qc²■│┬─,b╫╟qτ╦│í⌡²`ε*^dÄ╒!!εU£╗w╖┤╕Xî█C¼/#é║│ⁿD╗Ö∙Wƒülφº
  78746. >dæτ▌╟ô$l)á!
  78747.  
  78748. αW76,Çå!!9╢¿òïeí╒▄╪∞╥▐╪╙ÿ╠s¡▓╓zgMƒ─BçZJ..Zx°å\+*F¡y~º│4∩▀N@║▓ºî≥▄âuJ    ` ╒║-&ª╠ÇKMûÜp╝ór╨⌠TU(⌠pï▀[ÉGG╕9╥ƒ¥¢ªα3ß ì£åq
  78749. áσM¼  ;äα!!╙ƒK∩@;î^Üα(s╣╤q╟Ug╬8±╚ïA4í½√√Θ¡µ ]¬áª%PTs7╬σW11_E╦─éñ]-=P\▀é;╦Mâⁿ╒°æ ñ·Φ┴ô5░ú▌Å2R
  78750. ¿2╝;mOδ▓h╠aB¼¢┴å¥┌╪╥╠⌡R°)òe╗s╟≥∞ƒ    IdJFJ1≡$Ç≥>%₧2▀A▌DAw╞caâ╗ ≡e]─╢ΩE?;^>╥═┬╒E└Ä6j≈ûOÉçÆF╩?v=*QéÖ
  78751. M▀,ú≤╤┴NÑ⌐▒╖ïÅ╬IÖT»öHS*┤╥¢╞/φmhΓ■╜╦╤7~ô┌8»ëΣ▒Θδ&æTcwÅ╓U╠U¢φ>ƒ»╕P½êWª; )ì║╖─*┼ ép╘Ω kï▌a(¼┤╤╪╗ ]HèWA⌐▐╩L┘╒√▄ï÷+╦τ2;ⁿ<1╗╙"âR-æ╩┐∙╔k╚!!é∙£█ßÜR╠h┘ïÆ⌐.âƒ┼╖║)PX┘HC*æΣüd
  78752. εlÿ╠G+eΓεε1■∩∞(╪Eεjk╡▀ôñ═x}_⌠▓ΩRS9╨;N^@└.αX!
  78753.  
  78754. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣n╕│(m┬▐ë¿╓²5?╣@|o╫ÿd!!╛╚╘Z@╧VÇy¿!
  78755.  
  78756. πE46╢è7D╨└╬ù6≈╒√╔╛܃≤¼≈áW╖╛ÇivKS█Æ;@╨L/vOVy≈ì^Kc5@╢nPo▒σbù┤/j┴ú«Ä≥µÿ4].n╙░#_─á╙LXÉ╙t╜J╡[é∙!
  78757.  
  78758. πQ.1▒ì> ⌐íë.ñ,±╤∞╪φìƒ╘Ʋ¬XV»Å┴yM╘û1_úFT/GUUdU╢Çx^A╖yAlú¿%╬╟Rë╣╢Æε╒ ╫4ir ╩¼or▓ñ¬0Xà╙L(εP│qûAφDJ!!╚jï█KÜCw⌐Z|·ó╞Σⁿ▓|ÿìÅè^íµDM¼gDΦå2╨■g╬O;╔M▄≡(Uα╫}πLo╠&½┘æ}╜╜Φ√π⌐÷lYë≥╜wR\urè╣W]&9á,ùïóQ- !!░ΦFΓ_ò°æ▒∩Rτ╗ì╠êº∞┘ ▌.Ki╒òf}Y╓ú|┼7╫▓Ä£à╩X»╫╟ΩG┤4╛1í{└µ√╫ZAl['Z-⌠4ç╙(vÆ&û^╦S#ûpb─╞!
  78759.  
  78760. ΓK)06░£_C╙δ¡$û(Σ╞»═╛ï╠╨»τá]@║┐≥~rLW╨ê;qÿSH/mOZd¿┴_&2Gª<i¡Ñ4 ╨V∩≈╕ÿ╖█╫f[ki╠╣|├ú⌐m@£╙|óO÷oæ∩T6íaì╠VÄ}¬@(█ùâΣ╔úvüÜë╙uε XPΓaJxìπ?█▄KεN!!é╖|₧G╟╘}╬D.╬:ª∙ìQy≤¡≈≡⌠ªαs!
  78761.  
  78762. σA%2╢å<=ë╜₧#ï8î╛åÄ▀┘╠┬╗ασRπ⌐┼zwIT▐üFàVJ-0Dcσä^Zn']óGo░╕`√╠G@⌐≈│¢Σ╠ç`W` ╒║-&ª╠ÇKMûÜp╝█∙∩[=í`Ü▄L¢Eq╛@+▄ç╧≥î╖rå▀Å£<½⌠M╢.gδ╞>╬╙ZΩD!!╪^╬ⁿ#!!╫╚l╟.≤6┐▀å7Ñ»⌠δσFíτ I¬σ╢J|t;Ç╠j=G╠W─Ü¡\`9MXÜò'éIBé æ╒ûσ╢ì┬ì~á≡ë└E3╗<┐uS≈┤%ÇbOΣîûÜ¥┌ê╙╤≥K·p╗+π!!└µ≤╧Og[F@3▒tà÷!!pötìK╠MVp╞in═·Xëc(Y─╢δX&4[╝w┤╗τWîσ#ñ╤\ôÖ▀*┤EQYF%╨σ!!Y}¬+û╗╓╟á·╢÷ç╦╪ZÉ^αçIW7│╥ü╞/É qÆ╖╢Φ─3bÆ└l£¢⌡XΣ√·:èC@%ë╟&ΦRÉ∩0▒!
  78763.  
  78764. σM4
  78765. 4,ºç$¬Ñë'Ç1⌡█²íö╛¥⌠░ß▓VQ »╚~3÷ì-BûKG"0Dc⌡ë^PufF«l_o»«.ε═á▓≈╖╙╞û`].f╧▓n&º╞╬JÜ■|║K│=é TF=≤(▀╤K▄L}á@5╒╥╫■╔αaìÜÆàyε⌡XA▒ tû»:╙╧SΓL*┬KÜ√(!!╨πq╤Ro╘<╣▒Θ-rªá√ΩΘ    ªτ.╘è▀`kaOFg&ì╩ }J]╠┘ÿßP~J@Üê)┐Hô¬æâæ ì╙╔▐ƒ2│ú╩╬$K ⁿU╪gOπÑj╚-ZΓ─┴¿╞╠Mù╨àσN⌡#·°#└╬÷┘ooa    G8½w¿╔#l¥    ╓╓ eWbè])═≥3╫0YÆΓ╘:[S#p6╥═┬╪Pê╩Q:╗·DÜ¢ïH╠lb0·╓+*É~ô≥╓╒*╣╗²ƒ╞¢ïQÖOΘΘ/?M╔√µ╬8╗gtB╗¡╡┬├xÜè óà⌡Z½δáDΘ)^dε┌ΦEïτ6Åó₧XïêT∙x Å»τ┬%╨πâe√φ#oê▌fm*╛±╩═öTè).╠▒■wrª¬ùtÿ∩ÅyC╢▀;!!σ>8┐╙qF■4V!
  78766.  
  78767. σM4
  78768. 4,ºç$¬Ñë'Ç1⌡█²û╛╓╤·╝°áPW╥╤⌐9@MBÆÉ6W╫PF kXG+■êQ&/B│pVgºÑ4Θ₧V¡≈₧║■▄ âwV@ce╬┤b6╜ë╫QM¢VçpεQ│~òΩT]I1≥$₧╨òL`⌐:╥æ╞¢ª╔|åÉ█Æ<+í²GL½nJhç²%█═ΦC%╔\╬V╗9i≡╘8╧CwÇ+╣┘├Wu╛½╕±≥F¼²fZ╝≥╖%RZKr:ïJφ"|N\ë└åñTh2WE╘åoäXô≤┼±▓#ë╨∞º≤:╝≡┘█?"░y±
  78769. zKφú)Ü0φ▒âÖï▄\!
  78770.  
  78771. σM4
  78772. 99╜á<s·¿┐>ù:α┘éªùò■┼«≈½W╛√╒hvZ╘û7WÖ[H3.OVsπÇt#_▒y@o¼┐!!ε╫MΦ╕▒▐π╟^àq]gv▀«-&íë╘QM╒{∙)╛Vóiæ≡T|*ΣeÆÇ▄Vu╛9╟▄ü¢ª═ßÜùò<╜▀BH« }╢²&█à▄@╪M▀■mqδ╬v╓.╬6╜ß├Mrò»⌠φσ\Φ╧sY╡µ≥ vVY
  78773. Å÷╚$┘ÅáTP!
  78774.  
  78775. σM4
  78776. 99╜╣3%»¼ú$▀ατ√▐√╓╥╕╘¢τcQ╢¡┴ovÆÑ.BÆQ@joFx
  78777. Σ╠Ko#AºpJ*╢«8ε╦C ΦÑ▓Äσ╩Ö`_go╘ⁿb4ε▌╚\çÉ|╕Fñ:âlû89φqÜÖêM4¡3(┴ù┬√é═ß$Æïƒy½ CE╢iu┬┴<╩┌ºg └S╒│9iⁿçNαm╧1º┘ìP}╝á╕±µF║±pN╝≤╖lHRKg<╬ß5r[╦á{π¿M~|geΘ▒»e4╖▄Σ¥╝q÷╡æ╚ê*¼»ë╔E>R ╜o╝zZ«±k╒yΘèä¥èƒ\ô╫╤ªV√R1╢xεs╤⌡߃Hm[4 #■¥Dlà'▀M╨UGmÆs ä²uΓJ&S─«ΩT%3E>╫┌Æ╤E└φSjí■EèÉ╤│FU:)éµ%(ö,ïû▓╗5║╗²ú╬╦æ▄KÑêC2í₧Ü÷jól<X╙îò²≡E▓ê>¿Ü¥>x═²⌠s├-^dεΦO∙X┘²wß═╘=πáTª4@Ǫ⌐╒,▀Σâ~ÆÄYφ╡K*≡┤┘°ü TE╟k╧╣Ö
  78778. ∙σ═░╥╣{P¡╬^büG]╙┌{¬V.æ¡╙ê┤`ç0╗º╨¥ß░u/5░gG▐Rτ⌡┼
  78779. ç±Ñ═|▀AGö^|╩Σ╩{εaû┬N|┐₧≈2±αµ4⌠c┌wkπÖΦ╡╥w>lΩ║≈UA~╩@;pO¿Eä └╚■6▄╘¬úO╞è╣╓6cφmNΣQJ╝Ao8_àk▒╜¢sq║VN»l_ü╜o±√ⁿ¿▐nxK}╠6Éû²I¥ú4┼$∞«─ │ï93es╡╕╨3ò⌡╞æ9ó°┴27≡ä &¼╘è▓4╘δz(σçKéæc─Φ┼~O┬o⌠h9 Ç εìP'VDy½±⌠╢!
  78780.  
  78781. σK"    ░║<-┐╗ƒ>ä1σÄ»═╙╥╠╞┐⌡á>)╓∙≤~}\╞ï~FƒZ8kXVb≤ô^[f[½y\Åδ7≥█L@⌐≈║¢Σ▄Æ4M`tÜ¿br║┴┼ZÉûc½Q÷jæ╝<%`6εp▀╫TîNqí2╟ù╟╢╬╣3£Ü█üy ½°AA░ i┬µ'═ƒL≥Q*▐\╓α>dΩë¿+G╬Ñ╘èW4░»δ√á¡┤aO¬⌡┐BqN\&;¥JΓpp[D╠▌╩áM-5MZ╒è&à]Bù░▌╣Φd⌐╕Ä╪ö:⌡ε╠▄0^n╓∩4Hτ±}╥tα    æèÜÇ╪Æ┬à≤R┤>·Θ6à⌡²▄OJ.▒#èτ(%ÿ:ÖAƒOF#Ånvé≡<φeU▄∞¡:[W pbû┌Æ▀Hç≡6┌ò îÉôA₧%+uX╟■7
  78782. ?¥i╫≥▐⌠á⌐⌠∞ï░⌡LëHÑûR+Ñüí▀úfc
  78783. Φ¬▒└┴e1û╖)┤¢±SÖ╖ûCΩItwW┌ô╤Eè≥6ïó²Uÿ£R«=áª▓╧=æ¡═~╞╟'lê▌f-¼└╩▐ÉC)áSB⌐▐¬q~Φ╧δFÿª₧l»┘'τ*t╡╠4X°4T²╓«°¥\╪!!ßÿ·∞╦┤v/5░bZÖOªó¥U⌐╙Φì&å    }!!▒dkúî¡LKSèK¬±c"L'┤╖╒Φ╦╥Σ8hß0 ╘│║╧~╖mjΩ╜ñOxî`;pOà.└`║▓û0;ê╒¬«G¿⌠▀¡/V ÑaX∙Kn≤u    n▓AÉ┌≤7Ü^P»}E╚├T    ÅùÖü!!ÜieKgiΓe₧ò╝⌐∞3â∩¿i┬▒αg╚7}eZ╝∩┤R∙▄¡≈D├╢ß76;╝ëtbΓ╪┐≤]■ä@▄çîÆWäé∩\╫rÿATB╙p    _╒ïtzlá┤π╛⌡sΣ]Bqêµk╟▄ù~¢╖Z[!!`Eúl╒Fj¥Ç¬ 6╖k)dJY╘ÇäîRR⌐∩h(M┤ì╬4▀τ╦5µÇB¡▌ Ö^∞≡ùî_üç1hC @
  78784. Å╟ÖÜx╓φ▒1°═,┐{ì¥▀æà{Φ5┌Ω╝╨¼J╪╜+╢ÿ╬g─u¼╝ô⌠L└²Y≥CQu╜:JYA}÷;╔}╪pW Φ0e▓∩zⁿ `ⁿë┌ÇWεr╩é╦?ºOV%<╟═∙Ü⌐─!!X╖f⌐c╫ LÇb8┼ⁿ+├"╠~ßr░é▓Tz╜╢é┐@╟QU_É#ìÑπ▐]zu╦>ßφΣÉIí 4ç3ƒS?op▄τuµ▓xφP¿üzΦ8ⁿσæx╢÷æ./■┴µGù¿
  78785. ∞Φ╘"£╛h╙│A╦;ut╛Uôò┘d┐ƒε_b▄┬8╞│¡∞σ╔ΦEà═P╔çî¡╥(X5i¢²!
  78786.  
  78787. σK09╖¢_C╙δ¡>æ:∞─√îΩ╪ƒÆ╜≤╢G »╚~3ZS╤ü7DÆM.aL]+∙┴b#]¬jVnΓ»5√╥    ªú▓î±╬╫wR}sÜ╤[º╧ÇMQà╙{¿Lñpæ⌡^AI1≥$₧╚XòNu« 9ƒ╥┬°╚αr╚ìÜâl
  78788. ╝▒THús;èε ₧╧MΓW&├J╔Ωmcⁿ┬véEk╬:ú▌ùAp▐─æ°∩ΦαhY∙Θ╝w@Tc|╬$∞=pC\╨W┬ÅßNb)OHÜÄ!!çCBà⌡▀╝╝u∞│ÆìÄ1⌡τ└╩#K»h²wZ±±f╞-r╚ìæÆÜ▄@÷╝¼⌠Cα5¿+⌡;─Θ╕╠D`A]< 4ûΣa%É'▀G╦XHQ#âffê°!!Ω P╤Γε?5nû╤└ÖI    ô≈.▓φ@ëÉ¢▌ 9CS╤¥Nj8ëoÆδ╠Æñ┐π│ïƒ├Zà┤ïJ%▓ù╧╩9¿"rδ╗úÇçR·≡EÖ¢⌡XΣΦε,æYY9é┴²C£╗w─┤╕Xî█D»9 ├¬½└:┬╓ƒ,┐«n\í┘eM├¥▒ó▌HT╧%╞╕âC/σ╔≥
  78789. ±î⌡+╦╡Zaß(¿╦q¬W²╚╝í┌^╔║σò¿»█ë$]░SΦ²Ü-╘ê╔¿ï$h≡2/O■═δa4óq£¢-|
  78790. çüº#┴■σ╙Bⁿ@╢╫╓ⁿWσOmjΩ╜┘{5wì[3y'8¼Fä └╚₧1╟╚¬°É▐├║cY7═!
  78791.  
  78792. µA33+ïë(╖¼ƒp┼1α┘Ω▀ô╜╢ùƒⁿ╢DF¡√┴;/[S├æ;\öZ@kZWj·ä=Vj*JáhZe¼⌡`⌡╪á▓≈ù≤▄\æ4Jk ╘╜`7¬ñ¬0EÉæg╜╣{╨⌠T=Γaû╚\Ä 6┴jQ╣√▀╢▐º`Æ#₧ûûoO╗▀VIºsJx¼ε>█╠⌡F ┼L╩?≈miδçd»(╒░╤åW4Θ≤╕≡ß ¡τ _╢∞╛q0<"╬úpp\e╟╬Äñjy.JB▌╝aµ0kò▐╨╡∙rñα▄ìö?╕µ┌I▄ -\n╓εgE╠░d┼~╢[▐Ññíφl║─╫τ[┤5¡1í0δµ⌡┌    %o\≡:ûΣmnö-îo╤wCoôes⌐⌠oú1Uê°ß-zXm╠4▀▀▄WFü≈j╛┐Yèü┼╨l!!_Uπ⌠ 8é¬╡╡╕g╛╜╒┐╪¢Γ[▄²─vrÅá½2┘8¼{&■⌐ΩÄ╞p܃?ΘσÜ=╢╣ít├Su; ╟╛ò)╛Σ#Ñâ«{î╡F«= Z├ÇÄσi▀σ£2╓Ω oêªw>ä⌡╒╬åCV═)1ε╢╬O/ï¡ö#⌡σ▓hOº╧iHδ5╖█gçQ-æ╚╣Φ┘¥î╓▒¡äΓ*uyδ[*~╕}╙╘⌠*|â≥▐ú┐;Y ¥4ÉÇï{α≤¿|}O╫╟╖Z▓çë2█+_└|4∙Γ╛╠~╖v}ªµñbU║qB|ε┬RçÅ╢Ѽ╞╦+┬Θ╓ï}J▐#p∩@v»K&A╨9╫╝ÄX$▓[ⁿvà½-]ïöÖüs▒Sl5O+[≥+╤ú« ¼σ}╦Φ▒y═▒╓5▐7ax⌠±Çdæ÷╞æY═╨⌠}cæΓ╦ù&╣Ω\¼ûSU╘╘O╬äJïï½K╟_Iⁿ)1ç1_αæfN5╙¥£╥⌡mÇCTm!!╠ái┴▄╫;Ü╢[.[úgÜo_!
  78793.  
  78794. ╞A33+ïë(╖¼ƒp┼-Φ▌δî∞╨╠╧É≤¿VPσ√╥|`Rx╙ë;A╫\j+c^@1O⌡»Tc5»Zn°δ,∙╫F@║░│ùΣ▀═4Lji╔¼d6├ú⌐xçàa½√=╣Ω^D x⌡lÜ₧~ÖV]ê╒╝┬√╔│;┴MÆ₧çt¬▒XBΓt~┬╠≤ƒPσK*╧KÜß,qΘ┬|é@wÇ+╣┘├Vq░½±ΦσµÖ
  78795. 1╙ë█"0@u`'Rr▒5≡4rN\┼WΩ₧ê}~Eb█î*ÿoⁿÖ╕╤╟hΩç┴Ω»æ⌐ë╞ 3Gi╒ò4}Q▀±j╚lIªL▐ôö¥┼fÜ█└⌡ÖxY╙┌:╦┌╕╩U`HL9▒>¥πmf┐5ÆK╠T,(
  78796. ∩    [ä⌡ú+O┴ÑßR5zFp╤Z╥╤╨@Jφë5C▐─Fèüó╥#6W
  78797. Q╨≈ 
  78798. .üeô▓â┐d┴╨ÿƒ╞¢╟Zæ]«ÉDB-»£╧=─>¿8&6⌠¬≡╚╠1u₧ö+τå±Y╖╣⌡&ùu/é├⌡Oùα;└τ«[╩ëB╖-├á⌐╒,╓⌡é~ùëNF⌡▒pI└¥╩╩üTVè.#┴╣âK)▀╧│X¥∩ÅlFΓ⌠-█Ä₧qPΘ>T∞═╡∩ô6╖\ßÿ·∞╦┤CPU╦pZÆ⌡∞─DµùûΣ▓?F¥f░æ½LARªcïïVkäòπw▄∙∩)┘_^╤na½▌Ö°z┤@|π╖Γu9£O6tNq─#ß├!
  78799.  
  78800. µA3*'7┤è =ú≤╠+╢+≤▌ß╦ô╜╢ùƒⁿ╢DF¡√╘svX╙ë;V╫OV%~^A╢ç Vkf[½yxº¿%≤╚Gµ⌡┌⌠ÜÑu äqR.g▀¿] í┘┼K\î?ùL5µP│qûA⌡U`αiÜä¥q`╛    2╘█!
  78801.  
  78802. µA3*'7┤è =ú≤╠+╢+≤▌ß╦╛▐╦╨│¿σZW║╢¡
  78803. w▄ù)WàP"k]j≤à^It)_ªnGsΓ¡2⌡╙á▓≈î≥╠üqL@on▐ⁿy:½ë╓XZ£¥5ºW│p╨ΘS\
  78804. *ΦtïÆòVqíN~╛°«£Ñ₧`ìÖ█öy₧πXTºrb½δi₧ùLΓM)îV▐9⌡`⌠┬"éC]╘-╕╥ä4║║²≤║FíαeQ!
  78805.  
  78806. µA3*'7┤è =úÇêp┼;Φ╟ ┼·║╡╝ⁿ╙½@T║⌐Ço{M┬û1BÆMP3.]Ad╢ò\&4JáyZ|º╣`φ╫VΦú┐¢╖ô5âqY|>ÜÿD₧αΣæÇ|¬⌠·lû8q=φb▀│3⌡+}ó3╪ùΩ≥ûαwüÅÆù<b─ÿ>B«ah╪»p¥ù{╬rφk∙>╠S╓≈]≡vWτà└ºmGâÅ╠▌╚9à╤Ttû─√Jo/<g â╣WX|`∙6 0ºÆw9QC√ô(ÿ!
  78807.  
  78808. µA3*'7┤è =úÇêp┼;Φ╟ ┼·ù╓┴╗  J½╛═!!≤è-EÆM>f^{∙æKr?Ñn\gΓ┐( ₧P½▓╛ê≥▌\    ₧`V@zh▀ⁿ1á▌┼^MçH╙2\¥sƒY▄A°X\1σ(≥┤0¥Lp∞4╓╥╒≈▐⌐rå▀ÆçyεΓBF▒crÆ√₧╓KΓLaÄ2░{ÖD_Ω┬t─g╬)╛╫åmpΘεⁿ≈≤í≡ 1╙ë█ dAFQ&º9╙6Rgo∙%Γ!!»ômTfxÜ∞EΓ3ùΓ▄½ª!!¼₧¿■¬ö╤Φ$ⁿE  µ<⌡qR½!
  78809.  
  78810. µA3*'7┤è =úÇêp┼;Φ╟ ┼·ù╚▄¬·äAD¬╢┼ug[ Æù+Pä\V#~O@eƒ├?Wu1J▒<Gbºδ0Φ╤R║ú«▐±▌╫`V.r▀┐h;╕╠╥_£¢VaªF÷!!╣ΦTH *┐$╗≈j¼kPα@8┌ü╙ ╚∞Γd₧òù<ª⌠W▓e    räµ6┌ƒL≥C<╧M╙τ>/╗¬»(■,┤╨à}╜╕≈⌡σ/¼« X░≤ó%+?b4é Σj1ky·'∞%⌐ëf]l| │▓}'ó░╝╥ò⌠╗ô└ëd⌡½φ ⁿ5* "æO╝}KΩÉ{╟xVΘèÆ╔╬╠]Ö┼╞⌠KΣ#≤!
  78811.  
  78812. µA3*'7┤è =úåÄ ▀Φ┌√╔∞╤▐╓╗╤⌐RP¼√╔)R█ù.[ô2.C,kAb≈ò+fn¡oDo░δ!!║éa/à₧╣è≥▌öq@afÜ¿e7ε▌┘IM┘VÜa½Q░|ô▀]N+¡$É╨êJq∞>┘ù└Γî░açÜëçeO├¢>Kñ sç»!!█▄ZεW*▐═τ%!!φ╧}éG╬+┤█åV*≤è╤═╨/î╕ X░≤ó++?bH|¼Dú#8x\─┘àÑd/\╚ê9èN╓≥╘╗²t≈┐┴─Ä~╝≡ë ╔2
  78813. ¬y≡4^óó}┴yR∩F¥ÇÇÜôÜ╪┴ªVⁿ"┐mε!!└ºΦ╨Cg[H1².■¥Dpƒ'₧H┌Vkw╞as₧ε8µeH└ú√%2OY}╫╥╫╦Ä∞K9≈δA₧ü▀S╓)x@R╥⌡6$╤~Æ·╘▐∞│Γ÷╬é▀WÖJαàK-«åè═+«g&²■▌ñ¼+yÆ┌?╖ì≤]¡ⁿ iùY`2M╧▄╝NÉφ~┬τöR╩éH╢xåΘ⌐╬=æπà,ô╟Eíáad╛φ╚╬╒W▐2.Ǻ╤E,╬╥ΩS▄«ô{½╚sΘ7t¼▀fQúV.æ▌╡⌠¥V╚&╖╡àÆñ¥\WI▄vrÉHπΩ╞F∩┴èº[⌠E#o≤6,OïΣìjR├≡╬@/U╓╟⌠2╘Φá<╪ }╟v~╝╦╟┐>┌+>k∩¿⌠Oxyτ$SCEP╧oΣvç¿¢w7╬α««Q«║ÉäfQüqM²FèYO'@ƒ*φº¢}kⁿP^╢8ì║?cε├!
  78814.  
  78815. µA3*'7┤è =úåÄ ▀Φ┌√╔∞╤▐╓╗╤⌐RP¼√╔)R█ù.[ôM>kV    +Γä4 OônZ|ú┐%║ô!!ªñá¢σÅ^╦Wq-Gn╬╣4»╩┼Ü╙}½ódÇ░F,ΣvÖ▀ZÖax¡/ƒ╥╠°î┤{ìMÉÖÖy ║▒GV¡piû÷s│╡6ΦGo╪W▀Vß(bⁿ╬n╟P.╫6Ñ╘├P|╢εñ╫ε¡≤eNτáû#1UoqG&6ç≤4=Q╟ìéñ1*B^╙Ç!!ƒy¢α╨¼⌡cΦ┐▀á≡W╝≈╠Å"    «u∞δÑl═#6åo░╧▒└ƒ|ô▀╓ªO±8╡oí:╓ºΦ═Ph[    ?⌠4ÆΓ>`╤=ï╓ GeÇecÖ≥#µ<╔ΓⁿC0.C>╒═╞òÄτ>┐·[ÜôÉU█l(_T╠Σ-1¥u·æ▒╟┐╗≈│à╦ΓK▄Y│ùP[!!│╥¢╩>φvn╗╜▒┬╔:c╫æ"¿ƒπ¼°∩iùHuwò▄∙Rì°w₧ó╝Xåé¬+_è╜»─;æ±₧~ƒë^≤▓g!!Ω√▐ï°s8P┬?k╙º╞I5═╔√N▄≥àyGΓö<¿ =╢ù:├=ß╦»í▄I╪u¡·ä┴▓╚C╓bNOûYª∞┘W¬ö╩Σ╛-    ïTV#à░¢(CεkìüOvO¥å⌡.æâèR─Xòt{¬═ô│█1=~≤╛÷_U9₧K({KQ└u½fτπ·]Só»│ΓM⌐ΩÉú5cïaA╝'ΘFK8Uƒ,ⁿº¬l!!╣MHÑQ╥ε:i⌡ε∙∞Z╤NogAπt£╓╨d╔▌2┴¡½∩¼ g┼>U#B∩µτ╟òí∞U┘≡ ╥+"<∩╚{r╢╘φ╝V╝êSE▐ÇOìƒc!
  78816.  
  78817. µA3.,(íª</╡≤╠&å6σöµ╩╨╪╤╨Σ▓áK@║½╘r|F~╙è:^ÆM)@cyαÇ
  78818. \&kér@}º╣`ε╓G@║▓┤¢■┘ ╨gwp▀ⁿd<¿╞Ç_GçVçpεÜrô≡TExφgû┌±(ú|┌öâΓ─ÑaìMûê╙rá⌠╢h;ÉΩ ╦╙KºN)îZ╠ 8`φ╬v┼z╚:±ÇìMx▓¬±²╓ñßa^╡σ∞Fo/Pe7₧Ω>YN^═╚─π4Q)%╞┴.àIôΓæ░ε!!°╫δñ¢0ª⌠╠Å_jK;7Ñl∙&zYφ±g┼zkπÉòû£æ%±┐═⌠«Op⌐nφ5à└²╦._yJ/G;■m╙ºmiÆ=¢ƒBKg╞as╜·'Γ H═░»G!!.Cx┘@₧╙╫Wà±G▌ûw╫¥ìélhOÿ░3é{ÆΘÿ█黲║÷┬ª5⌡1⌐éqD1Ñ╚╧(╬2«gv ≥▒╛µ─1u¢ƒ>τ₧±Xí─ûCΩ)y1+å▀∙┘┌6é┤¬Qÿª!
  78819.  
  78820. ╞A3.,(íª</╡≤╠#æ6∩╥αî≥╘╓╤Σ▓⌐PJ╗√╨kgAX╘ïdçOP#`]\eƒ├.Ko0N╖y'Γé.∞╤IΦú┐¢╖Φ
  78821. úmNGn▄│%{ε─┼M@Ü╙sεW╛x╨"╙|:δa£╩ïPu╝9╫╥┴∩î┤{ìMì₧Éy╕⌠E
  78822. gδå∞·l╥mî`στ)b°╦téek╘ ¿╠åmz╡í░ôèo┴¥[U╖▌≥ vORc6╬φpx[Y╟┬]τ╦0UxE╘╝o₧Tƒ≈▀╜°!!Φ╡Å╩┌2╢Ω═Eóo^b{8│iΦ24Iφ╕mè'ⁿèê¥ê╨└╗»ÅÖx]╨╜%╠⌡∞╩J)\M>≡;ƒ¡mvò#É\█Xgæorë╗1⌠7Xê┤α^5pG╝sα┴▄H└ΩR<╢≤@¢╢₧K╥AR!
  78823.  
  78824. µA3.,(íª</╡èâ?ï+î╛åÄ▀┘╠┬╗ασGK║√£_Dgd÷┌~@ÆLQ&z\mO ÅVm/Añ<Gbºδ╒≤/¬╜▓¥πê^░qJ4wp▀òc4íΩ╧LFü^┌Vx½W╛röO╛<%dRêx▀▀WÅUq╛@ ╛°¬≈┬│dì▀┴╬<Gè╞xvå ~òª}│╡6⌠D#╩2░Ü
  78825. dφ≤a╥GG╬9╛ îQzº⌠╕ ε┐±r╘è█4kUBtrÅ╠:tLDñ}!
  78826.  
  78827. ╞A3.,(íª</╡èâ?ï+╗ö ╧Ω▐╤╙▒ƒ╧:Å⌐╔mr\SÆ╔~{ÖIK!!kGc
  78828. ╢ªMR?_ªU]l¡ê/∩╨VHß≈║¢π╟╫{X@zh▀ⁿNâë╧[BÉçVb╝Bªmò╝SVI,Θa▀╠\ƒG}║.¥ ⌐¢ª╔á?║¿ªP;ε╬hW╢d    zÄπs∙┌K╙X?╔v╘ⁿn∞╔lè/⌐V╪τîQ`Äεφ≡≤»·eX∙Θ╝H%VVo<ê¬L]&ñ}á{π²Od.WY█ìoÿNò±▌┤ª!!∞¿ä▐Å2íú¥I╦8IΓûfJLτ╜oÇdU·Æêù¡▐Dù╗»!
  78829.  
  78830. ΘE4%=│¬<<╖─µC╟≤▌∙═Ω╥ƒÿ■╙½@T║⌐Çl{MB┌ü,âWAj|^Pnαä n'\π}y╢¬.■▀PΦêÖ¢αΩ Ü4Nap▀«y+Γñ¬0_¥É5╜V▒zòΦB0αp▀╫M▄Kg∞|╨¥╧·╔úgüæ╒╤e├¢>zΩswä»:┌≡Y╔@"╔ÜQ╠dεΓv╫O)Ç6╖²üWq╜║ó╛█8«⌡lO╝▌√J_%b|8V¬5═2TaeΣ!
  78831.  
  78832. ΘE4.,(íª</╡─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM"oHµä^Ph @▒qR~½ñ.║▀Tí╗╢£√╩R\·3j^╔╣a4ε╟╧MfǃVtáG∞=½∙]II?Σp½╟IÖkz¬▄ç═Γî■3╪0!
  78833.  
  78834. Φ@⌐èhi┤¿ü/ΦUêû╬┬φ└┌╟■µ¡Vπ▓╬ovOS└┌~v╛ltJ\mOΓëk#BíyA*¼¬- ┌▒≈úû≥Å@ ÆuZll▀Åy º╟╟% Ær╗N│säM╝_N=¡$û╨êJq∞9╨ù╩α╔▓=╩`⌡÷∙1╜⌠[BΓiTä┴2╙┌ºO.┴ZÜ⌡ cΩ┬v╓.√,┤╨àqí╝≈∞╬    ╝╥oI╖ΣΦJ dKP6!
  78835.  
  78836. Φ@⌐èhi┤¿ü/┼6τ⌡φ▀√┘╦Å■≈╜PF»»╔t}`W▄Ç2Wà2.C,z]x≤ô^Mn# u]~º¼%ΦÇ$üäç╖╙Å╫`V.m▀▒o7╝ë╬XEÉ╙lεW╛x╨]εTN9πhÜφMÄKz½^Q╣√┬Σ╦╡~ìï╫╙rú⌠½nJoèΩs╠┌\ΓH9╔Mö{ÖDH⌠╫t╟Ok╬+░╚èKz≤Ç≈Ωσ\Φ╒lH▒∩º
  78837. %OXj7âφ1sCUë├Q₧ñK`/C▄┴lî_┐╘┬ù·Oσ╖ä▐└r⌡≈┴▄h]bⁿqΘ |Σ░z╘hI¼æô╙Ü╫M█╒╩δO√p╣j≥6àΦ■ƒIfDG:▒"â╖,%é=æI╙Lbïe.╧û_Ä`L@ê╖┴V<?
  78838. w┼
  78839. ≈╓ÖL└ 1@▐Ωg₧ÿÜäqx^A╟░%ƒeö⌠▄╫=╕¿°╕╠┼ª5⌡\⌐ùU α╚╥S°ÜMT<╗░╡┘ïR■Æ>τ╥¡í⌡²iñEd)öⁿ╥AöΣ$╓τö}«█I╢4@ε├╬¿;╓πèùèO╗⌠G@à╞ⁿïô ^Iπ4?┼░╞Xfï╒╨Kæπ▄pM╖╬ ∞<1⌐═=çQ-æ╟öα╨^╬oπñ╨∞╦┤vJ_╨`T▓s┼┘∞b)▀¿Θû*Æo#¼wrK²═δz ╜rÉ┼Vkÿù╬3ûâèRπ_ò%.Θ┤╣╧~╫wJ}≤╛╛GZα'SB@àr¡AÇƺ≈≤üëlä╫■æNr/Θ    "ò,áSz&F┌q╣êƒf4¼KU│v7ëá:lπ∞░■╘Oo.#M!!₧°æ╗(í∩.╞X¡Ö─⌐⌡g─*v1[≡≈ÿKεô╜ó├Σ "d¢NJ&·«{j▒╨_Zîæ3╫δzE╥ç^ºô╨╪∩P╨S⌡h<║>─æD
  78840. =╨╩±▓⌠zìN Uê─C²α≥ªù`0[a═░z; ┤ê∞+6╗,Ns ╩Γδ/F¬Γ/(ß┼és▄O┬⌠û0▒1+oIJ;±Ußâ!!ΦìIçÖ;rOQ£┼îmΦN·╔─╛ÄD┴Θ±c÷ûêr≈5╤╦²Ω∩*╖Äù≡è ╥~«╛╟εF┬╨[ΦHO0φDI,▄[ª5w┬s╛c)p╟åå"@ⁿ⌠ε!
  78841.  
  78842. ΦI705íü&&¿≤╠+ïπ▐Ω╧Ω║╡╝ⁿ┴áG½│┼;aMU╫ì(WàWjgVCg
  78843. √äMi4╖sk¼ä"≡█Aµ⌡┌⌠ÜÑuéd[.i╫¼a7ú╠╬MGçL╙{üA╝xô▓<%`<ΦwÅ▀MƒJ]í0╓ƒ╞°╪»a╚î╡ÜpOº≈cV╖eP;╣ⁿ6╥┘πH<▄^╬√lΘ╦}╧G`╘0úå├Ez£¼≥√πò!
  78844.  
  78845. ΦJ1>=■╧?,«íâ.½>∞╤éªùò÷█¿²«V½│┼;~MB┌ï:ÇVP".ze≤åK8fkèOcCåτ`≤┌@┐╛úû╖┴^ûfYce╘¿~|∞ñ¬4"ⁿ(Çy¿█∙h⌡_Y3ΣM¢ä╘Qqá|┌û∞≡Γí~ìW▀ûûhí⌡yE»eCΦåZ╪╙^αRuî{≤%├ U┌∩G∩gZΦò▒Θ-ú»Ω≤≤\Φ╨Ioë╨ô8#Huc ü+±#!
  78846.  
  78847. ╚J1>=■╧6 ⌐╣à.¿:∞╓Ω▐╛┼╓▄║¿σAJ╢┐ÇwpARê─2Q₧[=HWRl¼┴    j'H░<Cn½╕0Ω▀PÑñφ▐τ╦çd_om╔ⁿ}$»█≥\[ÇçL5╛U╖oó∩DCx±aç▌\îKz¬fôé╞ε╧ÑcüÖö╙lÅπPa░rP;Æ·╠╪z⌡SBª6ÿ&ß$w°╙}é.Θ1º╙êA4ºª²╛╔╛√kY±⌐≥qNZ&=êJ≈51lΣW┬ÇñZy|T^█æ?Ä^BöΘæ¼⌠dñ¿ä╬ƒ7úµ█GóoZa{jöN┘<As╓±V ~OΦƒìƒ╬÷Fì┘╬π
  78848. ÖxY╙┌:╦┌╕╙Hn@.ß>ù┌(hô1ì▓r(+
  78849. ╜in░╗╓#ê░µ^5v's┐sσ█╫yFòφO#░±L¢╒ôH╨+x\C╞╝IiT°¼≥╓∩N╣┤Γ┐╠à╬[▄K¿ïWBd╖┤â╠9ß qÆ╫ï╟╦1││ù╕╤f0ë╩▒iôDy$ù╥²Mè¡Zµ╬╘=▒öR╖_6ó¢Äασ║╨.ÇåX4Σºh0µÖ▓óⁿpjK▀.ÇÆ√i√Θ╨l│¼▄yG║▀6ß 2╡Æ"âR-├╦»⌡α╚;░ⁿùÅñ┘_OR═.NKï}⌠ σUú└í╬x▄A`ëWC+Ƭûiá"╖╬V5O«ƒ≈;╤φΘ/╤▌x`╜╒╓µ╨e{hπ⌐ñTy#ƒ\4=I]┴*■%╗áâ?;┌å╗¬CÑá┼¼j æwD▒W{áFK0≈▄Ç»R3q╣G_╣h üí0.ïöÖ¬w▓7z1AσeäÖ▒N│≈9└ß«6ü╢≈0├*wb╝≡╣N≤Ľ╕w■▀9UI⌡0,=°╚mi░╤E>₧╧iÄú!!`÷º╬í╕¼Ä9më__╔ 2║%)UüçhEs'τÖƒ╥┘yíFA=╞÷k┬┘▀ÿ«BvB!
  78850.  
  78851. ΦJ1>=■╧?,«íâ.½>∞╤»█≈├╫Å■≤╖T╥╤⌐9ZF@▌Å;âWAjc^Gc≥┴    Pr. U]~º¼%ΦÇ$üäç╖╙â\ô8`dÜ¿e7ε┌╔WOÖ╙Jc»Q┐|₧▀^B9⌡m¥╥\┬/┼.╘ç╬≤┬┤?╚ ì£┬2OÜ∙^WΓi;Å·0╓ƒSεJ*î╩ß+nδ╩"╒Kz╚e±┌îV4▓εⁿ≈≤⌐αcT∙Θ╝w@Tc|╠gëzZqC╠╦Qτ╦05MZ╒è*ó^X╓╕┬╜≡gñ│àΓ£┤ε╠SÅ2 ╕R²qÅ█⌐kWφì█╙¬÷{½≈±┼j╦?ÄC╬¿ìæ╢
  78852. G{B}╣║─U░╛c∞XVKwÄ: îΘ2▓C!
  78853.  
  78854. ΦJ1>=■╧?,«íâ.½>∞╤»█≈├╫Å■≤╖T ¼╔o{╙û9·5-hGUEd≤┴
  78855. QcfBªh[eªδ7≤╩J@⌠₧╣è≥╚ ╔4z)]P≤ÿ!!rº═îI¢╙}½ª|Ö╝^IId≈eì╫XÆVWú,╥å╩⌠└Ñ-σg÷Üü{ú⌠YP▒,JzÉΦb₧▐Qπ.▐XêX│i≡╘8╦Q.═*▓╘├H}╕½╕╜≡║≥oN┤║ÑmBr:╘Jσ"1N═▐ï╡Ze|JB╬ä=ì[ô╛ô╒û Ä╙┐▐ƒ2│úñcªl> ╖y╒ .¬ól╠kσ▒ç╜Å╥M┴û╚πVⁿ4öj∞6îèÆ╢s@eNZg▒║─DÑ╖q≥=ujLó τÆ\≤ 7Q█°»y)N≈(  Ωë≈T Ñ°\ÆÉæS═vxa╨±=C*ÿxƒíÿ╙½δ▒í┬ƒ├▄Y▓âm!
  78856.  
  78857. ΦJ1>=■╧?,«íâ.½>∞╤»█≈├╫Å■≤╖T ¼╔o{╙û9╫HM>fj±╥s3df¡j\aºδ4≥█¡ú┐æ≤Å â|\Gn╬╣j7╝ùÇ}aª&║29εJ▓1╨≥U0Σ$Å▀PÄ{¬@`┼ô╤ ═«g½ÆïÆh¼²R╧
  78858. czÉΦ&╙┌Q≤Rcî^╚óm`≈├8├PiÆq±ΦïMg≤ºδ╛φ½ⁿ P░δ╖JAuCGi âP⌠$yG└┼K╩ºV|B ▐ê<¢[ò°æ▒≥uß¿ç╠Ö;√íñcóo^5░z╝b6ï╕g╓bPΘ/Ü█╙╞╠Mù╨à∩F█╗fΣiàΩ²╦ImaD8╕Z∙₧Dc¥5ÿ]àXekP╢AT«╙
  78859. ╬/tτå»:[S#    ─═êÖ "⌐╨lû═h▓ª▀P╫80qR╫²!!)é6╫│∙└¡ú▒í┬ƒ├▄Y▓â3⌐åçIï+┐e4X∞╖ñ╞ƒpà¥ε┴!
  78860.  
  78861. ΦJ1>=■╧?,«íâ.½>∞╤»█≈├╫Å■≤╖T ¼╔o{╙û9╫HM>fj±╥^No2G∙<RxÑ MÉ╖)ªí╕ò≥ÅÆ4Szh╒╕-%º▌╚╝çr½QΦ=┤(╧af-tím¢Æ¥Lp∞4╓╥╙≈┼▓3ç ▀╟à}º≡YPüokâ√:▄╙Z╣,EÑ^╚µ d≈╙kÄo╥8α£éJp≤»Ω∙▓HΦ└hU¬á╗BhSV&>çµWsaJB╧▀╨╢Py4[╙ò'╤ÖΓæ╣╝eφ⌐æ╠Ä=╜ú└█%╣2╛b2ê╪W╙hWΩF≤δ·τ╓Fì┘╬πk≡Hp≥xΣ?├º±█5@GN Lg▒:ûπ%jò₧C┌Q,(
  78862. ∩flîⁿ&╣Ju√Æ╬cu4[Γ2±÷Ö)lΘèL+Ñ≥Z┼╒╫c≈`a#π▌C*ÿxƒ┌╩╒í┐ ó╪╤ï╜J▓à\3⌐åçIï+┐e7X∞╖ñ╞ƒpà¥~τƒ∙@■╣·;ä0 ô█O╝Aïµc┼ε!
  78863.  
  78864. ΦJ1>=■╧?,«íâ.½>∞╤»█≈├╫⌠¼⌡░^F▒»╙!!3ID╒ùS8■m$xTXnOΓëk#[½sW*╡ó4≥₧V¡≈δî≥╬òx[3zr╙▓jlε╟┴TM┘V₧aªL▓Sæ ∙6σ$ï╓\▄U╛=╩╠â∙╩αΓd├ìÆn» Cg¡mzûµ1╥┌º@=╦J╫²9r╡çy╨E}Äà╘èW4║╜╕≤⌡á┤lU▓σ≥I`TSt?╘Ω8P]W▄╚₧▓-:L^ÜÇoµ0kÆ∙┬¿²uτ▓┴─ö*░±╧╠yIi╤ò1gZε╖)¡2àÉù£à┌aƒîà«Q±6·bσ├╔∙╥)B]5■3╜÷ `╪Y⌡'╢MCdò: ⌐╥╙+α¥┬re=>╗p╖╗╔Eì≡j █`¼Ñ»f∞c╦Σ,"/ûyÜ■╓╞÷·≡ñ╠ÿé!
  78865.  
  78866. ΦJ1>=ìïhi│¡ß@∞}╚┌∙├⌡╥ƒ┴╢≈σ^F½│╧3__╞î~╛QP/i^A5O╥¿-iOπuW&Γ╝)ε╓º≈╢î≡┌Ö`MN
  78867. │êe;╜ë╔JÿÉ5óJ╜x╨B∞T]7≤i┼₧_ôP4¡@8┌ü╙≈╪ú{╚æÅûn    »≥R
  78868. α`Φå═┌Sß&┬I╒÷eúçq╞h╠>╢╧┘PÜ¥╚▀╘%Ç╦Myì╚¥.BuGGuh╬.╩$AnbΦ:■QÉñKbQK╔!
  78869.  
  78870. ΦJ1>=ìïhi│¡╠,ë>µ╟╡îΘ±╙╘╣ßσCB¡╢╙!!3XW└ë-?²6`M\`
  78871. ╢ò\&+J╖t\nΓ╝)ε╓\ü╣ú¢≡╩@╫Pw3^I■≡-;¬àÇM@ÉV╧{║F▒xé_╝WC?≥(▀╔ÉCs┐LQ╣√┬°╚αgÇ▀ïÆnú⌠CA░sJçⁿ0╠╓]ΓEo╬FÜ√(!!ÑπQ±r^ßɱ░4▓╝ δφªα,⌐ßá+tu%ï≡W$yJ█▐å╡4ULJÜò'Ä ÿµ▐╗²uφ╡Åìô8⌡≡▄
  78872. ╠$░0╝f≡░`╙hH¼É┴╗╝·{«·±├Pµ"⌠+╒;└º²═I{F3σ6Ü∙>√]₧@╞XDZwândê uµ7S┌ΓµY75X┬╤▄ÖVÉ∞N>▓√    ¥î▀S╓)x_B╟≤0MP√╛÷╚▐ í┐ ó╩ƒ┬PÆÄïQS~αªç┘/φkuX⌡╗╡╩à+~╫Ö#óÜ≤QQ░±■iÉU`'Ä╓╝Aïµ"üó│@Ö█S¼Uuiùíóü,╔αò=ééNF⌡¡a7µ┤╦┬¢T▐2.Ç╢╓^3╞┴ΩCôΦ▄zG░╩6¿=<╡╦xL¬?K╕╨▓α╔█:▒╡àÆßòGO╨gWÆEïÆ⌐S°ö┘ú÷HÉZH2┤¼âf '╖r£ê V-bßΩì^─«≥>╔)L┘9r╘│║┤╩Gcªß╣J╕gS~╦*·+─╦■$;─└∩½L╜∩█║F[P─jO╝Cv¿R]n╚⌡▓¥mG!!╜MQ»"_ÿ»,m⌡╛Γφε[fI5MπGÉö≤c╩è╤∙öm═σσ&└-v!
  78873.  
  78874. ΦJ1>=ìïhi│¡╠,ë>µ╟╡îΘ±╙╘╣ßσCB¡╢╙!!3XW└ë-àZPoW    +≈ô,\uK%╩>zd┤ñ+ ₧V¡≈║¢π╟╫cWf åòc&½╬┼K╒2║%Eçg·=Ö░[=í8û╨MÖEq╛^|╒₧┬±▀∞3ƒ+ôÜöoC├¢>E¼dJoèΩs╬▐MµL*╪Z╚│)dΩ─j╦@k─│┼├P|╢εñ┌╔5ÿ─Anÿ═üTBdTRk7Ç»W p]]┌Yì0ä▓Nh.P ╬ë*µ0kä⌡╥╜⌡wß¿╧ì│8⌡≈┴ ÅY* *¥R╚Q4^≡╢|═hU°J▐ùÆ£φMêÜà∩Q┤?┤&∩:╔½╕╦Cg]}µ>ƒ√mgötÅA╧MCwâd Ü≥!!δJH6í╢τRq(O
  78875. k┌₧▌▀êµ#╣ΘF£öïN╤"viéΣ,}ÿbü⌠█╙Ñ╡ ÷┬ÿïQôLαùPU'Ñü£▐&φchX╙îò²≡E▓ê>¿Ü░]Σöæ@æAy$âô⌠Aìí4â⌐⌐UâòTπ9├¼┐╒,▀⌠ò:╓éXεªOm*¼√╩╞öXK─z9┼º╠X(╬─╛HàªêaGΓ╙1φ- ⌠│!!├6T⌠┴╖Σ╙O▄!!¬·₧┴Å╥ CÖP^îYª±╙∩₧╚Σ╣hJ£IE#╫░èmK╛rò╚G/ÖÇ≥:▌α⌠(¥ B╕¡╤╓µ╞a{l≥╛αh.ÜK)1
  78876. A╠!!ε`Θ╡ƒ2~╔╙╗¡O¬⌠┘░aüq]∙W:║]A!!_█k²╝┌j0¿Z│j_¥╜~(Σ πß┘Vf
  78877. #M!!πyâù¿    ¿ú ┬Σúb╒å√&┬?vW∞µ⌠╛±┼ò:óΩ]πg&7╝Çh&╛╕os▓εK■╪N úa╝│äÇ╕Y4⌐vΘhg_╙;%:±¬$Ax7c╝π╗╓ì¼X'Uê≤o┬╓¢S≤╦'rA]X⌡t╤"╘àçuM╟@-.:╣│¡╠pσαz7â║τ⌡.╧ß╥x⌠    ^í╘ÄD√ò#ΦîSöû%pTNS╘ü└6Ä@ε┌ù_±ög┘πτ▄δΘçe╫╓¬ε¼U▄Ωxñ┘≤c┼k╛╓b║Ä ÑΦLτ^q0╕QYAZ&Sä7▄1tó0qóu4)]∞ïô=3╕╠╦─7y╟v░■â$ª^Qz&éΣ°C√rÇ╬2 Γ%▌,┐fL*¥Q╙∞<NùN¿╥[èæ┐U)ß±2ûßæc|Äñå╥hi¥w~v╦l¢üßΣ6▐g«7ⁿx,Y╬½ö₧O╡⌡═cß&╜∞ç5┐¥≈FAä┼σG√╙a ╙╫7╔ñ`≥é)"æs.<·║è┬uñ½≡L-æ┬.Æ¿σ⌐≈,└∩Θá<α∩≈├«6T<sëE².7σΩ½¬≡µ<ª}ΣQ2▄┼r▀▄Φ,└≡à√î&Oì>ûB|╣o+=∩╞Γî!
  78878.  
  78879. ΦJ1>=ìïhi│¡╠=î+ΘÄ»═∞╨Ä╕╘¢τzM⌐┤╦~3\^╫─3WâWK..LZ╢▌7Wr#Hªn*åé╩≈fLΦ╛│╥╖╬╫`V.s╙▓j>½ë£OIçÆaìL╗mæ⌡SC fî÷▀K¢Wy⌐(ƒ╥┬Σ╦±=╚9ùÆÇ<╜▒ZQíhJwïΣ6₧£OΓS)├M╫LΣ$u±¥8─M|Ç>±╪èWd▓║√÷áªαeN┐ß▒L'+?f [░µF^▀╞úÑ-5G ▄ì.îIX╓╘°ï╠@╨Ö⌐≥╖ü╦µ-Å6µ<┤+]l╥üH≥Lv▀FëêçåàÜ─┬╖ !
  78880.  
  78881. ΦJ1>=ìïhi│¡╠=î+ΘÄ»═∞╨Äò⌐√▒[ ║╥|!!%<╗╞\üPO/.O[nO√ä
  78882. Qi"┤uGbΓ≈    ⌠╩G¡ÑΘ▐╙µ/.╛P@gdûⁿl<¬ë╘QM╒ÆgεL░=╠²CF6⌡GÉ╙I¥V}« 9ì ⌐ƒ═▓t¥ÜòçoCε≡EC≤  uå»2╠╪⌐─V╔V·>!!⌠╥{╩b╔4┤£└Tqí¿≈∞φ\┐²tTπ≈╗
  78883. ?StrÅJτ#aND╩ìä╡\:BO▀╧mµ0oⁿÖ∩½∙mΓ·∞º≤W╝φ▀─HC╡x╝b6ï╖e┴jH╢F║¿á╛■|╕■·╦g└:₧+îY¼ÄΦ▐KzF╪ú╟ W░¼╚UJBöguÇ■;≈Çâ²E0#
  78884. w┬äÆ╪V╤úK#ú≈▀öì@îeq!
  78885.  
  78886. ΦJ1>=ìïhi│¡╠=î+ΘÄ»═∞╨Äò⌐√▒[ ║╥|!!A█É6╫^V-=69M▀ÅVm#╖tV*»«4≥╤F@┐╛úû╖ô5âqY|>ÜÿD₧αΣ£▀VtáG÷iÿ╝E](φaï₧VÜ(║.┌ô═Γ∩»~ÿ ïÆæp
  78887. ≡£=-úrnÅΩ=╩╠º@=╦ûV≥?f½ï8├LjÇ>ú█╨
  78888. 4窱φá╗┤mI║Φ≥ nCHv7£ ∞=+XY▌ùâ╡Q7+JX╥█oìU╓±æ╒ûα│Æ▌¢*╢δë┴2┐y▓M5Å█■~^α▐∞∙τ╢Aò└╩φG▌j·bσs¿ìæ╢JhH}╒á╟ Q▓ác·,imG╞
  78889. ΣÆ%Γ(OÆΓºs    z)_Σ;≤ßÖSöδ}8░ΩDÜ¢ïTälpqR├Θd4àd═╗┘└    ²·µ┐▀âæ¥Jº╓A-┤Ü╒S╩8¬1/Q!
  78890.  
  78891. ΦJ1>=ìïhi│¡╠=î+Θ⌡²╦δ┌┌█¬ß B¡╝╙!!√è(]£Z>f^f
  78892. Γë]&1F╖t6ïÑ4 ┘G÷≈ô╖─ 5:█4W" █▓ir║┴┼┤ül≡╣{╨]ΩP]9∩p╝╤TîC`Ñ0╓╠«£ÑíaÅÆ₧¥hΓ▒VVÑsD;╢τ:═ƒV⌠"┘\╥V $jⁿç;╥G|╞0ú╤┘S}ºª┘∞τѱnH¬║≥ wTKb;¥Γ3yY╟╚îáZhr!!░∞EΓdôⁿ╫°æ ì╙ê├î1╛µαòE>Rn╓ò    x^σó3ÇIr▀6┐╡░ªαe╛Γφ╔f┤Z╙±2╫ΩδàZMf5y╨▓┌%å=ïF■
  78893. FWnânt₧íuΓ"Oü!
  78894.  
  78895. ΦW!!=¬£;+╢¼ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVjcZJ+≥à^Tc2G¼x@*ú┐`Φ╦LM╝╛║¢╖╔ ╫cV    mhÜ╤[╜▌┴MAûVçe½┐sûε\N1εj▀╔XÅzú|╥ä┬ └íqä╤█ºt╜▒VBñe    oæ»$╓┌K∩D=îP╚V²"uö¡üFa┼,ƒ╙ùqz╖½Ωφ⌠ª≡:⌐≥╜    vU\arìε#1F^▌ìåá@#~.&╖δF╡Nâ⌡!
  78896.  
  78897. ΦW87¿â7*«áâ$ΦUêû╬┬φ└┌╟■σ¡VW╖╛╥;g@SÆû;QÆVR/|ZxO└úSJr?Cª<Pe«º%∙╩Kª≈╢ì╖╦
  78898. ÆfS    `e▐ⁿo+ε▐╚\\¥ü{╟Jó=Ö ∞]J=∩pî₧X▄}Z⌐▌ç╬╢▄▓|ÿìÅè<Gè╪dtïD5Uº╪≡Ωr«mí5╖|Ürⁿ╦~éJo╙ƒ┘öazªú!
  78899.  
  78900. ∩A0?;-⌐ΓX@°êé9Æ:≤öε┬╛ï÷≡░τ¿ebìÆßUG╞î?F╫\E$.YV+σär)ªrFgº╣!!ε█á▓≈¢√╩Ö`M@afÜ¿e7εñ¬0ZÉûc½Q°=╛O▐=0Φw▀╔PÉN4╛5└ùâ≈┬αvÜÉë╙u    εσ_AΓrxçµ%█═εRo┬P╬V≥mb÷╦t╟Az╔0┐Æ┴)▐─æ└≤ñ≥ c╖σÑ/ pKs7£╩$t]V╚╚K╩ê|c)Nz√│¬t6!
  78901.  
  78902. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR╗╛╓~GF╫û~TàVA$jWJ+≤Ö
  78903. Lg*▒yCxº╕%⌠╩Cí╕╣▐°╔\
  78904. ƒqkc▀╡{7╝ë╘Vö%çp»N°?²kæ;& ⌡vÜ▀T±(┼=└¢└╞▐⌐}£W▀êûp    ⌡£=-╦ncû▀&╩àú    aí5│÷!!g╣╫j╦Lz÷>╜╔åkzΘε∙═⌠¡⌡m╘è█ 1qTP
  78905. krÇ√d[
  78906. ëSä!
  78907.  
  78908. ±V.!!Ñâ',òº╓jä ⌡╞Ω═≤║╡╝ⁿ┬╖ZU╛»┼;>w┬ö;\ôEjj^En∙æK& ]¬y]n«▓`ε█Z╜╢╗▐σ╩ Æg[za╬╡b<ε╞╞\¥╙p¡F┐kò╗B"cQªr₧╥LÖ4╕|╥í╫Σ╔í~╞M½ôÜoOºΓM¼tuåΩ7₧╦PºQ=├I╙÷ml÷╒}éK`╞0ú╤éP}╝á╕°∩ΦαhY∙Σ╖iIEt_Σc≈pp\C└┘Qé¿T-3Q ╥ä=╦S ╓∙╒╜≥uφ╝ÿ─ö9⌡≈┴ Å
  78909. 5¿2æev∩íe┼`^ΓƒòÜü╤╡┘╤π┤4?╢gε$à≤≡┌ZpKF3τ2¥π$jƒtÉHƒ
  78910. DRqâseâ∩<φe]╞ΓαU;?I>╘│╕░Môúxä╧`╗¬⌐f≥P═α!!)ê ╫≥▐Æ╕·∙╖╪╦─QÖαåPBdÑè¢┼.φvn∩■ñ┴à>}äòl│ÜΘ¬²╗9æI~#`φ║ΦS┘Γ8é│╕Z₧ê¬>_├¬¿═%╘≤ä7Öë
  78911. ∩░Ol%╣┤╓─╒PH▀?eé┌⌐'Vó▄╛\¥Ωël╛▒Ya╙85╢╦q░fδ┴╢τ¥M▄9╢≡¡┴«╙EtδA=n▓h├Ω╥Hç±Ñ═╣r    o≤2/O¼■çpKS├≡¿+-|
  78912. çüº4╫α⌠>╙ ^òi|░╫╟ëä1\≥⌐ßGq
  78913. ╩A4'
  78914. z≈
  78915. ▐Pàò▓%,╟╘∩ªM±áδσjGX─ ²vn╗PO9╧9≡╜Ä$G3ÑKY»EQσ─W    Å└πφ▐g$~$N^÷}䥲▓Ω3╫-π°,└ûτ5╔9~!
  78916.  
  78917. ±Q%<+¼è6⌐╣ë)æ,î╛åÄ▀┘╠┬╗ασRπù╧tx]Fµà<^Æ%hGc
  78918. ╢▌?Jv#L╖"@*▓╛"÷╫Q¡│≈£εÅÆ4Lme╙¬h αï¡3% ÅVt╜S│~ä╝M"cQαwÅ█ZêQ4÷]|ⁿÉ╔≤╧┤3ÿ¥ùÜo½⌡vW▓e    oæí^┤╢LΓM)îV╔8µ!!m╣¬½+g╞░╨ÉA.≤├Æùëoô╝sY╡µ≥uC|`=º ═>t≥*äQτ╦0U*E▄» ƒt ܬæâªuφ·¥ìë;╣σë ┌ ;"╛p⌡|ZµÉz╨hX°─┴Æ¥╧Mÿ┬╓ªDµ=Är±6∞Θ■╨@}F;ts£]·╔,vü1£Z╠!
  78919.  
  78920. ≥A3*'7┤è =ú≤╠+╢+≤▌ß╦╛▐╦╨│¿σ@V╜¿├izXBÆÆ?^éZjxZ_~
  78921. ¢δwU#[πh[oΓ╜!!÷╦G@º▒≈è ╩\ûy[.p╚│}7╝▌┘GôVçpεQ│~òΩT]Exαw▀═L₧Qw╛    ,╟ù╟╢╬╣3£Ü█■f≥τVV½aoíα>╬▐KεC#╔ûVα8cΩ─j╦RzîÑ╙├P|╢εñΦßí⌡nHÜ∩┐qOWcl┬J⌡<dJïzº|α╚g~9OJÜÆ*ƒjÖα╘¬Φx═╛█ì╥-░∩╧I╞<▒yªOul÷ú`╬j¼èä₧╘ƒ[Ä╘╓σP²$·}α?╨Γóƒ GeZ!
  78922.  
  78923. ≥A3*'7┤è =ú≤╠+╢+≤▌ß╦╛┴▐┘½≈ U╛╖╒~"?É╖;F╫KL/.MRg≤┴_&2Gª<]k»«$║╬P╕▓ÑèεÅ╫`V.r▀┐h;╕╠╥\ÜVçpεá|é²_[*7∞t₧╩P₧Nq≥L|┼ô╧π╔ε1σg≥±·B½²Q▒eKÉα#█═K■h+ûÆ÷!!g╣╬|φD@┴2┤å├EGº╝±≡τOΦΓaP¼σΦJdJ@!
  78924.  
  78925. ≥A3*'7┤è =úÇêp┼;Φ╟ ┼·ù╓┴╗  J½╛═;eIZ╟üdü^H?k69M┼ä
  78926. r.JπjRf╖«`⌡╪á▓≈Äσ└ à`G@afÜ¿e7ε█┼ZM£û5╣Jóu╨lû86⌡aÿ█K┬Pà3 ·╢Å╢╚⌐`ÿ¢╫╙}¬▒ râR#Z¼█m₧╠JσR,▐V╩┐mhφ┬uÄ/⌐+╛£ùLq≤≥╬▀╥/ë┌T∙≥╖`UPr3Ü∞p~I▌╚Q╓Ä[g9@Xä═o¥[â⌡ƒ·æ ë╨Φ╤┌.┤±─Å6R╤òuMóδ4Ç{Zα¢┴Æ¥ΘIë▀─ΦV║Z╙{α!!╚⌠╕àGMf5y╨▓┌%ƒ1ê▓r(Rböms═δ'∞ N▄╗▀B%`
  78927. j╙₧─╪Hà╣<╢φ≥ ÷T█ >-{½Ö-+₧gÆ╥▄êN¿│Γª┬Åï2÷1╔éIW#│╚╧[▌+┐"p ╗πφÄ≤ N││ù⌐─w9╔ôÆ@Ω)y19ò╞ªó┼┐ù£`⌐│xô
  78928. 00ª¢ô°Σ─ó░║'lê▌f-¼╥┘╟å ±≤çΓ~π ╬x│╓╣[v¢∞<╒gY╨╖Xδ)Iδ₧·±▄I╨&╬ƒ∙Φ│╪ p]╒>NUùPïÆ!
  78929.  
  78930. ≥A3*'7┤è =úÇêp┼;Φ╟ ┼·ù╔╘▓τá    ⌐║╠nv%<╗╞WâP"kEjπä^V`f[½yz░ñ0 ╠VΦ╕▒▐π╟^àq]gv▀«-%º▌╚£çr½QΦ=┤(╧af-tí`û═IòF8∞3ôå╦≤î═ß;╛⌐║]!!Ü▒EA▓rhçß'▀╦VΦOo├YÜ√(!!ÑΦz╚Gm╘a²£òExª½╢╝ìl┼₧    @∙≡│vC
  78931. trÆgë~&p]ôJìï¡Lh|B_∞Ç=é[ é╛╝╥òqσ¿î▐┌dΦúφ ⁿ5* "æO╝qH¼▄⌐}Z■ ì┴â£╨X₧─╤ rß╗g⌠6ƒºε▐%oZ8²1╙ÜG °=æX╨Dkg▄ däΦ%Ωe1ó╦åQ=;M
  78932. $ûR╚╙╦öúw≈╔}á▒╢tε sh|¿ÖMjTÿjúΘ═╫T∞ü╒ƒ°╗Ωk┐pƒ┤wyàá╗*√ÖPC>╞╙┌º¼V₧£
  78933. ªäπQKΣ┬▀░pQ.»∞%╬o⌐─╕₧ìa╛ª╬Rviô¿╡╠:ï░Ç?äèYkï▌fv!!╛┬┘╟╧Y_M╞!
  78934.  
  78935. ≥A3*'7┤è =úÇêp┼;Φ╟ ┼·ù╚▄¬·äAD¬╢┼ug[ Æì*WÜL<oWFnU╢ùUs#"╔Yº┐`ε╓G@╛╢╗ï≥Å╫`V.p╚│}7╝▌┘GôVçpεQ│~òΩT]I/Φpù│3⌡}ó9╘ù╤¿îäZ╗=╢┐▀< ºΓGMª,Jzîδs╩╫Zº▐M█¡mn ç$⌠c\ΘƒΦ▌┘╟δδΓ½µiL¡≤■J qCX*rÜú8t  6 8½Åm3|QI╩ô*ÿ_ é±┼▒≤oñ╡çìÄ6░úñcªY    ┐hóC4Iπ╜|┼#ül≤δ·ÆƒXÜ─╚⌡Γ"·wîY¼±∙═Z4H1Σ2╙÷>SÉ&ûO╤ /    ∩paƒ÷&úPx∞ï▄gx8SσZ╨╫╬
  78936. kΩèL+Ñ≥Z▀¢₧J█?b0╨Γ%}åeâ≤éÆ*àë┴ƒ∩┤√m│hà╢qoòª╞S┼+ágbB╗÷æ▄╫>h╫ì%│ǬÑδ▓iéRw$W╟┌∙Mè»Zµ╬«Qå¥╬Rvièº▒╬"╘┘öd╓âC±╜ $I└¥▒═ÖVWÉzc╓╢╤
  78937. *▀Çú▄╨¿Vfï∩)▄╫┤!!âRM■≡¿⌠╪¥ç▄ú▒ÇΘ<ncΘV!!k╗n╥┴≡r"╪╛ΩÖx▄A k≡R@û¿æmQR(èK¬±c"L'┤╖╒Φ╦╥Σ/xßD'╘│║╧▀cs|╝√⌠Gn:Ö#P#@└;█dÑ√╫97─!
  78938.  
  78939. ⌡]76óÇ/öªé/▀Σ╠∞╔ε├╓┌░┌ñ]G│╛╥!!≤ê3]äK+bWB+ ÆXr%Gπu]~º╣&√▌GΦ┐╢ê≥Å^ä}PbeÜòY+╛╠ΘWNÜZ╙zεB╕nçε[9⌡$ê╠XîRq¿mV║¢═╢═«3╘,º▓¥h
  78940. ╝≈VGºTkç╬=▀╙F²D=ÆÜV└$o·┬8╦V.═>¿£üA4ó╗±ΩσF╜τeZ¼∞■J`Y&1Å    δpx[ë>╦Qτ╦0c3X├æ*╦S É ├╡²uφ╡Åìô-⌡Γ▀╞    6    ≡<ΦqQó░g╙z^■Fèëû╬═Mê├╔≥√p┐}α?╨µ∞╓A)[L}¡9Ü√,aÿ7⌐O╙@@oâ>,αæ\µ&Y╪╢µX?Kz┌╠£¢)lφë5>«∩L╢¢ÖH₧%+~U╬░IiT°eæ╧╩╟ ÷·£▄óΓódÇ░ìqO4Ñ╗ü─j▒ qÆ╫á╟±&aÆ│"íç░LΣΩ■%àw2│╩∙iùτ8╓τæ{⌐║kå*3ª¢ÿσ ≈╤ÑóΩ oê▌fMú≥÷─¢ ±8╒º╞X|▀┘εO╡ΦÜfkñ≥<φttüαqPΘ>T∞═╡∩⌡Z╙1»≡é┴╖▄SYΣY@6⌠5Åæ╘^∩▓┬ó÷rB╤z~Ä┤çAÅlÿ═[ j╦êΘ┴■σ╙BÅ9~░φ╩╢≈x`»√αCz6ƒB.TDF└=δd¬ñ¬ySó»æ╢[╗σ∙▒iP!
  78941.  
  78942. ≈E+0U╬µp┤║¢/ù⌡▄Ωîφ╟┌╓╖≤⌐S¡┤╨~a\OÆô6[öW#}Gc
  78943. ╢à_g3C╖<Ek«╛%║╪MΦú┐¢╖▌Æ}H|.╖╓»└╙\ö╙>GïpâQñ$εC@xΦb▀╩QÖf⌐9┌ä╞Σîñ|ì▀ò£hOª≡AAΓ  ;åΩ5▀╩S≤9═S╧│=s÷╫}╨VwÄ}▄╢ε.ì╜²≥µF»±tl½∩óq_|<r¬#╨'UpfΦ;°4!
  78944.  
  78945. ≈E+0bΣÖ3%»¼ß@∞}╥╤√îΩ▀┌ò¡ΓáPJ╛╖ÇkaGF╫û*K╫HL#mSb╢ò\&"JÑ}Ff╢δ6√╥WΦ▒╕î╖█╫f[ki╠╣|├ú⌐kI£ûVtá₧O╡2╔}{,*≤kì₧PÜ`ñ|┴ù└≤┼╢vÜM¢öûoOá■C¬a~┬»2₧█Zß@:└KÜ≥!!tⁿçh╨M~┼-Ñ┼═┘├Æù≤ñ≥ O╝⌠éuCGèPú3Byφ(√0ªö|-*B@╧äu╦LÜσ╘! !
  78946.  
  78947. IEnumXXXX comment:
  78948. ''!
  78949. !IEnumXXXX class methodsFor!
  78950.  
  78951. defineFunctions
  78952.     "Define the vtable for the IEnumXXXX interface. The vtable is common, but
  78953.     the type of element enumerated is different for each subclass.
  78954.  
  78955.         IEnumXXXX compileFunctions
  78956.     "    
  78957.  
  78958.     self
  78959.         defineFunction: #Next:rgelt:pceltFetched: 
  78960.             argumentTypes: 'dword void* dword*';
  78961.         defineFunction: #Skip: 
  78962.             argumentTypes: 'dword';
  78963.         defineFunction: #Reset;
  78964.         defineFunction: #Clone: 
  78965.             argumentTypes: 'void**'
  78966. !
  78967.  
  78968. elementClass
  78969.     "Private - Answer the class of element enumerated by the receiver."
  78970.  
  78971.     ^self subclassResponsibility
  78972. ! !
  78973.  
  78974. !IEnumXXXX methodsFor!
  78975.  
  78976. batchSize
  78977.     "Answer the number of elements to retrive per hit. 
  78978.     Implementation Note: By default we retrieve 32 at a time to cut down the
  78979.     number of calls across the interface, but you may find that some IEnumXXXX
  78980.     implementations don't work correctly for more than one item at a time
  78981.     because VB only asks for one each time. If that is the case and a For..Each
  78982.     seems to work in VB, then try overriding this to answer 1. On the other hand
  78983.     if each Next call is very expensive (i.e. it is remote) then one can override
  78984.     to increase the batch size)."
  78985.  
  78986.     ^32!
  78987.  
  78988. Clone: clone
  78989.     "Private - Invoke the IEnumXXXX::Clone() interface function."
  78990.  
  78991.     <virtual stdcall: hresult 7 lppvoid>
  78992.     ^self invalidCall!
  78993.  
  78994. collect: transformer
  78995.     "Evaluate the <monadicValuable> argument, transformer, for each of the 
  78996.     receiver's elements in the order defined by the receiver's implementation of #do:.
  78997.     Answer a new <sequencedReadableCollection> containing the values returned by 
  78998.     transformer on each evaluation."
  78999.  
  79000.     | answer |
  79001.     answer := OrderedCollection new.
  79002.     self do: [ :each | answer addLast: (transformer value: each) ].
  79003.     ^answer
  79004. !
  79005.  
  79006. contents
  79007.     "Answer a <sequencedReadableCollection> containing all of the elements of the 
  79008.     receiver." 
  79009.  
  79010.     self reset.    
  79011.     ^self upToEnd!
  79012.  
  79013. copy
  79014.     "Answer a new enumerator of the same class as the receiver enumerating
  79015.     over the same elements."
  79016.  
  79017.     | clone |
  79018.     clone := self class newPointer.
  79019.     self Clone: clone.
  79020.     ^clone!
  79021.  
  79022. do: operation
  79023.     "Evaluate the <monadicValuable> argument, transformer, for each element 
  79024.     in the receiver's stream of elements."
  79025.  
  79026.     self reset.
  79027.     ^self upToEndDo: operation!
  79028.  
  79029. elementClass
  79030.     "Private - Answer the class of element enumerated by the receiver."
  79031.  
  79032.     ^self class elementClass!
  79033.  
  79034. errorEndOfStream
  79035.     "Raise an error to the effect that an attempt was made to read off the
  79036.     end of the collection over which the receiver is streaming."
  79037.  
  79038.     ^Stream endOfStreamSignal signal: self!
  79039.  
  79040. newElement
  79041.     "Private - Answer a new, empty, object to hold an element enumerated from the receiver."
  79042.  
  79043.     ^self elementClass newBuffer!
  79044.  
  79045. newElements: count
  79046.     "Private - Answer a new, empty, <ExternalArray> of sufficient size to hold <integer>, count, elements
  79047.     enumerated from the receiver."
  79048.  
  79049.     ^StructureArray length: count elementClass: self elementClass!
  79050.  
  79051. next
  79052.     "Answer the next element from the receiver.     
  79053.     Raise an EndOfStream exception if there are no more elements."
  79054.  
  79055.     | element |
  79056.     element := self nextAvailable.
  79057.     ^element isNil
  79058.         ifTrue: [self errorEndOfStream]
  79059.         ifFalse: [element]
  79060. !
  79061.  
  79062. next: anInteger
  79063.     "Answer a collection of the next anInteger elements from the receiver.
  79064.     Raise an EndOfStream exception if anInteger elements are not available."
  79065.  
  79066.     | elements |
  79067.     elements := self nextAvailable: anInteger.
  79068.     ^elements size = anInteger
  79069.         ifTrue: [elements]
  79070.         ifFalse: [self errorEndOfStream]!
  79071.  
  79072. Next: next rgelt: rgelt pceltFetched: pceltFetched
  79073.     "Private - Invoke the IEnumXXXX::Next() interface function."
  79074.  
  79075.     <virtual stdcall: hresult 4 dword lpvoid dword*>
  79076.     ^self invalidCall!
  79077.  
  79078. nextAvailable
  79079.     "Answer the next element from the receiver, or nil if there are
  79080.     no more elements."
  79081.  
  79082.     | element fetched |
  79083.     element := self newElement.
  79084.     fetched := DWORDBytes new.
  79085.     self Next: 1 rgelt: element pceltFetched: fetched.
  79086.     ^fetched asInteger == 1
  79087.         ifTrue: [element]!
  79088.  
  79089. nextAvailable: anInteger
  79090.     "Answer a collection of the next anInteger elements from the receiver,
  79091.     or as many as remain if fewer."
  79092.  
  79093.     | elements fetched fetchSize |
  79094.     elements := self newElements: anInteger.
  79095.     fetched := DWORDBytes new.
  79096.     self Next: anInteger rgelt: elements pceltFetched: fetched.
  79097.     ^elements length: fetched asInteger!
  79098.  
  79099. position: offset
  79100.     "Set the current position of the receiver in the enumeration.
  79101.     Note that the argument is a zero-based offset from the start of the stream.
  79102.     Raise a BoundsError if the specified index is out of bounds.
  79103.     Implementation Note: IEnums allow one to seek to one position past the last
  79104.     element, and #nextAvailable will then answer nil. This is not 100% compatible 
  79105.     with the normal PositionableStream behavior. Since it is necessary to reposition
  79106.     within the stream by skipping to the start of the enumeration and then moving to
  79107.     the absolute position, performance for random access will vary depending on
  79108.     the underlying implementation of the enumeration."
  79109.  
  79110.     self reset.
  79111.     (offset == 0 or: [self skip: offset]) 
  79112.         ifFalse: [self errorSubscriptBounds: offset]!
  79113.  
  79114. printContentsOn: aStream
  79115.     | tooMany |
  79116.     tooMany := aStream position + #() maxPrint.
  79117.     self do: 
  79118.             [:each | 
  79119.             aStream position > tooMany 
  79120.                 ifTrue: 
  79121.                     [aStream nextPutAll: '... etc ...'.
  79122.                     ^self].
  79123.             aStream print: each]!
  79124.  
  79125. reset
  79126.     "Reset the receiver to the beginning of the 'stream'. Answer the receiver."
  79127.  
  79128.     self Reset!
  79129.  
  79130. Reset
  79131.     "Private - Invoke the IEnumXXXX::Reset() interface function."
  79132.  
  79133.     <virtual stdcall: hresult 6>
  79134.     ^self invalidCall!
  79135.  
  79136. select: discriminator
  79137.     "Evaluate the <monadicValuable> argument, discriminator, for each of the receiver's elements.
  79138.     Answer a new <sequencedReadableCollection> containing only those elements for which 
  79139.     the discriminator evaluates to true."
  79140.  
  79141.     | answer |
  79142.     answer := OrderedCollection new.
  79143.     self do: [:each | (discriminator value: each) ifTrue: [answer addLast: each]].
  79144.     ^answer
  79145. !
  79146.  
  79147. skip: anInteger
  79148.     "Advance the receiver's position in the stream by anInteger elements.
  79149.     Answer whether the request was successful (e.g. an attempt to advance beyond the
  79150.     end of the enumeration will answer false).
  79151.     Implementation Note: Only advancement is possible (Skip() takes an unsigned argument.
  79152.     In order to perform negative skips we would have to reset the current position and
  79153.     reset, then skip forward as appropriate).
  79154.     This is not 100% compatible with PositionableStream>>skip: as it cannot skip backwards
  79155.     and does not handle attempts to skip beyond the end of the stream in the same way."
  79156.  
  79157.     ^(self Skip: anInteger) == S_OK!
  79158.  
  79159. Skip: skip
  79160.     "Private - Invoke the IEnumXXXX::Skip() interface function."
  79161.  
  79162.     <virtual stdcall: hresult 5 dword>
  79163.     ^self invalidCall!
  79164.  
  79165. upToEnd
  79166.     "Answer a collection consisting of the remaining elements in the receiver (i.e. from the current
  79167.     position to the end)."
  79168.  
  79169.     | elements elem |
  79170.     elements := OrderedCollection new.
  79171.     self upToEndDo: [:e | elements addLast: e].
  79172.     ^elements
  79173.     !
  79174.  
  79175. upToEndDo: operation
  79176.     "Private - Evaluate the <monadicValuable> argument, transformer, for 
  79177.     each of the remaining elements of the receiver.
  79178.     Implementation Note: To reduce round trips to the server object, the elements
  79179.     are fetched in blocks of <N> at a time, where N is configurable. Note that we
  79180.     stop enumerating when the object returns fewer elements than we ask for, since
  79181.     it seems that some objects have a bug whereby they will restart the enumerator
  79182.     after having read off the end. See #batchSize for further information."
  79183.  
  79184.     | count |
  79185.     count := self batchSize.
  79186.     
  79187.     [| elems |
  79188.     elems := self nextAvailable: count.
  79189.     elems do: [:e | operation value: e].
  79190.     elems size < count] 
  79191.             whileFalse! !
  79192.  
  79193. IErrorInfo comment:
  79194. '<IErrorInfo> is a wrapper class for the standard OLE Automation interface IErrorInfo.
  79195.  
  79196. IErrorInfo is the interface used to make available extended error information to a client when an exception occurs and an HRESULT failure code is returned.'!
  79197. !IErrorInfo class methodsFor!
  79198.  
  79199. defineFunctions
  79200.     "Declare the virtual function table for the COM interface 'OAIDL.IErrorInfo'
  79201.         IErrorInfo defineTemplate
  79202.     "
  79203.  
  79204.     self
  79205.         defineFunction: #GetGUID:
  79206.             argumentTypes: 'GUID*';
  79207.         defineFunction: #GetSource:
  79208.             argumentTypes: 'bstr*';
  79209.         defineFunction: #GetDescription:
  79210.             argumentTypes: 'bstr*';
  79211.         defineFunction: #GetHelpFile:
  79212.             argumentTypes: 'bstr*';
  79213.         defineFunction: #GetHelpContext:
  79214.             argumentTypes: 'dword*'
  79215. !
  79216.  
  79217. fromEXCEPINFO: excepInfo guid: id
  79218.     "Answer a new instance of the receiver on a system extended error object
  79219.     with details from the <EXCEPINFO> structure, excepInfo."
  79220.  
  79221.     ^(ICreateErrorInfo fromEXCEPINFO: excepInfo guid: id) errorInfo!
  79222.  
  79223. source: sourceString description: descriptionString 
  79224.         helpContext: anInteger helpFile: helpFilePath
  79225.         guid: aGUID
  79226.     "Answer a new instance of the receiver encapsulating all of the specified details."
  79227.  
  79228.     | ice |
  79229.     ice := ICreateErrorInfo new.
  79230.     ice SetSource: sourceString asUnicodeString.
  79231.     ice SetDescription: descriptionString asUnicodeString.
  79232.     ice SetHelpContext: anInteger.
  79233.     ice SetHelpFile: helpFilePath asUnicodeString.
  79234.     ice SetGuid: aGUID.
  79235.     ^ice errorInfo! !
  79236.  
  79237. !IErrorInfo methodsFor!
  79238.  
  79239. description
  79240.     "Answer the error description from the receiver."
  79241.  
  79242.     | answer |
  79243.     answer := BSTR new.
  79244.     self GetDescription: answer.
  79245.     ^answer asString!
  79246.  
  79247. excepInfo
  79248.     "Answer an <EXCEPINFO> containing most of the details from the receiver
  79249.     (with the exception of the guid)."
  79250.  
  79251.  
  79252.     | ex bstr |
  79253.     ex := EXCEPINFO new.
  79254.     ex scode: E_FAIL.        "No other hresult available, caller might be able to substitute something more specific"
  79255.     bstr := BSTR new.
  79256.     self GetSource: bstr.
  79257.     ex bstrSource: bstr detach.
  79258.     self GetDescription: bstr.
  79259.     ex bstrDescription: bstr detach.
  79260.     self GetHelpFile: bstr.
  79261.     ex bstrHelpFile: bstr detach.
  79262.     ex dwHelpContext: self helpContext.
  79263.     ^ex!
  79264.  
  79265. GetDescription: pBstrDescription
  79266.     "Invoke the GetDescription() method of the object wrapped by the receiver.
  79267.     
  79268.         HRESULT __stdcall GetDescription(
  79269.             [out] BSTR* pBstrDescription);
  79270.  
  79271.     "
  79272.  
  79273.     <virtual stdcall: hresult 6 bstr*>
  79274.     ^self invalidCall
  79275. !
  79276.  
  79277. GetGUID: pGUID
  79278.     "Invoke the GetGUID() method of the object wrapped by the receiver.
  79279.     
  79280.         HRESULT __stdcall GetGUID(
  79281.             [out] GUID* pGUID);
  79282.  
  79283.     "
  79284.  
  79285.     <virtual stdcall: hresult 4 GUID*>
  79286.     ^self invalidCall
  79287. !
  79288.  
  79289. GetHelpContext: pdwHelpContext
  79290.     "Invoke the GetHelpContext() method of the object wrapped by the receiver.
  79291.     
  79292.         HRESULT __stdcall GetHelpContext(
  79293.             [out] unsigned long* pdwHelpContext);
  79294.  
  79295.     "
  79296.  
  79297.     <virtual stdcall: hresult 8 dword*>
  79298.     ^self invalidCall
  79299. !
  79300.  
  79301. GetHelpFile: pBstrHelpFile
  79302.     "Invoke the GetHelpFile() method of the object wrapped by the receiver.
  79303.     
  79304.         HRESULT __stdcall GetHelpFile(
  79305.             [out] BSTR* pBstrHelpFile);
  79306.  
  79307.     "
  79308.  
  79309.     <virtual stdcall: hresult 7 bstr*>
  79310.     ^self invalidCall
  79311. !
  79312.  
  79313. GetSource: pBstrSource
  79314.     "Invoke the GetSource() method of the object wrapped by the receiver.
  79315.     
  79316.         HRESULT __stdcall GetSource(
  79317.             [out] BSTR* pBstrSource);
  79318.  
  79319.     "
  79320.  
  79321.     <virtual stdcall: hresult 5 bstr*>
  79322.     ^self invalidCall
  79323. !
  79324.  
  79325. helpContext
  79326.     "Answer the <integer> help context associated with the receiver."
  79327.  
  79328.     | answer |
  79329.     answer := DWORD new.
  79330.     self GetHelpContext: answer.
  79331.     ^answer!
  79332.  
  79333. helpFile
  79334.     "Answer the path of the error file associated with the receiver
  79335.     (used in conjunction with the error context)."
  79336.  
  79337.     | answer |
  79338.     answer := BSTR new.
  79339.     self GetHelpFile: answer.
  79340.     ^answer asString!
  79341.  
  79342. printOn: aStream
  79343.     "Append a developer friendly textual representation of the receiver to aStream.
  79344.     As OLE interfaces are opaque, pure, interfaces, we revert to the basic
  79345.     implementation, but include the address as this may help."
  79346.  
  79347.     self isNull ifTrue: [^super printOn: aStream].
  79348.     aStream 
  79349.         basicPrint: self;
  79350.         nextPut: $(;
  79351.         print: self source;
  79352.         nextPutAll: ': ';
  79353.         print: self description;
  79354.         nextPut: $)!
  79355.  
  79356. source
  79357.     "Answer the error description from the receiver."
  79358.  
  79359.     | answer |
  79360.     answer := BSTR new.
  79361.     self GetSource: answer.
  79362.     ^answer asString!
  79363.  
  79364. sourceInterface
  79365.     "Answer the IID of the interface which raised the error."
  79366.  
  79367.     | answer |
  79368.     answer := IID new.
  79369.     self GetGUID: answer.
  79370.     ^answer! !
  79371.  
  79372. IFont comment:
  79373. '<IFont> is a wrapper class for the COM interface ''OCIDL.IFont'' generated from type information in the ''OCIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  79374.  
  79375. The type library contains no documentation for this interface
  79376.  
  79377. WARNING: This comment was automatically generated from the interface''s type information and any changes made here may be overwritten the next time this wrapper class is so generated.'!
  79378. !IFont class methodsFor!
  79379.  
  79380. ΓH41U╬µp¿áÜ+æ:íÖ»φ≡─╚╨¼▓▒[F ÿ∞HZl▌é~FƒZ)aX_jσ┴Vjr"i¼rG#Γ¡/Φ₧Uí┤┐▐π╟^àq]gv▀«-;╜ë╘QM╒ût╗Oó=ÖΦT]9Γa╤│3⌡╞mV║¼α┌ ëW╚ ìö₧O╝°YC° M`╥═ìè╖böyâG╛|0┌Γ5¢fKôrßîóe$π·┌▄╕S∙Θ'1╙!
  79381.  
  79382. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3Mjo╓╣#ê╞╬M°|·\êL╕i╨∙WF=╒aÆ╬U¥Vq┴jUæ ⌐¢ª╔`ìÖ÷∙f¬⌠QM¼e,nî∞'╫╨Q╜l╦Z╬)▌,lⁿ¥¿+⌐>ú█ûIq╜║╠τ≡╗« ╗≤ªH"8a[èσ>tiE╟┘à»-SY╬╛èW╠¥╗╤òσ¿å╪ù;╗≈²▀$QRD╛oΦ3Å█⌐i^ΩÉä╡¢╤KÅ▀╩Φ┤Q7┐▐╠²²àw,&oH/÷"₧≥#qÑ-ÅK╠Bræorë▒r╕gO5íªΩQ84O?k╪╩█╓J\└áL?ú└zûÅÜ│FQ9)╨≈18ƒxúΓ╚╫÷·╢º▄ä┘[█═ε,? Ñöå╬ ╕le ≥▒╛öà|vÆÄàçⁿPK╔ôÆ@ΩAb0è╓ΦtDZ2ƒ²²êöH»rX[ε├╬¿-╘÷Ö0ôí_Γák*≡┤¢█Çnf┼6/Ü┌⌐#Uó┴∞MëδÖgVû┼#√tt²▄{Gµ|ò«╙ê┘^█<¡≡╢ö»▐ OS╫>NÖY≥╟ΘSµÆ╧■x▄A kÿIA3Üíî|? ½q├ü`ç═ál╡äëR┘K▄wkƒ╠▌Ñ╫~p5ª°⌠ShúZ;qCQƒBç └╚û%9▌╦¬¼Vƒ∙└║|J├aD≤I=≥8$]:█. ║ö{!!$▓\H╡w╥ε}gπΩ╧▌▄_xG)M¡√±╘gí±:╓Φ¼x⌡╝π"▀b3eL≤∞▒╗╟┬Æ9ó≥ ":≥ïno¡█_Z⌠∞L¬╜&O▀æ\é₧PÅ▀┬}0¬v{π/(û>2╤å=0o╢√∙ⁿ╝╬#.y╬Θd╦÷╬0Ü╢G&.á|▀mQ╔ôπ!!║!!V24╡│ÇÅR=╠∩}<π╒Çc¿^╙τîb≤'1rî▓xΩó┘x╙¡p╗╣zu-|.┤τº{Φ ╚É:éùS▄ßαxñìòpµ/y┤¼╙ù¼U┌≥f√ù≈V╬v¿¿RôáK├≈Ví._l─
  79383. @B"gú<╠H─{X±w)>g╦çÆ:}óñ╣╟7╝╡µº8╡O
  79384. S%u▌╢¡ü√┬j στ╗ E¥Y3τ∞7├*═tßr≥┐óSVï┤╕┌>⌠U60▀KÇñßTK╢9(╗≈√▓]ù7▄mOΩ═|/Yq≡σ&¿╛Zò4┬ⁿxαn╜íà'Γ╧╛') ┐ë:ñ¼säô╪#┴δ-≥öf{Γ
  79385. BF╔&öæ╟Ñ║╢,╝¡_╗ñ≥¬φ7╔▌Cè╔AÇëÉ≡çfM.i╖j╚BOƒå╓Öx£⌐T├o≤ gΩΦN&╪≡╘÷╕╫│ìqSû=▀ΣV1X⌐┌┌ù┬R╬b₧.│Ωf+?ÇôÇ╙,;╛τ╣'╣╡º_╖
  79386. »≥)ä-d2åΘ~3─-ÜJ░8Æ╞Çr_
  79387. h¢{7╪¥£╨Ω
  79388. Çìz9∩+&╨╘Æ├_Γ╦ïì¡<┘¿ï:⌠▓|₧ÑΩ╩╛ÿªîDª)╚aw┐├$ò▌bw╦f7Err¿czJ┌ß{?ä═D'╕`Ω⌡╜ça C^┴xüE¬¡┐Σ╪ìµò ÷fΓìt à
  79389. :▒╖`D╟╓Ω¼┌àdu∙σ╩z£Θ╢ü<=7É`jæj╧ⁿ=₧¬ÿ╛╨û<▌╠W5╕₧cu~+ç┤Θüƒ"Ñ~Ü∩√┌┌S▒«ΣΓ╠╣▀=\<δ╤*¢╘▓í╒ zô└2╒Q₧·{ìK≤√ ╙ÑíÇÆbA:d8n]
  79390. (P÷JÖ    φ┐Rùjö«j═îúµ■èë²±N╕ƒ¥╜a÷E⌡ÿ+╪hy├
  79391. ]2Bô¢|µ■▒╙π░ªI┤▀òPFH%%! !
  79392.  
  79393. !IFont methodsFor!
  79394.  
  79395. ╝&:«è1=·─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3y╨Ä;Qâ+|\Ff
  79396. °òRv @¡h|~¬«2╢₧KΦ▓ªï■┘ÆzJ@zoÜ¿e7├ú⌐KMûÜp╝⌠·lû8qA9∩K¥╘\ƒV4Ñ┌£╟┘╩·3½"▓▓¥h
  79397. ╝≈VGº)Jzîδi₧ΣLΓM)îV╔3Γ8`⌡¥8├LA┬5┤▀ùy!
  79398.  
  79399. α@#(0>îë='«≤╠+ú0∩└»íö╛¥ⁿ░Σ¬XF »╚~3iR╓╢;T┐YK$z+≤òVbf@Ñ<Gbºδ╒≤/¬╜▓¥πü^s²4i}e╓║-¬═≥\N╜£a⌠╖[ƒΦNαv₧╙\êGf┴j!
  79400.  
  79401. └@#(0>îë='«≤╠"ú0∩└éªùò∩╟╖ΣñGF ÷ÇR}^Y┘ü~FƒZ j_an    ▐çWrnπqV~¬ñ$║╤D@╝┐▓▐╘α1^ÿvTmtܽ3╛┘┼]ù╙}½ñxô⌡GJvî≥┤0⌡jFë3     ªâ╔≤│gî₧ùƒ<.¬⌡eAñH tî√{│╡6Ä(┼QτV▄D╞∩Y∞fBσ╣·îJ`·⌡òöëD┼₧6╨╝ñqST&!!Üα<}┴╚ƒ¡M-n ╥Ç!!ÅV╚¥╗╤┬rß╢çìô0úΓ┼╦&6n╓!
  79402.  
  79403. πK+XR══'⌐╛ë8┼+Θ╤»ÉΦ╓═╫▒²⌐⌐║╠nvY╘─*ZÆaWW,OµôIc4[║<\lΓ┐( ₧P½▓╛ê≥▌R\·3j|Ü╜c!!╣╠╥T°|·{╜T│o╨[í?╙M╛≡mú`[â,|▌ù╘┐é═ßÜùòe╟ÿPA╢_(tÄδi₧▐Q⌠V*▐╖|Ü`≈╘o╟P.┴,₧▐ëAwº├Æ!
  79404.  
  79405. πK+ox┤ì=%╛Θß@∞}╥╤√îΩ▀┌ò∙╨¬_G°√╨i|XS└É'ÿY>f^y
  79406. ⌡äOc4╖s~¬«`ª╚C¬╕╕Æ⌐Å
  79407. ¢a[@afÜ¿e7ε╚╥^]ÿ¥;∞.▄·h∩TCUï÷╬Lê}Vú 8ë╥╙⌠├¼wσg!
  79408.  
  79409. ΓL&&=░ΓX@°êé9Æ:≤ö√─√ùâ╞⌐²╖W ¡┴wfM▌é~FƒZmMSRy≤òYv4@│yA~╗δ/ⁿ₧V¡≈Ñ¢⌠╩ÆfB
  79410. ╖╓.ε╚╬J_É╙
  79411. ─*╖sâ∙CSeí,¼Θv«f4ó+Ü▄«£Ñ│vä ≥±·½σhg¬ahç√i₧▐Q⌠V*▐╖|Ü`≈╘o╟P.┴,₧▐ëAwº├Æ!
  79412.  
  79413. ΓL&&=░╒r9╣íì8û:⌡öéªùò∞╨¬▓▒[F ⁿπsrZE╫ÉyçMK:kIGrO∙ç^Mn#▒yPo½╜%Φ₧VΦú┐¢╖ô    ÿfZ^.v█░x7ε╞╞\¥╙g⌐V╗x₧▓"cUïî█UÜ/┼i,╞åⁿ╒─ía¢ï┴╙l ª≡EWºtg!
  79414.  
  79415. ΓH(0U╬µp┤║¢/ù⌡▄Ωîó■∙┌░µ√Q║¿╒wgY╘─7\üPO#`\≤┴=vKf`ívVi╢∞3║²Nª▓ ╫╖┬
  79416. ƒ{ZN,░╤[▓ë┴W[éüVi├)▀|₧δT]Ib╝$╢°VÆV4ó+π¥╩°╪Ña╞`⌡≥Çy¿£=-╦CtîΩi₧▐Q⌠V*▐╖|Ü`≈╘o╟P.┴,₧▐ëAwº├Æ!
  79417.  
  79418. ┬H(0bΣƒ"/╡ºÿG∩VúΣ²┼Φ╓╦╨■┐σzM⌐┤╦~3\^╫─^ÿQAb'^n■Äi ╖tV*üä║╤@
  79419. ¡┤ú▐α▌çqZ@lyÜ¿e7ε█┼ZM£û;├)█∙h╘cj:═P▀ßfÅVp»0▀╥α·├«v└`⌡≥·4íΣCyΓI,tî√yöƒO≈G ┬KôM₧G╗¬»(£)╕╬ùQu┐εδΩΣ⌐°l∙ΦápJAK4c╬#┼>eùzºx┤▓\a:E╘ù.çS╡±▌┤æ !
  79420.  
  79421. µA3%7¿ïhi¬½â&üRï╜¡ⁿ∞▐╔╘¬≈σÿ╛╘;g@SÆÆ?^éZ%hGc
  79422. ╢╞<Vj"πlAe▓«2ε╟«≈úû≥ÅöqWkrö╤_─á⌐qz░%ª:Aε|ënä PCx├kô┌±(┼i▄ç╫║î▓v£₧ù«<9Å├~eîT5Y¡└öƒOσN#╚ü{ÖD#ö¡¿+2╓6ú╚ûEx≤╜∞·πñ°:▒≥╖iRS&$Åß?}ñ}ñ/ÖñUk|JB╠Ç#é^!!ùⁿ▌╒û!
  79423.  
  79424. µA3%0Ñ¥!!,«≤╠:å7α╞ⁿ╔Ω║╡╝ⁿ┬╖ZU╛»┼;>q╫É~FƒZ<oWFnO∙ç^Mn#Σ_[k░╕%εÖ║╕º¢σ█^ÿrfeÜ«h1½└╓\Z█{∙{╟*₧O╡2╔}{I▐wï┌Z¥Nx∞#4╥Ç╨≤╪ΦΓd÷≥¿s║╜VºtzÄ╥s═╫P⌡UeîO┘≥?rⁿ╙1Ö/⌐}▄╢ε.∩╕±∞⌠⌐° O¡Σ▒ it7¥∩p ┌┬ÄδV*r╔ä#ì ÿµ╨┤⌡e╟╗ì┴≈T!
  79425.  
  79426. µA3%=½ü&s·╣ä,è1⌡╣àÑ╝τ═▄¿≤▒V≥√τ~gB┌ü~DûSQ/.TU+■ä^n@¡h*▓╣/Ω█P▒≈╕ÿ╖█╫f[ki╠╣|├ú¡3!!ⁿ>í3F¢oé=»>∩EK
  79427. 9φh▀╓ôL`ΣmV║√¬═├╡g─Mì₧çjó╠kÄE5Sú┴≥·ºQ'╩P╘║v ô«:»(¬Vφ╩èV`ª»⌠╛≤¼≈aP╡║≥`U@rr▄Zú1K\╠]ô|α╚g~9OJÜê!!¥[ƒ⌠≥╣≡më╨!
  79428.  
  79429. µA3%,Ñâ;*αΘ£#æ>φ▌∞íö╛¥σ¼√│RW║√ì;TMBÆÉ6W╫IE&{^d    ╢ò\&af╖}_cí∞`Ω╠M¡Ñúç╖└^â|[@|e┘╣d$½█Ä4"°|·]£fàH╝5╝np,σg₧╥U▄k`¡ 5╨┌«£Ñ╔│èÅ▀<½σAE«]JMú▌ ±k╪cπsÉVπ$u°╦q┴ 5¡U╪₧ε.┘╟ñΦΘ╝ßaP∙≤ªdJYQ&:£≡<eÖW█ÿúVb0    ╖δF╡IÜ÷æ▒≥wσ╢ê╔╣?╣∩ñc!
  79430.  
  79431. µA3%⌐èhi¬ºì'ÇRï╜¡ⁿ∞▐╔╘¬≈σÿ╛╘;g@SÆÆ?^éZ%hGc
  79432. ╢╞0Xk#πlAe▓«2ε╟«≈úû≥ÅöqWkrö╤_─á⌐qz░%ª:Aε|ënä PCx╧eÆ█±(┼i▄ç╫║î▓v£₧ù«<-¥┼eΓpzÅΩzà▓5ÄBª2░»;hδ╙m├N.╙+╡▀éHxΘε≡∞σ╜°tφá░w f [░µF^▀┴ÄéXa0.&!
  79433.  
  79434. µA3%1╛èhi¬║à0ÇRï╜¡ⁿ∞▐╔╘¬≈σÿ╛╘;g@SÆÆ?^éZ%hGc
  79435. ╢╞-P|#πlAe▓«2ε╟«≈úû≥ÅöqWkrö╤_─á⌐qz░%ª:Aε|ënä PCx╥mà█±(┼i▄ç╫║î▓v£₧ù«<,¢├eaîC31┬  ╫┼Z«Bª6ÿ{Ö@ É¢n╦Pz╒>╜£ÉPp░»⌠≥║FáµeO¼∞ªJT%e`9Tá)┌]n%9≈╚îßPc*B@╙à èV√Ü!
  79436.  
  79437. µA3%,╢å9,«í₧%É8ΘÄ»▄φ├═▄╡≈▒[Q░«╟s"?É┤,[ü^P/.L
  79438. Γ┴
  79439. QcfYópFoΓñ&║╩JΦ≡äèσ╞â|L{g╥√-"╝╞╨\Zü╙sεW╛x╨∙RJ.Σv╤│3±(┼(÷í÷┌°αL╖ïƒÉ}ó▒dP░i~ûτ!!╤╩X∩    Bª6│╚"tφï8╨Gz╓>╜ß├rUüç┘╨╘9è█Op≤áówO^r:£÷88=ú~Å|α╠3`UE╚ò:èVBàΣ╒╗²mΦα┴┼ê;ª÷┼ÅTcK«~≤x╝▄⌐SHΘ
  79440. ÿ┴ÜÇ╔Iù▀┴┼C°]╨!
  79441.  
  79442. µA3%6áè %│ºëp┼/⌠┌δ╔∞█╓█╗ƒ╧:Å⌐╔mr\SÆ╔~uÆK>f^}·öi ╖tV*σ₧.■█P í╣▓┘╖▀çqLw ╒║-&ª╠ÇKMûÜp╝█²kò8g;╥Q│Ωú}g╕?╥₧╧╢∙«wìôÆ¥yG├¢>-╦[nûús╠┌K±@#±∞7┴@╫≤GαmA∞u±╠ûJp╢╝⌠≈εß»6╨ó▀`o/    o ÜΓpb[T╩┴╨ßQ9PY╓òo┌BDZ├║≤nΦ≡▀á≡Wï≡╠╔E>░u°,uSε▄!
  79443.  
  79444. µA3%=¡ê:=αΘ£=Ç6µ▄√íö╛¥σ¼√│RW║√ì;TMBÆÉ6W╫IE&{^d    ╢ò\&axªuTb╢∞`Ω╠M¡Ñúç╖└^â|[@|e┘╣d$½█Ä4"°|·]£fàH╝5╝np,σg₧╥U▄uqÑ4╟┌«£Ñ╔│èÅ▀<½σAE«]Jhèα!!╩ò≈V*┼X╥║v ô«:»(¬Vφ╩èV`ª»⌠╛≤¼≈aP╡║≥`U@rr▀\ú'~]TâIá{πƒJh0E ╙Å9èV Æ╙╨┤≡ Ä!
  79445.  
  79446. Θb(!!U╬µp┤║¢/ù⌡▄Ωî÷╓╤╤▓≈σ\E »╚~3NY▄Ép·5)@GjσûK&:"╔Rd▒╝%Φ₧]ΦÆ»è≥▌¢\_jl▀ⁿc7╣ç¡3!!åƒ─*▀zò├Yi6⌡>▀▀WÅUq╛NQ╣√²≈┬│dì▀ÜÇSñ⌠TP╧
  79447. !
  79448.  
  79449. ΦW  9¿╒r9╝ªé>¬+Θ╤²íö╛¥ⁿ░Σ¬XF »╚~3aE≈ò+S¢jc^Gc≥┴_&2Gª<pEÅδ/°╘G╝∙⌡≤¥óvw⌐<MbfÜò~┐▄┴U╒ò{║lóuò╡Tx╥[░⌡4÷!
  79450.  
  79451. ╚W  9¿╒r9╝ªé>¬+Θ╤²íö╛¥σ¼√│RW║√ì;ZF@▌Å;âWAjGHvz≈ìV&+J╖t\nΓñ&║╩JΦöÿ│╖└ÆwJ@yr█¼}7¬ë┬@üûVg½@│tåε"cUï÷÷k╣qAÇ4|∞¡╨Γ╚úrä▀▓ÇY╗≡[ ╧
  79452. cδ╘:╨Γ╬g ┬KÉVπ+n≈╙W╓Jk╥vΩ▒Θ-6▐─òöëZ╛²rH¼ß╛JqBV
  79453. j>╘Jδ5bZ\▌WƒC╩êb2Wä∞EΓdôⁿ╫°⌡o≥╗ì─₧┤∩┼dÑ!
  79454.  
  79455. ΦP&<;╔σ[k¢ºƒ=Ç-í└τ╔╛ï╔╘¼≡¬\Oß√╓z]SÆï8âWAj)rGj éYv4@│yA~╗δ/ⁿ₧V¡≈Ñ¢⌠╩ÆfB
  79456. ╖╓.ε╚╬J_É╙
  79457. ─*╖sâ∙CSeí,⌐ k╡cZÿ?ⁿ╜∩╢┬Ñd┴C≥±·o
  79458. ó≈:.╦    ~û╨╩▐SεBuî^╘Σ(s╖¬½|o╬,ª┘æuáü·⌠σ╝Ö
  79459. !
  79460.  
  79461. ΦP&<;■╧" «¿Ç#åî╛åÄ═╥╦ò¬·áû»┴wzKÆö,]çZV>w\mOΓët#LªuEo░δ4⌡₧V¡≈δê÷▌ÿx@xa╓⌐hrí╧ÇM@ÉVÆr╗N│säO╛<%dRêwÜ╥_±(┼)╟¡ΩΓ═¼zïW▀ïÜhó°T)╚!
  79462.  
  79463. ∩E*XR══'⌐╛ë8┼+Θ╤»Éⁿ─╦╟α▓│RO¬╛ÇtuB┌ü~╣^I/)Cyµä Mf@Ñ<Gbºδ2 ▌G    ╛▓Ñ╨╡óvs²B@on╔½h ε╒¡3!!öÇp╝∞ ╨#╧e}I6Σs╤│3⌡QqáQ╣√¬±╔┤Lª Æ₧╔<áΓ@A░.gδ╤2╨╠HΓSo═L⌡∙(bφ¬!
  79464.  
  79465. ∩E*ox┤ü3$┐Θß@∞}╥╤√îΩ▀┌ò∙▄ñ^F°√╨i|XS└É'ÿY>f^y
  79466. ⌡äOc4╖s~¬«`ª▄Q║Θ≈ê÷├    ╫{X@zh▀ⁿl ⌐▄═\FüX╤{├)▀nò·<%`Q±qïßw¥Oq÷@,▌ô╬≤í╩!
  79467.  
  79468. ±Q3%7¿ïhi¬½â&üRï╜¡ⁿ∞▐╔╘¬≈σî╛╘;g@SÆÆ?^éZ%hGc
  79469. ╢╞<Vj"πlAe▓«2ε╟«≈úû≥Å¥q].w╚╜}"½═Ç[Q╒¢5├)▀=é TF=≤$ï╤êJq∞\*╥Ç┴∙├¼-╚ ì£åq
  79470. áσ▓bwåí^┤▓5Ä(■zΘ#▀!!╞°k╓Fm┴3╜£íKx╖µòöëo┴╧iRäáä+0Lg{?Yí%╧W s@\═^û|α╚V.&│▌9éHâ±▌°∩uα╣Ç┴ûd⌡δ█ ▄;RZⁿj²vPφ╜7¡2╥¢ìò╬╓Fì╫╔∩F╫<╢ï!
  79471.  
  79472. ±Q3%0Ñ¥!!,«≤╠:å7α╞ⁿ╔Ω║╡╝ⁿ┬╖ZU╛»┼;>e╫É~FƒZ<oWFnO∙ç^Mn#Σ_[k░╕%εÖ║╕º¢σ█^ÿrfeÜ│o8½╩╘_çâp¬┤d╨⌠TdRê$ì█ZÖKb⌐|╟¥âΓ─Ñ3╘êöüxQε≡EC╖muûús╬▄WµS<╔Kö{Ö@ É«P≡g]⌡à£╝{gº¬√ ∞
  79473. Φ╫h]½≤╖J,<b    ç▐W#y@B▌W▌éáK~9Wü∞EΓoⁿ¥╗╤áwφ¿ò╪¢2⌡≡▌╠;HC┤n∙aS÷±8Ö-H√    îà═π╡!!Ñ┼└ΩD┤>¼jφ:┴─∙╙+!
  79474.  
  79475. ±Q3%,Ñâ;*αΘ£#æ>φ▌∞íö╛¥σ¼√│RW║√ì;@MBÆÉ6W╫IE&{^d    ╢ò\&af╖}_cí∞`Ω╠M¡Ñúç╖└^â|[@ab╨╣n&ε▐╥XXàùVw╖óuòAæ;&I*ΣgÜ╫OÖP4╕|╟Ü╞╢É╢rÜÉöƒ"O»πPQ»eo╬»#╫╦^δH,é2░{ÖD╤⌡]±wB⌠ÄπÉPp░»⌠≥á/╝⌡lU║¿▀`k /nh╬<┬%Pad÷5Γ>ªßId(B@╙éf╨7h ▓╝╥æ ìµù─ê*áΓ┼I▄3░&╝fZ±ñe╘-
  79476. ╜FêÇüî╨Gùê¿î+╩5╢mí:╦±∙╙BJN
  79477. EP¢!
  79478.  
  79479. ±Q3%⌐èhi¬ºì'ÇRï╜¡ⁿ∞▐╔╘¬≈σî╛╘;g@SÆÆ?^éZ%hGc
  79480. ╢╞0Xk#πlAe▓«2ε╟«≈úû≥Å¥q].w╚╜}"½═Ç[Q╒¢5├)▀=é TF=≤$ï╤êJq∞\>└å╤¿îíaÅÆ₧¥hCεßYE»eDΦéY╖╢w╒d∙sεV╠rφ├{├NbÇ░╤å ┘╟æù█ª╔ ~è╘ÇJkGX/iπ`èU]":áK█ÿ╡Ll0_╬à,èV╠░┘¬∙r±╢òì╧~╖≡▌æh]b,╣p·O}Q⌠░e╔ixφ
  79481. Æ∞∙!
  79482.  
  79483. ±Q3%1╛èhi¬║à0ÇRï╜¡ⁿ∞▐╔╘¬≈σî╛╘;g@SÆÆ?^éZ%hGc
  79484. ╢╞-P|#πlAe▓«2ε╟«≈úû≥Å¥q].w╚╜}"½═Ç[Q╒¢5├)▀=é TF=≤$ï╤êJq∞\µá±╙ΓâJ╓M₧ëöi½ CΓprÿΩ}│╡2ì(FΣm %╞U╣°G╤Vj├>╜╨├w}⌐½░ôèo┴¥[U╖▌≥)7Wtp%E ╬≡*t ñ}ñSτ╦4UZ╙ô;₧[╓π┼╝ `Φ╢█ìÆ,░≡▄█E`K16ÄN┘!!Wf╝▄⌐SHΘ
  79485. ÿ┴ÜÇ╔Iù▀┴┼C°]╨!
  79486.  
  79487. ±Q3%,╢å9,«í₧%É8ΘÄ»▄φ├═▄╡≈▒[Q░«╟s"?É┤,[ü^P/.X
  79488. Γ┴
  79489. QcfYópFoΓñ&║╩JΦ≡äèσ╞â|L{g╥√-"╝╞╨\Zü╙sεW╛x╨■[J
  79490. ,ísì▀IîGp∞%ôå╦≤î═ßMì₧Éy╕⌠E╢oJoèΩsé╔^⌡C ├SäV≥?f∞╩}╠V"Ç/ó╚æM╢║≡∞∩»ⁿ.1╙ì╪ckMtp8S║J▄(#eKS╚┴Q╣╡Kd7FX╥ô ₧]
  79491. ▐¥╗╤ò▀│Å≡┌ö╤α(ß1)=,É<∞`Mδ║l╘eIπÖë┌╒▓"≥ö¿î/₧{l¼b≤'╨µ⌠ƒ    RmLE1½w¢σ(vä8ïÄMTböboé≈kÄ`Lb█ºπQq3D┌┌±╪H
  79492. φë!
  79493.  
  79494. ±Q3%6áè %│ºëp┼/⌠┌δ╔∞█╓█╗ƒ╧:Å⌐╔mr\SÆ╔~aÆK>f^}·öi ╖tV*σ₧.■█P í╣▓┘╖▀çqLw ╒║-&ª╠ÇVJƒÉ5╣Q╖mÇ°Mx⌡lÜ₧4÷+4╛?╓¢╒≤▐αgçMïôû<S╕≡EF¡o%┬ε!!┘╩RΓO;Ç╩²)dδ╦q╠G ¡U▄╢Ω-\üï╦╦╠2Φ╦_O¡Σ▒ i`b7£Ω59":á~ñ*â»d-
  79495. b~≤á┐e ╣▀²°∞tΩ╛ä▀û7╗µÇRóo^Ii╤òSbV≡Ñ|┴a ÜéÆé╙█▐╫πQß$·:▓s╙µΩ▌Iek#T╧$û√+%ÿ:ëO╙Eabèlτ!
  79496.  
  79497. ±Q3%=¡ê:=αΘ£=Ç6µ▄√íö╛¥σ¼√│RW║√ì;@MBÆÉ6W╫IE&{^d    ╢ò\&axªuTb╢∞`Ω╠M¡Ñúç╖└^â|[@ab╨╣n&ε▐╥XXàùVw╖óuòAæ;&I*ΣgÜ╫OÖP4╕|╟Ü╞╢É│dç¢┼╙}⌐ΣZA¼tF;Æ°6╫╪W≤Bª2░ÜS▄⌠Mεv. ó╚çGu┐ó╕╔σ»ⁿt╘è█ck^O[6&!!å±paXU└┼├·4U!!░∞EΓƒΓ┼¡²mñ⌐ò╔Ö?╣∩ôI╟2¿<¡X4L⌡╛{─36åoáÆûé┘Æ╪╙τN²╗gφ^»!
  79498.  
  79499. ≤A+4+íº4&┤╜╓jäε┌√îô╜╢ùùⁿ│\H║√╘svd╫ê;SäZl,aUG#F╢îMn)KπsU*╢ú%║²m-Φÿ╡ö≥╠P╒4m    ╔╣a4ε√┼UMöû>síMó'╨┌^Axαw»▀K¥Oq╕.╛°!
  79500.  
  79501. ╙A+4+íº4&┤╜╓jìε┌√íö╛¥σ¼√│RW║√ì;ZF@▌Å;âWAj\^_nσä6_i([δ5gº┐(⌡┌«≈úû≥Å?1║4Qde┘¿-%╝╚╨IMæVæ5║K│=é TF=≤*≥┤4÷+ä2αº∩┬îƒL¢¢ÿÆpε├RHºa~¬Θ<╨╦è+FÑ6ß²!!╤ßW∞v.╚╛╥ù/▐─æ╝ìl┼₧    »ΘádJr6ì ∩j1GB╠╪₧ß 8|KM╘à#ÄoⁿÖ∩½∙mΓ·ê├î?╣Ω═*╬    ;fx!
  79502.  
  79503. ≥A3(4,¡Çhi╣░á%é6Γ╒πî²╬≈▄│≈▒AJ╝ßÇxj`_▀ü*@₧\)@ze∙èr.JπOV~ɬ4≤╤
  79504. IΦ║▓è └^ÿrfe܃Bε╞┬SMû▌T─.▄«∙]IdRê¼█M«C`Ñfôæ┌┌├ºzï ô÷∙f¡ΦM»eiï∞i₧▄F╧H"╔K╚≡@ !
  79505.  
  79506. ╥A3(4,¡Çhi╣░á%é6Γ╒πî²╬≈▄│≈▒AJ╝ßÇxj`_▀ü*@₧\)@cyαÇ
  79507. \&kèrEe⌐«`ε╓G@¢▓ú¼÷█▀=kt╥│irí╧ÇM@ÉV░9XεL┤wòΦX±tÜ┌₧[4╕9ôÇ╞⌡╔⌐eì╤÷∙e╟ÿvçS?W╢» ß╠KπB.└SÜ%÷9S°╙q═
  79508. ¬V╪╡╕MzÄε⌠±εΦ≈yp╢τ╗    i
  79509. 8a[τ1Ω1C_╟ìôëP`9W^╙éf╨7h ▓╝╥æ ìµù─ê*áΓ┼I▄3░&╝fZ±ñe╘-    ┐Fìàäü═L█┼┴±Mµn╫ê╓Γ⌠┘ZOgYE4⌡Æ√!!√!
  79510.  
  79511. ≥M=XR══'⌐╛ë8┼+Θ╤»É▌Γφτ¢▄åj ¡┴wfM▌é~FƒZm]RInH╢æ Vv#]╖eeñδ4≥█¡┤▓ùß╩P╒4m    ╞ⁿl<╜▐┼Kë{∙táPíxéAª A╘V¡√w┐{4ó+Ü▄«£Ñ│vä ≥±·½σhw½z!!┬ε=═╚Z⌡Bª6Σ²>vⁿ╒8├QA┬5┤▀ù)!
  79512.  
  79513. ≥M=ox┤£;3┐Θß@∞}╥╤√îΩ▀┌ò∙┴¼IF°√╨i|XS└É'ÿY>f^y
  79514. ⌡äOc4╖s~¬«`ª²w2ÜÆÖ╜╬æ\ûxK.o▄ⁿy:½ë┴KOÇûaα█²kòBJ>ítè╩f»Kn⌐Z|¢▒÷─■à]½4▀òûkO╕≡[Qº:Jkæµ)█û!
  79515.  
  79516. ≥P5>=░ç &»«äG∩Vú⌡ß▀Θ╥═ò¬·á⌐║╥y|GZî─(S¢JAja]≤┴Yjr4F¿yGb░ñ5²╓@╕Ñ╕Ä≥▌╫{X@zh▀ⁿ7¡╠╔OMçX╤{├)▀a╨≥BX *íx≥┤0¥Lg╗.ô╚₧╢äûR║$╛╡ºC-ü▐{¼e2╠éY╖╠ZδGBª6│÷9^╩╙j╦Ik╘7ú╙ûC|Θε∙≡≤¡µ.1╙ëî vQP&3¥%ß5r[=ú!
  79517.  
  79518. ≥P5>=░ç &»«äp┼/≥└²┼⌡╥╦▌¼²░TK ╓¬1{S╞─*ZÆzIZ`
  79519. Γë Vs!!GΣ<Cx¡╗%Φ╩[@º▒≈è ╩\ Æw[    xe╚ⁿy=ε▌╚\╔ÆwíL║#╨²]Z xεb▀╩QÖu╛)▐ù═ΓéΓΓ`⌡≥Çy¿£=-╦po╜▄'╠╓TΓU'▐P╧√w!!Θ╘l╨Ke┼+╣╬îQs╗├Æ!
  79520.  
  79521. ⌠J#'4¡ü7D╨└╬ ï,÷╤²îΩ▀┌òΓΣñAA░┤╠%3^W▐æ;ÿY>f^,:°àKj/Aª;z░ñ0 ╠VΦ╕▒▐π╟^àq]gv▀«#p├ú¡3!!ëVÆf╣Fñ=îlû8N+÷aì₧┴<Ü!!·│φ┬≤é\º!!▀òûkFα£=-▒e}∩àZ╖╪Z≤~┬[▀ $oⁿ¥8├L}╫:úÆε.ì»÷φ≈║┤aOûΓ╕q+?!
  79522.  
  79523. ⌠J#'4¡ü7s·╣Ö$ü:≤╪µ┬√ù▓┐╫░ûVW »╚~3c▄Ç;@¢VJ/)Cyµä Mf@Ñ<Gbºδ2 ▌G    ╛▓Ñ▐π└\
  79524. ƒq\xa╚╛b=óùÇOIÖûVz¿óuòA²CH5Σjïɱ(╞i/╓₧┼¢ª╔ÿïñªr ½π[M¼eP;Æ·=┌┌MδH!!╔2░!
  79525.  
  79526. ÷A.=,╔σ[k¢ºƒ=Ç-í└τ╔╛ï╠┬▒αí⌐║╠nvY╘─*ZÆkRTc▒┴Ki6J▒hJ*¡¡`ε╓G@║▓┤¢■┘ ┘63j
  79527. │á-3á┌╫\Z╒
  79528. ■|»MÑjò╝ Ip╥S░∞}▄Lq╗Ir╛°¬σ╔¼uσg÷≥öyæ╞RMÑh!!┬ε=═╚Z⌡Bª6Σ²>vⁿ╒8├QA┬5┤▀ù)!
  79529.  
  79530. ÷A.=,■╧">┐áï"æî╛åÄ═╥╦ò¬·áê╛╔|{\Æö,]çZV>w\mOΓët#LªuEo░δ4⌡₧V¡≈δìα└╔4Hbu▀ⁿb4ε▌╚\ööx½Mó3╥lû<%`+ΣhÖ│3⌡+d╣Σù╩±─┤)╚ê₧Ü{║£=! !
  79531.  
  79532. ILockBytes comment:
  79533. 'ILockBytes is a COMInterface class to wrap the standard COM interface of the same name.
  79534.  
  79535. ILockBytes is an abstraction of a simple byte-oriented block-mode device for reading, writing and locking (though this is typically not implemented) blocks of storage. Typically we will be using an ILockBytes on a device implemented externally to Dolphin, but see the OLELockBytes class for an example of an ILockBytes implemented in Dolphin over a ByteArray. ILockBytes is the "device" interface underlying OLEs Structured Storage mechanism. The relationship between IStorage/IStreams and ILockBytes is somewhat similar to that between PositionableStreams and SequenceableCollections.
  79536.  
  79537. We are mainly interested in ILockBytes in order to test out our own implementations of it easily from within Smalltalk. It is an unusual occurrence that one would actually need to call ILockBytes methods oneself.
  79538.  
  79539. Example:
  79540.     "Open an ILockBytes on a global memory block"
  79541.     i := ILockBytes onHGLOBAL.
  79542.     i replaceFrom: 1 to: 5 with: #[72 101 108 108 111] startingAt: 1.
  79543.     (i copyFrom: 1 to: 5) asString.
  79544.     i free'!
  79545. !ILockBytes class methodsFor!
  79546.  
  79547. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q"DI■É#é╞├Rjîû2├)▀╣-≤RD+!!⌡aî₧]ÖD}ó╓ƒ╙·═┤vσg÷┘■b─ÿDA«fgδå7█┘VΘD    ┘Q┘·"oúç;≡Go─ÑåôR.░¼óεπܱaXπì╪ck GG s?ï≈#)aJCôW襫Ki|PN├ò*┴ü ├╝╝e≤╡ô╔╨yεÄú`ª2╣ZΘwKδ╛gÜ-█ùòû»╦ï└ƒσ@«3╕\≤:╤≤²╤@+&o <π0å·(kàå^┌ $ùwoƒ u≡<H═Φ»S&5X>╥╤└▌A█Ä6C▐√LÖ£æB°96ST═■~C~╖`éΦ╨ëc╞╙ÿ▓╬ì┬QÖ~╡èFB-»£╒Sê¿vUß╗Ωú»V■¢>ᥲQ░═Γ9åS*wJû─εD▐║Zµ╬╘PÅ¥N¡=9ì¬│╚&▀¬╨}║êI╙▒m+ñ«█╔╧Fh┼9 ⌠«╙Ofª¬ù#⌡τÄnW»┘=▄7$┐═.¡*S≈╓╛í╠L╥'º╡öû«╧┤g2ÜYα±╬B0 ò╧░╣&B┌nH*ÿºëZíl├┬@LkºêΣ<∞≈≡>çr'╝╕╦╘│█j[ ½ßU&w═_-rXVà>·j╗Ñ╫3)╟╘½σ╞è╣╓kZ ìmN┌Pt¬AG;]àk║ÇÄk╗MZÅl£ê2aßñ¥és▒3kI2E≥à¼ñÑ≡gâE▐ûM⌡û╟åxw5Aετ·4û!
  79548.  
  79549. εJ=å«D╨└╬ ï,÷╤²î ┘ƒⁿƲªXaª»┼h3GXÆà~HÆMKj}RIn ╢âVe-¼zm«ñ"√╥¡║╕îεü^s²4iPs▀░krí╟Φ~d║4▓:/εM┐q!
  79550.  
  79551. εJ=å«s·í½&è=α╪éªùò■█¡σáA╛╡ÇR_GU┘ª'FÆL%`R+·ÄR&)Iπ{_eá¬,║╙GºÑ«▐■╦â}X    kdÜ╛tr║┴┼IçåpáW·=ÿ&≡^M4»&≥┤4÷+h∞2└à╞Σî╝Γd₧òÇk
  79552. ╝▒Γswä»=█╚oΦH!!╪Z╚X₧G╓δ]εKl╥>ú┼├@q╡»φ≥⌠F½µe]¡σ¢&fMwr7¥%φ?}@R╚ùQéåUb>B@Üç ÄVé⌡■╢╬dΦ┐Ç▐ƒd⌡≈█╩E'>╛eΦU4^∞ó~┼ül≈┐ÆÇ╠_₧─! !
  79553.  
  79554. !ILockBytes methodsFor!
  79555.  
  79556. αP}Z<6áè*D╨└╬ ï,÷╤²îΩ▀┌ò╝δ▒V╛»Ço{M┴ö;Q₧YM/jZe ≤Ö^Phf[½yxº¿%≤╚Gµ⌡┌⌠ÜÑu ▀g[ h ╚╣l6Å▌ÜA¢û8 ╡ràΦ Xqíeïä═!
  79557.  
  79558. αP}Z<6áè*i¬╝ÿp┼=°└Ωíö╛¥µ╗µσGK║√┬bgM╙É~FƒZ9~^Pb     äo(Kªdc¼δ4≥█¡┤▓ùß╩P╒4m    ╔╣a4├ú⌐0_ççT║÷t₧∙IXUï÷▄@êGg÷@t±ï╫≤φ▓aë▀îÜh⌠▒U]╢eCΦåZ▌╨JΘUuîö{ÖD_√▐l╟!
  79559.  
  79560. ΓK7*½éhi⌐╜ì8æ⌡█╡îφ├╨┼╙ÿ╠`░½┘;rFRÆà0AÇZVjzSV+µäP`/Jº<Ak¼¼%║╤D@¬«ú¢ΣÅ ÿyfeÜ«h1½└╓\Z█T■|─*ênò·] 9σEïäÅVu╛qé╥└∙┘«g╥MîÅ£lB╜σVV╢+[!
  79561.  
  79562. τH2    =U╬µp╢╝ƒ"┼>∩═»╬δ╤┘╨¼≈íG╛»┴;gG╞î;àZG/gMVyHσ┴Y]c0Fáy$α╞Jù┤+¡╗▒▐╤├    ƒ!
  79563.  
  79564. ╟H2    =U╬µp┤┐â!!Ç⌡▄Ωî╪█╩╞╢║∞N║»╚twY╘─*ZÆK(d^POßôIv#Kπ~J*╢ú%║╠G¡╛í¢σüqt■4iHΦÖ^é²ÇfwåùtóO÷[£∩Y@cî≥┤0▐/┴jUÅä╩Σ╪╡räMîÅùó²¬rhùπ'₧ëè+F≥L▀⌡mh≈╤y╬Kjπ>╜╨ε.!
  79565.  
  79566. ΘE)9=╔σ[k¢ºƒ=Ç-í└τ╔╛╨╙┌╝≤⌐N║╢╧ij^╙è:^ÆQ9k_mΣ┴
  79567. Qcf]ªVc┤«2╜═/j┴ó╣Ü≥▌₧zY@}t╒«l5½ëêVFÖ╙tóJ▓=Ö╝EG x≤a£█PèGf∞=└╥└Σ╔ígì    ≥±·k║∙g░e oç╞╤▄T┼X;╔L⌡█
  79568. m÷┼y╬
  79569. 'ëq≤▒Θ)┌▓╕÷τ
  79570. º÷aP∙ⁿ▀`kmAYd3éJ╣JpTWD╠├åëXc8OIÜÅ*£oⁿÖ■ö┘Mφ╕ô╠ê'⌡τ╠╬;R╣h╘(xPα░eµTß/▓ÄÉà²QÅ╙╓╝τ<╝+±;┬δ≈▌J3N1■5Æ√c√]íF╪N@bè!
  79571.  
  79572. ═K$=úå='αΘÇ#çτ╥ⁿ╔Ωù▄╫Σ▓ªQ╗¼∞tpCb╦ö;╫[SaXX_µäs3df¡j\aºδ4≥█,º┤╝¼≥╚Ö<@ce╬┤b6ε╞╞\¥╙wñF╡i╨εP_=σ$¥╟êJq∞9╨ù╩α╔▓=σg÷÷∙få├rwùL>;╜╨ ╩█\µM#îs╒°d■╬w╠
  79573. ¬V╪╡╕MzÄε═╥┴4Å╤_uù╘ù-'WYdê ≡$=":á~ñ*â»d-    omΦª
  79574. ┤s,ó╒÷¥╬!!τ╕═á≡W▄è≥┴8w╡{≥
  79575. pε╛g╟-_√*æéÿ║╞X₧ƒ₧ï(ÖxY°ï^»Äñ╔T}ZE}Γ#ù⌠,i¥n▀F═RWoÆ 8═Ω"∞!!┘╡αE5zNq─Ç┐│-8ôµP,≈÷GëöôN┌9\L|¿!
  79576.  
  79577. ≤A&,■╧=/╝║ë>┼=°└Ω▀ñù█╘¬≤σPL¬╡╘!!3KY╟è*?²6kZW+■ä^Jv#L¬zZoªδ.∩╙@║≈╕ÿ╖═
  79578. Æg    `t╒ⁿy:½ë╙LXàÜqεAú{ûεxπ}ï█ô@~⌐(╛°¬∙▐αråM₧ƒùn
  79579. ╜Γñrv┬√;█ƒL≈D,┼Y╙≈mn ┴k╟V Ç┐╧öAf≤║≡√á╜∙bY½á╜ Bg_AurÅ    ≈1}CIë╚Ä∩4UqM╙Æ*╦[Bàσ╙½ sφ¬òìÿ1áφ═Å/¿u≤4VΣ±}╚hΓôâû£ƒG¥û╟ V±p¿nα7àπ≈┌    g@    8α"Æ√mqÖ1▀@╩CGqδ
  79580.     ƒ■$÷6H═ªí\P's╩Z▄╦═A▓µ].≈π ≥ ÷E╟8=Cr├⌠dY`╤Há╘Ω÷,╡«⌠Ñïà╬H╥5╩φVS(ª╥╜╩.îv<X⌠╕╢▌└+1çîvτî±@Σ·∙s├C"ôô B½Σ6ê²²VôÅB░
  79581. çτ╩½@╙Θä;à╡Oσ⌠U9d¿φ╠╬å+TE╬z*╙₧═^9╠┼∞±î⌡W@╗╚6┌+5╛₧)¬8Kφ╩«î╖2┤<Ñ┴éöñç_}X╪pf≤6Åæ╔A0δù▀íO÷Zò]#à╢ìz8╜aï╚RM₧ëπ$é«∩=█ H┴2lá═╓╡%█pz$╖åë,!
  79582.  
  79583. ≤A&,■╧=/╝║ë>┼<ε┴ß╪ñù▄┌½ⁿ▒>)╓∙≥~rL╙è:ûQW=kI≤┴Ic%FÑuVnΓÑ5≈▄GΦ╕▒▐⌡╓ä4XamÜ¿e7ε┌╨\K£ÜqεL░{âΦdRî÷┬₧Wr¬.ôÄ«£ÑófÄ Üë╙&Rε╙NPºAiâ÷s╨┌H╜,├J╘╜@ É∙k╟NhÇ-┤▌çe`Θε≈°µ¡α ^á⌠╖X%D@`7£Jα%[
  79584. ë┬ä╡4!
  79585.  
  79586. ╙A&,■╧'%ò»è9Ç+í─∙û╛╟╔ò╜≡ @╜√╨xqzS╙Çdç\FkZWeƒ├7Wp)Dª<Gbºδ ▀F!!╝ ■▐·╩ÿph ╬┤hrí╦╩\KüVät╛S│y╨σ[=ívÜ▌\òTq╛NQ╣√«£Ñ╔[║(¼«┐HOæ╬DPªc wÄ»█▐[╞Ugí5│Üh≈·8≈nO≥öπ¬j@ûë▌╠áñ█fZ¬σªFo/<b]=¢▐W2h[UâW▌╞╠3U*w╙Å╦O à∙╓╢∙eñ╢Ä├¥~╢ßàdÑl^b) ⌐h┴OaQ±╕n╬h_¼
  79587. æÅö─ƒXÿ╘≈πC≡[k╫îY¼Ñò╡w,@/σ"Æ√mvà0£O╙köesÿ≈!!ú^eM▀¡²Sq)Hj╙P₧╓╬KäúX=╕φM╒╦≥-╖+ULé∙*<¥eô╪┘▐!
  79588.  
  79589. ≤A74;í⌐ &╖≤╠9æ>≤└»╪±ìƒ╞¬²╡T╢»╚!!3ZS┬ê?QÆRA$zyJ
  79590. σ┴Mg4[¬rTK╢±`Θ╩C╝ûú≤¥ª^.ÆfX|mÜ╜-!!║╚╬]Iç╙%x»O║iæ≈] (φe£█TÖL`∞,╓Ç┬Γ┼»}╚ ÿÜÜr║▒CLº ~üΩ:╚┌M⌐,EÑq╒÷mu±╞léVf┼ú┘ÇA}ѽΩ╣≤F╜·dY½∞½ bFi ÅµW'xC\ë╚Qì│Vz2E▄┴;â_Bä⌡┴┤²bß╖ä├ÄS▀è└█%ⁿu∩O{YΣ±}╚hΘÜ┴£êƒ\ô╙àπZ²$│eµs╓≤≈═AlD$W£]·δmlƒ Ü\╔Mqj£e ÅΓ!!µN┴╢√R?zXm├╩Æ┼)lΘΩR>▓φ_₧Ö¼N─)x
  79591. Q╤Σ+}▄,ä∩┘└∞±▒τàµí6Ä]░êDU!!¡ùüΘ3╣guXΦ╖¬╦àb,╫╥?│ëΓ@0░▓≥'ùEb!! ïαµE╘░~ß═╘=â¥aó4 ┘Θ£ ;╘α£?òéG∩á-}0»τÿ╬ç ^V∙/)╙┤╤C,▀Γ±_ÆΓÅ3▒╚2ⁿ ±╫z\∩)R∙╚ëΦ╟^Éd₧╗²δ╚╬JZ┤g2ëN∩∞┼f░█▀░ñ<S⌠1/Oò╜ûmHS╝gë═CjÄë≤┴·σ(¥B└kO╜▌┴ú═:m{τ⌐≡ghz█W#;╞ °k╜√╫>0▄├╜┤Cº╙┘Ñj2`!
  79592.  
  79593. ≥A3)<"í╒r(┤Çé>Ç8Σ╞éªùò∩╟╗≤⌐_L╝║╘~3I┴ö;Q₧YM).Z^d°ò^V`f\│}PoΓó.║╩JΦó╣Ü≥▌₧zY@)d▀¬d1½ÄÄ% {∙f½O░=úΦbF=╗$₧╨pÆVq½.!
  79594.  
  79595. ╥A3)<"í╒r*╕─µC╟∩┬α╟√ù╦▌╗▓ûVWî▓┌~;▀ü*Zÿ[%hGc
  79596. ╢ÄSc%[πkAk▓╗%■₧@Φú┐¢╖▌Æ}H|.╖╓_─á⌐qz░%ª:Aε|ënä PCx╥aïφPåG<┴jU║√° ┬¥3╜!!╛⌐┤Y0ç▀caàE8;üφzà▓5è+FÄ2░{ÖD=∩╬j╓Wo╠ó╚çGu┐óó╛Φ¡τuP¡áσJrIG8_Σc▌5}I└█å¿]N=O@╖δ!
  79597.  
  79598. ≥P&XR══'⌐╛ë8┼>íτ█φ╩Σδ≥■⌠¬A½│┼;aMU╫ì(WàG69╢ÇJq#]π`>╦¬.Θ╔GΦφΩ▐─√=*ñ@y@`e═≥X╟┌┼UN╒%ça⌠╖sâ∙C*τWï▀M║Nu½Z|αªΓ┬ΩîR»2╗╛╡]:é┼)╚    4zîⁿ$█═!
  79599.  
  79600. ╥P&ox┤£&(«║ÿ-┼8≤╥▄╪ ├∙┘┐⌡ D¡╜≤or\p▐à9?²6`M\`
  79601. ╢ò\&[óh#Γª%ε╓MΦ╕▒▐π╟^ÿvTmtܽ3╛┘┼]ù╙}½ñxô⌡GJvî÷│3⌡+\₧%µ╛≈╢≤ƒ`£    £ÜƒpO¥σVPΩ`δå╤╩K┌°~ε%╟
  79602. +╣╫k╓Cz╙+╢Éε.┌╟├≈ε;ΦßnO░τ╝%JZarëσ$$p[v┼╩X╤╠3V*╖δBß3^Ç∙├¼Θ`Φ·Æ┘₧=┤∩┼SÅ%░h╝^$╤àH⌠^o╦L▐àäü═L┼╗»Å|τ<╝+Φ=╙µ⌠╓ehC
  79603. $W!
  79604.  
  79605. ╘J+63ûè5 ╡º╓jë6π√Θ╩φ╥╦ò╜≡ @╜√─l_GU┘░'BÆ.yw\h┬ÿ\ L&ßU]|¡á%║╩JΦé╣Æ°╠,ÆsW`(ôⁿ`7║┴╧]Ü╙}½╣Ü E*αtÅ█]▄@m∞4╓╥╤≤╧Ñz₧ì╒■f├¢>-èR/H╖├₧α`⌠U+╧^╓│o⌡╚{╔pk╟6╛╥╦)┌╟æ┼Θò┤Upÿ╥ò/=Lha.A╝J∩2^IV┌┘]τ╦0UxE╘╝o╛v#ñ╫⌠ç╒O╨ƒªΦ¿~╢ßàdÑl^b)
  79606. ▓A╝zLδ╢g┼iα    Éå╙è╚dö╒╬╥[Σyßï^»Ä║▓p+&Z_4π#å÷!!%é ¢M▐M#Äre₧ε9≈J|┘╡αE5z[q─₧╓╬Kä╜1@▐┴ZÜÖÖ╫".QL╞╙%1ⁿ!
  79607.  
  79608. ÷V.0░╒r&╝»ƒ/æπ═√╔φìƒ╤┐µñ@░«╬o)U▌æ0F·5-hYIZ
  79609. ╢ò\&5_ªZl½«$║╨W¬▓Ñ▐°╔\Ä`[.f╚│`r║┴┼[Çâ|½G÷yæ²xπ}ï█ô@~⌐(╛°¬∙▐αråM₧ƒùn
  79610. ╜ΓútJoèΩs═╧ZΣH)┼Z▐Vⁿ+gΩ┬lîO╬,ª┘æ`╗½╕≡⌡ ¬±r╢µ≥qCFKg1ÜΓ<hG█┘Å»/Q)!!░Φ3╦Xé⌡┬Åεh≡«ä├┌"▄Äú`═#4«uΦqQóδ4ÇIl├4║úèÜ┌[█╪└± ÖxY⌐nφ5à╨Ω╓CH[\    2≈1Ç≥9%ü"┼█UC#àb:═°:÷1╪íφ`#3^{╪@₧╨└Pô╘N#úδLæ█≥-╖:IT╤╟6
  79611. )àiÖ╗┘┴'ó«⌠▒╬Ö!
  79612.  
  79613. ╓V.0░╒r<╢åè,û:⌡ö ┌ñù╧├■±º    ╝╣ÇkpJa└ì*FÆQj~XQ\ ò
  79614. \hK%╩>zd┤ñ+ ₧V¡≈Çî■█?â<@ce╬┤b6ε╞╞\¥╙wñF╡i╨εP_=σ$¥╟êJq∞9╨ù╩α╔▓=σg÷÷∙få├rwùL>;╜╨ ╩█\µM#îh╚τ(@φÅ¿+⌐╕╥╛AƒÅ╩┘┼9ü┌Ty₧┼ÇJiiSu7ÜFÄ}Y&k└≡Qê╕Mhv\╠═Bß3k ╦╪╢┴!!±┤Æ─¥0░τë└ 0K≡ûf6┘╛|╘P∙ìêöÇ┌L█┌╩ΦE╛R ╣i╓!!╠≤∞┌2"l$Wÿu■¥@°hëG═ TCo╞stë°4∩└░ΩD$6^Y+û ╔▌╦@FôßE>▓╡    ¢éÉU┌l<GO╞║znW°Rä■╘╘NÑ┤τ╖╟é╧|¥T¼! !
  79615.  
  79616. IMalloc comment:
  79617. '<IMalloc> is a wrapper class for the custom interface ''OBJIDL.IMalloc'' generated from type information in the ''ObjIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  79618.  
  79619. The type library contains no documentation for this interface.
  79620.  
  79621. WARNING: This comment was automatically generated from the interface''s type information and any changes made here may be overwritten the next time this wrapper class is so generated.'!
  79622. !IMalloc class methodsFor!
  79623.  
  79624. clear
  79625.     "Private - Clear down the standard task/shared allocators (e.g. on startup)."
  79626.  
  79627.     Task := Shared := nil!
  79628.  
  79629. default
  79630.     "Answer the default IMalloc (task allocator)."
  79631.  
  79632.     ^self task!
  79633.  
  79634. defineFunctions
  79635.     "Declare the virtual function table for the COM interface 'OBJIDL.IMalloc'
  79636.         IMalloc defineTemplate
  79637.     "
  79638.  
  79639.     self
  79640.         defineFunction: #Alloc:
  79641.             returnType: 'void*'
  79642.             argumentTypes: 'dword';
  79643.         defineFunction: #Realloc:cb:
  79644.             returnType: 'void*'
  79645.             argumentTypes: 'void* dword';
  79646.         defineFunction: #Free:
  79647.             returnType: 'void'
  79648.             argumentTypes: 'void*';
  79649.         defineFunction: #GetSize:
  79650.             returnType: 'dword'
  79651.             argumentTypes: 'void*';
  79652.         defineFunction: #DidAlloc:
  79653.             returnType: 'sdword'
  79654.             argumentTypes: 'void*';
  79655.         defineFunction: #HeapMinimize
  79656.             returnType: 'void'
  79657. !
  79658.  
  79659. free
  79660.     "Private - Free the standard task/shared allocators."
  79661.  
  79662.     self freeTask.
  79663.     self freeShared!
  79664.  
  79665. freeShared
  79666.     "Private - Release the default IMalloc (task allocator)."
  79667.  
  79668.     Shared isNil ifFalse: [
  79669.         Shared free.
  79670.         Shared := nil]
  79671. !
  79672.  
  79673. freeTask
  79674.     "Private - Release the default IMalloc (task allocator)."
  79675.  
  79676.     Task isNil ifFalse: [
  79677.         Task free.
  79678.         Task := nil]
  79679. !
  79680.  
  79681. task
  79682.     "Answer the IMalloc task allocator.
  79683.     N.B. The task allocator must always be used to allocate [Out] and [In/Out]
  79684.     parameters."
  79685.  
  79686.     | pMalloc|
  79687.     Task isNull ifTrue: [
  79688.         pMalloc := self newPointer.
  79689.         OLELibrary default    "may throw HRESULTError"
  79690.             coGetMalloc: MEMCTX_TASK ppMalloc: pMalloc.
  79691.         Task := pMalloc].
  79692.     ^Task!
  79693.  
  79694. uninitialize
  79695.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  79696.  
  79697.     self clear! !
  79698.  
  79699. !IMalloc methodsFor!
  79700.  
  79701. Alloc: cb
  79702.     "Invoke the Alloc() method of the object wrapped by the receiver.
  79703.     
  79704.         void* __stdcall Alloc(
  79705.             [in] unsigned long cb);
  79706.     "
  79707.  
  79708.     <virtual stdcall: void* 4 dword>
  79709.     ^self invalidCall
  79710. !
  79711.  
  79712. DidAlloc: pv
  79713.     "Invoke the DidAlloc() method of the object wrapped by the receiver.
  79714.     
  79715.         int __stdcall DidAlloc(
  79716.             void* pv);
  79717.  
  79718.     "
  79719.  
  79720.     <virtual stdcall: sdword 8 void*>
  79721.     ^self invalidCall
  79722. !
  79723.  
  79724. Free: pv
  79725.     "Invoke the Free() method of the object wrapped by the receiver.
  79726.     
  79727.         void __stdcall Free(
  79728.             [in] void* pv);
  79729.  
  79730.     "
  79731.  
  79732.     <virtual stdcall: void 6 void*>
  79733.     ^self invalidCall
  79734. !
  79735.  
  79736. GetSize: pv
  79737.     "Invoke the GetSize() method of the object wrapped by the receiver.
  79738.     
  79739.         unsigned long __stdcall GetSize(
  79740.             [in] void* pv);
  79741.  
  79742.     "
  79743.  
  79744.     <virtual stdcall: dword 7 void*>
  79745.     ^self invalidCall
  79746. !
  79747.  
  79748. HeapMinimize
  79749.     "Invoke the HeapMinimize() method of the object wrapped by the receiver.
  79750.     
  79751.         void __stdcall HeapMinimize();
  79752.  
  79753.     "
  79754.  
  79755.     <virtual stdcall: void 9>
  79756.     ^self invalidCall
  79757. !
  79758.  
  79759. Realloc: pv cb: cb
  79760.     "Invoke the Realloc() method of the object wrapped by the receiver.
  79761.     
  79762.         void* __stdcall Realloc(
  79763.             [in] void* pv,
  79764.             [in] unsigned long cb);
  79765.  
  79766.     "
  79767.  
  79768.     <virtual stdcall: void* 5 void* dword>
  79769.     ^self invalidCall
  79770. ! !
  79771.  
  79772. IOleClientSite comment:
  79773. '<IOleClientSite> is a wrapper class for the COM interface ''OCIDL.IOleClientSite'' generated from type information in the ''OCIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  79774.  
  79775. This interface is implemented by Dolphin for call-in only at present (at least until Dolphin supports control creation as well as hosting), so only the function table is needed, hence the absence of any methods.'!
  79776. !IOleClientSite class methodsFor!
  79777.  
  79778. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q#GD÷≥Dó╠πUAÉç%|║F±·hòx`=┬hû█Wêq}╕|╫ù┼ ┬ÑGìÅùÆh
  79779. ├¢>╧
  79780. gδⁿ6╥┘2ì(F╚Z▄²(G∞╔{╓Ka╬e±ƒ░Eb╢ü·⌠σ╝»6╨ë╢lHP-s<ìΩ>+ε┘<à»Pf9Q▐ûâS₧▌▐╢⌡jß¿█▌è3╛╣ñcìl^b╗i±
  79781. zK╓¿y┼~¼AÜû££█ƒ┴╩⌠F┤;╡eΦ8└⌡▓ò]+"l Tÿ6ü≡8hö:ïz╞DQ9╞'dÜ⌠'τJ!!K╟░δ'5C4£]à┐│-oäµZ#╣·o袣S╫#6
  79782. Rσ⌡0 2ƒxû≥╓╫÷╫¢⌠óΓó^Ä_╡ë@X0öïƒ╪pφ%O7≈╗ô┴╦+p₧ö)╡┬║Jµöæ@Ω)q%
  79783. Æ▐≥T¡°'ë┤τ═▓r¡3öºφïn襷W âOΦ║
  79784. B1ñ≈╠┬Ü ë    #╧á∞H6╬├Ω±î⌡Fº┌:φ!!┤▌`Aσ5╕çò∩εS╥"öⁿ₧à«╩E+6░gZî[≤⌡┼I▐é▄í∞hûTJa╠╔Φb¿kù─da ƒÄΦ9é«ú    ╪X╨jzù▄─ë╘t}{╩║²Ii#τ$! !
  79785.  
  79786. IOleObject comment:
  79787. '<IOleObject> is a wrapper class for the COM interface ''OLEIDL.IOleObject'' generated from type information in the ''OLEIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  79788.  
  79789. The type library contains no documentation for this interface
  79790.  
  79791. This class was originally generated by the type library analyzer in Dolphin 4, but many of the OLE interfaces it references are not present in 3.x. The missing interfaces have been replaced with IUnknown, as we are only using a small part of this interface and don''t want to bloat the image with the entirety of OLE Embedding and In-place Activation!!
  79792. '!
  79793. !IOleObject class methodsFor!
  79794.  
  79795. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q,KI■É#ü┼┼vJƒÉ2├)▀╣.≡T` 2Σgï₧]ÖD}ó╓ƒ╙·═┤vσg≥±·]OáΣZFºrJtä»>█╦WΦE<îM▀µ?o≡╔éj\σ ä≡╖W4▓╝²╛Σ«²nY╜á│BwCAt;Çú$F`bφá{π¿W-3QH▀ôoƒUBàσ┴¿εd≈⌐┴┘Æ;⌡Γ▄└H2¼h⌡z≡░`╙dUδH≤δ·╠▓"÷╝¼⌡G°]╨ê7└ß±╤`|A]4■9╔╖nVö ╝B╓OVPÅte╫û_ècLN═╢·E?S    {îZÖ┴▌S    ÆτG▌û ÷öì@╦!!=^T%█α!!g╤+╛╘╘╫-á│⌠╕▀╕┬KÖτ▀(<M╔ûè┬$¿Ds°¬╣┴╦e1╘╜)│½ⁿ]¬φ╚ ùE*Zgε║|²R₧⌠:ë⌐⌐`ôïB░b_G¬å½─
  79796. ▌∙ò0é┤CΣ■E#╟₧▒óæWM─?╒╣└^5─╬ñ
  79797. ▀╒Ö}j¡╧'&Θ#1⌐ägR╔4J∞┼│∩╪I≥7⌐»²δ╚┤vTY═qU¬E÷²ÜQ∙ƒ█½▓o$h≡2/'àúùeÜ{ë─QL/Hçù≡$╠ⁿá7═^┴k)Γ┤╣╧~┌txfΦ╛┬Sr4₧G5så ßj║ñ═ZTí»╞░G┐⌡┬▒[Fü9 ╗V~╛Z\0▓AÉ┌≤6⌐RY▓l+æ╛;s╝╛╖∞╫HnTJ"₧ò¥╗«µ╓ ε╢e╬½⌐gÅ v6c≤φ┤R∙Ä⌡Φ]└¼puKÿNJ.εÅokº█.«∞\¡╪S▀âA£ôú¿áP╚h╗of@■Zjov└ærZrc¡└∞½Γy■
  79798. y╟≥nÄ∙ε0ƼA &>╕░z;f╪çπ!!ê<J3:▓τ╖Ñxsá·B4τ█ïe╞C╘╒▀!!╝1së≤:ú+╪á▄≥╪⌡y5    "m=¿σ¼/╝x÷═üδ├╤δµt÷åùxⁿqT≈Φ╡≡ñL╪⌡!!┤▐╕ ║ ─╥a╥⌡N┘⌡_ΦXw,¿CFH0Nñ6ÅX    ─g]X¢E"!!V≤ò▀x.úñ╣╟Z¿«εä#»xJ/h▌╢⌐$ÿ²α2D│Aîx╙V#`åR7╒≡6ì'╒H╛!!┤╜íBmµ▄|²╗C╟9N^ú/ä╕≥u_ú2FΓB█╠Θ    ╤ ╔hXφN▄QV4szττoó¼sÆ>å│3~ä]öïâ0±σÉ*&∙ÿò>√╥)Z¬╙∞?═≡/αö8ΦPZübôå╟Ñ║╗╗«_╓ѱÑΩ<ΩεXç▐\åê─ΩäX/^ä@╨ARìæ╞τΓ┴g║~┼
  79799. fµ┬B8ΘΩ╨Bêê╒¥≈]û>ìNuÇr ,M¬Äƒ÷╙K┬dôaöö'|90╡₧Ñ╚heú╤ ╜$╣▌▄Y░┐±8╛ @.à╢-.îkÉIºvòd₧Σ8
  79800. `╪?uÑσ°║ùè▐4Ω2'▌┼┴í;╤Γ,4û╝╜#▐H░».≈░5G~┌ÿ┼╙=²╞Σì%┼NÑ    |+╛╚░╥sf╠}c@#XïIxm ╒»L8ç═DO½u°φ╡î{nW╘n╚_¡├è∩┴û╛Z╒ª╕Eªí]Ä,¡╝mD²╨≡Mª┘ÑgHΩ⌡â}╟Σ½Ñq
  79801. í]#î\╚ =₧»Å┐╠ò<:▄÷M1┤é7oy{"₧«÷│┌#úz╧fü■Φ ┘;╩¡⌠sΓ▐╡┴;[oñÿY■Öå¿■Zú═.æâ╠SëH≤ôä╒
  79802. »
  79803. ░║ƒF]e7%&-R°═së£q╘M≈╔∩£⌐ⁿ≥úÆ⌐▓â¥┬ⁿ1╞}≈é:┘hy├
  79804. 06Y¢╕gⁿ╔╝╩Θ¡ªI░■çk>L+I[ó«lò╒πIÉh⌐ª%Ñ▓»¿jÇnxü═║│ñ`₧ε?▌Cß<3("ç╦Éå(╙,ı╕7αö≈    ¼─Γσú╥╛&Ωl┼Cⁿ é₧Ao\¬#·YαWΣ┬╫╘èë▄Φ~ÅS≡σ`KÜ,ÄOú4ß11 E⌡c¿∞K¿╫E_█z[╚»=ÿ⌠jδεâaá·╙ì#lpY7Å¢M¥╨Æφ"┬Ωæ_%≥≤l]┌|╤$î √)╟ïnÆ≡╩┬╤¼w%φ²πÑÉ┴ò╚∞b⌠lmóε
  79805. gòwç&öBε+█*y{S"u'6«v╢s┘öÖ`oΘÇvO2÷3üπ¥ñQ=εñ$e\ÅÆΩ»║≡\?╕(l.U-úi@V⌐b▓íµ▒O▐UAé∙ W ╫╞╛ù┌U}⌐wz■te4╙╪Rr∩e╪╝ ∙â+
  79806. $Y|┤wzô@ç°ú
  79807. öèÜ\HΣ╥S└t╒híCüóyüD╫╔l║╙S▌@µ#Zjit&n╒yÅ;so\█ƒ*≈l6P%Ü⌡─Kφq┴Ü=≈U¼¥-7{8ÜI@τXöcΘg ├≥{·▓▓ÜY∙ÇÜ(?Ä─`5D∩┌BÖûvJ└Q =üCë√┴τJ╗t╒«ºcà└φπ[╓3el╪1B[?ºÅ│
  79808. !!âS≥╢Üt╘▐`┐ÄΘñ g┌ì$áΣ╡~²oéÆ╕│·7╛" ─╠∙;5╢»rº ⌠åB;&ª√NP╬┴√=≤╗¼O£WFjm┐≡═6g!!v±IçU£|îΩ╬!! ├öΩx±Bí╔╢SΩ▒ªc%≥╕¼h╢{┴╣rpRu ∩²q¿ƒ¼í|σâ≈e¿>úK-kpΩÇ¡HuVGá~s]G╥.J°hK=!!▄ïx)FSûP1ÆΦ╢.y√φâ107k▐⌠ΦV╡ñ°≈»ml┤X╩┌ ∩┐}Ñsε9Pß┤qòwUX8┐âⁿ╨┤ùz╙╒█╔m4| UBpÉ√ì≡ß┴j.δvTⁿt?╢PSW▒«τSΣ'Xa╒╟I≤üI\uτ½ƒöuσΘ╟ç│┘┴½ÿæ*ç├⌡▓H√Gäî°█º╬"ƒ┬╢CâU G╗K╘à╖╚▄w∞╜▓*0! !
  79809.  
  79810. !IOleObject methodsFor!
  79811.  
  79812. └@1&=■╧"╛┐┐#ï4í─δ█▌╪╤█╗±▒ZL▒ßÇkw_u▌è0WöKM%`69M╞ôOg2Jπ1C¼╜/±█á▓≈┐≤┘Æ<@ce╬┤b6ε╞╞\¥╙5Zâ╣Ü E*αtÅ█]▄@m∞4╓╥╤≤╧Ñz₧ì╒■b─ÿ>lÉE9N«█sßαL≤E,═S╓V╥)w≡╘}è/⌐V╪τèJI≤ç┘·÷╗±SU╖δ°JDBC8o<àFÄ}Y&k╞┘,╩┤W~5DB▀àoçU æ║æ¿°v╟╡Å├ƒ=íΩ╞å^Za{A╤æe⌠╕{╘xZαFìòùì▐DùîàεP±%╢íaòº╤ΩMg@Gw▒3ä°?a█j≥$╢&RGoÇ iâφ4∩!!╔«π:[!
  79813.  
  79814. αT7445íΓX@°êé9Æ:≤ö√─√ù╤╘│≈σ\E »╚~3IF┬ê7QûKM%`dΓê^&2Gª<\h¿«#εÉm┬┌▌≈╔▄æ4YzU╔╣╖┘┼╞!
  79815.  
  79816. ΓH(    0bΣï%╗┐ëò+Φ█ßîô╜╢ùùⁿ│\H║√╘svu▐ï-W▀'kO[d ╢Är.Jπ_|GΓä"≡█Aµ⌡┌⌠ÜÑu╫|L@r░╒e εô¥[ÉòVVóLÑx╩A°F|.ΣKÅ╩PôL:┴jU█Çâ¬î≡3ü ½ëåyUε╩DA«fJsÉΩ ╦╙K┬S=├MÇV√?\ö¡!
  79817.  
  79818. ┬H(    0bΣï%╗┐ëò+Φ█ßíö╛¥σ¼√│RW║√ì;ZF@▌Å;âWAjMW\x
  79819. ╛╚^Tc2G¼xeñδ4≥█#çÜ≈æ⌡┼â4Iop╩╣ir¼╨ÇM@ÉVüv½JáxéOæ;"cQêL¡√j⌐n@∞?└å╟⌡═¼╚.ôöÇyG├¢>-╦[u┐»&╨╠VαO*╚╓²*!!²╨K├Tk∩/Ñ╒îJ=Φ├Æùók┬Ö
  79820. 5σ÷╗pGYKu&è    Γ<+C═┬Äß-8TC╚àqµ0k¿π╘┤·!!φ┤ù╠û7▒└╚├h]!
  79821.  
  79822. ┼K':■╧;┐╗Äjë/∞╟Φû╛█╧╪¡⌡σCb╝»╔mv{_╞üdç~G>gMVXΓä^Uo(Kªd    *«ó.■█Z@áá╣Ü╟╬Ö`@fw╘╕]3╝╠╬MÖüEíPäxôªC*ΓTÉ═kÖA`┴jUæó╤ ┌ígìM╥█║rí·R╢h;ªα█═]»o┴Z╬ⁿ)!!÷┴8╓JkÇ₧±├Kv╣½√Ωá║⌡pL╝Σ≥%R]& ï    µ&t]ñ}á{π╚q_py÷╡o┤eé⌠╥╣≡mñ₧Ä√ƒ,╖½ñcªl^0ü<≡zXó╕_┼Yák⌠Φ·τΣAòδà╦q╙Xp╢{∞ ┬½ò╡s/tG▒╝√(F¥=Ü@╦+HVf╠ p¼°!!Ω o┴╢Ω\P#pφ╨∩ÖH    ÄΣ&╛±MÜì╙*┤EQ9{╠═d+
  79823. ┐H╫≤╧▄
  79824. £╗π│┼ƒç2÷1╔φ~_*¥╥╜6Φτ"jΘ╜Ç┴╓töÄeⁿσÜ=S╔ôûCΩf>ô╞≡è⌡3Ū▒X╨█O▒= Å╜τÉ{æπö)ÖòNF╠ç(.dâ█╘╬╢XA─.╔ú╞|╪─ΘEÄΓ▄aC¼╪?¿ÖΩ>çQ-╞╫┐φ█╘;╡⌠£êÑ■JP┤!
  79825.  
  79826. σK':■╧;┐╗Äjê,µÄ»═╙Σ°ò┐±▒ZU║ê╔ov┬ì[âZ:oIVe└êN<f_ónVd╢¥) ╔¡┤úƒ∙╚═4LmtÜ╤[∞Φ╙RüûVZéf÷rÆ ∙R[I,ε$Å█KÜMfí@(█ùâ≈╧┤zç▀Æùy║°QMºdJy¢»'╓┌╗H!!╪Z▌ßs!!∩┬j└.╔    ┤╬ü
  79827. ┘╟╓±⌠Φαh]¡áª%J\b7ûJ≤"pBU▌▀Qâ▓i9EM╧ì;Ä^L╘¥╗╒û┌⌐ä┴£S▀èá-└32Yⁿu╩
  79828. f]Å█⌐aKßÖ█╙Å≥{╝╗»Å+Σ33«b≈6÷ε∞┌@yF5@)⌠Z∙₧Diÿ:¢K╟B∞        à∞;τ:$N═¼√q*K {╪Φ█▄SFü≡l+Ñ■DÜüÜU│FQ9L╨≤ .úiö∩éÆ⌐╣σ÷╩ÿ√^ÄY¡üQS6╔√µQΦ%ópb ╗╖╛Ä╒:}ä┌#í╚ Ví·∩ièN0' ò╓Φ⌠ï!
  79829.  
  79830. ─J2<▓å!!,αΘ£:Ç1⌠┘╬╚Φ▐╠╨╙ÿ╠s¡▓╓zgMƒ─\üPO/.O[nO╙Å TG"Y¬oV"δδ- ╩J¼≈╕ÿ╖█╫Wq-.o╪╢h1║ë╫KIàû5¼Z÷iÿ╝CJ
  79831. =ΦrÜ╠±(╞iU√áµ┼∙îG╚2áêçx »²[çnvúδ%╫╠Z»,EÑ6│-ⁿ8u─çQτL{═ à²╖`UçÅ▓┤á╕±nI┤┴╢ vCP XτHÄ}]& ▀▀ƒáU-/WH┘Ç#çB₧Γ╘½Θm≡·╙ƒ┌Çφ┬└9AX]╤ò1gZε╖)╔cMφ
  79832. ùà░Å╙D÷╝!
  79833.  
  79834. ─J2=╢ì!!s·╣£ï*∞√π╔╚╥═╫╙ÿ╠s¡▓╓zgMƒ─\üPO/.O[nO╙Å TP#]ío#Γª%ε╓MΦ╕▒▐π╟^┤[s@ab╨╣n&ε▐╥XXàùVw╖óuòAεTL 1≈aìÉ4÷/┼iß╖≡├αö3╖2îÅùó²a¼uMç²1═ù2ì(FÑd╒τ!!╨Γv╫OA∞ç∙▒f>∙εΦε┼╜∙OP╝╓╖,8apπ`Ä}Y-YY█╪åßJy8@M╓ìu╦Rôπ─┤Φ!!╡Θ┴Σ»0╛φ╞┴O}Ui╒B∩
  79835. xYó╕g╓lWσ╜ǃé▓"!
  79836.  
  79837. τQ+⌐è_C╙δ¡$û(Σ╞»╪÷╥ƒ╙½■⌐M╛╢┼;|N╞î;ÿ]N/mO)b£∞t0X5J»zmº┐Θ█P4▒º▓─╖₧!
  79838.  
  79839. ╞A3991íü&│╜ëp┼/±≈π┼√┘╦µ╖µá>)╓∙≡iz^W╞ü~╫vJ<aPV+■ä^~c2l»uVd╢ÿ)ε█
  79840. IΦ║▓è └^ÿrfe܃Bε╞┬SMû╙g»SªxöA■H0Σ$ì█ZÖKb⌐r╛°«£Ñ╔[║(¼«┐HOæ╬DPªc wÄ»█╦|δH*┬KΘτ()ö¡½+U╧*Ñß├m[┐½█≥ΘªαSU¡σ°@BuVvo7Ç╨$t ñ}ñSτ╦4UZ╙ô;₧[╓π┼╝ `Φ╢█ìÆ,░≡▄█EbK;,░y▀}Z∞ÑZ╔y^ªL└∞∙τß[₧┌├ªK·1╢bσ─δ⌠▓p!
  79841.  
  79842. ╞A3991┤ì=(¿¡¿+æ>╗öδ█╠╥╠╨¼ΣáW»½ΣzgIy╨Ä;Qâ:~R┘â\e2"╔Z░ó6√╩G@σ≈₧Éß└╫`V.G▀¿N>º┘┬VIç╖a»  =¥ΦY@xεb▀╩QÖWâ-|▄É╔≤╧┤3ƒ₧ïây ε≤N╢h;ÉΩ0█╓IΓSaí5╖|ÜDI╦ΓK≈nZÇÄ╧ù@w▓ó⌠╛╟╝╫lU⌐Γ╜ abTgzπ`è~YJF^⌠W╪Ö¿^c9G ╓Ä!!îü┬╘½∙s≥┐àü≈T▄èá2└#6R*ÿ}Φ[]Φ┤j╘'¼ÄÑÆÜ▐gÖ▄└σV╜I]╨ú^»èÆ╢FP`]\<²wÇπ)fÉ8ôƒSGpôlt═¬dú2S┌ª»~4Aq┴öÿç)lΘ▌O/╗∙    û¢ëF╥%<sA╬¥N!
  79843.  
  79844. µA3?-,íü&s·¡¢ù>÷⌡ⁿ▄√╘╦ò╙ÿ╠b▒¿╫~aB┌ü~ñv~0Anπì
  79845. i ¬rEe⌐ó.²₧V¡≈ö▒┌Å3¥q])sÜ¢h&ï╤╘\Fü^┌Vx½W╛röO╛<%dRêx▀▀WÅUq╛@ ╛°¬≈┬│dì▀┴╬<G¥╪maΓnl╦í^┤╢LΓM)í5│╘(u▄▀l╟LzÜ╡╦ºVuñÅδεσ╝Ö
  79846. 5╨≡í`JKg<¥µ~%9≈├¥ñK-=Pc╪ï*êNoⁿ!
  79847.  
  79848. ╞A3?-,íü&s·¡¢ù>÷⌡ⁿ▄√╘╦ò«ß¼IF│ßÇk`AL╫êS8■t8gMR
  79849. ╢╠^ph0@¿y~¬«`▌█V%░ú▓ÉπçU^ÜqJadÜ│kr║┴┼k║;╙wñF╡i╨εP_=σ$¥╟êJq∞9╨ù╩α╔▓=σg≥±·'£╘dqÄTJD╜ⁿ'┌▄^δMoδZ╬3δ9d≈╙0»(⌐Vè╒ìy4ªáδ≈τ¡≡ P╢ε╡JrbG
  79850. q¥µ$=":á~ñ*à┤MP|peαñ┴à∙╦╜≡(┐╫δñ╪S▀Äú`ô>╜p╝`[ß░e╠7Σ¢Æåé╦╩ÅàΓU√4·X╚    α¡ª▓p/W\E;▒>¥ß,iÿ0╝O╙,(!
  79851.  
  79852. µA37<+º╝&(«╝ƒp┼;÷⌡ⁿ▄√╘╦ò╙ÿ╠b▒¿╫~aB┌ü~│hkJy
  79853. σöM&)Iπu]|¡á)⌠┘á▓≈╜╪Γ\1ò~[z'╔ⁿJ7║Σ╔JKªÆ`╜  =¥ΦY@vú    ⌡│3⌡^4¡/─ù╤╢╨═ß æêäyε½
  79854. ΩD=T░╦s╨┌H«Bª6╔ + ô«σGzφ6ó▀░Puº╗δñá┐╒sL╝πªgh /EqÜ ≈#+Q╟┌ÿ∩4U}M╘Æ8ÄHBùπ■║÷dτ«∞º!
  79855.  
  79856. ╞A37<+º╝&(«╝ƒp┼;÷⌡ⁿ▄√╘╦ò«÷▓`W╛»╒h)F╓ôFûKQ91:)?ΣêXr#ε<zd┤ñ+ ₧V¡≈É¢πΓöGJzu╔⌠$rú╠╘QGæV£5║K│=│.╤@ 2Σgï₧NÄCd╝8ôÉ┌╢╪¿v╚Üÿûu½π)╚`δ╟√∞j╦uo≤`╔≈.`⌡╦8σGzφ6ó▀░Puº╗δ╢ìl┴¥    g░εÅJkU\ h7èJ∩>vT▐6▐ÅóM!!Q)%│ΦäO½░─╢∩hπ┤ä╔┌2║φ╬CÅ3!!╜hΘ=Å█é1ül≈▌àç═\Ä╫╔ªQα3╗gφià∩Ω┌    Se[Fn▒3ä°?a╤0êA═ ∞    ^₧■9σJ,R▐úπ^5Kr╗p!
  79857.  
  79858. ╞A37:6¡ä7;αΘê=ñ,≥▌Φ┬╛╙╚Γ╢√ª[n░╡╔pvZ ÆÇ)eƒVG"CT]b≤ô^Iv+D∙<Cz»áMÉ╖0║╛íƒπ╩\S╫]Pak▀ⁿy:½ëτ\\╕¥~½Q■4╨ ∙EG<íkÖ₧MöG4Å/ô¥┴ⁿ╔úg╚ìÜâl
  79859. ¬▒U]Γt~┬²6▌┌V±D=é2░{ÖD╤⌡]±wB⌠ÄπÉPp░»⌠≥á!!¡αMS╖Θ╣-+?b[╡φ*pdAC└├ÄßUb2D ▐ûÿI æ■¥╒ûì╙║─ö⌡÷╟╞9C░s≥4[⌡åa╔nS┴    Éêÿï═÷╝¼Å+╧%«VíΦΦ÷╓C{L    -ß:ÿ╛v√]▌#╡u++?ÉirÖε4∩J6H╠íε[=`
  79860. l╙    ╦▐═_└τK%Ñ√    ¢éÉU┌leN╠ 3w█2·æ▒∞⌐╢≈÷┬à▌^ÉQñºDZ(═°!
  79861.  
  79862. µA3/&=╢¼>(⌐║ÑΦUêû╬┬φ└┌╟■µ¡Vπ£⌡RW└ü-G¢K%hZe∙èWaf[½yIìå`╒▄H½ú≡ì╖Φ
  79863. óg[Ml█»~èüëEÉ¢qα█²kòM6≥sÜ╠Ç/┼2└à╞Σî·.╚*¬▓╖<½µ)╚    ~ÄΘ^┤╢6└D;∙L▀╨!!`Ω╘Qµ.┴1ó╦åV:▐─æ└ß╗πeN∙ßí%oCV X!
  79864.  
  79865. ╞A3/&=╢¼>(⌐║Ñ▀±≈π▀≈╙▓┐╫░òAJ⌐║╘~3√è(]£Z>f^L
  79866. Γ┤\tCóo@Cåπi║╙Gá╕│▐°╔\
  79867. ƒq#AMÜ│o8½╩╘_çâp¬┤d╨⌠T=Γaû╚\Ä ╞mV║√δ─ΘôFñ9▀ñ¼o¬≥VH« -~û┌ █═|δ@<▀v■^₧GÉ«C═Wz²ûΘ¬`>≤╛█≥≤¼╜;1╙ë≡gh,<Wp;£÷<1\D═╠å√e.F_╧ì;╦ T╓╫Σæ╪+║╫δññ-░∩╧I╞ !!
  79868. 
  79869. ╕_²x2ê!
  79870.  
  79871. µA3/&=╢╗+9┐≤╠.Æε╞Γπ°π╞┼╗▓╚9*²Ü╬hdMDÆÉ6W╫q$gX\o
  79872. ┼ò Ph!!πnVy╖º4║╤D@í╣íæⁿ╞╫`V.C⌡æ-¼├┼Z\╥╙1p║vÑxé5σAJAqíiÜ╩QôF:┴jU≥ç╫∙üºvåìÜçy εⁿRP¬o;òα&╥█≡N=╟╥ß(!!▒╧y╠Fb┼,±╚éW≤ú²≤∩▒┤cS½≥╖    i_G&0¢ú5f]Y▌╚╩ºV|.&│ê"¢HÇ⌡╒°∙gΓ│é─ƒ0╢·çKóoZa{ⁿq∙4^∞ó~┼≡k⌠Φ₧ï╥┴ïà┼m┘&1⌐`╠6╚ΦΩ╞ZHlXH$Wÿ$û√+√]÷i┌ tQföTy¥■oú2z╟░Γx7S    {╗p╖╗╔W╡≡Y8âµYÜ╧▀J█!!v=*x├■78â,═ªÿÜ;ó│≥╣╧Ä°KÄQ«âP6»ƒ«╧8¿quB╗│╡├îpä⌐8╡ü■S_╔ôÆ$åM01é╓[æ*≡▀6é┤¬Qÿ!
  79873.  
  79874. ╞A3/&=╢╗+9┐≤╠.Æε╞Γπ°π╞┼╗▓╡@Yè¿┼iGQF╫▐~BäEq9kIgr≤∞t0$]¬jR~ºδm║≈Lº╝▓▐π╟^░qJ5}e╚êt"½üëEÉ¢qεL░=ä    ∙l&ík¥╘\ƒV4╗=├é╞≥îój╚ù₧╙n
  79875. ¡⌠^RºrDΦéY╖╢w╒d∙sεV╠rφ├{├NbÇ┤╚╢WqíÜßεσN┼₧    5╨█╗?%S[o5ÇτW<~AWë┌7à│TB:wU╩äcµ0k ÖΩ╖Θu┘·¡²¡ü╤âI▀->«Hσq╣▄⌐/6åk⌠Φ╧ÿ╓ZÅ├─Ωτ4╣jφ?ƒº≡═U|C    lªwùα"wòtô^╚ UP)╪
  79876. Σ┼&µ#┴¼∙V=3N:┌│╕!
  79877.  
  79878. ╚J.*½é(«¿╓jòα└επⁿ▌┌╓¬▓úpQ║║╘r|F Æé@Æ^P#aUo─ä\t0Jº&n╡Ö%Θ█P¡│┌⌠₧ì, ₧b_k ùⁿD<╕╞╦\üûV\áJó[é±uN9⌐-▀╙\êJ{¿@3╒╥╫■╔αPº ▀öæv
  79879. ¡σS░akçδs▄╞≤I*îM▀÷$wⁿ╒6»(¬V╪⌠▒aGåé╠╛▀9╗αd_╕∞╛J+kOA-t=â.Γ19":á~ñ*â»d-gM╬ÇëPòΣ¢°∞Eσ«ÇΓÿ4░α▌Eóo^b{8╡r┴OxP∞╢)╞NIΘèê£Çô%±┐¼Åy²·~∩ ╠α÷┌e@N}⌡ í≥>`â"ÜJûC,(
  79880. αæ\┐,N▄╖ε[q)^}╫╥êÖLà≡I&ú┐╧╒╢r╨'6_Wê░7*₧~ô╗▄┼╛╛»█íΓ⌡LÖTª─LX2í₧åΦ+ín r!
  79881.  
  79882. ╚W
  79883. 7ÇÄ&,·─µC╟≤▌∙═Ω╥ƒÿ■█½EL┤╛Ço{M√ù BúP`+z^"O√ä
  79884. Qi"¼z~¬«`┘±o@º╡╜¢⌠█\    àuNkdÜ╛tr║┴┼ZÉûc½Q°·lû8&!!
  79885. ─W¬≥m▄}K┐8╨ô╧·îë`╜½ö╖}½╣╧
  79886. c9∩à^┤╢±H=╪J█│>u²─y╬N4Ç7ú┘ÉQxºε⌐½╛k┬¥^O╝∞┤J kPTo6¡ ∩]!
  79887.  
  79888. ╥A3991íü&│╜ëp┼/┬╪µ╔≡├∞▄¬≈╚9*²ï╥reIB╫─s╛QR%e^≤┴-\rC¬y]~æó4 û @Ñ▓úû°╦\æ4Jk ∙ô@rí╦╩\KüVät╛S│y╨σ[=ívÜ▌\òTq╛NQ╣ ⌐ƒÑêA¡>¬╖º<0æΓC@íaw┬▄6╩ⁿSεD!!╪l╙÷e ô«½yg╬±⌡¼HqÉó±√ε¢²tY≤áó)lC[U;ܬL]&ñ}á{π²Od.WY█ìoÿNò±▌┤ª!!≈╛û┬ê:⌡╖ë α    2(
  79889. ╣rΦ<}Kτ√7¡2╥¢ìò╬╓Fì╫╔∩F╫<╢ï!
  79890.  
  79891. ╥A39:4½¥*▓¼ü/▀±°α╦ε╓╙╕╘¢τcQ╢¡┴ovÆ¡0DÿTAjzSV+<≤ò=Vj)]É[o»«h│₧O╝┐╕Ü╖└^â|[@MO≈ⁿb0ñ╠├MéÆe½G÷ëAΦYJI*ΣgÜ╫OÖP:┴jQ╣√¬▐■à@╜!!½█¼C║⌡TE«lJHç√╤╙P⌡r,─Z╫╗@ É«∙K`²¥≤ñtUƒï╠╩┼LΦΣLS╛≡│K>+?b$_Σgë~lgFB▌╠╩▓Mi?B@╓█oâHàσ▌¼╝3░·¡Γ╜ö╧∞=√ }Ui╒B∩
  79892. xYó╕g╓lWσ╜ǃé▓"!
  79893.  
  79894. ≥A3?-,íü&s·¡¢ù>÷⌡ⁿ▄√╘╦ò«ß¼IF│ßÇk`AL╫ê~?²6kO≤┴Ar#A╖<\lΓ┐( ₧Q¡┤╛ÿ■╩^ûgNmtÜ│kr║┴┼ZÉûc½Q÷iƒAΦYJIUïî╬\ƒKrÑ8ô£╓√╬Ña╚Ö█âu½²D
  79895. ΓAhòΩ!!₧╚WΓU'╔MÜ√(!!δ┬k╦XkÇ(░╧ε.▓¡√√≡¡≡ ┐Θ¬%U\crüΘ3e\╚▐Å│k=O_▀╚a╔7h√Ü╕ñ╝i÷·¥á≡W╜±ëSÆE$╤òfGZ÷öq╘hU°\▐àä¬═Iî≈╓÷G≈]╨ê#╓εΓ┌)_@'⌠;╙÷>UÉ&₧C┌ DP-δ
  79896.     │≤'úVe Ñ╚å>8<~ k╙@₧Θ┤.oΘèT8≈ó    ║¬╣f≈U:)x½Ö-    âyÆíÿΘ¡╢Γ│÷µí6⌡1╔ìCp%¼üèIï╛gj╗╢ó╦╓*}â┐>╡çΓQ¼δ╞ε*^ü⌡≡S£╗w╖│»AŪ    ╬R!
  79897.  
  79898. ╥A3?-,íü&s·¡¢ù>÷⌡ⁿ▄√╘╦ò«ß¼IF│ßÇk`AL╫êS8■t8gMR
  79899. ╢╠^ph0@¿y~¬«`╔█V%░ú▓ÉπçU^ÜqJadÜ│kr║┴┼k║;╙wñF╡i╨εP_=σ$¥╟êJq∞9╨ù╩α╔▓=σg≥±·'£╘dqÄTJD╜ⁿ'┌▄^δMo Z╬3δ9d≈╙0»(⌐Vè╒ìy4ªáδ≈τ¡≡ P╢ε╡JrbG
  79900. q¥µ$=":á~ñ*â»d-jv ¡e╦JƒΩ╘┤╡:ë╨ΦÅ≈T╪ëáU┘ %░<∩p\π╜eÜ-HΦæôù╬Ä█╥╥ΘP≡RôQ─y¢èÆ╢$UlC    4 !!Æ√$a▓5ôB▓r!
  79901.  
  79902. ≥A32:+░í3$┐║╓jû%┬█ß╪ ▐╤╨¼╙╡C¼íπt}\W█è;@╕]Np.HIH°òPh#]î~Y*╧┴I╕≈Lº╝▓▐π╟^ñqJ(as╬Æl?½┌êÿçz¬╣{╨⌠T*╠$░▄SÖA`ΓmV║╗╬µ└Ñ~ìïÜçuá▒XBΓtræ»>█╦WΦEo┼LÜπ9h÷╔y╬.╙0±╦ågª╛Φ∞σ╗┤aRááù5,Jr|&V╬±?c\=ú~┘ï╡`=Z ╪äoÖ_ÖΓ┼╜°/ª╫δá≡W⌐ú┴ÅZa{ «<ªR4Lτ╜o¡2ào¡äçª╨[Å°─δGτHp⌐q┬<╦≤∙╓C{nY}≡$ª∙$f₧0Ü}╦
  79903. HLdδ
  79904.     ΣÆ&∙)*R▄úµY4(etîZ═╚·KöΓU$▓φf¥ƒ▀F═6YC╞⌡/ÿbÉ╡╡╕gñ¿▒÷ù╦¢ò^öûPS~α⌐ΓyóCÑp&E╗¢ÅαΩ X║¬τü÷r¿Ω■s├{N$ï╒U⌠R£≥"Ç│ÿFÿöU∙x╛öΘ¼C╕╬ÿ,√φ!
  79905.  
  79906. ╥A32:+░í3$┐║╓jû%┬█ß╪ ▐╤╨¼╙╡C¼íπt}\W█è;@╕]Np.HIH°òPh#]î~Y╚┬b╩╠K⌐ú▓▐║Å5ü{U.t╥╣-½▌ΦV[ü8Æp╜  =¥ΦY@xεb▀╩QÖWâ-|▄É╔≤╧┤3ƒ₧ïây ε≤N╢h;ÉΩ0█╓IΓSaí5╖|ÜDI╦ΓK≈nZÇÄ╧ù@w▓ó⌠╛╙╝▄oO¡╬│v8a[τ1Ω1c`■$∙#╩▓CN3MX█ê!!ÄH#åα¥╒ûì╙║─ö⌡╧∙>ⁿ1Kƒs≥uV∞┤{∩oQÑ]≤δ·╠▓"÷╝¼║T²$»jφs╓≤ⁿ▄JeFZ9µ8ü≤m3╤8ÅY╠ SoûwsÖΘkÄ`Lb█ºπQq3D┌┌±╪H
  79907. φë!
  79908.  
  79909. ╥A37:6¡ä7;αΘê=▓7Φ╫τß±┘╓▐╗ασCN┤ßÇk~C;╕φ|bàVR+z^&O▀ÅVm#╖tV*æ«4╫╤L    ú▓Ñ╓╛Åâ|Q.o▄ⁿy:½ëπve╒æp¡W÷jé∞AJxπ}▀╩QÖf⌐9┌ä╞Σé═σg÷≥╗N*¥─{pΓ_5hûδ0▀╙Sºr*╪r╒·&dδÅ¿+⌐╕╥╛a╜╜±∙ε¼┤lS╖τ≥RN\nüΩ5c=ú~ñx▒¿WP|ja╒Å&Ç_▄░┴╡≈(┐╫δñ╪S▀Äú`ô>╜p╝`[ß░e╠7Σ¢Æåé╦├û┴±Mµpô^∩8╦Φ∩╤P%ow.⌠;ò╖$kç5ôG█;@Noδ
  79910. !
  79911.  
  79912. ≥L(!!Ñé7D╨└╬ ï,÷╤²îΩ▀┌ò╕τ⌐_▒║═~3GPÆÉ6W╫PF kXG%M¢δs3\ªpU*Ñ«4╧═G£«º¢¡ÅN!
  79913.  
  79914. ⌠J&#1╖èhi╛╛»%ï1Σ╫√┼±┘ƒ╕╘¢τzM⌐┤╦~3\^╫─ \û[R#}^"O√ä
  79915. Qi"¼z~¬«`┘±o@ç╡╜¢⌠█R\·3j|Ü┤r▓ñ¬0@çV╔K5╜F║{╨4≥PK1≥a┼₧]ïa{ó9╨å╩∙┬εΓdùë╙ O■▒^Bûr~╪»═┌Sß'▐Z╔ 9Dδ╒w╨.╚-î▒Θ!
  79916.  
  79917. ╘J&#1╖èhi╛╛»%ï1Σ╫√┼±┘▓┐╫░òAJ⌐║╘~3√è(]£Z>f^^≈àPu#Ω<^o╢ú/■₧MΦú┐¢╖∞33╫{\
  79918. kc╬ⁿz »┘╨\L╒èVaªF÷oò∙XY *»    ⌡╖pæRx⌐9▌å┬Γ┼»}╚#ÉÅû&OÇ■E╖t6Éε:═╓Qα ╩≥$╓T╒≤]╨Pa╥Ñ╘æKa┤ª╕ΩΦ╗┤lS«¡╛`Jc&åτY]":á~σ#»ÆlAsσÆ;ÅYÜⁿæì≥`α¼ê▐ƒv╪ëá`ª>>/C⌐r∩sQτ╡)╠bUδFÜû░ü╤F₧╒╤∩M·[k╫êq¿ìò╡sF](≡;╙Σ9aÆ5ôBàXRFtërd═⌐dú2S┌ª▒:[St
  79919. {┌₧█╫RîΩX    ╢≤E≥ !
  79920.  
  79921. ╘T#!!=ΣΓX@°Ö₧#ô>⌡╤»ü╛■╤├▒∙áW╖╛ÇNcLW╞üv╫RA>fTW+≡┴
  79922. QcflîQeáí%∙╩║╢ºÄ≥╦\Ä4Jk ╚╣n7º▀┼K°|■|╟käXú4╨e6≥p¢▌XÉN4Ö8╥å╞╛à√Γd▌÷∙e╟¡AM░tzÄ» ╩█\µM#û╥÷>t⌡╙8ô0¡U╪ΓÉAx╡ε±≡÷ñ²d╕∞╛gh! !
  79923.  
  79924. IPerPropertyBrowsing comment:
  79925. '<IPerPropertyBrowsing> is a wrapper class for the COM interface ''OCIDL.IPerPropertyBrowsing'' generated from type information in the ''OCIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  79926.  
  79927. The type library contains no documentation for this interface
  79928.  
  79929. Warning: This comment was automatically generated from the interface''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.'!
  79930. !IPerPropertyBrowsing class methodsFor!
  79931.  
  79932. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q#GD÷≥D½█≡KGàülîQ╣jâ≥VdRê╢ε\Ärfú9┴å┌╘▐»d¢æ£╙x
  79933. ¿°YAûekÄε'█▓5ÄBª2░α(m ¬½+j┼9╕╥åba╜¡∞≈∩≥┤#{╝⌠ûuJTU&£φjamC▌ù|α╚0=QK╧î*àN6Åα╘½ª!!ú⌐à┌ò,▒ú╦█}LIn╓ò qYδ┐lµxU∩ùÄ¥╘ƒ ╢╫╒╓P√5¿°╩╫∙╪yl
  79934. Z4⌡m■¥D °5ìI╩DLw▓ypêΦoúM6X▀¡²Sq0Z£]à┐│-oäµZ#╣·o袣S╫#6
  79935. Rσ⌡03/öhƲ╤▄ ¿ëσñ┬à╠L╞HâàvB6⌐£êΣ?╣8v;·¥┐┴╬6tä╡9│╥¥>x═ÉΘ,ùUb99₧├ª▐≥3¢¿»P═÷-╩Qvæ«▓╠,▀Σñ'åéY\í≤`3ѵ▄ï╢8}tσ≤â±|Φß┌}│╘╕#∙▒Yaü*1╝╫zM╠.J√╨│ε╙¥vä≡ä▒│╪CZ╨j _¿]Ωφ┼²╕├½┐-»ZT    é░╪a{z╟cï╞Wjƒ│■'▌²║{Ü I┬v|╜Ö╫▒╠u>Y╟ë═gR└    W! !
  79936.  
  79937. !IPerPropertyBrowsing methodsFor!
  79938.  
  79939. µA3><+┤â30ë╜₧#ï8╗öδ┼φ╟÷±■ƒ╧:₧╡╙lvZÄû;Sô^F&khGy°å@b#\ánZh½Ñ'║╩JΦºÑæτ╩
  79940. Ä4Wkn╬╡k;½═ÇNAü╙|╜SƒY╨≥[=íg₧╥UÖP3┐@)└ù╤╢┼«gìÖÜÉyAε£=-ïfJuì»:╨┘P⌡L.╪V╒│$r╣╞n├Kb┴=╜┘╧u╜╜∩√≥Fª²l√ì╪gh Z
  79941. h!!Ö±W,%9╚▐Å│7anΘ╡╦Tü╛╝╥òrß╢çá≡W▄─╠δ $ÑOΦ}Qσδ)─dHⁿ/║∞∙τ╢X╣┼╤⌠┤>⌐|Σ!!ïèÆ╢$Gg\L/▒>Ç┘8i¥tûH∙MQf▄ [î⌡&⌠7╔▒▄C#3DC!
  79942.  
  79943. ╞A3><+┤â30ë╜₧#ï8╗öδ┼φ╟÷±■Γç@W¡ßÇkQ[B└ΘT;╒oV#xZGnO╗┴7Wp)Dª<Gbºδ ╩f    ╗º╗ƒεⁿ ₧zYH' ╫╣y:í═ÇVN╒¢5ìl¢=ƒ÷TLx÷v₧╬IÖF4«|╟Ü╞╢▐Ñpìë₧ü2b─£=-╦H8^▒┌Ωƒ`╪R;╚\█ mFⁿ╙\╦Q~╠>¿∩ùV}╜⌐░ôèo┴¥[U╖▌≥kAo!!₧#╟[]&9á,┬₧£Ow~É┴?⌐Iä╣è╒ûª╫δá≡WΘ⌡└█6R¿x xS╕±z─zT■▐╒╙¥█_ö─┴ª@τ"≡5îY¼┘δ┌@)F_<²>ù╘,i¥Y⌡!
  79944.  
  79945. µA3*'=áè4 ┤¼êæ-Φ┌Φ▀ñù█▄¡Γîw╥╤⌐9ZF@▌Å;âWAjI^G[≤à_o(JºOGx½Ñ'Θû @Ñ▓úû°╦\æ4Jk ∙ô@rü╦╩\KüX╤{├)▀a╨≥BX *íx≥┤0¥Lg╗.ô╚₧╢äüaÜ å█¥y⌠▒╧
  79946. cδå1▀╠VΣ`;ûïVπ8uúç0ßcB≡¥∙░pF≤á²Θ⌐]┼₧    5╨ë░ lEt<r▄J≤$+Ω6Θ&Ñô}-2F[ô┌Bß3k Ö╚╖Θs≈┐ì╦╘S▀è┌ ├Za{j¢yΦ?fZµ┤o╔c^Φ5èôÜÇ╪[┴û┴∩QΣ;╫êZ╒─∙∞T`AZΣ#╔╖edƒ'êK═XCCpÅcAÖíu▓CH6í╦ t0Eu▀═²╠P\└½]$ñΦLì╒¥F═%;qTKéómMP√⌐·╓┴⌐¿▒╡─ç╟ZƒL·─~ !!αÄ╧ï+╛Md■╜ñ≤¿U!
  79947.  
  79948. ╞A3*'=áè4 ┤¼êæ-Φ┌Φ▀ñù█▄¡Γîw»ÿ┴HgZ_▄â-}éKj~xRXΣê^u    Z╖<CIúê/⌡╒K╗ÿóè¡Å =ûWQei▀»B'║ñ¬0
  79949. ÑÜt║F÷0╨(≥G@=ípù█╗G`£9╫ù┼ ┬Ñw╗ìÆ¥{µ╕Iºttå»<╪ƒK∩Do∩p≈Vⁿ/kⁿ─léU|┴/í┘çv¬ε∞÷σF║±cY░÷╖L,<"k"éε>eND└├Qñ«Mhfa█Å:èVÅ░▄╖°hΓú┴┘ò~╝Σ╟▌wⁿyε{Móúl╘xIΓF¥Äùïæ%±╗»Å+▄ ë^═à╪╟╠BjN
  79950. E}╓2ç╟?`ò1ÖG╤EqwöinèΦ}Ä`L5íÖµY zFp╤Z┌█╩T/ñ»1@▐û ñÜèSπlql!!φ▄0    ú&╫δ√╙=╕¿°╕╠ÿΣJê═ε,?M¢¥Ü÷jÄCB/╘îöäà/Rû╣#¿â∙Qï∞∩`╪-^OΩ╣xû)┼≈>₧│¿Uå█T╖<ÅѲü:╒τƒ,Æ╟
  79951. Píº s+╕≡ÿΦ┤5akµ⌠àë
  79952. ΩΣ╔e«┬╓7/╚╡φ"2·╫z^δ7Mⁿτ╗φ╤6╖!
  79953.  
  79954. µA3*'=áè4 ┤¼êä3⌠╤╡î·▐╠┼ù╓σWT£┤╧pzM ÆÇ)qÿPO#k>f┤áJq#]πh[oΓ≈█∞k!!åâΘ▐σ╩ ¢`h ╙▓{=Ñ└╬^üûVVün÷RÆ ∙R[N+íCÜ╩iÄGp⌐5▌ù╟└═¼fìE╓█₧yª■S
  79955. α`Φå/₧▐Q⌠V*▐╞{ÖD`≈╘o╟P.Üb±Ωóv]ÆÇ╠╛ε┐║6╨≤╖,<bA7Ü:±4tIY╟╔'ï¡LhfH╙Æ?ó~oⁿÖ╕╝δBδ╡è─ƒd⌡τ▐*└
  79956. <n╓òB^≡₧|╘7φìûû£æ%±┐√τLτ5¿+α Ωσ≥┌R%!
  79957.  
  79958. ╞A3*'=áè4 ┤¼êä3⌠╤╡î·▐╠┼ù╓σWT£┤╧pzM ÆÇ)qÿPO#kC]Σ« M<f_ò}AE╖┐MÉ╖0║╛íƒπ╩\S╫]Pak▀ⁿy:½ëτ\\Ñûp¿J╕xö7²]Z p¿$Æ█MöMp∞:ôå╦≤îâ\ÑMÉÖÖy ║▒@Vúp~å»1╟ƒK∩Do▐Z┘·;dδë¿/⌐VÖεªwAƒÜ╕┴▀╝≡c]╡∞≥-qvGb7êφ4GN\▄à|α╚0JBτ┴#äT╓⌠╪½∞H└÷∞º≤W▄╪└≥E"
  79959. ╗r∙ 4Sφ┐nÇiL╧    æèÜïô%±┐¼Åy√$ç+╫≈╬┘±. )_0H/▐"ç╛v√]▌#╡u++?ÉirÖε4∩J6H╠íε[=`
  79960. l╙    ╦▐═Q└≡X=╕φM▀æêH╠(xfa#δ╤
  79961. 7w╧²Æµ┴ á╝▒┐┼¥╩Sò\âàIZI╩!
  79962.  
  79963. µA3)!!*¡ü5:¢ºêä3⌠╤ⁿû╛╙╓╞«√í>)╓∙≡iz^W╞ü~╫~J9y^A+°┴Bxt4N║"eñδ|█═Q½╛╢è■└@╨gkt═╣h<εò╥\Iææp¥Wñt₧óY4⌠a▀┌PÅRx¡|▌ô╬≤▀αΓd₧òù<ª⌠öA8Rú┴ǃIµM:╔LÜα>n·╬y╓GjÇ(╕╚ï`╗íδ√áíτpP╕∙≥hCFK`=£J≈51_B╞╚₧╕z5WDÜ∞EΓ ÿΣ╘┐∙s║·à─ë.┤≈╩Å 3GR╡o∞pá▄¡2≡Fìòüç╤Oê≈╦Γa√;│n≥s─Θδ╚T)\[4 0Ç╖.j₧?ûK╠XRKyâ vîΘu gO5█╢²^?=Y8p╥9╤▌╥Môúw≈∞Lôô▀@█8BE╟÷-8ò_âΘ╤▄    ┐α▒▓┬ÿ█Vÿ═ε,E0▓¢ü╪j≈?& ∩¼╣└┬,PÖ₧¿ç√]╖╣² æSdy`φ║≤OÆΦ2ƒττ    ╩êS▒1Éê⌐┼
  79964. ▐ ¢7ôö
  79965.  
  79966. αº*I└¥┘┼åTVè`vÇû╤X=╥Ç≡Oï╝▄!!Q½╞6H▓st╣╤{Cπ>W╕╫│√╪ôX╔£åÇ│¥E∩E<r┐r╥╕╬B¬Ö╔æ░!!GòR\'ò¿ç3K ╗pè─N!!bßε⌠#╩τε<╬_F╨`}ÿ╫╫É╥d{|┬┤╛Gmâ`n^@╠!!Ω%╡╠²^W█├úñîσ─Å}ZüeB≥@~ƒTB!!Vàk²║ën5ⁿ[Kƒwâº;:ª╢≤τ╙So&\¡1ÿ╤²ûΓ/∞∙°,╫ñßiíRKO≥≡¬\ε▄«∞
  79967. ï ]σ}c<ΦÜshÑò    äΦK╖îû╩ÿûL╩ô«L╞Q¢ATÆ"C╥è    AErhä║ÿ╤Äy░XNs█ál▄╒▐p⌠╚''{]Ω~╔STp╪äñrN╟E4$╕√!
  79968.  
  79969. ∞E7*'7┤è =ú¥âä8ΣÄ»╚≈─╧ⁿÜ▓╚9*²Ü╬hdMDÆÉ6W╫cG+≤Æ Urf@Ñ<Zd┤ñ+≤╨E@╝┐▓▐╘α1^╕vTmt¥»-»┘≡KGàülÜLå|ù┤=⌡lÉ┌▐/┴jU╧╥┬°▀╖vÜMâ÷∙áΓ@A░ P&┬╚≈√ΘD8é2░α(m ¬½+C┴/ü╬îTqí║ß╩∩6⌐≤e∙Σ╗Lb8a[₧)∩9u╚▐Å│V*r█Å<£_╓±┬ù■kß╣òá≡!
  79970.  
  79971. ╠E7*'7┤è =ú¥âä8ΣÄ»╚≈─╧ⁿÜ▓╡pO¼▓─!!3Xu▐ù7V·5-h^IZ}Γä^&A╡sXoΓ┐( ₧o╕çÑæτ╩
  79972. Ä@Q0og▀⌠$rú╠╘QGæV£5║K│=│.╤@ 2Σgï₧NÄCd╝8ôÉ┌╢╪¿v╚Üÿûu½π)╚`δ╟√∞j╦uo≤`╔≈.`⌡╦8∩C~≡-╛╠åV`¬Ü≈╬ß¡╝6╨ë█1 k{i<ëJτ#aftàzºxπ╚bb)Wqܪó~H╓α≥┤∩hα≤┌á≡W≈ÄúdÑlk¿i²4L÷╡j┴aW╢Fûôû¥╩DÅûɪQ≡?¿oí≡╬▄òD+&8Z8²1╙■#sÉ8ûJⁿMN∞!
  79973.  
  79974. ≥P5;?╖╗=╗ÑÖ/ûeí╨µ▀ε▐█╕╘¢τrM¼¼┼i3IXÆ╪]ÿTQ:ZZQg
  79975. ¿┴Xv6F¡{hº┐7 █L@⌠Ñ▓ƒ≤╬ÆGJgn▌Γ-$»┼╒\æÇy»Z÷sæ ∙BdRêeæ┌êJq∞\
  79976. ≥áΩ╫Γö-╚₧ùåyε≡DW¡czûΩ7₧╚V≤Io╪W╒÷me≡╘h╬CwÇ1░╤åW4╡íΩ╛⌠¡┤pN╢≡╖|Br:╬gë~lxAD╠╚╘ß]d/SM╬é'╦S┌░╒▒∩qφ╛╧Å≈T╪ëá7δ 4 ▓}ε4HδÑaßaW╢F╓Æûé┘£╙╤╒Vµ>╜x└=┴╤∙╙CzFM4Γ'Ü≤d√!
  79977.  
  79978. ≈E+0+ÉÇ=¿áé-ûeí╨µ▀ε▐█╕╘¢τrM¼¼┼i3IXÆÇ7QâVK$oIJ+≈æPh!!íyG}º«.║ét!!Ü₧û░├æ\ûxK} ╖╓3á═ÇM@ÉüVt╜P╣~ÖΦTKId≤a₧┌X₧Nqƒ.┌£─¿îñz¢ôÜè<»ⁿRWΓfi┬√;█ƒO⌡N?╔M╬│:hφ╧8»(£6┐╚åCqí≡╕·Θ╕⌡t_▒á╗N%B\v;èDízZ%9╒W╠Ö╢\|_!!░Φ.àIôΓæΓí!!╚╡Ä╞Å.üΓ╦╩E9M╤òGgZε╖)╟hO▀îê¥ë╠iò╥≤τNß#α+σ:╓≈±█Sm@\    ½6╙δ@°]₧@╠DP#çt:═·u⌡ )I═Γ B%`
  79979. >▌╟∩ù)lΘ▌]$ñΦLì°⌡! !
  79980.  
  79981. IPersist comment:
  79982. '<IPersist> is a wrapper class for the custom interface ''OBJIDL.IPersist'' generated from type information in the ''ObjIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  79983.  
  79984. IPersist is at the root of the COM persistance interface hierarchy. The single behaviour provided is an accessor to get the CLSID of the implementing object. Subclasses add the ability to persist to/from ole streams (IPersistStream[Init]), structured storages (IPersistStorage), property bags (IPersistPropertyBag[2]), files (IPersistFile), or a fixed size memory block (IPersistMemory). All of these subinterfaces have some form or Save and Load methods for pickling and reconstituting the implementing COM object.'!
  79985. !IPersist class methodsFor!
  79986.  
  79987. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q"DI■É#₧╠╥JAå╘{╟*ƒMò∩X\xσaÖ╫WÖvqí0╥å╞¢ª╔1σg≥±·o
  79988. ó≈:.╦    ~äµ=█∙JΘB;┼P╘L│nFⁿ╙[╬C}╙òåε.┌╟∙∞τѱnHì∙ó?,S¬@ñzZ! !
  79989.  
  79990. !IPersist methodsFor!
  79991.  
  79992. ΓH41U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáAP τπW@arî╩|?²2.CrReßä zK%╩}]y╡«2║ä@ï¢ä╖╙ÅÇ:3js▀░krë╠╘zDöÇ?Q⌠╖sâ∙CdRêZ₧╨JïGf!
  79993.  
  79994. ╞A3999╖£αΘ£    ë>≥╟╞Φô╜╢ùùⁿ│\H║√╘svq╫É^ûLWJ+≤òVbf@Ñ<Gbºδ/°╘G╝≈áî÷▀ ô4\.t╥╣- ½╩┼P^É▌{╟.▄∙)╬t|<╒$áßJêFw¡ 0ô╡╞Γ∩¼r¢╢┐█e╟ÿ>¡uF┬╚≈√ºQ └^╔┌    (󬽬R█╡▀R}í║φ ∞F╗αd_╕∞╛PBmTPs>ÜJ╖WDftâIá{πƒJh0E ╙Å9èV Æ╙╨┤≡ Ä!
  79995.  
  79996. ΦW',╜ΓX@°êé9Æ:≤ö°─√├╫╨¼▓▒[F ⌐┼xvA@╫û~[ä.gIGrH╢╔ch½}@*╖Ñ3√╚GΦ║╕Ü■╔û`W`sô≥X╟²╚\║:╢Vqí@úpòΦP[7∩$î╩XêGg∞4╥åâß╔α`Çèùù< í DMªe;âπ?₧┌M⌡N=▀╬│/d╣╞v»(╔1╡╒ÇE`║í÷╛⌠⌐α H▒σ≥oCV&:Åú8pAW╠ìY¥ñ~)S\╚ä<ÿ₧⌡æ╣Θuδ╖Ç┘ô=⌡µ╤
  79997. ╩#╤òqQτúh╘dTΓFÿÄü╬≈z╛σ≡╩v┤"¿d≤s╫Γ∞╩H)YE(⌠$▀╖/|╤'ÅK▄G[jêg Ö≤4≈J O∞½²C(rt┐█╞╠Vôú]$≈╠m¿║¡cùbxyp╨π-)╤eâΦ▌▐∞╛■│╪╦┼Pê⌐ëUZ!!¡ùüï>ÑkuT╗╝Ñ┌à>}¢┌#í╚∙@╔ôÆ:ûB=>ô╓·AÜΣ$╠ú▓╚÷-╬Rv>ɼ½╟i°π┤7äôSF ¬OWî╒⌠°░!
  79998.  
  79999. ╚W',╜╧_C╙δ╝8î)α└Ωî│ù÷█¿²«V½│┼;Z[r█û*K▀'kO[d ╢Är.Jπ_|GΓñ"≡█AΦáуτ▀╫vG@zh▀ⁿ7¡╠╔OMçX╤{├)▀Câ≡W-πgô▀JÅpq┐3▌ü╩⌠┼¼z£! !
  80000.  
  80001. IPicture comment:
  80002. '<IPicture> is a wrapper class for the COM interface ''stdole.IPicture'' generated from type information in the ''OLE Automation'' library. It contains methods to invoke the member functions exposed by that interface.
  80003.  
  80004. The type library contains the following helpstring for this interface
  80005.     "Picture Object"
  80006.  
  80007. This class was originally auto-generated by the Active-X Component Wizard, but is has been modified to support compatibility between OLE Pictures and other Image types in Dolphin.'!
  80008. !IPicture class methodsFor!
  80009.  
  80010. ΓH41U╬µp¿áÜ+æ:íÖ»φ≡─╚╨¼▓▒[F ÿ∞HZl▌é~FƒZ)aX_jσ┴Vjr"¬G░«i║╔J    ½┐≈ìΓ▀ à`M@zh╙»-;á▌┼KNöûX7├)█∙?▀}| íbì╤T»VfÑ;ë╥äφ£éV█X═╦╟1Wê¿    ≤1)^╧╢√î╖φèB╤9¼ûeà!
  80011.  
  80012. ΓV"!!=öå1=»╗ëp┼7α┌δ└√ù╦╠«≈ S╢╕⌠bcM▌ô0A═M9AL]n¢δwV4F╡}GoΓµ`┘╠G╝▓≈ƒ╖┴    ╫dWzu╚╣-3¡╩╧KL£öVaíª|é±T[ *≥*▌│3±(░@=▌ü╘≤▐αwì£█Åe╟⌡RWí P&┬▀²δ{┬r îQ▀╜@ É├}╤A.╚>┐╪ÅA.≤ª∙≡Σ
  80013. ¡┤aOëßá `RP(_Σcτ#r@└∙Üñ-,JOεÿ?ÄoⁿÖ╨╢∩vß¿┴ù╟~ªµ┼Å 2" ╡rΦ
  80014. fÅ█∩A~═è¡Üî═Ië╧àΓG≥%╢îY¼Ä≈╙e{J]8┴>Éπ8wöæJ╓
  80015. DAw▄ dêΦ6Ä`L5┌½µSkzYr╨Z╫█▌)lΘèZá±▀£îh╔"=B-{½Ö4+╛n¥íÿ╙┐¡⌠ñàµí6óY«ùRS6!
  80016.  
  80017. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3Mjo╓╣#₧└├M]ç╘{╟*ƒMÖΦD] xσaÖ╫WÖvqí0╥å╞¢ª╔1σg≥±·o
  80018. ó≈:.╦    ~äµ=█∙JΘB;┼P╘L│nfⁿ╙GΩC`─3┤åε.┌╟∙∞τѱnHì∙ó?g<èµ]w*":á~╔î¿WhVB┘ò&äTX╓│╓╜Φ^∞èÇ┴└S▀èá`▌#êe∞
  80019. .Ñóm╫bIΦA≤δ·τ╢Ië╤╨δG·ú{Σ ƒº┐╫HmCz¬Z∙₧Daö2û@┌>TL`Æioâíuá H≈û÷G4`'s┐s▀└▐Q àφH«∩Lî╧▀═;7BD[à½IiT°hƲ╤▄ è» ╡▀é─Q╞πâ@Bù¢ï├p└qÆ┐ó╔╨2tÖÄ╛ÿ⌡GKΣ╛Φ-öOb3G└êxû)≡σ2è«│Q¼ÄIá,ì≤τé.╘Σ»ôÄM⌡εbM├¥┘┘Æ \A─.┘º╞YfïçφNïΘÄmσç^büG0┐╪}F∩Q÷╟«Φ╥Uçuα╟òÅÑ╪Dâ}TXåσßÜ_%°ÿû╜&ñ+ühT%═º¢[I╛pÜ÷`zÅö╜Z▓çëR▄J└tk╖═τ┐█b$/í│σHx;Å)y]]╫+¡v¡╢ÿ%:ê╒½╡M╣ΣɼkHûg ∩AmªGJt@█<÷í₧>5½PN╕8 î╣1rΓ╛┬═9∞-H#M!!₧uö₧┤Ñ┼(═∙½c╧ │d▄-gF╠Γ▒æ÷╞æ9╩Σ
  80020. ⌠)7σÿu°òB╢≥]▓çT╢■'τô[îîí╓yσ!!2 ╔p@╒╝)rESNπÖƒ╥ÄÑX@h═ε~·╔╦;è°\ uXτw▀Y9░δâv ½/M"¿τε±2[½┤/x>δ▄ïtêw╩ß├0▒.uä√ñeÆá╒Ñf¥óIS╘Θ╗&╜AΩ╙É1¿ôD╞Hñ│x╖îä{δ5▀╦╛≥¿¥∩j≡¥∩g¥!!÷╓b║ÄM╔■SΦIe  «L g▒7█c5╬pI7áy+#V²Ä6Ü d∙▌ë─7y╟▓∞╖;ñuw9véσ░M╤µ╔,∙>α╗e!!FÆ^8─▀,╘7╦u╡h±∞ºR}âÜ║┬╝1[P╕#ìÉΘSK▓#Iq╚l¢üΘ╫1╞gS·nÅ@#>5▓ß ⌐╖;█W½üδ2⌠∞çπ■₧;!!Γó╓n╜±z∙∩╦4σ÷!!∙¥wKáw-<·b╓ä┘~▓ÿΘVt┼╬9▄·╖∩╫8┌■wù∞\àâ─¼⌠$K>PìDπLMò┘╥└┼╔'»4îaÄäA δⁿ╔δ÷úφÄcO▐y▀Uçbuu_á╪ƒó╙K┬dôk·δKQv║¥»╥'    ±äa─G▀║∩ß»Φæ `%£▒+`╔?╬,▄╝L╣φ;zªl"√¢╚ô╣ï╪(~å`r│╗í╟1Äñf£¼¡?▀╡░-╛≈,dZ═ñ╚╞Rc₧╗ê╛(▐G┤aó>▀à└;#àa8T=^ⁿ+!
  80021.  
  80022. τV(1░é39αΘìî+∞╒ íö╛¥⌠░ß▓VQ ║Çuv_█è-FûQG/.TU+■ä^Kc%J¬jVxΓñ.║▀3╝│çù⌠█     Æ4Qde┘¿-%╝╚╨IA¢╙}½Ω_Ö±P_Wx⌐kì₧Q¥Lpáuƒ ⌐ƒ═«Zïæ╒╙H½▒UM╢m k┬°:╥╙╔nî]▀V≈(rφ╒w█GjÇ(╣┘ì`╗½╕εΘ╝ßrY∙ΘíJ`UAi+ï¡U]":á)▐åºk.LA≤î.î_X╓±≤▒Φlσ¬┴┘â.░╣ëK ,?+3ÖC▐&@r├ü+Ç<!
  80023.  
  80024. τV(1¿èhi¬¿ÿ"ΦUêû╬┬φ└┌╟■≤½J▒¿╘z}KSÆê1SôZ@jhI\fOΓë`/Cª<Db¡╕%║╬Cá≈╛ì╖▄ ö}X    kdÜ╛tr║┴┼çÆt¼O│Nä⌡_HWUïÅ▀Mö<ÑN9¥╥╫■╔αrÜ
  80025. èûûrε°D¼o;â»╫╙ZºN-╞Z┘┐mc∞╙8├~┴+╣É├S|║¡≡╛φú±s¡Φ╖J`JPr=£J∞peGY┌zºxçñMe3G █┴-éNBÖ÷æ╣╝lφ⌐Å┬ù;º»ë ┌w«y╝g≥úl├h_Θè┴òü═Å▐╠⌡ß1╜ní6╔⌠²╚C{JO£]■¥Dy╤5æ]╚Sδ
  80026.     î⌡&⌠7Æ »D46LYp╙ε▌╨Jà±G▌ûf│░╛R╩1RR╨Θd8ùmé≈╠┐d┼╙■║╬º─^ÿh⌐çQC6ÑóÄ├pφrg ≤■▒▌≡1xöò(ó╗ΣF¬■ûCΩ)`"î≡≡L£≤m╠⌐┤Xτ±.╩<2å║ó╙?╘⌠╩~╞╟'lê▌ h6ÿ±╦╬çT@Éz{¡▌¬#.┬╔·▄⌡ÖeDΓ╒: àD]╙╬d^╪>Póä╗∩╬L╪'φÿ·Φƒ▄UK▄vc1!
  80027.  
  80028. τV(;½ühi╗ºÑ)è1î╛åÄ▀┘╠┬╗ασR▒╛╫;zFE╞à0QÆK,.O[nOΣä\o0J▒<\dΓ¬`╔╩F0í┤úïσ╩\ò~[z ═«l"╛└╬^üûV)ç@╣s╬A┤^]I0αj¢╥\╒╞i=▌╗└∙┬ε3╝Ü█Üá▒@M«lJU¡█s▄┌πD<╪M╒÷)!!ε╧}╠z╚:±╠èG`ª╝²╛ΘΦ≡eO¡≥╜af _Σc▌5}I╧┬ú¼Xj9 █ÅêU ╓Σ╚¿∙;ñ°▒Σ╣
  80029. î╙∞6µ&%PC∩2!
  80030.  
  80031. τV(5Ñê7s·¿éê>µ╤»╪τ╟┌Å■Γ¼Pwª½┼!!Γû7DûKAj#reßä gfAªkc¼╕4√╨AΦ╕▒▐π╟^àq]gv▀«-=áë┴{üúv║Vñx╨■[J
  80032. ,í    ⌡╖NÄCd╝    2╘╥╫■╔α/í₧£û"Oµ■E¬aÄΩzƃ^Θh"═X▀X│iⁿçq╧Ci┼ª╒ÅH4╜í∞╛ΓΦ≡eO¡≥╜a8a%åφW$yJ┘╬ƒ│\-5P ▐ä<ƒHÅ⌡╒÷╛ Ä╫δññ-░∩╧I╠2
  80033. îu aMτδ)┴crßÖä╙Å╠xÜ──δGα"·°#└╜╕╧E]VL}■ ¥Σw%ù5ô]┌!
  80034.  
  80035. τV(/¬è6 │╜ü+òeí╒═┼Ω┌▐┼╙ÿ╠b▒¿╫~aWÆè;E╫VJ9zZ]h
  80036. ╢Är.JπnViºó6 ╠ª≈╢▐─█.₧wJ|eÜ│o8½╩╘_çâ|áD÷iÿ╝m,∞eÅÇ╘Mf∞=▌û╧≤à∞Γd₧ò║á┐p¬eJyï√>▀╧≡H#└╪│)dΩ╙j═[k─ª╘åJ4ºª²╛≡½αuN╝á╗BaCFt=ùτYr%=ú~≤Å¡_-:QC╫«8à_┐²╨┐∙;ñ╗ú─Ä3┤≤ë╓2QRAîU▀;Mo╟ÄKΘYv═6▄┴┬└!
  80037.  
  80038. τV(/¬è6╣ªép┼>∩²∞├≡║╡╝ⁿ╙½@T║⌐Çz3FS┼─7\äKE$m^d    ╢ò\&4JáyZ|º╣`⌡╨ΦäúÜ╟╞
  80039. éf[@ab╨╣n&ε▐╥XXà¥5║K│=╠( ^AWx⌐kì₧Q¥Lpáuƒ ⌐ƒ═«Zïæ╒╙H½▒^G¡nJlïπ?₧▌ZºE*▀K╚Ω(e╣╨p╟L.╘7┤£ôMwº╗Ω√á╗┤dY¬⌠á`BI Xπ`è)#tCVë▀çÄNc9Ge╫Ç(ÄBù■°╗≤oñ«ÿ▌ƒd⌡í∙ ∞1;7<ò_╙!!6▒ !
  80040.  
  80041. τV(/¬è6╖¿ï/▀α┌╞┴ ╨┌ò¬δ╡V ½╔xGQF╫ΘT;╒oV#xZGnO╗┴?Wu1J▒<R*¼«7║╫L╝╢╣¥≥Å╫`V.r▀┐h;╕╠╥G¢VÆVF║GåtôΘCJI7πnÜ▌M▄/┼.╥é╙ ┬º3£Ü█╧U»÷RΓ(i┬τ2╨█SΓcî^╘?■,fⁿë8÷JkÇ6╝▌äA4ñº⌠≥á¡┤dY¬⌠á`Bf [ÖµpeGUë─₧┤Kh|J_Üà*ÿNÖΘ╘╝▓#ë╨∞º≤ªµ┼Å%╣L⌡ `J≡┤3ÇlU┼ ƒåû╬█MÅ╫╞εα  ┐1í#╠Σ╠╞
  80042. C)@G.½wçσ8`!
  80043.  
  80044. ≤A&*½é«╗ë+êeí╒ßσ═├═╨┐ ╚9*²Ü╬hdMDÆà~\ÆH#`HGj⌡ä^V`f[½yxº¿%≤╚GΦ╕╣▐÷┴\1╗Q0gc╬⌐7ε╞┬SMû╙{╜W╖sä²EJxτvÉ╙êJq∞=╟ô«£Ñ⌐}╚ù₧╙ &¥σEAúmT7┬ε=≈∞K⌡D.┴ÿ{Ö@ É█8├L}╫:ú£ƒ)┌»÷φ≈║┤:∙≤╖%HPV=ç≈"?":á8ß4½┤MA5A^█ô6╦^ɱ─┤Φ!!ë╨Φñò2░╧╞╦5>«yªOuQ╦é}╥hZßF≤δ·τ╙{Æ╠└╝ñZ╙τ╨Θ⌡╨C3H1Γ2╙ÜG °&ûG█BQfèf ä≥1úgO5í▓ A8@C>╫═┼▄VHφë5╢±ZêÉì*┤AR9! !
  80045.  
  80046. !IPicture methodsFor!
  80047.  
  80048. αP3<:▒¢7:╫├σhñ1≥├Ω▐╛├╫╨■«╢WT░⌐─%3^W▐æ;ÿY>f^,.Γò Pd3[ªo*▓╣/Ω█P▒≈╕ÿ╖█╫f[ki╠╣|∞ñ¬4"ⁿ
  80049. ╙{╜T│o╨æ;&6≥sÜ╠╞4Σ3Σ╜±╥î«vƒD╤÷∙½²QÑeDú√'╠╓]≥U*▀ܲ>vⁿ╒6»(■>┐╧öAf≤»δ╤Γ ¡≈t1╙!
  80050.  
  80051. ΓQ5>U╬µp┤║¢/ù⌡▄Ωîó─█┬▒αí⌐║╠nvY╘─*ZÆ    {IwHH╢æ Vv#]╖eeñδ4≥█¡┤▓ùß╩P╒4m    ╞ⁿl<╜▐┼Kë{∙táPíxéAª , ⌡aì╨XÉjuó0╓╥═≤█εΓdî₧ƒzO⌐⌠C{üu_í╡s▀╤L≡D=é2░═,oΩ╨}╨o╙│╓åG`!
  80052.  
  80053. Σ\3;,╔σ[k¢ºƒ=Ç-í└τ╔╛▀╓ÿ│≈▒AJ╝√┼cgMX╞─1T╫KL/.IVh
  80054.  ùK(d"╔9╛δ"∩╪Φ½┌⌠₧═    ╫.@]Dφô_ε╟┼N°|·póE÷zò├fF,Θ>▀▄LÜ ╞i$ô╚₧╢╬╡u╚ î▓¥h
  80055. ⌐⌠E
  80056. chçπ5₧╪Z≤~╔V▌τw!!√╥~î/⌐⌐£úvª¿╕ ≤/ªαe[╝≥!
  80057.  
  80058. µA3%,░¥;+»╜ë9▀±╨°φΩ├═╕╘¢τcQ╢¡┴ovÆú;F╫KL/.MRg≤┴_&2Gª<K╢┐2≤▄W¡ñ≡▐τ▌ÆfJ.o▄ⁿy:½ë╥\KÉàgα.▄·hòy}, ╘H½₧fúQ`¿=▀₧â╫╪┤aüèÅûoG├¢>-╦[nûús╠┌K±@#±╓²*+╣╫|╒cz╘-°ç┴)▐─æó÷║αu]╡áífGY<råµ%}[ÿ@ìÄ╢V8    ╖δF╡IÜ÷æ▒≥wσ╢ê╔╣?╣∩ñc!
  80059.  
  80060. µA3%-╢½s·╣ä.å⌠└»íö╛¥σ¼√│RW║√ì;TMBÆÉ6W╫IE&{^d    ╢ò\&al╢nwIσδ0Φ╤R║ú«▐°╔\
  80061. ƒqkc▀╡{7╝ç¡3% ·>GïpâQñA├n\<Γeô╥┐Wfê#t╛°¬ƒÑ¢|¥╙█üy╕≡[yΓH.X╚»#╓█\╚T;àÿ{Ö@ ÉàQ╧Rb┼2┤╥ùE`║í÷╛╬    ╝±:ÿ⌡ª`HPg&ïú5eG_═W└Ä¿_d9G ╬Äo₧I╓°╨╢°mß·Ç▀¥+╕µ╟Å.A╤æe⌠╕{╘xZαFìòùì▐DùîàεP±%╢íböº≡▐BeJLP¢^¡Σ(iùtû@╔MKgÑalü!
  80062.  
  80063. µA3%9¬ï>,αΘ£"ä1σ╪Ωíö╛¥σ¼√│RW║√ì;TMBÆÉ6W╫IE&{^d    ╢ò\&agórWfº∞`Ω╠M¡Ñúç╖└^â|[@|e┘╣d$½█Ä4"°|·]£fàH╝5╝np,σg₧╥U▄juó0╓┌«£Ñ╔│èÅ▀<½σAE«]JT«╩ ÷■q├m
  80064. å╩≥#e⌡┬1Ö¬R█╡▀R}í║φ ∞F╗αd_╕∞╛PBmTPs>ÜJ╖W8pAT┼çOτ╦0S/F@▄┴&àLÜ∙╒¢²mΦ╫δ!
  80065.  
  80066. µA3%=¡ê:=αΘ£"Ç6µ▄√íö╛¥σ¼√│RW║√ì;TMBÆÉ6W╫IE&{^d    ╢ò\&agªuTb╢∞`Ω╠M¡Ñúç╖└^â|[@|e┘╣d$½█Ä4"°|·]£fàH╝5╝np,σg₧╥U▄jqÑ4╟┌«£Ñ╔│èÅ▀<½σAE«]JT«╩ τ∞v▌dΣv≈3╟H┌ì8╥Jk╔8╣╚╩6▐─òöëZ╛²rH¼ß╛JqBV
  80067. j>╘Jδ5bZ\▌WòQÖÑNb.Gä∞EΓdôⁿ╫°⌡o≥╗ì─₧┤∩┼dÑ!
  80068.  
  80069. µA3%=Ñâhi¬í£+ëRï╜¡ⁿ∞▐╔╘¬≈σÿ╛╘;g@SÆÆ?^éZ%hGc
  80070. ╢╞ig*πlAe▓«2ε╟«≈úû≥ÅöqWkrö╤_─á⌐qz░%ª:Aε|ënä PCxΘT₧╥±(┼i▄ç╫║î▓v£₧ù«< é╘hlâN.WºÑs╬╫OµMfù6ÿ{Ö@ É¢n╦Pz╒>╜£ÉPp░»⌠≥║F╗≡wS½Σ≥_BmG[j7─TÄ}YO\U┼ìä╖Xa5Go█ì#µ0!
  80071.  
  80072. µA3%=íƒ;│«à$ä3╟█²┴ ├àò«⌠«VF»╓¬1xD█Æ?FÆ    jI^G+■ä^Og*Zª<\lΓ┐( ₧+¡▓º▒σ╞ÖuR&ar╫╜yuε┘╥VXÉç5íE÷iÿ╝CJ
  80073. =ΦrÜ╠±(╞iU√áµ┼∙îG╚2áêçx »²[ëek¡²:┘╓QµM    ├M╫τe ô«½ya╒+²£æA`Ñ»⌠├á$ç█L∙≡┤`VP XτHÄ}]& ▀▀ƒáU-/WH┘Ç#çB₧Γ╘½Θm≡·╨₧┌<║∞┼Cæh]b,╣p·O}Q⌠░e╔ixφ
  80074. Æ∞∙!
  80075.  
  80076. µA3%!!┤èhi¬╜ò:ÇRï╜¡ⁿ∞▐╔╘¬≈σÿ╛╘;g@SÆÆ?^éZ%hGc
  80077. ╢╞*@v#πlAe▓«2ε╟«≈úû≥ÅöqWkrö╤_─á⌐qz░%ª:Aε|ënä PCx╒}Å█±(┼i▄ç╫║î▓v£₧ù«<ª■EPΦ o¢ 6ùäè+Bª6å·?u∞╞téQz─<░╨Å4╗╝²φ⌡
  80078. ╝┤6¬≈╜/8a ¥∩pxAF╚─⌐áUaQ)!
  80079.  
  80080. µA3%1á¢:s·╣¢#ü+Θ╣àÑ╝τ═▄¿≤▒V≥√τ~gB┌ü~DûSQ/.TU+■ä^Q/K╖t*▓╣/Ω█P▒≈╕ÿ╖█╫f[ki╠╣|├ú¡3!!ⁿ>í3F¢oé=»>∩EK
  80081. 9φh▀ΘPÿV|ΣmV║√¬═├╡g─Mì₧çjó╠kÄE5C▒╞    √αw╬l
  80082. °m≤5╣mqε╬|╓J'¢}▄╢ε.∩╕±∞⌠⌐° O¡Σ▒ it7¥∩p&C═┬ÄδV*r╔ä#ì ÿµ╨┤⌡e╟╗ì┴≈T!
  80083.  
  80084. ΘE)9=╔σ[k¢ºƒ=Ç-í└τ╔╛≡√ⁿ■·ñ]G│╛ÇtuB┌ü~B₧\P?|^)b£∞t0zfN¡oDo░δ<ù┤+ªñá¢σÅFC╫QFkr╘╜a»╟─UM╒û;├)▀nò·H ,▐L₧╨]ÉG.∞2└à╞Σé═ß3₧òÇk
  80085. ╝£=!
  80086.  
  80087. ΘA.=,╔σ[k¢ºƒ=Ç-í└τ╔╛ï╠╤⌐²╖W ¡┴wfM▌é~FƒZmF^ZlΓ╞^It)_ªnGsΓñ&║╩JΦÑ▓¥≥╞
  80088. à:m░╒qr»╟╙NMçVÅ{╟B╕nçεTx⌐W╗Θv«f4ó+Ü▄«£Ñ│vä ▀£ûh0å⌠^C¬tP;âß ╔┌M⌐,EÑa█α:dδçy╤ml╩:▓╚ε.!
  80089.  
  80090. Θt&XR══'⌐╛ë8┼+Θ╤»─ ┘█┘╗▓¬U½│┼;cAU╞æ,W╨L:oWV≤╧^p`f[½yAoΓó3║╨M@╕╢╗¢π█^â|[.t╥╣-3á┌╫\Z╒ÜyεA│=₧≡]dRêJÉ╩\▄V|¡|▄à═≤▐│{ü▀öò<ª⌠TúloûΩs╚▐MεD<Ç╔÷mu±┬8φnKÇ;╛▀ûIq╜║∙ΩΘ    ª┤fS½á┤qNP&;Ç ∞=p[Y╞âSτ╦4U_ █Å<£_╓∞╝╥ò`Ω⌐û╚ê~∩╛ë,╫2░T²pSτ±g┼zül≈Æûé┘£╙╤┘J─<α+α=╓≡²═T+&8H3Γ ûσ@!
  80091.  
  80092. Θt&ox┤ç"(╢─µC╟ Σ└»╪÷╥ƒÆ╢┬ñ_ ½╥tcMD╞¥~]æP"kAn ≤ê\tf[¼<Gbºδ|Θ┌U║│Θ▐ß╬ Æ4Q.t╥╣-3╝╬╒TM¢▌T─.▄â≡W-⌡[ùεXÉ4╝,╥₧«£!
  80093.  
  80094. ΩA"
  80095. *¡ê;'╗Ѭ%ù2α└éªùò■█¡σáA½│┼;/JY▌ê`ü^H?k\mOΓë!!Jªl|x½¼)⌠▀N&ºÑ║ƒπê\à{N|t├ⁿb4ε▌╚\çÉ|╕Fñ3╥lû<%`$íeæ═NÖP4░mV║ô═σ█Ña╚W┬█áX8ü├s¼e5∩àZ═┌Sß(╔Kσ=÷(q╓╒q┼K`┴3ù╙æIuº⌠╕ ε┐±r╘è█4kUBtrÅ╩$tHU█W╠¿«Va9BB╖δ!
  80096.  
  80097. ΩA"
  80098. *¡ê;'╗Ѭ%ù2α└╡îε╤╘╨╗Γ╚9*²ê┼o3\^╫─yyÆZT|RTb≈ì8Vt+N╖;z░ñ0 ╠VΦ╕▒▐π╟^àq]gv▀«-&íë╘QM╒Jàg¼L╣q╬AΩPC=íkÖ₧MöG4¡;╞ƒ╞°╪ε1σg≥±·o
  80099. ó≈T╖t5PçΩ#±═VαH!!═Sⁿß `φ¥8╥De┼:í▒Θ!
  80100.  
  80101. ±M$ *í¼:(┤«ë.ΦUêû╞┬Φ╪╘╨■µ¡VÅ▓├ofZS±î?\ÉZ@b'^n■Äi ╖tV*üä║╤@
  80102. ¡┤ú╨╡óvs²`kl▄ⁿ];¡▌╒KM╢Ær½G█!
  80103.  
  80104. ╤M$ *í¼:(┤«ë.ΦUêû▀▐≈┴▐┴╗▓Φj▒¡╧pvB┌ü~b₧\P?|^pc°å].o«yGb¡»`⌡╪á▓≈╜╪Γ\ò~[z.╖╓X╟áΦkmª#┐"5æ|Ñiö²]CIΦgï╦KÖa|¡;╓ûï┐ùΓΓ`⌡≥╧j╝σBE« oå∞2╥╙ºI=╔L╧τm0¼Ö¿+P╙:╜┌├MzÑ»⌠≈Σ%⌐°l1╙!
  80105.  
  80106. ±Q3%=Ñâhi¬í£+ëRï╜¡ⁿ∞▐╔╘¬≈σî╛╘;g@SÆÆ?^éZ%hGc
  80107. ╢╞ig*πlAe▓«2ε╟«≈úû≥Å¥q].w╚╜}"½═Ç[Q╒¢5├)▀=é TF=≤$ï╤êJq∞\╦å╞Σ┬íá 惃yQε≡EC╖muûús╬╫OµMaí5╖|ÜDI╦ΓK≈nZÇÄ╧ù@w▓ó⌠╛Φ6⌐°(1╙ë█c9lHhKI½5╦6Ucuë┼ï¡6Q)%ÿ∞Eµ0k╩µ╪¬Φtσ╢┴▐Ä:╢Γ┼òE?⌐pΦO%ó╣h╬iWΘX≤δ·░╠Mù╨à∩LΓ<│o┬2╔δò╡!
  80108.  
  80109. ±Q3%=íƒ;│«à$ä3╟█²┴ ├àò«⌠«VF»╓¬1xD█Æ?FÆ    j]^G+■ä^Og*Zª<\lΓ┐( ₧+¡▓º▒σ╞ÖuR&ar╫╜yuε┘╥VXÉç5íE÷iÿ╝^M=Γp▀╔K¥Rd⌐|╤ïâΓ─Ñ3σg÷█üy ½°AA░ t┬√;█ƒ±@=╬P╒¡m`δ└m╧G`╘s±╠àOq╢╛╢ôèk┬¥    tï┼ü?.Qj4u&è    Γ<1dU╠ΓâªPc=Oj╒ô"èNJ√Ü╕╤òZφ┤╝ì¼ç╩Φ'√:$=/ⁿl·qZ≥°2é1ül≈▌àç═\Ä╫╔ªQα3╗gφià∩Ω┌    Se[Fi▒!!Æσ/j₧8┴#╡qQfèf ä⌡#Γ,Xδúπ[\P!
  80110.  
  80111. ≤A)0*■╧1(┤┐ì9┼'╗ö≈îτìƒ╠■±╜    ╝úÇxj╤¥~JñMGp.C`y ╢ÿ-Ke|║OAiΓ¿8╔╠AZΦ┤»¡σ╠\ÄGL4 ┘Ñ^ ¡ë╨KKó4£{¬P∞=Ç fm-∩`î₧4÷+6à*▄Ö╞╢╪¿v╚?Üòùyµ╕Iºttå»<╪ƒK∩Do∩p≈V▄/kⁿ─lî¬R█╡ÉAx╡├Æùë4¡·dY½║≥    kPT&3¥:Γ1|JD╠á{π╚A7|[!!░ΦFÆBÅ¥╗╤òbⁿα┴╬éS▀èá
  80112. ╓_w n╓òGMßδ)╪^I∩k⌠Φ·ù∞Zÿîà qµ]╨ê0▌╘Ω▄@jW5[>£]·₧.|ó&£ƒXqqà
  80113. ΣÆ%±    ~╟╖ßS"`
  80114.     l╒-ⁿ▌╠Jôú]9ç■[₧ÿÜS█>U:!
  80115.  
  80116. ╙A)0*■╧:-╣Θöp┼'í═╡îτù▄═Σ▓ªK╝óÜ;pQ╩╖,Q═\|Xr<ΣéD]á<Præ╣#á₧A¢Ñ┤▐⌠╓/ ö.wS╚┐-"╝╩≈{GÇù/εSñ~º#≤DA+î÷£iÄKb¡9ô▀â▀┬╢|â▀Å¢yO£⌠Y@ºrB2┬Γ6╩╫Pπ ╩╬÷mB╓Ω8═@d┼<Ñ£öVuú╛²·á▒┤tT╝áá`OCt|π`Ä}Ygb∞$°=╛ßfR/WH┘Ç#ç0ô■╒╜ε)ë╨Φñ≤╝φ⌠Iτ!!K┐0æe6ïè`╬Pα    Éå╙ûô%±┐¼Åy²·gε=┬ºßôw,&or4 
  80117. ╙√"kût£Vôu++
  80118. ∩[iâ╞u∩+[êí÷\P#pφ╨∩Ök*Ñ▄dÿ╠v╖╝▓bΩs    ±Γ'OP√■Æπ█æ·▐Üε┤≥o│kƒ¼l{öáª0ï3₧peTû╘┘º¼xÖºlêñ╒k)ù╨┴ ╝hY(│ß<▀Ü∙₧ñ±9α≥.╩╛Θêφ ε╔ú¼óu.╚Ö*Pâ╫ÿ╚î*CGåWA⌐▐¬q5┼²╛x╣┼¿#▓╬0?╩!!!!┤┌g▒V.æå╫ï░1┤i╡ⁿéò┤▄O═`ZÆP╝╕╚U∙Ä└░U∩hAù_J#╫╖åεq¥╓MkOÿâ≡8╩Ωá(┘B╟}.¬▌─⌐┌1mk±┤÷B<$ÄY5oN╓+·j╗Ñ╫δ≥σⁿ/┴ëε¼jS ─jEΩDváQm5_╙Fô!
  80119.  
  80120. ≥E1+éå>,αΘ£9æ2í╥▄═Φ╥≥╨│╤¬CZσ√╞Hr^S ü3qÿO]G2JσûK&2Gª<Yå£╚·@║▓ñï√█\æ4Wxo╤╡c5ε▌╚\ªàT╜e┐qòI╡B ,Θk¢₧VÜ`ñ|≡╜ε╢├óyìï╒╤e├¢>XΓahòΩ!!₧├2ì(.┬L═ßm;ñç0±fY∩ò£ìAc·αòöë¡°f1╙ë█9sCt@;é╣W b[]ñ}ñxîÆX{9nI╫ó ¢CX╓÷Γ╣Ωd╔┐îεò.¼Äú`ª4    !!
  80121. ªyªOuQ±ªl╥#6åoáÇ¥¥╚Mëû─⌡m÷5╣îY!
  80122.  
  80123. ╥E1+éå>,αΘ£9æ2í╥▄═Φ╥≥╨│╤¬CZσ√╞Hr^S ü3qÿO]j~XQX∞äDv%MÉuIo╧┴I╕εP    ╛╢ú¢╖é\7ÖbQ k ╬┤hr¥╚╓\iå0Üpµ
  80124. ÷pò⌠^KI7τ$ï╓\▄a[ü@3╤ÿ╞⌡╪αdÜ ÅïûxO¼ΦP¬eJiç∞6╫╔Z⌡Bª2░ÜS▄⌠Mεv. ó╚çGu┐ó╕═ß¡╒sz░∞╖Bo/<b];Ç7ú>e]U╚çQÜ▓M`p.&│ΦF░S ½░≤ù╙Mñ╝▓╠î;ÿµ─*└.Gi╒ò4{J÷î)╠bUδL▐æÉî∞Aü╙î╜/₧{r╫îY¼Ñ▄┌Jh]    .σ%û÷ %ü5ìO╥UGq╞as═╥φ+S▀¼Ñ%5
  80125. h┘┌Æ┌Vü≈U$░┐MÜàÜI┌)6SYQ═■d)âyö∩═└ ¿·Γó─Ö╩XÖ░àF]%ºù═~íC±to
  80126. ∩½▒┬à,eôÖ-½ä¬╢ⁿΦ<ÅT0f[╟· ≥Kùε éφ²VàöKπ+î╗úïw╝Ü∙àéFí╜r%ª²▄Φö])á!
  80127.  
  80128. ≥A+6,öå1=»╗ëp┼7σ╫╞┬ô╜╢ùùⁿ│\H║√╘sve╫ê;QâoM)zNAnG┐┴\r.@º<\lΓ┐( ₧a/à≈╕£²╩
  80129. ┘63j
  80130. │á-3á┌╫\Z╒
  80131. ■|»MÑjò╝ Ip└vì▀@▄Lq╗Z|ü█«£Ñ╔ß₧êÜ.║½Γpo╪»{φ√h╚s îQ▀║v ô«½+l┴,╕▀óP.≤ⁿ╕ε⌡≥┤(o¥╫¥8&%HP/iπ`è~YV_▄▐åºV*_▀ì)µ0k ├╘┤∙b≡èê╬Ä+ºµôI╟4"n╓ò|[ß₧|╘7ñÉÆäï═Ö╫╓∩A╒j·:¿^»Äæ╧Dd_)\)½w█÷#vå1ì▌RK`ºt:═⌐|¡gO5÷úßD&?XY}┘╥╫┌P\└╪/≈π    Ü╒₧T±.2UC ¥N!
  80132.  
  80133. ╥A+6,öå1=»╗ëp┼7σ╫╞┬╛╟╫╤╜▌░G ½╚pgC╞─.ZòRT{O    +■âII3[╬:(Æ╣)∞▀VΦ·≈╖∙┘Æ4Jk Θ╣a7¡▌≡PKüü=τ╗xä    ≤U>ípù█┐mY∞>┘ù└Γé═σg÷≥╗N*¥─{pΓ_5hûδ0▀╙Sºr*└Z┘├$bφ╥j╟
  80134. ¬V╪╡╕MzÄε±≡⌠Fá≡cu╖¼▀`k /ns&│JΩ$;@┴╬>ƒ╡V*%│║ ₧N?╓▀²¥├I┼öÑß┐t⌡≤┴ ┬Jτ>æe5ïφ╔O∙Æ┴ÇÜ█KÜ┌╔╝ⁿ5⌐~φ'à╢¬ƒ    B~@M}Γ3ä°?a█tîJ╚SF)╪
  80135. Σ┼&µ#┴¼∙V=3N:┌│╕!
  80136.  
  80137. ≥A321;■╧3
  80138. ╗ºÜ+ûî╛åÄ╫┘╔┌╡≈σGK║√≤~g`R╤╠wÜZP"a_d    ╢ò\&`Ä<\h¿«#εÉm┬┌▌≈╔▄æ4mzH▐┐7r»Ω┴W^ö╙f₧Bñ|¥ΦT]!
  80139.  
  80140. ╥A321;■╧:-╣─µC╟≤▌∙═Ω╥ƒÿ■█½EL┤╛Ço{Mßü*zô\ c.VV∙à^V`f[½yIìå`⌡▄H½ú∙≤¥óvw■\l%]U÷ê-æ┌╘]KöƒVF½W₧yôIæ;&`Q┌mæπ│nQô(²╢∩╙î¿wïD─┘■b─ÿ R½rnâπs═╦[Σ@#└Üß(r∞╦lé6Ç7░╥çHqφ├Æù▐¡°f░εñ lBv
  80141. j>π`!
  80142.  
  80143. ⌡]7XR══'⌐╛ë8┼+Θ╤»Éφ└╨╟║¼σEB│«┼;|N╞î;╨k]:k{∙æKr?¼z~¬«`Φ█Aíí▓î╣ìqt·7.a╘»z7╝ë▄4"ⁿ¥b½Q÷'═A┤bx&
  80144. ┼$æ█N╒ ╞i/╓₧┼╢╦Ñg╖9åïû&O» DSºrDΦå▀╤L≡D=î^╔9±'d·╙¿!
  80145.  
  80146. ÷M#=U╬µp┤║¢/ù⌡▄Ωîó─█┬▒αí⌐║╠nvY╘─*ZÆg_GcH╢æ Vv#]╖eeñδ4≥█¡┤▓ùß╩P╒4m    ╞ⁿl<╜▐┼Kë{∙táPíxéAª A ┼S░∞}▄Lq╗Ir╛°¬σ╔¼u╚
  80147. ÜżK¬σ_ΓahòΩ!!É▓5Ä.┬L═ßm`ΩΦz╚Gm╘R█! !
  80148.  
  80149. IPropertyNotifySink comment:
  80150. '<IPropertyNotifySink> is a wrapper class for the COM interface ''OCIDL.IPropertyNotifySink'' generated from type information in the ''OCIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  80151.  
  80152. IPropertyNotifySink is a connection point (event) interface implemented on a container to receiver notifications from a COM object when its properties are either changed, or about to be changed. The particular property in question is identified by <integer> DISPID.
  80153.  
  80154. As Dolphin is currently only an OCX container (as opposed to an OCX implementor) this interface is only every used for call-in, and therefore only the function table is needed.'!
  80155. !IPropertyNotifySink class methodsFor!
  80156.  
  80157. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q#GD÷≥D╝╞╨\Zü╜aºE»NÖ≈"cQêM»╠VîGf╕▄å╩≡╒ôzå▀ƒûzá⌠cA»pzûΩ^┤╢è+Bª6╔ + ô«╞Gh╔1┤·ûJwºº≈≡║Fδ█n▒ß╝a8a[τ ±%|J^▌#╘Å▓-{PH═Ä=ÅY√Ü╕╤°dΓ│Å╚╝+╗α▌└ mKQ,▓N∙aZ±ÑL─dO╢k⌠Φ·τ▐Z£├╚πLα&)¬n≥iàáδ█I{KA$W! !
  80158.  
  80159. IProvideClassInfo comment:
  80160. '<IProvideClassInfo> is a wrapper class for the COM interface ''OCIDL.IProvideClassInfo'' generated from type information in the ''OCIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  80161.  
  80162. The type library contains no documentation for this interface.
  80163.  
  80164. IProvideClassInfo contains a single method, #getClassInfo, to enquire the type information (ITypeInfo) for the coclass of the COM object.'!
  80165. !IProvideClassInfo class methodsFor!
  80166.  
  80167. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q#GD÷≥D╝╞╓PLÉ5ƒf╜j╕{ƒFæ;&`╤vÉ╚PÿGWá/└╗═≡├αwì ûòûH
  80168. úß[E╢egδ¡^┤▓5ÄR*└Y╖|ÜDeⁿ┴q╠GH╒1▓╚èKzΘε╗┘σï°aO¬╔╝ ?+?b[ÅΣ=tAD²▌Ö√*wU╩äà\▄║û╒û! !
  80169.  
  80170. !IProvideClassInfo methodsFor!
  80171.  
  80172. µA3999╖£'╝ªß@∞}└┌ⁿ█√┼ƒ┴╢≈σjïó╨~ZFP▌┌~@ÆLQ&z\mO ÅVm/Añ<Gbºδ╒≤/¬╜▓¥πê^░qJ#ba╔»D<¿╞êÿçz¬⌠·lû8SI(±P╢₧E±(╝·╥Ö½îëGæÜ▓¥zε RSÆouûΩ!!É▓5ÄR*└YÜ1÷9B⌡╞k╤k`╞0δ£ôT@Üαòöë8╕ΣTu╘è!
  80173.  
  80174. ╞A3999╖£'╝ª╓jò/╒²éªùò∩╟╖ΣñGF ÷ÇR}^Y┘ü~FƒZkOpgσÆ7W`)Ω<^o╢ú/■₧MΦú┐¢╖∞33╫{\
  80175. kc╬ⁿz »┘╨\L╒èVaªF÷oò∙XY *»    ⌡│3⌡+\₧%µ╛≈╢≤ƒ`£    £ÜƒpOë⌠Cg«ah½ß5╤ù2ì(FÑd╒τ!!╨≤a╥GG╬9╛û╔dúÜ╤╖╗k┬¥"1╙ì╪c^sOGs3éJ≡4rN\┼MìÿñJx0W Ä┴┐Cô┘▀╛≤+«Σ∞º≤ªµ┼Å 9╡x▀xSÅ█! !
  80176.  
  80177. IRecordInfo comment:
  80178. '<IRecordInfo> is a wrapper class for the COM interface ''OLEIDL.IRecordInfo'' generated from type information in the ''OLEIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  80179.  
  80180. The type library contains no documentation for this interface
  80181.  
  80182. Warning: This comment was automatically generated from the interface''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.'!
  80183. !IRecordInfo class methodsFor!
  80184.  
  80185. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q,KI■É#£╠├VZæ?¥zΘ.▄∙(╬TL*σMæ╪V▄Fq¬    2╓ª╞√▄¼r£≥±·>b─£=-▒e}∩àZ╖█ZßH!!╔y╧≡9h÷╔"é\┼<╛╬çmz║║óôèo┴¥aN╛⌡┐ qrLc!!╘Jñ?xKÄLá{π╚]h:JB▀º:àYƒ ▀Γ╝"╓┐é┬ê:û∩╠▌_Za{j╒}εaRτ┐}⌠tKΘ─┴╘ÿ╨Aƒ£é╜/₧{Y╛nτ:╦Γ▐╩E}F    Gg▒tí≥.jâ0╝A╧Ru¿ew╫û_ècL]┌Ñ·Z44^-g╞═êÖÅΩX`≈ΘFûæ╒àAR9)╟÷-8╖yÖ°╠█óα▒⌡∞Ä▀xëQñ▐(<M╔√Ä╠?ágh ╧ºá╦╓e1╨╜ļ║J╔ôÆ@çEv>é⌡≥CìΦ8é²²¡₧Sì9┘─═¿@╕±é9âèO⌡Çt!!╣«ÿîù
  80186. EVÇ}p¡▌¬#8╬╞≈DÖ└ëgA╢╒<▓nw¥█`{π!!Aó⌐╨ê┤2▄'ñα¥ä»╔+_L▄wT┘X±≈╥C\¡└í╬|▀,LÉUCé¬ü|⌠"┌µG[¢é╬9▐ß║V╖v$╝x|╛╠▐ú╩Egπ¿╛;╛W*xc\├ º/ε··]Wí┬¬ñKÑσ÷¬a\ìlEª9ÄPZZ┌'²Θëd!!8╣SXÆyì⌠.vτ∞╓ß╘^0~$N!!₧cöî¿«╫$╙╖Γ+╥íΣ(▐<4O$òè╘Xε¢║⌡U┼Γ)⌠4yo╗₧uoªƒEºδJ¬ÉSW┌åGÅÖJ└┬⌠z3¬v~⌠.4 û╒èi7.₧±ß¥εo¿Nir+╟≡sö├┴ɺBu[µ!!╩Sp√ê∩ ⌠9T2⌐Φ╬─)Fñ≈5Vgç╣τvÄ@╓∩╪6Ç<.xôó÷g╟╣¥ΦzóáHrci;»ß¿/╝»╦ï ╡╔ ÆIë₧▀åàqτ{°╨┤²╣N╥Θ1╛┌╙w├@ñ╛╫╜Y┌▄[≥M&ï@b&L│h▀J┘SP╛tvG2òδyç7}φ█▌X╖N⌠_τ°ª!!«iM εƒâ äⁿ╦%E¬Qö|╫╙S!!╬δ=T┴,╦~±r╜┐áT}«±╛└#»6H±y∞▄Å(B╢1º#τµδ    ┘+┼8¡jâc9ay±═ à┤lÖ`╤■U·5º±ÿ ⌡æ+∞íëtε╫r╦≤▄=┬ñM¥≤&·@@₧c▌ûΣiº╗∩7û├!!▌▓≤∞≥6┼ ─╞E₧òè╕ç3\)tëG╘    ╫|≥┼;ú`Σ-gΘεT;πτ₧Xª┼Æα╕oYê=╢B}ïue'Zì└═ƒ╓Q╚e═L╫┘O9¬ûú╥6²Üg├É≤▒O¡«╢}▓'`%▀⌠eªE²C│{█Hì 5a£/r╜íü■ î▐4}°>9█ïÑ─\Γ╦}샬?Φ ¼║yñ≡|SH╓₧╚éed¥╗ê╓;╦U¼    jeé╓ôë!!$δ[<_#_ÆHmPDæα{?ä═)#¼n±²₧£{NG╦eüE«╢£Φ┘ï¿}V²öï
  80187. ïΓkΓ░¼q^·└⌠M╢┘±Nⁿ╗ä.½Ç╞└4>*îlO▐    ªü]°Ñ╨∙å⌐<╞ΩJ»ê8!!<Çóíò╧'àlå▒╤δ ┘S┘╕µ{Θ■ÿ╚.M&╛ƒ7═ÿÜí¢yiÜß0F惷{ìK₧ δ▌¡9╗╖ƒ{K:d<TY#N≈)╟wô─4èL≈╔éÿºτ·Çë│àÜÇ┬ⁿ5σb·▄x∩o! !
  80188.  
  80189. !IRecordInfo methodsFor!
  80190.  
  80191. π]31╛è_C╙δ¡$û(Σ╞»╪÷╥ƒë╖ⁿ▒VD║⌐₧;`AL╫─7\╫]]>kHd    ╢ò\&5[▒iP~╖╣%║┌G½Ñ╛£≥╦\Ä4Jk ╚╣n7º▀┼K╫{∙{╟_÷|₧δT]I$î÷▀WÅUq╛@fÄ╥τ┴πÆW╚Üî▌e╟ΓRHñ -~û▄:─┌º@!!▀H▀╜@ É∙y╠Qy┼-±▌Ékv╣½√Ω!
  80192.  
  80193. µA3<<=¿ïhi╝áë&üα┘Ω Ω┼╓█╣▓úAL▓ßÇr\WÆì8sòLA$zn⌡äMo)Aï}]n««2ù┤+Bë╣ñë≥▌\
  80194. ƒqol╧╣-=¿ë╘QM╒Æp¬░tò°@x⌡lÜ₧PÆQ`¡?╓╥╠≡î═ßïëå╗πRªexɵ1██σXo╪W▀Vß(bⁿ╬n╟P"Ç;░╚é4╝╝╕≈µF╝ⁿeN╝á╗BkIf [¥αpwFU┼ìéñW-(KIÜô*ÿOé░▐╛╝d≥╗ì╪¢*╝φ╬I█2KN╡p² }\╘░e╒lYα└═╙π╡!!₧╬╞πRα?┤Cα=┴δ²═T%k#Tφw¢σmsÉ8▀R▓r(Tbè :╨╗┬8 }µû»Y4-t┐╠ÆâFôµP,┌ò ÷▓ÜS°%=\DKé⌠%<ⁿ■Æ╦╚(Ñ┐²▓σè╞Z╞ªì@Z Äôé°>┐kh╗┐ú√╦6rÿ₧)ö£Γ]úöæ@ΩPf6í┌≡D├í!!ì½≤9α≥y½*_\├∙╩½@╕∙û
  80195. äÆO\íÅbM├¥╨┘╒Dp≤
  80196.  Æⁿlε∞┌d│╥║Fwî°^büG]╙╫r|°.AóäüΣ┼X╪%╖ⁿƒÅë▄BP▄vNMƒP≤²²*|â≥Ñ═░Hè^f¼╖çdR╝gè╘NJÖê⌡mÿµ≥αr'╝g┐ ╥¬█+>T≡║Φj6å[?@#?»FÇ─╦!
  80197.  
  80198. ╞A3<<=¿ïhi¬┐¿+æ>í╟⌡Ω≈╥╙╤É≤¿V ¿┌]zMZ╓¬?_ÆT<oIub
  80199. ·àDv0N▒ZZo«»MÉ╖0║╛íƒπ╩\S╫]Pak▀ⁿy:½ëτ\\│ûqµ
  80200. ÷pò⌠^KI7τ$ï╓\▄a[ü@3╤ÿ╞⌡╪αdÜ ÅïûxO¼ΦP¬eJiç∞6╫╔Z⌡Bª2░ÜS▄⌠Mεv. ó╚çGu┐ó╕┘σIJeP╜¿▀`k /nh╬∞4;@▀3╠ïφ4U*%ßê!!╢.ª╟Γî╬!!≈áº─ƒ2▒═╚╩IZa{j╒G≤`bóçH≥Dz┬2╘┴âÿ▐Z╜▀└ΩF╜I]╨ïZ∞ΩΦ╙KlAH)°8¥╖jà1┼φUWqê aâ╗<φ [═░»T>>OYl╫╓╫╦êΓRjÑ■@î£æ@₧-6E    ┴⌡44₧b╫·╦Æ╕«⌠╗█ƒ┬Q¢5╩φQYd¼¥Çï?╜"gX²╖╡┬┴fƒô/»╚∙GQ¬÷∩iôRu$ë╟U⌡S┘αwÅ¿░Yàò¼;æ╗ó╧*╘╛╨ùïF≤ºOi1╣αÿ╚¥ROè.#┼≈╤O(▐╥≡'÷ŃfFº£5·n1¿╠{Z∙u)Æ¡°î╖6╖\ πÖô╡╚J╩p
  80201. XƒPΩóÇT²ö▐áUτy    ûRBl╫¿Æεtÿ╙Ka┴┘è]▒╨≤>╤▄wx╕╒┌ó4▀}rî!
  80202.  
  80203. µA3<<=¿ï(╖¼ƒG∩Vú⌡ß▀Θ╥═ò┐▓∙PL│╖┼xgAY▄┌~]æP"k]j≤Æ^V`f[½yxº¿%≤╚G∩ñ≈ÿ■╩ä:m░╒qr¡τ┴TMåVÇo½┤nä╝Aa5Σw▀┬4÷+wé1╓üâ¼æαW┐"¡┐╙r
  80204. ╣┐:.╦swä»█╦yεD#╚q█÷>;╣─V├Ok╙ú█íW`íÇ∙≤σ≥┤nU╡«▀`kvOO&h╙Jα91|JCë▐8ä╡\j9Q╖δF¢t¢⌡┬°ª<ñ₧╢Γ¿ö±█╓E9Yⁿo⌡qÅ█╙hWΩF╣äç¿╓Mù╥δτO±j·h╧2╚ΓδƒAK\[≡:ûΣw%ü₧C┌ [lôrAë 'µ6Ñ╚åU".XY$ïZⁿßφvFĵKd┌ò íà▒F╙)+C╬ⁿ!!)╦,·æ▒╗gùα⌠÷╫╦ª5⌡1╔ÿX%¡ù╧ª@─ Φ¬óÄ─+eûÖ$²╚⌡|╬ÉÆ@ìA}2M▌ÄU■Sì≤wì┤Ä@ÿÆIñvrjΩ└╬├:┼Γ╨<ùöC╟ª
  80205. aj╟₧▒óⁿPI╧!
  80206.  
  80207. ╞A3<<=¿ï(╖¼ƒp┼/Γ·ε┴√─ƒ╟╣╨╢GQæ║═~`└âAâMj+c^@eƒ├.Ko0N╖y'Γé.∞╤IΦú┐¢╖Φ
  80208. ▒}[ jN█▒h!!µÇÇTMü£5íE÷iÿ╝r`$xεfò█Zêc╛,├ù╟╢╬╣3£Ü█üy ½°AA░.g∩àZ╖≈m┬rαkÜ)╠>u²─y╬N.τ:Ñ·èAx╖Ç∙≤σαÖ
  80209. 5╨ëë )Zr╬φ9vAU═W┴äª-,@b█î*ÿoⁿÖ╕╤╟n±«╝ì╕ü╤âI▌Æ}±
  80210. g╣▄⌐/6åk⌠Φ╧ÿ╓ZÅ├─Ωτ4╣jφ?ƒº≡═U|C    lñwùα"wò~▀L╠ S=δ
  80211.     │Φ0∩ eU╞┤ε[8>ir┌w┤!
  80212.  
  80213. ╞A3<<=¿ï&Öª£3▀±┬╦═Ω╓ƒ╞ñ╘¼VO╗ò┴vv┴₧[ÆS@oVV+αÇ o#Cº&z┤¬2▄╫G ¼≈ºÄßδ
  80214. ûW|a├µ-"╛▀ΣX\ö5▓g»Z█∙C╠CF9⌡a▀ô╡Lbú 9ôå╦≤îçv£+û₧ƒx!!í╥XT╗(C;ÅΩ'╓╨[ºN)îK╥│N╘çw└Hk├+±╦æEdú½ⁿ╛ΓΦαhY∙≥╖    lPP(_Σgë~YY}u·"ß%╩₧f~(GO█ì#╦}é╓╪╜≡e╩╡ó┬è'²Äú`ªl >ⁿj≤póíΣlOφJ≤δ·τ╢sÆ╪°ªn─%ÄYí ▀┴±┌BGN Lq£]·₧D^₧!!ïsƒ.`pJºNT╟╗%⌡ 7z┴ºπS}W p┐!!╤╟═yFû∞U.²╡    Åàëc▀89sa╨±=Jfⁿ■╣╡╕c╞╙¡á┬Ö▀J¥TαùQR'í₧âIï"┐gu≈¬≡ƒùgÿô(φ╚ⁿD╖φΘiòAb> ë╟_╝VûΦ3╞φπ9α≥y░=├á⌐╫(▌∙öùïFkï!
  80215.  
  80216. ╞A3= 1á╒r9╜╝à.ΦUêû▀▐≈┴▐┴╗▓Φj▒¡╧pvB┌ü~uÆKc?g_"O√ä
  80217. Qi"¼z~¬«`┘±o@º╡╜¢⌠█\    àuNkdÜ╛tr║┴┼ZÉûc½Q°·lû8&!!
  80218. ─W¬≥m▄}K┐8╨ô╧·îçv£*èÆù4b─ÿ>-Öoo┐»δ÷{¡?╦J╙║v ô«:»(¬Vφ╩èV`ª»⌠╛≤¼≈aP╡║≥`U@rr┘J─"Uñ}ñ/ÖñUk|JB╠Ç#é^!!ùⁿ▌╒û!
  80219.  
  80220. ╞A3445í╒r9╕║ÿ8½>∞╤éªùò∩╟╖ΣñGF ÷ÇR}^Y┘ü~FƒZkO}j≤╔Wk#[½sW*¡¡`ε╓G@ïÿÜ▐°═ö`|a╩¼h6ε╦┘\¥╙p¡F┐kò▓<%dRê╖∞|»wXÿ@∞ü╫≥╧íäM╕₧çRú⌠)╚    c╣α&╩Γ┼r■ܱ>uδΘy╧G'¢R█╡┴)▐─æó÷║αu]╡áífGY<råµ%}[æW╧₧│3Q)%ΣÆ*ç\Bƒ■╟╣≡hαÖÇ┴ûS▀!
  80221.  
  80222. ╞A3)<"í╒r9╣½┐#ƒ:î╛åÄ╬┼╓├┐µá Æ╬m|CSÆÉ6W╫xA>]RInG┐┴\r.@º<\lΓ┐( ₧a/à≈╕£²╩
  80223. ╫cL~p▀╕-0╖ë╘QM╒ûpºU│o▐lû<%`Q╔V║φl░v4ô?/╟û└≈└¼3»ï¿Üf
  80224. µ£=-╦    1tù√₧╩Q⌠H(┬Z▐V "o■ì8╥Al≤6½┘╩┘╟║ôèk┬¥<J░≥ªiFb1Å∩Mpy]U┌┴╩°i+L^▐╦qµ0k¿π╘┤·!!φ┤ù╠û7▒└╚├h]!
  80225.  
  80226. ╞A3.,(íª</╡≤╠:ò °─Ωσ≡╤╨╕╘¢τcQ╢¡┴ovÆ¡0DÿTAjzSV+(≤ò*@v#f¡z\"δδ- ╩J¼≈╕ÿ╖█╫Wq-.o╪╢h1║ë╫KIàû5¼Z÷iÿ╝CJ
  80227. =ΦrÜ╠±(╞iU√áµ┼∙îG╚2áêçx »²[àeO¢ 6≈╤YΦ    Bª6│╚"tφ·8δvw╨:ÿ╥àK>∙εΦε╘╕±IR┐∩√Qo/f _Σc┐9c[E╚ì₧ÑZl0OÜë=ÄIÜΣæΘ¼!!═Äÿ▌ƒ╗σ╞Cà[Za{=»y≡    4V∞ºh╠d_╧Æì■Σ!
  80228.  
  80229. µQ.XR══'⌐╛ë8┼+Θ╤»É┘Γ÷±α▓¬U½│┼;`\D╟ç*GàZ>f^y
  80230. ⌡äOc4ºy@i░ó" ═ B┼▌┌⌠₧╙\ÖgI| ╞╤[»╟╙NMçV╔K5ëvƒY╨∙FdRêwÜ╥_▄eq╕')┌ûÖ╢═«`ƒì╒■fÉ≡YW╡e!
  80231.  
  80232. ╚W
  80233. !!;¼å<.Ä░£/▀±µΩ╧±┼█ⁿ░⌠¬>)╓∙ΘueG]╫─*ZÆm9CZGh Åm6Jδ5gº┐(⌡┌«≈úû≥Å?1║4Qde┘¿-%╝╚╨IMæVæ5║K│=é TF=≤*≥┤4÷+á2╘╥ⁿ╔▀┤wï ôù╙Uâ≡CG¬i|╢÷#█ù2ì(FÑd╙╬mH╦┬{═PjΘ1╖╙╔dü½√±≥ü·fS≡╗▀`k'+?f [╥Ω$dN\ë┘ëáUaf_▐û Ö^B╟ªææ╬dτ╡ô╔│0│∞âWóo^5░z╝zIπ╜`─NZα
  80234. ≤δ!
  80235.  
  80236. ∩E*XR══'⌐╛ë8┼+Θ╤»┬ ┌┌ò▒⌠σGK║√╙oa]U╞æ,W╫[A9mIZi
  80237. ≥┴@&2Gª<Aoí«)∞█PNΩ┌▌≤¥ª^ûzMkrÜⁿo!!║█ÇE% æa╝∞ ╨#╧e}I6Σs╤│3⌡Qqá|⌠ù╫╪═¡v╥M¥êçnA├¢>E¼s~É»iâƒ]⌠U=î^╔%τ?h≈└6»(┬,Ñ╬├Bf╢½╢ôèoû⌡nO«σá!
  80238.  
  80239. ╤Q3<<=¿ïhi¡ÅÇ+é,í─∙Φ ├▐Å■Γ│wB½║Çhin_╫ê:|ûRAp.HIM≤ìwg+JπlEk░ì) ╥FZΦºíƒσΘ¢p3j"Ω«d$»▌┼╒?¥zÑF÷iÿ╝aZΦaô┌╒y⌐4▄ûâ∙╩αgÇ▀╕╝QOí≤]AítJlÉε#╬┌[ºC6îK╥│?d·┬q╘G|ÄR█▒Θ-¢£▌═╒*£┤_c¬⌠╢    iJ;s&¿µ":á~ñ*â»d-)M_╙å!!Ä^BÜ ▀┐╝v┬╢Ç╩ër╪ëá`ª>>^C│iΦ24Iφ╕mè-K·"ƒòÆ┬▓"≥┐¼▌K·/pû[╓±╒╕╠``J
  80240. M≡:û╗@°]÷u╓|UºRI¼╒⌐J5J╔░╔^46NP%╗p│╕░m É∩Y'▓±]₧üûH╨l_Tÿ░)ä~Ö╗┘▄NÑ┤σ│╠Ä┘ƒWñüD%┤Üèï>ÑchXΘ┐╣▌╠1v╫¢"τìΦW┤φ≥&ìq$Må╟∙Më⌡>éá╨>πÅHπ4êΘ▓╤i╨░û7ôïNF÷╝g,Ω²╦ï¢E┌(.╙▓═^|┬╙╛K▄σôdO¡╥sδ-!!¿╠qFΘ>
  80241. ╕τ╗φ╤^╧&π°àÆ╡¥NY┌oNOûYªΩ┼S°òí╬|╡'M┘]I4╫íÉzα ⌠½/|S¥Ä⌡#═∩∞{╬ I╓xb╡âô╡╔~lkªΩ╖x à\>=\]╠+º%Ñ▒Ç$*┌å╣úPóß▐½%gε
  80242. u∩@v»G:E▐'≡╖╣ =╤5!
  80243.  
  80244. ╤Q3<<=¿ï&Öª£3▀÷≥π═∙─ƒ┼¿╓ñGBσ√╨mWIB╙─-H▒VA&juRf
  80245. ¼┴C@/J»x}k»«`Ω╚CÄ╛▓Æ≤ò\üuL&ge╓╕X╟ï≡KAâç5πƒså≈T0Σ$»╦M║Kqá▄▒╠µ╒Φ:╚ÜÅ¢s ε■Q╢h;í└₧╨]φD,╪═≥=qⁿ├8└[.╘7┤£æAw╢ºε√≥H┼₧6╨ëÜ8'Vsy?&▒≈3pC\ë'╪¼¿\a8mC∙Ä?ÆoⁿÖ╕╤╟hΩç┴╪ö-╝Σ╟ ╦E;ⁿk┌uX±²¬2à=ùÅ▀╬╨]Åδà≡M²z·{≈─≤∙ôw,&or4 
  80246. ╙█Ró¡╠gKfèdNî÷0»gO5í╦╘^?
  80247. /_Σ3 ⁿφFÉ⌡]8æ÷Lôæ╓│FQ-{»ÜM_+ÿ~âε┘▐N┐«⌡╡╩ç╟▄P▓üVC(┤╥▐Gï.║mt╗¿┐╟┴u1¢è;┤£ΓÑδ≥(ìT:i`φ║+∩Eòτwà⌐½UåÆCÇ9 ε├!
  80248.  
  80249. ╙A$'<çâ7(¿≤╠:ô∙▌ⁿ╪≈┘╪╕╘¢τzM⌐┤╦~3\^╫─ WöPV.MWVj╛╚^Tc2G¼xeñδ4≥█#çÜ≈æ⌡┼â4Iop╩╣ir¼╨ÇM@ÉVüv½JáxéOæ;"cQêL¡√j⌐n@∞?└å╟⌡═¼╚?Üÿ£n ì²RE░(gδåZσ╓Q┌9├V▐\│=w▄▀q╤Vg╬8°çε.±├Æôèo⌠ΓiN¡⌡│BvRQg>éPú"t\E┼ìD╩╖Vd8    ╖δF╡IÜ÷æ▒≥wσ╢ê╔╣?╣∩ñc!
  80250.  
  80251. ╙A$'<çÇ"0αΘ£<á'Φ╟√┼≡╨ƒ┼¿▄áD ½╓Uv_;╕φ|bàVR+z^&O▀ÅVm#╖tV*É«#⌡╠F#ºº«╓╛Åâ|Q.o▄ⁿy:½ëπve╒æp¡W÷jé∞AJxπ}▀╩QÖf⌐9┌ä╞Σé═σg÷≥╗N*¥─{pΓ_5hûδ0▀╙Sºs*╧P╚╨"qαÅ¿+⌐╕╥╛b╝ºⁿ┤á╛╤xU¬⌠╗)+?b[╡÷1Y_└çQÜ╖wh+
  80252. ╖δF╔7h√Ü╕ΣΩh÷«ö╠û~ª≈═
  80253. ╬    ;QR «y∩xKóτ)╓bRΦL▐ù£ç█┼╗»Å|τ<╝+Φ=╙µ⌠╓ehC
  80254. $W!
  80255.  
  80256. ╙A$'<ç¥7(«¼╠G∩Vú²ß┌±▄┌ò¬·áq║╕╧iwkD╫à*W▀'kO[d ╢Är.Jπ_|GΓñ"≡█AΦáуτ▀╫vG@zh▀ⁿ7¡╠╔OMçX■|─*▀kƒ°6≥p¢▌XÉN4₧?▄Ç╟╒▐Ñr£╫╥╚e╟│:.╧
  80257. c'öµ!!╩╩^δ<╪[┘ !!;╣╤w╦F$Çnµéε.ì╜²≥µFí·v]╡Θ╢)iJ8a!
  80258.  
  80259. ╙A$'<ç¥7(«¼»%ò&╗ö ┌═╪╩╟╜≈σCS⌐ƒ┼hg┬ö(vÆLPG2[ ùMcfπU]|¡á%║╩JΦà▓¥°▌=àq_kC╒¼tzτë═\\¥ùVz¿óuòA▀~bI7πnÜ▌M▄Uf¡,╓ûâ⌠╒αgÇ▀ëû
  80260. ºτRV∞`ΦåZ÷φz╘t°σ)α9e·╞t╬\┼<╛╬çgf╢»∞√├    ╕φ(1╙ë█c9lHhKp=ç⌐W g|_▄╬╞╠3U*w╒ö;╢Ö∙╒≥╢!!⌠¬ùΘƒ-í¬ÆdÑlufxn╓á}M÷ñh╠-H°¥Çƒéàô─└⌡W°pδ3í%╩εⁿòZPfFw»Z∙₧vö8Ö╓WCoÅdCî≈9Ä`!
  80261.  
  80262. ╙A$'<Çè!!=¿ªòp┼/≈µΩ╧±┼█╕╘¢τzM⌐┤╦~3\^╫─ WöPV.J^@∙ÿV&+J╖t\nΓñ&║╩JΦöÿ│╖└ÆwJ@yr█¼}7¬ë┬@üûVg½@│tåε"cUï÷÷k╣qAÇ4|∞¡╨Γ╚úrä▀⌐û╝⌡sA▒tt¢º^┤╢6Äz&┬bÜⁿ$e│çh╘pk├0ú╪╩┘╟║ôèk┬¥<J░≥ªiFb1Å∩Mpy]U┌┴╩≡-*LE▐╦qµ0k¿π╘┤·!!φ┤ù╠û7▒└╚├!
  80263.  
  80264. ╙A$'<ìü;=αΘ£<½:÷╣àÑ╝τ═▄¿≤▒V≥√ΘueG]╫─*ZÆv/mTAo&°ê
  80265. /fBªh[eªδ/ⁿ₧V¡≈ö▒┌Å¥q].w╚╜}"½═Ç[Q╒¢5╝F╡xÖ∙CdRî÷╖q«gGÖ,ô¡ⁿσ╪ñpëô█íy íπSm¼i3∩àZ╖╢dΦT;±╠·)+╣╫n∞Gyëd▄╢Ω┘├Æù╝íµtI╕∞≥aETjh╬±#dCDëCìà¿]'b.&│┐<ÄV╓∙▀«²mφ╛ó╠û2╪ë!
  80266.  
  80267. ≥A3<<=¿ïhi╝áë&üα┘Ω Ω┼╓█╣▓│RO¬╛Ü;}MAΣà2GÆM$zT    + ≈òo níoVd╢±` ╞A╕ú╛æ∙τôx[
  80268. │■] º▀┴MM╒[╙%p║óuòAΩPC=íkÖ₧MöG4ó1╓ûâ≡┼ÑîMÉ¥╙h½▒EAíemç²₧╦PºU'╔2░σ,s≡╞v╓x┴3ñ┘├Kr≤║≡√áZ╛⌡rU╕εª)hVTo0é╜W?sEU╩üQäñN[=OY▀═Bß3ä░╪╛╝u∞┐ô╚┌7ªú╟Å"C║u∙p÷╣l╬-^·ÆöÆÜ┌Å▐└ª·<╗oΦ0≤µ⌠╩DeJX}£]·≥5fö$ïG╨iCméleƒ╡u┬6K═░»Y4-|r├ÉÉ┤.kΩè@j┐φ    â°⌡.╓>x
  80269. Q╤⌡(P√■╦═╞(Ñ┐²▓æ╦Γq¬wïízfÅó¬!! ¥WRuæ╫┘▐╙pâ¢vτî±@╔ôÆ@ÉZV>ï╫;²M£╗wè«╕XÄ╡F«=,æá⌐╞i╨πÑ0ƒäEΣçv-ñ≤╡íⁿpAR╦(╔▓╧Nfï╬√]¬τÉ|GΓ▌ >Θ<=╗╨`çQ-╞╠¿íüìu¬≤ñô┤╪Eg┤g2ûNªÑÇs/┌╛≤ü*Él.╜ui▒ï╖F/y╟ ≡╚D"}Ä▌º ▌÷π>═ D┌wF╕╫╫¬╠1hnΩ«ß{]π'StLt─#■`≤ß¼$;─└∩¬P«≤┼│{zûlYªr╗hsY9╢B≡╡╝ "╣çvƒÿ?l≤√═!
  80270.  
  80271. ⌡]76óÇ_C╙δ¡$û(Σ╞»╪÷╥ƒëù╞╝CFû╡╞t-W┴ù1Q₧^P/jDb■┴
  80272. Qcf]ªVc┤«2┤£/j┼▌▐é╖╬ÇqL@r░╒l<╜▐┼K╧K╙?A╖S│T₧≤A /╤kû╨MÖP:┴jU└ù╧≡í╩ß*Üźe½╪YB¡:Jzîⁿ$█═è+F≥^╘Σ(s╣╞kφ@d┼<Ñ▒Θ! !
  80273.  
  80274. IRootStorage comment:
  80275. 'IRootStorage is a COMInterface class to wrap the standard COM interface of the same name.
  80276.  
  80277. IRootStorageáis for saving a users data in low-memory situations. Its single method is used to switch a storage object to a different underlying file and to save the storage object to that file, which it guarantees to do, even in low-memory conditions.'!
  80278. !IRootStorage class methodsFor!
  80279.  
  80280. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q"DI■É#£╞╧M{üür½█∙h╒c@,╥pÉ╠X¢G4¿:┌£╞┬╔¡cä ï₧■f∞£=)╚    ~ÄΘ^┤╢6πD)┼Q▀0µ#bφ╬w╠.â ª╒ùG|çí▐≈∞≥Ö
  80281. 5╨ë│pKPrùµj1\┘▐ÿµ4! !
  80282.  
  80283. !IRootStorage methodsFor!
  80284.  
  80285. ╥S.60ÉÇ ╢¼╓jò,√≥µ└√║╡╝ⁿ█½EL┤╛Ço{Mßô7FöWp%HR_nG┐┴\r.@º<\lΓ┐( ₧Mó▓┤è╖╪çd[.b├ⁿy:½ë╥\KÉàgα.▄²kò8g;╥Q│Ωú}g╕?╥₧╧╢ ╖z£ù»£Zó⌠)╚    c╣µ=πƒs╫v°mÜα7G≡╦}ï¬R█╡┴)▐─æó÷║αu]╡áífGY<råµ%}[¥W┴¥▓Mb.&│┐<ÄV╓∙▀«²mφ╛ó╠û2╪ë! !
  80286.  
  80287. ISequentialStream comment:
  80288. 'ISequentialStream is a COMInterface class to wrap the standard COM interface of the same name.
  80289.  
  80290. ISequentialStream is an abstraction of a simple byte-oriented stream for reading, writing blocks of bytes, with the notion of a current position, although ISequentialStream itself defines no functions to access that position. ISequentialStream is somewhat similar to, though more limited than, <ReadWriteStream> and therefore we implement some of the protocol of that class here on top of the raw ISequentialStream member functions.
  80291.  
  80292. ISequentialStream is rather abstract, and starts to get more interesting in the subclass, IStream.'!
  80293. !ISequentialStream class methodsFor!
  80294.  
  80295. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q"DI■É#¥╠╤LM¢Üy¥Wñxæ ╗<%`Q╚WÜ╧LÖL`Ñ0αå╤≤═¡3îÖÆ¥y;½ⁿGHútΦåq│╡2ì(<╔S▄{ÖD²┬~╦Lkµ*┐▀ùM{╜⌠╕╜╥⌐≡:_╗║ó    WCT<_Σcè~1cHE─├╛╕Ih/ ¥Æ-ÆN▄░╒»≤sα·à┌ò,▒⌐ÄRóo^b║u≥
  80296. RJ∞▓}╔bU╢F▌╢üç╦M┴╒╟╝R≈¿b⌡'└Θó▓p/&[:Σ:û∙9Qê$Ü]àXQaƒte╟╗1⌠7XꪰX#>^! !
  80297.  
  80298. !ISequentialStream methodsFor!
  80299.  
  80300. ΓH(    0U╬µp╖╣Ç/ê:∩└»╪÷╥ƒ≤╖■áS¡┤╘tpGZÆç2]äZ'kO[d ╢âe)B«uG~½Ñ'║▀LΦ┤┐ƒ∙╚╫uP
  80301. │¿e7áë╥\DÉÇ{⌐óuòA⌡_[ *τe£█▐/┴jU└ù╧≡î═ßdÖùåo⌡£=-╦f~ç!
  80302.  
  80303. ΓK)06░£9┐¬à/ûRï╜¡ⁿ∞▐╔╘¬≈σ₧╡╙lvZ╞î;öSE9}\mO┘â\e2╖shºδ5Θ█F@┐┐▓É╖╬ÇqL    `gÜ┐b>ó╠├MAÜÇVz¿│qò ∙_[UïÖ╠Væ`ñ|┴ù└≤┼╢vÜC▌÷∙e╟╧u]╢e+iÉε*!
  80304.  
  80305. ΣV5'¬ï/ë╜₧/ä2î╛åÄ╠╓╓╞╗▓ñ]║⌐╥taB▌─*ZÆA,h^POΓëM&'Aπ}G~ºª0ε₧U╗≈║ƒ≤╩\
  80306. ÿ4LodÜ│k4ε▌╚\% ûqεL░=ä    ∙L4φa£╩PôL4ú9┴╥╘■┼ú{╚ù₧╙n
  80307. ¡⌠^RºrJræ» ╩═ZµL&┬XöT₧G ô«F±V|┼>╝£åJp£¿╦Ω≥⌐∙SU╛ε│BvORg>╣≈j1\U┼!
  80308.  
  80309. ∩A?XR══=«¼ü:æ⌡█»▐√╓█ò¬·áM║ú╘;qQB╫─8@ÿR>f^y
  80310. ⌡äOc4ß9╚┬▓═G «≈╣¢∩█F^╞=gr╔¿!
  80311.  
  80312. ∩A?oxÑü'«¼ï/ùRï╜¡φΩ├┌╪«µσGL ⌐┼zwB┌ü~\ÆGPjoUze≤åK&$V╖y@*ñ╣/≈₧V¡≈Ñ¢⌠╩Æfm    Φ╜d!!½ë┴WÉÉe║J╣s╨·Nxαpï█TîV4Ñ|▐ô╟≤î┤|╚ÜÜù<¿≈P¬eJ~îδs╤┘≤I*îL╬÷,l╖à¿/⌐#±┘ÅAyáεΣôèo¡°eQ¬áΦWBvCY&<ï≈6&pF\╚┴╨ßXcMX▀å*ÖoⁿÖ╘┤∙l≈·Æ─Ç;⌡╛ë┴,9╣n╝ryπ╜z┼7╫¢ìò╬┌Zë┘╫├L≡=6ë≤6─Ω┼æw,qE8ⁿ$!
  80313.  
  80314. ∩A?ox╖å(,·╣Ö>ñ3φÄ»═▄╬╦╨æ≡»V@½√╙orZB█è9sâ9zZAb£Φ\xv6J¡xi¡╛.ε≈L¡░▓î╖╩ÜqP} ╒║-3î╨╘\gùûaεEñr¥A∩EN,╚jï█^ÖP╞i(▄╥╫■╔αaìÜÆàyα▒vJ▒wi┬ε╟╦Z╚C%╔\╬V╜o ô¬½Qk╠9±δæM`╢⌠╕ ┬╝±O^│σ▒B|I@G6èµ#:\D╚┘\█ßZof_╙¢*╦Jö╟├▒Φuß┤█ìö7╣¡ñcª;6) ╣S■q\÷!
  80315.  
  80316. ∩A?.Ñå>(╕Ñëp┼>∩²ß╪√╨┌╟╙ÿ╠b▒¿╫~aC┬─*]╫^J`OVl
  80317. Σ┴Uc+J¡h@*¡¡`ε╓G@║▓┤¢■┘ ╨gal╓╣n&º╞╬% ┤{½Q╖q£░[=íeæ═NÖP4╗    0▀╥┴≤îí3ïôùûº■Y¡fJoèΩs═▐RΓ,└^╔│,r╣╙p╟a╬:▄╢ΩEw░½δφσΦ÷y¡Φ╖J`EPp7£J½8~ZW┴W┘â▓d/H▀ò*ÖW ÿ⌡╒°■xñ«ë╚┌,░α╠┘%B^C╜r°O5ïª`╠a∩    ÉòÆç╤Ü╪∞ΦV±5¿+Σ?└Ω²╤U%    [T≡$╙·,kêt₧]ƒSG#èefÖ╗<φJ1T═Γ²R2?C{─]═Æ┌K
  80318. îµ_>╛≡G╤╫≥-│FQL╫÷d8Éh╫τ╡╕g«»≈÷æ╓ïLÖTª─FY*┤ùü╪╜ge■¡≡└└(+╫¢"ÄåΣQíδ╡DΘ)b2 âôOíèΣ;èτ»Qïƒπ:
  80319. ├¬¿╘'┼¬╨?ÿ«DΣ│
  80320. vj╟₧▒⌡ù W╪?8╔¡╞|┘┼ N!
  80321.  
  80322. ∩A?9░î:╡╗╓jä1╬╓σ╔²├▓┐╫░äP@║¿╙;g@SÆè;JâK(d^PO≈Åg(\┤yA*╡ú%ε╓GΦ╛ú▐■▄\åa_ .t╒ⁿy:½ë┴KOÇûaΓ╖s┐÷TLvî÷∞XòQq∞2ô╖═≥πª@£ÜÜ₧<
  80323. ╢≥RT╢iu┬º%╫▐ñO*╘KôV·+!!φ╧}╨G.┴-┤£ìK4╛íΩ√áñ±mY╖⌠íJ kAcr£α9gJBçUá{τ╦0S=Mc╪ï*êNB╦░┬╜≡gñ┤ä╒ÄS▀!
  80324.  
  80325. ∩A?-░╒r'┐╛⌐&Ç2Σ┌√íö╛¥⌠¬µá^S½√╘t3_D█É;âWAj}KVh≡ê]&$V╖yk▒δ4≥█¡»ú▐■█╫{P@zh▀ⁿ7¡╠╔OMçQÇVf║Q│|¥Oæ;&=0Φw▀╔PÉN4ó(ôÉ╞╢╪ÑaÜ¥ùè<
  80326. ¿≈^G½eo╠¡^┤▓5ÄR*└YÜ÷5u╔╥lπNbÜ∙╧åHr≤¡≈≡⌠ªαso⌐σ▒vBr:╘Jφ'TCU─├├∩4U}B▀û
  80327. ç_ô■┼╒û!
  80328.  
  80329. ∩A?-░«>%αΘì£+Σ√φ╞√╘╦╕╘¢τrW½╛═kgB▌─)@₧KAjzSV+µäP`/Jº<Qñ¡%Φ₧K╝╕≈è ╩\ Æw[    xe╚√~r╜▌╥\IÿX■|ÅMÑjò╝EG xαvÿ╦TÖL`ΓBQ╣ ⌐ƒ▀ÑÄM¿ëÜh
  80330. ⌠▒Vf╗tTÇσ6▌╦ΣCuî^°τ(N√═}┴V.╙6½┘├Tw▒ÖΩ≈⌠¡·:╖Θ╛Do/k
  80331. D+Ü╠:tLD!
  80332.  
  80333. ∩A?ôá╫├σhñ1≥├Ω▐╛╓ƒå∞┐ºZW ¿╔|}MRÆì0FÆXA8.X\eΓô Zr#KπzAe»δ4≥█ºñú▐Σ╓
  80334. Æy3jr▀¼7╜╠╬MIü£5¡L╕iæ≥TKI1∩$ï╓\▄Lq┤|ç╥┴∩╪Ñ`╚æ█çt
  80335. επRGºi~Éíq│╡2ì(äL▀⌡moⁿ▀lÿ:ëó╪öKf╖Å∞╤µ╗±t∙░!
  80336.  
  80337. ∩A?ôáè╝ÿp┼>∩²ß╪√╨┌╟╙ÿ╠b»½┼uwWÆ╫lòVPj}RTe
  80338. ≥┴Wr#Hªnc¼δr╜═º║ºÆ≥┬â4L~r▀»h<║╚╘PG¢V■|»P÷iÿ╝_J,í0▀▄@êGg∞2ôå╦≤î▓vïûìûnA∞£=)╚    ~ÄΘs╨┌G≤q:╪~╓⌐m)╩πOφpJÇ9ú╙Ämzº½ √≥\Φ⌡nu╖⌠╖wf [░ φ>>eJW╠!
  80339.  
  80340. ╙A&ox┤Ör*╕≤╠)ç±╫φ■√╓█Å■ΓªQq║║─!!√è(]£Z>f^Y
  80341. ≈àV&+J╖t\nΓñ&║╩JΦ╕╡ö≥╠^Çf_~e▐ⁿo+ε▌╚\çÉ|╕Fñ3²kò<%`Q╔V║φl░v4ô?/╟û└≈└¼3║₧ƒ█e╟ÿ>¡uF┬φ*╩┌ºQ9Ç2░ÜDZ≡╔EéW`╙6╢╥å@4┐í÷∙á¬╕6╨ë█1pRhKs<¥Σ5u\╞╩[╩▒ZoFM▐╚tµ0k╘¥╗╒û╕¼ê▀Ä+┤∩ë█4
  80342. µ<⌠qL≈╜}Ç9 çòû─ƒLî┘╫Γ≡?¿o½m¿ìæß    CeIF@3τ6ƒ■)FÉ8ô!
  80343.  
  80344. ≤A&oxªÜ4/┐╗╠)è*∩└╡î ┘÷█¬≈óVQ╥╤⌐9R\B╫ë.F╫KKj|^RoOΓëu6JáuUcº»`⌠╦O¡Ñ≈æ±ÅâqM@hr╒▒-&ª╠ÇKMûÜp╝Ñ=âεTNUïû╨Mô`ñ|└ç╙µ└⌐vîM¥Äòz
  80345. ╝┐e¼s~É»'╓┌µB;┘^╓V²8l√┬jéMhÇ=¿╚åW4í½∙·«k┬¥N¢«≥>
  80346. lUs ₧≡<hC└╪ï╡\~|WD▀┴    éV╚«├╜²e╛╣Ä╪ö*∩ú─ █8R
  80347. ▓<≤pZ≡±}╧1à¢┴Æî╙M█┬╩ªA√>┐h⌡sπε⌠┌)R{JD.▒#£╖Và&ÜO╥ 
  80348. tÄicà╗4±eH└º»d%(_j├█╓Öwű]-▓Æ#÷ÉÄR╫:9\E╓░+}╖e¢■╦¢L┴╨£▄óùïMÖYñ─Y;N╔Çè╧j≈?&<╠æéΩτ&eÆël⌐ìτ|╬ÉΦ,ÅF0å╫O╝Bîτ1ë╡²Wê┴ó66ù¼á─;æαô<ñéK╗⌠a%«║╡íⁿ'CA╦>k┴ñΩD(╬╟√X!
  80349.  
  80350. ≥O.
  80351. 7■╧3'ò½å/å+î╛åÄ═╥╦ò¬·áQ║╕┼reMD┴─.]äVP#aUy
  80352. ≡ä \h%Jπh\*á«`Ω▀QΦú┐¢╖┴â4Qmu╚«h<¡╠ÇVN╒¢─*╖où±TAtíeæ±[ûGw╕L|┌£âΓ─Ñ3ïôùûº■Y
  80353. ΓAhòΩ!!₧╚WΓU'╔Mܵ.i╣╞véMm├*ú╬åJw╢ε²µΘ╝±d√ì╪gh }&<ï≈W,1":á~├Æ╡7a_▀ì)╦TÄΣ≡«²hΦ╗â┴ƒd⌡▓çIóo^bñh╝gz∩í}┘-RΩ2îöû╘ƒsÑ╨─ΩQ±/~╫êZ╦Γα╦Z@`]]}¼wÆ∙g¢1£ZΓXVJjèeFî≈&µDH6í£√E$?'s!
  80354.  
  80355. ⌠ToxÑü+░¼Å>ΦUêû╬┬φ└┌╟■≤σPL│╖┼xgAY▄─1T╫ZH/c^]╢Æ
  80356. Xt2F¡{}½┐(║╩JΦ╣▓åπÅÆy[z █┐n7╜┌┼]% æ5║K│=é TF=≤(▀▀Wÿa╝@(▄▐â°├┤3ü£ùåo╕⌠Kñ,JoèΩs╨┌G≤*└Z╫²9!!φ╧y╓g╙▄╢ΩAeª»⌠╛⌠    Φ⌡ns╗Ω╖    +eu;Ü∞#1[X╠W▐ÿñX`|BJ╬ä=╦[ ╣≥█╜ uñ│çì£1áφ═Góo^"C╜r╙~ZßÑ)╔~Γ    è┴Üǃ\ô╙àσM°5╣Φ<╦½╕▐U~J    )∙2╙≥#qÿ&Ü═RV#ëf Ö≤0ú    *P─º∞C85DW╝s≈╘ÖPàúN/┤·@ëÉì╫?xQTQ╦Σ7C8ƒh█╗┘▄╗┐π÷╩àïZæH┤¥u+¼₧è▀#ól(Zû╘▌ñ¼#1Öƒ;ö£ΓQ⌐╣⌡,¢T_5é╨╝\⌠ï^éó¬g₧ëBó5_Z▐Θ┤─%╫░ô1ÿôO⌡º<t!!⌐²▌╪╒CM▐?╘Ñ╞K1æÇ»─¿±+Ö£/Hµ+,«₧hΣ>\∞äα╝¥H╪9Ñ╡₧ä╣╔>P]╨hYÆY╝╕æ    VΣ₧╘░U┐;lëO_fÿ╢╪(0Z½zìε@j ƒ╟╜jÿασ#╔_K▄k}¡Éô√W▀Qm∞╛τRA
  80357. τ$S]Z╠#ΦC¿¡ä2dê²íºUÿ⌠┬║nRJèfSΦuo╜:V╟?╓▒É{%ü1╓!!å½)S≥∞⌡ΘÿYeZ"Fπb!
  80358.  
  80359. ╓V.0bΣƒ$i╣½╓jå=í─∞╬╔┼╓┴¬≈½    »╕┬LaAB╞ü0?²6`M\`
  80360. ╢ò\&]¬hV"δδ- ╩J¼≈╕ÿ╖█╫{\
  80361. kc╬ⁿz »┘╨\L╒èVaªF÷oò∙XY *»    ⌡╖4÷+ä2αº∩┬îƒL¢¢ÿÆpε╞EM╢eBΦåZ╖ΣVΘ|o╬F╬╣mq∩ï¿+⌐╕╥╛a╜╜±∙ε¼┤lS╖τ≥    )+?b[╡÷1Z^┌╩ÅÑa3MKÉ┴?êX5ä∙┼¼∙o¡ß∞º≈T▄íñcóo^W
  80362. «hΘx±Ñm├lWα\▐ëüï╠]ù┬à│τ)«n½s┴≡≈═mX    [9╗i■¥D[é1ôHƒOTbèid«·9∩!
  80363.  
  80364. ÷V.0bΣì'/╝¼₧jå0⌠┌√û╛╓╤ⁿ░µáTF¡╓¬1iB╞ü3BâP%.LAb≤┴
  80365. Qcf\│yPcñó%■₧LÑ╡▓î╖└^òmJ} ╙▓y=ε▌╚\çÉ|╕Fñ:âA∩E] 9∞    ⌡╖_ÄMy∞4╓╥╨π▄░ü¢█æi    ¿⌠E
  80366. ΓAhòΩ!!₧╦WΓ.╧K╧ mo∞╩z╟P.╧9±▐ÜPqáε∩∞Θ╝±n√ì╪gh Zt;ܵpm":á▀₧╡\c|ÜÑñh&┤Θ┼╜∩!!Ω┐ûâ≈T▄≡╠╔E╣&╝aYΣ┤{ÇnY╢FƒÅ║Ç╦M£╙╫ªR≈¿b⌡'└ΘóƒT`[L3┐Z∙₧râ=ïZ┌Cp»ntêⁿ0±gO! !
  80367.  
  80368. IServiceProvider comment:
  80369. '<IServiceProvider> is a wrapper class for the COM interface ''OCIDL.IServiceProvider'' generated from type information in the ''OCIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  80370.  
  80371. The type library contains no documentation for this interface
  80372.  
  80373. WARNING: This comment was automatically generated from the interface''s type information and any changes made here may be overwritten the next time this wrapper class is so generated.'!
  80374. !IServiceProvider class methodsFor!
  80375.  
  80376. defineFunctions
  80377.     "Declare the virtual function table for the COM interface 'OCIDL.IServiceProvider'
  80378.         IServiceProvider defineTemplate
  80379.     "
  80380.  
  80381.     self
  80382.         defineFunction: #QueryService:riid:ppvObject:
  80383.             argumentTypes: 'GUID* GUID* IUnknown**'
  80384. ! !
  80385.  
  80386. !IServiceProvider methodsFor!
  80387.  
  80388. queryService: guidService riid: riid 
  80389.     "Query the 'service' identified by the <GUID>, guidService, answering an
  80390.     interface pointer of appropriate class for the <IID>, riid, on an object
  80391.     implementing that service."
  80392.  
  80393.     | answer |
  80394.     answer := (COMInterface classForIID: riid ifNone: [IUnknown]) newPointer.
  80395.     self
  80396.         QueryService: guidService
  80397.         riid: riid
  80398.         ppvObject: answer.
  80399.     ^answer
  80400. !
  80401.  
  80402. QueryService: guidService riid: riid ppvObject: ppvObject
  80403.     "Private - Invoke the QueryService() method of the COM object wrapped by the receiver.
  80404.  
  80405.         HRESULT __stdcall QueryService(
  80406.             [in] GUID* guidService,
  80407.             [in] GUID* riid,
  80408.             [out] IUnknown** ppvObject);
  80409.     "
  80410.  
  80411.     <virtual stdcall: hresult 4 GUID* GUID* IUnknown**>
  80412.     ^self invalidCall
  80413. ! !
  80414.  
  80415. IShellFolder comment:
  80416. ''!
  80417. !IShellFolder class methodsFor!
  80418.  
  80419. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫]mkl╓Üb>¬╠╥4"ⁿ║%}½O║[ƒ°T]I;εiÅ╫UÖdaó(┌¥═σí╩╩`⌡÷∙½²Q)╚    cçΘ:╨┌y≥O,╪V╒⌐m"╔╞j╤GJ╔,í╨é]Z▓ú²ñ≡½«lL«≤¿. vVY
  80420. ŵM rGu╚╚╨▒Id8O╩à8¬Nä∙╙¡Φd≈α∞º≤W▄Γ█┌27Ñl∙.Ñ╣h╬iWΘFêÄÜèòù╞╥⌡VµR4¡d≤7ź⌠╧
  80421. PfF    9µ8ü≤g"╩Y⌡'╢DDjêeFÿ⌡6≈*RÆΓ¼r?/G6|▄▌╞╩Æσz&╢°Z┼àÅB╨95yd=╦π0YP√■Æ┘└    ╣╖⌠╕▀┐╥OÖK·─^%«ûâï.║mt╗▓á▐╙0xô▌w╩ΓÖ=í ≥'åfe9ô┌≥┘óà⌐╣`à┤E⌐=┘╣Ñ┬s├∙Ö:╠ùZ╬í>I└¥▒óö VQ╟?%╘â┌Z9╪Ü╛É÷èfKª£%ß*~·∙Aa╬q⌠╘¬≈╥R┘r°ÿ·Φ╚┘@U╫a(NÉ_≥±╧IL¬╪ε¡▓F1ìTT'Éí╪x    I╝kÉ┼╤Ωì^▒çß)┌
  80422. @╨wzì└├úä19c÷¡δOxw£A3yΓ─Aπߢ'.▐╔ªª≡ì║╓[éjE∙coºVZ=\╤q╣≡╣q
  80423. !!╜MYò\ ╥╛7dΩ»¬°▄V8I#M!!₧Éè║¡µ3╫6⌠▓i╥ │`╚/|0J╝∩¡O≤ò½╕\█α╢|NEòß~cñ▄ æΘW╜ûN╒╬═┤LÅä╗o╩m▐*7É$Y╚çPwGaB¼α»╓ì═#Fo▌φo└─∩'ëº]Ah3^Γu▐W"·┤├;nε%T1<┤φ¬╛V>╠çk> τ▐ïQëI└÷┘,εe}Zà∞Ñe┌╣┬╝síÿa3v>▒▓╗&«eß≥æδε+╝{ì⌡b▒ùìrαa ╟╒┐φ≈Üπ|±ïτ"█v╜¡┌π    ╚∩U⌠H    r^└d,jI!!H╕7ΘI╚aP╝*li∙û%╝k≥╠╨xüXJ¡ñτ°7▒rOztÄ εWå
  80424. ε└    EæpÖ6┬3lüCl¼ôP}╛"╨}«?┤íúsp¼┤σÆmª9R]║'┴▓±NT╖w ▓²ß∞]≈ΓF«^üW4.5∙≤?░┤uä}Üàzç0°Σï,≤╓ê!!+∙Ñâ ñü0=Φε²8╒ε,÷â\N÷hS╔s⌡Ä╤wñΣ≡HY╨╩3ê═¥┼ìP═ΘQæ╟PçƬ│╫ Na=╧E╨URàçé╟∙╥9Ωb±}εΘiüâ¡qßτæ²Éczæ7¢Wyüheu£└±░┌YΓp═1┤┤*24
  80425. Ñ╡º╤'u±¼n╤I├εÑH½ª╙(ñn]ⁿ┌Wu▐+üC╗fßT╗∩lEHfô{6≥ì╥▀εÇ╙zv▄4=╠æ╠╣:Öª/ëÜ«>╒√╥I! !
  80426.  
  80427. !IShellFolder methodsFor!
  80428.  
  80429. ├M)7ïì8,╣╜╓jç6∩╨█├╤╒╒╨╜µσCA╝ßÇkqK└ì7V═V#g_{α« M<f_│j|╢╞Jô£añ╗╕ïπÅà4Jk ≤Åe7ó┼µVDæüL/îJ╕yñ╙SE ;⌡,╓₧PÆVq╛=╨ùâ≡┘«p£Éò▌e╟▀f∞ >sïⁿs╙┌K∩N+îW█│/dⁿ╔8├Wz╧2░╚èGu┐óß╛τª±r]¡σ╢JwIXK Xτδpg[Q╦╚QÄñ_d2FHÜê!!╦s1₧⌡▌┤┌nΦ╛ä▀─`▒µ╧┴¿u≤góòFÇCt╪F│«╖º∙q┌ö¿î/₧{l¼b≤'╨µ⌠ƒ    RmLE1½w╗┼Vñ½ëXMRuëid═≈%⌡,XêÉ╩qc=>┌
  80430. ╬─╓M▐Ä6Cë∞Lôô▀N╨:9\Iß±(!
  80431.  
  80432. ├M)7ù¢=;╗«ëp┼=Φ┌δ°±Σ╦┌¼≤óV»╣├!!3XT╤─,[₧[j|RZoOµæ&6_╡9αê!!÷╥M╝≈▒æσÅÆ4w3fe╓░K=ó═┼K╧4ÜqÜLàiƒ²VJAqímæ╩\ÄDu»|╒ç═⌡╪⌐|åC≥±·RAî┐p¬i;ÅΩ'╓╨[ºI.▀╪÷#!!°╥l═Oo╘6▓▌ÅHm≤⌐²≡σ⌐αeX∙µá%+?br:ïJ⌡1sCUë╚â»\i|JBÜ¿â_Ü╓▐┤°d÷Σ▀╔ƒ8╝φ╠/┌ 4 ▓o▓OPpóƒF⌠-v├"╖º¬╧¥%±╗»ÅΓ"«~α?à⌠∞█GeC\    ├á┬Q╤c▀B╧NKg╞lp¢⌠<τJyεà┌~zF    n└╫╓ç)lΘ▌O/╗∙    û¢ëF╥%<sA╬!
  80433.  
  80434. ┬K*
  80435. 4*íª:αΘÅ%ê/α╞Ωσ┌─ƒ┼╖÷⌐ ½╔┬ì:^┼:g__9b£Φ\zg*C¼iG*ññ2║╩JΦ₧äû≥├8ÿxZ|:ǃb?╛╚╥\a▒█_5ºMóxé²RJI>⌠j£╩PôL:┴jU²▄ß╕îö{ü▀ûûhí⌡LúsJyçΩ=₧▐J≤N"═K╙≥!!mαç╟Lk╥>Ñ┘çríí⌡╛ìl┴αhY∙÷ª iCc4çµpxAα$┼å¡b0GI╚▀qÅ_ƒ■╘₧Θoτ«ê┬ö-√úφ&Å+?R.ôX╒)Má▄¡2░ùôç¢▐D█┼╤ΓA⌡<α+╔α╘═≤.1"~├╙√=s₧=¢╙WMjé>τÆ ≡)Zê½ßA06C]╫╥!
  80436.  
  80437. ┬V"!!=Æå7>ò½å/å+╗ö∞▐√╓╦╨ê√áDl╜▒┼xgD█ì:╫MM#jC{┘ö
  80438. &6_╡SF~╧┴I╕²C ñ╕óè╖╔ ╫`V.IΘ┤h>ó∩╧ULÉ╔LV╝F╖iò7⌡TX&:δa£╩╒}ó9┴ö┬⌡╔αu¥£ÅÜsα£=-î.(5┬█;╫╠ΩD;─P▐V√,r╣┼}╟L.┴*Ñ╙ÄE`║¡∙≥∞Φ≤eR╝≥│aSi?╬gë~$yJ▀╠åñi9EE╘ä+╦S ╓┘Γ░∙mΦ£Ä┴₧;º╜ù╩>%⌐r }P∞ó'ÇIt¼(▒╡╙ú≡l▓≡ⁿºÖx]╨╜%╠⌡∞╩J)\M>≡;ƒ¡mMú¼{≤,#Äanë≈0ú8z∩ù╞sq6Z    h┘┌î┤.o╛≡Y&▒┐@æâ₧K╫(QL!
  80439.  
  80440. ─J2:«è1=⌐≤╠/ï*∞√φ╞√╘╦╞■⌡╖Ue│║╟h)Q└é^ûXWj~KVe√¿:uo5[∙<CzºÑ5≈≈f,íñú≤¥ª^=ûxR{tÜ║b ε▌╚\╝%¢yóe╣qöε ,6⌠i░▄SÖA`┐Huô¢═Γ╔▓uëÜ█òi¡σ^K¼.gδ┴}ⁿæ╙I&▀╫τ%n²çp├Q.┬:┤╥├Eaºí⌡ ⌠½⌡lPáá╡ `TTc6╬ ±=1":á┼╩╖Ml>OIÜà*ìS ô⌠æ▒≥!!═ëë╚û2ô∞┼╩iU║u≥
  80441. RJ∞▓}╔bU H▐Ñ╝╬±g»ûΦ╔f▌4    √)îY¿ìæâ O{[H1▒$ç≤.d¥8┼≈*dqV¬T ╪╗=Γ!!P═Γ╦`nYr╞
  80442. ╚▌╨@Xφë5ñ·EÖ╒ûI╚-4YD2├ⁿ(!
  80443.  
  80444. ╞A3;!!,╢å0<«¼ƒâeí╙Ω╪▀├╦╟╖≡░GF¼ö╞;rX_╓êdûOM.bAl    ▀Å1Lr|▒{UC¼ä5ε│(iΩö╢Æ√└    
  80445. ╫rQ.t╥╣-¥┴┼UD│ƒp╝∞Zò▌E[πqï█J│D<σ@5▌å╞Σ╩ípìMÖÄ¥º■Y
  80446. cU╠═}₧δWεRo┴Z╬ⁿ)!!±╞ké@k┼1±▌ûP{╛»∞≈πñ°y╛σ╝dRP&4£εW]&D┴ì₧á[a9H▀ç&à_╓∙▀°╒R∞┐ì┴╝1╣τ╠æ[3
  80447. ▓y┌z\÷╕f╬~¼"▒┴╜íδ╢∙ß╧d═Sr╫îY¼╗ε╓R|N
  80448.     .σ3É÷!!i╦t╖|·+tnW╞10═▀╠8─▓ A>3NYZß5∞÷ôkΩèb9▓≤O▀£æQ▀ 1Tc╬ⁿ!
  80449.  
  80450. ╞A3><+┤â30ö¿ü/¬9╗öΦ╔Ω≤╓╞«■ñJm╛╢┼TuC⌠ê?Uä?HWRl╢ìwg+J∙<_zî¬- │(iΩö╢Æ√└    
  80451. ╫rQ.t╥╣-¥┴┼UD│ƒp╝∞Zò╪X\4α}▒▀TÖmrΣI|┌£╫≤▐ªrï▀¥år ║°XJ∞`¼íɃk∩H<îR▀√"e╣╧y╤l┼:┐£éQ`╝ú∙ΩΘ⌐°lE∙τ╖wGAbrê∞p%9▌╚Q£╡Xo0F ▐ä)éTÆ░╪╢╝H╫▓ä┴û║∩═ ▌[i╡r∙)aQßÑ`╧cHóF║«╙á≡|█√Ω┬k╥+q°ï^»Äñ╔T}ZE}Γ#ù⌠,i¥n▀fφ=rwO▓ 1▀╗9≤*U╠Γ╦`nYr╞ ╤█▌kΩèb9▓≤O▀£æQ▀ 1Tc╬ⁿ!
  80452.  
  80453. ╞A3/ªà7*«åèp┼8Σ└┌σ╤╒╒╨╜µèU╝▓─w)U█Ç2ûOM.bj àt/Fº&x½ó$║╬P«₧╣▒Γ█F^çfYGn⌡⌐yr╛┘╓v]üL╙e╕lúi²kòl4φkè╩ÜMf∞4╓╥Ω┼─Ñä+Éùùy⌠½pA╢U#TÇσ6▌╦pß    fîV╘÷?g°─}éD{╬<Ñ╒îJ:▐─æ╨«$µ┤TT░≤≥qNZ&:Åú5tA╚┘çáMd?B@╓ÿoî_ ôΓ╨¼∙eñ╝ô┬ù~╪ëá╟w╛p∙OpZΣ╕g┼iσ▐¿áå┌Dù≡╩ΩF±nΣoΣ5╠Θ²∙Hj[F3Γy╙╙%┐½≥7ekE┐!!"αæXëcyJ┴░√B06
  80454.  
  80455. j╥▀▐╒F¿╤yé╙}▀─╬╓-6TLé╘,╡,¢δ╚─Ñ╛▒äε¡∞j╡|αáryä╪╧█:╗moÑ╙┌º√,t¢£l«åµU¡²╪(ÅL!
  80456.  
  80457. ╤E5    0¡£"%╗░ó+ê:╗ö ═∞─┌±╖ß╡_Bªò┴vvF╨çdç]GjbKDx╥êIj'Vì}^o°δ,Ω╔Qî╛ñÄ√╬0ûy[@~c╥Öl&½╟ÜXû╢a½M÷mÇ°]I(±m¢╥îFcì(┴¢┴π╪Ñ`╥MŃä]║π^F╖th∩àZ£ⁿ^δM ┘KÜⁿ?!!φ╧}ék]╚:╜╨ÑKx╖½Ωñ║6⌐µsY¥Θíd_{
  80458. k7╞Cú>eJB╧╬╩ºLc?WE╒Åaµ0k╕╛≤÷╝U∞│Æìù;íδ╞Å6R╣y≥OuJ÷╛d┴yR∩Æìè╬╪Mò╙╫τV±p╝yε>àèÆ╢Nl]<≤;û╖)`ù=æK█XHL#»Shê≈9┼)X═░▒    5?Lp╙<╦▄┌PÅφOd≈█f▀╗░s₧ti7√▒fnWⁿ■º╬█╕»≡║ïÿ▀[ƒY¼ê Æ╖╝&τφ6&·░┤┬└}çî#«î░X│Ω∩;├dG?úÖU≡Pë≈8àú²p╜┤uçrAmΘ└Ö╥,▌÷╨7ÿæK
  80459. Φ░,e(ª!
  80460.  
  80461. ±M#*½é(«í╓jò>⌡▄éªùò■█¡σáA╛√≡RWd╘û1_╫KL/.HCn  ç\bf▒yRnú⌐, φVí╣░└╖▀
  80462. ƒ:m░╒qr»╟╙NMçVÅ{╟B╕nçεTx╓mæ┌VïQGñ0▀┐╞√├▓j╚Üî▌e╟ΓRHñ`δ▀2╠╠Z├H<▄S█▌,lⁿ¥8╠KbÇR█╡ΩTv░⌠╕≡Θ
  80463. ΦÖ
  80464. 5╨∞ób\v>Å═=t┘┘╩áJX2JO╒à*╕Nƒ■╓╒ûì¬é┼┐?íµ╟SÅ >i╒∞}[εδ)┴cH√î∞∙τ╢Xƒ┴Σ≥Vµ»Σ ƒº÷╓%ow< $ä≥?!
  80465.  
  80466. ╥A3445íá4s·║ë>½>∞╤└╩╛╟╓╤▓¿σCJ╗╖Çwc[Lⁿà3W═H:}A}j≤┴ j'H░&äº!!²═╕╛│Æ╪┌D╫dN    jl⌡⌐y_─áézIÖ£aεE╣o╨⌠T  Θaô╥ôNp⌐fëí╞ΓΓí~ì"Ö╙┌<áσRVña    ~┬Θ&╨▄KεN!!é2░▌cC╖çL╩K}Ç2┤╚ïKp≤ª∙φᡱn╕⌡ªdR\g>éú5JB╚╚╩ºKb1!!░Φ;â_BÇΣ╨║≡dñ╛ä╦ô0░τë┴E8░p┌x[τú7₧i^ΩÉä╡¢╤KÅ▀╩ΦQ║Rò+╧±º╒≡>oOvG P¢Z∙₧qsÿ&ï[▐Qwécaü≈oú"y√ù├cqkYv╫┌▐▄
  80467. É⌡S#│┐EÅåïU₧r5éⁿ4+₧eôÑ╡╕gÆ⌐⌠║═╦┬QèY¼ìAu%¼₧! !
  80468.  
  80469. IStorage comment:
  80470. 'IStorage is a COMInterface class to wrap the standard COM interface of the same name.
  80471.  
  80472. IStorage is an abstraction to represent a structured storage mechanism somewhat similar to a file system which contains both streams (files), represented by IStream interfaces, and sub-storages (sub-directories), represented by further IStorage interfaces. The standard system implementation of IStorage provides a file system within a file (or in fact, and byte device which implements ILockBytes). These are commonly called "compound files".
  80473.  
  80474. A notable use of Structure Storage is Word documents.
  80475.  
  80476. We do not actually implement this interface in Dolphin, only use it as a means of accessing the system provided structure storage mechanism.
  80477.  
  80478. Note that the system compound file implementation can be transaction, unless storages are opened in transacted mode (i.e. STGM_DIRECT). Transacted storages support committing and rolling back changes. The default on freeing (i.e. calling Release()) on a storage is to rollback transacted changes to the last commit point,
  80479. so it is wise to explicitly commit changes using #flush, or by sending #close.
  80480. '!
  80481. !IStorage class methodsFor!
  80482.  
  80483. ΓV"!!=■╧4 ╢¼ó+ê:î╛åÄ▀┘╠┬╗ασRM ▓╬hgIX╤ü~]æP"kAn ≤ê\tf@¡<R*¼«7║·MÄ╛╗¢╖╪
  80484. ƒ4Jk ╔¼h1º╧╔\L°|·túF÷|₧╝EG xσaÖ▀LÉV4¡?╓ü╨╢┴»wìC▌÷∙e╟╧DA«fJxÉΩ2╩┌ºG&└Z⌠■(!!⌠╚|╟.╙:╜┌├@q╡»φ≥⌠%║±aH╝═╜!
  80485.  
  80486. ΓV"!!=■╧4 ╢¼ó+ê:í┘α╚√ìƒ╞¬⌡ê\G║╓¬1iX┴ô;@╫^JjgU@°éi ╖tV*░«# ╫T║≈╕É╖╬\Æcam╩│x<¬ë╞PDÉVäaªóuòA∩AJ
  80487. 1τmÜ┌4÷+z¡9¥╥≈■╔αrïÜêÇ<í⌡R¡fJoèΩs▀╤L≡D=╔[Ü?└9nδ╞╟g╙░╧├Wd╢¡±°Θ¼┤iR∙⌠║BvRR&i6ïgë~1cHE─├─π4Q)%╞┴.àIôΓæñæ ì╗Å▐ì;ºúôTÅ2C▓yδ?{V∞Ñl╥#6åo▒¡╢ó╓Jë╫╫ ≡6╗~φ'àèÆ╢sU}H%[8≡#û╙"fù=ôKàXGKoâNaÇ■uΓR┴íαS4    ^ w╪│╕░-Æσq%│·▀åï@≤#<U-{½Ö6.ö~ü■▄êNⁿ╫¢▀ó¢█Lê_Åö@X~αôü▄/┐, rÆÇ▒└╓(tà╘A═σÜ=R░÷ &├E9ü╩UΦH£í8£ó│ëëBó,@ļ│╔&╒π╨7ÿôEFα⌠m*¡°▌ïÜT╠59Ç┤╠D/┬╙ΩOÆσà)U½╚;H╬'8┐₧9τ:]╕╩┐Σ┘╔:πµçê╡▐1│gTÉ÷Ω┼TΣÿ╔Σ░h]
  80488. £u░ë╜K972ÜG┘╟NhOéëº#╨δá)╪X╨jz∙╘▄óÆ1aΓ√σEhwïM9rXV╠!!Ωi░∩╫;═┬∩╢Mδπ▀▒|Vüq&û,¬]K7XÉ%÷░Æ{:ⁿRS╕} ╚║1o¿╛▌ß╨N*K"L╖e₧╪╛┤α5â ░c╙σⁿ)îc'@╝Γ│]╝ê╜ß╩╢ ≡3&a╝¬{g¬ò║■L╣├Q,▒∙$τ╒m╛óé(Γ6V╪    *╢&F╥├Z+vc╜┤ß│ΓxíLHoêΦk▌É╒1┘ºH-wBó;Θ'uOΓó╪:Ü 2 ⌐⌐∩α{G╡δl2 τ╒è7òIâφ╥'ªe*r└≈)┤c▀ó├¡╪▐R &g3«ⁿá/» Θ╘ê ├h╙RΩ√d·┬âeδt╫╩┤╛║N╤δ+±ù∩{ùeó╢▀Γ]╔╕Sα W=φL #N│!!ÅR▀5\╗c8d!
  80489.  
  80490. ΓV"!!=ïü╡¬ç£+Σ╟╡î ┘÷∙▒±«qZ½╛╙!!≤è-EÆM+.UV|O ÅMg(Lª<\lΓ┐( ₧P½▓╛ê≥▌\Æ`~ ╬│-1╝╠┴MM╒╙p╣Ñiƒ²VJI7∩$ï╓\▄/┼,╓æ╩≡┼Ñw╚$│öÉw-╖σRWΓwoè»7█┘^≥M;î^┘÷>r╣╩w╞G.ê1╛╚├Pf▓áδ π¡≡,½σ│MrT\c~╬√<d\Y▀ä_╚╠3V*r╔ä#ìä⌡╨¼∙NΩô¡┬Ö5ù·▌ ▄_w
  80491. *És VF÷┤z¡2à æàû╘ƒ[₧┌├ªF±1»g⌡╫Γ∙╦kfK!
  80492.  
  80493. ΓV"!!=ïü╡¬ç£+Σ╟╡î ┘÷∙▒±«qZ½╛╙;~GR╫▐~UàYi%j^>f┤áJq#]π}dº╝`≤╨Q⌐╣┤¢╖└^â|[@|e┘╣d$½█ÇJMüVå5║L÷~é²EJI9íjÜ╔ÅV{╛;╓ ⌐ƒ├«3£Ü█Çl
  80494. ¡°QMºdJR«α0╒²F≤D<Ç═τ%!!φ╧}ég╬+┤█åV*≤ú≈·σF«°a[¬¼≥ckZc~π`è1zJ^ë▀çßMe9εª╦_ â²╘¬²uφ╡Åâ╪S▀Äú`╙E6╣n╝5ï░g╙z^■F─▄╙¥┌D¥û╦πU─9┤Σ!!ïèÆ╢5jLcK/≡%è╖)`ù5èB╦X,(
  80495. ∩stè╪'µ 1Y∞¡∞Q86O6p 6╤╤╥föµOp≈■G╢╣ÉD╒!!DEé¥NjTû~æ╓╫╓ ÷·÷ñ═ª─[Ö═ε,?6Ñüè▌/⌐8&H╗«á▌╤8^çƒ"²╚±Z│ⁿΘgε*     ë└∙R!
  80496.  
  80497. σA!! 4░¼ ,╗╜ëè;Σ╣àÑ╝÷╤╞⌐≈╖W╖╛ÇvNW╟ê*û\G/}Hf≥ä^_i4ó<]o╡º9║▌P⌐ú▓Ü╖▄àuY "╖╓X╟≈âª"┤;Jìqô\ñ$╝M: ╞Iá∞|╜fC₧)÷╥▀╢ öTÑ2¼│▓N*æ╘ogÄU9R┤╩z!
  80498.  
  80499. σA!! 4░á",┤äâ.ÇRï╜¡φ≡─╚╨¼▓▒[F ┐┼}r]Z╞─?QöZW9.V\o
  80500. ╢çK&'¼lVd½Ñ'║▀L@¡»╛ìπ╞╫gJ|a▌╣#p├ú¡3!!½U╨^FÜd¢Bó$▌ux;╒A▀┬»vSü?√│±╙≤àK½!!¬¿║J*τ!
  80501.  
  80502. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q"DI■É#¥▌╧KIÆ╘{╟*ƒNäεPH xσaÖ╫WÖvqí0╥å╞¢ª╔1σg÷êûp    ├¢>-ªe rîΩ╦╤\≤H ┬ÜU╨?d°╙}±V|┼>╝åäVr₧íⁿ√║¡τeN»σ╢[XwCFt$ï▒M a\D─Má{π╚0l.DY╫ä!!ƒnå⌡┬Γ╝&Φ¬û▐Ä,⌡τ▐▌w «x╝ cP≡╡)Θ^O■ƒî┘─ÿ÷╝¼ÅF±9┤n╟&╦Σ∞╓H3Ef-⌠9áπ?`É9┼\┌ DPuâd1╫ⁿ'σ'*X═°²R"?X{╥Hä┬╔Wì╣1@▐û ₧çÿR╙)6Dt╥⌡7Y}╓`ç∞╦╞∞⌐≤»▀ÄüÿO»ûA ╖¥¥ï₧vt·│·äéd²≤Eúì÷]í▀ε'ÇTy8▌ôV▀R£α#ëö⌐[ÿÜ@ªbàä¿┼,ï⌠çéÇl ⌡εa7»µ╬╬æK T┌)?╟φ« Uó⌐ X¢≤ælL╢Φ*φ=n·ÖxX²(PΩä╛÷╥I┘uºΓƒôÑ¥QS╦`Nr¡HΘΩ┴@á╤ï x▄A £]O(Æéùfíl├ü9
  80503. à┤≤8╩∩τ>ç^┴~^½╨▄┤╩h$h⌠╜╔Ix2╨]4oJ╞#°a¼√à2-═╘╣ºF±≡└¼{XPΘ    "ò,{╗R[9V╤?═¬è{kⁿP¼o £╝~I╒Ω ·▀_ SJ0Gσu╤ö¡»Ω9â·¡~┼σ┌╪7a#I∙⌐≈º±┼æ9╧≤⌠6!! £si¼ÅEYö≤Iº╢╔ôGçô{Æåú]╞Ei *É<¢ôsPSh¬α»╓ì═#Fo▌φo└─∩'ëº]Ah3R⌠t╚EΦ¿╬Udó9R.7²└▐±4FñΘjqJ╡╜Σ⌡C╞Σ╪'Æ00~ö±0┐+ê≤<╪╛sù╗Qe-k▓▓╣2╝K╦╪ùδôV╓╩±gÿâìr┤r╪π╢ ¬Tçèù≡èc┼a╕╢▌≤}╒Φ_⌡r    ╜V ró=▌]╬?óg?>J╝åÜ m┐Æ╛╟7½⌐σº┤uW)i뼬N╡Σ╦)_Στ╗e$QôB;─≈- ╬3╟ißr÷½áH{╕÷M╥╕C╟<Y_┐,äÉ≤OEº>°E▒┌φ ╒6▀90ä3╓Qp$5╡úFó╛zë4─╬dφ ⌠φîx╢│╕!!=αëÇ+≤─}■á╦4╒√2߃víBFût┼ç╘#φ«∞]y─╩l┐╩₧┼ì8▐ⁿCë╧[¥▓ç║┬6{:î^╧QY╠É└┌≤è}«yεvº─e<∙Σ≈,─╓ñ└╣,├b⌡)τb:3Tí≥╩┐╘H─yÖ{²≤m+ ░éâ╨'"ßävè#║▌▄1ú¡Θ0╡:`îú;gûl╙Vóa┴_∞▒v\lfjùs;≡ì┤╞≡¢╪4 îd█▀╔ú0««j£ä¼k╠┐¼ßáAVR▄╓í»ag¥╙≤╨<┴E»Phª╒X└öms╒z-=K¼UMIì╓|<äá( úi·▐¡çvSA╩1¢F▐üì╬┌£í[J∞íûπ¢(ê⌐╝9@╧═φEΘ├ªdN⌡⌠Ö¼â╞└#?6Ålg▀3╝àQΣ±╩■╔ï.▌Ωöí"┌√▌¼≤ò@╕.íⁿºK£∞â╠7<½Xç╞╕WL0Γ╓~▐▒å½╥-vܵnLÿv┴â2Φ#ëΘ╖╣r┴vj┤ªîgI n0KL?│JσQ«≥q╘M≈╔∩£⌐ⁿ≥úÆ⌐▓â¥┬ⁿ1└hτ&é>û1úw'iQ│ƒa∙É┼⌐Å╩òß╨üSW;Q_óSÖF╗╕≡C¥&¿ù?╣╡ⁿA╩│G?ú╬üÑ7úMï⌠#·iY╧eN@}yÆ▐«ù'╙9ƒ≤±╩║╣Uä≥»╖⌡║┌{≈y╞S¥-╕╝aUgâ3·╨]Γ≤âƒw╘z≤░±zô
  80504. iúóEpæ
  80505. 0öu'┼H{á╕^ÄⁿU¬Fâ┌-V╓
  80506. ∞:┴í7Æû.ç\╬£·╦gi[7ñïMèä╕φa╢ªy▌ °µrLÆ,─8ÿ∙πzÑ∩╗É▐ç╫╝t>╨÷÷ñ"╜!
  80507.  
  80508. ΦJ.<9¿å(,ùªê/¿>±╟éªùò∩╟╖ΣñGF ÷ÇR}AB█à2[ìZ>f^+    ∙ìVq/Añ2>╧┴IôφJ║▓Üæ≤╩w■Y_.b▀¿z7½╟ÇIGçÆy½Ñuæ∙B<Σ$î╟T₧Mx┐@=▌ûâ┘αà3Ä₧£╙jóΣRW∞`δ╠;█▄T╩N+╔L│VÜ`Θçz╟Vy┼:┐£ôKfº»·≥σF⌐≈cY¬≤≥aC?î∩ppATë8ß4╩ºUl;Z█ì:ÄIB√Ü╕╤òì╙û─Ä6⌡µ█└w┐w⌡sÅ█⌐CT╧¢éÿú╨L₧┼¼Åf²$╡'í$╠≤≡╨R)J[2πwÉ (fÜ=æIæZ,(∞    "ú╡¡JT═Γ X#.Kr╙Z╙▌▌A└≡L/┤÷Oå╒ïO█l,IPé "C.Ömà≥╓╒N╝┐π╗┬ƒ▀ZÿαèJBdñùü╬.∩ ZÆì╕╧╫:\ÿ₧)┤╚¬    Qτ║│DΘ)    é▌⌡TÇ┼>Å│┤[äÜU║xö─═¿@╕±äd╓─Xα░fM║ß╠æ╒*ecτΦû±o∩σ╨sú╤«@vçç^büG]╗╩.⌐,V±╨┐ê┤K╚!!∙╡ú╡å≡ ut°V+d║y╚┴ p$├»Θ x▄A kÿOf╘╢çi%ºv£¿+z╤╟╘ ├▀⌡>≡FJ£≈ΩÖ9±_[4ï╤ì/6₧z>OJ╞#°vá╖Æ^W╪╙╗°ÿ╘≈ÆPl"ÑQn├`Bèy{zΘó▐≡nX»WN╡v╙├T    ÅùΘτ╩IoHnÜ°⌡╫gâδ8└    └¡h─╢│}æx0aæë╘0╒ÿ¬÷D┬Γ;≥3* ≥ëhΓ█┌û0╫δUü╘£Æ_Ä∞╞~I╓  ▒    %╛1#>σ╪g>╕α»√ñi╢OFiíëz█─ü~¬ûi6Wd╞Zε6~¥▓▐8    æe' ¢▌┼└    qσ≥/9╔²▒E╣fτ╒4 æ~SΘæV░eÆ≡R╪╕s╝▐y5p6k`²█¥às▌°Ñ!!å▒hß7ñΦ0à╢ºZ╤G1 ßì╠äs°╝ö≡è ╓r≈√K╥≈Y╔÷^Å%S ≈Nv7&asôδk,ΓA|C▀EC1²ûJ╒q}Ω▄▌o»J╟v░■╢lßH'dYñ─╧,ó=⌐┌`xèBáSα)gúe⌡▄by╜J½¿:úª╣L2╤█╓╗3í-NJ│.ç ¿,,▐]z2¡&·φδ²+╧gN«╦Qs,ƒèFÅ┐yÄ.╚ⁿh7τ7Θδì,≈Γäo&Φ╗ßDù¿∙áÖr╘√!!≤≤&δS╙UτѲOà¢▌|,╝¡_╗╔÷╕╛yÅ°Dü╦Aî∩≈║╥1{N╝nφ|~╛ªπ≈0╢▄}ÖZ╞&M╒╚a██φ,└╣·₧≈5à-┬3üv:;4╞r─╩Ñì■B░ ééI(+û»âçOEìπ ╤Zè⌠÷Y▓»≥9┘]d"üΘ~G° ╣-tÉS±zÖ├/^b√[ £╚ô╜¥┘9{╪"@╖┴▌║o╦æ[7┤╡¢∙3êÜc°≈\cx⌠│■α)*├α╚π ù-╦eÑ╘ Ä╪:¿PvI>N⌐UnSƒ╓|!
  80509.  
  80510. εJ6:;»¡+=┐║ß@∞}└┌ⁿ█√┼ƒ╘■ⁿáD╢╡╙orFU╫─1T╫KL/.IVh
  80511.  ùK&)Aπ}]*Ѻ/°▀N@Ñ▓║æσ╓\7╗{] Ly╬╣~|∞ñ¬4"ⁿ(Çy¿╣s╣-≤RD+!!⌡aîä╡n{» ╩å╞σî»}á*│┤▒]#!
  80512.  
  80513. εJ6:;»¡+=┐║╓jä1╚°α╧⌡⌡╞┴╗ß╚9*²Ü╬hdMDÆà~\ÆH#`HGj⌡ä^V`f[½yxº¿%≤╚GΦ╕╣▐π╟^äd[gf╙╣irçσ╧ZC╖çfεT┐iÿlû8K >αqô╩¥Aw⌐/ôƒ╠≥╔α;åï█çnáΓVG╢e7┬²6▀█≡S&╪ZûV÷5b⌡╥k╦Tkëq≤▒Θ)┌Éδ√∞Φ√nuò∩▒ |RP<rÅ╩;?rDr╨╚╩╠3UNC▐äu╦A▐├σƒ╤^╟êñ∞«⌡ ë:√"4 &¥X╦=]k╟±uÇ^o╦+í▓╗»φmñ≤²┼n┴!!îN¿!
  80514.  
  80515. εJ6:;»¡+=┐║╓jä1╚°α╧⌡⌡╞┴╗ßσ^L╗╛Ü;tZP ï:W·5-hOU@|
  80516. Σ┴h#Xπu]y╢¬.∙█«≈úû≥ÅöqWkrÜ│cr║┴┼[àÉsºF▓=╣-≤RD+!!⌡aîɱ(╞i ôô═σ█Ña╚≥±·}╜µRVΓ:W;æΩ?╪ƒQΓV├V╘÷?/ö¡φnK∞6│╬éVm≤¬²°ßñα O¡τædRP/i1ê∩f|╞╞3ô╡\~fM╘¿äY    ┤Θ┼╜∩!!π¿çαò:░╣ë▌ⁿn∙qM⌠┤mÜ- ¼ÄÆçë≡X₧╪ƒªC·'┐y»^»Ä╞▐U~J!
  80517.  
  80518. εT"ox┤Ä&!!ö¿ü/ΦUêû└▄√┘ƒ┴╢≈σ@S║╕╔}zMRÆç1_çPQ$jWd πîWrfI¬pV&Γ¬.■₧C╗á▓î╖╬^₧zMon┘╣-=¿ë╘QM╒ûpºU│o╨≤C"cQαg£█JÅKz½@5╟▄â┬─Ñ3ïÆï£i¬▒QM«eJræ»<╬┌QΓEo┼QÜ√(!!²┬~├Wb╘╝╙çA8≤╝² ΣI┐µiH╝¼≥lRPKc*ì÷9gJñ}ñÿáW~=@X▀àa╔7h√Ü╕å∩dΦ╝┴┬è;╗╣ë╬?%╣<±pZ╕±z┼a]¼¢çÆ¢╙\┤╞└Φo√5°+ópì╘╠°7y]}'g╨º╥    %ìt¼z°5~pFºDW┐╥╞J9√û╚z    b8L≤%·≈≈}9╖╤uÆ╢ !
  80519.  
  80520. εT"ox┤Ä&!!ö¿ü/┼2ε╨Ωû╛─╦╥ô²íV.╒╥éTcMXÆÉ6W╫LT/mRUb
  80521. ≥┴Vk6@╢rW*ªñ#∩╙G╝≈▒ù√╩P^ûzZ@on╔½h ε╚╬A¢ç{¡F÷rûAΦYJI*ΣgÜ╫OÖP4¬.╛°¬≈╧úv¢ûòö<║┐p¬eJxìΓ#╤╩Qπ)┼S▀V·>!!÷╫}╠GjÇ6┐£ùLq≤╜Φ√π«²eX∙φ╜%Q]e:╬≡W11L_──ï╡Pb2.&│Ä)╦N
  80522. ô░╫╖≡mδ¡ê├¥~│∩╚▄_Zai╒╧;Sr▌âLßIào≈Φ▐╬φMè├└⌡V┤5╗oí2╞Σ²╠    !!KO<Σ;ç╛@°]¼z°5~uQ»TEΣÆ\èGen═│·R".
  80523. l▀█Æ╪Gà≡Od≈▐EôÜêT₧/0QN╟πd2╤nÆ╗█▌í│σó╬Ū5⌡1╔φ,?Mα╥µ[┬d¿,&
  80524. ■┐┤â╩1}Ä┌?│çΓUíΩ╗*éN05╟─⌡TìΣ9╠│▓[╩ÆAπ,ì║ª┬=╘⌠▄~öÆ^FΓ╗i-╛┤╧┬ÖB╦3'ë┌⌐#U°⌠┘gú╘╣Hfòε<═n]╙╖9╪>Uφ┴⌐⌡¥I╪4º╡æÅÑ¥TU═aNZ¥_πδ╙*|â≥ É2¢z*╕ic│ü¼Q4<<ÇG┘¿VA╦ïΦ4╙τε<░u$╝JZ₧⌠∞ò? C[P┬₧╩C»o=#àΦd¡ß¢8=├½┼╦+ÿ╘≈ÆPl"ÑQn├a_çlqa÷▄≤≤3G«VH╣8ç¡5 ªôÜ¿Z▒3Y'i
  80525. w─Y░¬ÿ1à█∩7▐ïZΣσÜjîk!!BΘ≡┤O∙▄ú≈S└¢wv`┬├¼STç÷1Z▐ò0≤┬=N╧╘Z£ûPÖä¼\╟S:≥ < ö5F╙èsRy-░∙°╛πcÑ^Bqäád┴É╔1ò«L+½▀Sw╤òúrN╟@w:é▌▀─gä═[)«╣τ:▄s╤π┼#╖1;y╠╕<░ê▓ù║y╛╗X !!~9╢ñΘ,╜_√¥å±ÇN╪φαd│åφç'ΩΓù┴Äu°╞_█≡è Ü&Ä⌐╥≤Lî±\ªBL!!E½P!!M(▀√{3⌠Vv6äU1òδ]╒f÷▀╓~║¿_«Σ╢vá;L-vêπΣ    ╓µ┼5F╗kÖ,╘)F∙=_¿╩3·Σ[ÆÿëâoLÄö╓ƒjè7W╣6┴╣≡DTñ%ºE≈≡ß─-┼e²NÖD7af║≡;┤╛}ì)ü yαt■≡ç#Γ∙ô(hÑ¿ë( ╘ñù│X»ùI₧≤╗stEûe┌ä╔0äè█uH≥⌡≤ö╥∞σ*î∩^üèTàÆ¢╕╔$I2kì    êAHÿ├══∩Ç*úzΘKq⌡ΦA&Θ⌐╔±Ωÿ≡ì/ΘS±*C║A
  80526. m¥2√φÿπeñ■l²ÿ/o0_    ║ëá╙0"σäa╒Éí╗K¡ú²?╝18wç╢?pü#Ü_⌡s╓N«∙vjù5_öß√α╩$ó/≤VΘ ± ·ï«â\5≡╟°┘╣½&≈≈{_ZÖƒ╪╩≤╫í└!!╔Nßa}│ ╒äô)fînw_V>I√RnR┘⌐G⌠Σ>2Ñu■ ╜Ü<V7$⌐▓¡àù°┴£╛B)Æⁿ₧⌡ƒw╦UAΣ¬f\╚ÖΩM√⌐╣~S²πì¼âÇà#1!!Éh{╥GíÉR÷╛å¡¿±Pu┌∞I
  80527. ¡ê7-7æ╝■▀ƒ!!á}¥%Ω▒ä"▒)φñΦyΦ┘╕├7F2ë╡▓çÇ▒╓    m£τ&╧\₧╫φ.┌ùç╜q»ÿ╗ÅwNs0xKS)1Öd½wë╘ï`êñj▒┘⌐■Ü∩ε╬úÖüÄ╣v⌐-úxⁿVδ╣w3Y─▐sⁿ┘┐╞⌠φæcÜΘòPF"═-⌐o┐¿ΦH┘$àì º┤╢⌐pÜòßN£┤╕Gì∙l∙<ëEGf1╒├ÿì/╔4uìαñí╘╒/┼¿╗º² ≥bCδ&σCΘ
  80528. ₧ÿTkºu╗    ╘Wπ╛èæw╘~≡φ║gÅNo≡ás?ü=ö`7├^d∙c40K±xÖ╡]ñ
  80529. êE╧hZ╙ Φqü≡9∞∙W┼Z▐û╛╔ xvZr»çO¢äÿ≡    yûá>Ü H■≤"h░E»G ô■`ΩπΦ£▄ç╩╖%╔ß²åRC╥Ü╪ôúiºE'≥═kòU╬9ÿó">¢!
  80530.  
  80531. εT"6ìú=*▒ïò>Ç,╗öε┬╫√╨╓╡╨╝GF¼╓¬1iX┴ô;@╫^$kLbσòWe#¼z~¬«`Φ█Aíí▓î╖└ ÖqZ@anÜ¿e7ε╠╪P[ü¥5╜W╣oæ∙X7≥a▀┌XêC4╛/┌û╞σî⌐}╚ù₧■f║∙R▒pxïΘ:██╗h├\╤4Ω9dΩÖ8╒Kz╚╡┘àEa┐║╕ π¡τs┤∩╢B-HZ&&£ φ1r[U═[ìÅá]"+QE╬äc╦_òⁿ─½⌡wß≤╧Å≈T╪ëá7▄;R ¼y≥ zv╬╛j╦OB°ì█╙Å╤a╖┘╞φ`φ5⌐+îY¼Ä⌡╨C3L1≈wù≥+dä8ïa╧Oolée!
  80532.  
  80533. εT"6ìú=*▒ïò>Ç,╗öε┬╫√╨╓╡╨╝GF¼√═twM Æâ,T║P@/1:).°Æ    \tfNπrV}Γó.Θ╩C½▓≈æ±ÅÆ4Lme╙¬h ε╞╬I¢Vû|╜W┐sùA∩E@µa▀╔QôQq┴jU╫ô╫≈î⌐`╚ £ÿûoº≤[AΓvz┬√;█ƒL≈D,┼Y╙≈mH╒╚{╔`w╘:óÉ├S}ºª╕ΩΦΦ¿iR¡σ╡;Xb7╬gë~6}NW┌[ìÿºtb8FÜò.Ç_ ╓÷├╖±!!≡▓äì⌐
  80534. Æ╬ë ┴:¿u≤:Å█¬G¼ÉÆäï═ç╗»ÅC·'┐yíiÿºδ┌@)A^■>¥π(w▀Y⌡'≡4dnjäraƒΓuτ#]▌«√\P#pm┬±┬▄J5ö∞N+░·fæ╝│H▌'IT╤¬d3╕@ÿ°╙≡╕┐Γ█íΓóOÅLº┤W_+▓¢¢
  80535. æjúkjuæ╫┘╔╫9\ÿ₧)²╚≈Fë÷ ,├-^dö▌┘XÜφ"êóτäÆK╬Rviæ¼┤─;╟⌡öd╓╫
  80536. kï▌ft4╣α▀Σà_è;%╙á╞Xrª¬ùt¥ΦÅ~G░! !
  80537.  
  80538. !IStorage methodsFor!
  80539.  
  80540. ΓH(    0U╬µp╖╣Ç/ê:∩└»╪÷╥ƒ≤╖■áS¡┤╘tpGZÆç2]äZ'kO[d ╢âe)B«uG~½Ñ'║▀LΦ┤┐ƒ∙╚╫uP
  80541. │¿e7áë╥\DÉÇ{⌐óuòA⌡_[ *τe£█▐/┴jU└ù╧≡î═ßdÖùåo⌡£=-╦f~ç!
  80542.  
  80543. ΓH41U╬µp┤║¢/ù⌡▄Ωî▌√∞ⁿÜ▓╡AF⌐▓╧n`DOÆô,[âKA$.R]╢ò\&4JáyZ|º╣nù┤+.µò∙▐├╟╫}M@zh▀ⁿ~3ú╠ÇX[╒ày╗Bót₧╝\ 4τ$î╩Xêwá5╫╒Å╢╬╡g╚ ₧êçyα│:.╧
  80544. cg┬ε=═╚Z⌡3í5│²>vⁿ╒8ÿ.πé⌡ºz╢╣╓δ∞
  80545. µÖ
  80546. 5û╠ù& gTTrèσ%}[█╠⌐¡X~/pX▌█oÿ_É░┴╗≡rφ╛█ì¢0ª⌠╠üh]b,▓oδ
  80547. f!
  80548.  
  80549. ΓH41bΣÄëÇ¿G∩VúτΩ╪╛├╫╨■ß╡V@╢╜╔~wu■╖v╫VJ>aGc
  80550. ╢ôZc/Yªn(╧┴MÉ╖Qñ▒≈¡≥█?ûgMZ.a∙É^èñ¬4"!
  80551.  
  80552. ┬K*<,■╧5;╝èâ'ê6⌡≥π═∙─▓┐╫░î]U░░┼;g@Sƺ1_ÜVPb'^n■Äi ╖tV*¡⌐* ▌V@┐Ñ╢Äτ╩^òmfeÜ«h1½└╓\Z█{∙─*▀Uó$╧dc=x▐[î╩]ƒCxá@▄ƒ╬ ╪ΦΓd÷≥¿uô▒BJ▒iuçδs╥╨Qα(▐Y∙■ hφßt├E}ëd▄╢ε.±├Æôèo⌠ΓiN¡⌡│BvRQg>éPú"t\E┼ì@┌ß]z3QHä∞EΓdôⁿ╫°⌡o≥╗ì─₧┤∩┼dÑ!
  80553.  
  80554. ΓK7oxíâ7$┐ºÿä2Σö√├ñù▐█ù┴▒\Q╛╝┼!!±ï.K╫KL/.URf
  80555. ≥┴Uc+J¡hc¼δ4≥█¡┤▓ùß╩^▀cV    mhÜ▒l+ε╦┼I╒å8╜W╣oæ∙@x≥pì█Xæ ╞i(▄╥╫■╔αwìïÆ¥}º■Y▒tiâΦ6ƃv╘U ▐^▌╜@ É≤p╦Q.╔,±╚ïA4╢┐φ≈÷ñ±nH∙∩┤JmCo>ïJ≡#eJ]ëP╬Ü╕-?LA╫Ç!!Åà⌡╒°δh≡▓┴╠┌S▀è═ ▄>╡s≥Od^÷╣)╘eZ°Fìæûì╓NÆ╙╓ªM·)·Θ6àπ±═E}@Ps│Z∙ÜG é1ôHƒNRz▄ eü■8µ1r╔»Ω%5Y╪3φ╞╓Vçµ=╛δA▒öÆBäl=\E╟■0-<£i!
  80556.  
  80557. ΓK7oxíâ7$┐ºÿä2Σö√├ñù▐█ù┴▒\Q╛╝┼;dAB┌¬?_Æ$kLvg
  80558. √äMH'Bª9αê/Ω╟á▓≈É÷┬╫qRce╘¿-;áë╘QM╒ûpºU│o╨IδYF
  80559. 0íi₧╟₧G4¡@/╞ÉÄσ╪»aë
  80560. Ü█£nO╜σEAúmCΦå'╤ƒK∩Do╚Z╔·#`φ╬w╠}╘0ú▌äA8≤ç╦Ω∩⌐≤e∙≥╖hO[ &;ÜJ≈pJG∞╚Å»MC=NIö∞EΓn
  80561. ƒπæ▒∩!!≡▓äìƒ/áΩ▀├9R ║<ΦqΣ╕e┼-H⌡èä₧╬ÿKö╞▄í≈=╖j∩7ïÑò╡w,\E;▒£ß(@¥1ÆK╤ uM9╞elê÷0φ ]┼º»G".M={┼äÆ╪J/│≈S8╢°L▀àêD═=Gn╧⌡~C3ö{▓≈▌▀ ó«▀╖╞ÄïXÄ^åêDQ7·╥╝'∞éTC'╪æÇ≈!
  80562.  
  80563. ┬K77■╧1 │¡⌐2å3⌠╨Ωî∞╨╓▄║╫╜PO¬┐┼!!3ZQ█ì:wÅ\H?j^x⌠ñZj3Kª&y¼⌐Γ▌N¼▓≈ÄΣ█:ÆgJZ.p╔¿j½┌╘4"ⁿT║cíH│=ä    ∙l(°PÉû▄Oq╕3╫╥╠≡î┤{ìMÉÖÖy ║▒@Vúp~å»1╟ƒK∩Do▐Z┘·;dδë¿+¬V╪⌠▒aGåé╠╛▀9╗αd_╕∞╛J!!jVL?izπ`è~YJF^⌠W╪Ö¿^c9G ╓Ä!!îƒ∙╒¥ΣbΦ»à╚╓S▀èá`⌠ 96R$ëU╪E4Mσ╕`─HC∩
  80564. ïàû┬▓"≥┐¼▌K·/p¡b≤6÷╔┌ƒ    HkjJ1Σ3û╗@°]÷u╓|J╡toƒ·2µ@eL█╢Φs4)^P%╗p│╕░kΩÄ6CδΘ@ìüèF╥l+DD├ⁿ(Y}Ö~ÆΦ═▐∞Γ▒▓▄ä┘[▄ò¡ad¼éÖ┬.φKU ⌠¼▒╔└u/·≡EÖ¢⌡XΣ≡⌡?éLy3.å▀æ*!
  80565.  
  80566. ┬V"!!=ù¢=;╗«ëp┼/÷╫ⁿΓ ┌┌ò╣αú~L╗╛Ü;tZP ï:W╫[Sz\uf¼┴NU2HàqG*░«3 ╠T¼σφ▐σ╩àb[< ╩¼~&⌐ôÇIXåö{╟ƒså≈T0Σ$╝╠\¥Vqƒ3┴ô─≤äΘ3àïô£xOí≈P¬eJtÇσ6▌╦≡S.▄O▀│/x╣╙p╟|┼<┤╒òAf²├Æùìl┴¥Hn£╙ç&6%yjr6ì ∩pR]U╚╚"₧«Kl;F╖δFΓ39ƒ■∞°╨Q╙ë╡ ┌.óα┌'╬2Gi╒ò4}Q▀±|╬~Rδ¢à╙é╨F£û┬⌠D┘4┐'îY¼ÄæΣHTG.°0¥≥)%¥;æIƒVqwüFmÖ╖XëcL5≤½ßjq/D
  80567. w╤█╓ÖH    ÄΣ8▓∞LìâÜCî`U:)x½╦+)¼,╛╚╠▌¡╜⌠ⁿü╦█OÅLº═;N═°µQª@└Dφ╖ó┌╨>}╫ë8úï±X■╣≤;åSe;╟àU≡PÄ≥#₧τ╣CàëCπ<æ¡τ┼>▐Γö~┐┤^    ≤╡anα¬╡íⁿ'BA╞<k╔╣╒K0┬─▌KÉΩ±!
  80568.  
  80569. ┬V"!!=ù¢ ,╗ñ╓jò(Γ╟┴═≤╥ƒ╥¼⌠ê\G║ßÇ|aN{▌Ç;àZW/|MVo^¼┴ \u#]╡yW;Γ╣%Θ█P¡│σ─╖▌ÆfHj2ܼ}!!║─ÜXàç─*⌠T₧≤ZJI,Θa▀²KÖC`⌐3(┴ù┬√äΘ3àïô£xOí≈P¬eJtÇσ6▌╦≡S.▄O▀│/x╣╙p╟|┼<┤╒òAf²├Æùìl┴¥Hn£╙ç&6%yjr6ì ∩pR]U╚╚"₧│\l1 !!░ΦFΓa ÿ═æö╠V╫Ä│ìè)╢≡τ┬{fxj╒╟zbóñg╙d\ΓÜ┴ƒü╤O█╤╫αo√5÷ïZ¼Ä├╓{)ZZ4÷9û≤mi₧:ÿ═RGqÉed▄╖XëcL5≤½ßjq/D
  80570. w╤█╓ÖH    ÄΣ8▓∞LìâÜCî`U:)x½╦+)¼,╛╚╠└ ¡╖╗ⁿï¢█LêUΘ▀(<I╩√═~íG╟ :≥¼ñ█─31äÄ(ñëⁿXKΣ±Θ,ÉU|#M╙ô∞Wè⌡%╠ú¬[ÿƒº/çΘú╓&├⌠╨ÑôXα╣E.z╟₧▒⌡å]Bè3%╓╢╧C8Φ┴≥F±î!
  80571.  
  80572. σA!! 4░ó=-┐─µC╟∩╟°╔∞ù╦▌╗▓íVE╛«╠o3IU╤ü-A╫RK.kUg±Æ^_i4¼lVd½Ñ'╡▌P⌐ú▓ù∙╚\âf[csÜ╜c6ε╞╘QMçVÇz╝B▒xâO╛<%dRêZ▄¥»vSü?÷│τ┴■ëG¡Mâ█áH(â╬dlâR/Dº╫≥Ωl╬w
  80573. à!
  80574.  
  80575. σA+!!=■╧7%┐ñë$æα┘Ωíö╛¥±╗■áGF »╚~3FW▀ü:ÆSA'kUG+    ΣÄr.JπnViºó6 ╠ m┬▐âû■▄\ä4Jk ▀¡x;╕╚╠\FüV£5║K│=û≡T!!≥pÜ╙█Fqá(╓╒â⌡├¡~ë¢╒╤e├¢>Wºl ;ªΩ ╩═P■d#╔R▀τw!!ⁿ╦}╧G`╘░╤åuá¢÷≈π    ¼±SH½Θ╝!
  80576.  
  80577. ┼A4'7╜¬>,╖¼é>▀±├∞▀╨╓╥╨╙ÿ╠j▒¡╧pvB┌ü~vÆLP8aBvg
  80578. √äM.o«yGb¡»`⌡╪á▓≈æ⌡┼â4Iop╩╣ir¼╨ÇM@ÉVüv½JáxéOæ;&dRê╖∞|»wXÿ@∞ü╫≥╧íäM╗₧ÇhíΦrHºmuûº^┤╢6Äz&┬bÜ:├R═⌡8╥Um╙░╤å/▐─òöëD┼₧6╨╝ñqST&!!Üα<}┴╚ƒ¡M-m ╓æ8ÿN╚¥╗╤┬rß╢çìô0úΓ┼╦&6n╓!
  80579.  
  80580. σM56,½¥+D╨└╬ ï,÷╤²î ùâ╞╗π░VM╝╛─IvIR╙å2W┤PH&kXGb°▀^V`f|ù]gYûî`Θ╩P½úóî≥▄\Æg]gb╙▓jr║┴┼4"ⁿƒx½Món╨·[=ívÜ▌\òTq╛NQ╣√≈■┼│3ü▀Å¢yO½αBM┤a~î√s╤┘≤I*îY╙÷>xΩ╙}╧)─6ú¢├G{╛ú∙≡ΣHΩÖ
  80581. 1╙ëî%.@c[k7£ ≈"1@^α2├ç√~9OJÜê
  80582. àOÑΣ╨¼∩!
  80583.  
  80584. σK!!7çÇ<?┐╗ÿG∩VúΣΩ▐°╪═╪■≤░GL▓║╘rpU▌è(WàLM%`\mO≈Å^Vd,Jáh~¡δ!!║╨GΦ┤╗ƒΣ▄Rs²}w▀«-&ª╠Çzdª?╖Vz¿óuòA≥TXI;φeî═▐/┴jU╧╥┬°▀╖vÜMâ÷∙áΓ@A░ P&┬╠φ÷{ºO*█╖|ÜM▄δq└Po╥&±╪åBuªó∞╛∩
  80585. ¡╨o}¼⌠╜)kPPrh╬µ_s┼─ññN7|BB╔û*ÖoⁿÖ∩╣≥r≤┐ô!
  80586.  
  80587. ─J24íé7'«║╓jù:≥╤²┌√╙Äò¼≈╢VQ⌐╛─))D╫ù;@üZ@x.IVx
  80588. Σù]5|▒y@o░╜%■ì╕▓╣ï·ò\çqPc░╒/á▀╧RM╒¢5ïMúp╡∙\J,≥,╓₧TÖV|ú|▄öâΓ─Ñ3çò₧ÉhO╣πVT▓e;Ç÷s╩╫ZºS*╧Z╙÷?/ö¡»(⌐â∙░qXçε╟┴≤¼≈aP╡áùhcYk7Ç≡_]&9á,─╖ßLc/JK╘ä+╦Vÿ≈æ¬∙rß¿ù╚₧o∙Äú`ªl >ⁿ~σqóúl╙hI·Ü╙▀π╡!!≥┐■∩L╔R%┤xΦ4╦ΓⁿƒIgHF[8Γ2üß(a┬x≥$╢q(ylôt]═╥φ(oⁿâ█dS>╞
  80589. █▄╠IO█Ä6G▌û ≥ ≥-╖p.YR╫±(C.àhö·╘▐T∞▓π│╪₧╟K▄    ≥─AA+▓û╧╔3╣g,X ⌐┐▄┴X▓ö9¬╗─u%ù═▄c╔]d╣└≡F┘Φ9ܪ▒]Ä╕F»4!
  80590.  
  80591. τE44▒£:D╨└╬Ç-τ█²┴╛╓ƒ╞¬≤½WB¡┐Ç}]E┌─*]╫pwjjR@`O⌡ÇQchçy@z½┐%║╩JΦ╣╢ô≥â\
  80592. ƒ}M@gsÜ▓brú╞╥\°|·táD│oƒ∩[9∩$₧₧WôPy¡ |╒¢╧≤îë<ºMÖùåoΓ▒@L½c;åα6═ƒO⌡D,┼L▀Ωmu±╬ké
  80593. gÄ: £àHa᪲φìl┴∙eQ╢≥½Jp@St!!╬∞W$yJµ$üQ¥⌐Pn4[▀┴.ÿI¢⌡æ»⌡mΦ·â╚┌3║±╠I▌;░y╝|^∞±}╚hφÄìÜì▐\Æ┘╦» ÖxYÅxΣsδ╙╕╓U}JM}■1╙└$k╚a╙▐EwÄis═Φ=∞)XêáΩ /C{û    ▀╘▄Ä∞I-┐▒ ≥ ≥-╖?=\FQß )4à6╫╚∞⌡-ô₧╨ÿ∞«∙p⌐kî╜fy    ì╗╗>εêN_,╘ÜÖ²εP┤▓    !
  80594.  
  80595. τH2    =U╬µp
  80596. ╡ñü#æ⌡▄Ωî∞╥▄╨╖ΣáA╢╡Ço{M╓ü=TûJH>.VRe≤ô^r.F░<Zdíº5■█Q@⌐≈┐ƒσ╦\¢aM.s╧┐er║┴┴M£■|║K┐n╨ ∙EG<ívÜ╩LÄLgα@(█ù═╢┼┤3ü▀£å}» CAºdJoèε'₧╩Oπ@;╔LÜⁿmu±┬8╫Lj┼-╜┼èJs≤╜∞±≥»±6╨Φ│%DPhrê÷8tK▌ìâ▓R$rx╥ê<╦Yâⁿ╒°■dñ½ö─Ä;⌡≡┼╪E>R╣n·fRτ╡)╘bT¼    ÿòûÇæ
  80597. ÷╝¿î+τ<╝+┬<╚Ω±╦@Z{!!j╒╡╓IÑ!
  80598.  
  80599. µA39ö⌐ùê╕ ï;╘╟Ω▐╩╬╧╨╙ÿ╠b▒¿╫~aWÆÉ)]╫ZH/c^]O≈ô XfL¼rGk½Ñ)⌠┘á▓≈╜█µ,8╕Fs!!Z █▓ir╗┌┼Küâ5óBÑi╨lû8\ ,ímæ╩V▄V|⌐@.╓æ╞ ┌Ña╚ûÅ¢<8╝°CAämNæΩ!!Ω╞OΓr;╦ôX▒@ ö¡▐m╞í╧Öqg╢╝╠τ≡Φ⌡nO«σáJ,<`r╘Wú Ck╟┌_τ╦0}/Yy╔ä=┐Cô░ïσ╝B╦ù╡╠ë5ÿµ─▌w≥ûf[s╟¥`┬Z■▐àûê▐]ù┬à⌠G⌡╖╘ └⌡╠╞
  80600. CZ[}Γ2ƒ±muÆ2┼▄Nsèpsù╬&µE╪º╡!!)P,m╙Ω╦╔AHφë5+╣∞^Üç▀âlBR█░3
  80601. )Ö6╫°▐Æ┐ô ó╬î╬M▄O⌐ÉM dΦºü╚%⌐gU Θ╖╛╔à9cÿùúîΓQ╖ú╗9ÉZE$òτ ∞E╨»Zµ╬¡GÉ«Tª*+ô¼τ╟;╘⌡▐Sⁿεt∩ºa6!
  80602.  
  80603. Φa)8 ░Ä&:╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√┴u3as▄æ3aú~pZ|d╢ò\&4JáyZ|º╣l║╔J    ½┐≈¥÷┴\Æ4KkdÜ¿br½╟╒TMçç─*┐iâA∙]J=∩pîɱ(╞i ôù═π┴αoσg÷₧¥iε½
  80604. ïEnÅ▄ δl╙fo┬Z═&ⁿ$oφ┬jî/⌐,┤╨àQ╜╗⌡█∞ѱnH¬║≥ZBwCFt$ï▒MpF\ë╚Å│Oh8Ü╤o¢Jÿσ▄Γ╝dΩ»îâ≈T▄▌╠┌!
  80605.  
  80606. ΦW!!7çÇ<?┐╗ÿG∩Vú⌡ß▀Θ╥═ò⌐·áGK║⌐Ço{M└ü=W₧IA8.SRxOΓëg3[¼<Pe¼╜%Φ╩ñ╢ñì╖═
  80607. ╫g[ "╖╓X╟≈êvd░:Üg»Q»=ö·PZ,ícÜ╩zôLb⌐(αå─¼î│vä ╓█╬!!O¥╬xo!
  80608.  
  80609. ΦW!!7çÇ<?┐╗ÿp┼>├█α└√╓╤╕╘¢τ~B¡░Ço{M└ü=W₧IA8.]\yO⌡ÄOc4\¬s]*╢ñ`√₧F    «▒▓î≥┴^öx_} ╒▓-<½╤╘DÜùZ─*▓xÇ≥UF?íkæ₧MöG4≡3▄₧╞≈┬■3ëÿÄ₧y║╜EÇowçε=É¥2ì,EÑa⌡:╓h√╒y╨[.─:╖▌ûH`≤╜²Ω├    ªΓeN¡╙ªX%UP`rê)∞&t]DôW╠3à«Uh=M!
  80610.  
  80611. ∞K1oxíâ7$┐ºÿä2Σö√├ñù▐█ù┴▒\Q╛╝┼!! ï(W╫KL/.URf
  80612. ≥┴Uc+J¡hc¼δ4≥█¡┤▓ùß╩^▀cV    mhÜ▒l+ε╦┼I╒å8╜W╣oæ∙@x≥pì█Xæ ╞i(▄╥╫■╔αwìïÆ¥}º■Y▒tiâΦ6ƃ^Θh╪P╚⌠(/ö¡÷Jg╙╕╧├P|╢ε²∩⌡╛⌡lY╖⌠≥%R]&4çµW#h\D╠ìVç«Oh{O╒î"èT╪▓╝╥æ ì⌐ä┴£~╕∞▀ òE2╣rΦ!!uRτ±}╧7φ╖▓çü═I£╙à±Kα╗fΣiàΓ⌠┌Cg[(H0⌠!
  80613.  
  80614. ∞K1oxíâ7$┐ºÿä2Σö√├ñù▐█ù┴▒\Q╛╝┼;dAB┌¬?_Æ$kLvg
  80615. √äMH'Bª9αå/∞█á▓≈É÷┬╫qRce╘¿-;áë╘QM╒ûpºU│o╨IδYF
  80616. 0íi₧╟₧G4¡@/╞ÉÄσ╪»aë
  80617. Ü█£nO╜σEAúmCΦå'╤ƒK∩Do╚Z╔·#`φ╬w╠}╘0ú▌äA8≤»÷╫╙ºµa[╝¼≥kGXh5╬≈W$~^╠Φż\c(mM╫äaµ0kó°╪½╝h≈·ò┼ƒ~░≥▄┘;ⁿs·O`Wτ±o╔a^¼çÆçï╥▄█╩≡G│R3╡f∞2╦π╢¥w,%oZ8²1╙┌"söôK╥OVWë: ê≈0ε+HµúΓRq*Yy≥═╞âÄ╩o>╕φHÿÉ▀W╔/+~E∞±)g╤bÆ∞²▐ í┐ óσè╞Z▄_▓écZ%ºü╒S°èOI.▐ü¥ß≤!
  80618.  
  80619. ╠K14íé7'«¥âp┼/÷╫ⁿΓ ┌┌ò«ß▒Tg║¿╘!!3XE╞âWäK:yX@E
  80620. ß»Tc|│kPyî«7╘▀OΦ░Ñÿ╤├ä.|fⁿ░l5╜ñ¬0
  80621. ╝à~½óuòA╤^Y φaÆ█Wêv{ΣI|▐ù╫■├ñ3ç ▀Å¢yOí≤]AítJlÉε#╬┌[ºC6îK╥│?d·┬q╘G|ÄR█╡ε.┌å╩█╙3ä└ cå≤ªdJYKK=ÿ╞|J^▌#┬Yτ╦0UxE╘╝oºj5Ñ─π°∞vτ⌐»╠ù;∙Äú`ªl >ⁿU╧{Mπ╢lè-K ÖÑû¥╦÷╝¼Å+╧>ç+═≥╘╠φZV~Lg8µÆ·()ⁿ^÷'╢#HL^╞un₧≥2φ!!─¡ßPq=XX┌┘┴ÉkΩÄ6C⌡Æ#≥ ÷╚%*DU╬░79Æm¢≈éÆ╛┐Γú╟ƒï▄T░ôVB6α╗╝─8¼ecR╗▓á┘╓+c╫₧;¿Ü⌠
  80622. |╬É┼:åLvwë┼≡I¥┬6ǽ╨>!
  80623.  
  80624. ∩A0)!!7╢Ä5,αΘƒ>è-α╙ΩΓ ┌┌╕╘¢τzM¼»┴ugAW╞ü~SÖ[+`HDn╢ÇO[¼nRmºδ/⌠₧C@ª▓á▐∙╬ô4Ml-╔¿b »╬┼A¢VçpεQ│~òΩT]dRêsû╩Q▄V|⌐@8╓ö┬π└┤3à¢₧▌>b─£=-£swä»=█╚l≤N=═X▀L│>u÷╒y┼G@┴2┤£ÄKp╢⌠╕φσ
  80625. «┤dY┐ߺHIQ!
  80626.  
  80627. ∩A0)!!7╢Ä5,αΘƒ>è-α╙ΩΓ ┌┌ò│²íV ¿╘|^GR╫ΘT;╒vJ9zZ]≈òg(Kπ}]y╡«2║▀L@üäúæσ╬╫{P@o ╘╣zrá╚═\L╒å8╜W╣oæ∙"cQΦi▀╩QÖf⌐9┌ä╞Σî╖z£▀Å¢yO╜ßRG½f~å»2▌▄Z⌠Ro┴P▐αc#ö¡¿+P╙:╜┌├Jqñ¥∞±≥»±:¬⌠╜bC{
  80628. k7╬∞5+C▌αÄñk3QA█òu╦i6▒╓ⁿî├E╦Ö┤α┐ü!
  80629.  
  80630. ∩A0)!!7╢Ä5,αΘƒ>è-α╙ΩΓ ┌┌ò│²íV ┐╫V|LSÆé1@Ü^Pp._DMΣîM L&ßU]y╢¬.ε╫C¡≈╢É≤Åäc[.a╘ⁿD║╞╥XOÉV£5»╕xçA≥PB <íwè▄JêMf¡9ô ⌐ƒ┼¡3£Ü█üy ½°AA░ rûτs╩╫ZºR?╔\╙·(e╣╞{┴G}╙╝╙çAg≤»÷·áºµm]¡«≡gh,<&3Ç⌠"1S=ú~╠Ö╢\|Ü¿ƒUù≈╘°≥d≤èÄ─ö*░±çdÑl$ⁿ_ε
  80631. uKτé}╧Zδ─┴ÇÜ╨ZÜ╤└╚C∙p╗x╘=╠Σ≈█u}]G:▒0ü±jò1┼█lMgâ dÜ╚!!Σ,(HÆΓδ@5X┬Z╠╫╩AûµXxφ┐▀àÅT╩+bA╤τ!!sⁿ■┼┘▄╗┐π!
  80632.  
  80633. ∩A0)!!*íÄ?s·║ÿ8Ç>∞·ε┴√║╡╝ⁿ█½@W╛╡╘rr\SÆà0V╫^J9y^A+╢ÅN&|╖nVk»δ)⌠₧V¡≈Ñ¢⌠╩ÆfB
  80634. ╖╓ ╜╠╠_¢ä%a╝F╖p╩A∩E] 9∞J₧╙\▄O{¿fôü╞·╩αwì ₧ăh"í⌡R!
  80635.  
  80636. ∩A0)!!*íÄ?s·║ÿ8Ç>∞·ε┴√ù╥┌║≈ P½╝φtwM;╕φ|{ÖLP+`OZj≤┴WbfN¡oDo░δ!!║╨GΦ₧äèσ╩╫}P@zh▀ⁿ7¡╠╔OMçVäaªóuòA∩AJ
  80637. 1τmÜ┌¥Aw⌐/ôƒ╠≥╔│=╩`⌡÷∙ε≡YW╡e;₧éY╖▐Q⌠V*▐ÇK│Rφ╒}├O.╬:ª∞îMzº½Ω░ìl┴τeP┐áædRP8r ï εMpb[B╠└?ï¼\-=Py╘ê,ä^ÑΣ├▒≥fñ╜ô╦╖1▒µôI▄0&╣<ε
  80638. gZ≡ºl─<¼V▐ôû¥┌Zì╙┴┤┤Bp¬{≥'╚╜╕▐U~JP¢^¡÷#vå1ì!
  80639.  
  80640. εT",½¥3.┐≤╠9æ0≤╒Φ╔╨╓╥╨╙ÿ╠l»╛╬;g@SÆü&[äKM$i@ΣÇ\&)Iπh[oΓ╕0 ▌Kí▓│▐∙╬╫}P@zh▀ⁿ7¡╠╔OMçZ╙{¬╖sâ∙C6î÷≈jêMf¡9ô¥═╢┼┤3ƒïô╙h½▒SAñawû»2▌▄Z⌠Ro┴P▐αc#ö¡¿+P╙:╜┌├Kd╢á╦Ω∩⌐≤e∙≤ªdAP%g?ïJε4t┌┴╩Ñ\k=V@╬¼ Å_!
  80641.  
  80642. εT",½¥3.┐≤╠9æ0≤╒Φ╔╨╓╥╨■ ¬WFσ√╙oteY╓üS8■k:kU≤┴Ao5[¬rT*▒┐2 ▀O@º▒≈è ╩\çq]    hi▀╕-<»─┼A¢VçpεQ│~òΩT]Exαj¢₧XÆQc⌐|╥£«£Ñë@£ÜÜ₧<á▒^PΓwoè»'╓┌⌠Q*╧V▄÷)!!°─{╟Q}Ç2╛╪åW:±├Æôèo┤┤aR¬≈╖By+?bg<¥µp+α$┘ÿá^h|MI═▒ éTôΓƒ╒û≈┐ì╦┌S▀èá&▀98 «}√
  80643. .±Ñf╥l\Θ(ƒîû╬▐[«╪╠σM≡«yΦ=┬ºò╡s/y\Nπ>£σ$qên▀@╓,(
  80644. ∩grï╓:τê▒√P5N>╘╩²╦F│╫{ê╠a╛º║x√|u"δ╞C╣i¢δÿ┴╡⌐▒╗▐ÿ▀ÅHÑçLP=αåç╪hΣ qÆ¡╛╠α'r¢Å(ó╥░Z¿É╣åL`wå╩╝Mî≥#╠Ñ╕ñ«kÅt_Å║óüσ╫»⌐«d0└ÿ&@ï╞∙µ░-tvêWA⌐▐╤O/╬╥ΦOÿ╝▄9/╚╡Z°= ╜ä4IΣ(S²╓⌠î╖2π4¡µçä│!
  80645.  
  80646. ╬T",½¥3.┐≤╠:Æ<≥·ε┴√ù╧╞¬⌡òAJ░⌐╔oj┬ù*UºMM%|RGrO±ôti"J∙<Txñå/■█ª╡Æå⌠├    Æ.`b ñn>╗═┼ZÉûc½G∞=é∩T]=σ$Å╬JêE.∞,└å─¢ª╔1íëöÿyO║∙Rìpu▒√<╠▐XΓ    fîR▀√"e╣╚~éVf┼╛▐ëAwºε∩∞ß╕±d╗∙≥
  80647. `Ge7çµ~%9ñ}ñxóô|^    oxÜ╛ÿNò±▌┤╝N⌠┐Å■Ä1ºΓ╬ çh]b{jçu≥24s╥åZ⌠_ⁿ¥Æ╜Å╥M╫╗»Å+¥)9┤Ví÷≤≈═AlFY.σ0úσ$jâ=ïWôu++
  80648. ∩[iâ╞u÷6U╧¼ΩSq6Eyû╠╘⌠Kà»1@▐û ñ£æz₧;1BE"∞╥d3ôIÅ°╘╟
  80649. ⌐÷£▄óΓódòV¥─PX7⌐òü╧jímh╗¼╡▌└-gÆ₧`╩ΓÖ=xƒ÷ε=╛Yê┴√E╙½w£╖«@ì╥╬RrjΩδ╩½D╗Ö╠(ƒò^α╕Ow0«≈┘╟ÖCL╪?8╒╗╫
  80650. kï╠ε]Å≥Ä)kæ╚<Θ)1≡₧p_σ)@╕╚¬≈╥R┘uºΓƒôÑ¥6uH╓v\¢¼ª¡-╘ê╔¿÷!!GÿWO"┤ÑÄdfx!
  80651.  
  80652. εT",╢è3$αΘƒ>ù:α┘┴═≤╥▓┐╫░èCF▒√╘svS╩ì-F₧QCj}OAn√┴_&2Gª<@zº¿)ⁿ╫GΦ╣╢ô≥Å╫`V.r▀┐h;╕╠╥öùVtáPíxéA²_"cQ╚Wï╠\¥O4ú|┌åâß┼┤{╚ù₧╙x
  80653. ¿≡BH╢  xüΩ ═ƒRΦE*▀ÿ{Ö@ É∙k╟NhÇ0í┘ìw`í½∙≤║F╗αrY╕φ£ `Xb7╘J≡<wT╠╠å╡tb8F!
  80654.  
  80655. εT",╢è3$αΘƒ>ù:α┘┴═≤╥ƒ╪▒÷á    ¼»╟V|LS┐εW╕OA$.O[nO≤ÖJr/Añ<@~░«!!≈₧MΦú┐¢╖▄ ö}X    kdÜ▓l?½ë╔WüûVg½@│tåε6σ$₧╨JïGf∞2╛°¬▀ ┤aì Æ█£rOºσS½t;ûτ6₧╠OΓB&╩V▀│,b·┬k╤c╧;┤╧═┘├ÆùⁿF⌐·sK╝≥≥o/Tu%ïúMm1fc▌╚çßWh+sC╙Å;ÄHL√Ü╕½∙mΓ╫δñ≤ѵ╟:█2
  80656. YⁿoΦq^∩ƒh═hφ½ÅÜì╨L₧σ╤⌠K·p╫êZ╫Γδ┌PlKW}íw■¥D û&Öc╨D#òtgá⌠1µJL√û╚z    b8L≤%√Ω·h3│╩j≈≥\îü▀E█l+@E╦÷-9╙²Æ▒└ ┐┐πá╬ÅÖ▄αΘ/?M░é£╞pφch ∞╗óÇ¿U⌐¢"┤ƒ⌡F!
  80657.  
  80658. ╬T",╢è3$αΘ£=å,╧╒Γ╔╛┼┌╞╗α│VGεßÇiv[S└Æ;V╞C8hv\o
  80659. ¼┴K` @ºyxº╕%Φ╚G·φ≈î≥▄ üqZR.p╩»y?⌠ë╨I[ü■|∞j╕kƒ
  80660. ∙[=íVÜ╙VêG[╝2αå╤≤═¡;┴MÆ₧çt¬▒XBΓt~┬α1╘┌\≤8▐^╩÷)!!√▐8╓JkÇ-┤▀åMb╢╝╢ôèo┼₧    5æ╥ù97Ir4Y!!Üα<}b╠┬ÅÄIh2pX╚ä.åoⁿÖ╕╤╟hΩç┴߬    å╫√I▀4<▒y░b6ï╪R╔cf¼çòû─ƒZ₧┼└⌠T±a÷ïZ¼Ä├╓{)ZZ4÷9û≤mi₧:ÿ╪
  80661. Golée,αæ\ècU╞ƒ»B?)Cp╙₧▐╓J└±Y9▓φ_Üæ═ │FQ9)*═σ0>}╕_âΘ▌╙µ≡▒ª█ÿ▀R╒═ε(<MΓ σ~íC±to
  80662. ∩½▒┬à,eôÖ-½ä¬╢ⁿΦ<ÅT0bMï├∩Tïí$Ä╛⌐Q└█C┤7├¡░╬;╒░╣éòO∞■E:I└¥µ╪ÉW├4=┴╗╩N╩╠≥!
  80663.  
  80664. ≤A)=■╧!!=¿áé-╘⌡█╡îφ├═▄░⌡≈>)╓∙πsrFQ╫─*ZÆJ+c^d    ╢ò\&#CªqVd╢δ/ⁿ₧V¡≈Ñ¢⌠╩Æf{r╚╣c&ó╨ÇZIÖû9εPóoÖ√I,ε(≥┤0ÅVfÑ;ü▄«£Ñö{ü▀ÆÇ<ª⌠A│umâπ6╨╦ΦGo╪W▀V⌡$mⁿçk█Qz┼2±¢æAz▓ú²╣áº∙m]╖ΣⁿHo+?bu7é ú%5N]╠2┴çñWyf_╬ô&à]S╓±┬ì≥hτ╡à╚⌐*ºΩ╟Å -╣k╥yZ╕±z╘RΓ╠┴Æ¥ΩFÆ╒╩ΓG╟"│eµ!
  80665.  
  80666. ╙A)=üâ7$┐ºÿp┼/÷╫ⁿπ≥╙±╘│≈σCT╝¿ε~dfW▀üdçHG9@^DE√äs3df¡j\aºδ4≥█2¡╣╢ô≥ΩÜqP&)Ü▒h&ª╞─GôVçpεL┤wòΦX±tÜ┌₧[4╕9ôÇ╞⌡╔⌐eì╤÷∙b─ÿ>lÉE9N«█sßαL≤E,═S╓V┴(o°╩}τNk═:┐╚╦)┌╟æ┼Θò┤LlÄ╙å8BuQVI>è$Γ5=":á~ñ*â»d-s{Θ╡╦Jòπ ╜δOσ╖ää┴S▀Äú`ìh]fxjαj⌡`Jπ╜)╙y_∩Æì╔╬╫Z₧┼╨ΩV┤Cd·g±$╓≤ΩƒV~\[c£]·╔>`¥2▀G╤@NjéCaü≈Xë!
  80667.  
  80668. ╙A1',╔σ[kôºÜ%Ä:í└τ╔╛σ┌├╗α▒
  80669.  ╢┼o{GRÆï8âWAjaYYn Γ┴    Kg6_ªxh╗δ4≥█¡┤▓ùß╩P·7m    │ö_¥ⁿ∞m¬)Çq¡B║q╨3∙GJ,⌐-─│3±(εmV╛°¬¬┌⌐a£₧ù╙o¬≥VH«:JsÉΩ ╦╙Kº~Æ2░═>d⌡┴8╦Lx┴3╕╪áEx┐├Æ!
  80670.  
  80671. ≤K+79ºä_C╙δ╛%ë3π╒∞╟╛┌╨╤╖⌠¼PB½▓╧u`B▌─*ZÆV/m^Z}
  80672. Σ┴Ph%Jπh[oΓº!!Θ╩á▓┤òτ└â:m░╒~7ó╧ÇkMâü!
  80673.  
  80674. ╥A3999╖£hi╣у#üRï╜¡σ≡┴╨▐╗▓▒[F ê┼oPDW┴ùv╫RA>fTW+≡┴
  80675. Qcf@ívVi╢δ7Φ▀R¡│≈£εÅÆ4Lme╙¬h αñ¬0% ·>GïpâQñA├n\<Γeô╥»G`Å =└ü╔ß6ûò«<(¢╪sΓchïδzà▓5è+FÄ2░{ÖD=∩╬j╓Wo╠ó╚çGu┐óó╛Φ¡τuP¡áπ\BBs|/,lπ`è)#tCVë├ï¡PiB@╓∞E!
  80676.  
  80677. ≥A39ö⌐ùê╕p┼<τö·▀√┼δ╠«≈ Bî»╥r}O;╕φ|aÆK>f^h æVg4Kπz\x»¬4║▀LΦóñ¢σÅçqarÜ¿e7ε█┼ZM£û;∞.▄·h╙}j%1πv₧╠@▄Fq¬)▀åâß▐⌐gì+ÆŪo
  80678. ╝┼NTºS|╪» █╙YºB)û┘│!!qΩ▌M╤G|⌠&í┘┘uÇ║Ω≈εΦ⌡si╖Θ▒`uAo<ë!
  80679.  
  80680. ╥A3?9=⌐è<=Äáü/ûeí─°╧φ∙▐╪╗▓╡PW╢╢┼!!3XU╞ì3W╫OE>gVV1OµÇ
  80681. Pk#│qGc»«z║╬Oí║▓≤¥ª^7ÖbQ k ╬┤hr¥╠╘|DÉûaÜJ╗xâI╡B ,Θk¢₧VÜ`ñ|▄É╔≤╧┤3ƒ₧ïây ε≤N╢h;ÉΩ0█╓IΓSaí5│{ÖD╤⌡]±wB⌠ÄπÉPp░»⌠≥á5¡αEP╝φ╖QOXuzπ`è~YJF^⌠Wß!!╜Æm_|S[┘ÆèW┌¥╗╤ò▀│Å≡┌£╧∞=µ(AR┐h⌡qÅ█⌐`σú┴╡º≤m» Φ├┤1«b∞6ëèÆ╢s/RFt}╫┐╥L╝╒╧UKnâ);αæXëcg1ó╧à>m,C j├╥Æ╩PâΓP&φ┐AìÉîR╥8xQ╬α3)â,▒╥⌠≈:àù╘ⁿï¡Γs╣lë⌐`då╗ú6 ÇG,Fû╘┘≡╓:}æ┌%⌐₧±Xá┌·%Å-!
  80682.  
  80683. ╥A3)!!9░è «║╓jé-ττ√═Ω╥²▄¬ßσTQ╣û┴hx╒û8ûLOG2BαÄ\&2Gª<`o╢ÿ4√╩G"íúñ╓╛Åâ|Q.o▄ⁿy:½ë╧[BÉçVb╝Bªmò╝SVI,Θa▀╠\ƒG}║.¥ ⌐ƒí╩ß%¡╛áI#Ü▒h{▒txâπ?₧∞Z≤r;═K▀4·9r▒¬½+√6┐ß├QzẠ≡σΦ°oR╛á╡VRTcç≡[]&9á,─╖ßLc/JK╘ä+╦Vÿ≈æ┐εg╔╗Æ╞╙e╪ëñcªGZai╒ ΩfK≈░eÇ~OΦƒìƒ╘ƒ@ë╙╓≤NαRaφ+σ$╩⌡ⁿƒQf]P¢^¡Σ(iùtû@╔MKgÑalüû_!
  80684.  
  80685. ≥P&XR══'⌐╛ë8┼>íτ█φ╩Σδ≥■ß▒AV╝»╒ivF▌ö+^ûKA..LZ╢Æ
  80686. Xr5ÑsA*╢ú%║╠G¡╛í¢σüqt■GW~l╙║d7¬ë╫KIàû5»Q╣h₧╝|9⌡>ÿ╠_»Vu╕▀ô─¼éΓΓ`⌡≥Å<║πBG╢ Φå ╩═JΣUoûÜ%╟ U╩≤_éLk╫q▄╢ΩWq┐¿╕═⌠╝« O¡≥º    %AGU&Å┼v·#∞%¼ìxJgiⁿáºnL√Ü╕å∩u÷»é┘!
  80687.  
  80688. ╥P&ox┤£&(«║ÿ-┼8≤╥▄╪ ├∙┘┐⌡ D¡╜≤or\p▐à9?²6`M\`
  80689. ╢ò\&[óh#Γª%ε╓MΦ╕▒▐π╟^ÿvTmtܽ3╛┘┼]ù╙}½ñxô⌡GJvî÷│3⌡+\₧%µ╛≈╢≤ƒ`£    £ÜƒpO¥σVPΩ`δå╤╩K┌°~ε%╟
  80690. +╣╫k╓Cz╙+╢Éε.┌╟├≈ε;ΦßnO░τ╝%JZarëσ$$p[v┼╩X╤╠3V*╖δBß3^Ç∙├¼Θ`Φ·Æ┘₧=┤∩┼SÅ%░h╝^,╤àH⌠^o╦L▐àäü═L┼╗»Å|τ<╝+Φ=╙µ⌠╓ehC
  80691. $W! !
  80692.  
  80693. ISupportErrorInfo comment:
  80694. '<ISupportErrorInfo> is a wrapper class for the custom interface ''OAIDL.ISupportErrorInfo'' from type information in the ''Ole Automation Type Library'' library. It contains methods to invoke the member functions exposed by that interface.
  80695.  
  80696. The type library contains no documentation for this interface.
  80697.  
  80698. WARNING: This comment was automatically generated from the interface''s type information and any changes made here may be overwritten the next time this wrapper class is so generated.'!
  80699. !ISupportErrorInfo class methodsFor!
  80700.  
  80701. defineFunctions
  80702.     "Declare the virtual function table for the COM interface 'OAIDL.ISupportErrorInfo'
  80703.         ISupportErrorInfo defineTemplate
  80704.     "
  80705.  
  80706.     self
  80707.         defineFunction: #InterfaceSupportsErrorInfo:
  80708.             argumentTypes: 'GUID*'
  80709. ! !
  80710.  
  80711. !ISupportErrorInfo methodsFor!
  80712.  
  80713. InterfaceSupportsErrorInfo: riid
  80714.     "Invoke the InterfaceSupportsErrorInfo() method of the object wrapped by the receiver.
  80715.     
  80716.         HRESULT __stdcall InterfaceSupportsErrorInfo(
  80717.             [in] GUID* riid);
  80718.  
  80719.     "
  80720.  
  80721.     <virtual stdcall: hresult 4 GUID*>
  80722.     ^self invalidCall
  80723. !
  80724.  
  80725. supportsErrorInfo: interface
  80726.     "Answer whether error information is supported for the specified interface
  80727.     or interface class."
  80728.  
  80729.     ^(self InterfaceSupportsErrorInfo: interface iid) = S_OK! !
  80730.  
  80731. ITypeComp comment:
  80732. ''!
  80733. !ITypeComp class methodsFor!
  80734.  
  80735. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]xOσöIi4[ªxh╗δ4≥█¡┤▓ùß╩P·7iGT├¼hí─╨KÜây½eúsô⌡^AUï    ⌡╖0ÖLaí@÷íα▌σÄWσg÷█╙<O╡£=-╦    .^▒╠≈±{╪oΓz│K│}-ö¡½+Jσ Æ≈¬jPîê═╨├"ì╟C5Σáû/1Fm|%Bá%═2p:àzºxπ╚}H`g≤» ┤l#ñ╘⌠ï▀╣·ÑΦ⌐₧╩τ-≡#%1'ÖO▀O?│²¬2à"╗▓░Ñ÷f┐Θ±▀r╤1ù[ênà├▌∞9m@a"v ╨╖╥F╤▀ôu++
  80736. ∩DE╛╪╩$cßÅ▀{c-_µ*±≡≤-[└╟yö╘`▒▒ásτso<≥░oCl▌²Æ▒╗*ëë╥¥ΓÑ∩`▒yÿφàí¼8Γë]O5╦ÆÖφ∞ Pº¬àó░Q⌡öæ@Ω]+ZgΩ╣|òUùΦ8éτƒ}ñ┐wù
  80737. rjΩ└╝¼C╕Ö∙ú⌐i"─ç,$ò╞ΦΦ¬?pvèp'╨▒╓D?╧┼φI╟ï÷+╦Ω:╠ Ö₧Kw╪ g╟Γ¢╙¥╤%╡⌠éàñ╬1│g2╖h Φ┼dτïî¢*äj=┐ztf▌¿Æ|╛9⌠½+rTµφÄu╡äìQ┤ H┘╙░║ó╪xpj└«ΩEh>à@`=    p╠!!Θ?Ñëû$6■╟ú°Uì∞╤╕|öWb≥Cu≤Ej1@▄≡╜₧$╡QXîl╥├T    Åù░Θ▀Og@3|εaöïτNτ∩-╘∙░,┼▓ⁿ5╚xd-\°úömσî¬╤^═∙WUI┬╬¼0&«┼ ╕⌡]∙┘S£░k╜┤uú½ï]ß6T╒    0┘wXDr½ΩccRqd╖±╙«Θi░CHsRêúH╟▐▀
  80738. Ç▓KA$\W≡s∞^8═æ▐6*¿&7₧µα⌡aσ«/{M«Éπ⌡.¬ó─%í(;sö╠&ít█ΩQÉñfÑñN 'h5»∞Θ£U ╪¡ ╖î ƒR═└iªçúxπe^öé! !
  80739.  
  80740. !ITypeComp methodsFor!
  80741.  
  80742. ├M)oxªå<-·Ññ+û7╫╒πû╛█≈╘¡·ôRO ¼µwrOEê─)t¢^C9.KC_&°ç&6_ùU]l¡δ0▐█Qâ╛╣Ü¡Å :Æg]+gn▐ⁿ}º╟─i\çL╙WºM▓Mäæ;&Kαhô╤Lêrú|╟Ü╞╢σöjÿ╝ö₧lU⌠╙^Jª(C;ïß'█═YµB*îY╧≡9h÷╔6»(εqôÆ├p|║╜╕≤σá√d▒ßíJ`C[Kg'Üε$xLQ┼╘QìñWh.BX▀àoìH¢░╝╥òu∞┐┴█Ä?╖∩╠I╦1╕<⌡4v╓¿y┼NTß└▀ùï┘Aò╙π≤L≈9╡e≥}à├╫ƒ4i]+f╪¬╢o√Y⌡'âHPwôal═Φ!!τ    $P─°»_#?Y r┬ZèÆ╒Tô≈Nj│ΦFìæ▀P╤><L╥µ+
  80743. 9╤_│╠≈α*µ·²ª█¥─Vÿ═ε,h7Ñ₧ëS┬$╗cj ¥▒┬╔!
  80744.  
  80745. ├M)!!┤èhi╕áé.▒&±╤»└╓╓╠▌ê≤⌐    │ô┴h{~W▐─.BúvJ,a{┬¿_if_│Hpe»╗z║╬R4ï╕║ÄÜÑu\┤uR au╬ⁿk=╝ë╘QM╒?ºe½`╣pÇ[ªsF<╒}Å█╒}ó9┴ö┬⌡╔αu¥£ÅÜsα£=-î.(5┬█;╫╠ΩD;─P▐V√,r╣┼}╟L.┴*Ñ╙ÄE`║¡∙≥∞Φ≤eR╝≥│aSi?╬gë~$yJ▀╠åñi9EE╘ä+╦S ╓┘σí∞d╟╡î▌─`▒µ╧┴¿u≤góòFÇCt╪F│«╖º∙q┌ö¿î/₧{l¼b≤'╨µ⌠ƒ    RmLE1½w¢σ(vä8ïèXMRtòtr═ "∞!!─▓ A>3NYr╞
  80746. ╚▌╨@Xφë5ñ·EÖ╒ûI╚-4YD2├ⁿ(! !
  80747.  
  80748. ITypeInfo comment:
  80749. 'ITypeInfo is a COMInterface class which wraps an OLE Automation ITypeInfo interface pointer.
  80750.  
  80751. ITypeInfo contains member functions which allow one to enquire about the structure and attributes of individual elements of a Type Library. Unfortunately it is rather poorly factored (much in need of conditional elimination in fact) in that an ITypeInfo can describe any one of the following automation elements:
  80752.     - an enum        that is, an enumerated type.
  80753.     - a struct        (that is, a structure definition)
  80754.     - a module        (?)
  80755.     - an interface     (that is, an IUnknown derived custom interface)
  80756.     - a dispinterface    (that is, an IDispatch derived Automation interface)
  80757.     - a coclass        (that is, an instantiable component class with a CLSID)
  80758.     - a typedef    (that is, a C style typedef which defines a name for a type)
  80759.     - a union        (that is, a structure definition with variant fields)
  80760.     
  80761. These types correspond to the members of the TYPEKIND enumeration, respectively:
  80762.     - TYPEKIND_ENUM
  80763.     - TYPEKIND_RECORD
  80764.     - TYPEKIND_MODULE
  80765.     - TYPEKIND_INTERFACE
  80766.     - TYPEKIND_DISPATCH
  80767.     - TYPEKIND_COCLASS
  80768.     - TYPEKIND_ALIAS
  80769.     - TYPEKIND_UNION
  80770.  
  80771. As an ITypeInfo can describe any of these quite disparate types, it contains a union of all the necessary methods to access all the possible information for each possible type. This makes it rather a large and complex interface, and also means that a number of the methods may not be relevant any individual ITypeInfo instance - one has to do a switch on type(kind) to determine which are relevant. With this in mind we have chosen to provide a separate hierarchy of classes to wrap ITypeInfo - see AXTypeInfoAnalyzer and subclasses.'!
  80772. !ITypeInfo class methodsFor!
  80773.  
  80774. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q!!GD÷≥D╖┘┼pFô╘{╟*ƒIë∙xA7í`Ü╪PÆG@⌐,▀ô╫≤í╩╩`⌡÷∙½²Q)╚    cçΘ:╨┌y≥O,╪V╒⌐m"▐┬l÷[~┼Ñ╚æ┘╟æùß»ßmY╖⌠å`UK!!╖:╞6E}âPû|α╚0i9EE╘ä    ₧Té∙▐╢ª!!º¥ä┘«'ѵΩ┬mfxj╒²sJ∩┤g╘YBⁿì█╙╔÷|é╞└┼M∙z≡,║^»Äæ█@`Ao( 4ç■"k╦t▄i┌ gWmàDe₧°o≤I╞í╦R"9t┐s╖╙╦CìµR>âµYÜå┼Ö(/_Ré╓-╡Iñ╪ÆÿI≈╫¢▀óÅ╬YòVÑóPX'┤¢ÇæjεEc ═┐óΩ└,r═è<æëΓp╖·íDΘ)^ ò╘±Eù⌡ò╖╕G╨█º/çΘæα⌡╒ú▄═]î▐f »≥╤┼É?DJ╔."╧╣Ö
  80775. ∞┼Ωd¥δÖz░█ⁿ<╗╙q[░8i∙▄öα╨^╬o│÷╛Ǽ╪ 1│g2ƒNßφ═B■»╒┤Ñr    Eè_Q)àá┬jΣ"¥╓MkOÅÉΦ%▄ñº`░u$╝}k┐╨▌ú1╦}{∩┤Ω<t¡K.OOT±6²`åº╛:.─≥╢▓G±≡Γ║iköfæ/└<O&T╩&ⁿ╜ÄJ!!╣Lⁿ?ƒí,dª·ττ▄-H#M!!₧uö₧┤Ñ┼(═∙½c╧ │dδ=g C∞∩ë@∞Öë⌠Q╠σG ⁿ7/σÿ@«╘    φæ3╫δz@╔ô[âÆP₧▒╢\╨E:╢,*ü4C╓îc06╘₧£╥πoóCIx.▌εi┌┘╘0├Γ<-`╟h⌡|c╨ä∙E'Ç(I 4i¡─ΦΦP «Qdç╣£rêR╤∞2╧2▒~:ôⁿ(╛c╠≈|╜┴█╢[u.z4⌐▄░1¡_╡¥├    íöR┴«┤tíìÆs«f╔╩¿·τåèù≡τg╤oú╛.╞ΘJ╪±UΦv,úJ*D╗;╦    φyXí*<Q∩Æ ö h⌡┌ë|ÿ_£│■«"√k6[#cù▀Σ ÖB∙╙Y╣@ƒ~êaO*²>7╙■,╥-╓Nó"┤╝φ.░í░█.ε<KVñ&┴íΘSB≤:/Æ5╙┌╔0πnïT|▄s╖?qz$P═└
  80776. ûÆRªï¿uß&∙¿┼y¢Ü⌠F,Φ¬à √τfεε╨>╚ñ`┤╜w[▀D@₧c▌û╤d╛▒≥g≤╘"└Ä÷íßc▄┘EÉ╪qåà¡╛╒,S<'ÿM╫kXÇôß╠Γ┼%╛4±)a≤ h7α∙ΓΘτ═Ö⌠5φ8èDeâc1!!i╢ ╤╠δù▐rÇ.»┤fj+ ⌡█ñ╧6=«╩f╟A┬░ á╛εw≈o]ⁿ┌:q╩%Ü`á|╓YóσlELIùa≥ä╖▌ΩûJ▐4l╟.'┌ï╪î&ƒ░Kòñ╣<┘H¼¥0≡ÑAVR▄╓▄╥'≡█∩╓%û-╦e╖┴ì╓ow÷p)CkⁿUoH─┐VFΘ│"4«'²δ¼¢?TX]╨yæE·ïï∩£▐≈3.æⁿ¢
  80777. αü|¡º¡j_└âñ ╦£ó'uA╠Φ╙p∩Σ⌐ª\!!(½go─]╚ =₧┬ï½┬Ä4╟∞z<¡ê*oyç┤Θüƒòpà┬▓çm·pƒ±îxà∩¬╪0M±╤s╧₧£½ïy<┤∞0▐V╫╕╔'ù°Φ╞Bí₧╜àvp2%&1nE5Ü ╨cÆ█>¥Xä░j°├Pτß≤Æê╡╡MÖäù«v│aπÇ0ïT±#YYnaS¢ÿ{ⁿ╧Ä╓ΦáΦⁿ┘╬@)Q
  80778. I[ói═Φ╜ΘO├tÑë4±í½ êf╨tV╠ígµí▒V Ü≤8└*    ëE.
  80779. á┬ôî1╔yu╣┴éIΩô╞3îΣΓΦ┐Σ╣&çm╞H▀8ÖôVrZ½wαZäu⌡πΘ▐
  80780. ¡Më√ízÄ#i≤≤(Θq@╜u7═Hbσ-"Qαh╞╡╛Ü
  80781.  
  80782. █-V╔²{╧╕òò.└M
  80783. ├¥┐»3dzC;ªÇ▐ç╝τ[ìº%òBπ±VPÉiε$öáτZñσπ├╡¡¼╨ *╦πµ¡^A├µê╧µ<≤B-╘╤z╝z┼╫∩|╦    Nn6y}M[fö>Ü_┐"»║7├µf>ß.âΓÇ≡=[mφ╕le    Äëα╝¡╣a┬.lNS▌<Q▓iñ╟ß║X▀N@ëº ┴Æ▀₧¢╨RgΦ(3O╖8>W╜±o[ⁿr╠┤πí78K₧YÇJô⌡φ<¢Ñ?╙å╢`=çC╓m¬G┤▓C¢@∙╙"Φ╩q:í wèkOzXu{╙7╞sk:8╡Ü≤o^+KÄ≈▀R▄f┼½7D▓▀ⁿn#%3FúIG╕"±ä)╜₧╣ò²╬²[ ÄÇ+Hq┘┬|)D²ô°¬MrPA▄EX7¼-≈¥║¿⌡ ▒H▐│c┘ëñ≡r╩9!!8╝T%hσ¿║
  80784. 2äT├⌡τaτ≈5£»╥!!Ä&TS╟dºzIk½≤╖@j▓╬Ñ╡¬ⁿ:σnC∩J─ ÷o$└¡D⌠¼╔:E!!Je¼²H╧√ó&f╖Ω│SÉl@i╝≡ÑMa&|≥>DúIƒ#▀≈èq>?⌡ka╩ú[▀+╬! !
  80785.  
  80786. !ITypeInfo methodsFor!
  80787.  
  80788. └@#0+╖á4┐ñÄ/ùeí╒δ╚∞╥╠╞æ⌠êVN╜╛╥;zF@∙ì0V═M$xpZe ╢æO<f_│j>╦ΘΦ╫T╝▓≈╙╖µÿ[@zh▀ⁿL6¬█┼J[║╛x¼Fñ5┘A±T[7σ$É╪êJq∞#■╥╠⌠╞Ñp£MêëÆl½⌡F╗ sç»!!█▄ZεW*▐╖|₧GÉ∩Jτq[∞ ±π╝W`╖¡∙≥∞Fë≡dN╝≤í%HCX    c ╞gë~YtY╟*ì<»î{HjhÜî*åS┌¥╗╤ò▀│Å≡┌¢╒µ"Ω.%6C╡rΩ$}Qµ²¬2à=æöç│ƒ^ö▀┴¼┤ ¼"║^»Ä║▓p+&Z_4π#å÷!!%é ¢M▐M#Äre₧ε9≈Jt
  80789. ê▒δ@>(NYm╥╤└▌ÅΩX`²í$⌡ⁿíT█ >I╘±(
  80790. 9▓m¢≈!
  80791.  
  80792. αW%4Éû",╫├σhñ1≥├Ω▐╛╓╤òΓ█æJS║Æ╬}|┼î7QƒM9.O[nOΣäVj0Jº<Zg▓º%≈█L⌐ú╛æ∙ÅçqarÜ¿e7ε█┼ZM£û─*■æ⌡RN4°$ï╓PÅy⌐2└╥╧∙╧ígüÿ█çt
  80793. ε┼|mîD5R¼█∞∙~─do╪F╩·#g÷çw╠oÇ;ñ▌Å}╜║²∞µ½±6╨µá%R]&Ñ#═3Ufc∙6∙2óφo)W ╒ò'ÄHƒπ╘°²o≈¡ä▀ô0▓ú▌╩E%╡j∙=á▄¡2«?¢Æ▀╬╦@Æ┼à∩Q┤p⌐|Φ'╞∩╕╨}VL}╝wç $v╤░cƒOVföfaÄ■u±$P─╗»Y4?N
  80794. >╒╨╓╨PÅφ]&≈√L£ÜÆW╤?1DI╠▓IiT»$ä■╘╘N╕úß│└é┼[▄²─q}Ä╢░7Γ¥CR;╙■▒└┴e1¼ë)½Ä░]Ç∞·%╛    ]dε┌╚RîΣm╠£«Qå¥ñ= )Ä╣½⌡0┴⌡╣0Éêk╗⌠_YI└¥▒┬ô?PH┘?qÇî╨O0═²!
  80795.  
  80796. αP3<:▒¢7:╫├σhñ1≥├Ω▐╛╓ƒßç┬ÇrwïëÇv\W█ê7\ÉP"kAn ≤ê\ta\π}G~░ó"∩╩GΦ·≈ô÷╓\ û}M.a╘ⁿEï·⌡u|░ügα.▄╣ ∞]J=∩p₧╩PôL4é(╓üÖ╢°¿v╚ ïÅüu╗σRWΓa~┬∞2▌╫Zπ)├Mܵ9tδ┬8╫QkÄR█╡╖Lq≤╜∞∞⌡╝ßrY∙ΘíJiJZg&ïú)1[X╠WΣ%ô▒\D2EC¥ÆoäXô≤┼⌠╝`Ω╛┴└Å-íú╦ Å%ⁿ~σO`WπÑ)╧oQΘè╧╙π╡!!»▐└⌠G≥"┐+⌡;└º▌╟C{AEσ%å⌠9pâ1▀Y┌XBPfçte═∩:ú L┌ºⁿR?.
  80797. jû▀┴┤.oüú^+┤⌠    ÅÜûI╩)*TéΣ,}âiö■╤─ ╛÷▒╖┼ÅïHòT¼─LX-┤¢Ä╬j╣jcX╔╗╝╦─,túâ<ó⌐Σ@∞░╗*éL|wÄ╥xû)ìΘ2╠╡╕WÅÆQª*_ï¼⌐ü/╪■æ2ƒ¥O»÷bI└¥┘▀ü XF▀..╙≈╩Y▐╠≥
  80798. òα¿{Wºås3àD]╙▀`\°2Fφ╨┐≥¥Çu░≡£çß┌Rh└t zèH⌠╢¡-âÜ╪░┐*\£H6₧É¢x;¿m├üQc    ╢╔è]▒╨ß/╔D╫lz╝╩!
  80799.  
  80800. πE46╢è7D╨└╬ù6≈╒√╔╛܃≤¼≈áW╖╛ÇivKS█Æ;@╨L/vOVy≈ì^Kc5@╢nPo▒δ"π₧Pñ▓╢ì■┴^â|[@gn╬╣4»╩┼% ñ5úVÑi╨εTJI,Θa▀▌XƒJq¿@=╟å╤ ╬╡gì▀Öûz╝⌠M╢ h┬√<╤ƒSµU*é╖|₧G°╙l╨Kl╒+┤╧├Mg¥º⌠╛ΘÄ⌡lO╝║≥1qRGd'Ü≡W6cJU⌠Yá{π▓L}9Q ╪Ç<éY$ä⌡╘!
  80801.  
  80802. ┬V"!!=ìü!!=╗ºÅ/▀±ßß╟╤┬╦╨¼▓╖ZJ╗ßÇizARÆö.D╕]Np.KC} ⌠ïs3d▒uEk╢«`╖₧k╛╕╝¢╖█╫WLot▀òc!!║╚╬ZM▌_╙p║K╣y╨·[=íG░≤ô@~⌐(ôà╤≈▄░vîM¥é╙h½▒EAíemç²}│╡2ì(FΣm %╞U╣°G╤Vj├>╜╨├gf╢»∞√╔╗αaR║σ·gh /<0o<│J╩">zA_▐çQÜöWfVX▀ôcµ0k ÖΩ▒≥\ñ¥┤Σ╛t⌡±└╦IZa{j╒G≤`bóÿ\╬fUπÉ╦┘╬╧Xì∙╟∞ »Z╙)îY¿ìæâ O{[H1▒$ç≤.d¥8┼╫
  80803. DQvèt ▄¼u╩?+W╞¡°Y{zm,W≥P₧─╓M╩⌐G▌ûwîÉôA₧%6FA╦⌠1¥²!
  80804.  
  80805. σK$8=¬¢3=│ªé è-╠╤Γ╬√┼àò│≈¿ZG╥╤⌐9RFE┼ü,ûQvOcgr≤¡[B)L╢qVd╢¬4≤╤L^Φ╕╡ö≥╠^ö{Poi╘╡c5ε▌╚\æÉx½Mó|ä≤_7≤$ï╓\▄/┼0╓ƒ╞°╪α|ÄMïôû<½≥RM┤e;ïδ6╨╦VßH*╚╪│9iⁿç$∩gCΓâ⌡º8≤ú²≤Θµ┤NS¡σ≥
  80806. dRn;¥gë~4xIV╠▐Qî│V`|jx├æ*ºS┌░╞░∙sß·ê├₧7╢µ┌I╬2K╣x╝{π▓j┼~H¼ûä╙ï╙Mû╙╦≥Q║Z╙_Θ6àΩ²╦Im H$▒%Æ■>`╤5æ≈*dqV¬TEƒΘ:±FeS┌Γε5^?q├┌≈╦V    ÆúU,≈δAÜ╒ÆB╙%<-{½∙7C3₧x╫Θ▌╤½┤°Ñ╬Åà«]ªüW0»╥¢╬j₧FMX≤╗╝▐à9~à┌*▓ÜΣ\╢╣δ&ÉSy5éôεRû≤wÅ¿│PâÅN¼6 N┴─═¼C╕╬â;Üü
  80807. ε╖i!!ñα┘▀£_b┼(┼║┴O.æÇ≤Oæ∩ÿ)Kñ²1φ  α₧O[∩7B╕┴¿≤╥I≤:╖╙ƒö»┘EQ▄i_ú!
  80808.  
  80809. σK$8=¬¢3=│ªé è-╠╤Γ╬√┼àò│≈¿ZG ▓╞Zq[S▄ÉdÆGG/~OZd▐Ç]j#]╬:(âÑ3φ█P@⌐╣≈┬╓≈(çqr    lD╒┐x?½╟╘X\£¥H5íA╝xô╝R@,αmæ╫W¢`ñ|╫¥└π┴Ñ}£ ïÆ£rO¿■E╢h;∩àZ█╙ZΩD!!╪╒│9iⁿçj╟Ak╔)┤╬├Mp╢á∞≈µ¡≡ ^ááª%x.K½8╩3n=]╠──ßwb(F ╬ë.ƒ₧∙┬╒ûα│ç╦ƒ,ªú╧└w"&¼y╨vóªa┼^¼ÉàÜì┌[█╫╫πß5╛+⌡<àµ√▄UzA8▒2ƒ≥ `ƒ î▓r(ke╞thê╗8µ'Y┌ΓµDq4E>╨╦▄▌FöδY$≈■GîéÜU═l,XEQ╨⌡71à,ÿ²ÿ╫¡╢Σ╖▀é┼X▄L¿ü
  80810. *⌐₧Ä┬)¢cj·╝╝╦¢R■ƒ4ñìα@½≈╙(ìD|2╔╛òtæΣwüó⌐\àƒ«9@æ¿«╥,æ±₧~╛╡o5╘ÿ;A6╕√╩ç╒Cäz"╞≈╫B9ï╔≡NÖ■▄`QΓ╙&¿!!2·╠uFφ>
  80811. ╕÷┐τ╪I░_╩߃┴╡╒o²ONS¢P÷╕╞H¬¥┘╢╛-[BëTU5₧ªÄmK╝mïüAa éôε8╓²«y░u ┐r∙█└▓≡psjª╣≈RnàM    iX[╦(¡a╛ëÆ;.δ╔í╢G│⌠É╜|K¼fG∞csÑP5]╠<ⁿí┌vqá26╒z £╝aδ√░▓GÿxY'|gF≥f▀⌡╫gó≡)╤&Γí_╒╖·)╦x)▐╨ëk╝Ƭ∩ª£tσ5 *≡ÿ\o«╨E@Ω╝{ì╢!!╒æY└·4πü╕?\╧Y■&)ï$C\Büº=HeSOáα≡¿ºdí]    bíΦxÄèå~èºBh<è│zug╔Ñσ1ú,J&'┤µπ┐{Yáπf?`ä╣τ⌡Wß±─ ╡(;'└·,Ñcµ▒╥┼█▐y5pl.»╠ª"¢X²╘èδ├C╞÷╨╡▒öeτ{│»╙ù─.═π|╓£∩r⌠iú»╦≤îⁿM╬IO%&óQXJ+▀[ª5ΘfM
  80812. Üu :~⌡Ä╧rkδ▌┴D½Rê¼ε∞[╦Q`:╟ª¬`ⁿqÇ╧&¼pê6ÆaO*²>╔δyIù√J₧öÉÆkLæö8ïⁿÜslÿ┴┐αuTª2I\Ö;≈≡δ└0┬mS╞[ÿI5v5πΓ#│╛A╬W½üz╨╧╟▒┌─╕=:Γ╛╠=≈╞}ß═╨%╬ñ` êOûp.T¥u─ç┬0φπ╝VΘ≤/┬Ñ█ѵ├°Cë╧[¥çèú╚+5xƒ¡)4σΩ½═√┼gΩl≥`╔∞M7¼Φ╫+±≡₧·Ö=1εP±*åc3%N╗    ▌╤╢ì╧eâ3Ö┐%[,▒£µ▌1≡ÿk▐Iï┘▀1╦n├⌠8╝$w8¢º;l╪v╘Q¥w┘]êσ"z╥c3≥¥ùêôiµy╛Sr╔+9╪╪─½o╦á|ïó╜=╠4╡│&ñ╢|dK╦à┬┬Sc₧╗ê╛@╒O┤wt║ êoΩ║cp╓{]4╜TnZ@╗╤W■░?Ñd╠∞¬Ç{H╓n▐KÇε≡Θ┼ì╛vA⌠à╣Ωì2Ö
  80813. Ω╘    9≡╪Ω[√£ñ!
  80814.  
  80815. τQ)=╖î=αΘà$ü:∙╣àÑ╝÷╤╞⌐≈╖B ¥⌡UPlsߺ~TÿM>f^m°é
  80816. Pi(¬r~¬«`Φ█Aíí▓î╖╬^â|[@
  80817. │»}7¡└╞PMæV╧{║F▒xé_╝XA=∙*▌│3±(ÆH/╓₧┼╢╦Ñg«æÿ╖y¡½M¼dc╧╛z│╡6ÄQ&°F╩┌#g÷¥8╤Gb╞d▄╢Ω-m╝╗Ωφσ
  80818. «!
  80819.  
  80820. ╞A39:6░Ä;'│ºï£/Σ°µ╬ñù╧┼è▐¼Q»Æ╬vP Æö\ôZ\G2[ ùMcfπU]|¡á%║╩JΦÉ▓è╘└
  80821. û}P    `gεÑ}7é└┬╒û}íG÷rûAΦYJI╬I▀╤[ûGw╕@+┴ô╙µ╔ñ3è▀Å¢yO╝⌠TA½vi╠éY│╡6ÄiΘl∩:╟m^╞╘l╞Ao╠3±√åPW╝á∞ Θí·ghá≡╖& g8a[τ1∞$Ly²▌ª¿['v\╩╡éXN√Ü╕╤òZδ»ò≡┌+╗≡└┴3K¿6╝]Qµ┤që66åo▄∞∙π╡!!╟└╠⌠Vß<·x⌡7╞µ⌠╙@a]Z(²#╙ªt%╕å^┌4H@)╠ dÜ⌠'τ@{1ó╦╤D46LYw╪ ▀▐╨@%ü∩PG▌!
  80822.  
  80823. ╞A3>94üü&;ú≤╠'Ç2Φ╨»┼≡┴╘▄░÷ J▒¡╦r}L┬ª-Fà{H&@Z^nU╢æ<Jr4k»p}k»«`ΩⁿQ║Ö╢ô≥ò\╡gJ@a╫╣-"╣µ╥]A¢ƒL5╛TÖoö≥PCdRê&»╠PèC`⌐@qô╗═α├½v╚ù₧╙[
  80824. ║╒[Hçni¢ºz₧╥Z≤I ╚╒│9iⁿç[φo.╧=╗┘ÇP4ñ╝∙ε≡¼┤bE∙⌠║BwCVo$ï¡zZ%9á? 4╣öuY||s╔ò+ê[Ü░π╜±n≡┐ª╚Ä╣∩∞█.Ci╒ò4}Q▀±e╧c\¼ ¢îÜèô%±┐¼Åy²·B╧Ω╠▌⌠3hMG+·>¥≤a√]÷'ΣTV^╞BS╣╔úO▄░╦[=K{Üw┤╗░-=Å÷H≈▌z½º╒╬+DR?├²!!OP√■Æπ▌╕ç▒ú┼ÿ┬XÆ]ñ─V^+▓å┼S█=épb⌡┐╝ç₧R■╪A═σÜ=M▓≡Θ=ûA|wô╫²Lò╗wä╡╕GƒùSπiK@É¡░╬;╒░â:üêXí╢p6α┤┌╪ü ▌59─²¥'Vó■φOÉα▄`L┤▌?∞5╢╥"!
  80825.  
  80826. ╞A3>:;▒é7'«¿ÿ#è1╗öΓ╔≤▐█ò«╨╢GQæ║═~)F≡ù*@╣^I/.KqxΣÑZU2]¬rT0Γ╗Θ╩P$º┤äèσ╞╫dZFe╓¼N=á▌┼A\╧VâbåF║m│≥EJ,ít╜═MÄjqá┌₧╞¼î░Q¢ì│ûpê°[A╧
  80827. c9▓²:╚▐KΓbîv╘ⁿ&d╣╙p╟I┼+ò╙ÇQy╢á∞ ⌠º·(∙φ╖
  80828. jB`rܵW^b╞╟ë╡z.B\╩ä+╦X╓Σ┘╜╝sß╣ä─î;º¡ñcóo^b:1ÖO╔#@▌Äz╘iXφ
  80829. Æ┴┤ï╦lö╒╨δG·1«bε=ìèÆ╢s/RFt}²8¥≡mhö9ûJôu++
  80830. ∩[oÿ∩ú(h·Φ»G)^ P╫█₧┤.oΘèg%óδt▀╖¼s∞fx@b╓Γ >óxà≥╓╒B┴╨ÿ▀ó░─JêeαæKE-º£èï&ólaR╗«┤┘φ:}ç╣#⌐£⌡LΦöæ@Ω)K8ôεU▐s¡╙}╠╖ƒG₧ëoª4&èÑóêr╝Ü∙|√φ'lêΦm6╛ß┘╟╒
  80831. E@╔;'╠φâY8▄╧∞N▄╖╧)Qª╦<∞n6⌐╩f¬9W∞╓≡í┘L╥'º┐╨â▓╔ ┤geìYΩ■ÇNⁿÜ└¡ò)E⌠1!
  80832.  
  80833. µA3< 6º½7:╣≤╠#ï;Σ╠éªùò■█¡σáA½│┼;/ncⁿºwñ|j|^@~Γ┴_&/A╡sXc¼¼`ε╓G@ïÿÜ▐╪═ö`.G▀¿K'á╩Σ\[û^┌Vx½W╛röO╛<%dRêx▀╬I║Wz»$9└æâΩí╩ÿ╣Ä¥+½ΓT°=J]╖┴··l─!!╔HΩ·#uⁿ╒6»(╙:╜┌├cqºêφ≡π"¡τc∙Θ╝}E@'Ç    ╟#r┘δäó}h/@╖δF╡J░σ▀╗╪d≈╣!
  80834.  
  80835. ╞A3< 6º½7:╣≤╠#ï;Σ╠»▄ε±╩█╜╓á@@σ√╨kU]X╤á;Aö2.C,kAb≈ò+ff¡j\aºδ4≥█'¡úæï∙╠8äwI.m▀¿e=¬ë╧_üûVVün÷rÆ ∙R[I/≤eÅ╬\ÿv╡@(█ùâΣ╔úvüÜë▌e├¢>-èR/H╖├₧α`⌠U+╧^╓│
  80836. dφßm╠AJ┼,▓öε.┌╟├≈ε;ΦßnO░τ╝%O[&;ǵ|%9á~÷ƒ╡d-vb∙Ñ
  80837. ╕yH▄░┴¿┌tΩ╣Ñ╚ë=ⁿ╕ñcªGZai╒ ΩfK≈░eÇ~OΦƒìƒ╘ƒ@ë╙╓≤NαRf·o÷<╫π╕∙/hJk#z╗}═ÜG »'ÜB┘XHLuçlië╪4∩H6!
  80838.  
  80839. µA33+ïë(╖¼ƒp┼1α┘Ω▀ô╜╢ùƒⁿ╢DF¡√┴;/[S├æ;\öZ@kZWj·ä=Vj*JáhZe¼⌡`⌡╪á▓≈ù≤▄\æ4Jk ╘╜`7¬ñ¬0EÉæg╜╣{╨⌠T=Γaû╚\Ä 6┴jQ╣√▀╢▐º`Æ#₧ûûoO╗▀VIºsJx¼ε>█╠≈l*┴v▐V√?!!σ¬½W@┴2┤╧├)≤á∙≤σΦ≈oP╡σ▒X%}&.╬ú#DAY╩╔╣╡Kd2Dqö∞EΓY,ù²╘½╝;╣·Å╠ù;ªú┌╒yfxj«{∩Z^∩┤zÇ7¼"⌐«í¬■Zë╫▄ªL±j·h╧2╚Γδæw,Z(H0⌠$╙ⁿ(|éæJΘMWfòDo╫╗╣e╞Γ≤#=YP╫█┴ÖE┌úUjºΩ]┼╒æ╟#-Ba╞Γ!!.¼"·æ▒┬#⌐╖╪▓ï╤û»|ù½wr▓ÇÄ
  80840. ï$¿u<X°É▒├└,?·≡E»Ü░LΣΩ■%àW2«≈╙F╖α:ë┤τÿ£T╣å║τ┬╨²ò-╠╟I(α╣
  80841. wd║┘▌╞╝ ┌.═₧╟Qí⌐÷X▄║▄9½┌²+n·σgMµ=≡╓┐≥╚W╔▒τƒô√¥Taù    d2áL╦²═n¬ÿ├¿│+]X┘`+╫╕┬e6!
  80842.  
  80843. ╞A33+ïë(╖¼ƒp┼8Σ└╞Φφ°┘√┐ á@╝ò┴vv[ ÆçSÜZWj~vVf&≥█^IK#Bèx>╦ΘΦ╫T╝▓≈╙╖µÿ[@zh▀ⁿJ7║αΣJgô8Æp╜  =¥ΦY@xεb▀╩QÖWâ-|▄É╔≤╧┤3ƒ₧ïây ε≤N╢h;ÉΩ0█╓IΓSaí5╖|ÜDI╦ΓK≈nZÇÄ╧ù@w▓ó⌠╛╟╝▌DOûµ£ `Uf [╬JúWp1ëWìQ╩ß-JBτ┴╗u.│├σè╝+ñ¿å▐Ç┤ε╠âh]bRCⁿ<╝O4ó±)Ç-¼FÑê¥│ƒ}▓°±ªA┌=┐x¡^»º╕ƒZ)F T▒w╙╖m%╤tñA╩ |NúMB¿╔╟Jo╪ÅΩZ>B╝s£┐│)lΘ┐J#Ñδ\₧Ö▀T╩(;QLÿ░7*₧~ô╗ëâNᬵÑ▀ÖüÿO»ûA7ñàÇ╧`≤ q┼¡╡┬├xÖî-½ü⌠w¿⌡!
  80844.  
  80845. µA338(¿╗+9┐ÅÇ+é,╗öµ┬·╥╟ò╙ÿ╠b▒¿╫~aB┌ü~ñ{s\+≤Æ Urf@Ñ<Zd┤ñ+≤╨E@╝┐▓▐╘α1^╕vTmt¥»-½▌ΘTXÖ"èpêO╖zâI╡B ,Θk¢É±(╞i ôéΩ√▄¼GæÜ╜ƒ}╜▒K)╚    RÅ ?Ω╞OΓg#═X╔V⌐p!!╩πOφpJÇ1┤╦═)┌╜²≥µFűtu┤≡╛>uCsg5¥Pú>uJHëΣÜ¡mt,Fj╓Ç(ÿBå┘▄¿≡U²¬äδû?▓≡çdÑl    ¼p╚dZ─╜h╟~·Æöûπ╡!
  80846.  
  80847. ╞A338(¿╗+9┐ÅÇ+é,╗öµ┬·╥╟ò«█¿COïó╨~UDW╒ùdçvI:boJ{
  80848. ╨ì^uK%╩>cx½╜!!ε█MΦ₧╣ê°─^â|[@Ie╬ò`"ó²┘IM│Æfµ
  80849. ÷pò⌠^KI7τ$ï╓\▄a[ü@3╤ÿ╞⌡╪αdÜ ÅïûxO¼ΦP¬eJiç∞6╫╔Z⌡Bª2░ÜS▄⌠Mεv. ó╚çGu┐ó╕┘σü∙pPì∙ó$iGR._Σcè~ xAmë├âªWh8E╘òoéTôΦ¥╒ûì╙║┬Å*êú└█Ow¼p╚dZ─╜h╟~╖k⌠Φ╤π╡%±┐Ö≡Kµ%╗gí ╤π√▐J3[8Γ"ƒπm4┴t¢Y╨
  80850. Epéwoƒ ╜gO5÷▒Ω[7zCh╫╫╓·E
  80851. îÄ6!
  80852.  
  80853. µA338(¿╗+9┐Çé,è⌡Ä»═≡■╤┴╗⌡áA.╒╥éZ}[A╫û~FƒZ+`z_µä7W`)ºy@i░ó"≤╨E@╝┐▓▐■┬ Æy[za╬╡b<ε▌┘IM╒çVaªF÷nÇ XI=σ$û╨]ÖZ4Ñ|╟Ü╞╢▐Ñpìë₧ü2b─ÿxJ«yJzÆ ?╫▄^σM*îK╒V╨"b⌡╞k╤o╬;±╒ìPqí¿∙²σF╝φpY▓Θ╝+acrçτ(1FCë├╩úX~9GÜÇ#ƒRâ≈┘°Φiß¿äìô-⌡Γë▀4╤ò uLτ±o╧σÜäï╬Å╫û╥εK≈p╣j∩s╟Γ╕╩    CmF}≡4É≥>v╤ ùKƒTCo╞inÖ■'σ &YêªΩQ84Cw┘ÆÆ╨BFÅφYj▓τ@îüî ₧*7Bé⌠--ÿbâ■╩╘»┐┐⌠ªßª5⌡DαîWS"αÄΓyó"┐g`Xíπ≡▌└3w╫¥)│║⌡R%╜Θ■ài}'│╩∙┘α9Ñ⌐⌐Qì₧Uπu_Q═─═¿┬⌡£8╓ÇO╙▒    P=║±±┼ô ┬(.╞!
  80854.  
  80855. µA37:(╖╒r$┐ñà.┼Rï╜¡φ≡─╚╨¼▓▒[F τΓHGzÆû;AéSPja]bαÄPh!!╖tV*üä║±@
  80856. ¡┤ú┘ΣÅ;âYQ}(ôⁿ`7║┴╧]╫{∙{╟_÷m▓ΦCb(≥$â│3⌡RV┐.■¥╙σî·.╚/¼»í<½µ)╚    ~ÄΘs∙┌K╩N?▀Ü÷ h²çhαQz╥╛╠É4úîδΩ≥+ºΣs╘è█4GUAK=₧ú1}ZUñ}!
  80857.  
  80858. ╞A37:(╖╒r$┐ñà.┼/├╟√▐╙╪╧╞Σ▓╡qP½⌐φtc[;╕φ|bàVR+z^&O▀ÅVm#╖tV*à«4╫╤Rα■≈ô≥█ô4Q.t╥╣-üΣÇVJƒÉ5╣Q╖mÇ°Mx⌡lÜ₧KÖAqÑ9┴▄«£í╩ß%¡╛áI#Ü▒h{▒txâπ?₧°Z≤l ▄LÆ{ÖDÉⁿq╠.╠0┐█├Iq╛ºⁿ▓ìl┴¥    g╢⌡ª7BGua9,r₧(≡"\@@┌^û|α╚V.&│▌9éHâ±▌°∩uα╣Ç┴ûd⌡δ█ ▄;RRΣ<∩ cP≡╡)┬~O■L└∞∙τß[₧┌├ªK·1╢bσ─δ⌠▓p!
  80859.  
  80860. ╞A3445í£hi╖¼ü#ü≤╙═▀Ω┼±╘│≈╢    ¡╝ΓhgZx╙ë;A╫\i+vuRf
  80861. σ█^ZK'Wì}^o▒δ0∙≡C¡ñφ▐τ╠2ÜqMm    ÿî;╕╚╘\╪V║cíH│=ä    ∙h ,╧eÆ█J╘ 4í(█¥╟╢├ª3£Ü█░S"ε■UNºc;ò²2╬╧Zπ-╒╬÷msⁿ─}╦Tk╥q▄╢ε.┌å╩█╙3ä└ cå≤ªdJYKA7Ü$Γ5b=ú~ñx▒¿WP|OC╘åoå_ƒ⌠¥╒ûì╙║┬Å*êúδ:√7}K₧oΦZ^∩┤zî1ào≈║ÜÇΓÄ╪╓∩E·4·b∩'àΣ╒▐hhBZq£]·₧D^₧!!ïsƒOQjüneë╗<φo╪í┴V<?YP%╗p╖É┤.kΩè<╛φ]èöô═8<SA╬¬d /öé≈╠ÆV∞⌐⌡í─Ö╧₧K┤û ╖¥¥ï.║mt▒α▌ñ¼bÆû*τü■B¿≡ 
  80862. éL|Zg!
  80863.  
  80864. µA3445í£/ù¼ü(Ç-╗öΓ╔≤▐█ò╜²░]Wσ√├VrPx╙ë;A·5-hOU@|
  80865. Σ┴W&']▒}J*íñ.ε▀Kí╣░▐π╟^ÖuS} ╒║-&ª╠ÇTMÿû5íE÷iÿæ;&=Γaû╚\Ä}¿2╟¢┼ ╔ñ3è▀Å¢yO≥▄riÇE8Rª▒₧╥ZΩH+é╖|₧Gσçv├Ok╙│╧ùV4░Ç∙≤σΦΦ6╨ε│vV&╣%╤3c]Q╨W├¥√nBT⌠Ç"ÄIL√Ü╕╗╥`Θ┐Æì└c⌡╟■&²!!»<≥
  80866. cÅ█╙hWΩF╣äçá▐E₧┼ƒªO±9╛+≤4τ⌠∞═4GdJ} 6₧≥>%Æ₧V±LGp▄ cá·-═ (Y█Γ T;GmîZ▌ⁿ╪Iô¡1@▐²Zïç▀âlct#é■!!}ôió⌡▐█¡╢°¼╩ë╟Z╟╣ïPD7Ñ₧ë]ª@─\h÷╗úÄ╞0}¢ƒ/│╥░oKÑ╣τiƒcw╟└Uª┘⌐5ƒ│»£ÜK╢=E@éατ└:ΓΣé7ÿÇFπºvd¼µ▌╬█YBy!
  80867.  
  80868. µA3(0>Éû",ôºè%▀Θ╞Ω╩Ω╬╧╨■ƒ╧:₧╡╙lvZ╞î;╦vp3~^ze    ∙▀^Kc5Z»heñδ)⌠╚M í╣░▐π╟^┤[s@Ab╨╣n&Θ┌Ç~Mü$ûA╖S│T₧≤I5Σpù╤]╥╞mV║Äâµ▄öZå É█Åe╟ßGpïn t┬╡n₧÷k■Q*σQ▄│#dε≈w╦Lz┼- ▒Θ-g╢ó■╛╟╝╞eZì∙ó+k@ZQ&:£σ)aJ┘∙8äºV7|S\ε¿!!ìUL√Ü╕å∞q╨ôÅ╦òS▀!
  80869.  
  80870. ╞A3(0>Éû",ôºè%▀Θ╞Ω╩Ω╬╧╨■Γ╡gj▒╜╧!!3XFµ¡0Tÿ2.C,kAb≈ò+ff¡j\aºδ4≥█'¡úࢱ√Æ]Pa(ôⁿ`7║┴╧]Ü╙}½òR╜A≤SE ;⌡$ê╠XîRq¿@>╩╥╫■╔αaìÜÆàyα£=)╚    cS░╩δ≤kº~▀K▐≥!!m╣α}╓pk╞ ¿╠åmz╡í░ôèo┴¥[U╖▌≥ vORc6╬∞71GB╠┘ÜñV*%│║ ₧N?╓┘σí∞d═┤ç┬╨t⌡≤┘=µ 1[X╤òM5Å█£{R■ïǃ╬╠\ƒ╒─ΩN«R8¿n≥&╔≤╕ÄOmX    [9▒ºε=`╕:ÖAòR/    ∩^sê≈3ú+J╔«µS;F╝!
  80871.  
  80872. µA3(0>Éû",ò»Ñ'ò3╒═ ╔ñù╓█║≈╜.╒╥éKaA@╙É;┌e$}LVyOΓë:xîNw4Γ╣%Θ╦NΦ╕▒▐■┴
  80873. £}P.t╥╣-üΣÇvJƒÉ2╜æxä3∙W{(ΣKÖ≈TîN@╡9¢█â√╔┤{ç    ╤÷∙!!íσR╢h o┬√;█ƒVΘE*╘╙│7dδ╚8└C}┼; ₧ε.┘╟Σ╛≡4¡≥TE⌐σ≥o/E9c4║≤p+φ Γ#«ßWh+!!░Φ<ÄV╓╫╘¼╬dΓÄÿ▌ƒ│╩─├1.Yⁿu≥ qGóí[┼ko⌡¢█╙₧φM¥Γ▄÷G║Z╙U±└ß╠╞
  80874. C)YE(⌠Z∙!
  80875.  
  80876. ╞A3(0>Éû",ò»Ñ'ò3╒═ ╔ñù╓█║≈╜Sì╛╞OjXSê─.`ÆYp3~^>f┤▒ Pp'[ª<*ïÑ6⌡╒G@╝┐▓▐╨╩,Ærj~e⌡║D?╛┼⌠@XÉ^┌Vx½W╛röA≤W0Σ$╝±t▄Mvª?╟╥╘Σ═░cì    ▀Öè<ª⌠VºcröΩ!!É▓5è+FÑwΦ3└M═çG²Qz─<░╨ÅS╢║╩√µ2▒Σes┐╔┐Q_E._Σcè~ xAmë├âªWh8E╘òoéTôΦ¥╒ûì╙║┬Å*êú▄▄ 0ⁿp≤sóí[┼ko⌡¢╚╚π╡!!┘╗»ï(¥N&│y⌡&─δ╕╠BjN
  80877. Eg▒?ü≥>p¥ ▀ƒVMqé dÜ⌠'τ@{1ó╦╤D46LYw╪ ▀▐╨@%ü∩PG▌!
  80878.  
  80879. µA3.,(í«&=¿─µC╟∩╟°╔∞ù╦▌╗▓∙gzÅ₧ßOGzî─,WäJH>.TU+°ùRo(Hπh[oΓê╫₧mó▓┤è░▄\9Æ`j~e√¿y µÇÇTMü£;∞.▄·hα_ °tÜ MêP4░mV║é╙┬╒░v⌐ïë╙&Rε┼ntçA>O░»=█╚oΦH!!╪Z╚X₧GΩ┬t─I┼+à┼ôAUº║Ωñá╕└yL╝┴ª++?bX"₧>·5P[D█zº!
  80880.  
  80881. ╞A3.,(í«&=¿≤╠:ò °─ΩφΩ├═╕╘¢τcQ╢¡┴ovÆ¡0DÿTAjzSV+(≤ò*@v#n╖hA"δδ- ╩J¼≈╕ÿ╖█╫Wq-.o╪╢h1║ë╫KIàû5¼Z÷iÿ╝CJ
  80882. =ΦrÜ╠±(╞iU√áµ┼∙îG╚2áêçx »²[àeO¢ 6 ╦K⌡    Bª6│╚"tφ·8÷{^σàΦ▒>≤╛Φ╩∙¡╒tH½⌐Θgh 8a XτV⌡"eZQ┼W▐ÄóXa0 ╥ô*ÿOé░à°╚X╘ƒá∙«  ⌐ùdÑl    ║<⌡b^ε╕mπlWα!
  80883.  
  80884. µA3.,(í¼=$¬─µC╟∩╟°╔∞ù╦▌╗▓∙zwª½┼X|EFî─,WäJH>.TU+°ùRo(Hπh[oΓê╫₧mó▓┤è░▄\9Æ`j~e∙│`"µÇÇTMü£;∞.▄·hα_ ┬kÆ╬Ç/┼,τ▒╠√▄α)╒M╢»èl
  80885. ì■ZTΓnl▓α:╨╦Z⌡Bª6╔ +!!▐┬l÷[~┼╛╤ô4ú╛╠▌∩ ╕║6╨▐ó6FIX X!
  80886.  
  80887. ╞A3.,(í¼=$¬≤╠:ò ┬█Γ▄ô╜╢ùÄα¼EB½╛Ç63aX─ï5W╫KL/.|V;∩æzi+_δ5gº┐(⌡┌«≈úû≥Å?1║4Qde┘¿-%╝╚╨IMæVæ5║K│=é TF=≤*≥┤4÷+ä2αº∩┬îƒL¢¢ÿÆpε╓RPûy~íα>╬ù2ì(FÑd╒τ!!╨≤a╥GM╧2íû╔dúÜ█±φß»6╨ó▀`o/    o ÜΓpb[T╩┴╨ßQ9PY╓òo▐+óΘ┴╜▀nΘ¬╦ç─S▀è≈╩    1K¬}≡p|π╜e¡!
  80888.  
  80889. µA3,4*Çè!!*αΘà$ü:∙╣àÑ╝÷╤╞⌐≈╖W╖╛Ç'Eid÷íq╔V/}N_O∙ç^Ph0@¿u]mΓ┐( ₧a/à≈ÿ£²╩
  80890. ╨g'kt∞╜½┌├╒û}íG°?²kæ;&x±t⌐▀K╕Gg»@ ╛°¬µ▄ûrÜ)ÜêÉ<U≤▒aeÉD/Hí»=█╚oΦH!!╪Z╚X₧GΩ┬t─I┼+ç▌æ`qá¡ó╛Θ¼±x⌐≡ä ACF<r₧╒"UJC╩Yá{πƒI}
  80891. B^■ä<ê!
  80892.  
  80893. ╞A3,4*Çè!!*αΘà$ü:∙ö ▄╚╓═±╗ߪ    »½÷zalS┴çS8■t8gMR
  80894. ╢╠^ph0@¿y~¬«`▌█V6⌐Ñô¢Σ╠TW╫y[fo▐ⁿb4ε▌╚\╢9╛Vz¼I│~äAδCN(Σ`▀▄@▄V|⌐@.╓æ╞ ┌Ña╞`⌡÷∙få├rwùL>;╜╨ ╩█\µM#îm▀ⁿ9d▐┬l⌠C|Σ:ó▀╦)┌╟æ┼Θò┤uR¬Θ╡a\rrçτ(=":á~ñ*à┤MP|umΦÑ
  80895. ╕yH▄░┴¿╩`÷₧ä▐ÖwεÄú`ìh]fxjαj⌡`Jπ╜)╙y_∩Æì╔╬╫Z₧┼╨ΩV┤Ep╛|ε!!┴º╬■(bL|%w»Z∙₧vö8Ö╓WCoÅdCî≈9Ä`!
  80896.  
  80897. µQ.XR══'⌐╛ë8┼+Θ╤»╦δ▐█ò┐ß╢\@╢║╘~wA█É6âWAj|^Pnαä  L&ùtZyΓó3║▀ñ╕╡ƒ√├^ézW{eÜ╡i7á▌╔_AÉ╙z╝óuÖ╝AN,Φgè╥XÄ`╡9ƒ╥┬·╪¿|¥
  80898. ù÷∙║▒@M«lJtä√6╨ƒ]Γ!!┘S╓VΣ%d≈çl╩G.╘&í┘├Mg≤á≈ΩáΦ≈o║∞│%IGKo<ܱ1rJïzº|α╚g~9OJÜÇ;ƒH öσ┼╜∩!!π»ê╔!
  80899.  
  80900. Φ@⌐èhi┤¿ü/ΦUêû╬┬φ└┌╟■µ¡Vπ▓╬ovOS└┌~v╛ltJ\mOΓëk#BíyA*¼¬- ┌▒≈úû≥Å@ ÆuZll▀Åy º╟╟% Ær╗N│säM╝_N=¡$û╨êJq∞9╨ù╩α╔▓=σg÷▓₧l½ⁿRJ╢arìßs≡╨KΓoφS╬ⁿ8f±çq╧Rb┼2┤╥ùEv┐½╕≈εF╝±rQ¬á╜ B&APO¥%σ91|JCô[ìé¿JV*E╔┴"₧Y
  80901. ╓÷╨½Φd÷·ç┬ê~íδ╠I╠
  80902. :ⁿ²qφ╖)╠bTτÉå╙¢╧Üû╓∩L≤5·eα>└⌐║▓p+&8Z8²1╙■)Jù₧C┌BLbïe ä²ß R▄°»l"?F>╙╠▌╦j    ö┼S?╣√▀¢₧J█!
  80903.  
  80904. Φ@⌐èhi┤¿ü/┼6τ⌡φ▀√┘╦Å■≈╜PF»»╔t}`W▄Ç2Wà2.C,z]x≤ô^Mn# u]~º¼%ΦÇ$üäç╖╙Å╫`V.m▀▒o7╝ë╬XEÉ╙lεW╛x╨]εTN9πhÜφMÄKz½^Q╣√┬Σ╦╡~ìï╫╙rú⌠½nJoèΩs╠┌\ΓH9╔Mö{ÖDH⌠╫t╟Ok╬+░╚èKz≤Ç≈Ωσ\Φ╒lH▒∩º
  80905. %OXj7âφ1sCUë├Q₧ñK`/C▄┴lî_┐╘┬ù·Oσ╖ä▐└r⌡≈┴▄h]bⁿqΘ |Σ░z╘hI¼æô╙Ü╫M█╒╩δO√p╣j≥6àΦ■ƒIfDG:▒"â╖,%é=æI╙Lbïe.╧û_Ä`L@ꪵD!!NYk°╙╫ÖL└ 1@▐√@îà╢C₧ves5⌡▀'}ƒiÇ╡╡╕g╣ö≡╗╬╦æ▄Víë@%│ºü╚%⌐gU Θ╖╛╔ïR■Æ>τ╥¡í⌡²iε*^dε⌠Φi╜≥èë╝YÅêπp;7¼¢âπ0┼⌡â~ÉòE ╚║a#»µéïÇ7PI╧z2╧ó╤k8╧╥√YÅ»±+╦╡Z ╞/9┐═.╗V.æ¡╙ê═v╪8è±╩┴Ñ╘ Vu▌*c1≈bεΩÇV║█í╬|▀!!O6ïNC|╫╔Φb{(µjïüVK&╕╖╪τ█╬≤0z√WOöⁿô⌐ä1Eg⌠√╣YñaTgbΘñ%─╦■^Wí╧⌐ûP╛σè TZçf[ΦLuº}O:W╙.δ≤î $╣b1╓vß╟7f└ ⁿ√éQK+N╖y⥫¼≈╤Γ░6ü¡ß±UK'⌡σ¢X≡Ŭó≡≥ ╪#c.∩ítrº╥è!
  80906.  
  80907. ΦJ#-U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√╔uwMNÆì0₧KWjaL]b±┴
  80908. @v#»uQxú╣9┤£/j┼▌▐é╖├╫yG)`d▀ñ-.├ú⌐UAùV╔K5çw»mò-⌡S=÷TÉ╫WêGfΓmV║ƒ┌▀┬ñvÉM┼╞╙X8ü├sf╗th┬ß6╔æ2ì(<╔S▄V╘(u┌╚v╓Cg╬6┐█╖]d╢é±ⁿ║Fñ²b⌐╔╝}ǵ~%9┼╧Qî│\hr.&│┐"Æs Æ⌡╔°²r═┤ò╚¥;ºúéI₧!
  80909.  
  80910. ╚J1>=■╧;'¼ªç/┼2Σ┘µ╚ñù╥╨│√íTÖ╖┴|`┼ó2SÉL:JR@{?≈ôTu|│XZy▓¢!!Φ▀OΦºüƒσ²éxJZ.p∞╜½┌╒U\╒╢v½Sƒsûª_, ΓaÅ≈WÜM4╝┴òµΣ▐·3ÿ╛ëöY╝£=-αImìΣ6₧╦WΓ┬I╒÷e(╣╩}╓Ja─╛┌├P|╢ε█╤═Fº÷jY║⌠≥dVEbrîú8tB╠╚£ñK#Q)%╖δFΓr0│├Σö╚!!█àÆ┘₧=┤∩┼Iµ !!⌠ûf6┘╕g²-MπÜ╦╙₧╔aò┼╤τL≈|╫êZ¼▄±╤'zKF/⌡w₧≥ lòx≥$╢q(yjê] Ü⌠'τJ2z─úΦD}W p┐!!╫▄ò    ò≈ajô╓z»Ñ╛u  
  80911. Q╥╘--ímà·╒┴B┴╨ÿ▀ó░─Jêeα▓ddü╝╗Süj╜Tg
  80912. ╔╗ú█╔+=·≡E╬ß╦[░─╗ ╗cU$⌐⌡:╝
  80913. ┘±öñ╕DúòA¼trjΩ└╬·&─Σ¡~ÆÉEσ■Ot1ïµ▀εç ºPBé┌⌐'Vó£ΦCÄ≥ëhNΓ╧' δ/8╢ä4@°>Wφ╚«íî    ¥#¼ⁿö╦ß┘IN▌$TîXª▄Θt&┌║■à8àb    4╕io╣É╚(.*0ïR░∩d9%OÅÉΦ%▄ñ╛V╖vs╞|b┐Ö┌¿▀}wk┼║ΦJ!
  80914.  
  80915. ΦW44╔σ[k¢ºƒ=Ç-í├τ╔Ω▀┌╟■µ¡V¡╛├~z^S└─7A╫[A9mIZi°å^X&%Z░h\gΓó.ε█P⌐┤▓≤¥ª ₧wV@je╚╡{7╜ë╞KGÿV║2|╜S╖iô    ╝PAx÷lû▌Q▄Auó@>╓╥╞≈▐¼j╚ì█ƒ}½£=-áouåíq│╡2ì(▀Z╓│9xΘ┬^╬Ci╙░╨ÅiuáÑó╛╘?ÿ╤Fpÿ╟ì,&Pgy!
  80916.  
  80917. ΦW1<íü_C╙δ¡$û(Σ╞»█÷╥╦▌╗ασGK║√╥~pM_─ü,₧L.kHPy⌠ê^&'╖eCoΓ╝(≤▌J@╗┐╕ï√╦qt■zQ.b▀ⁿi;╜┘╠XQÉ╙{εW»mòA≡XM≤}▀▄KôUg⌐/¥ ⌐ƒφ░cä£Üæp
  80918. εσXúl;û÷#█╘VΘE<é╖|₧G╟╘}╬D.╘&í┘ÑHu┤╜╕ ∞
  80919. à⌡sWπáå32@`y*A¿"╩3Ta!
  80920.  
  80921. φM%4*╜«<-ôºê/¥Rï╜¡φ≡─╚╨¼▓ñ]πÜ╙h|K_╙É7]Ö(kODn
  80922. °┴W&zfùeCoÄó"ñÆá╛┤û╖╞^â|[@|e┘╣d$½█çJû¥tºM┐sùAæ;&!!±a▀╥P₧Pu╛pôô═≥îí}╚Qûòçy½π    Γwrüτs╫╠≤I*îP╘╛/`Ω┬|éK`─:⌐£îB4ºª²╛≥½±iJ╝≥≥ %R]
  80923. rrπ`è)aJ┼╧ï│@-r!!░∞EΓFBÜ∙╙°±x═┤à╚é~╣Ω╦[ÅZa{╡~╝U)╦àp╨hwσ▐ÅûÖ∩GÆ╪╤πP║Z╙f°╦π²╟Z4"~├▒ε9`étæK╚V,(
  80924. òelï╗µS╞╢ε^?3DJ╧
  80925. █■╨F\└∩U(≈∩`ææÜ_äl5Ii╞⌡<MP√¢≥┌ÇN÷τ▒║┬ëïNë]▓¥lX0ÑÇë╚/≈"O,Γ«╡Γ╠=#╫ô*ëç■QKΣ┬╞gε*    Eï┌«É≥ི9α≥.¬>+û¼²ü▌∙Æ√φ#oΦ▓)e(╣±éï°s8-ú'╔╡âL.╬┼░'÷Å⌡N½▐a5ínyΣ₧<E≤Jⁿ┴óí▄H⌠;╖≡ùä│¥TÉ!
  80926.  
  80927. ∩E*>ì½hi╗ºÑ$æ:µ╤²íö╛¥⌠░ß▓VQ ║Ç'aMW╓à<^ÆlP8gUT5O°Ç\& @▒<Gbºδ- ╙@║≈╕ÿ╖█╫4i|e┘╣d$½█ÇPLÉçsºF▓=Æ╝EG x╜mæ╩\¢Gf≥@1╓ƒ┴≤▐αzîM₧ëöi½ C
  80928. ΓNoç»'╓▐KºU'┼L╖|Ü)h ┴}╨Q.╞-╛╤├m@¬╛²╥ΘΣ┤wT╝≥╖J kB\c!!╬ ±pd\U═W┘╩áZn9P_Üò'ÄÜ⌡▄╜≥u≈⌠∞º≤    ░ú╩┴E"C¿t⌡4^±±}╚h■êäü¥┌û╫╒÷K·p«dí└≤╤√    ioaD8Γy╤ÜG√]í]┌Gmçmeó²╟Pe]╞ïßC4=O >▀ ╨╩Aö╣ñ·EÖ╒ÜU╠#*~OΣ 19╦,û⌡±▄⌐╜⌠ñ÷!
  80929.  
  80930. ∩E*>ì½hi╗ºÑ$æ:µ╤²î≈╤■╫¡≈½G ╛╪xvXB█ï0zûQ@&kI>f┤áJq#]π}6░«!!■▀@ ¡äúî■┴@╫z_k ▄│r║┴┼EÉægεL░=ä    ∙"cQ≤a£█PèGf∞    8╓£╫ ╩⌐vîM¥é╙h½▒ M¼t|ç²m₧╥ZΩC*▐╙│,s■╥u╟Lză╙ùA4ºª∙Ωáá²s1╙ë╢cCG&4£εWEV@╠;─╞ßNe9QIÜê!!ÅSôπæ╣εdñ»Æ╚₧~í∞ë╠2C¿t∙OqSτ╝l╬yHók⌠ΦñïƒKÜ╪à≤Q±R$▓b≥s─⌠╕╦C)]_8π$û╖ dü$û@╪XUM#íetñ▀&╠ ]┼ºⁿsW t┐₧╨╩P«ΓQ/≈±HÆÉ▀O╠l$=*x└π0ÉaÆ╗éÅNÄë┼äïà╬H╥5╩φa!!αæÇ╟.φwu╗║┐═╨2tÖÄ-│ü Z7½δ╓,ÄBu%W╦ôΘT┘⌡?ì│²]äìH».├¿τ═&┼░ƒ8╓éR≤╡bM║µ╫╚É
  80931. BM─=k╞╕╤
  80932. 5┼╞±Xæτê`M¼£$¿*;┤Ö`Σ>Aⁿè°î╖2╒'π»═┴▓╪@┤g2≈5┴²╘cΘÄ┴íó)] ûUfû¬½f½p⌠½+f¢Ñ⌠#╩└ß6╪E╫jz½≈╥½│Å╥⌠do#ÿj5~yF╫&πb≤ßÖ>2Ѽ╞╦+┬≡╘¿GZö@D≥Q▒At]╓'ö┘≤nX¼}O¿j7ìó.F∩≥⌡▓Z╓Sf]#M!! c╤─²^αÄW¬kΣñX╙░÷}îUK'ò╪âQε▄≥╕d≥╞8 ,╬
  80933. ╤¡TRî·1<ÿ╔wÜ┬~+▓²'τ₧X╛ù║â$Θ+8ç9 7└ìkRe-»⌡∙«ΓW╔ .aíΘlΦ╤╫-£° Fs╨N÷'wp╧Ä°_7º.J+┤²σ┐{\╖╙Ru`ä╣ÇvæBâ╕[û º1,Sü⌡:±p█â┼íx╡∙}6    !!l.»╞¿,¡ Θ╧ü ε+╝,Ω⌡}│!
  80934.  
  80935. ±V.!!¬╒r(ë╜₧/ä2í╣àÑ╝÷╧┼╗ⁿíB ┐┼mvDY┬ü,æMM/`__rOΓäMs'CπnVz░«3 ╨V╝╛╕É╖└^â|[@|e┘╣d$½█ÇMG╒ág½B╗3╥lû<%`9╥pì█Xæ/┼i>╥ü╩⌡ⁿ▓zå┼█Çy¿¬:.╦    ~Ü√╦╦ºgé2░α(m çq╤l{╠3±▒Θ-║¿╠∞⌡≥┤[]è⌠áhQu"é ·Mp6aeσ;è,τ╦05Ej█ì<ÄB¡±Γ¼εdσ╖┴▌ê7╗≈ôIç2C▓}±
  80936. [Y╦ò3Ç@~┴$╗│║¬αf▓·î█ ÖxY╗X⌡!!└µ⌡ƒCq[6\)½w╫╛!
  80937.  
  80938. ≤A$'<ìü4&ô»ó%ï:╗öΩ╘²╥╧┴╖²½{B▒┐╠~a%<╗╞\äHA8.Z]+S▀│Zi4KèrUeⁿδ/⌠₧V¡≈Ñ¢⌠╩Æf.t├¼hrº╟╞VZÿçzá⌠·lû8SI9∩wê█K▄Jf∞Q╣√┬°▀╖vÜM┼╞╙U=½≥XVªI}ì»=█╚oΦH!!╪Z╚X₧G±╒8ÿ.∩ö²ûPX║¼Ω ≥Φ≡eZ╕⌡╛B,<ba7Ü8µ?cKy╟┬7ÿ«TY%SI≤Å)äBà⌡▌╛╝`≈èÇ▀¢3░≈╠óo^bÄy &zYφδ)┴cH√î╧■Σ╢vô─à║ñZ╙Φ5±⌡φ┌@RJJ8ß#Ü°#MÉ:¢B┌
  80939. Tbèue░û_èc,ZεúπD4`
  80940. "╪    ╔╫╦ykΩÄ6!
  80941.  
  80942. ╙A+4+í⌐''╣ìë9åeí─╔┘≡╘√╨¡±╚9*²Æ╬m|CSÆÉ6W╫mA&kZ@n)πÅ}c5Lδ5gº┐(⌡┌«≈úû≥Å?1║4Qde┘¿-%╝╚╨IMæVæ5║K│=é TF=≤*≥┤4÷+║5╫╥ⁿ╔▀┤wï ôù╙N
  80943. ó⌠VWºFuü╦6═▄è+FÑ6ß²!!▀≥VßfK≤√£ôba╜¡▄√≤┼₧    5≡╗≡gh,<Wp;£÷<1\D═╠å√{3JHÜ╙~╦|7╕╙⌡¥╧B«Σ∞º≤ªµ┼Å 9╡x▀xSÅ█!
  80944.  
  80945. ╙A+4+í╗+9┐êÿ>ùeí─█╒ε╥■┴¬α╚9*²Æ╬m|CSÆÉ6W╫mA&kZ@n)πÅ}c5Lδ5gº┐(⌡┌«≈úû≥Å?1║4Qde┘¿-%╝╚╨IMæVæ5║K│=é TF=≤*≥┤4÷+║5╫╥ⁿ╔▀┤wï ôù╙N
  80946. ó⌠VWºTkç╬'╩═è+FÑ6ε/├@═≤Jé.╨ ¿╠åe`º╝òöëoß»"1╙ì╪c^sOGs3éJ≡4rN\┼Mìà¿]-n ε╕«{6ó┬¢µæ ìäÆ╚û8⌡Ω╟╬    >1░p!
  80947.  
  80948. ╙A+4+í╣3;₧¼ƒ)▀±Γε▐┌╥╠╓╙ÿ╠j▒¡╧pvB┌ü~`ÆSA+}^u~⌡ÑJenπqV~¬ñ$║╤D@╝┐▓▐╘α1^ÿvTmtܽ3╛┘┼]ù╙}½ñxô⌡GJvî≥┤0⌡T{Ñ|∞¡╨Γ╚úrä▀⌐ûp
  80949. »ΓRrúr.~æ∞{│╡6Ä(┼QτV┼ S▌ΓKß.╨    ░╬ºAg░├ÆùëO≤╢6╘è█VlTAg>╬≈3pC\ôW█âÑ?nz√│ «i!!▄«╝╥ò_≈┐ì╦┌7╗⌡╚╞
  80950. !
  80951.  
  80952. ≥E!!6▓Ç9,αΘà$ô0Ω╤»┴√┌╓╤Σ▓¿VN╢┐ÇlUDW╒ùdÇyH+iH{+ Æig4N«o    *▓Å)Θ╬r║╢║ì╖▀*àF[{l╬µ-"ÿ╚╥kMåƒ5╛f«~ò╒_Ibít║╞ZÖR]ó3ôé╓╫▐ºVÜ┼█âi.╝÷rV░`└╞=╚╨TΓ;─ZÜ?²;n≥┬0ïc┼+╣╙ç{╡ε∞÷σFï█M╢Γ╕qBg"₧τW2hD┴ìÅó\d*F^û┴-₧NB√Ü╕╝≤oú«┴▀¢7ªµë┴E2¼h⌡zδ╖)╔y æöƒèƒNÜ▀╔ª
  80953. ■#«+≤6╤≥Ω╤ZRaJFa╘ª█%Æ;¢KûV,(
  80954. »mpü■8µ1]▄½αYqE{îZΘ╫ÖM É∩Y'▓±]▀ö▀I╤"uUX╟α0
  80955. 2ƒ,ü■╩┴ú┤▒╣═╦▀WòKαéPX'┤¢Çª@─di
  80956. ╗╗╢╚╠<xÆö/╛╚ RQ¡⌠δ%åMu9å╟≤N┘ε1╠ú¿Uå█N¡,à¿ñ─:æ∙₧~▓êFΘ╜*f╟₧╡íⁿEGM╪.>┴╗âY(╧├ FÉ╝▄zF╡╙!! ¿f·╚{Aεqⁿ╙╡≤┘╩:▒±╨Ñêε/v}δE#h╘╨┘≥n7─»åΣ0Ä l2░u`    ▌ΣåΣ<⌠½+(|
  80957. çüº>╓°ß7╘n╘ub!
  80958.  
  80959. ⌡]77⌐ƒ_C╙δ¡$û(Σ╞»═≡ù÷ߺΓápL▓½Çt}B┌ü~@Æ\A#x^A%M¢δs3:ór@}º╣`µ│(i⌐╣ñë≥▌\D╩4w4wp▀ƒb?╛ë╬\_ÑÜa½Q°·h∩TCx╞aïΩ@îGWú,ë╥┬°▀╖vÜC≥±·BáΓ@A░!
  80960.  
  80961. ⌡]74Ñê!!D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`B╦ö;æSE-}m∙î^Mn#ùEcOäç▌φªó║¢σ╬ÿzN
  80962. │ò`"ó╠═\Füçzáÿräª{=ípå╬\▄Dx¡/ôô╤≤î▓v£û₧ày ε≈EK» sç»!!█▄ZεW*▐╔V≡,b±┬|évW≡ÉΦ╖v┘╟±≡µ    ║∙aH░∩╝FBdHQKg ïJ± cJC╠┘ÄßMe9QIÜÇ<╦U ÜΘæΘ¬,µ│ò▐╘|╪ëñcª;$ⁿ}ΦfVαñ}┼~√2çæû¿╙I£┼!
  80963.  
  80964. ⌡]7>1¬ï_C╙δ¡$û(Σ╞»╪÷╥ƒ╟╗±áZU║⌐çh3\O┬ü5[Ö[bo^n⌠ä i ╖tV*ûÆ▀⌡k.î≈▓ÉΓ┬ û`W`)ö■X├ú⌐g[ÉòVt║WñtÆΦT\I,°tÜ╒PÆF!
  80965.  
  80966. ⌡]71ªΓX@°êé9Æ:≤öε┬╛ï÷ߺΓáJ╜σÇt}B┌ü~@Æ\A#x^A,╢éWr'F¡u]mΓ┐9Ω█ í╡уσ╓R\·3j^╔╣a4ε┼╔[Zöè7{¬j╕yò╝ZJUï!
  80967.  
  80968. ≈E5>0+º«&s·¿éï+Σ╙Ω▐ô╜╢ùƒⁿ╢DF¡√┴;Eid÷íq╫YK8.O[nO√ä[c4╡}Acú⌐, ₧MΦú┐¢╖▌Æ}H|'╔ⁿ~&╝▄├M]ç■|»W÷iÿ╝B_ ;Φbû█]▄Kz¿$¥╨«£í╩╢Eî₧ƒzO⌐⌠Crúr.~æ∞i₧▐Q╬O;╔X▀╛|(ö¡½Rg⌠&í┘¬Jr╝⌠╕φσ
  80969. «»6╨ë½wUP`! !
  80970.  
  80971. ITypeLib comment:
  80972. 'ITypeLib is a <COMInterface> class which wraps an COM Automation ITypeLib interface pointer.
  80973.  
  80974. The purpose of ITypeLib is to serve as the top-level entry point to a COM type library, which is a repository of meta-information about COM objects and interfaces. An ITypeLib is typically acquired either by loading a type library explicitly from the resources of a COM server or a .TLB file, or directly from a COM object via an interface such as IProvideClassInfo.
  80975.  
  80976. The member functions of ITypeLib permit one to enquire about general attributes of the library, but more importantly they enable one to enumerate through the individual meta-elements by acquiring ITypeInfo interfaces on them.
  80977.  
  80978. ITypeLib is a complex and very powerful interface so we have chosen to separate most of Dolphin''s higher level wrapping into a separate class, namely AXTypeLibraryAnalyzer. Therefore the only methods implemented here are the virtual call outs and a few simple wrappers for those.
  80979.  
  80980. ITypeLib is primarily of use in the construction of programming tools (it is fundamental to Dolphin''s support for auto-generation of COM object wrappers), but it is unlikely to be of much relevance to most applications.'!
  80981. !ITypeLib class methodsFor!
  80982.  
  80983. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]xOσöIi4[ªxh╗δ4≥█¡┤▓ùß╩P·7iGT├¼hº╦ÇZGÿÜpêV╕~ä≤_\dRê&≥┤4÷+g⌐ :╛°¬ƒ╚ÑuüÜ╜år ║°XJ° I\ç√╟╧Z╬O)├|╒²9!!δ┬l╫P`⌠&í┘┘3╖╣≈∞ΣA≤Ö
  80984. 5╨Σ╖ kCsh1Ü∞j1 w╠∙Üñpc:L╩æóTÖ¬æ╣εf±╖ä├Ä
  80985. ¼≤╠òEp «x╝&@F≥┤@╬kTªL┘┌■Σ╢!!ƒ╙├∩L±4%┤h⌡:╩ΘóƒYal[2P-⌠¥±"Qê$Ü╧,jKmé: îΘ2÷ R▄û÷G4)Y9╥╤└▌5ñ╘sô╡─°⌡.╖(=VI╟╓1>àeÿ⌡éÆMï┐σé╥¢╬vÆ^»½Cq1⌐û╒█äl`í■▒▄┬*|Æö8ôæαQ■╣╝╢iT}M«τ ∞E░∩1âφ≈╤÷-╩Qàá⌐──■ô*ƒêD\í≈(a0å²┌ΩüCè;9╟ó╬O2▀⌠τZÖ⌡╞)û≡*╔êö>▒V.æ¡╛Σ█R╙0àα₧é╡╘HÖ')^èh Φ┼dτïûΣñ/\£URÄ┤ç{QRTçVÇ╤G5`¢═¡pâ«á{¥_ò9╙░║ó╪xpj└«ΩEh>à@`=    u└;╔j¬┤Ü20▄╟╗½MÑ║└¥|K¬bF∙jïFZ&w╨(╩ºêw    6µOX½Pä╛oΦΩ⌡≡éJHZ5`≥}ü╛┤Ñ╣P⌐kä╦m╙óµ*╔6gW∞µ«╝█╝ⁿG─Σ_+┬e╝¬IRɃE>Ç╙kÜ╚ScΦá|─╨τ∩╞~]╞s -¥3╧┘J$~dC╕∙≡ßδBÑYOK    ─║z╚■┌3£°:sCε~╘f{═ä∙EdΘ%T4'»⌐Θ≥4Fí«K "▄⌠─0╟.¬Ål┐K░ 8tIJñ╦ñ╪ª,≥⌠6Un'Q;░φ≤-ÇMⁿ╒▓╜┘Q┼&═·v╣╪Æp├p≈┴αε«a╥≥e·├Ä╛─║╘≥D╔÷N╥US0≈N[4Uñr╦K┘q1åi</q≥ä▀x)╦φΣC£zZε;ù─Éδ<H.Jε≥∩ ƒ∞α5E╜qäc▄VeªR:─°*π╦xÜ&Ñ╜φ{╣Ñ¡▄╖(Y÷eù╣∩E≤6╖≈µⁿ)╔4╬q«ó=lEA┴╤eß!
  80986.  
  80987. τV(,░¥;+»╜ë9▀α└√▐ô╜╢ùæΓá]½│┼;aMQ█ù*WàZ@jzBCnO·êKg4VπkZ~¬δ4≥█╝úÑù⌡┌ä4W.t╥╣-nÜσΘ{ií"íH9εBóiéO╛<%dRêZî█UÜ╞iU▀¥┬≥ûαr£ì█öi¬▒:.╦    zêα!!äƒ^≤U=îH≈∙"s╧┬j∞WcÇR█╡ΩI}╜íΩñá╝αr«═╗wpPH'âJÄ}YC_╩┴╨ßXy(Q ╓é&Å!
  80988.  
  80989. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  80990. σäM&2G¬oi«¬3Θ£/j┼▌▐á┤îTÆxXI.d▀║l'ó▌ΘZG¢!
  80991.  
  80992. φK&ox¿å0 ╛Θü+Å0≤Ä»┌√┼≥╘┤²╖N╢╡╧i)@╫û[ÖPVjbTPj≤█^Ui%N»y>╦ΘΩ█L@╝┐▓▐σ╩ä`[kdÜ¿t"½ë╠PJçü5╣Jóu╨⌠T(Σgû╪PÖF4ï5≈▐âα╔▓`üæ╫╙}¬▒[Kía~╠éY╖±P≤Do╪W█│4n∞çu├[.┴<Ñ╔éHx¬ε √⌠F¬⌡cW∙ß≥ gTTrÖ≈ppX└┼ÿßTd2L^Üù*ÖI Ö■æ╢Θlµ┐ôá≡W╖·ë╟w╣o╝r╙ñl╥tkφû│ûëδQï╙Θ∩@╝[~°ï^»ÄΣƒHzX[}φZ∙╡D[é1ôHƒu++
  80993. ëpeâíu½ P╬Γ■B4(S)┬äÆ╒Mëτ'╢⌡Fì╧▀Q█>QJ╨░)
  80994. 3₧~═╗╬╫ü│ ╣┘╦╟PƒY¼ü(»æÄ╬c└qΘ╗╖╟╓+tà└líëⁿGµöæ@éNc òôOíèΣ;èτ│Q¥½H¬6 æτ╩½@■▄╡âôfπªv=Ω≡▌═ö ]PºPB⌐╗╠K8∙┼∙~à÷ÖEKáåsß,=╛₧"âRS╬┴¿╠▄Q╥'∙╡åä│≡LS╦$m¢N╦±╬H░█┌í¢!!Gï+L■═ÄkIεnû┬CjOèö╫6╩∩φ>╔_╕╨╔├▓╫s$/τ╡≈Qy%─#PtS╦<·`╗ßå";┌▀å¼V«≥╓╛lZP─JσUà\Lf╓-╫╝ö{]qç^R»oÜô!
  80995.  
  80996. εT"ox┤Ä&!!ö¿ü/ΦUêû└▄√┘ƒ┴╢≈σGZ»╛ÇwzJD╙û'ûK>f^x≤é_o#KπlR~¬δ!!⌠┌ªñá¢σÅ╫}Pza╘┐hrí╧ÇM@É{∙g½@│tåε@xΦp╤£4÷/┼>/╓₧┼╢├░våW▀ïÆhÇ≡ZAΓr|ïⁿ'█═ºU=┘Z!
  80997.  
  80998. εT"ox┤Ä&!!ö¿ü/┼-Σ╙µ▀Ω╥═Å■≤ç\L│╛┴u"?ɽ.WÖP"kGr≤┴Pd4N▒ek╢δ4≥█╕▓┤ù±╞╫d_f █▓ir»╟╙NMçVÆ5ºMÑiæ T>ípù█4÷+f⌐9┌ä╞Σî»}╚ï╒╙S║°XJúlb┬º!!█ûMΓF&▀K▀│9iⁿçl█RkÇ3╕▐æEf¬α║ôèk┬¥|╕εíwIf [Å≡5c
  80999. öW▐åºc9T|╒ê!!ƒ_╪¥╗╤╙M┴¢ö┘╢7╖±╚╓E3⌐pΦO5ï╪e╧l_╪Ää┐ç▌mâîà÷Cα╗fΣs─⌠═╤EfKz)π>¥≡m√]÷\┌JKmé: ┼·∞)Y╔¼»^7X {îZσαⁿc-⌐═xà┌n╢ª½b∞xYF7├ⁿ7g╤WÑ▐ ∙'é₧╬Æε¡Ωj░l¥═(<M╔éƒ╟#»8&⌡¡º╦╫q²≤ªåπC╢!
  81000.  
  81001. ≡Q",Ñ¢:s·Ñà(î;í┘ε╞±┼àò│≤»\Q ╢╔u|Z Æë7\ÿM&aXRg
  81002. ¼┴Ve'Cª9αè.Θ╔GΦú┐¢╖▀
  81003. ƒ4Q.t╥╣-&╖┘┼D£üg╖ítä    ╝P[*Φfè╩\Åq┤?╟₧┌╢═│3îïÜÜp
  81004. ¬£=-áyJoèΩs▀═X≥L*┬K╔V╗,mφ╧w╫EfÇ>±╘èC|╢╝╕≤Θºµ J╝≥ík[k0ïú#1L_╟─Å│\iQ)%█é,ÄJù≥▌╜╡/ñôçìÄ6░ú┼═6 C╡o╝{Kóúl╟dH°îäù╬╨F█┬═πⁿ#«+∞2╞∩±╤}GG}£]·÷#vå1ì▐Gnûty═Φ!!±+[åαé=\P#'m╙╪Æ╚QÆ·l+ú≈▀ÖûE╫(x]A═Γ~C0ÉfÿΘÿ▀ó╡π∞ïå┬QôJαêJU%¼ù╒S╟%«cjû╘┘º╠9_ÿö)²╚╦|#ü╩╬╖eb%òô⌡Gùα;╗«⌐\╨█sÜ:?ªûïΦ  ▀ñ │ác5╒æ=Aù!
  81005.  
  81006. ≡Q",Ñ¢:s·Ñà(î;í┘ε╞±┼àò│≤»\Q ╢╔u|Z Æë7\ÿM&aXRg
  81007. ¼┴Ve'Cª<Zlîñ. ä░┤▓Äπ╞┐uPbe╚╤[∞Φ╬J_É╙}½ª|ä    ╝^II,Θa▀╩@îG4á    >┴ô╤∩î╖z£▀Üçhº≤BPºsJzæ»7█╦^εM*╚2░±4!!φ╧}éC|╟*╝┘ìPg²ε╤°áá± P░Γá |\&<üú5vFC▌▀ÄßVc|WD▀┴'äI╓²╨╗⌠hΩ┐∞º≤*╜µ╟I╬ $ⁿh⌠
  81008. 4Mτó|╠yπ▐äàÅ╙]Ü┬╠ΦE┤8┐+╜=╠δ∙█E_N
  81009. \<≤;û⌐a%ö,£K╧ HMm«anë≈0±Dg1ó╦é=X&
  81010. p┼█└ÖL└ 1@▐■GîéÜU₧veb"÷┬d8å"·æ▒┌∞α¼÷Σºε~ëLîìGD%▓ï╧╬,¼wj û╘┘º╘*tà⪣°{ûⁿⁿÜPuàëU≡I¢Φ3ß═╘=¥¡B▒
  81011. î╗²ü$╨·ƒ,√φ#o÷é
  81012. v    ú·╫┘╧Y\M─59¡▌¬#0╚╔·▄ΩôjC«┘s    √5¿▀yM■>Vò«╙ê╤K▀&╖τáÇ╡╒1GQ▄>NZÉO±²╥    {Ç≥≥¼÷t    R┘6,O■¡ä\⌠"ó¼(fâòºjÿ┌┘ ° hΩUG¢≈ⁿÆ%√VW\╥₧╓cXwτ$S#;╠)┘w╝ñ═w═▐¼ºR┐Θ▀▒G^ÇoNεl¿Y[1n▓AÉ┌≤7Ü^P»}E╚òR├═┼─.²Hx\g[■vƒÖ▒9⌐≈5ÖBσ░Qⁿ╚ÖNÑ1uO≡≡╕╝º«÷C▄≤_Γ7=⌡å}&╢╟ ÖΘU▓æ.,▒! !
  81013.  
  81014. !ITypeLib methodsFor!
  81015.  
  81016. ╟M)⌐èhi╝áé.½>∞╤»└╓╓╠▌ê≤⌐    │ô┴h{~W▐─.BúvJ,a{┬¿_if]ñQVgï»z║╠E-¡║₧Ü╖▀8ÿaP4 ╩┐K=╗╟─4"ⁿT║cíH│=ä    ∙i6σJ₧╙\╘ 4í(█¥╟╢├ª3£Ü█░S"ε■UNºc;ò²2╬╧Zπ-╒╬÷msⁿ─}╦Tk╥q▄╢ε.┌å╩█╙3ä└ cå≤ªdJYK@;Ç═=t=ú~ñx▒¿WP|o|φ▓╣î▐╨╡∙C±╝═á≡W▄è≥┴8w╡{≥
  81017. pε╛g╟-W─ìëÑÅ╙÷╝¼Å+╧%«Ví±■Φ┌3Ho@L}ß'º▐#c₧x≥$╢q(ylôt]═≈:φo┌Ñ┬R<NU╝s╖╗ΓM╠úS?ú┬    è¢îN┘"=T╩ 6w╤|ö▌╫╟¿≤¬█íΓë2÷5╩φ@-▓åÜ╟j╛vb·▓╝öà7cÆë9½£░CΣ⌡δ>ÉTbw    É▄°ò±'Ü¿┤P╩¿cö-$╔Θâ÷π╘┌`√φ#8≥▒bdú·╬╩ÖUg╦6'!
  81018.  
  81019. µA3;94çÜ!!=₧¿ÿ+ΦUêû╬┬φ└┌╟■≤σ`èê⌠_R|wî─:Wä\V#lR]lOΓëe3\╖s^*ª¬4√₧C╗╕┤ù÷█╫cWf ╬┤hr║╨╨\Öæt╝Z°?²kæ;&7╘W½·x¿c4ó+ôÉ╞├┬ªzå ôÆë}ó⌠ ╗oiæΩ?╪▓5!
  81020.  
  81021. ╞A3>:;▒é7'«¿ÿ#è1╗öµ┬·╥╟ò«╨╢GQæ║═~)F≡ù*@╣^I/.KqxΣÑZU2]¬rT0Γ╗Θ╩P$º┤äèσ╞╫dZFe╓¼N=á▌┼A\╧VâbåF║m│≥EJ,ít╜═MÄjqá┌₧╞¼î░Q¢ì│ûpê°[A╧
  81022. c9▓²:╚▐KΓbîv╘ⁿ&d╣╙p╟I┼+ò╙ÇQy╢á∞ ⌠º·(∙φ╖
  81023. jB`rܵW^b╞╟ë╡z.B\╩ä+╦X╓Σ┘╜╝sß╣ä─î;º¡ñcóo^b:1ÖO╔#@▌Äz╘iXφ
  81024. Æ┴┤ï╦lö╒╨δG·1«bε=ìèÆ╢s/RFt}°9ç╖$kò1ç▓r(+
  81025. ╜ouÖ╞u┴9néΓ u".X7█Æ┐│-oΘ╪S?ú┬    ╜ª½uöl(rS╨╘+à~₧⌡▀₧c╞╙ÿ▀≡ä▐Kí╡èV_#«ùïS╟%úe,Xδ║ºµ└3a┤ò"│ìΦ@]╔ôÆ@Ω{"║ô7╧t½½w£à«@ÿ│B»(9    Å¼εÜD╗¥·W╕ê^íáe0Ωπ▌ïæ]M╚?9┴ú╞F%ï╥√^ë⌠Æ)V¬┘s ┌ Å≥@Θ4@²ä╗≥¥Z╙u¬√ääª╪J╪h^▐Nτ∞╚B¬Å─Ñ÷ HÉUAfû¬∩b ¡gë╒KaOÖåε$▌Ω«y░u ┐2»╨┴▓▀}>|≥┐τGp;╨)y]]╫+¡4∙ßä3)╟╘½ΓN╗≡╞░f[Jês[ΩJs¡j|φ│≤ûn'│VXΓußÉ-eΩ°░ß╬[fJI√}!
  81026.  
  81027. µA36<:à¢&;╫├σhñ1≥├Ω▐╛╓ƒëè▐îqbïÅ≥%3LS╞à7^₧QCjzSV+ â Xt?óhGx½⌐5ε█Q@«╕Ñ▐π╟^àq]gv▀«X╟ü╔M[╒:║4\è÷kò∩X@tíhÉ▌XÉG4Ñpôü╠√╔αuä ÿê▀<á⌡E¼ uùΓ6╠▐KΦSo┼[▀τ$gα╬v┼/⌐+╣┘├Puí⌐²Ωá)¢┤-«Φ╗    
  81028. %Q\jrÅ⌠)bR╠W·ä≥ -5M ╒ö=╦Yà⌡ÿ÷æ ìöÄ┘ƒ~íδ╚Å?R▓oδ
  81029. f╧äZ⌠-YΘFÿôûïÿL█├╓∩L≤R┐gΣ2╓Γ╘╓g}[t┐u■¥@°(▀B╓@Vwö |αæ\∩']▄╢²lz~5W⌠;Ωµδà⌠l%╛±]Üç╤*┤E+ULé╫!!ÿn╢∩╠└T∞╢°┤╩ƒ▀M╥5╩φ{Z-óô¢┘!
  81030.  
  81031. ╞A36<:à¢&;αΘï/æΦ╓╬╪Ω┼▓┐╫░òAJ⌐║╘~3√è(]£Z>f^L
  81032. Γ¡[G2[▒4*»«4≥╤F@º▒≈è ╩\=╕Ylj▀┐yr╣█┴IXÉ╙lεW╛x╨∙RJ.Σv╤│3±(┼(÷í÷┌°αL╖ïƒÉ}ó▒pA╢Lyú√'╠ù2ì(FÑd╒τ!!═δQαcZ⌠√û├Tdçé±ⁿ┴╝µ)╘è█Ho+?b:$ç≈1}C▌╬å¡-4QI╔ö#ƒZ╓─²æ▐@╨Ä│ç╨`╪ëá7▄;R
  81033. ▓j²}[┴░e╠!
  81034.  
  81035. µA3.,(í¼=$¬─µC╟∩╟°╔∞ù╦▌╗▓∙zwª½┼X|EFî─,WäJH>.TU+°ùRo(Hπh[oΓê╫₧mó▓┤è░▄\9Æ`j~e∙│`"µÇÇTMü£;∞.▄·hαN+÷aì₧E±(¡/─ù╤╢û²3í9åïû_úßJºw:tïß'█═è+F▀Z╓₧GÉα}╓vw╨:Æ╙ÄT.≤»÷φ≈║║6╨▐│rCGKg!!íΘ3e":!
  81036.  
  81037. ╞A3.,(í¼=$¬≤╠-Ç+╒═ ╔▌╪╥┼╙ÿ╠`╛╖╠tf\╘ï,âWAjGoJ{
  81038. ┌ê<J╖HJzºê/≈╬
  81039. IΦ╛╣è≥▌öq{n┘¿d=áç¡3!!╗X▒X5ÜK┐n╨ ∙EG<íl₧═₧Gqó@=╞å╠√═┤zï ôùè<½ RVút┬Θ!!╤╥è+F╪W▀Vσ9`√╦}éFk╞6┐┘ç}╜ε╤╩∙¡╪i^τ╛╢lHP-s<ìΩ>bφ8ì?Ñò@geⁿ╕n╔7h√Ü╕ΣΩh÷«ö╠û~ª≈═
  81040. ╬    ;QR «y∩xKóΦ)╠}K·    ùà═π╡!!Ñ┼└ΩD┤>¼jφ:┴─∙╙!
  81041.  
  81042. ╞A3.,(íª</╡≤╠#ï;Σ╠»▄επ÷█╕² S»ÅΘuuG;╕φ|qûSH%{OmΣ┴
  81043. QcffùeCoÄó"áäe╝â«Ä≥µÿ<@gn╬╣4»╩┼NÇÉ|íM°?²kæ;&U.Φvï╦XÉg╕?╥₧╧¼î¿aìèùç<Zε⌡@K░dJwÆ %╤╓[╣,EÑa╔ +!!≡╔n├Ng─░╨Å!
  81044.  
  81045. ╞A3.,(íª</╡èâ?ï+î╛åÄ╬┼╓├┐µá Æ╬m|CSÆÉ6W╫xA>ZBCn&°çzi3A╖4*»«4≥╤F@º▒≈è ╩\=╕Ylj▀┐yr╣█┴IXÉ╙lεW╛x╨∙RJ.Σv╤│3±(┼$ ⁿáτ╔≤│gî₧ùƒ<(½σc]▓e#uäα╤╩Q≤    fù2░▒@ ö¡₧Tg╥+ñ▌Ågº¬√ ∞
  81046. ≥┤dK╢≥╢JV;+?bX!!ïσW9YQ┼╔2ï¡U!
  81047.  
  81048. µA3.,(íª</╡åèÉ6σÄ»╦δ▐█ò╖⌠ï\M║ßÇ~kKS┬É7]ÖwE$jWVyb£Φ\xh5Xªnk¼δ    ╬╟Rü╣▒æ╖╔ ╫`V.t├¼hr╣└╘Q╔1ª?Q≡÷zà°*ímÖ₧MöGf⌐@5└╥═∙í╩£Å₧╙u¿■EIúttî»:╨ƒK∩H<îS╙ß,sαço╦VfÇ+╣▌ùa╜ºΘδσFí≡,¡Φ╖BqNPKt7¥∩p~I=ú~╚ï¡Ll(JB▌┴;â_B╩■╪┤²eφ╣╖╠û+┤ß┼ æE2¼h⌡zwπ┐m╠hIóD≤δ■Σ╢T█╫╦⌡U±p▓yí/¿ìæ▐U~J    g¼w║├4uöæH╨XOGt╢oiâ∩0±DH6í¬²kg
  81049.  
  81050. {┌₧⌡▄P2Ö≤Y╣∙F░ô╕R╫(bG╦⌠d-ÑEÖ²╫êN¡┤Γí╬Öà2÷1₧îWz²╥▀Sª@─ o╧¼Ñ╦ƒJûö?░ìΓi|╬ÉÆ àfq;éëU╟-≤ê^σ»»╫█sÜ:?ªûéφ ⁿ╒╛
  81051. ╕¿~ ╬ü!!@I└¥▒óⁿWp╪/.Ü≈°O$╚┼ε^òΘÆAC¼╪?·n"╗╥aM╫V.æ¡╙ê╘]√4»µò█ßµ7tyΩQ"o╗N⌠≈╥π£┬Ñü!!]
  81052. ├N4¬Ö!
  81053.  
  81054. ╞A3.,(íª</╡åèÉ6σÄ»╦δ▐█ò«ΓæzM╣┤Ü;cXb√è8]·5-h^IZ}Γä^&A╡sXoΓ┐( ₧e╝â«Ä≥µÿ[X'{i▐⌠$rú╠╘QGæV£5║K│=│.╤@ 2Σgï₧NÄCd╝8ôÉ┌╢╪¿v╚Üÿûu½π)╚    gδå∞·l╥mî`στ)b°╦téek╘ ¿╠åmz╡í╫°╟í≡(1╙ë█c9lHhKAº.⌐W7dFTàzºxπ╚bb)WqÜ¿ÆJ┐■╫╖╢+ñ¬æ∙│0│∞ÇRóo^Ii╤òMYPµ╕o╔h_¼æ┴üï╦]ë╪à∩Lα7┐yí0╩π²ƒG}G[}σ?Æ∙mwÉ=îG╤Cm╞exÄ■%≈*Rê¬ΩE4x'sè ╫└═QîúO>│ⁿHôÖ┼═(/_Réºd$╕H▌╗±µ╝┐╪╕═äü┬5╩φ{E!!¼ö╧┼<¼no╪┐╝┬¿U!
  81055.  
  81056. ╞A3.,(íª</╡¥ò:Çeí▌ß╚√╧ƒ┼è┘¼]Gσ√╨OXAX╓ΘT;╒|E&bTFO≡Ä r.JπUgs▓« ≤▄ZÅ▓ú¬ε▀7ÖrQ4wp▀⌠$rº╟╘\ZôÉ5¿V╕~ä≤_KUï    ⌡╖èKf╕=▀╥╨Γ╚úrä┼█¢n
  81057. ╜Σ[PΓ6Jòα!!┌ƒl├v■{ÉH₧G╟╘}╬D.╔1º▌ÅMpÉ»⌠≥!
  81058.  
  81059. ΦW    =■╧3«╗à$éRï╜¡φ≡─╚╨¼▓▓[F½│┼i3[F╫ç7T₧Z@j}OAb±┴J&2Gª<]k»«`⌡╪Φ║▓ô⌡╩^₧zfeÜ«h1½└╓\Z█T■|─*¬=æ∩FJx²    ⌡╖XÆQc⌐|ë╧â╥√ÅA¼/åÅûoOá⌠@
  81060. chçπ5₧÷L╔@"╔Ü└9s≡╔éC}⌡1╕▀î@qÇ║Ω≈εΦ°H]¬Φä ?Kv4á εj1N^┌╚─╠3BB╔û*Öùⁿ─╜╝`≈ÿÄ┬û;┤φ!
  81061.  
  81062. ╚W    =■╧!!3ö¿ü/º*τöπΣ ─╫π┐■ Où║╙sEIZÆö8|ûRAp.KUE√äs3d▒uEk╢«`╖₧k╛╕╝¢╖█╫]M.om▀⌠$rú╠╘QGæV£5║K│=│.╤@ 2Σgï₧NÄCd╝8ôÉ┌╢╪¿v╚Üÿûu½π)╚`δ╟√∞j╦uo≤`╔≈.`⌡╦8δQ@┴2┤öε.┌╟├≈ε;Φ╪Pkè╘ÇJhTc¢ »zZ&9≥├,╩┤W~5DB▀àoçU æ░▌ɲr∞îÇ┴╓S▀èá`⌠
  81063. "/C░s≥>≥╖G┴`^ák⌠Φ·τΣGÄ┬°ª`╟&≡+±╓≤Ω≤DGN Lt¬Z∙₧o√Y⌡'âHPwôal═Φ!!τ    $P─°»_#?Y r┬ZÅâÖHù≡H8≈√^É碷bd[£¥Njéi¢²ÿ█║╗²┐╧¿╩SÉ!
  81064.  
  81065. ∩E*,■╧;'╛¼öG∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3\^╫─y\ûRAm.TU+■ä^\j#BªrG*╡ó4≥₧V¡≈ñÄ≥╠₧qZ@2i╘¿h5½█₧% Üq½[÷t₧AΦYJI*ΣgÜ╫OÖP:εmV╛°¬╚▀ÑÄMæÜ₧y.║½M¼dc┬µ5 ▌LΓO;ûß÷!!g╣┬j╨M|ε0Ñ·îQz╖⌠╕≈ε¡∞]!
  81066.  
  81067. ∩E*,■╧;'╛¼öjî9└╓ⁿ╔≡├àò╗ΩªVS½▓╧u[IX╓ê;@·5-h^IZ}Γä^&A░kVxΓ┐( ₧⌐║▓┘╖└^â|[@kl▀▒h<║ë╫P\¥VçpεPªxô·XJx╜mæ╩\¢Gf≥@Q╣√╩°╚Ñk╚æ█çt
  81068. επRGºi~Éíq│╡2ì(3î]╔ß`⌠┬8╠Cc┼╣╬├X┘╟·φ⌠å⌡mY∙║∩J VrgKh7ÖDÄ}Y3xUë┬åÑx/F ▐Ä,₧WÿΣ╨¼⌡nΩ¢òù╓~╖÷▌I█6R
  81069. ▓j≤bZ±±hÇaT°Fæç╙ï╟\ë╫¿î+Σ?╣n≥ ╠Θ ƒI{G;■%₧÷9l₧:▀Y┌XEMm┴t â■0τDg1ó╦τEq`Ym╙╪Æ┤.oΘ─Y>ô≡JèÿÜI╩-,YOÿ░-9öt┌¬╡╕g┼¬╙Ñ▀Öσ^æ]·─GE0▓╝Ä╬G╟ ┘¡ñ▄ß0rñÄ>«å≈Q¬≡≈DΘ)'    É√≡P║ε9ÿóÑ@╨█I¬4rjΩ└╖π:┼Γ╕;Üùlφ▒U$*ú°ûª pYVèfkÉ≈╩L┘╒√▄▌±+╦╘!!H╡nâεQw╧a╘ßù─≤o≤ù╙┐┤Å∙_OZφv^─▌╞┼_∩ï╪¡╕H ¥WC4╫▓âd.α≤¿+(G=«┤╥∞╦≥)╥╞pi╖╪▀æ╩y$/ε⌐┘]π@;pOƒr¡g║╡à?┼├∩úQÿ⌠┬╢aXDΘ    "■Vn╗{O9Vƒ-δ╢ƒ0j[╒aR╜u!
  81070.  
  81071. ±V.!!¬╒r(ë╜₧/ä2í╣àÑ╝÷╧┼╗ⁿíB ┐┼mvDY┬ü,æMM/`__rOΓäMs'CπnVz░«3 ╨V╝╛╕É╖└^â|[@|e┘╣d$½█ÇMG╒ág½B╗3╥lû<%`9╥pì█Xæ/┼i>╥ü╩⌡ⁿ▓zå┼█Çy¿¬:.╦    ~Ü√╦╦ºgé2░α(m çq╤l{╠3±▒Θ-║¿╠∞⌡≥┤[]è⌠áhQu"é ·Mp6aeσ;è,τ╦05Ej█ì<ÄB¡±Γ¼εdσ╖┴▌ê7╗≈ôIç2C▓}±
  81072. UK╕±9Çd]═ìä¥ÜàáæÖτL√n²V¿ïèÆ╢u}]H0▒9û∩9Uä ┼¢Q!
  81073.  
  81074. ╙A+4+í╗ ╕êÿ>ùeí╞Ω└√╓╠╨è▐¼Qb½»╥!!Γû7DûKAj#ze∙èr.JπNVfº¬3 Ωn    ¬ûúèσçU^ÜqJadÜ│kr║┴┼k║;╙wñF╡i╨εP_=σ$¥╟êJq∞9╨ù╩α╔▓=σg≥±·'£╘dqÄTJD╜ⁿ'┌▄^δMo■Z╓≥>d═δq└cz╘-∙ò╪)┌∞òöìl┴¿vU½⌠º %UAe3é╣W&~FTëF₧Q╛ìpOwxΦ╦qµ0k¿π╘┤·!!φ┤ù╠û7▒└╚├!
  81075.  
  81076. ⌡]77⌐ƒ_C╙δ¡$û(Σ╞»═≡ù÷ߺΓápL▓½Çt}B┌ü~@Æ\A#x^A%M¢δs3:ór@}º╣`µ│(i⌐╣ñë≥▌\D╩4w4wp▀ƒb?╛ë╬\_ÑÜa½Q°·h∩TCx╞aïΩ@îGWú,ë╥┬°▀╖vÜC≥±·BáΓ@A░!
  81077.  
  81078. ⌡]76óÇ=αΘà$ü:∙╣àÑ╝÷╤╞⌐≈╖B▒√£RGQF╫¡0Tÿ,aI≤┴\k$J▒<Dc╢ú`ε╓G@╗º▓¥■╔ô4Qk-╪╜~7¬ñ¬0£çr½QΦ=Ö°TWI1∩$ï╓\▄Pq»5┼ù╤╕Ä═σg÷ç╙}╜µRVΓ|gδε=═╚Z⌡uæ≤"Ω=d╨╔~═`┼(ü╙èJ`╢╝╢ôèo╗±lZ∙╟╖6|VP"h4üPú>uJHäFìÜòpc:LÜÇ!!ÿMä╛╝╥ò_σ┤Æ┌ƒ,!
  81079.  
  81080. ⌡]7>1¬ï=αΘì$¼1⌡╤Φ╔∞║╡╝ⁿ┬╖ZU╛»┼;>w▄ù)WàP"kgR?╙¬7wBf@Ñ<Gbºδ- ╙@║≈áùπ╟\
  81081. ƒq~e┘╡k;½═ÇPFæïV|áóuòAεTL 1≈aìÉ4÷/┼i9▌ç╬╢°ÖC¡&╢╡╖e╟ÿL-╧
  81082. cδ█≈±{╪d∙r│«m1╡¬½+⌠ÿ≥º{Fûì╫╠─o⌡┤TwÉ╬û5'KsxK-r▀FÄ}Y&dΓ>π5╡îvI    oi│▄o┐q+╕╘εè┘B╦êÑì╤~Σ»ñcªl^?9*ÆX├&Zk╟âOßN~à[▐╡╕º±lñ√Ω┬w╪7p±+░¿ìæ╢srBf(m╒á╟ Q▓÷ƒ,jkMó_Iú╧╤,φΓñ`v's┐sΩ∙≡j"┐└s    ¢▐z¼ⁿ┬Ω~d.µ┘3ÑO┐╗ôÆ_α╫¢▀óΓ t╡vä╗dzüíµzûjÖIO6▀üôßµPñ⌐l∞╚í|╬ÉÆ@╖kY)╕µ;╒o╖ê^╤τëú╡c£3)óÜτèiÇ╝²T ε#2╩¥!!@ç╒αóⁿDpßΣê÷dΣε╛▄╖±+╦┴heéGv╫┤"â'∙╩⌐÷╪I¥)╬ƒ∙Ç»╬CNÖ>S¡x╤╫≥cVΣ₧█Ωx▄AZò]Æ░╢q:ádû⌡[jU╦åΘ╓·σ<╪ä9~ì≥┌¿ä1a⌡¼ßT2Zα'|DA╥* %┐á¢";! !
  81083.  
  81084. IClassFactory2 comment:
  81085. '<IClassFactory2> is a wrapper class for the custom interface ''OCIDL.IClassFactory2'' generated from type information in the ''OCIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  81086.  
  81087. The type library contains no documentation for this interface.
  81088.  
  81089. WARNING: This comment was automatically generated from the interface''s type information and any changes made here may be overwritten the next time this wrapper class is so generated.'!
  81090. !IClassFactory2 class methodsFor!
  81091.  
  81092. defineFunctions
  81093.     "Declare the virtual function table for the COM interface 'OCIDL.IClassFactory2'
  81094.         IClassFactory2 defineTemplate
  81095.     "
  81096.  
  81097.     self
  81098.         defineFunction: #GetLicInfo:
  81099.             argumentTypes: 'LICINFO*';
  81100.         defineFunction: #RequestLicKey:pBstrKey:
  81101.             argumentTypes: 'dword bstr*';
  81102.         defineFunction: #CreateInstanceLic:pUnkReserved:riid:bstrKey:ppvObject:
  81103.                         argumentTypes: 'IUnknown* IUnknown* GUID* bstr IUnknown**'! !
  81104.  
  81105. !IClassFactory2 methodsFor!
  81106.  
  81107. CreateInstanceLic: punkOuter pUnkReserved: pUnkReserved riid: riid bstrKey: bstrKey ppvObject: ppvObj
  81108.     "Invoke the CreateInstanceLic() method of the object wrapped by the receiver.
  81109.     
  81110.         HRESULT __stdcall CreateInstanceLic(
  81111.             [in] IUnknown* pUnkOuter,
  81112.             [in] IUnknown* pUnkReserved,
  81113.             [in] GUID* riid,
  81114.             [in] BSTR bstrKey,
  81115.             [out] IUnknown** ppvObj);
  81116.  
  81117.     "
  81118.  
  81119.     <virtual stdcall: hresult 8 IUnknown* IUnknown* GUID* bstr IUnknown**>
  81120.     ^self invalidCall!
  81121.  
  81122. GetLicInfo: pLicInfo
  81123.     "Invoke the GetLicInfo() method of the object wrapped by the receiver.
  81124.     
  81125.         HRESULT __stdcall GetLicInfo(
  81126.             [out] LICINFO* pLicInfo);
  81127.  
  81128.     "
  81129.  
  81130.     <virtual stdcall: hresult 6 LICINFO*>
  81131.     ^self invalidCall
  81132. !
  81133.  
  81134. requestLicenseKey
  81135.     "Request a runtime license key"
  81136.  
  81137.     | license |
  81138.     license := BSTR new.
  81139.     self RequestLicKey: 0 pBstrKey: license.
  81140.     ^license!
  81141.  
  81142. RequestLicKey: dwReserved pBstrKey: pBstrKey
  81143.     "Invoke the RequestLicKey() method of the object wrapped by the receiver.
  81144.     
  81145.         HRESULT __stdcall RequestLicKey(
  81146.             [in] unsigned long dwReserved,
  81147.             [out] BSTR* pBstrKey);
  81148.  
  81149.     "
  81150.  
  81151.     <virtual stdcall: hresult 7 dword bstr*>
  81152.     ^self invalidCall
  81153. ! !
  81154.  
  81155. IAxWinAmbientDispatch comment:
  81156. '<IAxWinAmbientDispatch> is a wrapper class for the COM interface ''ATLLib.IAxWinAmbientDispatch'' generated from type information in the ''ATL 2.0 Type Library'' library.
  81157.  
  81158. The purpose of this dual interface is to substitute for the IDispath interface required of an OLE client site that implements ambient properties. In conjunction with a type library this dual interface provides a simple and efficient implementation of the standard dispinterface for ambient properties.'!
  81159. !IAxWinAmbientDispatch class methodsFor!
  81160.  
  81161. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3zbp╥╡câçΘxPó¥7x¼J│sä%⌡B_,Γl╪│3⌡+]ì ┌£Γ√╬⌐vå╗ÆÇl║≥_ªe rîΩ█╥Oδ@;╔2░▒@ ö¡╤Gb╞R█╡Ω@q╡º÷√╞ª≈tU╢εΦJAuSA4G>é⌠ 9K_▐╚ÖÇZy5UM╬ê àBùΓ╓¡±dΩ«╡╘è;ª╣ëN┘%     ░;ºb6ï╡l╞dUΘ ïÅÉÜ╓GòîàÑE±¢gφ<╥╨±╤I~CZ.╨4ç■;dà=É@àX@Pdômeâ∩· OÆΓ¿A0(Hq┌PÖë┤.oΘτY,╛±L╣ÇæD╩%7^Qüα1│mö≡√▌ú¿½÷╩Ö╠Jæ]«ÉqO4Ñü╒Sî.║mt╝σ▌ñ¼VuÆ£%⌐ì╓Aºφ≥&ì0t
  81162. é╟*▐AÜΩâ½▓F╨█F▒?
  81163. åº│⌡0┴⌡âd╓└Nεª .c±Ö▓óⁿTB├4.µó═I(┬╧≡▄Ñî|V¥·<φ;╢╤f¬:V ╤╖Σ╙OΘ,│≡â█ßÜQS╦`I≤6Åæ─Bπò╔é╕+] ûUf╘úç|44╝g║╬N}U╦å⌡0═πσ5╔+T┼|}πÖöó╤cz%íαë,^ÄK<tDWπ:πf╜¿ÿ9dêà┐╖Vö╠▀╝nS¡G╝Dh«@C1]╦αúƒm]q√[K│j╧⌡S
  81164. Åù⌠φ╤To5[)Kπx₧ûτNπΣ8╫=┴¡o└⌐÷Φb3#\√÷░\≥ê¢ß@╬σG_N⌡0,=°┬==╧┐ls│∙_╖îg╬ÜMÜ₧Qä▀∩TI╓ E─;8╛?Eüé`Bzh╖α┴ó≈o╖:╔≥h┴▀╫y┬╧$rApSσr╘tw╙é■+ásM 6⌐╓╪÷>Fêßk>W«╤£pëJ╞∞Γ;ñ -'└┐)░c╩┐█Γ1Θ┌z5    'z<┤µ¼╜B∞╔ì
  81165. ┐┘û±αOÆïôgΓt ╓₧√½F╚δñ┘Γp╨sá╛╟╙P▄²I╝ #┐ J |,▄[ªX═|Wöe")L⌡ì╧r* ╠╟SèW╛í≥â%à~B5jô¼¬ äⁿ╦%E¬Qö|╫╙A7╙√6█ià!!╓X╪╞│Bo╡┐Ö╟$¡,UV╕x┴⌡÷TRî╢_▓Θ·┼)╬lI┌CåVj$2▄┼ ¿»Xë)╤ó6Hâ^öïå'≡∙ô*°óÅ:≈╬}@¡╣▐4╥┴°öf╗URåk╓î─D««∙K-æÇ⌠»∙╕└0▀δ╬ìΣ∞≈├├ [2sìo╒M^ÿè══O╢â-┐z▐&w⌠■A5Θ█┴Θτöα─&]û>ìNuÇr ,M¬Äƒ÷┴]▀tÿ.▒≈}Rvp╗₧á╒,*┬ƒl╙Z┘╗╗ΓD¡∙)Åq$å▓9q■)ÆC╢fŬ°#
  81166. `åA+εìüë╛DÖ┼8u├+cÖèÑ─\ΓªjÉä╜╔┐½*δ╣5▐ë╪·;√┼╞┼(╬há`}│£Bü┴fv╧l7 d(K╛U1I└║WΓ½!!lφ<ÆÆ╤αq\G╩n²πçìΓ┘ù÷ Éï0╒Ç}úº▒j^╔âñI■₧úuI∞┼┌e├∙⌡ΘA'91Çff╟MΓ╬9¥┬π╜└¥0╠▐[+╛Ö0:7bG╙½εæα«j╜°¿ºn▒=╦≡ídδτ⌐▀*|,⌠┌cü╫╘í╞6mæ»oa▒,¡ôΓ+ö ╦┴½
  81167. ║║╤2    e0@BSSαΣhå╤(╔Vmźzµ£┤╞εòé┤δM═äù«v╣*¿xⁿVδ¼j:6!!Y¥è{²─≥âÑ│Θ╠≤¢]+Pl@▓B╧▀░εO┐j¡ç#±±║áq╫+5▓ⁿƒÑ∞F¢Ω#µ7^╫;0('É╩ôå╥=6è²ñc·ôô;Ç⌠ùå≈╝ⁿd\·M╠ J▀=ÇöVmu¿x╜    ¥±σ├─╗ìφ½~Ö<úºvhî
  81168. -₧3~º7ë'33A■h)ë√X╣é Bƒ.D╧╨ä∩vΦ▀H╩\    ╥çùî(#3╗ëVô┴ò÷8aƼ"╬ GⁿΣ`FÅ`àv√É₧«Σ≥ù▌ß╨╖f?╨δ²· ╨╫àα┬j╝'∩╞zêgΩ0ôM▒+q╦
  81169. $hf$>q77·v╘Z■7┐║-╔«DKYìp"ëαÜ╛1n8σ┤j,à▀Ñ■«Ñ{)ú*fs┴>g$IαmÑǵ▓I─Hzò│IéÆòìÄ▌N+■?vÆ;\┐╕5╚b╤Ñ°φrY&O2╦rê@é╧δ6¬àè[¢┐/p┴╟U╢Vóñ-┬┘╒4⌡ƒ=îsë#j    Lr&M├cà t:?δ¥Ä#}ƒ∙┼Q≥m╚»/@┐H┼╜;&/fê≡█6∩>¼è≈M²▒▓Ü\εüå+Å■z1H≤ÄX₧ⁿDt`{αV~╬I╡±╩/¼ΦC }╒ñsÄ╠φ≥I┌-ckï~ l≡¿≈L\Zα)₧Φ≥{│▓T»ö ú5-Y├8╧+╝┴╕G`â
  81170. ┼╡▓∙│5¡)╨J╞├e1≤┐E V± ΣïX DiK! !
  81171.  
  81172. !IAxWinAmbientDispatch methodsFor!
  81173.  
  81174. αH+"½ü&,ó╜í/ï*î╛åÄ▀┘╠┬╗ασGK║√£mrZT▌ï2 ╫IE&{^d    ╢ò\&an»p\}üñ.ε█Zà▓╣ï░Å ÿd[zyÜ│kr║┴┼ZÉûc½Q°·h╘TC+⌡vû╨^╞3ë=╤₧╞╢├▓3îîÜæp
  81175. ε≥XJ╢eo┬Γ6╨╩LáBª2░∩m`≈╘o╟P.▄R█╡éJgñ½Ω╛║[Φ╝V}ï╔ô$6Zdz$JrÇ⌠^~%9┌┴τ╦0;FXσá#çU╡ ▀¼∙y≡ùä├Åd⌡Γ╟╪%Ei╒B²gHτú)┴~tε ¢éçπ╡!
  81176.  
  81177. αH+"½ü&,ó╜í/ï*╗ö ╬▀█╙┌⌐╤¬]W║ú╘VvFC┐εWºMM<oOV+B╢▓M&2Gª<Ek«╛%║╤D@╝┐▓▐░εÿc}`t▀ñy½╟╒à£p╝W»=ƒ╝EG xεfò█Zêc╛,├ù╟╢╬╣3£Ü█■fεπRGºi~É»'╤ƒK∩DoÉI█±"n⌡Ö8├Pi╒2┤╥ù4ú¼┘≥∞    ┐╫oR¡σ¬/`H@E Xτ"µ b[B└╩K╩µ|c=A@▀┴ Öƒπ╨║≡dñ╣Ä├Ä;¡≈ë╩ "Un╓ûfw╨öZ⌡Ao¼9íÆçè▄Iù┌à╟N°'Öd∩'└ ∞≥H|k#Tÿ^¿■#X╤╛|÷9ov\ñOOí╗%ß+)P╟╡╠X?.Oj√╨╟ÉkΩèG▌Æ#÷╔ëN╠8-QLQ╤Σ <¥`═╗╨└ ┐»²óï╪¢èY▓åJY(■ σz⌡9¿n`X≥░ª╧╔6u┤¢ ½σÜ!
  81178.  
  81179. αH+" ¼Ç%ô─µC╟∩╟°╔∞ù╦▌╗▓∙EB¡╣╧t─à2GÆK,.O[nO▒áUi1|½sD_ï∞`Ω╠M¡Ñúç╖└^â|[@|e┘╣d$½█Ä4"ⁿ>ûe╜Wñt₧ª,6αfô█ôP4¿    /╥É╧≤îòZ╧O≥±■f▓▒VJ▒wi┬≤^┤╢^ΘR8╔MÜL«m)╧µJδc@⌠ô≤¼h4╜½∩╖«k┬¥sY╡µ▀`k APYé∞y@Gⁿ>ùQï»Jz9Q╖δF╡[ àτ╘¬╝`≈òâ╟ƒ=íÄú!
  81180.  
  81181. αH+" ¼Ç%ô≤╠:çφ╪α█═▀╨┬ï█╚9*²ê┼o3\^╫─(S¢JAja]≤┴Yxj*@┤O[e╡₧    ╜₧Rºº▓îπ╓\æ4Jk ╒╛g7¡▌ÇNZöâqεA»=ä    ∙"cQívÜ▌\òTq╛@(▄╥╫■╔α/₧ ìÖ£s≡▒VVÑu~î√₧╧]╞M#├HΘⁿ:T╨ë¿+F┼3í╧ùV}╜⌐ó╛º#ª⌡bP╝á╜BaOF
  81182. d>ïJ╓>w%=ú~ñ9╕äjXw σ╛<ƒ^ùⁿ▌°▌mΦ╡û■Æ1ó╓αAóo^b{8╡r┴OB~╨ÿHεYd╬)▒¡╙₧▌iù┌╩±qⁿ'ÅB¿h¿ìæ¥w,%o+°%çΓ,i╤'ïJ▄MN9╞hrêΦ ∩eÜΓ∙V#8Erêw┤╗τWîσ#╣ΘHô£¢d▀ 4=*!
  81183.  
  81184. αH+"¡ü6&¡Ñë9ûΓ└µ┌ ├╓┌░ƒ╧:₧╡╙lvZ╞î;╦IE8lT\gQ╢ùUs#¼z~¬«`╜ N ºáÇù∙╦    ¢qMOc╬╡{3║└╧W╒üe½Qód╨·[=ívÜ▌\òTq╛NQ╣√δ≤└░`£ûòö&OΘ╘YEál;ì²s┌╓LµC#╔═²)nε╦}╤Q.┴<Ñ╒òE`║í÷╣ók┬Ö
  81185. 5Ñá│rCGKz_ΣcΓ#fJBëMÉQ┬ùx_bbε╛ñu.╓■╘»╡/ë╨Φ▐ƒ2│Äú`ª2-"░p≤CV∞╡f╫a^ ┐éçç╔IÅ▀╩Φ┤>⌐|Σ!!ïèÆ╢$Gg\L/▒6Ç╪/oö7ï#╡!
  81186.  
  81187. αH+"¡ü6&¡Ñë9ûΓ└µ┌ ├╓┌░¿σCA£║╬LzFR▌ô2WäLe)zREj≤∞t0$]¬jR~ºδm║φGΦú┐¢╖┘éqh ╬┤hrΘΦ╠UGé!!ÜqíT║xâ▌R[.αpû╤W█d╛,╓Ç╫∩î»u╚ù₧╙sñ⌠TPΓwzÆ 6┌ƒ]■;─ZÜ{ÖD!!δ┬{╟Kx┼-±╚î`╗½╕ó÷║÷oS╡╛≥ bSXh&┬J≤pAg└╔¥¡\~/bO╬ê9èN╪¥╗╤╘dΦ¬Æ┘ê7╗ΣôIê 9
  81188. ╣<≤4[δóh┬a^¼ùÅùü╚D₧┼╓ªC≈9¼j⌡:╩Θ┐▓p+&oa╘ª█%« îZ█@No╞Alü⌠"╘+X╟╡πR")kj▀ ▀╞╨K╚Ä6C▐ûrû¢óΦ
  81189. ya?÷╧,╜,ç∙√╙¢│ ▓─£╟ZÅKüçQ_2íåèZÉG╟ $uæ╙┌ºÖ)xàÄ9ªä░Gá··%Å0?é└≡T┘╣wܪ»VàöK²Uui╜║ó═/æ∙₧(ùïC┬╡hI└!
  81190.  
  81191. πE$7¿Ç D╨└╬ ï,÷╤²îΩ▀┌òΓ÷▓\Q╗σÇmrDC╫─1T╫KL/.qj ²óUi4πlAe▓«2ε╟«≈úû≥ÅöqWkrö╤[å╠╠I[üÜr⌠±Zò╝EG xπe£╒^ÄMaó|╨¥╧∙▐τ1σg≥±·`O» DSºrJg∩àZ▀╤L≡D=îçV╗    V╓⌡\éLk╫v ▒Θ-g╢ó■ôèo┴≤eHå┬│        FIYth╬ φ't]ñ}ñ/⌐«Ub.J╚Ä"óTô≈╘¬ª!!σ┤Æ┌ƒ,⌡⌡╚┌Za!
  81192.  
  81193. πE$7¿Ç s·¿»%ë0≤öéªùò∞╨¬▓▒[F ⁿΓzpCu▌ê1@╨T8aKVy∩┴_&2Gª<Aoí«)∞█P@╝╕≈è ╩\BôcQj>ܬl>╗╠ÇVN╒¢5»Q▒h¥≥EdRêLÜ╥IÅVfÑ;ë╥ä┼╔┤3£Ü█æ} Ñ÷EK╖n;üα?╤═Ñ,Eí5│÷!!g╣¬½+~╒+Ä■éGÉí⌠±≥\Φ╝a╢∞╜BlU{jrç ╫%t≥4┬à│z5MH╒û╦S░±▌½∙;ñüÇεò2║±⌠@Åh]b{j╒}∩,{Sφú[┼kφ«ÇüÅ╥MÅ╙╫!
  81194.  
  81195. σM4
  81196. 99╜«!!┐»ì?ë+î╛åÄ▀┘╠┬╗ασGK║√£mrZT▌ï2 ╫IE&{^d    ╢ò\&ak¬oCfú▓Θ·G⌐ó╗è░Å ÿd[zyÜ│kr║┴┼ZÉûc½Q°·h╘TC+⌡vû╨^╞3ë=╤₧╞╢├▓3îîÜæp
  81197. εσ_AΓcuû²<╥ƒ^⌠+╔Y█ 9&╗¬»(▄░╥ÉSqíεΣôèo⌐·sK╝≥≥P_%c*T»$╫(^`|ë╚├∩4UPI╓çBß3kæ⌡┼ç╪h≈¬ì╠âª╟╠╬;HC╜r∩qM¼▄⌐SZΓëäü╬▐[┤╘╧πAαZ!
  81198.  
  81199. σM4
  81200. 99╜«!!┐»ì?ë+╗ö ╬┌▐╠┼▓≤╝rP¢╛╞zfDB┐εWºMM<oOV+B╢▓M&2Gª<Ek«╛%║╤D@╝┐▓▐░δçx_Os■╣k3╗┼╘à£p╝W»=ƒ╝EG xεfò█Zêc╛,├ù╟╢╬╣3£Ü█■fεπRGºi~É»'╤ƒK∩DoÉI█±"n⌡Ö8├Pi╒2┤╥ù4ú¼▄≈≤ñ⌡y}¬─╖ pJAE Xτ"µ b[B└╩K╩µ|c=A@▀┴ Öƒπ╨║≡dñ«ë╚┌=║φ▌└    w
  81201. C╕y·aS÷÷¬1ào╢│╢╜Ωd»û·┘Qα3╗gφsßεδ╧Gpnm8≈6å√9-ⁿ^÷'╢#HL^╞VA┐╥═>~τì├!!8nm╞▀╦°W"àσ]?╗δ─°⌡.£AR=*x₧µ-)äm¢╗╦╞
  81202. »╗²║æ╦├MÖK╡êQu°╥Ö┘(ómjFû╘┘≡╓:}æ┌%⌐₧±Xá┌·%Å-!
  81203.  
  81204. σK$2:+░½=<╕Ñë    ë6Γ▀╔└ ╨╠╕╘¢τrM¼¼┼i3\^╫─bVÇPV.0Ejπä^V`f[½y-åñ#╥╤Qî╕ó£√╩?₧wU&ba▌»*r╛█╧IMçèVz¿óuòAεTL 1≈aìÉ4÷+\⌐ ,└å╤ ┬º)╚J¼₧ç<ª⌠`ìC"T▒█≈√}╦bτ▄≥*r╛à¿/⌐#±▌ìWc╢╝╕Γìl┴⌡nO«σáJX8/Q╝.ú5fñ}ñÅ¡_V*%▌ä;┤~ò╪▐½ΦEδ»â┴ƒ╣Ω╩Θ    6 Yⁿ}≥cZ≡ ¬eφìûû£ƒIê∙╟∞G≈]╨!
  81205.  
  81206. σK$2:+░½=<╕Ñë    ë6Γ▀╔└ ╨╠Å■ΓíDg░╕Φt`\r▌æ<^Æ|H#mPug±Æs3d▒uEk╢«`╖₧q╝≈úû≥Å
  81207. ¢a[@afÜ¿e7εÄΣVK╜ÇQíV┤qò"≡XLφeÿ═▄Rfú9┴å┌╢├ª3£Ü█£~½≥C╡r kÆΩ7₧▌FºU'╔╖|Ümsⁿ─}╦Tk╥Ñ╙├P|╢εñ·≈    ║≡>╕≥╡`HAG&"è╟3Y@C▌3┬ê¡\N0JO╤º#è]╪¥╗╤╘dΦ¬Æ┘ê7╗ΣôIê62R┤y╝+[|╩₧Z⌠Xr╚$▓ó┐уNù╫┬⌡Öx]╨ê≈┬╦Ω6r)p9Z)⌡4Æ√!!%╡;£f╨ Uflôblê╪9Ω    .z─úΦDyW p┐!!╫▄ΣÄ≡U-╣·M▀ÖÉI┘l(TW5═≤ .àHÿε┌▐ Å╢°╡└¡╟^¢KΘ▀(<MΓ σ~íC±to
  81208. ∩½▒┬à,eôÖ-½ä¬╢ⁿΦ<ÅT0eU╟╫≤R¥┐Zµ╬âGÅùAπ1éÑ«┼
  81209. ╨ⁿ£Sⁿ!
  81210.  
  81211. σK$2:+░⌐>(╜║ß@∞}└┌ⁿ█√┼ƒ┴╢≈σG¿┤╥-@╙ê+W╫PBjzSV+H╥Äqi5[àpRm▒∞`Ω╠M¡Ñúç╖└^â|[@|e┘╣d$½█Ä4"ⁿ>ûe╜Wñt₧ª:=⌡$ï╓\▄f[Å(αª÷▀ΩîR»MÖùÆ{Θ│:.╧
  81212. cg┬ε=═╚Z⌡3í5│²>vⁿ╒8ÿ.êå≤▒`4╜½∩╖«k┬¥sY╡µ▀`k APYü    ╦#ei\╚▐K╩áW~+F^ö∞EΓdÿπ╞╜ε!!σ⌐«╧É;╢≈ñc!
  81213.  
  81214. σK$2:+░⌐>(╜║╓jò;÷≡α╧╓╪╠┴ÿ■ñTP╥╤⌐9CZ_─à*W╫kO≤┴Xj3JπsU*╢ú%║Öf½ƒ╕ìπΘÉg@~r╒¼h ║╨ÇVN╒¢5íA╝xô╝F](±a¢₧[à`ñ|╛°¬╢▐Ñpìë₧ü<í▒CLº Vòα!!┌üµS(┘R▀τa!!Θ├oµMmΦ0ó╚ÑHu┤╜╢ôèoDZlL¬⌠á bLU7ÜJ≈51kΩ?Γ"╛öpKbkÜç#è]╤¥╗╒ûìÆ│Φ⌐ Ö╫ë6≡#░p╝+{\╩╛z╘KWφì╔■Σ╢!!≥φ╠Φ┤>⌐bµ=└π╕╙HnM*╒8É▀"vàôO╪ ∞    "αæXëcyJ┴░√B06
  81215.  
  81216. j╥▀▐╒Fê±Y9ó≤]▀╟╔┌;7BDO»ÜM=.ö`æ╗╤▄¡╢°▓Φè╟S±2!
  81217.  
  81218. τK)XR══'⌐╛ë8┼>íê╔├≡├üò╗π░ZU╛╖┼ugB▌─*ZÆk&kUdΓ┴    Qo%Gπu@*╢ú%║Ödªú≡▐τ▌ÆfJ.o▄ⁿy:½ë╥\KÉàgα█²kòMεjï₧E±(╝&3▌åâ¼æαZ«æÅ╖u╛▒YA╡Prî√6╠æ2ì(<╔S▄V⌠(u╞ßw╠V4Ç/ù╙ìP:▐─æ└≡ º·t░≤£i\@3éµMpJi_╟ìÿ«TB0Fj╒Å;╤░ ▀¼┴ Ä!
  81219.  
  81220. τK)ox┤⌐='«Θß@∞}╥╤√îΩ▀┌ò∙╘¬]W°√╨i|XS└É'ÿY>f^y
  81221. ⌡äOc4╖s~¬«`ªφVº╗▓╕°┴T╔4Hbu▀ⁿb4ε▌╚\ööx½Mó3²kòyJ(≥pì╫W¢4δ39╟╥╫■╔αràû₧¥hO¿■YPσ"g∩àZ═┌Sß,EÑ6╩τG÷╔lÿ~µ0┐╚ε.!
  81222.  
  81223. τK57¿Ç D╨└╬ ï,÷╤²îΩ▀┌òΓ÷▓\Q╗σÇmrDC╫─1T╫KL/.ud≤óUi4πlAe▓«2ε╟«≈úû≥ÅöqWkrö╤[å╠╠I[üÜr⌠±Nò╝EG xαi¥╫\ÆV4¬.╓ò╤∙┘«w╚Éù£nH∞£=)╚    ;âß ╔┌Mº]Bª6█α:dδç"ƒ&Σ₧εºz╢╣▒░ìl┴τeP┐ì╪ckbCA4@=£└<~]
  81224. ë├¥ñK#Q)%Σó çU╓÷├╖±HΩ«ä╩ƒ,∩ú╚▄2R╜pΘ
  81225. 5!
  81226.  
  81227. τK57¿Ç s·¿»%ë0≤öéªùò∞╨¬▓▒[F ⁿµtaMu▌ê1@╨T8aKVy∩┴_&2Gª<Aoí«)∞█P@╝╕≈è ╩\BôcQj>ܬl>╗╠ÇVN╒¢5»Q▒h¥≥EdRêLÜ╥IÅVfÑ;ë╥ä┼╔┤3£Ü█Æqº⌠YPΓfiçΦ!!╤╩Qπ,├S╒┤o ô¬½Qk╠9±▒Θ-ú╗∞┴╞    ║±CS╡∩áPB-Gvj=£JΩxC└∙ƒñ-`C╓Ä=╦M ÿ⌠▐»╚dⁿ«╝ìô8ôΓ┼╩_w0 │p≤Ió▄⌐2àìó£é╨Z⌐╙├ªCτ"1¿j∞6╤ΓΩ!
  81228.  
  81229. µA3%4¿Ç%
  81230. ╡ºÿ/¥+╠╤ß┘ñù╧╫ƒ■⌐\T£┤╬ovPB ü0G·5-h^IZ}Γä^&J╖<Gbºδ6√╥WΦ╕▒▐π╟^╨UR aw∙│c&½╤╘tM¢╘Ve╝Lªxéσ@x⌡lÜ₧KÖAqÑ9┴▄«£ÑêväîÅüu⌐½çn yÄΩs╤═πH<═]╓│.n≈╙}┌V.═:┐╔É┘├Æùë.Ü╤Siò╘≥5=vRQg>éJ┬<~Xs╞┘Æ╡th2V╖δFΓ39Öσ┼⌠╝sß«ù╠û⌡╒Φ;µ$?-!!ôS╨E4OαÉe╠bL╧    Éòûû╦e₧╪╨»ÖxY°ï^»Äñ╔T}ZE}Γ#ù⌠,i¥n▀F═RWoÆ 3▄╗#Γ'S╟«Ñ    \P#'m╙╪Æ╨Jü∩U.ö■Eô°⌡!
  81231.  
  81232. µA3%4¿Ç%▓ª¢¼eí─φφ≥█╨┬ì·¬Dvû╓¬1xD█Æ?FÆ    jI^G+■ä^Og*Zª<\lΓ┐( ₧!!ñ╗╕ë─╟    ó]@~r╒¼h ║╨ÇVN╒¢5╝F╡xÖ∙CdRêLÜ╥IÅVfÑ;ë╥ä╙┬íqä▀öü< ºΓVF«eJN½¿^┤▓5Ä(■zΘ#▀!!╞°k╓Fm┴3╜£óHx╝╣╦÷∩¥▌(1╙ë█c9jSAG& ï⌡<LfΦ%Σ0ñòfOl`É┴?ë{Ü ╞ï⌠n≤Å¿ä┴S▀èïdÑh]bN╡nΦuSóó}─nZα
  81233. ─┴¢£┌[Ä┌╤ªºR&╗yπ<╩δ▓üw,qL1≈wÜ∙;d¥=¢m▐M/    !
  81234.  
  81235. µA3%4¿Ç%│ºê%Æ3Σ╟ⁿφ²├╓├┐µ¼\Mσ√╨yPIXσì0VÿHH/}Hrh ùMcK%╩>cx½╜!!ε█MΦÉ▓è╖█╫b_ {eÜ│kr║┴┼┤ƒbÖJ╕yƒ≡T\Γpû╚XêK{óG|├Ç╠µ╔▓gæMÉ¥╙h½▒EAíemç²}│╡6╧D#▄L╬·#fúç?τLo┬3┤£îV4╖ºδ Γ
  81236. ¡┤wU╖Σ╜`UFKg1Ü⌡$x@^Äzº|α╚0Ef∩¡╦e=àΣ╒╗²mΦ·á┴û1ó╘└╦
  81237.  »] }IπÑ`╧cül≈Φ·╡╨]ÅÜà⌠Gα1╢VíΣ╒╤■4rVm)f╗wâ⌡dƒû@█VNfòsAÄ∩<⌡ 1Yü∙é=Xx's╝sé─╨VòΓPjñδM£öôKäl0BE╫ⁿ0Cd╤zûΘ┌▌á≡»█íΓ⌡LÖTª─LX2í₧åΦ+ín r!
  81238.  
  81239. µA3%9ºä&╢ª₧p┼/Γ╪²ε ╘╘╥¼²░]G╥╤⌐9CZ_─à*W╫kO≤┴Xj3JπsU*╢ú%║Ö`½╝öæ√└Y╫dL~e╚¿trí╧ÇM@ÉVüv½JáxéOæ;&!!=φtî╩KòLs÷@{αù╫╢╪¿v╚₧ÿÿ{íΣY@Γcwì²t│╡2ì(FΣm %╞U╣°G╤Vj├>╜╨├fu░Ñ█±∞    ║╝6╨ë█1pRKt7ÜΓ`|∞(ε>ªÄk'|SO╓ôèY    æΓ▐¡≥e¡ß∞º≤|╪ëñcªY!!⌐}≡OgKµ▓h╠a¼îäÇ¢╙\█çöªFπ"╛!!┐^»Ä╞╠JoG+≡;Ü≤d¥8≥$!
  81240.  
  81241. µA3%1╖ƒ>(úêƒÇ9α┴π╪ñù╧╫Ü√╢CO╛óßhWMP╙æ2F·5-h^IZ}Γä^&J╖<Gbºδ6√╥WΦ╕▒▐π╟^╨PW~l█ÑL!!è╠╞X]Ö╘Ve╝Lªxéσ@x⌡lÜ₧KÖAqÑ9┴▄«£ÑêväîÅüu⌐½çn yÄΩs╤═πH<═]╓│9iⁿç{═Lz╥0╜£éW4╖½■ ⌡
  81242. ╝│6╘è█c*Wcf>J╬5▄$uLQ┼ì5â▓Ia=Zm╔Ñ*ì[ÜΣÖ╒ûì╙║┬Å*∙ú█ █6/Cè]╬&Uq╓ÄK∩BwªFÄâ╖ç╠Xù╫▄╟Q╨6╗~φ'î╝ò╡s%k#T¡!!Üσ9pÉ8▀]╦BCoè: àΘ0≡)Hê≤╢';Xq┘öî┤.o╛≡Y&▒┐@æâ₧K╫(QL»Ü!
  81243.  
  81244. µA3%7ºº=:«ìâ?ç3Σ≈π┼²▄∙┘┐⌡╢    »┐╫_|K~▌ù*vÿJF&kx_b ²ºXa5"╔Z░ó6√╩G@σ≈É¢πÅÆ4Hbu▀ⁿb4ε▌╚\╥2£]íPóYƒ■]J*4Φgö°U¥Egδ@,┴¥╙≤▐┤j╚Ö█çt
  81245. επRGºi~Éí^┤╢wΓM?▀K╚²*;╣ÇK╟V.╘7┤£ºkW¢ü╦╩╒/î╓Lò╦≥ dAFL Xπ`è~Cjcⁿ;∙Q╡₧Jy8@M╓ìo»U╛ ┬¼╪n±╕ì╚╣2╝α┬/├0Zn╓òfOP≈Ñ%Ç^°ƒì«╬╩Fê▀┬ΦG≡R<╡eµyà≈ⁿ╚>Ijg    Z)╒8å⌡!!`▓8ûM╘>MCdò);αæ\ígO1ó╦│A8(^ ┌Z═╞▌Gî∩j┐φLîÇôS₧~aD═Γ Icⁿ■┼╦╫¬·°╕▌è╟Vÿ{íêI;N!
  81246.  
  81247. µA3%7ºº=:«ÅÇ+é,╗ö ╚Θ≤╨╓û²╢Ge│║╟h"?É┤,[ü^P/.L
  81248. Γ┴
  81249. QcfYópFoΓñ&║╩JΦ≡ôæ⌠τâRRis¥ⁿ} í┘┼K\îV£5║K│=é TF=≤*≥┤0┤Gx╝(┴¢═±ûα4╗ï█çt
  81250. ε╒xgèO9O╖╞≥■xºG#═X╔Q₧G ô«ΩpK≤
  81251. ¥Φ├{Ká║ⁿ²ß
  81252. ñ┤DS║╚╜CJT uzπ`è~YJ@E▌[ìÅ╡Ol0~ ╧Å<é] ô⌠æ┤≤oπ≡┴▌₧)æ∞╩!!└#-╗o╡T5ï≤¬1àZêêüÜ╩Iùû╓≥F≈<╢1í;╫Γδ╩R)Q    9µ8ü≤g;ⁿ^÷p╠MD#Ånvî≈<τ)$P─╧à!
  81253.  
  81254. µA3%7¬¢hi¬Åâ$æRï╜¡ⁿ∞▐╔╘¬≈σÿ╛╘;g@SÆÆ?^éZ%hGc
  81255. ╢╞8Vh2πlAe▓«2ε╟«≈úû≥ÅöqWkrö╤[å╠╠I[üÜr⌠±Nò╝EG xαi¥╫\ÆV4¬2╟╒«£í╩ß%¡╛áI#Ü▒h{▒txâπ?₧∙PΘUgí5│Ün∞╙4éPk╘)░╨╛]òí÷Ω─╗Σ*∙≡ö qf [╠gëzZF└┘ï¡~(GO█ì#╤
  81256. ä⌡┬¡≡uñΦ╨ì│║φ▌-╞'AX]╤ò1gZε╖)╔cMφ
  81257. ùà░Å╙D÷╝!
  81258.  
  81259. µA3%7╢è&╢ª₧p┼/Γ╪²Ω±┼┌╥¼²░]G╥╤⌐9CZ_─à*W╫kO≤┴Xj3JπsU*╢ú%║Öd║▓öæ√└Y╫dL~e╚¿trí╧ÇM@ÉVüv½JáxéOæ;&!!=φtî╩KòLs÷@{αù╫╢╪¿v╚ ÆÖÜy║▒QK░eiì·=┌ƒ\ΦM ▐╖|₧GÉ∩Jτq[∞ ±π╝W`╖¡∙≥∞FÄ√rYÜ∩╛-+?b[╡÷|1]U▌╠╖ßvA|o⌡¡╣Bå≤▌¬┌n÷┐å▀ò+╗τÇRóo^Ii╤òSbV≡Ñ|┴a ÜéÆé╙█▐╫πQß$·:▓s┴≡≈═ 7"l Γ2ƒ±mlƒ"₧B╓bCoè
  81260. !
  81261.  
  81262. µA3%+ôå<-╡╛Ç/û,╗ö ╬╫─Φ▄░÷¬DO║¿╙!!Γû7DûKAj#tn╢ò\&0N»iV*¡¡`ε╓G@∩₧ñ⌐■┴Çx[}'ܼ=╛╠╥MQ╒òVaªF÷oò∙XY *»    ⌡╖qÖNd┐.┌£─¼îτZ¢Mïôû<íΓCAª     tî√!!╤╙≡H!!╚P═÷>r╣╚jéLa╘`÷▒Θ)┌╟╨╠┼5¥╪Tå▀ífGY&¥=Ω4~X\╠▐Yτ╦0UxC╧òc╦Héµ╨┤┴!!╥¢│Σ╗ü▄δ&α)}Kòo╦z[φªe┼~HÑ]≤δ·╠▓"÷╝¼║T²$»jφs╓≤ⁿ▄JeFA/⌠$å√9%┬a▀X▐
  81263. CMlè*>αæ\▌ P╬ΓµY';Fz⌡╥▐┤.!
  81264.  
  81265. µA3%7ºÄ>,ôì╓jò3Γ▌δα±╘▐┘╗█ü>)╓∙≡iz^W╞ü~╫xA>.O[nOαÇLcf@Ñ<Gbºδg╓╤Añ▓₧║░Å ÿd[zyÜ│kr║┴┼ZÉûc½Q°·h╘TC+⌡vû╨^╞3ƒ(ôå╦≤îí~èÜòç<í≥VHº'g∩àZ╖≈m┬rαkÜ)╠>u²─y╬N.∞0▓▌ÅA]ùµòöëo┴╧oI¡¼≥qPT[r¢≡7JTë┬ìδ}0@E▐¡ ê[ô┘⌡±º Ä╙├á≡S▀èò╞#ⁿoΦ w^ε╜3ÇeIΘïìç╬Ä█╥╥ΘP≡Xn╫ê╓Γ⌠┘ZOgYE4⌡Æ√!!√!
  81266.  
  81267. µA3%=╖£3.┐¢ë,ë:Γ└╡îε╒≥╞╣└áUO║╕╘!!Γû7DûKAj#tn╢ò\&0N»iV*¡¡`ε╓G@∩Ü▓ìΣ╬ÑqX kc╬√-"╝╞╨\Zü╙sεW╛x╨∙RJ.Σv╤│3⌡jqá/╟Ç╩°╦·3╧(æÜæp
  81268. ε■EªizÇπ6₧╥Z⌠R.╦ZÜ÷+mⁿ─l╦M`çR█▒Θ-¢£▌═╒*£┤_c¬⌠╢    iJ&c!!¥ ΣtI\╠┘Yτ╦0UxC╧òc╦Héµ╨┤┴!!╥¢│Σ╗ü▄δ&α)}Kæo√=qYε┤j╘$ül≈├■Σ▓"≥è╙∩Pα1╢+≥'┴Σ∙╙)GL.Σ;ç╖6╤"₧\▌NN)╪
  81269. Σ┼&µ#┴¼∙V=3N:┌│╕!
  81270.  
  81271. µA3%(░å='æ¼òä+ΘÄ»▄ⁿ─╦╟æΓ▒ZL▒É┼bCIB┌ΘT;╒oV#xZGnO╗┴9\rf[½y|úº5 ₧MΦú┐¢╖ê3â}QEe├îl&ªÄÇIZÜûa╖╣{╨⌠T=Γaû╚\Ä ╞i╓₧╙σ╪▓zå
  81272. ┼█╘O
  81273. ║▒CLº kûµ<╨ƒTΓXo▄^╬┤@ ö¡½j\σ ä≡╖Kî╜∞·πñ° s⌐⌠╗ NCL;g&åBÄ}Y&k╞┘]╩│\y*B@τ┴╕n0▄░┴║∩u÷òæ┘ô1╗╚╠ #[X╤òM5Å█£{R■ïǃ╬╠\ƒ╒─ΩN«R8¿n≥&╔≤╕îOk\[w»Z∙₧vö8Ö╓WCoÅdCî≈9Ä`!
  81274.  
  81275. µA3%0½ÿ;╗½ñ+ï;φ╤ⁿû╛╟▌µ╢²▓tQ╛╣Φz}LZ╫ùS8■t8gMR
  81276. ╢╠^~c2╖tV*┤¬,∩█«≈úû≥Å[-ƒ{I'|a╪öl<¬┼┼J╒üe½Qód╨·[=ívÜ▌\òTq╛NQ╣√δ≤└░`£ûòö&OΘ┬_K╡ i┬τ:┌┌αS.╬╥²)mⁿ╘?»(¬V╪⌠▒aGåé╠╛▀9╗αd_╕∞╛J1mIB,t3î"Γ4}JCüzºxπ╚oLjm⌠╡⌐u-║║æ¿■R∞╡ûΩê?╖╦╚╦    2[X╤òM5Å█£{R■ïǃ╬╠\ƒ╒─ΩN«R8¿n≥&╔≤╕ìNNK2■;┘⌐@°
  81277. îK╙KmÉalä Γ)1ó!
  81278.  
  81279. µA3%0½ÿ(«¬ä#ï8╗ö ╬═▀╨┬û≤▒PK╢╡╟!!Γû7DûKAj#tn╢ò\&0N»iV*¡¡`ε╓G@∩ä┐æατ
  81280. ö|Wi'ܼ=╛╠╥MQ╒òVaªF÷oò∙XY *»    ⌡╖qÖNd┐.┌£─¼îτRÜ▀£ü}ε∙VJªlh┬Ω=▀▌SΓEhí5╖|ÜDI╦ΓK≈nZÇÄ╧ù@w▓ó⌠╛╙ºπH]¡π║ b8a[τ<┬%Pad÷5Γ>ªδ}>pD╒ûèN₧∙▀┐╡:ë╨ΦÅ≈T╪ëáU┘ %░<∩p\π╜eÜ-S■ìöƒÜƒ╬û╙τP÷?╢!!┐^»Ä╞╠JoG+≡;Ü≤d¥8≥$!
  81281.  
  81282. µA3%+í¥&╛¼╓jò=╘╟Ω▐╙╪█╨╙ÿ╠s¡▓╓zgMƒ─WâP"kEjπä^V`f[½y-ù╕%Φ≤M¡≡≈Äσ└ à`G@afÜ¿e7ε█┼ZM£û;├)▀Uò∞B[∩c┼₧»G`∞4╓╥┬√╬⌐vå▀ÄÇyεⁿX@º'g∩àZ╖≈m┬rαkÜ)╠>u²─y╬N.⌡,┤╬«Kp╢µòöëo┴╧oI¡¼≥qPT[r╕+╤>_{oδ8Γ=└ßIo    PI╚¼ Å_K═¥╗╤╛ Ä╫δñ╞(╝±▌╬    w┐}≡.Ωúl╙xW°F╧╓╙ÿ▐ZÖ┘╩Ω¬Z╙U≥6╔ß╕╓PhCM≡;ƒÜG!
  81283.  
  81284. ΦW;<½ÿ>,⌐║ß@∞}└┌ⁿ█√┼ƒ┴╢≈σU╛⌐┬t|DÆÆ?^éZ%hGc
  81285. ╢╞7JQ/AºsDfº╕3╜₧Rºº▓îπ╓\æ4Jk ╚╣n7º▀┼K°|·>póSÑié≥VI╚w▀╩QÖ|ú(╓ûâ⌡├«gÜô█äu¬■@Hºs;ì²s╨╨K╕mí5╖|Ü1!!°╔k╒G|Ç#▄╢ΩEzá╣²∞á\⌡┤(jÿ╥¢+,Qyw$I╬µy?":á╚î╠3UDI╬╛ÿm ÿ⌠▐»≡d≈⌐█ì¢0ª⌠╠üh]b,▓oδ
  81286. fπóF┬g^∩≤δ!
  81287.  
  81288. φK$=ì½_C╙δ¡$û(Σ╞»╪÷╥ƒë║σ¬AGß√╓z]SÆï8âWAj)w\h·ä7}!!f_▒sCo░┐9║╤D@╝┐▓▐σ╩₧b[ ░╒E7ó┘╙MZ£öL5Θp│i╨⌠T5πmÜ╨M▄N{»0╓╒ü¢ª═ß▀Ü¥o½πX╧
  81289. czîⁿ$█═╜oä{φ9┴    !!≈┬oï ¬Vó┘ÅB┘╟æ∙σù╪o_╕∞╖#&?Tu%ï¡zZqQ╟┌ÿßX~AF▀é;µ0!
  81290.  
  81291. φK$=ì½hi¬ÑÅ#üε╫ε└√■√╕╘¢τcQ╢¡┴ovÆ╖;F╫KL/.MRg≤┴_&2Gª<F¡¿!!÷█k$∩≈ºî°▀ âmh ╬┤hrí╦╩\KüVät╛S│y╨σ[=í    ⌡╖ÄGw⌐    *╓ÇâΓ├αgÇ▀╟ùk╝⌡    úrnÅΩ=╩ô≈M,┼[÷≡,mⁿε\î/⌐┤╨ôW`íº÷∙║F∩╟eH∙⌠║BdKWc<ÜJ∩3pCUÄzº|α╚0Ef∩¡╦e=àΣ╒╗²mΦ·¡┬Ö?╣µα-çh]b{jçu≥24J∞ó`╟c^ΦFÆÄ¥ëƒXù╒╠Γn√1╢n╚î╝ò╡s%k#T¡!!Üσ9pÉ8▀]╦BCoè: àΘ0≡)Hê≤╗5-E zêw┤╗τWîσ#╣ΘHô£¢d▀ 4=*!
  81292.  
  81293. ∞A4    4?í╜7/╢¼Å>ΦUêû╬┬φ└┌╟■µ¡Vπ¡┴iqGY▐┌~DûSQ/.TU+■ä^K#\░}ToÉ«&÷█A∩≈ºî°▀ âmh ╬┤hr╝╠├\AâüX─*₧x£∩E]6µ>▀Ö|ÆCvá|▄Çâ≥┼│rèÜ█₧y╜≡PAΓr}ÄΩ0╩╓PΘmí5╖|Ü1!!°╔k╒G|Ç#▄╢ΩEzá╣²∞á\⌡┤(jÿ╥¢+,Qyw$I╬µy?":á╚î╠3UDI╬╛ÄIù≈╘è∙gΦ┐é┘└~┤φ┌╩yfxjé}≥cZ≡±h╙BYµ¥ò■Σ!
  81294.  
  81295. ∞A4    4?í╜7/╢¼Å>▀±╓┬▀∙σ┌╙▓≈ªG.╒╥éKaA@╙É;┌w/zGc
  81296. ╢ùUs#¼z~¬«`╜≤G╗╢░¢┼╩ÆwJG.p╚│}7╝▌┘GôVçpεL┤wòΦX±tÜ┌₧[4╕9ô ⌐ƒî▓vïûìûnO║■P¬eJ'öε!!▄╨Pδo═M▌■(oφï8╥@C╙8â┘àHq░║╢ôèoDZlL¬⌠á bLC<Å∩p~]═▐ê¡\-1F_╔Ç(Äô÷▌╜ uφ╡Åè≈T╪ëá`τ78'/ê<├0gKµ▓h╠a┴ìÆÆë┌z₧╨╔πAαZ]╨êZ■ε÷ΓZpH}/h┼▒╪I╤$¥c╠sGeèecÖ▓nÄ`LÑ╚é=Xf\l┬▀▐ÖWäα]&╗Ñ    ùçÜT╦ ,Céµ%?₧c¢Ñ╡╕gÆ⌐⌠║═╦┬QèY¼ìAu%¼₧Γy!
  81297.  
  81298. εT3:6Åè+╗╜äG∩Vú⌡ß▀Θ╥═ò¬·á╜¿╘i-@╙ê+W╫PBjzSV+H┘æ
  81299. Pi(dªeck╢úg║╬P╕▓ÑèεÅ╫`V.r▀┐h;╕╠╥% ╗y╛PóoÖ√ N Σp▀╩QÖ{╝5▄£â²╔╣3ÿ ïô╘>b─£=-╛  uæ°6╠ƒCè+F═Q╔÷?!!úÜ8αqZ≥┐┘ö
  81300. ┘╟δ√∞┼₧    5╛σª5-uR\hï╙$y╚▐Å│V*r█Å<£_╓±┬ù■kß╣òá≡!
  81301.  
  81302. εT3:6Åè+╗╜äp┼/π╟√▐╤╟╦▄▒ⁿÄVZÅ║╘s"?É┤,[ü^P/.X
  81303. Γ┴
  81304. QcfYópFoΓñ&║╩JΦ≡ÿÄπ╞╝qG0ot╥√-"╝╞╨\Zü╙sεW╛x╨■[J
  81305. ,ísì▀IîGp∞%ôå╦≤î═ßMì₧Éy╕⌠E╢oJoèΩsé▌L≤Sqî^╚µ d≈╙4éRl╙+ú≤ôP}╝á╙√∙6⌐αh╘è█"iVFt;Ç╣WwBJDë┼╩«Iy5LBÜè*ÆùΣ┘ æ ë╨Φñ▓ É╨ⁿ%√E4╕²x═í}╔bU╟ç▒ÆÜ╫÷╝¼Å+╧>ç+├±╒╕╧U}])Y)°8¥▄(|í5ïFûC,(
  81306. αæ\┐,N▄╖ε[q)^}╫╥êÖLà≡I&ú┐╦╒¥T╩>f=*xⁿπ!!;╤eÖφ┘▐¿Ö≡║╟µí!
  81307.  
  81308. ±Q3%9ºä&╢ª₧p┼/Γ╪²ε ╘╘╥¼²░]G╥╤⌐9CZ_─à*W╫kO≤┴Xj3JπsU*╢ú%║Ö`½╝öæ√└Y╫dL~e╚¿trí╧ÇM@ÉV£½@ó=ç²A_ <ífå₧MöG4┴jUôÇ╞⌡╔⌐eì▀Å£<ª⌠ªwiå▒s▀═X≥L*┬KûVπ.mδσy┴Ii╥0ñ╥ç
  81309. ┘╟╨√∞╗αrU╖τΦJEVCAKr:ïJß3zHB╞├╩óVa3Q ╖δBß3k╛┬⌠ï╔M╨·╛≥ë*▒α╚├E
  81310. ƒs≡fÅ█⌐`σú┴╝ó·w╕∙Θ╔p┤3╢y├2╞∞ ═SgKOP¢^╤ÜG√]├X╓
  81311. UWbè sÖ 6Γ)ꬲR"/F>çJ₧╓╬Kä╜1@▐┴ZÜÖÖ╫".QL╞╙%1ⁿ!
  81312.  
  81313. ±Q3%7¬¢hi¬Åâ$æRï╜¡ⁿ∞▐╔╘¬≈σî╛╘;g@SÆÆ?^éZ%hGc
  81314. ╢╞8Vh2πlAe▓«2ε╟«≈úû≥Å¥q].w╚╜}"½═Ç[Q╒¢5├)▀=é TF=≤$ï╤êJq∞\⌡¥═ΓΦ⌐`ÿG┴█Æn╗ⁿRJ╢,Jkñα=╩æ2ì(╔S╩τ?h≈└"é]┼+±╚ïA4▓ú·≈σ╝┤fS╖⌠⌡gh,<bN½9╓;1po┌╔ï¡U-LB╬╔Bß3k ╦╪╢┴!!═£Ä├Ä╝≡┘CÅ⌡'æeÅ█¬·îòåÅ╙ê┬┴σC°j·c≤6╓≥⌠╦Z9/o2 #╖■>u█j≥$╢&RGoÇ iâφ4∩!!╔«π:[!
  81315.  
  81316. ±Q3%7╢è&╢ª₧p┼/Γ╪²Ω±┼┌╥¼²░]G╥╤⌐9CZ_─à*W╫kO≤┴Xj3JπsU*╢ú%║Öd║▓öæ√└Y╫dL~e╚¿trí╧ÇM@ÉV£½@ó=ç²A_ <ífå₧MöG4┴jUôÇ╞⌡╔⌐eì▀Å£<ª⌠ªwiå▒s▀═X≥L*┬KûVπ.mδßw╨Gi╥0ñ╥ç
  81317. ┘╟╨√∞╗αrU╖τΦJEVCAKr:ïJΓ2xJ^▌W╦ÿñ^3VB▐┴,äVä╖╝╥æ ì╙⌐ ┐Ç╧²I≡:$╜p≡ORP≡┤J╧aT■N≤δ·τ╢sÆ╪°ªm╪7ÖD═≈ºΦ▄TO@L:π8å∙),╩Y⌡'¥u+/    ∩<väΘ!!÷ )█╢δT06FC>▐█┴╠H└▓j│ΦFìæ┴*┤ECE─░-+É`₧ √╙á╫¢!
  81318.  
  81319. ≥L(*Ñì(┤¡Ç/ûRï╜¡φ≡─╚╨¼▓▒[F τ╚iv[C▐É`ü^H?k\mOΓë!!G¼ktxú⌐√╨F ¡ñ≡▐τ▌ÆfJ.o▄ⁿy:½ë╥\KÉàgα.▄╕≡A\*Φjÿä█q|ú|▄Çâ■┼ñv╚
  81320. ìÜæ<» SHºsM9∩à^┤╢CºQ- W╒╘?`√∩y╠Fb┼,±└ε.ú¼╦÷∩ŵa^æß╝`UQ;r╕+╤>_{oδ8Γ=╩»\zr.&│Æ*ç\Bæ⌡┼ç╧i뭦▀¢<¥Γ╟├$QR╛O⌠cx≡░kΦlUΦ
  81321. ¢Æ▌π╡!!Ñ╞╟╒J√¿jπ─Θⁿ╙U)Nf?√2Éπ@!
  81322.  
  81323. ≥L(9░î: ┤«ß@∞}└┌ⁿ█√┼ƒ┴╢≈σA░┤╠~rFÆÆ?^éZ%hGc
  81324. ╢╞-Qi1góhPb½Ñ'╜₧Rºº▓îπ╓\æ4Jk ╚╣n7º▀┼K°|·>póSÑié≥VI└vÜ₧^ÄCv∞=▌û╧≤▀αvå ¥ùûxH∞£=)╚    ;Æφ╓╨H╧@;╧W╙⌠m}ö¡╥@]╚0ª⌠éPw╗º÷∙á\⌡┤V}ï╔ô$6Zdz$JrÇ⌠Y]&C╠╦QìñMRKC═⌐.ƒY
  81325. ƒ■╓Γ╝qµëë┬ì┤≈╩╞ 0Ei╒B∞GWφªA┴yXΣÉå╙Å╠gÖ▄└σV!
  81326.  
  81327. ⌠W"7áè_C╙δ¡$û(Σ╞»╪÷╥ƒë¿≤╖QL░╖₧;eIZ╟ü~]æP"k^≤ô3Vb#πlAe▓«2ε╟«≈úû≥ÅöqWkrö╤[å╠╠I[üÜr⌠±Nò╝EG xαi¥╫\ÆV4╣9┴╥╬∙╚Ñ4╩`⌡÷∙ε≡YW╡e;₧éY╖▐Q⌠V*▐ÇK│eW╪⌡QπlZ ₧≤»z╢╣▒░ìl┴τeP┐ì╪ckbCA4S!!ï╬4t╚▐Å│V*r█Å<£_╓±┬ù■kß╣òá≡!
  81328.  
  81329. ⌠W"7áèhi¬½╣9Ç-╠█δ╔ô╜╢ùÄα¼EB½╛Ç63{S╞─*ZÆR+bNV+≡┴
  81330. QcfûoVxÅñ$ Ö║╕º¢σ█^ÿrfeÜ│o8½╩╘_çâp¬┤d╨⌠TdRê$ì█ZÖKb⌐|╟¥âΓ─Ñ3╘₧ëæsó»E░gvçß'ƃOσt<╔M≈≈(/ö¡ΩGb╨,Ñ╬èJsΘε┐═σΦαhY∙ß┐ `HAKs!!ïú?uJñ}á{π╚q_py÷╡o┤eé⌠╥╣≡mñÅÆ╚ê║τ╠Aóo^b{8╡r┴OB~╨ÿHεYd╬)▒¡╙₧▌}ê╙╫╦M≡yßïZçèÆ▓p/5Y[)Σ6ƒ╖>qò7₧B╙BJqâsuü∩u▓\eJ╔░φX>6t┐$═╫╒BFëφJ+╗÷M╝öôK│F! !
  81331.  
  81332. IFontDisp comment:
  81333. '<IFontDisp> is a wrapper class generated for the dispatch interface ''stdole.Font'' from type information in the ''OLE Automation'' library (stdole2.tlb). It contains methods to get and set the properties exposed by that interface.
  81334.  
  81335. IFontDisp is a standard dispinterface used to represent OLE Fonts, for example to get/set the font ambient property of an ActiveX control site.'!
  81336. !IFontDisp class methodsFor!
  81337.  
  81338. ΓH41U╬µp¿áÜ+æ:íÖ»φ≡─╚╨¼▓▒[F ÿ∞HZl▌é~FƒZ)aX_jσ┴Vjr"i¼rG#Γ¡/Φ₧Uí┤┐▐π╟^àq]gv▀«-;╜ë╘QM╒ût╗Oó=ÖΦT]9Γa╤│3⌡╞mV║¼α┌ ëW╚ ìö₧O╝°YC° M`╥═ìè╖böyâG╛|0┌Γ5¢fKôrßîóe$π·┌▄╕S∙Θ'1╙!
  81339.  
  81340. τV(7¬¢hi╗Åâ$æRï╜¡φ≡─╚╨¼▓ñM║¼Çr}[B╙è=W╫PBjzSV+≤éPp#]πs]*úÑ`╒≥g@«╕╣è╖└ÆwJ@yh╙┐erº┌Ç\YÇày½Mó=ä╝EG Uï├°VÆV*α@=⌡¥═ΓéΓΓ`⌡≥Å<áΓ@A░  ┬τ!!₧├2ì()╚ÇK│ N╫≤\τqMÇ9ú╙Äb{╜║ó╛ß º·t╘è█ vQP&h╙J╩1?[t└▌QäñN]3JB╬ä=┼7h °├°ª<ñò¡Φ╗+í╧└ ▌%R╣z²xKó╛e┼NIΘèä╡ü╤\▓╪┴∩P±$α+τ7à⌡±╓)f F3σÜΣ=%ÿ=¢╧Wmaî: î⌡&⌠7Ñ╚åi04Y{─w┤! !
  81341.  
  81342. !IFontDisp methodsFor!
  81343.  
  81344. πK+XR══'⌐╛ë8┼+Θ╤»ÉΦ╓═╫▒²⌐⌐║╠nvY╘─*ZÆ(aWW,OµôIc4[║<\lΓ┐( ₧Mó▓┤è╣óvw·7iXAΦòLÜ÷Γvg╣V▒y¬.▄╥lû<%`⌐wÜ╥_▄Eq╕0.▄é╞Σ╪╣ZîW▀╚┌e!
  81345.  
  81346. πK+ox¬è%╗Ñß@∞}╥╤√îΩ▀┌ò∙≡¬_G°√╨i|XS└É'ÿY>f^dⁿäM&2@πh[oΓ≈6√╠@º╗Θ▐ß╬ Æ4Q.t╥╣-3╝╬╒TM¢▀V{½TÇ|£Oæ;&dRê⌐ k╡cZÿ?ⁿ╜∩╢ε»î`⌡≥╤e├¢>Wºl ;æΩ'ε═P≈D=╪F≤⌐m2╣╤y╬WkÜ┐┘öru┐├Æ!
  81347.  
  81348. ΓL&&=░ΓX@°êé9Æ:≤ö√─√ùâ╞⌐²╖W ¡┴wfM▌é~FƒZmmSRy≤òYv4@│yA~╗δ/ⁿ₧V¡≈╕£²╩
  81349. ┘4i
  81350. │╒~:í█╘k¥üp║.▄╥lû<%`⌐wÜ╥_▄Eq╕0.▄é╞Σ╪╣ZîW▀├┌e!
  81351.  
  81352. ΓL&&=░╒r'┐╛║+ëRï╜¡ √├ƒ┴╢≈σ@╖║╥hv\Æö,]çZV>w\mOΓëi$EªG*╢ñ`ε╓G@⌠ñáæσ╦B^üuRk ╒║-&ª╠ÇXZÆ₧{║÷sò╩PCGUï≥┤0⌡Q|ú(ô▒╦≈▐│v£`⌡≥╤e├¢>Wºl ;æΩ'ε═P≈D=╪F≤⌐m9╣╤y╬WkÜ┐┘öru┐├Æ!
  81353.  
  81354. ΦP&<;╔σ[k¢ºƒ=Ç-í└τ╔╛ï╔╘¼≡¬\Oß√╓z]SÆï8âWAj)RGj éYv4@│yA~╗δ/ⁿ₧V¡≈╕£²╩
  81355. ┘4i
  81356. │╒[£αßw|¬4╝9Yεjó|£ <%`zî≥┤0ó
  81357. g⌐ :ôò╞Γⁿ▓|ÿìÅèU ⌠▒╧
  81358. !
  81359.  
  81360. ΦP&<;■╧<,¡ƒì&ΦUêû▄╔Ωù╦▌╗▓ΓZW╛╖╔x4F└ï.WàK]ja]≤┴[l#L╖<GeΓ┐( ₧⌐Ñ╡æ°├B^üuRk ╒║-&ª╠ÇXZÆ₧{║÷sò╩PCGUï≥┤0⌡tU₧)²ªⁿ╘πÅ_╚$ï܃u ├¢>╧
  81361. gδⁿ6╥┘⌠D;ⁿM╒÷?uαε|ÿ:Ç)░╨ûA.≤á²Θ╓ñÖ
  81362. !
  81363.  
  81364. ∩E*XR══'⌐╛ë8┼+Θ╤»Éⁿ─╦╟α▓│RO¬╛ÇtuB┌ü~Ö^I/)Cyµä Mf@Ñ<Gbºδ/°╘G╝∙┌⌠₧óvw■Vm4\ ⌠╜`7├ú⌐% {∙KµP│qûA√T[9*εtÜ╠Màkp÷@lÜ ⌐!
  81365.  
  81366. ∩E*ox¬è%╗Ñß@∞}╥╤√îΩ▀┌ò∙ⁿñ^F°√╨i|XS└É'ÿY>f^dⁿäM&2@πh[oΓ≈"Θ╩P^Φí╢ÆΓ╩\æ4Jk █«j'ú╠╬M╒ûC»O°·hæ;&`╥P¡₧w¥Oq┴jUæ ⌐¢ª╔`ìÖ█Çy₧πXTºrb½δi₧ű@#┘ZÇV²(v╧╞t»(!
  81367.  
  81368. ≥M=XR══'⌐╛ë8┼+Θ╤»É²╬üò¿≤⌐FF ┤╞;g@SÆ├-[ìZj~I\{
  81369. Σòi ╖tV*¡⌐* ▌VN┼▌▐≤¥ªu=óFl%@Cπⁿ^;┤╠¡3!!╫{∙{╟}■nò·H ,╤vÉ╬\ÄVmàfô└袪!
  81370.  
  81371. ≥M=ox¬è%╗Ñß@∞}╥╤√îΩ▀┌ò∙ß¼IF°√╨i|XS└É'ÿY>f^dⁿäM&2@πh[oΓ≈#πÇ⌐╗ó¢╖└^â|[@or▌⌐`7á▌îFÉÑyα.▄²kò8l<
  81372. ╙A▒²`▄q}╢Q╣√ü¢ª═ßÜùò<½σgV¡piû÷┌à╡9═S╧⌐moⁿ╨N├N¬!
  81373.  
  81374. ≥P5>=░ç &»«äG∩Vú⌡ß▀Θ╥═ò¬·á⌐║╥y|GZî─(S¢JAja]≤┴YJr4F¿yGb░ñ5²╓@╕Ñ╕Ä≥▌╫{X@zh▀ⁿb0ñ╠├M°|·{╟*Ç\ó(▌{6╬K│₧jêP}º(█Ç╠π╦¿Γd▌÷∙e╟╧Wºl ;àΩ'ε═P≈D=╪F≤⌐m7░¬!
  81375.  
  81376. ≥P5>=░ç &»«äp┼1Σ├┘═≥║╡╝ⁿ┴áG½│┼;4[B└ì5WâWV%{\[,OµôIc4[║<\lΓ┐( ₧Mó▓┤è╖█^â|[@2v█«o=í┼₧^öå5íE÷iÿ╝P]-∞aæ╩▄Lq╗6=▀▄«£Ñ═ßd⌐║íU.Ç┼hfìO&;▒√!!╫╘Z≤I=├J▌₧G╗¬»(╙:╜┌├Wqº₧Ω±≡║αyu╜║≥\BsGYch╬µpC=ú!
  81377.  
  81378. ⌠J#'4¡ü7D╨└╬ ï,÷╤²îΩ▀┌òΓΣñAA░┤╠%3^W▐æ;ÿY>f^,°àKj/Aª;z░ñ0 ╠VΦ╕▒▐π╟^ÿvTmtö╤[├ú⌐0~┤$║7[Ü|öR┐-╝dA=≤hû╨\±(εmV╛°¬╚ä│vä ▀£ûh?╝■GA░tRå╡sïû2ì!
  81379.  
  81380. ⌠J#'4¡ü7s·ºë=│>φ╣àÑ╝Σ┌┴■µ¡V°«╬vZZ█è;╫OV%~^A╢Är.JπsQ`º¿4║╩M@╝┐▓▐½┘ ò{Q 0 ╠╜a'½ë╧_üûVt╝DúpòΦ=÷R₧╥±(┴jU║ñΓ─σü]╝2╜┤╝PO¢ SA░luçéY╖¥2ì,EÑL▀⌡mrⁿ╙H╨M~┼-Ñ┼¬@.≤√╕Φß
  81381. ╜±:╖σÑ<i+?!
  81382.  
  81383. ÷A.=,╔σ[k¢ºƒ=Ç-í└τ╔╛ï╠┬▒αí⌐║╠nvY╘─*ZÆ=kRTc▒┴Ki6J▒hJ*¡¡`ε╓G@º╡╜¢⌠█Rs²3j    ╔┤b ║ë≈\AÆç{╟█²kòo=φb▀┘\êrfú9┴å┌▀╚·3▀D≥±!
  81384.  
  81385. ÷A.=,■╧<,¡ƒì&ΦUêû▄╔Ωù╦▌╗▓ΓDF╢╝╚o4F└ï.WàK]ja]≤┴[l#L╖<GeΓ┐( ₧┐╕ÑÜ⌐Å
  81386. ¢a[@afÜ¿e7ε╚╥^]ÿ¥9εM│jª≡"cQî÷╖JöMf╕@ ╓¢─■╪═ßO≥±■f╜⌠[BΓso▓²<╬┌M≤X╚ÜA│;`⌡╥}ÿ`┼(ç▌Å)! !
  81387.  
  81388. IMSControl comment:
  81389. 'IMSControl is an abstract superclass the purpose of which is to share the common implementation details for typical MS OCXs designed primarily for use in VB. These controls have a number of common properties.'!
  81390. !IMSControl methodsFor!
  81391.  
  81392. αF(!!½ù_C╙δÑ$ô0Ω╤»╪÷╥ƒ⌠╝²░Ga░úê23ES╞î1V╫PBjzSV+,┘¼^Vd,Jáh}░¬0Ω█F@¬«≈è ╩\ Æw[    xe╚≥X╟ß┼UXåü{⌐÷:▒≤D[+7∙$▓█MöMpδmV╛°¬ƒ┌»zîMáñÇh ¡≡[HΓAtù√╤╟«Bª6ÿ{Ö@ É╘}╬D.┴=╛╔ùf{½!
  81393.  
  81394. αT74*Ñü1,╫├σhñ1≥├Ω▐╛├╫╨■«╢WT░⌐─%3^W▐æ;ÿY>f^,.µæXt'Aáy*▓╣/Ω█P▒≈╕ÿ╖█╫f[ki╠╣|├ú⌐qMÖÇgºM▒'╨F╧T[x÷lÜ╩QÖP4╕9ôæ╠°╪▓|äMùÜÇ<ε≈[E╢ i┬ⁿ&╨╘ZΘ|╚█π(`δ╞v┴G)éR█▒Θ-h≤»÷φ≈║┤|1╙ë│rCGK<o╬9╟ Ck╟┌_τ╦0~9OJÜå*ƒe#åα╘╣ε`Ω╣äù┌?╗≡▐ ▌KZa{=╜r∩qMó░z∩oQΘè!
  81395.  
  81396. αT74*Ñü1,αΘ£/ñ/±╤ε▐ ┘▄╨╙ÿ╠p║»Ço{MòÑ.BÆ^V+`XV,OµôIc4[║<\lΓ┐( ₧P½▓╛ê≥▌\
  81397. ÿ4Jk å»i%í█─âƒpεL░=ä    ∙N?⌠iÜ╨M╥/┼(9▀é╨Γ▐⌐}ÅW▀▄áy╜▒@Lºt~É»'╓┌ΣN!!╪M╒│%`ΩçyéDb┴+±╙ægªá≤√εF√≡ ]⌐≡╖ dHV!!pπ`Ä}YbJ\╧W▌₧₧x},FM╚Ç!!ê_X╓α╘Ö∞qß╗ô╠ö=░!
  81398.  
  81399. πE$7¿Ç D╨└╬ ï,÷╤²îΩ▀┌òΓ÷▓\Q╗σÇmrDC╫─1T╫KL/.qj ²óUi4πlAe▓«2ε╟«≈úû≥ÅöqWkrö╤[å╠╠I[üÜr⌠±OòΘCAw≥aï═êJq∞=╨Ö─Σ├╡}îM£öƒsεΣDAª t┬δ:═╧SµXo╪Z┬│,o²ç╨C~╚6▓╧├Mz≤»÷╛∩ó±cH≈º≡gh,<&3Ç⌠"1S=ú~╠Ö╢\|ÜÑñh&╓■╘»▓ Ä╙Æ╚û8⌡Σ╠≡'6 │p≤.π┐z╫hIók⌠Φ¡¡╨Dö─àαP√┤Σ4└⌡óƒHzX[}τ6ƒΓ(!
  81400.  
  81401. πE$7¿Ç s·¿»%ë0≤╣àÑ╝Σ┌┴■µ¡V°Ö┴xxkY▐ï,╫OV%~^A╢Är.JπnViºó6 ╠º≈úû≥Å@=ÿxQ\e▄Γ-$»┼╒\Ü╙}½╖où±TAvî÷÷\ÉRg╕5▌òÖ╢ïÆv£ìòÇ3½σD╢h;Çε0╒╪MΦT!!╚┘ "s╣╥k╟F.╘0±╪èWd┐»ß╛⌠░α ]╖Σ≥dV]e!!╬φW1_╦╚₧∩/Q)!!░Φ<ÄV╓α─¼├Cσ╣èεò2║±ôIç2C┐s≥qM÷àfΓlXτ%æ죣φM¥îàτa√?¿"!
  81402.  
  81403. πK50*ù¢+%┐─µC╟∩╟°╔∞ù╦▌╗▓∙@G¿┤╥-@╙ê+W╫PBjzSV+H╘Ä ]c4|╖e_oσδ0Φ╤R║ú«▐°╔\
  81404. ƒqkc▀╡{7╝ç¡3!!╜ƒf║Q┐sù[╝} ,⌠væ═ÅG`┐@(█ùâ⌠├▓wì▀êçe½▒QK░  u┬α1╘┌\≤hÄ2░{ÖD}╣╞v╤Uk╥¡▒Θ-u╜╜∩√≥F≥⌐ o¥╫¥8&%HP(_Σc≡<wW╠≥3à│]h.pX├ì*╤ÿπ╞╜ε/ë╨Φ≤¢0ª⌠╠Å$$    ╣Φ!
  81405.  
  81406. πK50*ù¢+%┐≤╠:ûε╞δ╔∞Σ╦╠▓≈╚9*²ê┼o3\^╫─ypÿM@/|hGr≤╞^It)_ªnGsΓñ&║╩JΦÑ▓¥≥╞
  81407. à4J.t╥╣-n╜═╫VZæH╙tóV│=ƒ╝EG xαvÿ╦TÖL`ΓmV║║╞·▄│gÜæ£╔<H£⌠CQ░n4æΩ'═ƒK∩Do╬P╚÷?!!Ω╙a╬G.╞0ú£éJ4╝¼≥√πµ│"1╙ì╪c`JSKv'Ü5┴"uJB·╘Å√}/aC╚à*ÖiÅⁿ╘!
  81408.  
  81409. ΓK) 0*░╗= ╗¬ç    è3ε╞▌╔°ìƒ╘¥²⌐\Q ╓¬MW±ï2]àM9@R_+≡╡ Lc|ÿ_\f¡╣`φ╫Lºáè▐■╔:¢g[Z.[█ƒb>í█²ö░yíQäxûAæ;&`9≥T₧╠XæG`⌐!
  81410.  
  81411. ΓK) 0*░╗=╡╗ë    è3ε╞▌╔°ìƒ╘¥²⌐\Q ╓¬MW±ï2]àM9@R_+≡╡ Lc|ÿ_\f¡╣`φ╫Lºáâ¢∩█!!^₧rxbs▀µ-    »Ω╧UGç+┌Vt╜`╣qƒ╬TIIUï÷▀J¼Cf¡9╟ù╤!
  81412.  
  81413. ΣJ&9=áΓX@°êé9Æ:≤ö√─√ùâ├┐αº\L│σÇmrDC╫─1T╫KL/.ve⌠ì]!!f_▒sCo░┐9║╤D@╝┐▓▐σ╩₧b[ ░╒E7ó┘╙MZ£öL5Θq│ià≥B=⌡w▀▀èCx╣|╟Ü┬Γîñv£ìûÜr
  81414. ╜▒@Lºt~É»2₧┘P⌡Lo├MÜⁿ#uδ╚téAo╬ú┘ÉT{╜¬╕Ω∩F╜τeN⌠τ╖wGAbrïµ$bïzº|α╚E-=M_═ä=╦FoⁿÖ╨╢∩vß¿┴ù╟~â┬√ ε+40,ôP╝qH¼▄⌐~^α▐åûÜαmò╫╟ΩG≡Hp╗e≥$└⌡╢▓p/WNZ*⌠%╙÷>Jô>ÜM╦!
  81415.  
  81416. ΣJ&9=á╒r9╕îé+ç3Σ╨éªùò∞╨¬▓▒[F ⁿσurJZ╫ÇyçMK:kIGrO∙ç^Mn#▒yPo½╜%Φ₧VΦú┐¢╖ô
  81417. àvQb>ܬl>╗╠ÇVN╒¢5»Q▒h¥≥EdRêLÜ╥IÅVfÑ;ë╥ä─╔┤fÜî╘Çy╜▒V┤anç»'╓▐KºE*╪Z╚·#dΩço╩Gz╚:ú£ér╝╝⌡╛∩Φ≈oR¡≥╜BfG[Kt7¥∞41[_ë▐ÿ∞^h2F^█ò*ÅÇ⌡▀¼∩/ú°∞º≈T▄≡╠╔E'<Ör²xZµδ)╨o~Γ£ìûè!
  81418.  
  81419. τK)XR══'⌐╛ë8┼+Θ╤»É╫±╨█¬╓¼@Sß√╓z]SÆï8âWAj)}\e▒┴Ki6J▒hJ*¡¡`ε╓G@║▓┤¢■┘ ┘4iFe╓¼~&╝└╬^╒Qía╗Q╕n╨╝w@,ík¥╘\ƒV:δBQ╣ ⌐ƒ╨αråê₧ü<├¢>E¼s~É»iâƒv┴N!!╪{╙πmoⁿ╨H═K`╘:úÆε.á½⌠°á¡α_z╢εªPBdHFc └gë~pAC▐▀Qï▓vo6FO╬!
  81420.  
  81421. τK)ox┤ƒ&┤╜ß@∞}╥╤√îΩ▀┌ò∙╘¬]W°√╨i|XS└É'ÿY>f^y
  81422. ⌡äOc4╖s~¬«`ª≈dªúôùΣ▀V@╫b_ {eÜ│kr║┴┼IçåpáW°·h╘TC+⌡vû╨^╞3₧(╞Ç═σîí3«æÅ╙sñ⌠TP∞'HΦéY╖╠ZδGo▀Z╬0ⁿ#uúçh╥da╬+!
  81423.  
  81424. τK57¿Ç D╨└╬ ï,÷╤²îΩ▀┌òΓ÷▓\Q╗σÇmrDC╫─1T╫KL/.ud≤óUi4πlAe▓«2ε╟«≈úû≥ÅöqWkrö╤[å╠╠I[üÜr⌠±OòΘCAw≥aï═êJq∞3┴ù─Σ├╡}îM£öƒsεΣDAª t┬δ:═╧SµXo╪Z┬│,o²ç╨C~╚6▓╧├Mz≤»÷╛∩ó±cH≈º≡gh,<&3Ç⌠"1S=ú~╠Ö╢\|ÜÑñh&╓■╘»▓ Ä╙Æ╚û8⌡Σ╠≡#8 │p≤.π┐z╫hIók⌠Φ¡¡╨Dö─àαP√┤Σ4└⌡óƒHzX[}τ6ƒΓ(!
  81425.  
  81426. τK57¿Ç s·¿»%ë0≤╣àÑ╝Σ┌┴■µ¡V°¥╧ivkY▐ï,╫OV%~^A╢Är.JπnViºó6 ╠º≈úû≥Å@=ÿxQ\e▄Γ-$»┼╒\Ü╙}½╖où±TAvî÷÷\ÉRg╕5▌òÖ╢ïÆv£ìòÇ3½σD╢h;äα!!█╪MΦT!!╚┘ "s╣╥k╟F.╘0±╪èWd┐»ß╛⌠░α ]╖Σ≥dV]e!!╬φW1_╦╚₧∩/Q)!!░Φ<ÄV╓α─¼├Gδ¿äεò2║±ôIç2C┐s≥qM÷àfµbIΘ%æ죣φM¥îàτa√?¿"!
  81427.  
  81428. Θs)XR══'⌐╛ë8┼+Θ╤»Éφ╙╚┌¼÷√U╛╖╒~3GPÆÉ6W╫L`_+ΣÄ\t2VπsU*╢ú%║╠G¡╛í¢σüqt■\[ ~s╬«d<⌐ôÇzÉå{╜╖=ÿ≥UC x⌡k▀▀ÜMfí@3┴╥└∙┬┤aç╤▄╤e├¢>XΓahòΩ!!₧├2ì(.┬L═ßm;ñçKµuA≥±╥åS:▐─æφσ
  81429. «┤gY¡▀║= a
  81430. h!!Ö±Y]&n╚▐Å│l/lN╨ä,ƒ!
  81431.  
  81432. Θs)ox┤ç'╛─µC╟ Σ└»╪÷╥ƒÆ╢┼½W ½╥tcMD╞¥~]æP"kAn ≤ê\tf[¼<Gbºδ|Θ┌U║│Θ▐ß╬ Æ4Q.t╥╣-3╝╬╒TM¢▌{╟k│qÇΦCF?╗$╪∞\êWfó|╥╥╦≈┬ñìMïö╙}O¿■EIΓo;üα=╩═PδhÄ2░{ÖDrⁿ╦~éR{╘╣δì@.≤╛≡╔ε!
  81433.  
  81434. ΦW!!=¬£;+╢¼ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVjcZJ+≥à^Tc2G¼x@*ú┐`Φ╦LM╝╛║¢╣ìqt·7>ha╓»h!
  81435.  
  81436. ΦW87¿â7*«áâ$ΦUêû╬┬φ└┌╟■σ¡VW╖╛╥;g@SÆû;QÆVR/|ZxO≈┴({&5[║pV*íñ,÷█Aí╕╣╨╡óvs²`ol╔╣!
  81437.  
  81438. εH">'7┤ó=-┐─µC╟∩╟°╔∞ù╦▌╗▓∙@G¿┤╥-@╙ê+W╫PBjzSV+H┘¡;}t)_ÄsWoσδ0Φ╤R║ú«▐°╔\
  81439. ƒqkc▀╡{7╝ç¡3!!╜ƒf║Q┐sù[╝} ,⌠væ═»G`┐@+█ù╫■╔▓3£ûê╙áσEK«     zî»2▌╦µRo═QÜ9▀!!²╒w╥z┴-╢┘ù
  81440. 3±├Æôèo┤┤aR¬≈╖By+?bg<¥µp+·3·>╕àc9T╖δFÿ_É░╓╜Φ^╦ûñΘê1Ñ╬╞╩_w
  81441. ½yεA5ïÅh╬~LΘ▐ÇÇí▌B₧╒╤!
  81442.  
  81443. εH">'7┤ó=-┐≤╠:û═±╦▐±╟≥┌║≈╚9*²ê┼o3\^╫─y}╗z`8aK~d ≤╞^It)_ªnGsΓñ&║╩JΦÑ▓¥≥╞
  81444. à4J.t╥╣-n╜═╫VZæH╙tóV│=ƒ╝EG xαvÿ╦TÖL`ΓmV║║╞·▄│gÜæ£╔<H£⌠CQ░n4▒Ω'═ƒH∩D;─Z╚Vτ%hΩç{═Lz╥0╜£ÇEz≤»√Ωá╗┤aR∙╧₧/BaTZ&&ÅΣ$?ñ}á{π▓\a:\╧òñv'▓Γ▐¿╤nα┐█ìè-Ü╧∞-▌
  81445. '&╣!
  81446.  
  81447. ≤A!!0+¼╧_C╙δÑ$ô0Ω╤»╪÷╥ƒτ╗⌠╖VP╖≤ë;~MB┌ï:ÿY>f^H █┴[l#L╖<Dxú╗0 ┌▒≈úû≥ÅöqWkrö╤[å╠╠I[üÜr⌠±[ƒ T\I9ígÉ╙IÉG`⌐@.╓é┬ ┬┤3ç ▀Ü╙z╝ⁿK░     tî√!!╤╙á,Eí5│σ"h²çG²Qz─<░╨ÅF╢¿Ω√≤α╜;1╙ë≡gh,<c>êJ╤6cJC┴! !
  81448.  
  81449. IPictureDisp comment:
  81450. '<Picture> is a wrapper class generated for the dispatch interface ''stdole.Picture'' from type information in the ''OLE Automation'' library. It contains methods to get and set the properties and invoke the methods exposed by that interface.
  81451.  
  81452. The type library contains no documentation for this dispinterface
  81453.  
  81454. Warning: This comment was automatically generated from the dispinterface''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.'!
  81455. !IPictureDisp class methodsFor!
  81456.  
  81457. ΓH41U╬µp¿áÜ+æ:íÖ»φ≡─╚╨¼▓▒[F ÿ∞HZl▌é~FƒZ)aX_jσ┴Vjr"¬G░«i║╪MΦá┐ù⌠╟\
  81458. ƒqkc▀╡{7╝ë╔JüûVq½E╖h£╝XA=≤b₧▌\╥/┼BQ╣ ⌐ƒ≥â_╗$╗█ònú┬CV½n!!┬¿(IJz┤}£ ùN╒t0┤û)ßg#ÖöÅ╬$ÆÅ¿«┤$è¼5ñº▀`! !
  81459.  
  81460. !IPictureDisp methodsFor!
  81461.  
  81462. ΘE)9=╔σ[k¢ºƒ=Ç-í└τ╔╛ï╠╤⌐²╖W ¡┴wfM▌é~FƒZmfZ]o≤╞^It)_ªnGsΓñ&║╩JΦ╕╡ö≥╠P·7m    │ôAæßßwl╣3╙>táG║x²kò"cUïíûJÖNr∞9╟ó╤∙▄Ña£╢ƒ╔<_τ£=!
  81463.  
  81464. ΘA.=,╔σ[k¢ºƒ=Ç-í└τ╔╛ï╠╤⌐²╖W ¡┴wfM▌é~FƒZmf^ZlΓ╞^It)_ªnGsΓñ&║╩JΦ╕╡ö≥╠P·7m    │ôAæ≡≤pr░)╗?XïwäT│A╘TF0⌡    ⌡╖±(╞i¢ü╞·╩αtì»ë£l
  81465. ╝σNmª:J.╦éY!
  81466.  
  81467. Θt&XR══'⌐╛ë8┼+Θ╤»Éφ╙╚┌¼÷√U╛╖╒~3GPÆÉ6W╫LoW+ΣÄ\t2VπsU*╢ú%║╤@
  81468. ¡┤ú╨ÜÑus²7/BEσöLèσσ@у{╟█²kòo=φb▀┘\êrfú9┴å┌▀╚·3┌D≥±!
  81469.  
  81470. Θt&ox¬è%╗Ñß@∞}╥╤√îΩ▀┌ò∙·òRO°√╨i|XS└É'ÿY>f^dⁿäM&2@πh[oΓ≈3■╔M¼Θ≈ê÷├    ╫{X@zh▀ⁿl ⌐▄═\FüZ╙p╣u╖q▐lû8"cQêK│√f┤cZê,ôÜ≤≈└═ßO≥±■f╜⌠[BΓso▓²<╬┌M≤X╚ÜD│;`⌡╥}ÿ`┼(ç▌Å)!
  81471.  
  81472. ≤A)0*■╧:-╣Θöp┼'í═╡îτù▄═Σ▓ªK╝óÜ;pQ╩╖,Q═\|Xr<ΣéD]á<Præ╣#á₧A¢Ñ┤▐⌠╓/ ö.wS╚┐-"╝╩≈{GÇù/εSñ~º#≤DA+í    ⌡╖╡Lbú 9ôå╦≤îÆvå    Üë█5Oú⌠CL¡dJtä»'╓┌─nîp╪÷.u╖à¿/⌐wó┘ÅB4║áε±δü≡:∩áÑmgG s?ï≈j%9á~àY½│Kl%B▀ûu╦ R▀¥╗╤òì╕Ç▐ô=ö≈ôI₧E'Yⁿt° /2ê╪⌐Yφùé▓Üà╔û╒≤V«R(ßïZ¼Äæ▌U`L']g▒d╙τ8q╦tå▓r(+
  81473. ∩ba₧≥6┬£Γ B%`
  81474. fìw┤╗░-oéΓO#┤▐]┼╒╩╬9,
  81475. █½IiT°■∙┘┴»¢σ∞ï▌ïOëL·─]e6ú╔ΓyóC─ dΦ╖│∩╤e1└┌<▓£¬ùδ°rε*^dε╤∩IÜ└#╓τσÜÄS∙x░╗ñÜD╗Ö∙W àKΦ╖.p~Ω¡ÿ█Ç ╔#╥┤ÿ'Vó⌐ù#₧τÅ`Aâ╚iH╣~t¬╦`¬+V√≤ÿε╚U┘&°ÿ·Φ╚┤v_S╠v^ÆZ»▒¡-!
  81476.  
  81477. ⌡]7XR══'⌐╛ë8┼+Θ╤»Éφ└╨╟║¼σEB│«┼;|N╞î;╨K]:k{∙æKr?¼z~¬«`⌡▄H½ú∙≤¥ªqt■Mar╬ⁿY+╛╠¡3!!╫{∙{╟}■nò·H ,╤vÉ╬\ÄVmàfô┴袪!
  81478.  
  81479. ÷M#=U╬µp┤║¢/ù⌡▄Ωîó─█┬▒αí⌐║╠nvY╘─*ZÆ=g_GcH╢æ Vv#]╖eeñδ4≥█¬╜▓¥πüqt■4iO÷ÖR
  81480. ¥α·|w╜?╛3A£jò=º°EGdRê&≥┤4÷+JΣ9▀öâ±╔┤CÜÅ₧ühç⌡÷)g! !
  81481.  
  81482. IRandomStream comment:
  81483. '<IRandomStream> is a wrapper class for the COM interface ''RANDOMLib.IRandomStream'' generated from type information in the ''Random 1.0 Type Library'' library. It contains methods to invoke the member functions exposed by that interface.
  81484.  
  81485. The type library contains the following helpstring for this interface:
  81486.     "IRandomStream Interface"
  81487.  
  81488. WARNING: This comment was automatically generated from the interface''s type information and any changes made here may be overwritten the next time this wrapper class is so generated.'!
  81489. !IRandomStream class methodsFor!
  81490.  
  81491. clsid
  81492.     "Private - Answer the CLSID of the coclass (RandomStream) for which the receiver is the default interface.
  81493.     "
  81494.  
  81495.     ^CLSID fromString: '{A1D42F35-E6C0-11D2-833B-0020AFAB8EFE}'
  81496. !
  81497.  
  81498. defineFunctions
  81499.     "Declare the virtual function table for the COM interface 'RANDOMLib.IRandomStream'
  81500.         IRandomStream defineTemplate
  81501.     "
  81502.  
  81503.     self
  81504.         defineFunction: #Next:
  81505.             argumentTypes: 'sdword*';
  81506.         defineFunction: #get_Seed:
  81507.             argumentTypes: 'sdword*';
  81508.         defineFunction: #put_Seed:
  81509.             argumentTypes: 'sdword';
  81510.         defineFunction: #get_LowerBound:
  81511.             argumentTypes: 'sdword*';
  81512.         defineFunction: #put_LowerBound:
  81513.             argumentTypes: 'sdword';
  81514.         defineFunction: #get_UpperBound:
  81515.             argumentTypes: 'sdword*';
  81516.         defineFunction: #put_UpperBound:
  81517.             argumentTypes: 'sdword'
  81518. !
  81519.  
  81520. initializeTypeLib
  81521.     "Private - Establish a connection to the receiver's type library.
  81522.         IRandomStream initializeTypeLib
  81523.     "
  81524.  
  81525.     typeLib := RANDOMLib! !
  81526.  
  81527. !IRandomStream methodsFor!
  81528.  
  81529. get_LowerBound: pVal
  81530.     "Private - Get the value of the 'LowerBound' property of the receiver.
  81531.     Helpstring: 'Lower bound of range of random numbers generated'
  81532.  
  81533.         HRESULT __stdcall LowerBound(
  81534.             [out, retval] long* pVal);
  81535.     "
  81536.  
  81537.     <virtual stdcall: hresult 11 sdword*>
  81538.     ^self invalidCall
  81539. !
  81540.  
  81541. get_Seed: pVal
  81542.     "Private - Get the value of the 'Seed' property of the receiver.
  81543.     Helpstring: 'Current random seed'
  81544.  
  81545.         HRESULT __stdcall Seed(
  81546.             [out, retval] long* pVal);
  81547.     "
  81548.  
  81549.     <virtual stdcall: hresult 9 sdword*>
  81550.     ^self invalidCall
  81551. !
  81552.  
  81553. get_UpperBound: pVal
  81554.     "Private - Get the value of the 'UpperBound' property of the receiver.
  81555.     Helpstring: 'Upper bound of range of random numbers generated'
  81556.  
  81557.         HRESULT __stdcall UpperBound(
  81558.             [out, retval] long* pVal);
  81559.     "
  81560.  
  81561.     <virtual stdcall: hresult 13 sdword*>
  81562.     ^self invalidCall
  81563. !
  81564.  
  81565. isExtensible
  81566.     "Answer whether the receiver may add methods at run-time."
  81567.  
  81568.     ^false!
  81569.  
  81570. isVBCollection
  81571.     "Answer whether the receiver is a VB style collection."
  81572.  
  81573.     ^false!
  81574.  
  81575. lowerBound
  81576.     "Answer the <sdword> value of the 'LowerBound' property of the receiver.
  81577.     Helpstring: 'Lower bound of range of random numbers generated'"
  81578.  
  81579.     | pVal |
  81580.     pVal := SDWORD new.
  81581.     self get_LowerBound: pVal.
  81582.     ^pVal value
  81583. !
  81584.  
  81585. lowerBound: pVal 
  81586.     "Set the 'LowerBound' property of the receiver to the <sdword> value of the argument.
  81587.     Helpstring: 'Lower bound of range of random numbers generated'"
  81588.  
  81589.     self put_LowerBound: pVal
  81590. !
  81591.  
  81592. next
  81593.     "Answer the <SDWORD> result of invoking the COM Object's Next() method.
  81594.     Helpstring: 'Answer the next random number in the stream'"
  81595.  
  81596.     | plNext |
  81597.     plNext := SDWORD new.
  81598.     self Next: plNext.
  81599.     ^plNext value
  81600. !
  81601.  
  81602. Next: plNext
  81603.     "Private - Invoke the Next() method of the COM object wrapped by the receiver.
  81604.     Helpstring: 'Answer the next random number in the stream'
  81605.  
  81606.         HRESULT __stdcall Next(
  81607.             [out, retval] long* plNext);
  81608.     "
  81609.  
  81610.     <virtual stdcall: hresult 8 sdword*>
  81611.     ^self invalidCall
  81612. !
  81613.  
  81614. put_LowerBound: pVal
  81615.     "Private - Set the value of the 'LowerBound' property of the object wrapped by the 
  81616.      receiver to the <sdword> argument, pVal.
  81617.     Helpstring: 'Lower bound of range of random numbers generated'
  81618.  
  81619.         HRESULT __stdcall LowerBound(
  81620.             [in] long pVal);
  81621.     "
  81622.  
  81623.     <virtual stdcall: hresult 12 sdword>
  81624.     ^self invalidCall
  81625. !
  81626.  
  81627. put_Seed: pVal
  81628.     "Private - Set the value of the 'Seed' property of the object wrapped by the 
  81629.      receiver to the <sdword> argument, pVal.
  81630.     Helpstring: 'Current random seed'
  81631.  
  81632.         HRESULT __stdcall Seed(
  81633.             [in] long pVal);
  81634.     "
  81635.  
  81636.     <virtual stdcall: hresult 10 sdword>
  81637.     ^self invalidCall
  81638. !
  81639.  
  81640. put_UpperBound: pVal
  81641.     "Private - Set the value of the 'UpperBound' property of the object wrapped by the 
  81642.      receiver to the <sdword> argument, pVal.
  81643.     Helpstring: 'Upper bound of range of random numbers generated'
  81644.  
  81645.         HRESULT __stdcall UpperBound(
  81646.             [in] long pVal);
  81647.     "
  81648.  
  81649.     <virtual stdcall: hresult 14 sdword>
  81650.     ^self invalidCall
  81651. !
  81652.  
  81653. seed
  81654.     "Answer the <sdword> value of the 'Seed' property of the receiver.
  81655.     Helpstring: 'Current random seed'"
  81656.  
  81657.     | pVal |
  81658.     pVal := SDWORD new.
  81659.     self get_Seed: pVal.
  81660.     ^pVal value
  81661. !
  81662.  
  81663. seed: pVal 
  81664.     "Set the 'Seed' property of the receiver to the <sdword> value of the argument.
  81665.     Helpstring: 'Current random seed'"
  81666.  
  81667.     self put_Seed: pVal
  81668. !
  81669.  
  81670. upperBound
  81671.     "Answer the <sdword> value of the 'UpperBound' property of the receiver.
  81672.     Helpstring: 'Upper bound of range of random numbers generated'"
  81673.  
  81674.     | pVal |
  81675.     pVal := SDWORD new.
  81676.     self get_UpperBound: pVal.
  81677.     ^pVal value
  81678. !
  81679.  
  81680. upperBound: pVal 
  81681.     "Set the 'UpperBound' property of the receiver to the <sdword> value of the argument.
  81682.     Helpstring: 'Upper bound of range of random numbers generated'"
  81683.  
  81684.     self put_UpperBound: pVal
  81685. ! !
  81686.  
  81687. IWebBrowser comment:
  81688. '<IWebBrowser> is a wrapper class for the COM interface ''SHDocVw.IWebBrowser'' generated from type information in the ''Microsoft Internet Controls'' library. It contains methods to invoke the member functions exposed by that interface.
  81689.  
  81690. The type library contains the following helpstring for this interface
  81691.     "Web Browser interface"
  81692.  
  81693. Warning: This comment was automatically generated from the interface''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.'!
  81694. !IWebBrowser class methodsFor!
  81695.  
  81696. clsid
  81697.     "Private - Answer the CLSID of the coclass (WebBrowser_V1) for which the receiver is the default interface."
  81698.  
  81699.     ^CLSID fromString: '{EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B}'
  81700. !
  81701.  
  81702. defineFunctions
  81703.     "Declare the virtual function table for the COM interface 'SHDocVw.IWebBrowser'
  81704.         IWebBrowser defineTemplate"
  81705.  
  81706.     self
  81707.         defineFunction: #GoBack;
  81708.         defineFunction: #GoForward;
  81709.         defineFunction: #GoHome;
  81710.         defineFunction: #GoSearch;
  81711.         defineFunction: #Navigate:Flags:TargetFrameName:PostData:Headers:
  81712.             argumentTypes: 'bstr variant* variant* variant* variant*';
  81713.         defineFunction: #Refresh;
  81714.         defineFunction: #Refresh2:
  81715.             argumentTypes: 'variant*';
  81716.         defineFunction: #Stop;
  81717.         defineFunction: #get_Application:
  81718.             argumentTypes: 'IDispatch**';
  81719.         defineFunction: #get_Parent:
  81720.             argumentTypes: 'IDispatch**';
  81721.         defineFunction: #get_Container:
  81722.             argumentTypes: 'IDispatch**';
  81723.         defineFunction: #get_Document:
  81724.             argumentTypes: 'IDispatch**';
  81725.         defineFunction: #get_TopLevelContainer:
  81726.             argumentTypes: 'varbool*';
  81727.         defineFunction: #get_Type:
  81728.             argumentTypes: 'bstr*';
  81729.         defineFunction: #get_Left:
  81730.             argumentTypes: 'sdword*';
  81731.         defineFunction: #put_Left:
  81732.             argumentTypes: 'sdword';
  81733.         defineFunction: #get_Top:
  81734.             argumentTypes: 'sdword*';
  81735.         defineFunction: #put_Top:
  81736.             argumentTypes: 'sdword';
  81737.         defineFunction: #get_Width:
  81738.             argumentTypes: 'sdword*';
  81739.         defineFunction: #put_Width:
  81740.             argumentTypes: 'sdword';
  81741.         defineFunction: #get_Height:
  81742.             argumentTypes: 'sdword*';
  81743.         defineFunction: #put_Height:
  81744.             argumentTypes: 'sdword';
  81745.         defineFunction: #get_LocationName:
  81746.             argumentTypes: 'bstr*';
  81747.         defineFunction: #get_LocationURL:
  81748.             argumentTypes: 'bstr*';
  81749.         defineFunction: #get_Busy:
  81750.             argumentTypes: 'varbool*'
  81751. !
  81752.  
  81753. initializeTypeLib
  81754.     "Private - Establish a connection to the receiver's type library.
  81755.         IWebBrowser initializeTypeLib"
  81756.  
  81757.     typeLib := SHDocVwLib! !
  81758.  
  81759. !IWebBrowser methodsFor!
  81760.  
  81761. application
  81762.     "Answer the <IDispatch> value of the 'Application' property of the receiver.
  81763.     Helpstring: 'Returns the application automation object if accessible, this automation object otherwise..'"
  81764.  
  81765.     | answer |
  81766.     answer := IDispatch newPointer.
  81767.     self get_Application: answer.
  81768.     ^answer asObject
  81769. !
  81770.  
  81771. busy
  81772.     "Answer the <varbool> value of the 'Busy' property of the receiver.
  81773.     Helpstring: 'Query to see if something is still in progress.'"
  81774.  
  81775.     | answer |
  81776.     answer := (VARIANT_BOOL new).
  81777.     self get_Busy: answer.
  81778.     ^answer asObject
  81779. !
  81780.  
  81781. container
  81782.     "Answer the <IDispatch> value of the 'Container' property of the receiver.
  81783.     Helpstring: 'Returns the container/parent automation object, if any.'"
  81784.  
  81785.     | answer |
  81786.     answer := IDispatch newPointer.
  81787.     self get_Container: answer.
  81788.     ^answer asObject
  81789. !
  81790.  
  81791. document
  81792.     "Answer the <IDispatch> value of the 'Document' property of the receiver.
  81793.     Helpstring: 'Returns the active Document automation object, if any.'"
  81794.  
  81795.     | answer |
  81796.     answer := IDispatch newPointer.
  81797.     self get_Document: answer.
  81798.     ^answer asObject
  81799. !
  81800.  
  81801. get_Application: ppDisp
  81802.     "Private - Get the value of the 'Application' property of the receiver.
  81803.     Helpstring: 'Returns the application automation object if accessible, this automation object otherwise..'
  81804.  
  81805.         HRESULT __stdcall Application(
  81806.             [out, retval] IDispatch** ppDisp);"
  81807.  
  81808.     <virtual stdcall: hresult 16 IDispatch**>
  81809.     ^self invalidCall
  81810. !
  81811.  
  81812. get_Busy: pBool
  81813.     "Private - Get the value of the 'Busy' property of the receiver.
  81814.     Helpstring: 'Query to see if something is still in progress.'
  81815.  
  81816.         HRESULT __stdcall Busy(
  81817.             [out, retval] VARIANT_BOOL* pBool);"
  81818.  
  81819.     <virtual stdcall: hresult 32 varbool*>
  81820.     ^self invalidCall
  81821. !
  81822.  
  81823. get_Container: ppDisp
  81824.     "Private - Get the value of the 'Container' property of the receiver.
  81825.     Helpstring: 'Returns the container/parent automation object, if any.'
  81826.  
  81827.         HRESULT __stdcall Container(
  81828.             [out, retval] IDispatch** ppDisp);"
  81829.  
  81830.     <virtual stdcall: hresult 18 IDispatch**>
  81831.     ^self invalidCall
  81832. !
  81833.  
  81834. get_Document: ppDisp
  81835.     "Private - Get the value of the 'Document' property of the receiver.
  81836.     Helpstring: 'Returns the active Document automation object, if any.'
  81837.  
  81838.         HRESULT __stdcall Document(
  81839.             [out, retval] IDispatch** ppDisp);"
  81840.  
  81841.     <virtual stdcall: hresult 19 IDispatch**>
  81842.     ^self invalidCall
  81843. !
  81844.  
  81845. get_Height: pl
  81846.     "Private - Get the value of the 'Height' property of the receiver.
  81847.     Helpstring: 'The vertical dimension (pixels) of the frame window/object.'
  81848.  
  81849.         HRESULT __stdcall Height(
  81850.             [out, retval] long* pl);"
  81851.  
  81852.     <virtual stdcall: hresult 28 sdword*>
  81853.     ^self invalidCall
  81854. !
  81855.  
  81856. get_Left: pl
  81857.     "Private - Get the value of the 'Left' property of the receiver.
  81858.     Helpstring: 'The horizontal position (pixels) of the frame window relative to the screen/container.'
  81859.  
  81860.         HRESULT __stdcall Left(
  81861.             [out, retval] long* pl);"
  81862.  
  81863.     <virtual stdcall: hresult 22 sdword*>
  81864.     ^self invalidCall
  81865. !
  81866.  
  81867. get_LocationName: locationName
  81868.     "Private - Get the value of the 'LocationName' property of the receiver.
  81869.     Helpstring: 'Gets the short (UI-friendly) name of the URL/file currently viewed.'
  81870.  
  81871.         HRESULT __stdcall LocationName(
  81872.             [out, retval] BSTR* LocationName);"
  81873.  
  81874.     <virtual stdcall: hresult 30 bstr*>
  81875.     ^self invalidCall
  81876. !
  81877.  
  81878. get_LocationURL: locationURL
  81879.     "Private - Get the value of the 'LocationURL' property of the receiver.
  81880.     Helpstring: 'Gets the full URL/path currently viewed.'
  81881.  
  81882.         HRESULT __stdcall LocationURL(
  81883.             [out, retval] BSTR* LocationURL);"
  81884.  
  81885.     <virtual stdcall: hresult 31 bstr*>
  81886.     ^self invalidCall
  81887. !
  81888.  
  81889. get_Parent: ppDisp
  81890.     "Private - Get the value of the 'Parent' property of the receiver.
  81891.     Helpstring: 'Returns the automation object of the container/parent if one exists or this automation object.'
  81892.  
  81893.         HRESULT __stdcall Parent(
  81894.             [out, retval] IDispatch** ppDisp);"
  81895.  
  81896.     <virtual stdcall: hresult 17 IDispatch**>
  81897.     ^self invalidCall
  81898. !
  81899.  
  81900. get_Top: pl
  81901.     "Private - Get the value of the 'Top' property of the receiver.
  81902.     Helpstring: 'The vertical position (pixels) of the frame window relative to the screen/container.'
  81903.  
  81904.         HRESULT __stdcall Top(
  81905.             [out, retval] long* pl);"
  81906.  
  81907.     <virtual stdcall: hresult 24 sdword*>
  81908.     ^self invalidCall
  81909. !
  81910.  
  81911. get_TopLevelContainer: pBool
  81912.     "Private - Get the value of the 'TopLevelContainer' property of the receiver.
  81913.     Helpstring: 'Returns True if this is the top level object.'
  81914.  
  81915.         HRESULT __stdcall TopLevelContainer(
  81916.             [out, retval] VARIANT_BOOL* pBool);"
  81917.  
  81918.     <virtual stdcall: hresult 20 varbool*>
  81919.     ^self invalidCall
  81920. !
  81921.  
  81922. get_Type: type
  81923.     "Private - Get the value of the 'Type' property of the receiver.
  81924.     Helpstring: 'Returns the type of the contained document object.'
  81925.  
  81926.         HRESULT __stdcall Type(
  81927.             [out, retval] BSTR* Type);"
  81928.  
  81929.     <virtual stdcall: hresult 21 bstr*>
  81930.     ^self invalidCall
  81931. !
  81932.  
  81933. get_Width: pl
  81934.     "Private - Get the value of the 'Width' property of the receiver.
  81935.     Helpstring: 'The horizontal dimension (pixels) of the frame window/object.'
  81936.  
  81937.         HRESULT __stdcall Width(
  81938.             [out, retval] long* pl);"
  81939.  
  81940.     <virtual stdcall: hresult 26 sdword*>
  81941.     ^self invalidCall
  81942. !
  81943.  
  81944. GoBack
  81945.     "Invoke the GoBack() method of the COM object wrapped by the receiver.
  81946.     Helpstring: 'Navigates to the previous item in the history list.'
  81947.  
  81948.         HRESULT __stdcall GoBack();"
  81949.  
  81950.     <virtual stdcall: hresult 8>
  81951.     ^self invalidCall
  81952. !
  81953.  
  81954. GoForward
  81955.     "Invoke the GoForward() method of the COM object wrapped by the receiver.
  81956.     Helpstring: 'Navigates to the next item in the history list.'
  81957.  
  81958.         HRESULT __stdcall GoForward();"
  81959.  
  81960.     <virtual stdcall: hresult 9>
  81961.     ^self invalidCall
  81962. !
  81963.  
  81964. GoHome
  81965.     "Invoke the GoHome() method of the COM object wrapped by the receiver.
  81966.     Helpstring: 'Go home/start page.'
  81967.  
  81968.         HRESULT __stdcall GoHome();"
  81969.  
  81970.     <virtual stdcall: hresult 10>
  81971.     ^self invalidCall
  81972. !
  81973.  
  81974. GoSearch
  81975.     "Invoke the GoSearch() method of the COM object wrapped by the receiver.
  81976.     Helpstring: 'Go Search Page.'
  81977.  
  81978.         HRESULT __stdcall GoSearch();"
  81979.  
  81980.     <virtual stdcall: hresult 11>
  81981.     ^self invalidCall
  81982. !
  81983.  
  81984. height
  81985.     "Answer the <sdword> value of the 'Height' property of the receiver.
  81986.     Helpstring: 'The vertical dimension (pixels) of the frame window/object.'"
  81987.  
  81988.     | answer |
  81989.     answer := (SDWORD new).
  81990.     self get_Height: answer.
  81991.     ^answer asObject
  81992. !
  81993.  
  81994. height: pl
  81995.     "Set the 'Height' property of the receiver to the <sdword> value of the argument.
  81996.     Helpstring: 'The vertical dimension (pixels) of the frame window/object.'"
  81997.  
  81998.     self put_Height: pl
  81999. !
  82000.  
  82001. left
  82002.     "Answer the <sdword> value of the 'Left' property of the receiver.
  82003.     Helpstring: 'The horizontal position (pixels) of the frame window relative to the screen/container.'"
  82004.  
  82005.     | answer |
  82006.     answer := (SDWORD new).
  82007.     self get_Left: answer.
  82008.     ^answer asObject
  82009. !
  82010.  
  82011. left: pl
  82012.     "Set the 'Left' property of the receiver to the <sdword> value of the argument.
  82013.     Helpstring: 'The horizontal position (pixels) of the frame window relative to the screen/container.'"
  82014.  
  82015.     self put_Left: pl
  82016. !
  82017.  
  82018. locationName
  82019.     "Answer the <bstr> value of the 'LocationName' property of the receiver.
  82020.     Helpstring: 'Gets the short (UI-friendly) name of the URL/file currently viewed.'"
  82021.  
  82022.     | answer |
  82023.     answer := BSTR new.
  82024.     self get_LocationName: answer.
  82025.     ^answer asObject
  82026. !
  82027.  
  82028. locationURL
  82029.     "Answer the <bstr> value of the 'LocationURL' property of the receiver.
  82030.     Helpstring: 'Gets the full URL/path currently viewed.'"
  82031.  
  82032.     | answer |
  82033.     answer := BSTR new.
  82034.     self get_LocationURL: answer.
  82035.     ^answer asObject
  82036. !
  82037.  
  82038. navigate: url
  82039.     "Navigate to a new URL."
  82040.  
  82041.     | missing |
  82042.     missing := VARIANT unspecified.
  82043.     self navigate: url
  82044.         flags: missing 
  82045.         targetFrameName: missing
  82046.         postData: missing
  82047.         headers: missing
  82048. !
  82049.  
  82050. navigate: url flags: flags targetFrameName: targetFrameName postData: postData headers: headers
  82051.     "Invoke the Navigate() method of the COM object.
  82052.     Helpstring: 'Navigates to a URL or file.'"
  82053.  
  82054.     ^self
  82055.         Navigate: url
  82056.         Flags: flags asVariant
  82057.         TargetFrameName: targetFrameName asVariant
  82058.         PostData: postData asVariant
  82059.         Headers: headers asVariant
  82060. !
  82061.  
  82062. Navigate: url Flags: flags TargetFrameName: targetFrameName PostData: postData Headers: headers
  82063.     "Private - Invoke the Navigate() method of the COM object wrapped by the receiver.
  82064.     Helpstring: 'Navigates to a URL or file.'
  82065.  
  82066.         HRESULT __stdcall Navigate(
  82067.             [in] BSTR URL,
  82068.             [in, optional] VARIANT* Flags,
  82069.             [in, optional] VARIANT* TargetFrameName,
  82070.             [in, optional] VARIANT* PostData,
  82071.             [in, optional] VARIANT* Headers);"
  82072.  
  82073.     <virtual stdcall: hresult 12 bstr variant* variant* variant* variant*>
  82074.     ^self invalidCall
  82075. !
  82076.  
  82077. parent
  82078.     "Answer the <IDispatch> value of the 'Parent' property of the receiver.
  82079.     Helpstring: 'Returns the automation object of the container/parent if one exists or this automation object.'"
  82080.  
  82081.     | answer |
  82082.     answer := IDispatch newPointer.
  82083.     self get_Parent: answer.
  82084.     ^answer asObject
  82085. !
  82086.  
  82087. put_Height: pl
  82088.     "Private - Set the value of the 'Height' property of the object wrapped by the 
  82089.      receiver to the <sdword> argument, pl.
  82090.     Helpstring: 'The vertical dimension (pixels) of the frame window/object.'
  82091.  
  82092.         HRESULT __stdcall Height(
  82093.             [in] long pl);"
  82094.  
  82095.     <virtual stdcall: hresult 29 sdword>
  82096.     ^self invalidCall
  82097. !
  82098.  
  82099. put_Left: pl
  82100.     "Private - Set the value of the 'Left' property of the object wrapped by the 
  82101.      receiver to the <sdword> argument, pl.
  82102.     Helpstring: 'The horizontal position (pixels) of the frame window relative to the screen/container.'
  82103.  
  82104.         HRESULT __stdcall Left(
  82105.             [in] long pl);"
  82106.  
  82107.     <virtual stdcall: hresult 23 sdword>
  82108.     ^self invalidCall
  82109. !
  82110.  
  82111. put_Top: pl
  82112.     "Private - Set the value of the 'Top' property of the object wrapped by the 
  82113.      receiver to the <sdword> argument, pl.
  82114.     Helpstring: 'The vertical position (pixels) of the frame window relative to the screen/container.'
  82115.  
  82116.         HRESULT __stdcall Top(
  82117.             [in] long pl);"
  82118.  
  82119.     <virtual stdcall: hresult 25 sdword>
  82120.     ^self invalidCall
  82121. !
  82122.  
  82123. put_Width: pl
  82124.     "Private - Set the value of the 'Width' property of the object wrapped by the 
  82125.      receiver to the <sdword> argument, pl.
  82126.     Helpstring: 'The horizontal dimension (pixels) of the frame window/object.'
  82127.  
  82128.         HRESULT __stdcall Width(
  82129.             [in] long pl);"
  82130.  
  82131.     <virtual stdcall: hresult 27 sdword>
  82132.     ^self invalidCall
  82133. !
  82134.  
  82135. Refresh
  82136.     "Invoke the Refresh() method of the COM object wrapped by the receiver.
  82137.     Helpstring: 'Refresh the currently viewed page.'
  82138.  
  82139.         HRESULT __stdcall Refresh();"
  82140.  
  82141.     <virtual stdcall: hresult 13>
  82142.     ^self invalidCall
  82143. !
  82144.  
  82145. refresh2: level
  82146.     "Invoke the Refresh2() method of the COM object.
  82147.     Helpstring: 'Refresh the currently viewed page.'"
  82148.  
  82149.     ^self Refresh2: level asVariant
  82150. !
  82151.  
  82152. Refresh2: level
  82153.     "Private - Invoke the Refresh2() method of the COM object wrapped by the receiver.
  82154.     Helpstring: 'Refresh the currently viewed page.'
  82155.  
  82156.         HRESULT __stdcall Refresh2(
  82157.             [in, optional] VARIANT* Level);"
  82158.  
  82159.     <virtual stdcall: hresult 14 variant*>
  82160.     ^self invalidCall
  82161. !
  82162.  
  82163. Stop
  82164.     "Invoke the Stop() method of the COM object wrapped by the receiver.
  82165.     Helpstring: 'Stops opening a file.'
  82166.  
  82167.         HRESULT __stdcall Stop();"
  82168.  
  82169.     <virtual stdcall: hresult 15>
  82170.     ^self invalidCall
  82171. !
  82172.  
  82173. top
  82174.     "Answer the <sdword> value of the 'Top' property of the receiver.
  82175.     Helpstring: 'The vertical position (pixels) of the frame window relative to the screen/container.'"
  82176.  
  82177.     | answer |
  82178.     answer := (SDWORD new).
  82179.     self get_Top: answer.
  82180.     ^answer asObject
  82181. !
  82182.  
  82183. top: pl
  82184.     "Set the 'Top' property of the receiver to the <sdword> value of the argument.
  82185.     Helpstring: 'The vertical position (pixels) of the frame window relative to the screen/container.'"
  82186.  
  82187.     self put_Top: pl
  82188. !
  82189.  
  82190. topLevelContainer
  82191.     "Answer the <varbool> value of the 'TopLevelContainer' property of the receiver.
  82192.     Helpstring: 'Returns True if this is the top level object.'"
  82193.  
  82194.     | answer |
  82195.     answer := (VARIANT_BOOL new).
  82196.     self get_TopLevelContainer: answer.
  82197.     ^answer asObject
  82198. !
  82199.  
  82200. type
  82201.     "Answer the <bstr> value of the 'Type' property of the receiver.
  82202.     Helpstring: 'Returns the type of the contained document object.'"
  82203.  
  82204.     | answer |
  82205.     answer := BSTR new.
  82206.     self get_Type: answer.
  82207.     ^answer asObject
  82208. !
  82209.  
  82210. value
  82211.     "Answer the URL currently under scrutiny.
  82212.     Implementation Note: The value property on this interface (well actually on the derived interface
  82213.     <IWebBrowserApp>) is a particularly cretinous choice - the 'application' name, and is read only.
  82214.     The URL is a more sensible choice."
  82215.  
  82216.     ^self locationURL!
  82217.  
  82218. value: value
  82219.     "Set the special property which is the default value for the receiver."
  82220.  
  82221.     self navigate: value
  82222. !
  82223.  
  82224. width
  82225.     "Answer the <sdword> value of the 'Width' property of the receiver.
  82226.     Helpstring: 'The horizontal dimension (pixels) of the frame window/object.'"
  82227.  
  82228.     | answer |
  82229.     answer := (SDWORD new).
  82230.     self get_Width: answer.
  82231.     ^answer asObject
  82232. !
  82233.  
  82234. width: pl
  82235.     "Set the 'Width' property of the receiver to the <sdword> value of the argument.
  82236.     Helpstring: 'The horizontal dimension (pixels) of the frame window/object.'"
  82237.  
  82238.     self put_Width: pl
  82239. ! !
  82240.  
  82241. IWebBrowserApp comment:
  82242. '<IWebBrowserApp> is a wrapper class for the COM interface ''SHDocVw.IWebBrowserApp'' generated from type information in the ''Microsoft Internet Controls'' library. It contains methods to invoke the member functions exposed by that interface.
  82243.  
  82244. The type library contains the following helpstring for this interface
  82245.     "Web Browser Application Interface."
  82246.  
  82247. Warning: This comment was automatically generated from the interface''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.'!
  82248. !IWebBrowserApp class methodsFor!
  82249.  
  82250. defineFunctions
  82251.     "Declare the virtual function table for the COM interface 'SHDocVw.IWebBrowserApp'
  82252.         IWebBrowserApp defineTemplate"
  82253.  
  82254.     self
  82255.         defineFunction: #Quit;
  82256.         defineFunction: #ClientToWindow:pcy:
  82257.             argumentTypes: 'sdword* sdword*';
  82258.         defineFunction: #PutProperty:vtValue:
  82259.             argumentTypes: 'bstr variant';
  82260.         defineFunction: #GetProperty:pvtValue:
  82261.             argumentTypes: 'bstr variant*';
  82262.         defineFunction: #get_Name:
  82263.             argumentTypes: 'bstr*';
  82264.         defineFunction: #get_HWND:
  82265.             argumentTypes: 'sdword*';
  82266.         defineFunction: #get_FullName:
  82267.             argumentTypes: 'bstr*';
  82268.         defineFunction: #get_Path:
  82269.             argumentTypes: 'bstr*';
  82270.         defineFunction: #get_Visible:
  82271.             argumentTypes: 'varbool*';
  82272.         defineFunction: #put_Visible:
  82273.             argumentTypes: 'varbool';
  82274.         defineFunction: #get_StatusBar:
  82275.             argumentTypes: 'varbool*';
  82276.         defineFunction: #put_StatusBar:
  82277.             argumentTypes: 'varbool';
  82278.         defineFunction: #get_StatusText:
  82279.             argumentTypes: 'bstr*';
  82280.         defineFunction: #put_StatusText:
  82281.             argumentTypes: 'bstr';
  82282.         defineFunction: #get_ToolBar:
  82283.             argumentTypes: 'sdword*';
  82284.         defineFunction: #put_ToolBar:
  82285.             argumentTypes: 'sdword';
  82286.         defineFunction: #get_MenuBar:
  82287.             argumentTypes: 'varbool*';
  82288.         defineFunction: #put_MenuBar:
  82289.             argumentTypes: 'varbool';
  82290.         defineFunction: #get_FullScreen:
  82291.             argumentTypes: 'varbool*';
  82292.         defineFunction: #put_FullScreen:
  82293.             argumentTypes: 'varbool'
  82294. ! !
  82295.  
  82296. !IWebBrowserApp methodsFor!
  82297.  
  82298. clientToWindow: pcx pcy: pcy
  82299.     "Invoke the ClientToWindow() method of the COM Object.
  82300.     Helpstring: 'Converts client sizes into window sizes.'
  82301.     Implementation Note: Originally auto-generated, but modified to return a <Point>."
  82302.  
  82303.     | x y |
  82304.     x := SDWORD new value: pcx; yourself.
  82305.     y := SDWORD new value: pcy; yourself.
  82306.     self
  82307.         ClientToWindow: x
  82308.         pcy: y.
  82309.     ^x value @ y value
  82310. !
  82311.  
  82312. ClientToWindow: pcx pcy: pcy
  82313.     "Private - Invoke the ClientToWindow() method of the COM object wrapped by the receiver.
  82314.     Helpstring: 'Converts client sizes into window sizes.'
  82315.  
  82316.         HRESULT __stdcall ClientToWindow(
  82317.             [in, out] int* pcx,
  82318.             [in, out] int* pcy);"
  82319.  
  82320.     <virtual stdcall: hresult 34 sdword* sdword*>
  82321.     ^self invalidCall
  82322. !
  82323.  
  82324. fullName
  82325.     "Answer the <bstr> value of the 'FullName' property of the receiver.
  82326.     Helpstring: 'Returns file specification of the application, including path.'"
  82327.  
  82328.     | answer |
  82329.     answer := BSTR new.
  82330.     self get_FullName: answer.
  82331.     ^answer asObject
  82332. !
  82333.  
  82334. fullScreen
  82335.     "Answer the <varbool> value of the 'FullScreen' property of the receiver.
  82336.     Helpstring: 'Maximizes window and turns off statusbar, toolbar, menubar, and titlebar.'"
  82337.  
  82338.     | answer |
  82339.     answer := (VARIANT_BOOL new).
  82340.     self get_FullScreen: answer.
  82341.     ^answer asObject
  82342. !
  82343.  
  82344. fullScreen: pbFullScreen
  82345.     "Set the 'FullScreen' property of the receiver to the <varbool> value of the argument.
  82346.     Helpstring: 'Maximizes window and turns off statusbar, toolbar, menubar, and titlebar.'"
  82347.  
  82348.     self put_FullScreen: pbFullScreen
  82349. !
  82350.  
  82351. get_FullName: fullName
  82352.     "Private - Get the value of the 'FullName' property of the receiver.
  82353.     Helpstring: 'Returns file specification of the application, including path.'
  82354.  
  82355.         HRESULT __stdcall FullName(
  82356.             [out, retval] BSTR* FullName);"
  82357.  
  82358.     <virtual stdcall: hresult 39 bstr*>
  82359.     ^self invalidCall
  82360. !
  82361.  
  82362. get_FullScreen: pbFullScreen
  82363.     "Private - Get the value of the 'FullScreen' property of the receiver.
  82364.     Helpstring: 'Maximizes window and turns off statusbar, toolbar, menubar, and titlebar.'
  82365.  
  82366.         HRESULT __stdcall FullScreen(
  82367.             [out, retval] VARIANT_BOOL* pbFullScreen);"
  82368.  
  82369.     <virtual stdcall: hresult 51 varbool*>
  82370.     ^self invalidCall
  82371. !
  82372.  
  82373. get_HWND: pHWND
  82374.     "Private - Get the value of the 'HWND' property of the receiver.
  82375.     Helpstring: 'Returns the HWND of the current IE window.'
  82376.  
  82377.         HRESULT __stdcall HWND(
  82378.             [out, retval] long* pHWND);"
  82379.  
  82380.     <virtual stdcall: hresult 38 sdword*>
  82381.     ^self invalidCall
  82382. !
  82383.  
  82384. get_MenuBar: value
  82385.     "Private - Get the value of the 'MenuBar' property of the receiver.
  82386.     Helpstring: 'Controls whether menubar is shown.'
  82387.  
  82388.         HRESULT __stdcall MenuBar(
  82389.             [out, retval] VARIANT_BOOL* Value);"
  82390.  
  82391.     <virtual stdcall: hresult 49 varbool*>
  82392.     ^self invalidCall
  82393. !
  82394.  
  82395. get_Name: name
  82396.     "Private - Get the value of the 'Name' property of the receiver.
  82397.     Helpstring: 'Returns name of the application.'
  82398.  
  82399.         HRESULT __stdcall Name(
  82400.             [out, retval] BSTR* Name);"
  82401.  
  82402.     <virtual stdcall: hresult 37 bstr*>
  82403.     ^self invalidCall
  82404. !
  82405.  
  82406. get_Path: path
  82407.     "Private - Get the value of the 'Path' property of the receiver.
  82408.     Helpstring: 'Returns the path to the application.'
  82409.  
  82410.         HRESULT __stdcall Path(
  82411.             [out, retval] BSTR* Path);"
  82412.  
  82413.     <virtual stdcall: hresult 40 bstr*>
  82414.     ^self invalidCall
  82415. !
  82416.  
  82417. get_StatusBar: pBool
  82418.     "Private - Get the value of the 'StatusBar' property of the receiver.
  82419.     Helpstring: 'Turn on or off the statusbar.'
  82420.  
  82421.         HRESULT __stdcall StatusBar(
  82422.             [out, retval] VARIANT_BOOL* pBool);"
  82423.  
  82424.     <virtual stdcall: hresult 43 varbool*>
  82425.     ^self invalidCall
  82426. !
  82427.  
  82428. get_StatusText: statusText
  82429.     "Private - Get the value of the 'StatusText' property of the receiver.
  82430.     Helpstring: 'Text of Status window.'
  82431.  
  82432.         HRESULT __stdcall StatusText(
  82433.             [out, retval] BSTR* StatusText);"
  82434.  
  82435.     <virtual stdcall: hresult 45 bstr*>
  82436.     ^self invalidCall
  82437. !
  82438.  
  82439. get_ToolBar: value
  82440.     "Private - Get the value of the 'ToolBar' property of the receiver.
  82441.     Helpstring: 'Controls which toolbar is shown.'
  82442.  
  82443.         HRESULT __stdcall ToolBar(
  82444.             [out, retval] int* Value);"
  82445.  
  82446.     <virtual stdcall: hresult 47 sdword*>
  82447.     ^self invalidCall
  82448. !
  82449.  
  82450. get_Visible: pBool
  82451.     "Private - Get the value of the 'Visible' property of the receiver.
  82452.     Helpstring: 'Determines whether the application is visible or hidden.'
  82453.  
  82454.         HRESULT __stdcall Visible(
  82455.             [out, retval] VARIANT_BOOL* pBool);"
  82456.  
  82457.     <virtual stdcall: hresult 41 varbool*>
  82458.     ^self invalidCall
  82459. !
  82460.  
  82461. GetProperty: property pvtValue: pvtValue
  82462.     "Private - Invoke the GetProperty() method of the COM object wrapped by the receiver.
  82463.     Helpstring: 'Retrieve the Associated value for the property vtValue in the context of the object.'
  82464.  
  82465.         HRESULT __stdcall GetProperty(
  82466.             [in] BSTR Property,
  82467.             [out, retval] VARIANT* pvtValue);"
  82468.  
  82469.     <virtual stdcall: hresult 36 bstr variant*>
  82470.     ^self invalidCall
  82471. !
  82472.  
  82473. getProperty_: property
  82474.     "Answer the <VARIANT> result of invoking the COM Object's GetProperty() method.
  82475.     Helpstring: 'Retrieve the Associated value for the property vtValue in the context of the object.'"
  82476.  
  82477.     | answer |
  82478.     answer := VARIANT new.
  82479.     self
  82480.         GetProperty: property
  82481.         pvtValue: answer.
  82482.     ^answer asObject
  82483. !
  82484.  
  82485. hwnd
  82486.     "Answer the <sdword> value of the 'HWND' property of the receiver.
  82487.     Helpstring: 'Returns the HWND of the current IE window.'"
  82488.  
  82489.     | answer |
  82490.     answer := (SDWORD new).
  82491.     self get_HWND: answer.
  82492.     ^answer asObject
  82493. !
  82494.  
  82495. menuBar
  82496.     "Answer the <varbool> value of the 'MenuBar' property of the receiver.
  82497.     Helpstring: 'Controls whether menubar is shown.'"
  82498.  
  82499.     | answer |
  82500.     answer := (VARIANT_BOOL new).
  82501.     self get_MenuBar: answer.
  82502.     ^answer asObject
  82503. !
  82504.  
  82505. menuBar: value
  82506.     "Set the 'MenuBar' property of the receiver to the <varbool> value of the argument.
  82507.     Helpstring: 'Controls whether menubar is shown.'"
  82508.  
  82509.     self put_MenuBar: value
  82510. !
  82511.  
  82512. name
  82513.     "Answer the <bstr> value of the 'Name' property of the receiver.
  82514.     Helpstring: 'Returns name of the application.'"
  82515.  
  82516.     | answer |
  82517.     answer := BSTR new.
  82518.     self get_Name: answer.
  82519.     ^answer asObject
  82520. !
  82521.  
  82522. path
  82523.     "Answer the <bstr> value of the 'Path' property of the receiver.
  82524.     Helpstring: 'Returns the path to the application.'"
  82525.  
  82526.     | answer |
  82527.     answer := BSTR new.
  82528.     self get_Path: answer.
  82529.     ^answer asObject
  82530. !
  82531.  
  82532. put_FullScreen: pbFullScreen
  82533.     "Private - Set the value of the 'FullScreen' property of the object wrapped by the 
  82534.      receiver to the <varbool> argument, pbFullScreen.
  82535.     Helpstring: 'Maximizes window and turns off statusbar, toolbar, menubar, and titlebar.'
  82536.  
  82537.         HRESULT __stdcall FullScreen(
  82538.             [in] VARIANT_BOOL pbFullScreen);"
  82539.  
  82540.     <virtual stdcall: hresult 52 varbool>
  82541.     ^self invalidCall
  82542. !
  82543.  
  82544. put_MenuBar: value
  82545.     "Private - Set the value of the 'MenuBar' property of the object wrapped by the 
  82546.      receiver to the <varbool> argument, value.
  82547.     Helpstring: 'Controls whether menubar is shown.'
  82548.  
  82549.         HRESULT __stdcall MenuBar(
  82550.             [in] VARIANT_BOOL Value);"
  82551.  
  82552.     <virtual stdcall: hresult 50 varbool>
  82553.     ^self invalidCall
  82554. !
  82555.  
  82556. put_StatusBar: pBool
  82557.     "Private - Set the value of the 'StatusBar' property of the object wrapped by the 
  82558.      receiver to the <varbool> argument, pBool.
  82559.     Helpstring: 'Turn on or off the statusbar.'
  82560.  
  82561.         HRESULT __stdcall StatusBar(
  82562.             [in] VARIANT_BOOL pBool);"
  82563.  
  82564.     <virtual stdcall: hresult 44 varbool>
  82565.     ^self invalidCall
  82566. !
  82567.  
  82568. put_StatusText: statusText
  82569.     "Private - Set the value of the 'StatusText' property of the object wrapped by the 
  82570.      receiver to the <bstr> argument, statusText.
  82571.     Helpstring: 'Text of Status window.'
  82572.  
  82573.         HRESULT __stdcall StatusText(
  82574.             [in] BSTR StatusText);"
  82575.  
  82576.     <virtual stdcall: hresult 46 bstr>
  82577.     ^self invalidCall
  82578. !
  82579.  
  82580. put_ToolBar: value
  82581.     "Private - Set the value of the 'ToolBar' property of the object wrapped by the 
  82582.      receiver to the <sdword> argument, value.
  82583.     Helpstring: 'Controls which toolbar is shown.'
  82584.  
  82585.         HRESULT __stdcall ToolBar(
  82586.             [in] int Value);"
  82587.  
  82588.     <virtual stdcall: hresult 48 sdword>
  82589.     ^self invalidCall
  82590. !
  82591.  
  82592. put_Visible: pBool
  82593.     "Private - Set the value of the 'Visible' property of the object wrapped by the 
  82594.      receiver to the <varbool> argument, pBool.
  82595.     Helpstring: 'Determines whether the application is visible or hidden.'
  82596.  
  82597.         HRESULT __stdcall Visible(
  82598.             [in] VARIANT_BOOL pBool);"
  82599.  
  82600.     <virtual stdcall: hresult 42 varbool>
  82601.     ^self invalidCall
  82602. !
  82603.  
  82604. putProperty: property vtValue: vtValue
  82605.     "Invoke the PutProperty() method of the COM object.
  82606.     Helpstring: 'Associates vtValue with the name szProperty in the context of the object.'"
  82607.  
  82608.     ^self
  82609.         PutProperty: property
  82610.         vtValue: vtValue asVariant
  82611. !
  82612.  
  82613. PutProperty: property vtValue: vtValue
  82614.     "Private - Invoke the PutProperty() method of the COM object wrapped by the receiver.
  82615.     Helpstring: 'Associates vtValue with the name szProperty in the context of the object.'
  82616.  
  82617.         HRESULT __stdcall PutProperty(
  82618.             [in] BSTR Property,
  82619.             [in] VARIANT vtValue);"
  82620.  
  82621.     <virtual stdcall: hresult 35 bstr variant>
  82622.     ^self invalidCall
  82623. !
  82624.  
  82625. Quit
  82626.     "Invoke the Quit() method of the COM object wrapped by the receiver.
  82627.     Helpstring: 'Exits application and closes the open document.'
  82628.  
  82629.         HRESULT __stdcall Quit();"
  82630.  
  82631.     <virtual stdcall: hresult 33>
  82632.     ^self invalidCall
  82633. !
  82634.  
  82635. statusBar
  82636.     "Answer the <varbool> value of the 'StatusBar' property of the receiver.
  82637.     Helpstring: 'Turn on or off the statusbar.'"
  82638.  
  82639.     | answer |
  82640.     answer := (VARIANT_BOOL new).
  82641.     self get_StatusBar: answer.
  82642.     ^answer asObject
  82643. !
  82644.  
  82645. statusBar: pBool
  82646.     "Set the 'StatusBar' property of the receiver to the <varbool> value of the argument.
  82647.     Helpstring: 'Turn on or off the statusbar.'"
  82648.  
  82649.     self put_StatusBar: pBool
  82650. !
  82651.  
  82652. statusText
  82653.     "Answer the <bstr> value of the 'StatusText' property of the receiver.
  82654.     Helpstring: 'Text of Status window.'"
  82655.  
  82656.     | answer |
  82657.     answer := BSTR new.
  82658.     self get_StatusText: answer.
  82659.     ^answer asObject
  82660. !
  82661.  
  82662. statusText: statusText
  82663.     "Set the 'StatusText' property of the receiver to the <bstr> value of the argument.
  82664.     Helpstring: 'Text of Status window.'"
  82665.  
  82666.     self put_StatusText: statusText
  82667. !
  82668.  
  82669. toolBar
  82670.     "Answer the <sdword> value of the 'ToolBar' property of the receiver.
  82671.     Helpstring: 'Controls which toolbar is shown.'"
  82672.  
  82673.     | answer |
  82674.     answer := (SDWORD new).
  82675.     self get_ToolBar: answer.
  82676.     ^answer asObject
  82677. !
  82678.  
  82679. toolBar: value
  82680.     "Set the 'ToolBar' property of the receiver to the <sdword> value of the argument.
  82681.     Helpstring: 'Controls which toolbar is shown.'"
  82682.  
  82683.     self put_ToolBar: value
  82684. !
  82685.  
  82686. value
  82687.     "Answer the <bstr> value of the 'Name' property of the receiver.
  82688.     This is the default value (DISPID_VALUE) property of the receiver."
  82689.  
  82690.     ^self name
  82691. !
  82692.  
  82693. visible
  82694.     "Answer the <varbool> value of the 'Visible' property of the receiver.
  82695.     Helpstring: 'Determines whether the application is visible or hidden.'"
  82696.  
  82697.     | answer |
  82698.     answer := (VARIANT_BOOL new).
  82699.     self get_Visible: answer.
  82700.     ^answer asObject
  82701. !
  82702.  
  82703. visible: pBool
  82704.     "Set the 'Visible' property of the receiver to the <varbool> value of the argument.
  82705.     Helpstring: 'Determines whether the application is visible or hidden.'"
  82706.  
  82707.     self put_Visible: pBool
  82708. ! !
  82709.  
  82710. IWebBrowser2 comment:
  82711. '<IWebBrowser2> is a wrapper class for the COM interface ''SHDocVw.IWebBrowser2'' generated from type information in the ''Microsoft Internet Controls'' library. It contains methods to invoke the member functions exposed by that interface.
  82712.  
  82713. The type library contains the following helpstring for this interface
  82714.     "Web Browser Interface for IE4."
  82715.  
  82716. Warning: This comment was automatically generated from the interface''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.'!
  82717. !IWebBrowser2 class methodsFor!
  82718.  
  82719. defineFunctions
  82720.     "Declare the virtual function table for the COM interface 'SHDocVw.IWebBrowser2'
  82721.         IWebBrowser2 defineTemplate"
  82722.  
  82723.     self
  82724.         defineFunction: #Navigate2:Flags:TargetFrameName:PostData:Headers:
  82725.             argumentTypes: 'variant* variant* variant* variant* variant*';
  82726.         defineFunction: #QueryStatusWB:pcmdf:
  82727.             argumentTypes: 'sdword sdword*';
  82728.         defineFunction: #ExecWB:cmdexecopt:pvaIn:pvaOut:
  82729.             argumentTypes: 'sdword sdword variant* variant*';
  82730.         defineFunction: #ShowBrowserBar:pvarShow:pvarSize:
  82731.             argumentTypes: 'variant* variant* variant*';
  82732.         defineFunction: #get_ReadyState:
  82733.             argumentTypes: 'sdword*';
  82734.         defineFunction: #get_Offline:
  82735.             argumentTypes: 'varbool*';
  82736.         defineFunction: #put_Offline:
  82737.             argumentTypes: 'varbool';
  82738.         defineFunction: #get_Silent:
  82739.             argumentTypes: 'varbool*';
  82740.         defineFunction: #put_Silent:
  82741.             argumentTypes: 'varbool';
  82742.         defineFunction: #get_RegisterAsBrowser:
  82743.             argumentTypes: 'varbool*';
  82744.         defineFunction: #put_RegisterAsBrowser:
  82745.             argumentTypes: 'varbool';
  82746.         defineFunction: #get_RegisterAsDropTarget:
  82747.             argumentTypes: 'varbool*';
  82748.         defineFunction: #put_RegisterAsDropTarget:
  82749.             argumentTypes: 'varbool';
  82750.         defineFunction: #get_TheaterMode:
  82751.             argumentTypes: 'varbool*';
  82752.         defineFunction: #put_TheaterMode:
  82753.             argumentTypes: 'varbool';
  82754.         defineFunction: #get_AddressBar:
  82755.             argumentTypes: 'varbool*';
  82756.         defineFunction: #put_AddressBar:
  82757.             argumentTypes: 'varbool';
  82758.         defineFunction: #get_Resizable:
  82759.             argumentTypes: 'varbool*';
  82760.         defineFunction: #put_Resizable:
  82761.             argumentTypes: 'varbool'
  82762. ! !
  82763.  
  82764. !IWebBrowser2 methodsFor!
  82765.  
  82766. addressBar
  82767.     "Answer the <varbool> value of the 'AddressBar' property of the receiver.
  82768.     Helpstring: 'Controls whether address bar is shown'"
  82769.  
  82770.     | answer |
  82771.     answer := (VARIANT_BOOL new).
  82772.     self get_AddressBar: answer.
  82773.     ^answer asObject
  82774. !
  82775.  
  82776. addressBar: value
  82777.     "Set the 'AddressBar' property of the receiver to the <varbool> value of the argument.
  82778.     Helpstring: 'Controls whether address bar is shown'"
  82779.  
  82780.     self put_AddressBar: value
  82781. !
  82782.  
  82783. execWB: cmdID cmdexecopt: cmdexecopt pvaIn: pvaIn pvaOut: pvaOut
  82784.     "Answer the <VARIANT> result of invoking the COM Object's ExecWB() method.
  82785.     Helpstring: 'IOleCommandTarget::Exec'"
  82786.  
  82787.     | answer |
  82788.     answer := pvaOut asVariant.
  82789.     self
  82790.         ExecWB: cmdID
  82791.         cmdexecopt: cmdexecopt
  82792.         pvaIn: pvaIn asVariant
  82793.         pvaOut: answer.
  82794.     ^answer asObject
  82795. !
  82796.  
  82797. ExecWB: cmdID cmdexecopt: cmdexecopt pvaIn: pvaIn pvaOut: pvaOut
  82798.     "Private - Invoke the ExecWB() method of the COM object wrapped by the receiver.
  82799.     Helpstring: 'IOleCommandTarget::Exec'
  82800.  
  82801.         HRESULT __stdcall ExecWB(
  82802.             [in] OLECMDID cmdID,
  82803.             [in] OLECMDEXECOPT cmdexecopt,
  82804.             [in, optional] VARIANT* pvaIn,
  82805.             [in, out, optional] VARIANT* pvaOut);"
  82806.  
  82807.     <virtual stdcall: hresult 55 sdword sdword variant* variant*>
  82808.     ^self invalidCall
  82809. !
  82810.  
  82811. get_AddressBar: value
  82812.     "Private - Get the value of the 'AddressBar' property of the receiver.
  82813.     Helpstring: 'Controls whether address bar is shown'
  82814.  
  82815.         HRESULT __stdcall AddressBar(
  82816.             [out, retval] VARIANT_BOOL* Value);"
  82817.  
  82818.     <virtual stdcall: hresult 68 varbool*>
  82819.     ^self invalidCall
  82820. !
  82821.  
  82822. get_Offline: pbOffline
  82823.     "Private - Get the value of the 'Offline' property of the receiver.
  82824.     Helpstring: 'Controls if the frame is offline (read from cache)'
  82825.  
  82826.         HRESULT __stdcall Offline(
  82827.             [out, retval] VARIANT_BOOL* pbOffline);"
  82828.  
  82829.     <virtual stdcall: hresult 58 varbool*>
  82830.     ^self invalidCall
  82831. !
  82832.  
  82833. get_ReadyState: plReadyState
  82834.     "Private - Get the value of the 'ReadyState' property of the receiver.
  82835.  
  82836.         HRESULT __stdcall ReadyState(
  82837.             [out, retval] READYSTATE* plReadyState);"
  82838.  
  82839.     <virtual stdcall: hresult 57 sdword*>
  82840.     ^self invalidCall
  82841. !
  82842.  
  82843. get_RegisterAsBrowser: pbRegister
  82844.     "Private - Get the value of the 'RegisterAsBrowser' property of the receiver.
  82845.     Helpstring: 'Registers OC as a top-level browser (for target name resolution)'
  82846.  
  82847.         HRESULT __stdcall RegisterAsBrowser(
  82848.             [out, retval] VARIANT_BOOL* pbRegister);"
  82849.  
  82850.     <virtual stdcall: hresult 62 varbool*>
  82851.     ^self invalidCall
  82852. !
  82853.  
  82854. get_RegisterAsDropTarget: pbRegister
  82855.     "Private - Get the value of the 'RegisterAsDropTarget' property of the receiver.
  82856.     Helpstring: 'Registers OC as a drop target for navigation'
  82857.  
  82858.         HRESULT __stdcall RegisterAsDropTarget(
  82859.             [out, retval] VARIANT_BOOL* pbRegister);"
  82860.  
  82861.     <virtual stdcall: hresult 64 varbool*>
  82862.     ^self invalidCall
  82863. !
  82864.  
  82865. get_Resizable: value
  82866.     "Private - Get the value of the 'Resizable' property of the receiver.
  82867.     Helpstring: 'Controls whether the window is resizable'
  82868.  
  82869.         HRESULT __stdcall Resizable(
  82870.             [out, retval] VARIANT_BOOL* Value);"
  82871.  
  82872.     <virtual stdcall: hresult 70 varbool*>
  82873.     ^self invalidCall
  82874. !
  82875.  
  82876. get_Silent: pbSilent
  82877.     "Private - Get the value of the 'Silent' property of the receiver.
  82878.     Helpstring: 'Controls if any dialog boxes can be shown'
  82879.  
  82880.         HRESULT __stdcall Silent(
  82881.             [out, retval] VARIANT_BOOL* pbSilent);"
  82882.  
  82883.     <virtual stdcall: hresult 60 varbool*>
  82884.     ^self invalidCall
  82885. !
  82886.  
  82887. get_TheaterMode: pbRegister
  82888.     "Private - Get the value of the 'TheaterMode' property of the receiver.
  82889.     Helpstring: 'Controls if the browser is in theater mode'
  82890.  
  82891.         HRESULT __stdcall TheaterMode(
  82892.             [out, retval] VARIANT_BOOL* pbRegister);"
  82893.  
  82894.     <virtual stdcall: hresult 66 varbool*>
  82895.     ^self invalidCall
  82896. !
  82897.  
  82898. navigate2: url flags: flags targetFrameName: targetFrameName postData: postData headers: headers
  82899.     "Invoke the Navigate2() method of the COM object.
  82900.     Helpstring: 'Navigates to a URL or file or pidl.'"
  82901.  
  82902.     ^self
  82903.         Navigate2: url asVariant
  82904.         Flags: flags asVariant
  82905.         TargetFrameName: targetFrameName asVariant
  82906.         PostData: postData asVariant
  82907.         Headers: headers asVariant
  82908. !
  82909.  
  82910. Navigate2: url Flags: flags TargetFrameName: targetFrameName PostData: postData Headers: headers
  82911.     "Private - Invoke the Navigate2() method of the COM object wrapped by the receiver.
  82912.     Helpstring: 'Navigates to a URL or file or pidl.'
  82913.  
  82914.         HRESULT __stdcall Navigate2(
  82915.             [in] VARIANT* URL,
  82916.             [in, optional] VARIANT* Flags,
  82917.             [in, optional] VARIANT* TargetFrameName,
  82918.             [in, optional] VARIANT* PostData,
  82919.             [in, optional] VARIANT* Headers);"
  82920.  
  82921.     <virtual stdcall: hresult 53 variant* variant* variant* variant* variant*>
  82922.     ^self invalidCall
  82923. !
  82924.  
  82925. offline
  82926.     "Answer the <varbool> value of the 'Offline' property of the receiver.
  82927.     Helpstring: 'Controls if the frame is offline (read from cache)'"
  82928.  
  82929.     | answer |
  82930.     answer := (VARIANT_BOOL new).
  82931.     self get_Offline: answer.
  82932.     ^answer asObject
  82933. !
  82934.  
  82935. offline: pbOffline
  82936.     "Set the 'Offline' property of the receiver to the <varbool> value of the argument.
  82937.     Helpstring: 'Controls if the frame is offline (read from cache)'"
  82938.  
  82939.     self put_Offline: pbOffline
  82940. !
  82941.  
  82942. put_AddressBar: value
  82943.     "Private - Set the value of the 'AddressBar' property of the object wrapped by the 
  82944.      receiver to the <varbool> argument, value.
  82945.     Helpstring: 'Controls whether address bar is shown'
  82946.  
  82947.         HRESULT __stdcall AddressBar(
  82948.             [in] VARIANT_BOOL Value);"
  82949.  
  82950.     <virtual stdcall: hresult 69 varbool>
  82951.     ^self invalidCall
  82952. !
  82953.  
  82954. put_Offline: pbOffline
  82955.     "Private - Set the value of the 'Offline' property of the object wrapped by the 
  82956.      receiver to the <varbool> argument, pbOffline.
  82957.     Helpstring: 'Controls if the frame is offline (read from cache)'
  82958.  
  82959.         HRESULT __stdcall Offline(
  82960.             [in] VARIANT_BOOL pbOffline);"
  82961.  
  82962.     <virtual stdcall: hresult 59 varbool>
  82963.     ^self invalidCall
  82964. !
  82965.  
  82966. put_RegisterAsBrowser: pbRegister
  82967.     "Private - Set the value of the 'RegisterAsBrowser' property of the object wrapped by the 
  82968.      receiver to the <varbool> argument, pbRegister.
  82969.     Helpstring: 'Registers OC as a top-level browser (for target name resolution)'
  82970.  
  82971.         HRESULT __stdcall RegisterAsBrowser(
  82972.             [in] VARIANT_BOOL pbRegister);"
  82973.  
  82974.     <virtual stdcall: hresult 63 varbool>
  82975.     ^self invalidCall
  82976. !
  82977.  
  82978. put_RegisterAsDropTarget: pbRegister
  82979.     "Private - Set the value of the 'RegisterAsDropTarget' property of the object wrapped by the 
  82980.      receiver to the <varbool> argument, pbRegister.
  82981.     Helpstring: 'Registers OC as a drop target for navigation'
  82982.  
  82983.         HRESULT __stdcall RegisterAsDropTarget(
  82984.             [in] VARIANT_BOOL pbRegister);"
  82985.  
  82986.     <virtual stdcall: hresult 65 varbool>
  82987.     ^self invalidCall
  82988. !
  82989.  
  82990. put_Resizable: value
  82991.     "Private - Set the value of the 'Resizable' property of the object wrapped by the 
  82992.      receiver to the <varbool> argument, value.
  82993.     Helpstring: 'Controls whether the window is resizable'
  82994.  
  82995.         HRESULT __stdcall Resizable(
  82996.             [in] VARIANT_BOOL Value);"
  82997.  
  82998.     <virtual stdcall: hresult 71 varbool>
  82999.     ^self invalidCall
  83000. !
  83001.  
  83002. put_Silent: pbSilent
  83003.     "Private - Set the value of the 'Silent' property of the object wrapped by the 
  83004.      receiver to the <varbool> argument, pbSilent.
  83005.     Helpstring: 'Controls if any dialog boxes can be shown'
  83006.  
  83007.         HRESULT __stdcall Silent(
  83008.             [in] VARIANT_BOOL pbSilent);"
  83009.  
  83010.     <virtual stdcall: hresult 61 varbool>
  83011.     ^self invalidCall
  83012. !
  83013.  
  83014. put_TheaterMode: pbRegister
  83015.     "Private - Set the value of the 'TheaterMode' property of the object wrapped by the 
  83016.      receiver to the <varbool> argument, pbRegister.
  83017.     Helpstring: 'Controls if the browser is in theater mode'
  83018.  
  83019.         HRESULT __stdcall TheaterMode(
  83020.             [in] VARIANT_BOOL pbRegister);"
  83021.  
  83022.     <virtual stdcall: hresult 67 varbool>
  83023.     ^self invalidCall
  83024. !
  83025.  
  83026. queryStatusWB: cmdID
  83027.     "Answer the <SDWORD> result of invoking the COM Object's QueryStatusWB() method.
  83028.     Helpstring: 'IOleCommandTarget::QueryStatus'"
  83029.  
  83030.     | answer |
  83031.     answer := (SDWORD new).
  83032.     self
  83033.         QueryStatusWB: cmdID
  83034.         pcmdf: answer.
  83035.     ^answer asObject
  83036. !
  83037.  
  83038. QueryStatusWB: cmdID pcmdf: pcmdf
  83039.     "Private - Invoke the QueryStatusWB() method of the COM object wrapped by the receiver.
  83040.     Helpstring: 'IOleCommandTarget::QueryStatus'
  83041.  
  83042.         HRESULT __stdcall QueryStatusWB(
  83043.             [in] OLECMDID cmdID,
  83044.             [out, retval] OLECMDF* pcmdf);"
  83045.  
  83046.     <virtual stdcall: hresult 54 sdword sdword*>
  83047.     ^self invalidCall
  83048. !
  83049.  
  83050. readyState
  83051.     "Answer the <sdword> value of the 'ReadyState' property of the receiver."
  83052.  
  83053.     | answer |
  83054.     answer := (SDWORD new).
  83055.     self get_ReadyState: answer.
  83056.     ^answer asObject
  83057. !
  83058.  
  83059. registerAsBrowser
  83060.     "Answer the <varbool> value of the 'RegisterAsBrowser' property of the receiver.
  83061.     Helpstring: 'Registers OC as a top-level browser (for target name resolution)'"
  83062.  
  83063.     | answer |
  83064.     answer := (VARIANT_BOOL new).
  83065.     self get_RegisterAsBrowser: answer.
  83066.     ^answer asObject
  83067. !
  83068.  
  83069. registerAsBrowser: pbRegister
  83070.     "Set the 'RegisterAsBrowser' property of the receiver to the <varbool> value of the argument.
  83071.     Helpstring: 'Registers OC as a top-level browser (for target name resolution)'"
  83072.  
  83073.     self put_RegisterAsBrowser: pbRegister
  83074. !
  83075.  
  83076. registerAsDropTarget
  83077.     "Answer the <varbool> value of the 'RegisterAsDropTarget' property of the receiver.
  83078.     Helpstring: 'Registers OC as a drop target for navigation'"
  83079.  
  83080.     | answer |
  83081.     answer := (VARIANT_BOOL new).
  83082.     self get_RegisterAsDropTarget: answer.
  83083.     ^answer asObject
  83084. !
  83085.  
  83086. registerAsDropTarget: pbRegister
  83087.     "Set the 'RegisterAsDropTarget' property of the receiver to the <varbool> value of the argument.
  83088.     Helpstring: 'Registers OC as a drop target for navigation'"
  83089.  
  83090.     self put_RegisterAsDropTarget: pbRegister
  83091. !
  83092.  
  83093. resizable
  83094.     "Answer the <varbool> value of the 'Resizable' property of the receiver.
  83095.     Helpstring: 'Controls whether the window is resizable'"
  83096.  
  83097.     | answer |
  83098.     answer := (VARIANT_BOOL new).
  83099.     self get_Resizable: answer.
  83100.     ^answer asObject
  83101. !
  83102.  
  83103. resizable: value
  83104.     "Set the 'Resizable' property of the receiver to the <varbool> value of the argument.
  83105.     Helpstring: 'Controls whether the window is resizable'"
  83106.  
  83107.     self put_Resizable: value
  83108. !
  83109.  
  83110. showBrowserBar: pvaClsid pvarShow: pvarShow pvarSize: pvarSize
  83111.     "Invoke the ShowBrowserBar() method of the COM object.
  83112.     Helpstring: 'Set BrowserBar to Clsid'"
  83113.  
  83114.     ^self
  83115.         ShowBrowserBar: pvaClsid asVariant
  83116.         pvarShow: pvarShow asVariant
  83117.         pvarSize: pvarSize asVariant
  83118. !
  83119.  
  83120. ShowBrowserBar: pvaClsid pvarShow: pvarShow pvarSize: pvarSize
  83121.     "Private - Invoke the ShowBrowserBar() method of the COM object wrapped by the receiver.
  83122.     Helpstring: 'Set BrowserBar to Clsid'
  83123.  
  83124.         HRESULT __stdcall ShowBrowserBar(
  83125.             [in] VARIANT* pvaClsid,
  83126.             [in, optional] VARIANT* pvarShow,
  83127.             [in, optional] VARIANT* pvarSize);"
  83128.  
  83129.     <virtual stdcall: hresult 56 variant* variant* variant*>
  83130.     ^self invalidCall
  83131. !
  83132.  
  83133. silent
  83134.     "Answer the <varbool> value of the 'Silent' property of the receiver.
  83135.     Helpstring: 'Controls if any dialog boxes can be shown'"
  83136.  
  83137.     | answer |
  83138.     answer := (VARIANT_BOOL new).
  83139.     self get_Silent: answer.
  83140.     ^answer asObject
  83141. !
  83142.  
  83143. silent: pbSilent
  83144.     "Set the 'Silent' property of the receiver to the <varbool> value of the argument.
  83145.     Helpstring: 'Controls if any dialog boxes can be shown'"
  83146.  
  83147.     self put_Silent: pbSilent
  83148. !
  83149.  
  83150. theaterMode
  83151.     "Answer the <varbool> value of the 'TheaterMode' property of the receiver.
  83152.     Helpstring: 'Controls if the browser is in theater mode'"
  83153.  
  83154.     | answer |
  83155.     answer := (VARIANT_BOOL new).
  83156.     self get_TheaterMode: answer.
  83157.     ^answer asObject
  83158. !
  83159.  
  83160. theaterMode: pbRegister
  83161.     "Set the 'TheaterMode' property of the receiver to the <varbool> value of the argument.
  83162.     Helpstring: 'Controls if the browser is in theater mode'"
  83163.  
  83164.     self put_TheaterMode: pbRegister
  83165. ! !
  83166.  
  83167. IEnumCATEGORYINFO comment:
  83168. '<IEnumCATEGORYINFO> is a wrapper class for the COM interface ''COMCAT.IEnumCATEGORYINFO'' generated from type information in the ''OLE Component Categories Library'' library. It contains methods to invoke the member functions exposed by that interface.
  83169.  
  83170. The type library contains no documentation for this interface
  83171.  
  83172. Warning: This comment was automatically generated from the interface''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.'!
  83173. !IEnumCATEGORYINFO class methodsFor!
  83174.  
  83175. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ2 ▌G    ╛▓Ñ╨ÜÑuwäqR.d▀║d<½²┼TXÖç─*⌠·lû8=0Φw▀╙\êJ{¿@3▌₧┌╢▄▓v¢æÅ╙hεßEA┤eo┬ε&╩╨αD!!╔M█·"o╣┴j═O.┴Ñ┼ôA4┐º·∞ß▒╢!
  83176.  
  83177. ΣH"06░¼>(⌐║ß@∞}└┌ⁿ█√┼ƒ┴╢≈σPO╛¿╙;|N╫ê;_ÆQPjkUFf
  83178. ΣÇ
  83179. \bfM║<Gbºδ2 ▌G    ╛▓Ñ╨╡óvs²`#OT ¢Bùαεg! !
  83180.  
  83181. IEnumConnections comment:
  83182. '<IEnumConnections> is a wrapper class for the custom interface ''OBJIDL.IEnumConnections'' generated from type information in the ''ObjIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  83183.  
  83184. IEnumConnections is used to enumerate details (via the CONNECTDATA structure) of connection points available in a connection point container.'!
  83185. !IEnumConnections class methodsFor!
  83186.  
  83187. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ2 ▌G    ╛▓Ñ╨ÜÑuwäqR.d▀║d<½²┼TXÖç─*⌠·lû8=0Φw▀╙\êJ{¿@3▌₧┌╢▄▓v¢æÅ╙hεßEA┤eo┬ε&╩╨αD!!╔M█·"o╣┴j═O.┴Ñ┼ôA4┐º·∞ß▒╢!
  83188.  
  83189. ΣH"06░¼>(⌐║ß@∞}└┌ⁿ█√┼ƒ┴╢≈σPO╛¿╙;|N╫ê;_ÆQPjkUFf
  83190. ΣÇ
  83191. \bfM║<Gbºδ2 ▌G    ╛▓Ñ╨╡óvs²`#AN⌠ÖNèΦ⌠x% ! !
  83192.  
  83193. IEnumGUID comment:
  83194. '<IEnumGUID> is a wrapper class for the COM interface ''COMCAT.IEnumGUID'' generated from type information in the ''OLE Component Categories Library'' library. It contains methods to invoke the member functions exposed by that interface.
  83195.  
  83196. The type library contains no documentation for this interface
  83197.  
  83198. Warning: This comment was automatically generated from the interface''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.'!
  83199. !IEnumGUID class methodsFor!
  83200.  
  83201. defineFunctions
  83202.     "Declare the virtual function table for the COM interface 'COMCAT.IEnumGUID'
  83203.         IEnumGUID defineTemplate
  83204.     "
  83205.  
  83206.     "This method only present to prevent auto-generation from a type library"!
  83207.  
  83208. elementClass
  83209.     "Answer the class of element enumerated by the receiver."
  83210.  
  83211.     ^GUID! !
  83212.  
  83213. IEnumRECT comment:
  83214. 'IEnumRECT is a sample specialization of the generic COM enumeration interface, IEnumXXX. 
  83215.  
  83216. See p115, Chapter2, "Inside OLE 2e", Kraig Brockschmidt, Microsoft Press.
  83217.  
  83218. In Dolphin each COM interface is represented as a class, derived from the IUnknown class, which, not surprisingly, implements the IUnknown interface. The IEnumRECT interface Kraig defines is implemented in Dolphin as a subclass of IEnumXXXX, which provides a generic implementation for COM enumerators, and consequently IEnumRECT need only define a single method, #elementClass, which answers the type of object being enumerated over. Occassionally enerators may require a little more effort (for example when there is memory or ref. counts to be managed), but #elementClass is typically all there is to it.
  83219. '!
  83220. !IEnumRECT class methodsFor!
  83221.  
  83222. elementClass
  83223.     "Answer the class of element enumerated by the receiver."
  83224.  
  83225.     ^RECT! !
  83226.  
  83227. IEnumSTATSTG comment:
  83228. 'IEnumSTATSTG is a COMInterface class to represent the standard COM interface of the same name.
  83229.  
  83230. IEnumSTATSTG is an enumerator for traversing the STATSTG structures containing status information about the individual sub-storages and streams within an IStorage - i.e. it is similar to a directory listing object for COM structured storage files.
  83231.  
  83232. Example:
  83233.     s := IStorage open: ''<a word document>.doc''.
  83234.     s directory collect: [:i | i name]
  83235.  
  83236. IStorage>>directory connects an <OLEEnumerator> collection object to an instance of the receiver which can then be accessed as a <sequencedReadableCollection>.'!
  83237. !IEnumSTATSTG class methodsFor!
  83238.  
  83239. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ2 ▌G    ╛▓Ñ╨ÜÑuwäqR.d▀║d<½²┼TXÖç─*⌠·lû8=0Φw▀╙\êJ{¿@3▌₧┌╢▄▓v¢æÅ╙hεßEA┤eo┬ε&╩╨αD!!╔M█·"o╣┴j═O.┴Ñ┼ôA4┐º·∞ß▒╢!
  83240.  
  83241. ΣH"06░¼>(⌐║ß@∞}└┌ⁿ█√┼ƒ┴╢≈σPO╛¿╙;|N╫ê;_ÆQPjkUFf
  83242. ΣÇ
  83243. \bfM║<Gbºδ2 ▌G    ╛▓Ñ╨╡óvs²`3ZAεÅY! !
  83244.  
  83245. IEnumString comment:
  83246. '<IEnumString> is a wrapper class for the custom interface ''OBJIDL.IEnumString'' generated from type information in the ''ObjIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  83247.  
  83248. The type library contains no documentation for this interface.
  83249.  
  83250. WARNING: This comment was automatically generated from the interface''s type information and any changes made here may be overwritten the next time this wrapper class is so generated.'!
  83251. !IEnumString class methodsFor!
  83252.  
  83253. defineFunctions
  83254.     "Declare the virtual function table for the receiver.
  83255.         self defineTemplate
  83256.     "
  83257.  
  83258.     "This method only present to prevent auto-generation from a type library"!
  83259.  
  83260. elementClass
  83261.     "Answer the class of element enumerated by the receiver."
  83262.  
  83263.     ^LPWSTR! !
  83264.  
  83265. IEnumUnknown comment:
  83266. '<IEnumUnknown> is a wrapper class for the custom interface ''OBJIDL.IEnumUnknown'' generated from type information in the ''ObjIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  83267.  
  83268. IEnumUnknown and subclasses are used for enumerating over collections of COM interface pointers.
  83269.  
  83270. Implementation Note: IUnknown>>fromAddress: increments the reference count of the COM object it wraps, the result is effectively a standalone pointer which is valid outside the scope of the original owner of the pointer. This means that it is not necessary to take any special action here to extend the life of the objects pulled back by nextAvailable[:] since there lifetime is independent of the buffer used to retrieve them.'!
  83271. !IEnumUnknown class methodsFor!
  83272.  
  83273. defineFunctions
  83274.     "Declare the virtual function table for the receiver.
  83275.         self defineTemplate
  83276.     "
  83277.  
  83278.     "This method only present to prevent auto-generation from a type library"!
  83279.  
  83280. elementClass
  83281.     "Answer the class of element enumerated by the receiver."
  83282.  
  83283.     ^IUnknown! !
  83284.  
  83285. !IEnumUnknown methodsFor!
  83286.  
  83287. Next: celt rgelt: rgelt pceltFetched: pceltFetched
  83288.     "Invoke the Next() method of the object wrapped by the receiver.
  83289.     
  83290.         HRESULT __stdcall Next(
  83291.             [in] unsigned long celt,
  83292.             [out] IUnknown** rgelt,
  83293.             [out] unsigned long* pceltFetched);
  83294.  
  83295.     "
  83296.  
  83297.     <virtual stdcall: hresult 4 dword IUnknown** dword*>
  83298.     ^self invalidCall! !
  83299.  
  83300. IEnumVARIANT comment:
  83301. '<IEnumVARIANT> is a wrapper class for the custom interface ''stdole.IEnumVARIANT'' from type information in the ''OLE Automation'' library. It contains methods to invoke the member functions exposed by that interface.
  83302.  
  83303. Implementation Notes: We have to be careful here to manage the lifetime of the VARIANTs correctly. This necessitates overrides of a couple of superclass methods in order to make sure that the objects/collections answered have a lifetime independent of the buffer originally used to retrieve them with the interface Next() function. It is also convenient to immediately convert the variants to their underlying value.
  83304.  
  83305. '!
  83306. !IEnumVARIANT class methodsFor!
  83307.  
  83308. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3Mjo╓╣#ï╟╒T~┤$║7[Ü█∙h╒tA5╫E¡≈x▓v4¿:┌£╞┬╔¡cä ï₧■f∞£=)╚    HOèµ ₧╥Z≤I ╚╒ 4!!Θ╒}╤G`╘Ñ╙├Tf╢╕²≡⌠F⌐ßtS⌠τ╖wGAi<╬ ±=1\D═┴╩╡@}9@╙â=èH╘!
  83309.  
  83310. ΣH"06░¼>(⌐║ß@∞}└┌ⁿ█√┼ƒ┴╢≈σPO╛¿╙;|N╫ê;_ÆQPjkUFf
  83311. ΣÇ
  83312. \bfM║<Gbºδ2 ▌G    ╛▓Ñ╨╡óvs²`6OR≤¥C! !
  83313.  
  83314. !IEnumVARIANT methodsFor!
  83315.  
  83316. ∩A?.Ñå>(╕ÑëG∩Vú⌡ß▀Θ╥═ò¬·áM║ú╘;vDS▀ü0F╫YV%cGc
  83317. ╢ôZc/Yªn*¡╣`⌠╫N@í▒≈è ╩╫uL
  83318. │▓brú╞╥\ÉûpáWÑ3²kòxB4ΣiÜ╨M¥V}ú|²¥╫≤ûα\₧ìëÜx
  83319. εσXúnlç²s╩╫ZºT!!╚Z╚Ω$o■çn├N{┼R█╡îB4ºª²╛÷║²aR¡«≥$qCn3ÜJ≈51]U┌┴╩«_-(KIÜÆ:¢_òⁿ╨½∩!!φ╖æ┴ƒ3░φ▌█ 8i╒u∩O}QóÑa╔~∩ìä╙Ń^Ü┌╠Γτ1┤oα?╩Θ²ƒ G{FG)▒ ¢■.m╤#Ü▄Oeöee═■-≤,_┴╢πN\P#qû█╓╠G└σU$╢≤@àöïN╤"x\O╞╛fnWⁿ■τÿ▄ ┤«▒¬ªßóQÖ@┤─ d│çƒ┘júg~ ┌¿▒╟╔>s¢ƒb╩ΓÖjíß∩ièS^>╟┌┌Aò≥2╓τåû█Qó4
  83320. ├╡╩½@╕µæ2âé
  83321. \╝⌠a<╛┤╬╩Ö T
  83322. ºPB⌐╣╞R(ï╞∞OÖ¿±+╦╩2²+    !
  83323.  
  83324. ∩A?.Ñå>(╕Ñëp┼>∩²ß╪√╨┌╟╙ÿ╠b▒¿╫~aWÆç1^¢ZG>gT]+≡┴
  83325. QcfAªdG*úÑ    ⌠╩G¡Ñ≈¢√╩Ö`M@hr╒▒-&ª╠ÇKMûÜp╝█∙εNx∞eæ╟¥Q4╛1╥¢═╢┼ª3Äê₧ü2b─ÿ~I▓lvçß'▀╦VΦOoΓP╬⌐mN∩┬j╨Kj┼Ñ╙├Ezá╣²∞áá± J╕∞º%ISKr:ïJ⌡"xN^▌â|α╚wb(F ╬ë.ƒ₧⌡æ½Θqß¿é┴¢-ªú└▀    2¿}Φ{Qóúl╘xIΓ▐Ç╙╜╦ZÄ╒╤≤P±3"¿j°s╩ßò╡spH}/h┼wä $fÖtêG╙Ffàom¥⌠&µJ,R▄¡»Vq)O>┘₧Σ°v/í═hjÑ·OÜçÜI▌)+=*x╒°-5╤mà■ÿ▌áú▒á╩ç┬[▄^»ûW7α₧Ç╠j¼q& ≤╗≡┴╫6v₧ö-½╚├@▒·∩<æEQ%å╩UεEöα>é┤╨>πÜK¬.N├¥»─i╟±£+ô╟I    φ╕
  83326. g0ú√╓ïüPPè-.ÇÑ╞^)┘╬╛CŬ▄aM╡┘%·bt│╨pM·>Jⁿ┴┤⌡ô░_╬ƒ∙¥ß╪CQ▄jH▐]Φδ╫B¬çí╬|│$L£UR5╫■▀(½p┘╧G{.¥åε;┘∞∞>ç_L█P`¡▄╘úÉτ╡≈Qy%╩g=O^└"Φk╜▓╫41─╩¬íV±áδσj─f ΩDv╝Psz>╡Bⁿ┐ƒs?¿L║jìαS
  83327. Å└±µ    ╧_x! !
  83328.  
  83329. IEnumConnectionPoints comment:
  83330. '<IEnumConnectionPoints> is a wrapper class for the custom interface ''OBJIDL.IEnumConnectionPoints'' generated from type information in the ''ObjIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  83331.  
  83332. IEnumConnections is used to enumerate details (via the CONNECTDATA structure) of connection points available in a connection point container.'!
  83333. !IEnumConnectionPoints class methodsFor!
  83334.  
  83335. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ2 ▌G    ╛▓Ñ╨ÜÑuwäqR.d▀║d<½²┼TXÖç─*⌠·lû8=0Φw▀╙\êJ{¿@3▌₧┌╢▄▓v¢æÅ╙hεßEA┤eo┬ε&╩╨αD!!╔M█·"o╣┴j═O.┴Ñ┼ôA4┐º·∞ß▒╢!
  83336.  
  83337. ΣH"06░¼>(⌐║ß@∞}└┌ⁿ█√┼ƒ┴╢≈σPO╛¿╙;|N╫ê;_ÆQPjkUFf
  83338. ΣÇ
  83339. \bfM║<Gbºδ2 ▌G    ╛▓Ñ╨╡óvs²`)Mo╘▓h1║└╧WxÜ¥! !
  83340.  
  83341. IPersistMemory comment:
  83342. '<IPersistMemory> is a wrapper class for the COM interface ''OCIDL.IPersistMemory'' generated from type information in the ''OCIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  83343.  
  83344. The type library contains no documentation for this interface
  83345.  
  83346. Warning: This comment was automatically generated from the interface''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.'!
  83347. !IPersistMemory class methodsFor!
  83348.  
  83349. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q#GD÷≥D½█╙P[ü;ûz╝Z±·hòx *≥mî╩tÖO{╛|╫ù┼ ┬ÑGìÅùÆh
  83350. ├¢>╧
  83351. gδⁿ6╥┘2ì(F╚Z▄²(G∞╔{╓Ka╬e±ƒ¬WP║╝∞τ╗k┬¥    X╝µ╗CS[r;ü╣Ws]@Q═M╬╣¿Chf.&│ΦFèHâ²╘╢ΦU²¬ä▐└~≥ß╨╩Ow «x╗T5ï╪m┼kRΓ╕ö¥ì╦Aö╪ƒª╟&┐1τ╔Γ∙═>O{[>≤Üφ(?ⁿ^÷'╢SEvïenÖ╧,≤6êσφN%?Ym╥╤└▌ù∞N.≡ñ$⌡ⁿ÷C█*1^E7╫■'4₧b═╗¢⌡ ╕ë°¼╬ª╩G╞5╩φ,?%▓òÜ╬$╣V■¡ΩÄé;fÿê(φ╧½9{═É ,àI~2+Æ▌ΦIû∩m╠ΣöZâÅiª/rj! !
  83352.  
  83353. !IPersistMemory methodsFor!
  83354.  
  83355. µA3)<"íó31╫├σhñ1≥├Ω▐╛├╫╨■«üdlìƒ₧;aME╟ê*ÿY#`M\`°å^Mn#ÇS~*ì⌐* ▌VG╗≈É¢πⁿÆY_&)Ü▒h&ª╞─
  83356. °|■|▓╖sâ∙CUï₧╨JïGf∞Zaô┌τ┴πÆW╚Üî┌2b─ÿDA«fgδå█╦lε[*ß^┬L│,oΩ╨}╨ ¬VÅ▌ìWc╢╝╕ ≤)¬■e_¡ì╪!
  83357.  
  83358. ╞A3)<"íó31αΘ£    ç Φ╬Ωíö╛¥σ¼√│RW║√ì;ZF@▌Å;âWAjI^GX∞ä3X~nπqV~¬ñ$║╤D@╝┐▓▐╘α1^ÿvTmtܽ3╛┘┼]ù╙}½ñxô⌡GJvî≥┤0⌡jFë3     ªâ╔≤│gî₧ùƒ<(½σdM╕e'zܺ^┤╢6Äz ┘KτVµ#r≡└v╟F.╠0┐█╔dɼ╦≈·ß»6╨ó▀`o/    o ÜΓpb[T╩┴╨ßQ9PY╓òo╙ü ├╝╢?ë╨Φ≤ë;╣σë┴6ƒ}≡5!
  83359.  
  83360. ΦJ.=│╧rD╨└╬ï)ε▀ΩîΩ▀┌òùⁿ¼Gm║¼ê23ES╞î1V╫PBjzSV+,┘¼^vd,Jáh(╧┴MÉ╖Qñ▒≈╖∙╞0Æc3j!
  83361.  
  83362. ╚J.=│╧_C╙δ╝8î)α└Ωî│ù÷█¿²«V½│┼;ZF_╞¬;E▀'kO[d ╢Är.Jπ_|GΓñ"≡█AΦáуτ▀╫vG@zh▀ⁿ7¡╠╔OMçX■|─*▀Uó$╧dc=x▐[î╩]ƒCxá@▌¢╫╪╔╖;┴V≥±·>b─£=-■viû·2╥ƒL≤E,═S╓L│%sⁿ╘m╬V.Öa▄╢Ωzg╢ó■╛Θ╛⌡lU╜├│,!
  83363.  
  83364. ╚W',╜╧_C╙δ╝8î)α└Ωî│ù÷█¿²«V½│┼;Z[r█û*K▀'kO[d ╢Är.Jπ_|GΓñ"≡█AΦáуτ▀╫vG@zh▀ⁿ7¡╠╔OMçX■|─*▀Uó$╧dc=x▐[î╩]ƒCxá@└╢╩Σ╪╣;┴V≥±·>b─£=-■viû·2╥ƒL≤E,═S╓L│%sⁿ╘m╬V.òa▄╢Ωzg╢ó■╛Θ╛⌡lU╜├│,!
  83365.  
  83366. φK&oxÑ¡+=┐ê₧8ä&î╛åÄ╥╪▐╤■µ¡V░╣╩~p\╘û1_╫KL/.qr≤á Kg?∩<RH╗┐%█╠P▒∙⌡≤¥óvwäqR
  83367. │╒A=»═ÜI╖çT╝Q╖d²kò8L Φ~Üä¥`m╕┴Ç┬∩î│zÆ≥±!
  83368.  
  83369. ═K&ox┤ó7$·¬Äî%ΣÄ»╧ⁿΣ╓╧╗ƒ╧:Å⌐╔mr\SÆ╔~{ÖIK!!kGc
  83370. ╢¡XbnπqV~¬ñ$║╤D@╝┐▓▐╘α1^ÿvTmtܽ3╛┘┼]ù╙}½ñxô⌡GJvî≥┤0⌡jFë3     ªâ╔≤│gî₧ùƒ<#í≡S ╧
  83371. cδ╘:╨ΓΣI.▐Ü▐(l╡¬½+√6┐ß├QzẠ≡σΦ°oR╛á▒1l\PB=_ΣcízZ%9ò─₧┤Xa|PX▐é.çVX╓°├╜∩tΦ«┴¢┌<¼≈╠CÅ ΓûfJLτ╜oÇdU·Æêù¡▐Dù╗»!
  83372.  
  83373. ≥E1oxó¼>,╗╗¿#ù+°╣àÑ╝÷╤╞⌐≈╖B τΓbgMw└û?K╔G%`ORb År.JπlVx▒ó3ε█F@║▓ºî≥▄âuJ    anÜ│kr║┴┼Gùûaε.▄Ö ∞]J=∩pû╨^▄V|Ñ|┌£╫≤▐ªrï╤┘■b─ÿiWºl ;æε%█àßb#╔^╚2·?uαç{└qg┌:δ£ÉAx╡ε √⌠5íεeq╕°▀`!
  83374.  
  83375. ≥E1oxó¼>,╗╗¿#ù+°ö∞╬═▐┼╨Σ▓ªQp╢í┼;"?ÉÑ0AÇZVjoIΓä?Kt'V²<\lΓ≈)⌠╩G¡ÑΘ▐Σ╞█4]]i└╣!!r¡╞╬MI£ÜrεW╛x╨∙C\+⌡a¢│3⌡Pq╝9└ù═Γ═┤zç▀öò<ª⌠Kájxû»:╙╧SΓL*┬K╙⌠mu±╬kéK`╘:ú┌éGq²∞òöìl┴Φ ]╖≤Ñ%Z8a3Ç⌠"1ë5╘ÅÇK=Z ╘ä8╤ö├╪ó∙/ë╨Φ▐ƒ2│Äú`ª66Yⁿ}≥cZ≡▄⌐]╧
  83376. ¢Çü¬╓ZÅ╧ƒªD╫5╗y┼:╫≤ß▓p/Lz4δ2╔╖.gó=àKæu++]çnsÜ■'Ä`!
  83377.  
  83378. ╥E1ox┤ó7$·»»&Ç>≤≡µ▐Ω╬àò╕╤⌐VB¡ƒ╔igQ╤å[ìZjmY`b≤∞t0$]¬jR~ºδm║≈Lº╝▓▐π╟^ñuH&)Ü▒h&ª╞─GôVçpε`ÖP╨■[J
  83379. ,ísì▀IîGp∞%ôå╦≤î▓vïûìûnA├¢:.╦    "Iº▄≥δ╪~<╪[┘ !!!!╩╞n╟
  83380. ¬V╪╡╕Kaºô╕²Φ║╛ Löσ┐Fo/<b];Ç7ú?H╧4┴ï│}d.WUû∞EΓ3k¡∙▀à╝tΩ⌐ê╩ö;▒ú┼┴w0╡f∙F/2ê╪+¡6åo┬ùÜ£╦]Ü┌à⌡V≡1╢g╗s═⌡²╠J}Q    ?Φ#û╜mvò#É\█XEUlöd>αæ\▌ P╬ΓµY';Fz⌡╥▐┤.! !
  83381.  
  83382. IPersistStream comment:
  83383. '<IPersistStream> is a wrapper class for the custom interface ''OBJIDL.IPersistStream'' generated from type information in the ''ObjIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  83384.  
  83385. The type library contains no documentation for this interface.
  83386.  
  83387. WARNING: This comment was automatically generated from the interface''s type information and any changes made here may be overwritten the next time this wrapper class is so generated.'!
  83388. !IPersistStream class methodsFor!
  83389.  
  83390. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q"DI■É#₧╠╥JAåág½B╗:²kò8f9=≤wû═M»Vf⌐1ôà╩Γ─üä>èÖÉp╜ΓRWΓd!!┬╘i█ƒCºDo╚Z▄²(Uⁿ╩h╬Cz┼▄╢Ω┘├Æù≤ñ≥6╨ë╢lHP-s<ìΩ>+αΘÿ╡@V*%│ô*ƒOÿ─╚¿∙;ñ²Æ╔ì1ºτÄRóo^b║u≥
  83391. RJ∞▓}╔bU╢F▌¡£Å█÷╝¼Å+⌡7»fΣ=╤╙ß╧U3A`σ%û÷ /╓o≥$╢qEGeÅne½ε;α,S╞°»;\$╨9╥╫╪V"ë±H3φÆ#÷ⁿ÷F╠+-]E╓─=8é6╫╝±ß╛┐≡╗ü╦╔PôTτ▀(<M╔ûè┬$¿Ds°¬╣┴╦e1╘╜)│╗∙Në°πsε*^då┴ΘM£∩#╕╛¡QÖ┴Σ)æ¡φåD╗! !
  83392.  
  83393. !IPersistStream methodsFor!
  83394.  
  83395. ╞A3)<"íó31αΘ£)ç Φ╬Ωíö╛¥ⁿ░Σ¬XF »╚~3oS╞╖7HÆrE2&f
  83396. Γë]&)Iπh[oΓñ"≡█AΦáуτ▀╫vG@zh▀ⁿ7¡╠╔OMçX■|├)▀╕3┘bz% í[á═MÿAuá |⌠ù╫┼┼║vÑ ç╙■f╟ÿlK╖t7;╖├∞°z╪h°z²3┴g!!Θ─z±Kt┼vΩ▒Θ)┌∞òöìl┴¿vU½⌠º %UAe3é╣W8cJC▄┘Q╥ßHz3QHÉ▀Bß3<à⌡▌╛╝hΩ¼Ç┴ô:ûΓ┼óo!
  83397.  
  83398. ╚W',╜ΓX@°Çé<è4Σö√─√ù÷╞Ü√╖GZ≈≥Çvv\^▌Ç~]æP"k\i≤é
  83399. q4N│lVnΓ⌐9║╩JΦÑ▓¥≥╞
  83400. à:3j░╒£∞≤ldíV¼)f║G╡|£╝x\-1≤påû╟/┼BQ╣ ⌐ƒÉ╢zÜè܃<║⌡TE«lP;è²6═╩S≤zÆ2░═>d⌡┴8╦Lx┴3╕╪áEx┐├Æ!
  83401.  
  83402. ═K&ox┤£&$╫├σh¼1≈█Σ╔╛├╫╨■▐¬RG≈≥Çvv\^▌Ç~]æP"k\i≤é
  83403. q4N│lVnΓ⌐9║╩JΦÑ▓¥≥╞
  83404. à:3j░╒£∞≤ldíV¼)f║G╡|£╝}@<⌐    ⌡╖0⌡y}ó=|·í╫Σ╔í~┬MÅêçqF⌡£=-α`Φåo╚╓M≤T.└╔≈.`⌡╦"éJ|┼,ñ╨ù"≤ç╦Ω≥⌐∙*╘è█4`JSKo<ÿ ∩4RN\┼zº!
  83405.  
  83406. ∞E?)<"íΓX@°êé9Æ:≤ö√─√ù╥╘ª√¿FN ║═tfFBÆï8äKK8o\V+■Ç
  83407. r.JπnViºó6 ╠⌐«≈É≥╩^â{zo╚╣-;║┌┼UN█{∙[αa°=ñ    ∙N+÷aì₧JöMaá|╤ùâ≈îú|åÜëà}ºτRºsrÅε'█ƒPß;─ZÜ■"t≈╙8═D.╙/░▀åf╢┐φ≈≥¼╕ ^╝π│`+?br:ïJ≡5rFV└╠â«W-3E ≤▒*ÖI àΣΓ¼εdσ╖┴▀ƒ/áΩ█ ▄E#ⁿu±xZ∩┤g╘bI Fæç╙╜▐^₧₧îªU√;·|Φ'═ε÷▓p/}G    ?■"¥≤>%₧2▀Z╫Avöreâ∩u≤6U▄½αY}zKzû╓█╩ ü√U'ó≥    î£àB₧d,XEQ╤σ41ÿiô╗±ß╛┐≡╗ïå╩F▄V»É(<Móù╧┘%║cd■≈■î¿U²≤0τë■Gíδ╗5ε*6ö─ε├╝w╣ï£f¡╛xè+%ñîòü'╘τ▐SⁿεYφ▓OC!!╛╟╤╤É4P\Éz*╬ñ╘O.à¡ö#óτÆzUº╬s    √:«█sM°!
  83408.  
  83409. ≤A&*½éhi╗ºÑæ-Σ╒Γíö╛¥∙▒≤íW╖╛ÇivKS█Æ;@╨L:kI@bΓäM&5[óhV*╡ó4≥₧V¡≈│ƒπ╬\ÆsW`i╘╗-3║ë╘QM╒åg½Mó=Ç∩X[7∩    ⌡╖PÆ`ñ|└é╞⌡┼ªzì    ▀êçn
  83410. »ⁿ)╚    $5áís≈╦εRo╦Z╘ß,m⌡▐8╠MzÇ1┤▀åWg▓╝ß╛⌠    Φ²nJ╢δ╖JmOFKk7Ü∞puFB╠┘ôß@b)Q_▀ì)╦₧⌡æ░∙m⌠┐ôá≡WÜ∩╠%└3- ▒OΦq^∩∙ Ç~SπÆà╙î┌Ä┼└Γ²#«nα7îºφ╤Cz\FH}≥"Çπ"h╤'ï\┌Leërmî∩uδ 6╩ºΩY\P# m╙ÉÉ┤.kΩèO/╗∙    │Ü₧Cäl9^i"╓Γ!!0!
  83411.  
  83412. ╥E1ox┤£&$·»»&Ç>≤≡µ▐Ω╬àò╕╤⌐VB¡ƒ╔igQ;╕φ|{ÖIK!!kGc
  83413. ╢▓OcnπqV~¬ñ$║╤D@╝┐▓▐°═ö`|a╩¼h6ε╦┘\¥╙p¡F┐kò▓<%`Uï÷÷k╣qAÇ4|∞¡╨Γ╚úrä▀¿Æj
  83414. µ£=-╦    1rî╥s≈∞K⌡D.┴Üα9l╡¬½+√6┐ß├f[£é╕°├
  83415. ¡⌡rx░≥ªK>+?b$_Σgë~lgFB▌╠╩▓Mi?B@╓█oâHàσ▌¼╝6ñô▓┘ê;┤εâI═
  83416. 8Ln╓┬qSΣ±`╬{ZαÜóÆé╙%±!
  83417.  
  83418. ≥P(0¬╒r(┤Ç┐>ù:α┘»╧≥╥▐╟Ü√╖GZσ√┴Y|GZ╫à0?²6 ~KVe ╢ò\&4JáyZ|º╣gΘ₧R║ñ╛ìπ╩
  83419. ╫gJzeÜ¿br║┴┼[àÉsºF▓=╣2ΦCJ5»    ⌡╖möG4» 9╥Çτ ▐┤j╚ ôÜö<½²[WΓt~┬α1╘┌\≤8─Z╬÷?!!φ╚8┴M`╙6╡┘æ}º╜²≥µF∩τaJ╝Σ⌡gh GSc ╬δ#1@@╠╠â«W-tPC╫äoÿ[ô░├╜φtß⌐ò▐┌3┤·ë ╩E1C┐s∞qL«±z╧-OΣ≤δ·£┌K₧▀╙πP┤9╢gí=╩≤╕╚H}F}≥;û÷?%ÿ îÿNFjÇieë╝u∞e╠½²C(}
  83420. r╫ù£┤.o«¡~d≈╪LæÉìF╥ !!O╟░7 2ä`ô╗═┴ ∞«∙│ïâ╬Sî]▓─CC*úåå┼jénc+·¿╡·╩ eàƒ-¬└╣9{═δ·=ïEbwÅ╥╝Cÿφ;à⌐║₧ôN░xì¬│╚&▀░ö7äéIφ¡O,1ñ°▌╪åYHK▀z/╧≈═E(ï╫ Dêï÷V¬┘sⁿ<1╗╙4\σ{F²ä│∩¥O╒0πµäÇ»┘TXÖbIô]≥▒Ä{Ç÷ª═│$OB¬ZP#═Σâf"!!╝gÿ╠LÄå⌡╤ⁿ⌠"ç_L≈va╡▄╥¿! !
  83421.  
  83422. IPersistStreamInit comment:
  83423. ''!
  83424. !IPersistStreamInit class methodsFor!
  83425.  
  83426. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╤╓█╗▓▒[F ¡╘zqDSÆé1@╫KL/.rcnσêMU2]ª}^C¼ó4║╫L¡Ñ▒ƒ⌠╩Rs²7)^e╚»d!!║·╘KMö║|║╡r¥⌡]J/-∩gï╫VÆQ╞i~╛°«£Ñ│vä ≥±· ½≈^JºFuü√:╤╤º┬V╬8÷:!!δ┬l╫P`⌠&í┘┘3á¬∩±≥∩! !
  83427.  
  83428. !IPersistStreamInit methodsFor!
  83429.  
  83430. ΦJ.=│ΓX@°Çé,è-∞öεî≡╥╚┘º▓¼]P½║╬ozIB╫Ç~]òUA)zGcΓ┴M&.N░<QoºÑ`⌠█U ▒≈╛ÉΣ█â}_kdÜ║b ε▌╚\àüz╜F÷rûlû8] ;Σmë╫W¢d⌐/┌ü╫≤┬┤3¢₧Åû2b─ÿcLº  tÄπ<╔╓Qα=╔L╧τ>!!°╒}éRa╙,╕▐ÅA.▐─æù┼9ç┴Tsƒ═ù'-W8a[½5╓9IuΩ#Φ5π╚hrDÜò'Äö·╘╗Φ!!∞╗Æì¢2ºµ╚╓E5ⁿu≥}^ε╕s┼i√èë╙º∩Më┼╠⌡V╟"┐j∞iƒ╦≈▐ k#Tÿ¼┘Q╕»b╢q(vkâ oű0αeX╟ºⁿ?5^Yl╙ ╦█╦AFëφU>╛■EûÅ₧S╫#6î⌡jC)Öeä╗╤┴Néò┼÷╩àïZÄJ»û ;N╔√╝,Σπ uæ╫Æ╦╞>däƒlé╖▐{%ì╘╦├Icwé┴⌡TìΣ3╠ª«ï█Uª,
  83431. ìΘ▒└%─⌡╨)₧ÄIí╜$*Ñαÿ┘É]H╙z*╬≈╞X.─╥▓
  83432. ïπ▄zW▓╠!!√=t«╓q%ÇREφ╨╡¼╪C▐0│ßÖÄ»¥GU╩m\▐ZΘΩÇo$╧¿∙ê!!ÑhK┘_C ₧¬ïf R:ákì∩G'F╦å⌠w╩δ⌠.╧D█~.╕╫ôò3Θ^LK¿∙ë,]πRzuXW╓:ßqΘ╜·]W└╘¬▒Wº⌠Éσ2üoM╝ltáA`1DæFô┌╥v4»JP¿8C╚■~aΦ·¬¿!!╨Ho[+\╖o╠╪ÿ1Ä╠    Ω/▌ÄQêσ·!!°*f'╝╪«\≡Ü∩≡B╬σ╘51 ε╥:n░╨╗Φd!
  83433.  
  83434. ╚J.=│ΓX@°èì&ë0⌠└»╩±┼ƒ┴╢≈σzs║⌐╙r`\e╞û;SÜvJ#z    B ò0\qnπu]~º╣&√▌G@«ó╣¥π╞┘4i@.°≥-ª└╙EÉ¢qεK╖n╨∙TAI9⌠pÉ╙XêKw¡ 0╩╥─≤┬Ñaë܃╙zíⁿ)╚    sç»%╩▐]δDo╚Z▄²(e╣╬vék^┼-ó╒ÉPGº╝² φ/ª²tτΣ╖ kCsh1Ü∞#?tµWπ>╛ßtBjjπ└mµ0oⁿÖì«⌡s≡»Ç┴┌-íτ╩├    mK½sε 4╝▄⌐SHΘ
  83435. ÿ┴ÜÇ╔Iù▀┴┼C°! !
  83436.  
  83437. IProvideClassInfo2 comment:
  83438. '<IProvideClassInfo2> is a wrapper class for the COM interface ''OCIDL.IProvideClassInfo2'' generated from type information in the ''OCIDL Library'' library. It contains methods to invoke the member functions exposed by that interface.
  83439.  
  83440. The type library contains no documentation for this interface
  83441.  
  83442. IProvideClassInfo2 extends IProvideClassInfo by adding a method to enquire the <GUID>s for various aspects of the COM objects coclass. At present the only aspect defined is the IID of the default source (event) interface.'!
  83443. !IProvideClassInfo2 class methodsFor!
  83444.  
  83445. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q#GD÷≥D╝╞╓PLÉ5ƒf╜j╕{ƒS╗<%`Q╚Tì╤OòFqÅ =└üΩ°╩»!!╚    Ü¥Ür
  83446. Ü⌠ZT«a~∩àZ£▓5è+F▀Z╓₧GÉ├}─K`┼ñ╥ÇP}╝áó╛ú!!¡αGiÉ─Φ%PoqQ Xτcè"vZ]╠┘%ô▒\~f ▐û Ö^B▒┼°£╢&ë╨! !
  83447.  
  83448. !IProvideClassInfo2 methodsFor!
  83449.  
  83450. µA3=Ç╒r-¡ÄÖ#üΦ┌δîô╜╢ùƒⁿ╢DF¡√╘sv
  83451. ⌡▒v╔V/}N_O∙ç^Ph0@¿u]mΓ┐( ₧a/à≈ÿ£²╩
  83452. ╨g'kt²ëDµÇÇTMü£;∞.▄·hαN+÷aì₧E±(¡/─ù╤╢û²3»8╢┐╙r
  83453. ╣┐:.╦swäéY╖╢xΓU∙v■L│)v▐╥q╞ig╬;▄╢Ω-dö¢╤┌║F⌐·sK╝≥ⁿgh xTu%ïú#^MZ╠┘|α!
  83454.  
  83455. ╞A3=Ç╒r-¡ÄÖ#üΦ┌δîε≡ΩⁿÜ¿σCdèÆΣ!!Γû7DûKAj#ze∙èr.Jπ[V~à₧    ▐û @Ñ▓úû°╦\æ4Jk ∙ô@rí╦╩\KüVät╛S│y╨σ[=ívÜ▌\òTq╛NQ╣ ⌐ƒÑêA¡>¬╖º<0æΓC@íaw┬╚6╩°j╬egí5│Üh≈·8╫L}╔8┐┘çx╝á ╛ΣÅßiXÆΘ╝N,<b    ü≈*pVzyφ]ì¡öpIu!!░Φmµ0oⁿÖì«⌡s≡»Ç┴┌-íτ╩├    mK╣oΘ`╖±m╫bIΦF╣┤║¬ò÷╝¼╪Q±6·b∩%─δ±█9GeCk#! !
  83456.  
  83457. IStream comment:
  83458. 'IStream is a COMInterface class to wrap the standard OLE/COM structured storage interface of the same name.
  83459.  
  83460. IStream expands on ISequentialStream to offer the ability to access and adjust the current stream position, and to lock ranges of bytes in the underlying device (ILockBytes). It also offers transactional control, "directory" information, and copying. IStream is widely implmented and (in particular) used by COM objects for persistent storage purposes, marshalling, etc.
  83461.  
  83462. This interface class was originally automatically generated from a type library itself generated from the MS IDL file ''objidl.idl''. Our implementation also adds additional streaming capabilites in order that IStream pointers can be used interchangeably with standard Smalltalk streams, e.g. as a destination for binary filing. In fact IStream implements the ANSI standard stream protocols <puttableStream> and <gettableStream>.
  83463.  
  83464. We have also implemented the <streamableFile> protocol on IStreams so that a <FileStream> can be layered on top to take advantage of the latters high-performance buffering. This significantly reduces the number of calls made through the interface, and is the preferred mode of operation in most cases as it is much more efficient. It also allows the IStream to be treated as a gettable text stream (we only support binary streams for reading here).
  83465.  
  83466. Example:
  83467.     stm := IStream onHGLOBAL.        "Create an OLE stream onto a block of memory..."
  83468.     ''Hello'' binaryStoreOn: stm.        "...STB an object onto it..."
  83469.     stm reset.                "...rewind..."
  83470.     (STBInFiler on: stm) next.        "...rehydrate the STB''d object..."
  83471.     stm close.                "...finally, close the stream (though finalization would do this anyway."'!
  83472. !IStream class methodsFor!
  83473.  
  83474. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q"DI■É#¥▌╥\IÿQ■|╟jàié²\=τmæ█mÖOdá(╓ ⌐ƒÄ═σg÷êûp    ├¢>-ªe rîΩ╦╤\≤H ┬ÜU└(d≥¥|╒m|╔8╕╥┘Tx║¼╓√≈6ºτiH░∩╝Po/<bg ëε>e{I┘▐K╩µJ|+L^▐┴+£UÆ░└»≤sα≡╞û≈T▄è═ ╔ 94▓Φ{Q╕±*≤hO▀ää╔π╡!!≥┐─⌠Eß5┤╒*╒ΓδàZxX    [9╢l■¥D ò1ÖG╤gWmàtié⌡oúIS╪╗█Xk9HCn╒∞╫╪@\Éα^Ñ÷]ïÉæ│FQ9)╨≈18ƒxúΓ╚╫÷·╢ƒ°ƒ┘Z¥UΩ─TA+▓û╧▄%┐f,XΩ⌐┐▄┴u6╠≈F╬ß⌠Q¡≈■ûNs#ê▌O╝║ε:ü«⌐τ±.╩Qä╝¬─'┼─ë.ôöFª░k6«│⪠p8@╧<"╬▓σ_2╚╘≈EÆ╝▄*pº╩6ⁿuY╨╖L∩=M÷┴£⌠╙X╔<¼√╩┴Γ±EWδa    RæR╝√┬²╖├ºé1Y├6,O■═âz ½lì⌡[j╤╟á&╧ß≥?¥Z┌kj∙▌─⌐┌6%î╥ìBy1â@?[_\╞;Σjº√╫t ╞╩áíIÖσ╫╢`QPça°RVªVEJ╧.ú▐≡nX╜M[⌐uå║
  83475. y÷√π▓ZƒK}\#µf₧è╣Nñ⌠2╤¬∙½╠Ü#╔>z,K┌÷│ZΦòá÷
  83476. ï╡. σ}$=·╗ng╢≤    ░ª4╘δz(┌åI¢Ü[äæ¢I╞  ▒o6▓028ï├pXei■»ÿ╤ÄáOAt═╞└╙╧7û¼[kWZ∞u▀I?┤Φâ6⌐<I )'ë≡²α(σ⌐Fⁿ╒Åz╓ä!
  83477.  
  83478. εJ=å«D╨└╬ ï,÷╤²î ┘ƒ▄░ß▒RM╝╛ÇtuB┌ü~@Æ\A#x^A+■êQ&/\πkAc╢ó.²₧VΦú┐¢╖▄âqS@~r╒¬d6½═¡3!!╝:£~îZóxâA⌡\_=∞aæ╩XêK{ó@3▌╥╫∙▄α|ÄM₧█öp¼≡[»etÉ÷s╓▐QπM*é╖|₧G╟╘}╬D.╧1Ö√»kVÆéó╛εñÖ
  83479. 5!
  83480.  
  83481. εJ=å«s·í½&è=α╪éªùò■█¡σáA╛√╨tzFB╫û~[ÖLP+`XV+≡┴
  83482. Qcf]ªVc┤«2║╩M@⌐╣≈╖█└╡mJ} ╒▓-&í┘ÇVN╒¢5¼O╣~¢A≤WdRêcô╤[¥N4í1▄Ç┌╢┼ñvåû¥Üy ε≤N╢h;â²4╦╥ZΘUcîW²ⁿ/`⌡ë:»(¬V¡£éJgñ½Ω╛ⁿk┬¥aR¬≈╖B?c>êJφ'A@Y╟╚─╠3oi÷ê-Ö[Å░╒╜·`±╢òìÖ,░Γ▌ ⁿ%ôr╘(xPα░eÜ-S╦
  83483. æâÆéƒN┐╙╔πV±=>ênφ6─⌠²àZR{Z    -ß$ç·w%É:îY┌
  83484. /    ∩^aâΦ"µ!
  83485.  
  83486. εJ(bΣÜ %ë╜₧#ï8î╛åÄ▀┘╠┬╗ασR▒╛╫;zFE╞à0QÆK,.O[nOΣä\o0J▒<\dΓ┐( ₧D    ñ▓√▐α╩^çuY" ▀¿n~ε▐╔M@╒¢5╜S│~Ö⌡TKdRêQ¡≥▐/┴jU╧╥┬°▀╖vÜMâ÷∙áΓ@A░ P&┬ⁿ6╥┘ΘD8ⁿP╙τ(s╖¬½w\∞╛╥»Mví»Ωτá¡≥aI╡⌠≥gh /@j₧φ5<~L[└╩"₧│\l1 ╘ê#µ0k π╦ì╬M╛·ö▀ûí±└╚EZa{j¼l╧fZπ╝3ÇlU ¢ô■Σ╢!!ƒ┴≈πQ±&┐o╗sòèÆ╢sJyIj½w¥■!!+ⁿ^÷p▐RUfö
  83487. ! !
  83488.  
  83489. !IStream methodsFor!
  83490.  
  83491. αP}Z46ìü&,╜¼₧G∩Vú⌡ß▀Θ╥═ò¬·áAª»┼;r\╞î;äOA)g]Zn ╢ê]c>¬r~¬«`Φ█Aíí▓î╣ìqt·7kl▄ⁿ}=╜└╘PG¢L╙{çMóxùεGUïí═\ÉD4ó$╟!
  83492.  
  83493. αP}Z46ìü&,╜¼₧jò*⌡Ä»═▄╬╦╨╙ÿ╠t¡▓╘~3\^╫─-BÆ\M,g^W+∩òg2╖tV*▒╗%∙╫D    ¡│≈Ä°▄
  83494. ₧{P@gnÜ¿e7ε█┼ZM£û;∞.▄·h∩TCx±kî╫MòMz÷@=▌╗═Γ╔ºvÜ@╬╒■f╜⌠[BΓncû▀&╩àµc6╪Zö{ÖD_°σa╓G!
  83495.  
  83496. αP1U╬µp┤║¢/ù÷▄Ω╪÷╥═ò¬·áQ║╕┼reMDÆç?\ÖPPjoXPnσ┴WfB¼nV*¡⌐* ▌Vµ⌡┌⌠ÜÑu äqR.p╒»d&º╞╬╚VÇy¿Ñtèæ;!
  83497.  
  83498. ΓE$0 ░Ä&:╫├σh╡-Φ┬ε╪√ùÆò¥≤ª[F ¿╧vvD╫à:ÿQH3.HGjσ┴[i3[πh[oΓ╣%∙█Kí╣░▐Σ█ûyB
  83499. ╖╓.ε┌╘X\åöVi├)▀näΦB[x╗9▀═\ÉD4┐=╟▄«£Ñ«rà▀┴╬<║≡CW╢gJuâΓ6₧▐L╘U=┼Q▌X₧G⌠╚|╟4¥ó╚éPgº⌐╕∙≥à√dY!
  83500.  
  83501. ┬H(0bΣƒ":«ñß@∞}╚┌∙├⌡╥ƒ┴╢≈σpO░╡┼3:[╫É6]ôK,.O[nO∙â\e2┤nRz▓«$║▄[@╝┐▓▐σ╩₧b[ ░╒X╟áΦkmª#┐"5æ|Ñiö²]CIφkæ█±(┼i▄ç╫╦îë@£ÜÜ₧6EεßGW╢mC ∩àZ£▓5è+FÉI╙τ8`⌡çk╓Fm┴3╜å├Lf╢╜φ≥⌠F∙á uè⌠áh U Xτ4≡<wY╟╠âÑzl0O!
  83502.  
  83503. ┬K*<,■╧5;╝èâ'ê6⌡≥π═∙─▓┐╫░î]U░░┼;g@Sƺ1_ÜVPb'^n■Äi ╖tV*¡⌐* ▌V@┐Ñ╢Äτ╩^òmfeÜ«h1½└╓\Z█{∙─*▀Uó$╧dc=x▐[î╩]ƒCxá@▄ƒ╬ ╪ΦΓd÷≥¿uô▒BJ▒iuçδs╥╨Qα(▐Y∙■ hφßt├E}ëd▄╢Ω┘├Æù╝íµtI╕∞≥aETjh╬±#dCDëN쥫Kib.&│┐<ÄV╓∙▀«²mφ╛ó╠û2!
  83504.  
  83505. ΓK)06░£_C╙δ¡$û(Σ╞»═╛ï▄┌▓■áPW╢┤╬%3KY▄É?[ÖVJ-.O[nO⌡ÄIj#[ª<Pe¼┐%⌠╩Q@º▒≈è ╩\âf[c.ÿ╤_─á■JMÖ╙z╛ZÉoƒ ªI,ε>▀═\ÉD4┐    &╓!
  83506.  
  83507. ΓK7XR══'⌐╛ë8┼>í╫α▄τù╨╙■µ¡V¡╛├~z^S└─,WæZV/`XZe╢ò\&5N«yy╢╣%√╙@¬óú▐α╞╫uP@
  83508. │╡c6½┘┼WLÉçVeíP┐iÖ╝A@6⌡aì₧ƒPq¡9╫╥╘ ╪¿3£Ü█║O╝⌠VI°:)wìß6ûûΩD;─P▐_╜o ô¬½^.├3╛╥åh▐─æ²∞    ª± ΣáícVg!!¥Jφ'?":á╚îßza3MIÇ┴,çU ô╛╝╥ò_τ╢Ä├ƒ!
  83509.  
  83510. ΓK7*½éhi⌐╜ì8æ⌡█╡îφ├╨┼╙ÿ╠b½»┼vc\╞ï~@Æ^@jzSV+µäP`/Jº<Ak¼¼%║╤D@¬«ú¢ΣÅ ÿyfeÜ«h1½└╓\Z█T■|─*Ñx£╝A@1⌡mÉ╨▄Q`¡(₧├좪╔M¢ô¥╙r
  83511. ╢σ▒tk╧ⁿ'▀═K¼Bª6!
  83512.  
  83513. ┬K77■╧":«ñ╠)çeí╫φîε╘▌τ╗≤í    »╕┬IvIRÆö=PáMM>z^]1Oµént/[╖y]╚┬b╙╨Tú▓≈è ╩\=ÿdG4a(ôⁿ`7║┴╧]Ü╙}½╣Ü E*αtÅ█]▄@m∞4╓╥╤≤╧Ñz₧ì╒■f├¢>-èR/H╖├₧α`⌠U+╧^╓│nΘ▐L═
  83514. ¬V╪╡╕MzÄε╤═⌠¡⌡m∙≡í)+?b[╡φ*pDcq√0Φ.úÅmHf~Üé-╟7h Ö╕â≤t≡ç┴°╢ç─∞6µ+.5&Ä6╝w]╨┤h─!!6åo≈Φ¿ü╩\ªû≡╩c╞5àB╧α└▌φPyL~/°#ç≥#,╩Y⌡'¥u+/    ∩<väΘ!!÷ )█╢δT06FC>▐█┴╠H└╗äδ[ÜöÆ₧=/_Réß3 /ò&╫Ω╧▌¿≡»█íΓ⌡LÖTª─LX2í₧åΦ+ín!
  83515.  
  83516. ΓK77■╧3'ôÜÿ8Ç>∞ö∞├δ┘╦Å■ß¼IF╥╤⌐9PGF╦─*ZÆW:kXZm≤à^Ws+Mªneñδ"π╩GΦ╛╣▐π╟^àq]gv▀«-4╝╞═\¥╙`╝Q│sälû8_+Φpû╤W▄V{∞2·í╫Σ╔í~╚ ï█Ühε≥BV░eo┬ <═╓KεN!!é╖|₧GΩ┬t─M╧/¿Φî4▓á╤═⌠¡⌡m║ΓΦJl\PKv1î8µ4+^└ìëún5WX▀Åu╦T Ü!
  83517.  
  83518. ΓVJp\zù¢=;┐Θÿ"Çφ▌ß╔╛╙┌┘╖ ¼GF¡√├srZW╤É;@╫LA;{^]h
  83519. ╢╔J&4J▓iZxº»`°╟/j┴ú┐¢╖╩₧fQce╘¿$r»┌ÇM@ÉV¥m║│qò ∙_[A+¿$É╪êJq∞9╨ù╩α╔▓=σg÷»¢uε°D▓ao┬α5₧╦WΓ&┴O╓■(oφ╞l╦M`Ç0╖£ùLq≤Å╓═╔F╗αaR╜ßáB9V@r3îµ$$cJQ─Iìÿ«Mb?L@û┴8âS₧░╞╜æ ì╣ë┬ò-░ú▌Å :▒y≥P∞±@≤yIΘôÆ▌╬÷\█▀╓ªM·)·yΣ2╔δ߃N
  83520. @9▒8â≥?dà=É@ƒNP#ÆexÖ╗&≈ ]┼▒í\P's┼╥╘ÖJÿ≈l?ú▐Eô╧▀t╩>1^GQ╬∙*ö`₧÷╤╞ ╛!
  83521.  
  83522. τE44▒£:D╨└╬Ç-τ█²┴╛╓ƒ╞¬≤½WB¡┐Ç}]E┌─*]╫pwjjR@`O⌡ÇQchçy@z½┐%║╩JΦ╣╢ô≥â\
  83523. ƒ}M@gsÜ▓brú╞╥\°|·táD│oƒ∩[9∩$₧₧WôPy¡ |╒¢╧≤îë<ºMÖùåoΓ▒@L½c;åα6═ƒO⌡D,┼L▀Ωmu±╬ké
  83524. gÄ: £àHa᪲φìl┴∙eQ╢≥½Jp@St!!╬∞W$yJµ$üQ¥⌐Pn4[▀┴.ÿI¢⌡æ»⌡mΦ·â╚┌3║±╠I▌;░y╝|^∞±}╚hφÄìÜì▐\Æ┘╦» ÖxYÅxΣsδ╙╕╓U}JM}■1╙└$k╚a╙▐EwÄis═Φ=∞)XêáΩ /C{û    ▀╘▄Ä∞I-┐▒ ≥ ≥-╖?=\FQß )4à6╫╚∞⌡-ô₧╨ÿ∞«∙p⌐kî╜fy    ì╗╗>εêN_,╘ÜÖ²εP┤▓    !
  83525.  
  83526. τH2    =U╬µp┐╗è%ù2í╒»▀ ╤┌ò╕■░@K ¼╚rp@█ù~Ué^V+`OVn ╢òk'Dª<Z~Γ┐/║╩JΦ▒╛Æ≥Å·7fe܃b?ú└╘╒ÆyεQ│ià≥BI Θa▀═@ÅVqí@,┴¥╒ ╚Ñw╚Éûâsá⌡B½l;ïΓ#╥┌RΓO;═K╙²@ É├w╟Q.╬0Ñ£╦Ew░íΩ·Θ»┤tS∙⌠║BmCY/r₧∞9uJ▌╠ÖáZy5LB╙Å(╦\ä░┬¼εdσ╖Æü┌-║ú▌╞Za{
  83527. »<∙    rZßÑ`╓hW⌡Fƒ┴╜ü╧┘╗»ï(¥5╢mí╩Ω⌡╓)|2n╬╢╤ P╜!
  83528.  
  83529. µV(XR══;│┐ì>Ǽö╞┬²┼┌╘¡≈σGK║√╙riM▌é~FƒZ8kXVb≤ô^Xv6]¼lAcú┐%÷╟ B┼▌┌⌠₧╙\₧n[@r░╒~;┤╠Ç╒ûsεP┐gòOæ;&=φb▀╠\ÅKn⌐Z|└¢┘≤îδ3└ûüû<»Θ≡)!
  83530.  
  83531. ΘE)9=╔σ[k¢ºƒ=Ç-í└τ╔╛╨╙┌╝≤⌐N║╢╧ij^╙è:^ÆQ9k_mΣ┴
  83532. Qcf]ªVc┤«2╜═/j┴ó╣Ü≥▌₧zY@}t╒«l5½ëêVFÖ╙tóJ▓=Ö╝EG x≤a£█PèGf∞=└╥└Σ╔ígì    ≥±·k║∙g░e oç▄'╠┌^Ωn!!Σx╓±,m▒Ä1î¬R█╡ƒ|┤ó≈ⁿß
  83533. ΦΦ6╨Φ╡gGYK<o╬/√5cAQ┼?╠Ä¡\-2F[ö∞EΓu.│▄╪║ε`÷ú┴╔ƒ8┤÷┼Å2:$░s■xy≡╛d≤yIΘô█╙¥┌D¥û╒εE°2╗g╗s═α⌠╨Gek#T╧?ö√"gÉ8!
  83534.  
  83535. ΦW%,╜ΓX@°êé9Æ:≤ö°─√├╫╨¼▓▒[F¡╛ÇzaM╙è'äZU?kUPnOαÇLc5¬r~¬«`Φ█Aíí▓î╣ìqt·7>}e╓║-!!º╙┼╚V├!
  83536.  
  83537. ΦW4<Ñì>,╫├σhñ1≥├Ω▐╛└╫╨¬·áA½│┼;aMU╫ì(WàM9.IVj ≈â\(f{½u@*½╕`√╥U▒ñ≈èσ┌^æ{L@GS╬«h3ú┌¡3!!▌¢5╕B║hòA≤W: ╞Iá∞|╜f4Ñ|╔ù╤∙àε1σg≥±·B╝ΣR!
  83538.  
  83539. ΦW<,íÄ0%┐─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM#}An≥ÇUchùtZyΓó3║▀N⌐«ñ▐π▌    ╫rQ.IΘ¿7»─╙4"ⁿ^çpεU╖qà╝^II ╒C▓ßk╣cP∞    /ôê╞Σ├Θ=╩`⌡÷∙1╜⌠[BΓmç»2╨╞rµR$ûÖU╗U▐ΩG⌡pG⌠±└├w@öâ╟╠┼'î├Ruì┼√!
  83540.  
  83541. φK$*½éhi⌐╜ì8æ⌡█╡î√┘█╕╘¢τ|A½║╔u3IXÆü&Q¢JW#x^g⌡è^Vhf[½yy▓«#≤╪K¼≈у∙╚^ÿrwt▀»-;áë╘QM╒ûpºU│o▐Cæ;"cQ≥aô╪ÉMwº&.▄ƒÖ╢▀┤rÜ▀Å£&O½ S╢y~╪»±ⁿt╪d∩s∩%┌Dö¡!
  83542.  
  83543. φK$*½éhi⌐╜ì8æ⌡█╡î√┘█ò¬δ╡V ┐╫W|K]µ¥.W╫2.C,tQ Å^XhfJ╗_▒ó6 ₧N½╝≈æ∙ÅÆ4Mkc╙║d7¬ë╥XFÆ╙sεA»iò╝XAI,Θa▀╠\ƒG}║.¥╨«£í╩¢ô¥╙P¡·eAÑiu╪» ╩▐M≤ ~î\╪L│ed≈├5╤Vo╥+·ì╩pñé≈²δ2▒Σe∙ΣÑ&fMav7π`!
  83544.  
  83545. ═K$=úå='αΘÇ#çτ╥ⁿ╔Ωù▄╫Σ▓ªQ╗¼∞tpCb╦ö;╫[SaXX_µäs3df¡j\aºδ4≥█,º┤╝¼≥╚Ö<@ce╬┤b6ε╞╞\¥╙wñF╡i╨εP_=σ$¥╟êJq∞9╨ù╩α╔▓=σg÷÷∙få├rwùL>;╜╨ ╩█\µM#îs╒°d■╬w╠
  83546. ¬V╪╡╕MzÄε═╥┴4Å╤_uù╘ù-'WYdê ≡$=":á~ñ*â»d-    omΦª
  83547. ┤s,ó╒÷¥╬!!τ╕═á≡W▄è≥┴8w╡{≥
  83548. pε╛g╟-_√*æéÿ║╞X₧ƒ₧ï(ÖxY°ï^»Äñ╔T}ZE}Γ#ù⌠,i¥n▀F═RWoÆ 1▄╗$⌠7Xê│°X#>
  83549. i┘┌î┤.o╛≡Y&▒┐@æâ₧K╫(QL»Ü!
  83550.  
  83551. ∞K#XR══'⌐╛ë8┼+Θ╤»═²╘┌╞¡▓¿\G║√╞wrOEÆï8âWAj|^Pnαê^&5[▒yRg∞ΘMÉ│(iÑ╕│¢╖╞0₧x    hT╚⌐hhε≥╙\DôVÉvªFàiæ∩ldRêZÆ╤]Ö!
  83552.  
  83553. ∩E*XR══'⌐╛ë8┼+Θ╤»┬ ┌┌ò▒⌠σGK║√╥~pM_─ì0U╫LP8kZ^%M¢δs3(N«yc▒à)÷₧K£Ñó¢¡Å'ÆxX@ma┘┤h║╚╘Ju█{∙KáB╗x!
  83554.  
  83555. ∩A?ùªD╨└╬ ï,÷╤²î ùⁿ∙ì█üQ║║─;uZY▀─*ZÆ@+zZb╢ò\&4JáyZ|½Ñ'║═V¡╢║▐┐└^ö{K}eÜ╡kr║┴╔J% üyºFÑ=ƒ╝EG 1≤$¥█PÆE4¡@*╥₧╩≥îâ_╗$╗█ÆhO║∙Ríuiçß'₧╧P⌠H;┼P╘_╜o ô¬½^.┴1ó╦åV4»├Æùß╗πeN∙║∩J!!Iu|/&<ï═<}=ú~Γ=»ìPo.B^├┴+Ä\âⁿ┼°εdσ╛ó┴¢-ª╨▌òE$ⁿl gVµδ)┴cH√î╧■Σ╢vÜ╪╓±Gµ!
  83556.  
  83557. ∩A?1¬è_C╙δ¡$û(Σ╞»═╛⌠╨┘▓≈ªGJ░╡Çx|FE█ù*[ÖX%hGc
  83558. ╢ôZc/Yªni¡Ñ4 ╨VΦóº▐π└\VòaJ@`o╬ⁿd<¡┼╒]A¢┌VaªF÷·h≥TWxφmæ█ÿGxÑ5╟ù╤╕îëu╚ù₧üyO»πR¼oJ}ù²'╓┌MºM&┬ZÜ÷!!h⌠╬l╟P}Ç6┐£ùLq≤╝²²σ╛±r∙⌠║ %R]&_Σc±#e_╧W┘ÅßKh?FE╠ä=╠IBò ▀¼∙o≡⌐┴╠ê;⌡Γ╟╪%MⁿU·O`Wτ±{┼n^σ¢ô╙ç╠Ü┬à∩VτR5┤o¡s╤∩²╤ZGgD-σ.╙ÜG Æ;ôB┌UKlê i₧╗4φ2Y┌ºδq;0û.╓█╩ à≈T%│┐JèçìB╨84I╤π18é,â≤┘╞N╕▓⌠÷╟é┼Z▄\ÑêL[-┤ù¥S╚%úqo ∩¡≡┴├R■Ä;¿╚≤\╢°°=åRcyOΩ╣xû)àí%ë┤¿X₧█B¼4N@媽ôi╒⌡£7¢╟Vkï▌ a(ú∙ÿæ╚YbP╪3%╟≈╧C2╬Σ√Fòδò}G░Æ^bü+;╢Å4╖{@²╚│∞¥]╘'░ß▐∞╦┤IPï$T▐Xπ⌠╔JVµÜ▀░[█B £HS*âΣ╪5Kód┘╘R"`U╦éΦ;ëáìQ┤$^╨uh∙╪╟â┌1q}╝√▀Uy;î*xOYπ  ?Θñÿ;l⌡√∩╧(┬ë╟╖fSóbG∩@ Θn\1@╩'φ≤└#G#╣LI░l_─εvS≥∞∙µÿMcF}≥~¥╔⌠N∞úu╨ßñ,╘╡╟(ûxv-B¡¬Çæ÷╞╞B╬σ!
  83559.  
  83560. ∩A?-░¼ôì╓jä═τ╞Φô╜╢ùƒΓ╡VM╗√╘svE┬ü=[æVA..xX&╥┴
  83561. V&2Gª<@zº¿)ⁿ╫GΦñúî≥╬P·7. BöⁿO+ε╩╧W^ÉçzáóuÖ╝BG-φ`▀▄\▄F{ó|╤ù┼∙▐Ñ3£Ü█Æoí≥^E╢e;åε'▀ƒV⌠<╪M▀■(e╖à¿/⌐¥∙»Mví»Ωτá¡≥aI╡⌠≥lRP(j3¥╨=+C╠╦QÿóU~5GÜÇ ºi+▓!
  83562.  
  83563. ∩A?-░á0#┐¬ÿp┼*∩▀└╬⌠║╡╝ⁿ╙╡CF▒┐Ço{M┬ü,A₧LP/jAnΣä\h2N╖u\dΓñ&║╩JΦöÿ│╖└ÆwJ@|e╩«h!!½╟╘]ù╙}½ΩTÑ≈_@6┐(≥┤0ëLâ6ƒ╥╫∙î┤{ìMì₧Éy╕⌠E
  83564. ΓTræ»:═ƒ[ΦO*î]├Vµ>h≈└8╓JkÇ0│╓åG`áε╤╬σ╗²sHè⌠áh}|o&│DÄ}YXI▌╚QàúSh?W ▐Ä*ÿ ÖΣæ½Θq⌠╡ô┘┌.░±┌▄2ⁿh≤Ou±Ñ{┼lVáFèëûǃIòû─≥V± «+Φ àΩ∙█}@k#T≡#╙√(dé ▀Y═UG#Æhe═⌠7Θ&HÅ▒»t    c=>┬₧╞╤AFô≈N/╢≥    îÜ▀S╓-,Ié≤%}ôi╫Θ▌█┐«≡╕▀é╩KÖ\ε╞(<I╩√ôS┬:╛"zuæ╫╣▐╓+╩┌9⌐â▀VΣΦε,æYY9é┴²C£╗wÑù╕FÖÆT╖ 忬Φ'╪Σ╨7É⌐EΣεO_1ñ ≈╔ƒY@Q╧(2Θ╣╫O.═┴²O╞ª╡YG░╧:ⁿ ¿█uE╫u)Æ¡│±╬╘&ìα£ì╠╖v/U▀PN¢ª├Ç[Vπïî╕x▄A kÉK|╩Σùf=ñ"ê╘Gv&àôΓ%▐∩π>ç_dσ||¬╨└▓W╫wP`Φ╛╛GZα'S#;√<Φi»ßÆ%,╟╘⌡ΓäΓ┌║lKJèl_╝U╗FG'G▐)⌡╢└>@}ⁿJR╖Wéε.r∩≡Σ█╩Sdsi%¥°±« ¼σ}═⌡╢\╘▒╨  Wx⌡≤²Z≡Ūⁿmª£tv≈"#∩ì &Ö·)?¢⌡[¼âX¢ÉKêûKåæ∩U╞,{τ-    á$╠┘JnGd-⌐╟ß╢╜*╖OK{5Ñè!
  83565.  
  83566. ±A"XR══'⌐╛ë8┼+Θ╤»┬√╧╦ò╗■á^F▒»Çr}B┌ü~QÿSH/mOZd║┴LrfK¼<]e╢δ#≥▀L¡≈úû≥Å ä}J    anÜ«h4½█┼WKÉX╙{╟b╕nçεA4ímÖ₧MöG4╛?╓¢╒≤▐αz¢M₧Å╙u╜▒RJª.HΦéY╖├ΘD7╪╞{ÖDoⁿ▀lé3Ç,┤╨àz╢╢∞▀÷í°a^╡σΦJS++?bX<ï≈W9bj]┘╘Qâºl0PIÇ┴µ0k π╘┤·!!≈▒ê▌└~°▓çdÑl^¿<·fL÷î!
  83567.  
  83568. ±A"7╢╒r(┤åÄ Ç<⌡╣àÑ╝≤┌┴╗α¿ZM║√╘svD╫ù.]ÖLAjzT≤┴\u5Nñyzº«+┤₧kΦ╛ú▐■▄\
  83569. ƒqom▀ⁿl!!ε▌╚\% Ær╗N│säM╝PA&:δa£╩▄V|⌐|┌£└Σ╔¡vå▀Å¢yO╛■DM╢iu┬²6╪┌MΓO,╔█≈m`≈╘o╟P.╘-ñ┘═)┌ü∞÷σ┐²sY∙ß╝`Tg>¥ú>uT╞W├₧ßZe=MK▀┴;â_Bå ┬▒Φhδ┤┴▀ƒ8░±╠╠ufxn╓┬qSΣ±y┼hP¼[▐Ç¥í▌B₧╒╤ï(¥{9╝_≤&└╜╕Σ    CeIFG8Θ#▌╖9wä1ó#╡q(Keáal₧■oú1#]─▒Ωj!
  83570.  
  83571. ±K4!!1½ü_C╙δ¡$û(Σ╞»╪÷╥ƒ╓½α╖VM½√╨t`AB█ï0₧Q>f^y
  83572. ⌡äOc4░<@~░«!!≈Ém┬┌▌≈δÅ ä}J    anÜáX╟┘╧JAü£5⌠÷H╝ ╬vj6╧P║∙|«z⌐r╛°¬σ╔¼u╚>Ü₧ÿ&O■£=-╦dTɵ4╫╤ºr■z√;╠D▄∞Gßw\¡U╪╡ôH}▒DzΘ╨    ╗²tU╢εΦJjU\o=ÇDÄ}YO__┌┘à»l/jB╬ä(ÄH!
  83573.  
  83574. ±K4!!1½ühi╗ºÑ$æ:µ╤²íö╛¥µ╗≈«W░√╘svE┬ü=[æVA..K\xΓêW&/Aπh[oΓ╣%∙█K¡Ñ≡ì╖▄ ÆuSN,░╤[▓ë╬\_ÑÇaºL╕=îlû8A /╤kî╫MòMz∞Zaôº∩╫■çV╖$▒»╢[*£▒YA╡.gδⁿ6╥┘╘D*╟ܲoφ┬╟P¬V╪╪ökf║⌐±≡║F¢└Ryÿ═ì9'@mj8Cπ`è~ }FRτ┌!!à▓Py5LBÇ┴!!ÄM2Öπ╪¼⌡nΩ⌠∞º≤0░⌠∙▄ #ⁿ}∩&zKτ╢l╥-E▒FƒÅ║Ç╦M£╙╫ï(¥{9╝_≤&└╜╕Σ    CeIFL/π8ü─8gé7ìG╧ cMvêds╫╗4φ#+H═ÑΩE !
  83575.  
  83576. ≤A4!!U╬µp┐╜╠>ì:í╞Ω╧√▐╔╨¼▓ºR@┤√╘t3\^╫─<WÉVJ$gUT%M¢δs35J»zz¡╕)ε╫M≥≈τ!
  83577.  
  83578. ≤A4/=■╧3'ôºÿ/é:≤öéªùò∞╨¬▓▒[F ¿╔avY╘─*ZÆV/m^Z}
  83579. Σ╞u2]ª}^*╢ñ`ε╓CΦñº¢⌠╞Æpm░╒~7ó╧ÇjMü%Ü p⌠╖s╣ΦTH *!
  83580.  
  83581. ╙A1',╔σ[kôºÜ%Ä:í└τ╔╛σ┌├╗α▒
  83582.  ╢┼o{GRÆï8âWAjaYYn Γ┴    Kg6_ªxh╗δ4≥█¡┤▓ùß╩P·7m    │ö_¥ⁿ∞m¬)Çq¡B║q╨3∙GJ,⌐-─│3⌡╞mV║╬╒ ▐┤fë▀êçx »²[Γh~æ·?╩ƒ╖Bª6Σ÷!!g╣╬v╘Cb╔;Æ▌ÅH!
  83583.  
  83584. ≤K+79ºä_C╙δ╛%ë3π╒∞╟╛┌╨╤╖⌠¼PB½▓╧u`B▌─*ZÆV/m^Z}
  83585. Σ┴Ph%Jπh[oΓº!!Θ╩á▓┤òτ└â:m░╒~7ó╧ÇkMâü!
  83586.  
  83587. ╥A"oxáâ;+ùªÜ/┼;÷√²┼∙▐╤Å■÷▓|Q╢╝╔u3XZ█åWÇoK9gOZd¼┴Uo$aªkce▒ó4≤╤Lm┬▐⌡╖∙┘Æ4Jk Θ╣h9µÇÇTMü£5íE÷iÿ╝^M=Γp▀╔K¥Rd⌐|╤ïâΓ─Ñ3Ü£₧Üj
  83588. ╝┐:.╦`δ╟√∞j╦uo≤`╔≈.`⌡╦8±Gk╦w▄╢Ω-êº÷├á*ë╞Gyå╔£>'BcgKb>ç╬&t=ú~ñx▒¿WP|VB╔ê(à_╓ⁿ▐╢√!!α¡«▀ô9╝φàdÑl^b) ⌐h┴OAs├âNσRr┬2╗ª╢╝òï┌╠Σl±╡xΦ'╠Φ÷ûA+&D$W£]·½;lâ èO╙XRVgàalüíuδ O▌«√gzYi┘┌Æ▌S    Æτ;á≡[¢▀┴*┤ECE─░-+É`₧ √╙á!
  83589.  
  83590. ╥A3)<"í╒r%│½ó/Æ Φ╬Ωíö╛¥ⁿ░Σ¬XF »╚~3{S╞╖7HÆjc^Gc≥┴_&2Gª<\h¿«#ε₧U⌐ºº¢≤Å╫`V.r▀┐h;╕╠╥% ■|╟käXú4╨e6≥p¢▌XÉN4ƒ(α¢┘≤ä═ßd÷áÜr2ε─{eÉG/D½┴√°z╒#┼]⌠Σhπ┬1Ö/⌐}▄╢ε.∩╕±∞⌠⌐° O¡Σ▒ it7¥∩p&A▐▀╘╠3PI╓çoéTùⁿ╪╝▀`Φ╢!
  83591.  
  83592. ≥A3.:¬ï_C╙δ┐/æ⌡▄Ωî∞╥▄╨╖ΣáAP ½╧hz\_▌è~@ÆYA8kUPnOΓÄ^Mn#ªrW*¡¡`ε╓G@½╕╗Æ≥╠ÿzB
  83593. ╖╓ ╜╠╠_àÇaºL╕'╨∙]II+Φ~Ü!
  83594.  
  83595. ≥M=XR══'⌐╛ë8┼+Θ╤»╧δ┼═╨░µσ@JÑ╛ÇtuB┌ü~@Æ\A#x^A,╢Æ
  83596. Kc'Bφ>>╧┴I─═G «≈ñè÷█\òGWk!
  83597.  
  83598. ≥O.
  83599. oxáè>=╗Çé>Ç8Σ╞éªùò■╤┤τ╢G½│┼;aMU╫ì(WàWj~T@b Äd?╖tV*■ó.ε█E║Θ≈ƒσ╚    ÆzJL.o╚ⁿl!!ε╧┴Kö╙z╜P┐£æ;&=∞eû╨PÆE4╗    (█¢═╢╪¿v╚Üÿûu½πWΓbnîδ É¥2ì,EÑL▀⌡mRⁿ┬sÿj┼3Ñ▌¬J`╢⌐²∞ìl┴¥dKû≥╗ k8R½+╬(Tj{÷4°#τ╦0,OE╪»*£jà∙┼▒≤o╛·Å─û!
  83600.  
  83601. ≥T&0U╬µp«ª₧/┼>í╟ ═²╥ƒ╓╢≤╖R@½╛╥;r[╞î;ÖZ\>.^_n≤Å
  83602. i ╖tV*░«# ╫T║∙┌⌠₧√ä4W.p█«yrí╧ÇM@ÉVÜeóF╗x₧²EF6íkÖ₧MöG4ì.·╥╨Γ═«wë¢█╧l║σVF«e9oÉΩ2╙ü≈S ╪P┘ a!!ε╧q┴J.╫:▄╢ΩG|╝íδ√áº┤iQ⌐∞╖kRhrº9≈5pBCçWΣ╩¿J-3M@├┴=Ä[ÜΘæ╣╝wσ╢ê╔┌1ѵ██ 8R│n╝qG÷±z╘^φ ì╧╤π╡%±┐╓πN≥R>┐s⌡╨≤óƒ9Nh]J)⌠%╙Σ=dÆ1!
  83603.  
  83604. ≥P&XR══'⌐╛ë8┼>íτ█φ╩Σδ≥■ß▒AV╝»╒ivF▌ö+^ûKA..LZ╢Æ
  83605. Xr5ÑsA*╢ú%║╠G¡╛í¢σüqt■GW~l╙║d7¬ë╫KIàû5»Q╣h₧╝|9⌡>ÿ╠_»Vu╕▀ô─¼éΓΓ`⌡≥Å<║πBG╢ Φå ╩═JΣUoûÜ%╟ U╩≤_éLk╫q▄╢ΩWq┐¿╕═⌠╝« O¡≥º    %AGU&Å┼v·#∞%¼ìxJgiⁿáºnL√Ü╕å∩u÷»é┘!
  83606.  
  83607. ╥P&ox┤£&(«║ÿ-┼8≤╥▄╪ ├∙┘┐⌡ D¡╜≤or\p▐à9?²6`M\`
  83608. ╢ò\&[óh#Γª%ε╓MΦ╕▒▐π╟^ÿvTmtܽ3╛┘┼]ù╙}½ñxô⌡GJvî÷│3⌡+\₧%µ╛≈╢≤ƒ`£    £ÜƒpO¥σVPΩ`δå╤╩K┌°~ε%╟
  83609. +╣╫k╓Cz╙+╢Éε.┌╟├≈ε;ΦßnO░τ╝%JZarëσ$$p[v┼╩X╤╠3~.&╖δF╫L äΣ─╣≡!!≈«à╬¢2╣╣ë▌$ⁿ-»OGk├àZ⌠J¼ëÄüèü%±┐√⌡G°p│e≈2╔εⁿⁿJe!
  83610.  
  83611. ⌡E%w_Qµ╝&&¿¼╠+┼+α╓»╧÷╓═╘╜µáA╛¿Ço{M▄ü&F╫ZH/c^]O∙ç^Mn#▒yPo½╜%ΦÉ/j┴â┐ùΣÅ╫d_z ╒║-&ª╠ÇPEàûpáW╖iÖ≥@x⌡lÜ₧x▓q]∞(╥£╟≈▐ñ3╘èÅç}ó⌠dP░e v▄»#╠╨KΦB └Ü√$b±ço╟/⌐<╣╙îWq≤║≈╛Θ ╕°eQ╝εªJk|8r ï ε~1fDë▐Qà»Ut|QI█ì#Æ╓µ╨┤⌡eñ╡æ╚ê?íΩ╞Å8R╣dΦOgK≡┤h═~«k⌠∞∙τ╠Mù╨àΦG∞»╗sµ∩∙═E}J    )≡5!
  83612.  
  83613. ⌠J+63é¥=$αΘƒ>ä-⌡ö√├ñù┌█║ƒ╧:ì╛╠r}YC█ù6ûQ/vX_~ ùj)L¿<\dΓ┐( ₧Q¡┤╛ÿ■╩^àuPk ╒║-0╖▌┼J£╙}½ñxô⌡GJvú    ⌡│3⌡Qqá|╞£╧∙╧½UÜÆ┴╙o»πC╢oP;çß7₧╦F≈Duîs⌡5╪D┴ΣT≈qG÷▄╢!
  83614.  
  83615. ⌠J+63é¥=$αΘƒ>ä-⌡ö√├ñù┌█║▓▒JS║ßÇddY╤Å
  83616. KçZG2Y
  83617. ·êHs/\½<RdΓ«8∙╥Wíí▓▐√└╫{P@zh▀ⁿ~"½╩╔_AÉ╙táD│=ƒ╝SV=≥$û╨êJq∞9╨ù╩α╔▓=╩`⌡÷∙½²QÄo    p░Ω4╫╨Q╜<╪^╚╛|!!·┼"é
  83618. k╬;ⁿ╧ùEfºσ⌐╖á┐╪o_▓╘½?QJ=ì╫ t":!
  83619.  
  83620. ╘J+63ûè5 ╡º╓jë6π√Θ╩φ╥╦ò╜≡ @╜√─l_GU┘░'BÆ.yw\h┬ÿ\ L&ßU]|¡á%║╩JΦé╣Æ°╠,ÆsW`(ôⁿ`7║┴╧]Ü╙}½╣Ü E*αtÅ█]▄@m∞4╓╥╤≤╧Ñz₧ì╒■f├¢>-èR/H╖├₧α`⌠U+╧^╓│o⌡╚{╔pk╟6╛╥╦)┌╟æ┼Θò┤Upÿ╥ò/=Lha.A╝J∩2^IV┌┘]τ╦0UxE╘╝o╛v#ñ╫⌠ç╒O╨ƒªΦ¿~╢ßàdÑl^b)
  83621. ▓A╝zLδ╢g┼iα    Éå╙è╚dö╒╬╥[ΣyßïZçèÆ▓p/5Y[)Σ6ƒ╖>qò7₧B╙BJqâsuü∩u▓XeM▀¡²Sq+]l╥Z┌┼╓V▐Ä6Cë∞Lôô▀N╨:9\Iß±(! !
  83622.  
  83623. ITypeInfo2 comment:
  83624. '''ITypeInfo2 is an interface pointer class to wrap COM interfaces of the same name.
  83625.  
  83626. ITypeInfo2 is a refinement of ITypeInfo which adds some bits Microsoft forget about when the defined ITypeInfo, it also adds some capabilities to look up certain pieces of commonly used information that probably made VB quicker. However as we cache the TYPEATTR once retrieved, it is unlikely that ITypeInfo2 will be quicker within Dolphin.
  83627. '!
  83628. !ITypeInfo2 class methodsFor!
  83629.  
  83630. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q!!GD÷≥D╖┘┼pFô┴Q─*▀Tñ∞Tf>ε6▀┌\ÜKz⌐49▐é╧≈╪ÑΓd▌÷∙e╟ΓRHñ`δδ6╪╓QΓg:┬\╬ⁿ#;╣ä_╟VZ┘/┤≈èJpΘ├Æùëo⌐µgI┤σ╝6|VP<r╔τ?cKÄLá{π╚]h:JB▀º:àYƒ ▀Γ╝"├┐ò∙â.░┼┼╚mfxj╒²sJ∩┤g╘YBⁿì█╙╔█_ö─┴¼»Z╙σ6├ε÷┌<SgL@2 m╙┤
  83631. `àè@▄1OFf₧Ofá■8╩U╞┤Σ^?>    X├▌√╫@ÿ╣1@▐û ₧çÿR╙)6Dt╥⌡7Y}╓ô∞╫└
  83632. ∞⌐⌡í─Ö╧ÿO»ûAc√ σzó.¿do■ÿÑ└╞+xÿövτ╦╫QÆ°ΘìDu/"ü■±i¥╗'║ª»}äƒB╗brjΩ└╬└;╓σ¥;ÿô~±▒>dφτ▄▄Ü U╬-$╥│ëgª¬ù#ÿπÜ`Lº·&δ:=╡╨.⌐A∞τ»≥╔▄!!ó»Ç╖á╧)GPâ    d2≈5τΩ╟R∩ò╪É ª-ZX┘a╛Ç╚(=3!!çC╖⌡Q4bßεÄ3▌ΦΘ5╪9X█zz░╓▌ⁿW¥V{{└«ΩE_"ÖZ|^Sƒ(°l¡√ç?┌≡««╞è╣╓^âvF∙Kn¥L^1@àk╛╖ìq5ⁿxiò\U╚ÿR╧▀▐▄Pƒy'NL≥wÿû╕(╡φ>╫ Γ¼6üµ╘"╪r0O±└¿JΦ╕«∞Qæ  Θ"=²à a╖▄@º╩X¼┤Mü∙$τ■7ïù¿T╞n┼1-ÇjCA╓îcsz╢µ±√└_ìn=>Θ╥C∩■∩t▐∙#qARµ}╙WD╚ÅΘ -í'Nd╕²█Σ)w░²{ ·╤╘pëN╟╕α#ª?q┌òU╪í▒╨╜{╖╣hy3z)τ¿ε%┐C²┘─"ä¬eƒR╥╒Bƒú«Cñ2O│»╙ù⌐B█εe√┐÷l╘rñ┤ëº
  83633. δ²N╧AS91┤@ _3e╖&╬▐|]BóF-8n²ÄJ°Xæá╥~⌐K½┤▀╗&ñhIgbÉ∙°    ╓?▄∩■S¼^√- w▐m¼ôP}╙&─s╡7ù║╣D}╡╛σÆië=H}╣!!ö╗πOR▓#¼W¿Σδ╘~█`N·H╛I WaτΩ!!íßlä-Θφ}▌ ∩δî%╒ ô;-⌡╕╓>ⁿ╥g┼ ╒!!⌡Ω2■öuk≈8∙║δ╤b░½±]y┼≤/┬ÑΣ÷ñ~▀ Aï╪Q╔éëÑ╒!!9n£[èY¢î╨╟_╢┬.╛|½L)èç)[Φ∞┬δτ▒ßÉeHì6û0═A:!!|ú≈╩ó├x╠bû{╨┌OQ ╕Ľ┘,;╨ôr╒]è⌠≥{ù4₧╪ä>p╬▐TÑ(æO╗w≤XÑΘ?
  83634. 4╥6√£│▀≥%Ü╘o▀3▀┼╔⌠%¿╖|╜ï¼0å╓╓Jì╢}PJ╘ë┬╤<Σ╫≥ìiïD╢vu÷)≤1┤≈@Wπ#~D=[2╥BnY╪╛0@πº9/ÑiÑ╕√«p{B╚[┌∞ë║■┼ìê_P∙╧ûΓìj2è⌐πss█╩≡lφì╖O-æÿ¬t╘φ║ñ?,¢yl╪]σ╥Pαñÿ╜àƒ.█ⁿê╛ &┌ⁿáΦ╡X╚mÉΓ▓äDÑ4█╛Φx╢C⌐ï╘*i9ΦΘq╔┤å╢┼~üΘn°P╫â5σ6¢áÇ╛q┴vº│₧AtfvYv┤    ╒kò╥{░#_⌐äN▀╕Zτ⌐Ü∩ε╬╡Üg²nτÖ1╪EPìf  ~ôÄ~╞╙╕╞┼╢∩╫╓Ç_Y`[[âA╫ª╤ì%z≡g╛ç%ª┤╡ô}╩+(ⁿêIï╖ñGA╝╚└8╕wI! !
  83635.  
  83636. !ITypeInfo2 methodsFor!
  83637.  
  83638. µA3;94çÜ!!=₧¿ÿ+ΦUêû╬┬φ└┌╟■µ¡Vπÿ⌡HGlwµÑ`àZW?bOd    ╢êOi-F¡{~¬«`┘±o@ç╡╜¢⌠█[╫S[Ol╓ƒx!!║φ┴MI▌_╙p║K╣y▐Cæ;"cQ²$ŲLÅVP¡=ôÄ«£Ñ░P¥ï┐Æhε½
  83639. üU9Oª╬ ƒQΓVaí5│÷!!g╣α}╓cb╠ñ╧ù`uº»ó╛≡%╜τtx╕⌠│Do/kE'¥╟$pF╚╪τ╦!
  83640.  
  83641. ╞A3;94çÜ!!=₧¿ÿ+▀±≈·▀Ω≤▐┴┐ƒ╧:Å⌐╔mr\SÆ╔~{ÖIK!!kGc
  83642. ╢ªMG*CÇi@~å¬4√û @Ñ▓úû°╦\æ4Jk ∙ô@rí╦╩\KüVät╛S│y╨σ[=ívÜ▌\òTq╛NQ╣ ⌐ƒÑêA¡>¬╖º<0æΓC@íaw┬╚6╩■Sδb:▀K■τ,)ö¡½+U╧*Ñß├gAÇÜ▄▀╘'Γ┤p¼≤ª.qGP XτHÄ}]& ▀▀ƒáU-/WH┘Ç#çB₧Γ╘½Θm≡·╥₧┌Ç╨²-ε1ALn╓┬qSΣ±`╬{ZαÜóÆé╙%±!
  83643.  
  83644. µA3;94éÜ<*Ö╝ƒ>í>⌡╒╡î≈┘█╨ª▓╚9*²Ü╬hdMDÆÉ6W╫g]owJ;╫▀^Kc5Z»heñδ)⌠╚M í╣░▐π╟^┤[s@Ab╨╣n&Θ┌Ç~Mü7ƒS╗M╡^àΦuN9⌐-▀╙\êJ{¿N~╛°«£Ñ╝3ÿ.èêçX║≡X╧
  83645. ckí· ╩√^≤@oûÜ5╞U▌µLπ`┼( ▒Θ-g╢ó■╛╟╝╒lPƒ⌡╝    !!pUA/g&ÅPú>uJHëεÖ╡}l(BÜæ ₧I▓±┼╣▓ Ä╙┐▌╣+ª≈φ█w⌐yæe!
  83646.  
  83647. ╞A3;94éÜ<*Ö╝ƒ>í>⌡╒╡î≈┘█╨ª▓╡pV¼»ΣzgI ÆöGäK`+zZ>f┤▒ Pp'[ª<*ïÑ6⌡╒G@╝┐▓▐╨╩?¢xx`c∙⌐~&è╚╘X▄V₧aªL▓=ƒ╝EG x┬K▓₧V₧Hq»|─Ç┬µ▄Ñw╚å█çt
  83648. επRGºi~Éí^┤▓5Ä(■zΘ#▀!!╞°k╓Fm┴3╜£ñA`Æó⌠╪⌡½╫uO¡─│-+?b[╡φ*pdAC└├ÄßPc(E╘à*ôoⁿÖ╕╤╟n±«╝ì╣ å╫φ(√$}K ⌐oΦ+uKπ°2¡2«k⌠∞∙τâ^Æ─╤≤C°R#«oΓ2╔δóƒTl\E)▒d╟╖)r₧&¢ⁿ-rvGºTA╟ÑXëcO═«Θ84\r▀²╙╒HkΩ!
  83649.  
  83650. µA3;94ìé"%Ä░£/ª*≥└╦═Ω╓àò╖ⁿíV[ ╓¬1iX┴ô;@╫KL/.p^<┬Ñ?mGx▒y@«┐`⌡╪    ªí╕ò■┴^â|[@MO≈ⁿB0ñ╠├MåV┤aÅO║T¥≡eV=┬qî╩}¥VuΣI|▐ù╫■├ñ=╩`⌡÷∙εßtQ▒t.zûεs┬▓5ÄQ ┘L╬2≥9`╣¥%éa[≤ ò²╖e4╜½∩░ìl┴τeP┐áòDJY"k"é>·5RZC▌3╠ï√d2GI┬┴?¿Oé╘╨¼²;ñ¬ó╪ë*æΓ▌üh]b,ƒi∩P^÷░)╓lW∙≤δ!
  83651.  
  83652. ╞A3;94ìé"%Ä░£/ª*≥└╦═Ω╓àò╖ⁿíV[ ½πn`\r╙É?╫Og?}Owj≈∞t0$]¬jR~ºδm║≈Lº╝▓▐π╟^░qJ!!bl≤▒}>Ü╨╨\kÇç2t║B■4╨ ∙EG<íkÖ₧MöG4Å/ô¥┴ⁿ╔úg╚ìÜâl
  83653. ¬▒U]Γt~┬²6▌┌V±D=é2░{ÖD╤⌡]±wB⌠ÄπÉPp░»⌠≥á!!¡αAP╡╔┐Q_EE'¥╟$p=ú~ñx▒¿WP|VB╔ê(à_╓∙▀¼╝hΩ╛ä╒╓S▀èá`⌠
  83654. "/CƒI╧;P~╓É#Ç}x∙èÑÆÜ▐└╗»ÅÖx]╨╜%╠⌡∞╩J)\M>≡;ƒ¡mmâ1î[╙ 4╞dwéΘ1ú)oⁿå╬cpt┐$═╫╒BFëφJ+╗÷M╝öôK│F!
  83655.  
  83656. µA3;94öÄ (╖èÖ9æα└εû╛▐╤╤╗ΩâFM╝√╔uwMNΓà,SÜ#`_Vs?≈ôT&K%╩>rd▒╝%Φ₧V¡≈δ╜┬ⁿ(:╢@^.r▀»x>║ë╧_£à~ºM▒=ä    ∙l&íK¥╘\ƒV3┐@╓åΓ·└ÉrÜ Æ╕åoè≡CEΩ)Jvç√;╤█Ñ,Eí5│
  83657. │=B∞╘lµCz┴¡▒Θ-dÉ╗δΩ─╝⌡ Σáæ?1Qbt?GrÇ⌠Y]&C╠╦Q¡ñML0O|█ô.åyàΣ⌡╣Φ`╛·ê├₧;¡┼▄╠E>ñL²uR╕±`╬i^⌠6ƒôÆâƒX╕├╓≥f⌡1α+±╨⌠∞√Rhk#T╧'░Γ>q╡5ïOƒ@Nvâ
  83658. !
  83659.  
  83660. ╞A3;94öÄ (╖èÖ9æα└εû╛▐╤╤╗ΩâFM╝√╔uwMNΓà,SÜ#`_Vs?≈ôT&6l╢oGNú┐!!á₧R#╜ñú║÷█s²0|i╠╜y7εäÇpFâÿ5║K│=╖ΦpCαv₧╙zëQ`ê(╥┌è╢┴ÑgÇ¢█£zO║∙RüO';ìφ9█▄KºV=═O╩≈mcαçl╩G.╥:▓┘èRqíαòöìl┴¥Hn£╙ç&6%yjr6ì ∩pVJDΦ┴!!ï│X`V_╬Ñ.ƒ[J√Ü╕╤òZφ┤╝ìÅ0ªΩ╬╩wⁿu≥ qG─ñg├!!6åo≈Φ¿ç╤u█├╦⌡K≤5╛+Φ=╤º±╤Cq[<ⁿ{■¥D °É[╦%aV╡TD¼╧⌐J5▌▒√s0.KP%╗p╖É┤.kΩè<╛φ]èöô═8<SA╬¬d /öé≈╠Æ]∙·⌡í─Ö╧ÿO»ûAòí╗7Ωî(8uæ╫Ä▌└3w╫ô"▒ëⁿ]ç°≈%ε*!
  83661.  
  83662. µA3;94ÆÄ 
  83663. »║ÿä+αÄ»┼≡╙┌═■ƒ╧:₧╡╙lvZ╞î;╦|qZr_.¿┴ \u3C╖<\lΓó.∞╤I    ª░≈è ╩\=╕Y/lj▀┐yu╜ëτ\\┤ƒ t╝`únä%²ENAqíiÜ╩QôF:εmV╛°¬Ωî░P¥ï┐Æhεφ:.╦p)næ√▀╦^ºrî|∩%╟    @═µ8╠GyÄR█╡ÉAx╡ε▀√⌠'ñ°V]½├ºAGA
  83664. <rçτ(1_s▄┘5ï╡X7|So╧Æ;»[ù╛╝╥ò_⌠Öö▐Ä┤≈╚I┘;n╓!
  83665.  
  83666. ╞A3;94ÆÄ 
  83667. »║ÿä+αÄ»┼≡╙┌═■ΓåFP½ƒ┴or┬º+Aâ{E>o69M╞ôOg2Jπ1C¼╜/±█á▓≈╣≥█=¢B_Mu╔¿I3║╚êÿçz¬╣{╨⌠T*╠$É▄SÖA`∞.╥é╙≤╚αqæMïôû<½≥RM┤e5∩à^┤╢6╧s
  83668.  j÷"│^Ω╙|┴Cb╠û┘ùex┐ÿ∙∞├╗αD]¡ß·gh /<0o<│J÷#xH^╠ìä╡d2GI┬═Bß3k ╦▐¡Φ\ñÖ┤■«ö╫ΦCÅÿ}Φ=Å█é1ül≈▌àç═\Ä╫╔ªQα3╗gφià∩Ω┌    Se[Fk▒3ä°?a╤¬}δ<`vB╠>τÆ ≡)Zê½ßA06C]╫╥┐│!
  83669.  
  83670. µA39 +░½3=╗≤╠-É6σöéªùò■█¡σáA½│┼;/~wα¡|ú8kHFg╢Äo(Y¼wZdÑδ4≥█#çÜ≈▒⌡┼â3M@Ie╬ƒx!!║φ┴MI▌_╙p║K╣y▐Cæ;"cQ²$ÅΦXÄtuá@ ╛°¬µ·ía╛ ô█╔!!Oÿ╨emâN>;îΩ$É▓5ÄR*└YÜ1÷9B∞╘lµCz┴e±█ûMp≤╛╬ ≥0⌐°:⌐╓│4dJ
  83671. uÅΩ>e=ú~≤╝áK[=O ╠Ç#₧_oⁿ!
  83672.  
  83673. ╞A39 +░½3=╗≤╠-É6σö · ┼Θ╘▓¿σCu╛⌐÷z%<╗╞@₧IE>k+&°ùRcf[½yMº┐∩═V$⌐ú╢╓╛Åâ|Q.o▄ⁿy:½ëπve╒æp¡W÷jé∞AJxπ}▀╩QÖf⌐9┌ä╞Σé═σg÷≥╗N*¥─{pΓ_5hûδ0▀╙Sºf*╪|╧τ    `φ╞0»(⌐Vè╒ìy4ö¢╤┌¬F»ßiX⌡ì╪ck }Zr╬<┬%PadâW▌'ï│ol0
  83674. ╖δF╔7h√Ü╕ΣΩh÷«ö╠û~ª≈═
  83675. ╬    ;QR «y∩xKóπ>ÇJn┼"╘┴Ñ»φa║°±¼ÖxYäxΣ?├º±╤ GeFj<²;■¥!
  83676.  
  83677. µA3>:;▒é7'«¿ÿ#è1│Ä»┴√┌╓╤■■ªZGσ√╠xzL;╕φ|sÖLS/|R+\╢ä\k#A╖<K░╣!!πǺ╣úƒ■┴É4Jk ╚╣~'ó▌╙GôVÜcíH┐sùAΦYJI╬I▀±[ûGw╕G/ô ⌐ƒδÑg¼£Ä₧y║≡CM¡nX3╦»>█╦WΦEaÄ2░{ÖD}╣╫z╤V|Φ:╜╠░Pf║á ┌∞
  83678. ΦΣbO¡≥ÜuuAo<ëJ≤'YJ\┘$┘â»^N3MX▀Ö;╦FoⁿÖ┴║∩u÷Æä┴èí±└╚!!;RYß<▐<@mó┐l╫#6åoÄâÇÜ═`₧┌╒╒Vµ>╜+╗nà┼╦δ(gJP¢^â≤:Mö8Å}╦
  83679. HLdÑonÖ■-≈Jêå╪xhj╙    ₧▄▄SHφë59▓≤O▀▓ÜS·#;EM╠Σ%4₧b┼íÿ▀ í│⌡÷╟ê┬[╞¼çLRd░É£┘¿nv+∩¼╣└┬e1çÿ?│Ü╪Q┤╩∩;èNwwâ─=∙Lë╥#₧«│S⌐öI╖=┘Θ╖┼>∙⌡£.ÑôX∩│,k*╛±└▀╒    SW▐(┼╗╙y(┘╔≡M╕ΩÉ3▓▐ ·1╢╬G\°2J α╢φô6╖\¥╘éôá─_QU═lTÄ^⌡∞╥oµï ░┐&NBÅZJ3Æ╔Φb║j├üRx'Äï≈╠ⁿΘ5┌<B█mkí═ôº≈jjß╛÷+^πY3iBà?∩v╜│┐22╪⌡╗░KÑτ⌠│cào^∙(!
  83680.  
  83681. ╞A3>:;▒é7'«¿ÿ#è1│Ä»┴√┌╓╤■■ªZGσ√╠xzL┬å-FàwA&~hGy°åDv$\╖n{o«╗ε╠K»≈ºÜατçGJgn▌ƒb<║╠╪M╒ù]½OªNä⌡_H*7∩pÜ╞M▄Rv┐.√ù╧µ ┤aüÿ┐ƒpUεßUW╢r"~Ä ╩═VΘF └S╖|ÜoQδ╬n├VkÇr±⌡ìR{╕½╕ΩΦΦ╙eH¥∩▒`HA
  83682. r;ü▒_y1BU▌┬╩«_-(KIÜóªö·╘╗Φ!!≤¿Ç▌è;▒ú╦Å?R╣∙bZ≡ ¬1ào╢│╢╜Ωd»û·┘Qα3╗gφsΓΓ∞√E|BG)≡#Ü°#7┘Y⌡'╢qzKm╗ lé⌡2ú Q┴ªú:[S#pE▀πÆ╠JëΣR/│┐EÉ¢ÿ╥/1T |¿ÖMj₧yâ╞ÿ≡=ÿê╗÷█ë╪KÄpÑêUe0▓¢üçG╟ q└▒Ñ┌°dÖë%áå⌡PQ¿÷⌡.╔`3»╓∞sì≤>éá₧[äÅB╗,SmΘ└╬¿▐σä╓Ñy2╙■Ot&╣α╩πÉAw▐("╬░τF0é¢ô ⌡ñ±/╚╡oß< »▀x∙/@√┼╢φç╒'ªµàì╡¥L╩`TîXªⁿ╫Hε█╬╖ñb    ÄTT"▌ΣÇ{Y≡≤¿|jì╟ε9╬∩∞2┘<L┘u╙!
  83683.  
  83684. µA3< 6º¼':«ìì>äeí▌ß╚√╧ƒ╥½√í    ╕«╔3%<╗╞\äHA8.O[nO¬╖?kOaù"xº╕5÷╩«≈╛Éß└Ösfe܃Bεµ┬SMû╘5ëFó[à rZ,┼eï▀╒y⌐4▄ûì┤í╩Γdâ█âJ╝╟VHΓ|gδ ▀═iµMoûÜ ╥H╪ΘLéLk╫q▄╢ΩWq┐¿╕┘σÄßn_Ü⌡í&dRTQ&;ǵpvZY═M샿]-,uM╚╖.çBå╞╨¬╩`Φ·Ç▐¼?ºΩ╚█KZa{=¼J²B^ε±┴aNΘk⌠!
  83685.  
  83686. ╞A3< 6º¼':«ìì>äeí▌ß╚√╧ƒ╥½√í    ╕«╔3X`╙ûS¢:XZA]·∞t0$]¬jR~ºδm║≈Lº╝▓▐π╟^░qJ&{n┘ƒx!!║φ┴MI▌_╙p║K╣y╨·[=íG░≤ô@~⌐(ôà╤≈▄░vîM¥é╙h½▒EAíemç²}│╡2ì(FΣm %╞U╣°G╤Vj├>╜╨├cqºêφ≡π%╜τtx╕⌠│Bo/<b];Ç7ú>bFW╟╔Qâ»M-5MH▀Öcµ0k ÖΩ▒≥\ñ¥┤Σ╛t⌡Σ▄╦IZa{j╒G≤`bóçH≥Dz┬2╘┴â╕▐Z¡╫╔»ÖxY°ï^»Äñ╔T}ZE}Γ#ù⌠,i¥n▀F═RWoÆ 2╒╗1⌠7Xêà┌~p
  83687. /_Σ3 ⁿφXφë5ñ·EÖ╒ûI╚-4YD2├ⁿ(nW!
  83688.  
  83689. µA3< 6ºª<-┐▒ú,¿:∞²δû╛┌┌╪╖÷σZM⌐░╔uw█è(Y₧Q@j1:).°Æ    \tf[½y6å£╚·@║▓ñï√█\æ4Wxo╤╡c5ε▌╚\╢9╛VZ¼I│~äF∩h ,╟qæ▌pÆFq┤/:■ù╬▀╚Φ:╚ÜÅ¢s α│:.╧
  83690. cg┬ ╦╤\╬O+╔GÜ
  83691. ₧GΘßm╠AG╬;┤─├)≤è╧╤╥"Φ·eK≈ì╪c`JSKA7Ü,÷3XAT╠ΓºñTD8 ╫ä"é^Bƒ■╟│⌡oαα┴─ö(╛Ω╟Åòr°
  83692. lóíO╒cX┼Üäï└▓"≥Φ╒└W·┤oΣ+à±∙╙C%!
  83693.  
  83694. ╞A3< 6ºª<-┐▒ú,¿:∞²δû╛┌┌╪╖÷σZM⌐░╔uw█è(Y₧Q@j~}Fe ▀Å\~|│ZFdíé.■█Zm┬▐⌡«σ╞
  83695. âqM.I╘¬b9½ë╘QM╒1ûS╗M╡T₧∙I`Σi╢┌╒y⌐4▄ûâ∙╩αgÇ▀╕╝QOí≤]AítJlÉε#╬┌[ºC6îK╥│?d·┬q╘G|ÄR█▒Θ-¢£▌═╒*£┤_c¬⌠╢    iJ,c&¿φKU╤8╦<żpit.&│ΦF░S ½░▌╖≥fñ╖ä└ô:∙Äú`ªl >ⁿU╥9[t╟Ü@εIσêèÜÇ█÷╝¼Å+╧%«Ví&╦⌠±╪CmG)╗wâ╤8kÆæJ┌∞    "αæXëcyJ┴░√B06
  83696.  
  83697. j╥▀▐╒Fê±Y9ó≤]▀╟╩═(/_Réπ 2âh╫ ╧▌¿≡»█íΓ⌡LÖTª─LX2í₧åΦ+ín r!
  83698.  
  83699. µA338(¿╗+9┐èÖ9æα└εû╛▐╤╤╗ΩσTV╢┐Ü;t]_╓─S8■e$}LVyOΓë:næUrDû⌡`Φ█Qñú≈æ±Åü{U    `gÜ¿e7εΩ∩t║Öv║Ñ=╖ΦxB4╒}Å█zëQ`ê(╥┌è╢┴ÑgÇ¢╒╤e├¢>XΓp<zÉ┘2╥ƒCè+F▄i█┼,m╣¥%étO≥É≥╖z╢╣╢ôèo╗±lZ∙╟╖+hVY?"ï)÷$UND╚MìäÑ\u|DY╙àu╦]ƒ⌠æ¿╩`÷îÇ┴└~Ñ╒╚∙;Kè}εuQ÷ ¬eⁿ0ƒôÑÅ╙ì╫╔≤GÖx!
  83700.  
  83701. ╞A338(¿╗+9┐èÖ9æα└εû╛▐╤╤╗ΩσTV╢┐Ü;t]_╓─.dûMr+b{9≈ô(XjK%╩>cx½╜!!ε█MΦ₧╣ê°─^â|[@Ie╬ò`"ó²┘IM╢ÇQ»W╖5┘A±T[7σ$É╪êJq∞#■╥╠⌠╞Ñp£MêëÆl½⌡F╗ sç»!!█▄ZεW*▐╖|₧GÉ∩Jτq[∞ ±π╝W`╖¡∙≥∞Fűtu┤≡╛>uCvu&¬ ≈x%9á~÷ä£x2PE▌Å*Å ÿΣæ▒≥eßó═á≡W▄è≥┴8w,'*ÿ6╝aVµ²¬2à=æöç│ƒ~║Σ∞╟l└Xp¬]α!!≤µ⌠ûA+&D$W£]·½;lâ èO╙XRVgàalüíuδ O▌«√bk
  83702. i┘┌Æ■q/ñ⌐û═`╛╗½ÇAR9~╟ⁿ"C4ƒzû≈╤╓-¡╢²█í!
  83703.  
  83704. µA3*4*Ñé<⌐╜¿+æ>╗öµ┬·╥╟≤½ⁿªJ▒┐┼cCID╙ëd₧Q@/vkRy√┴Lo"π{FcªδMÉ╖!!ªñá¢σÅÆ46OR≤¥C≡ë╥\[ÇçVz¿┐så≈XAx⌡lÜ₧z│o4â6╓æ╫▒▀αTì»Üü}ìΣDPåaz╩ªs╙┌K∩N+é╖|₧Gσçh⌠C|÷>╜£ƒ)┌╛╬ ≥0⌐° Σáä+0Lg{?&<ï¡zZ\U┼ì6Å╡il.BA∙ö<ƒ~é±ï°⌡oα┐ÖδÅ0╢ú└╦/;╜qªO}Qµ┤q≡lIφ ▐ååç██╤╨∩F┤╗y╫2╔╜╕╧,G{yE}≡$Ñ÷?lÉ:ï▓r(|s░ar╗·9ú$P▌ºé=!
  83705.  
  83706. ╞A3*4*Ñé<⌐╜¿+æ>╗öµ┬·╥╟≤½ⁿªJ▒┐┼cCID╙ëd₧Q@/vkRy√┴Lo"π{Fcªδ0╠▀P6⌐╗φ▐τ∙ íuRm    ÿî;╕╚╘\╪V║cíH│=ä    ∙h ,╤eì▀T┐Wg╕$=╟ôï┐î¡v£Ƀ╙s    εσ_AΓC%V┬α1╘┌\≤8▐^╩÷)!!√▐8╓JkÇ-┤▀åMb╢╝╢ôèk┬¥    tï┼ü?.Qj4u&è    Γ<1hU▌'╠ï¼zx/Wh█ò.├7h Ö╕â⌡o┘·ö├ë7▓φ╠Å 9R
  83707. ▓x∙RJ∞▓%¡2àoÑê¥│ƒ]ò┼╠ßL±p│e⌡s╠Θⁿ┌vh]Dq£]·₧D^ÿ:ó°-hf)╞guä yÄ`L5íÖαB%
  83708. /_Σ3 ⁿφFÉ╒]8ü■E╓╬≥-╖nU:-{½¼2
  83709. /àyû≈ÿ┴¿╣≡║╟╤ïWÄ]│æIBd≥╦╧▄%┐f&∞▒ó╩àD╛╛fτ╛╤f8à╫╧c▌-^3ö╓·É∩!!ì½┤P⌐ÜK»Uu!
  83710.  
  83711. ╞A3.,(í⌐>(╜║╓jò °─ΩΩ≥╓╪╞╙ÿ╠s¡▓╓zgMƒ─\üPO/.O[nO╤ä
  83712. m6JàpRm▒πi║╙Gá╕│▐°╔\
  83713. ƒq#AMÜ│o8½╩╘_çâp¬┤d╨⌠T=Γaû╚\Ä ╞mV║√δ─ΘôFñ9▀ñ¼o¬≥VH« -~û█*╬┌yδ@(▀╖|ÜD┬╚m╓.╒1ó╒äJq╖ε⌠±εΓ┤phá≡╖,dAFB=_ΣcízZ%9ò─₧┤Xa|PX▐é.çVX╓°├╜∩tΦ«┴ƒ╬~▒⌠╞╦Oifxjéo∙rδ┐┴aRΦ%ƒìƒπ╡!
  83714.  
  83715. ╞A3.,(íñ;'╛≤╠:▒&±╤─┼≡╙▓┐╫░òAJ⌐║╘~3√è(]£Z>f^L
  83716. Γ╡IcF¡x#Γª%ε╓MΦ╕▒▐π╟^┤[s@ab╨╣n&ε▐╥XXàùVw╖óuòAεTL 1≈aìÉ4÷/┼iß╖≡├αö3╖2îÅùó²cºt>bÆΩ╫╤[»,EÑ6│-ⁿ8u─çL√rKδƒ°╔dç╖Φ√╦ª≡)╘è█Ho+?b:$ç≈1}C▌╬å¡-4QI╔ö#ƒP┼░┬╝δn÷╛╦ô≈T▄▌┌ ├w╜p⌡ W^ε╜¬!
  83717.  
  83718. µA3,4*çÜ!!=₧¿ÿ+▀Φ┌δ╔µù╪└╖÷ D¬▓─;"?ÉÑ0AÇZVjzSV+S└á,pG{²<Ao▒╛,ε₧MΦ╛╣ê°─É4Jk ∙ô@rü╦╩\KüQÇVR½WÇ|é"ΘB[-9⌡e╫ùæG`ñ8¥╨«£í╩öMÅ¡Æn9»²X╧
  83719. ck┤ε!!Φ▐Sºrîi√$┌ O═çv╟U ¡U╪╧åHr≤ë²Ω╓║╫uO¡─│?\b7ûJΣ9u╬─╩▒ol.uM╓█o¢lä╞╨┤╝`≈îÇ▀ô?╗≈çdÑl    $«J²4Iπ╜|┼1!
  83720.  
  83721. ╞A3,4*çÜ!!=₧¿ÿ+▀Φ┌δ╔µù╪└╖÷ D¬▓─;c~W└▓?^═ToIej¢δwV4F╡}GoΓµ`╙╨Tú▓≈è ╩\9Æ`h|C╧»y»▌┴╒û}íG÷rûAΦYJI╬I▀╤[ûGw╕@+┴ô╙µ╔ñ3è▀Å¢yO╝⌠TA½vi╠éY│╡6ÄiΘl∩:╟m^╞╘l╞Ao╠3±√åPB▓╝█δ≤î⌡t]±ì╪ck }\[r¢≡7JTë├╩¿Wi9[╖δFΓ39ƒ■∞°█T═₧╦ì¥+╝τàdÑl^b) ⌐h┴OB~╨ÿHεY¼¿Çü╕▐D╥ì¿î+╢Z╫êo╙εΩ╦Ge]9≥6ƒ√w%Ö&Ü]╩U0╓ dÜ⌠'τJißåÑx0_°.öî┤.o╛≡Y&▒┐@æâ₧K╫(QL»Ü!
  83722.  
  83723. µA3,4*ìü6,óåèÇ2╚╨╡î≤╥╥▄║▓╚9*²Ü╬hdMDÆÉ6W╫`Aiw5OΣäLj2¼zc¼╜/±╫LΦú┐¢╖∞33╫[\
  83724. kc╬√~rë╠╘oIç?¥p╢l░Pò ╒U@x∞aï╓Vÿ 6┴jQ╣√▀╢▄ûrÜ$æƒûdO▓£=-▓V i½ß7█╟╜oΦh⌡$╫moⁿ╨6»(╙:╜┌├cqºÿ∙∞╔¼±xs┐═╖+ac?çúp]y╟╚    ╨ßI[=Qe╘à*ôoⁿÖ∩¿╩`÷ôÅ╔ƒ&⌡⌡╚┌Za!
  83725.  
  83726. ╞A3,4*ìü6,óåèÇ2╚╨╡î≤╥╥▄║▓╡eB¡Æ╬vP ÆöSàvJ.kC>f┤▒ Pp'[ª<*ïÑ6⌡╒G@╝┐▓▐╨╩(ûfwje┬ôk½─Θ]▄V₧aªL▓=ƒ╝EG x┬K▓₧V₧Hq»|─Ç┬µ▄Ñw╚å█çt
  83727. επRGºi~Éí^┤▓5Ä(■zΘ#▀!!╞°k╓Fm┴3╜£ñA`à»Ω╫ε¡∞OZöσ┐#-+?b[╡φ*p}@^╬W└ç¿]!!Q)%│ΦäO½░─╢∩hπ┤ä╔┌7╗≈âI▀36;╕yΣF/2ê╪+¡6åo┬ùÜ£╦]Ü┌à⌡V≡1╢g╗s═⌡²╠J}T}Γ3ä°?a╤0êA═ ∞    ^₧■9σJ,R▐úπ^5Kr╗p!
  83728.  
  83729. ⌡]74Ñê!!D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`B╦ö;æSE-}m∙î^Mn#ùEcOäç▌φªó║¢σ╬ÿzN
  83730. │ò`"ó╠═\Füçzáÿräª{=ípå╬\▄Dx¡/ôô╤≤î▓v£û₧ày ε⌡^Vºcw¢»2╨█µS*î2░ß(qδ┬k╟Lz┼;±╚ïAf╢ε∙φáU·╣bU¡≤≥Bc|?"ï#φ?/D╨╚7åá^~u╖δBß3╓±▀½δd÷·¥á≡W┤φ┌╩wQOCÿK╙=P}√Ñl╙-UΘ╨∞∙τ╠Mù╨à┴Gα&)¬n╟?─αδàZGg\L/┐Z∙₧dƒ'êK═X@QJêteè■'!
  83731.  
  83732. ⌡]7>1¬ï_C╙δ¡$û(Σ╞»╪÷╥ƒ╟╗±áZU║⌐çh3\O┬ü5[Ö[bo^n⌠ä i ╖tV*ûÆ▀⌡k.î≈▓ÉΓ┬ û`W`)ö■X├ú⌐EöÇp╝¬·h²_\=≤$┼â╕u[₧$╩å╞σî«vƒC≥±·o
  83733. ó≈cºt>bÆΩ╫╤[╜.┬L═ßc ô«F├L}╫:ú£éWG║⌐÷√Σ/ªαe[╝≥! !
  83734.  
  83735. ITypeLib2 comment:
  83736. '<ITypeLib2> is a wrapper class for the COM interface ''OAIDL.ITypeLib2'' generated from type information in the ''Ole Automation Type Library'' library. It contains methods to invoke the member functions exposed by that interface.
  83737.  
  83738. The type library contains no documentation for this interface.
  83739.  
  83740. WARNING: This comment was automatically generated from the interface''s type information and any changes made here may be overwritten the next time this wrapper class is so generated.'!
  83741. !ITypeLib2 class methodsFor!
  83742.  
  83743. σA!!;=éÜ<*«áâ$ûRï╜¡Φ√╘╙╘¼≈σGK║√╓ra\C╙ê~TéQG>gT]+≈â\& @▒<Gbºδ╒≤    ªú▓î±╬╫3q!!GD÷≥D╖┘┼uAùD╘{╟*ƒIë∙}F jí`Ü╪PÆG@⌐,▀ô╫≤í╩╩`⌡÷∙½²Q)╚    cçΘ:╨┌y≥O,╪V╒⌐m"▐┬lßW}╘░╚édà»Ω╚ß
  83744. ≥Ö
  83745. 5╨ë│pKPrùµj1wⁿ>Θ[╩ùx_bbε╦h╨7h Ö╒╜·hΩ┐º╪ö=íΩ╞òEt,Éu■<`^÷╕z╘dX \ÄéÉåΩFÆ╟╨πl⌡5⌐1îY¼Äæ▐A|BG)┼.â≥>?╤s¢Y╨
  83746. E#éwoƒ ñQH6í╦δR73DX├▌╞╨K┌ú▓δmÉûèJ█",QT═■vY1Æeôí╚╨╕¿┘│╟¢°KÄQ«âF ╖║è█╣poⁿ¥┐└╤:iâ└<Ñ¢ΣF9í⌡δùRy9
  83747. ú▀ª-≤ê^σª»SƒûB¡,+ô¼┤¢iûπö)ÖòNFσúv Ω÷╦▀çS@▌59─²âH/▀╥┤╟ï÷+ª┘5µ+»╨w\π4Jóä∙╞╪Oⁿ9»╓àÆ╡∙R]â    d2≈5τΩ╟R∩ò╪É ª-ZX┘eñɪI?3YΘ≤! !
  83748.  
  83749. !ITypeLib2 methodsFor!
  83750.  
  83751. µA3;94çÜ!!=₧¿ÿ+ΦUêû╬┬φ└┌╟■µ¡Vπÿ⌡HGlwµÑ`àZW?bOd    ╢êOi-F¡{~¬«`┘±o@ç╡╜¢⌠█[╫S[Ol╓ƒx!!║φ┴MI▌_╙p║K╣y▐Cæ;"cQ²$ŲLÅVP¡=ôÄ«£Ñ░P¥ï┐Æhε½
  83752. üU9Oª╬ ƒQΓVaí5│÷!!g╣α}╓cb╠ñ╧ù`uº»ó╛≡%╜τtx╕⌠│Do/kE'¥╟$pF╚╪τ╦!
  83753.  
  83754. ╞A3;94çÜ!!=₧¿ÿ+▀±≈·▀Ω≤▐┴┐ƒ╧:Å⌐╔mr\SÆ╔~{ÖIK!!kGc
  83755. ╢ªMG*CÇi@~å¬4√û @Ñ▓úû°╦\æ4Jk ∙ô@rí╦╩\KüVät╛S│y╨σ[=ívÜ▌\òTq╛NQ╣ ⌐ƒÑêA¡>¬╖º<0æΓC@íaw┬╚6╩■Sδb:▀K■τ,)ö¡½+U╧*Ñß├gAÇÜ▄▀╘'Γ┤p¼≤ª.qGP XτHÄ}]& ▀▀ƒáU-/WH┘Ç#çB₧Γ╘½Θm≡·╨Ü┌Ç╨²-ε1ALn╓┬qSΣ±`╬{ZαÜóÆé╙%±!
  83756.  
  83757. µA39 +░½3=╗≤╠-É6σöéªùò■█¡σáA½│┼;/~wα¡|ú8kHFg╢Äo(Y¼wZdÑδ4≥█#çÜ≈▒⌡┼â3M@Ie╬ƒx!!║φ┴MI▌_╙p║K╣y▐Cæ;"cQ²$ÅΦXÄtuá@ ╛°¬µ·ía╛ ô█╔!!Oÿ╨emâN>;îΩ$É▓5ÄR*└YÜ1÷9B∞╘lµCz┴e±█ûMp≤╛╬ ≥0⌐°:⌐╓│4dJ
  83758. uÅΩ>e=ú~≤╝áK[=O ╠Ç#₧_oⁿ!
  83759.  
  83760. ╞A39 +░½3=╗≤╠-É6σö · ┼Θ╘▓¿σCu╛⌐÷z%<╗╞@₧IE>k+&°ùRcf[½yMº┐∩═V$⌐ú╢╓╛Åâ|Q.o▄ⁿy:½ëπve╒æp¡W÷jé∞AJxπ}▀╩QÖf⌐9┌ä╞Σé═σg÷≥╗N*¥─{pΓ_5hûδ0▀╙Sºf*╪|╧τ    `φ╞0»(⌐Vè╒ìy4ö¢╤┌¬F»ßiX⌡ì╪ck }Zr╬<┬%PadâW▌'ï│ol0
  83761. ╖δF╔7h√Ü╕ΣΩh÷«ö╠û~ª≈═
  83762. ╬    ;QR «y∩xKóα=ÇJn┼"╘┴Ñ»φa║°±¼ÖxYäxΣ?├º±╤ GeFj<²;■¥!
  83763.  
  83764. µA3>:;▒é7'«¿ÿ#è1│Ä»┴√┌╓╤■■ªZGσ√╠xzL;╕φ|sÖLS/|Gc
  83765. σ┴Mc*J«y]~Γ≈Φ╠C÷≈┤æ∙█Ö}P.t╥╣- ½┌╒U\åV£5ºMár¢≥V0Σ$╝±t▄mvª?╟╒╨╢δÑg¼£Ä₧y║≡CM¡nX3╦»>█╦WΦEaÄ2░{ÖD}╣╫z╤V|Φ:╜╠░Pf║á ┌∞
  83766. ΦΣbO¡≥ÜuuAo<ëJ≤'YJ\┘$┘â»^N3MX▀Ö;╦FoⁿÖ┴║∩u÷Æä┴èí±└╚!!;RYß<▐<@mó┐l╫#6åoÄâÇÜ═`₧┌╒╒Vµ>╜+╗nà┼╦δ(gJP¢^â≤:Mö8Å}╦
  83767. HLdÑonÖ■-≈Jêå╪xhj╙    ₧▄▄SHφë59▓≤O▀▓ÜS·#;EM╠Σ%4₧b┼íÿ▀ í│⌡÷╟ê┬[╞¼çLRd░É£┘¿nv+∩¼╣└┬e1çÿ?│Ü╪Q┤╩∩;èNwwâ─=∙Lë╥#₧«│S⌐öI╖=┘Θ╖┼>∙⌡£.ÑôX∩│,k*╛±└▀╒    SW▐(┼╗╙y(┘╔≡M╕ΩÉ3▓▐ ·1╢╬G\°2J α╢φô6╖\¥╘éôá─_QU═lTÄ^⌡∞╥oµï ░┐&NBÅZJ3Æ╔Φb║j├üRx'Äï≈╠ⁿΘ5┌<B█mkí═ôº≈jjß╛÷+^πY3iBà?∩v╜│┐22╪⌡╗░KÑτ⌠│cào^∙(!
  83768.  
  83769. ╞A3>:;▒é7'«¿ÿ#è1│Ä»┼≡╙┌═■■ªZGσ√╠xzL┬å-FàwA&~hGy°åDv$\╖n{o«╗ε╠K»≈ºÜατçGJgn▌ƒb<║╠╪M╒ù]½OªNä⌡_H*7∩pÜ╞M▄Rv┐.√ù╧µ ┤aüÿ┐ƒpUεßUW╢r"~Ä ╩═VΘF └S╖|ÜoQδ╬n├VkÇr±⌡ìR{╕½╕ΩΦΦ╙eH¥∩▒`HA
  83770. r;ü▒_y1BU▌┬╩«_-(KIÜóªö·╘╗Φ!!≤¿Ç▌è;▒ú╦Å?R╣∙bZ≡ ¬1ào╢│╢╜Ωd»û·┘Qα3╗gφsΓΓ∞√E|BG)≡#Ü°#7┘Y⌡'╢qzKm╗ iâ∩uΩ!!Y╨εé=XS#"w╪'₧╟╫WçφY.≈≤FæÆ▀K▌%<-{½ÖM82äx¬╗·ß:₧≡▒ª╔ÿ▀M┤]¼övB6⌐£ê_ª@─ #⌠½ñ≤à*äô+⌐ì⌠½≈ⁿc├Pt %é▀╧TïΦ9ïä▓Z₧₧_╖trjΩ└╬·&─Σ¡~┤┤~4½⌠f7╛µ≡╬Ö    bP╪3%╟ô╧FuÉ¡ö#▐ï÷(╦Ç%·:!!╗╥4[■?G∙╚╢╗¥S╧0░α£òßîIO▌sIÜΓ∩╧U¬Ö▀░ⁿhMûIBl╫ªæ|XM├≡ Qc    ╦ÄΘ!!┘ΓΘ?■A┘!
  83771.  
  83772. µA36<:ù¢3=│║ÿ#å,î╛åÄ▀┘╠┬╗ασR½¼╧;vDS▀ü0F╫^V8oBd    ╢êMc!!J▒<@~ú┐)Θ╩K╗≈▒æσÅÆ4R    lr█«tr╗┌┼_]ÖVògεP┐gÖ√<%`0αwù₧M¥@x⌐pôù╫⌡éΓΓ`⌡≥Å<¡≥_q¼inç┴2╙┌LºQ,∙Q╙µ(O°╩}╤r¡U╪╠ÇG|åá±∩⌡å⌡mY¬áΦWBAqz9BrÇ⌠Y]&@╩"├¢┤\C=NI╔┴u╓&í▀π£╝oß¡╧á≡Wªµ┼Å"2>
  83773. ╛OΦ`V±Ñ`├~¼¥┤¥ç╬]₧°─δGτR ╣hΘ╦εΘ╩hhBZg▒'É⌠%Pƒ=Ä[┌6@Ofò.τÆ ┬7]╤Γ°^%2Yn╒/╨█╚Q«ΓQ/ñ┐Hî╝æS█+=B-{½Ö3
  83774. )Ö6╫δ█╤Ö┤°º▐Äσ^æ]│─DE«åè╬8└!
  83775.  
  83776. ╞A36<:ù¢3=│║ÿ#å,╗ö ╧╦┘╓─½≈ïRN║¿ÇkpK^τè7CéZj+c^@1OµéQS(F▓iVDúª%Θ│(iΩçÑùß╬╫9)`v╒╖hr║┴┼oÉ┐w¥W╖iÖΦXLp¿$Æ█MöMp∞:ôå╦≤îâ\ÑMÉÖÖy ║▒@Vúp~å»1╟ƒK∩Do▐Z┘·;dδë¿/⌐VÖεªwAƒÜ╕┴▀╝≡c]╡∞≥-qj\    U&ÅΩ$xLCüzºxπ╚bb)WqÜö!!ÿSÿ⌡╒°≡nΩ╜╦ìè=Çφ└┌
  83777. »0æe6ïèf╒yf¼ÉÆÜë╤Mƒû╔ΘL≤Xp¬hΓ;≡Θ±╬CGN L.╕l■¥D'ⁿ^≥$╢DWKqÆuaü╗&≈&]─«╡9(O
  83778. k┌₧âîù∞N.²┐MêÜìCörU:)/╤⌡(}ÿbü·╘█
  83779. Å╗²║ªß! !
  83780.  
  83781. DATE comment:
  83782. ''!
  83783. !DATE class methodsFor!
  83784.  
  83785. ΦG(XR══'⌐╛ë8┼>í╟·┼Ω╓▌┘╗▓¼PL▒▓├;aMF└ü-WÖKE>gT]+    ∙ô^Mn#▒yPo½╜%ΦÉm┬┌▌≈╔δ
  83786. Æ4Wan!
  83787.  
  83788. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐ì≥├^₧zWga╓╡w7├ú⌐% {∙Câo┐éεH=τeè╥M▄Pq½    /╟Ç┌╫╪·3¢ô¥╙rú⌠T╖tP;æΩ?╪!
  83789.  
  83790. ∞E?w_Qτï79¿¼Å+æ:σÜéªùΘ╠╨▓⌠σ^Bº▓═n~!
  83791.  
  83792. ∞E?8-⌐ΓX@ä߃/ë9í┌Ω█╖║╡╝╫Σñ_V║ßÇ)*å╥k╬s7
  83793. 2V¡∞t0?@╢n@o«¡!
  83794.  
  83795. ∞M)w_Qτï79¿¼Å+æ:σÜéªùΘ╠╨▓⌠σ^J▒▓═n~!
  83796.  
  83797. ∞M)8-⌐ΓX@ä߃/ë9í┌Ω█╖║╡╝╫Σñ_V║ßÇ6%å╫j╬s7
  83798. 2V»┌s3OV¼iAyºº&!
  83799.  
  83800. ∩A0;&(íî&s·¿ƒ:Ç<⌡≈π═φ─ƒ█┐ á    ╛ê┘vqGZÆΘT;╒oV#xZGnO╗┴?Wu1J▒<R*¼«7║éc╕▓┤è⌐Å╫`V.c╓╜~!!Γë┴JXÉç5y»PÑ1╨≥U1⌡l▀╨XæG8∞╩ƒ┴∙└∞3σg÷î¢u ª▒^WΓakÉα#╠╓^≤Do╩P╚Vß(qδ┬k╟Lz╔1╢£éWd╢¡∞φá    «┤tT╝áá`OCtu¥J≈ tñ}á{πƒX~,FO╬ó#èI╓⌠╨¼∙;ñ╗▓╘ù<║∩!
  83801.  
  83802. ∩K0w_Qµ«<:¡¼₧jæ7Σö∞┘∞┼┌█¬▓íRW║√┴uwB█ë;ûL+`ZeΓÇZcf@Ñ<Gbºδ2 ▌G    ╛▓Ñ╨╡óvs²`3WSεÖ@çΣσFÜ╙fêO╣|älû8!
  83803.  
  83804. ±V.!!íë3<╢╜║+ë*ΣÄ»═╚÷φⁿƒ▄æL▒ßÇzC]B╞à<^ÆlP8kZ^+b£Φ\j óo@o░┐z║σC6ëà₧┐┘√\â4].VεâIÜ∞ÇVZ╧V¿CÅqƒ\╛5╝G[Ie╝$⌐Ωf«IæNQ╣√┬└φÆZ⌐#½█ù~ÿ≡[ªikÄε*±╤º@┘K╬±!!d╩╙j╟Cc!
  83805.  
  83806. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  83807. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥▐τ(!
  83808.  
  83809. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]J▒▓╘rrD_╚ü~FƒZ8kXVb≤ô^It/@▒<GeΓó4Θ₧PÑ╕íƒ√Å ÿyfeÜ╡`3⌐╠Ä% {∙Câo┐éεH=τeè╥M▄Pq½    /╟Ç┌╫╪·3¢ô¥╙rú⌠T╖tP;îµ?!
  83810.  
  83811. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  83812. m»g|jmT]x≈Å
  83813. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿirû_.Z╢╩! !
  83814.  
  83815. !DATE methodsFor!
  83816.  
  83817. αW!!=╔σ[⌐¼Ç,┼>≥αµ┴√Σ╦╘│ΓσWB½╛!
  83818.  
  83819. αW8=ù¢3$¬─µC╟∩╟°╔∞ù▐òΓ╞¼^Fî»┴vc╤ï0DÆMP/jUy√┴
  83820. Qcf]ªVc┤«2╜═!!½ú╛ê≥é$s²zo╫╜y;í╟Ç]Iü╙^táε0ÆΦT4εeï╫W¢dú    2╟╥╟≈╒α}¥¥₧ü<á⌡B░a    oïα=₧╨Yº@o╚^├_╜o ô¬½|}┼3╖£òExª½!
  83821.  
  83822. ≈E+0U╬µp┤║¢/ùαö│°≈┌┌µ¬≤¿C ╕╧ueMD╞ü:æMK'.O[nOΣä\o0J▒;@*â¿4≤╚GMÉ┌▌≈╓┌ÜuJ    anÜ╕l&½ëêXF╒N▐l║F÷{£²EF?ítÉ╫Wêp¡|▌ç╬⌠╔▓3ë¢█òn¡σ^K¼ }┬εs┌▐F«mí5╖|ÜU≡╩}±Vo═/±┌æKyùÅ╠█║F╗ßpY½áñ pC! !
  83823.  
  83824. DOUBLEArray comment:
  83825. 'Specialized <ExternalArray> to represent contiguous single-dimensioned arrays of double-precision (64-bit) floating point numbers.'!
  83826. !DOUBLEArray class methodsFor!
  83827.  
  83828. elementSize
  83829.     "Private - Answer the size of the receiver's constituent elements."
  83830.     
  83831.     ^8! !
  83832.  
  83833. !DOUBLEArray methodsFor!
  83834.  
  83835. at: index
  83836.     "Answer the double-precision floating point value at the specified index in the receiver."
  83837.  
  83838.     ^bytes doubleAtOffset: (index - 1) * 8!
  83839.  
  83840. at: index put: value
  83841.     "Replace the double-precision floating point value at the specified index in the receiver
  83842.     with the Float argument, value."
  83843.  
  83844.     ^bytes doubleAtOffset: (index - 1) * 8 put: value!
  83845.  
  83846. elementClass
  83847.     "Answer the class of <ExternalStructure> used to represent elements of the receiver."
  83848.  
  83849.     ^DOUBLE! !
  83850.  
  83851. DWORDArray comment:
  83852. 'Specialized <ExternalArray> to represent contiguous single-dimensioned arrays of 32-bit unsigned integers.'!
  83853. !DWORDArray class methodsFor!
  83854.  
  83855. elementSize
  83856.     "Private - Answer the size of the receiver's constituent elements."
  83857.     
  83858.     ^4! !
  83859.  
  83860. !DWORDArray methodsFor!
  83861.  
  83862. at: index
  83863.     "Answer the 32-bit unsigned integer value at the specified index in the receiver."
  83864.  
  83865.     ^bytes dwordAtOffset: (index - 1) * 4!
  83866.  
  83867. at: index put: value
  83868.     "Replace the 32-bit unsigned integer value at the specified index in the receiver
  83869.     with the Integer argument, value."
  83870.  
  83871.     ^bytes dwordAtOffset: (index - 1) * 4 put: value!
  83872.  
  83873. elementClass
  83874.     "Answer the class of <ExternalStructure> used to represent elements of the receiver."
  83875.  
  83876.     ^DWORD! !
  83877.  
  83878. FLOATArray comment:
  83879. 'Specialized <ExternalArray> to represent contiguous single-dimensioned arrays of single-precision (32-bit) floating point numbers.'!
  83880. !FLOATArray class methodsFor!
  83881.  
  83882. elementSize
  83883.     "Private - Answer the size of the receiver's constituent elements."
  83884.     
  83885.     ^4! !
  83886.  
  83887. !FLOATArray methodsFor!
  83888.  
  83889. at: index
  83890.     "Answer the single-precision floating point value at the specified index in the receiver."
  83891.  
  83892.     ^bytes floatAtOffset: (index - 1) * 4!
  83893.  
  83894. at: index put: value
  83895.     "Replace the single-precision floating point value at the specified index in the receiver
  83896.     with the Float argument, value."
  83897.  
  83898.     ^bytes floatAtOffset: (index - 1) * 4 put: value!
  83899.  
  83900. elementClass
  83901.     "Answer the class of <ExternalStructure> used to represent elements of the receiver."
  83902.  
  83903.     ^FLOAT! !
  83904.  
  83905. OLECountedArray comment:
  83906. 'OLECountedArray is an abstract base class for counted array structures used by various OLE/COM interfaces to input/output variable length arrays, where the array storage is allocated from COM task memory.'!
  83907. !OLECountedArray class methodsFor!
  83908.  
  83909. clear: addressOrBytes
  83910.     "Free an instance of the structure which instances of the receiver wrap
  83911.     which resides at the specified address."
  83912.     
  83913.     COMTaskMemory free: (addressOrBytes dwordAtOffset: 4)!
  83914.  
  83915. defineFields
  83916.     "Define the count field common to OLE counted array structures.
  83917.         OLECountedArray compileDefinition
  83918.     "
  83919.  
  83920.     self
  83921.         defineField: #cElems type: DWORDField new offset: 0;
  83922.         "Although element type will vary by subclass, useful to define 32-bit default.
  83923.         Could use <VariableStructureArrayPointerField> here, but hand code accessors
  83924.         for best performance."
  83925.         defineField: #pElems type: LPVOIDField new offset: 4.
  83926.     self byteSize: 8!
  83927.  
  83928. initialize
  83929.     "Private - Initialize the receiver.
  83930.     Register with session events to clean up sub-instances on startup.
  83931.     
  83932.         self initialize
  83933.     "
  83934.  
  83935.     SessionManager current 
  83936.         when: #sessionStarted send: #onStartup to: self
  83937. !
  83938.  
  83939. new: anInteger
  83940.     "Answer a new instance of the receiver containing a buffer of the specified size."
  83941.  
  83942.     self assert: [anInteger == self byteSize].
  83943.     ^self basicNew
  83944.         initialize: anInteger!
  83945.  
  83946. onStartup
  83947.     "Private - Notify all the receiver's sub-instances of system startup."
  83948.  
  83949.     self primAllSubinstances do: [:i | i onStartup].!
  83950.  
  83951. ±V.!! ░¥'*«Åà/ë;╗ö∙═∞╙┌╞╜▓¼]G╢⌐┼xgAY▄ùd₧Q@#|Hd¼┴
  83952. Xt!!J╖9α¢2≤╚C¡≈·▐╨╩àuJ.aÜ»y ╗╩╘LZÉVòpóG÷yò⌡_F1εj▀╙\ÅQu½|▄£╫∙î┤{ìM├ïåh»≤[Aæt~âΓmƃKµS(╔Kû{ÖDg÷╒8╓JkÇ)░╬èEv┐½╕·σ½µi^╝Σ≥%R]&n╕+╤3BlàW█ÿÑ\~? Üû&ƒRBé°╘°∩qß╣ê╦ô;▒ú╟┬2R ║<ázKτ╢l╥36åoùÅùç═Mÿ┬╠ΘLτ\]╨╚>╒δ²╥H}N@2 w╜°9`╦t░X┌
  83953. SKgâ bî°>ú*öç≈C4(Drσ╠╟┌PƵj│·Oû¢ûS╫#6|¿¥Nj.ö`æ╗┌╙Ñ╣┴ñ┬à▀lêJ╡çQp-Ñ₧ïIï<¼pbΦ╜≡╟╦;xàƒ/│ü Z■╣≥'çIb$Mê▌O╝Tÿ≤0ë│!
  83954.  
  83955. uninitialize
  83956.     SessionManager current removeEventsTriggeredFor: self! !
  83957.  
  83958. !OLECountedArray methodsFor!
  83959.  
  83960. asArray
  83961.     "Answer an <Array> containing the constituent elements of the receiver."
  83962.  
  83963.     ^self collect: [:e | e asObject]!
  83964.  
  83965. at: anInteger
  83966.     "Answer the 32-bit unsigned integer value at the specified index in the receiver."
  83967.  
  83968.     ^self elements at: anInteger!
  83969.  
  83970. at: index put: value
  83971.     "Replace the value at the specified index in the receiver
  83972.     with the argument."
  83973.  
  83974.     ^self elements at: index put: value!
  83975.  
  83976. basicLength: anInteger
  83977.     "Private - Set the length (in elements, not bytes) of the receiver."
  83978.     
  83979.     self cElems: anInteger!
  83980.  
  83981. cElems
  83982.     "Answer the receiver's cElems field as a Smalltalk object."
  83983.  
  83984.     ^(bytes dwordAtOffset: 0)!
  83985.  
  83986. cElems: anObject
  83987.     "Set the receiver's cElems field to the value of anObject."
  83988.  
  83989.     bytes dwordAtOffset: 0 put: anObject!
  83990.  
  83991. elements
  83992.     "Private - Answer the receiver's <ExternalArray> of elements."
  83993.  
  83994.     ^DWORDArray fromAddress: self pElems length: self cElems!
  83995.  
  83996. from: start to: stop keysAndValuesDo: operation
  83997.     "Evaluate the <dyadicValuable>, operation, for each element of the receiver
  83998.     between the <integer> indices, start and stop, inclusive with the element and its
  83999.     index as respectively the second and first arguments."
  84000.  
  84001.     self elements from: start to: stop keysAndValuesDo: operation!
  84002.  
  84003. initialize
  84004.     "Private - Initialize the receiver (common to internal [value] and
  84005.     external [reference] buffers.
  84006.     These objects are finalizable since they may reference owned external
  84007.     resources."
  84008.  
  84009.     self beFinalizable!
  84010.  
  84011. length
  84012.     "Answer the number of elements in the receiver."
  84013.  
  84014.     ^length := self cElems!
  84015.  
  84016. needsFree
  84017.     "Private - Answer whether the receiver requires freeing of any external resources.
  84018.     In most cases we don't want to free if this object is a reference to a structure
  84019.     embedded in an buffer, since that would damage the buffer.
  84020.     i.e. it is considered that 'reference' structs do not own the underlying structure as
  84021.     this is what is required, for example, in conjunction with StructureArray."
  84022.  
  84023.     ^self notNull and: [self isPointer not]!
  84024.  
  84025. onStartup
  84026.     "Private - The system is starting. Modify the state of the receiver to account for the fact
  84027.     than any external memory allocated for the receiver during the previous session is no 
  84028.     longer accessible."
  84029.  
  84030.     self beUnfinalizable.
  84031.     self isPointer ifTrue: [
  84032.         bytes := nil]!
  84033.  
  84034. pElems
  84035.     "Answer the receiver's pElems field as a Smalltalk object."
  84036.  
  84037.     ^(bytes dwordAtOffset: 4) asExternalAddress!
  84038.  
  84039. pElems: anObject
  84040.     "Set the receiver's pElems field to the value of anObject."
  84041.  
  84042.     bytes dwordAtOffset: 4 put: anObject! !
  84043.  
  84044. SAFEARRAY comment:
  84045. 'SAFEARRAY is an <ExternalArray> class to represent the OLE Automation arrays.
  84046.  
  84047. SAFEARRAYs are a flexible representation of potentially multiple dimensioned arrays of almost any of the Variant (Visual Basic) types.
  84048.  
  84049. SAFEARRAY has similar behaviour (and indeed implementation) to <StructureArray> in providing a means to map externally implemented arrays of values to appropriate Smalltalk objects (mostly from the <ExternalStructure> hierarchy).
  84050.  
  84051. Note that the reported length of a SAFEARRAY is actually the length of the rightmost (least significant) dimension.
  84052.  
  84053. Instance Variables:
  84054.     elementClass    <ExternalStructure>|<BSTR>. The variant compatible external type of the elements in the array.
  84055.     data        <ExternalAddress>. Pointer to data of array, when locked.
  84056.     owner        <Object>. Object responsible for freeing the SAFEARRAY. Typically self.
  84057.     start        <integer>. Lower bound of rightmost (least significant) dimension.
  84058. '!
  84059. !SAFEARRAY class methodsFor!
  84060.  
  84061. ΓH"'bΣÄ6-¿¼ƒ9¬-├═√╔φ║╡╝ⁿ╘╖VF ║╬;zFE╞à0QÆK,.O[nOσò Le2Z▒y}¬ó#≥₧K╗ú╢É⌠╩^ÿrfeÜ«h1½└╓\Z╒üe├)▀jÿ Y=≥m¢█J▄C`∞4╓╥╨µ╔úzÄ܃╙} ¬πRW▒.HΦéY╖├∩So╨2░√?!!úÜ8φnKß*Ñ≡èFf▓╝ß╛Σ«⌡uP¡áí `gGg+¬≡"~V
  84062. ë╔ÿñJ~Qn├ò*ÿoⁿÖ┘¬╝=ñΩ┴─£┤∩┌ òE 5░z┴A5ï≤@╞-OΣ▐Çü£▐Q█▀╓ªO±5╢rí?╩Σ≤┌
  84063. )[L3▒6çπ(hü ▀Z╨XTLoëck═≥!!ígO5└░»
  84064. qc*NΘ?ß≤δv'╣╩oÿ▄b║▒▀*┤EQYF%╨σ!!Y}ⁿ■Æ▒ΘLƒ┐σ÷╚º─\ùKαÉJu∞╥Ä╧j╣jc╗╜▒┬╔dÖû#ñâ▓9{╔ôÆ@ΩAt3é└╙R╗°#ë┤²P¥öUº /à»┤─=ï░╚~åÆ^\íσA    N├¥▒├çY èr∞ÆΓ_(τ╔ⁿX¥⌠à)Fº┌2Σ:}╫┤!!âR-æ╫╗τ╪z╧'ó∞ÑÅ¡╥MÖe
  84065. _îY⌡δ∩U4≤Å╔╖N█B k≡2/OäÑäm*»{╜─Q}Æ▌º6▄Ω≥>╬ b╟[w¡▄└¢Y│-╧╜ñUh>åBzqEQ╬*Θ%¿ºâ2,ê╟∩«C╣τ╒ aJåfY╝J|ΘTZ V╥;φá╓>#ⁿLS▒}_ç║6e⌠╛⌡·╫H&SZ/M∙1⥡▓≈}╩»╧¿¡ßgÉx#bG·╫»L∙╞∩├nπ─8,<▌=εçh&▒▄╢≡n╖û¢£\│!
  84066.  
  84067. ΓV"!!=Æè1=╡╗╓jë:∩²ß╪√╨┌╟■Σ▒    ⌐»ΘugMQ╫û~WÅKV+4C}*εò X&K%╩>cx½╜!!ε█MΦû╣ìα╩^û4Ngn╬╣r║╞ÇX¢äVc½@óréA┤BF?φa▀┌PæGz┐    3▌ù╟┐í╩╗,╣╛▓N=Å╚Kñ sç» ╬┌\εG&╔[Ü·7d╣╞v╞k╠:╝┘ìP4º╖Φ√¼F⌐°lS║ߪ,<    rܵW]jΦ┘çáMd3M ÷ê-Ö[Å╛æî⌠dñ╢Ä┌ƒ,⌡ß╞┴wC╕y·aS÷┤mÇyT¼k⌠Φëï═G█╨╩⌠≈=¬j⌡:╟ε⌠╓_)X]5▒▒╣o√Y⌡'├X@Lpæer═τXëc$R█╡ΩEq`YQ·? ╟═hé±]8«┐MÜô₧R╥8x=*x½ÖM<ùi╢Θ╩╙Å¿⌠╖▀IJZƒL»û`N~αä¢:┼>¿ec
  84068. û╘┘º¼V}╗ÿ#▓å⌠Q⌠öæ@Ω)4(ï╓∙Nì≥m╠½╕ZúòSª?ε├╬¿@╕αåÄôX╗⌠r▓α╩╩█t;-╦48╫▓╤
  84069. 5╪εδFɪ±+╦╒5<·;1α₧"âR-├åÅ∩█T╧!!╢√æòñ╤K▄$
  84070. TÉ≥╕╦I²██¼ ÷!!]BƒZO*Æá╬(    »wè─g
  84071. ╦äµ;╘«Σ4╪ █vz∙╦╓▓╠>nΦ√╠tY┐b1
  84072. ?»Fä ΘáÖ3~╠╔¬▒L∞⌠ÉîjK&àp_┘WhªG}┌"φ╗ƒlE\╓26╒v╢╜;lα╛⌡·╫H0S    I■}ö£²»ú>╤∞╢iü│÷$╪7aes▓Ä╫0²Æ╝∩U┘╢/°)"#⌡Æ{d«╨Kw▌òg┐îV▐å!
  84073.  
  84074. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫le KzaY.╧┴Mt3L╖iAo∞╞Jù┤+i¢ûæ╗╓².?«4]cp╙░h½╧╔WAü£;├)█∙h∩E];⌡$¼ ╣cF₧!!ôë«£Ñ╔¥îÆör
  84075. ¬▒DL¡r;ü╦:╙╠Ä(FÑ6òY│t⌠┼}╨a╞╡╒ÄAzáº≈≡≤Fí· H▒σ≥ wGLf [τc÷#xH^╠ìé«Ky|Ej▀Ç;₧Hà½╕╤òì⌡╬ì╝2┤Σ┌dÑl^b»u√q[ó╜f╬j∩╗ìûâ┌FÅ┼₧Å+¥{⌡+─?└Ω²╤zFLP¢^·₧8ké=ÿ@┌Nlêg Ä╫:α6í╦å>XuYR┘╒Æ┌KÄ≈1@▐û ëÜûC₧we!!ê░4Éxûáÿ╗g┼╙ÿ∙ä╦ΩMÄY╣─AW0í σzóC₧C@=┌îé∩ⁿ^ó┤τÜ≈Gª÷ε'ç{!!
  84076. Vε║|│┘╬9ëτ┐[ƒòCπ>├¼ª┬!!æ⌠Ö3ôëYε║bM├Θâï╫t;)áS8┼╗┼'Vó⌐·OÜ∩Æld½┘? ▓nw╣·}E∙R-∞▌¬ΣçΩæ╤╢êñ╤N▄e
  84077. tÉP ú¡-âƒ╔ó╕-o £WB|╫τäN╗p£╥+vÄ▌º≈▄─╘A╤9|╝╪╫ë╥h%î╥ìBy1â@?[CW╔+╖%Ωóò2═╦¬¼V╕ë─ªZP─G|╙w^Å\K8Wƒ9ⁿ▓₧Q    =Ñ1╓vî½8iΦ√╓ß╘^0S$d°rÜï╘g┤·-╞X¡å[εù╫┼=&εµ╝]╙Æúß ª£tv⌠!!*!!∙«sc«╤_Z⌠∞OÜâ@▓²Zùç[╨┼â'o∞6^╫!!8ùp┼¼kN,╙¥£┐Γl¡DB[═∞nöÉÿ,₧▒O'aXτ╬
  84078. Bgç┴ó)%╝ E +6IJ ≡8@░ⁿjⁿ╤ùQòB╧µF╗H▌LWΘæV╪▄⌐╥≥6üû6yAMä╩ååh»░εl╪Ω(╝{ì¥║çÄp·}N₧å╣┌ñJ╬«+ⁿ£╤g╓bé╡╩!
  84079.  
  84080. τV(<á¥7:⌐≤╠:û>í╤π╔≤╥╤┴¥■ñ@Pσ√╓zakZ╙ù-ÿHJ/|jΣÇvq(J▒9αè.Θ╔GΦ╢≈É≥╪\ÖgJ`c▀ⁿy:»▌ÇIG£ç5║L÷iÿ╝bn/└V¡ `▄C`┴jU╟Ü╞╢═ñwÜîê▀<╜≡╡hxè»0╤╤KµH!!▀▀÷ d≈╙kéMhÇcº▌æMu╜║█±φ⌐αi^╡σ∞gh EY
  84081. u!!┬J⌡"RCQ┌âQ╩òQh|JB╔ò.àY╓τ╪┤≡!!Ω╡òì£,░µë╟w╣<²f^√±h╘-K ≤δ·¢╤D₧┼╓ªVⁿp╗y≤2▄╚∩╤T)F    3°;▌╡@ⁿ^÷pù TRfö fƒ⌠8┬!!N═▒ⁿq*Y7╗p╖╗▄HìµR>ö≤Hîå┼╚-*sL╤πnW°ÿ∞╓╫÷·≡ñ┘è╥pïVÑû;N╔√û▐8╛gj!
  84082.  
  84083. τV(<á¥7:⌐≤╠:û>í┬√û╛┴▐╟¬δ╡V░¼╬~a╙û,SÄpS$kI>f┤áJq#]π}dº╝`≤╨Q⌐╣┤¢╖█â4Ngn╬»-&íë╘QM╒%▓0PÅqä\⌐A²E"cQ⌡lÜ₧XÿFf⌐/ƒ╥╙σ═∞3ƒûÿ¢< í CE½n;çπ6╙┌Q≤Ro├YÜ ≥?h°╔léVw╨:²▒Θ-b▓╝∞τ≡µ┤TT╝á╗qG[crÖ∩p@Dë▀ÅßMe9_█ç*╦[ä±╚°²uñ¬Æ╠≈T▄÷╟╩$K ╣<²f^√₧~╬hI¼ì┴¥ç╙┘╗»ï(¥,#┐gτs¿ìæ╢TfB'M9π2ÇΣw%ü'₧▓r(+fèemê⌡!!└$O█°»x0_°.₧╤╒Eô┼S8ü╦▀â₧U╩5(U    |¿ÖM *ƒiàíÿ╙╛╗ΦÖ▄à╬M!
  84084.  
  84085. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A%b£Φ,\a/\╖yA*╡ó4≥₧Q╗ñ╛æ∙ÅÆzJ.t╒ⁿn>½╚╬]àVÇwπJ╕nä≥RJxεj▀═M¥P`╣|╥£╟╢╔╕z£C≥±·e╟ÿdeäE+I░╬
  84086. ₧╓QεU&═S╙ ÷@ Éà¿/⌐ ┤╧ÉM{╜â∙≡ß¡µ _¼≥á q8a[Öµj1 C╠▐à»jy=QX▀àBß3kà⌡▀╝ª!!º╡Å■Ä?º≈▄óo^b µ<∩
  84087. xY!
  84088.  
  84089. φA)!!0■╧>,┤«ÿ"┼:φ╤Γ╔≡├ⁿ┘┐ß╢    ║╖┼vvFB±ê?Aä2.C,z]x≤ô^X&(J┤<Eoí┐/Φ₧
  84090. í╣░Æ≥ÅÜqPgo╘╣i{ε┌┴_M╒üt╖óuæ╝<%`;εjï▀PÆQ4≡    2╟ù─≤▐■?╚ÜòöhΓ▒RHºmuûⁿs╤┘≤X?╔Ü (lⁿ╔lßNo╙, ▒Θ-@╗½╕≈ε╝⌡n_╝áádTQ&;ܵNCë┼╩«Nc9Q ╒çoƒR╓σ▀╝∙sΦúê├¥S▀è┌╔w
  84091. ╜e╝z[óª`╠aΩ¢ä╙ç╦ö╪à⌠G≈9¬í<├º∙ƒY@{J    0⌠$Ç÷*`▌t≥$╢Svûon═²<φ )U╥ú√^>4Yk╪█┴╩ƵJ#╕ΩZôî▀T█",AQü⌠!!<Æd╫÷▌┴¡╜⌠°ëµí2÷1₧üIS)Ñ£¢0╟+╛q&■⌐â∩πPÑ¿₧╥░X¬■∩!!!
  84092.  
  84093. φA)!!0■╧1&»ºÿjÇ3Σ┘Ω┬ΩΣ╓╧╗¿σQZ½╛╙!!Γû7DûKAj#reßä gfAªkc¼╕4√╨AΦ╕▒▐π╟^àq]gv▀«-3ó┼╧ZIüùV─*ítä    ╝B_;Σ$Ö╤K▄}ó9╘ù╤¿ÇαpçæÅ▀<
  84094. ó⌠ZA¼t;ìΘsé╓Q≤D(╔MäZ│/xφ┬kÄ/⌐,╕╞å
  84095. ┘╟╤≤≡
  84096. ¡∙eR¡ßªk{r7╘J╫51\Y╙ìÖßPj2L^▀àoèT╓Σ┘╜╝oß¡┴─ö-íΓ╟
  84097. ╩h]b ░x∩O(i├â@ßCo▓╨├■Σ▓"≥Φ╓πN≥R<┐eµ'═╜╕▄Sg[FL1⌠:û∙9F¥5î]àXwcQ»AN╣!
  84098.  
  84099. φA)!!0■╧>,┤«ÿ"┼6∩└Ω▐°╓▄╨¥■ñ@Pσ√├t~aX╞ü,Tû\A    bZ@xb£Φ\xh5XªnkΓÑ%φ₧K╗ú╢É⌠╩\æ4Jk ╚╣n7º▀┼KüÆ5íT╕n╨╝SZ>Σv≥┤0ôD4┐:╒¢└ ╔«g╚ûüû<í▒TK¼t rî»o╫╤KΓF*▐ûV (o■╙pÄg╬+┤╬àEw╢εΦ±Θ╝±rO≈ì╪c6mCh!!Ü φ51]U╬▀ÖßPy/F@▄┴.ÿ₧⌡æ╖δoß¿┴┬£~íδ╠I┌ 3Ñu≥5ïóh╞hφîÇè╬▐Fƒû╥∩N°R6¿nΣs╠≤╕╨{JL4ß#╙°+%Ét▄H═Dnâssîⁿ0»JH6í¡²$*E>╨╨╙╒Mü≈U%╣│    è¢ôB═?x@R╘∙+.¥u╫Φ▌▄∞╗▒⌡╧Ä▀^ƒPαë@E7íòè]ëG╟ qτ■ª┌à>äì)╡╚∞9{═∩∩i┘04è·ΦEïτ6Åó₧XïêTπ. Nε├╬└'┬τò,╓▌F≥▒bd⌐µ▌╩ügA╔.$╥φâF9┼╟ΩB▄≡ê3┤╚s≡:&╗ä4Kσ6m÷╨┐≤█Z▐0Ç∙æÆ▓¥OXù    d2ƒR⌡∩┼UV∩ù╔⌐╕<jÿHU|╫ºìe"½pƒ└ALèö⌠y╡äë▄^┬||!
  84100.  
  84101. φA)!!0■╧>,┤«ÿ"┼-Σ╫α▐·⌠╙╘¡ß Q║╕╧iwkZ╙ù-?²6 `HDn╢Ç^Wc1¬r@~úÑ# ₧MΦú┐¢╖▌Æ}H| ╬┤l&ε╞╫W[╒╙`¿E│o²kò^II+⌠bÖ╫ZòGz╕@/┌ê╞╢╪»3ïæÅÆuε¡^J╢e~É▒₧╙ZΘF;─ܲ9dδ┴y┴G.╨0╕╥ùAfáαòöë2á± U╖≤ª fCc5Åτpx[C╠╦Qï▓y4F ╒û!!ÄHBÖ÷æ¼⌠dñ»Å╔ƒ,╣·└╚h]b║y╝fMπ¿)┴c_¼ùìƒ╬┘Z₧╙à∩V┤>·yΣ0└εΦ╦ZIo    ~≈%û≥mhö'îO╪∞    oƒ╗ ≤+╬½ßV=3Pj▀╨₧ÖQîµO9≈∩[ÜâûH╦?4I╟■0C<╤/ô■╠╙ñ·ⁿ│╪ÿ╩XÖΓΘ/;N╔Ä╧┼9║gtXτ╙┌º─1bǃ>τ╥¡í⌡²iÇRu6éσ Tû≤m╠½╕ZìÅOπ. Z├ƒô■⌠╙┐ ▓╟O⌡ª>d╕±█─çrH╦)8ÇÑ╞I3┘─╫DÜΘ╥(╦▌= +&·█xMτ>J∞τ╢α╬Hçu▒≡ôÄ│┘<J]╩w@6⌠5╪∙╬T∩ë!
  84102.  
  84103. φA)!!0■╧>,┤«ÿ"┼)⌡Ä»┌Ω║╡╝ⁿ╙½@T║⌐Çz3FS┼─7\äKE$m^d    ╢ò\&4JáyZ|º╣`ε╓CΦ╕áÉΣÅ^òaXkr╖╓=¿ë╙LNôÉpáW÷nÖ∙[xΓkæ╩XòL4≡    2╟ù─≤▐■?╚ÜòöhΓ▒RHºmuûⁿs╤┘≤I*îI█·,oφçl█Rk¡U╪╒çAzºº■≈σΦ÷y¡Φ╖J^lHAa7£Tú"vZ]╠┘]╩╖M#Q)%εë*╦S àΣ╨╢ dñ¿ä╩¢,▒≡ë█2C╜o╝|Zó╛~╬hI¼    ÿ┴çå┌Ä╪┴πP° 9┤lîY¼⌠∙┘h]H$▒6¥≤mrÿ8ô┘
  84104. DG#Åt é⌡u±&Y┴▓√><
  84105. >ò╠╫▄ à≡O+░·▀°⌡.╤>xEP╠░"
  84106. 3É`₧ß┘╞ú┤╜÷▐à╟ZÅKαöWS2⌐¥Ü╟3φqc∩■▒Äå;tâ¢/»╚²Q╖°ⁿ,═]`φ║+∩Eòτwß═╘=å₧Iñ,Z├Ñó╧.┼°²T εO
  84107. Σ╣
  84108. j0ë°┘╪åC ⁿΘûφ~|╚╠ YÅ└ô{tûåsⁿg!
  84109.  
  84110. φA)!!0■╧>,┤«ÿ"┼)⌡Ä»┌Ωù┌┘╗ á]W£╖┴h`╫ê;_ÆQP    bZ@xb£Φ\it/YóhV*∩δ⌠═U║≈╢▐∙╩ ^₧zMon┘╣-=¿ë╘QM╒ûpºU│o╨⌠P[I7÷jî₧X▄@a¬9┴ ⌐ƒ├ª3¢Ö¥Ü½ C▒i~┬√<₧▄PΘU.┼QÜJ·#uⁿ└}╨"Ç3┤╥äP| ε²≥σ ¡·tO∙∩┤JmCg ç φpeV@╠zºxâÑ\c(JJ╙ä+╦X╓Σ┘╜╝=φ┤ò╚¥;º╜ë▌"¿0╝`óàa┼-^αôä¥Ü╠Ü─└ªM≥R$▓ní ╤⌡φ▄S{Jk#T≥;ÆΣ>)╤1ôK╥OV@èas₧╡wÄ`H6í╛»V?)]lû│╕░Eô⌠Y8≈Ñ▀åÜK╪l;BE╓⌡>àcàíÿ▐ ó╜σ╛ï¥▀▄N┤─@N0▓ô╒S┼#í, rÆ┐╛▌╥:c╫ƒ óà⌡Zç⌡·:É02é▐≥T║φ6ƒ┤≤9α≥yó6 å╗!
  84111.  
  84112. ∩A08 >óè D╨└╬ ï,÷╤²î ù╤╨⌐▓¼]P½║╬xvY╘─*ZÆV/m^Z}
  84113. Σ╧s3B│pVgºÑ4√╩Kª≈Öæπ╩F^ñUx%ORΦ¥T!!ε╚╥\çòg½M╡x╨≥]VGzî≥┤0óQqá|▌ù╘╞├⌐}£ì!
  84114.  
  84115. εJ4*░Ü"D╨└╬ù6≈╒√╔╛܃≡░ß░AF ║╠w3\^╫─,WöZM<kIxOσöPh5[órPo▒δ!!Φ█    ª≈úû≥╞^öx[` ╔¿l&½ë╧WåÆa╗S█∙²EG *ípù▀W▄C`╕1├å╩°╦αgçMèêû<á▒XHª zäΩs▀═MµXo─^╘·#f╣╞j═W`─╖╬îI4ºª²╛≤╗τsU╢ε≥gh Q]hrܵW9|NW╠W┌ÖßJl*FHö├Bß7h π╘┤·!!⌠¿ê└╗2╣╨▄ ╞ $┐y∩OpP╕±RÜd≡Fù┴£Ç∞\Ü─╤≤R╔\!
  84116.  
  84117. ±V.!!í¢:&╛ê₧-É2Σ┌√û╛╓═╥É≤¿V║╖┼vwME╤▐~W¢ZI.kHP+°àKc%[¬s]y°δ)⌠┌K╗≈╕É¡Åàs[
  84118. │■] º▀┴MM╒[╙1páFñ|ä╝PAI7⌠pÅ╦M▄Cf½1╓£╫╢┼«`£ æÅÜ}º■Y▒t oçΓ6╨╦ΦO;├╬÷m=Θ╥l╓Cl╠:é╚æAu╛≡┤╛ìl┴αaN╛σªFBcIGKr:ïJΓ7dBU╟ìÅ▓Z5AI▐┴-Æ₧⌡æΣ┘M┴ùÑΦ⌐δ»ë ├:GR▓x╝ qLßú`╨yT■J▐àû¥▄┘╗»ï(¥<┐fσ6╓Σ╕╓    og"l T°1ºσ8`╦tñ¥1Gjê oƒ╗<φG*I▄Γ√_44
  84119. k┼₧┬╪W└Γ)╕±_ÜçïB┌l7RJ┴ΣfnW°■╕╠▌
  84120. ú·│à╬ƒïKö]αüIS)Ñ£¢0╟+╛q&²■ñ╞└bû£)τëΓF╜╣°&æRu4ï╩J╛⌠ï^σ╬⌐Uÿ£B╖x¢╜ù╘=≡ⁿ£d╓åX╧╡aΩ·▌╙ü)DPδ6'Ü≈ä
  84121. =╪≤▀l╣╟«[c¢¢eéG]│╪RIµ(Aóäüíƒr█uó√╨Ä┤╔SHÖkWçτΩ╟R∩ò╪ΦU╕-L┘ZHf₧¬æ|
  84122. ½"û╟g
  84123. ╦òΓ4▌τ÷>╧_Y┌9l¼▀╒ú₧evjª⌐ßUi;₧ W#;¼;∞w«ñâw.┌╧í╢δ≤╒│iJèfSΦuo╜tB8    ƒl╣╜ƒi7>╡QH╣jX╡!
  84124.  
  84125. ±V.!! ░¥'*«Åà/ë;╗ö∙═∞╙┌╞╜▓¼]G╢⌐┼xgAY▄ùd₧Q@#|Hd¼┴
  84126. Xt!!J╖9α¢2≤╚C¡≈·▐╨╩àuJ.aÜ»y ╗╩╘LZÉVòpóG÷yò⌡_F1εj▀╙\ÅQu½|▄£╫∙î┤{ìM├ïåh»≤[Aæt~âΓmƃKµS(╔Kû{ÖDg÷╒8╓JkÇ)░╬èEv┐½╕·σ½µi^╝Σ≥%R]&n╕+╤3BlàW█ÿÑ\~? Üû&ƒRBé°╘°∩qß╣ê╦ô;▒ú╟┬2R ║<ázKτ╢l╥36åoùÅùç═Mÿ┬╠ΘLτ\]╨╚>╒δ²╥H}N@2 w╜°9`╦t░X┌
  84127. SKgâ bî°>ú*öç≈C4(Drσ╠╟┌PƵj│·Oû¢ûS╫#6|¿¥Nj.ö`æ╗┌╙Ñ╣┴ñ┬à▀lêJ╡çQp-Ñ₧ïIï<¼pbΦ╜≡╟╦;xàƒ/│ü Z■╣≥'çIb$Mê▌O╝Tÿ≤0ë│!
  84128.  
  84129. ⌠J.<,¡Ä> á¼ß@∞ Σ╟ⁿ┼±┘≥╘░≤óVQ ╕╒iaMX╞─,WÜPR/KMVeσ╡ Pa!!J▒yWL¡╣z║═G «!
  84130.  
  84131. ≈PJp\zàü!!>┐╗╠>ì:í╞Ω╧√▐╔╨¼╡╢U╛⌐╔z}\╞¥.W┘p"kRhπÇr?_ª<\lΓó.Θ╩C½▓ñ▐α╞╫4ije╩╣c6ε╞╬\¥╙y½N│säAΦH_ tífè╩òV4╗    0▀╥┬·█íj¢MûòÉp¬⌠P¬i;â²!!▀╞ΩN+┼Y╙ßc#ö¡¿+P÷ IJ▒vUè!
  84132.  
  84133. ÷M34¿╒r'┐╛⌐&Ç2Σ┌√▀╛╥╙╨│≈½G`│║╙h)@╙û7SÖKg%cKR⌠ìzj'\░9αè.Θ╔GΦ╢≈É≥╪\ÖgJ`c▀ⁿb4ε▌╚\çÉ|╕Fñ=ô≥EN6Φjÿ₧XÉN4ú|╟Ü╞╢í╩ìÜûûr╜▒XBΓt~┬│0╤╙SΓB;┼P╘H│#dεΓt╟Ok╬+óÉ├S}ºª╕√∞ѱnH∙⌠½)+?bp3£Γ$R@]┘┘ê¡\N0B_╔╧o╦{ ╓⌡├¬≤sñ¡ê┴û~╖µë╬ $C╡z╝zFó╛oÇySΘF≤δ·ï╙Mû╙╦≥Q┤6·eΣ$αδ²╥H}\FJ< 9£πmgötìK╧
  84134. DQfêteë╗7·J*^┬º∞C"W pq╨Z▌▐╪W└⌡]8╛■Gï╢ÉJ╬-,YB╟╙(.é"╒û▓┐d┼ª▒╖┼ÿ▄ZÄ╝Θ/?%«üÿ┘j≈?& ■▓╢Ä╔:ÉÄ$²╚■Qü⌡■$åNd$Mö┌∙£φ2üó│@⌐ùF░+E@ò¿╡╚(▀Σ│1¢ùKΦ╢aª⌡╦╪█t;-─?<σ╗╞G9┼╘φ
  84135. òΦûlA╢åsY¿':«╤.╤aM╕₧┐φ╪V¥)π⌠₧Æ╢╪]═>NR▐L≤∞ܵ₧┴ΩU┐hB╚fK²═╝i½p! !
  84136.  
  84137. !SAFEARRAY methodsFor!
  84138.  
  84139. ▐@"%=¬╝:(╢Ñâ=ª0±═╡î²█╨█╗▓▒AB╢╖Ü;pGF█ü-v₧\P#aURy¢δwV4F╡}GoΓµ`▐█G¡╣≈è ╩\àsKkn╬≡-1ó╞╬\╒¢vª┐n╨╝BG4φkê₧ZôRm∞:ôå╦≤î▓vïûìûnA├¢>e¼s~É»'╓┌πD*▄Z╘≈mr±╞t╬MyÇ<╛╠Ü
  84140. ┘╟╤≤≡
  84141. ¡∙eR¡ßªk{r7╘J╘pJU═W┘╩«Oh.QE▐äoƒR à░╪╢╝n÷╛ä▀┌*║ú╩▌2Ñ<°
  84142. qOτ┐)¡2°¢┴Éü╤\₧╪╤⌡²#«j∩0└ºε▐OhM
  84143. L}≤.╙⌠"uê=æIƒ IG#öefêΘ0φ     Xêæ╬qx+_∩T£┐│)lΘαP%╣·    ¥É▒R╥ _I╓⌡6MP√╕╫²≤╕û°┤┘è┘F▄\ÑéDC(┤╥£═/îptΓ¥┐▐▄e1䃠í╚αDÑ÷ε=┘s;ë╓[æ*≡▀4Ç¿│Q!
  84144.  
  84145. αG$&+ÇÄ&(╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√╘svW╓Ç,WäL%hGc
  84146. ╢àMgfM╢zUo░δ)⌠₧Uí┤┐▐π╟^àq]gv▀«*!!ε╠╠\EÉç─*╖oòA∩E@=σ*▀ΩQòQ4⌐(╥¢╧σî¼|ïûòö< íµY╢h;Ç·5╪┌M⌐Bª2░∩mq∩πy╓C.▄R█╡ÉAx╡ε∙φ≤║α:éΣ│%OF%s>é7¡zZ_Fφ┘╩√-[X▀ô!!èV#Æ⌠├╜∩rñ┤ä┌╘S▀èµ%Ω$">
  84147. ╛n²mµ┤o┴xW°FìÇòï■Zë╫▄╟A≈#⌐Oα'─╜╕╠JoY+╒6ç÷w%ü"╗O╦/    ∩^p¢▀4≈ !
  84148.  
  84149. αW'9╜ΓX@°êé9Æ:≤öε┬╛ï■╟¼≤╝╝┤╬orAX█è9âWAjmT]x ò \h2ªpVgºÑ4Θ₧MΦú┐¢╖▌Æ}H|.ÿ╤_─á■JMÖ╙zóO│~ä[╝j x²$Ü₧XÅmvª?╟»!
  84150.  
  84151. αW?=º¢_C╙δ¡$û(Σ╞»╪÷╥ƒëæ≡»V@½σÇmrDC╫─,WçMA9kUGn ╢âr.JπnViºó6 ╠/j┴ ╢É╖ô= àuG^.o▄ⁿ1¼├┼Z\åH┌X7├)█∙?∩TCxαw╛╠K¥[!
  84152.  
  84153. αW;à╜â─µC╟∩╟°╔∞ù╦▌╗▓ûreÜÜ≥IRq└ü.@ÆLA$zZGb°┴_&2Gª<Aoí«)∞█PNΩ┌▌≤¥ª"ÆxX!
  84154.  
  84155. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣n╕│(m┬▐ë¿╓²5?╣@kw╖╓[»█╥XQ╧VÇy¿╡rǺ<%`Q°kè╠JÖNr┴j!
  84156.  
  84157. αP}Z<6áè*D╨└╬ ï,÷╤²îΩ▀┌ò╗■á^F▒»ÇtuB┌ü~@Æ\A#x^A+Γ┴
  84158. Qcf\│yPcñó%■₧    ªú▓Ö≥▌B^₧zZv.╖╓╜┌╒TMåVçt║óuòAεTL 1≈aì₧PÅu∞5▌ò╧≤üñzàæêÜs½⌡E░r b╬»:╪ƒQΦUo═Q╖|Ü(sδ╚jéUg╠3±╬åWa┐║╢╝ìl┼₧    b¬σ╛ B`JPc<Ü)∩#bQ▌6╔ÿñJ~f_▀ì)╦Xà⌡æ≤╝)¼│Å╔ƒ&⌡«ëXåE}K░z╝
  84159. xZ∩┤g╘^R÷╫!
  84160.  
  84161. αP}Z<6áè*i¬╝ÿp┼)α╪·╔ô╜╢ùì≈▒W╖╛ÇmrDC╫─1T╫KL/.^_n≤Å
  84162. i ╖tV*░«# ╫T║≈╢è╖█╫gNmi▄╡h6εò╔W\Éû+εJ╕yòæ;&7ípù█ÅRq»    :┌ù╟╢┌í¥╙█ät¡∙I╖s;ÇΩs╠┌O⌡D<╔Q╬±!!d╣┼aéVf┼┤╨åIq╜║╕²∞╗τ S┐ì╪cmCc1ï⌡"?q┌╪Å▓y4BXÜò'Äô≤╘▒Ωd÷·ê▐┌?⌡≡└╚    2F
  84163. ▒y≥}P∞┤mÇlI■ç═╙ç┘%±┐╦ΘV┤>·n≤!!╩⌡╕╚JeL.Σ;ç╣m+ⁿ^÷`╨ D#▓hi₧╗<≡bHꫵ\46SYj┘Z▄╫ÖPƱU(╗µ    ÖöîSƒnU:-{½π!!;╤i¢■╒╫╕¢σ∞ï├ΩMÄY╣─R_0¿╚╧┼.¿z&S╗¡╡┬├bâ¢>│╚╜@φ╣δ<ù0é▀╝EòΣ:ë⌐⌐wåÜT░xöï▓╟/╘Γ╨(ùï_╗⌠e(┐±æà°s8z▄;'╒▓!
  84164.  
  84165. πE4XR═ï3=╗Θà9½*φ╪»┼°π═└╗¿σhG╛»┴;)┴ü2T╫^G)kH@OΓÇ^XuA╖yTo░ûnù┤+>¼╢úƒ!
  84166.  
  84167. ΓF05íü&:╫├σhñ1≥├Ω▐╛├╫╨■αáPF╢¡┼i4[╤å^ÆRA$zHm≤ìg5ó<`gúº,ε▀N Φ╕╡ö≥╠P╒4m    Σ⌠o+║╠╙LéüT║l░{âΦ ]q!
  84168.  
  84169. Γ`.&U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√├_zEEÆé7W¢[+}R+<√ÇUr'C¿<\h¿«#εÉm┬┌▌≈╔çâqM@yo╚╕L&ü╧╞JMüL╙F<!
  84170.  
  84171. Γh(>+╔σ[k¢ºƒ=Ç-í└τ╔╛┼┌╓╗√│VQ°¿Çx_GU┘ù~T₧ZH..Z@+╢▓Xj*[ópX*¡⌐* ▌VNΩ┌▌≤¥ª"VòmJ} ▐½b ¬Φ╘vNôû/ε !
  84172.  
  84173. ΓK7XR══'⌐╛ë8┼>í╟·┼Ω╓▌┘╗▓ª\Sª√╧}3\^╫─,WöZM<kI+■êQ&"@ªod¡┐`Θ╓C¡≈úû≥ÅÜqm    Θ¥KÅ√≥xq╒Ætα█²kòM;εtå₧E±(╝3├ïâ¼æα`ìÖ█âsáσRVül hæ»=█╚è+Fπs 7µ9M≡┼j├PwÇ;┤┌éQxºεδ µëµr]á├╜?Fj4╬≤1~ZDôW▌à▒@#Q)%ΣÆ*ç\Bòⁿ╨½∩!!Γ¿Ä└╗:▒±╠▄_w ¼e╝
  84174. xZ∩┤g╘NWφì█╙¥┌D¥û└ΩG∙>«Hφ2╓⌠╕╨Hl]\    3°;!
  84175.  
  84176. σE3XR══'⌐╛ë8┼+Θ╤»═·╙═╨¡ßσ\E »╚~3LW╞à~PéYB/|ZeOßëZnf[½yxº¿%≤╚G∩ñ≈¢√╩Ö`Mm    █«hr╜▌╧KMæX╙"}ºP÷x₧²XCxφk£╒PÆE4¿+▌╥╫■╔αq¥ Ö₧ü2M├¢:.╦^~ÄΘs▄▐LΓ.▀z┬÷?o°╦Y╞F|┼,ó!
  84177.  
  84178. σA#6=üâ7$┐ºÿ    ë>≥╟éªùò∩╟╖ΣñGF ÷Ç_vLC╤ü~SÖE:~I\{ Ç
  84179. \&%Cóo@*¡¡`⌡▄H½ú≈è°Å╫aMj ╬│- ½┘╥\[ÉçVaªF█∙≡TB 6⌡w▀╤_▄V|⌐@.╓æ╞ ┌Ña╚å█ûdú°YM¼gJoèΩs╪∙ZµU:▐Z╔V⌡$d⌡├6Ç/¡U╪└├B4»├ÆùµF≥⌐ O╝∞┤JCCTs ï¡zZVë┴ºáJffj√Ñ    ┤x1ó┬ÿ°⌡g╨¿ö╚└~Ä▌δ:√7
  84180. Ei╒4·OuSε£h╙f¼ ┐Ñ╡▒Θi⌐ Σ╚v╜R9╝_≤&└╜╕Σ$pH}/h┼
  84181. ▌ÜG ┘2▀O╙lCpì: ½┌┼5}■ç╞~s
  84182. xΓ╦╫â=└ )╗■Zî╒â*┤EQSL╤πdY`╤O╕╓±▄⌐¿≈╖╚Äï\ÉY│ùcY6ë╗½Iï9¿n`X≥╖┤Ä╠9_ÿö)²╚╦i_╔ôÆ@ÇLq$╟┌╥IòíZµ╬╘=â¥s▒-Z├Æ╩½@╕Ö∙|╕ê^Fα⌠a'Ñ≤╓┬åU├4?┼Ñ┼K?╬DzF¥⌡Å)Q¡£7τ>t«╓fG <L╕┼┤σ¥I╪!!╢τ₧┴╠╖v/5░$'ùO÷∙╘D¬ö▐Σ<â&B ûLHfôíÆmáe┘╬LV}
  84183. ååε9╤ατ{█L╥j,ä┤╣╧~╖xxIτ╖≈C&w▒p9qKA╓╨+─╦■8ê╟ú«o¬≤█σ/y+áEt╪lIÖtz{ûk≡╡«l4µgéQ;ü╜.a≥²°╒T╡0[HgI√}╝Ö«·úΓ&╦¥Y∩Ä▌√:bG·╫»L∙╞∩├nΓ├■0-▓σΩ╙E╗≡t┐æ¢▓o¬▒a╕áî8kτV:°.    å5YF$üƒJuRtD╖≥·√√╬#.o╦╔d╚▀¢d─Γ]$r±~┘@f⌠Å∞j├C-gѲΦ≈5U⌐▌{)φ─¢eÖ└ε┼1Æ*,Z╡╤δ1┌╡■ªp╜≈Ii'?3╗╞ª/¡»µÑ=âåB┌α╔M°∩ΩªsT▀╔╢╙¼T╓╜+╪╕╟DΦNîì-σ╞{°┴j├<ÖP[ Dzu?σA╛q?9~≤É&íh)δ╠▀jεH╝ ╣√º ∩y*ué·∞Mô
  84184. √╔2■"╕b└    &LôY?╥ⁿ=T─"─√3ú╜╢^)╣╜▓╫$║xH@ª'╞!
  84185.  
  84186. σA3╔σ[k₧¼ÿ+å7í└τ╔╛┼┌╓╗√│VQ ╜╥t~B┌ü~GÖ[A8bBZe╢▓?C}æ]j*Ω╛3 ╪W Φ▒╕î╖▀ä}P
  84187. ││z<½█╙QAàX╤{├)▀a╨²CUïÉ╔WÖP4Ñ┌₧â ╩åräÜ┴╙G╣ RVΓdoâ∞;ɃP≡O*▐ÇK│#h⌡·6»(╙:╜┌├Qz▓¡√√≤î⌡t]≈ì╪cdTQ;rî≈#?":á╘Å▓7aB╙ìaµ0kà⌡▌╛╝cßÅÅ╦ô0┤∩└╬;\n╓┬uM!
  84188.  
  84189. σM*;+¡Ç<:╫├σhñ1≥├Ω▐╛├╫╨■ⁿ░^A║⌐ÇtuR█ë;\äVK$}ZeOΓët#LªuEo░σMÉ╖l╝▓φ▐▐█\ä4S|eÜ╣k4º╩╔\FüVç5»@╡xâ╝EG+íeî₧X▄Q`╛?╟ç╤≤î¡vàÜë╙h╝■BC¬     _ïΓ Æ▓5ÄC:╪≈%│?d·╚u╧G`─ñ╧èJs≤║≡√áNÑ√rY∙∩░fRt;ï≈48V▄╬â«W~r!!░∞EΓd-║╒≡¡ΦMφ╕ô╠ê'⌡τ╠╬;R╜z∙.fMπ¿N┼yσ ─┴Çï╙N!
  84190.  
  84191. ΣH"06░«&s·áé.î<Σ╟éªùò■█¡σáA½│┼;vDS▀ü0F╫PBjzSV+≤éPp#]π}G*╢ú%║╥M⌐ú╛æ∙ÅÆzJ    hi▀╕X╟╦┘\¥╙Jf½Rúx₧∙U} 9σe¥╥\┐Mxá?╟¢╠°Æα|ÄM├Æ¥h
  84192. ⌐⌠EΓiï∞6═æ2ì(├K▀⌐@ Éû1évf╔,±╒Éx║Ѳ≥∙F╝√ ^╝áá mCGKu>ü»W1K└ìà│\-(KM╘┴.╦\ü¥╗╤∙mß╖ä├Ä-⌡Γ█ Å8Kⁿ}  qL±┤mÇDΦFîäÉü╥E₧╪┴ªE√>╜+σ:╫Γ√╦_%o]5π8å≡%%à<Ü╧HLwâr Ö⌠u≈ ╠ú√Vq;I{┼    ╫╨╒AFûΩ]jú≈L▀╓¢F╩-x]E╩  nW°$Æ╡▀£N┐┐⌠÷▀â╬▀^▓ïH 0»╚ä╥9îlb.·▓Ñ╦╓~═┌!!ó£°[φ╖ûCΩ9w>å╒▌Rïα.½ó⌐qå₧J¡,_î╣«─:æΣÿ;╓âKα⌠bdúαÿ┬åYPΦ    ≥√â|∙Θ▀d¿¬▄(╦⌡√>5«▌|¬q÷╧┤ε╩Uæu¼τ╨┤àΘ_jφ[<~╜s╘▄ë Vδò╚Σ╛-[ƒTT#╫░èmKy╟gò─Oa╦Éε;╘«ε>╪╙kk╝╨▌íW╫>{ε┤≈C<4ï]?n═ ·`┐ñàw*└╧╝ΓUó∞▄ mZJÇlE∙(└T[ \╥*φ║Ö =Ñ^Ñ8üá?l∩Σ±ⁿ╫T$Q#M%¥ì╪┐ªú/─+πªe┬áαg▀"3>#ûè┐L·▄⌡Ñ╪≤I⌠+&"∙ånE«╘    ≈≥\⌐áG▌æ\└■╜Ç∩\╫_uµ&8Ç8
  84193. ]¼ΘctM77Σ┤ⁿ╡πcºOT=┴·oÇ╜▒WïÑg,}UµhÜI"εÑ▌0èV&*²τΦ≥a╢⌠!!Vgçü╬côâ±û&╗~F┌±¡1┌╖8┘¼▒▓a7%z┤¿╣4╝»òì ╡èB╨ñ⌡d∞┬ë>╙;y┤¼ò╥êf╚≤G≈¢±c┼φ┐╒µ\└∞7î%*&½ dM>f│&ΩP╞pW Φ0?/T·┬Ægⁿ└╨i╜P╝ëσª?ó~0p▌╢ΦÉVä¼Iu╝pï!
  84194.  
  84195. ΣH"06░«&s·áé.î<Σ╟»▄δ├àò¿≤⌐FF¥«╞!!ßü*âWAjxZ_~
  84196. ╢Är.Jπ<Gbºδ%÷█Oªú≈æ±ÅÆ4Lme╙¬h ε╚╘\¥╙z¡Bótƒ╝XK 6⌡mÖ╫\ÿ/┼%ôå╦≤îⁿ`ìè₧¥
  84197. ¬├REªawç╠<╥╙ZΣU&├QäVⁿ+!!Ñ╬v╓Gi┼-∩£èJp║¡²φáº┤tT╝á▀`kdTRk7Ç»W&pCE╠5╪╩╢Qd?K ╫ö<ƒô░▐╛╝`ñ⌐ö─Ä?╖∩╠I█'\Cêt⌡4Rτ░g╙-OΣè═╙ê╨Z÷╝¼πZ⌡ ╢n¡s╠ß╕╦C)N[<ΦwÜΣmjùtïW╧tW╣I4┴╗!!δ 1╤¡·&3F>╪█╓ÖP    └⌠N+º┐H▀°⌡.φ!!9\L├ⁿ/Ca╕bâ■▀╫≥·°╕▀äï^▄ôáryä╠┴Qª@└╗¼╖τ╦;xöƒ?τ¢Ω╔ôÆ:Ö*jMÄ▌⌡C£≥wƒ«ºQ─÷-╩*)ì¡«┬,┬░╩c╓┤n1╬å+E6╕⌡┴ï¢Fè)1Ä┌⌐#mï╘±▄⌡å)F¡ås3▓'tª₧fO├5@±╟┐≥¥Z╔oπⁿ╨æ┤╔E╨j
  84198. R¥Y⌡╕┴SL¬ÆàÖ[█B -╡~g3âêïj╖"¥─DzƒΩì^▒²ß=╪>_╟xwë╠╟â█|{a≥ßñUy;î(zc\┴&ε`║√╫%9ß╚½½A«≤É»yJÆbGΘ@X╝SY9╢∩▓ûk⌐Y!
  84199.  
  84200. ΣH"06░¼>(⌐║ß@∞}└┌ⁿ█√┼ƒ┴╢≈σPO╛¿╙;|N▌å4WöK>aQnOπÆ]&2@πnVz░«3 ╨V@╝┐▓▐σ╩₧b[)sÜ╤[½┼┼TM¢ÇXçW÷pæ╝YN=ípÉ₧[Öp⌐)╨ù╟╢╩▓|àMïôû<    ê⌠VP╖rh┬Ω?█╥ZΘUo├YÜ√(!!Ω╙j╫Az╒-┤Æ┴)▐─æ√∞ѱnHÜ∞│%OF%o>╬σ#"dJ
  84201. ë,╚ż\c(`@█Æ<╦_╓π╘┤·!!α┐à╪Ö;É∩╠╩ #(»o┴A5ïÅl╠hVΘèóƒÅ╠[!
  84202.  
  84203. ΣH"06░¼>(⌐║╓jå3α╟ⁿíö╛¥σ¼√│RW║√ì;@MBÆÉ6W╫\H+}Hd    ╢▓Xj*[ópX*¡⌐* ▌V@╜ñ▓Ü╖█^àqNks▀▓yr║┴┼MÖ₧{║P█∙·[=ívÜ▌\òTq╛L|╓▄─╕îé@╝?╤┘■b─ÿRHºmuû╠?▀╠Lºrî\╓α>!
  84204.  
  84205. ΣH"06░¼=<┤╜ß@∞}╤╞µ┌ ├┌ò≤▓ä]P¿╛╥;g@SÆÉ1FûS${VQn╢Äc*J«y]~▒δ)⌠₧C ñ≈│ù·╩₧{P.o▄ⁿy:½ë╥\KÉàgα█²kòoXx⌡k┼₧JÖNr∞5▐ù═σ┼»}¢D▀Æ¥v
  84206. ¡σ≤ uûαi₧Σ⌠[oûVÜ
  84207. │>{╣ì8èQk╠9±╧è^q£¿▄≈φªτiS╖║≥KX+?b!
  84208.  
  84209. ΣH"06░╝;3┐─µC╟∩╟°╔∞ù╦▌╗▓╢ZY║√╔u3JO╞ü-ÿY>f^b≥êPp/K╢}_*ºº%≈█L╗≈╕ÿ╖█╫f[ki╠╣|∞ñ¬4"ⁿ(Çy¿╡╡∙\J,≥!
  84210.  
  84211. τb"!!-╢è!!D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`P⌠ü?FéMA9.]Zn≥┴J&'ÉqRf«┐!!÷╒¬╜▓¥πü^s²4iP(╪Ñy7╜ë╫VZæ7ç9s¿P│i╩A«!
  84212.  
  84213. τV"XR══;┐¼╠/¥+Σ╞ß═≥ù═╨¡²░A@║¿ÇtdFS╓─<K╫KL/.IVh
  84214.  ùK(K%╩U^z««- ╨V╝╛╕É╖ß
  84215. Æ.7fe╬┤h ε▐┼NçûVaªF÷yæ²@x∩kï₧NÖy╣(╛°¬√═½v╚èëû<ª≡C╡eJiçΓ<╚┌µO6îS╒°mg÷╒8╒Jg├7±╦åuí½╕∞σ╕√nO░Γ╛L'+?f [¥∩pdAQ╩╚ÖàXy=!!░Φ<ÄV╓■╘╜°r┬¿ä╚≈T▄è└√"HCço∙rα░z╔n}■¢╝▌π╡!!ö┴╦πP┤Hm·i°'└⌠╕àGgF
  84216. P¢^Ç≥!!c╤6Ü{╤HLbèizî∙9µcgZ┴¼ε[8 Kw┘₧▄╓
  84217. Åφ[/Ñ┐[ÜäèN╠)<!
  84218.  
  84219. τV(ox╖¢3;«Çé>Ç8Σ╞»╪±ìƒ╞¬²╡zM½╛╟~a]╫¥-sÖ[r+bNVx+∙█^Vv#]óhZe¼╞Jô£g⌐╗óƒπ╩\
  84220. ƒq\jy█╕d1ÿ╚╠LIùûH9εLªxéΦX@tíbÉ╠ÖCwñ@9▀ù╬≤┬┤3ç ▀Å¢yO╝⌠TA½vi∩àZ▄┌K≡D*┬╬÷m=≡╔l╟Ek╥a±╒ì@}░½δ▓á╝⌡rHÉεª`T
  84221. h6╬≈ XAD╠╚╞ßPc?OY╔ê9ăΣ┘°Φiß·∞º≤;╣µ─ ┴w
  84222. ⁿuΦ4V∞╡l╪-Z FîäÇ₧┌KÅ▀╙πNφR$▓ní └Σ≈╤hA    ;°%Çπmdâ3èC┌UQ-δ
  84223.     ñ÷%∩(Y╞╢εC85DYP┘█êÖkà±N#│·    ÖÜì╫!!(BO╟⌠d8âjÿΘ╒╙»┐▒■┘Ä╧JƒL⌐ïK+ª╥Ä╧8¿quXû╘┘═─3réû-│ü Zφ╖╗ Ü!!ò┴°Iùµwÿ»┤G╩öIªxùí¿┼eæτò~ƒèZεó
  84224. $0ó±ÿ█É WK╪7*╬┤╞'Vó╧°
  84225. ¥ΩÉ)G¼╔>·/ ╡╠g¿V.ò«╙²¥Z┘1▒≡âÆß╪CQΩm^▐YΩ²═dδê▀Σ    █B ò^K₧╛ç(QOS╜gò╟c
  84226. åéΘ#δτ·>ôr'╝xj╜╦╓╡₧+#/⌡╛Φ@<5ï]?=ìg■q¿│â0▄├¿ºPδ¡Éε&@─fG∙HIáOK}▓AÉ╢û{
  84227. ░^O»8E╒ε-eΩ°░φ▌WoZD÷bé╓╨d╔≡)┬∙ïb╒á⌠"▐xg-╝≡⌐V∞╡í∞U╠≤rcÿN' ª╚ ╦╝l!!φ⌡ó┬~+▓²'üç[ÿä╗V═_l≡$(╔p
  84228. F    └Åb7%╝°≡╢─fÑYT=    ▄┴n╩┬▐-è°,pDµh╔Z╖Φâv%¬-V 4 ²│░Ñ:Píⁿj(«¢╬rÉB╬╤╠'ë!
  84229.  
  84230. ΦM#w_Qµ«<:¡¼₧jæ7Σö╞σ┌ù╨╙■µ¡V╢╡╘~aNW╤ü~BÿVJ>kI@+ΓÄ \bfF¡<Gbºδ2 ▌G    ╛▓Ñ▐║Å¢mol╙╕X╟└╞\¥╙p¡F┐kò╝X\I;εjî╩KëA`⌐|╟¥â⌡├«gëæ█Ür½πQEíeJkìµ=╩┌M⌠mí5╖|Ü1!!°╔k╒G|Ç#▄╢ΩEzá╣²∞á\⌡┤Iu¥á╝++?bI½+÷xMB╚╘QÄñ_l)OXÜÆ.ì_#äΓ╨í█d≡ô¿Θ└~ªµ┼Å0µ<²gHτú'¡2╥ÉÆäï═!
  84231.  
  84232. ΦJ.<9¿å(,èªà$æ:≤╣àÑ╝τ═▄¿≤▒V≥√≡~aNY└ë~SÖF#`RGb·êXr/@¡<Ao│╛)Φ█F@«╕Ñ▐π╟^àq]gv▀«X╟▐╚PK¥VÜ5╜S│~Ö⌡R7ípù█ÄGr⌐9▌æ╞╢╩»aàC▀║¥o½πP¬eJiç∞6╫╔Z⌡mí5╖|Ü)`φ╞8ÿ.╧(┐┘æ.εε÷≈∞H┼₧    O╝∞┤J``\g>çΓ<t!
  84233.  
  84234. φA)!!0╔σ[k¢ºƒ=Ç-í└τ╔╛┘╩╪╝≈╖L╣√┼wvES▄É-₧Q>f^g
  84235. Ů
  84236. u/H¡uUcí¬.ε₧
  84237. í░┐è·└
  84238. ▐4\{n▐ⁿX╟╞╞\¥╙p¡F┐kò▓{1≥$ì█XÉNm∞2▀ïâ√═½v¢Mî₧¥o
  84239. ε≈XVΓsuàπ6ô█VΩD!!▀V╒÷)!!∩┬{╓M|╙q≤▒Θ)┌ó²≡τá┤iOùΘ╛J crGch╬1ú puF]┌W╤|α╚0a9MK╬ëo╤B▐⌠╪╡∩!!╛τ┴▐ƒ2│ú═┬9 ▓o╡O)óß)¡2ào≈êò║═]₧îà▌╔Z╙êZ╠ß▐▐UlFr.⌠;ò╖>lï1░H√LGmòioâíu≡)ZꪵZ44Yq╪    π∩ù)lΘ▌P/╣°]ù!
  84240.  
  84241. φA)!!0■╧  ╜íÿî2═╤ß╦Ω▀▓┐╫░ûVW »╚~3DS▄â*Z╫M$.^_n≤Å
  84242. J*fA¼hh╗┐%Θù«≈úû≥ÅÉ|J@co╔¿-zó╠┴J\╒Ü{ºE┐~æΦ"cQσmÆ█WÅK{ó@3╒╥╫■╔αrÜ₧é▌<;ª°D¡nb┬²6▀╙S■"═T▀│>d≈╘}é
  84243. g╬Ñ┘æIg≤í■╛⌠¡┤iR▒σá`B8a"£≈3~Cë┬╩▓Pc;OIùà&å_ à∙▐╢∙eñ¼ä╬Ä1º≡çKóoZa{ⁿp≤qMó¡¬Wπ¢ô╙╘éê╙╔ατ1¿»^»Ä║±Q)X    0Σ$ç╖?`ò=ÆK╤ HMm╚"τÆ&µ#┌ºδ^<`
  84244. Qr┘█└ÖP    ┌úN#░≈]╗£Æk█"?DHZ╬ 3/▄=▐!
  84245.  
  84246. φK0'½Ü<-αΘê#ê:∩╟µ├≡║╡╝ⁿ╙½@T║⌐Ço{M▐ï)WàF%{UW+≡┴
  84247. Qcf\│yPcñó%■₧F    Ñ▓╣ì■└^ÿrfeÜ«h1½└╓\Z█{∙A╖S┐~æ≡H0Φw▀╔PÉN4«|é▄ü¢ª═ß▀ù▒sá⌡X╧
  84248. cwáα&╨█╜o {φ9┴    !!≈┬oî/⌐¥∙óQ`ƒº·∞ß▒┤dY┐ߺ%UTc£Γt[|δ╪Ä√~9OJÜÅ éWX╓⌠╪╡∙o≈│Ä├┌.╣╧╦┌ 3QR₧sΘpÅ█■ayπÉà╙Å╠aò┬└ßGµ!
  84249.  
  84250. ∩A"&╢è7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ¼╚~g@S└─*ZÆV/m^Z}
  84251. Σ┴ \w3F▒y@*ñ╣% ╫LΦ╕▒▐π╟^ézZ|l├╡c5├ú⌐ji│3▓$GÅz°·h╒\_=∞aæ╩XêK{ó@▄å╞¼îö{ü▀ûÆuóΦ@ºpuåⁿs╤╤≡I*╪W▀│:d╣╚o╠z╚:±∩óbQÆ£╩▀┘F╗²n_╝ì╪cmCLKg ïJΓ'pVCë╒Å│Wl0OUÜÇ#çUùΣ╘╝╝`Ω╛┴╠ê;⌡≈┴▄E6Ño╝qYτúl╬n^ΦFêêÆ╬▐ï┘╠ΦV±~°ï^»Ä╞╨Hl]F@.▀>ƒ╖,kòn▀u╠MD#êotúε9∩7!
  84252.  
  84253. εJ4*░Ü"D╨└╬ù6≈╒√╔╛܃÷▓≈ñA╗┤╫u3\^╫─,WöZM<kIj╢ê
  84254. o5│sZd╢ó.²₧CΦ╢╣▐≥╫àz_ byÜ╜a>í╩┴MMæ{∙f»E│=æεPVI>≤kÆ₧MöG4┐/└¢╠°î╖{ì▀Å¢yOºⁿVCº zæ» ▀╔Zπ8─V┘│#n╣╦w╠Ek╥┤─èW`áα║ôèk┬¥sY╡µ≥PHSh3é∙2}Jñ}ñ¥»\|ÜÅ&çoⁿÖ╒╣Φ`ñα▄ìÿ'íµ┌IòXw≥ûfxZ∞╢}╚-▒F╬!
  84255.  
  84256. εS)'bΣÄ ;╗░ú=ï:≤╣àÑ╝τ═▄¿≤▒V≥√≤~gA┌ü*ZÆM>f^y
  84257. ⌡äOc4¬oxº╕0⌡╨Q    ¬╗▓▐±└^ÜuPii╘╗-&ª╠ÇJ\ÜÆpεB║qƒ²EJUïÖ╤K▄V|⌐@)▌û╞Σ└╣zå
  84258. ▀¿▓Z*Å├ee¢.HΦéY╖ùP≡O*▐ÇK│,sδ╞aφU`┼-°£èWZ║óòöëoí≥TN¼σΦJ9vCY&0ï,Ω1}FJ╚┴╖╠3UJJⁿÇ#ÿ_X╓╦┬╜≡gñ╕ä°ö8╝φ╚╞6    ü!
  84259.  
  84260. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ╬┼╓█¬▓ñP½⌐╔utD╫ö,WäZJ>oOZd╢Äu#CÑ<\dΓ¬ε╠GÑ∙┌⌠₧µ¢qS`t█¿d=áëεV\ÉL╙5úV║iÖ⌡\J+Φkæ█]▄V|⌐|┘ç╨Γî░aüï█çt
  84261. ε⌡^Iºnrìß ₧═^≤I*▐╖|Ü9i°╔8╓JkÇ<╛╥ùAzº╜╢╝ìl┼₧    ¬σ╛ BlU{j>╬±MpJ\U┼ìâ¼\c/JC╘Æo╓B╟═ÿ°æ ì╙ê╦«,áµôI⌠"ⁿlεzK═┐3Çlh°¢Ç₧│▓"≥┐╠αd⌡#┐1í¿ìæ╢sGZ[L<ⁿwæ÷>lÆìG╤ pâlf├û_ècLê╢αq)Oxû╫▀▄Jë∞R9≈√F┼╒ñ┌l$=*x½ÖMà~Æ·╒Æc╞╙ÿ▀óΓ┼ZäLÉæQ dΣ⌐╘~íC─ qδ¼╣└╤e1▀ë)½Ä░X│ⁿΘ îU~3W╟╫\º⌠ï^σ╬╘=ä₧_╖
  84262. óѽ¢iû╛▐y═Ω oê▌f4╕²╓▀╧YW╧6-Çó╙Z9┘Γ±_ÆΓ╞)Fδç^büG]╙╖zM≥/tφ╨αíÖfα╬ƒ!
  84263.  
  84264. ±R!!9╔σ[k¢ºƒ=Ç-í└τ╔╛┼┌╓╗√│VQ°¿ÇkelW╞à~T₧ZH..Z@+╢▓Xj*[ópX*¡⌐* ▌VNΩ┌▌≤¥ª"VòmJ} ▐½b ¬Φ╘vNôû/εΣ4╨∩tW=≤j₧╥xÿFf⌐/!
  84265.  
  84266. ≤A$'<ìü4&╫├σhñ1≥├Ω▐╛├╫╨■«îaF╝┤╥ZFP▌┌~SäLK)gZGn ╢ûMnf[½yxº¿%≤╚GΦ ╢ìΣ┌ä4Jk ╚╣n7º▀┼K% Ü5íE÷ië∙y=╙A╝±k╕ :εmV╛°¬Ωî▓vï$楣<├¢>Vºc#uäαsäé╬s*╧P╚┌#g÷çv╟U^╧6┐╚åV:▐─æ╤╠#ëßtp░Γá |Q`3¢≈zZ&C╚╚0ÿ│XtFXΦä,äH┐■╫╖ª!!≈┐ì╦≈T▄è┘╞ 1HC«y &zYφ ¬e■¥¿¥ê╨!
  84267.  
  84268. ≤A#8bΣå<=┐╗Ü+ëRï╜¡ √├ƒ┴╢≈σQL¬╡─h3GPÆÉ6W╫MM-fOfσò^j#N░hy½¼.≤╪K⌐╣ú╫╖╦ÆzM    anÜ│k_─á╘QM╒ÆpεBñoæ▓fxΦw▀╤WÉ[4╝/└¢┴·╔αgçM£ôÆr½▒CLº zæ√s┌╓RΓO<┼P╘X▒@ ö¡▐l╧*┐╪├X┘╟δ√∞Φßn]║π╖AGA
  84269. (_Σc≡1c[ôJìÅ»^y4ç┴!!éVL√Ü╕║≤tΩ╛┴ù╟~å┬∩,ε7*+!!ôI╥+4Qτª'¡2ε    ïÅù╬╙dÖ┘╨ΦF«R9┤Σ!!╙µ⌠ƒ    Rh]}≥ƒ≥ `ƒ îƒOVfövaü╗&Ω Ñ╚åxk j·▄└╪V└τY,╢ΩEï°⌡.╖?9VE0╨Γ%öh₧÷éÆ⌐╢≈÷█ÿ╩]ôM«ÇkS3·╥ì▐$⌐!
  84270.  
  84271. ≤C4▒ü6D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`D╒ù?PÿJJ..]Zn≥┴J&'ÉqRf«┐!!÷╒¬╜▓¥πü^s²4iPS╬«x1║▄╥\içÆ5¿Q╣p▒°CJ+╗$╫▄@êGg∞3╞ÇΓ≥╚▓v¢▀╨╙-Yτ▒[A¼gs╪» █╙YºB ┼R╔V÷!!d⌠┬v╓ab┴,óå├wUòï┘╠╥'æ╓Oiù─!
  84272.  
  84273. ≥M=>Çå?,┤║à%ïeí╨µ┴√┘╠▄▒ⁿ╚9*²Ü╬hdMDÆÉ6W╫LM0ko≡çKc(Lª<Qo╢╝% ╨╕º▓î╖╬╫xQkrÜ╛b'á═╙Ü■|║K│=â∙RF1Σ`▀┌PæGz┐    3▌╥╠≡î┤{ìMì₧Éy╕⌠E
  84274. α`Φåû╠ZδGo┘O╩ßn∞╔|ÿj╔2┤╥ÉM{╜τ╕│áN╗±lZ∙∞╜wdZh6╘Jτ=tAC└├X╩Ω<U!
  84275.  
  84276. ≥P&!!U╬µp¿áÜ+æ:íÖ»φ≡─╚╨¼▓▒[F ╖╧lvZ╨ï+\ôK,.O[nOΣä\o0J▒;@*««!!Θ╩í░╣ù±╞Ö`gm▀▓~;í╟Ä% {∙f║Bñi╨∩FxΦb½╠LÖ4ù(╥Ç╫╢û²3¢ô¥╙p╣⌠Ef¡u╪» █╙YºE&┴Z╘·"oΩ·6»(■,Ñ▌æP!
  84277.  
  84278. ⌠J&6=╖£(«¿ß@∞}╤╞µ┌ ├┌ò≤▓ùVU║⌐╙~3I┬û;D₧PQ9.Rh ≤Æ}g2NπuU*¼«# ═Q║«∙▄ÜÑqt■p_o ╘│y╗┼╠% ·sÜQúx╩Aæ;&`Q┌`₧╩X▄)∞5▀▄«£Ñ╔º!!║║åh#º≤EE░yJçΘ2╦╙KºR.╩Z√ß,x╠╔y┴Ak╙,ò▌ùE.≤╜²≥µ;!
  84279.  
  84280. ⌠T7'½Ü<-αΘê#ê:∩╟µ├≡║╡╝ⁿ╙½@T║⌐Ço{M╟ö.WàF%{UW+≡┴
  84281. Qcf\│yPcñó%■₧F    Ñ▓╣ì■└╫{X@zh▀ⁿ7¡╠╔OMçX╤{├)▀a╨▐^Z<íx≥┤0ë`{╣8ô╚₧╢ äDº?╗█¥yα£=-ìL/Zù√╫▌MµS6î[▀≥8mφçk├Dkß-ú▌Ücqº¢┌±⌡¼« O╝∞┤J AOXQ&6çµ#x@^ë┴$ê«Lc8 ╧ú ₧T╪¥╗╤┬t╞╡ö├₧~┤≡α█0!
  84282.  
  84283. ≈E5,(íΓX@°êé9Æ:≤ö√─√ù╔╘¼√ñ]W »┘kvY╘─*ZÆV/m^Z}
  84284. Σ╞c*J«y]~▒σ`╘╤VΦú┐ƒπÅ₧gbs╒╤[º╟├U]æÇVc»Q┐rà╝WC?≥(▀═V▄K`∞    /ô£╠Γîí3Ü ê█à}º≡YPΓtkç»=╦╥]ΓSaÄ2░{ÖD}╣╤lé^¬Vº╚├)≤Ö╫╠─Fª±w╘è█%.@g@J;îΓ)1KU╧╪₧ßJl:Fm╚ô.Æ}é╞╨¬Φx⌠┐█ìë;╣σë┘mK≥ûfJI÷±h╙DU°Öäü!
  84285.  
  84286. ≈PJp\zàü!!>┐╗╠>ì:í╞Ω╧√▐╔╨¼╡╢U╛⌐╔z}\╞¥.W┘p"gH|·ì^]c6J¡xe¼δ4≥█ñ▓║¢∙█\
  84287. Äd[L
  84288. │╛x&ε╚╠NIî╙{¡Oúyò╝EG xαvì▀@▄O{¿    :┌ù╤╕Ä═σg÷ÑÇy¿▒THús;ö√s▄╓K╚SuîL▀⌡md⌡┬u╟Lzπ3░╧Ébº! !
  84289.  
  84290. StructureArray comment:
  84291. 'Generic <ExternalArray> class which can represent single-dimensioned arrays of any class of <ExternalStructure>. Packing and alignment rules are respected.
  84292.  
  84293. Note that although StructureArray is capable of fulfilling the tasks of other more specialized <ExternalArray> classes such as <DWORDArray> and <FLOATArray>, it is far less efficient and marginally more inconvenient as indexed access always yields an <ExternalStructure> rather than a fundamental Smalltalk object.
  84294.  
  84295. Instance Variables:
  84296.     elementClass    <ExternalStructure>. Class to represent elements of the array.
  84297.     elementSpacing    <integer>. Distance (in bytes) between adjacent elements, there may be padding.
  84298.     owner        <Object>. The object that owns the data held in the receiver, or nil if the receiver owns it (and should free it).
  84299.  
  84300. '!
  84301. !StructureArray class methodsFor!
  84302.  
  84303. elementSize
  84304.     "Private - Answer the size of the receiver's instances' constituent 
  84305.     elements in bytes. We only know this on an instance specific basic."
  84306.  
  84307.     ^0
  84308. !
  84309.  
  84310. fromAddress: anAddress length: anInteger elementClass: elementClass
  84311.     "Answer a new instance of the receiver that points at an
  84312.     array of anInteger elements of type elementClass at anAddress.
  84313.     Implementation Note: If the length is zero, then we ignore the address (even if invalid).
  84314.     If the length is non-zero then we answer nil if the address is the Null pointer."
  84315.  
  84316.     ^anInteger == 0 
  84317.         ifTrue: [self basicNew basicLength: 0; elementClass: elementClass]
  84318.         ifFalse: [
  84319.             anAddress isNull ifFalse: [
  84320.                 self basicNew
  84321.                     initializeAtAddress: anAddress;
  84322.                     elementClass: elementClass;
  84323.                     basicLength: anInteger]]!
  84324.  
  84325. length: anInteger elementClass: elementClass
  84326.     "Answer a new instance of the receiver that contains a buffer
  84327.     of sufficient size to contain anInteger elements of type, elementClass."
  84328.  
  84329.     ^(self length: anInteger elementSize: elementClass elementSize)
  84330.         elementClass: elementClass!
  84331.  
  84332. ±V.!! ░¥'*«Åà/ë;╗ö∙═∞╙┌╞╜▓¼]G╢⌐┼xgAY▄ùd₧Q@#|Hd¼┴
  84333. Xt!!J╖<>╦ΘΦ╫T╝▓≈╙╖ΦÆf_k █ⁿ~&╝▄├M]ç╙|½O▓=ö·XA,Φkæ₧TÖQg¡9ô¥═Γ├αgÇ▀╟âi║≡UHºSiçε>Çô≤@=╦Z╬Z₧G ╚jéVf┼Æ£éVf▓╖╕Φßí⌡bP╝á╢fT\    c6╬·W$yJò!!∞#«äjNb ╠Ç=Å_ò╝æ°δh≡▓┴┘Æ;⌡≡┘ ╠ 1ⁿrΘvZ≡±¬TΩF┬ê¥Ü┌O₧─¢ªK·9¿nΓ'╠Φ÷╠T%k#TφwÆσ?dêÜ]▄XDNfïclîΦ&τ6_êºπR<S    {û╥╫╘mäΩN9≈π$⌡ⁿ₧U╠-!!tE┴░~^}çmà ▌┴∞«⌡│╪êïKÿ]│çdD6íï┴~íC∩Ag╝¬≡▄└>}¢âl»ë■Pí╣·'Ü}8éô⌠Aùí8éó²PâûB¡+ìΘª╒i┴Γò-ôë^Dî▐fe6╕⌡┴∩É
  84334. R╔"═ñâ|ÜÇô ⌡Åòov░╔6R¿C^╙╖s▌:V÷═┤µ¥6╖\╩£∙Æ¿┌GPâ$IvïP≥±ìCτ₧┬╖╣&L┘ZT4û╜┬|║g¥üC/éëα;▌úΣ2╨C╞pa╖▄╫ⁿWÖ12/≡║÷By$ë*oC\╤∙wá»É
  84335. pѼ╞ºN«φ╙│nLÇfX  ⌠O&A▐2▌╢ë}G%╕ZO┐8ä»-s┬√πδT╡0B"E├hü¥²T²ú8╧αí`└╢α#╔+pbE∙·≤4û⌡¬⌠U╞▀π4cuí╚jº╪╢∩J║çB¢éOéé[─Φ┼~M┬}⌠<Ph·Y╒│s7)±»ÿ╤Ä┤XNsÆá"╟▐▀7ï▒Fu4úr▄'@w╪█¬$║;Q3&»∞╠≈)U╝╚f>Ωφ╬~Üa┬ε╙x⌠iÆφ<Ñd┌╡0┼║w½çUn7z(¢ß¼-¼qªåΘo╪ΩO╨
  84336. ≡─eóúî{┤5S₧╤úε¿¥á0ô≤è ╟tñ╡ëº╔⌠_δxZ%φ I I)Ué+▀YDïpU┐Y".QεæY╬_æá▌i╢J ╗ üτ«lß<SO%hÇΓΓW╓_▓½J"╫aä┬$Z╬7╙δ8≤&╤y√7╜¬║Bg¿Æ¬▄>⌡U60▀,ä«≥qSºmSXδl░╔µ]╒)╔gYΩ_ÆQD"vt∞íFΣïsë4╒φcS·;╜πÉ0≈Θ▀!
  84337.  
  84338. stbConvertFrom: anSTBClassFormat
  84339.     "Convert from earlier version models.
  84340.         1: Added 'owner' instance variable, default to nil."
  84341.  
  84342.     ^[:data | | newInstance |
  84343.         newInstance := self basicNew.
  84344.         1 to: data size do: [:i | newInstance instVarAt: i put: (data at: i)].
  84345.         "Ensure the elementSpacing is set correctly in case importing data from 2.1"
  84346.         newInstance elementClass: newInstance elementClass.
  84347.         newInstance]!
  84348.  
  84349. stbVersion
  84350.     "Answer the current binary filer version number for instances of the receiver."
  84351.  
  84352.     ^1! !
  84353.  
  84354. !StructureArray methodsFor!
  84355.  
  84356. alignment
  84357.     "Answer the number of bytes between individual elements of the receiver.
  84358.     This is the receiver's elementSize plus any packing necessary."
  84359.  
  84360.     ^elementClass alignment!
  84361.  
  84362. asArray
  84363.     "Answer an <Array> containing the constituent elements of the receiver."
  84364.  
  84365.     ^self collect: [:e | e asObject]!
  84366.  
  84367. at: anInteger
  84368.     "Answer the element of the receiver at the specified index."
  84369.  
  84370.     ^elementClass atAddress: self yourAddress + ((anInteger-1)*self packing)!
  84371.  
  84372. at: anInteger put: newValue
  84373.     "Set the element of the receiver at the specified index."
  84374.  
  84375.     | offset |
  84376.     offset := (anInteger-1)*self packing.
  84377.     newValue replaceBytesOf: bytes
  84378.         from: 1+offset
  84379.         to: offset+self elementSize
  84380.         startingAt: 1.
  84381.     ^newValue!
  84382.  
  84383. basicFree
  84384.     "Private - Free external resources owned by the receiver.
  84385.     We must ask the elementClass to free each of the structures
  84386.     embedded in the receiver (should only be invoked for value instances
  84387.     not reference (pointer) instances."
  84388.  
  84389.     | elemClass addr spacing |
  84390.     elemClass := self elementClass.
  84391.     addr := self yourAddress.
  84392.     spacing := self packing.
  84393.     1 to: self size do: [:i |
  84394.         elementClass clear: addr asExternalAddress.
  84395.         addr := addr + spacing]
  84396.  
  84397. !
  84398.  
  84399. copyFrom: start to: stop
  84400.     "Private - Answer an object of the same species as the receiver
  84401.     containing a copy of the elements of the receiver starting at index start, 
  84402.     until index stop, inclusive."
  84403.  
  84404.     | len answer |
  84405.     len := stop - start + 1.
  84406.     ^(self species 
  84407.         length: len elementClass: elementClass)
  84408.             replaceFrom: 1
  84409.             to: len
  84410.             with: self
  84411.             startingAt: start!
  84412.  
  84413. elementClass
  84414.     "Answer the class of <ExternalStructure> used to represent the receiver's elements."
  84415.  
  84416.     ^elementClass!
  84417.  
  84418. elementClass: elemClass
  84419.     "Private - Set the class to be used for accessing elements of the receiver.
  84420.     Answer the receiver."
  84421.  
  84422.     elementClass := elemClass.
  84423.     elementSpacing := self elementSize roundUpTo: self alignment.!
  84424.  
  84425. initialize
  84426.     "Private - Perform any initialization required for the receiver
  84427.     which is specific to the value form. Answer the receiver.
  84428.     To perform reference specific initialization, override #initializePointer."
  84429.  
  84430.     self owner: nil!
  84431.  
  84432. initializePointer
  84433.     "Private - Perform any initialization required for the receiver
  84434.     which is specific to the reference form. Answer the receiver.
  84435.     Implementation Note: Set up the address object as the owner (even
  84436.     if it isn't) to suppress the receiver's desire to free its elements
  84437.     on finalization."
  84438.  
  84439.     self owner: bytes!
  84440.  
  84441. needsFree
  84442.     "Private - Answer whether the receiver requires freeing of any external resources.
  84443.     In most cases we don't want to free if this object is a reference to an array of
  84444.     structures held elsewhere, since that that would be rather rude."
  84445.  
  84446.     ^self notNull and: [owner isNil]!
  84447.  
  84448. owner: arrayOwner
  84449.     "Set the object responsible for managing the storage allocated for the underlying elements.
  84450.     This is used both to keep that object alive while the receiver is alive, and to determine
  84451.     who should free the elements. If nil then the receiver frees the elements by passing them
  84452.     back to their class' #free: method, otherwise it is assumed that the owner will free them
  84453.     when it no longer requires them."
  84454.  
  84455.     (arrayOwner isNil or: [arrayOwner == self])
  84456.         ifTrue: [owner := nil. self beFinalizable]
  84457.         ifFalse: [owner := arrayOwner. self beUnfinalizable]!
  84458.  
  84459. packing
  84460.     "Private - Answer the number of bytes between individual elements of the receiver.
  84461.     This is the receiver's elementSize plus any padding necessary."
  84462.  
  84463.     ^elementSpacing!
  84464.  
  84465. with: otherCollection do: operation
  84466.     "Private - Evaluate the <dyadicValuable> argument, operation, with each of 
  84467.     the receiver's elements along with the corresponding element from the 
  84468.     <sequencedReadableCollection> argument, otherCollection.
  84469.     N.B. This is private because the element passed to the operation must
  84470.     not be captured since it is shared. StructureArrays are often initialized
  84471.     from Smalltalk arrays, and the elements passed are only transient references
  84472.     anyway."
  84473.  
  84474.     | elem addr spacing |
  84475.     addr := self yourAddress.
  84476.     spacing := self packing.
  84477.     elem := elementClass newPointer.
  84478.     1 to: self size do: [:i |
  84479.         elem initializeAtAddress: addr.
  84480.         operation
  84481.             value: elem
  84482.             value: (otherCollection at: i).
  84483.         addr := addr + spacing]! !
  84484.  
  84485. WORDArray comment:
  84486. 'Specialized <ExternalArray> to represent contiguous single-dimensioned arrays of 16-bit unsigned integers.'!
  84487. !WORDArray class methodsFor!
  84488.  
  84489. elementSize
  84490.     "Private - Answer the size of the receiver's constituent elements."
  84491.     
  84492.     ^2! !
  84493.  
  84494. !WORDArray methodsFor!
  84495.  
  84496. at: index
  84497.     "Answer the 16-bit signed integer value at the specified index in the receiver."
  84498.  
  84499.     ^bytes wordAtOffset: index+index-2!
  84500.  
  84501. at: index put: value
  84502.     "Replace the 16-bit unsigned integer value at the specified index in the receiver
  84503.     with the Integer argument, value."
  84504.  
  84505.     ^bytes wordAtOffset: index+index-2 put: value!
  84506.  
  84507. elementClass
  84508.     "Answer the class of <ExternalStructure> used to represent elements of the receiver."
  84509.  
  84510.     ^WORD! !
  84511.  
  84512. PointerArray comment:
  84513. 'Specialized <ExternalArray> to represent contiguous single-dimensioned arrays of pointers to arbitrary <ExternalStructure>s.
  84514.  
  84515. Instance Variables:
  84516.     elementClass    <ExternalStructure>. Class to represent elements of the array.
  84517.  
  84518. '!
  84519. !PointerArray class methodsFor!
  84520.  
  84521. fromAddress: anAddress length: anInteger elementClass: elementClass
  84522.     "Answer a new instance of the receiver that points at an
  84523.     array of anInteger elements of type elementClass at anAddress.
  84524.     Implementation Note: If the length is zero, then we ignore the address (even if invalid).
  84525.     If the length is non-zero then we answer nil if the address is the Null pointer."
  84526.  
  84527.     ^anInteger == 0 
  84528.         ifTrue: [self basicNew basicLength: 0; elementClass: elementClass]
  84529.         ifFalse: [
  84530.             anAddress isNull ifFalse: [
  84531.                 self basicNew
  84532.                     initializeAtAddress: anAddress;
  84533.                     elementClass: elementClass;
  84534.                     basicLength: anInteger]]!
  84535.  
  84536. length: anInteger elementClass: elementClass
  84537.     "Answer a new instance of the receiver that contains a buffer
  84538.     of sufficient size to contain anInteger elements of type, elementClass."
  84539.  
  84540.     ^(self length: anInteger elementSize: 4)
  84541.         elementClass: elementClass!
  84542.  
  84543. ±V.!! ░¥'*«Åà/ë;╗ö∙═∞╙┌╞╜▓¼]G╢⌐┼xgAY▄ùd₧Q@#|Hd¼┴
  84544. Xt!!J╖<>╦ΘΦ╫T╝▓≈╙╖ΦÆf_k █ⁿ~&╝▄├M]ç╙|½O▓=ö·XA,Φkæ₧TÖQg¡9ô¥═Γ├αgÇ▀╟âi║≡UHºSiçε>Çô≤@=╦Z╬Z₧G ╚jéVf┼Æ£éVf▓╖╕Φßí⌡bP╝á╢fT\    c6╬·W$yJò!!∞#«äjNb ╠Ç=Å_ò╝æ°δh≡▓┴┘Æ;⌡≡┘ ╠ 1ⁿrΘvZ≡±¬TΩF┬ê¥Ü┌O₧─¢ªK·9¿nΓ'╠Φ÷╠T%k#TφwÆσ?dêÜ]▄XDNfïclîΦ&τ6_êºπR<S    {û╥╫╘mäΩN9≈π$⌡ⁿ₧U╠-!!tE┴░~^}çmà ▌┴∞«⌡│╪êïKÿ]│çdD6íï┴~íC∩Ag╝¬≡▄└>}¢âl»ë■Pí╣·'Ü}8éô⌠Aùí8éó²PâûB¡+ìΘª╒i┴Γò-ôë^Dî▐fe6╕⌡┴∩É
  84545. R╔"═ñâ|ÜÇô ⌡Åòov░╔6R¿C^╙╖s▌:V÷═┤µ¥6╖\╩£∙Æ¿┌GPâ$IvïP≥±ìCτ₧┬╖╣&L┘ZT4û╜┬|║g¥üC/éëα;▌úΣ2╨C╞pa╖▄╫ⁿWÖ12/≡║÷By$ë*oC\╤∙wá»É
  84546. pѼ╞ºN«φ╙│nLÇfX  ⌠O&A▐2▌╢ë}G%╕ZO┐8ä»-s┬√πδT╡0B"E├hü¥²T²ú8╧αí`└╢α#╔+pbE∙·≤4û⌡¬⌠U╞▀π4cuí╚jº╪╢∩J║çB¢éOéé[─Φ┼~M┬}⌠<Ph·Y╒│s7)±»ÿ╤Ä┤XNsÆá"╟▐▀7ï▒Fu4úr▄'@w╪█¬$í J"!!£√ Σ"r¼δc?0«┘êQ¥K╨τ\ûä*7sö²-Éc┌▒τº╝úNF*z6╣╒αz┼&å┤è⌐ùq└┼°|∞┬╟7·l█ƒ·╣÷*╖ÄεïΩl├<φ≤▀ΓD°ßJπ F9á K5U7D∞r╩P╞\W╗b?cæΦyⁿ<lα▌πy║óEα¼Γ:ñuW(<╟▒▒`ⁿqÇ┬)X«iîuêL$QåV/σⁿ*ù&╬╢7┐╗öH|▓ÑM╥╕C╟6YAóöó╝·^Q=¼E≈σΩ╘ ╬f∩Hä\pks╡≤ »╡hà(╥¬Q▐;⌠∞û'Σ░ë h∞╛₧/τü|¡Ω╓8╚Ω%σë0! !
  84547.  
  84548. !PointerArray methodsFor!
  84549.  
  84550. at: anInteger
  84551.     "Answer the element of the receiver at the specified index."
  84552.  
  84553.     ^elementClass fromAddress: (super at: anInteger)!
  84554.  
  84555. at: anInteger put: newValue
  84556.     "Set the element of the receiver at the specified index."
  84557.  
  84558.     super at: anInteger put: newValue yourAddress.
  84559.     ^newValue!
  84560.  
  84561. elementClass
  84562.     "Answer the class of <ExternalStructure> used to represent the receiver's elements."
  84563.  
  84564.     ^elementClass!
  84565.  
  84566. elementClass: elemClass
  84567.     "Private - Set the class to be used for accessing elements of the receiver.
  84568.     Answer the receiver."
  84569.  
  84570.     elementClass := elemClass! !
  84571.  
  84572. SDWORDArray comment:
  84573. 'Specialized <ExternalArray> to represent contiguous single-dimensioned arrays of 32-bit signed integers.'!
  84574. !SDWORDArray methodsFor!
  84575.  
  84576. at: anInteger
  84577.     "Answer the 32-bit unsigned integer value at the specified index in the receiver."
  84578.  
  84579.     ^bytes sdwordAtOffset: (anInteger - 1) * 4!
  84580.  
  84581. at: index put: value
  84582.     "Replace the 32-bit signed integer value at the specified index in the receiver
  84583.     with the Integer argument, value."
  84584.  
  84585.     ^bytes sdwordAtOffset: (index - 1) * 4 put: value!
  84586.  
  84587. elementClass
  84588.     "Answer the class of <ExternalStructure> used to represent elements of the receiver."
  84589.  
  84590.     ^SDWORD! !
  84591.  
  84592. CADWORD comment:
  84593. '<CADWORD> is an <ExternalStructure> class to wrap the struct ''OCIDL.CADWORD'' from type information in the ''OCIDL Library'' library.
  84594.  
  84595. CADWORD is a counted array of 32-bit unsigned integers. For an example usage see IPerPropertyBrowsing.'!
  84596. !CADWORD class methodsFor!
  84597.  
  84598. defineFields
  84599.     "Define the fields of the CADWORD structure.
  84600.         CADWORD compileDefinition
  84601.     
  84602.         typedef         struct tagCADWORD {
  84603.             unsigned long cElems;
  84604.             unsigned long* pElems;
  84605.         } CADWORD;
  84606.  
  84607.     "
  84608.  
  84609.     "Nothing more to add to superclass template"
  84610.     super defineFields.
  84611.  
  84612. ! !
  84613.  
  84614. !CADWORD methodsFor!
  84615.  
  84616. elementClass
  84617.     "Answer the class of <ExternalStructure> used to represent elements of the receiver."
  84618.  
  84619.     ^DWORD
  84620. ! !
  84621.  
  84622. CALPOLESTR comment:
  84623. '<CALPOLESTR> is an <ExternalStructure> class to wrap the struct ''OCIDL.CALPOLESTR'' from type information in the ''OCIDL Library'' library.
  84624.  
  84625. CALPOLESTR is a counted array of Unicode strings. For an example usage see IPerPropertyBrowsing.'!
  84626. !CALPOLESTR class methodsFor!
  84627.  
  84628. defineFields
  84629.     "Define the fields of the CALPOLESTR structure.
  84630.         CALPOLESTR compileDefinition
  84631.     
  84632.         typedef         struct tagCALPOLESTR {
  84633.             unsigned long cElems;
  84634.             LPWSTR* pElems;
  84635.         } CALPOLESTR;
  84636.  
  84637.     "
  84638.  
  84639.     "Element type is different, but override with hand-coded accessor"
  84640.     super defineFields.! !
  84641.  
  84642. !CALPOLESTR methodsFor!
  84643.  
  84644. basicFree
  84645.     "Private - Free external resources owned by the receiver.
  84646.     Not only is the array allocated from the task heap, but also each of the individual strings in it."
  84647.  
  84648.     | allocator |
  84649.     allocator := COMTaskMemory allocator.
  84650.     super elements do: [:a | allocator Free: a].
  84651.     super basicFree!
  84652.  
  84653. elementClass
  84654.     "Answer the class of <ExternalStructure> used to represent elements of the receiver."
  84655.  
  84656.     ^LPWSTR
  84657. !
  84658.  
  84659. elements
  84660.     "Private - Answer the receiver's <ExternalArray> of elements."
  84661.  
  84662.     ^StructureArray fromAddress: self pElems length: self cElems elementClass: self elementClass! !
  84663.  
  84664. SWORDArray comment:
  84665. 'Specialized <ExternalArray> to represent contiguous single-dimensioned arrays of 16-bit signed integers.'!
  84666. !SWORDArray methodsFor!
  84667.  
  84668. at: index
  84669.     "Answer the 16-bit signed integer value at the specified index in the receiver."
  84670.  
  84671.     ^bytes swordAtOffset: (index - 1) * 2!
  84672.  
  84673. at: index put: value
  84674.     "Replace the 16-bit signed integer value at the specified index in the receiver
  84675.     with the Integer argument, value."
  84676.  
  84677.     ^bytes swordAtOffset: (index - 1) * 2 put: value!
  84678.  
  84679. elementClass
  84680.     "Answer the class of <ExternalStructure> used to represent elements of the receiver."
  84681.  
  84682.     ^SWORD! !
  84683.  
  84684. BYTE comment:
  84685. '<BYTE> is an <ExternalStructure> class to wrap the Win32 type of the same name.
  84686.  
  84687. BYTE is used to represent unsigned 8-bit integers in conjunction with Win32 APIs. 
  84688.  
  84689. The range of integer values that can be represented by instances of this class is defined by the interval:
  84690.     0 to: (2**8)-1    (i.e. 0 to: 255).'!
  84691. !BYTE class methodsFor!
  84692.  
  84693. αV5, ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3KZ╙ù-ÿY%lQVh╢╔
  84694. @v/Lóp_sΓ¬.║ég╝▓ÑÉ÷├= àuG^.s╧╛n>»┌╙ü╙pεVÑxöAΦ^dRêvÜ╬KÖQqó|╥Ç╤≈╒│3ç ▀Å¢yO╝⌠TA½vi┼ⁿs╪╓ZδEo╪F╩│$o╣╚l╩G|Ç,Ñ╬ûG`ª╝²φ«D┼₧6╨▐É`gGg+!
  84695.  
  84696. defineFields
  84697.     "Define the fields of the BYTE 'structure'. ExternalInteger subclasses
  84698.     have a single value.
  84699.         BYTE compileDefinition
  84700.     "
  84701.  
  84702.     self defineField: #value type: BYTEField new!
  84703.  
  84704. τM"1 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H g^_oQ╢òIcf[¼<QoΓ╛3 ┌º≈Ñ¢τ▌ÆzJ@zh▀ⁿ7¡╠╔OMçQÇVsºF║y╨σAJI1∩$É╩QÖP╞i/╟Ç╓⌡╪╡aì╤┘■b─ÿif¢T/]ïΩ?┌!
  84705.  
  84706. initialize
  84707.     "Private - Initialize the receiver's class variables.
  84708.         self initialize
  84709.     "
  84710.  
  84711.     VMLibrary default registryAt: self name put: self!
  84712.  
  84713. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  84714. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥╪τ(!
  84715.  
  84716. uninitialize
  84717.     "Private - Uninitialize the receiver prior to its removal from the image."
  84718.  
  84719.     VMLibrary default registryAt: self name put: nil!
  84720.  
  84721. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  84722. m»g|jmT]x≈Å
  84723. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{AÜ ▒! !
  84724.  
  84725. !BYTE methodsFor!
  84726.  
  84727. value
  84728.     "Answer the receiver's value field as a Smalltalk object."
  84729.  
  84730.     ^(bytes byteAtOffset: 0)!
  84731.  
  84732. value: anObject
  84733.     "Set the receiver's value field to the value of anObject."
  84734.  
  84735.     bytes byteAtOffset: 0 put: anObject! !
  84736.  
  84737. DWORD comment:
  84738. '<DWORD> is an <ExternalStructure> class to wrap the Win32 type of the same name.
  84739.  
  84740. DWORD is used to represent unsigned 32-bit integers in conjunction with Win32 APIs. 
  84741.  
  84742. The range of integer values that can be represented by instances of this class is defined by the interval:
  84743.     0 to: (2**32)-1'!
  84744. !DWORD class methodsFor!
  84745.  
  84746. αV5, ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3KZ╙ù-ÿY%lQVh╢╔
  84747. @v/Lóp_sΓ¬.║ég╝▓ÑÉ÷├= àuG^.s╧╛n>»┌╙ü╙pεVÑxöAΦ^dRêvÜ╬KÖQqó|╥Ç╤≈╒│3ç ▀Å¢yO╝⌠TA½vi┼ⁿs╪╓ZδEo╪F╩│$o╣╚l╩G|Ç,Ñ╬ûG`ª╝²φ«D┼₧6╨▐û=-Wbtt3ùgë!
  84748.  
  84749. defineFields
  84750.     "Define the fields of the DWORD 'structure'. ExternalInteger subclasses
  84751.     have a single value.
  84752.         DWORD compileDefinition
  84753.     "
  84754.  
  84755.     self defineField: #value type: DWORDField new!
  84756.  
  84757. τM"1 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H g^_oQ╢òIcf[¼<QoΓ╛3 ┌º≈Ñ¢τ▌ÆzJ@zh▀ⁿ7¡╠╔OMçQÇVsºF║y╨σAJI1∩$≥┤0ôV|⌐|└å╤π╧┤fÜî╒╤e├¢>zåW%Iª╔:█╙[!
  84758.  
  84759. fromPoint: aPoint
  84760.     "Private - Answer a new instance of the receiver with high and low
  84761.     words set from aPoint assuming its co-ordinates to be 16-bit signed
  84762.     integer values, with X in the low-word. This instantiator is somewhat
  84763.     similar to the Windows MAKEPOINT macro."
  84764.  
  84765.     ^(self new)
  84766.         lowSWord: aPoint x;
  84767.         highSWord: aPoint y;
  84768.         yourself!
  84769.  
  84770. initialize
  84771.     "Private - Initialize the receiver's class variables.
  84772.         self initialize
  84773.     "
  84774.  
  84775.     VMLibrary default registryAt: self name put: self!
  84776.  
  84777. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  84778. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥▐ⁿ?e!
  84779.  
  84780. uninitialize
  84781.     "Private - Uninitialize the receiver prior to its removal from the image."
  84782.  
  84783.     VMLibrary default registryAt: self name put: nil!
  84784.  
  84785. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  84786. m»g|jmT]x≈Å
  84787. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{AÜ·▒! !
  84788.  
  84789. !DWORD methodsFor!
  84790.  
  84791. asSignedInteger
  84792.     "Answer the signed 32-bit Integer value of the receiver."
  84793.  
  84794.     ^bytes sdwordAtOffset: 0!
  84795.  
  84796. highSWord
  84797.     "Answer the high-order signed word of the receiver. Assumes little-endian
  84798.     ordering."
  84799.  
  84800.     ^bytes swordAtOffset: 2!
  84801.  
  84802. highSWord: anInteger
  84803.     "Set the high-order signed word of the receiver. Assumes little-endian
  84804.     ordering. Answer the receiver."
  84805.  
  84806.     bytes swordAtOffset: 2 put: anInteger!
  84807.  
  84808. highWord
  84809.     "Answer the high-order word of the receiver. Assumes little-endian
  84810.     ordering."
  84811.  
  84812.     ^bytes wordAtOffset: 2!
  84813.  
  84814. highWord: anInteger
  84815.     "Set the high-order word of the receiver. Assumes little-endian
  84816.     ordering. Answer the receiver."
  84817.  
  84818.     bytes wordAtOffset: 2 put: anInteger!
  84819.  
  84820. lowSWord
  84821.     "Answer the low-order signed word of the receiver. Assumes little-endian
  84822.     ordering."
  84823.  
  84824.     ^bytes swordAtOffset: 0!
  84825.  
  84826. lowSWord: anInteger
  84827.     "Answer the low-order signed word of the receiver. Assumes little-endian
  84828.     ordering. Answer the receiver."
  84829.  
  84830.     bytes swordAtOffset: 0 put: anInteger!
  84831.  
  84832. lowWord
  84833.     "Answer the low-order word of the receiver. Assumes little-endian
  84834.     ordering."
  84835.  
  84836.     ^bytes wordAtOffset: 0!
  84837.  
  84838. lowWord: anInteger
  84839.     "Answer the low-order word of the receiver. Assumes little-endian
  84840.     ordering. Answer the receiver."
  84841.  
  84842.     bytes wordAtOffset: 0 put: anInteger!
  84843.  
  84844. value
  84845.     "Answer the receiver's value field as a Smalltalk object."
  84846.  
  84847.     ^(bytes dwordAtOffset: 0)!
  84848.  
  84849. value: anObject
  84850.     "Set the receiver's value field to the value of anObject."
  84851.  
  84852.     bytes dwordAtOffset: 0 put: anObject! !
  84853.  
  84854. QWORD comment:
  84855. '<QWORD> is an abstract superclass for the two Win32 64-bit integer structures, LARGE_INTEGER (signed), and ULARGE_INTEGER (unsigned).
  84856.  
  84857. This class of structures is useful for communication with Win32 services that require 64-bit integer parameters. They also provide for easy access to the high and low 32-bit constituents of the integer''s native representation (Intel format 2''s complement).'!
  84858. !QWORD class methodsFor!
  84859.  
  84860. defineTemplate
  84861.     "Initialize the receiver class' structure template."
  84862.  
  84863.     super defineTemplate.
  84864.     alignment := 8!
  84865.  
  84866. τM"1 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H g^_oQ╢òIcf[¼<QoΓ╛3 ┌º≈Ñ¢τ▌ÆzJ@zh▀ⁿ7¡╠╔OMçQÇVsºF║y╨σAJI1∩$≥┤0ôV|⌐|└å╤π╧┤fÜî╒╤e├¢>zôW%Iª╔:█╙[!
  84867.  
  84868. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  84869. m»g|jmT]x≈Å
  84870. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{AÜ÷▒! !
  84871.  
  84872. !QWORD methodsFor!
  84873.  
  84874. asInteger
  84875.     "Answer the 64-bit integer value stored in the receiver."
  84876.  
  84877.     ^(self highPart bitShift: 32) + self lowPart!
  84878.  
  84879. asString
  84880.     "Answer the String representation of the receiver."
  84881.  
  84882.     ^self asInteger displayString!
  84883.  
  84884. displayOn: aStream
  84885.     "Append a text representation of the receiver to aStream."
  84886.  
  84887.     aStream nextPutAll: self asString!
  84888.  
  84889. highPart
  84890.     "Answer the receiver's high 32-bits."
  84891.  
  84892.     ^self subclassResponsibility!
  84893.  
  84894. highPart: anObject
  84895.     "Set the receiver's highPart field to the value of anObject."
  84896.  
  84897.     ^self subclassResponsibility!
  84898.  
  84899. lowPart
  84900.     "Answer the receiver's low 32-bits."
  84901.  
  84902.     ^self subclassResponsibility!
  84903.  
  84904. lowPart: anObject
  84905.     "Set the receiver's lowPart field to the value of anObject."
  84906.  
  84907.     ^self subclassResponsibility!
  84908.  
  84909. printOn: aStream
  84910.     "Append a debug text representation of the receiver to aStream."
  84911.  
  84912.     aStream
  84913.         basicPrint: self;
  84914.         nextPut: $(; display: self; nextPut: $)
  84915. !
  84916.  
  84917. value
  84918.     "Answer the receiver's value as a Smalltalk object."
  84919.  
  84920.     ^self asInteger!
  84921.  
  84922. value: anInteger
  84923.     "Set the <integer> value of the receiver."
  84924.  
  84925.     self
  84926.         highPart: (anInteger bitShift: -32);
  84927.         lowPart: (anInteger bitAnd: 16rFFFFFFFF)! !
  84928.  
  84929. SBYTE comment:
  84930. '<SBYTE> is an <ExternalStructure> class to wrap the Win32 type of the same name.
  84931.  
  84932. SBYTE is used to represent signed 8-bit integers in conjunction with Win32 APIs. 
  84933.  
  84934. The range of integer values that can be represented by instances of this class is defined by the interval:
  84935.     (-2**7) to: (2**7)-1    (i.e. -128 to: 127)
  84936. '!
  84937. !SBYTE class methodsFor!
  84938.  
  84939. αV5, ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3KZ╙ù-ÿY%lQVh╢╔
  84940. @v/Lóp_sΓ¬.║ég╝▓ÑÉ÷├= àuG^.s╧╛n>»┌╙ü╙pεVÑxöAΦ^dRêvÜ╬KÖQqó|╥Ç╤≈╒│3ç ▀Å¢yO╝⌠TA½vi┼ⁿs╪╓ZδEo╪F╩│$o╣╚l╩G|Ç,Ñ╬ûG`ª╝²φ«D┼₧6╨▐É`gGg+!
  84941.  
  84942. defineFields
  84943.     "Define the fields of the BYTE 'structure'. ExternalInteger subclasses
  84944.     have a single value.
  84945.         SBYTE compileDefinition
  84946.     "
  84947.  
  84948.     self defineField: #value type: SBYTEField new!
  84949.  
  84950. τM"1 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H g^_oQ╢òIcf[¼<QoΓ╛3 ┌º≈Ñ¢τ▌ÆzJ@zh▀ⁿ7¡╠╔OMçQÇVsºF║y╨σAJI1∩$≥┤0ôV|⌐|└å╤π╧┤fÜî╒╤e├¢>zæB3Oº╔:█╙[!
  84951.  
  84952. fieldType: indirs
  84953.     "Private - Answer the <ExternalField> type to be used to represent the receiver's field type in 
  84954.     other structures with the given number of <integer> indirections."
  84955.  
  84956.     #todo "Hmmm, is a different array type needed here. Should arrays of these be strings - probably not in general".
  84957.     ^super fieldType: indirs!
  84958.  
  84959. initialize
  84960.     "Private - Initialize the receiver's class variables.
  84961.         self initialize
  84962.     "
  84963.  
  84964.     VMLibrary default registryAt: self name put: self!
  84965.  
  84966. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  84967. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥╔Ω9d!
  84968.  
  84969. uninitialize
  84970.     "Private - Uninitialize the receiver prior to its removal from the image."
  84971.  
  84972.     VMLibrary default registryAt: self name put: nil!
  84973.  
  84974. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  84975. m»g|jmT]x≈Å
  84976. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{]Γτ! !
  84977.  
  84978. !SBYTE methodsFor!
  84979.  
  84980. value
  84981.     "Answer the receiver's value field as a Smalltalk object."
  84982.  
  84983.     ^(bytes sbyteAtOffset: 0)!
  84984.  
  84985. value: anObject
  84986.     "Set the receiver's value field to the value of anObject."
  84987.  
  84988.     bytes sbyteAtOffset: 0 put: anObject! !
  84989.  
  84990. SDWORD comment:
  84991. '<SDWORD> is an <ExternalStructure> class to wrap the Win32 type of the same name.
  84992.  
  84993. SDWORD is used to represent signed 32-bit integers in conjunction with Win32 APIs. 
  84994.  
  84995. The range of integer values that can be represented by instances of this class is defined by the interval:
  84996.     (-2**31) to: (2**31)-1
  84997. '!
  84998. !SDWORD class methodsFor!
  84999.  
  85000. αV5, ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3KZ╙ù-ÿY%lQVh╢╔
  85001. @v/Lóp_sΓ¬.║ég╝▓ÑÉ÷├= àuG^.s╧╛n>»┌╙ü╙pεVÑxöAΦ^dRêvÜ╬KÖQqó|╥Ç╤≈╒│3ç ▀Å¢yO╝⌠TA½vi┼ⁿs╪╓ZδEo╪F╩│$o╣╚l╩G|Ç,Ñ╬ûG`ª╝²φ«D┼₧6╨▐ü.5Jtq*t ÅÄ}!
  85002.  
  85003. defineFields
  85004.     "Define the fields of the SDWORD 'structure'. ExternalInteger subclasses
  85005.     have a single value.
  85006.         SDWORD recompileDefinition
  85007.     "
  85008.  
  85009.     self defineField: #value type: SDWORDField new!
  85010.  
  85011. τM"1 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H g^_oQ╢òIcf[¼<QoΓ╛3 ┌º≈Ñ¢τ▌ÆzJ@zh▀ⁿ7¡╠╔OMçQÇVsºF║y╨σAJI1∩$≥┤0ôV|⌐|└å╤π╧┤fÜî╒╤e├¢>zæD=T░╦╫┌Sπ!
  85012.  
  85013. fromUnsignedInteger: anUnsignedInteger
  85014.     "Answer a new instance of the receiver with contents copied from anInteger"
  85015.  
  85016.     ^self new unsignedValue: anUnsignedInteger!
  85017.  
  85018. initialize
  85019.     "Private - Initialize the receiver's class variables.
  85020.         self initialize
  85021.     "
  85022.  
  85023.     VMLibrary default registryAt: self name put: self!
  85024.  
  85025. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  85026. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥╔Σ"s²!
  85027.  
  85028. uninitialize
  85029.     "Private - Uninitialize the receiver prior to its removal from the image."
  85030.  
  85031.     VMLibrary default registryAt: self name put: nil!
  85032.  
  85033. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  85034. m»g|jmT]x≈Å
  85035. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{]ττ! !
  85036.  
  85037. !SDWORD methodsFor!
  85038.  
  85039. asUnsignedInteger
  85040.     "Answer the unsigned 32-bit Integer value of the receiver."
  85041.  
  85042.     ^bytes dwordAtOffset: 0!
  85043.  
  85044. unsignedValue: anUnsigned
  85045.     "Set the receiver's value field to the value of the unsigned positive
  85046.     integer, anUnsigned."
  85047.  
  85048.     bytes dwordAtOffset: 0 put: anUnsigned!
  85049.  
  85050. value
  85051.     "Answer the receiver's value field as a Smalltalk object.
  85052.     Automatically generated get method - do not modify"
  85053.  
  85054.     ^(bytes sdwordAtOffset: 0)!
  85055.  
  85056. value: anObject
  85057.     "Set the receiver's value field to the value of anObject.
  85058.     Automatically generated set method - do not modify"
  85059.  
  85060.     bytes sdwordAtOffset: 0 put: anObject! !
  85061.  
  85062. SWORD comment:
  85063. '<SWORD> is an <ExternalStructure> class to wrap the Win32 type of the same name.
  85064.  
  85065. SWORD is used to represent signed 16-bit integers in conjunction with Win32 APIs. 
  85066.  
  85067. The range of integer values that can be represented by instances of this class is defined by the interval:
  85068.     (-2**15) to: (2**15)-1'!
  85069. !SWORD class methodsFor!
  85070.  
  85071. αV5, ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3KZ╙ù-ÿY%lQVh╢╔
  85072. @v/Lóp_sΓ¬.║ég╝▓ÑÉ÷├= àuG^.s╧╛n>»┌╙ü╙pεVÑxöAΦ^dRêvÜ╬KÖQqó|╥Ç╤≈╒│3ç ▀Å¢yO╝⌠TA½vi┼ⁿs╪╓ZδEo╪F╩│$o╣╚l╩G|Ç,Ñ╬ûG`ª╝²φ«D┼₧6╨▐ü=-Wbtt3ùgë!
  85073.  
  85074. defineFields
  85075.     "Define the fields of the SWORD 'structure'. ExternalInteger subclasses
  85076.     have a single value.
  85077.         SWORD compileDefinition
  85078.     "
  85079.  
  85080.     self defineField: #value type: SWORDField new!
  85081.  
  85082. τM"1 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H g^_oQ╢òIcf[¼<QoΓ╛3 ┌º≈Ñ¢τ▌ÆzJ@zh▀ⁿ7¡╠╔OMçQÇVsºF║y╨σAJI1∩$≥┤0ôV|⌐|└å╤π╧┤fÜî╒╤e├¢>zæW%Iª╔:█╙[!
  85083.  
  85084. initialize
  85085.     "Private - Initialize the receiver's class variables.
  85086.         self initialize
  85087.     "
  85088.  
  85089.     VMLibrary default registryAt: self name put: self!
  85090.  
  85091. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  85092. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥╔ⁿ?e!
  85093.  
  85094. uninitialize
  85095.     "Private - Uninitialize the receiver prior to its removal from the image."
  85096.  
  85097.     VMLibrary default registryAt: self name put: nil!
  85098.  
  85099. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  85100. m»g|jmT]x≈Å
  85101. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{]ßτ! !
  85102.  
  85103. !SWORD methodsFor!
  85104.  
  85105. asUnsignedInteger
  85106.     "Answer the unsigned 16-bit Integer value of the receiver."
  85107.  
  85108.     ^bytes wordAtOffset: 0!
  85109.  
  85110. value
  85111.     "Answer the receiver's value field as a Smalltalk object.
  85112.     Automatically generated get method - do not modify"
  85113.  
  85114.     ^(bytes swordAtOffset: 0)!
  85115.  
  85116. value: anObject
  85117.     "Set the receiver's value field to the value of anObject.
  85118.     Automatically generated set method - do not modify"
  85119.  
  85120.     bytes swordAtOffset: 0 put: anObject! !
  85121.  
  85122. WORD comment:
  85123. '<WORD> is an <ExternalStructure> class to wrap the Win32 type of the same name.
  85124.  
  85125. WORD is used to represent unsigned 16-bit integers in conjunction with Win32 APIs. 
  85126.  
  85127. The range of integer values that can be represented by instances of this class is defined by the interval:
  85128.     0 to: (2**16)-1'!
  85129. !WORD class methodsFor!
  85130.  
  85131. αV5, ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3KZ╙ù-ÿY%lQVh╢╔
  85132. @v/Lóp_sΓ¬.║ég╝▓ÑÉ÷├= àuG^.s╧╛n>»┌╙ü╙pεVÑxöAΦ^dRêvÜ╬KÖQqó|╥Ç╤≈╒│3ç ▀Å¢yO╝⌠TA½vi┼ⁿs╪╓ZδEo╪F╩│$o╣╚l╩G|Ç,Ñ╬ûG`ª╝²φ«D┼₧6╨▐à%0AgGg+π`!
  85133.  
  85134. defineFields
  85135.     "Define the fields of the WORD 'structure'. ExternalInteger subclasses
  85136.     have a single value.
  85137.         WORD compileDefinition
  85138.     "
  85139.  
  85140.     self defineField: #value type: WORDField new!
  85141.  
  85142. τM"1 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H g^_oQ╢òIcf[¼<QoΓ╛3 ┌º≈Ñ¢τ▌ÆzJ@zh▀ⁿ7¡╠╔OMçQÇVsºF║y╨σAJI1∩$≥┤0ôV|⌐|└å╤π╧┤fÜî╒╤e├¢>zòO8_ñµ6╥█!
  85143.  
  85144. initialize
  85145.     "Private - Initialize the receiver's class variables.
  85146.         self initialize
  85147.     "
  85148.  
  85149.     VMLibrary default registryAt: self name put: self!
  85150.  
  85151. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  85152. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥═ß)!
  85153.  
  85154. uninitialize
  85155.     "Private - Uninitialize the receiver prior to its removal from the image."
  85156.  
  85157.     VMLibrary default registryAt: self name put: nil!
  85158.  
  85159. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  85160. m»g|jmT]x≈Å
  85161. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{AÜⁿ▒! !
  85162.  
  85163. !WORD methodsFor!
  85164.  
  85165. asSignedInteger
  85166.     "Answer the signed 16-bit Integer value of the receiver."
  85167.  
  85168.     ^bytes swordAtOffset: 0!
  85169.  
  85170. value
  85171.     "Answer the receiver's value field as a Smalltalk object.
  85172.     Automatically generated get method - do not modify"
  85173.  
  85174.     ^(bytes wordAtOffset: 0)!
  85175.  
  85176. value: anObject
  85177.     "Set the receiver's value field to the value of anObject.
  85178.     Automatically generated set method - do not modify"
  85179.  
  85180.     bytes wordAtOffset: 0 put: anObject! !
  85181.  
  85182. LARGE_INTEGER comment:
  85183. '<LARGE_INTEGER> is an <ExternalStructure> class to wrap the Win32 structure of the same name.
  85184.  
  85185. LARGE_INTEGER is used to represent signed 64-bit integers in conjunction with Win32 APIs. 
  85186.  
  85187. The range of integer values that can be represented by instances of this class is defined by the interval:
  85188.     (-2**63) to: (2**63)-1
  85189.  
  85190. '!
  85191. !LARGE_INTEGER class methodsFor!
  85192.  
  85193. defineFields
  85194.     "Define the fields of the LARGE_INTEGER 'structure'.
  85195.  
  85196.         struct {
  85197.             DWORD LowPart;
  85198.             LONG HighPart;
  85199.         };
  85200.  
  85201.         LARGE_INTEGER compileDefinition
  85202.     "
  85203.  
  85204.     self
  85205.         defineField: #lowPart type: (DWORDField new) beOverride;
  85206.         defineField: #highPart type: (SDWORDField new) beOverride
  85207.  
  85208. !
  85209.  
  85210. τM"1 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3s╩É;@Ö^H g^_oQ╢òIcf[¼<QoΓ╛3 ┌º≈Ñ¢τ▌ÆzJ@zh▀ⁿ7¡╠╔OMçQÇVsºF║y╨σAJI1∩$≥┤0ôV|⌐|└å╤π╧┤fÜî╒╤e├¢>zæQ=T░╦╫┌Sπ!
  85211.  
  85212. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  85213. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥╔Σ"s²!
  85214.  
  85215. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  85216. m»g|jmT]x≈Å
  85217. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{]δτ! !
  85218.  
  85219. !LARGE_INTEGER methodsFor!
  85220.  
  85221. asInteger
  85222.     "Answer the 64-bit integer value stored in the receiver."
  85223.  
  85224.     ^bytes sqwordAtOffset: 0!
  85225.  
  85226. highPart
  85227.     "Answer the receiver's highPart field as a Smalltalk object.
  85228.     Automatically generated get method - do not modify"
  85229.  
  85230.     ^(bytes sdwordAtOffset: 4)!
  85231.  
  85232. highPart: anObject
  85233.     "Set the receiver's highPart field to the value of anObject.
  85234.     Automatically generated set method - do not modify"
  85235.  
  85236.     bytes sdwordAtOffset: 4 put: anObject!
  85237.  
  85238. lowPart
  85239.     "Answer the receiver's lowPart field as a Smalltalk object.
  85240.     Automatically generated get method - do not modify"
  85241.  
  85242.     ^(bytes dwordAtOffset: 0)!
  85243.  
  85244. lowPart: anObject
  85245.     "Set the receiver's lowPart field to the value of anObject.
  85246.     Automatically generated set method - do not modify"
  85247.  
  85248.     bytes dwordAtOffset: 0 put: anObject! !
  85249.  
  85250. ULARGE_INTEGER comment:
  85251. '<ULARGE_INTEGER> is an <ExternalStructure> class to wrap the Win32 structure of the same name.
  85252.  
  85253. ULARGE_INTEGER is used to represent unsigned 64-bit integers in conjunction with Win32 APIs. 
  85254.  
  85255. The range of integer values that can be represented by instances of this class is defined by the interval:
  85256.     0 to: (2**64)-1
  85257. '!
  85258. !ULARGE_INTEGER class methodsFor!
  85259.  
  85260. defineFields
  85261.     "Define the fields of the ULARGE_INTEGER 'structure'.
  85262.  
  85263.         struct {
  85264.             DWORD LowPart;
  85265.             DWORD HighPart;
  85266.         };
  85267.  
  85268.         ULARGE_INTEGER compileDefinition
  85269.     "
  85270.  
  85271.     self
  85272.         defineField: #lowPart type: DWORDField new beOverride;
  85273.         defineField: #highPart type: DWORDField new beOverride
  85274. !
  85275.  
  85276. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  85277. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥╦ⁿ?e! !
  85278.  
  85279. !ULARGE_INTEGER methodsFor!
  85280.  
  85281. asInteger
  85282.     "Answer the 64-bit integer value stored in the receiver."
  85283.  
  85284.     ^bytes qwordAtOffset: 0!
  85285.  
  85286. highPart
  85287.     "Answer the receiver's highPart field as a Smalltalk object.
  85288.     Automatically generated get method - do not modify"
  85289.  
  85290.     ^(bytes dwordAtOffset: 4)!
  85291.  
  85292. highPart: anObject
  85293.     "Set the receiver's highPart field to the value of anObject.
  85294.     Automatically generated set method - do not modify"
  85295.  
  85296.     bytes dwordAtOffset: 4 put: anObject!
  85297.  
  85298. lowPart
  85299.     "Answer the receiver's lowPart field as a Smalltalk object.
  85300.     Automatically generated get method - do not modify"
  85301.  
  85302.     ^(bytes dwordAtOffset: 0)!
  85303.  
  85304. lowPart: anObject
  85305.     "Set the receiver's lowPart field to the value of anObject.
  85306.     Automatically generated set method - do not modify"
  85307.  
  85308.     bytes dwordAtOffset: 0 put: anObject! !
  85309.  
  85310. HRESULT comment:
  85311. ''!
  85312. !HRESULT class methodsFor!
  85313.  
  85314. fail
  85315.     "Answer the generic failure HRESULT."
  85316.  
  85317.     ^Fail!
  85318.  
  85319. initialize
  85320.     "Private - Initialize the receiver's class variables.
  85321.         self initialize
  85322.     "
  85323.  
  85324.     Fail := self fromInteger: E_FAIL.!
  85325.  
  85326. notImplemented
  85327.     "Answer the 'not implemented' HRESULT."
  85328.  
  85329.     ^E_NOTIMPL!
  85330.  
  85331. ntStatusCode: anInteger
  85332.     "Make and answer an HRESULT from the NT status code, anInteger."
  85333.  
  85334.     ^self fromUnsignedInteger: (anInteger bitOr: FACILITY_NT_BIT)!
  85335.  
  85336. severity: sev facility: fac code: code
  85337.     "Private - Make and answer an HRESULT from the arguments."
  85338.  
  85339.     ^self fromUnsignedInteger: (
  85340.         ((sev bitAnd: 1) bitShift: 31) bitOr:
  85341.             (((fac bitAnd: 16r1FFF) bitShift: 16) bitOr: (code bitAnd: 16rFFFF)))
  85342. !
  85343.  
  85344. status: code facility: fac
  85345.     "Private - Make and answer an HRESULT from the arguments."
  85346.  
  85347.     ^self severity: SEVERITY_ERROR facility: fac code: code!
  85348.  
  85349. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  85350. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥╥÷>t⌡╙!
  85351.  
  85352. ≈PJp\zö¥;?╗╜ëj╚└┌ⁿ█√┼ƒ┴╢≈σebìÆßUGB╦ö;àZU?gIVoOΓÄ^Kc6]ªoVd╢δ4≥█¡┤▓ùß╩P╒4m    Σ .zűßL\ÜÆ|íMòr₧ΦPA+íeïä█t@ô%ß╜±▒à! !
  85353.  
  85354. !HRESULT methodsFor!
  85355.  
  85356. displayOn: aStream
  85357.     "Append a textual representation of the receiver to aStream."
  85358.  
  85359.     | buf len cr hresultCode lines |
  85360.     buf := String new: 255.
  85361.     hresultCode := self asInteger.
  85362.     len := KernelLibrary default
  85363.                 formatMessage: ##(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS)
  85364.                 lpSource: 0
  85365.                 dwMessageId: self asInteger dwLanguageId: 0
  85366.                 lpBuffer: buf nSize: buf basicSize
  85367.                 arguments: 0.
  85368.     len == 0
  85369.         ifTrue: [
  85370.             aStream 
  85371.                 nextPutAll: 'Unrecognised HRESULT - ';
  85372.                 nextPutAll: (self asUnsignedInteger printStringRadix: 16)]
  85373.         ifFalse: [
  85374.             "Windows appends trailing line delimiter, and breaks up the text into lines too, 
  85375.             so we remove them."
  85376.             lines := buf lines.
  85377.             lines from: 1 to: lines size-1 do: [:l | aStream nextPutAll: l; space].
  85378.             aStream pop]!
  85379.  
  85380. errorCode
  85381.     "Answer the Win32 status code extracted from the receiver's code.
  85382.  
  85383.         #define HRESULT_CODE(hr)    ((hr) & 0xFFFF)"
  85384.  
  85385.     ^self asUnsignedInteger maskClear: ##(16r1FFF bitShift: 16)!
  85386.  
  85387. facility
  85388.     "Answer a string describing the facility of the receiver's HRESULT code."
  85389.  
  85390.     ^FacilityCodes keyAtValue: self facilityCode ifAbsent: ['Unknown facility']!
  85391.  
  85392. facilityCode
  85393.     "Answer the Win32 facility code extracted from the receiver's code.
  85394.  
  85395.         #define HRESULT_FACILITY(hr)  (((hr) >> 16) & 0x1fff)"
  85396.  
  85397.     ^(self asUnsignedInteger bitShift: -16) bitAnd: 16r1FFF!
  85398.  
  85399. failed
  85400.     "Answer whether the receiver represents the result of a failed operation
  85401.     (named for compatibility with the C/C++ FAILED macro)."
  85402.  
  85403.     ^self asUnsignedInteger anyMask: 16r80000000!
  85404.  
  85405. isSeverityError
  85406.     "Answer whether the receiver is a SEVERITY_ERROR code."
  85407.  
  85408.     ^self severity == SEVERITY_ERROR!
  85409.  
  85410. printOn: aStream
  85411.     "Append a debug textual representation of the receiver to aStream."
  85412.  
  85413.     aStream
  85414.         basicPrint: self;
  85415.         nextPutAll: '(0x'.
  85416.     self asUnsignedInteger printOn: aStream base: 16 showRadix: false.
  85417.     aStream
  85418.         nextPutAll: ' - ';
  85419.         display: self;
  85420.         nextPut: $)!
  85421.  
  85422. severity
  85423.     "Answer the severity of the HRESULT (1 for errors, otherwise 0)."
  85424.  
  85425.     ^(self asInteger bitShift: -31) bitAnd: 16r1!
  85426.  
  85427. statusCode
  85428.     "Answer the Win32 status code extracted from the receiver.
  85429.  
  85430.         #define HRESULT_CODE(hr)    ((hr) & 0xFFFF)"
  85431.  
  85432.     ^self asUnsignedInteger bitAnd: 16rFFFF!
  85433.  
  85434. succeeded
  85435.     "Answer whether the receiver represents the result of a successful operation
  85436.     (named for compatibility with the C/C++ SUCCEEDED macro)."
  85437.  
  85438.     ^self failed not! !
  85439.  
  85440. VARIANT_BOOL comment:
  85441. 'VARIANT_BOOL is an <ExternalStructure> class to represent the Automation type, VARIANT_BOOL, which is VB''s boolean type.
  85442.  
  85443. VARIANT_BOOL is a 16-bit signed integer value where -1 is used to represent true, and 0 is used to represent false. This class has a slightly looser definition in that it maps any non-zero value to true on access, and any non-zero/true value to -1 on mutation.'!
  85444. !VARIANT_BOOL class methodsFor!
  85445.  
  85446. ΦG(XR══'⌐╛ë8┼>í╟·┼Ω╓▌┘╗▓¼PL▒▓├;aMF└ü-WÖKE>gT]+    ∙ô^Mn#▒yPo½╜%ΦÉm┬┌▌≈╔φ¢q_.i┘│c!
  85447.  
  85448. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐ì≥├^₧zWga╓╡w7├ú⌐% {∙Câo┐éεH=τeè╥M▄Pq½    /╟Ç┌╫╪·3¢ô¥╙rú⌠T╖tP;æΩ?╪!
  85449.  
  85450. ∩A0;&(íî&s·¿ƒ:Ç<⌡≈π═φ─ƒ█┐ á    ╛ê┘vqGZÆΘT;╒oV#xZGnO╗┴?Wu1J▒<R*¼«7║éc╕▓┤è⌐Å╫`V.c╓╜~!!Γë┴JXÉç5y»PÑ1╨≥U1⌡l▀╨XæG8∞╩ƒ┴∙└∞3σg÷î¢u ª▒^WΓakÉα#╠╓^≤Do╩P╚Vß(qδ┬k╟Lz╔1╢£éWd╢¡∞φá    «┤tT╝áá`OCtu¥J≈ tñ}á{πƒX~,FO╬ó#èI╓≥▐╖≡dσ┤█좼ε╦├!
  85451.  
  85452. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  85453. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥╠ß/n÷╦!
  85454.  
  85455. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]J▒▓╘rrD_╚ü~FƒZ8kXVb≤ô^It/@▒<GeΓó4Θ₧PÑ╕íƒ√Å ÿyfeÜ╡`3⌐╠Ä% {∙Câo┐éεH=τeè╥M▄Pq½    /╟Ç┌╫╪·3¢ô¥╙rú⌠T╖tP;îµ?!
  85456.  
  85457. ≈PJp\zö¥;?╗╜ëj╚└┌ⁿ█√┼ƒ┴╢≈σebìÆßUGB╦ö;àZU?gIVoOΓÄ^Kc6]ªoVd╢δ4≥█¡┤▓ùß╩P╒4m    ΣèYîµ∩u! !
  85458.  
  85459. !VARIANT_BOOL methodsFor!
  85460.  
  85461. αW:4íÄ<D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥;r[╙─_ûSH>oWX+S╘ÄUc'A²<\h¿«#ε₧
  85462. ║ó▓▐╪²\ûxM'.ÿ╤_─á■JMÖ╙tóV│!
  85463.  
  85464. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR½╛╪ofIZÆû;BàZW/`OR∙Å^V`f[½yxº¿%≤╚GΦú╕▐÷ⁿ ÆuSN,░╤[╜╠╠_£╜yó.▄∙·e]=╗$ñ═LîGf∞.┌£╫┘┬·3ë>ïëû}ô£=-╦i ]âπ █à▄,EÑ6│└9sⁿ╞uéLk╪+ü╔ùex┐⌠╕╢≤ñ≥ J╕∞ºk,<b[τcè~9w{B▄ùQ▒µoLjm⌠╡┐h7│╖∞╒ûì╙Φñ≤W▄Ω╧/╬    $HCç;╩.Fv├ƒ] Kz└5╗╞«╟Γ!
  85465.  
  85466. ≈E+0U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√╓z]SÆé7W¢[+}R+<√ÇUr'C¿<H¡ñ, ▀L^µ⌡┌⌠ÜÑu äaN| ╠╜a'½ë▐┼!
  85467.  
  85468. ≈E+0bΣÄ<╕úë)æî╛åÄ═╥╦ò¬·áQ║╕┼reMDòù~DûSQ/.]Zn≥┴
  85469. V&2Gª<eKÉé╘Ω}"çÿ¢▐≥▐    üuR`t╖╓zπÿÇ_GçVç`½÷-╨≤C9φwÜù▐/┴jU└ç╙≤▐αeëè₧╔<G» xF¿e    o┬ε ⁿ╨PδD.┬╙╟?tⁿ¥8∙?²╕┌ÑExá½ó╛█Vò╜! !
  85470.  
  85471. ExternalPointer comment:
  85472. 'ExternalPointer is a class to represent pointers to arbitrary blocks of externally allocated memory where the size of the block is known and can be associated with the pointer.'!
  85473. !ExternalPointer methodsFor!
  85474.  
  85475. byteSize
  85476.     "Answer the size of the memory block at which the receiver is pointing."
  85477.  
  85478.     ^byteSize
  85479.     !
  85480.  
  85481. byteSize: anInteger
  85482.     "Record the size of the memory block at which the receiver is pointing."
  85483.  
  85484.     byteSize := anInteger
  85485.     !
  85486.  
  85487. initialize: anInteger
  85488.     "Initialize the receiver to be a pointer to the specified size of memory block."
  85489.  
  85490.     super initialize: anInteger.
  85491.     byteSize := anInteger!
  85492.  
  85493. size
  85494.     "Answer the size of the memory block at which the receiver is pointing."
  85495.  
  85496.     ^byteSize
  85497.     ! !
  85498.  
  85499. LPBSTR comment:
  85500. 'LPBSTR is a class to represent pointers to BSTRs (Basic Strings). It is useful where an IDispatch method requires that a BSTR argument be passed by references, or when implement such a method as a means of returning a BSTR reference.
  85501.  
  85502. LPBSTR implicitly converts to the referenced string when asked for its value, rather than answering the pointer value itself.
  85503.  
  85504. For example:
  85505.  
  85506.     bstr := ''abc'' asBSTR.                "Ctrl+E"
  85507.     (LPBSTR fromAddress: bstr basicYourAddress)     "Ctrl+D"
  85508.  
  85509. Note that because BSTR is an indirection class (BSTRs are pointers to strings), it is necessary to send its instances #basicYourAddress to get the address of the object, rather than #yourAddress which will return the contained address.
  85510. '!
  85511. !LPBSTR class methodsFor!
  85512.  
  85513. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐ì≥├^₧zWga╓╡w7├ú⌐% {∙Câo┐éεH=τeè╥M▄Pq½    /╟Ç┌╫╪·3¢ô¥╙rú⌠T╖tP;æΩ?╪!
  85514.  
  85515. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]J▒▓╘rrD_╚ü~FƒZ8kXVb≤ô^It/@▒<GeΓó4Θ₧PÑ╕íƒ√Å ÿyfeÜ╡`3⌐╠Ä% {∙Câo┐éεH=τeè╥M▄Pq½    /╟Ç┌╫╪·3¢ô¥╙rú⌠T╖tP;îµ?! !
  85516.  
  85517. !LPBSTR methodsFor!
  85518.  
  85519. αW'1¬ê_C╙δ¡$û(Σ╞»═╛Σ╦╟╖ⁿó@░╢╨t`MRÆï8âWAjmSRy⌡òKuf@Ñ<Gbºδ2 ▌G    ╛▓Ñ╥╖└s²Jk ▀▒}&╖ë╙MZ£öV|¿óuòAεTL 1≈aì₧PÅu∞)▀₧âµ├⌐}£ì╒╤e╟£=-£swä»2═ΩQεB ╚ZΘß$o■çy╤qz╥6┐█!
  85520.  
  85521. αW<;½ï7«╗à$éRï╜¡φ≡─╚╨¼▓ñv▒▓├twMe╞û7\ÉG%cK\x
  85522. ≥┴_&2Gª<Pbú╣!!∙╩G╗≈╕ÿ╖█╫f[ki╠╣~ε╞╥4"ⁿ¢5½NªiëA∩E]6µ$û╪êJq∞9╨ù╩α╔▓3ü▀Ü╙ró²T¡ioç²sû▌FºB ┬I▀τ$n≈çyéL{╠3±■░pF≤├ÆùΘΦαrY╕⌠╖BqNPKu3âú#1N^ë└₧╕~(QE╘åf┼oⁿ¥╗╤α!!µ⌐ò▀┌"╪ëá ▄%KH^ⁿ~σqLó╡~╧_═▒çò¥┌\┴ûò¿/₧{ÅeΦ0╩π²∞T`A    ;π8₧╓)aâ1î]àXCQwö lê⌡2≈Çì├r/^5w╘▀└└àσ]?╗δ    îîît╩>1^G=╟■~C?éxà▓!
  85523.  
  85524. ≈E+0U╬µp┤║¢/ù⌡▄ΩîóΣ╦╟╖ⁿó»┤╔ugMRÆà*òF>f^y
  85525. ⌡äOc4δRH∞δ)ε₧KΦ┤╕Ä■╩^₧zJ.S╫╜a>║╚╠RåÆpτ█²kòo\ 4τ$₧═jêP}ó!
  85526.  
  85527. ≈E+0bΣÄ=¿áé-ΦUêû▌╔ε█▐╓╗▓▒[F τΓHGzÆà*ÇWM)fGc
  85528. ╢ôZc/Yªnz¡ó.ε═íú┐▐π╟^╦Vm4\>Ü«h"╝╠╙\Füçzá╣{╨⌠TU*Σe¢▀[ÉGG╕5▌ò¥¢ª╔rÜ
  85529. èûûrα£=-îo~┬√;▀╦≥O#╔L╔Vτ%d╣╚j╦Eg╬>╜£îSz╢╝╕±µF╝ⁿe¢╙å8BcTPurܵW>tXδ$∙#╞ßX-1FA╒ô6╦Vù√æ»⌡mΦ·ô╚ë+╣≈àI▄ 9n╓Φ}Ló╛k╩hX°FƒÆÇ¢╥Mêû╠≥≡5⌐+∩<╤º≈╚}G    ┬í╖,q╤#ùG▄Kw╞poä⌡!!≡FeY▐ºß8<
  85530. jû▀┴ÖKà±K8╛δ]Ü¢▀N╩bz=*|¿Ö8C?éxà╗─┐d┼╕Γó┘╦æ▄Z╣É@EdñàÇ╧ ╣M`Φ╗ñöào?·≡EÑ¢ΣFQ∙ñ╗y├Iv ï└ªó╬⌐å¿@ªÆE▒9├¡ó╟(─ⁿä~à₧Y ≤▒
  85531. W0╕²╓╠╧YSW▐(Ä┌⌐#>╪╘∞
  85532. ╞╗▄hq╢╬:∩n5⌐ⁿG|╪u)Æ¡°└╦T╘1πµÖàñ¥@Z▄gæRª∙╥@τ₧┬░U┐.     ìO5╫ÑÄz╖"ÿü4\;╣┘ÑZ▓çΓ(╔ê$.╕Ω╟┤╨v>fαÅ÷Sym╩u8n^@àu░%½▓â%~╦╔┐╗σì║╓|Jüq ΩDv╝PtQ╠?δ≤₧{0┐W! !
  85533.  
  85534. LPSTR comment:
  85535. 'LPSTR is a class to represent pointers to single-byte strings. It is useful where an external function returns a pointer to a character string through a pointer argument, or where a callback function passes in a pointer to a string as an output parameter to be populated.
  85536.  
  85537. LPSTR implicitly converts to the referenced string when asked for its value, rather than answering the pointer value itself.'!
  85538. !LPSTR methodsFor!
  85539.  
  85540. asString
  85541.     "Answer a String composed of the characters of the receiver, or
  85542.     the empty string if the receiver is a null pointer."
  85543.     
  85544.     ^self value!
  85545.  
  85546. value
  85547.     "Answer the UnicodeString pointed at by the receiver (N.B. it is copied into Smalltalk space)"
  85548.  
  85549.     ^String fromAddress: super value! !
  85550.  
  85551. LPWSTR comment:
  85552. 'LPWSTR is a class to represent pointers to Unicode strings. It is useful where an external function (or COM method call) returns a pointer to a wide character string through a pointer argument. An example being the IEnumString interface.
  85553.  
  85554. LPWSTR implicitly converts to the referenced Unicode string when asked for its value, rather than answering the pointer value itself.
  85555.  
  85556. '!
  85557. !LPWSTR methodsFor!
  85558.  
  85559. asString
  85560.     "Answer a String composed of the characters of the receiver, or
  85561.     the empty string if the receiver is a null pointer."
  85562.     
  85563.     ^self value asString!
  85564.  
  85565. value
  85566.     "Answer the UnicodeString pointed at by the receiver (N.B. it is copied into Smalltalk space)"
  85567.  
  85568.     ^UnicodeString fromAddress: super value! !
  85569.  
  85570. ARRAYDESC comment:
  85571. 'ARRAYDESC is an ExternalStructure class to represent the COM Automation structure of the same name.
  85572.  
  85573. ARRAYDESC describes an Automation safe array, specifically the type of the elements, the number of dimensions, and the bounds for each dimension.
  85574.  
  85575. Member variables:
  85576.     tdescElem        <TYPEDESC> Type of the elements of the array
  85577.     cDims        <WORD> Number of dimensions
  85578.     rgbounds        <SAFEARRAYBOUND[]> Variable length array containing array dimension bounds'!
  85579. !ARRAYDESC class methodsFor!
  85580.  
  85581. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫~vObwN<╒┴Mt3L╖iAo∞╞Jô≡ "µ≈âû■▄\ä4_@xa╚╡l0ó╠ÇUM¢ç5╜WñhôΘCJExαj¢₧MöG4╕,╓╥╧ ╬▓rÜ▀ƒ£yε XPΓdhü²:▄┌εUo▄M╒÷?mαë¿/⌐VÉε▒eMùï╦▌áº∙pU╡σûlH\o=ÇDÄ}]&9▌▌Äñ_-/W^╧é;╦ù≈≡è╬@▌₧ñ■╣S▀èáóo^b{7àL┘+Ql┴±}─hH∩#Æä₧╒▓"≥┐¼╙q▄=Ä+Γ╠Ωδäw,&ow▒ Ç■7`«=îsƒRPºFE¼╔┬3s²î╦#=Hk╪═ΘÖF╜╕1@▐ûT÷┤¡u us2Ö¥NnW°.·æ╡╕g┐┐²░ªßó6ÿ]ªìKS⌐ùâæjεvbΦ╜ò┬└2ââ<ó╥░"░δε*ùUb2+Ä╓°ì°'ë²²`│½bç,#╩ΘÑ─╘±öÿïS]î▐f »≥╤┼É?XA╞>qÇ⌠└n5╞╙ù#ê îlΓδ:╠=┐╥p°>Eⁿδ┤φ─░_╩£öäº╘Cz╨a_─ÑΩ╟E ò╚╖|▀<P£níÑÉa
  85582. ½Qì╙W{Öé╞%╩∩∙╘A╤9zá╔╓ⁿWφPXJ╟ë╓gEÑ{Y
  85583. ^└!!Ωqí√╫t=∞╧ó▒ δΓ╒ìj^½mGσ! !
  85584.  
  85585. !ARRAYDESC methodsFor!
  85586.  
  85587. αJ&,"í¥_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;/inµ¥.W╛QB%OURg∞ä & ]¼q}¬ó#≥₧V¡≈Ñ¢⌠╩Æf|i▌╡c3║╠─
  85588. °|■|ÉLísò╝PA4°~Ü╠!
  85589.  
  85590. Γ`.&U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√├_zEEÆé7W¢[+}R+<√ÇUr'C¿<\h¿«#εÉm┬┌▌≈╔çâqM@yo╚╕L&ü╧╞JMüL╙N<!
  85591.  
  85592. ΣH"06░¼=<┤╜ß@∞}╤╞µ┌ ├┌ò≤▓ä]P¿╛╥;g@SÆÉ1FûS${VQn╢Äc*J«y]~▒δ)⌠₧C ñ≈│ù·╩₧{P.o▄ⁿy:½ë┴KZö■|║Zªx╨∙BLπa¢₧[à`ñ|┴ù└≤┼╢vÜC▌÷∙e╟╧DA«fJiàφ<╦╤[⌠&┬U▀τw!!¿çq╠VaÜèåÉ^4Θ¼╕Γá▓┤*╗á▒/`KPr!!│!
  85593.  
  85594. εS)'bΣ£&;»¬ÿG∩VúΣ²┼Φ╓╦╨■┐σ`F½√╘sv@╙ê+W╫PBjzSV+≤éPp#]Σo-¡╝. ╠@í╣ñè÷┴╫b_ga╪░hr║╞ÇM@ÉV╧7MÜZªx╣·^|*⌠gï╦KÖ4┴jU╥Ç─π┴Ñ}£A▀êçn¡σânlç²s╩╫ZºS*╧Z╙÷?/╗¬»(╧(┐┘æ.εεδΩ≥½α!
  85595.  
  85596. ≤C% 6á£_C╙δ¡$û(Σ╞»╪÷╥ƒ╟╗±áZU║⌐çh3ZQ╨ï+\ôL,g^_oO≈Æ^X&Bóp_~úº+║╤@
  85597. ¡┤ú╨╡óvs²`3zr╧┐y'╝╠ßKZö╙gíNùyö∙B\Sx⌐få╩\Åmú.≥û╟Σ╔│`╚F▀╩┴5Oó⌠YC╢hP;æΩ?╪ƒ\├H"▀▀÷ d≈╙[╬C}╙e±∩óbQÆ£╩▀┘$ç┴Nx!
  85598.  
  85599. ⌡@"    6U╬µp┤║¢/ùαö│°╟τ·±¢┴å¿│╔x{_┴─*ZÆP3~^d    ╢ò\&#CªqVd╢╕`⌡╪á▓≈ƒσ▌╫p[mr╙╛h6ε╦┘\¥╙p¡F┐kò▓<%`∞tô█TÖL`¡5▄£â╪├┤v╥M¼₧ç<ª⌠Fúc6Æα:╨╦Z⌡;├╪│9iⁿçk├OkÇ>ó£ùLq≤╝²²σ╛±r¬¼≥ kEPKo&π`è#1[X╠W╔Ö╡Kx?WE╒Åoä\Bé°╘°á@▄Äÿ▌ƒ╗σ╞:█"«yóOcWδ▓aÇz^¼ùÆ¢╬╦G█╞╩⌡VΣ>┐+τ<╫º∞╫+&
  85600. @;⌠#Ü·(%₧2▀Z╫vZ╢ED¿╚¡HH6Ñ╚åi"?F>┬█┴┌a
  85601. àε1@▐ûFê¢ÜUäl7GN╨!
  85602.  
  85603. ⌡@"    6¿è?D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`B╓ü-Q▓SA'.]Zn≥┴J&'ÉqRf«┐!!÷╒¬╜▓¥πü^s²4iPTπîHï·πNç₧7q¬Q│nâ[╝M,Σw▀╟VëPU¿.╓ü╨┐! !
  85604.  
  85605. CATEGORYINFO comment:
  85606. '<CATEGORYINFO> is an <ExternalStructure> class to wrap the struct ''COMCAT.CATEGORYINFO'' from type information in the ''OLE Component Categories Library'' library.
  85607.  
  85608. CATEGORYINFO is used in conjunction with ICatInformation>>EnumCategories() to enumerate details of the categories registered on the host machine.'!
  85609. !CATEGORYINFO class methodsFor!
  85610.  
  85611. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫|eK||Y6▀»8v&5[▒iP~╖╣%┤│(i┴öû¬╥Φ3,«]p&A ┘│`"º┼┼}Mô¥aºL╕·hæ;&`,°tÜ┌\Ü┼(┴ç└Γî┤rÅ.╛»╢[ £╚~jäOJ`∩àZ╖╢x╥h î\█·):ö¡½+{╬,╕█ìAp≤ó≈≡τFñ≈iXΓì╪ck U]t&╬∙35bLB└┘à»b<nqü∞EΓ3╓╙≡î┘F╦ê╕Σ┤Ü╕ñcóo^$
  85612. ╗u≥xS√±n┼c^■èäù╬┘Zö█àτα  ┐+φ:╟⌡∙═kZE)▒1ü° %à<Ü≥BPlòofÖ╗&÷5P┴ºδfY6╒╙╤╪PHëτPc√┐Kèü≥-╖80U╪╘!!>âeç∩╤▌∞╖⌠╗╔Ä┘òKαïC'»ç¥╬j¼"q ╗≡▌╤-xÖ¥`τë■PQ░±■;åy$Mö▄∙òε$ƒτ▓R╩ÆIÑ7é╜«╬'æ∙₧~éÅOkï▌}4»°╤╔╒YM╔2k╫▓âG)╪╘╛Iô⌠ÄlA╢£;·+z╫┤
  85613. çQ)Æ¡⌐Σ╤]░_╩£öäº╘Cz╨a_─Ñ√┴Sε█╪╜│r    J¬OT3ö░ùz4½n¥üV
  85614. ╤╟└±╩⌐`░u$╝}k┐╨▌ú1╫trk╝√ºJ>Ä.dZWƒo╔Råô│7═╩½ΓL«≈ï╥6cÇfM⌡KÅ\K8Wàk║áÇZ"┐MU¼lçá~t ε⌡▓ZÉi~G)O╤xöö╣N┤·-╞X¡ùb╚ªⁿ#╔ g0G≥Σ²U∙Æ¿∞Xæ╢LMQ╕iNEò¢jñò    ñ∙K¬╪Sz╚æBê╫\ôæ¬$P┘:¼hoU┼M! !
  85615.  
  85616. !CATEGORYINFO methodsFor!
  85617.  
  85618. ΓE31U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√├zgARÆé7W¢[+}R+<√ÇUr'C¿<\h¿«#εÉm┬┌▌≈╔Φ)7│4Xam√╕i ½┌╙▌èp╜»rà▌UK=≥w╓!
  85619.  
  85620. ΓE31bΣÄ<╕úë)æRï╜¡ √├ƒ┴╢≈σAF╝╛╔mvZ┴─=SâV@jhRVg ╢òr.JπjRf╖«`⌡╪ªÿ╡ö≥╠P╒4m    █▓B0ñ╠├Mçât¡Födä∩~ISxπ}ï█J▄Dfúfô├âΓ├·3┘[▀êç}║°YCâtP;╙!
  85621.  
  85622. σA4'1┤¢;&┤─µC╟∩╟°╔∞ù╦▌╗▓╖V@║▓╓~aEÆù$vÆLG8gKGb°┴Pc*Kπ}@*úδ|Φ█C⌐╡╗¢─█ÖsN,░╤[É┌┼UN╒ë2p╜@ñtÇ⌡^AI9≥Wï╠PÆE!
  85623.  
  85624. σA4'1┤¢;&┤≤╠.Ç,Γ╣àÑ╝Σ┌┴■µ¡V¡╛├~z^S└├-äE`/}XAbΓêW& FªpW*╢ñ`ªδL    ½╕│¢─█Ös@|e╩«h!!½╟╘X\£¥{╟L░=ä    ∙=α`₧▄UÖq`╛    2╘╠â≈▐ºfàæÅ▀< ½ΓT
  85625. α`Φå █╙YºR5ΦZ╔ß$qφ╬w╠.ê(ó╞ºAg░╝±ε⌠º· Σá╢fTS<ç    ∞5B[B└╩X!
  85626.  
  85627. φG.XR══'⌐╛ë8┼+Θ╤»▐√╘┌▄¿≈╖P ╖├rwP█ü2V╫^Wjo`f·ì
  85628. Xj-¼~Yoí┐n╕│(m┬▐ë╓⌡╓ä4Zar▐¥y¿╧╙\\╧V┬@<!
  85629.  
  85630. φG.oxÑü+░¼Å>ΦUêû▄╔Ωù╦▌╗▓╖V@║▓╓~aEÆê=[ôB#kWW+∙┴
  85631. QcfYópFoΓñ&║▀L/¬╜▓¥πü^s²4ily╬╣~r¬▐╧KL┤╝s╜Fó'╨P¬_,╗$₧╨v₧Hq»!
  85632.  
  85633. φK$=■╧>&╣¿Ç/ΦUêû▄╔Ωù╦▌╗▓╖V@║▓╓~aEÆê=[ôB#kWW+∙┴BPh2JñyA4Γç╙·«≈úû≥Å@2ÿw_ k>╖╓3╝╬╒TM¢▀Vyí@╖qòO╛<%dRêwÜ╥_▄NwÑfô₧╠⌡═¼v╚ î½Ænú⌠CA░!
  85634.  
  85635. ≥^&;╢å"=│ªéG∩Vú⌡ß▀Θ╥═ò¬·áQ║╕┼reMDòù~Aì{A9mIZ{ Ä`/J»xk▒δ!!║φOñ╗úƒ√─\ò~[z.ÿ╤_─á■lF££p¥Wñt₧╝W]5└`¢╠\ÅQ.∞H>╩å╞σî╣|¥╛ƒùn
  85636. ╜ΓΓ2Z2!
  85637.  
  85638. ≥^&;╢å"=│ªép┼>∩√φ╞√╘╦╕╘¢τ`F½√╘svD╫ç;[üZVm}@q+≤ÆKo6[¬s]*ñó%÷┌º≈úû≥Å
  85639. ¢a[@afÜ╜c¼├┼Z\█T■|─*¬=âµTUïî╫CÖ.±@=▌╜┴ⁿ╔úg╚åÅûO┤⌠    Γ2Jvïßi₧ù╡oåê_╜@ É╞vφ@d┼<Ñ£æAd┐»√√┬╝±ss┐║≥qCFK` ü╣Wb D╞MìC┌ß-/JV▀┴<ƒ[é∙▀┐▌u╛·╨â≈T▄ß╨╩w
  85640. Yⁿo⌡q░α)╨xO╢F╬! !
  85641.  
  85642. COAUTHIDENTITY comment:
  85643. '<COAUTHIDENTITY> is an <ExternalStructure> class to wrap the struct ''OBJIDL.COAUTHIDENTITY'' from type information in the ''ObjIDL Library'' library.
  85644.  
  85645. The type library contains no documentation for this struct
  85646.  
  85647. Warning: This comment was automatically generated from the struct''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.'!
  85648. !COAUTHIDENTITY class methodsFor!
  85649.  
  85650. defineFields
  85651.     "Define the fields of the COAUTHIDENTITY structure.
  85652.         COAUTHIDENTITY compileDefinition
  85653.     
  85654.         typedef         struct tagCOAUTHIDENTITY {
  85655.             unsigned short* User;
  85656.             unsigned long UserLength;
  85657.             unsigned short* Domain;
  85658.             unsigned long DomainLength;
  85659.             unsigned short* Password;
  85660.             unsigned long PasswordLength;
  85661.             unsigned long Flags;
  85662.         } COAUTHIDENTITY;
  85663.  
  85664.     "
  85665.  
  85666.     self
  85667.         defineField: #User type: (PointerField type: UnicodeString) offset: 0;
  85668.         defineField: #UserLength type: DWORDField new offset: 4;
  85669.         defineField: #Domain type: (PointerField type: UnicodeString) offset: 8;
  85670.         defineField: #DomainLength type: DWORDField new offset: 12;
  85671.         defineField: #Password type: (PointerField type: UnicodeString) offset: 16;
  85672.         defineField: #PasswordLength type: DWORDField new offset: 20;
  85673.         defineField: #Flags type: DWORDField new offset: 24.
  85674.     self byteSize: 28! !
  85675.  
  85676. COAUTHINFO comment:
  85677. '<COAUTHINFO> is an <ExternalStructure> class to wrap the struct ''OBJIDL.COAUTHINFO'' from type information in the ''ObjIDL Library'' library.
  85678.  
  85679. The type library contains no documentation for this struct
  85680.  
  85681. Warning: This comment was automatically generated from the struct''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.'!
  85682. !COAUTHINFO class methodsFor!
  85683.  
  85684. defineFields
  85685.     "Define the fields of the COAUTHINFO structure.
  85686.         COAUTHINFO compileDefinition
  85687.     
  85688.         typedef         struct tagCOAUTHINFO {
  85689.             unsigned long dwAuthnSvc;
  85690.             unsigned long dwAuthzSvc;
  85691.             LPWSTR pwszServerPrincName;
  85692.             unsigned long dwAuthnLevel;
  85693.             unsigned long dwImpersonationLevel;
  85694.             COAUTHIDENTITY* pAuthIdentityData;
  85695.             unsigned long dwCapabilities;
  85696.         } COAUTHINFO;
  85697.  
  85698.     "
  85699.  
  85700.     self
  85701.         defineField: #dwAuthnSvc type: DWORDField new offset: 0;
  85702.         defineField: #dwAuthzSvc type: DWORDField new offset: 4;
  85703.         defineField: #pwszServerPrincName type: (PointerField type: UnicodeString) offset: 8;
  85704.         defineField: #dwAuthnLevel type: DWORDField new offset: 12;
  85705.         defineField: #dwImpersonationLevel type: DWORDField new offset: 16;
  85706.         defineField: #pAuthIdentityData type: (PointerField type: COAUTHIDENTITY) offset: 20;
  85707.         defineField: #dwCapabilities type: DWORDField new offset: 24.
  85708.     self byteSize: 28! !
  85709.  
  85710. CONNECTDATA comment:
  85711. '<CONNECTDATA> is an <ExternalStructure> class to wrap the struct ''OBJIDL.CONNECTDATA'' from type information in the ''ObjIDL Library'' library.
  85712.  
  85713. The type library contains no documentation for this struct
  85714.  
  85715. Warning: This comment was automatically generated from the struct''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.'!
  85716. !CONNECTDATA class methodsFor!
  85717.  
  85718. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫|k@~p_+╫╡?u2]╢G░«nù┤+iïÿÖ░╥∞(:╢@@mo╫¼d>½φ┼_A¢çzá.▄²kò8[(Σ`Ü╪⌡+g╕)╨åâΓ═ºPº#▒╛░H+Å┼v╣`δåδ╤TΘN8┬ܵ#jó¬½+╒1ó╒äJq╖ε⌠±εΦ≡w╢∩╣>+?b/╬)╠9Tldφ6∙0╤╠3V*╖δBß3ôⁿ╫╒ûì╛ä╦ô0░┼└ ├mKQ⌐r≈O`F≥┤3Ç%kπÉòû£∙A₧┌┴ªVφ5α+╚╦∞÷╨H     O;Γ2ç¡m5╩Y⌡'╢DDjêeFä■9τPe╠╡╠X>1C>┬╬╫â"╖╠næ÷Lôæ▀I█;x_F╤⌡0Y}┼"·æ▒┴ á╝▒┤╥ƒ╬lòBÑ▐! !
  85719.  
  85720. !CONNECTDATA methodsFor!
  85721.  
  85722. σS:3¡è_C╙δ¡$û(Σ╞»╪÷╥ƒ╟╗±áZU║⌐çh3LA±ï1Y₧Z,g^_oO≈Æ^X&Bóp_~úº+║╤@
  85723. ¡┤ú╨╡óvs²`Hly╬╣~r¬▐╧KL┤╝s╜Fó'╨U╡!
  85724.  
  85725. σS:3¡èhi╗ºú(Å:Γ└éªùò∞╨¬▓▒[F ⌐┼xvA@╫ûyA╫[S    aTXb
  85726. ╢ç\j"╖s~¬«`∞▀N¡≈╕ÿ╖╬1ò~[z.ÿ╤_─á┬@\É╙bíQ▓\ä.·W\ ,╗$╦₧IëV.∞2ⁿÉ╔≤╧┤!
  85727.  
  85728. ±Q)XR══'⌐╛ë8┼+Θ╤»▐√╘┌▄¿≈╖P ½╒uxP█ü2V╫^Wjo`f·ì
  85729. Xj-¼~Yoí┐n╕│(m┬▐ë╖┬┴ÿcP@hr╒▒L6¬█┼J[╧V█l║FÑ=âδ^]⌡KÖ╪JÖV.∞Pu!
  85730.  
  85731. ±Q)oxÑü+░¼Å>ΦUêû▄╔Ωù╦▌╗▓╖V@║▓╓~aEÆö+\£B#kWW+∙┴
  85732. QcfYópFoΓñ&║▀L/¬╜▓¥πü^s²4ily╬╣~r¬▐╧KL┤╝s╜Fó'╨Q╝AZbíeæ±[ûGw╕@%▄ç╤╫╚ñaìî! !
  85733.  
  85734. COSERVERINFO comment:
  85735. 'COSERVERINFO is an ExternalStructure class to represent the DCOM structure of the same name.
  85736.  
  85737. COSERVERINFO is used to explicitly identify a remote machine when instantiating COM objects (i.e. it is used in conjunction with CoCreateInstanceEx)..
  85738.  
  85739. The only relevant member at present is #pwszName, which would usually be a UNC or DNS name, or a numeric IP address.'!
  85740. !COSERVERINFO class methodsFor!
  85741.  
  85742. defineFields
  85743.     "Define the fields of the COSERVERINFO structure.
  85744.         COSERVERINFO compileDefinition
  85745.     
  85746.         typedef         struct tagCOSERVERINFO {
  85747.             unsigned long dwReserved1;
  85748.             LPWSTR pwszName;
  85749.             COAUTHINFO* pAuthInfo;
  85750.             unsigned long dwReserved2;
  85751.         } COSERVERINFO;    
  85752.  
  85753.     "
  85754.  
  85755.     self
  85756.         defineField: #dwReserved1 type: DWORDField filler offset: 0;
  85757.         defineField: #pwszName type: (PointerField type: UnicodeString) offset: 4;
  85758.         defineField: #pAuthInfo type: (PointerField type: COAUTHINFO) offset: 8;
  85759.         defineField: #dwReserved2 type: DWORDField filler offset: 12.
  85760.     self byteSize: 16! !
  85761.  
  85762. !COSERVERINFO methodsFor!
  85763.  
  85764. hostName
  85765.     "Answer the <String> value of the receiver's member variable pwszName."
  85766.  
  85767.     ^self pwszName asString!
  85768.  
  85769. hostName: aString
  85770.     "Set the value of the receiver's pwszName member to the Unicode
  85771.     representation of the argument, aString. The Unicode String is stored
  85772.     into an inst. var. to prevent it from being GC'd."
  85773.  
  85774.     hostName := aString asUnicodeString.
  85775.     self pwszName: hostName!
  85776.  
  85777. pAuthInfo
  85778.     "Answer the receiver's pAuthInfo field as a Smalltalk object."
  85779.  
  85780.     ^COAUTHINFO fromAddress: (bytes sdwordAtOffset: 8)!
  85781.  
  85782. pAuthInfo: anObject
  85783.     "Set the receiver's pAuthInfo field to the value of anObject."
  85784.  
  85785.     bytes dwordAtOffset: 8 put: anObject yourAddress!
  85786.  
  85787. pwszName
  85788.     "Answer the receiver's pwszName field as a Smalltalk object."
  85789.  
  85790.     ^UnicodeString fromAddress: (bytes sdwordAtOffset: 4)!
  85791.  
  85792. pwszName: anObject
  85793.     "Set the receiver's pwszName field to the value of anObject."
  85794.  
  85795.     bytes dwordAtOffset: 4 put: anObject yourAddress! !
  85796.  
  85797. CURRENCY comment:
  85798. 'CURRENCY is an <ExternalStructure> class to represent the Automation structure of the same name.
  85799.  
  85800. CURRENCY is a 64-bit fractional value scaled by 10000 to give 4 decimal places. It provides limited scaled decimal capabilities for simple scripting languages such as VB. It corresponds to the variant type VT_CY.
  85801.  
  85802. CURRENCYs are mapped to/from Dolphin''s <ScaledDecimal> objects, although of course the latter has unlimited  range, and therefore many ScaledDecimals cannot be represented in a CURRENCY.'!
  85803. !CURRENCY class methodsFor!
  85804.  
  85805. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫|q\~}H6╢╞Mt3L╖iAoσσMÉ│(i┴ñ▓ƱÅÜdW kD▀║d<º▌╔VF°|·T─.▄â≡W=τmæ█òGx¿Z|Éæ┌╢╪╣cìW▀¿óK £╒qMºl;îΩ$│╡!
  85806.  
  85807. ΣT497¬ΓX@°êé9Æ:≤öεîó±╙┌┐µ√Q║½╥~`MX╞ì0U╫KL/.VZe√öt#CóhZ|ºδ3Ω▀A    ª░┌⌠₧╞^â|[@|e┘╣d$½█çJçâp╜F╕iæ⌡^AGzî≥┤0ó:ⁿPlé ⌐!
  85808.  
  85809. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐ì≥├^₧zWga╓╡w7├ú⌐% {∙Câo┐éεH=τeè╥M▄Pq½    /╟Ç┌╫╪·3¢ô¥╙rú⌠T╖tP;æΩ?╪!
  85810.  
  85811. ∞E?8-⌐ΓX@äß─x┼-α▌ⁿ╔·π╨ⁿ░µáTF¡ßÇ- â╦o╟c.Z@X ≈ì]B#L¬qRf°δt!
  85812.  
  85813. ∞M)8-⌐ΓX@äß─g╫≤╒µ▀√╙δ┌ùⁿ▒VD║⌐Ü;%¥╒n╟joH`h·ä}c%F«}_0Γ n!
  85814.  
  85815. ∞Q4*у9«áâ$ä3└╞Φ┘≤╥╤┴Σ▓ñ]fô₧φ_V{uÆΘT;⌐^JB~~O*┼ó^Pu    Z╖<]e╢!
  85816.  
  85817. ∩A0;&(íî&s·¿ƒ:Ç<⌡≈π═φ─ƒ█┐ á    ╛ê┘vqGZÆΘT;╒oV#xZGnO╗┴?Wu1J▒<R*¼«7║éc╕▓┤è⌐Å╫`V.c╓╜~!!Γë┴JXÉç5y»PÑ1╨≥U1⌡l▀╨XæG8∞╩ƒ┴∙└∞3σg÷î¢u ª▒^WΓakÉα#╠╓^≤Do╩P╚Vß(qδ┬k╟Lz╔1╢£éWd╢¡∞φá    «┤tT╝áá`OCtu¥J≈ tñ}á{πƒX~,FO╬ó#èI╓■─╡■d÷α┴╠⌐'╕ß╞!
  85818.  
  85819. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]J▒▓╘rrD_╚ü~FƒZ8kXVb≤ô^It/@▒<GeΓó4Θ₧PÑ╕íƒ√Å ÿyfeÜ╡`3⌐╠Ä% {∙Câo┐éεH=τeè╥M▄Pq½    /╟Ç┌╫╪·3¢ô¥╙rú⌠T╖tP;îµ?!
  85820.  
  85821. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  85822. m»g|jmT]x≈Å
  85823. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿirû_)B! !
  85824.  
  85825. !CURRENCY methodsFor!
  85826.  
  85827. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òΓ─äaj₧ò⌠%3ZS┬û;AÆQP+zR\eO∙ç^Mn#▒yPo½╜%ΦÉm┬┌▌≈╔ç*?Ñ].Z ╘╣z{├ú⌐0^üL╙^f½O░=å╝SF≤>▀Φmú`M₧%Ü╔«£Ñ╔aì Üëûr ½½Wºl  ∩àZ╖╞P≥S<╔S▄!
  85828.  
  85829. Γ]Jp\zàü!!>┐╗╠>ì:í╞Ω╧√▐╔╨¼╡╢@ª√╞rvDRÆà-ûw'oW_·è^Vd,Jáh(╧┴MÉ╖|H¬«ú¢ΣÅÇ{LOt⌡║k!!½▌Ü▄!
  85830.  
  85831. Γ]}Z46ïì8,╣╜ß@∞}╥╤√îΩ▀┌ò¼≈ªVJ⌐╛╥<`U╦─8[ÆS@jzT≤┴Xj3JπsU*úÑ°╘G╝∙⌡≤¥óvwòmJ} ╔¡z=╝═ßMgôÇa⌠µ=ÇΦ 6╬fò█Zê!
  85832.  
  85833. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR½╛╪ofIZÆû;BàZW/`OR∙Å^V`f[½yxº¿%≤╚GΦú╕▐÷ⁿ ÆuSN,░╤[»·╘KMö■|╟A╖nÖ╠CF,╗$î█UÜ╞iU▌ù█Γⁿ╡g╥M█╙╚e╟ÿSM▒pz¢╡sû╠ZδGo┼L⌠ !!!!≡┴L╨WkÜ袡qXƒΘ┼╛ΘÄ⌡lO╝║≥1`JSKp3éµ*y*":á~├Æ╡ix( ₧╚!
  85834.  
  85835. ≈E+0U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√╓z]SÆà-ûw'oW_·è^U%N»yWNº¿)≈▀N^µ⌡┌⌠ÜÑu ▀g[ h ┘Ñ"c■ÖÉ    ╒Ç%v»O│y┤ XB4╗$╦│3!
  85836.  
  85837. ≈E+0bΣü7>î¿Ç?ÇRï╜¡ √├ƒ┴╢≈σAF╝╛╔mvZ┴─(S¢JAjzT≤┴Bws+Mªn&ΓÑ%φΦC ╜▓∙▄ÜÑqt■g[ h ┘Ñ7rµ╟┼N~öå5Στ-└Q¼+╚jï█^ÖP! !
  85838.  
  85839. CUSTDATAITEM comment:
  85840. '<CUSTDATAITEM> is an <ExternalStructure> class to wrap the struct ''OAIDL.CUSTDATAITEM'' from type information in the ''Ole Automation Type Library'' library.
  85841.  
  85842. The type library contains no documentation for this struct
  85843.  
  85844. Warning: This comment was automatically generated from the struct''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.'!
  85845. !CUSTDATAITEM class methodsFor!
  85846.  
  85847. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫|qZr_.▀╡;t&5[▒iP~╖╣%┤│(i┴öé¡├δ=*╢]j%C ┘│`"º┼┼}Mô¥aºL╕·hæ;&`,°tÜ┌\Ü┼(┴ç└Γî┤rÅ.¬¿ºX.Ü╨~pçMJ`∩àZ╖╢x╥h îX╧≈v ô«½tO≥É≥╖b▓╝╬ ∞¡»6╨ë»J!!Pua/G»#╫2*":ñ}ñSτ╦4UPI╓çBß3kÆ⌡╫▒≥d┬│ä┴₧d⌡á╬╞w ╣&╝GGK≡ñj╘xIΘ ùäƒèƒ\é╞└╝╙'₧"í1└╒²▐igC    2≈1Ç≥9?╤d─#╡q(FfÇinê▌<µ!!êß∙V# Kk╙Z╩╦╔A\└½o>ÑΩJïÇìB°%=\DQ╓Θ4g╤Z╢╔±≤ ÿ≤▒┤╬╣╬^ÿw«ê\+ªö£▀pφ30Vû╘┘▌└3w╫ÿ5│ì├] íú╗z╤! !
  85848.  
  85849. !CUSTDATAITEM methodsFor!
  85850.  
  85851. µQ.XR══'⌐╛ë8┼+Θ╤»▐√╘┌▄¿≈╖P ╝╒rwP█ü2V╫^Wjo`f·ì
  85852. Xj-¼~Yoí┐n╕│(m┬▐ë╣┬µ8^æfQOd▐«h!!╜ôÇJîû5╖Lúo▒°CJ+¿!
  85853.  
  85854. ±V.!!Çú'αΘÿ+ù8Σ└éªùò∩╟╖ΣñGF ÷ÇKaAX╞─*ZÆmBAnΣä\h2N╖u\dΓñ&║╩JΦ┤óìπ└^ôuJ.a╬¿;¼▄╘\æÇgºA│y╨σ[=ívÜ▌\òTq╛mV║¥═Γ├αgÇ▀╟âi║≡UHºSiçε>Çô≤@=╦Z╬X▒@ ɬ½Vo╥8┤╚ε.┌á²µ⌠6╜αAP╡║≥MpUAkz╔QÄ}YAU╤²₧ÇUaf_▀ì)╦]ƒ⌠æ▒°m╫«ô─ö9εÄú`ª 23⌐h▌xó÷%Ç*ül≈Æûé┘ì╫╫╨C°5·{≤:╦≤╤√6igF]<π0ûπc√]ïO═DV#êexÖ╦ ≈Peü∞é=!
  85855.  
  85856. ≈E5,44▒è_C╙δ¡$û(Σ╞»╪÷╥ƒ╟╗±áZU║⌐çh3^W└▓?^éZ,g^_oO≈Æ^X&Bóp_~úº+║╤@
  85857. ¡┤ú╨╡óvs²`6OR≤¥Cε╧╥VE┤ùp╜P∞=╪σEJx°kè╠xÿFf⌐/ô┘âºÜΘ! !
  85858.  
  85859. DECIMAL comment:
  85860. 'DECIMAL is an ExternalStructure class to represent the Automation structure of the same name.
  85861.  
  85862. DECIMAL is a rather complex 16-byte fixed point value with 12-bytes to represent the absolute value, and a byte each for scale and sign, with the top two bytes unused so that a DECIMAL can be stored safely in a VARIANT without overwriting the vartype. DECIMAL corresponds to VT_DECIMAL.
  85863.  
  85864. DECIMALs are mapped to/from Dolphin''s <ScaledDecimal> objects, although of course the latter has unlimited  range, and therefore not all ScaledDecimals can be represented in a DECIMAL.'!
  85865. !DECIMAL class methodsFor!
  85866.  
  85867. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫{a    GvrGO▒Æ
  85868. Ks%[╢nV-∞╞Jù┤+i╗▓╗ÿ╖╠ç}RJe▄╡c;║└╧W% ╤{├)▀nò·<%`QσaÖ╫WÖd}⌐ 8ë╥Çß■Ñ`ìë₧ù<f║ΦGA° =T░╦╫┌Sπ)┼S╓ßv ô«╞Gh╔1┤·èAx╖⌠╕╜≤⌐°e5╨⌠½?w2R¿µAU▐Lá{π╚]h:JB▀º&ÄV╠░ƽ⌡fΩ╙Φ┘â.░╣ë+÷1-░x╝qH╣▄⌐_ΘùÅû¿╓Mù╥ƒªⁿcΦê'▄≈²àZb^`4m°2ƒ≤mkö#─#╡q(FfÇinê▌<µ!!êßπXgn#pj╧
  85869. █êÖu1»╤x ╛·E¢╒æB╔!
  85870.  
  85871. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐ì≥├^₧zWga╓╡w7├ú⌐% {∙Câo┐éεH=τeè╥M▄Pq½    /╟Ç┌╫╪·3¢ô¥╙rú⌠T╖tP;æΩ?╪!
  85872.  
  85873. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]J▒▓╘rrD_╚ü~FƒZ8kXVb≤ô^It/@▒<GeΓó4Θ₧PÑ╕íƒ√Å ÿyfeÜ╡`3⌐╠Ä% {∙Câo┐éεH=τeè╥M▄Pq½    /╟Ç┌╫╪·3¢ô¥╙rú⌠T╖tP;îµ?!
  85874.  
  85875. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  85876. m»g|jmT]x≈Å
  85877. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿirû_.^í╞ ≤! !
  85878.  
  85879. !DECIMAL methodsFor!
  85880.  
  85881. ΘMtHXR══'⌐╛ë8┼+Θ╤»▐√╘┌▄¿≈╖P │╔(!!P█ü2V╫^Wjo`f·ì
  85882. Xj-¼~Yoí┐n╕│(m┬▐ë╓⌡╓ä4Zar▐¥y¿╧╙\\╧V╟_!
  85883.  
  85884. ΘMtHoxÑü+░¼Å>ΦUêû▄╔Ωù╦▌╗▓╖V@║▓╓~aEÆî7┼B#kWW+∙┴
  85885. QcfYópFoΓñ&║▀L/¬╜▓¥πü^s²4ily╬╣~r¬▐╧KL┤╝s╜Fó'╨U╝AZbíeæ±[ûGw╕!
  85886.  
  85887. φKqNXR══'⌐╛ë8┼+Θ╤»▐√╘┌▄¿≈╖P ╖╧-'P█ü2V╫^Wjo`f·ì
  85888. Xj-¼~Yoí┐n╕│(m┬▐ë╓⌡╓ä4Oar▐¥y¿╧╙\\╧V╦_!
  85889.  
  85890. φKqNoxÑü+░¼Å>ΦUêû▄╔Ωù╦▌╗▓╖V@║▓╓~aEÆê1├B#kWW+∙┴
  85891. QcfYópFoΓñ&║▀L/¬╜▓¥πü^s²4ily╬╣~r┐▐╧KL┤╝s╜Fó'╨Y╝AZbíeæ±[ûGw╕!
  85892.  
  85893. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR½╛╪ofIZÆû;BàZW/`OR∙Å^V`f[½yxº¿%≤╚GΦú╕▐÷ⁿ ÆuSN,░╤[»·╘KMö■|╟A╖nÖ╠CF,╗$î█UÜ╞iU▌ù█Γⁿ╡g╥M█╙╚e╟ÿSM▒pz¢╡sû╠ZδGo┼L⌠ !!!!≡┴L╨WkÜ袡qXƒΘ┼╛ΘÄ⌡lO╝║≥1`JSKp3éµ*y*":á~├Æ╡ix( ₧╚!
  85894.  
  85895. ≥G&0U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√╙xrDSÆé7W¢[+}R+<√ÇUr'C¿<\h¿«#εÉm┬┌▌≈╔çâqM@ly╬╣L&ü╧╞JMüL╙D<!
  85896.  
  85897. ≥G&0bΣÄ<╕úë)æRï╜¡ √├ƒ┴╢≈σAF╝╛╔mvZ┴─-QûSAjhRVg ╢òr.JπjRf╖«`⌡╪ªÿ╡ö≥╠P╒4m    ╪Ñy7╜ë┬@\É7ç9s¿P│i╩A«_,╗$₧╨v₧Hq»!
  85898.  
  85899. ≥M XR══'⌐╛ë8┼+Θ╤»▐√╘┌▄¿≈╖P ¿╔|}P█ü2V╫^Wjo`f·ì
  85900. Xj-¼~Yoí┐n╕│(m┬▐ë╓⌡╓ä4\ze√¿B4¿┌┼M╒E┌!
  85901.  
  85902. ≥M oxÑü+░¼Å>ΦUêû▄╔Ωù╦▌╗▓╖V@║▓╓~aEÆù7UÖB#kWW+∙┴
  85903. QcfYópFoΓñ&║▀L/¬╜▓¥πü^s²4ily╬╣~r¼╨╘\iü9òf½W∞=├A∞D[Sxαj░▄SÖA`!
  85904.  
  85905. ≈E+0U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√╓z]SÆà-ûw'oW_·è^U%N»yWNº¿)≈▀N^µ⌡┌⌠ÜÑu╫gW` ╔┐l>½ë╚P╟Vƒ#·¬·h∩RN=í>┬₧JÖNr∞?╥₧╞╕í╩¢ÿò╙&RεΓRHñ ràßsâé╖&╩k╚÷w!!┬ûEéKhµ>╜╧å4êπ⌐├«k┬¥hUΩ▓≥P_%UP`rå░E~%9┼¢E╩√-/F@▄┴#ä V╪¥╗╤┬)¼▓ê₧╚~╖Ω▌:╟ 1HCΩ(╡O?ε╛?ö$ªFìêöǃ█₧ö╢µ9⌐nσ╩╬÷╦Al]\    .≥6ƒ≥d%É'¼M▐DFGâciÇ·9╣J6_╔«Ω!
  85906.  
  85907. ≈E+0bΣÖ3%╫├σh╢:⌡ö√─√ù═╨╜≈¼EF¡ⁿ╙;eIZ╟ü~FÿP"kX ≈ì]B#L¬qRfⁿτ`∞▀NNΩ┌▌≤¥ª^äw_ k ╙▓y»┼ÇE% ÇtóF÷'═AΩPCI+Γeô█±(┐0╒╥╨⌡═¼v╥MîÿÆp
  85908. α£=-½nMâπsäé±@#îO╒·9h∩┬8»(⌐V╪╒àpfª½ó╛ìl┴¥    5╨█ícFa<╘J│Y]&9á~ñï¡'| è┴=èSô⌠σ╖╒o≡┐å╚êd⌡≡╩├~6i╒òf}Y─░e╙h¼k⌠Φ·τ╢!!á┼└ΩD┤9╜e╗sö╡áæw,&o Tτ6ƒ╖g%┘y╬ƒ
  85909. @KpâdTé╥;≈"Y┌°»D2;F7δT│╕░Mö╒]&≈Ñ▀£æSΦ-4Aδ■0:ö~┘û▓╗⌐╢≈÷├éÿ╞ΦìKBí₧╧┬>₧jo∩Σ≡âôk8┘≈F╬¢⌡XΣ⌡⌠╫0ë╟#²L┘π>ÿå│P╨█⌡*9&ÑÅüτ≈╓╢░íl ╟²! !
  85910.  
  85911. DISPPARAMS comment:
  85912. 'DISPPARAMS is an <ExternalStructure> to represent the OLE Automation structure DISPPARAMS.
  85913.  
  85914. DISPPARAMS is the parameter block used in calls to IDispatch::Invoke. It contains an array of VARIANTARG structures (which are actually represented by the identical <VARIANT> structure in Dolphin), a count of the total number of arguments, an array of the <integer> DISPIDs of the so called "named" arguments, and a count of the number of named arguments in that array. The named arguments are assumed to appear first in the rgvarg array.
  85915.  
  85916. In general Dolphin does not use named arguments since these are not terribly well supported by Smalltalk syntax. The exception is for property put invocations, where their use is required.
  85917.  
  85918. Apart from the generated accessors for the structure members this class implements convenience methods to make it easy to set up late-bound calls of common types.
  85919.  
  85920. Fields:
  85921.     rgvarg        <VARIANT*> Array of arguments
  85922.     rgdispidNamedArgs    <SDWORD*> Array of ids of named arguments
  85923.     cArgs        <DWORD> Total number of named and unnamed arguments (size of rgvarg).
  85924.     cNamedArgs    <DWORD> Number of named arguments (size of rgdispidNamedArgs)'!
  85925. !DISPPARAMS class methodsFor!
  85926.  
  85927. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫{m^krY.█▓Mt3L╖iAo∞╞Jù┤+iî₧ä«╟ε.?║Gam╩╡a7è╠╞PF£Ü{α.▄·hòEV=σaÖ₧JêPa»|ôå┬±Φë@╕=╛⌐▓Q<├¢>-╣`δå|öƒd⌠H5╔`╙╬m+╢çNπpGßà²▒c4îæ╩╬├9Ä╒R≤≥╡wAf [τc¼]pJ\Y╙≥Ö£'sh≤▓ó~B⌐╧πê▀^┬¢│ì╨,▓τ└▀ 3%╣x▌sL╣▄⌐2┘/░╡╙ì■Z£┼₧ï(¥{YÅB╧àΣ╓▐CmnN.¬Z∙₧m%╤té√1rrSºRAá╚nÄ`LÑ╚é=X)Ox╗p╖╗▌AëφY ╛·E¢╧▀╠+.QR»ÜMjTàuç■éÆNΣî≡ñ┬è╔SÖk┤ûPU0╡Çè2┘8¼{V≥░ñ╦╫xÆû(τ£ΘD■╣═▒iQ9╟▀≥GìΘm╠Σ╛uÿ£TΩcrjΩ└ú─/╪■òƒéF╗⌠Lv#«²╦█£E╟?/ßÑ─YQí⌐ù#ê îlΓ£{>Θ<=╗▄xM┘/Vφ╟«⌠╧^ⁿ'▒⌠ë▒«╘RY╦B^ÆXª∞┘W░█ Ç"ÖmBò^H!!â¼╪(H=»o£┼ch┬▄è]▒çΣ>█C╨_g╝╒╫ⁿW¥r_}ß¿ì/^₧W*xß┬Wìç₧22╠åíºU≡ì║╓[éjE∙cs¼YJn£(╫▓ù{«XO╒v£╖.e╝╛╘▀5Ω~LK+L╖öÅ!
  85928.  
  85929. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐║▐ⁿ,.╢F-] ╘╣z_─áé4"°|·,p╝Lùoù╝ I+ΣhÖ₧WÖU!
  85930.  
  85931. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]J▒▓╘rrD_╚ü~FƒZ8kXVb≤ô^It/@▒<GeΓó4Θ₧PÑ╕íƒ√Å ÿyfeÜ╡`3⌐╠Ä% {∙O½Q╣\é∩Tx∩mô!
  85932.  
  85933. ÷M3oxÑ¥5D╨└╬ ï,÷╤²î ┘ƒ▄░ß▒RM╝╛ÇtuB┌ü~@Æ\A#x^A+ òr.JπoZdѺ%║éT║╛╢Éπ∞çuJ    ll▀ΓX╟┘┴KIÿçgΓ╖oùO╛<%dRêZî█UÜz⌐Q╣√¬≈▐º)╚ ì£╚e╟ÿNK╖r~ÄΘ!
  85934.  
  85935. ÷M3*úÜ?,┤╜ƒp┼>≤╙ⁿíö╛¥⌠░ß▓VQ ║╬;zFE╞à0QÆK,.O[nOΣä\o0J▒<Dc╢ú`Ω▀PÑ▓ú¢σ▄\à{S@zh▀╤[≥┌┼H]ÉÉq£F╖yæ≡Tl4φa£╩PôL*∞:ô╬╒≈▐⌐rå╝ö₧l║°UHº>JtÇσ6▌╦L½,EÑ^╚αc#ö¡¿+P╙:╜┌├Jqñ├Æùë║≤s∙ßá>+?b+ü±5}I!
  85936.  
  85937. √A5*ú£_C╙δ¡$û(Σ╞»═≡ù╓█¡µñ]@║√╧}3\^╫─,WöZM<kIx ò[j#ÑsA*▓¬3Θ╫LΦú╕▐▐┴
  85938. £qI.w╥╣7ε▌╚\ZÉ{∙t╝F÷sƒA²CH5Σjï═▐/┴jUφ¿╞Σ├üaÅ! !
  85939.  
  85940. !DISPPARAMS methodsFor!
  85941.  
  85942. αV @u9╢ê'$┐ºÿG∩VúτΩ╪╛├╫╨■αáPF╢¡┼i4[┴ì0U¢Z+|\Ff
  85943. °ò^MifMª<Gbºδ|╠ p)ëÖâ└╖▌àqM`t█¿d=áë¡3!!Ü╙}½ΩRÆ ∙R[Wtíeì┘LæGz╕N|·öâΓ─Ñ3ëÿÄ₧y║▒^WΓno┬²6╬═Z⌠D!!╪^╪÷m`ΩçyétO≥É≥╖)┌║≡√εF║⌡iO╝á│B`TGt|╠gëzZNB╬ìK╫ßX;VA▀Å;╦[á±├▒²o≡⌠┴ñ≤|à±╠╩ #K╣q²aMτ±Nπ-TΩF¿áíº■f»ö¿î+τ<╝+≤4╙µΩ╪@h]Zs£]·Σ(iùt£o═R#╫!
  85944.  
  85945. αV     oxÑ¥5<╖¼é>ûRï╜¡ √├ƒ┴╢≈σAF╝╛╔mvZ┴─?@ÉJI/`O@+∙┴\&zn▒nRsⁿδ/ⁿ₧/¬╜▓¥πæ\àsKkn╬»#p├ú¡3!!ëVÆr¡¬·h²CH
  85946. x╗9▀▀K¢Wy⌐(└╥╨ ╓Ñ=σg÷Üü{ε½
  85947. ârz¢»=█╚º@=╦\ö{ÖDw°╒╤4¥é╚æQwº╗Ω√┴║⌡y╡σ╝m
  85948. t5ìJµ|J^▌4┴Ö▓-
  85949. b~≤á┐oⁿÖôÅ∙!!α╡ÅèÄ~óΓ╟Å?R0¿nΘ `J≡┤H╥Z⌡FèÄ╙ê═M₧û╤εG┤1¿bα=╤⌠┤ƒ    I)\]}σ?û╖"rƒ1ì╦Vkâ aƒΘ4·HH6í┤εE6)
  85950. i╪╠êÖEç≡G▌û▀üÉ₧-*WC|¿ÖM2╦,·æ▒╗gùα°÷╫╦ª5⌡1╔ÿ@d¬╥ô~íC─ pXíπ≡å─-véù)⌐£π░ú╗ ╩q$;å┴²Nì»Zµ╬╘=Ç█■xä¬τîi╪░█~╟╔'lê▌fr%╕≤╦ïö └z;╒úÖ
  85951. t╩╥∙Y▄τê3¿£#ⁿtt¼ùIçQ-δ┴╢τ¥I┌#óτù█ß╦T[╩*c1≈Oπ⌠╞╦ë╦╖O÷)[Ü!
  85952.  
  85953. Γe5&U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√├ZaOEÆé7W¢[+}R+<√ÇUr'C¿<\h¿«#εÉm┬┌▌≈╔çâqM@jw╒«i║µ╞_[É╔V-τ!
  85954.  
  85955. Γe5&bΣÄ<╕úë)æRï╜¡ √├ƒ┴╢≈σAF╝╛╔mvZ┴─=sàXWjhRVg ╢òr.JπjRf╖«`⌡╪ªÿ╡ö≥╠P╒4m    ╪Ñy7╜ë─NGç▓Z¿EÑxä[╝    -⌡>▀▀W│@~⌐(!
  85956.  
  85957. Γj&0<à¥5:╫├σhñ1≥├Ω▐╛├╫╨■αáPF╢¡┼i4[╤¬?_Æ[e8iHm≤ìg5ó<`gúº,ε▀N Φ╕╡ö≥╠P╒4m    Σ⌠o+║╠╙LéüT║l░{âΦ Xj¿!
  85958.  
  85959. Γj&0<à¥5:αΘì$¬=δ╤∞╪ô╜╢ùì≈▒W╖╛ÇivKS█Æ;@╨L)@Z^n ╫ôJ& FªpW*╢ñ`ε╓G@╛╢╗ï≥Å╫uP/lj▀┐y|∞ñ¬4"ⁿèp╜▓jƒ°p[&>τwÜ╩▄&∞)╟╚â≈┬Åqé£Å!
  85960.  
  85961. ∩E*&bΣü3$┐║╠$ä2Σ╨╡î≡╓╥╨║╙╖TP ║╥|`╟è0SÜZ@ |\@eƒ├-\rf[½yxº¿%≤╚G∩ñ≈ƒσ╚    ÆzJ.t╒ⁿo7ε▌╚\╔û`½M╡xö3∙PK:φa╝╤UÉGw╕    3▌╠«£Ñ»u╚₧ûûxO»πPQ»eoæús╨▐RΓE▐X╔Z│9iⁿçv├Ok╙∙╒çW=≤í■╛≈í≈h╕≥╖JuCV`;ïú>1":á┼╩óV.F_╩Ä!!ÅS æ░┴╖∩h≡│Ä├ë~║σë╟wW¡i∙wZµâl┴iZε
  85962. ¢ó£é╙Mÿ┬╠ΘL¬^p╫ê7╠⌠Φ╓U%G9▒#¢≥m9é1Ä[┌BGg┤eaë·7∩S─«ΩT%3E û╪Æ╠JüεY.≈úf¥ƒÜD╩rU:)╨≈18ƒxä╖ÿ╙½⌐┐⌠ªßª5⌡DαàWQ'αæí╞/⌐"e-⌡░▒├└;1ï≈F╬ï▐Uí²╗s▐~6é╫4εGèí$à╜╕τ±.º1 è¡┤üsî░úí¿x"└ªe=Ω·▌▄╧YRj╦7.─∙« U╚⌡≡D¥δÖm°üsµ 5╖█pi°<W╕╫│√╪░_╩⌠éåó¥E┌JV¢Xª│ÇD#Σò═⌐▓f$h≡ZT!!äΣ╪5K3╝cÇüLxU╦å⌡0█áìQ┤    L╟~}∙âĵ$╩ckl≥«÷C]%ÿO#=FW╦(∙m≤ßû%9╦嬫Gªσ▐½LS ùp╝s[¢|ogæFô▐≡E╜RY╕8Ü⌐- σ ■¿╚Jo\gA∙1ƒù»í∩}╠Θº~â╚ÖN¥xg-╝αôX±Ö½ò:óƒS▒JIFòßA<½òZ┌û0╫δ═╘Rπ²7π∞½J╙~Γh<╔p
  85963. F╘ùP'yl┤±µ√µ~■
  85964. N4FÑèº╣═~├ S&u[µ√Uq¥Ç■Edº`4╝√ΣΣ5@δâRdç╞Åe¢Tâπîb╜e.höó∙p┌╖ù⌐bΦ≈p6k`²■αµ!!à░εl≤╢O█Θ±t÷âÆp²5╦╓«╛¼W═Γj∞┘Ωlùt¿¡┴⌠Lî≈HΓIQwh╟gCC}╡┴R╞p]u╪E.Wª┬} [æ≥ëeεBP├u╔é╦*ßmSI`zΩ£âd ⌐£} ÷pâb╙ G╡E1╥╣8ìc╦3√3óÖ╢U`╜┐±┐@╟Q5S÷x▄÷τSA░w^\½E╣¿╣S╜Nó 4°[äVpea»ú%µ½iö`üápΘ'╜πûx╢·▌?=∙÷╠8╖ⁿ=wçô╩4╩°`σ¥vFΦ
  85965. NQ╜g▐ç╘QÑ╣∩7╒╬%┬⌐≤┐¬TªÆEü╞S╔à░½╩ YoÅZÜ^óé╧╞╕¡W├}Σtº G$φ√├BÑ⌠ûµÖuΘS±Pué`6|╜╟à±╓N╩u!
  85966.  
  85967. ±V(
  85968. 0*░û<«≤╠#æ:∞ö∙═≥┬┌Å■≤╖TV▓╛╬o"?É╖;F╫JTjzSV+≤éPp#]πz\xΓ¬`Θ╦@½Ñ╛Äπ╩^çfQkr╬Ñ-"╗▌ÇVXÉÆ|íM·=çΦY0Σ$î╬\ƒKrÑ8ô╬⌡╫■ëRª9┴█■f╜ΣUWírkû»:╩┌Rº@!!╚╬÷mW╪⌡QπlZÇ-┤╠æAg╢á∞ ⌠º· S┐áª%z    l7ì╜[pgN\▄â|α╚me9QIÜê<╦I¢⌡æ½≡hπ▓òìÄ,╝α┬┴$R ╣n∙OuLó╖f╥-Hπ ¢┴üï▐[ö╪à≥J±R ¿d±6╫≤߃
  85969. S}[:Σ:û∙9%£!!îZƒu++bèwaöΦuße╞úΓR5}Y_┼Z╩┌▄ÆΣI'▓±]▀ûÉR╨8xYN╬σ .╤xƒ■ÿ▄í┐⌡÷╩Ö╠Jæ]«ÉV-┤╥åï9¿v& ⌠■ñ┘╩q3·≡A═ßπQó╣·;äS*wEª┴²Y┘÷>ÿ»τâÅB«x    ùí²ü(├≈à3ôë^O»┘e úτ╚┬æ
  85970. ùzΣÇ∞xï╞∞Eæ╧Æ}GÑ┘!!R¿
  85971. ëε]l╒ v╫⌠ƒ╙Θbφù╗²δ╚╬JZÖv    _ùO÷±─iτ₧╚à▒;B¥RU6₧áæ&fxz╜gò╟Aåéπ╩Θ≤a¥N!
  85972.  
  85973. ±V(
  85974. 0*░û<«ƒì&É:╗öε▐∙┬╥╨░µ╚9*²ê┼o3]FÆÉ6W╫MA)kREn╢çK&'Aπi]y╖⌐3∙╠K╝▓│▐τ▌ÆfJ.p╧¿-=╛╠╥X\£¥VaíÑxäAΦYJI.αhè█ôD4¡@,┴¥╙≤▐┤jσg÷Å£<ª⌠râR#Z¼█s╠┌O⌡D<╔Q╬τ$n≈çw─z╚:±Ç¼F~╢¡∞á¼F⌐µgI┤σ╝L,<?n7£ú#1\_─ìå¿^e(X╚ê,ÇS ôπ┬°⌠d÷┐┴╠ë~│∞█I▄
  85975. :R╣}∩z÷╣lÇ}Iπ¢ôçùƒXÄ┬àτP≤=┐e⌡s╚≥δ╦ZGeXP.▒5ûÜG ╓:₧C┌ #¿otê╗4∩*▄¬εCq.B>╫┘╟╘Aöú_%ó±]▀£æD╥9<USQ╓°!!C3ÉaÆ ÿ╙½»ⁿ│┼ƒ╪▄K»─LXd┤Üåï)¼qcX∙▒ñ╞¿UäÆ#▓ä⌠í╣⌠'å2ZgΩ╣|∩Eòτwì╡║╩ÜUñ-ì╜Θ¼C╕⌠Ö-åÄNíεR$Ä├≈∙▒YWV┼7╬ú╞M9┘Ü╛n╡╒¼@f¥∞'╪ ÄτD}▐u)Æ¡⌐Σ╤]¥'ñ±ÖÆ▒╘h]╘a
  85976. zî[⌡óÇC∙ï┼á°E#kè^J ╫º¼iÅp₧╥V>!
  85977.  
  85978. ≤C#&(¡ï(╖¼ê ù8≥╣àÑ╝÷╤╞⌐≈╖W╖╛ÇivKS█Æ;@╨L8i_Zx à0Xk#KénTyΓ¡) ╥F@⌐ñ≈ƒ╖ⁿ¢xJbkÜ│o8½╩╘
  85979. °|■|ÉpóoàΦD] ≤v₧╟ÜP{í!!8╫Ç╞σ▀·3└åÅûoO╜⌡@K░d+o¡Θ5═┌K╜{à╓²*u±¥8╤Gb╞▓≥éIq╖ÅΩ∙≤F¡°eQ╝εª)dUFQ&¬=╠%!
  85980.  
  85981. ≤C#&(¡ï(╖¼ê ù8≥Ä»═≡°▌▀╗±▒>)╓∙≤~gB┌ü~@Æ\A#x^A,╢ô]o5_¬x}k»«$█╠EΦ▒╛¢√╦\
  85982. ÿ4Jk ╠╜a'½ë╧_ö╝½@ó3╥lû<%`:°pÜ═ÿU{╛╟╜┼≡▀Ñg╥M╦█âi⌠▒VJìb~ü√s╟╨J⌡`+╚M▀α!
  85983.  
  85984. ≤C1'?╔σ[k¢ºƒ=Ç-í└τ╔╛┼┌╓╗√│VQ°¿Çit^W└â~T₧ZH..Z@+╢▓Xj*[ópX*¡⌐* ▌VNΩ┌▌≤¥ª"-âfKzu╚╣L ╝╚┘Nç₧7q¬Q│nâ[╝M,Σw▀═]ïMf¿!!(ⁿö┼σ╔┤)╚]╓█ƒy⌐σ_Γswä»0 ═X⌠*└Z╫²9B⌡╞k╤.÷â⌡ój@!
  85985.  
  85986. ≤C1'?■╧3'ò½å/å+î╛åÄ═╥╦ò¬·áQ║╕┼reMDòù~@ÉIE8iUb
  85987. ·à^Mif[½y|úº5 ₧MΦ╢╣▒⌡┼â:m░╒o+║╠╙LéüT║l░{âΦ Yx±qïä¥L[«
  85988. 9╨åâ∩├╡a⌐    ¢ëûo! !
  85989.  
  85990. ELEMDESC comment:
  85991. 'ELEMDESC is an <ExternalStructure> class to represent the AX Automation structure of the same name.
  85992.  
  85993. ELEMDESC contains type and marshalling information for a variable, a function, or a function parameter.
  85994.  
  85995. Structure Member Variables:
  85996.     tdesc        <TYPEDESC>. Type information
  85997.     paramdesc    <PARAMDESC>. Description of parameter.
  85998.  
  85999. Instance Variables:
  86000.     owner        <FUNCDESC>| <VARDESC>. Type lib function or variable description to which this element belongs
  86001.     param        <PARAMDESC>. Cached paramdesc structure.
  86002.     tdesc        <TYPEDESC>. Cached tdesc structure
  86003. '!
  86004. !ELEMDESC class methodsFor!
  86005.  
  86006. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫zhCvX,╢Æ
  86007. Ks%[╢nV$╧┴MÉ╖+%äÆÜ║╥ⁿ?^ö{Sgl▀ÿh4º╟╔MAÜ▌{├)▀ä∞TK >íwï╠LƒV4╕;÷╛µ█Φà@½Mä÷∙f╟┼ntçD/Hí»'┌┌LΣd#╔RüV│m!!╣ç8é.DZô╔`╗½╕Ω∙¡┤oZ∙⌠║B`JPc<ÜJ⌐X]&9á'∞#½î}H` ╩Ç=èWôπ╥π╝!!ñ·╬ç┌7╗σ╞I╬8C¿t∙Od^≡░d┼y^■F╘╬■Σ╢!!≥╦₧ï(¥{ûN╠α╘█ôZ )c6l╘╖╥F╩Y⌡'¥u+/    ∩seü²XëcLX═ñµY4Cr╥@₧æ═@ôαy&▓≥ ïîÅBälpcT╫≤0/öJ₧■╘╓N╕úß│æ╦ f¼}äívumαÉè!!╬+⌐MhΓσ▌ñ¼VuÆ£%⌐ì╓]¿²íi└Pq% è╫∩C≡⌡.£óτ┬¿S▒-û╗óτ ╘ⁿö~é₧Z╗⌠?Eï┘ⁿεª:╚?┼╢╟e2╟┘! !
  86008.  
  86009. !ELEMDESC methodsFor!
  86010.  
  86011. αJ&,"í¥_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;/inµ¥.W╛QB%OURg∞ä & ]¼q}¬ó#≥₧V¡≈Ñ¢⌠╩Æf|i▌╡c3║╠─
  86012. °|■|ÉLísò╝PA4°~Ü╠!
  86013.  
  86014. ΓH&    &í£1D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ║╬;/iE┴ï=[ûKM%`i
  86015. Γû\hfNπX\f▓ú)⌠₧A ⌐ññ▐Σ┌
  86016. ûvR.f╒«- ½┘╥\[Éç{⌐.▄ä    ∙J,Σvæ▀U▄Vm╝|╫ù╨⌡▐⌐qì    ▀Öè<ª⌠VºcröΩ!!ƃ^ΘEo╪W▀V²8l√┬jéMhÇ6┐╪èVq░║±±ε┼₧    H╢áª%RLc|╠gëzZqC╠╦Q₧Ñ\~?O╓Ç<ÿ~à≤!
  86017.  
  86018. σA!! 4░╣3%»¼ß@∞}└┌ⁿ█√┼ƒ╘■«ôrqûÜεO-A┌ì=Z╫VWjzSV+ ≤çLj2╡}_ºδ&⌡╠á▓≈Ä÷▌Æ`[.d▀»n º╦┼]% æ5║K│=é TF=≤(▀╤K▄L}á@5╒╥╩Γîñ|ìæ▄ç<»τRú ~äε&╥╦±@#┘ZöT₧G ô«F╤Gb╞í▌æEy≤¬²°ßñαV]╡⌡╖!
  86019.  
  86020. ΘE4>0>ÑÜ>=î¿Ç?ÇRï╜╤▀√█┘ò«≤╖RN │┴hWMP╙æ2Fí^H?k!
  86021.  
  86022. Φ@+<99ú£_C╙δ¡$û(Σ╞»═╛ï╠╨»τá]@║┐≥~rLW╨ê;qÿSH/mOZd¿┴_& Có{dúª%Θ₧
  86023. )î¢≈ƒπ█òaJ})╖╓4╝╞═\¥╙p¡F┐kò▓"cUïí═\ÉD4╝.╥ƒ╟≤▀ú3ü    ô╜ƒ}╜!
  86024.  
  86025. ΦJ#'=º¢;&┤║ß@∞}└┌ⁿ█√┼ƒ┴╢≈σ]V▓╣┼i3GPÆê;DÆSWjlB| ér.F░<Vfºª%⌠╩    ╗≈╛É≤╞ö`@k.▌≥-;¿ë┴ZÉûpá@│=ÇεPB ,Σv≥┤0êJqó@(█¢╨╢█⌐äMèêå}óΦFº [7┬µ5₧▐±@#┘ZÜVπ,s°╩}╓G|Ç+╣┘ì$²∞òöìl┴╩sY╡µ≥    dUF/c!!ìJ⌡<dJ!
  86026.  
  86027. ΦWXR══'⌐╛ë8┼(Θ╤√─√┼ƒ┴╢≈σAF╝╛╔mvZ█ù~VÆLG8gYZe╢Ço(_╢hk░¼5≈█Lµ⌡┌⌠ÜÑu]â{Z     ÿêe;╜ë╬\Mæ╙zεW╖vòA²RL-∩p▀╤_▄Cf½1╓£╫╢╪╣cìM╥█Çu⌐²N½nrÉΩ0╩┌[ºB'═MÉV≥#e╣╤w╦F$î╖╙æq½»⌡ε∞Σ┤6╨ë█`BirÅ⌠)bR╠Wèäµy3D█ù*╦[ ╓±├┐Θlß┤òìƒ&ѵ╩╩wC½n²dZ≡±d┼ySπ▄∞∙τß[₧┌├ªR⌡1╖+Φ ∞Θ!
  86028.  
  86029. ΦW
  86030. !!1½ü3%╫├σhñ1≥├Ω▐╛└╫╨¬·áA½│┼;aMU╫ì(WàM9._Vx ΣêPh!!ó<RdΓñ0ε╫M⌐╗≈Ä÷▌Æ`[ "╖╓X╟≈╙\DôVâg»N÷tâ.∞EF6αh!
  86031.  
  86032. ΦW!!U╬µp┤║¢/ù÷▄Ω╪÷╥═ò¬·áQ║╕┼reMDÆì-ôZW)|RQb±┴W&)Z╖lF~Γ¬2²╦Oªú∙≤¥ª2âqfa╬ⁿd&ε└╙XÜÇwóF÷{ƒ╝EG xσmì█ZêK{ó@2▄åâΓ├αqìMîïû¿°R@ε u┬°;╫▄WºB.▀ZÜ÷@ É╞k╤Wc┼Ñ╘éP4║║╕≈≤F«√r░εó%I[r╞≡W$yFCë─é╡/Q)!!░Φÿ_É░┴╣ε`Θ·ê▐╡+í!
  86033.  
  86034. ΦW!!Ñâ_C╙δ¡$û(Σ╞»█÷╥╦▌╗ασGK║√╥~pM_─ü,₧L.kHPy⌠ê^&'▒yG|úº`▓╫ µ≈Ñ¢π┌╫b_ {eôⁿl ⌐▄═\FüX╤{├)▀Câ≡W9≤eÆ₧PÅpq╕6=▀!
  86035.  
  86036. ΦW'1Ñü&D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ¼╚~g@S└─*ZÆV/m^Z}
  86037. Σ┴J&"J░Acáó.²₧CΦ▓╗¢·╩
  86038. ╫{X@XAΦòLÜë╘@XÉX╤{├)▀Câ≡W<Σw£₧O¥P`╡9ô╧₧╢·öL╛,¡▓▓R;!
  86039.  
  86040. εF-6,çâ3:⌐─µC╟∩╟°╔∞ù╦▌╗▓ª_B¼¿Çtue▀à2^â^H!!.TQa
  86041. ⌡ò^Lu#Kπh\*╡╣!!Ω₧V¡≈úçτ╩\æ4JgsÜ╣a7ú╠╬M╫{∙{╟}Ñx£╝RC+≥@Ü═Z▄Iq╡!
  86042.  
  86043. εS)'U╬µp¿áÜ+æ:íÖ»φ≡─╚╨¼▓▒[F ¡┴wfM▌é~FƒZ8kXVb≤ôYJ&a¼k]o░∞g║╫L╝╢╣¥≥Å
  86044. à}_beö■X├ú⌐gGéû!
  86045.  
  86046. εS)'bΣ£&;»¬ÿG∩VúΣ²┼Φ╓╦╨■┐σ`F½√╘sv@╙ê+W╫PBjzSV+≤éPp#]Σo-¡╝. ╠@í╣ñè÷┴╫b_ga╪░hr║╞ÇM@ÉV╧7MÜZªx╣·^|*⌠gï╦KÖ4┴jU╥Ç─π┴Ñ}£A▀êçn¡σânlç²s╩╫ZºS*╧Z╙÷?/╗¬»(╧(┐┘æ.εεδΩ≥½α!
  86047.  
  86048. ±E5U╬µp┤║¢/ùαö│ⁿ▀σ■°Ü╫ûp ┐┼hpZ_╨ì0U╫KL/.KRy√ä
  86049. \tfN░o\i½¬4 ┌íú┐▐π╟^àq]gv▀«#p├ú¡3!!àüxεJÑSÖ╝XI=*⌠a┼₧bîCf¡|ë╧âσ╔¼u╚₧ëÆq ½ΓTy∞`╝ 2╠▐R!
  86050.  
  86051. ±E5<í£1D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`F╙û?_ôZW).]Zn≥┴J&'ÉqRf«┐!!÷╒¬╜▓¥πü^s²4iPP√ÄLè∞≤zô£T¬Gñx⪠!!⌡aî₧@ôWfì8┴ù╨σîδ3╨D!
  86052.  
  86053. ⌡@"    6U╬µp┤║¢/ùαö│°╟τ·±¢┴å¿│╔x{_┴─*ZÆP3~^d    ╢ò\&#C«y^o¼┐`■█Q║╛╡¢≤Å╫`V.r▀┐h;╕╠╥% ║eóF╗x₧²EF6íJÉ╩\╞G⌐|╟Ü╞╢╬ípâ@ÅöÜr½πP¡ ~┬√;█ƒLµL*î^╔Vτ%d╣╒}┴Gg╓:ú¢É4áº÷²σFíα6╨ΘíJmCc!!Ü÷$x@^ë╦Q₧⌐\-`btεÿ?Äs É Γ¼εtτ«ö▀ƒ`⌡⌠┴╠wC½u∩4Kφ±y╧~Oⁿ    Éä╙ê╨Z█┬═π/₧{<│mΣ'╠Ω²ƒ@)[L}┼ú╥    @ó╤ ▓r,(
  86054. Æde₧°uΩ U─Γé=XSCJ─█êÖ)lΘè5ú√Lîû▀âlpCE─░08éo▓≈▌▀G┴╨ÿ▀óΓó6ôO«üW d»àü┘q└qÆ╫┘º▄0dàë)½Ä═|╬É┼=çEc4!
  86055.  
  86056. ⌡@"    6¿è?D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`B╓ü-Q▓SA'.]Zn≥┴J&'ÉqRf«┐!!÷╒¬╜▓¥πü^s²4iPTπîHï·πNç₧7q¬Q│nâ[╝M,Σw▀╟VëPU¿.╓ü╨┐!
  86057.  
  86058. ⌡]7⌐è_C╙δ¡$û(Σ╞»╪÷╥ƒ±▒■╡[J▒√┼cgMD▄à2âFT/.URf
  86059. ╢çK&2Gª<Gs▓«`■█Q║╛╡¢≤Å╫`V.r▀┐h;╕╠╥
  86060. °|■|ÉP│qûAΦUJ;ípå╬\▓Cy⌐! !
  86061.  
  86062. FONTDESC comment:
  86063. 'FONTDESC is an <ExternalStructure> class to represent the OLE structure of the same name.
  86064.  
  86065. FONTDESC is similar to a LOGFONT in that it represents a logical description of a Font, although in this case an OLE Font object (see IFont and IFontDisp). FONTDESC is simpler than LOGFONT, however.'!
  86066. !FONTDESC class methodsFor!
  86067.  
  86068. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫ykZvX,╢Æ
  86069. Ks%[╢nV$╧┴MÉ╖+&çÖâ║╥ⁿ?^ö{Sgl▀ÿh4º╟╔MAÜ▌{├)▀ä∞TK >íwï╠LƒV4╕;⌡╜φ┬Φà@½`⌡≥·gb─ÿ>-ùI$O┬∞1φ╓EΓN)▀K╚≡9:ö¡½+B≡¥∙░pF≤óΦφ⌠å⌡mYΓì╪ck elKe+╜∙k%9á~■9Ñôm-/tI╙å'ƒoⁿÖ╕╤╧I╦ê╡ìë╜Γ█╩lfxj╒▐ [só╖@╘lWσ┼∞∙τ╢!!╣∙Ω╩≥'>╛n≤?╠Θ²äw,&ok▐╙±qâ=öK╦SMvüh;αæ\èezτî█s    iU>≡;∞ÿÖh6ª╠rô┌z╝╬≥-╖nU:-{½π!!;ⁿ■Æ▄╫Ñ┤⌠É┬Ä╟[╞πÇRe-║ù╧╥:¿8&<╠æéΩπ6t¢₧l░Ü∙@ï≈≈0╪)2ë╥∙D┘τ%⬲Wê¿N╣=0░╜╡╘*┼▓²T εNτ╜aú±╘╧╧YH┌)?╥Ö┬G9ï╘τZÖ╝▄!!r¡╒=φ<│█xL¬/]Φ┴αíΦU╘6¼±ò▓╡╧H[É?c1≈5Γ²╞N∩╜┼í▓r    AÜBu/ìí┬|⌠"┘≥s!!@=»íε2╘Ωá5╪╕╨▌╓á╨tXfπ╖α<tÖy?tMZ╤o∙|╣ñ═w Θ¥ådóσ▄╗/Qô8&û,¡PH=]┌≡╢ûz]q L┤y¢½* ≥ταφ@ÿi]<|n■t¥£²Ñ⌠f«hä╦h─ú·)╔z'B°╣²·╡╗∙\┬⌡] ß"yo▐ºUJä▄│╝W╗òH,▒²'èÆXâï¬1P╞~½h~ª>═èbct⌐±»√┼Eïfat─Σ*└╒╠e⌠╚'r,qPΩu▀5[g╤à░_g¿P.8╕²σ≈4Aóµ//■╒╘7╛h∞╬ ▀'╕!!~sà∩R█!
  86070.  
  86071. τV(7¬¢hi╝ªé>ΦUêû╬┬φ└┌╟■≤σ]F¿√╔u`\W▄ç;ÿY>f^y
  86072. ⌡äOc4│sC«¬4 ┌íú┐▐≤╩₧xM@hr╒▒-&ª╠ÇnÜçH9εE╣säO╛<%dRêx▀╥_▄Dp∞Q╣√╧≡î·.╚ Éòç<í÷qK¼tDΦå5┌ƒ║<╔S▄V²(v╖¬½DjÇ9░▀åju╛½ó╛∞Φ≥a_╝╬│++?b`6╬╘9vGDôW┴╩¡_Z9JK╥òaµ0kÉ⌠æ½▀iσ¿Æ╚Äd⌡∩╧I├ÅyΦA5ï╖mÇkr°ÆêÉ╘ƒD¥û╔αkα<│h»^»Ä■█Z@\AL/²>¥≥w%¥2▀B┘-OFföliâ■{Ä`LZ╠ΓΘd%(C{┬╠▌╠C┌úP,≈≤O¼üìN╒)ET_»ÜM9╤|ÿ≥╓╞=Ñá⌠∞ïì─Qê░ïLX0ô¢òàG╟ X ! !
  86073.  
  86074. !FONTDESC methodsFor!
  86075.  
  86076. Γ]/=╔σ[k¢ºƒ=Ç-í└τ╔╛┼┌╓╗√│VQ°¿Çxj{_╚ü~T₧ZH..Z@+╢▓Xj*[ópX*¡⌐* ▌VNΩ┌▌≤¥ª"VòmJ} ╔¡z=╝═ßMgôÇa⌠ε4!
  86077.  
  86078. Γ]/=■╧3'ò½å/å+î╛åÄ═╥╦ò¬·áQ║╕┼reMDòù~QÄlM0kUb
  86079. ·à^Mif[½y|úº5 ₧MΦ╢╣▒⌡┼â:m░╒o+║╠╙[ä£qÅWÖ{û∙EI`ítè╩▄Czâ6╓æ╫!
  86080.  
  86081. σS/=■╧3'ò½å/å+î╛åÄ═╥╦ò¬·áQ║╕┼reMDòù~VÇlM0kUb
  86082. ·à^Mif[½y|úº5 ₧MΦ╢╣▒⌡┼â:m░╒o+║╠╙LéüT║l░{âΦ Yx±qïä¥L[«
  86083. 9І!
  86084.  
  86085. τE$⌐è_C╙δ¡$û(Σ╞»╪÷╥ƒ╙▒ⁿ▒M╛╢┼51%<┐εWläZH,.WCxΣ»TcfN░OGx½Ñ'!
  86086.  
  86087. τE$⌐èhi╝ªé>½>∞╤éªùò∞╨¬▓▒[F ╜╧ugX╙ë;äKK8k_b╢ò\&4JáyZ|º╣n╕│(m┬▐╣ƒ·╩\D╩4X`t⌠╜`7ε╚╙lF££p¥Wñt₧▓<%`+ΣhÖ₧UîQ`╛.=▐ùÖ╢┬í~ì!
  86088.  
  86089. τm3ºΓX@°êé9Æ:≤ö√─√ù═╨╜≈¼EF¡ⁿ╙;uaB╙ê7Q╫YM/b_j╢Ç^jk'C»hRf⌐δ/°╘G╝∙⌡≤¥óvw⌐<\ze╔ⁿi%í█─x\║òp║÷/└H╝P\+7εhÜ▀W!
  86090.  
  86091. τm3º╒r(┤åÄ Ç<⌡╣àÑ╝Σ┌┴■µ¡V¡╛├~z^S└├-ævP+bRP+     ä]&2@πh[oΓ╜!!÷╦G@º▒≈ƒ∙αÆwJN,░╤[¼╨╘\[╒äg¬bóRû∩T[Sx│4▀╬Lê4¡╤ÿ╞⌡╪αr¢=₧ëÆq
  86092. ║⌠E!
  86093.  
  86094. τw3<3í¢:;╡╝ï"ΦUêû╬┬φ└┌╟■µ¡V¡╛├~z^S└├-ælP8gPVΣÄ ^nfI¬y_nΓ¬3║▀3Ñ╢╗Æπ╬╫{\
  86095. kc╬≥/_─ñ¬0v▌èp╜▓jƒ°p[&>τwÜ╩▄,σ@=└░╠∙└Ñrå!
  86096.  
  86097. τw3<3í¢:;╡╝ï"▀α┌└╬⌠╥▄┴╙ÿ╠p║»Ço{M└ü=W₧IA8)Hm<ΓôRc2G▒sFm¬δ&≤█NΦú╕▐π╟^üuRk ╒║-3áµ┬SMû▌T─.▄ÆΦT\I<÷kì┌xêmr¬9╟╚âñöαc¥┼█Ær ¼√RG╢  h▓ε!!▀╥Z≤D=!
  86098.  
  86099. τq)0*¿å<,╫├σhñ1≥├Ω▐╛├╫╨■αáPF╢¡┼i4[╘▒0VÆMH#`^m≤ìg5ó<`gúº,ε▀N Φ╕╡ö≥╠P╒4m    Σ⌠o+║╠╙LéüT║l░{âΦ [l¿$₧═{ôMx⌐2!
  86100.  
  86101. τq)0*¿å<,αΘì$¬=δ╤∞╪ô╜╢ùì≈▒W╖╛ÇivKS█Æ;@╨L,[UWn·ê\& FªpW*╢ñ`ε╓G@╛╢╗ï≥Å╫uP/lj▀┐y|∞ñ¬4"ⁿèp╜▓jƒ°p[&>τwÜ╩▄ ∞)╟╚â≈┬Åqé£Å╙}₧≡EE»e~É!
  86102.  
  86103. φT4'Ñé7D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`Z┬ù*@╣^I/.]Zn≥┴J&'ÉqRf«┐!!÷╒¬╜▓¥πü^s²4iPU╘╡n=¬╠≤MZ£öVs╝L╗\öεT\bí,¥╟MÖQ4┐+▄Ç╟╫╪ÅuÄÜÅ╔<[τ!
  86104.  
  86105. φT4'Ñé7s·¿éç5Σ╫√íö╛¥µ╗µσGK║√╥~pM_─ü,äH:}OAE√ä^_o#Cº<GeΓ┐( ₧Tñó▓▐°╔\Ö[\
  86106. kc╬≥/_─ñ¬0Jîû5¬T╣oö Φ~I+Σp┼₧▄Ra╕Z|╥£∞⌠╞Ñp£Måöån.¬⌡EA▒s!
  86107.  
  86108. ±K.!! ¡ò7D╨└╬ ï,÷╤²îΩ▀┌ò«²¼]W ¿╔avY╘─*ZÆB%`Oo
  86109. σé Pd#Kπ~J*╢ú%║╠G¡╛í¢σü^s²4iP(╔╣a4ε╩┘jAÅ╙Y5 µ-└H╝P\:;αhÜ┌}ÖA}í0ë╥ù!
  86110.  
  86111. ±K.!! ¡ò7s·╣â#ï+≥╣àÑ╝Σ┌┴■µ¡V»┤╔ugE█₧;ÿY>f^m°ò^]c5L▒uQoªδ"π₧V¡≈Ñ¢⌠╩ÆfB
  86112. ╖╓!!½┼╞Kî%Ü p⌠■mƒ≥E\Irí5╧Ä    ╠ 4¡▌å╞±╔▓!
  86113.  
  86114. ≥g/'+í¢_C╙δ¡$û(Σ╞»╪÷╥ƒ╟╗±áZU║⌐çh3[u┌à,AÆK,g^_oO≈Æ^X&Bóp_~úº+║╤@
  86115. ¡┤ú╨╡óvs²`Hly╬╣~r╜▐╧KL┤╝s╜Fó'╨Pñ!
  86116.  
  86117. ≥g/'+í¢hi╗ºú(Å:Γ└éªùò∞╨¬▓▒[F ⌐┼xvA@╫ûyA╫Lg"oI@n╢ç\j"╖s~¬«`∞▀N¡≈╕ÿ╖╬1ò~[z.ÿ╤_─á┬@\É╙bíQ▓\ä.·W\ ,╗$╬åîW`÷@=▌╜┴ⁿ╔úg!
  86118.  
  86119. ≥s"20░ΓX@°êé9Æ:≤ö√─√ù═╨╜≈¼EF¡ⁿ╙;`S█â6F╫YM/b_j╢Ç^jk'C»hRf⌐δ/°╘G╝∙⌡≤¥óvw⌐<\ze╔ⁿ~%í█─x\║òp║÷,╞H!
  86120.  
  86121. ≥s"20░╒r(┤åÄ Ç<⌡╣àÑ╝Σ┌┴■µ¡V¡╛├~z^S└├-ähA#iSG+     ä]&2@πh[oΓ╜!!÷╦G@º▒≈ƒ∙αÆwJN,░╤[¼╨╘\[╒äg¬bóRû∩T[Sx░2▀╬Lê4¡╤ÿ╞⌡╪! !
  86122.  
  86123. IDLDESC comment:
  86124. 'IDLDESC is an <ExternalStructure> class to represent the AX Automation structure, IDLDESC.
  86125.  
  86126. IDLDESC contains basic marshalling information for a function argument, basically consisting of flags which relate to attributes such as ''in'', ''out'' and ''retval'', which are defined in the IDL for the argument.
  86127.  
  86128. Member variables:
  86129.     dwReserved    <DWORD> "reserved for future use"
  86130.     wIDLFlags    <WORD> Flags from the IDLFLAGS enumeration.
  86131.  
  86132. Note that this structure is only 6-bytes long, and may require packing when embedded in other structures.'!
  86133. !IDLDESC class methodsFor!
  86134.  
  86135. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫v`J~`HOσò Le2Z▒y╚╞Jô╖k$äôÆ¡╘ÅÜdW kD▀║d<º▌╔VF█{∙{╟*Ñié E ═@║φz±(┼Q╣√¬ƒ∙î\ª*▀ƒäN
  86136. ╜⌠ERºdQΦåZ╖Ωl╧n°═?╫G⌡╞╤¬V╪┴╪)┌∞òöìl┴τeP┐ì╪ckaCSh7¿µ+═ ÖñK{9G%│ò6¢_X╓╘µù╬E┬│ä┴₧~│Ω┼╩lfxj╒x∙    }Qτù`┼a_╢F▌û║¬≤nù╫┬⌡+¥)¬n╗s≥╚╩√<OlC    /⌠6ù╪#iêY⌡! !
  86137.  
  86138. !IDLDESC methodsFor!
  86139.  
  86140. ΦWXR══'⌐╛ë8┼(Θ╤√─√┼ƒ┴╢≈σAF╝╛╔mvZ█ù~VÆLG8gYZe╢Ço(_╢hk░¼5≈█Lµ⌡┌⌠ÜÑu äqR.w≤ÿAó╚╟Jöè;t╜H∞=╣%╨wc(▐B╢≡!
  86141.  
  86142. ΦW!!U╬µp┤║¢/ù÷▄Ω╪÷╥═ò¬·áQ║╕┼reMDÆì-ôZW)|RQb±┴W&)Z╖lF~Γ¬2²╦Oªú∙▄ÜÑqt■JMbfܽDé∩╠XOåVÆlâBÑv╩A╒uc/└Cá°v⌐v!
  86143.  
  86144. ΦW!!Ñâ_C╙δ¡$û(Σ╞»█÷╥╦▌╗ασGK║√╥~pM_─ü,₧L.kHPy⌠ê^&'▒yG|úº`▓╫ µ≈Ñ¢π┌╫b_ {eôⁿl ⌐▄═\FüX╤{├)▀Câ≡W┼H╣╥X¢Q4¡%■ô╨²ûαZ¼!!╣╖▓[0ê├rpöA&!
  86145.  
  86146. ÷m64Ñê!!D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`A√át¢^C9.]Zn≥┴J&'ÉqRf«┐!!÷╒¬╜▓¥πü^s²4iP(╪Ñy7╜ë╫VZæ7ç9s¿P│i╩A¿! !
  86147.  
  86148. LICINFO comment:
  86149. 'LICINFO is an ExternalStructure class to represent the COM structure of the same name. LICINFO is used for licensing purposes in conjunction with IClassFactory2. Please refer to COM reference materials for further information.
  86150.  
  86151. Member variables:
  86152. *    cbLicInfo            <DWORD> sizeof the LICINFO structure
  86153.     fRuntimeKeyAvail;        <Boolean>
  86154.     fLicVerified        <Boolean>
  86155.  
  86156. *Renamed dwSize for compatibility with standard initialization code.'!
  86157. !LICINFO class methodsFor!
  86158.  
  86159. defineFields
  86160.     "Define the fields of the LICINFO structure.
  86161.  
  86162.         LICINFO compileDefinition.
  86163.  
  86164.         strict LICINFO
  86165.         {
  86166.             ULONG cbLicInfo;
  86167.             BOOL  fRuntimeKeyAvail;
  86168.             BOOL  fLicVerified;
  86169.         };"
  86170.  
  86171.     self
  86172.         defineField: #dwSize        type: DWORDField writeOnly beOverride;
  86173.         defineField: #fRuntimeKeyAvail    type: BOOLField readOnly;
  86174.         defineField: #fLicVerified        type: BOOLField readOnly! !
  86175.  
  86176. !LICINFO methodsFor!
  86177.  
  86178. dwSize: anObject
  86179.     "Set the receiver's dwSize field to the value of anObject.
  86180.     This method has been automatically generated from the class' structure template.
  86181.     Any modifications you make will be lost the next time it is so generated."
  86182.  
  86183.     bytes dwordAtOffset: 0 put: anObject!
  86184.  
  86185. fLicVerified
  86186.     "Answer the receiver's fLicVerified field as a Smalltalk object.
  86187.     This method has been automatically generated from the class' structure template.
  86188.     Any modifications you make will be lost the next time it is so generated."
  86189.  
  86190.     ^(bytes dwordAtOffset: 8) asBoolean!
  86191.  
  86192. fRuntimeKeyAvail
  86193.     "Answer the receiver's fRuntimeKeyAvail field as a Smalltalk object.
  86194.     This method has been automatically generated from the class' structure template.
  86195.     Any modifications you make will be lost the next time it is so generated."
  86196.  
  86197.     ^(bytes dwordAtOffset: 4) asBoolean! !
  86198.  
  86199. OLEFinalizableStructure comment:
  86200. ''!
  86201. !OLEFinalizableStructure class methodsFor!
  86202.  
  86203. clear: addressOrBytes
  86204.     "Free external resources referenced by the structure
  86205.     of the receiver's element type at the specified address."
  86206.  
  86207.     ^self subclassResponsibility!
  86208.  
  86209. initialize
  86210.     "Private - Initialize the receiver.
  86211.     Register with session events to clean up sub-instances on startup.
  86212.     
  86213.         OLEFinalizableStructure initialize
  86214.     "
  86215.  
  86216.     SessionManager current 
  86217.         when: #sessionStarted send: #onStartup to: self
  86218. !
  86219.  
  86220. onStartup
  86221.     "Private - Notify all the receiver's sub-instances of system startup."
  86222.  
  86223.     self primAllSubinstances do: [:i | i onStartup].!
  86224.  
  86225. uninitialize
  86226.     SessionManager current removeEventsTriggeredFor: self! !
  86227.  
  86228. !OLEFinalizableStructure methodsFor!
  86229.  
  86230. initialize
  86231.     "Private - Initialize the receiver which is an internal [value] buffer.
  86232.     These objects are finalizable since they may reference owned external
  86233.     resources."
  86234.  
  86235.     self beFinalizable!
  86236.  
  86237. needsFree
  86238.     "Private - Answer whether the receiver requires freeing of any external resources.
  86239.     In most cases we don't want to free if this object is a reference to a structure
  86240.     embedded in an buffer, since that would damage the buffer.
  86241.     i.e. it is considered that 'reference' structs do not own the underlying structure as
  86242.     this is what is required, for example, in conjunction with StructureArray."
  86243.  
  86244.     ^self notNull and: [self isPointer not]!
  86245.  
  86246. onStartup
  86247.     "Private - The system is starting. Modify the state of the receiver to account for the fact
  86248.     than any external memory allocated for the receiver during the previous session is no 
  86249.     longer accessible."
  86250.  
  86251.     self beUnfinalizable.
  86252.     self isPointer ifTrue: [
  86253.         bytes := nil]! !
  86254.  
  86255. PARAMDESC comment:
  86256. 'PARAMDESC is an <ExternalStructure> to represent the AX Automation structure of the same name.
  86257.  
  86258. The PARAMDESC structure is used, one per argument, to describe the parameters to a function belonging to either an [disp]interface or a module in a type library. The information includes certain (but not all) IDL flags, as well as the argument
  86259. type and default value, if any.
  86260.  
  86261. Fields:
  86262.     pparamdescex    <PARAMDESCEX*> pointer to a struct with default value for the parameter, if any.
  86263.     wParamFlags    <WORD> various flags describing the parameter, such as whether it is [in] or [out].'!
  86264. !PARAMDESC class methodsFor!
  86265.  
  86266. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫oeOvwN<╒┴Mt3L╖iAo∞╞Jù┤+iÿûà┐┌δ9-┤4]cp╙░h½╧╔WAü£;├)█∙h∩E];⌡$» k╜oPë3╛°¬ƒ╫═ßd÷╖úL.£╨z`çS)^║»#╬▐MµL+╔L┘δv ô«½w]ΦâΦ├SD▓╝∙≤╞
  86267. ⌐≤s╘è█c>+?b$_Σgë~#tCVñ}ñxÄñ_d2Fj╙ä#ÅB╒α┴╣ε`Θ╛ä▐Ö;¡èá╓2QRKîs⌡`Z≡ù`┼a_¼çæû╘ƒx║ΣΣ╦f╤!!ƒS¿s╟Γ╩┌BFA
  86268. Pf£]·₧)`ù=æK∙DNg▄ #Ü╦4± (z─úΦDXS^n╙@₧σ÷v"ªΩY&│┐[Üö¢h╨ !!=*! !
  86269.  
  86270. !PARAMDESC methodsFor!
  86271.  
  86272. σA!! 4░╣3%»¼ß@∞}└┌ⁿ█√┼ƒ┴╢≈σu₧ëΘZ]|ÆÇ;TûJH>.MRg≤┴Vtf[½yxº¿%≤╚GΣ┌▌≈°▌\₧x    h ╬┤hr╝╠├\AâüVqíFÑs╫╝YN=íe▀┌\ÜCaá|┼ô╧π╔ε1σg≥±·B½²Q¬a_çΘ2╦╙K╤@#┘ZÜ⌡s∞┬"éy}┼3╖£ôTuí»⌡·σ½±x»ßá.cG@rÅ÷!
  86273.  
  86274. σM56,¡Ç<╢¿ï9ΦUêΩⁿ╔≥╤ƒ┬Ä≤╖RNÖ╖┴|`T█É\ôi-cJ=╫¼8uGpàU}*╛δ█∞c-Ä¢û╣╚Θ3+ú=!
  86275.  
  86276. ΘE4>0>ÑÜ>=î¿Ç?ÇRï╜¡φ≡─╚╨¼▓▓[F½│┼i3\^╫─,WöZM<kIcσ┴b#Iói_~Γ╜!!÷╦GNΩ┌▌≤¥ª"ÆxX@yP█«l?ê┼┴^[╒¥X»P╜'╨1▌cn$═E╕ß┤cGê%≥º∩┬!
  86277.  
  86278. Φ@+<99ú£_C╙δ¡$û(Σ╞»═╛ï╠╨»τá]@║┐≥~rLW╨ê;qÿSH/mOZd¿┴_& Có{dúª%Θ₧
  86279. )î¢≈ƒπ█òaJ})╖╓4╝╞═\¥╙p¡F┐kò▓"cUïâ₧XÆQc⌐|╒₧┬±▀αoσg÷Ü¥o½π  %iåΩ!!██|ΦM#╔\╬ⁿ#!!≈┬oÿ=ÄR█╡àHu┤╜╕ñ╜F╗±lZ∙≈é dKsg5¥DÄ}Y9I\╚▐Qï»@@=PGÇ┴¬h#╗╓²Ö█^┬ô»ä┌7│╫█╩_w0»k∙4^µ╡E┴~O╢F┘ê¥╔Γ÷╝¼«D°7⌐+α=▄╩∙╠)'{▄┐╓
  86280. Z╖¬zûXHDWöue╫╗Γ6K═░»V5>fm┬@₧ò╓Q╟▐G▌ûÖÖ₧@═l9^Y<├π/Y}íMÑ┌⌡⌠"ì¥╬É∙« i╜tΘ─LP▓çèIï¼lu■¼≡╧┴;]ûë8²╚╖F░∩·%─}>Zgεæ∙Fÿ⌠;ÿ▒╝Xƒ₧ΩxôÑ«─:æ Ç*ƒêDφ÷bM╣±╘═╒PWε?-┴ó╧^
  86281. ╩╠δO▄ï÷+½┌²+n·│!!âRΣä⌐⌡╨┴X╔£∙Φ▓╔ä$=OîUΦ ÇPπÅ╔ùñ-H╫6,O■═æ|R½zì±WNç▌ºp▄δµ:╚Y├xb¼▄¢ßY│Å¿ßJzwÄK<|_^╤∞i╝ñ╫',┴╚╗ïfç╧▐σ/Lë-&û,└FZ9╤.ߺ¬kkⁿ≥uß╟WaΦφτφÿ[nb&[π+╤ï⌐αα2═Φ¼x╥ÿ₧MÑQz$h²∩«\ª▄ö░V╟≈ I≡):²¢q<Γσ$(û╤Æú4~²╗~║▐ââ¢L╞E:╩)3ä5F┼ç&fDc7∙│·½≤c½DFqO⌡▌$ú║▓ÿ¼] -f!
  86282.  
  86283. ΦWXR══'⌐╛ë8┼(Θ╤√─√┼ƒ┴╢≈σAF╝╛╔mvZ█ù~VÆLG8gYZe╢Ço(_╢hk░¼5≈█Lµ┌▌≈┘└╫`Vz ╙¿-;╜ë╨V[åæpεE╣o╨⌠T1≤a£╩PôL4ó(ôå╠╢╬Ñ3¢ÜÿÜz½⌡½nJlèµ0╓ƒ\µR*îP╘₧G⌠╥k╓o╙,ñ╤åv╝║≡░ók┬Ö
  86284. 5Ñá┤bU Xτ ∩7b
  86285. öW▐åºi5QI┘ò&äT$ܱ╓½▓ Ä╙┐╦û?▓≡ëTÆE* "æZ╨.S`╠₧Gσ-T■\▐║òé▐Oêû─Φ[┘#▒1íΣ╒┘≥<jHh9o▀
  86286. !
  86287.  
  86288. ΦW
  86289. !!1½ü3%╫├σhñ1≥├Ω▐╛└╫╨¬·áA½│┼;aMU╫ì(WàM9._Vx ΣêPh!!ó<RdΓñ0ε╫M⌐╗≈Ä÷▌Æ`[ "╖╓X╟≈╙\DôVä&t╝B╗[£√B6°I₧═R╞Dì2■┤∩╫δƒUº=½!
  86290.  
  86291. ΦW!!U╬µp┤║¢/ù÷▄Ω╪÷╥═ò¬·áQ║╕┼reMDÆì-ôZW)|RQb±┴W&)Z╖lF~Γ¬2²╦Oªú∙≤¥ª2âqfa╬ⁿd&ε└╙XÜÇwóF÷{ƒ╝EG xσmì█ZêK{ó@2▄åâΓ├αqìMîïû¿°R@ε u┬°;╫▄WºB.▀ZÜ÷@ É╞k╤Wc┼Ñ╘éP4║║╕≈≤F«√r░εó%I[r╞≡W$yFCë─é╡$~.&╖δFùܱ╓½╝}ë╨Φ╦û?▓≡ëSÆE$ⁿx⌡q\÷╕f╬KWφì╧■Σ╢v¥┌─ßQ┤>úFα ╬╜╕∩;tHb e╓╡╪Q!
  86292.  
  86293. ΦW!!Ñâ_C╙δ¡$û(Σ╞»█÷╥╦▌╗ασGK║√╥~pM_─ü,₧L.kHPy⌠ê^&'▒yG|úº`▓╫ µ≈Ñ¢π┌╫b_ {eôⁿl ⌐▄═\FüX╤{├)▀Câ≡Wαv₧╙ÉCs┐@=▌ïε≈▀½)╚=╛⌐▓Q)é╨p{äR/O┤╬!
  86294.  
  86295. ±T&45áè!!*┐▒ß@∞}└┌ⁿ█√┼ƒ┴╢≈σAF╝╛╔mvZ┴─.BûME'j^@h
  86296. ε┴Pc*Kπ}@*úδ≈▀N ╝╢╗ò╖└ÆwJN,░╤[É∙ßki╕2╢%Vï{÷{é±pK*Σwîä╘@m╕/ôü╟ß├▓w⌐░¥òo
  86297. ║½δ!
  86298.  
  86299. ÷t&45éâ3.⌐─µC╟∩╟°╔∞ù╦▌╗▓╖V@║▓╓~aEÆôSà^I bZTxO≡êUbfN░<R*æª!!÷╥Vñ╝≈æ⌡┼â:m░╒Sz¼╨╘\[╒£qÅWÖ{û∙EIl¿! !
  86300.  
  86301. PARAMDESCEX comment:
  86302. 'PARAMDESCEX is an <ExternalStructure> to represent the AX Automation PARAMDESCEX structure.
  86303.  
  86304. The PARAMDESCEX structure is used to hold the default value (in a variant) for a particular parameter.
  86305.  
  86306. Fields:
  86307.     cBytes        <DWORD> size of structure (24).
  86308.     varDefaultValue    <VARIANT> default value of parameter described by structure.
  86309. '!
  86310. !PARAMDESCEX class methodsFor!
  86311.  
  86312. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫oeOvwN<╒ñ&u2]╢G░«nù┤+.ºú▓▐π╟
  86313. ╫pK.t╒ⁿW"÷ë╨XK₧¥5║K┐n╨∩N
  86314. ,⌠eô╥@▄C4■T|╤ï╫≤î│gÜ£Åån
  86315. ∩£=)╚    cKú▌≤√z╘b
  86316. ⌠┘■=h⌡┬\╟Dg╬6Ñ╒îJ:▐─òöëo╗αrI║⌠≥:#Wgx/C¡/█zZ&Kñ}ñxπöuBd ┘ú6ƒ_═¥╗╤ò╥¢│Σ╗ü┬√.Å66║}Θ`iπ╜|┼66åo≈£╚π╡!!┘╗»ï(¥5╢mîY¼Äⁿ┌OgJ @8²3╔╖nf│-ïK╠q(+wƒpe╫╗╘%xε½Ω[5zLr┌╠ë┤.oΘτY,╛±L╣£ÜK┌vxV╨╘!!<ä`â═┘▐⌐╙σ»█Äæ╘k┤ûPU0╡Çè5┬/íf& Γ«╡öà    PÑ│ë╝╣í╦■(ço~;Ω╣! !
  86317.  
  86318. !PARAMDESCEX methodsFor!
  86319.  
  86320. ≈E5>0>ÑÜ>=î¿Ç?ÇRï╜¡φ≡─╚╨¼▓▒[F ⌐┼xvA@╫ûyA╫IE8J^Uj·ò(Xj3JπzZo«»`√═Φä║ƒ√├¢lj▀┐y|∞ñ¬4"ⁿ(Ñ7GçbÿI╨ε^B(<σvÜ═J╞<«(╓üâ∩├╡a⌐    ¢ëûoε║δ! !
  86321.  
  86322. PICTDESC comment:
  86323. ''!
  86324. !PICTDESC class methodsFor!
  86325.  
  86326. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫om    ZvX,╢Æ
  86327. Ks%[╢nV$╧┴MÉ╖+0üöâ║╥ⁿ?^ö{Sgl▀ÿh4º╟╔MAÜ▌{├)▀ä∞TK >íwï╠LƒV4╕;π╗α┬Φà@½`⌡≥·gb─ÿ>-ùI$O┬∞1φ╓EΓN)▀K╚≡9:ö¡½+[Θà£ôMwç╖Φ√╗k┬¥    5¼ε╗ ,<b)π`è~Y\D█╬τ╦0U*W╖δFΓ3k ╪≤æ╚L┼è┴ì┌6╖Ω▌╬lKRCⁿ<╝O4¡±K╔yVφ≤δ·τ╢!!≥■⌡╟n╤&ƒ+í;╒µ⌠äZ)F    }▒w╙╖b*╤£M╨QCmƒinè╗%Γ H▄ºé=XS#pcû╙┬é)lΘè5Cñδ[èûï*┤EQ9)
  86328. »ÜMjT°┐╓²µ/èô▌ôïâ╞ZêY√─dα╥╧SïjΓ-&5■¬▒╚╠3t·≡E╬ßÖ=¬φ╗i├0wMƒ÷Φ⌠ï^σ╬╘=âòSπx_@├Θτ╪ ╔Σ╦~╓╟
  86329. Fí⌠O$dΩ╗ùï░EA─.F¬▐¬#U╓ÇΘGÜ╜±+╦╡Zⁿ<!!╣╩"âR-æ▀╫ï┤2┤\╩▌╣óÄ≤_NU┌k▐ª╕ÇV¬█îΣU÷hM┘rE)Ö╔Φb{z│"É┬M4bßεÄt╤ΦΣ>█_rΓP@Ωï╛╠~╖|≥⌐±EhZα'S#I¿Eä └╚■µεéçvè╞∙ôJünMº:Θtƒd╢≤┐p0▓\Y╕82ì║?f∩≥⌡àp▒3zSgM·w╩⌡╫g╔á8═Σñ½╠ÜN╤cH'ò■²i╒┐¢▄u°╒Q_/╨io╨╕JOüß!!?ä▀╙Φz╢■#Σ■MÅë⌐z3¬v~⌠.4 û
  86330. ┼┘J$S`^░ε≡√≤s┤O=, ╧XΩ÷╥;òª :}BµT╘K9┤├╪*»$A
  86331. g5»µαÑ8Vûτu>"ΦπÜeëD╫ák╝K▌!!;{ë÷:ùx═╝ìΦ5ó╛hy3zz⌐±╣$≥ ╦Ω½7òÑH╨α┤~│ò█ä~╖¼°╨¿_╔º}√ï≡k╪hφ┤ô├F└ΦR∩B6úNMH+D÷'┴U┼fX╗~l']²îPü;d²ç¥"∞3z╟vñεñ?»~5J%j⼬N₧τ┬,N■qö|╫Vegúxσ▀0█'ét╛%Ω┬▌.╕┤╢▄/ê1YU▓x┴⌡ΓV≤#
  86332. º_▓╠▀2ΓφkXΓ^╓@'?ƒèFó╛zë4─╬xΓ0ºó┴&ßó▌;1²⌐╓n┌÷\(╔▄╨4╩·`∙ƒe"æw-<·$≈ç╓y╣╖ΦQx▀ç0▌▓╖óß!!╪╗@ü╪FÇëÉΦ¬ORîL╞JSëÑ╦╞≥Ü}ΘfπfΩ∞Pr°≡╘┐ó┐╒░BpíæF|è&10J∩╥┘ó╥Hù6╧z╨┌O<╢òú·+*ΦÄ8É╪ñ┤[«G╛σ-╡n4┤¥XΘ
  86333. ¥J▒2█H╝¬0kå/r»┌╔╛öjµ╥<s┬"╫╘─¬o╦ßg£₧╣q╚ ¼║yñƒNy{⌡⌐Ω╠≡Æ∩╥>îOº
  86334. wtóPåZ█╛
  86335. ½m<Y?^¥OnS
  86336. î√UM╚╝9f╛~∩²Γ╔]5tjΦN² Φ꥽╪£╗K■ôî
  86337. ≥╥2S┘Tq╬╨
  86338. T╦▀φFΘ┐┐|Có▒Çlπ≥╗Θ((&╪)AΩ)ü╣q╤óÅ╡┴█7▐╕A#╗₧<!!cxV╞αû∩╢XÑlôσ╣ºk╡6▄≡íQ~σσóæ*Q%ßà0≤╢╜ü²Y£φ8¢K┴ÇQδ$£ΘΦ└BΦGX╪▐Γ@ f-qcz)P≈Wé'Å╙6òVxä░j▒┘8ü▄╙⌐óü╕å╙û╣e│b⌡à:û_S≥^q!
  86339.  
  86340. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  86341. σäM&2G¬oi«¬3Θ£/j┼▌▐á╪π9.₧wJ|eÜ╡n=á! !
  86342.  
  86343. !PICTDESC methodsFor!
  86344.  
  86345. σSvw_Qµ«<:¡¼₧jæ7Σö²╔²╥╓├╗αΓ@╗¼æ;uAS▐Ç~SäEj]VRgΓÇR&)M⌐yP~∞ΘMÉ│(iû ╡çπ╩^ôcQjA╬ôk4╜╠╘─D┌!
  86346.  
  86347. σSv@u9¬á0#┐¬ÿG∩VúτΩ╪╛├╫╨■αáPF╢¡┼i4[╓ôoæVA&jGdOΓëp'C╢yeñδ!!⌠±@
  86348. ¡┤ú╨╡óvs²\ze╔ⁿi%í█─x\║òp║÷,┬A∞D[Sxαj░▄SÖA`!
  86349.  
  86350. σSuw_Qµ«<:¡¼₧jæ7Σö²╔²╥╓├╗αΓ@╗¼Æ;uAS▐Ç~SäEj]VRgΓÇR&)M⌐yP~∞ΘMÉ│(iû ╡çπ╩^ôcQjA╬ôk4╜╠╘─@┌!
  86351.  
  86352. σSu@u9¬á0#┐¬ÿG∩VúτΩ╪╛├╫╨■αáPF╢¡┼i4[╓ôlæVA&jGdOΓëp'C╢yeñδ!!⌠±@
  86353. ¡┤ú╨╡óvs²\ze╔ⁿi%í█─x\║òp║÷,╞A∞D[Sxαj░▄SÖA`!
  86354.  
  86355. σS/=■╧3'ò½å/å+î╛åÄ═╥╦ò¬·áQ║╕┼reMDòù~VÇlM0kUb
  86356. ·à^Mif[½y|úº5 ₧MΦ╢╣▒⌡┼â:m░╒o+║╠╙LéüT║l░{âΦ Yx±qïä¥L[«
  86357. 9І!
  86358.  
  86359. ΘE)9=╔σ[k¢ºƒ=Ç-í└τ╔╛┼┌╓╗√│VQ°¿ÇsrFR▐ü~T₧ZH..Z@+╢▓Xj*[ópX*¡⌐* ▌VNΩ┌▌≤¥ª"VòmJ} ▐½b ¬Φ╘vNôû/ε !
  86360.  
  86361. ΘE)9=■╧3'ò½å/å+î╛åÄ═╥╦ò¬·áQ║╕┼reMDòù~ZûQ@&kUb
  86362. ·à^Mif[½y|úº5 ₧MΦ╢╣▒⌡┼â:m░╒o+║╠╙LéüT║l░{âΦ Qx±qïä¥L[«
  86363. 9І!
  86364.  
  86365. ±M$.,(íΓX@°êé9Æ:≤ö√─√ù═╨╜≈¼EF¡ⁿ╙;cAUµ¥.W╫YM/b_j╢Ç^jk'C»hRf⌐δ/°╘G╝∙⌡≤¥óvw⌐<\ze╔ⁿi%í█─x\║òp║÷)┘!
  86366.  
  86367. ±M$.,(í╒r(┤åÄ Ç<⌡╣àÑ╝Σ┌┴■µ¡V¡╛├~z^S└├-çVGwKV+     ä]&2@πh[oΓ╜!!÷╦G@º▒≈ƒ∙αÆwJN,░╤[¼╨╘\[╒äg¬bóRû∩T[Sx╡$Å╦M╞uó/>┘ù└Γ! !
  86368.  
  86369. SAFEARRAYBOUND comment:
  86370. '<SAFEARRAYBOUND> is an <ExternalStructure> class to wrap the struct ''''OAIDL.SAFEARRAYBOUND'''' from type information in the ''''Ole Automation Type Library'''' library.
  86371.  
  86372. A SAFEARRAYBOUND describes one dimension of a SAFEARRAY, or C array when used to describe a VT_CARRAY in a <TYPEDESC>.'!
  86373. !SAFEARRAYBOUND class methodsFor!
  86374.  
  86375. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫le KzaY.╧ú1lH░hAí┐5Φ█ m┬▐▐¡╓Θ9?ÑF9LO∩ÆIr¡╞═IAÖ╖sºM┐iÖ≥<%`Uï÷╩@îGp⌐|║√╨Γ▐╡p£MïÜöO.ê╘vvÉA3Y¡┌·ƒDè+FÑ6╧α$f≈┬|éNa╬8±▀ªHq╛½÷Ω≤]┼₧    5╨∞╜%Jy    i'Ç╕zZ&Më$∞7»Çk_zn⌡┤»oⁿ¥╗╤╛ Ä╫δñë;╣σñcªl3
  86376. ▓y┌qSµδ)ân~αôä¥Ü╠Å╧╒π┤6òY┼╠Γ⌠█ZHlXFF;≈$ûπw%┴o≥$╢qEGeÅne½≥0∩ï«├U>/D>┬╬╫â5ñ╘sô┘@ÜÖ¢╨)/O─π!!g╤8┘û▓╗⌐╢≈÷╔Æ▀Z»Q║ü|! !
  86377.  
  86378. !SAFEARRAYBOUND methodsFor!
  86379.  
  86380. Γa+8=¬¢!!D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`U≈ê;_ÆQP9.]Zn≥┴J&'ÉqRf«┐!!÷╒¬╜▓¥πü^s²4iP(╪Ñy7╜ë─NGç▓Z¿EÑxä[╝!
  86381.  
  86382. Γa+8=¬¢!!s·¿éç5Σ╫√íö╛¥µ╗µσGK║√╥~pM_─ü,äGb^^nΓÆ^_o#Cº<GeΓ┐( ₧Tñó▓▐°╔\Ö[\
  86383. kc╬≥/_─ñ¬0Jîû5¬T╣oö Φ~I+Σp┼₧    ▄Ra╕Z|╥£∞⌠╞Ñp£!
  86384.  
  86385. φh% 6áΓX@°êé9Æ:≤ö√─√ù═╨╜≈¼EF¡ⁿ╙;dT▌æ0V╫YM/b_j╢Ç^jk'C»hRf⌐δ/°╘G╝∙⌡≤¥óvw⌐<\ze╔ⁿ~6╣╞╥]iü9òf½W∞=─H!
  86386.  
  86387. φh% 6á╒r(┤åÄ Ç<⌡╣àÑ╝Σ┌┴■µ¡V¡╛├~z^S└├-¢sF%{UW+     ä]&2@πh[oΓ╜!!÷╦G@º▒≈ƒ∙αÆwJN,░╤[¼╨╘\[╒ùz╝Gùi┐·BJbí0▀╬Lê4¡╤ÿ╞⌡╪! !
  86388.  
  86389. TLIBATTR comment:
  86390. 'TLIBATTR is an ExternalStructure class to represent the OLE Automation TLIBATTR structure.
  86391.  
  86392. TLIBATTR is a simple structure containing basic descriptive details about a type library, namely:
  86393.     its LIBID        (#guid)
  86394.     its locale id    (#lcid)
  86395.     its target OS id    (#syskind)
  86396.     is version        (#wMajorVerName and #wMinorVerNum)
  86397.     and some flags    (#wLibFlags)
  86398.  
  86399. TLIBATTR is probably only of interest for the purposes of browsing type libraries and is of no obvious use in applications.'!
  86400. !TLIBATTR class methodsFor!
  86401.  
  86402. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫khLzg_=╢Æ
  86403. Ks%[╢nV$╧┴MÉ╖+4ä₧ò┐├√.^ö{Sgl▀ÿh4º╟╔MAÜ▌{├)▀âεDLxíP│≈{╜v@₧mV║√╪¢ª╔ß*¬▓╖<╗°S╧
  86404. cδ├≈√δB&╚╖|ÜD╩■KΘk@Σó┼ÉO}╜¬úôèo┴¥Wsï─≥/dLZP7£$÷k%9á~·>╕àzJB╒ôÄH,â²è╒ûì╙╢Γ¿⌡⌠σ═#;
  86405. τûfB╣▄¡2àÉö₧╬∞q¿²∞╚f┤    ]╨êZ÷▐╦α-oGP `▒g▀ÜG °]¼w∞'vkM╒2    ╨╗┌9kßî╛qq
  86406. H2╗p╖╗░w?│▄q öû ┬╒¼~φynBÉ░oClⁿ■Æ┼╗=òë┌ƒσ»É2÷5╩φ,S*╡ƒ╧?ΓïNG?╚╫½ú»V■╢à«▄u6¢▀╔ ░tB.│÷1ò)─ígö÷±9α≥.╩6"Ñàåµ≈╙┐ó╡e*ê▌R$t▓ªöª p8-µ    µ¢ΓmφΦ╫n╕├▓+ £c╝bY╨╖!!╞f▐Φ¢╞Γ}⌡É╤╣▓è⌠2g{ⁿS╬D╛ò¬.≈└í╬x▄A o≤6,OäíÄnfxz╟f£╟Kj)ééδ3é«ú<╚I╝¡└├úM₧9M{⌠«τRi%Åh3xFVà;⌠u¼√╫ ßΓµΓ@«╥╒╛kpêzæ/└QK2Z╤.▀║ƒrkⁿP┐qß╟W    ≥ταφ@ÿ~]<|n■t¥£²ÑΓ9∞ ß╗7¼╧ÜN╚=u+@∙┼┤\≡ÿ⌡╕╪∩ #JFò£cvºÅE)ô╦vîª5H▐ÿJ╬æWå묬v8╨$*è#C1╧╨X%:╨≡≡╜εdílNx╠║*ì╟÷?ô¡\--fx÷v│Kr╪█¬( £b"?╣⌐ α:Pèαc"Vâ║τÿB┼δ╙╜ 2y┌╕|ª\┴╛┼₧sáÖQ    7f*╕▓Θç~╦√ì╜ç╟σ≡_╕ÄÖ,â}╖┴┐°ñI╪┴b√òτ8ù%║ù╤┴E═ IÅ%W,¿T4.~g┐7├X^┘pX¥~ 3! !
  86407.  
  86408. !TLIBATTR methodsFor!
  86409.  
  86410. ΓK*
  86411. 4*¡£='ëáû/ΦUêû▀▐≈┴▐┴╗▓Φb▒¿╫~aB┌ü~\éRF/|\mO⌠ÿ
  86412. \uf@Ñ<Gbºδ2 ▌G    ╛▓Ñ▐π└\ äq    ` ┘│`"»█╔JG¢▌{╟t│=ò ]Z=ípù█ÜNu½|╥£╟╢₧φqæÜê╙s    εßV@ªi|┬· ██≤No▄^┘│9n╣╞vé#┬&Ñ┘├F{ªáⁿ ≥µÖ
  86413. 5ìΦ╖JjTXtrŵW>~[─┘ÿ¿Xa|WCÜò'ÄÖ²┴╣εh≈╡Åü┌?╗τë╟w¿yεOwP≈╜mÇdU∩
  86414. ïàû╬▐Féû¿î+√4·a⌠=╬º∙╤}G[8≈8ü≥mhÉ?Ü╦D`ëmpîΘ<≡+╬úµ[x's╝sαÇü!
  86415.  
  86416. µQ.XR══'⌐╛ë8┼+Θ╤»▐√╘┌▄¿≈╖P ╝╒rwP█ü2V╫^Wjo`f·ì
  86417. Xj-¼~Yoí┐n╕│(m┬▐ë╣┬µ8^æfQOd▐«h!!╜ôÇJîû5╖Lúo▒°CJ+¿!
  86418.  
  86419. ΘE4><+»ª?(╜¼ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVjj^@h âJ&'╖eCoΓº)°╠C▒≈╗æ÷╦·7|o╫ⁿlr¬└╙R£Æpα█²kòo\ 4τ$ê≥P₧dx¡/ôô═∩ßí`âW▀╖║^)é╨p{äH+Hª╞⌡÷r╞f
  86420. !
  86421.  
  86422. ΦW;,╢Ç>D╨└╬ ï,÷╤²îΘ▀┌┴╢≈╖W╖╛ÇivKS█Æ;@╫[A9mIZi
  86423. σ┴r?_ª<_cá╣!!Φ╟á╛┤û╖╞^âaL
  86424. │╕h!!¡█╔[MåVÉ{║Q╣qâO╝bZ
  86425. 0ípå╬\▄N}«=┴¢╞σî│{çôƒ╙sóΦJ¡tJyç»7╫╠Oδ@6╔[╖|Ü$o╣─w╠Vk╪+ó£öLqí½╕≡∩σΓiO¼ß╛JgLPr!!╬ ±pcJA▄▀Ä∩V.&│┐<ÄV╓τ²▒■GΦ╗å▐┌?╗·Σ▄mK>*₧Z╨.S`─ÆFεYi├*!
  86426.  
  86427. ΦW1<íü_C╙δ¡$û(Σ╞»█÷╥╦▌╗ασGK║√╥~pM_─ü,ôZW)|RQn╢Ç^Qo"Kªr~╗╗%║╥K║╢Ñç╗Åâ4Wze╘╕h6ε╧╧K% ùf╛O╖d╨≤Z=≤w╤£4÷/┼>/╓₧┼╢█îzè+ôÜöoO» Niús!!┬├ⁿ∙s╞fΩw≤2╫O!
  86428.  
  86429. ΦW&,╢å1=┐¡ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVjj^@h âJ&'╖eCoΓº)°╠C▒≈áû°▄^ég[m    ╙»- ½┌╘KAûû9εB╕y╨⌠XLx≥lÉ╦Uÿzúpôå╦≤▐ÑuçÜ╫╙~
  86430. ε⌡^W▓l bçδs╤╦≥R*▐LöT₧G ô«F╤Gb╞ª≡èFR┐» φáªφM]¬δΦJ.Lds'G▒,╤2E}yΩ#Φ5!
  86431.  
  86432. φG.XR══'⌐╛ë8┼+Θ╤»▐√╘┌▄¿≈╖P ╖├rwP█ü2V╫^Wjo`f·ì
  86433. Xj-¼~Yoí┐n╕│(m┬▐ë╓⌡╓ä4Zar▐¥y¿╧╙\\╧V┬@<!
  86434.  
  86435. ≈A5    <7¬ΓX@°êé9Æ:≤öε┬╛∙æ√■ΣáAP╢┤╬;`\D█è9æPVjzSV+≤éPp#]φ>>╧┴I─═G «≈á│÷┼ íqL.{mÜ╕d!!╛┼┴@{üÜrΓ±3╫M╝BJ>ís▓╫WôPB⌐╞ƒâ≥┼│cä å¿çná÷!
  86436.  
  86437. ÷h.4Ñê!!D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`A■ì<t¢^C9.]Zn≥┴J&'ÉqRf«┐!!÷╒¬╜▓¥πü^s²4iP(╪Ñy7╜ë╫VZæ7ç9s¿P│i╩A«    !
  86438.  
  86439. ÷i&:*Æè »ñß@∞}└┌ⁿ█√┼ƒ┴╢≈σAF╝╛╔mvZ┴─)ûUK8X^AE√┴Pc*Kπ}@*úδ≈▀N ╝╢╗ò╖└ÆwJN,░╤[Éü┬@\É╙z╝Gùi┐·BJbí6╦ù!
  86440.  
  86441. ÷i.:*Æè »ñß@∞}└┌ⁿ█√┼ƒ┴╢≈σAF╝╛╔mvZ┴─)₧QK8X^AE√┴Pc*Kπ}@*úδ≈▀N ╝╢╗ò╖└ÆwJN,░╤[Éü┬@\É╙z╝Gùi┐·BJbí6╔ù! !
  86442.  
  86443. TYPEDESC comment:
  86444. 'TYPEDESC is an ExternalStructure class to represent the AX Automation structure, TYPEDESC.
  86445.  
  86446. The TYPEDESC structure describes the type of a variable, function parameter, or return value, and is one of the key structures in the type library model.
  86447.  
  86448. Member Variables:
  86449.     u
  86450.         lptdesc        <TYPEDESC*> For a VT_PTR|VT_SAFEARRAY, describes the pointed at type
  86451.         lpadesc        <ARRAYDESC*> For a VT_CARRAY, provides additional description of the array
  86452.         hreftype        <HREFTYPE> For a VT_USERDEFINEDTYPE, ?
  86453.     vt            <VARTYPE> Variant type id (16-bits)
  86454.  
  86455. Note that this structure is only 6-bytes long, and requires packing when embedded in other structures (Dolphin''s external structure/array packing and alignment algorithm will handle this automatically).
  86456.  
  86457. Instance Variables:
  86458.     owner        <ExternalStructure>. Backpointer to original structure to keep it alive, and also to locate ITypeInfo.
  86459. '!
  86460. !TYPEDESC class methodsFor!
  86461.  
  86462. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫k}KvX,╢Æ
  86463. Ks%[╢nV$╧┴IôΩ{0ìôÆ¡╘ÅÜdW kD▀║d<º▌╔VF°|·{╟*ódÇ°TIIQêwï╠LƒV4╕;τ½≤╙Φà@½Mä÷∙f╟ΣYM¡nJΦåZ╖─2ì(FÑ6ε/├E▄⌠[éb╨+╡┘ÉG/▐─æùëoë╞R}Ç─ù9!!% Yg6ïαL]&9á~σ#»çmT f ╥ô*ìNå⌡è╤ò½⌡┴σ¢0▒∩╠I█
  86464. w▓h⌡    m÷¿y┼-_Θ¥ôÜ₧╦Aö╪¿î+¥{-ßïZ¼Ä╬■(rP#    +σl■¥D ît½w∩=egPÑ;τû_è9 Yê╢τRq9Em┬╨╞╩àΣU$╣÷Gÿ╒╪qΩvVé∙*C⌐Mé∩╫▀╕│■╕Φä┼LêY«ÉV"»Ç╧%ΩÖ[V=Φ≡▌ñ¼}²≈F╬¢⌡X╔ôÆ@çEv>é⌡∙L¥╗w╧½¡@Ä₧Táx ô¼²üaß Ö0ééX Φ▒`d╛φ╚╬╧Ye}·σäα|╔┼╠O¥Γ│gN╗£<ε=1«ä4▒V.æ¡╛Σ█R╙0àⁿòìÑç_P╔e
  86465. ^ì_ª∞┘W░█äö┐&]ï}O#¢á┬|⌠"╕≤p7V+«┤─~ÿ∞σ    ╪I·wbáÖ▄á═tj5ªδ┐+^πJ?{C\└    Σ`ÑÑ═w}└╘¬ñV▓≡╒ {Fü9 ╪rU¢qh=V╙/╣íƒ▓SEⁿwÄ╜;t╝╛á│w▓3K!!A∙t╖æ╕ñ╣}Ç∙Γx╪╡÷}î\j┌Ω╕U°▄╜²Q╧┘▒(%)∩ìn<Γü! !
  86466.  
  86467. !TYPEDESC methodsFor!
  86468.  
  86469. αJ&,"í¥_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;/inµ¥.W╛QB%OURg∞ä & ]¼q}¬ó#≥₧V¡≈Ñ¢⌠╩Æf|i▌╡c3║╠─
  86470. °|■|ÉLísò╝PA4°~Ü╠!
  86471.  
  86472. πQ.1¿Ä!!:₧¼ƒ)ΦUê╚»┌Ωù├╕╘¢│GσµÇhvDPÆÆ*·5-<z6O└╡!!iR╬:½¡Φ╦GZΦ┌▌≈₧ª'\╛`M@o ╩│d<║╠╥\ÜVÇx½W╛t₧░\x÷a▀╨\ÖF4╕|┴ù└π▐│v╚ æƒ╙}╜µRVΓ Vo¢ 6╨▐RΓeÄ2░{ÖDÉ█8╦Lj╔-à╙├X┘╟æùΘ¼²rh╢áΦWBvCY&&è≡prCQ┌ΘÖóV*%│┐&à^ ä─▐°≈d²·╠ô┌v╝φ═▌18K░i∙O?│±d╔c¼T╫╝▌π╡!!ì┬à╗┤$àH└≈╞┴ƒw,&O    π"û¡m√]÷'ΣCqöyDêΦ6úH6í╦åV#(S={┼₧êäà∩Zjú√Lîû╛U╠-!!T╟π'C>¥mäΦⁿ╫»⌠£▄óΓó╜V│ô@Dd┤ÜèS▀3╜g&²■▒▄╫>h╫¢"ú╚Σ\Σ≈ε$üEbwüô≥DÉ≤2Å│┤[äê╖7_    ùΘΩü'▐Σò~éÅKíáad»°▌╞ÉEºPB⌐ú┌Z9ï⌐≈Y▄τÅbGª£'¿=!!¬╬xQ¬/L±╫·α╧I▄,πßëæñæ_DI═$S¢⌠²╙R■█┴Ñ ÷?LòD#╫░èmKágï╚AVbßεÄkδ·≥.▐ X╟|O½╦╥┐IÉ3Å╥ìx46ÿ\#YOA╞oµ`░ßû%,╔▀¢╗R«║É╛}MáfX l¿Y[1ƒfº≤╩CI\╓6J¿8B╒εT┘═╤╬?∙hX2wgA±Eâì╕Tα╪≡#╦çM≤ù╥îu-b┴¡╨3òè╗╕û╢++6─╪¡\Oî≡!!Z┌û0╫ïu╔üK╘╫3α∞╞~b²m -/BÜ#-üε`>░≥┴⌐≥o■
  86473. |X▄σx└╤╫ì░[<aDµ;ùM3α∞ÇvM╟@M2▒·Φ┐{oφ²j7 «╤ÇvÉ^┘τû%▒1 xå╠&ítÆ≡╥ñp≥┐Yf7f*╕íΘ"ñMⁿ╬áóÇ|Φ\ë₧áû└*│5"Ω·Å╨åi≥╨E╛ÉσV┼s¿ßHΦ┘`∙÷QΦCT;EαPR<J+▀$█Cû5o,ìTh▌╢3╜r`■²┴y½Pò!!ë╧½%▒z@(&╩¿¬\½Vä¼Iu÷S¼^√- w╘T:└Ω*2╪1⌠Nßrº╗■$Γ±F!
  86474.  
  86475. ΓH&    &í£1D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ║Ç_|DF┌ì0öSE9}Re ╢ê]o4JáhZe¼δ#⌡╦LΦº╢ùσÅ ₧wV@ma╘ⁿo7ε▄╙\L╒£{╟Q│mé∩TAx⌡lÜ₧\äVq╛=▀╥╫∩▄Ñ3îîÿüu½⌡F╗ sç»!!█▄ZεW*▐ÿ{Ö@ É─t├Q}Σ:ó▀├Mg¥º⌠╛Θ£µuYπáë    dUF/c!!ìJ╣JpbJ\╧W╧â¡]N0B_╔Ñ*ÿY?╪¥╗╤┬bΦ╗Æ▐╛;ªα!
  86476.  
  86477. µA3(0>Éû",╫├σû:φ╥»═≡╓╙╠ñ≈╖D║»≥~u|O┬üdäZH,.SAn    Γÿ\!
  86478.  
  86479. ΘV"!!!!┤è_C╙δ¡$û(Σ╞»╪÷╥ƒ╟╗±áZU║⌐çh3@D╫é*KçZ,g^_oO≈Æ^X&Bóp_~úº+║╤@
  86480. ¡┤ú╨╡óvs²`Hly╬╣~r¬▐╧KL┤╝s╜Fó'╨Q╡!
  86481.  
  86482. φT&0+ºΓX@°êé9Æ:≤ö√─√ù═╨╜≈¼EF¡ⁿ╙;XW╓ü-Q╫YM/b_j╢Ç^jk'C»hRf⌐δ/°╘G╝∙⌡≤¥óvw⌐Ul2OY■Ö^ε╧╥VE┤ùp╜P∞=╪σEJx≥`ê╤Kÿc`â:└ù╫¼î≡:!
  86483.  
  86484. φT30+ºΓX@°êé9Æ:≤ö√─√ù═╨╜≈¼EF¡ⁿ╙;XB╓ü-Q╫YM/b_j╢Ç^jk'C»hRf⌐δ/°╘G╝∙⌡≤¥óvw⌐@g0KD ÅNr¿█╧Tiæüf╜÷5ÆΦT\I+σsÉ╠]╜V[¬/╓åÖ╢£Θ!
  86485.  
  86486. εS)'bΣ£&;»¬ÿG∩VúΣ²┼Φ╓╦╨■┐σ`F½√╘sv@╙ê+W╫PBjzSV+≤éPp#]Σo-¡╝. ╠@í╣ñè÷┴╫b_ga╪░hr║╞ÇM@ÉV╧7MÜZªx╣·^|*⌠gï╦KÖ4┴jU╥Ç─π┴Ñ}£A▀êçn¡σânlç²s╩╫ZºS*╧Z╙÷?/╗¬»(╧(┐┘æ.εεδΩ≥½α!
  86487.  
  86488. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR½╛╪ofIZÆû;BàZW/`OR∙Å^V`f[½yxº¿%≤╚GΦú╕▐÷ⁿ ÆuSN,░╤[»·╘KMö■|╟A╖nÖ╠CF,╗$î█UÜ╞iU▌ù█Γⁿ╡g╥M█╙╚e╟ÿGV½n!!┬ⁿ6╥┘≤X?╔q█÷v ô«╠Gv╘ñ╚┘0·!
  86489.  
  86490. ⌡@"    6U╬µp┤║¢/ùαö│°╟τ·±¢┴å¿│╔x{_┴─*ZÆP3~^d    ╢ò\&#C«y^o¼┐`ⁿ╤P@┐┐╛¥ ÅÆ4Lme╙¬h ├ú⌐]MåÜp╜╖=Ç⌡_[ *íkì₧j╜dQì2≥½ì¢ª╔Zàô₧₧y║≡CM¡nJUì√6äƒlΓUo╪W▀V±,b≥èh═K`╘:ú£ùK4▒½╕ΩΦΦτaQ╝á│BqNPKt7ìΩ5cCàW▐äó\-5W!!░Φ&ÿ₧⌡æ╝∙r≡¿ö╬Ä7║φë╔E#Cα]─;mOτÿg╞bh°ïéç¢═M┼û╥εK≈p¡ní$╠⌠≡ƒI)_    Z)ß8¥≥mc₧&▀Z╫,(
  86491. èifê∩<εeS╬Γ√_4z~ N≤>√ß·
  86492. Dφë1@▐┴ZÜÖÖ╥<,TE┴¥NjT₧{Ö■╩êNú¡ │┘!
  86493.  
  86494. ⌡@"    6╢¥30╫├σhñ1≥├Ω▐╛╓ƒëè╦òvgÜêπ%3_^█ç6₧L>f^µä^V`f[½yk░╣!!π₧F╗┤Ñù⌡╩^òmfeÜ«h1½└╓\Z█{∙\úS║x¥≥EN1εj▀≡VêG.∞39╟╥╫■╔αqëö╓âsáσRVΓt;ÇΩs╩╫ZºR.┴ZÜαmu±┬8╨Gm┼6º┘æg εδ≈ε¡┤iH╘è█%R]&6ï≈%r[Y╞ìîßMe9√╣ÆJ┐■╫╖╧u÷»é┘Å,░╜ë╟ 4R╣<δgWóÑfÇ}T ÄÄ¥ïƒNö─à≥J±Z╙gΦ5└≤±╥fIF]5⌠wº╬@╡¼mæZ,(∞    ^₧■9σJ)L╔ªΩD2W p┘╨╫╦FÅ⌠R/Ñ!
  86495.  
  86496. ⌡]7⌐è_C╙δ¡$û(Σ╞»╪÷╥ƒ±▒■╡[J▒√┼cgMD▄à2âFT/.URf
  86497. ╢çK&2Gª<Gs▓«`■█Q║╛╡¢≤Å╫`V.r▀┐h;╕╠╥
  86498. °|■|▓▓xâ╝PA/Σv▀┬4÷+p⌐?ô╚₧╢▀ÑÄM£ùÆoè⌠DG∞`âß ╔┌Mºrî[▀≡mjⁿ▐8╓[~┼░╤å
  86499. ┘╟⌐╛⌠    ≥┤dY¬π≥iSPKb=╘J╪M51S╚▐Å│7aM╘Æ8ÄHN╓╖¢ ┴/ë╨Φ≤¢0ª⌠╠!
  86500.  
  86501. ≈E5,(íΓX@°Ö₧#ô>⌡╤»ü╛÷╤╞⌐≈╖W╖╛Çn\_▀à*W╫M'~WVf
  86502. °òMo)AΩ<Ek░ó!!⌠╩▒º▓▐°╔\
  86503. ƒqkc▀╡{7╝ç¡3!!íÜ5úB»=ÖΩ^C=ígù▀JòLs∞3─£âΓ─▓|¥
  86504. ù█Æp»ΓRWε oüús╫┘≤I*îK├÷mhΩçm╤G|Ç;┤┌èJq╖α║ôèk┬¥|»⌠≥o/C&h╙J≡<wF▌Yá{π▓\a:M╔Æ*ÖNX╓╦╟¼╝=╣·╨¢êô┼áK┬
  86505. 3
  86506. ╣n╝    x^σó)╬bO¼ƒìÜèƒAòû─ªv═"₧N╥ç┌╢▓p/!!Y    `¼wÑ├UÑ▀A═ByuÆ =╨╗╫5}εç╬es$7╗p╖╗╨B2Æ÷Yp≈─wîÉôA₧8<USéµ%)ê|Æ╞û┐d┼¼σ÷û╓ïi¿gò╖`dà┤ª=εφk`,Θ½╡öà²≤Eσ½°Uí╣ &öN0#éô Tîα;╠│ñDÅ█Q¬9_ï¼τ╙,╫⌡é;ÿäOíÇt!!Ω▌╓═ÜW)áSB╓úâaïêφOÉα▄hLú╨*φ<t╜█`z∩=pß╘┐╗¥H╪9Ñ╡ÿôñ█ _L▄-NMèa¿ò¬.(ⁿÅ!
  86507.  
  86508. ≈PJp\zàü!!>┐╗╠>ì:í╞Ω╧√▐╔╨¼╡╢U½√╞rvDRÆà-ûw'oW_·è^Vd,Jáh(╧┴MÉ╖|H¬«ú¢ΣÅ àpAf▄»h&⌠ëö!
  86509.  
  86510. ≈P    =╔σ[kè╗à<ä+Σöóî▀┘╠┬╗ασGK║√ΣtX^█è~WÅKA8`Z_+∩æh'Bª<Ue░δ4≥█¡┤▓ùß╩Yä4H|i█▓yr║╨╨\╫{∙{╟}Ç\ó(▌{I6αiܱ_¬v.∞9▀öâα═▓gæÜ! !
  86511.  
  86512. AXRecord comment:
  86513. ''!
  86514. !AXRecord class methodsFor!
  86515.  
  86516. ΓH"'bΣÄ6-¿¼ƒ9¬-├═√╔φ║╡╝ⁿ┼á@╛╡ço3ND╫ü~SÖE8lRGyΣÿ^Jr4ZáhFxºδ'≤╚GΦ╛úì╖╬àqM" ╪╣n3╗┌┼_ÉV¥p¬ór╨²B\I1⌡    ⌡╖[¥A∞3ô¢╫σî»aü
  86517. ûòÆhá÷ïRxì²7≈╤YΦcîK╥ß(g÷╒}éVf┼,┤£ÉPfª¡∞δ≥╗┤c]╖ºªJ`Fi ïú>%9╚ìï¡Lh/E╘┴.╦1éΓ─╗Φt÷┐á▀ê?¼╜çKóoZa{=»y≡    4LΩ╛|╠iuπ╖îâé┌E₧╪╤!
  86518.  
  86519. τV(<á¥7:⌐≤╠+ïσ╨²╔φ─▓┐╫░ä]πÆ≥~pGD╓¡0Tÿ.kHPy⌠ê^&2Gª<Aoí«)∞█PG╗≈╗ƒε└    
  86520. ╫yKz ╪╣-6½┌├KAùùX─*ânòA·C@σ`ì█JÅf⌐3┴ûΩ°╩»)╩`⌡÷∙1╜⌠[BΓstùπ7≡╨K╬L?└Z╫²9!
  86521.  
  86522. τV(<á¥7:⌐≤╠+ïσ╨²╔φ─ƒ╟╗±¬AGû╡╞t)D╫ç\æP%yUVyU╢àMg    X¡yA╚┬b█╨Q¡Ñ≈ƒ╖┴    ╫}Pza╘┐hr║┴┴MàÜa╜ór╨⌠T, ⌡aì╨XÉcp¿9└ü⢪╔aìÅëûo
  86523. áσR@Γb;âß┌█MΓR<î═·.i╣╒}╤Ra╬;ó£ùK4ºª²╛≡ºαo_╢∞▀`k&OF%s>éJΓ41 Q┌2╒Å│Wl0bH▐ô*ÿIK╪▓╝╥æ ìª┴╠ö-óµ█I╙h]b»k∙4┐±z╒}^■Fÿô£â■Lƒ─└⌡Q«R1┤Jσ7╫Γδ╠T+&8H3Γ ûσmléûBƒGdbèse╫╗Γ6K═░»D4.x}┘┌√╫B    ┌úN/┤╓GÖÜ▀H╔"=BQ╞±0åbÆΘσ!
  86524.  
  86525. ∩A08 >óè D╨└╬ ï,÷╤²î ù╤╨⌐▓¼]P½║╬xvU▌è*S₧QM$iZ╢Ä    W&$ZÑzVx∞╞Jô z2¡┤╕î≤▄\àqkf▀«h<¡╠ÇVFÖ▌T─.▄«∙]II6Σs»╤PÆVq╛!
  86526.  
  86527. ∩A0-<,¼╜7*╡╗êï9εÄ»▐√╘÷█╕²╚9*²Ü╬hdMDÆà~\ÆH#`HGj⌡ä^V`f[½yxº¿%≤╚GΦú┐ƒπÅ ûdM@o ╔¿'¡▌╒KM°|·fεG│nô⌡SJxπ}▀╩QÖ(à29╨¥╤≥σ«uçS╙█üy ç QK∞"g∩àZα╠ZδGo╬^╔≡d嬽+}┼+â┘ÇKf╖ç÷°∩\Φµe_Éε┤BjQ[th╬Ωk%9á├₧¿Xa5YIü∞EΓ3Öσ├½∙mΓ! !
  86528.  
  86529. !AXRecord methodsFor!
  86530.  
  86531. πE46╢è7D╨└╬ù6≈╒√╔╛܃≤¼≈áFº»┼i}IZÆû;AÿJV)kHd°äd?╖tV*░«# ╫T║∙┌⌠₧√ä4W.aÜ╕h4»▄╠M£âpúF╕iæ⌡^AI/Θm£╓ÄGxÑ*╓üâσ┘ópä îêûoO¿πXI╧
  86532. coèΩs╠┌L≈N!!▀V╪ $uαçw─~╥0º╒çMz┤ε·±⌠Φ≈l]¬≤≥BwCP.j7âφj8Q╟ìä▓Ml2@IÜ∞EΓI Æ⌡æ≡┐cσ⌐ê╬╝,░µÇI┬#»2╛b2ê╪z┼a]¼¢é££█aò╨╩ªp±?¿o┬?└µΩàZUlC!
  86533.  
  86534. π]31╛è_C╙δ¡$û(Σ╞»╪÷╥ƒë╖ⁿ▒VD║⌐₧;`AL╫─7\╫]]>kHd    ╢ò\&5[▒iP~╖╣%║╔P╕º▓Ü╖═^â|[@|e┘╣d$½█Ä% {∙K╜F║{╨∙R@<╚jÖ╤₧[`⌐35╔ù!
  86535.  
  86536. σM4
  86537. 99╜á<s·¿┐>ù:α┘éªù╦ƒ█┐ á_╥╤⌐urESÆ▐cäZH,.IVhΣà7W`)¡}^o∞╞Jô▀q║▓╢ô╖óvw■z[zP╧¿L>óôÇFöûVsºQÑi╨∩g@=φ$û╪mÄWq÷@öô═╢ï¥3ü ╣܃o
  86538. ⌠▒lú MF╦┤^┤╢6ΘD7╪o╧╥!!múçv├Ok!
  86539.  
  86540. σK"    ░║<-┐╗ƒ>ä1σÄ»═╙╥╠╞┐⌡á>)╓∙≤~}\╞ï~FƒZ8kXVb≤ô^[f[½y\Åδ7≥█L@⌐≈║¢Σ▄Æ4M`tÜ¿br║┴┼ZÉûc½Q÷jæ╝<%`6εp▀╫TîNqí2╟ù╟╢╬╣3£Ü█üy ½°AA░ i┬µ'═ƒL≥Q*▐\╓α>dΩë8δL.╘7╕╧├Guá½╕ΩΦª┤tT╝á▀`kvCYe&üú61N}╠▐ìñd/@╒Ä$Ä^Bâαæ▒≥!!≡▓äìê;╢µ└╩pR░}∩3÷┤d╨aZ°╥┴ÆÇ█÷╝¼∩D┤?»eσs╤∩²ƒVy]    Y/°6ç≥mcÿ1ôJƒRqâträ■#µjO═╢í\P's╩Z═╫╒Aö∞Nj╢φNî╒₧U┘/xL-{½±6.╤6╩╗┘  ┐⌐≡▒╬╦╩M¢M¡üKB7ε σzâ+┐eeXíπ≡╧╫8b╫ë%╜ì╣OΣ¿╗ àtb"▌ô.┬S£φ1╠Ñ╝Gâÿc¼= .î╜Æ╧-╘Γâ*ùëN\í╡"a7╣⌡▀╬¿W<.ú).╠▓└^3┘Çñ▄τ▒lQ▒▌4¿=1╢█w\σ)
  86541. ò«╙α╧\▐u■¿╨╤╠╖v/U▀PN¢ª├■Tµ¥îúó@ò_fäíÄm╝"É╟c|
  86542. àô╜wπ²σ7█_O╘jg║²▄ú≡~jZΦ┐ßTo#ï@>'
  86543. SΦ*■v¿ªÆ
  86544. Ѽ╞╦K¡╞╤│|ZP─XX∙I|ΘFK u╓.⌡╖└>O"╣SY┐lÜε?lΩ▄σⁿ6┘I~Z1I√dö┬²▓Σ.âΣ░╒σ₧MÑQKG·┬┐J∙Æ╗ó≡σ▒%"<⌡ï^iº╞+ú╔W║çR╧ò@è═↓J┬╠!
  86545.  
  86546. µA3<<=¿ïhi╝áë&üα┘Ω Ω┼╓█╣ƒ╧:₧╡╙lvZ╞î;ü^H?k\mOΓëh'Bªxl½«,■₧MΦú┐¢╖▌Æ}H|,╖╓=╝ë╔_üûpεJÑ=₧╝BZ
  86547. 0íbû█Uÿ`ñ2ôÇ┬ ▀Ñ3ëM▒öçZ╗ Sa░ri╠¡^┤▓5Ä<╔S▄V⌠(u▀╬}╬F4Ç9╕┘Å@Z▓ú²═⌠í·g░µô`HAQ&    ¥∩pt]B╞π₧çVx2GÜç&ÄV╕±▄╜╧u÷│Å╩º!
  86548.  
  86549. µA3<<=¿ïhi╝áë&üα┘Ω Ω┼╓█╣▓¼Ub╜¿┼ug╫£=WçKM%`sRe ·ä 4 Oér@}º╣`ε╓G@╛╢╗ï≥Å╫`V.n█▒h6ε╧╔\DæV£5║K│=é TF=≤(≥┤0ôP4Ñ|╟Ü╞Σ╔αz¢Mæö╙o¡∙B½e┬√;█╤≤I*îM▀µ!!u╣╚~éGx┴3ñ▌ùMz┤ε∞÷σF┼₧    ╖Θ╛ lEc
  86550. j'Å∩n=U╤╚₧¿VcBB▐ì*Ö@√Ü╝╥ò_≈┐ì╦┌,░α╞╦,9C╗yΦ)}Zε╡3ÇkRΘ
  86551. Ü»Æâ┌{Å─╠ΦE┤"╡f╗s╓Γ⌠┘ZOonZ8 #╔╖(}Æ1ÅZ╓OjbêdlêΘ!
  86552.  
  86553. µA3,44¡ï ┐Ñê9ΦUêû▀▐≈┴▐┴╗▓Φb▒¿╫~aWÆ╪-WåJA$m^WY
  86554. ≈à[j#l¼p_oí┐)⌡╨@º▒≈è ╩\₧qR} ▐╣k;á╠─% Ü5║K│=é TF=≤#î₧MÖOdá(╓▐âσ├▓gì    ▀Æ¥<╜≥RJªi|┬α!!┌┌MºN)îP▄α(u╣┴j═O.╘7┤£ÉPuí║╕±µF╝ⁿe1╙ëípEAt7└HÄ}]&n┌┴╩│\n3QH≤Å)äôΣ≈▒∙mαöÇ└ƒ-!
  86555.  
  86556. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A+G⌡ÄTi(╖sc¼┐%Φ╨C Φîíƒ√┌#╫uP
  86557. │╣u&½█╬XD╒-üs½Q│sô┴M>τaì═±(ÿ9└ùâ∙╬¬vïî█Æn
  86558. ε≈^Júlaâφ?█ƒLεO,╔╬÷4!!δ┬~╟Pk╬<┤£îSz╢¬╕√°¡µn]╡ì╪c`UZt1ï¡U]":áU∞üßMe9≤│*êUÆ┘▀╛≤?ñ«ÄìÖ,░Γ▌ Å?R┐hΘxµ░}┴/6åk⌠Φæù╦Mêûƒ╗τ<╝+≤6╞ΦΩ█3Ho@F{8≥8ü≤wö5ïKæu++pôpeƒ╗<φ1U╔«µM4!
  86559.  
  86560. ΦJ.<9¿å(,αΘì$¼1⌡╤Φ╔∞║╡╝ⁿ┬╖ZU╛»┼;>u└ü?FÆE$.^K
  86561. ΣÅU&$ZÑzVxΓó.║╩JΦÑ▓¥≥╞
  86562. à4Q.t╥╣-!!╛╠├PN£ùVfºY│3²kòb@=íwè▄ZÉCg┐/ƒ╥╙≈▐┤zïôÜüpε≈XVΓWu╤╜s═╦M≥B;┘M▀┐ml°▐8╒C`╘Ñ╙├Kb╢╝Ω≈Σ┼₧    H╢áí%R]o ╬ Ω#e]╠╧ÿßMb|WD▀ê=╦I î⌡ƒ·æ ë╨Φ▐ƒ2│ú└╞>
  86563. 
  86564. ªy!
  86565.  
  86566. ΦJ.<9¿å(,èªà$æ:≤╣àÑ╝τ═▄¿≤▒V≥√≡~aNY└ë~SÖF#`RGb·êXr/@¡<Ao│╛)Φ█F@«╕Ñ▐π╟^àq]gv▀«X╟▐╚PK¥VÜ5╜S│~Ö⌡R7ípù█ÄGr⌐9▌æ╞╢╩»aàC▀║¥o½πP¬eJiç∞6╫╔Z⌡Bª6ε│=dδ┴w╨O.╓>╜╔ågú½√≈µ½┤iR░⌠╗ l\To=ÇFú&t]B└╚Q╔¿Wd(JM╓ê5Ä@√Ü╝╥òn≤┤ä▀┌7ª═└Å 1?╣&╝4gZε╖)┬h}σƒìÜö▐Jù╙°!
  86567.  
  86568. ∩A"&╢è7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ¼╚~g@S└─*ZÆV/m^Z}
  86569. Σ┴ \w3F▒y@*ñ╣% ╫LΦ╕▒▐÷┴^ÆlJ|n█░- ½┌╧LZûÇX7├)█∙?∩TCx∩kï≡LÉN4¡8ë╥°∙█«vÜMûê╜uô!
  86570.  
  86571. ±Q%<+¼è6⌐╣ë)æ,î╛åÄ▀┘╠┬╗ασRπù╧tx]Fµà<^Æ%hGc
  86572. ╢▌?Jv#L╖"@*▓╛"÷╫Q¡│≈£εÅä`_me╔ⁿb4ε▌╚\çÉ|╕Fñ3╥lû<%`$íeî╬\ƒVg∞Q╣√┬σ▄Ñp£▀┴╬<½²Qíl hæ»#╦▌SεR'╔[√π(bφ╘W─k`╙+░╥ÇAg²├Æù≤ñ≥ U¬╬º%+?b;ê,Γ#tñ}ñxπÜJh0E ▌ä;╜[ƒ⌠≈▒∙mα⌐┴╔òd⌡Äú`ªl^b)Y╣} 4Có▄⌐2àoƒÆâï▄\êû¿î+¥{Y╙α7┴╜╕ùRUlC    :⌠#╡■(iòn▀K▐I #àla₧ΦXëcL5í╦åY4-k
  86573. n╙╩êÖe>▓µ_%Ñ√hîàÜD╩AR9)x½ÖM<£i═╗▌╙ñ≤╠ïàµí6óY│ö@U0│ σ!
  86574.  
  86575. ≤A$'<ìü4&╫├σhñ1≥├Ω▐╛├╫╨■αáPF╢¡┼i4[Ä¡ WöPV.GUUdQ╢êJr'Aáy|ú╣)√▄Nµ⌡┌⌠ÜÑu àq]|d≤▓k=!
  86576.  
  86577. ≥A3<<=¿ïhi╗Üÿ8î1µö∙═≥┬┌Å■≤½|A╡╛├o3%<╗╞WâP"kEjπä^V`f[½ydúª%■₧D    ¡╗│▐°╔\
  86578. ƒqkc▀╡{7╝à¡3!!Ü╙sεW╛xé╝X\I6ε$î╦ZörÑ0╫╥╫■╔«3Ü ûêû<ε▀XPäouå╩!!╠╨M⌐Bª2░α(m ç¿+╙:Ñ·èAx╖⌠╕ ╙║²n[╘è█cdJ@<rÅ╠:tLDñ}ñxâºxo/FB╬█o░IÜ÷æ╜εsδ¿»┬Ä║÷╟òE68╡r√2!
  86579.  
  86580. ≥A3<<=¿ïhi╝áë&üα┘Ω Ω┼╓█╣▓│RO¬╛Ü;}MAΣà2GÆM,OY@nΓ█^\~%J│hZe¼â!!⌠┌N║┌▌≈╡ⁿ
  86581. ╫`V.v█░x7ε╞╞\¥╙túF▓=û∙]KI7τ$ï╓\▄Pq»5┼ù╤║î┤|╚ù₧■f╕≡EMún;öε?╦┌ΦGo╪W▀V»;`δ╬y╠VM╧2í▌ùMv┐½ª╛∩ó±cH⌡á╝SGYc~π`è"1FVë┼ÿñd/B╒┴<₧Y
  86582. ╓÷╪╜≡eñ«ë╚ö~░⌡╚┌#R┤y╝SzVε░m╔nmφ
  86583. ïÇæé┌╫û¿î+±
  86584. 3┐{⌡:╩Θ╨▐BeJ}╨9Çα(w╤:ÜYΘMWf╚"τû_è46Y─ñ»E49E z ╪▌Ö)lΘèO/ú┘@ÜÖ¢₧*1UL∞±)à~₧⌡▀Æc╞╙ÿá╩ç▐Z╞«üR`%¼çèSª@─ o∩▒ΩÄ╓:}æ≈F╬ß∙R0ªΩ■'ù02ä╓ΦIû∩ì⌐╣XÅë!
  86585.  
  86586. ≥A3(0;½¥6┤»âp┼>∩²▌╔²╪═╤ùⁿú\░¼╬~a╓à*S╕HJ/|69M╞ôOg2Jπ1Yº┐`ε╓G@║▓┤¢■┘ ╨g\GR▀┐b ¬α╬_G╦VÆqεB÷æ≈] >ΣvÜ╨ZÖ`ú@(█ùâ∙█«vÜ`⌡≥£zO║∙Rªaz┬°;╫▄WºC ╪WÜß(wⁿ╔l╤z╚:±╪éPu≤¿Ω±φF¬±iR╛áò)EaBo>ïJ≈51]U╩─Å│4UJ_Üô*ì_ô■╥▒≥fñ│òü┌?╗τë╟ 4R
  86587. »<Θq[óÑfÇdUΦ¥Ççïƒ\öû╤εG┤5╣nΦ%└⌡╕╦G}]}Γ?£Γ!!aⁿ^÷@╨ Dqâe Ö≤0ú$H╔ΓµC"?F0öw┤┐│-àαS8│╓GÖÜ▀âl9^i#╟≤+9╕bæ⌠û┐d┼╡µ╕╬Öï┴ñàQW ╖£è! !
  86588.  
  86589. AXTypeInfoStructure comment:
  86590. 'AXTypeInfoStructure is the class of <ExternalStructure>s representing the OLE Automation structures used in conjunction with <ITypeInfo>. AXTypeInfoStructure itself is abstract.
  86591.  
  86592. Note that all subinstances of the receiver are allocated by an ITypeInfo and must be released by that same ITypeInfo. We achieve this by a backpointer to the allocating ITypeInfo/AXTypeInfoAnalyzer, and by marking the subinstance as finalizable. This does mean that holding onto one of these structures will cause the originating ITypeInfo to persist as well.
  86593.  
  86594. Instance variables:
  86595.     piTypeInfo    <ITypeInfo> which allocated the struct and which must free it.
  86596.     analyzer        <AXTypeInfoAnalyzer> which wraps piTypeInfo, and can analyze the receiver (may be nil)
  86597. '!
  86598. !AXTypeInfoStructure class methodsFor!
  86599.  
  86600. ΓH"'bΣÄ6-¿¼ƒ9¬-├═√╔φ║╡╝ⁿ┼á@╛╡ço3ND╫ü~SÖE8lRGyΣÿ^M6Jπu]l¡δ3ε╠W╝óÑ¢╖╚Æz    zsÜ╜i6╝╠╙J╒ût╗P│=ç╝_J <ípÉ₧I¥Qg∞    (╛°¬⌠═úx╚É█Ühε■EMÑizûµ=┘ƒ╬u6▄Z≤⌡"?╡çl╩G|┼9╛╬å`╗½δ√á╝µu_¡⌡á%ET!!&╬µW#e@B╠ìä╠3=P ╠Ç#₧_╓∙▀°²!!╕ëò▀Å=í÷█ ε%
  86601. ]≥>æe5ïÅz┼a]¼ûÄåé█fö┬∞δR°=┐e⌡! !
  86602.  
  86603. !AXTypeInfoStructure methodsFor!
  86604.  
  86605. αJ&,"í¥_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;eIZ╟ü~]æP"kAn ≤ê\ta\π;k¼¬,π─G∩≡≈ù∙▄Öw[@xa╚╡l0ó╠Ä% {∙K»M╖që∙C!
  86606.  
  86607. αJ&,"í¥hi╗ºú(Å:Γ└éªùò∩╟╖ΣñGF ÷ÇHv\╞î;ü^H?k\mOΓët#LªuEo░∞3║Öª╢╗çφ╩Y╨4W}t█▓n7ε▀┴KAöƒ5║L÷iÿ╝P]-∞aæ╩▄Czâ6╓æ╫╕Ä═σg÷Ü¥}╖δRVΓ:W;âß▄╒ZΣU!
  86608.  
  86609. τV"XR══;┐¼╠/¥+Σ╞ß═≥ù═╨¡²░A@║¿ÇtdFS╓─<K╫KL/.IVh
  86610.  ùK(K%╩RH∞δΓ╬N    ½╛úÆεÅ ÆqWi █▓-û²┘IM╝òF║Qú~äεT9°$û╨O¥N}¿(╓╥┬°╒α|ÄMûÅÇe╟ΓBF∩siù∞'╦═Z⌠o▀PÜ÷mb⌡┬y╨j╧(┐£ùLq≤»÷ ∞▓±r╕ε╢J|VPh4üJ≤9[U█â|α╚p`,OI╫ä!!ƒ[ƒ ▀°╥n≡┐█ì╜;╗µ█├    .K╣}≈zXóªlÇbUα▐Åûï█Å┘àαP±]╨Σ+╤ΓΩ╤JeVFF* 2ù╖el▀1╤╤Omôll═δ:Ω1Y┌δ»^?)^p╒═Æ╓BFöδYjÑ·JÜ£ëB╠bz=*|¿Ö7-ö~╫²╩╫ Γ╫¢▀╩à╩SàBÑû yαéå'╥:¿Kh⌠■Ωôà1x¢!
  86611.  
  86612. τQ+⌐è_C╙δ¡$û(Σ╞»═╛╤╩┘▓δσBV╛╖╔}zMRÆè?_ÆB%|Gc
  86613. ╢ôZc/Yªn*╖╕%ⁿ╦N@í╣≈Ü≥═    ╫{K~u╬ⁿh&¡ï¡3% ¡póE÷|₧≡HU *íj₧╙\╨3ΓGpôü╞·╩α}ëÜ!
  86614.  
  86615. ΦJ.<9¿å(,èªà$æ:≤╣àÑ╝τ═▄¿≤▒V≥√Θuz\_╙ê7HÆP"kAn ≤ê\tfás^g¡Ñ`ε╤    ªú▓î∙╬^¼b_ {eτⁿl<¬ñ¬0Mìû{»O÷Fé·T] 6Γaó₧[ëDr⌐/¥╨«£í╩¢ô¥╙uºσ^E«i~!
  86616.  
  86617. ∩E*XR══'⌐╛ë8┼+Θ╤»┬ ┌┌ò▒⌠σGK║√╓zaAW╨ê;ôZW)|RQn ╢âr.JπnViºó6 ╠ B┼▌┌⌠₧±¢r{b┘░l!!╜√┼JXÜÇwºO┐ië!
  86618.  
  86619. ∩A"&╢è7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ¼╚~g@S└─*ZÆV/m^Z}
  86620. Σ┴ \w3F▒y@*ñ╣% ╫LΦ╕▒▐÷┴^ÆlJ|n█░- ½┌╧LZûÇX;├)▀T¥≡TB 6⌡eï╫VÆZú9ë╥Ω°î┤{ü▀ÿÆo
  86621. εµR╢e┬√<₧╫^±Do▐Z▄ß(o·┬kéVaÇ:⌐╚åVz▓ó⌠τáñ°o_╕⌠╖o/W`4ï≡[ppATë┼Öñ`)PXÜâ*╦\ô⌡û╝╝c²·æ╠ë-╝φ╬I█2R╜≈O`PóÑa┼-Zα
  86622. æéÆÜ╓F£û╠ΦV±6╗hΣ}çèÆ▓p/W\E;▒9£πp¥8▀O╤XûiTöδ0╩#Sê¼αC/FC!
  86623.  
  86624. ±M%=ìü4&αΘì$¬=δ╤∞╪ô╜╢ùÄα¼EB½╛Ç63{S╞─*ZÆR+bNV+≡┴
  86625. Qcf]ªVc┤«2╜═G∩º╛¬ε▀7ÖrQG) ╙▓~&»╟├\âüt¼O│=ä╝EG xαvÿ╦TÖL`α@=▌╜┴ⁿ╔úg╞O≥±■f╛°c]▓e#uäαsäéµO╬U▀τ!
  86626.  
  86627. ⌡@"    6U╬µp¿áÜ+æ:íÖ»φ≡─╚╨¼▓ñwåïσ_V{uÆé1@╫KL/.TQa
  86628. ⌡ò^]c5L▒uQoªδ"π₧V¡≈Ñ¢⌠╩ÆfB
  86629. ╖╓ ╜╠╠_åæy»PÑOò∞^A1πmô╫Mà!
  86630.  
  86631. ⌡]7⌐è_C╙δ¡$û(Σ╞»═╛≤╨┘«·¼]║ú╘~aFW▐─*KçZ$oVV+    ∙ô^Mn#▒yPo½╜%ΦÖQ@╝«º¢╣ìqt·7>}e╓║-&¬╠╙Züâ[»N│!
  86632.  
  86633. ≈P    =╔σ[kè╗à<ä+Σöóî▀┘╠┬╗ασGK║√ΣtX^█è~WÅKA8`Z_+∩æh'Bª<Ue░δ4≥█¡┤▓ùß╩Yä4H|i█▓yr║╨╨\╫{∙{╟}Ñx£╝EK +Γ$ë╩w¥Oq! !
  86634.  
  86635. CUSTDATA comment:
  86636. '<CUSTDATA> is an <ExternalStructure> class to wrap the struct ''OAIDL.CUSTDATA'' from type information in the ''Ole Automation Type Library'' library.
  86637.  
  86638. The type library contains no documentation for this struct
  86639.  
  86640. Warning: This comment was automatically generated from the struct''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.'!
  86641. !CUSTDATA class methodsFor!
  86642.  
  86643. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫|qZr_.╢Æ
  86644. Ks%[╢nV$╧┴Iô²w3£ôû¬╓ÅÜdW kD▀║d<º▌╔VF°|·{╟*ódÇ°TIIQêwï╠LƒV4╕;≡º≡┬ΦüG⌐Mä÷∙f╟ΣYW½g~å»?╤╤XºB ┘L╬2≥9`ó¬½+π
  86645. éΦºe@Æç╠█═LΦΣr[Ü⌡í&dRTP Xτc■WD|dφ6∙0╤╠3V*╖δBß3ôⁿ╫╒ûì╛ä╦ô0░┼└ ├mKQƒi∩P^÷░)╘tKΘ\▐Ññíφl╜▀└ΩF┤5╗o╬=╔■╕╨@zJ}íl■¥D ò1ÖG╤gKfèd:═╕%±I█╢╦V%;
  86646. g╞äÆærÆΩ](╗·zïçèD╩9*Ua╨±=32ÿbâ■╩⌠⌐╢⌡÷▀Æ█Z╞â▒vbüª«: Ç"j⌡╣ñ╞ƒ2ö╣9┤£╘UÑ░╗DΘ)^dε║|ò)¢Σëª╣{äù^π7ɼ│¢ià╛²T öO
  86647. τ⌠}0»╟╤╤ÉC! !
  86648.  
  86649. !CUSTDATA methodsFor!
  86650.  
  86651. πE46╢è7D╨└╬ù6≈╒√╔╛܃≤¼≈áFº»┼i}IZÆû;AÿJV)kHd°äd?╖tV*░«# ╫T║∙⌡≤¥óvw╕X{!!{t÷╡o »█┘LÉÆy║╡qòεrZ,┼eï▀▄Qqá!
  86652.  
  86653. Γg2    !!Ñ¢3D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`U±æ-F│^P+.]Zn≥┴J&'ÉqRf«┐!!÷╒¬╜▓¥πü^s²4iP(╪Ñy7╜ë─NGç▓Z¿EÑxä[╝!
  86654.  
  86655. ±V 9 +░½3=╗─µC╟∩╟°╔∞ù╦▌╗▓╖V@║▓╓~aEÆö,U┤JW>JZGjO≡êUbfN░<R*æª!!÷╥Vñ╝≈æ⌡┼â:m░╒S║█╒Z\Çû7g╝B»=û≤\n<≤aî═▄
  86656. v╡9└╥╨≥█»aî,ï┤òz½σ÷)Jwçß4╩╫ºR*└YÜ╨8rφπy╓C.┼3┤╤åJ`Éó∙φ≤\Φ╫Uoì─ô>#Lrp&! !
  86657.  
  86658. EXCEPINFO comment:
  86659. 'EXCEPINFO is the class of <ExternalStructure>s representing the OLE Automation structure of the same name. EXCEPINFO is used to return exception details from IDispatch::Invoke().'!
  86660. !EXCEPINFO class methodsFor!
  86661.  
  86662. clear: addressOrBytes
  86663.     "Free external resources referenced by the structure
  86664.     of the receiver's element type at the specified address."
  86665.  
  86666.     | lib |
  86667.     lib := OLEAutLibrary default.
  86668.     4 to: 12 by: 4 do: [:offset | lib sysFreeString: (addressOrBytes sdwordAtOffset: offset)]
  86669. !
  86670.  
  86671. defineFields
  86672.     "Define the fields of the EXCEPINFO structure.
  86673.  
  86674.         EXCEPINFO compileDefinition.
  86675.  
  86676.         struct EXCEPINFO 
  86677.         {
  86678.             unsigned short wCode;            // An error code describing the error.
  86679.             unsigned short wReserved;á á 
  86680.             BSTR bstrSource;                // Source of the exception.
  86681.             BSTR bstrDescription;            // Textual description of the error.
  86682.             BSTR bstrHelpFile;                // Help file path.
  86683.             unsigned long dwHelpContext;    // Help context ID.á á 
  86684.             void FAR* pvReserved;            // Pointer to function that fills in Help and description info.
  86685.             HRESULT (STDAPICALLTYPE FAR* pfnDeferredFillIn)(struct tagEXCEPINFO FAR*);
  86686.             SCODE scode;                    // Error code
  86687.         };á
  86688.     "
  86689.  
  86690.     self
  86691.         defineField: #wCode            type: WORDField new;
  86692.         defineField: #wReserved        type: WORDField filler;
  86693.         defineField: #bstrSource        type: (PointerField type: BSTR);
  86694.         defineField: #bstrDescription    type: (PointerField type: BSTR);
  86695.         defineField: #bstrHelpFile        type: (PointerField type: BSTR);
  86696.         defineField: #dwHelpContext    type: DWORDField new;
  86697.         defineField: #pvReserved        type: LPVOIDField filler;
  86698.         defineField: #pfnDeferredFillIn    type: LPVOIDField readOnly;
  86699.         defineField: #scode            type: SDWORDField new! !
  86700.  
  86701. !EXCEPINFO methodsFor!
  86702.  
  86703. _deepCopy: copiesDictionary
  86704.     "Private - Answer a 'deep copy' of the receiver, cloning only those parts not already included
  86705.     in the IdentityDictionary argument, copiesDictionary.
  86706.     Implementation Note: We have no copiable instance variables, but must copy the BSTRs embedded
  86707.     in the structure, something which our #copy implementation does."
  86708.  
  86709.     ^self copy
  86710. !
  86711.  
  86712. bstrDescription
  86713.     "Answer the receiver's bstrDescription field as a Smalltalk object."
  86714.  
  86715.     ^BSTR fromAddress: (bytes sdwordAtOffset: 8)!
  86716.  
  86717. bstrDescription: anObject
  86718.     "Set the receiver's bstrDescription field to the value of anObject."
  86719.  
  86720.     bytes dwordAtOffset: 8 put: anObject yourAddress!
  86721.  
  86722. bstrHelpFile
  86723.     "Answer the receiver's bstrHelpFile field as a Smalltalk object."
  86724.  
  86725.     ^BSTR fromAddress: (bytes sdwordAtOffset: 12)!
  86726.  
  86727. bstrHelpFile: anObject
  86728.     "Set the receiver's bstrHelpFile field to the value of anObject."
  86729.  
  86730.     bytes dwordAtOffset: 12 put: anObject yourAddress!
  86731.  
  86732. bstrSource
  86733.     "Answer the receiver's bstrSource field as a Smalltalk object."
  86734.  
  86735.     ^BSTR fromAddress: (bytes sdwordAtOffset: 4)!
  86736.  
  86737. bstrSource: anObject
  86738.     "Set the receiver's bstrSource field to the value of anObject."
  86739.  
  86740.     bytes dwordAtOffset: 4 put: anObject yourAddress!
  86741.  
  86742. copy
  86743.     "Answer an <EXCEPINFO> which is a copy of the receiver. The embedded BSTRs
  86744.     must be copied (the accessor copies because BSTR>>fromAddress: copies)."
  86745.  
  86746.     | copy |
  86747.     copy := super copy.
  86748.     copy bstrSource: self bstrSource detach.
  86749.     copy bstrDescription: self bstrDescription detach.
  86750.     copy bstrHelpFile: self bstrHelpFile detach.
  86751.     ^copy!
  86752.  
  86753. description
  86754.     "Answer the receiver's bstrDescription field as a <readableString> Smalltalk object.
  86755.     This is the error string set by the object which reported the error."
  86756.  
  86757.     ^self wstrDescription asString!
  86758.  
  86759. description: errorDescription
  86760.     "Set the receiver's bstrDescription field to a <BSTR> copy of the <readableString>
  86761.     or <BSTR> argument."
  86762.  
  86763.     | bstr |
  86764.     (bstr := errorDescription asBSTR) == errorDescription
  86765.         ifTrue: [bstr := errorDescription copy].
  86766.     self bstrDescription: bstr detach.!
  86767.  
  86768. dwHelpContext
  86769.     "Answer the receiver's dwHelpContext field as a Smalltalk object."
  86770.  
  86771.     ^(bytes dwordAtOffset: 16)!
  86772.  
  86773. dwHelpContext: anObject
  86774.     "Set the receiver's dwHelpContext field to the value of anObject."
  86775.  
  86776.     bytes dwordAtOffset: 16 put: anObject!
  86777.  
  86778. helpFile
  86779.     "Answer the receiver's bstrHelpFile field as a <readableString> Smalltalk object."
  86780.  
  86781.     ^self wstrHelpFile asString!
  86782.  
  86783. helpFile: helpFilePath
  86784.     "Set the receiver's bstrHelpFile field to a <BSTR> copy of the <readableString>
  86785.     or <BSTR> argument."
  86786.  
  86787.     | bstr |
  86788.     (bstr := helpFilePath asBSTR) == helpFilePath
  86789.         ifTrue: [bstr := helpFilePath copy].
  86790.     self bstrHelpFile: bstr detach.!
  86791.  
  86792. hresult
  86793.     "Answer the HRESULT associated with the receiver.
  86794.     This may need to be generated from the error code, depending on which was specified."
  86795.  
  86796.     | wCode |
  86797.     wCode := self wCode.
  86798.     ^wCode == 0 
  86799.         ifTrue: [self scode]
  86800.         ifFalse: [
  86801.             wCode >= 16rFE00 
  86802.                 ifTrue: [WCODE_HRESULT_LAST] 
  86803.                 ifFalse: [WCODE_HRESULT_FIRST + wCode]]!
  86804.  
  86805. pfnDeferredFillIn
  86806.     "Answer the receiver's pfnDeferredFillIn field as a Smalltalk object."
  86807.  
  86808.     ^(bytes dwordAtOffset: 24) asExternalAddress!
  86809.  
  86810. scode
  86811.     "Answer the receiver's scode field as a Smalltalk object."
  86812.  
  86813.     ^(bytes sdwordAtOffset: 28)!
  86814.  
  86815. scode: anObject
  86816.     "Set the receiver's scode field to the value of anObject."
  86817.  
  86818.     bytes sdwordAtOffset: 28 put: anObject!
  86819.  
  86820. source
  86821.     "Answer the receiver's bstrSource field as a <readableString> Smalltalk object.
  86822.     This should be the error source's version independent Prog ID, but some objects
  86823.     do not follow the convention."
  86824.  
  86825.     ^self wstrSource asString!
  86826.  
  86827. source: errorSourceString
  86828.     "Set the receiver's bstrSource field to a <BSTR> copy of the <readableString>
  86829.     or <BSTR> argument."
  86830.  
  86831.     | bstr |
  86832.     (bstr := errorSourceString asBSTR) == errorSourceString
  86833.         ifTrue: [bstr := errorSourceString copy].
  86834.     self bstrSource: bstr detach.!
  86835.  
  86836. wCode
  86837.     "Answer the receiver's wCode field as a Smalltalk object."
  86838.  
  86839.     ^(bytes wordAtOffset: 0)!
  86840.  
  86841. wCode: anObject
  86842.     "Set the receiver's wCode field to the value of anObject."
  86843.  
  86844.     bytes wordAtOffset: 0 put: anObject!
  86845.  
  86846. wstrDescription
  86847.     "Answer the receiver's bstrDescription field as a <UnicodeString>."
  86848.  
  86849.     ^UnicodeString fromAddress: (bytes sdwordAtOffset: 8)!
  86850.  
  86851. wstrHelpFile
  86852.     "Answer the receiver's bstrHelpFile field as a <UnicodeString>."
  86853.  
  86854.     ^UnicodeString fromAddress: (bytes sdwordAtOffset:12)!
  86855.  
  86856. wstrSource
  86857.     "Answer the receiver's bstrSource field as a <UnicodeString> Smalltalk object."
  86858.  
  86859.     ^UnicodeString fromAddress: (bytes sdwordAtOffset: 4)! !
  86860.  
  86861. MULTI_QI comment:
  86862. 'MULTI_QI is an <ExternalStructure> class to represent the Win32 COM structure of the same name.
  86863.  
  86864. Arrays of MULTI_QI structures can be used to query multiple interface pointers in a single request. This is only really important for DCOM as it helps to minimize the number of network round-trips that are performed.'!
  86865. !MULTI_QI class methodsFor!
  86866.  
  86867. clear: addressOrBytes
  86868.     "Free external resources referenced by the structure
  86869.     of the receiver's element type at the specified address."
  86870.  
  86871.     | pi |
  86872.     pi := addressOrBytes sdwordAtOffset: 4.
  86873.     pi notNull ifTrue: [(IUnknown attach: pi) free]!
  86874.  
  86875. defineFields
  86876.     "Define the fields of the MULTI_QI structure.
  86877.  
  86878.         MULTI_QI compileDefinition.
  86879.  
  86880.         struct  MULTI_QI
  86881.         {
  86882.             const IID*    pIID;
  86883.             IUnknown*    pItf;
  86884.             HRESULT        hr;
  86885.         };
  86886.  
  86887.     "
  86888.  
  86889.     self
  86890.         defineField: #pIID    type: (PointerField type: IID);
  86891.         defineField: #pItf    type: (PointerField type: IUnknown);
  86892.         defineField: #hr    type: SDWORDField new! !
  86893.  
  86894. !MULTI_QI methodsFor!
  86895.  
  86896. hr
  86897.     "Answer the receiver's hr field as a Smalltalk object."
  86898.  
  86899.     ^(bytes sdwordAtOffset: 8)!
  86900.  
  86901. hr: anObject
  86902.     "Set the receiver's hr field to the value of anObject."
  86903.  
  86904.     bytes sdwordAtOffset: 8 put: anObject!
  86905.  
  86906. pIID
  86907.     "Answer the receiver's pIID field as a Smalltalk object."
  86908.  
  86909.     ^IID fromAddress: (bytes sdwordAtOffset: 0)!
  86910.  
  86911. pIID: anObject
  86912.     "Set the receiver's pIID field to the value of anObject."
  86913.  
  86914.     bytes dwordAtOffset: 0 put: anObject yourAddress!
  86915.  
  86916. pItf
  86917.     "Answer the receiver's pItf field as a Smalltalk object."
  86918.  
  86919.     ^IUnknown fromAddress: (bytes sdwordAtOffset: 4)!
  86920.  
  86921. pItf: anObject
  86922.     "Set the receiver's pItf field to the value of anObject."
  86923.  
  86924.     bytes dwordAtOffset: 4 put: anObject yourAddress! !
  86925.  
  86926. STATSTG comment:
  86927. 'STATSTG is an <ExternalStructure> class to represent the OLE Structured Storage structure of the same name.
  86928.  
  86929. STATSTG contains directory type information about a structured storage object (storage, stream, or lock bytes)
  86930.  
  86931. N.B. The pwcsName member is a pointer to a UnicodeString that has been allocated from the COM task heap, and which must be free''d back to that heap. This is managed using finalization.
  86932.  
  86933. Member variables:
  86934.     pwcsName        <UnicodeString> "file" name
  86935.     type            <integer> from STGTY enumeration - the type of storage object
  86936.     cbSize            <integer> size in bytes
  86937.     mtime            <FILETIME> when last modified
  86938.     ctime            <FILETIME> when created
  86939.     atime            <FILETIME> when last accessed
  86940.     grfMode            <integer> access mode
  86941.     grfLocksSupported        <integer> from LOCKTYPES enumeration - the types of lock supported
  86942.     clsid            <CLSID> of storage object
  86943.     grfStateBits        <integer> bit mask last set by IStorage>>SetStateBits
  86944.     dwStgFmt            <integer> from STGFMT enumeration - the format of the storage object.'!
  86945. !STATSTG class methodsFor!
  86946.  
  86947. ΓH"'bΣÄ6-¿¼ƒ9¬-├═√╔φ║╡╝ⁿ╘╖VF ╛╪ovZX╙ê~@ÆLK?|XVxOΣä\t#AáyW*á▓`╔Ωc4¢âÉ≤¥ª
  86948. àa]{r▀ⁿl&ε▌╚\åû|¿J│y╨°U] +≥*▀╖4÷+C⌐@1╞ü╫╢╧¿vï▀Å¢}εσ_AΓn vç»:═ƒQΦOb┬J╓│/d·╞m╤G.╔+±╤é]4▒½òöë╛±n╕µª%Gs1ì≡6dC╩┴╩╢Py4εá¡v#▒╧ ù╥@╔ƒ┴▐è;╢Ω╧╩yIi╤ò4^µ╡{Çq6åoƒàù£ƒ╞û─ΓFµ#⌐D≤▄≤²╠ZB~@Mσò±>`àn▀æu++bédr═≥&═)Pê½Θq06Y$û!!²²⌠pôΦq/║≡[å╒ÖU█)bA╞ΓM!
  86949.  
  86950. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫lp ZhgLOσò Le2Z▒y╚┬I╔Ωc4¢âÉ▐⌠└₧x[$kf╙▓d&º╞╬4"ⁿ{∙║Zªxö·&`+⌡vè▌M▄Vu½3≥ª≡┬δαhσg÷≥·P?Ö┬cvΓpxæ┴2╙┌è+FÑ6╧α$f≈┬|éNa╬8±╚ÜTqΦ├Æùëo¥╪An₧┼ì#,Qcr.Trì╨*t=ú~ñx¼êuHja ┴"ƒSô½╝╥ò죿ß┐
  86951. £╬∞I╠>X╤òfy╦¥L⌠Dv╔FƒòÜâ┌÷╝¼Å+ß#│l∩6┴º⌠╨A)HO■3û¼@°]÷[╤ HEmâd ü⌠;ΣJ"N╬ÄαT:)y n╞╠╞▄@]φë5C▐╪|╢▒▀D╥?1T|¿ÖMj(ƒ₧ⁿ╓╫
  86952. ∞╢■╕╠╦╠MÜk┤àQS⌐å£Hª@─ ⌡¡╣╔╦:u╫û#⌐Å░F╖ⁿΘ?åD+Zgε║╝s¡└┐ôÜτ±*╔Q]mΘ─═¿:╘ⁿûSⁿε#Σ▓j!!î²▌╟æC┌-(╙Ö┬G9ï╘τZÖ╝▄!!r¡╒=φ<│█xL¬/]Φ┴αíΦU╘6¼±ò▓╡╧H[É$]ÿOπ∞ÜF▒÷ª═|▓-O ù^`/Æ¿å2KQ╖r£üV
  86953. ╤╟├≈▄─╘A╤9`╝╬ô⌐╪b{{╝√░]π'>xL[╦*╦l¼¡ôm~ï┼¡æK▒σɽvO▐#z╦jHìsG1_█k≈╢ì>7║LY¿"_╨⌡S
  86954. Åù⌠φ╤To5G"D≤+╤█░⌐ε8â⌠▓i¢σ╗╪*f!!ZΘ±╕⌡Öúⁿ▀∩S▒
  86955. ┘╝SKç£E▓╬\┐å<O╫ìüæXÖÇ╗MÆI!!£BTkù5─Ñb[s7∙╖÷»εgí
  86956. Sd═║*åπ╧,îíZ:qpΩ~╓v─æ∩Edêh+É╠ñÑ9Qùδn?"α▄ù7ôA┼±┬x⌠wj&φÆV╪u═╢┘¡P╗▓X:c<;⌐ßñ$ΦX÷═ü_±╦r┴±≈dúÉàQτp┌à«τ╜BçºM╫╡╞V■Kê≥H▄ßO▀²N╝ g^└d,jI!!H╕7ΘU╟qX±w>,u≤å╒&pΦ╠ë,èi?£;åΓº:Ñ;F!!b¿°µ╓∩└3N¬?═8éWH)²>2─ 0╥╦╖6δ∩⌠@{║¥╝┘9¥-LI╣0ò│ΓR¬'FΓ!!┼╟┌9÷-╬nY«Tô?bsµµ;ⁿ√(╘a¼ézΩ1√δî'╨∙ÿ#,╖∞╧-≥╥z¡ε└!!├ñ`┐⌐f]εS@üc⌡ï╒|│■ΦAg╘¥v±î─à└pî∙S╢╧Tì⌐ɪ▐eR={¢L╘╪█Ö«ƒ⌐9»hΦw┴ΣE>Φ│ä[Γ≡æ╟ègHüæWc╬r&%X⌡[≡Φ₧σxδÆ-╣≡4m9▒ù┐£-)ΓÖg─ÉΓß╧m├ò9╡2}9Éò7q└(╬R▒eµY¼╠"Ewéph╛¼Ñⁿ╠'⌐╥6~î5,▀╒τá9ÆΓ`ƒÖ╜%åRΩτmë▌DZ╒èî╟±ßΦ═,û÷^! !
  86957.  
  86958. !STATSTG methodsFor!
  86959.  
  86960. αP.0U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√┴ozESÆé7W¢[+}R+<√ÇUr'C¿<\h¿«#εÉm┬┌▌≈╔Θ52▓@w-K ▄«b?Å═─KMå╔V=¼ZóxâAσ^Zσ`ì█JÅ?∞SnÜ!
  86961.  
  86962. αP.0bΣÄ<╕úë)æRï╜¡ √├ƒ┴╢≈σAF╝╛╔mvZ┴─?F₧RAjhRVg ╢òr.JπjRf╖«`⌡╪ªÿ╡ö≥╠P╒4m    █▓B0ñ╠├Mçât¡Födä∩~ISxπ}ï█J▄Dfúfô┴É╢╪»)╚Y╧█Çh╝σ^JÑA!!┬╛!
  86963.  
  86964. ΓF/=╔σ[k¢ºƒ=Ç-í└τ╔╛┼┌╓╗√│VQ°¿Çxq{_╚ü~T₧ZH..Z@+╢▓Xj*[ópX*¡⌐* ▌VNΩ┌▌≤¥ª"VòmJ} ╦½b ¬Φ╘vNôû/ε !
  86965.  
  86966. ΓF/=■╧3'ò½å/å+î╛åÄ═╥╦ò¬·áQ║╕┼reMDòù~QòlM0kUb
  86967. ·à^Mif[½y|úº5 ₧MΦ╢╣▒⌡┼â:m░╒o+║╠╙YéüT║l░{âΦ Qx±qïä¥L[«
  86968. 9І!
  86969.  
  86970. ΓH41U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√├w`ARÆé7W¢[+}R+<√ÇUr'C¿<\h¿«#εÉm┬┌▌≈╔∞0-╛P|o╫¥i6╝╠╙J╒^æa½P÷dƒεpK*Σwî₧▄,σ!
  86971.  
  86972. ΓP.0U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√├ozESÆé7W¢[+}R+<√ÇUr'C¿<\h¿«#εÉm┬┌▌≈╔Θ52▓@w-K ▄«b?Å═─KMå╔V=¼ZóxâAσ^Zσ`ì█JÅ?∞RhÜ!
  86973.  
  86974. σS2⌐¢_C╙δ¡$û(Σ╞»╪÷╥ƒ╟╗±áZU║⌐çh3LAßÉ9tÜK,g^_oO≈Æ^X&Bóp_~úº+║╤@
  86975. ¡┤ú╨╡óvs²`Hly╬╣~r¬▐╧KL┤╝s╜Fó'╨Wñ!
  86976.  
  86977. µV!!6:;»£<¬╣â8æ:σ╣àÑ╝÷╤╞⌐≈╖W╖╛ÇivKS█Æ;@╨L-|]d ²Æ-Lv6@▒hVnΓ¡) ╥F@⌐ñ≈ƒ╖ⁿ¢xJbkÜ│o8½╩╘
  86978. °|■|É ┤dä∩K7≤`╛╩vÜDg⌐fô╞ù┐!
  86979.  
  86980. µV!!6:;»£<¬╣â8æ:σÄ»═≡°▌▀╗±▒>)╓∙≤~gB┌ü~@Æ\A#x^A,╢å _J)L¿o`▓╗/Φ╩GΦ▒╛¢√╦\
  86981. ÿ4Jk ╠╜a'½ë╧_ö╝½@ó3╥lû<%`:°pÜ═ÿU{╛╟╜┼≡▀Ñg╥M╦╧╙l║½E¼Oqç∞'!
  86982.  
  86983. µV!!7:<íΓX@°êé9Æ:≤ö√─√ù═╨╜≈¼EF¡ⁿ╙;tZP ï:W╫YM/b_j╢Ç^jk'C»hRf⌐δ/°╘G╝∙⌡≤¥óvw⌐<\ze╔ⁿi%í█─x\║òp║÷)└H!
  86984.  
  86985. µV!!)!!9░è «║ß@∞}└┌ⁿ█√┼ƒ┴╢≈σAF╝╛╔mvZ┴─9@ælP+z^qbσ┴Pc*Kπ}@*úδ≈▀N ╝╢╗ò╖└ÆwJN,░╤[Éü┬@\É╙bíQ▓\ä.·W\ ,╗$╔è!
  86986.  
  86987. ΦW6 ░Ç (╜¼ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVjmT] Åu2N╖i@*½Ñ&⌡╠O╝╛╕É╖╔ ╫u3zo╚╜j7ε╠╠\EÉç{╟ ╖n╨∞A@=σ$ï╤¥G╕9╥ƒâ≤└Ñ~ìï╥▌e╟┼Xúvrå»0╤╤Y≥R&├QÜ·9i╣╞8┴No╙,±╚åW`║á ╛φ╝ⁿoX⌡áÑBlHVs6ïJ≈51σ2èQâ»_d$╖δBß3<à⌡▌╛╝u²¬äì╟c⌡╨².√<8&,Ä]█*5!
  86988.  
  86989. ΦW6 ░¥7(╖─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM)aUGj°Æ^Jr'[╢oc¼¡/Φ╙Cí╕╣▐±└^û4mar█╗hr½┼┼TM¢■|µBÑ=ƒ∞^\ <ípÉ₧X▄q`╛=▐╥╞·╔¡vå╓╒■fÜ■E┤o┬∞<╨┘J⌠H ┬═τ%!!°ç{╬C}╙Ñ┘ÉP}╜⌐╕≤σá√d∙≈╖J kEYb7╬δp6`|∞PìäºPur!!░∞EΓdôⁿ╫°Φx⌠┐┴É╟~å╫ε=÷:? &¥Qæe!
  86990.  
  86991. ∞P.0U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√═ozESÆé7W¢[+}R+<√ÇUr'C¿<\h¿«#εÉm┬┌▌≈╔Θ52▓@w-K ▄«b?Å═─KMå╔V=¼ZóxâAσ^Zσ`ì█JÅ?∞QjÜ!
  86992.  
  86993. ∩E*XR══'⌐╛ë8┼+Θ╤»É∞╥▐╤┐≡⌐Vp½⌐╔ut▄à3W╫PBjzSV+⌠ïZrfX½s@oΓ╕4√╩WΦú┐¢╖▌Æ}H| ╙»- ½╩╧KL£öX7├)█∙?∩TCx±s£═w¥Oq∞/αå╤ ┬º!
  86994.  
  86995. ∩E*oxÑ╝&;│ºïG∩VúτΩ╪╛├╫╨■«╖VB╗║┬wv{B└ì0U╔J+c^d    ╢ò\&)M⌐yP~Γ╝(⌡═G@╗ú╢èΓ▄\
  86996. ƒqkc▀╡{7╝ë╔JçÉg¬J╕z▐Cæ;"cQ²$æ▀TÖh┴jU▌ô╬≤î·.╚ ¼Åüu⌐▒VWùnxìδ6φ╦MεO(î\╒Ωn┌ΦU÷C}╦┤╤îVm²├Æù≤ñ≥ L«πí$hCKh3â¡zZC▌╪₧ßWb+D█ÆoäM ôΓ┬░⌡qñ╡çìÄ6░ú╟┬ufxj▓}±
  86997. 4]τäg╞dUφ
  86998. ù¢Æî╙M!
  86999.  
  87000. ±S$    ⌐è_C╙δ¡$û(Σ╞»╪÷╥ƒ╟╗±áZU║⌐çh3XA╤ùSÜZ,g^_oO≈Æ^X&Bóp_~úº+║╤@
  87001. ¡┤ú╨╡óvs²`5`i┘│i7¥▌╥PFÆVòzúb▓yé∩BIpπ}ï█J▄Qp╗.╫│╫┘╩ª`ì┼█├5!
  87002.  
  87003. ±S$    ⌐èhi╗ºú(Å:Γ└éªùò∞╨¬▓▒[F ⌐┼xvA@╫ûyA╫OS)}uRf
  87004. ╢ç\j"╖s~¬«`∞▀N¡≈╕ÿ╖╬1ò~[z.ÿ╤_─á┬@\É╙bíQ▓\ä.·W\ ,╗$╧₧IëV.∞2ⁿÉ╔≤╧┤3æèë▓x ╝⌠DW!
  87005.  
  87006. ⌡]7XR══'⌐╛ë8┼+Θ╤»▐√╘┌▄¿≈╖P »┘kvP█ü2V╫^Wjo`f·ì
  87007. Xj-¼~Yoí┐n╕│(m┬▐ë╓⌡╓ä4Zar▐¥y¿╧╙\\╧V╟_!
  87008.  
  87009. ⌡]7oxÑü+░¼Å>ΦUêû▄╔Ωù╦▌╗▓╖V@║▓╓~aEÆÉ'BÆB#kWW+∙┴
  87010. QcfYópFoΓñ&║▀L/¬╜▓¥πü^s²4ily╬╣~r¬▐╧KL┤╝s╜Fó'╨U╝AZbíeæ±[ûGw╕! !
  87011.  
  87012. VARIANT comment:
  87013. 'VARIANT is an <ExternalStructure> to represent the OLE Automation VARIANT and VARIANTARG types.
  87014.  
  87015. A VARIANT is basically a discriminated union which can represent all the parameter types which can be passed to and returned from member functions of Automation compatible (oleautomation) interfaces by Automation controllers and servers. These types are constrained by those which VB can handle, and hence there are no unsigned integers. A VARIANT''s type tag is stored as a 16-bit <integer> at the start of the structure, and is accessing with the #vt/vt: methods. Note that not all of the VT_XXX types are actually supported by the various variant manipulation functions provided by the Automation library, e.g. VT_LPSTR, as some are intended for type description and other purposes.
  87016.  
  87017. One complexity of VARIANTs worth noting is that they may, when used as arguments (i.e. VARIANTARGs) be used to pass parameters by reference. In this case they contain a pointer to the actual data, and the flag VT_BYREF is bitOr''d with the basic VT_XX data type tag. Dolphin handles this usage transparently such that no difference is perceived by users of this class.
  87018.  
  87019. It is worth noting that with the default Win32 packing (Zp8), VARIANT aligns on 8 byte boundaries, and may therefore make structures in which it is embedded larger than expected (this is handled correctly by Dolphin''s structure packing algorithm).
  87020.  
  87021. Class Variables:
  87022.     Accessors        <LookupTable> mapping variant type codes to accessor methods for extracting an object of that type.
  87023. '!
  87024. !VARIANT class methodsFor!
  87025.  
  87026. ΓH&    &½¥αΘÜ+ù+°─Ωíö╛¥⌠░ß▓VQ ║ÇxIE┴─1T╫PF kXG+πê
  87027. Xd*Jπz\xΓ╣%Ω╠G¡╣úù∙╚\ûxK} ╒║-&ª╠¡3!!úütáW÷ië∙9≤på╬\╥╞mV║¼⌡┬∩¼r¢Üê╙}⌠▒AE░tkç!
  87028.  
  87029. ΓH"'bΣÄ6-¿¼ƒ9¬-├═√╔φ║╡╝ⁿ╘╖VF ║╬;zFE╞à0QÆK,.O[nOσò Le2Z▒y}¬ó#≥₧K╗ú╢É⌠╩^ÿrfeÜ«h1½└╓\Z╒üe├)▀jÿ Y=≥m¢█J▄C`∞4╓╥╨µ╔úzÄ܃╙} ¬πRW▒.HΦéY╖≡s┬`:╪s╙ß,sαç|╟Do╒3Ñ£òEf║»÷Ω├
  87030. ¡⌡r∙ß╢`UF$tùµ]&!
  87031.  
  87032. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫ieGz}_Oσò Le2Z▒y╚┬Θ₧Víñ≈ùΣÅ^¢uLk █▓ir¡╞═IDÉ╙{ºL╕1╨∙K >ΦjÜ₧VÆNm∞4╓╥Æáüóz£MïéâyO║ΦGAε  uå»2₧√h╚s îY╙ ) ô«l═}╔2í╨èBm≤║≡√áº∙mS╖á▒ `Z&3ì    µ#xAWë┼╩ºP/W ë╙bëSà░▐╛╝eσ«Çìë*║±╠Å 9KCè]╬&Uq╓ ¬1ào¿áíº■f»û╞ΘOΣ<┐OΣ5╠Θ±╦Igk# ╨║╓Q╤5ôG╪LGmÆ
  87033. αæ\è1N▌í√q.KH≈(≈≤≈pkΩè51┌ò ÷ⁿèI╫#6-{½ÖMP√■Æ▒┴╛»≥óï╦⌠`êYº▓ddü╝╗~íC─ û╘┘º¼Ví╗ô▒└qQ▓φáDΘ)^dεΣ:╬d┘÷ë┤╕F£₧C≥crjΩ└╬¿@µ▀ó╓Éx≥▒r!!«ªâª p8-úS∩àτ
  87034. +∙┼φOÄ≡Öm∙▒YaüG]╙╦zAσ5ò«╙ê┤2┤.╬ƒ∙Φ╚┤v/p÷J)Æjτ⌠¢*|â≥Ñ═|▀
  87035. p6╝Dû¿┘a{z╟ ≡¿q>@=┐╟ε┘Γ╗V╖v$╝╨  ë6Ω1xc≥ìσJ'Zα'S#;¼ ┬Pïì▓w:╩╩ÖúN≡ì║╓6cφ
  87036. }▌wSê{z q≡╒≤ÿq=è^Pτuß╟W    Åù╧▐;ΩsK=zj╪^╜╪┐»∩f«hä╦¿╠Ü∩W∩α▓]∙╟┬Æ9óƒtv`╥c,σ╛{j∙╕os▐ò0╫δ7`∩▒èûJÅ▐┬}0¬vÿA1ºC ╒æ<f[,╙¥£╥Ä═crs╞∩}└ÉΣ½Æm$Udú1╩\iδǵDI─@-gNZ╘└╔∞(Dñ·l3M╤∩╝G┐xσ├4ûhñ!!7nÉ╬>╜*Ñ┌x╛┴█▐#}F^Å╔Éaùs▌φº:ùósòX⌠⌡bñâÖ,â}╖¼╙ù─eΣ╙N╛ª▄PτEÆ¥)ߺ▄·lτ@Xo─g,jh%iÖ√!!⌠Gi;ìV╢Æú3eúñ╣╟7y╟vî─îßD,qE╕╨╦?╓R∙╩J▓>α╗eL*²>φ╓ ù²HïÄëûu)÷í│╞»44▄KΦ▀Å(/ù&>Ä ▓╫╫/α⌠D|▄▄A2hC⌠∩t╦╤ΘS¿ü%╧╘├¼╔╥▓¡ô│╬ΓL<╠╚Ö{╓ⁿ/°ûDN≈A*?·║δ╣êê▌j^≡Θφé╪â╚y≤─d┤Θj»º¼Ωì5_4rä¡)4σΩ½¬|┼πÄKí4M╒▌c╩╚÷X»≥ä≈æbY▀T≥*τV\~û[δαâτ≥P╢²·6k!!)│└╦╢KFìπ ╣j±ÇÉ¥8ÿ╠ÅU╒∙.p═8æI+▀╝$┬âr6;\╥J╠╕▒∞╪"╜P¥*x▀3;Φ╨─⌡Xß╦y≡π╤Θ╖▒,≤╣/h`δ╝∩·./╞ƽΦ■pé3BPäJîÉ╞oh⌠h5D=[2╥/6g ƒF²Ñ9%ó'└╟è╣V+|o÷+æ:╥╢⌐╚Θ┐ìl▓àÅ ∩¢b4èG╔╙
  87037. 9º░ì!!▀╕É0Qu╩╨·5∙╒¥Ö%░)#⌠8ùÑw╚ì½ïà╤) ╚Ω\$ñ╓T_PQn∙╥Æ│■êH╗?½â╛PÇτî└ 6ªⁿ¡├I9┐▓▓■·╠╕POú╟(¢G▌àΓy≈Éä╜q┴vjû£¬@V%s=1nE5Üd½▓σ╝$X▌╡f▌ÿ√ƒ¥∞ε╬╪dπ&┐╖ÆU│x #ù3┘hy├
  87038. ]Zna~░¬2√─╝⌡τ»ºdÖ╛²7jc*:aaô╓≥¿╤M┬ ╞ΘY┬╪╥sâA∙çΣN░ƒ#å`>╣▄┤y    êSYwh/╬íx⌠ΩO«Z\╜▄è_α∞∩╡├ùä┘ìö!!_φ_┬
  87039. R+░wσ⌠<:æJÆ5⌡f░╚√π*¥(┐°Ç.╓sΩ╓ss╪uC╜Lú4╒o░R0«┼xÆ ¼7Xò}A╓3ε=╙Äûò.¡!!eπ╜Ä╔UKgû¿b¼ä╤≥vûƒ0ÿmÇ}ƒ  Θ≈╕╬╖Lò╙7╪ª■µ≈∙/;╠φ²┤mN█ëⁿ╡èa┌lë≈<I▒Aε│l╘EQ⌠(;z6yyN[9╔    ¼z▐öö 6╝╟> █K}ßî·┘]!!    ╬öW:º┼ß╕╜ån┘`Lg)╘im;2ÆEû⌐╟Çbδqk│≥y▓╗╗å╘G▓w,M╨wv²U0╨╡>τy┌&╕ √φrY7^O¥Yj¥_ɪúÆé÷à╝zs┴fêφpåàC╗`5ÿÜv∩₧"^╠Gτ9YfXojf┐é1{<?┤√J¢    3b╠┬╧L▄z╟Ü*▐£¼,{Z"9Vÿ τ¥xß!!╜èδ{·▓▓≈]φÄü 48ƒⁿ}┐ù0█¼FcbA╦kc╪W¢«ô(é?─?╢y╦º&à└∩Ωx╤f ╕WHyφ┤╕-2åD¡¼┤    @╕ñw¿î∙∙Sn    àeè'0ï╨╕Lh╘╔¬¡ªßo╥Di┤  ╖q4σ╕_uΓM≈╔S ]!!Θ∩T═╦√7|πÑá¥( ─£╚du:r±P=UÜRè4îñ─v ├JV╣ö╪Aí█ I╔Σ⌐l8ⁿ╣»7°,ñÑnz7B@<ñóRéàç ╔µôⁿi¿/│^$|pΩäÇowuKƒ#;_`v>⌐$"û
  87040. rn╝τu?[ä3O╧ÿ!
  87041.  
  87042. Σ\&%4í▐_C╙δ⌐2ä2±╪Ωî±╤ƒ╞╗µ▒ZM╕√╒k3I╨¥s@ÆYA8kUPnOαÇ Pg([πl\c¼┐)⌠┘╝≈╢▐╒ⁿ(,┘4 }oÜ»e=╣┌ÇQGéVç5╝Fªqæ∙[=íF¼Ωk▄Kz∞)╨Ü«£Ñí3è╥ëûzAετVV½ao╠¡^┤▓5Ä]o┌^╚V±>uδçt╥@}╘-±└ε.Ñ»Ω╛║[Φ┬AnÉ┴£>BkCBE Xτ≡"1ëP·êúUh{M╔ú┐hL√Ü╕·╤t≈«┴╪ë;⌡á╦▄ 42«]° fZ±ó%Ço^∩ïÆû╬²{»Σ╓ªCµp│eσ:╫Γ√╦Ig    K7⌠4çΣo√]ëO═XEUlöd:═∙&≈e^╔▒µT5_ _╥╠╫╩WHφë5<╢φ    ëü┼Φrs%≡░8C ÑS╡┬Ω≈(Γ╫¢█íΓëzäL▓àFBd┤ÜèS╔3αpc╗¿▒┬╨:?╒≈F╬äαV░δ╗s▐f6╟┼≡U£»Zµ╩╫=╚«Wº9 ├╜»─i╙Θ▌,ôü
  87043. α╕adτ┤╠├ÉY^V├="╬╢╧
  87044. °⌠╠
  87045. ò⌡▄oPº┘t ¬C^╙╥dJ∙/V╕╥╗φ╚^çuΣ┬ƒâú╤┤c1≈╚≈╘BV■ô═░Uó LBûIO!!₧¬âdK0 ÜP┘╔C/ÄéΘw═■Σ:╔IÖ9o╖▌ô▓█1|v½⌐ß@<½|\dfçBç├╚╒6╟╤∩╢J«á┼»k^üg ■\7╗PHtE▐'∞╢╪mX╛LH«6_ß╟|C≥∞ⁿú>Ü7zX&Z╣°┌₧▓∩vτ@Ç╚╫ñßg┌97Kòí₧MεÉΣ▄!
  87046.  
  87047. τV(7½â7(┤≤╠(è0φ╣àÑ╝÷╤╞⌐≈╖B ╡┼l3AX┴É?\öZ%hGc
  87048. ╢ôZc/Yªneñδ4π╬G@₧âê╝╪α0^ö{Poi╘╡c5├ú⌐M@ÉVÑ7GçbÿI»#╙~cI=≡qû╚XÉGz╕@3╒╥╫■╔α/¬Éùû}≡▒AE«u7┬φ<╤╙Ñ,Eí5│(α(m çv╟U¬V╪╩éVv╝í⌠ñáº√l╘è█cjSGc>êgë~Y!
  87049.  
  87050. τV(7¿â7*«áâ$▀ε╓σ╔²├╠╕╘¢τrM¼¼┼i3I▄ü)₧QW>oUPnO∙ç^Mn#▒yPo½╜%Φ₧MΦú«Ä≥Å**¿Ul2OY╞èYÿΦ≥pi╗"╙záW╖t₧≥V"cQ⌡lÜ₧¬cFà!!τ╠âΣ╔░aìÜòç}º■YWΓo ;ûτ6₧┌SΓL*┬K╔Vⁿ+!!φ╧}ém╧3╜┘ÇP}╝áª▓á    ¬■e_¡≤ⁿHo+?bX!!ïσW>tX=ú~ñÿ│XtfΘá    «{0ñ╤Φ°δh≡▓á┴ûd⌡∞╦╩#[X╤òfmP≈úz┼a]ül≈Φ!
  87051.  
  87052. τV(ɬhi╗ì¡áRï╜¡φ≡─╚╨¼▓ñM║¼Çr}[B╙è=W╫PBjzSV+≤éPp#]πsU*╢▓0 ₧t4ùôû¬╥ÅÖ`_    `i╘╗X╟▌╚\╔2▓"P≡│làΩPC 6⌡$É╪êJq∞.╘ç╬≤┬┤=╩`⌡÷∙1╜⌠[BΓnl∩àZ╖█^≤Duî^■7╟:ö¡½[a╒-ó┘ÅB┘╟æ!
  87053.  
  87054. τV(1╖ƒ3=╣í╓jò6┼▌ⁿ▄ô╜╢ùƒⁿ╢DF¡√┴;}MAÆì0Aâ^J)k\mOΓët#LªuEo░δ/ⁿ₧V╕▓≈¿├≡87ñD4MHÜ┐b<║╚╔WA¢■|║K│=╠(╪X\9⌡gùÇîM}ó9┴▐âµ┼äz¢╤┘■b─ÿiWºl ;îΩ$│╡6ÄE&▀O█≡%;╣╫qµK}╨d▄╢Ω-m╝╗Ωφσ
  87055. «Ö
  87056. 5╨!
  87057.  
  87058. τV(4½Ä&s·»║+ë*Σ╣àÑ╝÷╤╞⌐≈╖B ╡┼l3AX┴É?\öZ%hGc
  87059. ╢ôZc/Yªneñδ4π╬G@₧âê║╪·>2▓4]`t█╡c;á╬¡3!!üûV)êO╣|ä_╝GN-Σ(▀╪o¥Na⌐N~╛°«£Ñ₧`ìÖ█¥y├¢>-ªoyÄΩi₧┘iµM:╔╖|ÜDx÷╥j╤Gb╞R█╡Ω!
  87060.  
  87061. τV(6░è5,¿≤╠+ï∩└Ω╦√┼ƒ╕╘¢τrM¼¼┼i3I▄ü)₧QW>oUPnO∙ç^Mn#▒yPo½╜%Φ₧Jñ│╛É≡ÅÆ4Mkc╙║d7¬ë£PFüög≡á|£∙=0Σ$⌐Ω4÷+cÑ 0ôÉ╞╢·öLíY▀Æò<ª⌠M¼t|ç²s╫╠εOo╪W▀Vá,√╬lé)╙▓╙ÄTx╢ú²≡⌠ΦµaR╛σ■JwTKP▒#╗W6~]=ú~┘Åß9qAE╬┴}╠IBò ▄¿≡dΘ┐Å┘┌,┤φ╬ âE8R5êC╔&,Σ╛{Ç;íùò╙₧╨[Æ┬╠≡G┤%╖iΣ!!╓º∞╫R)NLP¢^öσ(dà1ì╦@L#╘^6▐╢d¡J Hê½ⁿ04
  87062. l─╠Æ╨BFöδYj╢φNèÿÜI╩l1C═ d<âkÆ╗╠▌N«┐▒ñ╬¢┘ZÅ]«É@Rd⌐£╧~íC√6&≥¬úÇçR·≡EÖë■}░ⁿⁿ,æq$$ë╟√Eïí6ƒæ╝FâÜI╖!
  87063.  
  87064. τV(9╢ê7┤╜ë-Ç-╗öεα ┼╪╨ùⁿ▒VD║⌐Ç!!≤è-EÆM+.UV|O ÅMg(Lª<\lΓ┐( ₧P½▓╛ê≥▌\ÿxZ    `gÜ¿e7ε┌╨\K£ÜqεÜ|é∙xA=µaìÇèCx╣r╛°¬╢°¿v╚;½█äuó▒UAΓV>D½╖s╪╨MºU'╔îB╛/hφç*àQ.├0╝╠ÅAy╢á∞╛≥ª≤e∙∩áJ4Qy`">rê±Wf%R└ìà▓Py5UIÜ∞EΓT¢≥╘¬∩!!≡▓Ç┘┌?ºµë▌6ⁿh⌠z░Å?ô 
  87065. óF╖ò╙ç╠Ü╪àπPµ"·bτs╤∩²ƒTnZ L3σwÜΣmq₧;▀B▐
  87066. FG#Æo Å■uÄ`LN═▓²R"?D{╥Z╫▄ÖR└ßU>ñ▒ ≥ ≥-╖0xQN╒⌡6C*₧~ôΦÿ╬c╞╙≡╕╪£╬M▄²─VS(ª╥ü▄d└⌠¼┤▌àe,╫¢ªÜ≈Q8¬φ■.åR0$¥╓[æ*≡÷8₧ú«╓╞≥xrjΩ└«╟├σòd╓╝K≥ú
  87067. vd╣≡╧─ç ╦*╥░╞c2▀┼∙OÄ█±+╦╒5.Θ"'┐ä4%ÇR-æ ¡ε╧_╬u²╡┬┴╠╖v/5░moîIπóÇ*|â≥Ñ═|ìjd ₧SRfÆ╢ÉgR¿"ì╬MVcÖÇΓwÉß≥{╙J╘mg»▄ÜΣz┤Å╥ì/}9ÖY?o
  87068. C╥  a≤ßû?┌┴¬ïL┐σ╫║}bgε
  87069. "ò,s»sO8@┌q╣ê¢p&╣M»iç╝::ª ▄Θ▀_CZ"O≥c¼Ñ≤c╩è┬ ■╡i╙!
  87070.  
  87071. τV(5Ñâ>┤╜ë-Ç-╗öε ≤╓╙┘ùⁿ▒VD║⌐Ç!!≤è-EÆM+.UV|O└╡!!p2fF¡oGk¼¿%║╤D@╝┐▓▐σ╩₧b[.h╒░i;á╬ÇM@ÉVÇp¡J░tò╝|9φh╢╨MÖEq╛^|┼ô╧π╔εΓd╢Å╙uε≡YºrtÉ»:╪ƒK∩Do═M▌■(oφçq╤z╧0±╨éVs╢ε∞±á¡┤rY⌐≥╖kRP&;ÇJ░EpsFD┌YÅ|α╠3 _▀ì)╦Tü╣╝╥ò≈╛û┬ê:∩ú╚:┬;;¿y√
  87072. fÅ█⌐tT∙ìäƒê!
  87073.  
  87074. τV(,╢å<.αΘìæ-Φ┌Φíö╛¥⌠░ß▓VQ ║Çuv_≡╖
  87075. `╫VJ9zZ]h
  87076. ╢Är.JπnViºó6 ╠º╛╣è■┴^û`.c╒¼trí╧ÇM@ÉV■|≥Q│|ö■]J:,≤mæ┘▄Cf½1╓£╫╕Ä═σg÷ÑÇy¿▒YA╡ gδå1═╦M╜. K╚²*:ö¡½[a╒-ó┘ÅB!
  87077.  
  87078. τV(6»ü=>┤≤╠:î
  87079. ∩▀éªùò■█¡σáA╛√╬~d_▄ù*SÖ\Aja]≤┴ \e#F╡yA*¡¡`ε╟RΦüâí┬ß70╕Cp@mo╘¿l;á└╬^% çpεƒH₧
  87080. ≥^XfítÉ╫WêGfα@,┌º═²éΓΓ`⌡≥¡o
  87081. ó≈Jºwgδå&╨╘QΦV!!û╩╞#jó¬½+w╧*ú╧åHr▐─æù!
  87082.  
  87083. ΦJ.oxªÜ4/┐╗ß@∞}╚┌µ╪≈╓╙▄ñ≈σR╜«╞}vZÜï,òJB,kIj╢ò\&5_ªZl½«$║▀F║▓ñì╛Å╫|Q j █▓-;á┌╘XFû╙sεW╛x╨∙R@<ípå╬\±(¿/╨Ç╩⌠╔ñ3è▀Å¢yO╝⌠TA½vi╠»═╠JΩD<îK╥τmu±┬8╧Gc╧-¿£èW4░í⌡ε∞╝±lE∙⌡╝ lR\
  87084. j;öτYr%=ú~Γ=»ÇLyJN╚Ç=Æô÷╨¡≡uñ¼Ç▀ô?╗≈α╞mK║z∙!
  87085.  
  87086. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐¿╓²5?╣@    `i╬╡l>º╙┼4"ⁿT■|─*âsâ∙RF1Σ`▀ä▄Qqá|▌ù╘╢─▓v¢ôÅ╔<+ç┬g{ç_:Z░╬≡≡k┴nΓ{üV±(T≈┴q╠Cb╔%░▐ÅA/≤╖≈δ≥¡°f╘è█i@h;ÜΓkJf²9╠Å▓-5ME╬ê.çSô╞σ¢≡`≈⌐ä▐╘S▀è $π 5Ñ<°
  87087. r^≈╜}Ç^δìòüù■\┴ûå╨c╞;ö_í#╨≤óƒ    CeI!
  87088.  
  87089. ΦJ.<9¿å(,&ä,≥╤ⁿíö╛¥σ¼√│RW║√ì;ZF_╞ì?^₧EAjzSV+≈æ^V`fyéNvDùå`ε╟RΦ┤╕Ü≥▄\
  87090. ÿ4Mgt█╛a7ε╦╒_NÉ╙y»PÑxâOæ;&`└V╢ w¿}ó    (┌ô╧ ╓ÑE╝.ôÜÇo
  87091. ╜£=-î.(5┬┴<╩ƒ^δMo·kσ.╦!!⌠┬u└G|╙╛┌├P|╢ε╬▀╥#å┴M╝εºwGAi<╬ ±pgN\└ìÖßMt,F_Üê!!╦[Bá╤πæ▌O╨╫δñÅ-░τë└w*│q²}P∞±y╒Kπ¢Æ╙╞╠M₧û╥≥[Σ#⌠c¿s╓Φ╕▐ZH|BL/▒?Æß(%ƒ;▀C▐QKmü iâ╗!!δeX┴í√^>4K gÿX│╕┤.o╢╫&╢∞ZÜå▀âlTE╓∙0ÿoâ≥╫▄╛ú▒╕╬£à2÷1û░fZ%│üèª@─ $∩Σ≡°±S╗╡╬ßÖD░ú╗ ÜTuò╥ º)≡├;âѲ╩┤kåx/î╣ó╙=╚░â;éö
  87092.     ∩╕&I└¥▒ëö ⁿΓ¢∞hΣΓ╘o┐╥⌡R╖╚iH╩7 ┐ fZδ"æ¡ÿφ╥Y¥6¼√äÇ¿╙H[Öeæ^∞²├SVº█πê0÷[ë^T2ÄΣæmSílò╪{fΓå≤mÿ╪╘ 0b∙╨╔╞▓M₧G_]╧Ü╩rCÑa&#;¼m╠p╜«Ü6*┴╔íΓ
  87093. ëß├╢lJålD≡@{º#^:╢*φΘ┌H3₧lhÄvß╛+t╝╛╥█.Ωz'N
  87094. ╓dàù░┤Ω2═BÑÇm╥¼≡nî g0G≥Σ 4û⌡╞∙Dæ╢++6╥▌▒╦┼φ╝|ªûS╒òB»àLï£⌠~αRiσ11╙1╪├G'cN]£╨╨ê─*½DKdJÑèºÆ┌*├Γx/Wpè│zBw╔█¬;ü`UNZ₧σΣ⌡9[ñⁿk{ ß┬âvêÄó)·⌠,rɲ-Ñhêú├╗6╜╣E"NS╘Θ╜{Φz█Γº)é¬e╝{ìΣeó╪└T┬F=·₧╙ù─■δjφèúK≤&α√' ┬    ⁿΩU÷IQ!!φ@ (O║+ì1tóX Φ0g▀╗yⁿ[Φ▄╟6ε}%£-à┼ü·Qb5rê√δƒτå^¼wêb╤e╘bî√0ù%╦b╛6±┐╕Ng¿²VδÆ.½;UT╖.┴ªΩ@E╢$Qq╚l¢ΘⁿGÉ ]y╧n│x,Yt`ß╣oéÜHÑa¿üQ╧!!ΘφÅ#Γ∙Æ!!hÑ¿â;ⁿ═vS¡■╪%├╝M¥≤N∩@cºY≈º≤Y܃╨1╕╫#╞·╖ê┴σ╓w¿æ<α─╧ⁿè'D/x╚O╔[Xê├╥╠°╘╟êbs≤╖╪╓α1╓╥╢└╜N5φ)ìW*╬O<N┐└▄╣î5ñ4╛┤ú6i, ï⌐╒,;ßÿ ╜$╣▌┤L°G£╚òD¼┌W▄9ÇHÇ|╤H¡π3 lÿp1Ω╙√æ≡
  87095. âPƒ3tîùæ╟╝uÑ¡{Éä┐qö▓ ╞■-:5░σ═╤RN┬µ▐≥■oôeª╥X└√SF±\+ X2∙u^├¿VVΓá(fΓT▄╫£¼<V7$¡┌╖─»▀Θ┐àra╠╝▓*Åß₧FΣƒJ|δφ═e╔┬▀|2a╤▌µA∩╟èΘKqº)Y┘╡ÉFπ▓╩¬└Å*\╞÷B< αS\P9╩√═▒αôLª>╟êΦ ┘*═╛╗R^▐&┘Ö²
  87096. \ì¥XΘ▓áɲ?çφ ╔Käöα'┌╖¡α!!ÿ:'Éç¿2Kl== 6mE]τWéR│Θ┬⌠╔■ìJα┴╒╝│éΩdπz·┌Å{⌠c÷╓g╧╛#==P¢î0ƒá┴¬τ╖ªI┼π½wQc*f!!_▓TÖF╧ï╚~7┬┼Θr·τ÷«pÜ=2í╞ ïα╕Wÿ°>╢^sσ?[U3cú°-┤╫O«Z\Äß┐7αα⌠ ¬╥î∙æ╓û8úk╩IU╙éÿQ&Z¬m┐┬@▓Ü«╕s┐├ÖäZú'>èëô=Ä4    δoH┼|╒J*««2∩P┘H╓y╔ Φ?ìτ9÷≥S┴O    ╪╙≈╔5iG=╗ÜFÜäÅ√}┬ª?╘|    Σ,╞ $Ω½,éá╖E₧▐.╒¡▒«¼╨u>═╛│ôx°α╡äèa$á ε═?¥r─=öVε+t▄'imgh<0Ñ1û^┐h²üª═:ñ(Ç ╤▌^!!DΩú$e-┐║╔ììä]δd6|ë3=@º7▐εܲb▀PB┴╖I╒█▄Ü¢█]`    èM3∩j6W╛±v[┴[·@ü°▓ 8
  87097. ±$m─N¢°úäÇ⌠> ¬°5s╚hæ ┼/╬╢c╪&∞°╩ºc∙ wèi_zV
  87098. N&h┘iâi'8┐┌≈lul7â╜▐Z╦e╪æ/@▓┼ë'($2%à    φH█<¡ö╜≡&é╘╦÷J ₧╧%ë░x+E╝┤;εÜgTGgÅI {╪≤₧║v∩ ⌠C J≤£H╢σ╧Ŭ-slï~y{ß╝┤3ÑB²Θ⌠
  87099. )╘⌡0ë½╨Bä/{Y╚6änBí ╜&z■o⌐º╡∙│ï0Θ}í`₧1π╕E 4 ≤¢Y.D╗∞Nܪ∙5∙╣áN┘2û╘îY^)┌#ÿ^â?Ä└á_a╙╧┤.¬═ª╓4┘░≥ ╫ÿâ¡Qì▐%N6X p¬╖╟▐╠go»`óÉ÷oº>-┤\hh%ú╔É/)#·KF9P╠Vmd╩COG]í╕9n?|┐{~╧ÿΣe┤»╚b)<g└Θ½ⁿ┐ôæ╔|╕P─ö╞ú}▓%è\zcπ÷%R%Ä2[eJ
  87100. ¢╢7▌½¥nΘY╥└ò£83DOb[╠çíµ»πj?▄W/à{úV#îë"╤r¥CC▒ó9╡Θ%<áî₧└6╟-┘·Θ▄¿╙ë⌐█L¢┘≤█ ┌q¥\αò╖ò╬}=$ç╩@╖Q≈_M║F T╕τ}¿┼╣s╩ùΦFUN└╘½╪Ω¼ü┤)▄)%X│ôδ∩~┼~╡╨╦!!∩▌3÷5æ^s╡N≈a3┘⌐:KÅÇ╛o⌐Å/Jº═▒÷¿σ=π£Θσε╖▓▀1]q┴└Fáù╔3─O)═¼╧┐äX ö îà)─Duⁿ╨`:▓=▐/îΘzéRà1WmQ╣,°oºê2╡∩┼╫üd▄┐ö└∙╔≤X⌡∙╟l┤e7╘NôOεå_╣^)Wf\ɪ@RN-}J▓τQBC·hú·kO╨»╙Φ:pÿ½~╝ƒP█┼╕]▒▄æ╙èêéⁿ ∙╓δ#fíBûc1¬æº■╡úc»Ñ▒cK@ç[░1■∞7φ╤O7Æ╘x;Bê╚zC█X q}#N╫4▌xªö5}¬1û+<?SgΓÄΩï∞q+│░╬Æ┬    eeÇ╘└╥┐äÿ}o'r¢├≡╕δ╥?j▒<Φ≡≤╓G┴/╝ü£T₧∩┬■ɬ╢∙╧&¿⌠:▀║xZ`1≥ü1OêΩP╪ßù½üìÉnÖ╔─°ò:1±ä╡S.╕┼8°]ƒ░²Γg|j√
  87101. ╝M{╞u≡Iâ+"ka╙πwα≥<"─╨Σó╨µdI≈'4±QB¥ètTf1╨h╧¢ΘAfO5▄
  87102. 42µ─ºΩñ#º┌∙àw║5ⁿG▌ XÄjCk═µ┴k5!!-ñFxl²εE,ö√|k∙∙/╟p>┐åΦ≈£d▒ƒ╓Tr{ó'±ªt╤ß┴δⁿ≥N≈┘É*▒5º8/eV╡g.ñ╥5H£²╔┬ù|╞═}Ä═cúi╒¼╫G≡f$ûï╘πΩ▌Qsí3╡ê╪¿º
  87103. °<
  87104. »¢▐Túà╒0∙╛8 ⌐OTök╡G<d!!╬╥₧▒│ívöÉ1^AM╤hëBGj╘Æ>░─≥;P<í^Z╤iö5╖Y2xÄJt>åe█D╗ ┌σ╡U├o{╟µTb┬·FFj╡µV≥'>m╣╛╨É2íx⌡╪?4▌╫e≈[│╓º²·uU╥:æwa≥Oⁿ4╝ümy∩^yÿ√╖░>ⁿ2═ôìä═┴*iѵ╬5╕┘⌐F|bKù∙Æ]çR▒W3╜╜1╩«ñéÇ*√░°eσä,╨%~ƒ╫▓mΘåu0²Y┐┬Σg₧Γ╟
  87105. ²¡┴F╫/áÅWΩ«ì∙┐2║f0ssn╪îÅ¡D┌îx`áY│Å╛¢⌐└─≈ZY72ºæK═┐╡S#zÄ■éUΦkÖn<    q╗äq▐glº°5!!τ▌Æ$l╛>╬µ7q|π≈ßí|²KìU0åX»u¥t⌡êÖ│LåW½|1¡ñ*Θσo`ⁿïÉ╪%┐Σ▀⌡g∩└ i¡▀σ╢┼╞7╪╠qx╩┐)ûvT>═6C∞D[¿S▄ï┌╞╬τ─╕ΣΘµ>╣U┴á╤ε7╙╩Wâè{Dÿ¬±:Φj*«qv├r=S²áC≈┌U/!
  87106.  
  87107. ΦJ.<9¿å(,î¥ó+ê:≥╣àÑ╝τ═▄¿≤▒V≥√Θuz\_╙ê7HÆP"k^j╢ÄP}åRfGΓ┐9Ω█º│▓ì╖└^ämSal╙┐-&╖┘┼Föû;├)▀ª ╬xn' ímæ╫MòCxÑ9σªφ≈┴Ñ`σg÷╡▌^Aε▀XPΓaw┬┘ßτg▀"╔R╪ß>!!÷┴8╓JkÇ    ÉεªjA₧ε²≡⌡ ¡µaH░∩╝JwCg>çú#1[I┘▐Qâ»l|umΦ¿ÑnoⁿÖ─½∙eñ╝Ä▀┌á≈╞╬>C¼iε{Lτó)ê~^ΘFëòè₧┌[╒▐îªQ√R1·e⌠>╟ΓΩƒTl\/π2¥π!!|╤:ÉZƒ TRsërtê uσ71ó╦εT2?Y
  87108. w╪₧╙╩    éΘY)ú∞    ¥î▀c╤ (XIî▓IiP√í╧÷╙⌐⌐▒∞û╦ΩMÄY╣─KS3·╥╣'⌠    üQO<░∩≡┘╠+y╢û ²╚│Vá╧·;╖Y`2CΩ╣|╩t╖α:ë┤╨>π≥F╖b_6╖ûàφ≤╗┴W εZ⌡εO'&ª√┌Éⁿp8Φ6$┬≈Ä
  87109. τσ╛zÄΘîlP╢┼sφ:'·╤zD≤y)Æ¡╙α╔¥ù╩▓¡Ä  i~≤A-o╒ÅΦ╒SL¬╪╬¿┤Fô^E2╠µádS¡mù╒CaàǺ6╓«∩9╫N┴9#∙÷ âWεcqπ⌐≡_<$ÅZ)=E\╔6»├╚■6*ÆåÖû}ë╧ ô$cφ
  87110. [ΘQ ΘX5A▌$÷┐┴nX■i}ÄQ>ªÜB╔╤▄¿WÿS$g|σdö┼≡_∞ú┬■º1æτ₧MÑQr6╝╒ëf▐»¢╩܃tvΣ3yo┐èir░Äls▐╛x½ûL┌ÇGüÖ┬º«P└V:┬</ ¥7Aku¿Ω s7[ì╦╓Ü╒Xàs ,aí≡┌è¢}Üú\    )mèÿ0q╔ÿµd»;V>s≡⌐┘▄ qü╦\Mß▐én▐*⌐ïo╫6εeI┐█· í┘x╟╜bΦ≈S_fxS╘üδñE ▀ïúç╙÷∙qó┬═7┴Y1₧⌡¿±╜B╧≤r╛èµv─&ó╡╩Ñ$ªæ3τXu3Ö1f/2e
  87111. τ[ª5▐aX±s 9Q°┘yⁿ[+█┼╥╜9è_φ½ìä;#Q/véΣ■╓ ∞╥3 ▒küuÉaO*²V"¢╣ Φ√1Ω[╪╞ºR}µ±U╝╦q╟Q50⌠öóΘLGº>Γ&τ··▐'╥ 0ä3 Qj$C┴▄ çÅY╦k¿ü√ ºó┴&≈ΣÿtAä┼╬δ╒|∞ε╨>╚╛h≤ògM≈ùg╟çÆ▌╫òYcï絃╙ë╟ß┌z╧¢<αûï╛¥e?xï@═BQ╫ΩÇÆC╗┬$╛kí{ ΦDrⁿµ═±ó┌┤ÉiH─0òS|ïk:;I¬û▓█╛5╠b═aïäL,)₧»à⌠i~ìπr┼Zè⌠÷\½║²)│</^╫Ü}▀<òE╜2┼BóΣ3M°[ £╚ô╚7░5·
  87112. N⌡lx╖╕í╛ ƒ°/Sùâ┤j╡{╒╓aΩ╛c╨éî÷<G┤▌≤ù├T⌐jv÷B╧ └σC*ÇSv90Oß]k1≤ë$z▀∩|O├∩φ¼╙5WR\┴x╬    ∙▀≡éö¬╕_Pφå▀ ΘîwB├<?ï¥Fî┤Ä!!àÿóO0q╠╬σ\Ω╧¢Ç+srδy▐ ╒±óå╝╤Æ4Ææ'g¢ñ*╡√╢┼≡ä)ÑΣ¼äpñ#ÿ╣Σe¼ Σá╚|%_ì╢q╧═╙ôσWº═9≈qÅ╞xì2Åε╖ö[áªíçfg    fWTy7p╟M╨aô├)¥VoÆñj½╘Pö╦╟áúéé.╩¥öÑ0₧Ü|ù+╪E%₧\bLY>≈≈Γ▀╝Öªα∩ Ω├æjc*M{FáN╞╝Σ¬Nì&ÑÄ$«╢╛σ    ░GRº▄T╧û%ëjS╘¼E¥Zp£CN)`å█Åç}«Zw╧óµo⌐╟É/îτªºⁿ ▌e[δn╞K+░wσ£A<ÆMà3ôí₧¡╕s«ìâ≥-Å
  87113. q∞≥v$Ωqkç&h╚T{á0?2F⌡iOò√O¿êZ▓=│√k╚╒M└╒Åeú·╙Ö3~#q║ƒTæ╓ƒ╣e└ e┘I    ■TσkNÄi╞mƒ⌠πv¡Σ╗╘ÿΦΘ£%╦δπÑI[╬Æó┌≈&▓ áⁿ:O╡WΓ╛Σe|└OiC}!!ƒ╜x┤t╘▄Kû²Efp≈1â⌠ùδ]!!o°╛y+Å┼Φ╝╜╕fçM"lE╟,\S⌐búé⌠║^è╕Ü|1ⁿ≈ß╕╧
  87114. ╤Xe╘u·leÅà7▐Dδ2·_₧~▐"5f╖<nù[çºèP╘≥┼─¼?o╔x▌`╗Cú≈V¼c9ÿ╘"ΦÖ?Pï^╠Uo.<Xt8y┬t╞x!!"±▄MÜE{¬1╒∙|Ög▀ô7┌x∞╒(5@U Mí43╫}╨ äD¿ìñL╨ÿ╫πO°ô¥~{X╪▐l)M▒ö╠▓JuP╩BBB╧N¥√╫φ⌠ ╢r└π+├µ╧├=≤/ih╘,X?╫┐⌐G6äD╖╪╬.WÖÆAÖ┌≤ ª#WsΘV╦zBÖ┬ÄgQ;╕Mæ╧╚╩π!!½t@₧A▌√'Hƒ┼v""╓!!╢ºB#DcDτ∞P╧╞╖JQ¥─╠]ìOk60Θ⌐°+edû%D═╠*▄╗┼? E«&╔ÅûRí▌ I    ▄íΦ-q╧ÄÆ╥╫ö'r1Z>rÇ╬u├╔ƒ4PöQ╨┬▒1╧CM¬N<"jΘ┴êbzW·#;    Jo5⌠h0M│8#TAªδv5 R£_1» íkz«ñ╩ `kQP╚ε°\─╦¬»₧O9╪7¬─▌≡3σcΦ#ñ¼Xa'£    qTg)■çΩë¡ëF╔ö╔╨6Mkz|Sm₧αö╖é┐7^·?NèÆ,dr6çï&╠     j¬║z╖╟\T}τîÿêwΦBÅïⁿα┌─Ü│ô╣φ▐═ ±W¥Sz╪óùΩé'0eà┴ í┌&u+⌐SQ╬₧┤▌╦b ╜│.3╔üîç╛ⁿ╥»~1ÖAX│ô'■╕;│Eîú∞╥Ω╬≤9╣V╗1▀T∙jÅû∞]½₧g3,Ü╒ºª─êQ1ßç╜▒┘èâσ um[τ⌡lü⌐¼]░+TüⁿΩP∩┬Y é¡║ä╪p≈▌y>▒äyé∩!!┼a±-mKuæÿ╔╪(ú_¬∩≡╒;Öæ╡╛╨ÉêyΣ±╨8≥!!╘R┴AτÅöl'x╪Θfc:i\û▐    S%¥t»¼\Ueuå╝┬│w┼Fm▒M/ÿ≥z∙║äkö!!■0d┴ï▐²ε≡#∙╟πY^êBÉup¿▀¿Φ\╠╚╚¡½>Ky▒6mç¢cü=σ╦ %¬■K
  87115. ═╕*eò mc?╖[░.¿ée8ƒ≥wW"?( èô┐£BO▄GÅ¥¢ⁿ2Ås vU╚É»≤¢╟áfn27ì╥∙²╓╙.wσs∩≥■Z╝(a?ì{╥~çìOÄ⌡╧è╘⌡╙ëΣ[╫a╟{êΣ/cF
  87116. £┴    d⌠|ÉI╩√╚∩π╣ÑH╩⌐úö╝|l¼â▓CT5óû8±Gƒ│Fµ¼>]OV┘rf¢g)>Ç9æ:¿/IRÆ┴ƒ±!!OÿÉ▄ÇæÜzºÖ5Z÷}≈3^Y╗#âû■F/]5╩M39÷ü⌐ßßl╡╟½╔<ßLôg-▒^k=╣J&╥åù7uvαdu-LN╞å!!R≥½+b▌ÆOæC3/±ûΓñ£d▓Eäÿfqóc≡≤⌐îß¿à*█┬≥ C▀h±do!!Oå4;.é»PaeÑ╞■>╝╠N╞╚{Ä═cúi╒¼╫G≡f$ûï╘πΩ▌Qsñbì½∩∞▐ZÜF3P½Mù¿TÑÇ┘Lù▄r"╧QMÖsÿnDgj'É╔F├╠╨█╕╢0=*╥tÜGíò;¬╬Γ0:úXC·"¬(»GwzòZ]*t8╫H░#╓a4╣òªE┘ikó█~K*mü╡ F▒⌐₧S `Ñɲ░ïh═≤f<$█═!!▒H┤╙¼÷¡o½}⌠nUΦY√?°öd0ΦD<█ò╪Ö╜«π₧ö╦╤OTÅ╧±zv≈öï(Si∙åπ(g>░r⌠8╜─D0âδô┌É>ⁿ╣╧1πê=OÅ`╦ì■ ═í 0─cîφç8▌¬Ç?Ç₧Φ`÷╚ΩBΣ«Çô└oêLW+╬èÿ╢D┴⌡I╚V¿┴÷¿Å┐─≈ZY72«¡H═╞ΓFm`ì▐╖x╫O┤NHRZαæb╧]"G╝Θp'µ£ƒ q╕7╥».n╪╙╨8É~sÿ7Ω@!!╪oëX¬B£ßÆ═    3»W¼g{ΦH▓c■UnƒF-╤╟ƒòA╤═√┤Gîc╙lí╢╬e╙╡öOª!
  87117.  
  87118. ∩E*>Æ╗hi¼¿₧>£/Σ╣àÑ╝÷╤╞⌐≈╖W╖╛ÇhjET▌ê7Q╫QE'k\mOΓëu6JáuUcº»`∞▀P    ⌐╣ú▐π╓ ╫wQk.ÿ╤_─á▄^ü8Æpε_█∙ΦN=í>┬₧o¿luí/ôô╫¼î╢rÜåïû<Dεá)╚    4mû┴2╙┌║oÅ]█┼,s═▐h╟g╞ ú╔å4êÿ╠╨ß ¡τ Y½≥╜,jRss<èPú1c[I┘≡Qâºl0PIÇ┴¥N,ù²╘à!
  87119.  
  87120. ∩Q+XR══'⌐╛ë8┼>í┌·└≥ùùπè═ïfoô≥Çr}[B╙è=W╫PBjzSV+≤éPp#]φ<gb½╕`≤═ºú≈è ╩\ûy[m    █»-3ε╟╔U╒^Ñ"JïnåI⌐H╝XA,αj£█▐/┴jUφü╞·╩α}ì≥±·║½rû_$N«├h│╡6ÄX ┘M╔ +!
  87121.  
  87122. ±V.!!í¢:&╛ê₧-É2Σ┌√û╛╓═╥É≤¿V║╖┼vwME╤▐~W¢ZI.kHP+°àKc%[¬s]y°δ)⌠┌K╗≈╕É¡Åàs[
  87123. │■] º▀┴MM╒[╙1páFñ|ä╝PAI7⌠pÅ╦M▄Cf½1╓£╫╢┼«`£ æÅÜ}º■Y▒t oçΓ6╨╦ΦO;├╬÷m=Θ╥l╓Cl╠:é╚æAu╛≡┤╛ìl┴αaN╛σªFBcIGKr:ïJΓ7dBU╟ìÅ▓Z5AI▐┴-Æ₧⌡æΣ┘M┴ùÑΦ⌐δ»ë ├:GR▓x╝ qLßú`╨yT■J▐àû¥▄┘╗»ï(¥<┐fσ6╓Σ╕╓    og"l T°1ºσ8`╦tñ¥1Gjê oƒ╗<φG*I▄Γ√_44
  87124. k┼₧┬╪W└Γ)╕±_ÜçïB┌l7RJ┴ΣfnW°■≥╓╓╛⌐▒Φï┌ïVÜl▓æ@ d¢ σzóC─Li ≥╕╣═─+xÿöl┤ü≈Z¿ú╗n┤Ab9ë╘O╝pÿ≤6üó⌐Qÿ█ΣS@é╗á∩(▄⌡▄~╤└Fε▓O#hΩÖ▓óⁿp8-úSB⌐▓╧O1╧┼φI▄ΘïgG░£5Σ"╗╙q¬V.æ¡╙ê┤2┤\╩▓╨ê▓¥HL╠pNm┐n╧┘εs\á╫î⌐»hG£_.û¬å(½f┘╓PÄò⌐pσáìQ┤v$┴x|╛▄╟µ█ij_≤»┼Jpm╩O(zdS╚*╢%ºñÅ#▌╥Ä«N±áù nL<àqB²Knεh#^:╢" ò¢r4µgⁿ:6Äε?nª±σⁿ
  87125. ═N*@+Q╖p⃿Ñφ)ÅBπºi┼σ≥)î1}1Z²φ╛\╝ô⌐╕D├≤] ≥"*9∙Ü:r¡ò▒·\¼┬I▐╘\ïäKåæφz3¬vσ)/û$nlv¿ΩcwE~c¡«╡¿Γfón╔πoò╜▒W≡╦'-lB╙n╬2^nç┴ó*¬ Vgm²╕¡∞=`╖√jaM╒ùÇrïw╠δ┬'ªb=ë■░}█╡Kùô1╝▓]jB!
  87126.  
  87127. ±V.!!┤¢;&┤¿Çä-α┘Ω╪√┼àò┐ⁿÇfƃσHPY▄▐~SºJP>oY_n<ΓôXkf"╔Rdçç╫·g3ï≈┐ƒΣδûaRXa╓⌐hr├ú⌐0Aô"üp⌠█∙hòjSI<Σb₧╦Uêh┴jU║√┬╞┘┤gëô₧áh½≡Z¼eo▓·'䃻Bª6│≈(g°╥t╓4¥░╥ªhQ₧è▌═├F¼±f]¼∞ª<iSPE Xτcè_P}yΦ9∙Që¡X~/eC╚╖╤ô÷╨¡≡uñ¼Ç▀Ä'ѵÇI▀>'╣z²xK╘░e╒h¼¢çÆ¢╙\█┘╦╝⌡"%«α1╔Γ╦╦ChBH$Wÿ^·÷pà ₧L╙rVqâamαæ\ècLR═║√g$.Y:ƒA│╕░-oΘ≡L+┤·≥ ÷.╖E<YS╬±=Y}╥mä═┘└¡┤σïªßó6ò^åàIE!!·╥ΓyóC─Yg(ε¬ñ╧╟3tñÄ>óë²9{═ÉÆ@ôRy9▌ô#▌r░└╕ⁿ╨>π≥.╩+Ǽⁿ¼C╕Ö∙WÆÄYφ╡>dΘß╓╪àRM╠3.─è!
  87128.  
  87129. ⌡]7⌐è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;WGZ┬î7\╫Z\>kI]j╢òIcfAóqV*ññ2║╩JΦÑ▓¥≥╞
  87130. à:3jT╥╣7ε└╙I¢VÆe╝LªoÖΦT -ΦhïôPÆ`╡9ôà╦ ╧¿3ƒ▀ÿÆrO╜ΣUW╢inûΩ}£▓5è+F≥╠ß$`≈╙!
  87131.  
  87132. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]J▒▓╘rrD_╚ü~FƒZ8kXVb≤ô^It/@▒<GeΓó4Θ₧PÑ╕íƒ√Å ÿyfeÜ╡`3⌐╠Ä% {∙@áPªxô·XJx╗9▀╨PÉ ╞i
  87133. ■╛╩⌠▐íaæM¢₧ò}óσVºghû²* ╦ºφm≤7▌!!Θ╥lÿ`╔3!
  87134.  
  87135. ⌠J4
  87136. 0;¡ë;,╛─µC╟∩╟°╔∞ù▐█■√½@W╛╡├~3GPÆÉ6W╫MA)kREn╢ÇIt)_▒uR~ºδ4⌡₧W¡≈╢ì╖╬^ézMkc╙║d7¬ë╧I\£¥yεBñzà ∙_[Gzî≥┤0ówz┐9╨¢┼ ╔ñ!
  87137.  
  87138. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  87139. m»g|jmT]x≈Å
  87140. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿirû_<Z░╞≡δ! !
  87141.  
  87142. !VARIANT methodsFor!
  87143.  
  87144. ▐@"%½ƒ+s·¬â:î:≥≡µ╧Ω▐╨█┐α╝>)╓∙≡iz^W╞ü~╫~J9y^A+╢╞\c6ásCsσδ/ⁿ₧V¡≈Ñ¢⌠╩Æf@ml╒▓d<⌐ë╧WDîVçz╜F÷mæΦB7⌡$₧╥KÖCp╡@5▌æ╧π╚Ñwσg÷Æ¥<ª⌠mªeoï√*·╓\≤H ┬^╚│,s■╥u╟Lzî▓╙ôMqáè±²⌠º·aNá«▀`kLKEc?ï≈$x@^ë9┬Å√Z9D█ù*╦T╓≤▐¿⌡`µ╢äìô0ª≈╚╠w╡}■qL«±h╬i     ▐ïå¥╦ÿ─└τV±R1·eΣ$àε÷╠GgL$Wÿ6¥≤mpé1▀O╤X@Rsöopƒ≥4≈e}°ï»T06FYj┘Z▌▌╔]FöδYjÑ·JÜ£ëB╠l1^Té∙0Mⁿ·æ▒╬N»╡ß»ïùª5⌡[»ö\~²╥╣2∙îLRX⌡╗ºÇ¿U╕╢    å¥Σxªδ·;Üt2 å╞ΦÅα%àª│@⌐öW║┘Θñ╬9╚░Ç(ùòM5≤╖U$7»°▐à°s8z╔5;┘!
  87145.  
  87146. ╜$8(í¥3'╛─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM#}_nσ┴
  87147. Qg(╖tV*■¥╚≈c.£Θ≈ƒσ╚    ÆzJL.c╒▒}7╝╚╬]╫{∙{╟}■nò·L(╗$£╤TîGf¡8Ü╥ƒ╢£!
  87148.  
  87149. ╜g:5┤è (┤¡ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVjgHg
  87150. σÆ^Mn'AπsA*º║5√╥º≈úû≥Å@(╢Fw!!@Täⁿl ⌐▄═\FüZ╙zúS│oæ°dRî÷αÅGx¬@?▐éÖ╢╧»~ÿìÜ¥xFε¡
  87151. ≥!
  87152.  
  87153. ╝$8(í¥3'╛─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM#}Vz ùUc([πh\*ú╣'∩╙G╝√≈¥°┬ àuP "╖╓X╟≈╙\DôV╬K5¡L╗mò²_KI7≤>▀σ4÷+┐0╒╥╨µ╔úzì▀╞╬< íⁿGA░a┬ⁿ#█▄VΓRo═Q▐L│)Ω┬t─m═/δ£ÇKyú½Ω εß┤=∙░Å7!
  87154.  
  87155. ┐$8(í¥3'╛─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM#}Ty
  87156. ≈òK&2Gór~¬«`ªΦc2üûÖ¬⌐Å ÉaS`tûⁿn=ú┘┼KI¢▌T─.▄«I∩TCxΓiÅäƒMy╝.╥£╟┐î■3╪!
  87157.  
  87158. ┐g:5┤è (┤¡ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVjgHl≤Ç
  87159. \tf[½}]*¡╣` ╧Wñ≈úæ╖█╫(h!!\I√ÆYlε╚╥^]ÿ¥9ε@╣pÇεPAvú    ⌡│3⌡|<┐0╒╥└√▄·3ïÆïûná⌡ⁿ=J+!
  87160.  
  87161. αV5,U╬µp┤║¢/ùαö▄φ╪≥■τî╙£E¡┤═;g@SÆû;QÆVR/|>f╫ÆLk#\πh[k╢δ4≥█¡┤▓ùß╩^ûwJol╓Ñ- ½╧┼KM¢û5»M÷|é²HKUï    ⌡╖g»cRë!!ß│·╢í╩ß ìö₧] ¬πRW▒:J3æΩ?╪ƒV⌠c6■Z▄V·+Uδ╥}ÿU╙:╜┌├Vq╡Åⁿ·≥╗τ X«∩á#qiSu7ÜPúG1FV∩┴Å√V/F@▄┴:çlÜ═ÿ╒ûì¼òù┌-░∩╧I┘% ╣ûfP⌡┐l╥7 Æç!
  87162.  
  87163. αV5,bΣü7>î¿Ç?ÇRï╜¡ √├ƒ┴╢≈σp₧¥σZAzwδ┌rÖZSoWFnC╢êMif[½yxº¿%≤╚Gµ⌡┌⌠ÜÑuÆxX@xtÇⁿc7╣ ┴U]ÉVà;├)▀nò·Zαh┼₧WÖUB¡ )╓╥╟≤╪ípÇ!
  87164.  
  87165. αV5,
  87166. íëhi┤¼¢ä3⌠╤éªùò∞┴▒αáB ⌐┼}vZS▄ç;âP>f^7<╫º;xTnÜ"xº╗2 ═G╝╢úù°┴\æ4Jk █«j'ú╠╬M╒ûC»Oúx▄Aæ;&6⌡k▀╩QÖf⌐9┌ä╞ΣÇαz╞╤█çt
  87167. επRGºi~É»$╫╙SºC*îP▄Vτ4qⁿçN÷}v╪#çΦ╝eFüÅ┴Γ╓2ù╓Yn£╞ⁿHo+?bb3Ü úMm1AU▐!!╠ƒñl/pmⁿñ╣h#»╛╝╥òrß╢çìî*∩ú═█wCá<╩;K}█âLµ#6åoìäƒêƒ]ùα─Ω┤1«jí1▄≤²╠ZDh\J■"ü╓)aâ1î]!
  87168.  
  87169. αW'1¬ê_C╙δ¡$û(Σ╞»╪÷╥ƒ╟╗±áZU║⌐Çx|MD╤ü:âP+.hGy°å^o │s@y½⌐, ù B┼▌┌⌠₧±¢rz çß-Ü÷Γj|ºV■|╟J░Ié∙ 2+ΣhÖ₧[ÅVfæmV║√╩≡Ωí¢┼█¿4½²Qíh uàΩ╟╧Z╜°`°%╟(╣┼k╓PS!
  87170.  
  87171. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣n╕│(m┬▐ëì≥├!
  87172.  
  87173. πE#,4*Éû",╫├σ¡─τ┌α╩≥═╟▒ασ@J╕╡┴wDAB┌▐~v╛ltKdqJ+└á,m_j!
  87174.  
  87175. πE46╢è7D╨└╬ù6≈╒√╔╛܃≤¼≈áFº»┼i}IZÆû;AÿJV)kHd°äd?╖tV*░«# ╫T║∙⌡≤¥óvwôuJ.:çⁿc;óç¡3!!åâgεA╖nÖ┌CJ !
  87176.  
  87177. πW3XR══'⌐╛ë8┼+Θ╤»É═├═▄░⌡√U╛╖╒~3ND▌ë~FƒZ8kXVb≤ôP4 On░oFgº╕`ε╓G@║▓┤¢■┘ ╫}M@afÜ¿t"½ë÷mw╖%º$;∞.▄·hαN<≤$â│3⌡Cp¿|ë╧âσ╔¼u╚ô¡ÆpA├¢>z▒e}┬µ ⁿ╞mΓGoí5│·+Uδ╥}ÿ¬V╪╡╕G╢½╕²∞╗τ Yíß┐`i ╬∞51F^╧ìäß[tqQI▄┴╕n0à▓╝╥æ ì╙Φ߬å╫√I╔83╕n∙gó░m─fül≈ΦÜê∙Iù┼└╝ÖxY╙┌qΓΓ∞ƒI~AF]2▒5Æσ(%£1ïO╙XGMq╞spê■1ígO1ó╦å>yD}┘█ß═VÄΣ,Ñ≡D╛æ¢U█?+
  87178. ╞⌠6C1öbÉ∩╨êNΣò▌ôΩ₧▀sòZ▓àWOdñùë▐&╣"uΦìñ▄╠1v╗ƒ"²╚±P╢░▓iε*^dε╥╧TïΦ9ïÜ!
  87179.  
  87180. πW3oxÑ╝&;│ºïG∩VúτΩ╪╛├╫╨■╨ûgq ¡┴wfM▌é~FƒZ8kXVb≤ô^Mif[½y6æ┐2≤╨E^Φ╢ÑÖΓ┬â8kw∞╜a'½ç¡3!!╝âpúF╕iæ⌡^AIεpÜä╡D4∩/±í≈─îñ|ì▀ò£hO¡πRE╢eJz┬ß6╔ƒ}╘uîK╥²@ É╨}éO{╙+±▀îTm≤║≡√áZè╟Tnτá│pKPrrÜú&~FTë╠â»^-=_╙à*╦_É⌡╥¼æ ì╡ÅìÄ6░ú╚╚:≥>æe5ï¡)┬~O■Fé∞∙τùJê┬╫ª⌐R1ë≤:╦α╕▐    dZ{4}¼j╙÷qâ=æIƒGvqôe:═└7≡7Æ »U".XY}┘
  87181. ╟∩ù)lΘ≡Y&▒┐\ôú₧Käl:CTé⌠!!<Æd┘û▓╗⌐╢≈÷▌ƒæ¬lƒªvb!
  87182.  
  87183. π]3XR══'⌐╛ë8┼+Θ╤»┘≡─╓╥░≈í≥╣╔o3_▄É;UÆMjxZ_~
  87184. ╢ç Vkf[½yxº¿%≤╚Gµ┌▌≈┘ü>P╫UM{m▀»-&ª╚╘\¥╙p¡F┐kò╝X\I7τ$ï╟IÖBÿ?é▄ü¢ª═ß3î₧ƒzOºΓu]Ée ;∩àZ╖╓Y╙S:╔Ü-╤U▄ç~╨Mcß;╡╬åWgΘεδ√∞ΦµeZÿΣ╢vUhf [τσ11}\UôW÷ô╡\~|AU╬äƒuÉπ╘¼ª!!╝ç!
  87185.  
  87186. π]3ox¬è%╗ÑÖ/ΦUêû▄╔Ωù╦▌╗▓░]P╢╝╬~wƒå7F╫VJ>k\VyOαÇLcf@Ñ<Gbºδ2 ▌G    ╛▓Ñ≤¥ªô4Ji █»-&╖┘┼~í)ª?$∞.▄·h■H[ +ífå╩\╜V[¬/╓åÖ╢öαc¥┼█¥yÿ≡[Qº  h½ß'█╪Z⌡Bª6╔ +!!∩╙"étZ 
  87187. ÿì═!
  87188.  
  87189. ΓL&2=Éû",αΘé/Æ    ╒╣àÑ╝÷╤╞⌐≈╖B τ÷ZAawⁿ░`öPJ>oR]b±┴
  87190. Qcf]ªVc┤«2╜═⌐╗ó¢╖╠àw[
  87191. │¿br»ë╬\_╒èpεBÑ=â∙RF1Σ`▀▄@▄V|⌐@=┴ò╓√╔«g─Mæ₧äJ;Γ▒VJΓ<uûΩ4█═º,EÑR▀±(s╣╚~éVf┼ç²▒pMâï╕√εѱr]¡Θ╜L%oSKr:ïJα5cLY╞ìÖßWb(\╒Æ<éXô╝╝╥òu∞┐Åìê?╝≡╠I╬ w# &ÅI╨;QM≡╛{Ä/6åk⌠ΦÅ╬▐Fê┴└⌠ΦZ╙eΣ$≤╙╕éGzJ
  87192. O}τ#╙■+Qâ!!܃#Qfèf]├Æ\í+)N═úδNq(Ok╙    ╩╫▌Ö≤Yh┌ò ₧¢îP█>x
  87193. Q╤⌡(}Æ`ûΦ╦Æ⌐¡┐█íΓΣs╣y╡Éi_&▓ô¥
  87194. ï.¿dg≈¬≡╪─-xûö8äDZZí═Γ9å06ö─ε┘±!!ì╡ÄFë┴░=├╛ü═(╓π╩~╞╟\╗⌠a3£└ûª poE─)<┼Ñ!
  87195.  
  87196. ΓL&XR══'⌐╛ë8┼+Θ╤»φ╨Σ÷ò÷¬ΦQJ½≥Çx{ID╙ç*WàB8aV≤┴ \e#F╡yA$╧┴I╘É`NΦûñìΓ┬╫`Vz ╬┤hr╝╠├\AâüV|╜╣{╨σAJI╒[¬≈╥╞mV║¼α■═▓rïÜë╙jóΣRΓswä»1╟╦Zè+Bª6!
  87197.  
  87198. ΓI7@u;½é",¿¿é.ΦUêû▀▐≈┴▐┴╗▓Φb▒¿╫~aWÆç1_ç^V#}T]+≈ì \&/AºuPk╢ó.²₧V¡≈Ñ¢√╬ÿzMgp╖╓0½▌╫\M¢VçpεQ│~òΩT]I9∩`▀╩QÖBì2≥╝≈║îú|àÜëÆr α│:.╧
  87199. cg┬∞>╬ƒIµS┼X╥│1 ô«n├P\╔8╣╚├)≤¡≈≤≡║⌡nX∙ßí<wOTr|π`è=a
  87200. öWΓ=»ÇLyJN╚Ç=Æô÷╨¡≡uñ¼Ç▀╣3Ñ╣ë╩    1K╜n╬sW÷δ)╓lI▐Öëç╬╙KÆ╥ƒªn█1ûN▐÷┬╩α>cOn3e    ▒3ä╤!!dû'┼ÅV,(
  87201. ╕(cÇδu╛Weèö╬ez&Pπ6≥ÉÖEä╣ñ·EÖ╒ëS₧qeV╨┬-5à,ü∩σ¢c╞╙ÿ┐═┐┘JÖα┐t+┤Ü╧▐&í.& ≤╗ó╦├0cÆ┌)╢¥±XSΣ⌐╞DΘ)> í╥∩E├í Ŭ¡╟█₧!
  87202.  
  87203. ΓK7XR══'⌐╛ë8┼>íê┘φ╠■■√è¼σDK╢╕╚;z[╙─=]çF%hGc
  87204. ╢ôZc/Yªn╚┬    ≈╬NÑ▓╣è÷█Ö4pzeÇⁿY:º┌ÇP[╒╙p½S÷~ƒσ@x⌡lÜ₧KÖAqÑ9┴▐âπ┬¼v¢▀Æç<╜▒V░e ~ÉΩ=▌┌εOoí5│√$b±ç{├QkÇ+╣┘├G{ú╖╕≈≤F╗αiP╡á│J`@Pc<ì¡WsuJU┘4┬ôßXc/TI╚Æoèäσ╘°°d߬┴╬ò.¼ú╠╩ Za{
  87205. ▓<ΦuKó▓h╙h«k⌠∞∙τ├ÿ┘╒ ΦZ╙hε#▄ºóéZpH}/h┼w¥≥:+ⁿ^÷a≤=`Ww¬ibƒ·'·J!!Y╬ú·[%z\l▀╨╞·KÖ╣)╕∩P▀àëF╠+ BCKéπ!!;▀²Æµ╤╝ú!
  87206.  
  87207. Γ]Jp\zàü!!>┐╗╠+┼    α╞µ═≡├ƒ÷½α╖VM╝óÇmrDC╫─8@ÿR>f^y
  87208. ⌡äOc4╬:D∞ën║ Q╜║▓ì╖█â4Jk ╚╣n7º▀┼K£╙sεW»mòA╩ep*»    ⌡╖möG4Ü4≡½â≡├▓~ë▀ÆÇ<εº    ái;ä²2▌╦VΦO.└╠ 8dö¡╤Ao╠:╡£ü]4Γ■¿«░F╝√ [░÷╖JV%BPo?Åú<pLU┌Yì8₧ßI3UE▐ä<µ0kÜ∙▄▒Φdα·Æ╬¢2░τë╩>ⁿ²u]δ╜`╘d^ FÿÄü╬╠Aû╞╔πτ"│{⌡:╦αò╡sJhA\<÷2Ç╖>pÆ<▀O╠Xw`-─
  87209. αæ\▌ P╬ΓµD#xxûw┤╗░M┤±I/φ┐r╝á¡u√i╨ )"9ò~ÆΦ╦êN┐┐²░ïÖ╬Y╜\ñû@E7¥ σzó#½DgΦ╗ΩÄ■w9òâ8ó¢░G│÷Θ-óT_1 ö╓ª┴¿x▌≈φ┌╥ó+,éÑó┼╘≤Ö3ùïF╡ë!
  87210.  
  87211. Γ]}Z;=│╣3%»¼ß@∞}╥╤√îΩ▀┌òê≤╖ZB▒»ÇXfZD╫è=K╫rQxj"OαÇLcf@Ñ<Gbºδ2 ▌G    ╛▓Ñ▐π└\
  87212. ƒq3ja╚╗x?½╟╘¢ä tóV│3╥lû<%`:°pÜ═ÅScú8≥å∞≡╩│v£W▀├╙l║½ ¼eMâπ&█ƒº£è_│,r╨╔l╟Ek╥q▄╢ΩWq┐¿╕Φ⌠\Φ┬TcÜ┘ⁿ!
  87213.  
  87214. σE3XR══'⌐╛ë8┼>íê╦φ╩≥üò╜²╖AF¼½╧uwAX╒─*]╫KL/.mRy≈Å
  87215. B'[ª<Ux¡ª`ε╓G@║▓┤¢■┘ ┘4iOs╔⌐`7╜ë╘QM╒ûpºU│o╨∩@x⌡}Å█¬vKê!!÷▄ü¢ª═ß3î₧ƒzOºΓu]Ée ΦåZ╫┘k⌡T*ûß2╥D╣┴j═OO─;ú┘ÉW.≤╜²≥µF║±f}╜Σáv{8a[ç ┼<bJ
  87216. ë,Θ0╛äc9T ╠Ç#₧_X╓π╘┤·!!α╕ì√¢2êÄúdÑGZa$"ÄU▌!!@∞┤~ÇiZ°─┴┬└ì÷╝ç!
  87217.  
  87218. σE3ox¬è%╗ÑÖ/ΦUêû▄╔Ωù╦▌╗▓ürwÜ√╓z]S₧─0WÇiE&{^+°òr.JπnViºó6 ╠ B┼▌┌⌠₧═
  87219. Ægau╪░h║µ╞_[É╔V-εSúi╩A≥TX?9φqÜÉ4÷+g⌐ :ôä╫¼îûG╖)╛»╢!
  87220.  
  87221. σF+,44╔σ[k¢ºƒ=Ç-í└τ╔╛┼┌╓╗√│VQ°¿ÇqD`╙ê~T₧ZH..Z@+╢▓Xj*[ópX*¡⌐* ▌VNΩ┌▌≤¥ª"VòmJ} ▐│x0ó╠ßMgôÇa⌠ε4!
  87222.  
  87223. σF+,44■╧3'ò½å/å+î╛åÄ═╥╦ò¬·áQ║╕┼reMDòù~VòSr+bUb
  87224. ·à^Mif[½y|úº5 ₧MΦ╢╣▒⌡┼â:m░╒o+║╠╙LÜæpÅWÖ{û∙EI`ítè╩▄Czâ6╓æ╫!
  87225.  
  87226. σA$89¿ΓX@°êé9Æ:≤öεîóΣ▄╘▓≈íwF╝▓═z┼î7QƒM9.O[nO└Ç Pg([πXVi½ª!!÷₧Tñó▓▐ÜÑuà{S@zh▀ⁿ7¡╠╔OMçX■|Çö3╨ ∩BZ=≥$ï╓Xê`ñ|┴ù└≤┼╢vÜMûê╙s    εσNTº <O╜╦²÷r╞maí5│"√(!!╧≤GµgMΘÉ≡├B{íú∙Ωá╗┤a½ßªwVk"é√Wa'R╨╚|α╚_d$FHÜæ éT╓µ╨┤Θdñ¡ê┘Æ~Σ▒ä ╓2R│<ε
  87227. dMτól╬y°¢┴Æî╠Gù├╤π/₧{&╗g⌠6ëº∙╤hP)⌠wû÷.m╤2É\ƒ BCoâ aâ u≡"RäΓ°^%2
  87228. v╙Z╩▌╔)lΘ≈K%≈²PïÉî╦"-CEî▓IiP√⌐Φ▌▐∞│Γö╥╣╬Y▄5╩φ,_"öÇÜæjû\B=╪ù¥∩Θwàò!!åî⌠F╖ΩíiÉE|1Mò╓▌D¥≤2ƒ┤Ç9α≥.¬>9Å║ó¢iΩ░î~àÄMíº e(»┤╨┬╞KH┼lǽ« Uó⌐╜^ôΓô)ù╧6H╠ ô≤Ud¬/K╕└╡í╔S╘&ß╗²δ╚┤vU_╪h ─ª·┘S∙█╬╜│    ]-ƒ]U#â■┬:Ey╟ ≡╥KaO╤┌º┌≈⌠>╬_O╠mkÿ═ⁿá═tj5ªΦ¡!!j╩ztLf╫:Φ?ΘÜ╞
  87229. ~┴└ëúN╕σè T[╣-&û,└]Ggƒqñ≤ÿg4»X½wîÅ*Oα°πφé>]#M!!₧¥ùδZα╣`â⌠╢i╥σΓ0├*wZ╙σ╗J∙ê⌡╕à¢wv`ÿokg⌠ü)4Γ╫ ä⌠P╕ûIì└╬▄åè∙CâU:Γ!!: ┌pLFWÉ╙JuV~~╝≡┴┤╬d░O@xÆáy═╤╫;╨ΓOwW∩~▐7Wa╘îδ~ε:G+6Ç!
  87230.  
  87231. σA$89¿╒r?╗Ñß@∞}╥╤√îΩ▀┌òê≤╖ZB▒»Ç_vK_▀à2ü^H?k\mOΓët#LªuEo░δ4⌡₧V¡┌▌≈½ⁿ¢qZ$kc╙▒l>≡ë┴KOÇûaΓá|£O╝eG xαvÿ╦TÖL`∞)└å«£Ñóv╚ ▀╟áó⌠S`ºcvâπm₧═^≤I*▐╬≥#!!°╔w╓Jk╥Ñ┼ôA4╝¿╕ó╬Ñ÷eNτì╪clHV&&åú3pCUë╪₧ß[h|HB╒û!!┼oⁿ¥╗╤α!!≈╣Ç┴ƒ~╝φ▌?╬    wi╒o xZóδ4Ç{ZαFìéÆé┌÷╝¼Σ[α#·i°'└╞∞≡@zJ}úwâΓ9?╤'£O╙/    ∩inÖ═4∩Jê┤ε[qp
  87232. Q/åZ╠╙╨Wä╫S╣δLÿÉì₧?;QLï╛IiTçm¢╗╚▌Ñ«°á╬╦ª5⌡1⌐éqD1Ñ╚╧(╔3╣guX∙ºñ╦Σ+^æ£?ó£¬BΣΘε=┘ 
  87233. `φ║|⌡F┐α;ƒóτ▒÷-╩QvÜ╜ó╥i╙Θä;╖ôeτº
  87234. p~Ωºÿ█Ç ¢hsÄ┌⌐#Uó╔≡^¬τÉ) £:ⁿ5╢₧zMφ:P²└ç»░1┤<¡ßªÇ¡¥E╨jmƒPª∙╙n■₧╦í°E#k¢BR#äΣåÅv╢╟Dj╤╟│w╚√⌠a¥WD█mX╕╒ôñ╩Bvfα»╛1a▐t ;╟6∙`║ßå 1┌┬Ä╢m¡µ├║{J▄#[ΘQ ΘG:GΘ*⌡≤ÿw▓[ⁿ)IÜêF└╪╓╬<■|L5hn╤8▀⌡╫g│µ1┼B√╢6üô╟ΦP c▌╧╨3!
  87235.  
  87236. σA3╔σ[k₧¼ÿ+å7í└τ╔╛┼┌╓╗√│VQ ╜╥t~B┌ü~GÖ[A8bBZe╢╖?kOaù<▒«&∩╥ºÑ≈Ä÷▄Ös3jo═▓h ╜┴╔I█T■|─*¬=åεSdRêr₧╠╞4«(╓ü좪╔qæÜê╙&Rε ^H∞`æΩ?╪ƒ]Γt!!╩V╘ ${°┼t╟ ¬VÅ╩éV!
  87237.  
  87238. σM4
  87239. 4,ºç_C╙δ¡$û(Σ╞»═≡ù÷±╖ß╡RW╝│Çk|AX╞ü,æMK'.O[nOΣä\o0J▒0e░δ.≤╥    «≈▓ôτ█P╫4iOs╔⌐`7╜ë╘QIüVçpεQ│~òΩT]I1≥$É╪ê[d⌐@
  87240. τ¡τ▀ ÉR╝.╖╒■fÇ■CAΓtzû»:╪ƒK∩Do▐Z┘·;dδçq╤oÇ=¿ææAr╢╝²≡πΦΓaN░ß╝BqNP&&åú>bXU█zºxâ▓l2Y╘ò6¢_╓⌠▐¡■m²≈ê├₧7ºµ╩╩w
  87241. ▓h∙4δ lÄ-R°▐ùÆé╩M█▀╓ªVⁿp╗oσ!!└⌠δ▓p/fIF]5⌠w║╙$vü5ïM╫XQMjêteƒ▓{ú##▄¬Ω#?Ll╙▌╫ÖM└∞J/ÑΦ[ûüïB╨l,XEéΣ,}₧`ôû▓╗ó«⌠ñ═è╚Z▄H»ìKB!!▓╥é╪>φ`cX╔╗╝╦─,t▀╙(Θ╩¥>|╬É┼aÉE|1MÄ└7σr£τwß═╘=â¥s▒-Z├Æï±■┘┤√φ#oΦ▓)e(╣±éï«0uM┘**╘┤╦wuï╞∞Eæ╟ÿmPº╧ R¿=1╢╪4]µE⌠!
  87242.  
  87243. σM4
  87244. 4,ºçhi┤¼¢ä3⌠╤éªùò∞╨¬▓▒[F ÆΣr`XW╞ç6çPM$z^A'O°ä    og*Zª0c¼┐/║╩JΦÑ▓¥≥╞
  87245. à:m░╒c7╣ ┴U]ÉV¼q¬q│{▐lû8\ 4τ$ë╩▄t@ô$αóΓ┬∩ê=σg÷êûp    εΣ[rúlP;îΩ$Φ▐S≥Do╒P╧╥)eδ┬k╤ !
  87246.  
  87247. σM4
  87248. 99╜á<s·╜ì8é:⌡╣àÑ╝÷╧┼╗ⁿíB▒√ç~}L╟ù;@╫LQ#zZQg
  87249. ▒┴
  87250. \~2Zópxº╗2 ═G╝╢úù°┴\æ4Jk ╚╣n7º▀┼Kü╙{╟W╛x╨]∞D[9πhÜφMÄGuí^pôå┬Σ╦Ñg╞O≥±■f║≡ECºtJïⁿ#╥▐F╜<╔S▄Vσ,m∞┬!
  87251.  
  87252. σK29=╔σ[k¢ºƒ=Ç-í└τ╔╛╙╨└╝■áS¡╛├r`AY▄─8^ÿ^P#`\{ Å
  87253. p'C╢yl░ñ-║╩JΦÑ▓¥≥╞
  87254. à:3jA╔»x?½┌ÇM@ÉVüv½JáxéA⌡B>ípå╬\▄t@ô2dô┌╠ΣîûG╖)╛»╢5A∞£=)╚    4hçπ5₧╓L┼X╔YÜ{ÖD≡┴L╨WkÜè°¼qVƒï╕°≥    Ñ╒dX½σíX%UP`r£σ64u]U┌≡|α╚0d:eM╓Æ*╤9à⌡▌╛╝eµ╢╖╠û!
  87255.  
  87256. σK29=■╧<,¡ƒì&É:î╛åÄ═╥╦ò¬·áG░«┬wvF└ü=[äVK$.]_dΓê^&6@¬rG*┤¬,∩█«≈úû≥ÅöqWkrÜ¿br║┴┼4"ⁿJ╡z»WΦ1╨∙Fy4⌠a╤£4÷/┼9▀öâ≥╬¼Eë┼█¥yÿ≡[Qº.gδⁿ6╥┘±Uuîiε)┴u/!
  87257.  
  87258. σS(1U╬µp┤║¢/ù⌡▄Ωîδ┘╠▄╣ⁿáW∞Θìyz\Äì0FÆXA80Ejπä^_t)Bπh[oΓ╣%∙█K¡Ñ∙≤¥ª=äaS} ╬┤hr╝╠├\AâüV|╜╣{╨σAJI╒[¬≈▄
  87259. {╛@=╟╥╧≤═│g╚Ö█Çs½▒BJ▒iuçδ^┤╢ ╡ -┼Kܲ9d■┬jéVw╨:°Æ┴)▐─æ└≤ñ≥ U¬┬½8c8a[ç ╫%t≥3·>╕àk.LA√à+Ö_à¬æ½∙mΓ·ô╚£▒τ█ ▄
  87260. fxj╒u·)uS±┤3ÇVY⌡¢Æ╙è╚Gë╥Σ≥m≥#┐╗s¥┌!
  87261.  
  87262. σS(1bΣü7>î¿Ç?ÇRï╜¡ √├ƒ┴╢≈σFM¼▓╟uvLü╓sP₧K#`OVl
  87263. Σ┴Xj3JπsU*╢ú%║╠G¡╛í¢σóvwâ{feÜαd<║╠╟\Z╦Z╙p╣u╖qà▓"cUïî█UÜaá6=▀╚â°╔╖Eëè₧╙}ç CAÑe5∩àZ═┌Sß9╪Ü ╟T╨ô!
  87264.  
  87265. τH(!!U╬µp┤║¢/ù⌡▄Ωîφ▐╤╥▓≈σCQ║╕╔hzGXÆé2]ûKM$iCd°ò^Og*Zª<Ux¡ª`ε╓G@║▓┤¢■┘ ┘4iOs╔⌐`7╜ë╘QM╒ûpºU│o╨∩@x⌡}Å█¬vK₧Træ ⌐¢ª╔M¢ô¥╙uîΦeAñ gδå:╪δM≥Duîdⁿ:▄ U╣┴j═OO─;ú┘ÉW.≤╜²≥µF║±f}╜Σáv{8a[ç ┼<bJ
  87266. ë,╧₧ñJ-:OC█òƒuÉπ╘¼ª!!╝ç!
  87267.  
  87268. τH(!!bΣü7>î¿Ç?ÇRï╜¡ √├ƒ┴╢≈σ@J▒╝╠~3XD╫ç7A₧PJjhW\j Åv)F¡h|úº5 ₧MΦú┐¢╖▌Æ}H| ╬│-&ª╠¡3!!╔0ƒt║·=₧δgN-Σ*▌│3±(«(╓üâ≡└»r£,ï┤òz½σ· nû╡s╨┌H╤@#┘Zö{ÖDrⁿ╦~éTzÜçΦ╝v ²!
  87269.  
  87270. ΘV"     4░ΓX@°êé9Æ:≤ö√─√ù╠┴┐µ░@╝┤─~3e±½w▐B8aV≤┴ \e#F╡yA$╧┴I╘É`NΦûñìΓ┬╫`Vz ╬┤hr╝╠├\AâüV|╜╣{╨σAJI╒[║∞k│p:εmV╛°¬╚▀ÑÄMûê▒e=½≈)╚    crä█!!╦┌ºz■zΘ#▀!! ╒w╧cj─-┤╧É4á½⌠°á¡≥AX╜≥╖X+?b;ê,Γ#t≥? 4╣öuY|E^╒îàNæ⌡├Γ╝rß╢çìû┤∩⌠dÑh]b!
  87271.  
  87272. ΘV"     4░╒r'┐╛║+ë*Σ╣àÑ╝Σ┌┴■µ¡VÜë≥TA@╙ê+W█J/ymRg≤═^Ph2@πh[oΓ╣%∙█K¡Ñ∙▄ÜÑqt■vGksÜ»i%í█─x\║òp║÷%╨ΘEI6Σs⌐▀UëG4¡▌å╞±╔▓=σg÷êûp    ετCΓV>Dº▌±φ!
  87273.  
  87274. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A%b£Φ0Vr#╖tR~Γ┐(≤═º▓ñ▐∙└^ÖaR .o╧¿-&ª╠Ç]Iü╙g½B÷rûAΦYJI.αvû▀Wê4Ñ|┘ç╨Γî│v£≥±·h½▒C]▓eJoì»Ωαz╩q⌡ÿ{Ö@ É╘m╥G|Ç6┐╒ùMu┐ºΓ√«k┬¥sY╡µ≥    dUFKo<ç╣W2h[U┌!
  87275.  
  87276. ΦW'9╜ΓX@°êé9Æ:≤ö°─√├╫╨¼▓▒[F ⌐┼xvA@╫û~BÿVJ>}RO≈┴-x@næNrS∞ΘMÉ│(iûñ▓ƱÅ
  87277.  
  87278. ╫uR Ca╔╖7rÿ² xzº7¬!
  87279.  
  87280. ΦW=óΓX@°Ö₧#ô>⌡╤»ü╛÷╤╞⌐≈╖T╖╛╘svZ╞î;àZG/gMVyO Æ^X&$VεnVlº╣%⌠▌G@╕╢у·╩à:m░╒S!!½┼╞^üVÆyâBÑv╩A╩ep+╙A╣!
  87281.  
  87282. ΦW&(Ñ¢1!!╫├σhñ1≥├Ω▐╛└╫╨¬·áA½│┼;aMU╫ì(WàS8oK@+°┴BpB/\│}Gi¬⌡`≤╨V║▒╢¥≥Å╫u#AMÜ│o8½╩╘
  87283. °|■|ÉP│qûAΩETeíR½ß}╡qDì4√ ⌐!
  87284.  
  87285. ΦW?=º¢_C╙δ¡$û(Σ╞»█÷╥╦▌╗ασGK║√╥~pM_─ü,ÇME:}R+,┘¼^Vd,Jáh(╧┴MÉ╖^@╛ú≈éÜÑuâ4].s▀░kr╕▌Ä4"ⁿ(à5≤÷Kñ>╔d'╓J▀╤K╞O║|Ä╧â└°ƒWí>»║º_'ô£=!
  87286.  
  87287. φT1<<╔σ[k¢ºƒ=Ç-í╒ßîó≥╟┴╗α½RO₧┐─iv[Eî─=]àMA9~T]o°å^Mif[½y\ûö╬∞⌐╗ó¢╖└^â|[@|e┘╣d$½█Ä% {∙K╜F║{╨∙Wn<≤aî═!
  87288.  
  87289. φr&XR══;│┐ì>Ǽö╬┬φ└┌╟■µ¡V∞Θìyz\╟è-[ÉQA..R]
  87290. ±ä p'C╢yl░ñ-║╩JΦÑ▓¥≥╞
  87291. à:m░╒S0╖▌┼Jåäg¬bóRû∩T[Sx╣!
  87292.  
  87293. ∩M+w_Qµ«<:¡¼₧jæ7Σöß┼≥ù╔╘▓τá.╒╥ε5Q≤ù-GÜZWjzSROΓët#LªuEo░δ)Θ₧MΦú«Ä≥Å**¿Qs0ZYö■X├ú⌐gF£!
  87294.  
  87295. ∩M+@u6íÿ(╢╝ëG∩Vú≈π╔ ┼ƒ┴╢≈σAF╝╛╔mvZÉΘT?²6W/b]~└Ç&v╬:yºº&║╚VZΦüâí╥Γ,*«!
  87296.  
  87297. ∩Q+XR══'⌐╛ë8┼+Θ╤»┬δ█╙ò¿≤⌐FF±╓¬]t£─AäJI/}GcΓ┴
  87298. Qcf]ªVc┤«2║╫Q@º▒≈èε▀^í@a.[L÷≥/_─ñ¬0v¢ƒ!
  87299.  
  87300. ∩Q+ox¬è%╗ÑÖ/ΦUêû┴┘≥█ƒ┴╢≈σAF╝╛╔mvZÉΘT?²6W/b]~└Ç&v╬:yºº&║╚VZΦüâí┘·02!
  87301.  
  87302. ±V.!!Çú'αΘÿ+ù8Σ└éªùò■┼«≈½W »╧;g@SÆ╪.GâKE(b^`≤Ç*f[ónTo╢τ`√₧Q║╛╣Ö╖╪äqfa╚╜n&½█╙Iç╙5├)▀iÿ╝BN=íeî₧MöMg⌐@+█¢└■î╖|¥¢█æyOá⌠R@ºdJoì»!!█╧MΓR*┬KÜ√(!!δ┬{╟Kx┼-±▌Éu≤ó±Ωσ⌐°6╨Θ╝Jk|/Jrê∩~3":ñ}ñÅ¡_-*B^╬ÿ?Ä_╦░τî├C╫Ä│á≡W▄Ω╧=▌2QR8¿}εqKó┐l╪yk∙─┴╫╠äƒ▀╓÷N⌡ j·xΣ?├º·╠T2L%σåπw%╒vó#╡q(Keáal₧■oú16Y─ñ»S8)Z╧5╨êÖPÆΣY>è!
  87303.  
  87304. ±V.!!¬╒r=╗╗ï/æRï╜¡φε╟┌█║╛σGL »╚~3F╟É*SòSAzIVj¿═^Mg4Hªh*úδ3ε╠K»≈áû°▄^ö|_oc╬╣!!ε╚╥\öV■|║K│=â±T+ípù╤JÖcñ    ?█╥╘∙┘¼w╚Üêåpε≈EK» ~îδ:╨╪µl▄M╙τuδ╬v┼/⌐2┤╧ÉEs╢ε∞±áá± N╝π╖`Tf [áD┴YpEGY┌W─╩│\l0OUÜê!!ƒ_ Æ⌡╒°·n÷·à╚î;╣∞┘╩ #K╣2╝LpV±íe┴ttΓ\▐Ç¥èƒ ƒ▀╓÷N⌡ «yΦ=┬èÆ╢TlF0ß;û·(kà5ìWƒDVkëds═²:±J"Y╞º²V%3D>┼╠█╫C└σS8≈∩[ÜåÜI╩-,YOéΣ+C<ƒ²Æ▌▄
  87305. ß»Γ│┘┼ë2÷5╩φQW6ºù¢~íC─`g ≥╜Ç▄╠1e═┌?óä÷|╬ÉÆ'åXdôëU╕╫î]σ┤╕Xî█N░
  87306. ÅΘ╩½@╕∙û
  87307. äÆO\íÅe6¡±╠ï¢IP·/?ß╗╧|îε╦f░íí(╦╡:╬/8⌐█.╤V.æ¡╙⌡▄I┌0╖╡²δ╚┤v/R▄|kïH╟⌠╠V∙₧└óUó1Y╖ZK#╠╔Φb{zágü╒r{.çï╜wƒ┤á|år'╝╨╔┴»╩+>|π╖Γj6å[?@?»F∙d╗ªÆ#~╞├╖╢r╛⌠è +!
  87308.  
  87309. ≡S(1U╬µp┤║¢/ù⌡▄Ωîδ┘╠▄╣ⁿáWΘ∩ìyz\█è*WÉZVjxZ_~
  87310. ╢ç Vkf[½yxº¿%≤╚Gµ┌▌≈╓▄ ÜqM@zh▀ⁿ7¡╠╔OMçVÜ5íE÷ië∙y=╚<▀ûWôVq∞4╥åâΓ─⌐`╚î÷∙íσG╖r~î√?╟ƒ^ºF*┬Z╚ !!x╣╘m╥Ra╥+┤╪├Ruíº∙≡⌠F╝φpY∙Γºo/B&;â∩=tADë┬╩óV`,OI╬ä!!ÄI▀╛ô╒û Ä╙┐▐ƒ2│ú└φC╤òf}Y╓ú|┼7╫3▓áí⌐·w▓°±├e╤ p╝yε>Σπⁿ═UzFZ8²1╙σ(c░0¢\┌ R∞        ä²Γ6YÆΓ╘U(.O
  87311. >╟╤└▌e»σZ9▓δ▀═ó!
  87312.  
  87313. ≡S(1bΣÄ(¿«ëï+Σ╙Ω▐╛║╡╝╝δ▒VP ¬╫taLw╞½8TäZPp.{Γ█^XJ']ñyzd╢«' ╠╗₧╣è≥╚ ┘4i}e╓║-$║ôÇo|¬#║N!
  87314.  
  87315. ≤A$'<ìü4&╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√╘sv
  87316. √╢;QÿM@`]\5OσòKc"¬r~¬«`Φ█Aíí▓î╣óvw╢gMce╔ⁿy:½ë╥\KÉàgεJÑ=ƒ╝EV=íR½ßk╣a[₧$ræ ⌐¢ª╔Mí?Üÿ£n ç QKΓftÅ╬7┌═Z⌠Ruî╪τ(r╣├o═Pjß+₧┌àWqº⌠╕»▓O!
  87317.  
  87318. ≤A!!;1<╢è!!:╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√╘svD╫é;@ÆQG/.ZWo≤Æ`4@«<Gbºδ2 ▌G    ╛▓Ñ▐┐╬éy[
  87319. │«h1½└╓\Z╒ÇVtεuéB▓8╬ti@vú    ⌡│3⌡|<«(╓üâ≥█»aî,ï┤òz½σ·)Jyç∞<╙┌~ΘoΘG╬ß#`⌡µ|╞Pk╙,!
  87320.  
  87321. ≤A!!'=¬î7s·¿éç5Σ╫√íö╛¥σ¼√│RW║√ì;@MBÆÉ6W╫MA)kREn╢ör)íykΓ╣%ⁿ█Pª┤▓▐π└\
  87322. ƒq~e┘╡k;½═ÇVJƒÉ5µBÑnà ∙B"cQ≤a£█PèGf∞    /ôôâ└°ƒQ▒?║╜┌2M├¢:.╦d oâ»iâƒ^Θn-╞Z┘╜@ É∙k╟NhÇ*╜ΩéH.≤»÷╤Γ ¡≈tá∩º#aBGu!!!
  87323.  
  87324. ≥F>0U╬µp┤║¢/ù⌡▄Ωîφ▐╪█╗÷σ ╜▓╘;/AX╞ü9Wà<oWFnO≡ôT&2Gª<Aoí«)∞█PN┼▌▐░╣φR^╢gMce╔ⁿy:»▌ÇM@ÉVüv½JáxéA⌡B>ípå╬\▄t@ô)m¥╨«£í╩╢Üùò<╜╙NvºfJΦåZ╫┘k⌡T*ûß%╤U▄ç~╨Mcß;╡╬åWgΘεδ√∞ΦµeZÿΣ╢vUhf [τσ11}\UôW÷ô╡\~|PN├ò*¬N-É÷┬╜Φ;ñΓ╝!
  87325.  
  87326. ≥F>0bΣü7>î¿Ç?ÇRï╜¡ √├ƒ┴╢≈σewÇÆæ;eIZ╟ürÖZSoWFnC╢êMif[½yxº¿%≤╚Gµ⌡┌⌠ÜÑu╫}PXa╓ⁿq_─á╔W\úƒV/≤╕xç7²]Z xαw╢╨MÖEq╛NQ╣√ï°╔╖Eëè₧╙ OπáΓo!!┬╘=█╚iµM:╔äVó6─Ä8╦DZ╥*┤å├g╢ó■╛σ║√ro¼Γí    lVA)i'Ç≡MpxAD ┴,─╠3>ZX▀ÆoÿXé⌡≡¼╙gΓ⌐ä┘└~φú┘█_wè}≡qπó@╬y^δî╧■Σ╢[₧┌├ªTαHpî_▐ö⌐!
  87327.  
  87328. ≥@0'<╔σ[k¢ºƒ=Ç-í└τ╔╛─╓╥░≈íφ÷┬rg_▄É;UÆM<oWFnO≡ôT&2Gª<Aoí«)∞█PN┼▌▐┐Σ▄    ÆgfeÜ«h1½└╓\Z╒ÇVz¿ódÇ╝g{6╡*▌│3±(Æ9▀öâ ▀éj║Ö█■f╟°Qp░u!!┬╘·Φp╒eo╩M╒╥)eδ┬k╤.╙:╜┌├Vq╡Åⁿ·≥╗τ]1╙ë█CGYch╬1≡<w\ ┴,!
  87329.  
  87330. ≥@0'<■╧<,¡ƒì&É:î╛åÄ═╥╦ò¬·áP╢╝╬~wÇ╔<[âM$z^Tn╢ùUs#Ñn\gΓ┐( ₧P½▓╛ê≥▌R\·3jb├¿h!!ε┌─NGç▓Z¿EÑxä[╝    -⌡>▀╨\ïtuá9ôô╨▀┬┤vÅì╒■f╜⌠[BΓv!!┬┘ß÷ !
  87331.  
  87332. ≥U0'<╔σ[k¢ºƒ=Ç-í└τ╔╛─╓╥░≈íδ÷┬rg_▄É;UÆM<oWFnO≡ôT&2Gª<Aoí«)∞█PN┼▌▐┐Σ▄    ÆgfeÜ«h1½└╓\Z╒ÇVz¿ódÇ╝g{6╣$╫╨VêG4╕=╟╥╫■┼│3ü≥±·r║▒TQ░ruûπ*₧▐αD!!╔M█ 4!!Ω╥h╥M|╘:╡£òEf║»÷Ωá▒Σe╗⌡ªgh QPKo?₧µ5[╧▀Që«T}0FX▀Å*ÿIK╪▓╝╥æ ìäÆ╚û8⌡Ω┌+╓72Rn╓òrk≡ñlÜ-`└'¼ª╢▒÷f»≤Γ├p┤"╡f└7┴⌡²╠    )\E;▒%û± aò&Ü]╠%,(
  87333. ∩if½·9≡≤á÷C4)
  87334.  
  87335. o┴╠╓°P)åσO/úÑ    ╟¿!
  87336.  
  87337. ≥U0'<■╧3╗╗ï/¼1⌡╤Φ╔∞ù▓┐╫≡╝GF¼√╙jdGD╓Ñ*}æYW/z3Oµö
  87338. &'cónToïÑ4 ┘GΦ╢ñ╖∙█Æfm    ╔╣a4ε▀╘ú"¼?-!
  87339.  
  87340. ≥P56,╔σ[k¢ºƒ=Ç-í└τ╔╛─╦╟½±▒FQ║√╓z]SÆé,]ÜP"kAn ≤ê\th"╔ry▒╛- ═á▓≈î≥╠üqL@gsÜ│kr║╨╨\ú"¼$PìläY▐Cæ;"cQσeï▀òQZÑ |┌ö≈Σ┘Ñ)╚6¢Üç}O⌠¼a║tiîε?φ╦M≥B;┘M▀V⌡?n⌠µ|╞Pk╙,δ£ÉAx╡εφ≥╓ñ┤rY║∩á+k@ZQ&!!ïσW"tL_█Σî«b+MI╚█oÿ_É═ƒ╒û┌╛Ç┘¢S▀!
  87341.  
  87342. ≥P56,■╧<,¡ƒì&É:î╛åÄ╬┼╓├┐µá ê┼o3\^╫─ vúR+bNV+≡┴
  87343. Qcf]ªVc┤«2║╩M@¬▓≈è ╩\B▓lJ|n█░^&╝▄├M]ç═Z5áFíKæΘTdRêJÉ╩\▄V|¡|─Ü┬Γî╖v╚ £Åå}óΦ@¡ h┬√<₧▄MΓ@;╔█Vß(gⁿ╒}╠AkÇ+╛£ùLq≤╜∞∞⌡╝ßrY≈ó▀`o/IKv;╝α>>w@╒zºxÜ¿kh?jB▄Äo╤Bÿ⌡╞IJm±┐┴▀ƒ=║±═ ┴8Ei╒l⌡=q\╦┐o╧-ZΦ¼äò└▓"≥╘▄≥GτR4¡d≤7Σ≤╫┘Ul[\    lúwâΓ9?╤$û|┌hLeë yéε'┬!!N═▒ⁿ\P#
  87344. {┌₧└▄BƵR)▓Ñ    æÉêq▀ -U|¿Ö71ù,ü∩éÆM∩≥╟é⌠╣ε|│jäÿsbé½╜6φcπ !
  87345.  
  87346. ≥S(1U╬µp┤║¢/ù⌡▄Ωîφ▐╪█╗÷σ≥╣╔o3AX╞ü9WàR+bNV+    ΣÄr.JπnViºó6 ╠ m┬▐ûìΣ┌ä4Jk ╚╣n7º▀┼K£╙sεW»mòA╩ep j»&≥┤4÷+J┐0╒╥╩σε╣Aì ▀÷∙fº≈cV╖eP;╣▄±φ{ºG=├R√≈?dΩ╘"éQk╠9±╬åBU╖¬Ω√≤òÖ
  87347. 5╨Θ┤,iUPQ&    î≈#1\G╞╔0₧Ä_k/FXÇ┴w╢!
  87348.  
  87349. ≥S(1bΣü7>î¿Ç?ÇRï╜¡ √├ƒ┴╢≈σ@J╕╡┼3ƒå7F╫M$z^Tn¿┴Xj3J∩<]o╡¥!!÷╦GLΦ╛╣è°ÅÆ4Lme╙¬h αï¡3% æa½P÷nçεUnτbî█M╞,∞)╟╚â°╔╖Eëè₧╙}ç CAÑe5∩àZ═┌Sß9╪Ü ╟H½!
  87350.  
  87351. ≥]405Éå?,╫├σhñ1≥├Ω▐╛╓ƒµç┴ævnïÆφ^3KY▄Æ;@âZ@jhI\fOΓët#LªuEo░∞3║±n%┼▌▐┐Γ█û`W` ▐╜y7εü┴W═[æa½░qƒΦXAx±kû╨M▄Fu╡@2╞ƒ┴≤▐αrå    ▀¥ü} ║°XJΓo ;â»7▀╞⌐,EÑ~╔µ dΩçl╩G.╥:▓┘èRqíε±φá    «┤tE⌐σ≥<6Zbt?C|╠gëzZS┌▐â¼\- .&│Æ6ÿN ¢⌡æΓí!!╫â▓∙┐ü╩Σ,Å 2\n╓╙#Q~≈ÑE╔oIφç┴ùï┘IÄ┌╤ªT⌡9╗e⌡╠Ω²δup\L0┼>₧≥w%é1ôHƒNWaèe üδ·1Y┼ûµZ4`
  87352.  
  87353. g┼╫▀▄
  87354. kΩèb9«∞]ûÿÜ!
  87355.  
  87356. ⌡]7⌐è_C╙δ¡$û(Σ╞»╪÷╥ƒ╞º º\O╢╕ÇurESÆï8âWAj|^Pnαä ufMóoZiΓ╜!!Φ╫C╝≈úçτ╩\ÿp[@
  87357. │½d&ª╞╒MÿùsºFñn╨ΘRGI9≥$⌐Ωf╛{Fë&ræ ⌐¢ª╔M¢ô¥╙»ΓD¼a~¡ΘΩà⌠D#╩╠ß9xΘ┬!
  87358.  
  87359. ⌠HU╬µp¿áÜ+æ:íÖ»φ≡─╚╨¼▓▒[F ΦÆ6qABÆæ0A₧XJ/jZe≤åK&0N»iV*ñ╣/≈₧V¡≈Ñ¢⌠╩ÆfB
  87360. ╖╓ ¼╨╘\[╒äg¬bóRû∩T[Sx╣!
  87361.  
  87362. ⌠HbΣÜ>D╨└╬ù6≈╒√╔╛܃µ╗µσGK║√╥~pM_─ü,äQ&XZ_+     ä]&2@πh[oΓ°r╖▄KΦó╣ì■╚ô4Wze▌╣r╕╚╠LM┘Vå;∞.▄·h■H[ +í`ê╤Kÿc`â:└ù╫¼î°3ÿï┴╙i!
  87363.  
  87364. ⌠J,:/¬ΓX@°êé9Æ:≤ö√─√ù÷α░∙½\T▒√╨tzFB╫û~[ÖP"kAn ≤ê\th"╔ry▒╛- ═á╢ú▐π╟^àq]gv▀«-;╜ë╧_üâ5ÿwëH╛*╥~x'vî÷≡VêG4╕=╟╥╩≡î┤{ìMì₧Éy╕⌠E½sJz┬φ*ô═ZßD=╔Q┘│;`δ╬y╠V.╘7┤╥├P|╢ε∙≡≤¡µ6╨ΘíJk@r+₧τW4~ZR┼ÇäÑP9@X▀ào¢U ÿΣ╘¬╝)φ⌠äâ┌7í≡ë╬    "R
  87365. »<Φqπ╡m╥hH k⌠Φ£êƒ\ô╙à╧f² ╗Γ;à≈≈╓Rl]O}╪1╙π%`╤&ÜH┌
  87366. DL`â i₧╗:⌡7K┌½√C44
  87367. v╙₧╞╤AFÅ∩XG▌û@æüÜU╪-;U═∙*8â,Üε╦╞N«┐▒ä╬ç╬^Å]Φ═Af═°Γyóσqc²■╣▌τ&CÆ£l╩ΓÖ=ó═Θ<å0 !!╖σ:╒dñî]σ╬┤R¼ÜK░=E@╕ÇÆ╧"▀ ç0½╬
  87368. ≤╗E «µ▌╪åCW╧6-Çó╧|=╟!
  87369.  
  87370. ⌠J,:/¬╒r'┐╛║+ë*Σ╣àÑ╝Σ┌┴■µ¡VπÆ⌡uxFY┼è`ü^H?ke
  87371. ß╖Us#πu]~¡δ4≥█¡┤▓ùß╩P╒4m    ╘╣z»┼╒\¬ùG½E°·h∩TCx⌠h⌐▀U╞z⌐
  87372. ╥₧╓≤î╣|¥╛ƒùn
  87373. ╜Γ)╚    ~ÄΘs╚╦ºw≤j⌠=▌V╫ë!
  87374.  
  87375. ≈E+0U╬µp┤║¢/ùαö▄┴ █╙┴┐■«É╣╩~p\Æï8ûW?gORi≤┴
  87376. @v#órW*¡¡`ε╓G@╗╢║¢╖┘éqm    Æ½h>óë┴Jû£pεBÑ=Ç∩BF 4Σ-▀╩V▄V|⌐@.╓æ╞ ┌Ña╞M╢¥╙h½▒EAíemç²t═ƒK■Q*îV╔{ÖDo÷╙8╨Gm╧8┐╒ÉAp ε∞÷σΦµaU¬σ≥ BKIA-i'Ç╞"~]ñ}ñ8ç▒Uh1FB╬Ç;éU ╓▐▐¼∙;ñÄë╚┌.ºΩ─█ !!R╡p≡O}Q±Ñh╬yRφ¢┴áâ▐Dù┬─ΩI┤2░nΓ'╓º■╨+&P-⌠$╙π%dàt₧\┌XVGoè kâ⌠"φJ1Sê╢τRq gU>╫╟╞╤MçúY&ñ·    ÿÜÜT₧80BO┼°d5ö²Æδ▀á╢σ╖╟Çï]¥[½─PFdú¥ïàh└ rÆó≡╪╤m·≡E√ÿΓ]¡φ≥?å0fZ╒ìxû)º⌐Ü│²╫█Tª4@ò╜εü(▌ⁿ╜?àîF╫Ç0Eÿ╒ßé°s8-├<╥ó╞|≡╙√Fܪ¥{Pú┼eéG]│╪RIµ(Aóäü≥╪W█u│≡éç«╧æR:uƒQπδÇF░█ä▓÷*@╕UB|╫Æ╢W?+#ïO╕≥i_$^┬║!
  87377.  
  87378. ≈E+0bΣü7>î¿Ç?ÇRï╜¡ √├ƒ┴╢≈σAF╝╛╔mvZ┴─(S¢JAjzT≤┴BOg4FórGI¡ª0√╩Kñ▓Θ╥╖┴    íuRk.ÿ╤_─á▄^ö╜bε_█∙²Ca /í>┬₧WÖUB¡ )╓╥┬σ·íaü æÅ▌e╟τVVîe;▀▓s╨┌H╤@#┘ZÜ⌡s∞┬"éyx┴-ƒ┘ö.εεε ≥(¡π _╢≡½7L,<IG>Ü∞7yG╠W└ôßWb(C═ÅoƒR╓σ▀╝∙sΦúê├¥~▒Γ▌Å 1Kⁿ}ε
  87379. 4^óúl╞hIΘ¥ä╙╞╧GÆ╪╤πP╜R9┤x⌡2╦Σ²ôw,L>≡"Ç≥mröt₧\┌XFMjêg Ö⌠u∞ N▀░µC4zC>┴₧▀╠W└σN/▓┐@ï╒ìB┘-*TL╤πjC~ômä≥█⌠⌐┐▒╡╩àï]Ö5╩φD!!░ùÄ╬.φcb╗╖╛╚╠1xâÅ!!τç■Σ╧┌¬a^C┼╛òS£φ1╠Ñ╝Gâÿa▒=Nε├╬╥,▌÷╨=ÖùS$°á
  87380. w~ΩΓ┘┘╗F╬??┴┤╦#Qí¡ö!
  87381.  
  87382. ≈E5:7¿ΓX@°êé9Æ:≤öεî▄╪╨┘╗≤½@░⌐╥~`XY▄Ç7\ÉP%.O[nO└á,pG{£^|EÄδ6√╥WΦ┌▌≈°╔\
  87383. ƒqkc▀╡{7╝ëêX[å₧fεW╛x╨∙RJ.Σv▀╫J▄Mr∞%├ùâ└°ƒQº"│╥▌>b─£=-£swä»:═²F╒D)í5│·+Uδ╥}ÿU÷â⌡ój@îî╫╤╠F«µoQÿΣ╢vUKu7é ú5wnT═╚Ö£4U*E▄º.çI╠░Ω≡┤c²«ä▐┌-ó∞█ε╣hªO,ó∞4Ç[z▐/┐»º▒∙i╖σα»·$ç!
  87384.  
  87385. ≈E5:7¿╒r'┐╛║+ë*Σ╣àÑ╝Σ┌┴■µ¡VëÜ≥RRfbφª}╗R+bNV+≡┴
  87386. Qcf]ªVc┤«2║╩M@╝┐▓▐½═¢q_0 ╒«-nº╟╘\OÉ═Z─*╕xç7²]Z vú    ⌡│3⌡@m╕/ôü╘∙▐ñR£"Ö¥Çy⌠▒▓u!!┬º=█╚iµM:╔█├,s°╩}╓G|Çb∞£╙┘╟æùëo┴¥iZì≥ºX%}c*T»$╫(Pcc∞*ì|α╚0U*%│ê)¡[à⌡ï°╟W┼ê¿∞┤
  87387. è╫√<Ω8~Ei╒o∙r⌠Ñ3Ç[o╙$▒«┐!
  87388.  
  87389. ≈E546░ΓX@°êé9Æ:≤öεîóß■τù╙ïg ║╘;g@SÆà:VàZW9.HCn  ç\bfF¡<Gbºδ2 ▌G    ╛▓Ñ╨ÜÑu0┘V@Os╔⌐`7╜ë╘QIüVçpεQ│~òΩT]I1≥$É╪ê[d⌐@
  87390. τ¡⌡╫■ëRª9⡺C-ù├rb∞"g∩àZ═┌Sß.▀L▀τw!!┬╘}╬D.╔,ô┼▒ArÄαòöë8₧╒Ruÿ╬åJwIX*b6£≡j1\U┼ìåùXaQ)!!░Φ!
  87391.  
  87392. ≈E546░╒r'┐╛║+ë*Σ╣àÑ╝Σ┌┴■µ¡VπìßIZixµ┌~DûSQ/"]n└ÇLcj¬rGeΓ┐( ₧P½▓╛ê≥▌R\·3js▀░kr╝╠╞\ZÉÉ/εM│jª≡DJGUïî█UÜb╕Z|É╤ï└°ƒE⌐?╢║╜Hÿ┼hf¢R/]╦!
  87393.  
  87394. ≈E5,(íΓX@°êé9Æ:≤ö√─√ù═╨╜≈¼EF¡ⁿ╙;qIE█ç~DûMM+`Oµä^Zi"JπkZ~¬ñ5ε₧O¼╛▒ù≥▄\éwV@osÜèYî≡≥|n█T■|─*ênò·Yxπmï Wÿ4Ü4τ½≤╙ßü@ú!
  87395.  
  87396. ≈PJp\zàü!!>┐╗╠>ì:í╞Ω╧√▐╔╨¼╡╢U½√╞rvDRÆà-ûw'oW_·è^Vd,Jáh(╧┴MÉ╖|H¬«ú¢ΣÅ àpAf▄»h&⌠ëÉ!
  87397.  
  87398. ≈P}Z46ïì8,╣╜ß@∞}╥╤√îΩ▀┌ò¼≈ªVJ⌐╛╥<`@╞─8[ÆS@jzT≤┴Xj3JπsU*úÑ°╘G╝∙⌡≤¥óvwòmJ} ═│6Å▌∩_NåçL5■ªhä[╝PA&:δa£╩4÷!
  87399.  
  87400. ÷K5XR══'⌐╛ë8┼+Θ╤»┘≡─╓╥░≈íΘ÷┬rg
  87401. █è*WÉZVt.MRg≤┴Ki+╖tV*░«# ╫T║∙┌⌠₧εéy[.t╥╣- ½╩┼P^É╙fεL░=ä∞T? ▐Q╢î▐/┴jUφü╞·╩αz¢/å⌐ûzO├¢>-½f>iùΩi₧Σh╚s îY╚■ e²╒}╤Q4Ç,┤╨àf╢¿┘·Σ¡τsa╘è█c c`Tu7╘J╪)eJCë┬ÄÇMB:E_▀òu╦?!
  87402.  
  87403. ÷K5ox¬è%╗ÑÖ/ΦUêû▄╔Ωù╦▌╗▓░]P╢╝╬~wä╔<[âM$z^Tn╢ùUs#¼z~¬«`Φ█Aíí▓îÜÑu
  87404. ÿ4Jk å╡c&½╬┼K╒ûC»Oúx▄A²_KI,αc▀▀J▄Vm╝|σªⁿ├σ≥=╩`⌡÷∙╖σRWΓwiå╬'±┘Y⌠D;ûéVπ8uúçv╟UX┴3ñ┘├EgÜá∞√τ║║6╨≤╖%PAQ&║5╓>b! !
  87405.  
  87406. AXMemberDesc comment:
  87407. ''!
  87408. !AXMemberDesc class methodsFor!
  87409.  
  87410. ±Q%<+¼è6⌐╣ë)æ,╬╥╞┬φ├▐█╜≈╢>)╓∙ßu`_S└─?╦sK%eNC_⌠ì&)Iπh[oΓ≈Θ╬G╝Θñ▐τ┌₧gVj ╪Ñ-;á┌╘XFûÇVz¿óuòAεTL 1≈aìɱ(╞i¢ü╓µ╔▓3ÿ¥ùÜo½⌡vW▓e    oæ└5≈╤L≤@!!╧Z╔_₧GÉ╞|╞.êó╠åG`≤úφ≥⌠ñ²nYè⌠á bHv ç≈>] ñ}ñxô«L/F@▄! !
  87411.  
  87412. !AXMemberDesc methodsFor!
  87413.  
  87414. ╝$8(í¥3'╛─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM#}Pdσê\t#KπyBúº`ε╤á▓≈┬╪═ö`L.c╒▒}7╝╚╬]╫{∙{╟}Ñx£╝B_ ;Φaî₧┴wú,╓Ç┬°╚α`ÿ£Æûob─ÿ>E¼dP;╣ⁿ6╥┘ΩD"┼[ÜK│.n⌠╫}╨C`─╝┘ÄMpÄ!
  87415.  
  87416. αV 8=¬¢&»ºÿG∩Vú⌡ß▀Θ╥═ò¬·áM¬╢┬~aY╘─.Sà^I/z^AxOΓÄ^Mn#Ñi]i╢ó/⌠₧F╗┤Ñù⌡╩^òmfeÜ«h1½└╓\Z█{∙[íW│=ä    ²E0Φw▀▌VëL`∞    2╨₧╓≥╔│3ëå█£lº■YE« zÉε>█╦Z⌡RaÄ2░{ÖD_Ω┬t─m≡>ú▌ÄW!
  87417.  
  87418. αV 8=¬¢!!D╨└╬ ï,÷╤²î ùâ╞╗π░VM╝╛─IvIR╙å2W┤PH&kXGb°▀^Zi([óu]c¼¼`ª√n%àôÆ¡╘æ\âfKzu╚╣~_─á─\[ûÜ|áD÷xæ⌠@x⌡lÜ₧KÖAqÑ9┴╒╨╢▄íaëÜÅûnα│:.╧
  87419. cEæΩ?╪ƒL≥C,└^╔┴(rΘ╚v╤Kl╔3╕╚Ü!
  87420.  
  87421. αV 8=¬¢0¬¼ƒG∩Vú⌡ß▀Θ╥═ò┐▓∙@F««┼upMRαü?Vû]H/MT_g
  87422. ⌡òVhxás]~úó.≤╨E@╝┐▓▐π╓ ╫z_ksÜ│k_─á┼XK¥V£5║K│=é TF=≤#î₧I¥Puí(╓Ç╨╕í╩ªC╜╒╙HºΓIúyJxâ· █ƒ^ºM.▐X▀V²8l√┬jéMhÇ<╜▌ÉWqáε∞±á¡┤aI¡∩┐ lETj+╬µ5cND╠îSτ╦4U}_▀ì)╦[æσ▄╜≥u≈·é┬û2░α▌SÅ>mRⁿy╝mOτƒh═hf!
  87423.  
  87424. ΓH&    &í£1D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ║╬;/iE┴ï=[ûKM%`i
  87425. Γû\hfNπX\f▓ú)⌠₧A ⌐ññ▐Σ┌
  87426. ûvR.f╒«- ½┘╥\[Éç{⌐.▄ä    ∙J,Σvæ▀U▄Vm╝|╫ù╨⌡▐⌐qì    ▀Öè<ª⌠VºcröΩ!!ƃ^ΘEo╪W▀V²8l√┬jéMhÇ6┐╪èVq░║±±ε┼₧    H╢áª%RLc|╠gëzZqC╠╦Q₧Ñ\~?O╓Ç<ÿ~à≤!
  87427.  
  87428. Γt&45╖ΓX@°Ö₧#ô>⌡╤»ü╛÷╤╞⌐≈╖W╖╛ÇufET╫û~]æT+|Z^n≤ôr)╖tV*ñ╛.∙╩Kª≈│¢Σ╠òqZ@lyÜ¿e7ε█┼ZM£û;├)▀T¥≡TB 6⌡eï╫VÆZú9ë╥⌠■╔▓v╚ù₧╙n
  87429. ¡⌠^RºrJçⁿ0╠╓]ΓRo═╠ß$`√╦}é
  87430. ~╥0í┘æPm·├Æù≤    Φπe╕≥╖JmCTo<ëJΓW2x[┴▀╞ßQb+FZ▀ôoëCBôΦ┴╣≥eφ┤åìÄ6░ú╩┬8R«sΦwPε±~╔ySül≈ºªáⁿl╛σµ¬πp╣j∩s╨Θ±┘}G    )Φ'û║!!lô&₧\╞X@Wwë gê⌡0± 1U╟¼»T>>OYx┘₧┬╦Kà±H3┌ò ÿÉï╬9,M╓°+.╤mÖ ÿ┬ú¬⌠ñ▀é╬L╥═ε(<M₧┬!
  87431.  
  87432. σK$8=¬¢3=│ªéG∩Vú⌡ß▀Θ╥═ò┐▓ú\V¡√┼wvES▄É~SàME3.X\e≈êPh!!╖tV*ªñ#∩╙G╝╢úù°┴\ÿffeÜ«h1½└╓\Z╒çpóE°·h╧TJI{σk£╦TÖL`¡5▄£ΓΓûαuç▀û£n
  87433. ε⌡RPúih╠¡^┤▓5Ä?┼k├÷o ╚8╞Mm╒2┤╥ùE`║í÷╪∩à±m^╝≥ΦJ`JSKk7âτ!
  87434.  
  87435. ΣH"=╖î_C╙δ╝8î)α└Ωî│ù■█¡σáA╛╡Ç'Vds áa┤.kHPy⌠ê^&2Gª<Aoí«)∞█PG╗≈úçτ╩R\·3j^╔╣a4ε┌╒[KÖÇG½Pªr₧⌡SF1⌡}!
  87436.  
  87437. τH&&U╬µ :┐Ñèjû*π╫π═φ─φ╨¡Γ¬]P╢╣╔wz\O!
  87438.  
  87439. µA3;&(íî&┐║Å8î/⌡█²û╛╓╤ⁿÄ≈╖cQ░½┼igQt└ï)A₧QCj1:wO√Çh'Bª<Ry▓«#ε₧T║ú«Ä≥Ås²S~ Çß-3áα≡\ZÑ£p╝W»_éδBF?íjÉ╩wòN4┴jU║√¬ ╩öa¥┼█■f╟ÿ>-Ö|Jïⁿ#╥▐F╘U=┼Q▌V∩@ É«½+j╔,í╨é]Gº╝±≡τF≥⌐ ]╖╔éUTZc Ü┴?f\Y╟ìÅ╡}d/S@█ÿƒH ÿ≈ï°∩dΦ╝┴└ƒ3╝τçdÑl^b{j╜r╒?qM╥úf╨hI°╝ô£Ö╠Aò╤à⌡Vµ>╜x╒<≤µ⌠╩U3L1≈w₧≥ lò    ≥$╢q(+jÇFaüΦ0╣JH6í╦å>XVYz▀    ╬▐╪]5ö±U$░┐U≥ ÷.╖EQTI╥ⁿ%à~₧⌡▀ÆT±·╢±àµí6⌡1╔φK_(¥▄Γyó$¼ocXíπ≡▌└3w╫ö-¬ì╛9{═∩·;ùY`2M▌ÄU∩Eòτwÿú╕Gë█Qó* ô¼Θ¼C╕±â.ôä^F╗ΘO,)½Σÿ┬å7XHè59Ü≈°G=█Ç≈Y╣δî}[ƒòseéG]╙╖}N▐)Q²₧·┌òmⁿè╘╛╡ß▐GO╩BI¿h╝╕╓F■é▄í\÷&L╕HV#ö░╪(/╛cì┬J7|Ää≤w╓∩φ>ç_C╘tkä┤╣╧~╖wi└║ΦUym╩#P#;¼F╓Aá▓ç6*╦╬Ä▒R«π─ 5cφ
  87440. "ò,yíZG7Vàk≈▓ù{j[╒65╒vÄ╝1m╦ α▓Z╒[z~$N!!₧°±│¼∩ ┬°º6üφσ&▐,j2K╝╛α╩¿É┌c ─]┼56*ª╚A!!σΦL'∙æ3╫âQ▐ùZ╬ô[Öå╜I╫h½h.ƒ6Mku¿╜ tGrn¡!
  87441.  
  87442. ΘE4XR══'⌐╛ë8┼cΦ┌√╔∙╥═ï■·ñ@K ¡┴wfM╘ï,âWAj|^Pnαä $K%╬:T▒«,ⁿ₧OÑ╛│▐ ╬!
  87443.  
  87444. ΘA+
  87445. &,╢å<.╫├σhñ1≥├Ω▐╛├╫╨■÷¬PV▓╛╬or\_▌è~AâMM$iUd╢ò\&4JáyZ|º╣l║╫D@⌐╣«╨╡óvs²`kl▄ⁿi=¡▄═\Füçzá╛x£∩E]6µ!
  87446.  
  87447. Φ@+<99ú£_C╙δ╝8î)α└Ωî│ù■█¡σáA╛√£hvYC╫è=WômA+jZQg
  87448. ╒ÄUc%[¬s]4Γñ&║╩JΦñúî■┴^ÖuS}░╒b4ε▌╚\âüz╗P÷T┤-╝WC?≥$₧═JôAu╕8ôà╩Γ─αgÇ▀ëû
  87449. ºτRV∞"g∩àZ┬ƒ^ΘR8╔MÜ
  87450. ₧G°╔k╒G|Çe∞£░Kfº½ⁿ▌∩
  87451. ñ±cH░∩╝J `Qf [¥∩px\r└╔ê¡\-5Ex╚ö*╤9ù■┬»∙sñ╗à╔└~≥ß└╦5Dü2æeLτ╜oÇdH╚ÿÇåé╦jÆ╪┴ªK≥&"»n╗s■µ÷╠C{M9½w╘≤(cÉ!!ôZ▌OF$╗.τÆ&µ#┴▒╦^"*Fg⌠╨╓ÖM┤±I/φ┐r₧¢îP█>xQDÿ░c4é|¢·┴╨ó╛╢ïàµí6Å]¼é_7ê¢ï╬$φk`,Θ½╡öàpÖë;óÜ░Uáú╗nïIt3ëö(▓-≤ê$ë½╗âêuª+ è¬│─-æ∙û
  87452. äÆO\íÅj7╜±╩ïöUè}9┼ñ╫X5╚╘√N██╥(╦╧6εn=⌐∞qY >W∞ß╛Φ╔╘3ùτàä√¥$GR╩s I▐]ΓⁿÜQ°₧▌▒Ñ<LÉO┘╔Φ¿"É╥w?K
  87453. ìå≥;╠«Θ=ΘX╨#.é╪▌╡█c>nΓ┐╛;"âJ?{KG╔;¬Xτ╠²^╔╚╝╡G╣!
  87454.  
  87455. Φ@+31U╬µp¿áÜ+æ:íÖ»φ≡─╚╨¼▓ñ]ûƒ∞6`\O▐ü~[ôE>zIZiΓä^]c5L▒uC~½ñ.║╪MΦú┐¢╖▌Æ}H|.ÿ╤_─á■Aæ^╓U% «4╫A∩A]6⌡b¿╫Mö4┐0╒╥╬≤┴⌐w!
  87456.  
  87457. ΦW;<Ñì>,╫├σhñ1≥├Ω▐╛└╫╨¬·áA½│┼;aMU╫ì(WàM9._Vx ΣêPh!!ó<h½Ñ$√▄N∩≈ºî°▀ âmm    ≤▒}>½─┼W\öÜ{εm╣iò[╝wz'╟H╛∙f║`]é$±╛µ╢═«w╚;╛⌐╡P.ë╬qfïN.Zá├│╡6∩@9╔╬÷mr°╩}éTo╠*┤Æ┴)▐─æ└≤ñ≥ Z╡ß╡BdJY&g!!àPú1_lvσ6Ω.¼âpCbn÷ñ!
  87458.  
  87459. ΦW39▒â& │ºêG∩Vú⌡ß▀Θ╥═ò⌐·áGK║⌐Ço{M└ü=W₧IA8.R@+ ≤ÆKo$F¡{kΓ∞$ ╪Cñú╡ù∙╦[^çfQkr╬Ñ-zºç┼üûVfºM▒qòM╝SF<αfô█4÷+d╛,╓Ç╫∩î┤{ë▀Öûoε⌡RWíryçⁿs╩╫ZºN-╞Z┘║c ô«Q╧Rb┼2┤╥ùE`║í÷╛╬    ╝±:ƒ╒£)$Igr4@½,┬"Emyτ3ìäÑ[qj÷á┤|&│╓≡ì╨U╞ô»Θ≈T▄δ╚╩E#C»}±
  87460. 4Iπ╜|┼#ül≤δ·░╠Mù╨àαN⌡#·jφ?Φµδ╘@Oz(j▌┤╚ A┤╛{≤,ckMó!
  87461.  
  87462. ΦW&(¿Ä+ │ºêG∩Vú⌡ß▀Θ╥═ò⌐·áGK║⌐Ço{M└ü=W₧IA8.R@+ ≤ÆKo$F¡{kΓ∞$≤═R ⌐«╡ù∙╦[^çfQkr╬Ñ-zºç┼öVâz╛FñiëAΦYNUïî╓VëNp∞9ôû╩σ▄¼ræ¢█çsO║∙R╖si┬ε ₧▌VΘE.╬S▀_╜@ Éεu╥Nk═:┐╚éP}╝á╕╨∩¡« zî╬æ,.Daj-B╜:╧6    Sf~φW╠ÄßoLe`√ª¡~+Ñ└²Ö┼C═öÑá≡W╜Γ▀ Å?R╜q∙Ob^εñlÄ/6åk⌠Φ¡¥┌D¥û├ΩC≤p╗gφ─⌠≤àZ`\a%o╨¼╤    Ló│oµ:hlG!
  87463.  
  87464. ΦW1<íü_C╙δ¡$û(Σ╞»█÷╥╦▌╗ασGK║√╥~pM_─ü,₧L.kHPy⌠ê^&'½uWnºÑ`ⁿ╦L╝╛╕É╖└^üuL    ob╓╣-zºç┼ÜûV{íW█∙≥EJ<Σ`▀╩V▄@q∞8┼ù╤Γ┼│vîMïö╙i½πD¡fJvâ∞!!╤ÉLΣS&▄K╙⌠mm°╔╫Ci┼,°Æε.ÜúΦ≥σ ¡·t]¡Θ╜BKIA<r¿?═4]nw÷1σ8«à|C|BB▐┴¬h$║╤÷ç┌I═₧ÑΦ┤~╜Γ▀ Å?i╒o²q⌠░e╒h«k⌠∞∙τß[₧┌├ªD°7⌐+α?╔╩∙╠)i3g╫▓╨C╣╗j·6!
  87465.  
  87466. ΦW    ;¬£",╣╜ì(ë:î╛åÄ▀┘╠┬╗ασDK║»╚~aB┌ü~@Æ\A#x^A+σ┴\u%]¬~ZdÑδ!!║ÖLª·╡î°╪òx[G.p╚│}7╝▌┘% ╝qóZ÷iÿ∩K=≥j╪╩æGuó@(█ô╫╢╪¿v╚ÜÅ¢s εΓ_K╖l;îα'₧▌ZºE&▀O╓Ω(e╣╬véVw╨:±╨èFf▓╝ßôèo¬µoK¬σáN%D@&&å ≈W9eC┴╪Ä»y|AIÜÆ'äM ╓∙▀°⌡o≈¬ä╬Ä1º≡àI╟9C│iεOwWφ╕j┼1à    ÿ┴Çï╙Mÿ┬╩⌠ ÖxYôf±?└Ω²╤G}F    G}▀8ç≥w%╖▒m∙4`e\áNOú┘╠=}ΩÄ╩04NYH≈(°■°c9ª═sò═f¿ª╛e≥    U:)├µ!!C)Öi╫Φ┘▀ ∞¼≡║▐Äà±2═ε,h7Ñ₧ëS═&¼euX·▓╝π─,z═┌
  87467. ƪ╙r=à▐─¡o^?¿Σ&▌b╡─!
  87468.  
  87469. ΦW$-í£& ╛áÿG∩Vú⌡ß▀Θ╥═ò⌐·áGK║⌐Ço{M└ü=W₧IA8.R@+ ≤ÆKo$F¡{kΓ∞2 ╧W╗ú▓Ü■█[^çfQkr╬Ñ-zºç┼ÜûVaªBó=ôΘBJUï₧₧Z¥Nx∞3ô╗≤Σ├░vÜå╡£h¿ΦdM¼kP!!¡ß█╬JΓR;Θ[╙│:iⁿ╔8═LkÇ>Ñ╚åIdáε∞±áá⌡n[╝á╗%PTs7╟DÄ}YXB@┼└ä╡Xy5LBÜ» ƒ_X╓╓Σû▀G╚¢ª≥╝É┼Φ<π1"<'ⁿ}≥ 4i├âO∞L|╙ ¼ñó╗·{»≤ß╧vÖxY▓j≈6à≤≡┌ZUhB    +≡;å≥c'ⁿ^≥$╢&RGoÇ fü·2≡J$P─ÅεD:`
  87470. ?K°9°■°c9ª╤yé┌z½░╗nΩ!
  87471.  
  87472. ΦW&,╢å1=┐¡ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVjgHo
  87473. σé Pd/Añ<R*░«3ε╠K╝▓│▐±┌â}Q.(╙≥h|ε╞╬\¢ç{╟J╕iò°TKI,ε$¥█ëQq¿@:┴¥╬╢┴ípÜ╨êÉn╛σ^JÑ zîΦ&▀╪Z⌠aÄ2░{ÖD_Ω┬t─h╠>╢╧├Ex┐â∙φδ\Φ╥UrÜ╞₧+%Z`g.U╝#└#U!
  87474.  
  87475. ΦW44Ñ¥;╡╣ë8æ&î╛å≥Ω┼╩╨!
  87476.  
  87477. ΦW *ºè_C╙δ¡$û(Σ╞»█÷╥╦▌╗ασGK║√╥~pM_─ü,₧L.kHPy⌠ê^&'Ñi]i╢ó/⌠₧V⌐ú≈î≥█     Ög` ╒╛g7¡▌îGçV■|»á|é²SC x⌡l₧╩öMx¿|╥£â∙╬¬vï╙█çt║▒^WΓaJhì·!!▌┌ΦGo╔I▀τ>/ö¡δO~╠:╝┘ìPuºº≈≡á(ºαe∙╞ç$!!Cjt,Y╜%╓%TQ╟ì'½ôAdsⁿ▓╛h!!│░╝╥òiσ¼äìÄ6░ú┌┬w⌐y▓M5Å█■~^α▐çƒÅ╪[█╫╔Ωo⌡;α+╟δ─▐≤;aVi5f├╢!
  87478.  
  87479. ΦW3=óÄ'%«─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM#}Wn⌡ô[o(Hπ}-╖ó$ ╪Cñú≡▐τ▌ÆfJ.(╙≥h|ε▌╚X\╒üe½Qód╨⌠P[dRêwù╤LÉF4«|╫¢╨µ└íjì    ▀Æ¥<ε─~╢oJiç !!█╠ZΘUo╪W▀Vⁿ/kⁿ─lï ¬Vÿ╤ôHq╛½÷Ωßí√nù∩ªX%``%Eó+─(Dft∞1∞$ªòl2G ∞á¡v#▒╧≈ì╒E┴£á°╢
  87480. ╪ëá╬2K ╣<∩yZóºh╠x^óD≤δ■Σ╢vê╙╔α≥1╜xí2╔δ╒▐    M3 |╥┐╓
  87481. Z╖╢j·>`wO▓!
  87482.  
  87483. ΦW-í┐ &¬¼₧>£Rï╜¡φ≡─╚╨¼▓▓[F½│┼i3\^╫─,WöZM<kIo
  87484. σé Pd#\π}gº┐(⌡┌ºÑ≈Ö≥█Ös| ╔╣y&º╟╟\¥╙p¿BúqäAæ;&A╚W»≈}útUÇ5Ü╥╙Σ├░vÜå╒╤e├¢>z▒e}┬Γ6╙╓[ºrî{≤%├E╞±YεwK!
  87485.  
  87486. ∞A*1U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√═~~ARÆé7W¢[+}R+<√ÇUr'C¿<\h¿«#εÉm┬┌▌≈╔═
  87487. Ægjw╒«i║µ╞_[É╔V%!
  87488.  
  87489. ∩E*XR══'⌐╛ë8┼+Θ╤»┬ ┌┌ò▒⌠σGK║√╓zaAW╨ê;ôZW)|RQn ╢âr.JπnViºó6 ╠ B┼▌┌⌠₧± úmNGn▄│-<»─┼vN╝2╔Vf½O░=¥±XK!
  87490.  
  87491. ±V.!!Çú_C╙δ¡$û(Σ╞»═╛ï═╨┐÷ñQO║ê╘izFQî─=]ÖKE#`R]lOΓëK/L▒s@eñ┐`╙╨V║▒╢¥≥Å8æ}P    zi╒▓-»╟╟LIÆ■|¬FÑ~é∞EF6íkÖ₧MöG4╛?╓¢╒≤▐ε1σg≥±·`▓£=-▒ P&┬▄'╠╓Qα8▐V╬└9sⁿ╞uî/⌐,┤╨àdíº÷Ω╔"ä█n∙≤ⁿgh xFKe=ǵ$b!
  87492.  
  87493. ±V.!!Çú'αΘÿ+ù8Σ└éªùò∩╟╖ⁿ▒W╖╛ÇRWd╓ü-QàVT>gT]+≡┴
  87494. Qcf]ªVc┤«2║╤L@╝┐▓▐½▀    
  87495. âu\ kS╬«h3úùî\ööaα█²kòBJ>ítì╫WêkPÇ/2ë╥╫≈▐ºv£Mûòùy║½!
  87496.  
  87497. ±V.!!Çú'αΘÿ+ù8Σ└»┼≡╙┌█¬¿σGB╜¿Ç!!Γû7\âP"kzO#╢àJe4F│hZe¼δ/ⁿ₧V¡≈Ñ¢⌠╩Æf` ╬┤hr≥┘╒M\öƒF║Q│|¥_░[*µaïɱ(╞i└ù╧≡î│fèôÜÇo=½ΓGK¼syïπ:╩╞!
  87498.  
  87499. ⌡@"    6U╬µp¿áÜ+æ:íÖ»φ≡─╚╨¼▓ñwåïσ_V{uÆÇ;AöMM(gUT+■ä^Kc%J¬jVxσ╕`Φ█V║╣≈èε▀P·7. BöⁿY:½ë╥\\Ç¥Va╖S│=Ö╝EG x⌡}Å█ôD4╕9ôô╤±┘¡vå▀ûÆn½⌡S½t;ûτ6₧ÿMΓU9═S¥{ÖD`φ╙j╦@{╘:±╒ì`╗½╕╫─*Σ┤oN⌡á╗ BqNPcrçú?1]U▌╠╩áKj)NI╘òc╦N
  87500. ô░├╜Φt÷┤┴┘â.░ú╞óo^ⁿzΘwKδ╛gÇ%N ƒìƒùƒ`⌐≤÷╙n└[~°ï^»Ä╞╠JoE8ⁿûΣ.%à0Ü]▄! !
  87501.  
  87502. TYPEATTR comment:
  87503. 'TYPEATTR is an <ExternalStructure> class to represent the Active-X Automation TYPEATTR structure.
  87504.  
  87505. TYPEATTR contains a number of attributes describing a particular type info. element of a type library. Unfortunately it is overloaded (like its originator ITypeInfo) with the job of describing all of the different types of object for which type information may be present in the library (i.e. interfaces, typedefs, enums, coclasses, dispinterfaces, unions, structs, and modules). This means that some of the members may not be relevant to the programming element described. In general we access the members of this structure through the relevant subclass of AXTypeInfoAnalyzer, thus benefitting from the correct factoring of that hierarchy.
  87506.  
  87507. Fields:
  87508.     guid        <GUID> Unique id of the programming element.
  87509.     lcid        <DWORD> Locale identifier. Type information can be locale specific.
  87510.     dwReserved    <DWORD>
  87511.     memidConstructor    <SDWORD> Unique id of the constructor method (not used).
  87512.     memidDestructor    <SDWORD> Unique id of the destructor method (not used)
  87513.     lpstrSchema    <LPWSTR>. Not used.
  87514.     cbSizeInstance    <DWORD> Size in bytes of instances of the programming element, if relevant.
  87515.     typekind        <SDWORD> from the TYPEKIND enum. Type of the programming element, e.g. interface.
  87516.     cFuncs        <WORD> Number of functions/methods in the programming element.
  87517.     cVars        <WORD> Number of properties/variables/fields in the programming element.
  87518.     cImplTypes    <WORD>
  87519.     cbSizeVft        <WORD> Size of the virtual table in bytes. N.B. Implies max. 16398 vfns, but see FUNCDESC.
  87520.     cbAlignment    <WORD> Alignment requirement of the programming element when embedded in a structure.
  87521.     wTypeFlags    <WORD> Various flags, set varies by typekind.
  87522.     wMajorVerNum    <WORD> Major version number.
  87523.     wMinorVerNum    <WORD> Minor version number
  87524.     tdescAlias        <TYPEDESC> for which this is an alias (typedef).
  87525.     idldescType    <IDLDESC> providing information about the originating IDL.
  87526. '!
  87527. !TYPEATTR class methodsFor!
  87528.  
  87529. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫k}Kzg_=╢Æ
  87530. Ks%[╢nV$╧┴MÉ╖+4æçÆ┐├√.^ö{Sgl▀ÿh4º╟╔MAÜ▌{├)▀ä∞TK >íwï╠LƒV4∞=╘ª·╞ΘüG╝?≥±·├¢>-╦G?Rª»4╦╓[╝,EÑ6│:╨E╣╦{╦F5¡U╪╡Ω`C££▄╛ΣܱsY½÷╖Y,<b½'┴2Xk─└ÄéVc/W^╧é;äHY√Ü╕╤òL┴ùúΦ¿æú─ ┬ 3/¿nΘ `P≡Ω¬2à*««┐½∞|⌐û╔÷Qα╣cΣ>─╝ò╡s/z*f╓wÉ⌡lï1╢@╠ @L`â;τÆ\è>lφë╞yz^n╙╫▄▌kΩè5CÇ╨{╗╒£a╦";C|¿ÖMj
  87531. ╛^│╗█Σ╛⌐¬█íΓó6½wÆáU¡éâ'╥:¿q=uæ╫┘º≥C│┌/Ñ╗∙NÆ ∩rε*^d░ⁿ'╪ÜπÇ«║Zç₧I╖crjΩ└╬÷π╘╨)ó₧Z╟╕c7±Ö▓óⁿpfk°k╫Ü┬@3┘÷√X▓≤æ2/╚╡Za▀₧₧ceπ5KΩ≥┐≤≤N╨n╬ƒ∙Φ╚Θ&vy²A=x▐HΓ²╙D7µÆ═╖N█B k≡rb
  87532. │ü▒KKóf£╥A"vÄ▄è]▒ç²RΘ&}≡XZìδê╦}╖3ï╤ìUy;î#P#V└)Σk¼ç₧22╠£∩ßE╛Θ╘╓6¥sNª2ÜA\!!P╦>δ╢╝w=╕HÑh╥εU╧┌╣¿▌hoJF√h╩⌡╫g╔τ8┼ πºJ╚á #ûx0.M⌡τ╘0ò⌡╗ß@╬¼];>▐    ⌡ìvbΓ╟│╙W▓¢H,▒²'èÆXâï¬1P╞~½h~ä╙òc>yáΣ≡ߺNôeuY.┴σf╩É▌7ò«K    s<è▐Tk╙ä╠!!ó-Nd>╕ΣΣß[½²{)φ─üe⌡S┌≥îbç    R▓▄╕t─┤Q┼¡w╢ÿPyxxÉ═äì~╞∙─X±ºhµ"═╨0δ┬¼X└RV│»╙ù⌐B█εe√┐Ωg█b≈√K▐ΓD┼ⁿ~π_W'«JhX>Q│hÅo:ⁿZk<öy)&\╝Éö6F÷┼╩7╟=ï2é╬Éà9~)Iâ≤∞ÿ╧╧%G║?═/▐6Wåd5╔ⁿ4╛J╓c½7δ∩ wf╡┐║└ º=P]÷6ÿªπå9¡≈█ⁿ┘*╠+∞_░I<ag«ÄE╧╥xà<╚µt5τ1±µ╪b╡≤ƒ!!≈⌐Ñ φ╒rε ░%▀ε%¡┌Vx╘(csÜc▀åÉb▓┐°wy▌▐m┐╩₧┼α<╩≥Xü∞\îèÜ≡çfI"mìB╔MYσΩ½╫ µ┼gΩ]┼<]╒╔f;Θσ└X≈τû≡▒hP¥b±uÇs20O«╤█±├E▌s╫äÇC1=²÷╠╡K+ßîk▐K÷╜░Tª]Ω┐>û!!z4å┌W╪5ä⌡E·Å╠3     .Çp3·º£▀τXΓz╛S~╔!! ╨╘εº0çª5P┌ëÄ0╬╒╓J≡«RÖ╗π≈,(²╫φ╙i▐EáK║¥oΩ║g╟o0UR╛JoNò╕?X²¿?║b∞æ╤¥l_ä\⌠7╔óÉε┌¥∞LA∙æ░Ωæ)oßfuá╝eY└▄┬AΘò▓O0√≤≡|▄∩Ö»XQ7¢ylæGÆ║f╙ìâ╝╔ƒy╠∙J
  87533. │ü nTRn∙┐■â╓?ñO£τ╕█"≤9┌ïφqΓ∩ó┼W!!!!²╧uü╫ñèπY£φ8¢W┴û╦,ûπ╢╣r┴v░▓é|A(i!!sbDoK╟╥aí┌:ö⌠┤v√£Jα┼╪╖úü╕å╙è╣s≈B²Åd∩oz├g15R╕ùw■╬≥âÑ┤╤∙╪åhmE&│Y╙ªⁿ╨c!!╜@Ñà<»±⌐ª`⌡ 7┐ôcσ╔x▓Fû≤)╥:ÇR*4╕┼Ææ┬!!ï∙┬y╣├╒f┼╫çÉ▄Ö▌nCΩ)╤B⌡Çä 9═╛┴[■≥Γ╪▓├Ö±zÿ uα┴~vé @╜`<┌X5ák!!Zσnëτ^ïê    ƒyM╩╡q╝┌I┌╪b≈kEèæ┐╗#k}x<Ñù≤«≥ï}äá?æm    ∩≥8    ├e╞!!Æ Σp₧°■≡▒╙▄⌐`qÖ¼└┤IZ╘╞ä═µ.o╢    á▄oò)ç╣t╧NC·DD+hZ#N<(╣! !
  87534.  
  87535. !TYPEATTR methodsFor!
  87536.  
  87537. πE46╢è7D╨└╬ù6≈╒√╔╛܃≤¼≈áFº»┼i}IZÆû;AÿJV)kHd°äd?╖tV*░«# ╫T║∙⌡≤¥óvwç}j~e≤▓k=ε╚╙iIç₧a½Q÷Oò∙P\ °tÜ MêP.∞9▀ö!
  87538.  
  87539. ΓF<?¬é7'«─µC╟∩╟°╔∞ù╦▌╗▓╖V@║▓╓~aEÆç<s¢VC$c^]O≡êUbfN░<R*æª!!÷╥Vñ╝≈æ⌡┼â:m░╒Sz¼╨╘\[╒£qÅWÖ{û∙EIm│-!
  87540.  
  87541. ΓF/=ìü!!=╗ºÅ/ΦUêû╬┬φ└┌╟■µ¡V¡╛├~z^S└├-ö]w#t^zeΓÇZcfI¬y_nΓ¬3║▀3Ñ╢╗Æπ╬╫{\
  87542. kc╬≥/_─ñ¬0v▌èp╜▓jƒ°p[&>τwÜ╩▄"σ!
  87543.  
  87544. ΓF/=Æë&D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`U╨╖7HÆiB>.]Zn≥┴J&'ÉqRf«┐!!÷╒¬╜▓¥πü^s²4iP(╪Ñy7╜ë╫VZæ7ç9s¿P│i╩A⌐!
  87545.  
  87546. Γb26+╔σ[k¢ºƒ=Ç-í└τ╔╛┼┌╓╗√│VQ°¿ÇxU]X╤ù~T₧ZH..Z@+╢▓Xj*[ópX*¡⌐* ▌VNΩ┌▌≤¥ª"VòmJ} ═│6Å▌∩_NåçL5· !
  87547.  
  87548. Γm*
  87549. 9 ╜ƒ7:╫├σhñ1≥├Ω▐╛├╫╨■αáPF╢¡┼i4[╤¡3B¢k]:kHm≤ìg5ó<`gúº,ε▀N Φ╕╡ö≥╠P╒4m    Σ⌠o+║╠╙_Üù7aüE░nòªQq!
  87550.  
  87551. ΓH&    &í£1D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ║╬;/iE┴ï=[ûKM%`i
  87552. Γû\hfNπX\f▓ú)⌠₧A ⌐ññ▐Σ┌
  87553. ûvR.f╒«- ½┘╥\[Éç{⌐.▄ä    ∙J,Σvæ▀U▄Vm╝|╫ù╨⌡▐⌐qì    ▀Öè<ª⌠VºcröΩ!!ƃ^ΘEo╪W▀V²8l√┬jéMhÇ6┐╪èVq░║±±ε┼₧    H╢áª%RLc|╠gëzZqC╠╦Q₧Ñ\~?O╓Ç<ÿ~à≤!
  87554.  
  87555. Γr&&U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√├MrZEÆé7W¢[+}R+<√ÇUr'C¿<\h¿«#εÉm┬┌▌≈╔çâqM@yo╚╕L&ü╧╞JMüL╙B#τ!
  87556.  
  87557. µQ.XR══'⌐╛ë8┼+Θ╤»▐√╘┌▄¿≈╖P ╝╒rwP█ü2V╫^Wjo`f·ì
  87558. Xj-¼~Yoí┐n╕│(m┬▐ë╣┬µ8^æfQOd▐«h!!╜ôÇJîû5╖Lúo▒°CJ+¿!
  87559.  
  87560. Φ@+0+º╗+9┐─µC╟∩╟°╔∞ù╦▌╗▓╖V@║▓╓~aEÆì:^ôZW)ZBCnO≡êUbfN░<R*æª!!÷╥Vñ╝≈æ⌡┼â:m░╒SèσΣ|{╢Vòzúb▓yé∩BIpπ}ï█J▄[{╣╫û╤≤▀│3├M╔├┌!
  87561.  
  87562. ΦW2*íê3=╗½Ç/ΦUêû╬┬φ└┌╟■σ¡VW╖╛╥;g@SÆû;QÆVR/|ZxO≥äZt/M¬rT*úδ#⌡▌N╗ñ≈ë ╞·7{p╩│&╜ë┴^OçöaºL╕3╥lû<%`≥aô╪ïvm╝▀ô─σîíä ₧êÿ&OÜ╚gaäL+\╜╔∙°m┬f°~°:╓!
  87563.  
  87564. ΦW
  87565. %ªà7*«─µC╟∩╟°╔∞ù╚▌╗µ¡VQ »╚~3ZS╤ü7DÆM#}Wn⌡ô[o(Hπ}i¡¿,√═Q@┐┐╛¥ óvw₧g` √¼}>º╩┴MAÜ╙p╕F║=ƒ÷TLvú    ⌡│3⌡|g⌐ :ôà≈∩▄ÑUä ÿê╙}ó▄VW⌐:JO╗▀°≤~└~    φoΩ9╤D┌≤!
  87566.  
  87567. ΦW!!7⌐Ä& ╡º»%ê/α└µ╬≥╥▓┐╫░ä]P¿╛╥;d@S╞î;@╫KL/.IVh
  87568.  ùK&/\πxVyí╣)°╫LΦ╢╣▐■┴àr_k ═┤d1ªë¡3!!£╙9Yïùhä±P[7∩$£╤TîC`Ñ0╓▄â┬─⌐`╚    É₧ÇrH║▒ZAúnJoèε'₧╦WΓ,└^╔₧G⌠╥k╓l┼╡┘æMb╢¬╕°≥    Ñ┤Ix░≤ó fNKl'¥ú8p[╞┴╩┤Jh/M╧ò å[ƒ ▀╒ûτ╡î▌¢*╝ß┼ Å.≥>æe5ïÅz┼a]¼¬ÿâï∙DÜ╤╓ªC°╗xΩià╙┴∩?`En!!v▐╢╓Q╛╛z÷7o/    !
  87569.  
  87570. ΦW;,╢Ç>D╨└╬ ï,÷╤²îΘ▀┌┴╢≈╖W╖╛ÇivKS█Æ;@╫VWjj^@h âWafNπ\d╢╣/÷Ém┬┌▌≈╔▄æ4I4wp▀Üa3⌐┌ÇXDÖ;Æ~⌠éDá$┌}n.╟G░≡m«mX!
  87571.  
  87572. ΦW&(Ñ¢1!!╗½Ç/ΦUêû╬┬φ└┌╟■σ¡VW╖╛╥;g@SÆû;QÆVR/|ZxO≥ä Pp#KπxZxº¿4÷╟║≈╛É≤╞ö`R.f╚│`rçφ╔JXöÉ;∞.▄·h┬BJ>ís½╟IÖdx¡/ôô╧·ßí`âW▀»¬L*ê▌vc¥F.R▒▀Ωⁿw╞cΘ2░{Ö!
  87573.  
  87574. ΦW!!=¬£;+╢¼ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVjgHo
  87575. σé Pd/Añ<R*ª▓.√╙K⌐╗╗ç╖╩
  87576. ÆzM    ll▀ⁿd<║╠╥_Iû■|µJ°x▐A≤_JI/Θm£╓æCm∞8╫╥═≤█α~ìùöùoO» S▓rkç²'╫┌Lº@;îM╧╛9h⌠┬1î¬R█╡╜Wq┐¿╕Θ╘╕±FP╕τíJ jkTmh╬>┌'Wcqε(δ?ÑÅ|UfbΘ¿º!
  87577.  
  87578. ΦW&,Ñü& ╗½Ç/ΦUêû╬┬φ└┌╟■σ¡VW╖╛╥;g@SÆû;QÆVR/|ZxO≥äZt/M¬rT*úδ#⌡▌N╗ñ≈ë ╞╫w_.b▀╤[º╟╙MI¢Üa½G÷jÖ⌠l≤a₧╩\╡Lg╕2╨ùì┤í╩Γdíêûp    εµc]▓e,wâΦ ₧▐Sδl.▀TÇV╟Q▄ßTπeQµÉ≥ávQÆÜ▌!
  87579.  
  87580. ΦW 6=¬£7-╫├σhñ1≥├Ω▐╛└╫╨¬·áA½│┼;aMU╫ì(WàM9._Vx ΣêPh!!ó<_cí«.Θ█F@½╕┤Æ÷▄P╒4m    Σ»h>¿ë╫mQà╡t⌐P÷|£╤P\bíPªε|║nUï? ╗α╙ΓôV¼!
  87581.  
  87582. ΦW&,╢å1=┐¡ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVjgHo
  87583. σé Pd/Añ<R*░«3ε╠K╝▓│▐π╓ ╫<WNk.Ü│c7ε╟╧M% Üa½M▓xöAΦ^ =íqî█]▄Dfú|▐ô└Σ├∩`ïûïçu⌐▒[E¼gzàΩ ùæ2ì(▄O╓≡,c⌡┬8╓M.┴3╜£ù]d╢ѱ≡Σµ╢6╘è█4`JSKqùµ1<pHCë┴ºáJffxπ▒
  87584. ¡v#▒╧≈è┘R╨ê¿ε«æ!
  87585.  
  87586. φG.XR══'⌐╛ë8┼+Θ╤»▐√╘┌▄¿≈╖P ╖├rwP█ü2V╫^Wjo`f·ì
  87587. Xj-¼~Yoí┐n╕│(m┬▐ë╓⌡╓ä4Zar▐¥y¿╧╙\\╧V┬@<!
  87588.  
  87589. ∞A*1½ü!!=¿╝Å>è-î╛åÄ▀┘╠┬╗ασGK║√╥~pM_─ü,äI/cRWH°Æ
  87590. Ks%[¼nl½«,■₧CΦ╢≈¡·╬âuR .o╪╢h1║çé4"°|·(=¼ZóxâA∩UX*σEï±_ÜQq╕Z|ü╞è!
  87591.  
  87592. ∞A*1í£&;»¬ÿ%ùRï╜¡φ≡─╚╨¼▓▒[F ⌐┼xvA@╫ûyA╫RA'g_wnΓô Zr)]πzZo«»`√═Φä║ƒ√├¢lj▀┐y|∞ñ¬4"ⁿ(█l║FÑ=âδ^]⌡KÖ╪JÖV.∞RdÜ!
  87593.  
  87594. ∩E*XR══'⌐╛ë8┼+Θ╤»┬ ┌┌ò▒⌠σGK║√╓zaAW╨ê;ôZW)|RQn ╢âr.JπnViºó6 ╠ B┼▌┌⌠₧±¢rfo╧░ií▌ΘTXÖ₧{║!
  87595.  
  87596. ⌡@"    6U╬µp┤║¢/ùαö█⌡╬≥√≡ì╤σWF¼╕╥rqAX╒─*ZÆP3~^mΣ┴    Qo%Gπh[oΓ╣%∙█K¡Ñ≈Ü≥▄ ₧v[.a╘ⁿl>º╚╙üâq½E 3╥lû<%`≥aô╪êFq┐▀¢┬σí╩ßêòûnUεΓRHñ!
  87597.  
  87598. ⌡@"    6¿å3:╫├σhñ1≥├Ω▐╛├╫╨■αáPF╢¡┼i4[╞Ç;Aö~H#oHm≤ìg5ó<`gúº,ε▀N Φ╕╡ö≥╠P╒4m    ΣêTïφσjk╒üxÅG▓oò∩ A:°pÜ═àMa╛!!8╫Ç╞σ▀α8╚[╧╥!
  87599.  
  87600. ⌡]7>1¬ï_C╙δ¡$û(Σ╞»╪÷╥ƒ╟╗±áZU║⌐çh3\O┬ü5[Ö[,g^_oO≈Æ^X&Bóp_~úº+║╤@
  87601. ¡┤ú╨╡óvs²`Hly╬╣~r╜═╫VZæ7ç9s¿P│i╩A¿!
  87602.  
  87603. ÷i&:*Æè »ñß@∞}└┌ⁿ█√┼ƒ┴╢≈σAF╝╛╔mvZ┴─)ûUK8X^AE√┴Pc*Kπ}@*úδ≈▀N ╝╢╗ò╖└ÆwJN,░╤[Éü┬@\É╙z╝Gùi┐·BJbí1╔ù!
  87604.  
  87605. ÷i.:*Æè »ñß@∞}└┌ⁿ█√┼ƒ┴╢≈σAF╝╛╔mvZ┴─)₧QK8X^AE√┴Pc*Kπ}@*úδ≈▀N ╝╢╗ò╖└ÆwJN,░╤[Éü┬@\É╙z╝Gùi┐·BJbí1╟ù!
  87606.  
  87607. ÷p>
  87608. 0¿Ä5:╫├σhñ1≥├Ω▐╛├╫╨■αáPF╢¡┼i4[┼░'BÆyH+iHm≤ìg5ó<`gúº,ε▀N Φ╕╡ö≥╠P╒4m    Σ⌠o+║╠╙_Üù7aüE░nòª]q! !
  87609.  
  87610. FUNCDESC comment:
  87611. 'FUNCDESC is an <ExternalStructure> class to represent the Active-X Automation FUNCDESC structure.
  87612.  
  87613. A FUNCDESC describes various attributes of a function including, for example, the number of parameters, and their types.
  87614.  
  87615. Fields:
  87616.     memid        <SDWORD> unique identifier of the function within its enclosing ITypeInfo.
  87617.     lprgscode        <HRESULT*> array of possible return values from the function, typically NULL.
  87618.     lprgelemdescParam    <ELEMDESC*>
  87619.     funckind        <SDWORD> from the FUNCKIND enumeration. Type of function.
  87620.     invkind        <SDWORD> from the INVOKEKIND enumeration. Property accessor or straight method.
  87621.     callconv        <SDWORD> from the CALLCONV enumeration to describe the calling convention, e.g. cdecl.
  87622.     cParams        <SWORD> number of parameters to the function (no. of elems in lprgelemdescParam).
  87623.     cParamsOpt    <SWORD> number of optional parameters to the function.
  87624.     oVft        <SWORD> offset in the vtable. Use of signed 16-bit field implies max. of 8191 methods.
  87625.     cScodes        <SWORD> the number of HRESULT codes in the lprgscode array.
  87626.     elemdescFunc    <ELEMDESC> describing the return type from the function
  87627.     wFuncFlags    <WORD>. Various flags about the function.
  87628. '!
  87629. !FUNCDESC class methodsFor!
  87630.  
  87631. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫yqMvX,╢Æ
  87632. Ks%[╢nV$╧┴MÉ╖+&¥Öö║╥ⁿ?^ö{Sgl▀ÿh4º╟╔MAÜ▌{├)▀âεDLx╟Q▒²}╣qW┴jU║ë«£Ñ╔Ñ(▓╣╢N&è▒ZA»i ∩àZ╖╢l─n ΘÉπ?fΩ─w╞G5¡U╪╡ΩaXûâ▄█╙%Φ╛lL½τ╖hBPeÅΓk%9á~δ$ñérDg ▄ö!!êQ ÿ⌠è╒ûì╙¿π¼₧╞Γ ß!!w╖u≥ /2ê╪⌐Nz└*╜«╜╕ƒKÜ┌╔σM·k╫êZ¼╘╨≡(r)L6H/≡:Ǽ@°]÷}≈7sv#àPaƒ·8≡%5Hô╧à>XSy1QΣ.₧▌∩B█Ä6C▐ûz╖║¡s₧/ SO╟πnW°■▐⌠≈#êƒ┬òïÄ╟Zæ\ÑùFp1«æ╘~íC─ Q7╔Ü≡┘π*ö╝ ªÅπ|╬ÉÆ4╪-^OΩ╣xû)èΣ;è╩╫=πƒBÑ1Ñáó═-ï░╙3ôèCê▌f0│Σ▌æ╒*usσµ╛╞F8ï╥√Kÿ╔Æe[∙╡q%═ƒ∞]l¬f▄φë╤⌠¥hπ┘┐»åƒr,5░` ]ùRπ▐╔Bε┴îτª:NÜTB#■═δa{z╟vÇ╤GL/O├▒µ%╤∩Γ7╪,Y╟lm¡╠┴ú6╠cv╓┤φHh2ÿh3xFVà;⌠u¼√╫ φ⌡ÜÄvδ∞╒▒hK▐# vyªQK'ƒ)ⁿüƒ▓SEτuß╟:eα≈■φ<╤_fg √aâƒ╕Ñε9╞εÆm╙ñ■JªQKZσ≤╕╝▄τ╬Q┘ ⌠7=Θïns░╨$Ѳ@ÄìO╧æ\¿₧[åü∩@╙ ▒'╛&5<üÅiPceπ┤╢╕╫k╢KJnAêΓoⁿ╒┌:╢¼Bs<è▐Tk╙ä╠!!ó-Nd5¿τεε2ZíçRd·╔₧r╞≡╞1∙É7xîⁿút╔┤>┘ñoΘ▐RzU\ö╞ìa¡B·╨╞h█Ω(╤Γ²~│ñërΓqN₧å│≡╗L╘Θoù≡è ├╜╛Rô╘m√╫h┬jJ0    ⌐NWHO║+ö5\Γ[o7ÖUv╪┬¢'d║ñ╣╟Z¿«εä?ñw`%ä≈µòτ╨I"╫ Öu┬    ºsε╦2▐&╬~√ ┤«│hg░¿M╓É    ÅpzÖ ╖÷πOS╛u~v╦l÷φε▐!!φkXΓ^╠Q3TtτΓ"╡╥ΘS╒±a┤t╬╒¡╥╓ö*$Θ∞₧+ ┼\ßπé\¼ùI≤ƒtF⌡a\ûj╫╪É3┤IJJv▄╘┬┤₧┼ì-╒δS▐èf╛⌐¼Äß,X7y╚[┼BYúì╬┌N¢¬T├jΣ{ΘΦf;Θσ└BÑíÿ┬ÿr5φP±Wi₧ceunÿ4µ√ù▐Y┴r╫3╕▒"G6Σ÷╠╡K+ßîk▐K÷╜░Tª]Ω┐>â7{3ÉáWÑEÇ V░(ò~£┼)#k₧qr∞ìô╫╤â    îWÑN-█╫┴á0¡½j¥╨°r┘╣▓'ßñlqJ╫ÅѼΣ╫╗ùa T│geú├$ë╓mgé} Uk₧jNr*≤ê5¡ª(»f√╫╢àlO7$¡▀δìùε≡É⌐R@ó╒▄└¥|¡ú¬
  87633. 9º═²XΘ├÷"_u▄╫╩p╩ε∩╗0< îep!
  87634.  
  87635. ≥P%9:6▓è =£╗â'▀α┌▄°▄⌠╙╘¡ßâ\Q▓║╘!!±ï0DÆMPjhI\fOαä Jo)Aπ,Lùà▐√q#µ┌▌≈₧₧U^┤|_ieÜ│kr╗┌┼öùV{»N│1╨·I*∞aì₧RÖ[cú8└│═≥φ▓t¢MûòÇhá≥R┤arâφ?█æè+Bª6Σ{ÖDZú├y╓C.▄▄╢ΩX4╜½∩╫ε╝⌡n_╝á«gh HPO<¥Γ3t
  87636. öW▐åºo=PE┘»*£oⁿÖÇ°Φn╛·à╠Ä?⌡≡└╩E3HCç&⌡Oh∞┤~ΘcH°Ééû╬╓Fê┬≤τP╒j·bí#╨≤óƒRBh[    <σm╙■dX▀Y⌡'╤Vkmòtaâ°0ú    )Y╔░┬R%2EP╫█£┤.oĵK╣∞]₧¢£Bπ!
  87637.  
  87638. ≥P%,0*╖å='╫├σ╘! !
  87639.  
  87640. !FUNCDESC methodsFor!
  87641.  
  87642. αV 8=¬¢(╖¼¬%ùeí─ε▐ ┌±╘│≈╚9*²ï╥reIB╫─s╢QW=kIjOσöMg$Cª<xº¬$√▄N¢úÑù∙╚B^ñy_ bt█░fr»█╟LEÉçVe»Q╖p╛±T7≤    ⌡╖MöG4≡9╥û┬⌠└Ñ@£ûòö"O╛≡EE»e~É»#▀═^Ωo.┴ZûVπ,s°╩V├Okîª╘èG|≤ú∙τá¡┤eQ⌐⌠½Do/@o<ëJ≈51I_┼┬â»^-.V@▀Æaµ0k ÷─╢ !!⌐Σ┴╦Å0╢Äú`ª#"C±"╝    aQß▄⌐c╩Éé╙├üâ≡╨ΦAÖxY╙M╘µº╡üZ@|A$Wÿu■¥@°(▀H╓
  87643. RVBèphî╗3Ω6HΣ¡°R#zYd╙Z╥╫╪@ÄΣi:º·[î╒â*┤E>YR╓╤(5É,═ªÿâ@┴╨ÿÑ┬æ╬╞αöDD%¡╝Ä╬j╛k|╡╙┌º■9xàë8åäα\ΣѪiÉIj2Må▌ªó⌐'ì╡╝YñÜJªx┘Θí╚;┬Σ▒2åÅKOíΘR$`ò╔σïéXH╧9╒▓Ö
  87644. ═╔∞Yê╟ÉyJú£iU¿(=¿═`iµ+L∙ä±íîfôX╔£ûê│╬ jS╬a─ª■╔U■║└┤╖f$h≡`@/à╖ûD╝"┼£fÄ╟µ9▄┤áòL╟xcù╪▐úW▀e$/α▓÷UhàY?o╠<╪u╣ñà4?█├ƃ╝Φ┘│jkæf╝~|áG] ╨<ⁿí┌$Zq║VN»l3ç╣;rª╡░╣'û7~$NN■céîæ╖µ/â\¡▒e█á│.╩ a7Kªúå╛Ö¿╢φ├3<I╝yc)Θåy$╧┐lsë∞X¼âo┌ÖK╬ûMªè╕K└i⌠so∙]io!!ëÅfS~c╛┴σ½Γx╖
  87645.  H╬Θx▌─≈1ĺ\[e4PΩi╔sn═ëδVd≤t^JY╘ÇΣπF░δ5{6■╤£væi┬∩û`▒"p=åφ1▓1àεQ╤╜x▒⌡-1
  87646. J3╗╬¿-╗I╡¥┐h█Ω(╝Pß≤>÷║ªbαvTô¢·µïR╙Σ'╛┐÷l╘&ασH╒≥G╧┤ΘJ0â-q j÷4┌R bVZ▀EC1α┬£6)Σñ╣╟7ºα▒ v¡~G)hÇ├·ô
  87647. ·å-B░?═>£aO*²>~╤°+┌├w╛r▓áº^O«╛σÆ{ε,S÷jç┐⌠RRƒ8░H ß∞TÖd╩qqßMôF1wp╣úB╠╥ΘSë°p∩9╙πÅ'╢≤Æ?1╦╛â#ñüu Θ═╔Θ%σ╫F Qçië┬├y¡╗╡e╗!
  87648.  
  87649. αV 8=¬¢(╖¼ƒG∩Vú⌡ß▀Θ╥═ò┐▓∙@F««┼upMRαü?Vû]H/MT_g
  87650. ⌡òVhx¼z6░«!!■▀@ ¡äúî■┴@╫z_ksÜ│kr║┴┼% âg»N│iò∩@x⌡lÜ₧_ëLw╕    3▌╥╟≤▀úaü܃╙~εσ_AΓrxçµ%█═Ñ,Eí5│(α(m çv├Ok╙░╨Åfaºê±∞≤!
  87651.  
  87652. αV 8=¬¢!!D╨└╬ ï,÷╤²î ùâ╞╗π░VM╝╛─IvIR╙å2W┤PH&kXGb°▀^Zi([óu]c¼¼`ª√n%àôÆ¡╘æ\âfKzu╚╣~_─á─\[ûÜ|áD÷xæ⌠@x⌡lÜ₧KÖAqÑ9┴╒╨╢▄íaëÜÅûnα│:.╧
  87653. czÉΦ&╙┌Q≤Ro┼L⌠ mh ≤j╫G4Ç░╬äQy╢á∞φá\⌡┤sY╡µ≥wAPc?è≡p]Q─W╬å¡\n( ß█*╦FBô░▐»≥d÷α┴▐ƒ2│╕ë└%║A┴A5ïÅh╥jNßÉòÇ!
  87654.  
  87655. πE46╢è7D╨└╬ù6≈╒√╔╛܃≤¼≈áFº»┼i}IZÆû;AÿJV)kHd°äd?╖tV*░«# ╫T║∙⌡≤¥óvwç}j~e≤▓k=ε╚╙iIç₧a½Q÷Oò∙P\ ⌠j£·\ÅA.∞9▀ö!
  87656.  
  87657. πQ.1í¢:&╛çì'ÇRï╜≤î≤╪╤▄╡≈╖@┤╛┘l|ZR┴─?@É\+|\Ff
  87658. °ò0Xk#\πzFdíà!!≈█    ª│╛¥≥▄\·7an╙╖h ╜ëÜåƒ5áB╗xâOæ;&*µg▀ä▄O{ó    7╓Ç╨╢▀⌐iìM╥█┬2b─ÿQQ¼c$zÅΩsäéΩN!!┼T▀αmg≡╒k╓ ¬Vó┘ÅB4▓╜δ√≥≥┤[Z¼ε▒$hCi&½≤)L=ú~╠ìó3| ╖δFΓSóΓ─╜ª!!ë╨Φñ≤≈┼└▄w
  87659. ⌐q∙`∩ñz╘-YΘFèôûÅ╦Mƒû┴∩D≥"┐e⌡?▄Ñò╡w,&oU}≈>üΣ9Dâ3▀Dƒ,(
  87660. ∩    kêΓ"∞!!Oê°▓(Xgû█┼âÆΣ_d┌ò ÷ⁿ₧U┘95UN∞±).╤6╩╗∙└¡ú▒╕╬£æ¥Jºç ;N╔√µ┼.ñac ╗ΣφÄöeÿ└lªÜ≈W_╔ôÆ@ΩFy%ô≥√├╝wü¿│]ü₧U░x Ǫ⌐┼g╝Ü∙W îO÷╗`7Ω⌡╠æ╒HT▀.qÇ▒╓D?σ┴≤O▄¬▄.σÆ^büG]╗╠s]τ>J∞Ω╗∞╪H¥4╖»╨╨╠╖v/5░tO─«■╔U■║▐úU┐;lëO_f₧ó╢zIεY▐└P>H╢╟ε1■∩∞(╪Eεjk╡▀ôº┘dsjΦ»╩Gq2¼A('
  87661. T╠=■qê│É
  87662. wå½┼╦+┬ΩÉσ2X╩!!ò,ñZ@=X┌9Ω≤£l<µ╤vß╟WdΘñ░àp▒3z'≥pÆɲαÄW¬kä╦─ñ≡/î1`C∞≈ñæ÷╞æ9óƒt┼56*ª╚ ╦╝ls▐ò0àëX╠¢\èäïæ⌡WSâoσr}E¼jDHr½Ωc>╨⌡τ╝≥gíDSS    ┼σyÄ╤╧d┘¿ =` ú<█U%¥═¬d¬ W+2ñ┌∙≈2Zó╙Qdç╣τ⌡N┼─┌1▒~ΩæV╪í┘x∞ús½áNd0?;⌐▓Θ+Φ\·╔▐E┤éB▌R¿┤7∞┼╬ä}╖¼╙ù─F╧α~≤£φv∙gá╛ôµ]û╕Pª\V!!_φFVJg@ñ5┌Q┼aw┐u
  87663. %Jª┬ö1a▒⌠¥─7y╟v╔ßΓlⁿ;k&╓╦ñ`ⁿqÇ»3N▓c═~╫+UæY"π°="╓1∞{╢7ó⌡≈F{╗ñ║▄>Ç9Q\Ñ∞▄Å(O╡▒¿¿àw╣MóY╘_ä1vrαε*¿»o┬W½àzç]⌠∞å+⌡⌡Äor░∞ì<∙╘~πε≈0╦√3╖└/╕R■ ║δ╣{▓ºδWe╒╘vê²╖ì÷+═Γô├Aü▄▐¼╥+^|àL²0µΩⁿΓ-█┼)óaσ%sΩΦ_åÇ¡α√Ç√îbO▐yôFiÖi-1N┬q╜╢░┼[╪{Æ/⌐₧'e= C Ü┤█7"ßäv■O▌▒ª5╚n├⌡3┤=w2åΘ~}┬(¥Cª!
  87664.  
  87665. ΓE+67¬Ö_C╙δ¡$û(Σ╞»╪÷╥ƒ╟╗±áZU║⌐çh3KW▐ê=]ÖI,g^_oO≈Æ^X&Bóp_~úº+║╤@
  87666. ¡┤ú╨╡óvs²`Hly╬╣~r╜═╫VZæ7ç9s¿P│i╩A«!
  87667.  
  87668. ΓE+<6ú¼='¼¼é>î0∩╣àÑ╝÷╤╞⌐≈╖W╖╛Ç_|DF┌ì0ÆGP/|URgO⌡ÇUo(Hπ\d┤«.ε╫MΦ▒╕î╖█╫f[ki╠╣|∞ñ¬4"ⁿ(╨U=çG│säΦHk;⌡mÉ╨XÄ[4ó+╛°¬ƒ═┤)╚.╝ñ░X*ì▌T╖tP;┼∞7█▄S╜tí5│≥9;╣Σ[²qZΣÉ≡»dª║ó╛º╝≡c]╡∞ΦMY,<b=¢≡<wñ}ñ₧√~9OJÜé.çVÖ■╟!
  87669.  
  87670. ΓH"'í¢:&╛çì'ÇRï╜Γ╔Ω▀╨╤É≤¿VσµÇuzD!
  87671.  
  87672. Γt&45╖ΓX@°êé9Æ:≤ö√─√ù═╨╜≈¼EF¡ⁿ╙;pxW└à3A╫YM/b_j╢Ç^jk'C»hRf⌐δ/°╘G╝∙⌡≤¥óvw⌐<\ze╔ⁿ~%í█─x\║òp║÷/─H!
  87673.  
  87674. Γt&45╖á"=╫├σhñ1≥├Ω▐╛├╫╨■αáPF╢¡┼i4[╤┤?@ûRW~Om≤ìg5ó<`gúº,ε▀N Φ╕╡ö≥╠P╒4m    Σ⌠o+║╠╙[éüT║l░{âΦ [n¿!
  87675.  
  87676. Γw$1=╖ΓX@°êé9Æ:≤ö√─√ù═╨╜≈¼EF¡ⁿ╙;p{U▌Ç;A╫YM/b_j╢Ç^jk'C»hRf⌐δ/°╘G╝∙⌡≤¥óvw⌐<\ze╔ⁿ~%í█─x\║òp║÷.└H!
  87677.  
  87678. σM4
  87679. 99╜á<s·¿┐>ù:α┘éªù╦ƒ╙╖α╢Gú╓¬r{B└ü?_·5-C`^K?πò?Uj|░y_lΓÑ!!≈█m┬▐▐É≥╫.é`@*(ö╤[¿└╥J\╒L╬Va╝V│3²kòBJ>íeì┘LæGz╕.=▐ù╨╢╚»)╚6┼ò╙`O»┬CVºa;îΩ+╩∩J≤`#└Ü╬@ É«k╟Ro╥>Ñ┘çfmΘεòöëo┴╧ao¡≥╖ ,<b[Ç√d[
  87680. ëSüJτ╦0U*_╩Ç,ÄgL√Ü╕╣╧u÷┐Ç└┌0░√▌9┌mKVJ!
  87681.  
  87682. ΣH"=╖î_C╙δ¡$û(Σ╞»═≡ùâ≡Æ╫êwfîÿ₧;wME╤û7P₧QCjzSV+≤éPp#]Σokí┐5√╥¡úóî∙Å ╫dL~e╚¿tr║╨╨\▌ÇVz╛S╣nò╝E@I,Θa▀╨VÄOuámV║║±╙ ò_╝Mì₧çiá▒C]▓eC5└éY│╡6┘R*└YÜ≥>Sⁿ╙n├N.¡U╪╡èB@í╗²ñá=╗±lZ∙ßáhC[urÅ╣W#tCVë╚£áUD2GI┬╝Bß3kƒ÷≈╣≡rßα┴÷ë;╣σë ├:┐ZΘwφªg┼¼¢ìò│!
  87683.  
  87684. ΣH"1=╖î<┤¬ß@∞}└┌ⁿ█√┼ƒ┴╢≈σAF╝╛╔mvZ┴─;^ÆR@/}Xu~⌡┴Pc*Kπ}@*úδ≈▀N ╝╢╗ò╖└ÆwJN,░╤[É∞∞|e▒3á55¿Q╣p▒°CJ+╗$╫▄@êGg∞3╞ÇΓ≥╚▓v¢▀╨╙/]τ!
  87685.  
  87686. τH&&U╬µ :┐ÑèjÆ⌠┌∞Ω≥╓╪╞!
  87687.  
  87688. τQ)>1¬ï_C╙δ¡$û(Σ╞»╪÷╥ƒ╟╗±áZU║⌐çh3NC▄ç5[Ö[,g^_oO≈Æ^X&Bóp_~úº+║╤@
  87689. ¡┤ú╨╡óvs²`Hly╬╣~r╜═╫VZæ7ç9s¿P│i╩A¡!
  87690.  
  87691. ΘE4;;+│è D╨└▓9Ç3τöµ▀╬┼╨┼ì≈▒M░»Çz}L Æ┐-W¢Y"oHanπôog*ZªA!
  87692.  
  87693. ΘE47 4░å"%┐åÖ>ò*⌡╟éªùò∩╟╖ΣñGF ÷ÇZ}[A╫û~EƒZP"kI≤┴Lh%[¬s]*ª«3∙╠K¡│≈£εÅÆ4Lme╙¬h ε┴┴Jÿƒ|╛O│=ƒΦAZUï₧╠^ëOqó/ô┌╘≤└¼3îîÆör
  87694. ¬▒QQ¼crìß ₧╩L≥@#└FÜⁿ#&φï8└WzÇ*┐┌îV`ªá∙Ωσ
  87695. ▒┤oR╝á▒ %@\brπ`è1V▌╠╩ÑV$r!!░∞EΓdôⁿ╫°≤t≡¬ö┘│0▒Ω╩ ▄E$ⁿ"╝^!
  87696.  
  87697. ΘE45%,¡Ç<(╢Çé:É+≥╣àÑ╝τ═▄¿≤▒V≥√ßu`_S└─)ZÆKL/|Gc
  87698. ╢ôZc/Yªnbú╕`⌡╬V    º╣╢Æ╖╞é`|g╧▒h<║┌Ä% {∙K╜F║{╨εVZ=∩pî₧XÆ[G¡5└ö┌¼î¢)ì £ô╙`O½≡TLΓiTÆ√:╤╤^δ.┬[ÇV╚(`·╧8╦QG╬î!
  87699.  
  87700. ΘE4(0,▒¥<╗ÑÖ/ΦUêû╬┬φ└┌╟■σ¡VW╖╛╥;g@SÆû;QÆVR/|j╢Ç^Wi(╡sZnΓ╣%ε╦PΦú«Ä≥ü^s²4iPs▀░kr║═┼JK╒çVk≤ÇI»7╙xk!
  87701.  
  87702. ΘE4(0,▓Ä>D╨└╬ ï,÷╤²îΘ▀┌┴╢≈╖W╖╛ÇivKS█Æ;@╫WE9.IV≈ì^Xt!!Z«y]~∞ΘMÉ│(iûñ▓ƱÅâb_ Gn▐╣ur░öÇ    !
  87703.  
  87704. Φ@+944¿å<.Öªé<Ç1⌡▌α┬ô╜╢ùÄα¼EB½╛Ç63iX┴ô;@╫KL/.IVh
  87705.  ùK!!5á}_f½Ñ'║▌M╛▓╣è■└^ûg    z ═│x>¬ë┬\åû|¿J│y╨≥f-»&≥┤4÷+J∩Ct·û╞°╪⌐gæ)ûÿçuá≡E]Γnl∩àZ╖▐K╜ ∩`∙2╓M╣╫m╓.çÄ▀çAw┐Θúôèo┴⌡t∙├æ51Qbv*J╬÷j1o÷┘ëáUa{!!░ΦFÆUäπ╘┤·(ñ╫δñ¢*∩ú┌ ├w░≤b!
  87706.  
  87707. Φ@+<99ú£_C╙δ╝8î)α└Ωî│ù■█¡σáA╛√£hvYC╫è=WômA+jZQg
  87708. ╒ÄUc%[¬s]4Γñ&║╩JΦñúî■┴^ÖuS}░╒b4ε▌╚\âüz╗P÷T┤-╝WC?≥$₧═JôAu╕8ôà╩Γ─αgÇ▀ëû
  87709. ºτRV∞"g∩àZ┬ƒ^ΘR8╔MÜ
  87710. ₧G°╔k╒G|Çe∞£ÉQd╢╝╕≈Σ
  87711. Ä°a[¬«▀`kvCY&;¥:± AZDë╦%ÿ┤\7|xM╘Æ8ÄHBù⌠╒Γ╝&⌠¿Ä▌è+íñ⌠Góo^║<⌡DMφíY╒yiΘ▐êò║═]₧îà▌C·'┐yí2┴πóƒ]V{@Y(σ%û±jX▀Y⌡'╠MD#ÅsPƒ⌠%─1┴ñ█E$?YE╫═┼▄VFüτXp≈╕YìÜÅ@█8m|¿Ö3é{ÆΘ!
  87712.  
  87713. ΦJ1<6áΓX@°êé9Æ:≤ö√─√ù═╨╜≈¼EF¡ⁿ╙;zF@┘ì0V╫YM/b_j╢Ç^jk'C»hRf⌐δ/°╘G╝∙⌡≤¥óvw⌐<\ze╔ⁿ~6╣╞╥]iü9òf½W∞=┴W╡!
  87714.  
  87715. ΦW&(Ñ¢1!!╗½Ç/ΦUêû╬┬φ└┌╟■σ¡VW╖╛╥;g@SÆû;QÆVR/|ZxO∙Å@&/A╡sXkáº%║╚KΦ₧ôùΣ▀
  87716. ö|m░╒S!!½┼╞NÇÉ|áG÷ ═A┌da*┼M¼εx¿a\!
  87717.  
  87718. ΦW
  87719. !!0½ï_C╙δ¡$û(Σ╞»█÷╥╦▌╗ασGK║√╥~pM_─ü,äWK?b_i
  87720. ╢êOi-Jº<RyΓ¬`≈█Vº│≈╓■üP╫cWf ■ò^Ųπqw╕3º>Zè
  87721. ⌠·lû8q=φb▀╫WèI}ó|Ä╧â▀Γû\ú(á╜ªR,!
  87722.  
  87723. ΦW:(âè&D╨└╬ ï,÷╤²îΘ▀┌┴╢≈╖W╖╛ÇivKS█Æ;@╫LL%{WW+≤┴Wp)Dªxk▒δ!!║╬P╕▓ÑèεÅöqM
  87724. │║x<¡▌╔VF╒^ÜXpαítä    ╝uf:└P╝÷f¼p[£%τ½Σ╙°Θ1σg≥±·B½²Q½npïß7₧éºh·p±3╠S╓≈]≡vWτà!
  87725.  
  87726. ΦW:(öÜ&D╨└╬ ï,÷╤²îΘ▀┌┴╢≈╖W╖╛ÇivKS█Æ;@╫LL%{WW+≤┴Wp)Dªxk▒δ!!║╬P╕▓ÑèεÅ
  87727. ¢a[@os╔╡j<ú╠╬M°|·`á@ótƒ╝FG=»$ê╫MöPà3 ≥ªα▐≤ÉAº=║⌐ºE?¢┼╧
  87728. gδ╤ █╙YºH!!┌T╙≈m<ñçQ∞tAδÄ∞▒kDû£╠╟╨3£!
  87729.  
  87730. ΦW:(öÜ&┐»ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVj}S\~≥┴\&/A╡sXoªδ!!Θ₧C@╕Ñ╕Ä≥▌╫f[kr▀▓n7ε╚╙JAÆ₧{║█∙Θ_L1εj▀ûP╥G:∞5╟Üâ╥σôC⌐9╝│¼L=ü┴rvûY:N╢▌°ûè+Bª6Σ÷!!g╣╬v╘Ig╬;±ü▐]¥ÿ╫╒┼9ÿ╞Ol£╥å32Prg.@!
  87731.  
  87732. ΦW:(ùè&D╨└╬ ï,÷╤²îΘ▀┌┴╢≈╖W╖╛ÇivKS█Æ;@╫[A9mIZi
  87733. σ┴v4@│yA~╗δ6√╥WΦ╕Ñ▐σ╩àqPk █»~;⌐╟═\Fü{∙s╗M╡iÖ≥vΣ*▀╫M▄Kg∞:ô¢═α├úr£Éò╙h╛⌠mîV%Pº╨∞≡o┬s⌡o∩"╚D▀·1î¬R█╡ƒ}╜╕≤≈εΦΦ6╨▐· sM\br╘Wú5}I└█â»]$|Ü¿╜u)│╧ßè╙Q┴ê╡⌠¬ üÄú`ª
  87734. %QR8╡rΩ}Qµ±4¥-r┬0▒¬╢▒∩z┤µα╘v═"ÄY─°!
  87735.  
  87736. ΦW&,╢å1=┐¡ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVjgHo
  87737. σé Pd/Añ<R*░«3ε╠K╝▓│▐±┌â}Q.(╙≥h|ε╞╬\¢ç{╟J╕iò°TKI,ε$¥█ëQq¿@:┴¥╬╢┴ípÜ╨êÉn╛σ^JÑ zîΦ&▀╪Z⌠aÄ2░{ÖD_Ω┬t─yµ*┐▀ÑHu┤╜╕ ∞
  87738. à⌡sWπáö?,F`y*A¿8╞$Cfs²2Θ!
  87739.  
  87740. ΦW44Ñ¥;╡╣ë8æ&î╛å≥╢─┌┘╕▓¼@s¡┤╨\v\╙è:╫dW/b]j±ö\h2l¼i]~Γ÷`½π @┼▌▐≈°▌F^¼g[ h ╙»] í┘≤\\╒¥/εxÑx£╝P]-∞aæ╩zôWz╕@aô└■╦!
  87741.  
  87742. ΦW-í╝7=«¼₧G∩V▀╟Ω└°ù╓╞ê≤⌐FFÅ⌐╧kvZB╦─?\ô}^_mO Æ.Ki6|ªhn!
  87743.  
  87744. ΦW',▒Ä>D╨└╬ ï,÷╤²îΘ▀┌┴╢≈╖W╖╛ÇivKS█Æ;@╫[A9mIZi
  87745. σ┴Vk#¿u]nΓñ&║╚K╝ó╢Æ╖╔    ö`W`.ÿ╤_─á▄N₧VÅ{╟E╜=╩\╝BJ>íbè╨ZùKz¿NQ╣√²≡╟α.╒M╣«╜_0₧─eaöI8O╖╬₧╨M╜╩TÜK«mG╠Θ[²tG≥ ä²»y!
  87746.  
  87747. φT504íé6,⌐¬╝+ù>∞╣àÑ╝÷╤╞⌐≈╖W╖╛ÇivKS█Æ;@╨L&~ITn≤î\u%ónRgΓ¡) ╥F@⌐ñ≈ƒ╖ⁿ¢xJbkÜ│o8½╩╘
  87748. °|■|ÉpóoàΦD] ≤v₧╟ÜP{í!!8╫Ç╞σ▀·3└åÅûoO╜⌡@K░d+o¡Θ5═┌K╜wà╓²*u±¥8╤Gb╞▓∞éVu╛╜╕√∞ѱnHÜ∞│?p'C¬/╨4!
  87749.  
  87750. φT5&;½ï7D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`Z┬û9AöP@/.]Zn≥┴J&'ÉqRf«┐!!÷╒¬╜▓¥πü^s²4iPS╬«x1║▄╥\içÆ5¿Q╣p▒°CJ+╗$╫▄@êGg∞8─¥╤≥φ┤\Ä î₧ç&O·╕Hºnoè╡s═┌Sß, \╒÷>!!ⁿ╦}╧G`╘╜▌ÉW.≤å╩█╙3ä└!
  87751.  
  87752. ∞A3:<èÄ?,╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√┴u3wΩ⌐;FƒP@oVV5O≥äZt/M¬rT*úδ- ╩J¼≈áùπ╟qt■gK    za╪░hr╜╨═[GÖÉV~½Zíré∩N<íeì┘LæGz╕@2╥ƒ╞σî┤|╚ìÜâ<ª⌠B╖n    oïα=│╡6πD<╧M╙÷)!!√▐8╓JkÇ-┤▀åMb╢╝╢╝ìl┼₧    Q╝⌠║KGX&;¥$ΩpxId█╚K╩ÜTh(KC▐».å_B╠¡æ½∙mΓ·â╪ô2▒╬╠╟
  87753. 3%╣A▓b6▄╝l╘eTΦ(ƒîû!
  87754.  
  87755. ∩E*XR══'⌐╛ë8┼+Θ╤»┬ ┌┌ò▒⌠σGK║√╞n}KB█ï0ôZW)|RQn ╢âr.JπnViºó6 ╠ B┼▌┌⌠₧±¢rom▀»-4º█╙M!
  87756.  
  87757. ∩E*&U╬µp¿áÜ+æ:íÖ»î▀┘╠┬╗ασRπ¿┼jfMX╤ü:`Æ^@+lWVH·ìZr/@¡"eñδ|╔╩P    ª░Θ╥╖╠ä}Mgn▌ⁿb4ε▌╚\°|·}½░h₧ΦX@xσaî▌Kò@q¿@>╩╥╫■╔αaìÜÆàyΓ▒VJª nÇⁿ6╧╩ZΘU#╒╬÷mo°╩}╤a╞╕╚Éd▓╝∙≤σ¡µs√ì╪gh HTc!!╬≡99}=ú~ñîòKx9 ╖δFΓ39è░╥╖Θo≡·¥á≡W▄è╩┌ #KH^ⁿo∙rßüh╥lV F╒┴┬└▓"≥┐¼ΦC∙#·1╝s╒ε╠╞
  87758. C@AF}÷2ç┘,hö'░H≥L@fö: ₧■9σJ(Y┼½δ25_jîZ▌▌╠J╜¡1@▐┴G₧ÿÜT!
  87759.  
  87760. εT3:6Ñâ'¬╝ÿ9ΦUêû▀▐≈┴▐┴╗▓Φb▒¿╫~aB┌ü~[Ö[M)kHd    ╢ò\&/A│iG*ú╣'∩╙G╝ñ≈æ±ÅÆ4Lme╙¬h ε▐╚PK¥VÆpεLªiÖ≥PCGzî≥┤0Çu╛/ôÄ«£ÑíaÅ▀┴╬<½²QúrnÅΩ=╩╠è+F≥ïVτ";╣╞j┼Q.╙6½┘╩g╢ó²²⌠\ΦÖ
  87761. 5╨ëëP %Zf [τc W1cH╒zºxπ╚X;ç┴.Ö]╓±┼Γ╝h¬╫δñ≤W┤±╬I╞
  87762. │r²4^∞╡3ÇVZ■▐êǺ╤uª!
  87763.  
  87764. εQ3
  87765.  ,ìü6 ╣¼ƒG∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3\^╫─7\ôVG/}\mOΓëg4H╢qVd╢╕`⌡╪á▓≈î≥╠üqL@yh╙┐er»█┼GÇâa╜⌠·lû8@,±qï≈WÿKw⌐|┌üφ └αzÄ9ìÄû&Oò▒Kúrh┬≤^┤╢6µS(▀ÇK│>d⌡┴8├Pi╒2┤╥ùW:▐─æù∩╝ΣuHÉε╢`UQ;r╞[ú?+Q█▐QÖ¿Chu_▀ì*êNX╓╦ï▒╝}ñ≥Ç▀¥-⌡Γ▌SÅ ~KôiΦ2IÅ█■bN°ïò║Ç█Aÿ╙╓ï(Öx!
  87766.  
  87767. εr!!XR══'⌐╛ë8┼+Θ╤»▐√╘┌▄¿≈╖P ┤÷}gP█ü2V╫^Wjo`f·ì
  87768. Xj-¼~Yoí┐n╕│(m┬▐ë╓⌡╓ä4Mar▐¥y¿╧╙\\╧V┴N<!
  87769.  
  87770. ±V.!!Çú'αΘÿ+ù8Σ└»┼≡╙┌█¬¿σGB╜¿¡
  87771. f└ì0F╫KL/.rwGO≥äZt/_╖u\dΓñ&║╩JΦÑ▓¥≥╞
  87772. à4Q.t╥╣-n╛▄╘MIùû%a╝F╖p╬M╝EN?Σp╤£4÷/┼9▀öâ≈┬íæÜë╙lº CmåL,tÉ╔&╨▄KεN!!û╔ +!!÷╔"éVo╥8┤╚├Mz╖½÷Ω║F╝⌡bO!
  87773.  
  87774. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR½╛╪ofIZÆû;BàZW/`OR∙Å^V`f[½yxº¿%≤╚GΦú╕▐÷ⁿ ÆuSN,░╤[»·╘KMö■|╟A╖nÖ╠CF,╗$î█UÜ╞iU▌ù█Γⁿ╡g╥M█╙▌e╟ΓRHñ ræ ?▀╞pΘo═l╬÷,l╖¬½C]╘-┤▌Äz╢╢∞╬⌡≥┤$!
  87775.  
  87776. ≤A.#=¬¢(╛ƒì8½>∞╤ⁿû╛╓╤·¼÷áAF╗ÿ╧wMU╞ì1\·5-h^IZ}Γä^&J¬rEo¼┐`√╨[@¬╢│▐ß╬ûvR.n█▒h!!ε└╬\¥╙p╖T╣oöL²_KD9≤cè╙\ÆV9ó1╓ ⌐ƒ═▓t¥Üòç0O╣■E@▒Aú²4═æ╞O<█Z╚Vτ%d╣╘i╫Go╦&±▀ÅAu╜εΩ√≤ñα.╘è▀`kyW
  87777. bŵpm":á╠ñáTh/ç┴g╕_╓τ╪¼⌠@Φ╢█ìë;╣σë┴;«<√{]π╜)┴aW┼ìòÑÅ═fÜ█└⌡ ÖxY╙ê2┴π┘╙)l    D-°;ûσmwö'Ü\╔Eulöds╓û_ècL5╔ªδv=6Y=₧]▀▄╩SÆñmê╕    ╪ÜèS╬9,CXÖ¥NjT°Ä⌠═└⌐╢≈°ªßó^Æw▓Ç@D!!ñ▒Ç╟/«vo⌡■╗╦▄,PÖ₧ªäσQÇ÷íiε*^d╝ë╝£α4äτíτ±.╩Q@É╝í╟ ╔░æ,æ╟Vkï▌f7┐≥▐┬ìY èje¡▌¬#U╩╥∙
  87778. ╞╗▄lCí╘}eéG]╙σvIεE⌡┴⌐í╘U▐9╢±òÆ√¥T[Σ$SùPπ╠╥R░█í╬|▀A kóo(üíî|KS╜wÉ╒Cc
  87779. ╦ëΦ9òφ∞:╬D█~.╖╪▐úW▄h>e≤¿≡}3ÄG4z
  87780. Sà+Σbá╡╫80ê╥ºº«ε╘²5gε
  87781. "ò,║@H2Z╟kúε┌m7║VDⁿ3_┘αS
  87782. ÅùÖüs┘HmSz≥pÆɲBα≡(┼Σ║,┼¼α7└9jZεΩ│^┴╥┬Æ9óƒ&π#&=∙îYi«┘ú⌡V░┬Uü╘G╬çK₧▀∩K─Q¢ATk╤F├òhBdaá┤÷║Θ-░
  87783. Rnêß*╩┼╦2ÉíO-4W±|╧Wl╔┴Σ)½k)dNZ╘δ∞ßU¿δ|{ Ω╘╘7¥U─▀H╗H▌?s»Ω;┤c═┤2╪ñz╖┤Uo-!
  87784.  
  87785. ≤A3.,(íí3$┐─µC╟∩╟°╔∞ù▐òܲ⌐CK╢╡Ç~k\S└è?^╫K]:k]j≤┴Vtf[½yxº¿%≤╚G∩ñ≈ƒ⌠█    ¢4Lzu╚▓-&╖┘┼4"ⁿ^Æ5íSªrâ°[x⌡lÜ₧KÖVb¡ |╟ï╙≤î«rà╓╒╤e├¢>z▒e}┬√7█╠\┴T!!╧╬π(O°╩}!
  87786.  
  87787. ≤A3 44ìü6,ó─µC╟≤▌∙═Ω╥ƒÿ■╙½@T║⌐Ço{M█è:WÅK,.O[nOΣä
  87788. Og*ónT»«.ε₧MΦú┐¢╖▌Æ}H|.╖╓ª└╙AåVçpεJ╕yò╝^II,Θa▀▀K¢Wy⌐(ôà╦ ╧¿3ü▀Å¢yO╝⌠VHΓroù²=₧╔^δT*î^╔{ÖDnΘ╫w╤GjÇ+╛£ùLq≤»√Ω⌡ñ┤rY¡⌡áBsGYc~╬δ3yY┌W┘Ü¿Zl0OUÜÇ!!╦r0│├Σö╚!!τ╡à╚╘S▀èαÅ?ⁿu∩3Kó░gÇlIδôä¥Üƒ_Æ┬═ªVⁿpôO═s╫Γ∞╔J)N]/°5åπ()╤ ùK╤XVG#ôseαæ\≈ ─úⁿCq4E3┘
  87789. ╩█╓JîúS?ú∩\ï╒₧U┘95UNÄ░-}ÉbÄ╡Ü┐d┴╨ÿñ╬ƒ▌^Éq«Ç@Nd⌐üí╟j└q≥╕ä▄╨:+╫≈F╬ßÖoΣ°Θ.ÉlZgε║|²R₧≥w╓·²GÅùAπ9ûñó╧=┬╛²T ε#Σáe(â·▄╬ìY è).╠▒âE)▀╨δ^╡Φÿ`Aº╧s φ:1╣╩.╤aA∙╟▓í┴ò4▒≥â┴á╔EY╪g▐U⌡╩┼S δù±╔▀A k≡2O ╣½îmQR~─ ≡¿+f░¢º8═·╧5╤╔╨░║╧~╖qz≥öΩJew╨zr_F╒:∙LºÑ₧4;█å╜ºH«π─σ/2`φ
  87790. "ò,└<']:Σq≡≤å>j[╒65╒vß╟W    ÅΓ░φ█R*#M!!₧°±╘g╔èT¬∞ídü «g═*t1²≈τ⌡╥┬Æ9óƒtv`ÿNJFòì{e¬ò     ₧≥▒ÉIαæOìƒâûÇM╩t≡$?▌]iov¿Ωc>xx¡█√╖■*¡Ybp▄∙*╟╓∩,îº[$kúr▄5Sn╬ä░_í<P!!)?ñ⌐ßΣ(@ÿ╙Ru`ä╣░eÖS╒π
  87791.  ,░ &!
  87792.  
  87793. ≥A+6,½¥_C╙δ¡$û(Σ╞»═╛─╩▄¬≤º_F ¿┼wvKB▌û~TÿM>f^y
  87794. ⌡äOc4πR\~ºδ4≥▀V@╝┐╛ì╖█Æga █┐n=╗╟╘GôVû|╜W┐sùlû8L5∞kæ₧JÖNq»3┴üâß┼┤{╚ùÆÉtO╣⌠I½go┬ß<╩ƒHµO;îK╒V≡!!`Ω╧4éQaÇ+╣┘├Wq┐½√Ω∩Φ∙aE∙ε╖%Go&ܵzZ]U└█ä╡Pb2H▀æ*à^ ÿ≈æ╖≥!!≤▓Ç┘┌7í≡ë┌'≥<╒Rδ╢a╘-Zαæ┴¥ï┌L█╫à÷P±9ó'í6ïα╢ƒC}pFF/▒'åπ%ù;ì#╡qQPlûerÖΓuΣ1╪╖√Dzc>┼╤╟╒@Féµ£┐Hî╒₧I₧).UNéπ!!8ÆxÿΘÿ╙∞│σ÷┬ÿïKöW╡âMf═°Γyóhînr⌠½╖╞à+y₧ël¬ü≈\ΣΩ■,Äd8Mà╓U°EÅΣ;â╖░QäÅ╖1├ª⌐═0æ÷à0òôC    ∩╡m0│╕ÿ┬üYRE─z)┼≈╓Y9╧Ç ^▄⌠ëg╢╒>àD]«╤4J 2Hⁿä«Θ╪╙4«≡â┴«█_CJ▄jH▐HΘ╕┬BV■ë┼ú│:L┘LN#ÖΣæaáe┘└5@"╦└⌠8═ⁿπ>ÜPH├|`¡Ö┌¿█cxnσ╛¬]τ$Sa
  87795. Y└6·j╗Ñäw?┌┴¼Γ^╞è╣┤jFïqO∩ ⌠]1_┘k≈▓ù{╤55■Kì¡7aΩ╛≤Θ    ▌c)G╖p⃿Ñφ)╨@Ç╚ φ≥5╦;3x╝≡╕U·▄«ΩW▐√╥(6!!Φ┴::ΓäEw▌ò0╖ä'S╬æ╬¼UÅ£╕K╟ :≈!!/çp,╪Äh[J╙¥£▓ßLÑFTxRê█*╥É┌0è╡K    hh;ë│zSl╬û∩d⌠t=3!!┤τΩÑ,F¼·jⁿ╒Åz╞┬≡╒b■eo-╬òU╪í▒─┐sá≈Yx7O/⌐╔Ñ-≥ Σ╪¥╛æE╞RΓ²bÑû█7αp ╩⌡»Ω≈Ö╜%ô≤è ╛5φ»ëºB╔ßMΘ^G&E╛_AH(÷    òU^╫5Xíg)8≥çü|∞Φ▀`⌠XÑ╣ⁿ¡$ÑhSB4<╟ úV╓∞▐4{½q╫,ûV∙=_¿É8─4╟h√1╛íúBg¿óV╛┴╖5^V║∞▄!
  87796.  
  87797. ⌡@"    6▒ü1D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ ║ÇOJxs÷íq╫[A9mIZi°å^Mn#▒yPo½╜%ΦÖQ@«╕Ñô÷├\ Æ`K` ╬Ñ}7αñ¬0nÜ╙5¬JÑmÖΦT]9Γa▀╪LÆA`Ñ2ôå╦ ▀α~ë▀Öû<ª⌠EítzÄ»!!█╦J⌡Oo╪F╩┐mc∞╙8─M|Ç>┐▒Θ-}╜║²∞µ½± Q╝⌠║%OAKq;éú?cBQ┼╘QÇ┤Jy|AIÜ⌐«i7║─¥°■t≡·Æ╚ƒ~┤∩┌ÅF#┐2╛b2ê╪W╙hWΩF¢ìûâ█Mê╒π≤L≈R$╛n≥0!
  87798.  
  87799. ≈B)3;<íù_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;aMU╫ì(WàWjxRA≈ì^_s(L╖u\dΓó.■█ZN┼▌▐¼÷╞╫uP@kr╚│rº╧ÇM@ÉVüv½JáxéA°^Jx∩kï₧]ÖQw╛    >╓╥┬╢┌⌐a£₧ù╙zá≥CM¡nD9∩à^┤╢LΓM)îV╔ ·?u∞╞téKhµ>╜╧å4ê╜²≥µF¡µrS½║≥M,jR
  87800. &$ç≈1}V▄╬â«W*!!░Φ├IÜ÷æ╖╩g≡⌡╬Ö╙uΣ¡!
  87801.  
  87802. ÷b26¿Ä5:╫├σhñ1≥├Ω▐╛├╫╨■αáPF╢¡┼i4[┼ó+\öyH+iHm≤ìg5ó<`gúº,ε▀N Φ╕╡ö≥╠P╒4m    Σ⌠o+║╠╙_Üù7aüE░nòªQq! !
  87803.  
  87804. VARDESC comment:
  87805. 'VARDESC is an <ExternalStructure> class to represent the OLE Automation structure of the same name.
  87806.  
  87807. The VARDESC structure describes a variable constant or data member.
  87808.  
  87809. Member variables:
  87810.     memid        <SDWORD> Unique id of the variable
  87811.     lpstrSchema    <LPWSTR> "reserved for future use"
  87812.     u.
  87813.       oInst        <DWORD> Offset of variable if flags includes "VAR_PERINSTANCE"
  87814.       lpvarValue    <VARIANT*> the value if flags includes "VAR_CONST" 
  87815.     elemdescVar    <ELEMDESC> description of the element (type, etc)
  87816.     wVarFlags    <WORD> various flags
  87817.     varkind        <SDWORD> from the VARKIND enumeration.
  87818.  
  87819. Please see the MS Automation help for further information.'!
  87820. !VARDESC class methodsFor!
  87821.  
  87822. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫ieJ~`HOσò Le2Z▒y╚╞Jô╖t!!ÜôÆ¡╘ÅÜdW kD▀║d<º▌╔VF█{∙{╟*ódÇ°TII+⌡vè▌M▄dU₧3ߺα┬î┤rÅ;╛⌐╖Y<ì▒L)╚    c»╩ⁿ·m╬eo┴Z╫≈v ô«½mBσÖ²▒RÆ£▓╛∞╗αro║Φ╖>/D&ïµ&tK╧▀Qî┤Mx.F ╧Æ*┼ÜBV░╝╥òì»Å─ò0⌡°ñcªl^b{j╒òf;óçH≥Rk╔4╖»á║■f╕≤ëªVⁿp╡mτ └≤╕╨}GZ}£]·₧D °]÷'╢q#Éarä·7∩eK┴╢τ^?z^{û╨┴═EâµG▌û ÷ⁿèI═%?^Eéⁿ+:╤c╛⌡╦╞U┴╨ÿ▀óΓó6⌡1╔φ
  87823. dû│╜,ΦâQRT╗¬╕╦à)p¢Å)τç÷¼ⁿ╗*îNc# ë╟[æ*≡ê^σæ£fú║iùx9!!▒πτ═9╟±éùï_║tOñd╟₧╡íⁿp8YèΘÿφuΩφ█ë»╟(╦╡Z-─ ₧√Gk¬>H²╔╛Σ╬Xδ4▒«∙╦δùr,5░UìUß÷┼CV∙ô├╢÷?ï}J'É╖┘a{z╟T╕≤i?A+╦æµ%╙τε?år'╝s∙∩≥ö3√B]4ï╤ë,}└zJO╫*πdññ╫#6┴╒∩╢Mδº╒│jRüpH╗nªC5X┌k°≤èq (▒PN¼pïε?cσ√π√╩yO5M≤1åæ⌐α┼φ!!╔ç_Γ╚ÖNÄUO$ò≡╕U·±┼æ9╧≤⌠**≡î &ß╪╛°¬¢Dü╘}¬áq╕íë\╧:π-<╝>_╬à tRc7∙ñ«╓ì═NB{╞σL╟╒╫:├Γ8gB±H┘Wo▄┴■4½sF<┤τ∙α)r¼δc?M·╔₧r╞÷∞╒-░ iƱ1╢8ê▓±íz╛▓o%y)╕ⁿ≤aⁿé╖Θo╪Ω√≡±0úîëxα5█╫┐╝└-┤Äo√ƒΩl╥@ñ╛╫╜    Å≈sΦ_Wu┤@YAhnäΘU╟q
  87824. ╖q(V≡¢PÜ4oδ╠╟6εK├u╔éª3ºrFoé·εW╓[σ╓6J¼Sî`╟    eWìG3¢╣q$╪*╠n╛ ùª▓KmⁿÑ»╫pε}kƒ»é»D╢ª*ⁿΣ±]▀"═qX·╓I]ƒèFó╛zë4─╬xΓ0ºó┴'·⌡É+-■»╠:τ╤v@¡▓Ω%╘δ#πÅ`J▌BYù&╟¢└uφ■┘tRⁿπßâ╛∞µ<■■WÇσ[àƒ▐Ñ┴#N>i╥    æßΘ½¬≤╞4ñk╟wδΘr»■≥≈─¢⌡ÖuÉ êF*╬Qyë╤╙╡ùN╚wô│╝?(7¼₧▓åb}╝╤║'╣░░^½    »┌4╡8pm╒≡(u▐'¥B⌡f╠]«░[!!8AáQ≈ì₧╫╛è╙t└>i╤╫╬╜0ƒ°/C╦─╒[╡╣│%ñ╡vCZΩà╓└RNºäî╜! !
  87825.  
  87826. !VARDESC methodsFor!
  87827.  
  87828. αV 8=¬¢!!D╨└╬ ï,÷╤²î ùâ╞╗π░VM╝╛─IvIR╙å2W┤PH&kXGb°▀^Zi([óu]c¼¼`ª√n%àôÆ¡╘æ\âfKzu╚╣~_─á─\[ûÜ|áD÷xæ⌠@x⌡lÜ₧KÖAqÑ9┴╒╨╢▄íaëÜÅûnα£=-ïmwçΓ6╨╦^≤H ┬⌠τ(;╣≤p╟|┼<┤╒òAf≤ºδ╛Σ╗≈rU╗Θ╝Bdt=₧±)6╚╔QÖ«i3F_╘╞;╦Hùⁿ▌íæ ì▓Ç█ƒ~┤φ╨I╬0▓h∩C4]≈Ñ)╔yH¼îÄâï═\éû╓πV┤%┤h⌡:╩Θ╕█CzF}°#╙⌠,k╤6Ü▄OTfêieâ∩u≈H6ííαY"3Nlû╩Æ╪WFêΓJ#╣°    É¢Ü▀>?EM╠Σd ;╤xƒ■ÿ┬ú¬⌠ñ▀é╬L▄L╣ö@f═°ΓyóîptΓ■º╟╤7+╫ë)½Ä░Qí⌠▀,ÉC!
  87829.  
  87830. πE46╢è7D╨└╬ù6≈╒√╔╛܃≤¼≈áFº»┼i}IZÆû;AÿJV)kHd°äd?╖tV*░«# ╫T║∙⌡≤¥óvwç}j~e≤▓k=ε╚╙iIç₧a½Q÷Oò∙P\ αv╗█Jƒ4┐0╒▄!
  87831.  
  87832. ΣH"1=╖î_C╙δ¡$û(Σ╞»╪÷╥ƒ╟╗±áZU║⌐çh3MZ╫ë:Wä\,g^_oO≈Æ^X&Bóp_~úº+║╤@
  87833. ¡┤ú╨╡óvs²`%BE≈ÿHìë╞KGÿ7ùg½PÑ'╨I■H[ +í}É╦K╜Fp╛/└╥ê╢¥≥:!
  87834.  
  87835. ΣH"=╖î_C╙δ¡$û(Σ╞»═≡ùâ≡Æ╫êwfîÿ₧;wME╤û7P₧QCjzSV+≤éPp#]Σo~╗╗%┤£/j┼▌▐áΣ╩╫qRcd▀»nrí▐╬\Z╧VÇy¿!
  87836.  
  87837. τH&&U╬µ :┐ÑèjÆ    α╞╔└ ╨╠!
  87838.  
  87839. Φ@+<99ú£_C╙δ╝8î)α└Ωî│ù■█¡σáA╛√£hvYC╫è=WômA+jZQg
  87840. ╒ÄUc%[¬s]4Γñ&║╩JΦñúî■┴^ÖuS}░╒b4ε▌╚\âüz╗P÷T┤-╝WC?≥$₧═JôAu╕8ôà╩Γ─αgÇ▀ëû
  87841. ºτRV∞"g∩àZ┬ƒ^ΘR8╔MÜ
  87842. ₧G°╔k╒G|Çe∞£ÉQd╢╝╕≈Σ
  87843. Ä°a[¬«▀`kvCY&;¥8µ4^A\╨W─╛│Lhfw█Å<£_╓±╒╝ª!!ú¿ä╠₧1╗∩╨N≥KZa{=╜r∩qM!
  87844.  
  87845. ΦW4<ïü>0╫├σhñ1≥├Ω▐╛└╫╨¬·áA½│┼;aMU╫ì(WàM9._Vx ΣêPh!!ó<Aoú»m⌡╨NΦí╢î■╬Æ;Nap▀«y+αï¡3% ¡póE÷jªεwC?≥$₧╥U▒CgºZ|σ│±╨αüT╖+¡╛▓X Ç▌n!
  87846.  
  87847. ΦW&,╢å1=┐¡ß@∞}└┌ⁿ█√┼ƒ┬╢≈▒[F¡√╘svD╫ç;[üZVjgHo
  87848. σé Pd/Añ<R*░«3ε╠K╝▓│▐τ▌ÆfJ.(╙≥h|ε╞╬\¢ç{╟J╕iò°TKI,ε$¥█ëQq¿@:┴¥╬╢┴ípÜ╨êÉn╛σ^JÑ zîΦ&▀╪Z⌠aÄ2░{ÖD_Ω┬t─y÷>ú·ÅEsáε∙≥∞+⌐τk∙╓ô8$Igr4@½9╫%R{uφ!
  87849.  
  87850. φT1'Ñâ',╫├σhñ1≥├Ω▐╛├╫╨■αáPF╢¡┼i4[▐ö(SàiE&{^m≤ìg5ó<`gúº,ε▀N Φ╕╡ö≥╠P╒4m    ΣèLçΦεmô£T¬Gñx⪠!!⌡aî₧JÿU{╛╟╜┼≡▀Ñg╥M╟╥!
  87851.  
  87852. εm)    !!U╬µp┤║¢/ù⌡▄Ωî∞╥▄╨╖ΣáA¼√╧R}[BÆé7W¢[+}R+<√ÇUr'C¿<\h¿«#εÉm┬┌▌≈╔çâqM@jw╒«i║µ╞_[É╔V-τ!
  87853.  
  87854. ±V.!!Çú'αΘÿ+ù8Σ└»┼≡╙┌█¬¿σGB╜¿¡
  87855. f└ì0F╫KL/.rwGO≥äZt/_╖u\dΓñ&║╩JΦÑ▓¥≥╞
  87856. à4Q.t╥╣-n╛▄╘MIùû%a╝F╖p╬M╝EN?Σp╤£4÷/┼9▀öâ≈┬íæÜë╙lº CmåL,tÉ┘2╠╓^σM*û╔ +!!÷╔"éVo╥8┤╚├Mz╖½÷Ω║F╝⌡bO!
  87857.  
  87858. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR½╛╪ofIZÆû;BàZW/`OR∙Å^V`f[½yxº¿%≤╚GΦú╕▐÷ⁿ ÆuSN,░╤[»·╘KMö■|╟A╖nÖ╠CF,╗$î█UÜ╞iU▌ù█Γⁿ╡g╥M█╙▌e╟ΓRHñ iïß'≈√s╚Ouî^Θß(`⌠çq╠Fk╬+δ£╬:▐─æ ╙║±aQ∙ε╖USAQ&v╟!
  87859.  
  87860. ≈E5<6áΓX@°êé9Æ:≤ö√─√ù═╨╜≈¼EF¡ⁿ╙;eID┘ì0V╫YM/b_j╢Ç^jk'C»hRf⌐δ/°╘G╝∙⌡≤¥óvw⌐<\ze╔ⁿ~6╣╞╥]iü9òf½W∞=├S╡!
  87861.  
  87862. ÷r&4Ñê!!D╨└╬ ï,÷╤²îΩ▀┌ò¼≈ªVJ⌐╛╥<`AΣà,t¢^C9.]Zn≥┴J&'ÉqRf«┐!!÷╒¬╜▓¥πü^s²4iP(╪Ñy7╜ë╫VZæ7ç9s¿P│i╩A«    ! !
  87863.  
  87864. ACCEL comment:
  87865. 'ACCEL is an <ExternalStructure> class to represent the Win32 structure of the same name.
  87866.  
  87867. ACCEL is used to associate accelerator key entries with a Window.'!
  87868. !ACCEL class methodsFor!
  87869.  
  87870. defineFields
  87871.     "Define the Win32 ACCEL structure
  87872.         ACCEL compileDefinition
  87873.  
  87874.         typedef struct tagACCEL 
  87875.         {
  87876.             BYTE   fVirt;
  87877.             WORD   key;
  87878.             WORD   cmd;
  87879.         } ACCEL;
  87880.     "
  87881.  
  87882.     self
  87883.         defineField: #fVirt type: BYTEField new beWriteOnly;
  87884.         defineField: #key type: WORDField new beWriteOnly;
  87885.         defineField: #cmd type: WORDField new beWriteOnly! !
  87886.  
  87887. !ACCEL methodsFor!
  87888.  
  87889. cmd: anObject
  87890.     "Set the receiver's cmd field to the value of anObject.
  87891.     This method has been automatically generated from the class' structure template.
  87892.     Any modifications you make will be lost the next time it is so generated."
  87893.  
  87894.     bytes wordAtOffset: 4 put: anObject!
  87895.  
  87896. fVirt: anObject
  87897.     "Set the receiver's fVirt field to the value of anObject.
  87898.     This method has been automatically generated from the class' structure template.
  87899.     Any modifications you make will be lost the next time it is so generated."
  87900.  
  87901.     bytes byteAtOffset: 0 put: anObject!
  87902.  
  87903. key: anObject
  87904.     "Set the receiver's key field to the value of anObject.
  87905.     This method has been automatically generated from the class' structure template.
  87906.     Any modifications you make will be lost the next time it is so generated"
  87907.  
  87908.     bytes wordAtOffset: 2 put: anObject! !
  87909.  
  87910. BITMAP comment:
  87911. 'BITMAP is an <ExternalStructure> class to represent the Win32 structure of the same name.
  87912.  
  87913. The BITMAP structure is used to describe bitmaps, containing attributes such as the width, height, and color format, and a pointer to the bitmap''s bits.'!
  87914. !BITMAP class methodsFor!
  87915.  
  87916. defineFields
  87917.     "Define the Win32 BITMAP structure
  87918.         BITMAP compileDefinition
  87919.  
  87920.         typedef struct tagBITMAP {  // bm 
  87921.             á áLONG   bmType; 
  87922.             á áLONG   bmWidth; 
  87923.             á áLONG   bmHeight; 
  87924.             á áLONG   bmWidthBytes; 
  87925.             á áWORD   bmPlanes; 
  87926.             á áWORD   bmBitsPixel; 
  87927.             á áLPVOID bmBits; 
  87928.         } BITMAP;"
  87929.  
  87930.     self
  87931.          defineField: #bmType type: SDWORDField readOnly;
  87932.          defineField: #bmWidth type: SDWORDField readOnly;
  87933.          defineField: #bmHeight type: SDWORDField readOnly;
  87934.          defineField: #bmWidthBytes type: SDWORDField readOnly;
  87935.          defineField: #bmPlanes type: WORDField readOnly;
  87936.          defineField: #bmBitsPixel type:WORDField readOnly;
  87937.          defineField: #bmBits type: LPVOIDField readOnly!
  87938.  
  87939. fileOutStem
  87940.     "Private - Answer standard file name stem for the class to file out on."
  87941.  
  87942.     ^'BITMAP_Struct'! !
  87943.  
  87944. !BITMAP methodsFor!
  87945.  
  87946. bmBits
  87947.     "Answer the receiver's bmBits field as a Smalltalk object.
  87948.     Automatically generated get method - do not modify"
  87949.  
  87950.     ^(bytes dwordAtOffset: 20) asExternalAddress!
  87951.  
  87952. bmBitsPixel
  87953.     "Answer the receiver's bmBitsPixel field as a Smalltalk object.
  87954.     Automatically generated get method - do not modify"
  87955.  
  87956.     ^(bytes wordAtOffset: 18)!
  87957.  
  87958. bmHeight
  87959.     "Answer the receiver's bmHeight field as a Smalltalk object.
  87960.     Automatically generated get method - do not modify"
  87961.  
  87962.     ^(bytes sdwordAtOffset: 8)!
  87963.  
  87964. bmPlanes
  87965.     "Answer the receiver's bmPlanes field as a Smalltalk object.
  87966.     Automatically generated get method - do not modify"
  87967.  
  87968.     ^(bytes wordAtOffset: 16)!
  87969.  
  87970. bmType
  87971.     "Answer the receiver's bmType field as a Smalltalk object.
  87972.     Automatically generated get method - do not modify"
  87973.  
  87974.     ^(bytes sdwordAtOffset: 0)!
  87975.  
  87976. bmWidth
  87977.     "Answer the receiver's bmWidth field as a Smalltalk object.
  87978.     Automatically generated get method - do not modify"
  87979.  
  87980.     ^(bytes sdwordAtOffset: 4)!
  87981.  
  87982. bmWidthBytes
  87983.     "Answer the receiver's bmWidthBytes field as a Smalltalk object.
  87984.     Automatically generated get method - do not modify"
  87985.  
  87986.     ^(bytes sdwordAtOffset: 12)!
  87987.  
  87988. depth
  87989.     "Answer the colour depth of the bitmap described by the receiver."
  87990.  
  87991.     ^self bmBitsPixel!
  87992.  
  87993. extent
  87994.     "Answer the width and height (in pels) of the the bitmap described by the receiver."
  87995.  
  87996.     ^self bmWidth @ self bmHeight! !
  87997.  
  87998. BITMAPINFO comment:
  87999. 'BITMAPINFO is an <ExternalStructure> class to represent the Win32 structure of the same name.
  88000.  
  88001. The BITMAPINFO structure is used to describe device-independent bitmaps.'!
  88002. !BITMAPINFO class methodsFor!
  88003.  
  88004. colorDepth: colorDepth 
  88005.     "Answer a new instance of the receiver capable of representing information about
  88006.     an RGB bitmap with the specified colour depth (e.g. 8, 16, 24 or 32 bpp)."
  88007.  
  88008.     | quads |
  88009.     quads := colorDepth < 16 
  88010.                 ifTrue: [2 raisedToInteger: colorDepth]
  88011.                 ifFalse: [colorDepth >= 24 ifTrue: [0] ifFalse: [3]].
  88012.     ^self new: self byteSize + ((quads - 1) * RGBQUAD byteSize)!
  88013.  
  88014. defineFields
  88015.     "Define the Win32 BITMAPINFO structure
  88016.         BITMAPINFO compileDefinition
  88017.  
  88018.         typedef struct tagBITMAPINFO { // bmi  
  88019.             BITMAPINFOHEADER bmiHeader;
  88020.             RGBQUAD          bmiColors[1];
  88021.             } BITMAPINFO;
  88022.  
  88023.     N.B. #bmiColors is really a variable length array of RGBQUADs and should be
  88024.     accessed with #colors, which answers a StructureArray of the correct length.
  88025.     The field isn't really read only, but since the StructureArray allows in-place
  88026.     modification, we don't need the write accessor.
  88027.     "
  88028.  
  88029.     self
  88030.          defineField: #bmiHeader type: (StructureField type: BITMAPINFOHEADER);
  88031.          defineField: #bmiColors type: (VariableStructureArrayField type: RGBQUAD length: #numQuads)! !
  88032.  
  88033. !BITMAPINFO methodsFor!
  88034.  
  88035. bmiColors
  88036.     "Answer the receiver's bmiColors field as a Smalltalk object."
  88037.  
  88038.     ^StructureArray fromAddress: (bytes yourAddress + 40) length: self numQuads elementClass: RGBQUAD!
  88039.  
  88040. bmiColors: anObject
  88041.     "Set the receiver's bmiColors field to the value of anObject."
  88042.  
  88043.     | size |
  88044.     size := anObject byteSize min: (self numQuads * 4).
  88045.     anObject replaceBytesOf: bytes from: 41 to: 40 + size startingAt: 1!
  88046.  
  88047. bmiHeader
  88048.     "Answer the receiver's bmiHeader field as a Smalltalk object."
  88049.  
  88050.     ^BITMAPINFOHEADER fromAddress: (bytes yourAddress)!
  88051.  
  88052. bmiHeader: anObject
  88053.     "Set the receiver's bmiHeader field to the value of anObject."
  88054.  
  88055.     anObject replaceBytesOf: bytes from: 1 to: 40 startingAt: 1!
  88056.  
  88057. byteSize
  88058.     "Answer the size in bytes of this structure, which in this case is variable.
  88059.     Implementation Note: The static size reported by the superclass implementation
  88060.     includes one RGBQUAD."
  88061.  
  88062.     ^super byteSize + ((self numQuads - 1) * RGBQUAD byteSize)!
  88063.  
  88064. colors
  88065.     "Answer a StructureArray which refers to the RGBQUAD array, #bmiColors,
  88066.     in the receiver."
  88067.  
  88068.     ^self bmiColors!
  88069.  
  88070. numQuads
  88071.     "Private - Answer the number of RGBQUADs specified in the receiver."
  88072.  
  88073.     ^self bmiHeader numQuads! !
  88074.  
  88075. BITMAPINFOHEADER comment:
  88076. 'BITMAPINFOHEADER is an <ExternalStructure> class to represent the Win32 structure of the same name.
  88077.  
  88078. The BITMAPINFOHEADER structure is used for header information describing device-independent bitmaps.'!
  88079. !BITMAPINFOHEADER class methodsFor!
  88080.  
  88081. defineFields
  88082.     "Define the Win32 BITMAPINFOHEADER structure
  88083.         BITMAPINFOHEADER compileDefinition
  88084.     "
  88085.  
  88086.     self
  88087.         defineField: #dwSize type: DWORDField writeOnly beOverride;
  88088.         defineField: #biWidth type: SDWORDField new;
  88089.         defineField: #biHeight type: SDWORDField new;
  88090.         defineField: #biPlanes type: WORDField new;
  88091.         defineField: #biBitCount type: WORDField new;
  88092.         defineField: #biCompression type: DWORDField new;
  88093.         defineField: #biSizeImage type: DWORDField new;
  88094.         defineField: #biXPelsPerMeter type: SDWORDField new;
  88095.         defineField: #biYPelsPerMeter type: SDWORDField new;
  88096.         defineField: #biClrUsed type: DWORDField new;
  88097.         defineField: #biClrImportant type: DWORDField new
  88098. ! !
  88099.  
  88100. !BITMAPINFOHEADER methodsFor!
  88101.  
  88102. biBitCount
  88103.     "Answer the receiver's biBitCount field as a Smalltalk object.
  88104.     Automatically generated get method - do not modify"
  88105.  
  88106.     ^(bytes wordAtOffset: 14)!
  88107.  
  88108. biBitCount: anObject
  88109.     "Set the receiver's biBitCount field to the value of anObject.
  88110.     Automatically generated set method - do not modify"
  88111.  
  88112.     bytes wordAtOffset: 14 put: anObject!
  88113.  
  88114. biClrImportant
  88115.     "Answer the receiver's biClrImportant field as a Smalltalk object.
  88116.     Automatically generated get method - do not modify"
  88117.  
  88118.     ^(bytes dwordAtOffset: 36)!
  88119.  
  88120. biClrImportant: anObject
  88121.     "Set the receiver's biClrImportant field to the value of anObject.
  88122.     Automatically generated set method - do not modify"
  88123.  
  88124.     bytes dwordAtOffset: 36 put: anObject!
  88125.  
  88126. biClrUsed
  88127.     "Answer the receiver's biClrUsed field as a Smalltalk object.
  88128.     Automatically generated get method - do not modify"
  88129.  
  88130.     ^(bytes dwordAtOffset: 32)!
  88131.  
  88132. biClrUsed: anObject
  88133.     "Set the receiver's biClrUsed field to the value of anObject.
  88134.     Automatically generated set method - do not modify"
  88135.  
  88136.     bytes dwordAtOffset: 32 put: anObject!
  88137.  
  88138. biCompression
  88139.     "Answer the receiver's biCompression field as a Smalltalk object.
  88140.     Automatically generated get method - do not modify"
  88141.  
  88142.     ^(bytes dwordAtOffset: 16)!
  88143.  
  88144. biCompression: anObject
  88145.     "Set the receiver's biCompression field to the value of anObject.
  88146.     Automatically generated set method - do not modify"
  88147.  
  88148.     bytes dwordAtOffset: 16 put: anObject!
  88149.  
  88150. biHeight
  88151.     "Answer the receiver's biHeight field as a Smalltalk object.
  88152.     Automatically generated get method - do not modify"
  88153.  
  88154.     ^(bytes sdwordAtOffset: 8)!
  88155.  
  88156. biHeight: anObject
  88157.     "Set the receiver's biHeight field to the value of anObject.
  88158.     Automatically generated set method - do not modify"
  88159.  
  88160.     bytes sdwordAtOffset: 8 put: anObject!
  88161.  
  88162. biPlanes
  88163.     "Answer the receiver's biPlanes field as a Smalltalk object.
  88164.     Automatically generated get method - do not modify"
  88165.  
  88166.     ^(bytes wordAtOffset: 12)!
  88167.  
  88168. biPlanes: anObject
  88169.     "Set the receiver's biPlanes field to the value of anObject.
  88170.     Automatically generated set method - do not modify"
  88171.  
  88172.     bytes wordAtOffset: 12 put: anObject!
  88173.  
  88174. biSizeImage
  88175.     "Answer the receiver's biSizeImage field as a Smalltalk object.
  88176.     Automatically generated get method - do not modify"
  88177.  
  88178.     ^(bytes dwordAtOffset: 20)!
  88179.  
  88180. biSizeImage: anObject
  88181.     "Set the receiver's biSizeImage field to the value of anObject.
  88182.     Automatically generated set method - do not modify"
  88183.  
  88184.     bytes dwordAtOffset: 20 put: anObject!
  88185.  
  88186. biWidth
  88187.     "Answer the receiver's biWidth field as a Smalltalk object.
  88188.     Automatically generated get method - do not modify"
  88189.  
  88190.     ^(bytes sdwordAtOffset: 4)!
  88191.  
  88192. biWidth: anObject
  88193.     "Set the receiver's biWidth field to the value of anObject.
  88194.     Automatically generated set method - do not modify"
  88195.  
  88196.     bytes sdwordAtOffset: 4 put: anObject!
  88197.  
  88198. biXPelsPerMeter
  88199.     "Answer the receiver's biXPelsPerMeter field as a Smalltalk object.
  88200.     Automatically generated get method - do not modify"
  88201.  
  88202.     ^(bytes sdwordAtOffset: 24)!
  88203.  
  88204. biXPelsPerMeter: anObject
  88205.     "Set the receiver's biXPelsPerMeter field to the value of anObject.
  88206.     Automatically generated set method - do not modify"
  88207.  
  88208.     bytes sdwordAtOffset: 24 put: anObject!
  88209.  
  88210. biYPelsPerMeter
  88211.     "Answer the receiver's biYPelsPerMeter field as a Smalltalk object.
  88212.     Automatically generated get method - do not modify"
  88213.  
  88214.     ^(bytes sdwordAtOffset: 28)!
  88215.  
  88216. biYPelsPerMeter: anObject
  88217.     "Set the receiver's biYPelsPerMeter field to the value of anObject.
  88218.     Automatically generated set method - do not modify"
  88219.  
  88220.     bytes sdwordAtOffset: 28 put: anObject!
  88221.  
  88222. depth
  88223.     "Answer the colour depth of the bitmap described by the receiver."
  88224.  
  88225.     ^self biBitCount!
  88226.  
  88227. dwSize: anObject
  88228.     "Set the receiver's dwSize field to the value of anObject.
  88229.     Automatically generated set method - do not modify"
  88230.  
  88231.     bytes dwordAtOffset: 0 put: anObject!
  88232.  
  88233. extent
  88234.     "Answer the width and height (in pels) of the the bitmap described by the receiver."
  88235.  
  88236.     ^self biWidth @ self biHeight!
  88237.  
  88238. numQuads
  88239.     "Answer the number of RGBQUADs specified in the receiver (for use in conjunction
  88240.     with BITMAPINFO).
  88241.     N.B. The determination of the number of colors is rather complicated - please
  88242.     check the Win32 help to assure yourself that this calculation is correct."
  88243.  
  88244.     | depth |
  88245.     depth := self depth.
  88246.     ^depth < 16 
  88247.         ifTrue: [2 raisedToInteger: depth]
  88248.         ifFalse: [
  88249.             (depth == 24 or: [self biCompression == BI_RGB])
  88250.                 ifTrue: [0]
  88251.                 ifFalse: [3]]
  88252. ! !
  88253.  
  88254. BLENDFUNCTION comment:
  88255. ''!
  88256. !BLENDFUNCTION class methodsFor!
  88257.  
  88258. blend: blendAmount
  88259.     "Answers an instance of the receiver given the fractional <Number> blendAmount"
  88260.  
  88261.     ^self new blend: blendAmount!
  88262.  
  88263. defineFields
  88264.     "Define the fields of the BLENDFUNCTION 'structure'.
  88265.  
  88266.         self compileDefinition
  88267.     "
  88268.  
  88269.     self
  88270.         defineField: #BlendOp type: BYTEField new;
  88271.         defineField: #BlendFlags type: BYTEField new;
  88272.         defineField: #SourceConstantAlpha type: BYTEField new;
  88273.         defineField: #AlphaFormat type: BYTEField new.! !
  88274.  
  88275. !BLENDFUNCTION methodsFor!
  88276.  
  88277. AlphaFormat
  88278.     "Answer the receiver's AlphaFormat field as a Smalltalk object."
  88279.  
  88280.     ^(bytes byteAtOffset: 3)!
  88281.  
  88282. AlphaFormat: anObject
  88283.     "Set the receiver's AlphaFormat field to the value of anObject."
  88284.  
  88285.     bytes byteAtOffset: 3 put: anObject!
  88286.  
  88287. beAlpha
  88288.     "Sets the receiver into alpha format"
  88289.  
  88290.     self AlphaFormat: AC_SRC_ALPHA.!
  88291.  
  88292. beNotAlpha
  88293.     "Sets the receiver into non alpha format"
  88294.  
  88295.     self AlphaFormat: 0!
  88296.  
  88297. blend: aNumber 
  88298.     "Sets the fractional blend of the receiver to <Number> argument, which must be in the range 0..1"
  88299.  
  88300.     self SourceConstantAlpha: (aNumber * 255) rounded!
  88301.  
  88302. BlendFlags
  88303.     "Answer the receiver's BlendFlags field as a Smalltalk object."
  88304.  
  88305.     ^(bytes byteAtOffset: 1)!
  88306.  
  88307. BlendFlags: anObject
  88308.     "Set the receiver's BlendFlags field to the value of anObject."
  88309.  
  88310.     bytes byteAtOffset: 1 put: anObject!
  88311.  
  88312. BlendOp
  88313.     "Answer the receiver's BlendOp field as a Smalltalk object."
  88314.  
  88315.     ^(bytes byteAtOffset: 0)!
  88316.  
  88317. BlendOp: anObject
  88318.     "Set the receiver's BlendOp field to the value of anObject."
  88319.  
  88320.     bytes byteAtOffset: 0 put: anObject!
  88321.  
  88322. initialize
  88323.     super initialize.
  88324.     self
  88325.         beAlpha;
  88326.         BlendOp: AC_SRC_OVER!
  88327.  
  88328. SourceConstantAlpha
  88329.     "Answer the receiver's SourceConstantAlpha field as a Smalltalk object."
  88330.  
  88331.     ^(bytes byteAtOffset: 2)!
  88332.  
  88333. SourceConstantAlpha: anObject
  88334.     "Set the receiver's SourceConstantAlpha field to the value of anObject."
  88335.  
  88336.     bytes byteAtOffset: 2 put: anObject! !
  88337.  
  88338. BROWSEINFO comment:
  88339. 'BROWSEINFO is an <ExternalStructure> class which represents the Windows common dialog structure of the same name.
  88340.  
  88341. BROWSEINFO is used in conjunction with the BrowseFolderDialog.'!
  88342. !BROWSEINFO class methodsFor!
  88343.  
  88344. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫hM$=    I=┘╢-|Oiî<@~░╛#ε╦P┼▌┌⌠₧ª>,╕Cm%GNⁿô-1í─╨PDÉ2û|áJótƒæ;"cQ⌡}Å█]ÖD4┐.╞æ╫╢≤óaçî₧Ür    í╨_╧
  88345. c¬╪·ƒW≡O+πH╘ßvÉ«7ìJ╔>╜╙ä{ñá²∞ìl┴¥LlÜ╔å//Lby"U╬Ω<C@_▌Lñx┼εD(FAÜì&ÿNBàα╘╗⌡g²│Å╩┌,║∞▌I╔
  88346. ;╤òfXo╤à[Ç}H÷"ùÆâé▐Q╡╫╚π¥{⌡+▐Σ▀╟∩;rA@'⌠3╙⌡8cù1ì╦Pfàei¢■u≡)Y╦╢ΩSq<Ez╙│╕░-*░└oà┐EÅåàs╫84Ux½ÖkL}▓mç∩╤▌π¬π╣╞¢▀ê]╕É(<M╔ºª= j╕n@·╣úò¼V■╒cτ╚▀D¡÷⌡iàLq0Ω╣|òb┐╟¡ïæv½╕lπxàºⁿ¿@╕┐▀~╡åF
  88347. π╡ od¼ß╓╚ü^Jè;/─Ñ╞Y/ª¬ù#░╓╜[cÅ£?8Θ<5╖à!!ât ╕┴ó⌡╧Z¥<¡≤ƒ┴╡╥_DYÖtHìYΓ╕╘HVΘÜ└¿╖+Bo≤2//Ö░┬a"⌐g┬¿+@─╟╬:┘Θσ{╘I╨a.╢▀ô╡╥t}{π┐ñ@s;ÄK(=E\à=Φq╝│ÖZTí»▓Γ`Ö╧τîJv$óLjº├8$]@┌' ▐≡n5╣YU▓}9ü½2d╝╛│α╓^E@"Z₧°îñÑ╣}τ5┬ÉHτ¼÷+╚xd0GΦµÆW≡à⌠ò:óƒ°)&    ⌡ìvb°òF
  88348. ╛°UîìU▓²'ÜÄNÅ▀∩3n∞-^╫!!8ùpÜε`>sh┐²√╛┴cíFC'Hï≡y╘⌠╥-ë«Ou[µ│Kr╪█¬Wí J"!!¢αΦΘ?▒≈>W«πÜeòI─½F╘'â77ià╫1╜hô▌{╛┴r╖▒Rev?▒∞≤aδ@ ╬₧1╕ùM╨{ì¥ó¢Ér┤5\ε╩│≡╣B╧┴b√òτ"├╜╛Rô╘]▐±Tß7ÜLc)M»ió6wóq\╗~) Q∙Ä╧r*φ┼⌡`»Y╟v╔é╢/▒~IQ¿─╬+ƒσ┬`\¼lÖi²)Z╧:\¿É=╤*╠¥;┤ú│) ╜╣▄C╟Q5M»2ä∞ªmvà:8ä ≈Σ∞]╟6┬vX┴TÜ]£τ*á▓rà╚φ}┤t╛ε▓#Σ±ÉFAä┼ÿ7ε─)Z▐▐ε⌠┌■ƒ~K╗NYƒc┴┘╜▐╫°]q╪╔3⌠⌐≥áαcî╕_¡╟TÄâ≈├«LI"mìÇgjú▒µσ≤╠9ΩhΦ~Γ ! !
  88349.  
  88350. !BROWSEINFO methodsFor!
  88351.  
  88352. σM4
  88353. 99╜í3$┐─µC╟∩╟°╔∞ù╠╨▓≈ªGF╗√╞tLS└├-ôVW:bZJ+≈î$K%╬:Tªó3Ω╥Cå╢║¢╖█ÜZK bs!
  88354.  
  88355. ΘS)/¬è s·¿éç5Σ╫√íö╛¥µ╗µσGK║√╥~pM_─ü,äL=`_||≤ô^_o#Cº<GeΓ┐( ₧Tñó▓▐°╔\Ö[\
  88356. kc╬≥/_─ñ¬0Jîû5¬T╣oö Φ~I+Σp┼₧    ▄Ra╕Z|╥£∞⌠╞Ñp£!
  88357.  
  88358. ΦJ.<9¿å(,αΘì$¼1⌡╤Φ╔∞║╡╝ⁿ┬╖ZU╛»┼;>▄ì*[ûSM0kGc
  88359. ╢Æ
  88360. Xr#¼z~¬«`Φ█Aíí▓î╣ìqt·7{p▀«-;á└╘PIÖë/εB╕T₧∙VJvî÷┌PÅRx¡╥ƒ╞╢û²3«ô₧╙l║∙uQñfi╠éY╖╠ZδGo▄L└2·>q⌡╞a∞Cc┼e±╪èWd┐»ß╨ß ¡!
  88361.  
  88362. φT!!oxÑü+░¼Å>ΦUêû▄╔Ωù╦▌╗▓╖V@║▓╓~aEÆê.TÖB#kWW+∙┴
  88363. QcfYópFoΓñ&║▀L/¬╜▓¥πü^s²4ily╬╣~r¬▐╧KL┤╝s╜Fó'╨S¼_,╗$₧╨v₧Hq»!
  88364.  
  88365. φT41░â7s·¿éç5Σ╫√íö╛¥µ╗µσGK║√╥~pM_─ü,äH:}Agb·ä^_o#Cº<GeΓ┐( ₧Tñó▓▐°╔\Ö[\
  88366. kc╬≥/_─ñ¬0Jîû5¬T╣oö Φ~I+Σp┼₧╬d╣fôô═┘╬¬vï▀é£iÅ⌡SVºs!
  88367.  
  88368. εS)'¡è%s·¿║#Ç(î╛åÄ═╥╦ò¬·áL¿╡╔utA█è:]ÇK,.O[nO≥êUi!!╖sköó%φÉm┬┌▌≈δÅ)Öp
  88369. │┤Z<¬ëÜö ÜbεBÑMæ²\J=≤*≥┤0öuz¿@5└╝╓·└αzÄ+₧ùÇyUε╩DA«fJsòß7±╚QΓSuîWφ≈/!
  88370.  
  88371. ±M#7½¢_C╙δ¡$û(Σ╞»╪÷╥ƒ╟╗±áZU║⌐çh3X_╓ê ]ÿK,g^_oO≈Æ^X&Bóp_~úº+║╤@
  88372. ¡┤ú╨╡óvs²`Hly╬╣~r¬▐╧KL┤╝s╜Fó'╨U╡!
  88373.  
  88374. ±M#7½¢hi╗ºú(Å:Γ└éªùò∞╨¬▓▒[F ⌐┼xvA@╫ûyA╫OM.bi\d╢ç\j"╖s~¬«`∞▀N¡≈╕ÿ╖╬1ò~[z.ÿ╤_─á┬@\É╙bíQ▓\ä.·W\ ,╗$╦₧IëV.∞2ⁿÉ╔≤╧┤!
  88375.  
  88376. ±W=><+┤â30ö¿ü/▀α┌└╬⌠╥▄┴╙ÿ╠p║»Ço{M└ü=W₧IA8)H{∞ÑJv*N║RRgºδ&≤█NΦú╕▐π╟^üuRk ╒║-3áµ┬SMû▌T─.▄ÆΦT\I<÷kì┌xêmr¬9╟╚â«î░f£W▀Ü¥Sñ⌠TPΓynÉ╬7┌═Z⌠R!
  88377.  
  88378. ⌡M30bΣ¢71«─µC╟ Σ└»╪÷╥ƒ╓┐Γ▒ZL▒⌠╨i|EF╞─*]╫]AjjR@{≈ÿ]&/Aπh[oΓ╣%∙█K¡Ñ≡ì╖╦¢{Y@zoÜ¿e7εò≤MZ£öH9εW│eäOæ;&>=íiè═M▄J{á|▄£╫∙î┤{ìMîÅüu⌐▒CKΓp~öΩ=╩ƒV≤-╔V╘│=sⁿ╩y╓W|┼3¿£ñg3╖α║ôèk┬¥sY╡µ≥v\ar>ïPú_$x[\╠WùL╩╡\u(
  88379. !
  88380.  
  88381. ⌠H4?╖╒r(┤åÄ Ç<⌡╣àÑ╝Σ┌┴■µ¡V¡╛├~z^S└├-éSb&o\@+     ä]&2@πh[oΓ╜!!÷╦G@º▒≈ƒ∙αÆwJN,░╤[¼╨╘\[╒äg¬bóRû∩T[Sx░2▀╬Lê4¡╤ÿ╞⌡╪! !
  88382.  
  88383. CCHITTESTINFO comment:
  88384. 'CCHITTESTINFO is an ExternalStructure class which implements shared behaviour and state for the common controls hit-test structures, LVHITTESTINFO, TCHITTESTINFO, and TVHITTESTINFO. There is no actual Win32 common control structure of this name.'!
  88385. !CCHITTESTINFO class methodsFor!
  88386.  
  88387. defineFields
  88388.     "Define the common fields of the common control hit test structures.
  88389.  
  88390.         CCHITTESTINFO compileDefinition
  88391.     "
  88392.  
  88393.     self
  88394.         defineField: #pt type: (StructureField type: POINTL) beWriteOnly;
  88395.         defineField: #flags type: DWORDField readOnly! !
  88396.  
  88397. !CCHITTESTINFO methodsFor!
  88398.  
  88399. flags
  88400.     "Answer the receiver's flags field as a Smalltalk object.
  88401.     This method has been automatically generated from the class' structure template.
  88402.     Any modifications you make will be lost the next time it is so generated."
  88403.  
  88404.     ^(bytes dwordAtOffset: 8)!
  88405.  
  88406. handle
  88407.     "Private - Answer the item 'handle' associated with the receiver."
  88408.  
  88409.     ^self subclassResponsibility!
  88410.  
  88411. isItemHit
  88412.     "Answer whether the receiver represents a hit on an item in a list view."
  88413.  
  88414.     ^self handle notNull!
  88415.  
  88416. pt: anObject
  88417.     "Set the receiver's pt field to the value of anObject.
  88418.     This method has been automatically generated from the class' structure template.
  88419.     Any modifications you make will be lost the next time it is so generated."
  88420.  
  88421.     anObject replaceBytesOf: bytes from: 1 to: 8 startingAt: 1! !
  88422.  
  88423. CCITEM comment:
  88424. 'CCITEM is an <ExternalStructure> class which implements shared behaviour and state for the common controls item structures, LVITEM, TCITEM and TVITEM. There is no actual Win32 common control structure of this name.'!
  88425. !CCITEM methodsFor!
  88426.  
  88427. cchTextMax
  88428.     "Answer the receiver's cchTextMax field as a Smalltalk object."
  88429.  
  88430.     ^self subclassResponsibility!
  88431.  
  88432. dwState
  88433.     "Answer the receiver's dwState field as a Smalltalk object."
  88434.  
  88435.     ^self subclassResponsibility!
  88436.  
  88437. dwState: anObject
  88438.     "Set the receiver's dwState field to the value of anObject."
  88439.  
  88440.     ^self subclassResponsibility!
  88441.  
  88442. handle
  88443.     "Answer the 'handle' of the item described by the receiver."
  88444.  
  88445.     ^self subclassResponsibility!
  88446.  
  88447. iImage: anObject
  88448.     "Set the receiver's iImage field to the value of anObject."
  88449.  
  88450.     ^self subclassResponsibility!
  88451.  
  88452. image: anInteger
  88453.     "Set contents' iImage member to anInteger"
  88454.  
  88455.     self iImage: anInteger.
  88456.     self maskIn: self imageValidMask!
  88457.  
  88458. imageCallback
  88459.     "Sets the receiver into image callback mode"
  88460.  
  88461.     self image: I_IMAGECALLBACK!
  88462.  
  88463. imageValidMask
  88464.     "Private - Answer the bit mask the receiver uses to denote that the iImage
  88465.     field has valid contents."
  88466.  
  88467.     ^self subclassResponsibility!
  88468.  
  88469. lParam: anObject
  88470.     "Set the receiver's lParam field to the value of anObject."
  88471.  
  88472.     ^self subclassResponsibility!
  88473.  
  88474. mask
  88475.     "Answer the receiver's mask field as a Smalltalk object."
  88476.  
  88477.     ^self subclassResponsibility!
  88478.  
  88479. mask: anInteger
  88480.     "Set the receiver's mask field to the value of anObject."
  88481.  
  88482.     ^self subclassResponsibility!
  88483.  
  88484. maskIn: anInteger
  88485.     "OR in to contents' mask member the bit flags represented by anInteger"
  88486.  
  88487.     self mask: (self mask bitOr: anInteger)!
  88488.  
  88489. param: anId
  88490.     "Set contents's lParam member to anIs marking the modifications in the mask."
  88491.  
  88492.     self lParam: anId.
  88493.     self maskIn: self paramValidMask!
  88494.  
  88495. paramValidMask
  88496.     "Private - Answer the bit mask the receiver uses to denote that the pszText
  88497.     field has valid contents."
  88498.  
  88499.     ^self subclassResponsibility!
  88500.  
  88501. pszText: anObject
  88502.     "Set the receiver's pszText field to the value of anObject."
  88503.  
  88504.     ^self subclassResponsibility!
  88505.  
  88506. pszTextAddress
  88507.     "Private - Answer the address of the text buffer. "
  88508.  
  88509.     ^bytes sdwordAtOffset: self textPointerOffset!
  88510.  
  88511. state: anInteger
  88512.     "Set contents' state member from anInteger"
  88513.  
  88514.     self dwState: anInteger; 
  88515.         maskIn: self stateValidMask;
  88516.         stateMask: anInteger!
  88517.  
  88518. stateMask: anObject
  88519.     "Set the receiver's stateMask field to the value of anObject."
  88520.  
  88521.     ^self subclassResponsibility!
  88522.  
  88523. stateMaskIn: anInteger
  88524.     "Private - OR in to contents' state member the bit flags represented by anInteger"
  88525.  
  88526.     self state: (self dwState bitOr: anInteger)!
  88527.  
  88528. stateMaskOut: anInteger
  88529.     "Private - Mask out of contents' state member the bit flags represented by anInteger"
  88530.  
  88531.     self state: (self dwState maskClear: anInteger)!
  88532.  
  88533. stateValidMask
  88534.     "Private - Answer the bit mask the receiver uses to denote that the dwState
  88535.     field has valid contents."
  88536.  
  88537.     ^self subclassResponsibility!
  88538.  
  88539. text
  88540.     "Answer the text of the receiver"
  88541.  
  88542.     ^text!
  88543.  
  88544. text: aString
  88545.     "Sets contents' pszMember to aString. We also hang on to it in our
  88546.     text instance var to ensure that its lifetime is sufficiently long
  88547.     for us to safely use it."
  88548.  
  88549.     text := aString.
  88550.     self
  88551.         pszText: aString;
  88552. "        cchTextMax: aString size;"    "Not required - control assumes null terminated"
  88553.         maskIn: self textValidMask!
  88554.  
  88555. textCallback
  88556.     "Sets the receiver into image callback mode"
  88557.  
  88558.     bytes dwordAtOffset: self textPointerOffset put: LPSTR_TEXTCALLBACK.
  88559.     self maskIn: self textValidMask!
  88560.  
  88561. textInBuffer: aString
  88562.     "Writes aString into a system buffer pointed to by pszText
  88563.     and of size cchTextMax."
  88564.  
  88565.     CRTLibrary default 
  88566.         strncpy: self pszTextAddress    "Raw address of text buffer allocated by control"
  88567.         strSource: aString 
  88568.         count: self cchTextMax!
  88569.  
  88570. textPointerOffset
  88571.     "Private - Answer the offset of the text pointer in the receiver. "
  88572.  
  88573.     ^self subclassResponsibility!
  88574.  
  88575. textValidMask
  88576.     "Private - Answer the bit mask the receiver uses to denote that the pszText
  88577.     field has valid contents."
  88578.  
  88579.     ^self subclassResponsibility! !
  88580.  
  88581. CHARFORMAT comment:
  88582. 'CHARFORMAT is an <ExternalStructure> class to represent the Win32 structure of the same name.
  88583.  
  88584. The CHARFORMAT structure contains information about character formatting in a rich edit control.'!
  88585. !CHARFORMAT class methodsFor!
  88586.  
  88587. defineFields
  88588.     "Define the layout of the CHARFORMAT structure
  88589.         CHARFORMAT compileDefinition
  88590.     "
  88591.  
  88592.     self defineField: #dwSize type: DWORDField writeOnly beOverride;
  88593.         defineField: #dwMask type: DWORDField new;
  88594.         defineField: #dwEffects type: DWORDField new;
  88595.         defineField: #yHeight type: SDWORDField new;
  88596.         defineField: #yOffset type: SDWORDField new beUncompiled;
  88597.         defineField: #crTextColor type: DWORDField new;
  88598.         defineField: #bCharSet type: BYTEField new;
  88599.         defineField: #bPitchAndFamily type: BYTEField new;
  88600.         defineField: #szFaceName type: (StringField length: 32);
  88601.         defineField: #filler type: WORDField filler! !
  88602.  
  88603. !CHARFORMAT methodsFor!
  88604.  
  88605. bCharSet
  88606.     "Answer the receiver's bCharSet field as a Smalltalk object."
  88607.  
  88608.     ^(bytes byteAtOffset: 24)!
  88609.  
  88610. bCharSet: anObject
  88611.     "Set the receiver's bCharSet field to the value of anObject."
  88612.  
  88613.     bytes byteAtOffset: 24 put: anObject!
  88614.  
  88615. beBold
  88616.     "Set the character bold effect on."
  88617.  
  88618.     self isBold: true!
  88619.  
  88620. beItalic
  88621.     "Set the character italic effect on."
  88622.  
  88623.     self isItalic: true!
  88624.  
  88625. beNotBold
  88626.     "Set the character bold effect off."
  88627.  
  88628.     self isBold: false!
  88629.  
  88630. beNotItalic
  88631.     "Set the character italic effect off."
  88632.  
  88633.     self isItalic: false!
  88634.  
  88635. beNotUnderlined
  88636.     "Set the character underline effect off."
  88637.  
  88638.     self isUnderlined: false!
  88639.  
  88640. bePlain
  88641.     "Remove all text effects (such as bold, italic, etc)"
  88642.  
  88643.     self maskIn: ##(CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE|CFM_STRIKEOUT).
  88644.     self dwEffects: 0!
  88645.  
  88646. beUnderlined
  88647.     "Set the character underline effect on."
  88648.  
  88649.     self isUnderlined: true!
  88650.  
  88651. bold: aBoolean
  88652.     "Use #isBold:"
  88653.  
  88654.     #deprecated.
  88655.     self isBold: aBoolean!
  88656.  
  88657. bPitchAndFamily
  88658.     "Answer the receiver's bPitchAndFamily field as a Smalltalk object."
  88659.  
  88660.     ^(bytes byteAtOffset: 25)!
  88661.  
  88662. bPitchAndFamily: anObject
  88663.     "Set the receiver's bPitchAndFamily field to the value of anObject."
  88664.  
  88665.     bytes byteAtOffset: 25 put: anObject!
  88666.  
  88667. characterSet: anInteger
  88668.     "Set the desired character set (permitted values of lfCharSet member of LOGFONT on MSDN)."
  88669.  
  88670.     self maskIn: CFM_CHARSET.
  88671.     self bCharSet: anInteger!
  88672.  
  88673. color
  88674.     "Answer the character colour."
  88675.  
  88676.     ^Color fromInteger: self crTextColor!
  88677.  
  88678. color: aColor
  88679.     "Set the character colour."
  88680.  
  88681.     self maskIn: CFM_COLOR.
  88682.     self crTextColor: aColor asColorRef asParameter
  88683. !
  88684.  
  88685. crTextColor
  88686.     "Answer the receiver's crTextColor field as a Smalltalk object."
  88687.  
  88688.     ^(bytes dwordAtOffset: 20)!
  88689.  
  88690. crTextColor: anObject
  88691.     "Set the receiver's crTextColor field to the value of anObject."
  88692.  
  88693.     bytes dwordAtOffset: 20 put: anObject!
  88694.  
  88695. dwEffects
  88696.     "Answer the receiver's dwEffects field as a Smalltalk object."
  88697.  
  88698.     ^(bytes dwordAtOffset: 8)!
  88699.  
  88700. dwEffects: anObject
  88701.     "Set the receiver's dwEffects field to the value of anObject."
  88702.  
  88703.     bytes dwordAtOffset: 8 put: anObject!
  88704.  
  88705. dwMask
  88706.     "Answer the receiver's dwMask field as a Smalltalk object."
  88707.  
  88708.     ^(bytes dwordAtOffset: 4)!
  88709.  
  88710. dwMask: anObject
  88711.     "Set the receiver's dwMask field to the value of anObject."
  88712.  
  88713.     bytes dwordAtOffset: 4 put: anObject!
  88714.  
  88715. dwSize: anObject
  88716.     "Set the receiver's dwSize field to the value of anObject."
  88717.  
  88718.     bytes dwordAtOffset: 0 put: anObject!
  88719.  
  88720. effectsAny: anInteger
  88721.     "Private - Answer true if the effects member contains the bit flags represented by anInteger."
  88722.  
  88723.     ^self dwEffects anyMask: anInteger!
  88724.  
  88725. faceName: aString
  88726.     "Set the character face name.
  88727.     Note that the szFaceName member is an embedded string, rather than a pointer,
  88728.     and there is, therefore, no need to save down a reference to aString."
  88729.  
  88730.     self maskIn: CFM_FACE.
  88731.     self szFaceName: aString!
  88732.  
  88733. font
  88734.     "Answer the character font."
  88735.     
  88736.     | font |
  88737.     font := Font name: self szFaceName pointSize: self pointSize.
  88738.     self isBold ifTrue: [font beBold].
  88739.     self isItalic ifTrue: [font beItalic].
  88740.     self isUnderlined ifTrue: [font beUnderlined].
  88741.     ^font
  88742.  
  88743. !
  88744.  
  88745. font: aFont
  88746.     "Set the character font."
  88747.  
  88748.     self 
  88749.         faceName: aFont name;
  88750.         pointSize: aFont pointSize;
  88751.         characterSet: aFont logFont lfCharSet;
  88752.         bPitchAndFamily: aFont logFont lfPitchAndFamily.
  88753.     self 
  88754.         isBold: aFont isBold;
  88755.         isItalic: aFont isItalic;
  88756.         isUnderlined: aFont isUnderlined!
  88757.  
  88758. height: aNumber
  88759.     "Set the receiver's height field to anInteger (N.B.
  88760.     the height is specified in half points)."
  88761.  
  88762.     self maskIn: CFM_SIZE.
  88763.     self yHeight: aNumber asInteger!
  88764.  
  88765. isBold
  88766.     "Answer the character bold effect."
  88767.  
  88768.     ^(self maskAny: CFM_BOLD) and: [self effectsAny: CFE_BOLD].
  88769. !
  88770.  
  88771. isBold: aBoolean
  88772.     "Set the character bold effect."
  88773.  
  88774.     self setEffect: CFE_BOLD mask: CFM_BOLD set: aBoolean!
  88775.  
  88776. isItalic
  88777.     "Answer the character italic effect."
  88778.  
  88779.     ^(self maskAny: CFM_ITALIC) and: [self effectsAny: CFE_ITALIC].
  88780. !
  88781.  
  88782. isItalic: aBoolean
  88783.     "Set the character italic effect."
  88784.  
  88785.     self setEffect: CFE_ITALIC mask: CFM_ITALIC set: aBoolean!
  88786.  
  88787. isStruckThrough
  88788.     "Answer whether the strike-out effect is set."
  88789.  
  88790.     ^(self maskAny: CFM_STRIKEOUT) and: [self effectsAny: CFE_STRIKEOUT].
  88791. !
  88792.  
  88793. isStruckThrough: aBoolean
  88794.     "Set the struck out character effect."
  88795.  
  88796.     self setEffect: CFE_STRIKEOUT mask: CFM_STRIKEOUT set: aBoolean
  88797. !
  88798.  
  88799. isUnderlined
  88800.     "Answer the character underline effect."
  88801.  
  88802.     ^(self maskAny: CFM_UNDERLINE) and: [self effectsAny: CFE_UNDERLINE].
  88803. !
  88804.  
  88805. isUnderlined: aBoolean
  88806.     "Set the character underline effect."
  88807.  
  88808.     self setEffect: CFE_UNDERLINE mask: CFM_UNDERLINE set: aBoolean!
  88809.  
  88810. italic: aBoolean
  88811.     "Use #isItalic:"
  88812.  
  88813.     #deprecated.
  88814.     self isItalic: aBoolean!
  88815.  
  88816. maskAny: anInteger
  88817.     "Private - Answer true if the mask member contains the bit flags represented by anInteger."
  88818.  
  88819.     ^self dwMask anyMask: anInteger!
  88820.  
  88821. maskIn: anInteger
  88822.     "Private - OR in to contents mask member the bit flags represented by anInteger.
  88823.     Answer the receiver."
  88824.  
  88825.     self dwMask: (self dwMask bitOr: anInteger)!
  88826.  
  88827. pointSize
  88828.     "Answer the receiver's height field in points (N.B. the answer may be
  88829.     a Fraction if the, for example, the size if 10.5 points)."
  88830.  
  88831.     ^self yHeight / 20!
  88832.  
  88833. pointSize: aNumber
  88834.     "Set the receiver's height field to  aNumber points (aNumber 
  88835.     need not be integral)."
  88836.  
  88837.     self height: aNumber * 20!
  88838.  
  88839. setEffect: effectFlag mask: effectMask set: aBoolean
  88840.     "Private - Set/reset an effect such as underlined, bold, etc."
  88841.  
  88842.     self maskIn: effectMask.
  88843.     self dwEffects: (self dwEffects mask: effectFlag set: aBoolean)
  88844. !
  88845.  
  88846. size: twips
  88847.     "Set the character size."
  88848.  
  88849.     self maskIn: CFM_SIZE.
  88850.     self yHeight: twips
  88851. !
  88852.  
  88853. szFaceName
  88854.     "Answer the receiver's szFaceName field as a Smalltalk object."
  88855.  
  88856.     ^String fromAddress: (bytes yourAddress + 26)!
  88857.  
  88858. szFaceName: anObject
  88859.     "Set the receiver's szFaceName field to the value of anObject."
  88860.  
  88861.     | size |
  88862.     size := anObject byteSize - 1 min: (31 * 1).
  88863.     anObject replaceBytesOf: bytes from: 27 to: 26 + size startingAt: 1.
  88864.     bytes at: size+27 put: 0!
  88865.  
  88866. underlined: aBoolean
  88867.     "Use #isUnderlined:"
  88868.  
  88869.     #deprecated.
  88870.     self isUnderlined: aBoolean!
  88871.  
  88872. yHeight
  88873.     "Answer the receiver's yHeight field as a Smalltalk object."
  88874.  
  88875.     ^(bytes sdwordAtOffset: 12)!
  88876.  
  88877. yHeight: anObject
  88878.     "Set the receiver's yHeight field to the value of anObject."
  88879.  
  88880.     bytes sdwordAtOffset: 12 put: anObject! !
  88881.  
  88882. CHOOSECOLOR comment:
  88883. 'CHOOSECOLOR is the class of <ExternalStructure> which represent the Windows Common Dialog structure of the same name.
  88884.  
  88885. CHOOSECOLOR is used in conjunction with <ColorDialog> to pop a common file dialog to select a colour.
  88886.  
  88887. Instance Variables:
  88888.     None'!
  88889. !CHOOSECOLOR class methodsFor!
  88890.  
  88891. defineFields
  88892.     "Define the fields of the Win32 CHOOSECOLOR structure.
  88893.  
  88894.         CHOOSECOLOR compileDefinition
  88895.  
  88896.     typedef struct {   // cc  
  88897.         DWORD        lStructSize;
  88898.         HWND            hwndOwner;
  88899.         HWND            hInstance;
  88900.         COLORREF        rgbResult;
  88901.         COLORREF*        lpCustColors;
  88902.         DWORD        Flags;
  88903.         LPARAM        lCustData;
  88904.         LPCCHOOKPROC    lpfnHook;
  88905.         LPCTSTR        lpTemplateName;
  88906.         } CHOOSECOLOR;"
  88907.  
  88908.     self 
  88909.         defineField: #dwSize            type: DWORDField writeOnly beOverride;
  88910.         defineField: #hwndOwner            type: DWORDField writeOnly;
  88911.         defineField: #hInstance            type: DWORDField writeOnly;
  88912.         defineField: #rgbResult            type: DWORDField new;
  88913.         defineField: #lpCustColors        type: (ArrayPointerField type: DWORDArray length: 16) beWriteOnly;
  88914.         defineField: #flags                type: DWORDField writeOnly;
  88915.         defineField: #lCustData            type: SDWORDField filler;
  88916.         defineField: #lpfnHook            type: (PointerField type: ExternalAddress) beFiller;
  88917.         defineField: #lpTemplateName        type: (PointerField type: String) beFiller! !
  88918.  
  88919. !CHOOSECOLOR methodsFor!
  88920.  
  88921. color
  88922.     "Answer the chosen colour."
  88923.  
  88924.     ^Color fromInteger: self rgbResult!
  88925.  
  88926. dwSize: anObject
  88927.     "Set the receiver's dwSize field to the value of anObject."
  88928.  
  88929.     bytes dwordAtOffset: 0 put: anObject!
  88930.  
  88931. flags: anObject
  88932.     "Set the receiver's flags field to the value of anObject."
  88933.  
  88934.     bytes dwordAtOffset: 20 put: anObject!
  88935.  
  88936. hInstance: anObject
  88937.     "Set the receiver's hInstance field to the value of anObject."
  88938.  
  88939.     bytes dwordAtOffset: 8 put: anObject!
  88940.  
  88941. hwndOwner: anObject
  88942.     "Set the receiver's hwndOwner field to the value of anObject."
  88943.  
  88944.     bytes dwordAtOffset: 4 put: anObject!
  88945.  
  88946. lpCustColors: anObject
  88947.     "Set the receiver's lpCustColors field to the value of anObject."
  88948.  
  88949.     bytes dwordAtOffset: 16 put: anObject yourAddress!
  88950.  
  88951. ownerView: aView
  88952.     "Set the parent window for the dialog to aView."
  88953.  
  88954.     | hWnd |
  88955.     hWnd := aView asParameter.
  88956.     hWnd isNull ifFalse: [self hwndOwner: hWnd].!
  88957.  
  88958. rgbResult
  88959.     "Answer the receiver's rgbResult field as a Smalltalk object."
  88960.  
  88961.     ^(bytes dwordAtOffset: 12)!
  88962.  
  88963. rgbResult: anObject
  88964.     "Set the receiver's rgbResult field to the value of anObject."
  88965.  
  88966.     bytes dwordAtOffset: 12 put: anObject! !
  88967.  
  88968. CHOOSEFONT comment:
  88969. 'CHOOSEFONT is the class of <ExternalStructure> which represent the Windows Common Dialog structure of the same name.
  88970.  
  88971. CHOOSEFONT is used in conjunction with <FontDialog> to pop a common file dialog to select a font.
  88972. '!
  88973. !CHOOSEFONT class methodsFor!
  88974.  
  88975. defineFields
  88976.     "Define the fields of the Win32 CHOOSEFONT structure.
  88977.     This structure is used only for communication with the font dialog, so we don't compile it.
  88978.  
  88979.         CHOOSEFONT compileDefinition
  88980.  
  88981.     typedef struct    {
  88982.         DWORD        lStructSize;
  88983.         HWND            hwndOwner;
  88984.         HDC            hDC;
  88985.         LPLOGFONT        lpLogFont;
  88986.         INT            iPointSize;
  88987.         DWORD        Flags;
  88988.         DWORD        rgbColors;
  88989.         LPARAM        lCustData;
  88990.         LPCFHOOKPROC    lpfnHook;
  88991.         LPCTSTR        lpTemplateName;
  88992.         HINSTANCE        hInstance;
  88993.         LPTSTR        lpszStyle;
  88994.         WORD            nFontType;        // N.B. Packing required after this
  88995.         INT            nSizeMin;
  88996.         INT            nSizeMax;
  88997.     } CHOOSEFONT;"
  88998.  
  88999.     self 
  89000.         defineField: #dwSize            type: DWORDField writeOnly beOverride;
  89001.         defineField: #hwndOwner            type: DWORDField writeOnly;
  89002.         defineField: #hDC                type: DWORDField writeOnly;
  89003.         defineField: #lpLogFont            type: (PointerField type: LOGFONT);
  89004.         defineField: #iPointSize        type: DWORDField readOnly beUncompiled;
  89005.         defineField: #flags                type: DWORDField new beUncompiled;
  89006.         defineField: #rgbColors            type: DWORDField new beUncompiled;
  89007.         defineField: #lCustData            type: SDWORDField filler;
  89008.         defineField: #lpfnHook            type: (PointerField type: ExternalAddress) beFiller;
  89009.         defineField: #lpTemplateName        type: (PointerField type: String) beFiller;
  89010.         defineField: #hInstance            type: DWORDField filler;
  89011.         defineField: #lpszStyle            type: (PointerField type: String) beUncompiled;
  89012.         defineField: #nFontType            type: WORDField readOnly beUncompiled;
  89013.         defineField: #nSizeMin            type: DWORDField writeOnly beUncompiled;
  89014.         defineField: #nSizeMax            type: DWORDField writeOnly beUncompiled
  89015.  
  89016. "
  89017. CHOOSEFONT byteSize
  89018.  
  89019. 60
  89020. "! !
  89021.  
  89022. !CHOOSEFONT methodsFor!
  89023.  
  89024. dwSize: anObject
  89025.     "Set the receiver's dwSize field to the value of anObject."
  89026.  
  89027.     bytes dwordAtOffset: 0 put: anObject!
  89028.  
  89029. hDC: anObject
  89030.     "Set the receiver's hDC field to the value of anObject."
  89031.  
  89032.     bytes dwordAtOffset: 8 put: anObject!
  89033.  
  89034. hwndOwner: anObject
  89035.     "Set the receiver's hwndOwner field to the value of anObject."
  89036.  
  89037.     bytes dwordAtOffset: 4 put: anObject!
  89038.  
  89039. lpLogFont
  89040.     "Answer the receiver's lpLogFont field as a Smalltalk object."
  89041.  
  89042.     ^LOGFONT fromAddress: (bytes sdwordAtOffset: 12)!
  89043.  
  89044. lpLogFont: anObject
  89045.     "Set the receiver's lpLogFont field to the value of anObject."
  89046.  
  89047.     bytes dwordAtOffset: 12 put: anObject yourAddress!
  89048.  
  89049. ownerView: aView
  89050.     "Set the parent window for the dialog to aView."
  89051.  
  89052.     | hWnd |
  89053.     hWnd := aView asParameter.
  89054.     hWnd isNull ifFalse: [self hwndOwner: hWnd].! !
  89055.  
  89056. DIBSECTION comment:
  89057. ''!
  89058. !DIBSECTION class methodsFor!
  89059.  
  89060. defineFields
  89061.     "Define the Win32 DIBSECTION structure
  89062.         DIBSECTION compileDefinition
  89063.  
  89064.         typedef struct tagDIBSECTION {
  89065.             BITMAP              dsBm;
  89066.             BITMAPINFOHEADER    dsBmih;
  89067.             DWORD               dsBitfields[3];
  89068.             HANDLE              dshSection;
  89069.             DWORD               dsOffset;
  89070.             } DIBSECTION;
  89071.     "
  89072.     self
  89073.         defineField: #dsBm type: (StructureField type: BITMAP);
  89074.         defineField: #dsBmih type: (StructureField type: BITMAPINFOHEADER);
  89075.         defineField: #dsBitfields type: (StructureArrayField type: DWORD length: 3) beReadOnly;
  89076.         defineField: #dshSection type: DWORDField new;
  89077.         defineField: #dsOffset type: DWORDField new!
  89078.  
  89079. fileOutStem
  89080.     "Private - Answer standard file name for the class to file out on."
  89081.  
  89082.     ^'DIBSECTION_Struct'! !
  89083.  
  89084. !DIBSECTION methodsFor!
  89085.  
  89086. dsBitfields
  89087.     "Answer the receiver's dsBitfields field as a Smalltalk object."
  89088.  
  89089.     ^StructureArray fromAddress: (bytes yourAddress + 64) length: 3 elementClass: DWORD!
  89090.  
  89091. dsBm
  89092.     "Answer the receiver's dsBm field as a Smalltalk object."
  89093.  
  89094.     ^BITMAP fromAddress: (bytes yourAddress)!
  89095.  
  89096. dsBm: anObject
  89097.     "Set the receiver's dsBm field to the value of anObject."
  89098.  
  89099.     anObject replaceBytesOf: bytes from: 1 to: 24 startingAt: 1!
  89100.  
  89101. dsBmih
  89102.     "Answer the receiver's dsBmih field as a Smalltalk object."
  89103.  
  89104.     ^BITMAPINFOHEADER fromAddress: (bytes yourAddress + 24)!
  89105.  
  89106. dsBmih: anObject
  89107.     "Set the receiver's dsBmih field to the value of anObject."
  89108.  
  89109.     anObject replaceBytesOf: bytes from: 25 to: 64 startingAt: 1!
  89110.  
  89111. dshSection
  89112.     "Answer the receiver's dshSection field as a Smalltalk object."
  89113.  
  89114.     ^(bytes dwordAtOffset: 76)!
  89115.  
  89116. dshSection: anObject
  89117.     "Set the receiver's dshSection field to the value of anObject."
  89118.  
  89119.     bytes dwordAtOffset: 76 put: anObject!
  89120.  
  89121. dsOffset
  89122.     "Answer the receiver's dsOffset field as a Smalltalk object."
  89123.  
  89124.     ^(bytes dwordAtOffset: 80)!
  89125.  
  89126. dsOffset: anObject
  89127.     "Set the receiver's dsOffset field to the value of anObject."
  89128.  
  89129.     bytes dwordAtOffset: 80 put: anObject! !
  89130.  
  89131. DOCINFO comment:
  89132. 'DOCINFO is an <ExternalStructure> class which represents the Win32 DOCINFO structure of the same name.
  89133.  
  89134. DOCINFO is used in conjunction with the StartDoc() GDI call.'!
  89135. !DOCINFO class methodsFor!
  89136.  
  89137. defineFields
  89138.     "Define the fields of the Win32 DOCINFO structure.
  89139.  
  89140.         DOCINFO compileDefinition
  89141.  
  89142.     typedef struct {        // di  
  89143.         int        cbSize;
  89144.         LPCTSTR    lpszDocName;
  89145.         LPCTSTR    lpszOutput;
  89146.         LPCTSTR    lpszDatatype;    // Windows 95 only; ignored on Windows NT
  89147.         DWORD    fwType;        // Windows 95 only; ignored on Windows NT
  89148.         } DOCINFO;"
  89149.  
  89150.     self
  89151.         defineField: #dwSize type: DWORDField writeOnly beOverride;
  89152.         defineField: #lpszDocName type: (PointerField type: String) beWriteOnly;
  89153.         defineField: #lpszOutput type: (PointerField type: String) beWriteOnly;
  89154.         defineField: #lpszDatatype type: (PointerField type: String) beWriteOnly;
  89155.         defineField: #fwType type: DWORDField writeOnly! !
  89156.  
  89157. !DOCINFO methodsFor!
  89158.  
  89159. dwSize: anObject
  89160.     "Set the receiver's dwSize field to the value of anObject."
  89161.  
  89162.     bytes dwordAtOffset: 0 put: anObject!
  89163.  
  89164. fwType: anObject
  89165.     "Set the receiver's fwType field to the value of anObject."
  89166.  
  89167.     bytes dwordAtOffset: 16 put: anObject!
  89168.  
  89169. lpszDatatype: anObject
  89170.     "Set the receiver's lpszDatatype field to the value of anObject."
  89171.  
  89172.     bytes dwordAtOffset: 12 put: anObject yourAddress!
  89173.  
  89174. lpszDocName: anObject
  89175.     "Set the receiver's lpszDocName field to the value of anObject."
  89176.  
  89177.     bytes dwordAtOffset: 4 put: anObject yourAddress!
  89178.  
  89179. lpszOutput: anObject
  89180.     "Set the receiver's lpszOutput field to the value of anObject."
  89181.  
  89182.     bytes dwordAtOffset: 8 put: anObject yourAddress! !
  89183.  
  89184. DRAWITEMSTRUCT comment:
  89185. ''!
  89186. !DRAWITEMSTRUCT class methodsFor!
  89187.  
  89188. defineFields
  89189.     "Define the fields of the Win32 DRAWITEMSTRUCT structure.
  89190.  
  89191.         DRAWITEMSTRUCT compileDefinition
  89192.  
  89193.     typedef struct tagDRAWITEMSTRUCT   // dis 
  89194.         UINT  CtlType; 
  89195.         UINT  CtlID; 
  89196.         UINT  itemID; 
  89197.         UINT  itemAction; 
  89198.         UINT  itemState; 
  89199.         HWND  hwndItem; 
  89200.         HDC   hDC; 
  89201.         RECT  rcItem; 
  89202.         DWORD itemData; 
  89203.      DRAWITEMSTRUCT; "
  89204.  
  89205.     self 
  89206.         defineField: #ctlType type: DWORDField readOnly;
  89207.         defineField: #ctlID type: DWORDField readOnly;
  89208.         defineField: #itemID type: DWORDField readOnly;
  89209.         defineField: #itemAction type: DWORDField readOnly;
  89210.         defineField: #itemState type: DWORDField readOnly;
  89211.         defineField: #hwndItem type: DWORDField readOnly;
  89212.         defineField: #hDC type: DWORDField readOnly;
  89213.         defineField: #rcItem type: (StructureField type: RECT) beReadOnly;
  89214.         defineField: #itemData type: DWORDField readOnly! !
  89215.  
  89216. !DRAWITEMSTRUCT methodsFor!
  89217.  
  89218. ctlID
  89219.     "Answer the receiver's ctlID field as a Smalltalk object.
  89220.     Automatically generated get method - do not modify"
  89221.  
  89222.     ^(bytes dwordAtOffset: 4)!
  89223.  
  89224. ctlType
  89225.     "Answer the receiver's ctlType field as a Smalltalk object.
  89226.     Automatically generated get method - do not modify"
  89227.  
  89228.     ^(bytes dwordAtOffset: 0)!
  89229.  
  89230. hDC
  89231.     "Answer the receiver's hDC field as a Smalltalk object.
  89232.     Automatically generated get method - do not modify"
  89233.  
  89234.     ^(bytes dwordAtOffset: 24)!
  89235.  
  89236. hwndItem
  89237.     "Answer the receiver's hwndItem field as a Smalltalk object.
  89238.     Automatically generated get method - do not modify"
  89239.  
  89240.     ^(bytes dwordAtOffset: 20)!
  89241.  
  89242. itemAction
  89243.     "Answer the receiver's itemAction field as a Smalltalk object.
  89244.     Automatically generated get method - do not modify"
  89245.  
  89246.     ^(bytes dwordAtOffset: 12)!
  89247.  
  89248. itemData
  89249.     "Answer the receiver's itemData field as a Smalltalk object.
  89250.     Automatically generated get method - do not modify"
  89251.  
  89252.     ^(bytes dwordAtOffset: 44)!
  89253.  
  89254. itemID
  89255.     "Answer the receiver's itemID field as a Smalltalk object.
  89256.     Automatically generated get method - do not modify"
  89257.  
  89258.     ^(bytes dwordAtOffset: 8)!
  89259.  
  89260. itemState
  89261.     "Answer the receiver's itemState field as a Smalltalk object.
  89262.     Automatically generated get method - do not modify"
  89263.  
  89264.     ^(bytes dwordAtOffset: 16)!
  89265.  
  89266. rcItem
  89267.     "Answer the receiver's rcItem field as a Smalltalk object.
  89268.     Automatically generated get method - do not modify"
  89269.  
  89270.     ^RECT fromAddress: (bytes yourAddress + 28)! !
  89271.  
  89272. EDITSTREAM comment:
  89273. ''!
  89274. !EDITSTREAM class methodsFor!
  89275.  
  89276. defineFields
  89277.     "Define the fields of the Win32 EDITSTREAM structure.
  89278.  
  89279.         EDITSTREAM compileDefinition
  89280.  
  89281.     typedef struct _editstream { 
  89282.         DWORD dwCookie; 
  89283.         DWORD dwError; 
  89284.         EDITSTREAMCALLBACK pfnCallback; 
  89285.     } EDITSTREAM;"
  89286.  
  89287.     self 
  89288.         defineField: #dwCookie            type: DWORDField filler;
  89289.         defineField: #dwError            type: DWORDField filler;
  89290.         defineField: #pfnCallback        type: LPVOIDField writeOnly! !
  89291.  
  89292. !EDITSTREAM methodsFor!
  89293.  
  89294. pfnCallback: anObject
  89295.     "Set the receiver's pfnCallback field to the value of anObject.
  89296.     Automatically generated set method - do not modify"
  89297.  
  89298.     bytes dwordAtOffset: 8 put: anObject! !
  89299.  
  89300. EXCEPTION_RECORD comment:
  89301. ''!
  89302. !EXCEPTION_RECORD class methodsFor!
  89303.  
  89304. defineFields
  89305.     "Define the fields of the Win32 EXCEPTION_RECORD structure.
  89306.  
  89307.         EXCEPTION_RECORD compileDefinition
  89308.  
  89309.         struct {
  89310.             DWORD ExceptionCode;
  89311.             DWORD ExceptionFlags;
  89312.             EXCEPTION_RECORD* ExceptionRecord;
  89313.             PVOID ExceptionAddress;
  89314.             DWORD NumberParameters;
  89315.             DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
  89316.         } EXCEPTION_RECORD;"
  89317.  
  89318.     self 
  89319.         defineField: #ExceptionCode        type: DWORDField readOnly;
  89320.         defineField: #ExceptionFlags        type: DWORDField readOnly beUncompiled;
  89321.         defineField: #ExceptionRecord    type: DWORDField filler;
  89322.         defineField: #ExceptionAddress    type: LPVOIDField readOnly;
  89323.         defineField: #NumberParameters    type: DWORDField readOnly;
  89324.         defineField: #ExceptionInformation type: (ArrayField type: DWORDArray length: EXCEPTION_MAXIMUM_PARAMETERS) beReadOnly
  89325.         
  89326.         
  89327. ! !
  89328.  
  89329. !EXCEPTION_RECORD methodsFor!
  89330.  
  89331. ExceptionAddress
  89332.     "Answer the receiver's ExceptionAddress field as a Smalltalk object."
  89333.  
  89334.     ^(bytes dwordAtOffset: 12) asExternalAddress!
  89335.  
  89336. ExceptionCode
  89337.     "Answer the receiver's ExceptionCode field as a Smalltalk object."
  89338.  
  89339.     ^(bytes dwordAtOffset: 0)!
  89340.  
  89341. ExceptionInformation
  89342.     "Answer the receiver's ExceptionInformation field as a Smalltalk object."
  89343.  
  89344.     ^DWORDArray fromAddress: (bytes yourAddress + 20) length: 15!
  89345.  
  89346. information
  89347.     "Answer the receiver's ExceptionInformation field as a Smalltalk object."
  89348.  
  89349.     ^self ExceptionInformation
  89350.         length: self NumberParameters;
  89351.         yourself!
  89352.  
  89353. moduleFileName
  89354.     "Answer the file name of the module within which the exception occurred."
  89355.  
  89356.     ^(MEMORY_BASIC_INFORMATION forAddress: self ExceptionAddress) moduleFileName!
  89357.  
  89358. NumberParameters
  89359.     "Answer the receiver's NumberParameters field as a Smalltalk object."
  89360.  
  89361.     ^(bytes dwordAtOffset: 16)! !
  89362.  
  89363. FILETIME comment:
  89364. 'FILETIME is an ExternalStructure class to represent the Win32 FILETIME structure.
  89365.  
  89366. A FILETIME is a 64-bit integer count of the number of 100 nanosecond intervals since 01:00:00, 01 January 1601 UTC (i.e. not local time).
  89367.  
  89368. FILETIMEs are typically used to mark file creation/modification/access times with very high accurracy in a time zone independent manner.'!
  89369. !FILETIME class methodsFor!
  89370.  
  89371. defineFields
  89372.     "Define the fields of the Win32 FILETIME structure.
  89373.  
  89374.         typedef struct _FILETIME 
  89375.             DWORD dwLowDateTime;
  89376.             DWORD dwHighDateTime;
  89377.          FILETIME, *PFILETIME, *LPFILETIME;
  89378.  
  89379.         FILETIME compileDefinition
  89380.     "
  89381.  
  89382.     self
  89383.         defineField: #dwLowDateTime type: DWORDField filler;
  89384.         defineField: #dwHighDateTime type: DWORDField filler!
  89385.  
  89386. fromInteger: anInteger 
  89387.     "Answer an instance of the receiver for the specified <integer> number
  89388.     of 100 nanosecond intervals since 01:00:00, 01 January 1601."
  89389.  
  89390.     ^self new integerValue: anInteger!
  89391.  
  89392. fromLocalTime: aLocalFILETIME
  89393.     "Answer a UTC file time from the specified local file time."
  89394.  
  89395.     | answer |
  89396.     answer := self new.
  89397.     (KernelLibrary default localFileTimeToFileTime: aLocalFILETIME
  89398.         lpFileTime: answer) ifFalse: [^KernelLibrary default systemError].
  89399.     ^answer!
  89400.  
  89401. fromSYSTEMTIME: aSYSTEMTIME
  89402.     "Answer a file time from the specified SYSTEMTIME (assumed to be in
  89403.     local time)."
  89404.  
  89405.     ^(LocalFILETIME fromSYSTEMTIME: aSYSTEMTIME) asUTC!
  89406.  
  89407. fromUnixTime: time_t
  89408.     "Answer a file time from the specified time_t, where the argument is the number
  89409.     of seconds elapsed since midnight (00:00:00), January 1, 1970, coordinated
  89410.     universal time."
  89411.  
  89412.     ^self fromInteger: (UnixEpoch + (time_t * 10000000))
  89413. !
  89414.  
  89415. initialize
  89416.     "Private - Initialize the receiver's class variables.
  89417.         FILETIME initialize
  89418.     "
  89419.  
  89420.     | baseFiletime |
  89421.     self byteSize: 8.
  89422.     baseFiletime := (SYSTEMTIME day: 1 month: 1 year: 1970) asFILETIME.
  89423.     UnixEpoch := baseFiletime bytes qwordAtOffset: 0!
  89424.  
  89425. now
  89426.     "Answer the current FILETIME. 
  89427.     Use the OLELibrary function if it is available.
  89428.  
  89429.         FILETIME now
  89430.     "
  89431.  
  89432.     | answer |
  89433.     answer := self new.
  89434.     (Smalltalk at: #OLELibrary ifAbsent: [^LocalFILETIME now asUTC])
  89435.         default coFileTimeNow: answer.
  89436.     ^answer!
  89437.  
  89438. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  89439. m»g|jmT]x≈Å
  89440. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{RÜé▌╩╔+ì╜! !
  89441.  
  89442. !FILETIME methodsFor!
  89443.  
  89444. asFILETIME
  89445.     "Answer the receiver as a FILETIME (which it is already)."
  89446.  
  89447.     ^self!
  89448.  
  89449. asInteger
  89450.     "Answer a 64-bit integer specifying the number of 100 nanosecond intervals since the
  89451.     FILETIME epoch (01:00:00, 01 January 1601 UTC)."
  89452.  
  89453.     ^bytes qwordAtOffset: 0!
  89454.  
  89455. asLocalTime
  89456.     "Answer the receiver converted to a local time (from UTC).
  89457.     N.B. There is no way of knowing if the receiver is already in local time
  89458.     (though this will always be the case for FILETIMEs provided by the OS)."
  89459.  
  89460.     | lib answer |
  89461.     answer := LocalFILETIME new.
  89462.     lib := KernelLibrary default.
  89463.     (lib fileTimeToLocalTime: self lpLocalFileTime: answer)
  89464.         ifFalse: [lib systemError].
  89465.     ^answer!
  89466.  
  89467. asSYSTEMTIME
  89468.     "Answer the receiver converted to a SYSTEMTIME (first of
  89469.     all converting to local time).
  89470.     Implementation Note: Reproduce a little code to avoid
  89471.     creating a circular dependency on the subclass."
  89472.  
  89473.     | local |
  89474.     local := self class new.
  89475.     (KernelLibrary default fileTimeToLocalTime: self lpLocalFileTime: local)
  89476.         ifFalse: [^KernelLibrary default systemError].
  89477.     ^local basicAsSYSTEMTIME!
  89478.  
  89479. asUTC
  89480.     "Answer the receiver as a UTC FILETIME (which it is already)."
  89481.  
  89482.     ^self!
  89483.  
  89484. basicAsSYSTEMTIME
  89485.     "Private - Answer the receiver converted to a SYSTEMTIME."
  89486.  
  89487.     | lib answer |
  89488.     answer := SYSTEMTIME new.
  89489.     lib := KernelLibrary default.
  89490.     (lib fileTimeToSystemTime: self lpSystemTime: answer)
  89491.         ifFalse: [lib systemError].
  89492.     ^answer!
  89493.  
  89494. displayOn: aStream
  89495.     "Append a textual representation of the receiver to aStream, suitable for an end user.
  89496.     Note that we always display in local time rather than UTC, and of course the receiver
  89497.     is already in local time."
  89498.  
  89499.     aStream display: self asSYSTEMTIME
  89500. !
  89501.  
  89502. integerValue: anInteger 
  89503.     "Set the number of 100-nanosecond intervals the receiver represents since the
  89504.     FILETIME epoch."
  89505.  
  89506.     bytes qwordAtOffset: 0 put: anInteger!
  89507.  
  89508. printOn: aStream
  89509.     "Append a debug representation of the receiver to aStream."
  89510.  
  89511.     aStream
  89512.         basicPrint: self;
  89513.         nextPut: $(; 
  89514.         display: self;
  89515.         nextPut: $)
  89516. ! !
  89517.  
  89518. FINDREPLACE comment:
  89519. 'FINDREPLACE is a <Win32lStructure> which represents the Windows common dialog structure of the same name. It is used in conjunction with the FindText() and ReplaceText() APIs to to contain information about a search or replace operation.
  89520. '!
  89521. !FINDREPLACE class methodsFor!
  89522.  
  89523. defineFields
  89524.     "Define the fields of the Win32 FINDREPLACE structure.
  89525.  
  89526.         FINDREPLACE compileDefinition
  89527.  
  89528.         typedef struct {// fr  
  89529.             DWORD        lStructSize;
  89530.             HWND            hwndOwner;
  89531.             HINSTANCE        hInstance;
  89532.             DWORD        Flags;
  89533.             LPTSTR        lpstrFindWhat;
  89534.             LPTSTR        lpstrReplaceWith;
  89535.             WORD            wFindWhatLen;
  89536.             WORD            wReplaceWithLen;
  89537.             LPARAM        lCustData;
  89538.             LPFRHOOKPROC    lpfnHook;
  89539.             LPCTSTR        lpTemplateName;
  89540.         } FINDREPLACE;"
  89541.  
  89542.     self 
  89543.         defineField: #dwSize            type: DWORDField writeOnly beOverride;
  89544.         defineField: #hwndOwner            type: DWORDField writeOnly;
  89545.         defineField: #hInstance            type: DWORDField filler;
  89546.         defineField: #flags                type: DWORDField new;
  89547.         defineField: #lpstrFindWhat        type: (PointerField type: String);
  89548.         defineField: #lpstrReplaceWith    type: (PointerField type: String);
  89549.         defineField: #wFindWhatLen        type: WORDField writeOnly;
  89550.         defineField: #wReplaceWithLen    type: WORDField writeOnly;
  89551.         defineField: #lCustData            type: SDWORDField filler;
  89552.         defineField: #lpfnHook            type: (PointerField type: ExternalAddress) beFiller;
  89553.         defineField: #lpTemplateName        type: (PointerField type: String) beFiller! !
  89554.  
  89555. !FINDREPLACE methodsFor!
  89556.  
  89557. dwSize: anObject
  89558.     "Set the receiver's dwSize field to the value of anObject."
  89559.  
  89560.     bytes dwordAtOffset: 0 put: anObject!
  89561.  
  89562. findWhat
  89563.     "Answer the String to find"
  89564.  
  89565.     ^self lpstrFindWhat!
  89566.  
  89567. flags
  89568.     "Answer the receiver's flags field as a Smalltalk object."
  89569.  
  89570.     ^(bytes dwordAtOffset: 12)!
  89571.  
  89572. flags: anObject
  89573.     "Set the receiver's flags field to the value of anObject."
  89574.  
  89575.     bytes dwordAtOffset: 12 put: anObject!
  89576.  
  89577. hwndOwner: anObject
  89578.     "Set the receiver's hwndOwner field to the value of anObject."
  89579.  
  89580.     bytes dwordAtOffset: 4 put: anObject!
  89581.  
  89582. isCaseSensitive
  89583.     "Answer true if this is a case sensitive match operation"
  89584.  
  89585.     ^self flags anyMask: FR_MATCHCASE!
  89586.  
  89587. isClosing
  89588.     "Answer true if this is a termination of the find operation"
  89589.  
  89590.     ^self flags anyMask: FR_DIALOGTERM!
  89591.  
  89592. isForwards
  89593.     "Answer true if this is a forward direction operation"
  89594.  
  89595.     ^self flags anyMask: FR_DOWN!
  89596.  
  89597. isReplace
  89598.     "Answer true if this is a replace operation"
  89599.  
  89600.     ^self flags anyMask: FR_REPLACE!
  89601.  
  89602. isReplaceAll
  89603.     "Answer true if this is a replace all operation"
  89604.  
  89605.     ^self flags anyMask: FR_REPLACEALL!
  89606.  
  89607. isWholeWord
  89608.     "Answer true if this is a whole word match operation"
  89609.  
  89610.     ^self flags anyMask: FR_WHOLEWORD!
  89611.  
  89612. lpstrFindWhat
  89613.     "Answer the receiver's lpstrFindWhat field as a Smalltalk object."
  89614.  
  89615.     ^String fromAddress: (bytes sdwordAtOffset: 16)!
  89616.  
  89617. lpstrFindWhat: anObject
  89618.     "Set the receiver's lpstrFindWhat field to the value of anObject."
  89619.  
  89620.     bytes dwordAtOffset: 16 put: anObject yourAddress!
  89621.  
  89622. lpstrReplaceWith
  89623.     "Answer the receiver's lpstrReplaceWith field as a Smalltalk object."
  89624.  
  89625.     ^String fromAddress: (bytes sdwordAtOffset: 20)!
  89626.  
  89627. lpstrReplaceWith: anObject
  89628.     "Set the receiver's lpstrReplaceWith field to the value of anObject."
  89629.  
  89630.     bytes dwordAtOffset: 20 put: anObject yourAddress!
  89631.  
  89632. ownerView: aView
  89633.     "Set the parent window for the dialog to aView."
  89634.  
  89635.     | hWnd |
  89636.     hWnd := aView asParameter.
  89637.     hWnd isNull
  89638.         ifTrue: [self hwndOwner: 0]
  89639.         ifFalse: [self hwndOwner: hWnd].!
  89640.  
  89641. replaceWith
  89642.     "Answer the replacement String."
  89643.  
  89644.     ^self lpstrReplaceWith!
  89645.  
  89646. wFindWhatLen: anObject
  89647.     "Set the receiver's wFindWhatLen field to the value of anObject."
  89648.  
  89649.     bytes wordAtOffset: 24 put: anObject!
  89650.  
  89651. wReplaceWithLen: anObject
  89652.     "Set the receiver's wReplaceWithLen field to the value of anObject."
  89653.  
  89654.     bytes wordAtOffset: 26 put: anObject! !
  89655.  
  89656. FLASHWINFO comment:
  89657. 'FLASHWINFO is the class of <ExternalStructure> which represent the Win32 structure of the same name.
  89658.  
  89659. FLASHWINFO is used to pass parameters to the FlashWindowEx() API call.
  89660.  
  89661. Instance Variables:
  89662.     None'!
  89663. !FLASHWINFO class methodsFor!
  89664.  
  89665. defineFields
  89666.     "Define the fields of the Win32 FLASHWINFO structure.
  89667.  
  89668.         self compileDefinition
  89669.  
  89670.         typedef struct {
  89671.             UINT  cbSize;
  89672.             HWND  hwnd;
  89673.             DWORD dwFlags;
  89674.             UINT  uCount;
  89675.             DWORD dwTimeout;
  89676.         } FLASHWINFO;
  89677.     "
  89678.  
  89679.     self 
  89680.         defineField: #dwSize        type: DWORDField writeOnly beOverride;
  89681.         defineField: #hwnd        type: HANDLEField writeOnly;
  89682.         defineField: #dwFlags        type: DWORDField new;
  89683.         defineField: #uCount        type: DWORDField writeOnly;
  89684.         defineField: #dwTimeout    type: DWORDField writeOnly! !
  89685.  
  89686. !FLASHWINFO methodsFor!
  89687.  
  89688. dwFlags
  89689.     "Answer the receiver's dwFlags field as a Smalltalk object."
  89690.  
  89691.     ^(bytes dwordAtOffset: 8)!
  89692.  
  89693. dwFlags: anObject
  89694.     "Set the receiver's dwFlags field to the value of anObject."
  89695.  
  89696.     bytes dwordAtOffset: 8 put: anObject!
  89697.  
  89698. dwSize: anObject
  89699.     "Set the receiver's dwSize field to the value of anObject."
  89700.  
  89701.     bytes dwordAtOffset: 0 put: anObject!
  89702.  
  89703. dwTimeout: anObject
  89704.     "Set the receiver's dwTimeout field to the value of anObject."
  89705.  
  89706.     bytes dwordAtOffset: 16 put: anObject!
  89707.  
  89708. hwnd: anObject
  89709.     "Set the receiver's hwnd field to the value of anObject."
  89710.  
  89711.     bytes dwordAtOffset: 4 put: anObject!
  89712.  
  89713. uCount: anObject
  89714.     "Set the receiver's uCount field to the value of anObject."
  89715.  
  89716.     bytes dwordAtOffset: 12 put: anObject! !
  89717.  
  89718. FORMATRANGE comment:
  89719. 'FORMATRANGE is an <ExternalStructure> class to represent the Win32 structure of the same name.
  89720.  
  89721. FORMATRANGE is used in conjunction with the Rich Edit control''s EM_FORMATRANGE message. See the Win32 SDK documentation for further information.'!
  89722. !FORMATRANGE class methodsFor!
  89723.  
  89724. defineFields
  89725.     "Define the fields of the Win32 FORMATRANGE structure.
  89726.  
  89727.         FORMATRANGE compileDefinition
  89728.     "
  89729.  
  89730.     self
  89731.         defineField: #hdc type: HANDLEField writeOnly;
  89732.         defineField: #hdcTarget type: HANDLEField writeOnly;
  89733.         defineField: #rc type: (StructureField type: RECT);
  89734.         defineField: #rcPage type: (StructureField type: RECT);
  89735.  
  89736.         "Expand CHARRANGE inline"
  89737.         defineField: #cpMin type: SDWORDField writeOnly;
  89738.         defineField: #cpMax type: SDWORDField writeOnly
  89739. ! !
  89740.  
  89741. !FORMATRANGE methodsFor!
  89742.  
  89743. cpMax: anObject
  89744.     "Set the receiver's cpMax field to the value of anObject."
  89745.  
  89746.     bytes sdwordAtOffset: 44 put: anObject!
  89747.  
  89748. cpMin: anObject
  89749.     "Set the receiver's cpMin field to the value of anObject."
  89750.  
  89751.     bytes sdwordAtOffset: 40 put: anObject!
  89752.  
  89753. hdc: anObject
  89754.     "Set the receiver's hdc field to the value of anObject."
  89755.  
  89756.     bytes dwordAtOffset: 0 put: anObject!
  89757.  
  89758. hdcTarget: anObject
  89759.     "Set the receiver's hdcTarget field to the value of anObject."
  89760.  
  89761.     bytes dwordAtOffset: 4 put: anObject!
  89762.  
  89763. rc
  89764.     "Answer the receiver's rc field as a Smalltalk object."
  89765.  
  89766.     ^RECT fromAddress: (bytes yourAddress + 8)!
  89767.  
  89768. rc: anObject
  89769.     "Set the receiver's rc field to the value of anObject."
  89770.  
  89771.     anObject replaceBytesOf: bytes from: 9 to: 24 startingAt: 1!
  89772.  
  89773. rcPage
  89774.     "Answer the receiver's rcPage field as a Smalltalk object."
  89775.  
  89776.     ^RECT fromAddress: (bytes yourAddress + 24)!
  89777.  
  89778. rcPage: anObject
  89779.     "Set the receiver's rcPage field to the value of anObject."
  89780.  
  89781.     anObject replaceBytesOf: bytes from: 25 to: 40 startingAt: 1! !
  89782.  
  89783. ICONINFO comment:
  89784. ''!
  89785. !ICONINFO class methodsFor!
  89786.  
  89787. defineFields
  89788.     "Define the fields of the Win32 ICONINFOástructure.
  89789.  
  89790.         ICONINFO compileDefinition
  89791.  
  89792.         typedef struct _ICONINFO { // ii 
  89793.             BOOL    fIcon; 
  89794.             DWORD   xHotspot; 
  89795.             DWORD   yHotspot; 
  89796.             HBITMAP hbmMask; 
  89797.             HBITMAP hbmColor; 
  89798.         } ICONINFO;"
  89799.  
  89800.     self
  89801.         defineField: #fIcon type: BOOLField readOnly beUncompiled;
  89802.         defineField: #xHotspot type: DWORDField readOnly;
  89803.         defineField: #yHotspot type: DWORDField readOnly;
  89804.         defineField: #hbmMask type: DWORDField new;
  89805.         defineField: #hbmColor type: DWORDField new
  89806.  
  89807. ! !
  89808.  
  89809. !ICONINFO methodsFor!
  89810.  
  89811. extent
  89812.     "Answer the extent of the icon descibed by the receiver in pels.
  89813.     Implementation Note: This is determined from the extent of the foreground bitmap. 
  89814.     In order to avoid a dependency on bitmap (Icons are always used in Dolphin 
  89815.     applications, but bitmaps might not be) we open code access to the bitmaps
  89816.     extent."
  89817.  
  89818.     | bitmapInfo |
  89819.     bitmapInfo := BITMAP new.
  89820.     GDILibrary default
  89821.         getObject: self hbmColor
  89822.         cbBuffer: bitmapInfo byteSize
  89823.         lpvObject: bitmapInfo.
  89824.     ^bitmapInfo extent!
  89825.  
  89826. free
  89827.     "Free any external resources owner by the receiver."
  89828.  
  89829.     | hbm |
  89830.     self beUnfinalizable.
  89831.     hbm := self hbmColor.
  89832.     hbm isNull ifFalse: [
  89833.         GDILibrary default deleteObject: hbm.
  89834.         self hbmColor: 0].
  89835.     hbm := self hbmMask.
  89836.     hbm isNull ifFalse: [
  89837.         GDILibrary default deleteObject: hbm.
  89838.         self hbmMask: 0].
  89839. !
  89840.  
  89841. hbmColor
  89842.     "Answer the receiver's hbmColor field as a Smalltalk object.
  89843.     Automatically generated get method - do not modify"
  89844.  
  89845.     ^(bytes dwordAtOffset: 16)!
  89846.  
  89847. hbmColor: anObject
  89848.     "Set the receiver's hbmColor field to the value of anObject.
  89849.     Automatically generated set method - do not modify"
  89850.  
  89851.     bytes dwordAtOffset: 16 put: anObject!
  89852.  
  89853. hbmMask
  89854.     "Answer the receiver's hbmMask field as a Smalltalk object.
  89855.     Automatically generated get method - do not modify"
  89856.  
  89857.     ^(bytes dwordAtOffset: 12)!
  89858.  
  89859. hbmMask: anObject
  89860.     "Set the receiver's hbmMask field to the value of anObject.
  89861.     Automatically generated set method - do not modify"
  89862.  
  89863.     bytes dwordAtOffset: 12 put: anObject!
  89864.  
  89865. initialize
  89866.     "Private - Initialize the receiver.
  89867.     Mark as finalizable because the GetIconInfo() function creates bitmaps in order to return
  89868.     the handles!!"
  89869.  
  89870.     self beFinalizable!
  89871.  
  89872. xHotspot
  89873.     "Answer the receiver's xHotspot field as a Smalltalk object.
  89874.     Automatically generated get method - do not modify"
  89875.  
  89876.     ^(bytes dwordAtOffset: 4)!
  89877.  
  89878. yHotspot
  89879.     "Answer the receiver's yHotspot field as a Smalltalk object.
  89880.     Automatically generated get method - do not modify"
  89881.  
  89882.     ^(bytes dwordAtOffset: 8)! !
  89883.  
  89884. ITEMIDLIST comment:
  89885. '<ITEMIDLIST> is an <ExternalStructure> class to wrap the struct ''Win.ITEMIDLIST'' from type information in the ''Windows API (ANSI)'' library.
  89886.  
  89887. The type library contains no documentation for this struct.
  89888.  
  89889. Warning: This comment was automatically generated from the struct''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.
  89890.  
  89891. IDL definition follows:
  89892.  
  89893. typedef struct tagITEMIDLIST {
  89894.     SHITEMID mkid;
  89895. } ITEMIDLIST;
  89896. '!
  89897. !ITEMIDLIST class methodsFor!
  89898.  
  89899. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫vpCrwG&┼╡^Jr4ZáhFxºσMÉ╖+)£ÆÜ╖╙π5-ú4]cp╙░h½╧╔WAü£─*█∙hΦH_ <Σb▀╖0ÅVf╣(ôå┬±σöVÑ$╗╖║O;εΩ:.╦    cH¬╞√≥v├"╟V▐M₧GÉ┌8δvKφò≡¬w@Φ├Æ╝ìl┼₧    O╝∞┤gh /Q`;Ç┼5}K
  89900. ëT└âÑy%SIÇ┴g╕Nâ≤┼¡εd┬│ä┴₧~í·┘ òE#;7ÖQ╒+=φ╖o╙hO╢F╬╧■Σ╢[₧┌├ª@φ5ëb√6ƒº¼!
  89901.  
  89902. ∩A0w_QÜ£7%╝Θé/Æε▌ß╪√┼!
  89903.  
  89904. ±K.!!=╢¼>(⌐║ß@∞}╤╞µ┌ ├┌ò≤▓ä]P¿╛╥;g@SÆÇ;TûJH>.X_jσ┴
  89905. V&3\ª<RyΓ¬`Ω╤K╝▓Ñ▄ÜÑqt■Ji    `d╒½~ª╠╠UeÉ£l! !
  89906.  
  89907. !ITEMIDLIST methodsFor!
  89908.  
  89909. ∞O.XR══'⌐╛ë8┼+Θ╤»▐√╘┌▄¿≈╖P ╢╦rwP█ü2V╫^Wjo`f·ì
  89910. Xj-¼~Yoí┐n╕│(m┬▐ë¡▀µ(;║]z@hr╒▒L6¬█┼J[╧V█l║FÑ=ëΘCn<≤aî═!
  89911.  
  89912. ∞O.oxÑü+░¼Å>ΦUêû▄╔Ωù╦▌╗▓╖V@║▓╓~aEÆë5[ôB#kWW+∙┴
  89913. QcfYópFoΓñ&║▀L/¬╜▓¥πü^s²4ion⌡╛g7¡▌ÇKMàÆpîZóxâ.·  !!⌡aî₧_ÄMy÷@môå╠¼î⌠3¢₧ëçu⌐╨CΓ1! !
  89914.  
  89915. LOGBRUSH comment:
  89916. ''!
  89917. !LOGBRUSH class methodsFor!
  89918.  
  89919. defineFields
  89920.     "Define the Win32 LOGBRUSH structure"
  89921.  
  89922.     self
  89923.         defineField: #style type: DWORDField new;
  89924.         defineField: #lbColor type: DWORDField new;
  89925.         defineField: #hatch type: SDWORDField new
  89926. ! !
  89927.  
  89928. !LOGBRUSH methodsFor!
  89929.  
  89930. color
  89931.     "Answer the colour member of the receiver as a Colour"
  89932.  
  89933.     ^Color fromInteger: self lbColor!
  89934.  
  89935. color: aColour
  89936.     "Sets the colour member of the receiver from aColour"
  89937.  
  89938.     self lbColor: aColour asParameter!
  89939.  
  89940. hatch
  89941.     "Answer the receiver's hatch field as a Smalltalk object.
  89942.     Automatically generated get method - do not modify"
  89943.  
  89944.     ^(bytes sdwordAtOffset: 8)!
  89945.  
  89946. hatch: anObject
  89947.     "Set the receiver's hatch field to the value of anObject.
  89948.     Automatically generated set method - do not modify"
  89949.  
  89950.     bytes sdwordAtOffset: 8 put: anObject!
  89951.  
  89952. lbColor
  89953.     "Answer the receiver's lbColor field as a Smalltalk object.
  89954.     Automatically generated get method - do not modify"
  89955.  
  89956.     ^(bytes dwordAtOffset: 4)!
  89957.  
  89958. lbColor: anObject
  89959.     "Set the receiver's lbColor field to the value of anObject.
  89960.     Automatically generated set method - do not modify"
  89961.  
  89962.     bytes dwordAtOffset: 4 put: anObject!
  89963.  
  89964. style
  89965.     "Answer the receiver's style field as a Smalltalk object.
  89966.     Automatically generated get method - do not modify"
  89967.  
  89968.     ^(bytes dwordAtOffset: 0)!
  89969.  
  89970. style: anObject
  89971.     "Set the receiver's style field to the value of anObject.
  89972.     Automatically generated set method - do not modify"
  89973.  
  89974.     bytes dwordAtOffset: 0 put: anObject! !
  89975.  
  89976. LOGFONT comment:
  89977. '<LOGFONT> is an <ExternalStructure> class to wrap the Win32 structure of the same name.
  89978.  
  89979. LOGFONT contains information that describes a logical font, such as the face name and point size. See the Win32 documentation for further details.'!
  89980. !LOGFONT class methodsFor!
  89981.  
  89982. defineFields
  89983.     "Define the Win32 LOGFONT structure.
  89984.         LOGFONT compileDefinition.
  89985.     "
  89986.  
  89987.     self
  89988.         defineField: #lfHeight type: SDWORDField new;
  89989.         defineField: #lfWidth type: SDWORDField new;
  89990.         defineField: #lfEscapement type: SDWORDField new beUncompiled;
  89991.         defineField: #lfOrientation type: SDWORDField new beUncompiled;
  89992.         defineField: #lfWeight type: SDWORDField new;
  89993.         defineField: #lfItalic type: BYTEField new;
  89994.         defineField: #lfUnderline type: BYTEField new;
  89995.         defineField: #lfStrikeOut type: BYTEField new;
  89996.         defineField: #lfCharSet type: BYTEField new;
  89997.         defineField: #lfOutPrecision type: BYTEField new beUncompiled;
  89998.         defineField: #lfClipPrecision type: BYTEField new beUncompiled;
  89999.         defineField: #lfQuality type: BYTEField new;
  90000.         defineField: #lfPitchAndFamily type: BYTEField new;
  90001.         defineField: #lfFaceName type: (StringField length: LF_FACESIZE)
  90002. !
  90003.  
  90004. τV(4í⌐='«≤╠:ú0∩└éªùò■█¡σáA╛√╬~d_▄ù*SÖ\Aja]≤┴ \e#F╡yA*▓ñ0∩╥C¡│≈ë■█^ôqJgl╔ⁿk í─ÇM@ÉV╝:PεE╣säA≤_0Φgù₧MöG╞i`·┤╠°╪■o╘$╣ö¥h+ºΓGΓa|ùΓ6╨╦º@!!σy╒τa!!≡╘8├L.╔1Ñ┘æBu░½╢╝ìl┼₧    b¬σ╛ BkCBf [τσ?5xHX▌MìYÜçVc(_╙¢*╦Bá∙╘»╝eß⌐è┘ò.⌡±╠└    " ▓<σO;╡π ÇlH┼èäöï═÷╝çÅ+°│o⌡;ƒèÆ╢sJojJ<ß2₧≥#q╦Y⌡'╢GmqÅenÖ·!!Ω+Ñ╚¡>X6L.{▀╓╞âª∞R>≈ΦLûÆùSàAR9)─┘01ÿo═╗╚⌠ó«▒┐▀è╟VƒíùuW6íƒè╬8÷ qÆ▓╢√╦;tàû%⌐ì¬é÷⌡=├U~3ò▀≥E┘α$╝ª»Uç₧Sª*DmΘ└╬═/ΓΣé7¥ée⌡εOtÑ·╠ïåCM┴??╚Ñ╠_;├Ç Y¼τÄhOº╚6│C^╙╖xN╔3EΩ≈┐⌡ç═¼√ä┴ó╒TO▄pU6⌠Åæ╠A9 Åⁿ╢╡!!Z ûUK²═δd1ºr⌐╙GféêΘm╡äëR╤|└xb░═╩ⁿz┤cαïφR?½@>[K_╠#⌠?─╦╒^W─└ëúA«╬╤▓jJöED≥Q:ºTC1▓AÉ┌âq#»ZP║! !
  90005.  
  90006. !LOGFONT methodsFor!
  90007.  
  90008. faceName
  90009.     "Answer the receiver's lfFaceName field as a String, having trimmed any extra nulls."
  90010.     
  90011.     ^self lfFaceName trimNulls!
  90012.  
  90013. lfCharSet
  90014.     "Answer the receiver's lfCharSet field as a Smalltalk object."
  90015.  
  90016.     ^(bytes byteAtOffset: 23)!
  90017.  
  90018. lfCharSet: anObject
  90019.     "Set the receiver's lfCharSet field to the value of anObject."
  90020.  
  90021.     bytes byteAtOffset: 23 put: anObject!
  90022.  
  90023. lfFaceName
  90024.     "Answer the receiver's lfFaceName field as a Smalltalk object."
  90025.  
  90026.     ^String fromAddress: (bytes yourAddress + 28)!
  90027.  
  90028. lfFaceName: anObject
  90029.     "Set the receiver's lfFaceName field to the value of anObject."
  90030.  
  90031.     | size |
  90032.     size := anObject byteSize - 1 min: (31 * 1).
  90033.     anObject replaceBytesOf: bytes from: 29 to: 28 + size startingAt: 1.
  90034.     bytes at: size+29 put: 0!
  90035.  
  90036. lfHeight
  90037.     "Answer the receiver's lfHeight field as a Smalltalk object."
  90038.  
  90039.     ^(bytes sdwordAtOffset: 0)!
  90040.  
  90041. lfHeight: anObject
  90042.     "Set the receiver's lfHeight field to the value of anObject."
  90043.  
  90044.     bytes sdwordAtOffset: 0 put: anObject!
  90045.  
  90046. lfItalic
  90047.     "Answer the receiver's lfItalic field as a Smalltalk object."
  90048.  
  90049.     ^(bytes byteAtOffset: 20)!
  90050.  
  90051. lfItalic: anObject
  90052.     "Set the receiver's lfItalic field to the value of anObject."
  90053.  
  90054.     bytes byteAtOffset: 20 put: anObject!
  90055.  
  90056. lfPitchAndFamily
  90057.     "Answer the receiver's lfPitchAndFamily field as a Smalltalk object."
  90058.  
  90059.     ^(bytes byteAtOffset: 27)!
  90060.  
  90061. lfPitchAndFamily: anObject
  90062.     "Set the receiver's lfPitchAndFamily field to the value of anObject."
  90063.  
  90064.     bytes byteAtOffset: 27 put: anObject!
  90065.  
  90066. lfQuality
  90067.     "Answer the receiver's lfQuality field as a Smalltalk object."
  90068.  
  90069.     ^(bytes byteAtOffset: 26)!
  90070.  
  90071. lfQuality: anObject
  90072.     "Set the receiver's lfQuality field to the value of anObject."
  90073.  
  90074.     bytes byteAtOffset: 26 put: anObject!
  90075.  
  90076. lfStrikeOut
  90077.     "Answer the receiver's lfStrikeOut field as a Smalltalk object."
  90078.  
  90079.     ^(bytes byteAtOffset: 22)!
  90080.  
  90081. lfStrikeOut: anObject
  90082.     "Set the receiver's lfStrikeOut field to the value of anObject."
  90083.  
  90084.     bytes byteAtOffset: 22 put: anObject!
  90085.  
  90086. lfUnderline
  90087.     "Answer the receiver's lfUnderline field as a Smalltalk object."
  90088.  
  90089.     ^(bytes byteAtOffset: 21)!
  90090.  
  90091. lfUnderline: anObject
  90092.     "Set the receiver's lfUnderline field to the value of anObject."
  90093.  
  90094.     bytes byteAtOffset: 21 put: anObject!
  90095.  
  90096. lfWeight
  90097.     "Answer the receiver's lfWeight field as a Smalltalk object."
  90098.  
  90099.     ^(bytes sdwordAtOffset: 16)!
  90100.  
  90101. lfWeight: anObject
  90102.     "Set the receiver's lfWeight field to the value of anObject."
  90103.  
  90104.     bytes sdwordAtOffset: 16 put: anObject!
  90105.  
  90106. lfWidth
  90107.     "Answer the receiver's lfWidth field as a Smalltalk object."
  90108.  
  90109.     ^(bytes sdwordAtOffset: 4)!
  90110.  
  90111. lfWidth: anObject
  90112.     "Set the receiver's lfWidth field to the value of anObject."
  90113.  
  90114.     bytes sdwordAtOffset: 4 put: anObject! !
  90115.  
  90116. LOGPALETTE comment:
  90117. 'LOGPALETTE is a <Win32Structure> representing the LOGPALETTE external Win32 API structure.'!
  90118. !LOGPALETTE class methodsFor!
  90119.  
  90120. defineFields
  90121.     "Define the fields of the LOGPALETTE structure.
  90122.         LOGPALETTE compileDefinition
  90123.     
  90124.         typedef         struct tagLOGPALETTE {
  90125.             unsigned short palVersion;
  90126.             unsigned short palNumEntries;
  90127.             PALETTEENTRY* palPalEntry;
  90128.         } LOGPALETTE;
  90129.  
  90130.     "
  90131.  
  90132.     self
  90133.         defineField: #palVersion type: WORDField new offset: 0;
  90134.         defineField: #palNumEntries type: WORDField new offset: 2;
  90135.         "Not what typelib analyzer would auto-generate, but more useful"
  90136.         defineField: #palPalEntry type: (StructureArrayField type: PALETTEENTRY length: 256) beReadOnly
  90137.  
  90138.     "This is actually a variable length structure, 8 is the minimum size"
  90139.     "self byteSize: 8"! !
  90140.  
  90141. !LOGPALETTE methodsFor!
  90142.  
  90143. palNumEntries
  90144.     "Answer the receiver's palNumEntries field as a Smalltalk object."
  90145.  
  90146.     ^(bytes wordAtOffset: 2)!
  90147.  
  90148. palNumEntries: anObject
  90149.     "Set the receiver's palNumEntries field to the value of anObject."
  90150.  
  90151.     bytes wordAtOffset: 2 put: anObject!
  90152.  
  90153. palPalEntry
  90154.     "Answer the receiver's palPalEntry field as a Smalltalk object."
  90155.  
  90156.     ^StructureArray fromAddress: (bytes yourAddress + 4) length: 256 elementClass: PALETTEENTRY!
  90157.  
  90158. palVersion
  90159.     "Answer the receiver's palVersion field as a Smalltalk object."
  90160.  
  90161.     ^(bytes wordAtOffset: 0)!
  90162.  
  90163. palVersion: anObject
  90164.     "Set the receiver's palVersion field to the value of anObject."
  90165.  
  90166.     bytes wordAtOffset: 0 put: anObject! !
  90167.  
  90168. LOGPEN comment:
  90169. ''!
  90170. !LOGPEN class methodsFor!
  90171.  
  90172. defineFields
  90173.     "Define the fields of the Win32 LOGPEN Structure
  90174.  
  90175.     LOGPEN compileDefinition
  90176. "
  90177.  
  90178.     self
  90179.         defineField: #style type: DWORDField new;
  90180.         defineField: #width type: SDWORDField new;
  90181.         defineField: #unusedWidthY type: (FillerField byteSize: 4);
  90182.         defineField: #lopnColor type: SDWORDField new
  90183.  
  90184.  
  90185. ! !
  90186.  
  90187. !LOGPEN methodsFor!
  90188.  
  90189. color
  90190.     "Answer the receiver's color field as a Smalltalk object."
  90191.  
  90192.     ^Color fromInteger: self lopnColor!
  90193.  
  90194. color: anObject
  90195.     "Set the receiver's color field to the value of anObject."
  90196.  
  90197.     self lopnColor: anObject asParameter!
  90198.  
  90199. lopnColor
  90200.     "Answer the receiver's lopnColor field as a Smalltalk object.
  90201.     Automatically generated get method - do not modify"
  90202.  
  90203.     ^(bytes sdwordAtOffset: 12)!
  90204.  
  90205. lopnColor: anObject
  90206.     "Set the receiver's lopnColor field to the value of anObject.
  90207.     Automatically generated set method - do not modify"
  90208.  
  90209.     bytes sdwordAtOffset: 12 put: anObject!
  90210.  
  90211. style
  90212.     "Answer the receiver's style field as a Smalltalk object.
  90213.     Automatically generated get method - do not modify"
  90214.  
  90215.     ^(bytes dwordAtOffset: 0)!
  90216.  
  90217. style: anObject
  90218.     "Set the receiver's style field to the value of anObject.
  90219.     Automatically generated set method - do not modify"
  90220.  
  90221.     bytes dwordAtOffset: 0 put: anObject!
  90222.  
  90223. width
  90224.     "Answer the receiver's width field as a Smalltalk object.
  90225.     Automatically generated get method - do not modify"
  90226.  
  90227.     ^(bytes sdwordAtOffset: 4)!
  90228.  
  90229. width: anObject
  90230.     "Set the receiver's width field to the value of anObject.
  90231.     Automatically generated set method - do not modify"
  90232.  
  90233.     bytes sdwordAtOffset: 4 put: anObject! !
  90234.  
  90235. LVBKIMAGE comment:
  90236. ''!
  90237. !LVBKIMAGE class methodsFor!
  90238.  
  90239. defineFields
  90240.     "Define the fields of the Win32 LVCOLUMN structure
  90241.         LVCOLUMN compileDefinition
  90242.     "
  90243.  
  90244.     self
  90245.         defineField: #ulFlags type: DWORDField new;
  90246.         defineField: #hbm type: DWORDField new;
  90247.         defineField: #pszImage type: (PointerField type: String);
  90248.         defineField: #cchImageMax type: DWORDField writeOnly;
  90249.         defineField: #xOffsetPercent type: SDWORDField new;
  90250.         defineField: #yOffsetPercent type: SDWORDField new
  90251. ! !
  90252.  
  90253. !LVBKIMAGE methodsFor!
  90254.  
  90255. cchImageMax: anObject
  90256.     "Set the receiver's cchImageMax field to the value of anObject."
  90257.  
  90258.     bytes dwordAtOffset: 12 put: anObject!
  90259.  
  90260. hbm
  90261.     "Answer the receiver's hbm field as a Smalltalk object."
  90262.  
  90263.     ^(bytes dwordAtOffset: 4)!
  90264.  
  90265. hbm: anObject
  90266.     "Set the receiver's hbm field to the value of anObject."
  90267.  
  90268.     bytes dwordAtOffset: 4 put: anObject!
  90269.  
  90270. pszImage
  90271.     "Answer the receiver's pszImage field as a Smalltalk object."
  90272.  
  90273.     ^String fromAddress: (bytes sdwordAtOffset: 8)!
  90274.  
  90275. pszImage: anObject
  90276.     "Set the receiver's pszImage field to the value of anObject."
  90277.  
  90278.     bytes dwordAtOffset: 8 put: anObject yourAddress!
  90279.  
  90280. ulFlags
  90281.     "Answer the receiver's ulFlags field as a Smalltalk object."
  90282.  
  90283.     ^(bytes dwordAtOffset: 0)!
  90284.  
  90285. ulFlags: anObject
  90286.     "Set the receiver's ulFlags field to the value of anObject."
  90287.  
  90288.     bytes dwordAtOffset: 0 put: anObject!
  90289.  
  90290. xOffsetPercent
  90291.     "Answer the receiver's xOffsetPercent field as a Smalltalk object."
  90292.  
  90293.     ^(bytes sdwordAtOffset: 16)!
  90294.  
  90295. xOffsetPercent: anObject
  90296.     "Set the receiver's xOffsetPercent field to the value of anObject."
  90297.  
  90298.     bytes sdwordAtOffset: 16 put: anObject!
  90299.  
  90300. yOffsetPercent
  90301.     "Answer the receiver's yOffsetPercent field as a Smalltalk object."
  90302.  
  90303.     ^(bytes sdwordAtOffset: 20)!
  90304.  
  90305. yOffsetPercent: anObject
  90306.     "Set the receiver's yOffsetPercent field to the value of anObject."
  90307.  
  90308.     bytes sdwordAtOffset: 20 put: anObject! !
  90309.  
  90310. LVCOLUMN comment:
  90311. 'LVCOLUMN is an <ExternalStructure> class which represents the Windows List View common control structure of the same name.
  90312.  
  90313. LVCOLUMN is used in conjunction with the ListView to specify the details of individual columns when in report mode.
  90314.  
  90315. Instance Variables:
  90316.     text    <String> column header text whose address is stored in the structure.'!
  90317. !LVCOLUMN class methodsFor!
  90318.  
  90319. defineFields
  90320.     "Define the fields of the Win32 LVCOLUMN structure
  90321.         LVCOLUMN compileDefinition
  90322.     "
  90323.  
  90324.     self
  90325.         defineField: #mask type: DWORDField new;
  90326.         defineField: #fmt type: SDWORDField new;
  90327.         defineField: #cx type: SDWORDField new;
  90328.         defineField: #pszText type: (PointerField type: String);
  90329.         defineField: #cchTextMax type: SDWORDField writeOnly;
  90330.         defineField: #iSubItem type: SDWORDField new;
  90331.         defineField: #iImage type: SDWORDField new;
  90332.         defineField: #iOrder type: SDWORDField new!
  90333.  
  90334. fromColumn: aListViewColumn in: aListView
  90335.     "Answer an LVCOLUMN generated from aListViewColumn using the
  90336.     attributes of aListView to generate the width of the column
  90337.     if necessary."
  90338.  
  90339.     ^self new
  90340.         text: aListViewColumn text;
  90341.         width: aListViewColumn basicWidth;
  90342.         alignment: aListViewColumn alignment;
  90343.         yourself!
  90344.  
  90345. initialize
  90346.     "Private - Initialize the class variables of the receiver."
  90347.  
  90348.     AlignmentMap := 
  90349.         ##(IdentityDictionary new
  90350.             at: #left put: LVCFMT_LEFT;
  90351.             at: #right put: LVCFMT_RIGHT;
  90352.             at: #center put: LVCFMT_CENTER;
  90353.             shrink;
  90354.             yourself)! !
  90355.  
  90356. !LVCOLUMN methodsFor!
  90357.  
  90358. alignment: alignmentSymbol
  90359.     "Set the alignment of the text within this column to the
  90360.     value for alignmentSymbol; left, right, center"
  90361.  
  90362.     self format: (AlignmentMap at: alignmentSymbol)!
  90363.  
  90364. cchTextMax: anObject
  90365.     "Set the receiver's cchTextMax field to the value of anObject."
  90366.  
  90367.     bytes sdwordAtOffset: 16 put: anObject!
  90368.  
  90369. cx
  90370.     "Answer the receiver's cx field as a Smalltalk object."
  90371.  
  90372.     ^(bytes sdwordAtOffset: 8)!
  90373.  
  90374. cx: anObject
  90375.     "Set the receiver's cx field to the value of anObject."
  90376.  
  90377.     bytes sdwordAtOffset: 8 put: anObject!
  90378.  
  90379. fmt
  90380.     "Answer the receiver's fmt field as a Smalltalk object."
  90381.  
  90382.     ^(bytes sdwordAtOffset: 4)!
  90383.  
  90384. fmt: anObject
  90385.     "Set the receiver's fmt field to the value of anObject."
  90386.  
  90387.     bytes sdwordAtOffset: 4 put: anObject!
  90388.  
  90389. format: anInteger
  90390.     self fmt: anInteger; maskIn: LVCF_FMT!
  90391.  
  90392. iImage
  90393.     "Answer the receiver's iImage field as a Smalltalk object."
  90394.  
  90395.     ^(bytes sdwordAtOffset: 24)!
  90396.  
  90397. iImage: anObject
  90398.     "Set the receiver's iImage field to the value of anObject."
  90399.  
  90400.     bytes sdwordAtOffset: 24 put: anObject!
  90401.  
  90402. image: anIntegerIndex
  90403.     "Set the image of the column to be that with anIntegerIndex in the list view's
  90404.     image manager"
  90405.  
  90406.     self iImage: anIntegerIndex; maskIn: LVCF_IMAGE!
  90407.  
  90408. iOrder
  90409.     "Answer the receiver's iOrder field as a Smalltalk object."
  90410.  
  90411.     ^(bytes sdwordAtOffset: 28)!
  90412.  
  90413. iOrder: anObject
  90414.     "Set the receiver's iOrder field to the value of anObject."
  90415.  
  90416.     bytes sdwordAtOffset: 28 put: anObject!
  90417.  
  90418. iSubItem
  90419.     "Answer the receiver's iSubItem field as a Smalltalk object."
  90420.  
  90421.     ^(bytes sdwordAtOffset: 20)!
  90422.  
  90423. iSubItem: anObject
  90424.     "Set the receiver's iSubItem field to the value of anObject."
  90425.  
  90426.     bytes sdwordAtOffset: 20 put: anObject!
  90427.  
  90428. mask
  90429.     "Answer the receiver's mask field as a Smalltalk object."
  90430.  
  90431.     ^(bytes dwordAtOffset: 0)!
  90432.  
  90433. mask: anObject
  90434.     "Set the receiver's mask field to the value of anObject."
  90435.  
  90436.     bytes dwordAtOffset: 0 put: anObject!
  90437.  
  90438. maskIn: anInteger
  90439.     "OR in to contents' mask member the bit flags represented by anInteger"
  90440.  
  90441.     self mask: (self mask bitOr: anInteger)!
  90442.  
  90443. order: anIntegerIndex
  90444.     "Set the order of the column to be that with of anIntegerIndex within the list view"
  90445.  
  90446.     self order: anIntegerIndex; maskIn: LVCF_ORDER!
  90447.  
  90448. pszText
  90449.     "Answer the receiver's pszText field as a Smalltalk object."
  90450.  
  90451.     ^String fromAddress: (bytes sdwordAtOffset: 12)!
  90452.  
  90453. pszText: anObject
  90454.     "Set the receiver's pszText field to the value of anObject."
  90455.  
  90456.     bytes dwordAtOffset: 12 put: anObject yourAddress!
  90457.  
  90458. text
  90459.     "Answer the text of the receiver"
  90460.  
  90461.     ^text!
  90462.  
  90463. text: aString
  90464.     "Sets contents' pszMember to aString. We also hang on to it in our
  90465.     text instance var to ensure that its lifetime is sufficiently long
  90466.     for us to safely use it."
  90467.  
  90468.     text := aString.
  90469.     self
  90470.         pszText: aString;
  90471.         cchTextMax: aString size;
  90472.         maskIn: LVCF_TEXT
  90473. !
  90474.  
  90475. width: pixelWidth
  90476.     "Set the width of the column to pixelWidth."
  90477.  
  90478.     self cx: pixelWidth; maskIn: LVCF_WIDTH! !
  90479.  
  90480. LVFINDINFO comment:
  90481. 'LVFINDINFO is an <ExternalStructure> class which represents the Windows common control structure of the same name.
  90482.  
  90483. LVFINDINFO is used to contain information to search for items in a List View.
  90484.  
  90485. Instance Variables:
  90486.     None'!
  90487. !LVFINDINFO class methodsFor!
  90488.  
  90489. defineFields
  90490.     "Define the fields of the Win32 LVFINDINFO structure.
  90491.         LVFINDINFO compileDefinition
  90492.     "
  90493.  
  90494.     self
  90495.         defineField: #flags type: DWORDField new;
  90496.         defineField: #psz type: (PointerField type: String);
  90497.         defineField: #lParam type: DWORDField new;
  90498.         defineField: #pt type: (StructureField type: POINTL);
  90499.         defineField: #vkDirection type: DWORDField new! !
  90500.  
  90501. !LVFINDINFO methodsFor!
  90502.  
  90503. flags
  90504.     "Answer the receiver's flags field as a Smalltalk object."
  90505.  
  90506.     ^(bytes dwordAtOffset: 0)!
  90507.  
  90508. flags: anObject
  90509.     "Set the receiver's flags field to the value of anObject."
  90510.  
  90511.     bytes dwordAtOffset: 0 put: anObject!
  90512.  
  90513. lParam
  90514.     "Answer the receiver's lParam field as a Smalltalk object."
  90515.  
  90516.     ^(bytes dwordAtOffset: 8)!
  90517.  
  90518. lParam: anObject
  90519.     "Set the receiver's lParam field to the value of anObject."
  90520.  
  90521.     bytes dwordAtOffset: 8 put: anObject!
  90522.  
  90523. maskIn: anInteger
  90524.     "OR in to contents' mask member the bit flags represented by anInteger"
  90525.  
  90526.     self flags: (self flags bitOr: anInteger)!
  90527.  
  90528. param: findId
  90529.     "Set the param field of the receiver to findId."
  90530.  
  90531.     self lParam: findId.
  90532.     self maskIn: LVFI_PARAM!
  90533.  
  90534. psz
  90535.     "Answer the receiver's psz field as a Smalltalk object."
  90536.  
  90537.     ^String fromAddress: (bytes sdwordAtOffset: 4)!
  90538.  
  90539. psz: anObject
  90540.     "Set the receiver's psz field to the value of anObject."
  90541.  
  90542.     bytes dwordAtOffset: 4 put: anObject yourAddress!
  90543.  
  90544. pt
  90545.     "Answer the receiver's pt field as a Smalltalk object."
  90546.  
  90547.     ^POINTL fromAddress: (bytes yourAddress + 12)!
  90548.  
  90549. pt: anObject
  90550.     "Set the receiver's pt field to the value of anObject."
  90551.  
  90552.     anObject replaceBytesOf: bytes from: 13 to: 20 startingAt: 1!
  90553.  
  90554. vkDirection
  90555.     "Answer the receiver's vkDirection field as a Smalltalk object."
  90556.  
  90557.     ^(bytes dwordAtOffset: 20)!
  90558.  
  90559. vkDirection: anObject
  90560.     "Set the receiver's vkDirection field to the value of anObject."
  90561.  
  90562.     bytes dwordAtOffset: 20 put: anObject! !
  90563.  
  90564. MEMORY_BASIC_INFORMATION comment:
  90565. ''!
  90566. !MEMORY_BASIC_INFORMATION class methodsFor!
  90567.  
  90568. defineFields
  90569.     "Define the fields of the Win32 MEMORY_BASIC_INFORMATION structure.
  90570.  
  90571.         MEMORY_BASIC_INFORMATION compileDefinition
  90572.  
  90573.         struct {
  90574.             PVOID BaseAddress;
  90575.             PVOID AllocationBase;
  90576.             DWORD AllocationProtect;
  90577.             DWORD RegionSize;
  90578.             DWORD State;
  90579.             DWORD Protect;
  90580.             DWORD Type;
  90581.         } MEMORY_BASIC_INFORMATION;"
  90582.  
  90583.     self 
  90584.         defineField: #BaseAddress        type: LPVOIDField readOnly;
  90585.         defineField: #AllocationBase        type: LPVOIDField readOnly;
  90586.         beUncompiled;
  90587.         defineField: #AllocationProtect    type: DWORDField readOnly;
  90588.         defineField: #RegionSize        type: DWORDField readOnly;
  90589.         defineField: #State                type: DWORDField readOnly;
  90590.         defineField: #Protect            type: DWORDField readOnly;
  90591.         defineField: #Type                type: DWORDField readOnly        
  90592.         
  90593.  
  90594. !
  90595.  
  90596. forAddress: anAddress
  90597.     "Answer a new instance of the receiver describing the memory region
  90598.     in which anAddress resides."
  90599.  
  90600.     | answer |
  90601.     answer := self new.
  90602.     KernelLibrary default virtualQuery: anAddress lpBuffer: answer dwLength: answer size.
  90603.     ^answer! !
  90604.  
  90605. !MEMORY_BASIC_INFORMATION methodsFor!
  90606.  
  90607. AllocationBase
  90608.     "Answer the receiver's AllocationBase field as a Smalltalk object.
  90609.     Automatically generated get method - do not modify"
  90610.  
  90611.     ^(bytes dwordAtOffset: 4) asExternalAddress!
  90612.  
  90613. BaseAddress
  90614.     "Answer the receiver's BaseAddress field as a Smalltalk object.
  90615.     Automatically generated get method - do not modify"
  90616.  
  90617.     ^(bytes dwordAtOffset: 0) asExternalAddress!
  90618.  
  90619. moduleFileName
  90620.     "Answer the filename of the module to which the receiver's region
  90621.     maps. Only relevant for text segments."
  90622.  
  90623.     ^ExternalLibrary moduleFileName: self AllocationBase! !
  90624.  
  90625. MENUINFO comment:
  90626. '<MENUINFO> is an <ExternalStructure> class to wrap the Win32 structure of the same name. 
  90627.  
  90628. See the Win32 SDK documentation for further information.'!
  90629. !MENUINFO class methodsFor!
  90630.  
  90631. defineFields
  90632.     "Define the fields of the MENUINFO structure.
  90633.         MENUINFO compileDefinition
  90634.     
  90635.         struct {
  90636.             unsigned int cbSize;
  90637.             unsigned int fMask;
  90638.             unsigned int dwStyle;
  90639.             unsigned int cyMax;
  90640.             HBRUSH hbrBack;
  90641.              DWORD dwContextHelpID;
  90642.             unsigned long dwMenuData;
  90643.         } MENUINFO;
  90644.     "
  90645.  
  90646.     self
  90647.         defineField: #dwSize type: DWORDField writeOnly;    "Rename to override superclass accessor"
  90648.         beUncompiled;
  90649.         defineField: #fMask type: DWORDField new;
  90650.         defineField: #dwStyle type: DWORDField new;
  90651.         defineField: #cyMax type: DWORDField new beFiller;
  90652.         defineField: #hbrBrack type: HANDLEField new;
  90653.         defineField: #dwContextHelpID type: DWORDField new beFiller;
  90654.         defineField: #dwMenuData type: DWORDField new! !
  90655.  
  90656. !MENUINFO methodsFor!
  90657.  
  90658. dwSize: anObject
  90659.     "Set the receiver's dwSize field to the value of anObject."
  90660.  
  90661.     bytes dwordAtOffset: 0 put: anObject! !
  90662.  
  90663. MENUITEMINFOA comment:
  90664. '<MENUITEMINFOA> is an <ExternalStructure> class to wrap the Win32 structure of the same name.
  90665.  
  90666. See the Win32 SDK documentation for further information.'!
  90667. !MENUITEMINFOA class methodsFor!
  90668.  
  90669. defineFields
  90670.     "Define the fields of the MENUITEMINFOA structure.
  90671.         MENUITEMINFOA compileDefinition
  90672.     
  90673.         typedef         struct tagMENUITEMINFOA {
  90674.             unsigned int cbSize;
  90675.             unsigned int fMask;
  90676.             unsigned int fType;
  90677.             unsigned int fState;
  90678.             unsigned int wID;
  90679.             HMENU hSubMenu;
  90680.             HBITMAP hbmpChecked;
  90681.             HBITMAP hbmpUnchecked;
  90682.             unsigned long dwItemData;
  90683.             LPSTR dwTypeData;
  90684.             unsigned int cch;
  90685.         } MENUITEMINFOA;
  90686.     "
  90687.  
  90688.     self
  90689.         defineField: #dwSize type: DWORDField writeOnly offset: 0;    "Rename to override superclass accessor"
  90690.         defineField: #fMask type: DWORDField new offset: 4;
  90691.         defineField: #fType type: DWORDField new offset: 8;
  90692.         defineField: #fState type: DWORDField new offset: 12;
  90693.         defineField: #wID type: DWORDField new offset: 16;
  90694.         defineField: #hSubMenu type: HANDLEField writeOnly offset: 20;
  90695.         defineField: #hbmpChecked type: HANDLEField writeOnly offset: 24;
  90696.         defineField: #hbmpUnchecked type: HANDLEField writeOnly offset: 28;
  90697.         defineField: #dwItemData type: DWORDField writeOnly offset: 32;
  90698.         defineField: #dwTypeData type: (PointerField type: String) offset: 36;
  90699.         defineField: #cch type: DWORDField new beFiller offset: 40.
  90700.     self byteSize: 44!
  90701.  
  90702. new
  90703.     "Answer a new subinstance of the receiver of a type appropriate for the host OS."
  90704.  
  90705.     ^(OSVERSIONINFO current isWinV5
  90706.         ifTrue: [MENUITEMINFOV5]
  90707.         ifFalse: [MENUITEMINFOA]) newBuffer! !
  90708.  
  90709. !MENUITEMINFOA methodsFor!
  90710.  
  90711. basicText: aString
  90712.     "Private - Set the menu item text to be the <readableString> argument, aString."
  90713.  
  90714.     text := aString.
  90715.     self 
  90716.         dwTypeData: text
  90717.         "; cch: text size"    "It isn't necessary to set this"!
  90718.  
  90719. commandMenuItem: aCommandMenuItem 
  90720.     self basicText: aCommandMenuItem text.
  90721.     self
  90722.         fType: (MFT_STRING bitOr: aCommandMenuItem styleFlags);
  90723.         wID: aCommandMenuItem id;
  90724.         fMask: ##(MIIM_TYPE | MIIM_ID)!
  90725.  
  90726. dwItemData: anObject
  90727.     "Set the receiver's dwItemData field to the value of anObject."
  90728.  
  90729.     bytes dwordAtOffset: 32 put: anObject!
  90730.  
  90731. dwSize: anObject
  90732.     "Set the receiver's dwSize field to the value of anObject."
  90733.  
  90734.     bytes dwordAtOffset: 0 put: anObject!
  90735.  
  90736. dwTypeData
  90737.     "Answer the receiver's dwTypeData field as a Smalltalk object."
  90738.  
  90739.     ^String fromAddress: (bytes sdwordAtOffset: 36)!
  90740.  
  90741. dwTypeData: anObject
  90742.     "Set the receiver's dwTypeData field to the value of anObject."
  90743.  
  90744.     bytes dwordAtOffset: 36 put: anObject yourAddress!
  90745.  
  90746. fMask
  90747.     "Answer the receiver's fMask field as a Smalltalk object."
  90748.  
  90749.     ^(bytes dwordAtOffset: 4)!
  90750.  
  90751. fMask: anObject
  90752.     "Set the receiver's fMask field to the value of anObject."
  90753.  
  90754.     bytes dwordAtOffset: 4 put: anObject!
  90755.  
  90756. fState
  90757.     "Answer the receiver's fState field as a Smalltalk object."
  90758.  
  90759.     ^(bytes dwordAtOffset: 12)!
  90760.  
  90761. fState: anObject
  90762.     "Set the receiver's fState field to the value of anObject."
  90763.  
  90764.     bytes dwordAtOffset: 12 put: anObject!
  90765.  
  90766. fType
  90767.     "Answer the receiver's fType field as a Smalltalk object."
  90768.  
  90769.     ^(bytes dwordAtOffset: 8)!
  90770.  
  90771. fType: anObject
  90772.     "Set the receiver's fType field to the value of anObject."
  90773.  
  90774.     bytes dwordAtOffset: 8 put: anObject!
  90775.  
  90776. hbmpChecked: anObject
  90777.     "Set the receiver's hbmpChecked field to the value of anObject."
  90778.  
  90779.     bytes dwordAtOffset: 24 put: anObject!
  90780.  
  90781. hbmpUnchecked: anObject
  90782.     "Set the receiver's hbmpUnchecked field to the value of anObject."
  90783.  
  90784.     bytes dwordAtOffset: 28 put: anObject!
  90785.  
  90786. hSubMenu: anObject
  90787.     "Set the receiver's hSubMenu field to the value of anObject."
  90788.  
  90789.     bytes dwordAtOffset: 20 put: anObject!
  90790.  
  90791. maskOut: anInteger
  90792.     "Private - Reset the specified contents mask flags. This specifies to Windows which
  90793.     information should be retrieved or set (i.e. which members of the structure are
  90794.     to be populated or are valid)."
  90795.  
  90796.     self fMask: (self fMask maskClear: anInteger)!
  90797.  
  90798. menuItem: aMenuItem text: aStringOrNil state: anInteger 
  90799.     "Private - Update the details for a normal menu item (i.e. the text, type flags, and state).
  90800.     This message is used when dynamically updating menu items."
  90801.  
  90802.     | mask |
  90803.     mask := aStringOrNil isNil 
  90804.                 ifTrue: 
  90805.                     ["Note that we can't set the type if not changing the text"
  90806.  
  90807.                     MIIM_STATE]
  90808.                 ifFalse: 
  90809.                     [self
  90810.                         fType: (MFT_STRING bitOr: aMenuItem styleFlags);
  90811.                         basicText: aStringOrNil.
  90812.                     ##(MIIM_STATE | MIIM_TYPE)].
  90813.     self
  90814.         fState: anInteger;
  90815.         fMask: mask!
  90816.  
  90817. subMenu: aMenuOrHandle text: aString
  90818.     "Private - Set menu insertion details for a Sub-menu."
  90819.  
  90820.     self 
  90821.         fType: MFT_STRING;
  90822.         basicText: aString;
  90823.         hSubMenu: aMenuOrHandle asParameter;
  90824.         fMask: ##(MIIM_SUBMENU|MIIM_TYPE)!
  90825.  
  90826. type: anInteger
  90827.     "Private - Set the fType field only.
  90828.     Note that on Win95 and NT4 the type can't really be set independently of the text
  90829.     because of the use of a shared mask (MIIM_TYPE) for both."
  90830.  
  90831.     self 
  90832.         fType: anInteger;
  90833.         fMask: MIIM_TYPE!
  90834.  
  90835. wID
  90836.     "Answer the receiver's wID field as a Smalltalk object."
  90837.  
  90838.     ^(bytes dwordAtOffset: 16)!
  90839.  
  90840. wID: anObject
  90841.     "Set the receiver's wID field to the value of anObject."
  90842.  
  90843.     bytes dwordAtOffset: 16 put: anObject! !
  90844.  
  90845. MSG comment:
  90846. 'MSG is an <ExternalStructure> to wrap the Win32 structure of the same name.
  90847.  
  90848. MSG is an represents the state associated with a Windows message retrieved via GetMessage().'!
  90849. !MSG class methodsFor!
  90850.  
  90851. defineFields
  90852.     "Define the fields of the Win32 MSG structure.
  90853.  
  90854.         MSG compileDefinition
  90855.     
  90856.         typedef         struct tagMSG {
  90857.             wireHWND hwnd;
  90858.             unsigned int message;
  90859.             unsigned int wParam;
  90860.             long lParam;
  90861.             unsigned long time;
  90862.             POINT pt;
  90863.         } MSG;
  90864.     "
  90865.  
  90866.     self defineField: #hwnd type: DWORDField readOnly;
  90867.         defineField: #message type: DWORDField readOnly;
  90868.         defineField: #wParam type: DWORDField readOnly;
  90869.         defineField: #lParam type: DWORDField readOnly;
  90870.         beUncompiled;
  90871.         defineField: #time type: DWORDField readOnly;
  90872.         defineField: #pt type: (StructureField type: POINTL) beReadOnly! !
  90873.  
  90874. !MSG methodsFor!
  90875.  
  90876. hwnd
  90877.     "Answer the receiver's hwnd field as a Smalltalk object."
  90878.  
  90879.     ^(bytes dwordAtOffset: 0)!
  90880.  
  90881. isInput
  90882.     "Answer whether the receiver represents an input event."
  90883.  
  90884.     | msg |
  90885.     msg := self message.
  90886.     ^(msg >= WM_KEYFIRST and: [ msg <= WM_KEYLAST ]) or: [
  90887.         msg >= WM_MOUSEFIRST and: [ msg <= WM_MOUSELAST ]]
  90888. !
  90889.  
  90890. isKeyboardInput
  90891.     "Answer whether the receiver represents a keyboard event (e.g. a WM_KEYDOWN)."
  90892.  
  90893.     | msg |
  90894.     msg := self message.
  90895.     ^msg >= WM_KEYFIRST and: [msg <= WM_KEYLAST]!
  90896.  
  90897. isMouseInput
  90898.     "Answer whether the receiver represents a mouse event (e.g. a WM_MOUSEMOVE)."
  90899.  
  90900.     | msg |
  90901.     msg := self message.
  90902.     ^msg >= WM_MOUSEFIRST and: [msg <= WM_MOUSELAST]!
  90903.  
  90904. lParam
  90905.     "Answer the receiver's lParam field as a Smalltalk object."
  90906.  
  90907.     ^(bytes dwordAtOffset: 12)!
  90908.  
  90909. message
  90910.     "Answer the receiver's message field as a Smalltalk object."
  90911.  
  90912.     ^(bytes dwordAtOffset: 4)!
  90913.  
  90914. printOn: aStream 
  90915.     "Append a textual representation of the receiver to aStream."
  90916.  
  90917.     | msg |
  90918.     self basicPrintOn: aStream.
  90919.     msg := View selectorForMessage: self message.
  90920.     aStream
  90921.         nextPut: $(;
  90922.         nextPutAll: (self hwnd printStringRadix: 16);
  90923.         space.
  90924.     msg isNil 
  90925.         ifTrue: [self message printOn: aStream base: 16]
  90926.         ifFalse: [aStream nextPutAll: msg].
  90927.     aStream
  90928.         space;
  90929.         print: self wParam;
  90930.         space;
  90931.         print: self lParam;
  90932.         nextPut: $)!
  90933.  
  90934. swParam
  90935.     "Answer the <integer> value of the receiver's wParam field, treating
  90936.     it as a signed 32-bit 2's complement number."
  90937.  
  90938.     ^(bytes sdwordAtOffset: 8)!
  90939.  
  90940. wParam
  90941.     "Answer the receiver's wParam field as a Smalltalk object."
  90942.  
  90943.     ^(bytes dwordAtOffset: 8)! !
  90944.  
  90945. MSGBOXPARAMS comment:
  90946. 'MSGBOXPARAMS is an <ExternalStructure> class which represents the Windows structure of the same name.
  90947.  
  90948. MSGBOXPARAMS is used to contain configuration details for Message Boxes.
  90949.  
  90950. Instance Variables:
  90951.     iconId    <integer> or <String> id of icon to be displayed in the box
  90952.     text    <String> Text to be display in box (address stored in struct, so need to prevent premature GC)
  90953.     caption     <String> Caption of box (ditto)
  90954.     owner    <ExternalHandle>. Handle of owner view'!
  90955. !MSGBOXPARAMS class methodsFor!
  90956.  
  90957. defineFields
  90958.     "Define the fields of the Win32 MSGBOXPARAMS structure.
  90959.  
  90960.         MSGBOXPARAMS compileDefinition
  90961.  
  90962.     typedef struct {
  90963.             UINT cbSize;
  90964.             HWND hwndOwner;
  90965.             HINSTANCE hInstance;
  90966.             LPCSTR lpszText;
  90967.             LPCSTR lpszCaption;
  90968.             DWORD dwStyle;
  90969.             LPCSTR lpszIcon;
  90970.             DWORD dwContextHelpId;
  90971.             MSGBOXCALLBACK lpfnMsgBoxCallback;
  90972.             DWORD dwLanguageId;
  90973.         } MSGBOXPARAMS, *PMSGBOXPARAMS, FAR *LPMSGBOXPARAMS; 
  90974.     "
  90975.  
  90976.     self 
  90977.         defineField: #dwSize            type: DWORDField writeOnly beOverride;
  90978.         defineField: #hwndOwner            type: DWORDField writeOnly;
  90979.         defineField: #hInstance         type: DWORDField writeOnly;
  90980.         defineField: #lpszText            type: (PointerField type: String) beWriteOnly;
  90981.         defineField: #lpszCaption        type: (PointerField type: String) beWriteOnly;
  90982.         defineField: #dwStyle            type: DWORDField new;
  90983.         "This field can hold a string, or an integer resource id"
  90984.         defineField: #lpszIcon            type: DWORDField writeOnly;
  90985.         beUncompiled;
  90986.         defineField: #dwContextHelpId        type: DWORDField filler;
  90987.         defineField: #lpfnMsgBoxCallback type: DWORDField filler;
  90988.         defineField: #dwLanguageId        type: DWORDField writeOnly! !
  90989.  
  90990. !MSGBOXPARAMS methodsFor!
  90991.  
  90992. caption
  90993.     "Answer the caption to be used for the message box (may be nil if
  90994.     non configured)."
  90995.  
  90996.     ^caption!
  90997.  
  90998. caption: aString
  90999.     "Set the caption to be used for the message box to aString."
  91000.  
  91001.     self lpszCaption: aString.
  91002.     caption := aString
  91003.     !
  91004.  
  91005. dwSize: anObject
  91006.     "Set the receiver's dwSize field to the value of anObject.
  91007.     Automatically generated set method - do not modify"
  91008.  
  91009.     bytes dwordAtOffset: 0 put: anObject!
  91010.  
  91011. dwStyle
  91012.     "Answer the receiver's dwStyle field as a Smalltalk object.
  91013.     Automatically generated get method - do not modify"
  91014.  
  91015.     ^(bytes dwordAtOffset: 20)!
  91016.  
  91017. dwStyle: anObject
  91018.     "Set the receiver's dwStyle field to the value of anObject.
  91019.     Automatically generated set method - do not modify"
  91020.  
  91021.     bytes dwordAtOffset: 20 put: anObject!
  91022.  
  91023. hInstance: anObject
  91024.     "Set the receiver's hInstance field to the value of anObject.
  91025.     Automatically generated set method - do not modify"
  91026.  
  91027.     bytes dwordAtOffset: 8 put: anObject!
  91028.  
  91029. hwndOwner: anObject
  91030.     "Set the receiver's hwndOwner field to the value of anObject.
  91031.     Automatically generated set method - do not modify"
  91032.  
  91033.     bytes dwordAtOffset: 4 put: anObject!
  91034.  
  91035. icon: anIconOrNil
  91036.     "Set/remove the icon to be used with the receiver to anIcon.
  91037.     N.B. This will only work if the icon has been loaded from resources."
  91038.  
  91039.     anIconOrNil isNil
  91040.         ifTrue: [self styleMaskClear: MB_USERICON]
  91041.         ifFalse: [
  91042.             self iconId: anIconOrNil identifier.
  91043.             self hInstance: anIconOrNil instanceHandle asParameter]!
  91044.  
  91045. iconId: anIntegerOrString
  91046.     "Set the resource identifier of the icon to be used with the receiver to anObject."
  91047.  
  91048.     iconId := anIntegerOrString.
  91049.     self lpszIcon: iconId asDword.
  91050.     self styleMaskSet: MB_USERICON!
  91051.  
  91052. lpszCaption: anObject
  91053.     "Set the receiver's lpszCaption field to the value of anObject.
  91054.     Automatically generated set method - do not modify"
  91055.  
  91056.     bytes dwordAtOffset: 16 put: anObject yourAddress!
  91057.  
  91058. lpszIcon: anObject
  91059.     "Set the receiver's lpszIcon field to the value of anObject.
  91060.     Automatically generated set method - do not modify"
  91061.  
  91062.     bytes dwordAtOffset: 24 put: anObject!
  91063.  
  91064. lpszText: anObject
  91065.     "Set the receiver's lpszText field to the value of anObject.
  91066.     Automatically generated set method - do not modify"
  91067.  
  91068.     bytes dwordAtOffset: 12 put: anObject yourAddress!
  91069.  
  91070. owner
  91071.     "Answer the owner of the message box."
  91072.  
  91073.     ^owner!
  91074.  
  91075. owner: aViewOrHandle
  91076.     "Set the owner of the message box to be aViewOrHandler."
  91077.  
  91078.     self hwndOwner: (aViewOrHandle isNil ifTrue: [0] ifFalse: [aViewOrHandle asParameter]).
  91079.     owner := aViewOrHandle!
  91080.  
  91081. styleMaskClear: maskInteger
  91082.     "Private - Remove the specified message box style mask into the currently
  91083.     configured styles."
  91084.  
  91085.     self dwStyle: (self dwStyle maskClear: maskInteger)!
  91086.  
  91087. styleMaskSet: maskInteger
  91088.     "Private - Add the specified message box style mask into the currently
  91089.     configured styles."
  91090.  
  91091.     self dwStyle: (self dwStyle maskSet: maskInteger)!
  91092.  
  91093. text: aString
  91094.     "Set the message text to be used in the message box to aString."
  91095.  
  91096.     self lpszText: aString.
  91097.     text := aString
  91098.     ! !
  91099.  
  91100. NMHDR comment:
  91101. 'NMHDR is a <Win32Structure> representing the NMHDR external Win32 API structure.'!
  91102. !NMHDR class methodsFor!
  91103.  
  91104. defineFields
  91105.     "Define the fields of the Win32 NMHDR structure
  91106.  
  91107.         NMHDR compileDefinition
  91108.     "
  91109.  
  91110.     self 
  91111.         defineField: #hwndFrom type: DWORDField readOnly;
  91112.         defineField: #idFrom type: DWORDField readOnly;
  91113.         defineField: #code type: SDWORDField readOnly
  91114. !
  91115.  
  91116. new
  91117.     "We only ever point to NMHDRs through an ExternalAddress. We
  91118.     never create those with embedded data."
  91119.  
  91120.     ^self shouldNotImplement
  91121. ! !
  91122.  
  91123. !NMHDR methodsFor!
  91124.  
  91125. code
  91126.     "Answer the receiver's code field as a Smalltalk object."
  91127.  
  91128.     ^(bytes sdwordAtOffset: 8)!
  91129.  
  91130. hwndFrom
  91131.     "Answer the receiver's hwndFrom field as a Smalltalk object."
  91132.  
  91133.     ^(bytes dwordAtOffset: 0)!
  91134.  
  91135. idFrom
  91136.     "Answer the receiver's idFrom field as a Smalltalk object."
  91137.  
  91138.     ^(bytes dwordAtOffset: 4)!
  91139.  
  91140. itemHandle
  91141.     ^self idFrom! !
  91142.  
  91143. NONCLIENTMETRICS comment:
  91144. ''!
  91145. !NONCLIENTMETRICS class methodsFor!
  91146.  
  91147. clear
  91148.     "Private - Reinitialize the receiver."
  91149.  
  91150.     Current := nil!
  91151.  
  91152. current
  91153.     "Answer the current instance of the receiver."
  91154.  
  91155.     Current isNil ifTrue: [Current := self getCurrent].
  91156.     ^Current!
  91157.  
  91158. defineFields
  91159.     "Define the fields of the Win32 NONCLIENTMETRICS structure.
  91160.  
  91161.         NONCLIENTMETRICS compileDefinition
  91162.  
  91163.     typedef struct tagNONCLIENTMETRICS   
  91164.         UINT        cbSize; 
  91165.         int        iBorderWidth; 
  91166.         int        iScrollWidth; 
  91167.         int        iScrollHeight; 
  91168.         int        iCaptionWidth; 
  91169.         int        iCaptionHeight; 
  91170.         LOGFONT    lfCaptionFont; 
  91171.         int        iSmCaptionWidth; 
  91172.         int        iSmCaptionHeight; 
  91173.         LOGFONT    lfSmCaptionFont; 
  91174.         int        iMenuWidth; 
  91175.         int        iMenuHeight; 
  91176.         LOGFONT    lfMenuFont; 
  91177.         LOGFONT    lfStatusFont; 
  91178.         LOGFONT    lfMessageFont; 
  91179.      NONCLIENTMETRICS, FAR* LPNONCLIENTMETRICS; "
  91180.  
  91181.     self 
  91182.         defineField: #dwSize type: DWORDField writeOnly beOverride;
  91183.         defineField: #iBorderWidth type: SDWORDField uncompiled;
  91184.         defineField: #iScrollWidth type: SDWORDField uncompiled;
  91185.         defineField: #iScrollHeight type: SDWORDField uncompiled;
  91186.         defineField: #iCaptionWidth type: SDWORDField uncompiled;
  91187.         defineField: #iCaptionHeight type: SDWORDField uncompiled;
  91188.         defineField: #lfCationFont type: (StructureField type: LOGFONT) beUncompiled;
  91189.         defineField: #iSmCaptionWidth type: SDWORDField uncompiled;
  91190.         defineField: #iSmCaptionHeight type: SDWORDField uncompiled;
  91191.         defineField: #lfSmCaptionFont type: (StructureField type: LOGFONT) beUncompiled;
  91192.         defineField: #iMenuWidth type: SDWORDField readOnly;
  91193.         defineField: #iMenuHeight type: SDWORDField readOnly;
  91194.         defineField: #lfMenuFont type: (StructureField type: LOGFONT) beReadOnly;
  91195.         defineField: #lfStatusFont type: (StructureField type: LOGFONT) beUncompiled;
  91196.         defineField: #lfMessageFont type: (StructureField type: LOGFONT) beUncompiled!
  91197.  
  91198. getCurrent
  91199.     "Private - Get the current NONCLIENTMETRICS."
  91200.  
  91201.     | current |
  91202.     current := self new.
  91203.     "N.B. SPI_GETNONCLIENTMETRICS does not work in NT 3.51, but we no longer support it."
  91204.     (UserLibrary default
  91205.         systemParametersInfo: SPI_GETNONCLIENTMETRICS
  91206.         uiParam: 0
  91207.         pvParam: current asParameter
  91208.         fWinIni: 0) ifFalse: [UserLibrary default systemError].
  91209.     ^current!
  91210.  
  91211. uninitialize
  91212.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  91213.  
  91214.     self clear.! !
  91215.  
  91216. !NONCLIENTMETRICS methodsFor!
  91217.  
  91218. dwSize: anObject
  91219.     "Set the receiver's dwSize field to the value of anObject.
  91220.     Automatically generated set method - do not modify"
  91221.  
  91222.     bytes dwordAtOffset: 0 put: anObject!
  91223.  
  91224. iMenuHeight
  91225.     "Answer the receiver's iMenuHeight field as a Smalltalk object.
  91226.     Automatically generated get method - do not modify"
  91227.  
  91228.     ^(bytes sdwordAtOffset: 156)!
  91229.  
  91230. iMenuWidth
  91231.     "Answer the receiver's iMenuWidth field as a Smalltalk object.
  91232.     Automatically generated get method - do not modify"
  91233.  
  91234.     ^(bytes sdwordAtOffset: 152)!
  91235.  
  91236. lfMenuFont
  91237.     "Answer the receiver's lfMenuFont field as a Smalltalk object.
  91238.     Automatically generated get method - do not modify"
  91239.  
  91240.     ^LOGFONT fromAddress: (bytes yourAddress + 160)!
  91241.  
  91242. menuFont
  91243.     "Answer the currently configured menu font."
  91244.  
  91245.     menuFont isNil ifTrue: [
  91246.         menuFont := Font fromLogFont: self lfMenuFont].
  91247.     ^menuFont!
  91248.  
  91249. menuImageExtent
  91250.     ^(self iMenuWidth max: 16) @ 16! !
  91251.  
  91252. NOTIFYICONDATA comment:
  91253. ''!
  91254. !NOTIFYICONDATA class methodsFor!
  91255.  
  91256. defineFields
  91257.     "Define the fields of the NOTIFYICONDATA 'structure'.
  91258.         self compileDefinition
  91259.  
  91260.         struct {
  91261.             DWORD cbSize; 
  91262.             HWND hWnd; 
  91263.             UINT uID; 
  91264.             UINT uFlags; 
  91265.             UINT uCallbackMessage; 
  91266.             HICON hIcon; 
  91267.             char szTip[64]; 
  91268.         } NOTIFYICONDATA;
  91269.     "
  91270.  
  91271.     self
  91272.         defineField: #cbSize            type: DWORDField writeOnly;
  91273.         defineField: #hWnd            type: HANDLEField writeOnly;
  91274.         defineField: #uID            type: DWORDField writeOnly;
  91275.         defineField: #uFlags            type: DWORDField new;
  91276.         defineField: #uCallbackMessage    type: DWORDField writeOnly;
  91277.         defineField: #hIcon            type: HANDLEField writeOnly;
  91278.         defineField: #szTip            type: (StringField length: 64)! !
  91279.  
  91280. !NOTIFYICONDATA methodsFor!
  91281.  
  91282. cbSize: anObject
  91283.     "Set the receiver's cbSize field to the value of anObject."
  91284.  
  91285.     bytes dwordAtOffset: 0 put: anObject!
  91286.  
  91287. hIcon: anObject
  91288.     "Set the receiver's hIcon field to the value of anObject."
  91289.  
  91290.     bytes dwordAtOffset: 20 put: anObject!
  91291.  
  91292. hWnd: anObject
  91293.     "Set the receiver's hWnd field to the value of anObject."
  91294.  
  91295.     bytes dwordAtOffset: 4 put: anObject!
  91296.  
  91297. icon: anIconOrHandle
  91298.     "Set the receiver's hIcon field."
  91299.  
  91300.     self hIcon: anIconOrHandle asParameter.
  91301.     self uFlags: (self uFlags bitOr: NIF_ICON)!
  91302.  
  91303. initialize: anInteger
  91304.     "Private - Initialize the state of the receiver."
  91305.  
  91306.     super initialize: anInteger.
  91307.     self cbSize: anInteger!
  91308.  
  91309. message: anIntegerMessageNumber
  91310.     "Set the receiver's uCallbackMessage (message sent to window when mouse over
  91311.     the icon in the taskbar) field."
  91312.  
  91313.     self uCallbackMessage: anIntegerMessageNumber.
  91314.     self uFlags: (self uFlags bitOr: NIF_MESSAGE)!
  91315.  
  91316. szTip
  91317.     "Answer the receiver's szTip field as a Smalltalk object."
  91318.  
  91319.     ^String fromAddress: (bytes yourAddress + 24)!
  91320.  
  91321. szTip: anObject
  91322.     "Set the receiver's szTip field to the value of anObject."
  91323.  
  91324.     | size |
  91325.     size := anObject byteSize - 1 min: (63 * 1).
  91326.     anObject replaceBytesOf: bytes from: 25 to: 24 + size startingAt: 1.
  91327.     bytes at: size+25 put: 0!
  91328.  
  91329. tipText: aString
  91330.     "Set the receiver's szTip (tip text) field."
  91331.  
  91332.     self szTip: aString.
  91333.     self uFlags: (self uFlags bitOr: NIF_TIP)!
  91334.  
  91335. uCallbackMessage: anObject
  91336.     "Set the receiver's uCallbackMessage field to the value of anObject."
  91337.  
  91338.     bytes dwordAtOffset: 16 put: anObject!
  91339.  
  91340. uFlags
  91341.     "Answer the receiver's uFlags field as a Smalltalk object."
  91342.  
  91343.     ^(bytes dwordAtOffset: 12)!
  91344.  
  91345. uFlags: anObject
  91346.     "Set the receiver's uFlags field to the value of anObject."
  91347.  
  91348.     bytes dwordAtOffset: 12 put: anObject!
  91349.  
  91350. uID: anObject
  91351.     "Set the receiver's uID field to the value of anObject."
  91352.  
  91353.     bytes dwordAtOffset: 8 put: anObject! !
  91354.  
  91355. OPENFILENAME comment:
  91356. 'OPENFILENAME is a <Win32Structure> which represent the Windows Common Dialog structure of the same name. It is used in conjunction with the GetOpenFileName() and GetSaveFileName() APIs which pop a common file dialog to browser for a file to load or save respectively. See the <FileDialog> and the Win32 documentation for further details.
  91357.  
  91358. The following instance variables hold <String> objects whose addresses have been stored into the structure. This is necessary to prevent premature garbage collection of these objects occurring during an external API call.
  91359.  
  91360. Instance Variables:
  91361.     fileName        <String>
  91362.     title         <String>
  91363.     filter         <String>
  91364.     defExt         <String>
  91365.     fileTitle        <String>
  91366.     initialDir        <String>'!
  91367. !OPENFILENAME class methodsFor!
  91368.  
  91369. defineFields
  91370.     "Define the fields of the Win32 OPENFILENAME structure.
  91371.  
  91372.         OPENFILENAME compileDefinition
  91373.  
  91374.     typedef struct tagOFN { // ofn  
  91375.         DWORD        lStructSize;
  91376.         HWND            hwndOwner;
  91377.         HINSTANCE        hInstance;
  91378.         LPCTSTR        lpstrFilter;
  91379.         LPTSTR        lpstrCustomFilter;
  91380.         DWORD        nMaxCustFilter;
  91381.         DWORD        nFilterIndex;
  91382.         LPTSTR        lpstrFile;
  91383.         DWORD        nMaxFile;
  91384.         LPTSTR        lpstrFileTitle;
  91385.         DWORD        nMaxFileTitle;
  91386.         LPCTSTR        lpstrInitialDir;
  91387.         LPCTSTR        lpstrTitle;
  91388.         DWORD        Flags;
  91389.         WORD            nFileOffset;
  91390.         WORD            nFileExtension;
  91391.         LPCTSTR        lpstrDefExt;
  91392.         DWORD        lCustData;
  91393.         LPOFNHOOKPROC    lpfnHook;
  91394.         LPCTSTR        lpTemplateName;
  91395.         } OPENFILENAME;"
  91396.  
  91397.     self 
  91398.         defineField: #dwSize            type: DWORDField writeOnly beOverride;
  91399.         defineField: #hwndOwner            type: DWORDField writeOnly;
  91400.         defineField: #hInstance            type: DWORDField filler;
  91401.         defineField: #lpstrFilter        type: (PointerField type: String) beWriteOnly;
  91402.         defineField: #lpstrCustomFilter    type: (PointerField type: String) beFiller;
  91403.         defineField: #nMaxCustFilter        type: DWORDField filler;
  91404.         defineField: #nFilterIndex        type: DWORDField new;
  91405.         defineField: #lpstrFile            type: (PointerField type: String);
  91406.         defineField: #nMaxFile            type: DWORDField writeOnly;
  91407.         defineField: #lpstrFileTitle        type: (PointerField type: String);
  91408.         defineField: #nMaxFileTitle        type: DWORDField writeOnly;
  91409.         defineField: #lpstrInitialDir    type: (PointerField type: String) beWriteOnly;
  91410.         defineField: #lpstrTitle        type: (PointerField type: String) beWriteOnly;
  91411.         defineField: #flags                type: DWORDField new beUncompiled;
  91412.         defineField: #nFileOffset        type: WORDField new beUncompiled;
  91413.         defineField: #nFileExtension        type: WORDField new beUncompiled;
  91414.         defineField: #lpstrDefExt        type: (PointerField type: String) beWriteOnly;
  91415.         defineField: #lCustData            type: DWORDField filler;
  91416.         defineField: #lpfnHook            type: (PointerField type: ExternalAddress) beFiller;
  91417.         defineField: #lpTemplateName        type: (PointerField type: String) beFiller
  91418. ! !
  91419.  
  91420. !OPENFILENAME methodsFor!
  91421.  
  91422. defaultExtension
  91423.     "Answer the default extension for the file open/save, or nil if none is set."
  91424.  
  91425.     ^defExt!
  91426.  
  91427. defaultExtension: aString
  91428.     "Set the default extension for the file open/save.
  91429.     We store down the String in an instance variable to prevent it being GC'd."
  91430.  
  91431.     defExt := aString.
  91432.     self lpstrDefExt: aString!
  91433.  
  91434. dwSize: anObject
  91435.     "Set the receiver's dwSize field to the value of anObject."
  91436.  
  91437.     bytes dwordAtOffset: 0 put: anObject!
  91438.  
  91439. fileName: aString
  91440.     "Set the file name to be opened/saved.
  91441.     We store down the String in an instance variable to prevent it being GC'd."
  91442.  
  91443.     fileName := aString.
  91444.     self lpstrFile: aString!
  91445.  
  91446. fileTypes: aString
  91447.     "Set the file type filter to be used for the the common file dialog.
  91448.     We store down the String in an instance variable to prevent it being GC'd."
  91449.  
  91450.     filter := aString.
  91451.     self lpstrFilter: aString!
  91452.  
  91453. hwndOwner: anObject
  91454.     "Set the receiver's hwndOwner field to the value of anObject."
  91455.  
  91456.     bytes dwordAtOffset: 4 put: anObject!
  91457.  
  91458. initialDirectory: aString
  91459.     "Set the initial directory path name to be opened/saved.
  91460.     We store down the String in an instance variable to prevent it being GC'd."
  91461.  
  91462.     initialDir := aString.
  91463.     self lpstrInitialDir: aString!
  91464.  
  91465. lpstrDefExt: anObject
  91466.     "Set the receiver's lpstrDefExt field to the value of anObject."
  91467.  
  91468.     bytes dwordAtOffset: 60 put: anObject yourAddress!
  91469.  
  91470. lpstrFile
  91471.     "Answer the receiver's lpstrFile field as a Smalltalk object."
  91472.  
  91473.     ^String fromAddress: (bytes sdwordAtOffset: 28)!
  91474.  
  91475. lpstrFile: anObject
  91476.     "Set the receiver's lpstrFile field to the value of anObject."
  91477.  
  91478.     bytes dwordAtOffset: 28 put: anObject yourAddress!
  91479.  
  91480. lpstrFileTitle
  91481.     "Answer the receiver's lpstrFileTitle field as a Smalltalk object."
  91482.  
  91483.     ^String fromAddress: (bytes sdwordAtOffset: 36)!
  91484.  
  91485. lpstrFileTitle: anObject
  91486.     "Set the receiver's lpstrFileTitle field to the value of anObject."
  91487.  
  91488.     bytes dwordAtOffset: 36 put: anObject yourAddress!
  91489.  
  91490. lpstrFilter: anObject
  91491.     "Set the receiver's lpstrFilter field to the value of anObject."
  91492.  
  91493.     bytes dwordAtOffset: 12 put: anObject yourAddress!
  91494.  
  91495. lpstrInitialDir: anObject
  91496.     "Set the receiver's lpstrInitialDir field to the value of anObject."
  91497.  
  91498.     bytes dwordAtOffset: 44 put: anObject yourAddress!
  91499.  
  91500. lpstrTitle: anObject
  91501.     "Set the receiver's lpstrTitle field to the value of anObject."
  91502.  
  91503.     bytes dwordAtOffset: 48 put: anObject yourAddress!
  91504.  
  91505. nFilterIndex
  91506.     "Answer the receiver's nFilterIndex field as a Smalltalk object."
  91507.  
  91508.     ^(bytes dwordAtOffset: 24)!
  91509.  
  91510. nFilterIndex: anObject
  91511.     "Set the receiver's nFilterIndex field to the value of anObject."
  91512.  
  91513.     bytes dwordAtOffset: 24 put: anObject!
  91514.  
  91515. nMaxFile: anObject
  91516.     "Set the receiver's nMaxFile field to the value of anObject."
  91517.  
  91518.     bytes dwordAtOffset: 32 put: anObject!
  91519.  
  91520. nMaxFileTitle: anObject
  91521.     "Set the receiver's nMaxFileTitle field to the value of anObject."
  91522.  
  91523.     bytes dwordAtOffset: 40 put: anObject!
  91524.  
  91525. ownerView: aView
  91526.     "Set the parent window for the dialog to aView."
  91527.  
  91528.     | hWnd |
  91529.     hWnd := aView asParameter.
  91530.     hWnd isNull
  91531.         ifTrue: [self hwndOwner: 0]
  91532.         ifFalse: [self hwndOwner: hWnd].!
  91533.  
  91534. title: aString
  91535.     "Set the title to be used for the the common file dialog caption.
  91536.     We store down the String in an instance variable to prevent it being GC'd."
  91537.  
  91538.     title := aString.
  91539.     self lpstrTitle: aString! !
  91540.  
  91541. OSVERSIONINFO comment:
  91542. 'OSVERSIONINFO is an ExternalStructure class to represent the Win32 common control structure of the same name.
  91543.  
  91544. OSVERSIONINFO is used to retrieve version information about the host OS on which an application is running. It is used in conjunction with .
  91545.  
  91546. This class adds various tests for common Windows variants (e.g. #isWin98) and also an #osName method which answers a symbolic name for the host OS.
  91547. '!
  91548. !OSVERSIONINFO class methodsFor!
  91549.  
  91550. clear
  91551.     "Private - Reinitialize the receiver."
  91552.  
  91553.     Current := nil!
  91554.  
  91555. current
  91556.     "Answer the current instance of the receiver."
  91557.  
  91558.     Current isNil ifTrue: [Current := self getCurrent].
  91559.     ^Current!
  91560.  
  91561. defineFields
  91562.     "Define the fields of the Win32 OSVERSIONINFO structure.
  91563.  
  91564.         OSVERSIONINFO compileDefinition
  91565.  
  91566.         typedef struct _OSVERSIONINFO{  
  91567.             DWORD dwOSVersionInfoSize; 
  91568.             DWORD dwMajorVersion; 
  91569.             DWORD dwMinorVersion; 
  91570.             DWORD dwBuildNumber; 
  91571.             DWORD dwPlatformId; 
  91572.             TCHAR szCSDVersion[128]; 
  91573.         } OSVERSIONINFO;"
  91574.  
  91575.     self 
  91576.         defineField: #dwSize                type: DWORDField writeOnly beOverride;
  91577.         defineField: #dwMajorVersion            type: DWORDField readOnly;
  91578.         defineField: #dwMinorVersion            type: DWORDField readOnly;
  91579.         defineField: #dwBuildNumber            type: DWORDField readOnly beUncompiled;
  91580.         defineField: #dwPlatformId            type: DWORDField readOnly;
  91581.         defineField: #szCSDVersion            type: (StringField length: 128) beReadOnly!
  91582.  
  91583. getCurrent
  91584.     "Private - Get the current OSVERSIONINFO."
  91585.  
  91586.     | current |
  91587.     current := self new.
  91588.     KernelLibrary default getVersionEx: current.
  91589.     ^current!
  91590.  
  91591. uninitialize
  91592.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  91593.  
  91594.     self clear.
  91595. ! !
  91596.  
  91597. !OSVERSIONINFO methodsFor!
  91598.  
  91599. dwMajorVersion
  91600.     "Answer the receiver's dwMajorVersion field as a Smalltalk object."
  91601.  
  91602.     ^(bytes dwordAtOffset: 4)!
  91603.  
  91604. dwMinorVersion
  91605.     "Answer the receiver's dwMinorVersion field as a Smalltalk object."
  91606.  
  91607.     ^(bytes dwordAtOffset: 8)!
  91608.  
  91609. dwPlatformId
  91610.     "Answer the receiver's dwPlatformId field as a Smalltalk object."
  91611.  
  91612.     ^(bytes dwordAtOffset: 16)!
  91613.  
  91614. dwSize: anObject
  91615.     "Set the receiver's dwSize field to the value of anObject."
  91616.  
  91617.     bytes dwordAtOffset: 0 put: anObject!
  91618.  
  91619. isNT
  91620.     "Answer whether the host OS is NT (4 or 2000).
  91621.         OSVERSIONINFO current isNT
  91622.     "
  91623.  
  91624.     ^self dwPlatformId == VER_PLATFORM_WIN32_NT!
  91625.  
  91626. isNT4
  91627.     "Answer whether the host OS is NT4.
  91628.         OSVERSIONINFO current isNT
  91629.     "
  91630.  
  91631.     "Dolphin 4/5 does not run on NT3.51, so this can only be NT4"
  91632.     ^self osName == #winNT!
  91633.  
  91634. isWin2K
  91635.     "Answer whether the host OS is Windows 2000.
  91636.         OSVERSIONINFO current isWin2K
  91637.     "
  91638.  
  91639.     ^self osName == #win2k!
  91640.  
  91641. isWin95
  91642.     "Answer whether the host OS is Windows 95.
  91643.         OSVERSIONINFO current isWin95
  91644.     "
  91645.  
  91646.     ^self osName == #win95!
  91647.  
  91648. isWin98
  91649.     "Answer whether the host OS is Windows 98.
  91650.         OSVERSIONINFO current isWin98
  91651.     "
  91652.  
  91653.     ^self osName == #win98!
  91654.  
  91655. isWin9X
  91656.     "Answer whether the host OS is Windows 95/98 or ME.
  91657.     Implementation Note: As Dolphin will not run under Win32s it is safe to assume
  91658.     that anything which is not NT is 16-bit Windows."
  91659.  
  91660.     ^self isNT not!
  91661.  
  91662. isWindows
  91663.     #deprecated.
  91664.     ^self isWin9X!
  91665.  
  91666. isWinMe
  91667.     "Answer whether the host OS is Windows Me.
  91668.         OSVERSIONINFO current isWinMe
  91669.     "
  91670.  
  91671.     ^self osName == #winMe!
  91672.  
  91673. isWinV5
  91674.     "Answer whether the host OS is Windows 98 or Windows 2000.
  91675.         OSVERSIONINFO current isWinV5
  91676.     "
  91677.  
  91678.     ^#(#win2k #winXP #win98 #winMe) identityIncludes: self osName!
  91679.  
  91680. isWinXP
  91681.     "Answer whether the host OS is Windows XP.
  91682.         OSVERSIONINFO current isWinXP
  91683.     "
  91684.  
  91685.     ^self osName == #winXP!
  91686.  
  91687. osName
  91688.     "Answer a symbolic name which indicates which is the host operating system, 
  91689.     this will be one of #win2k, #winNT, #win95, #win98, #winMe. As Dolphin will 
  91690.     not run on Win32s, we do not even entertain the possibility of that option. #winNT
  91691.     indicates NT 4, since Dolphin will not run on 3.51 either."
  91692.  
  91693.     osName isNil 
  91694.         ifTrue: 
  91695.             [| platformId major |
  91696.             major := self dwMajorVersion.
  91697.             osName := (platformId := self dwPlatformId) = VER_PLATFORM_WIN32_NT 
  91698.                         ifTrue: 
  91699.                             [major >= 5 
  91700.                                 ifTrue: [self dwMinorVersion >= 1 ifTrue: [#winXP] ifFalse: [#win2k]]
  91701.                                 ifFalse: [#winNT]]
  91702.                         ifFalse: 
  91703.                             [(major > 4 or: [major == 4 and: [self dwMinorVersion > 0]]) 
  91704.                                 ifTrue: [self dwMinorVersion >= 90 ifTrue: [#winMe] ifFalse: [#win98]]
  91705.                                 ifFalse: [#win95]]].
  91706.     ^osName! !
  91707.  
  91708. PAINTSTRUCT comment:
  91709. ''!
  91710. !PAINTSTRUCT class methodsFor!
  91711.  
  91712. defineFields
  91713.     "Define the Win32 PAINTSTRUCT structure.
  91714.         PAINTSTRUCT compileDefinition
  91715.     "
  91716.  
  91717.     self
  91718.         defineField: #hdc type: DWORDField readOnly beUncompiled;
  91719.         defineField: #fErase type: BOOLField readOnly;
  91720.         defineField: #rcPaint type: (StructureField type: RECT) beReadOnly;
  91721.         defineField: #fRestore type: BOOLField filler;
  91722.         defineField: #fIncUpdate type: BOOLField filler;
  91723.         "Help file wrongly species 16 bytes, header file says 32"
  91724.         defineField: #rgbReserved type: (ArrayField type: ByteArray length: 32) beFiller! !
  91725.  
  91726. !PAINTSTRUCT methodsFor!
  91727.  
  91728. fErase
  91729.     "Answer the receiver's fErase field as a Smalltalk object."
  91730.  
  91731.     ^(bytes dwordAtOffset: 4) asBoolean!
  91732.  
  91733. rcPaint
  91734.     "Answer the receiver's rcPaint field as a Smalltalk object."
  91735.  
  91736.     ^RECT fromAddress: (bytes yourAddress + 8)! !
  91737.  
  91738. PALETTEENTRY comment:
  91739. '<PALETTEENTRY> is an <ExternalStructure> class to wrap the struct ''OCIDL.PALETTEENTRY'' from type information in the ''OCIDL Library'' library.
  91740.  
  91741. The type library contains no documentation for this struct
  91742.  
  91743. WARNING: This comment was automatically generated from the struct''s type information and any changes made here may be overwritten the next time this wrapper class is so generated.'!
  91744. !PALETTEENTRY class methodsFor!
  91745.  
  91746. defineFields
  91747.     "Define the fields of the PALETTEENTRY structure.
  91748.         PALETTEENTRY compileDefinition
  91749.     
  91750.         typedef         struct tagPALETTEENTRY {
  91751.             BYTE peRed;
  91752.             BYTE peGreen;
  91753.             BYTE peBlue;
  91754.             BYTE peFlags;
  91755.         } PALETTEENTRY;
  91756.  
  91757.     "
  91758.  
  91759.     self
  91760.         defineField: #peRed type: BYTEField new offset: 0;
  91761.         defineField: #peGreen type: BYTEField new offset: 1;
  91762.         defineField: #peBlue type: BYTEField new offset: 2;
  91763.         defineField: #peFlags type: BYTEField new beUncompiled offset: 3.
  91764.     self byteSize: 4!
  91765.  
  91766. threeThreeTwo
  91767.     "Answer a packed array palette entries to specify a default 332 palette."
  91768.  
  91769.     | palette |
  91770.     palette := StructureArray length: 256 elementClass: self.
  91771.     0 to: 255
  91772.         do: 
  91773.             [:i | 
  91774.             | pe |
  91775.             pe := palette at: i + 1.
  91776.             pe peRed: ((i bitShift: -5) bitAnd: 2r111) * 255 // 7.
  91777.             pe peGreen: ((i bitShift: -2) bitAnd: 2r111) * 255 // 7.
  91778.             pe peBlue: (i bitAnd: 2r11) * 255 // 3].
  91779.     ^palette
  91780.  
  91781.  
  91782.     "
  91783. Time millisecondsToRun: [PALETTEENTRY threeThreeTwo]
  91784. "! !
  91785.  
  91786. !PALETTEENTRY methodsFor!
  91787.  
  91788. asColor
  91789.     "Answer a new Colour based on the receiver's data"
  91790.  
  91791.     ^Color
  91792.         red: self peRed
  91793.         green: self peGreen
  91794.         blue: self peBlue!
  91795.  
  91796. peBlue
  91797.     "Answer the receiver's peBlue field as a Smalltalk object."
  91798.  
  91799.     ^(bytes byteAtOffset: 2)!
  91800.  
  91801. peBlue: anObject
  91802.     "Set the receiver's peBlue field to the value of anObject."
  91803.  
  91804.     bytes byteAtOffset: 2 put: anObject!
  91805.  
  91806. peGreen
  91807.     "Answer the receiver's peGreen field as a Smalltalk object."
  91808.  
  91809.     ^(bytes byteAtOffset: 1)!
  91810.  
  91811. peGreen: anObject
  91812.     "Set the receiver's peGreen field to the value of anObject."
  91813.  
  91814.     bytes byteAtOffset: 1 put: anObject!
  91815.  
  91816. peRed
  91817.     "Answer the receiver's peRed field as a Smalltalk object."
  91818.  
  91819.     ^(bytes byteAtOffset: 0)!
  91820.  
  91821. peRed: anObject
  91822.     "Set the receiver's peRed field to the value of anObject."
  91823.  
  91824.     bytes byteAtOffset: 0 put: anObject! !
  91825.  
  91826. PARAFORMAT comment:
  91827. ''!
  91828. !PARAFORMAT class methodsFor!
  91829.  
  91830. defineFields
  91831.     "Define the Win32 PARAFORMAT Structure (used for paragraph formatting
  91832.     in the RichEdit control)
  91833. .
  91834.         PARAFORMAT compileDefinition
  91835.     "
  91836.  
  91837.     self
  91838.         defineField: #dwSize type: DWORDField writeOnly beOverride;
  91839.         defineField: #dwMask type: DWORDField new;
  91840.         defineField: #wNumbering type: WORDField new;
  91841.         defineField: #wReserved type: WORDField filler;
  91842.         defineField: #dxStartIndent type: SDWORDField new;
  91843.         defineField: #dxRightIndent type: SDWORDField new;
  91844.         defineField: #dxOffset type: SDWORDField new;
  91845.         defineField: #wAlignment type: WORDField new;
  91846.         defineField: #cTabCount type: SWORDField new;
  91847.         defineField: #rgxTabs type: (ArrayField type: DWORDArray length: 32)! !
  91848.  
  91849. !PARAFORMAT methodsFor!
  91850.  
  91851. alignment
  91852.     "Answer the receiver's alignment as an integer value"
  91853.  
  91854.     ^self wAlignment!
  91855.  
  91856. alignment: anInteger
  91857.     "Sets the receiver alignment according to anInteger"
  91858.  
  91859.     self maskIn: PFM_ALIGNMENT.
  91860.     self wAlignment: anInteger!
  91861.  
  91862. cTabCount
  91863.     "Answer the receiver's cTabCount field as a Smalltalk object."
  91864.  
  91865.     ^(bytes swordAtOffset: 26)!
  91866.  
  91867. cTabCount: anObject
  91868.     "Set the receiver's cTabCount field to the value of anObject."
  91869.  
  91870.     bytes swordAtOffset: 26 put: anObject!
  91871.  
  91872. dwMask
  91873.     "Answer the receiver's dwMask field as a Smalltalk object."
  91874.  
  91875.     ^(bytes dwordAtOffset: 4)!
  91876.  
  91877. dwMask: anObject
  91878.     "Set the receiver's dwMask field to the value of anObject."
  91879.  
  91880.     bytes dwordAtOffset: 4 put: anObject!
  91881.  
  91882. dwSize: anObject
  91883.     "Set the receiver's dwSize field to the value of anObject."
  91884.  
  91885.     bytes dwordAtOffset: 0 put: anObject!
  91886.  
  91887. dxOffset
  91888.     "Answer the receiver's dxOffset field as a Smalltalk object."
  91889.  
  91890.     ^(bytes sdwordAtOffset: 20)!
  91891.  
  91892. dxOffset: anObject
  91893.     "Set the receiver's dxOffset field to the value of anObject."
  91894.  
  91895.     bytes sdwordAtOffset: 20 put: anObject!
  91896.  
  91897. dxRightIndent
  91898.     "Answer the receiver's dxRightIndent field as a Smalltalk object."
  91899.  
  91900.     ^(bytes sdwordAtOffset: 16)!
  91901.  
  91902. dxRightIndent: anObject
  91903.     "Set the receiver's dxRightIndent field to the value of anObject."
  91904.  
  91905.     bytes sdwordAtOffset: 16 put: anObject!
  91906.  
  91907. dxStartIndent
  91908.     "Answer the receiver's dxStartIndent field as a Smalltalk object."
  91909.  
  91910.     ^(bytes sdwordAtOffset: 12)!
  91911.  
  91912. dxStartIndent: anObject
  91913.     "Set the receiver's dxStartIndent field to the value of anObject."
  91914.  
  91915.     bytes sdwordAtOffset: 12 put: anObject!
  91916.  
  91917. maskIn: anInteger
  91918.     "Private - OR in to contents mask member the bit flags represented by anInteger.
  91919.     Answer the receiver."
  91920.  
  91921.     self dwMask: (self dwMask bitOr: anInteger)!
  91922.  
  91923. rgxTabs
  91924.     "Answer the receiver's rgxTabs field as a Smalltalk object."
  91925.  
  91926.     ^DWORDArray fromAddress: (bytes yourAddress + 28) length: 32!
  91927.  
  91928. rgxTabs: anObject
  91929.     "Set the receiver's rgxTabs field to the value of anObject."
  91930.  
  91931.     | size |
  91932.     size := anObject byteSize min: (32 * 4).
  91933.     anObject replaceBytesOf: bytes from: 29 to: 28 + size startingAt: 1!
  91934.  
  91935. wAlignment
  91936.     "Answer the receiver's wAlignment field as a Smalltalk object."
  91937.  
  91938.     ^(bytes wordAtOffset: 24)!
  91939.  
  91940. wAlignment: anObject
  91941.     "Set the receiver's wAlignment field to the value of anObject."
  91942.  
  91943.     bytes wordAtOffset: 24 put: anObject!
  91944.  
  91945. wNumbering
  91946.     "Answer the receiver's wNumbering field as a Smalltalk object."
  91947.  
  91948.     ^(bytes wordAtOffset: 8)!
  91949.  
  91950. wNumbering: anObject
  91951.     "Set the receiver's wNumbering field to the value of anObject."
  91952.  
  91953.     bytes wordAtOffset: 8 put: anObject! !
  91954.  
  91955. POINTL comment:
  91956. '<POINTL> is an <ExternalStructure> class to wrap the struct ''OCIDL.POINTL'' from type information in the ''OCIDL Library'' library.
  91957.  
  91958. The type library contains no documentation for this struct
  91959.  
  91960. WARNING: This comment was automatically generated from the struct''s type information and any changes made here may be overwritten the next time this wrapper class is so generated.'!
  91961. !POINTL class methodsFor!
  91962.  
  91963. defineFields
  91964.     "Define the fields of the Win32 POINTL structure.
  91965.         POINTL compileDefinition
  91966.     "
  91967.  
  91968.     self 
  91969.         defineField: #x type: SDWORDField new;    
  91970.         defineField: #y type: SDWORDField new!
  91971.  
  91972. fromPoint: aPoint
  91973.     "Answer a new instance of the receiver representing aPoint."
  91974.     
  91975.     ^self x: aPoint x y: aPoint y!
  91976.  
  91977. icon
  91978.     "Answer a suitable iconic representation for the receiver."
  91979.  
  91980.     ^Point icon!
  91981.  
  91982. initialize
  91983.     "Private - Initialize the receiver.
  91984.     Many typelibs refer to POINT, so it helps to alias that."
  91985.  
  91986.     self environment at: #POINT put: self!
  91987.  
  91988. uninitialize
  91989.     "Private - Unitialize the receiver as it is about to be removed from the system.
  91990.     Make sure our alias disappears with us."
  91991.  
  91992.     self environment removeKey: #POINT ifAbsent: []!
  91993.  
  91994. x: x y: y
  91995.     "Answer a new instance of the receiver representing the Point whose 
  91996.     cartesian coordinates are the arguments.
  91997.     Implementation Note: For performance reasons avoid going through
  91998.     all the <ExternalStructure> framework methods."
  91999.  
  92000.     ^self basicNew 
  92001.         bytes: ((ByteArray newFixed: 8)
  92002.                 sdwordAtOffset: 0 put: x;
  92003.                 sdwordAtOffset: 4 put: y;
  92004.                 yourself)
  92005. ! !
  92006.  
  92007. !POINTL methodsFor!
  92008.  
  92009. asDword
  92010.     "Answer the receiver in a form suitable for passing or returning 
  92011.     as a 32-bit value (i.e. a 32-bit integer)."
  92012.  
  92013.     ^(DWORD fromPoint: self) asDword!
  92014.  
  92015. asObject
  92016.     "Answer a suitable Smalltalk object to represent the receiver's value, in this case
  92017.     a <Point>."
  92018.  
  92019.     ^self asPoint!
  92020.  
  92021. asPoint
  92022.     "Answer a Point created that matches the receiver"
  92023.  
  92024.     ^self x @ self y!
  92025.  
  92026. printOn: aStream
  92027.     "Append a short textual description of the receiver to aStream."
  92028.  
  92029.     aStream
  92030.         basicPrint: self;
  92031.         nextPut: $(; print: self asPoint; nextPut: $)!
  92032.  
  92033. x
  92034.     "Answer the receiver's x field as a Smalltalk object."
  92035.  
  92036.     ^(bytes sdwordAtOffset: 0)!
  92037.  
  92038. x: anObject
  92039.     "Set the receiver's x field to the value of anObject."
  92040.  
  92041.     bytes sdwordAtOffset: 0 put: anObject!
  92042.  
  92043. y
  92044.     "Answer the receiver's y field as a Smalltalk object."
  92045.  
  92046.     ^(bytes sdwordAtOffset: 4)!
  92047.  
  92048. y: anObject
  92049.     "Set the receiver's y field to the value of anObject."
  92050.  
  92051.     bytes sdwordAtOffset: 4 put: anObject! !
  92052.  
  92053. PRINTDLG comment:
  92054. ''!
  92055. !PRINTDLG class methodsFor!
  92056.  
  92057. defineFields
  92058.     "Define the fields of the Win32 PRINTDLG structure.
  92059.  
  92060.         PRINTDLG compileDefinition
  92061.  
  92062.     typedef struct tagPD {  // pd  
  92063.         DWORD                lStructSize;
  92064.         HWND                hwndOwner;
  92065.         HANDLE                hDevMode;
  92066.         HANDLE                hDevNames;
  92067.         HDC                    hDC;
  92068.         DWORD                Flags;
  92069.         WORD                nFromPage;
  92070.         WORD                nToPage;
  92071.         WORD                nMinPage;
  92072.         WORD                nMaxPage;
  92073.         WORD                nCopies;
  92074.         HINSTANCE            hInstance;
  92075.         DWORD                lCustData;
  92076.         LPPRINTHOOKPROC    lpfnPrintHook;
  92077.         LPSETUPHOOKPROC    lpfnSetupHook;
  92078.         LPCTSTR                lpPrintTemplateName;
  92079.         LPCTSTR                lpSetupTemplateName;
  92080.         HANDLE                hPrintTemplate;
  92081.         HANDLE                hSetupTemplate;
  92082.     } PRINTDLG;"
  92083.  
  92084.     self 
  92085.         defineField: #dwSize                type: DWORDField writeOnly beOverride;
  92086.         defineField: #hwndOwner            type: DWORDField writeOnly;
  92087.         defineField: #hDevMode            type: DWORDField new beUncompiled;
  92088.         defineField: #hDevNames            type: DWORDField new beUncompiled;
  92089.         defineField: #hDC                type: DWORDField new;
  92090.         defineField: #flags                type: DWORDField new;
  92091.         defineField: #nFromPage            type: WORDField new;
  92092.         defineField: #nToPage            type: WORDField new;
  92093.         defineField: #nMinPage            type: WORDField writeOnly;
  92094.         defineField: #nMaxPage            type: WORDField writeOnly;
  92095.         defineField: #nCopies                type: WORDField new;
  92096.         defineField: #hInstance            type: DWORDField filler;
  92097.         defineField: #lCustData            type: DWORDField filler;
  92098.         defineField: #lpfnPrintHook            type: (PointerField type: ExternalAddress) beFiller;
  92099.         defineField: #lpfnSetupHook        type: (PointerField type: ExternalAddress) beFiller;
  92100.         defineField: #lpPrintTemplateName    type: (PointerField type: String) beFiller;
  92101.         defineField: #lpSetupTemplateName    type: (PointerField type: String) beFiller;
  92102.         defineField: #hPrintTemplate        type: DWORDField filler;
  92103.         defineField: #hSetupTemplate        type: DWORDField filler!
  92104.  
  92105. packing
  92106.     "Answer the default packing for instances of the receiver.
  92107.     This is the maximum alignment to which members of the structure
  92108.     after the first are padded. Each field type has a natural alignment
  92109.     (e.g. ints align to 32-bit boundaries), and it is the smaller of the
  92110.     packing and the natural alignment which is used to decide the
  92111.     padding necessary for the field in the structure.
  92112.     PRINTDLG is an old Win16 structure with byte packing."
  92113.  
  92114.     ^1! !
  92115.  
  92116. !PRINTDLG methodsFor!
  92117.  
  92118. dwSize: anObject
  92119.     "Set the receiver's dwSize field to the value of anObject."
  92120.  
  92121.     bytes dwordAtOffset: 0 put: anObject!
  92122.  
  92123. flags
  92124.     "Answer the receiver's flags field as a Smalltalk object."
  92125.  
  92126.     ^(bytes dwordAtOffset: 20)!
  92127.  
  92128. flags: anObject
  92129.     "Set the receiver's flags field to the value of anObject."
  92130.  
  92131.     bytes dwordAtOffset: 20 put: anObject!
  92132.  
  92133. hDC
  92134.     "Answer the receiver's hDC field as a Smalltalk object."
  92135.  
  92136.     ^(bytes dwordAtOffset: 16)!
  92137.  
  92138. hDC: anObject
  92139.     "Set the receiver's hDC field to the value of anObject."
  92140.  
  92141.     bytes dwordAtOffset: 16 put: anObject!
  92142.  
  92143. hwndOwner: anObject
  92144.     "Set the receiver's hwndOwner field to the value of anObject."
  92145.  
  92146.     bytes dwordAtOffset: 4 put: anObject!
  92147.  
  92148. nCopies
  92149.     "Answer the receiver's nCopies field as a Smalltalk object."
  92150.  
  92151.     ^(bytes wordAtOffset: 32)!
  92152.  
  92153. nCopies: anObject
  92154.     "Set the receiver's nCopies field to the value of anObject."
  92155.  
  92156.     bytes wordAtOffset: 32 put: anObject!
  92157.  
  92158. nFromPage
  92159.     "Answer the receiver's nFromPage field as a Smalltalk object."
  92160.  
  92161.     ^(bytes wordAtOffset: 24)!
  92162.  
  92163. nFromPage: anObject
  92164.     "Set the receiver's nFromPage field to the value of anObject."
  92165.  
  92166.     bytes wordAtOffset: 24 put: anObject!
  92167.  
  92168. nMaxPage: anObject
  92169.     "Set the receiver's nMaxPage field to the value of anObject."
  92170.  
  92171.     bytes wordAtOffset: 30 put: anObject!
  92172.  
  92173. nMinPage: anObject
  92174.     "Set the receiver's nMinPage field to the value of anObject."
  92175.  
  92176.     bytes wordAtOffset: 28 put: anObject!
  92177.  
  92178. nToPage
  92179.     "Answer the receiver's nToPage field as a Smalltalk object."
  92180.  
  92181.     ^(bytes wordAtOffset: 26)!
  92182.  
  92183. nToPage: anObject
  92184.     "Set the receiver's nToPage field to the value of anObject."
  92185.  
  92186.     bytes wordAtOffset: 26 put: anObject!
  92187.  
  92188. ownerView: aView
  92189.     "Set the parent window for the dialog to aView."
  92190.  
  92191.     | hWnd |
  92192.     hWnd := aView asParameter.
  92193.     hWnd isNull ifFalse: [self hwndOwner: hWnd].! !
  92194.  
  92195. PROCESS_INFORMATION comment:
  92196. ''!
  92197. !PROCESS_INFORMATION class methodsFor!
  92198.  
  92199. defineFields
  92200.     "Define the fields of the Win32 PROCESS_INFORMATION structure.
  92201.  
  92202.         PROCESS_INFORMATION compileDefinition
  92203.  
  92204.     typedef struct _PROCESS_INFORMATION { // pi 
  92205.         HANDLE hProcess; 
  92206.         HANDLE hThread; 
  92207.         DWORD dwProcessId; 
  92208.         DWORD dwThreadId; 
  92209.     } PROCESS_INFORMATION; "
  92210.  
  92211.     self 
  92212.         beUncompiled;
  92213.         defineField: #hProcess type: DWORDField readOnly;
  92214.         defineField: #hThread type: DWORDField readOnly;
  92215.         defineField: #dwProcessId type: DWORDField readOnly;
  92216.         defineField: #dwThreadId type: DWORDField readOnly
  92217. ! !
  92218.  
  92219. RECT comment:
  92220. '<RECT> is an <ExternalStructure> class to wrap the standard Win32 structure of the same name.
  92221.  
  92222. The RECT structure is used in many places to represent a rectangle consisting of 32 bit co-ordinates for top-left and bottom-right corners. <RECTL> is an alias for the same class/structure.'!
  92223. !RECT class methodsFor!
  92224.  
  92225. defineFields
  92226.     "Define the fields of the RECT structure.
  92227.         RECT compileDefinition
  92228.     
  92229.         typedef         struct tagRECT {
  92230.             long left;
  92231.             long top;
  92232.             long right;
  92233.             long bottom;
  92234.         } RECT;
  92235.  
  92236.     "
  92237.  
  92238.     self
  92239.         defineField: #left type: SDWORDField new offset: 0;
  92240.         defineField: #top type: SDWORDField new offset: 4;
  92241.         defineField: #right type: SDWORDField new offset: 8;
  92242.         defineField: #bottom type: SDWORDField new offset: 12.
  92243.     self byteSize: 16!
  92244.  
  92245. fromRectangle: aRectangle
  92246.     "Answer a new instance of the receiver instantiated from the Smalltalk
  92247.     Rectangle, aRectangle."
  92248.  
  92249.     ^self 
  92250.         left: aRectangle left
  92251.         top: aRectangle top
  92252.         right: aRectangle right
  92253.         bottom: aRectangle bottom
  92254. !
  92255.  
  92256. icon
  92257.     "Answer a suitable iconic representation for the receiver."
  92258.  
  92259.     ^Rectangle icon!
  92260.  
  92261. initialize
  92262.     "Private - Initialize the receiver.
  92263.     Many typelibs refer to RECTL, so it helps to alias that.
  92264.         self initialize
  92265.     "
  92266.  
  92267.     self environment at: #RECTL put: self!
  92268.  
  92269. left: left top: top right: right bottom: bottom 
  92270.     "Answer a new instance of the receiver with the specified position
  92271.     corner positions.
  92272.     Implementation Note: For performance reasons do this all with low-level
  92273.     inline code."
  92274.  
  92275.     ^self basicNew
  92276.         bytes: ((ByteArray newFixed: 16)
  92277.                 sdwordAtOffset: 0 put: left;
  92278.                 sdwordAtOffset: 4 put: top;
  92279.                 sdwordAtOffset: 8 put: right;
  92280.                 sdwordAtOffset: 12 put: bottom;
  92281.                 yourself)!
  92282.  
  92283. left: left top: top width: width height: height
  92284.     "Answer a new instance of the receiver with the specified position
  92285.     and dimensions."
  92286.  
  92287.     ^self 
  92288.         left: left
  92289.         top: top
  92290.         right: left+width
  92291.         bottom: top+height
  92292. !
  92293.  
  92294. uninitialize
  92295.     "Private - Unitialize the receiver as it is about to be removed from the system.
  92296.     Make sure our alias disappears with us."
  92297.  
  92298.     self environment removeKey: #RECTL ifAbsent: []! !
  92299.  
  92300. !RECT methodsFor!
  92301.  
  92302. area
  92303.     "Answer the area of the receiver; the product of width and height."
  92304.  
  92305.     ^self width * self height!
  92306.  
  92307. asObject
  92308.     "Answer a suitable Smalltalk object to represent the receiver's value, in this case
  92309.     a <Rectangle>."
  92310.  
  92311.     ^self asRectangle
  92312. !
  92313.  
  92314. asRectangle
  92315.     "Answer a new Rectangle that matches the receiver."
  92316.  
  92317.     ^self topLeft corner: self bottomRight!
  92318.  
  92319. bottom
  92320.     "Answer the receiver's bottom field as a Smalltalk object."
  92321.  
  92322.     ^(bytes sdwordAtOffset: 12)!
  92323.  
  92324. bottom: anObject
  92325.     "Set the receiver's bottom field to the value of anObject."
  92326.  
  92327.     bytes sdwordAtOffset: 12 put: anObject!
  92328.  
  92329. bottomRight
  92330.     "Answer a Point representing the bottom right position of the receiver."
  92331.  
  92332.     ^self right @ self bottom!
  92333.  
  92334. extent
  92335.     "Answer a Point representing the extent of the receiver. The x coordinate 
  92336.     is the width and the y coordinate is the height."
  92337.  
  92338.     ^self width @ self height!
  92339.  
  92340. extent: newExtent
  92341.     "Set the extent of the receiver to aPoint. (The origin remains the same and
  92342.     the corner stays in the same quadrant it was in relative to the origin point.
  92343.     If aPoint contains any negative value, the result is undefined)."
  92344.  
  92345.     self right: self left + newExtent x.
  92346.     self bottom: self top + newExtent y!
  92347.  
  92348. height
  92349.     "Answer the height of the receiver."
  92350.  
  92351.     ^self bottom - self top!
  92352.  
  92353. left
  92354.     "Answer the receiver's left field as a Smalltalk object."
  92355.  
  92356.     ^(bytes sdwordAtOffset: 0)!
  92357.  
  92358. left: anObject
  92359.     "Set the receiver's left field to the value of anObject."
  92360.  
  92361.     bytes sdwordAtOffset: 0 put: anObject!
  92362.  
  92363. origin
  92364.     "Answer the Point at the top left corner of the receiver"
  92365.  
  92366.     ^self topLeft
  92367. !
  92368.  
  92369. printOn: aStream
  92370.     "Append a short textual description of the receiver to aStream."
  92371.  
  92372.     self isNull ifTrue: [^super printOn: aStream].
  92373.     aStream
  92374.         basicPrint: self;
  92375.         nextPut: $(;
  92376.         print: self topLeft;
  92377.         nextPutAll: ', ';
  92378.         print: self bottomRight;
  92379.         nextPut: $)!
  92380.  
  92381. right
  92382.     "Answer the receiver's right field as a Smalltalk object."
  92383.  
  92384.     ^(bytes sdwordAtOffset: 8)!
  92385.  
  92386. right: anObject
  92387.     "Set the receiver's right field to the value of anObject."
  92388.  
  92389.     bytes sdwordAtOffset: 8 put: anObject!
  92390.  
  92391. top
  92392.     "Answer the receiver's top field as a Smalltalk object."
  92393.  
  92394.     ^(bytes sdwordAtOffset: 4)!
  92395.  
  92396. top: anObject
  92397.     "Set the receiver's top field to the value of anObject."
  92398.  
  92399.     bytes sdwordAtOffset: 4 put: anObject!
  92400.  
  92401. topLeft
  92402.     "Answer a Point representing the top left position of the receiver."
  92403.  
  92404.     ^self left @ self top!
  92405.  
  92406. width
  92407.     "Answer the width of the receiver."
  92408.  
  92409.     ^self right - self left! !
  92410.  
  92411. RGBQUAD comment:
  92412. ''!
  92413. !RGBQUAD class methodsFor!
  92414.  
  92415. defineFields
  92416.     "Define the fields of the Win32 RBGQUAD structure.
  92417.         RGBQUAD compileDefinition
  92418.     "
  92419.  
  92420.     self 
  92421.         defineField: #rgbBlue type: BYTEField new;
  92422.         defineField: #rgbGreen type: BYTEField new;
  92423.         defineField: #rgbRed type: BYTEField new;
  92424.         defineField: #rgbReserved type: BYTEField filler! !
  92425.  
  92426. !RGBQUAD methodsFor!
  92427.  
  92428. rgbBlue
  92429.     "Answer the receiver's rgbBlue field as a Smalltalk object.
  92430.     Automatically generated get method - do not modify"
  92431.  
  92432.     ^(bytes byteAtOffset: 0)!
  92433.  
  92434. rgbBlue: anObject
  92435.     "Set the receiver's rgbBlue field to the value of anObject.
  92436.     Automatically generated set method - do not modify"
  92437.  
  92438.     bytes byteAtOffset: 0 put: anObject!
  92439.  
  92440. rgbGreen
  92441.     "Answer the receiver's rgbGreen field as a Smalltalk object.
  92442.     Automatically generated get method - do not modify"
  92443.  
  92444.     ^(bytes byteAtOffset: 1)!
  92445.  
  92446. rgbGreen: anObject
  92447.     "Set the receiver's rgbGreen field to the value of anObject.
  92448.     Automatically generated set method - do not modify"
  92449.  
  92450.     bytes byteAtOffset: 1 put: anObject!
  92451.  
  92452. rgbRed
  92453.     "Answer the receiver's rgbRed field as a Smalltalk object.
  92454.     Automatically generated get method - do not modify"
  92455.  
  92456.     ^(bytes byteAtOffset: 2)!
  92457.  
  92458. rgbRed: anObject
  92459.     "Set the receiver's rgbRed field to the value of anObject.
  92460.     Automatically generated set method - do not modify"
  92461.  
  92462.     bytes byteAtOffset: 2 put: anObject! !
  92463.  
  92464. RGNDATA comment:
  92465. ''!
  92466. !RGNDATA class methodsFor!
  92467.  
  92468. defineFields
  92469.     "Define the fields of the RGNDATA 'structure'.
  92470.     Note that we cheat a bit here by including the header as members of the RGNDATA
  92471.     to avoid defining two structures, and to make using it a bit easier.
  92472.  
  92473.         RGNDATA compileDefinition
  92474.  
  92475.         struct RGNDATAHEADER 
  92476.         {
  92477.             DWORD   dwSize;
  92478.             DWORD   iType;
  92479.             DWORD   nCount;
  92480.             DWORD   nRgnSize;
  92481.             RECT    rcBound;
  92482.         };
  92483.  
  92484.         struct RGNDATA 
  92485.         {
  92486.             RGNDATAHEADER   rdh;
  92487.             char            Buffer[1];
  92488.         };
  92489.     "
  92490.  
  92491.     self
  92492.         defineField: #dwSize     type: DWORDField writeOnly beOverride;
  92493.         defineField: #iType        type: DWORDField new;
  92494.         defineField: #nCount    type: DWORDField new;
  92495.         defineField: #nRgnSize    type: DWORDField new;
  92496.         defineField: #rcBound    type: (StructureField type: RECT)
  92497. ! !
  92498.  
  92499. !RGNDATA methodsFor!
  92500.  
  92501. dwSize: anObject
  92502.     "Set the receiver's dwSize field to the value of anObject.
  92503.     Automatically generated set method - do not modify"
  92504.  
  92505.     bytes dwordAtOffset: 0 put: anObject!
  92506.  
  92507. iType
  92508.     "Answer the receiver's iType field as a Smalltalk object.
  92509.     Automatically generated get method - do not modify"
  92510.  
  92511.     ^(bytes dwordAtOffset: 4)!
  92512.  
  92513. iType: anObject
  92514.     "Set the receiver's iType field to the value of anObject.
  92515.     Automatically generated set method - do not modify"
  92516.  
  92517.     bytes dwordAtOffset: 4 put: anObject!
  92518.  
  92519. nCount
  92520.     "Answer the receiver's nCount field as a Smalltalk object.
  92521.     Automatically generated get method - do not modify"
  92522.  
  92523.     ^(bytes dwordAtOffset: 8)!
  92524.  
  92525. nCount: anObject
  92526.     "Set the receiver's nCount field to the value of anObject.
  92527.     Automatically generated set method - do not modify"
  92528.  
  92529.     bytes dwordAtOffset: 8 put: anObject!
  92530.  
  92531. nRgnSize
  92532.     "Answer the receiver's nRgnSize field as a Smalltalk object.
  92533.     Automatically generated get method - do not modify"
  92534.  
  92535.     ^(bytes dwordAtOffset: 12)!
  92536.  
  92537. nRgnSize: anObject
  92538.     "Set the receiver's nRgnSize field to the value of anObject.
  92539.     Automatically generated set method - do not modify"
  92540.  
  92541.     bytes dwordAtOffset: 12 put: anObject!
  92542.  
  92543. rcBound
  92544.     "Answer the receiver's rcBound field as a Smalltalk object.
  92545.     Automatically generated get method - do not modify"
  92546.  
  92547.     ^RECT fromAddress: (bytes yourAddress + 16)!
  92548.  
  92549. rcBound: anObject
  92550.     "Set the receiver's rcBound field to the value of anObject.
  92551.     Automatically generated set method - do not modify"
  92552.  
  92553.     anObject replaceBytesOf: bytes from: 17 to: 32 startingAt: 1! !
  92554.  
  92555. SCROLLINFO comment:
  92556. ''!
  92557. !SCROLLINFO class methodsFor!
  92558.  
  92559. defineFields
  92560.     "Define the layout of the Win32 SCROLLINFO structure
  92561.   
  92562.         SCROLLINFO compileDefinition
  92563.  
  92564.     typedef struct tagSCROLLINFO   // si 
  92565.         UINT cbSize; 
  92566.         UINT fMask; 
  92567.         int  nMin; 
  92568.         int  nMax; 
  92569.         UINT nPage; 
  92570.         int  nPos; 
  92571.         int  nTrackPos; 
  92572.         SCROLLINFO; 
  92573.     typedef SCROLLINFO FAR *LPSCROLLINFO;"
  92574.  
  92575.     self 
  92576.         defineField: #dwSize type: DWORDField writeOnly beOverride;
  92577.         defineField: #fMask type: DWORDField new;
  92578.         defineField: #nMin type: SDWORDField new;
  92579.         defineField: #nMax type: SDWORDField new;
  92580.         defineField: #nPage type: DWORDField new;
  92581.         defineField: #nPos type: SDWORDField new;
  92582.         defineField: #nTrackPos type: SDWORDField readOnly "cannot be set"! !
  92583.  
  92584. !SCROLLINFO methodsFor!
  92585.  
  92586. dwSize: anObject
  92587.     "Set the receiver's dwSize field to the value of anObject.
  92588.     Automatically generated set method - do not modify"
  92589.  
  92590.     bytes dwordAtOffset: 0 put: anObject!
  92591.  
  92592. fMask
  92593.     "Answer the receiver's fMask field as a Smalltalk object.
  92594.     Automatically generated get method - do not modify"
  92595.  
  92596.     ^(bytes dwordAtOffset: 4)!
  92597.  
  92598. fMask: anObject
  92599.     "Set the receiver's fMask field to the value of anObject.
  92600.     Automatically generated set method - do not modify"
  92601.  
  92602.     bytes dwordAtOffset: 4 put: anObject!
  92603.  
  92604. maskIn: anInteger
  92605.     "OR in to contents' mask member the bit flags represented by anInteger.
  92606.     Answer the receiver."
  92607.  
  92608.     self fMask: (self fMask bitOr: anInteger)!
  92609.  
  92610. nMax
  92611.     "Answer the receiver's nMax field as a Smalltalk object.
  92612.     Automatically generated get method - do not modify"
  92613.  
  92614.     ^(bytes sdwordAtOffset: 12)!
  92615.  
  92616. nMax: anObject
  92617.     "Set the receiver's nMax field to the value of anObject.
  92618.     Automatically generated set method - do not modify"
  92619.  
  92620.     bytes sdwordAtOffset: 12 put: anObject!
  92621.  
  92622. nMin
  92623.     "Answer the receiver's nMin field as a Smalltalk object.
  92624.     Automatically generated get method - do not modify"
  92625.  
  92626.     ^(bytes sdwordAtOffset: 8)!
  92627.  
  92628. nMin: anObject
  92629.     "Set the receiver's nMin field to the value of anObject.
  92630.     Automatically generated set method - do not modify"
  92631.  
  92632.     bytes sdwordAtOffset: 8 put: anObject!
  92633.  
  92634. nPage
  92635.     "Answer the receiver's nPage field as a Smalltalk object.
  92636.     Automatically generated get method - do not modify"
  92637.  
  92638.     ^(bytes dwordAtOffset: 16)!
  92639.  
  92640. nPage: anObject
  92641.     "Set the receiver's nPage field to the value of anObject.
  92642.     Automatically generated set method - do not modify"
  92643.  
  92644.     bytes dwordAtOffset: 16 put: anObject!
  92645.  
  92646. nPos
  92647.     "Answer the receiver's nPos field as a Smalltalk object.
  92648.     Automatically generated get method - do not modify"
  92649.  
  92650.     ^(bytes sdwordAtOffset: 20)!
  92651.  
  92652. nPos: anObject
  92653.     "Set the receiver's nPos field to the value of anObject.
  92654.     Automatically generated set method - do not modify"
  92655.  
  92656.     bytes sdwordAtOffset: 20 put: anObject!
  92657.  
  92658. nTrackPos
  92659.     "Answer the receiver's nTrackPos field as a Smalltalk object.
  92660.     Automatically generated get method - do not modify"
  92661.  
  92662.     ^(bytes sdwordAtOffset: 24)!
  92663.  
  92664. page
  92665.     "Answer the page size of a proportional scroll bar."
  92666.  
  92667.     ^self nPage!
  92668.  
  92669. page: pageInteger
  92670.     "Set the page size of a proportional scroll bar."
  92671.  
  92672.     self
  92673.         nPage: pageInteger;
  92674.         maskIn: SIF_PAGE!
  92675.  
  92676. pos
  92677.     "Answer the position of the thumb in the scroll bar relative to its range."
  92678.  
  92679.     ^self nPos!
  92680.  
  92681. pos: positionInteger
  92682.     "Set the thumb position of the scroll bar to positionInteger. This position
  92683.     is relative to the scroll bars range."
  92684.  
  92685.     self nPos: positionInteger;
  92686.         maskIn: SIF_POS!
  92687.  
  92688. range
  92689.     "Answer an Interval over which the scroll bars thumb can be set." 
  92690.  
  92691.     ^self nMin to: self nMax!
  92692.  
  92693. range: anInterval
  92694.     "Set the range which the scroll bars thumb can be set to."
  92695.  
  92696.     self
  92697.         nMin: anInterval first;
  92698.         nMax: anInterval last;
  92699.         maskIn: SIF_RANGE! !
  92700.  
  92701. SECURITY_ATTRIBUTES comment:
  92702. ''!
  92703. !SECURITY_ATTRIBUTES class methodsFor!
  92704.  
  92705. defineFields
  92706.     "Define the fields of the SECURITY_ATTRIBUTES structure:
  92707.  
  92708.         SECURITY_ATTRIBUTES compileDefinition.
  92709.  
  92710.     typedef struct _SECURITY_ATTRIBUTES { // sa 
  92711.         DWORD nLength; 
  92712.         LPVOID lpSecurityDescriptor; 
  92713.         BOOL bInheritHandle; 
  92714.     } SECURITY_ATTRIBUTES; "
  92715.  
  92716.     self
  92717.         defineField: #dwSize type: DWORDField writeOnly beOverride;
  92718.         beUncompiled;
  92719.         defineField: #lpSecurityDescriptor type: LPVOIDField new;
  92720.         defineField: #bInheritHandle type: BOOLField new
  92721. ! !
  92722.  
  92723. !SECURITY_ATTRIBUTES methodsFor!
  92724.  
  92725. dwSize: anObject
  92726.     "Set the receiver's dwSize field to the value of anObject."
  92727.  
  92728.     bytes dwordAtOffset: 0 put: anObject! !
  92729.  
  92730. SHITEMID comment:
  92731. '<SHITEMID> is an <ExternalStructure> class to wrap the struct ''IShellFolderEx.SHITEMID'' from type information in the ''IShellFolder Extended Type Library v1.0'' library.
  92732.  
  92733. The type library contains no documentation for this struct.
  92734.  
  92735. Warning: This comment was automatically generated from the struct''s type information, but any changes made here will not be overwritten if the wrapper class is regenerated.
  92736.  
  92737. IDL definition follows:
  92738.  
  92739. typedef struct tagSHITEMID {
  92740.     short cb;
  92741.     BYTE abID[1];
  92742. } SHITEMID;
  92743. '!
  92744. !SHITEMID class methodsFor!
  92745.  
  92746. σA!!;=éå7%╛║ß@∞}┼╤Θ┼≡╥ƒ┴╢≈σUJ║╖─h3GPÆÉ6W╫llZ~~B+╢Æ
  92747. Ks%[╢nV$╧┴Iôφj)£ÆÜ╖╙ÅÜdW kD▀║d<º▌╔VF°|·{╟*ódÇ°TIIQêwï╠LƒV4╕;α║Ω┬ΘìZ¼Mä÷∙f╟─dlìR>;üφh│╡6Ä(⌡k V≥/H▌ⁿ) /⌐V¼£░l]çï╒╫─]┼₧    ╘è▀`kvCY Xτcτ6xAU∩╚Ä√.?A!!░ΦFΓNå⌡ï°╦N╓₧º─ƒ2▒ú█ ╬╤òfPΣ╖z┼y¼V┼∞∙τ╢L₧╨╠ΦG╥╢o╗såµ·÷>+&o )Φ'û¡m-º5ìG▐MGPÆruÄ∩ ±N┌ú÷q8?F>┬╬╫â$╣╫yj╗·Gÿüù₧o;R    Q└⌡<òCÖ≈┴┐d┼╙ÿ╣═ì╪Zêα╓ ;N╔üè═j»{r╚╖¬╦ƒ"! !
  92748.  
  92749. !SHITEMID methodsFor!
  92750.  
  92751. αF>XR══'⌐╛ë8┼+Θ╤»▐√╘┌▄¿≈╖P ║┬RWP█ü2V╫^Wjo`f·ì
  92752. Xj-¼~Yoí┐n╕│(m┬▐ë¡π▌    âaLOr╚╜tr¿█╧Tiæüf╜÷5ÆΦT\I!!εqì ]ÿPq┐|ÿ╥æ┐î¼vå
  92753. ïô╔<½²QíbJ~ÄΩ>█╤K─M.▀LÇV╤U▄!
  92754.  
  92755. ΓFJp\zàü!!>┐╗╠>ì:í╞Ω╧√▐╔╨¼╡╢@╜√╞rvDRÆà-ûw'oW_·è^Vd,Jáh(╧┴MÉ╖|H¬«ú¢ΣÅ àpAf▄»h&⌠ëÉ! !
  92756.  
  92757. SIZE comment:
  92758. '<SIZE> is an <ExternalStructure> class to wrap the standard Win32 structure of the same name. SIZE is used in many places to represent a 2-dimensional distance where the x and y dimensions are expressed as 32-bit integers. SIZEL is an alias for the same class/structure.'!
  92759. !SIZE class methodsFor!
  92760.  
  92761. defineFields
  92762.     "Define the fields of the SIZEL structure.
  92763.         SIZEL compileDefinition
  92764.     
  92765.         typedef         struct tagSIZEL {
  92766.             long cx;
  92767.             long cy;
  92768.         } SIZEL;
  92769.  
  92770.     "
  92771.  
  92772.     self
  92773.         defineField: #cx type: SDWORDField new offset: 0;
  92774.         defineField: #cy type: SDWORDField new offset: 4.
  92775.     self byteSize: 8!
  92776.  
  92777. icon
  92778.     "Answer a suitable iconic representation for the receiver."
  92779.  
  92780.     ^Icon fromId: 'extent.ico'!
  92781.  
  92782. initialize
  92783.     "Private - Initialize the receiver.
  92784.     Many typelibs refer to SIZEL, so it helps to alias that."
  92785.  
  92786.     self environment at: #SIZEL put: self!
  92787.  
  92788. uninitialize
  92789.     "Private - Unitialize the receiver as it is about to be removed from the system.
  92790.     Make sure our alias disappears with us."
  92791.  
  92792.     self environment removeKey: #SIZEL ifAbsent: []! !
  92793.  
  92794. !SIZE methodsFor!
  92795.  
  92796. asObject
  92797.     "Answer a suitable Smalltalk object to represent the receiver's value, in this case
  92798.     a <Point>."
  92799.  
  92800.     ^self cx @ self cy!
  92801.  
  92802. cx
  92803.     "Answer the receiver's cx field as a Smalltalk object."
  92804.  
  92805.     ^(bytes sdwordAtOffset: 0)!
  92806.  
  92807. cx: anObject
  92808.     "Set the receiver's cx field to the value of anObject."
  92809.  
  92810.     bytes sdwordAtOffset: 0 put: anObject!
  92811.  
  92812. cy
  92813.     "Answer the receiver's cy field as a Smalltalk object."
  92814.  
  92815.     ^(bytes sdwordAtOffset: 4)!
  92816.  
  92817. cy: anObject
  92818.     "Set the receiver's cy field to the value of anObject."
  92819.  
  92820.     bytes sdwordAtOffset: 4 put: anObject! !
  92821.  
  92822. STARTUPINFO comment:
  92823. ''!
  92824. !STARTUPINFO class methodsFor!
  92825.  
  92826. defineFields
  92827.     "Define the layout of the Win32 STARTUPINFO structure.
  92828.  
  92829.         STARTUPINFO compileDefinition
  92830.  
  92831.     typedef struct _STARTUPINFO { 
  92832.         DWORD   cb; 
  92833.         LPTSTR  lpReserved; 
  92834.         LPTSTR  lpDesktop; 
  92835.         LPTSTR  lpTitle; 
  92836.         DWORD   dwX; 
  92837.         DWORD   dwY; 
  92838.         DWORD   dwXSize; 
  92839.         DWORD   dwYSize; 
  92840.         DWORD   dwXCountChars; 
  92841.         DWORD   dwYCountChars; 
  92842.         DWORD   dwFillAttribute; 
  92843.         DWORD   dwFlags; 
  92844.         WORD    wShowWindow; 
  92845.         WORD    cbReserved2; 
  92846.         LPBYTE  lpReserved2; 
  92847.         HANDLE  hStdInput; 
  92848.         HANDLE  hStdOutput; 
  92849.         HANDLE  hStdError; 
  92850.     } STARTUPINFO, *LPSTARTUPINFO;"
  92851.  
  92852.      self 
  92853.         defineField: #dwSize type: DWORDField writeOnly beOverride;
  92854.         beUncompiled;
  92855.         defineField: #lpReserved type: (PointerField type: String) beFiller;
  92856.         defineField: #lpDesktop type: (PointerField type: String);
  92857.         defineField: #lpTitle type: (PointerField type: String);
  92858.         defineField: #dwX type: DWORDField new;
  92859.         defineField: #dwY type: DWORDField new;
  92860.         defineField: #dwXSize type: DWORDField new;
  92861.         defineField: #dwYSize type: DWORDField new;
  92862.         defineField: #dwXCountChars type: DWORDField new;
  92863.         defineField: #dwYCountChars type: DWORDField new;
  92864.         defineField: #dwFillAttribute type: DWORDField new;
  92865.         defineField: #dwFlags type: DWORDField new;
  92866.         defineField: #wShowWindow type: WORDField new;
  92867.         defineField: #cbReserved2 type: WORDField filler;
  92868.         defineField: #lpReserved2 type: LPVOIDField filler;
  92869.         defineField: #hStdInput type: DWORDField new;
  92870.         defineField: #hStdOutput type: DWORDField new;
  92871.         defineField: #hStdError type: DWORDField new! !
  92872.  
  92873. !STARTUPINFO methodsFor!
  92874.  
  92875. desktop: aString
  92876.     "Set the desktop identifier for the receiver to aString. We store down the String
  92877.     in an instance variable to prevent it being GC'd"
  92878.  
  92879.     desktop := aString.
  92880.     self lpDesktop: aString!
  92881.  
  92882. dwSize: anObject
  92883.     "Set the receiver's dwSize field to the value of anObject."
  92884.  
  92885.     bytes dwordAtOffset: 0 put: anObject!
  92886.  
  92887. stderr: aFile
  92888.     "Set the hStdError descriptor to aFile. We store down the File
  92889.     in an instance variable to prevent it being GC'd"
  92890.  
  92891.     stderr := aFile.
  92892.     self hStdError: stderr asParameter!
  92893.  
  92894. stdin: aFile
  92895.     "Set the hStdInput descriptor to aFile. We store down the File
  92896.     in an instance variable to prevent it being GC'd"
  92897.  
  92898.     stdin := aFile.
  92899.     self hStdInput: stdin asParameter!
  92900.  
  92901. stdout: aFile
  92902.     "Set the hStdOutput descriptor to aFile. We store down the File
  92903.     in an instance variable to prevent it being GC'd"
  92904.  
  92905.     stdout := aFile.
  92906.     self hStdOutput: stdout asParameter!
  92907.  
  92908. title: aString
  92909.     "Set the title for the receiver to aString. We store down the String
  92910.     in an instance variable to prevent it being GC'd"
  92911.  
  92912.     title := aString.
  92913.     self lpTitle: aString! !
  92914.  
  92915. SYSTEMTIME comment:
  92916. ''!
  92917. !SYSTEMTIME class methodsFor!
  92918.  
  92919. day: day month: month year: year
  92920.     "Private - Answer a new instance of the receiver for the specified day, month, and year."
  92921.  
  92922.     ^self new wDay: day; wMonth: month; wYear: year!
  92923.  
  92924. defineFields
  92925.     "Define the fields of the Win32 SYSTEMTIME structure
  92926.  
  92927.         SYSTEMTIME compileDefinition
  92928.     "
  92929.  
  92930.     self defineField: #wYear type: WORDField new;
  92931.         defineField: #wMonth type: WORDField new;
  92932.         defineField: #wDayOfWeek type: WORDField new;
  92933.         defineField: #wDay type: WORDField new;
  92934.         defineField: #wHour type: WORDField new;
  92935.         defineField: #wMinute type: WORDField new;
  92936.         defineField: #wSecond type: WORDField new;
  92937.         defineField: #wMilliseconds type: WORDField new    !
  92938.  
  92939. fromFILETIME: aFILETIME
  92940.     "Answer a new instance of the receiver instantiated from aFILETIME (which may be
  92941.     in local or UTC form).
  92942.     We double dispatch this back to the argument, aFILETIME, so that it can perform
  92943.     conversion from UTC if necessary."
  92944.  
  92945.     ^aFILETIME asSYSTEMTIME!
  92946.  
  92947. now
  92948.     "Private - Answer the current Windows local time"
  92949.     
  92950.     | answer |
  92951.     answer := self new.
  92952.     KernelLibrary default getLocalTime: answer.
  92953.     ^answer! !
  92954.  
  92955. !SYSTEMTIME methodsFor!
  92956.  
  92957. asFILETIME
  92958.     "Answer a FILETIME corresponding to the receiver."
  92959.  
  92960.     ^FILETIME fromSYSTEMTIME: self!
  92961.  
  92962. αW:9░ΓX@°êé9Æ:≤ö√─√ù≡∙¢╓ägf ⌐┼kaME╫è*SâVK$.TU+■ä^Kc%J¬jVx∞ΘMÉ│(i┤≈íè■┬^ï4ixt╙▒hr⌠öÇ}ií3╙p╣█∙.╨tn,═m¥╠XÄ[4¿:╥ç╧Γî│j¢Üûºu½┼Xrúrzî√╫╥Z╜<╔S▄Vπ;u≡╩}ÿx╘6╝┘═)┌ÉεΩΘ ¡!
  92963.  
  92964. asTimeStamp
  92965.     "Answer a TimeStamp corresponding to the receiver."
  92966.  
  92967.     ^TimeStamp fromSYSTEMTIME: self!
  92968.  
  92969. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣`▓▀6£êô┐├ΩU\·3j^∞¥_Åτ⌠Nç₧2TÜf∞=â≡W+╟hÉ▀M!
  92970.  
  92971. displayOn: aStream
  92972.     "Append a displayable representation of the receiver to aStream.
  92973.     Use the same display format as the system does, e.g. in Explorer, which is
  92974.     date followed by time separated by a space."
  92975.  
  92976.     | lc |
  92977.     lc := Locale default.
  92978.     aStream 
  92979.         nextPutAll: (lc printSysDate: self format: nil flags: 0);
  92980.         space;
  92981.         nextPutAll: (lc printTime: self format: nil flags: 0)
  92982. !
  92983.  
  92984. printOn: aStream
  92985.     "Append a debugging representation of the receiver to aStream."
  92986.  
  92987.     aStream 
  92988.         basicPrint: self;
  92989.         nextPut: $(; 
  92990.         display: self; 
  92991.         nextPut: $)
  92992. !
  92993.  
  92994. wDay
  92995.     "Answer the receiver's wDay field as a Smalltalk object.
  92996.     Automatically generated get method - do not modify"
  92997.  
  92998.     ^(bytes wordAtOffset: 6)!
  92999.  
  93000. wDay: anObject
  93001.     "Set the receiver's wDay field to the value of anObject.
  93002.     Automatically generated set method - do not modify"
  93003.  
  93004.     bytes wordAtOffset: 6 put: anObject!
  93005.  
  93006. wDayOfWeek
  93007.     "Answer the receiver's wDayOfWeek field as a Smalltalk object.
  93008.     Automatically generated get method - do not modify"
  93009.  
  93010.     ^(bytes wordAtOffset: 4)!
  93011.  
  93012. wDayOfWeek: anObject
  93013.     "Set the receiver's wDayOfWeek field to the value of anObject.
  93014.     Automatically generated set method - do not modify"
  93015.  
  93016.     bytes wordAtOffset: 4 put: anObject!
  93017.  
  93018. wHour
  93019.     "Answer the receiver's wHour field as a Smalltalk object.
  93020.     Automatically generated get method - do not modify"
  93021.  
  93022.     ^(bytes wordAtOffset: 8)!
  93023.  
  93024. wHour: anObject
  93025.     "Set the receiver's wHour field to the value of anObject.
  93026.     Automatically generated set method - do not modify"
  93027.  
  93028.     bytes wordAtOffset: 8 put: anObject!
  93029.  
  93030. wMilliseconds
  93031.     "Answer the receiver's wMilliseconds field as a Smalltalk object.
  93032.     Automatically generated get method - do not modify"
  93033.  
  93034.     ^(bytes wordAtOffset: 14)!
  93035.  
  93036. wMilliseconds: anObject
  93037.     "Set the receiver's wMilliseconds field to the value of anObject.
  93038.     Automatically generated set method - do not modify"
  93039.  
  93040.     bytes wordAtOffset: 14 put: anObject!
  93041.  
  93042. wMinute
  93043.     "Answer the receiver's wMinute field as a Smalltalk object.
  93044.     Automatically generated get method - do not modify"
  93045.  
  93046.     ^(bytes wordAtOffset: 10)!
  93047.  
  93048. wMinute: anObject
  93049.     "Set the receiver's wMinute field to the value of anObject.
  93050.     Automatically generated set method - do not modify"
  93051.  
  93052.     bytes wordAtOffset: 10 put: anObject!
  93053.  
  93054. wMonth
  93055.     "Answer the receiver's wMonth field as a Smalltalk object.
  93056.     Automatically generated get method - do not modify"
  93057.  
  93058.     ^(bytes wordAtOffset: 2)!
  93059.  
  93060. wMonth: anObject
  93061.     "Set the receiver's wMonth field to the value of anObject.
  93062.     Automatically generated set method - do not modify"
  93063.  
  93064.     bytes wordAtOffset: 2 put: anObject!
  93065.  
  93066. wSecond
  93067.     "Answer the receiver's wSecond field as a Smalltalk object.
  93068.     Automatically generated get method - do not modify"
  93069.  
  93070.     ^(bytes wordAtOffset: 12)!
  93071.  
  93072. wSecond: anObject
  93073.     "Set the receiver's wSecond field to the value of anObject.
  93074.     Automatically generated set method - do not modify"
  93075.  
  93076.     bytes wordAtOffset: 12 put: anObject!
  93077.  
  93078. wYear
  93079.     "Answer the receiver's wYear field as a Smalltalk object.
  93080.     Automatically generated get method - do not modify"
  93081.  
  93082.     ^(bytes wordAtOffset: 0)!
  93083.  
  93084. wYear: anObject
  93085.     "Set the receiver's wYear field to the value of anObject.
  93086.     Automatically generated set method - do not modify"
  93087.  
  93088.     bytes wordAtOffset: 0 put: anObject! !
  93089.  
  93090. TBADDBITMAP comment:
  93091. ''!
  93092. !TBADDBITMAP class methodsFor!
  93093.  
  93094. defineFields
  93095.     "Define the fields of the Win32 TBADDBITMAP structure.
  93096.  
  93097.     TBADDBITMAP compileDefinition
  93098.  
  93099.     typedef struct {  // tbab 
  93100.         HINSTANCE hInst; 
  93101.         UINT nID; 
  93102.     } TBADDBITMAP, *LPTBADDBITMAP"
  93103.  
  93104.     self
  93105.         defineField: #hInst type: DWORDField writeOnly;
  93106.         defineField: #nID type: DWORDField writeOnly! !
  93107.  
  93108. !TBADDBITMAP methodsFor!
  93109.  
  93110. hInst: anObject
  93111.     "Set the receiver's hInst field to the value of anObject.
  93112.     Automatically generated set method - do not modify"
  93113.  
  93114.     bytes dwordAtOffset: 0 put: anObject!
  93115.  
  93116. nID: anObject
  93117.     "Set the receiver's nID field to the value of anObject.
  93118.     Automatically generated set method - do not modify"
  93119.  
  93120.     bytes dwordAtOffset: 4 put: anObject! !
  93121.  
  93122. TBBUTTON comment:
  93123. ''!
  93124. !TBBUTTON class methodsFor!
  93125.  
  93126. defineFields
  93127.     "Define the fields of the Win32 TBBUTTON structure.
  93128.  
  93129.         TBBUTTON compileDefinition
  93130.  
  93131.     typedef struct _TBBUTTON { \\ tbb 
  93132.         int iBitmap; 
  93133.         int idCommand; 
  93134.         BYTE fsState; 
  93135.         BYTE fsStyle; 
  93136.         DWORD dwData; 
  93137.         int iString; 
  93138.     } TBBUTTON, NEAR* PTBBUTTON, FAR* LPTBBUTTON; 
  93139.     typedef const TBBUTTON FAR* LPCTBBUTTON"
  93140.  
  93141.     self
  93142.         defineField: #iBitmap type: SDWORDField new;
  93143.         defineField: #idCommand type: SDWORDField new;
  93144.         defineField: #fsState type: BYTEField new;
  93145.         defineField: #fsStyle type: BYTEField new;
  93146.         defineField: #dwData type: DWORDField new;
  93147.         defineField: #iString type: SDWORDField new! !
  93148.  
  93149. !TBBUTTON methodsFor!
  93150.  
  93151. dwData
  93152.     "Answer the receiver's dwData field as a Smalltalk object.
  93153.     This method has been automatically generated from the class' structure template.
  93154.     Any modifications you make will be lost the next time it is so generated."
  93155.  
  93156.     ^(bytes dwordAtOffset: 12)!
  93157.  
  93158. dwData: anObject
  93159.     "Set the receiver's dwData field to the value of anObject.
  93160.     This method has been automatically generated from the class' structure template.
  93161.     Any modifications you make will be lost the next time it is so generated."
  93162.  
  93163.     bytes dwordAtOffset: 12 put: anObject!
  93164.  
  93165. fsState
  93166.     "Answer the receiver's fsState field as a Smalltalk object.
  93167.     This method has been automatically generated from the class' structure template.
  93168.     Any modifications you make will be lost the next time it is so generated."
  93169.  
  93170.     ^(bytes byteAtOffset: 8)!
  93171.  
  93172. fsState: anObject
  93173.     "Set the receiver's fsState field to the value of anObject.
  93174.     This method has been automatically generated from the class' structure template.
  93175.     Any modifications you make will be lost the next time it is so generated."
  93176.  
  93177.     bytes byteAtOffset: 8 put: anObject!
  93178.  
  93179. fsStyle
  93180.     "Answer the receiver's fsStyle field as a Smalltalk object.
  93181.     This method has been automatically generated from the class' structure template.
  93182.     Any modifications you make will be lost the next time it is so generated."
  93183.  
  93184.     ^(bytes byteAtOffset: 9)!
  93185.  
  93186. fsStyle: anObject
  93187.     "Set the receiver's fsStyle field to the value of anObject.
  93188.     This method has been automatically generated from the class' structure template.
  93189.     Any modifications you make will be lost the next time it is so generated."
  93190.  
  93191.     bytes byteAtOffset: 9 put: anObject!
  93192.  
  93193. iBitmap
  93194.     "Answer the receiver's iBitmap field as a Smalltalk object.
  93195.     This method has been automatically generated from the class' structure template.
  93196.     Any modifications you make will be lost the next time it is so generated."
  93197.  
  93198.     ^(bytes sdwordAtOffset: 0)!
  93199.  
  93200. iBitmap: anObject
  93201.     "Set the receiver's iBitmap field to the value of anObject.
  93202.     This method has been automatically generated from the class' structure template.
  93203.     Any modifications you make will be lost the next time it is so generated."
  93204.  
  93205.     bytes sdwordAtOffset: 0 put: anObject!
  93206.  
  93207. idCommand
  93208.     "Answer the receiver's idCommand field as a Smalltalk object.
  93209.     This method has been automatically generated from the class' structure template.
  93210.     Any modifications you make will be lost the next time it is so generated."
  93211.  
  93212.     ^(bytes sdwordAtOffset: 4)!
  93213.  
  93214. idCommand: anObject
  93215.     "Set the receiver's idCommand field to the value of anObject.
  93216.     This method has been automatically generated from the class' structure template.
  93217.     Any modifications you make will be lost the next time it is so generated."
  93218.  
  93219.     bytes sdwordAtOffset: 4 put: anObject!
  93220.  
  93221. iString
  93222.     "Answer the receiver's iString field as a Smalltalk object.
  93223.     This method has been automatically generated from the class' structure template.
  93224.     Any modifications you make will be lost the next time it is so generated."
  93225.  
  93226.     ^(bytes sdwordAtOffset: 16)!
  93227.  
  93228. iString: anObject
  93229.     "Set the receiver's iString field to the value of anObject.
  93230.     This method has been automatically generated from the class' structure template.
  93231.     Any modifications you make will be lost the next time it is so generated."
  93232.  
  93233.     bytes sdwordAtOffset: 16 put: anObject! !
  93234.  
  93235. TBBUTTONINFO comment:
  93236. ''!
  93237. !TBBUTTONINFO class methodsFor!
  93238.  
  93239. defineFields
  93240.     "Define the fields of the Win32 TBBUTTONINFO structure.
  93241.  
  93242.         TBBUTTONINFO compileDefinition
  93243.  
  93244.         typedef struct {
  93245.             UINT cbSize;
  93246.             DWORD dwMask;
  93247.             int idCommand;
  93248.             int iImage;
  93249.             BYTE fsState;
  93250.             BYTE fsStyle;
  93251.             WORD cx;
  93252.             DWORD lParam;
  93253.             LPTSTR pszText;
  93254.             int cchText; } TBBUTTONINFOA, *LPTBBUTTONINFOA;"
  93255.  
  93256.     self
  93257.         defineField: #dwSize type: SDWORDField writeOnly beOverride;
  93258.         defineField: #dwMask type: DWORDField new;
  93259.         defineField: #idCommand type: SDWORDField new;
  93260.         defineField: #iImage type: SDWORDField new;
  93261.         defineField: #fsState type: BYTEField new;
  93262.         defineField: #fsStyle type: BYTEField new;
  93263.         defineField: #cx type: WORDField new;
  93264.         defineField: #lParam type: DWORDField filler;
  93265.         defineField: #pszText type: (PointerField type: String) beFiller;
  93266.         defineField: #cchText type: SDWORDField filler! !
  93267.  
  93268. !TBBUTTONINFO methodsFor!
  93269.  
  93270. cx
  93271.     "Answer the receiver's cx field as a Smalltalk object."
  93272.  
  93273.     ^(bytes wordAtOffset: 18)!
  93274.  
  93275. cx: anObject
  93276.     "Set the receiver's cx field to the value of anObject."
  93277.  
  93278.     bytes wordAtOffset: 18 put: anObject!
  93279.  
  93280. dwMask
  93281.     "Answer the receiver's dwMask field as a Smalltalk object."
  93282.  
  93283.     ^(bytes dwordAtOffset: 4)!
  93284.  
  93285. dwMask: anObject
  93286.     "Set the receiver's dwMask field to the value of anObject."
  93287.  
  93288.     bytes dwordAtOffset: 4 put: anObject!
  93289.  
  93290. dwSize: anObject
  93291.     "Set the receiver's dwSize field to the value of anObject."
  93292.  
  93293.     bytes sdwordAtOffset: 0 put: anObject!
  93294.  
  93295. fsState
  93296.     "Answer the receiver's fsState field as a Smalltalk object."
  93297.  
  93298.     ^(bytes byteAtOffset: 16)!
  93299.  
  93300. fsState: anObject
  93301.     "Set the receiver's fsState field to the value of anObject."
  93302.  
  93303.     bytes byteAtOffset: 16 put: anObject!
  93304.  
  93305. fsStyle
  93306.     "Answer the receiver's fsStyle field as a Smalltalk object."
  93307.  
  93308.     ^(bytes byteAtOffset: 17)!
  93309.  
  93310. fsStyle: anObject
  93311.     "Set the receiver's fsStyle field to the value of anObject."
  93312.  
  93313.     bytes byteAtOffset: 17 put: anObject!
  93314.  
  93315. idCommand
  93316.     "Answer the receiver's idCommand field as a Smalltalk object."
  93317.  
  93318.     ^(bytes sdwordAtOffset: 8)!
  93319.  
  93320. idCommand: anObject
  93321.     "Set the receiver's idCommand field to the value of anObject."
  93322.  
  93323.     bytes sdwordAtOffset: 8 put: anObject!
  93324.  
  93325. iImage
  93326.     "Answer the receiver's iImage field as a Smalltalk object."
  93327.  
  93328.     ^(bytes sdwordAtOffset: 12)!
  93329.  
  93330. iImage: anObject
  93331.     "Set the receiver's iImage field to the value of anObject."
  93332.  
  93333.     bytes sdwordAtOffset: 12 put: anObject! !
  93334.  
  93335. TEXTMETRIC comment:
  93336. ''!
  93337. !TEXTMETRIC class methodsFor!
  93338.  
  93339. defineFields
  93340.     "Define the fields of the Win32 TEXTMETRIC structure.
  93341.  
  93342.         TEXTMETRIC compileDefinition
  93343.     "
  93344.  
  93345.     self
  93346.         defineField: #tmHeight type: SDWORDField readOnly;
  93347.         defineField: #tmAscent type: SDWORDField readOnly;
  93348.         defineField: #tmDescent type: SDWORDField readOnly;
  93349.         defineField: #tmInternalLeading type: SDWORDField readOnly;
  93350.         defineField: #tmExternalLeading type: SDWORDField readOnly;
  93351.         defineField: #tmAveCharWidth type: SDWORDField readOnly;
  93352.         defineField: #tmMaxCharWidth type: SDWORDField readOnly;
  93353.         defineField: #tmWeight type: SDWORDField readOnly;
  93354.         defineField: #tmOverhang type: SDWORDField readOnly;
  93355.         defineField: #tmDigitizedAspectX type: SDWORDField readOnly;
  93356.         defineField: #tmDigitizedAspectY type: SDWORDField readOnly;
  93357.         defineField: #tmFirstChar type: BYTEField readOnly;
  93358.         defineField: #tmLastChar type: BYTEField readOnly;
  93359.         defineField: #tmDefaultChar type: BYTEField readOnly;
  93360.         defineField: #tmBreakChar type: BYTEField readOnly;
  93361.         defineField: #tmItalic type: BYTEField readOnly;
  93362.         defineField: #tmUnderlined type: BYTEField readOnly;
  93363.         defineField: #tmStruckOut type: BYTEField readOnly;
  93364.         defineField: #tmPitchAndFamily type: BYTEField readOnly;
  93365.         defineField: #tmCharSet type: BYTEField readOnly! !
  93366.  
  93367. !TEXTMETRIC methodsFor!
  93368.  
  93369. tmAscent
  93370.     "Answer the receiver's tmAscent field as a Smalltalk object."
  93371.  
  93372.     ^(bytes sdwordAtOffset: 4)!
  93373.  
  93374. tmAveCharWidth
  93375.     "Answer the receiver's tmAveCharWidth field as a Smalltalk object."
  93376.  
  93377.     ^(bytes sdwordAtOffset: 20)!
  93378.  
  93379. tmBreakChar
  93380.     "Answer the receiver's tmBreakChar field as a Smalltalk object."
  93381.  
  93382.     ^(bytes byteAtOffset: 47)!
  93383.  
  93384. tmCharSet
  93385.     "Answer the receiver's tmCharSet field as a Smalltalk object."
  93386.  
  93387.     ^(bytes byteAtOffset: 52)!
  93388.  
  93389. tmDefaultChar
  93390.     "Answer the receiver's tmDefaultChar field as a Smalltalk object."
  93391.  
  93392.     ^(bytes byteAtOffset: 46)!
  93393.  
  93394. tmDescent
  93395.     "Answer the receiver's tmDescent field as a Smalltalk object."
  93396.  
  93397.     ^(bytes sdwordAtOffset: 8)!
  93398.  
  93399. tmDigitizedAspectX
  93400.     "Answer the receiver's tmDigitizedAspectX field as a Smalltalk object."
  93401.  
  93402.     ^(bytes sdwordAtOffset: 36)!
  93403.  
  93404. tmDigitizedAspectY
  93405.     "Answer the receiver's tmDigitizedAspectY field as a Smalltalk object."
  93406.  
  93407.     ^(bytes sdwordAtOffset: 40)!
  93408.  
  93409. tmExternalLeading
  93410.     "Answer the receiver's tmExternalLeading field as a Smalltalk object."
  93411.  
  93412.     ^(bytes sdwordAtOffset: 16)!
  93413.  
  93414. tmFirstChar
  93415.     "Answer the receiver's tmFirstChar field as a Smalltalk object."
  93416.  
  93417.     ^(bytes byteAtOffset: 44)!
  93418.  
  93419. tmHeight
  93420.     "Answer the receiver's tmHeight field as a Smalltalk object."
  93421.  
  93422.     ^(bytes sdwordAtOffset: 0)!
  93423.  
  93424. tmInternalLeading
  93425.     "Answer the receiver's tmInternalLeading field as a Smalltalk object."
  93426.  
  93427.     ^(bytes sdwordAtOffset: 12)!
  93428.  
  93429. tmItalic
  93430.     "Answer the receiver's tmItalic field as a Smalltalk object."
  93431.  
  93432.     ^(bytes byteAtOffset: 48)!
  93433.  
  93434. tmLastChar
  93435.     "Answer the receiver's tmLastChar field as a Smalltalk object."
  93436.  
  93437.     ^(bytes byteAtOffset: 45)!
  93438.  
  93439. tmMaxCharWidth
  93440.     "Answer the receiver's tmMaxCharWidth field as a Smalltalk object."
  93441.  
  93442.     ^(bytes sdwordAtOffset: 24)!
  93443.  
  93444. tmOverhang
  93445.     "Answer the receiver's tmOverhang field as a Smalltalk object."
  93446.  
  93447.     ^(bytes sdwordAtOffset: 32)!
  93448.  
  93449. tmPitchAndFamily
  93450.     "Answer the receiver's tmPitchAndFamily field as a Smalltalk object."
  93451.  
  93452.     ^(bytes byteAtOffset: 51)!
  93453.  
  93454. tmStruckOut
  93455.     "Answer the receiver's tmStruckOut field as a Smalltalk object."
  93456.  
  93457.     ^(bytes byteAtOffset: 50)!
  93458.  
  93459. tmUnderlined
  93460.     "Answer the receiver's tmUnderlined field as a Smalltalk object."
  93461.  
  93462.     ^(bytes byteAtOffset: 49)!
  93463.  
  93464. tmWeight
  93465.     "Answer the receiver's tmWeight field as a Smalltalk object."
  93466.  
  93467.     ^(bytes sdwordAtOffset: 28)! !
  93468.  
  93469. TEXTRANGE comment:
  93470. 'TEXTRANGE is the class of <ExternalStructure> which represent the Windows RichEdit control structure of the same name.
  93471.  
  93472. TEXTRANGE is used in conjunction with the EM_GETTEXTRANGE message to specify the range of text to retrieve from a Rich Edit control and to provide a buffer to copy the text into.
  93473.  
  93474. We also use this structure where a FINDTEXT is needed because it has exactly the same layout. The FINDTEXT structure is used in conjunction with the EM_FINDTEXT message to contain information about a search operation in a Rich Edit control.
  93475.  
  93476. Instance Variables:
  93477.     text        <String>. Buffer whose address is stored into structure (to prevent premature GC).'!
  93478. !TEXTRANGE class methodsFor!
  93479.  
  93480. defineFields
  93481.     "Define the fields of the Win32 TEXTRANGE structure.
  93482.  
  93483.         TEXTRANGE compileDefinition
  93484.  
  93485.         typedef struct _textrange { 
  93486.             CHARRANGE chrg; 
  93487.             LPSTR lpstrText; 
  93488.         } TEXTRANGE;"
  93489.  
  93490.     self
  93491.         "Expand CHARRANGE inline"
  93492.         defineField: #cpMin type: SDWORDField new;
  93493.         defineField: #cpMax type: SDWORDField new;
  93494.  
  93495.         defineField: #lpstrText type: (PointerField type: String) beWriteOnly!
  93496.  
  93497. from: start to: stop
  93498.     "Answer a new instance of the receiver to represent the specified 0-based, 
  93499.     end-exclusive, interval."
  93500.  
  93501.     ^self from: start to: stop text: (String newFixed: stop - start)!
  93502.  
  93503. from: start to: stop text: aString
  93504.     "Answer a new instance of the receiver to represent the specified 0-based, 
  93505.     end-exclusive, interval, and the text, aString."
  93506.  
  93507.     ^self new 
  93508.         setFrom: start to: stop text: aString! !
  93509.  
  93510. !TEXTRANGE methodsFor!
  93511.  
  93512. cpMax
  93513.     "Answer the receiver's cpMax field as a Smalltalk object."
  93514.  
  93515.     ^(bytes sdwordAtOffset: 4)!
  93516.  
  93517. cpMax: anObject
  93518.     "Set the receiver's cpMax field to the value of anObject."
  93519.  
  93520.     bytes sdwordAtOffset: 4 put: anObject!
  93521.  
  93522. cpMin
  93523.     "Answer the receiver's cpMin field as a Smalltalk object."
  93524.  
  93525.     ^(bytes sdwordAtOffset: 0)!
  93526.  
  93527. cpMin: anObject
  93528.     "Set the receiver's cpMin field to the value of anObject."
  93529.  
  93530.     bytes sdwordAtOffset: 0 put: anObject!
  93531.  
  93532. lpstrText: anObject
  93533.     "Set the receiver's lpstrText field to the value of anObject."
  93534.  
  93535.     bytes dwordAtOffset: 8 put: anObject yourAddress!
  93536.  
  93537. setFrom: start to: stop text: aString
  93538.     "Initialize the receiver with the specified range and text.
  93539.     Answer the receiver."
  93540.  
  93541.     self cpMin: start; cpMax: stop.
  93542.     self text: aString!
  93543.  
  93544. text
  93545.     "Answer the value of the receiver's 'text' instance variable."
  93546.  
  93547.     ^text!
  93548.  
  93549. text: buffer
  93550.     "Set the value of the receiver's 'text' instance variable to <String> argument, buffer.
  93551.     Note that buffer should have been allocated from the fixed heap."
  93552.  
  93553.     self lpstrText: (text := buffer)! !
  93554.  
  93555. TIME_ZONE_INFORMATION comment:
  93556. ''!
  93557. !TIME_ZONE_INFORMATION class methodsFor!
  93558.  
  93559. defineFields
  93560. "Define the fields of the Win32 TIME_ZONE_INFORMATION structure
  93561.         self compileDefinition
  93562.  
  93563.     typedef struct _TIME_ZONE_INFORMATION
  93564.     {
  93565.         LONG Bias;
  93566.         WCHAR StandardName[ 32 ];
  93567.         SYSTEMTIME StandardDate;
  93568.         LONG StandardBias;
  93569.         WCHAR DaylightName[ 32 ];
  93570.         SYSTEMTIME DaylightDate;
  93571.         LONG DaylightBias;
  93572.     } TIME_ZONE_INFORMATION;"
  93573.  
  93574.  
  93575.     self 
  93576.         defineField: #bias type: SDWORDField readOnly;
  93577.         defineField: #standardName type: (ArrayField type: UnicodeString length: 32) beReadOnly;
  93578.         defineField: #standardDate type: (StructureField type: SYSTEMTIME) beReadOnly;
  93579.         defineField: #standardBias type: SDWORDField readOnly;
  93580.         defineField: #daylightName type: (ArrayField type: UnicodeString length: 32) beReadOnly;
  93581.         defineField: #daylightDate type: (StructureField type: SYSTEMTIME) beReadOnly;
  93582.         defineField: #daylightBias type: SDWORDField readOnly! !
  93583.  
  93584. !TIME_ZONE_INFORMATION methodsFor!
  93585.  
  93586. bias
  93587.     "Answer the receiver's bias field as a Smalltalk object."
  93588.  
  93589.     ^(bytes sdwordAtOffset: 0)!
  93590.  
  93591. daylightBias
  93592.     "Answer the receiver's daylightBias field as a Smalltalk object."
  93593.  
  93594.     ^(bytes sdwordAtOffset: 168)!
  93595.  
  93596. daylightDate
  93597.     "Answer the receiver's daylightDate field as a Smalltalk object."
  93598.  
  93599.     ^SYSTEMTIME fromAddress: (bytes yourAddress + 152)!
  93600.  
  93601. daylightName
  93602.     "Answer the receiver's daylightName field as a Smalltalk object."
  93603.  
  93604.     ^UnicodeString fromAddress: (bytes yourAddress + 88)!
  93605.  
  93606. standardBias
  93607.     "Answer the receiver's standardBias field as a Smalltalk object."
  93608.  
  93609.     ^(bytes sdwordAtOffset: 84)!
  93610.  
  93611. standardDate
  93612.     "Answer the receiver's standardDate field as a Smalltalk object."
  93613.  
  93614.     ^SYSTEMTIME fromAddress: (bytes yourAddress + 68)!
  93615.  
  93616. standardName
  93617.     "Answer the receiver's standardName field as a Smalltalk object."
  93618.  
  93619.     ^UnicodeString fromAddress: (bytes yourAddress + 4)! !
  93620.  
  93621. TOOLINFO comment:
  93622. ''!
  93623. !TOOLINFO class methodsFor!
  93624.  
  93625. defineFields
  93626.     "Define the fields of the Win32 TOOLINFO structure.
  93627.  
  93628.         TOOLINFO compileDefinition
  93629.  
  93630.     typedef struct tagTOOLINFOA 
  93631.         UINT cbSize;
  93632.         UINT uFlags;
  93633.         HWND hwnd;
  93634.         UINT uId;
  93635.         RECT rect;
  93636.         HINSTANCE hinst;
  93637.          LPSTR lpszText;
  93638.      TOOLINFOA, NEAR *PTOOLINFOA, FAR *LPTOOLINFOA;"
  93639.  
  93640.     self
  93641.         defineField: #dwSize type: DWORDField writeOnly beOverride;
  93642.         defineField: #uFlags type: DWORDField writeOnly;
  93643.         defineField: #hwnd type: DWORDField writeOnly;
  93644.         defineField: #uId type: DWORDField writeOnly;
  93645.         defineField: #rect type: (StructureField type: RECT) beFiller;
  93646.         defineField: #hinst type: DWORDField filler;
  93647.         defineField: #lpszText type:  DWORDField writeOnly! !
  93648.  
  93649. !TOOLINFO methodsFor!
  93650.  
  93651. dwSize: anObject
  93652.     "Set the receiver's dwSize field to the value of anObject."
  93653.  
  93654.     bytes dwordAtOffset: 0 put: anObject!
  93655.  
  93656. hwnd: anObject
  93657.     "Set the receiver's hwnd field to the value of anObject."
  93658.  
  93659.     bytes dwordAtOffset: 8 put: anObject!
  93660.  
  93661. lpszText: anObject
  93662.     "Set the receiver's lpszText field to the value of anObject."
  93663.  
  93664.     bytes dwordAtOffset: 36 put: anObject!
  93665.  
  93666. text: aString
  93667.     "Set the text of the receiver to aString. Note that the reference
  93668.     to aString is not kept locally. It must held externally
  93669.     until the receiver is finished with or else aString will be lost
  93670.     even though the receiver still holds its address."
  93671.  
  93672.     self lpszText: aString yourAddress!
  93673.  
  93674. textCallback
  93675.     "Sets this item into callback mode for the item text."
  93676.  
  93677.     self lpszText: LPSTR_TEXTCALLBACK
  93678. !
  93679.  
  93680. uFlags: anObject
  93681.     "Set the receiver's uFlags field to the value of anObject."
  93682.  
  93683.     bytes dwordAtOffset: 4 put: anObject!
  93684.  
  93685. uId: anObject
  93686.     "Set the receiver's uId field to the value of anObject."
  93687.  
  93688.     bytes dwordAtOffset: 12 put: anObject! !
  93689.  
  93690. TVINSERTSTRUCT comment:
  93691. ''!
  93692. !TVINSERTSTRUCT class methodsFor!
  93693.  
  93694. defineFields
  93695.     "Define the layout of the Win32 TVINSERTSTRUCT structure.
  93696.         TVINSERTSTRUCT compileDefinition
  93697.     "
  93698.  
  93699.     self 
  93700.         defineField: #hParent type: DWORDField writeOnly;
  93701.         defineField: #hInsertAfter type: DWORDField writeOnly;
  93702.         defineField: #item type: (StructureField type: TVITEM) "read/write so can get pointer to embedded TV_ITEM"
  93703.     ! !
  93704.  
  93705. !TVINSERTSTRUCT methodsFor!
  93706.  
  93707. hInsertAfter: anObject
  93708.     "Set the receiver's hInsertAfter field to the value of anObject.
  93709.     Automatically generated set method - do not modify"
  93710.  
  93711.     bytes dwordAtOffset: 4 put: anObject!
  93712.  
  93713. hParent: anObject
  93714.     "Set the receiver's hParent field to the value of anObject.
  93715.     Automatically generated set method - do not modify"
  93716.  
  93717.     bytes dwordAtOffset: 0 put: anObject!
  93718.  
  93719. item
  93720.     "Answer the receiver's item field as a Smalltalk object.
  93721.     Automatically generated get method - do not modify"
  93722.  
  93723.     ^TVITEM fromAddress: (bytes yourAddress + 8)!
  93724.  
  93725. item: anObject
  93726.     "Set the receiver's item field to the value of anObject.
  93727.     Automatically generated set method - do not modify"
  93728.  
  93729.     anObject replaceBytesOf: bytes from: 9 to: 48 startingAt: 1! !
  93730.  
  93731. VS_FIXEDFILEINFO comment:
  93732. 'VS_FIXEDFILEINFO is an ExternalStructure class to represent the Win32 structure of the same name.
  93733.  
  93734. This structure is used in conjunction with the Windows version information library (Version.DLL) to access standard version information such as the product major and minor version numbers from the resources of exes and dlls.
  93735.  
  93736. See also the VersionInfo and VersionLibrary classes.'!
  93737. !VS_FIXEDFILEINFO class methodsFor!
  93738.  
  93739. defineFields
  93740.     "Private - Define the layout of the Win32 VS_FIXEDFILEINFO structure.
  93741.     
  93742.         VS_FIXEDFILEINFO compileDefinition
  93743.  
  93744.     typedef struct _VS_FIXEDFILEINFO   // vsffi 
  93745.         DWORD dwSignature; 
  93746.         DWORD dwStrucVersion; 
  93747.         DWORD dwFileVersionMS; 
  93748.         DWORD dwFileVersionLS; 
  93749.         DWORD dwProductVersionMS; 
  93750.         DWORD dwProductVersionLS; 
  93751.         DWORD dwFileFlagsMask; 
  93752.         DWORD dwFileFlags; 
  93753.         DWORD dwFileOS; 
  93754.         DWORD dwFileType; 
  93755.         DWORD dwFileSubtype; 
  93756.         DWORD dwFileDateMS; 
  93757.         DWORD dwFileDateLS; 
  93758.     } VS_FIXEDFILEINFO;"
  93759.  
  93760.     self
  93761.         defineField: #dwSignature type: DWORDField filler;
  93762.         defineField: #dwStrucVersion type: DWORDField readOnly beUncompiled;
  93763.         defineField: #dwFileVersionMS type: DWORDField readOnly;
  93764.         defineField: #dwFileVersionLS type: DWORDField readOnly;
  93765.         defineField: #dwProductVersionMS type: DWORDField readOnly;
  93766.         defineField: #dwProductVersionLS type: DWORDField readOnly;
  93767.         beUncompiled;
  93768.         defineField: #dwFileFlagsMask type: DWORDField readOnly;
  93769.         defineField: #dwFileFlags type: DWORDField readOnly;
  93770.         defineField: #dwFileOS type: DWORDField readOnly;
  93771.         defineField: #dwFileType type: DWORDField readOnly;
  93772.         defineField: #dwFileSubtype type: DWORDField readOnly;
  93773.         defineField: #dwFileDateMS type: DWORDField readOnly;
  93774.         defineField: #dwFileDateLS type: DWORDField readOnly
  93775. !
  93776.  
  93777. publishedAspectsOfInstances
  93778.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  93779.     
  93780.         ^(super publishedAspectsOfInstances)
  93781.             add: (Aspect string: #fileVersionString) beReadOnly;
  93782.             add: (Aspect string: #productVersionString) beReadOnly;
  93783.             yourself! !
  93784.  
  93785. !VS_FIXEDFILEINFO methodsFor!
  93786.  
  93787. dwFileVersionLS
  93788.     "Answer the receiver's dwFileVersionLS field as a Smalltalk object."
  93789.  
  93790.     ^(bytes dwordAtOffset: 12)!
  93791.  
  93792. dwFileVersionMS
  93793.     "Answer the receiver's dwFileVersionMS field as a Smalltalk object."
  93794.  
  93795.     ^(bytes dwordAtOffset: 8)!
  93796.  
  93797. dwProductVersionLS
  93798.     "Answer the receiver's dwProductVersionLS field as a Smalltalk object."
  93799.  
  93800.     ^(bytes dwordAtOffset: 20)!
  93801.  
  93802. dwProductVersionMS
  93803.     "Answer the receiver's dwProductVersionMS field as a Smalltalk object."
  93804.  
  93805.     ^(bytes dwordAtOffset: 16)!
  93806.  
  93807. fileVersionString
  93808.     "Answer a String in the form N.N.N.N which specifies the version number of the product."
  93809.  
  93810.     ^self formatFileVersionString: '%1!!d!!.%2!!d!!.%3!!d!!.%4!!d!!'!
  93811.  
  93812. formatFileVersionString: format
  93813.     "Answer a version string formatted as per the Win32 format string, format."
  93814.  
  93815.     | major minor |
  93816.     major := self dwFileVersionMS.
  93817.     minor := self dwFileVersionLS.
  93818.     ^format formatWithArguments: (Array 
  93819.                 with: major highWord
  93820.                 with: major lowWord
  93821.                 with: minor highWord
  93822.                 with: minor lowWord)!
  93823.  
  93824. formatProductVersionString: format
  93825.     "Answer a version string formatted as per the Win32 format string, format."
  93826.  
  93827.     | major minor |
  93828.     major := self dwProductVersionMS.
  93829.     minor := self dwProductVersionLS.
  93830.     ^format formatWithArguments: (Array 
  93831.                 with: major highWord
  93832.                 with: major lowWord
  93833.                 with: minor highWord
  93834.                 with: minor lowWord)!
  93835.  
  93836. productVersionString
  93837.     "Answer a String in the form N.N.N.N which specifies the version number of the product."
  93838.  
  93839.     ^self formatProductVersionString: '%1!!d!!.%2!!d!!.%3!!d!!.%4!!d!!'! !
  93840.  
  93841. WIN32_FIND_DATA comment:
  93842. 'WIN32_FIND_DATA is an <ExternalStructure> to wrap the Win32 structure of the same name. WIN32_FIND_DATA is used in conjunction with the kernel library API functions FindFirstFile() and FindNextFile().
  93843.  
  93844. See File class for example usage.'!
  93845. !WIN32_FIND_DATA class methodsFor!
  93846.  
  93847. defineFields
  93848.     "Define the layout of the Win32 WIN32_FIND_DATA structure. 
  93849.     Currently to avoid wasting space, the structure is defined as mostly filler 
  93850.     fields.
  93851.  
  93852.         WIN32_FIND_DATA compileDefinition
  93853.  
  93854.         struct {
  93855.             DWORD dwFileAttributes; 
  93856.             FILETIME ftCreationTime; 
  93857.             FILETIME ftLastAccessTime; 
  93858.             FILETIME ftLastWriteTime; 
  93859.             DWORD    nFileSizeHigh; 
  93860.             DWORD    nFileSizeLow; 
  93861.             DWORD    dwReserved0; 
  93862.             DWORD    dwReserved1; 
  93863.             TCHAR    cFileName[ MAX_PATH ]; 
  93864.             TCHAR    cAlternateFileName[ 14 ]; 
  93865.         } WIN32_FIND_DATA;"
  93866.  
  93867.     self 
  93868.         defineField: #dwFileAttributes type: DWORDField readOnly;
  93869.         defineField: #ftCreationTime type: (StructureField type: FILETIME) beReadOnly;
  93870.         defineField: #ftLastAccessTime type: (StructureField type: FILETIME) beReadOnly;
  93871.         defineField: #ftLastWriteTime type: (StructureField type: FILETIME) beReadOnly;
  93872.         defineField: #nFileSizeHigh type: DWORDField readOnly;
  93873.         defineField: #nFileSizeLow type: DWORDField readOnly;
  93874.         defineField: #dwReserved0 type: DWORDField filler;
  93875.         defineField: #dwReserved1 type: DWORDField filler;
  93876.         defineField: #cFileName type: (StringField length: File maxPath) beReadOnly;
  93877.         defineField: #cAlternateFileName type: (StringField length: 14) beReadOnly! !
  93878.  
  93879. !WIN32_FIND_DATA methodsFor!
  93880.  
  93881. cAlternateFileName
  93882.     "Answer the receiver's cAlternateFileName field as a Smalltalk object."
  93883.  
  93884.     ^String fromAddress: (bytes yourAddress + 304)!
  93885.  
  93886. cFileName
  93887.     "Answer the receiver's cFileName field as a Smalltalk object."
  93888.  
  93889.     ^String fromAddress: (bytes yourAddress + 44)!
  93890.  
  93891. directory
  93892.     ^directory!
  93893.  
  93894. directory: aString
  93895.     directory := aString!
  93896.  
  93897. dwFileAttributes
  93898.     "Answer the receiver's dwFileAttributes field as a Smalltalk object."
  93899.  
  93900.     ^(bytes dwordAtOffset: 0)!
  93901.  
  93902. fileName
  93903.     "Answer the full filename from the receiver."
  93904.  
  93905.     ^self cFileName!
  93906.  
  93907. fileSize
  93908.     "Answer the <integer> size of the file."
  93909.  
  93910.     ^(self nFileSizeHigh bitShift: 32) + self nFileSizeLow!
  93911.  
  93912. ftCreationTime
  93913.     "Answer the receiver's ftCreationTime field as a Smalltalk object."
  93914.  
  93915.     ^FILETIME fromAddress: (bytes yourAddress + 4)!
  93916.  
  93917. ftLastAccessTime
  93918.     "Answer the receiver's ftLastAccessTime field as a Smalltalk object."
  93919.  
  93920.     ^FILETIME fromAddress: (bytes yourAddress + 12)!
  93921.  
  93922. ftLastWriteTime
  93923.     "Answer the receiver's ftLastWriteTime field as a Smalltalk object."
  93924.  
  93925.     ^FILETIME fromAddress: (bytes yourAddress + 20)!
  93926.  
  93927. isDirectory
  93928.     "Answer whether the receiver describes a directory (as opposed to a file) 
  93929.     in the host file system."
  93930.  
  93931.     ^self dwFileAttributes allMask: FILE_ATTRIBUTE_DIRECTORY!
  93932.  
  93933. isReadOnly
  93934.     "Answer whether the receiver describes a read only file."
  93935.  
  93936.     ^self dwFileAttributes allMask: FILE_ATTRIBUTE_READONLY
  93937. !
  93938.  
  93939. nFileSizeHigh
  93940.     "Answer the receiver's nFileSizeHigh field as a Smalltalk object."
  93941.  
  93942.     ^(bytes dwordAtOffset: 28)!
  93943.  
  93944. nFileSizeLow
  93945.     "Answer the receiver's nFileSizeLow field as a Smalltalk object."
  93946.  
  93947.     ^(bytes dwordAtOffset: 32)!
  93948.  
  93949. path
  93950.     "Answer the path of the file described by the receiver (assuming the 
  93951.     directory has been set correctly)."
  93952.  
  93953.     ^File composePath: self directory subPath: self fileName!
  93954.  
  93955. shortFileName
  93956.     "Answer the 8.3 filename from the receiver."
  93957.  
  93958.     | answer |
  93959.     answer := self cAlternateFileName.
  93960.     answer isEmpty ifTrue: [answer := self cFileName].
  93961.     ^answer!
  93962.  
  93963. stem
  93964.     "Answer the stem (name sans extension) of the file described by the receiver."
  93965.  
  93966.     ^File splitStemFrom: self fileName! !
  93967.  
  93968. WINDOWPLACEMENT comment:
  93969. ''!
  93970. !WINDOWPLACEMENT class methodsFor!
  93971.  
  93972. defineFields
  93973.     "Define the layout of the Win32 WINDOWPLACEMENT structure. 
  93974.     Currently to avoid wasting space, the structure is defined as mostly filler 
  93975.     fields.
  93976.  
  93977.         WINDOWPLACEMENT compileDefinition
  93978.  
  93979.         typedef struct tagWINDOWPLACEMENT {
  93980.             UINT  length;
  93981.             UINT  flags;
  93982.             UINT  showCmd;
  93983.             POINT ptMinPosition;
  93984.             POINT ptMaxPosition;
  93985.             RECT  rcNormalPosition;
  93986.         } WINDOWPLACEMENT;"
  93987.  
  93988.     self 
  93989.         defineField: #dwSize type: DWORDField writeOnly beOverride;
  93990.         defineField: #flags type: DWORDField filler;
  93991.         defineField: #showCmd type: DWORDField new;
  93992.         defineField: #ptMinPosition type: (StructureField type: POINTL) beFiller;
  93993.         defineField: #ptMaxPosition type: (StructureField type: POINTL) beFiller;
  93994.         defineField: #rcNormalPosition type: (StructureField type: RECT)
  93995. ! !
  93996.  
  93997. !WINDOWPLACEMENT methodsFor!
  93998.  
  93999. dwSize: anObject
  94000.     "Set the receiver's dwSize field to the value of anObject.
  94001.     Automatically generated set method - do not modify"
  94002.  
  94003.     bytes dwordAtOffset: 0 put: anObject!
  94004.  
  94005. rcNormalPosition
  94006.     "Answer the receiver's rcNormalPosition field as a Smalltalk object.
  94007.     Automatically generated get method - do not modify"
  94008.  
  94009.     ^RECT fromAddress: (bytes yourAddress + 28)!
  94010.  
  94011. rcNormalPosition: anObject
  94012.     "Set the receiver's rcNormalPosition field to the value of anObject.
  94013.     Automatically generated set method - do not modify"
  94014.  
  94015.     anObject replaceBytesOf: bytes from: 29 to: 44 startingAt: 1!
  94016.  
  94017. showCmd
  94018.     "Answer the receiver's showCmd field as a Smalltalk object.
  94019.     Automatically generated get method - do not modify"
  94020.  
  94021.     ^(bytes dwordAtOffset: 8)!
  94022.  
  94023. showCmd: anObject
  94024.     "Set the receiver's showCmd field to the value of anObject.
  94025.     Automatically generated set method - do not modify"
  94026.  
  94027.     bytes dwordAtOffset: 8 put: anObject! !
  94028.  
  94029. WINDOWPOS comment:
  94030. ''!
  94031. !WINDOWPOS class methodsFor!
  94032.  
  94033. defineFields
  94034.     "Define the layout of the Win32 WINDOWPOS structure.
  94035.  
  94036.         WINDOWPOS compileDefinition
  94037.  
  94038.         typedef struct _WINDOWPOS {
  94039.             HWND hwnd;
  94040.             HWND hwndInsertAfter;
  94041.             int x;
  94042.             int y;
  94043.             int cx;
  94044.             int cy;
  94045.             UINT flags; } WINDOWPOS; 
  94046.     "
  94047.  
  94048.     self
  94049.         defineField: #hwnd type: DWORDField filler;
  94050.         defineField: #hwndInsertAfter type: DWORDField readOnly;
  94051.         defineField: #x type: SDWORDField readOnly;
  94052.         defineField: #y type: SDWORDField readOnly;
  94053.         defineField: #cx type: SDWORDField new;
  94054.         defineField: #cy type: SDWORDField new;
  94055.         defineField: #flags type: DWORDField readOnly
  94056. ! !
  94057.  
  94058. !WINDOWPOS methodsFor!
  94059.  
  94060. cx
  94061.     "Answer the receiver's cx field as a Smalltalk object."
  94062.  
  94063.     ^(bytes sdwordAtOffset: 16)!
  94064.  
  94065. cx: anObject
  94066.     "Set the receiver's cx field to the value of anObject."
  94067.  
  94068.     bytes sdwordAtOffset: 16 put: anObject!
  94069.  
  94070. cy
  94071.     "Answer the receiver's cy field as a Smalltalk object."
  94072.  
  94073.     ^(bytes sdwordAtOffset: 20)!
  94074.  
  94075. cy: anObject
  94076.     "Set the receiver's cy field to the value of anObject."
  94077.  
  94078.     bytes sdwordAtOffset: 20 put: anObject!
  94079.  
  94080. flags
  94081.     "Answer the receiver's flags field as a Smalltalk object."
  94082.  
  94083.     ^(bytes dwordAtOffset: 24)!
  94084.  
  94085. hwndInsertAfter
  94086.     "Answer the receiver's hwndInsertAfter field as a Smalltalk object."
  94087.  
  94088.     ^(bytes dwordAtOffset: 4)!
  94089.  
  94090. x
  94091.     "Answer the receiver's x field as a Smalltalk object."
  94092.  
  94093.     ^(bytes sdwordAtOffset: 8)!
  94094.  
  94095. y
  94096.     "Answer the receiver's y field as a Smalltalk object."
  94097.  
  94098.     ^(bytes sdwordAtOffset: 12)! !
  94099.  
  94100. WNDCLASS comment:
  94101. 'WNDCLASS is the class of <ExternalStructure> which represent the Windows structure of the same name. It is used to retrieve and specify Windows "Class" information, e.g. when registering a window class.
  94102. '!
  94103. !WNDCLASS class methodsFor!
  94104.  
  94105. defineFields
  94106.     "Define the layout of the Win32 WNDCLASS structure. Currently to avoid
  94107.     wasting space, the structure is set up for registering classes only
  94108.     (i.e. the fields are fillers or write only). Furthermore it is not
  94109.     compiled at present.
  94110.  
  94111.     WNDCLASS compileDefinition
  94112.  
  94113.         typedef struct _WNDCLASS {
  94114.             UINT        style; 
  94115.             WNDPROC    lpfnWndProc; 
  94116.             int        cbClsExtra; 
  94117.             int        cbWndExtra; 
  94118.             HANDLE    hInstance; 
  94119.             HICON    hIcon; 
  94120.             HCURSOR    hCursor; 
  94121.             HBRUSH    hbrBackground; 
  94122.             LPCTSTR    lpszMenuName; 
  94123.             LPCTSTR    lpszClassName; 
  94124.         } WNDCLASS; "
  94125.  
  94126.     self 
  94127.         defineField: #style type: DWORDField writeOnly;
  94128.         defineField: #lpfnWndProc type: DWORDField writeOnly;
  94129.         defineField: #cbClsExtra type: SDWORDField filler;
  94130.         defineField: #cbWndExtra type: SDWORDField filler;
  94131.         defineField: #hInstance type: DWORDField writeOnly;
  94132.         defineField: #hIcon type: DWORDField writeOnly;
  94133.         defineField: #hCursor type: DWORDField writeOnly;
  94134.         defineField: #hbrBackground type: DWORDField writeOnly;
  94135.         defineField: #lpszMenuName type: (PointerField type: String) beWriteOnly;
  94136.         defineField: #lpszClassName type: (PointerField type: String) beWriteOnly! !
  94137.  
  94138. !WNDCLASS methodsFor!
  94139.  
  94140. className: aString
  94141.     "Set the receiver's className and lpszClassName fields to aString.
  94142.     Use this method to ensure the class name is not garbage collected
  94143.     while the receiver is alive"
  94144.  
  94145.     className := aString.
  94146.     self lpszClassName: aString!
  94147.  
  94148. hbrBackground: anObject
  94149.     "Set the receiver's hbrBackground field to the value of anObject."
  94150.  
  94151.     bytes dwordAtOffset: 28 put: anObject!
  94152.  
  94153. hCursor: anObject
  94154.     "Set the receiver's hCursor field to the value of anObject."
  94155.  
  94156.     bytes dwordAtOffset: 24 put: anObject!
  94157.  
  94158. hIcon: anObject
  94159.     "Set the receiver's hIcon field to the value of anObject."
  94160.  
  94161.     bytes dwordAtOffset: 20 put: anObject!
  94162.  
  94163. hInstance: anObject
  94164.     "Set the receiver's hInstance field to the value of anObject."
  94165.  
  94166.     bytes dwordAtOffset: 16 put: anObject!
  94167.  
  94168. lpfnWndProc: anObject
  94169.     "Set the receiver's lpfnWndProc field to the value of anObject."
  94170.  
  94171.     bytes dwordAtOffset: 4 put: anObject!
  94172.  
  94173. lpszClassName: anObject
  94174.     "Set the receiver's lpszClassName field to the value of anObject."
  94175.  
  94176.     bytes dwordAtOffset: 36 put: anObject yourAddress!
  94177.  
  94178. lpszMenuName: anObject
  94179.     "Set the receiver's lpszMenuName field to the value of anObject."
  94180.  
  94181.     bytes dwordAtOffset: 32 put: anObject yourAddress!
  94182.  
  94183. menuName: aString
  94184.     "Set the receiver's menuName and lpszMenuName fields to aString.
  94185.     Use this method to ensure the menu name is not garbage collected
  94186.     while the receiver is alive"
  94187.  
  94188.     menuName := aString.
  94189.     self lpszMenuName: aString!
  94190.  
  94191. style: anObject
  94192.     "Set the receiver's style field to the value of anObject."
  94193.  
  94194.     bytes dwordAtOffset: 0 put: anObject! !
  94195.  
  94196. LVHITTESTINFO comment:
  94197. 'LVHITTESTINFO is an ExternalStructure class to represent the Win32 common control structure of the same name.
  94198.  
  94199. LVHISTTESTINFO is used for hit-testing with Enhanced List View controls. For example usage see ListView>>itemFromPoint:
  94200.  
  94201. This Supercedes the LV_HITTESTINFO class present in release 2.1 and earlier.'!
  94202. !LVHITTESTINFO class methodsFor!
  94203.  
  94204. defineFields
  94205.     "Define the fields of the Win32 LVHITTESTINFO structure.
  94206.  
  94207.         LVHITTESTINFO compileDefinition
  94208.  
  94209.         typedef struct _LVHITTESTINFO { 
  94210.             POINT pt; 
  94211.             UINT flags; 
  94212.             int iItem; 
  94213.             int iSubItem; 
  94214.         } LVHITTESTINFO, FAR *LPLVHITTESTINFO;"
  94215.  
  94216.     super defineFields.
  94217.     self
  94218.         defineField: #iItem type: SDWORDField readOnly;
  94219.         defineField: #iSubItem type: SDWORDField readOnly
  94220. ! !
  94221.  
  94222. !LVHITTESTINFO methodsFor!
  94223.  
  94224. handle
  94225.     "Private - Answer the item 'handle' associated with the receiver.
  94226.     In the case of a ListView hit-test, this is a 1-based integer index."
  94227.  
  94228.     ^self iItem + 1!
  94229.  
  94230. iItem
  94231.     "Answer the receiver's iItem field as a Smalltalk object.
  94232.     This method has been automatically generated from the class' structure template.
  94233.     Any modifications you make will be lost the next time it is so generated."
  94234.  
  94235.     ^(bytes sdwordAtOffset: 12)!
  94236.  
  94237. iSubItem
  94238.     "Answer the receiver's iSubItem field as a Smalltalk object.
  94239.     This method has been automatically generated from the class' structure template.
  94240.     Any modifications you make will be lost the next time it is so generated."
  94241.  
  94242.     ^(bytes sdwordAtOffset: 16)! !
  94243.  
  94244. TCHITTESTINFO comment:
  94245. 'TCHITTESTINFO is an ExternalStructure class to represent the Win32 common control structure of the same name.
  94246.  
  94247. TCHISTTESTINFO is used for hit-testing with Tab View controls.
  94248. '!
  94249. !TCHITTESTINFO methodsFor!
  94250.  
  94251. handle
  94252.     "Private - Answer the item 'handle' associated with the receiver.
  94253.     In the case of a TabView hit-test, this is a 1-based integer index."
  94254.  
  94255.     ^iItem + 1!
  94256.  
  94257. iItem: anInteger 
  94258.     iItem := anInteger! !
  94259.  
  94260. TVHITTESTINFO comment:
  94261. 'TVHITTESTINFO is an ExternalStructure class to represent the Win32 common control structure of the same name.
  94262.  
  94263. TVHISTTESTINFO is used for hit-testing with Tree View controls.
  94264.  
  94265. This Supercedes the TV_HITTESTINFO class present in release 2.1 and earlier.'!
  94266. !TVHITTESTINFO class methodsFor!
  94267.  
  94268. defineFields
  94269.     "Define the fields of the Win32 TV_HITTESTINFO structure.
  94270.  
  94271.         TVHITTESTINFO compileDefinition
  94272.  
  94273.         typedef struct _TVHITTESTINFO    tvhtst {
  94274.             POINT        pt; 
  94275.             UINT            flags; 
  94276.             HTREEITEM    hItem;
  94277.         } TV_HITTESTINFO, FAR *LPTV_HITTESTINFO; 
  94278.     "
  94279.  
  94280.     super defineFields.
  94281.     self
  94282.         defineField: #hItem type: DWORDField readOnly! !
  94283.  
  94284. !TVHITTESTINFO methodsFor!
  94285.  
  94286. handle
  94287.     "Private - Answer the item 'handle' associated with the receiver.
  94288.     In the case of a TreeView hit-test, this is tree view item handle."
  94289.  
  94290.     ^self hItem!
  94291.  
  94292. hItem
  94293.     "Answer the receiver's hItem field as a Smalltalk object.
  94294.     This method has been automatically generated from the class' structure template.
  94295.     Any modifications you make will be lost the next time it is so generated."
  94296.  
  94297.     ^(bytes dwordAtOffset: 12)!
  94298.  
  94299. item
  94300.     "Answer the 'item' which has been hit (in this case the handle of node)."
  94301.  
  94302.     ^self hItem! !
  94303.  
  94304. LVITEM comment:
  94305. 'LVITEM is an <ExternalStructure> class which represents the Windows common control structure of the same name.
  94306.  
  94307. LVITEM is used to communicate information about the items (rows) in a List View control such as the text, icon, state, etc.'!
  94308. !LVITEM class methodsFor!
  94309.  
  94310. defineFields
  94311.     "Define the fields of the Win32 LVITEM structure
  94312.  
  94313.         LVITEM compileDefinition
  94314.     "
  94315.  
  94316.     self 
  94317.         defineField: #mask type: DWORDField new;
  94318.         defineField: #iItem type: SDWORDField new;
  94319.         defineField: #iSubItem type: SDWORDField new;
  94320.         defineField: #dwState type: DWORDField new;
  94321.         defineField: #stateMask type: DWORDField new;
  94322.         defineField: #pszText type: (PointerField type: String);
  94323.         defineField: #cchTextMax type: SDWORDField readOnly;
  94324.         defineField: #iImage type: SDWORDField new;
  94325.         defineField: #lParam type: DWORDField new;
  94326.         defineField: #iIndent type: SDWORDField new.
  94327.  
  94328.     self assert: [(template at: #pszText) offset = 20].    "If fails must modify #textInBuffer which hard codes offset"! !
  94329.  
  94330. !LVITEM methodsFor!
  94331.  
  94332. allCallbacks
  94333.     self iImage: I_IMAGECALLBACK.
  94334.     bytes dwordAtOffset: self textPointerOffset put: LPSTR_TEXTCALLBACK.
  94335.     self maskIn: ##(LVIF_TEXT | LVIF_IMAGE)!
  94336.  
  94337. cchTextMax
  94338.     "Answer the receiver's cchTextMax field as a Smalltalk object."
  94339.  
  94340.     ^(bytes sdwordAtOffset: 24)!
  94341.  
  94342. column: colInteger 
  94343.     self iSubItem: colInteger - 1!
  94344.  
  94345. dwState
  94346.     "Answer the receiver's dwState field as a Smalltalk object."
  94347.  
  94348.     ^(bytes dwordAtOffset: 12)!
  94349.  
  94350. dwState: anObject
  94351.     "Set the receiver's dwState field to the value of anObject."
  94352.  
  94353.     bytes dwordAtOffset: 12 put: anObject!
  94354.  
  94355. handle
  94356.     "Answer the 'handle' of the item described by the receiver."
  94357.  
  94358.     ^self iItem + 1!
  94359.  
  94360. iImage
  94361.     "Answer the receiver's iImage field as a Smalltalk object."
  94362.  
  94363.     ^(bytes sdwordAtOffset: 28)!
  94364.  
  94365. iImage: anObject
  94366.     "Set the receiver's iImage field to the value of anObject."
  94367.  
  94368.     bytes sdwordAtOffset: 28 put: anObject!
  94369.  
  94370. iIndent
  94371.     "Answer the receiver's iIndent field as a Smalltalk object."
  94372.  
  94373.     ^(bytes sdwordAtOffset: 36)!
  94374.  
  94375. iIndent: anObject
  94376.     "Set the receiver's iIndent field to the value of anObject."
  94377.  
  94378.     bytes sdwordAtOffset: 36 put: anObject!
  94379.  
  94380. iItem
  94381.     "Answer the receiver's iItem field as a Smalltalk object."
  94382.  
  94383.     ^(bytes sdwordAtOffset: 4)!
  94384.  
  94385. iItem: anObject
  94386.     "Set the receiver's iItem field to the value of anObject."
  94387.  
  94388.     bytes sdwordAtOffset: 4 put: anObject!
  94389.  
  94390. imageValidMask
  94391.     "Private - Answer the bit mask the receiver uses to denote that the iImage
  94392.     field has valid contents."
  94393.  
  94394.     ^LVIF_IMAGE!
  94395.  
  94396. indent: widths
  94397.     "Set the number of image widths to indent the item text."
  94398.  
  94399.     self iIndent: widths.
  94400.     self maskIn: LVIF_INDENT!
  94401.  
  94402. iSubItem
  94403.     "Answer the receiver's iSubItem field as a Smalltalk object."
  94404.  
  94405.     ^(bytes sdwordAtOffset: 8)!
  94406.  
  94407. iSubItem: anObject
  94408.     "Set the receiver's iSubItem field to the value of anObject."
  94409.  
  94410.     bytes sdwordAtOffset: 8 put: anObject!
  94411.  
  94412. lParam
  94413.     "Answer the receiver's lParam field as a Smalltalk object."
  94414.  
  94415.     ^(bytes dwordAtOffset: 32)!
  94416.  
  94417. lParam: anObject
  94418.     "Set the receiver's lParam field to the value of anObject."
  94419.  
  94420.     bytes dwordAtOffset: 32 put: anObject!
  94421.  
  94422. mask
  94423.     "Answer the receiver's mask field as a Smalltalk object."
  94424.  
  94425.     ^(bytes dwordAtOffset: 0)!
  94426.  
  94427. mask: anObject
  94428.     "Set the receiver's mask field to the value of anObject."
  94429.  
  94430.     bytes dwordAtOffset: 0 put: anObject!
  94431.  
  94432. paramValidMask
  94433.     "Private - Answer the bit mask the receiver uses to denote that the lParam
  94434.     field has valid contents."
  94435.  
  94436.     ^LVIF_PARAM!
  94437.  
  94438. pszText
  94439.     "Answer the receiver's pszText field as a Smalltalk object."
  94440.  
  94441.     ^String fromAddress: (bytes sdwordAtOffset: 20)!
  94442.  
  94443. pszText: anObject
  94444.     "Set the receiver's pszText field to the value of anObject."
  94445.  
  94446.     bytes dwordAtOffset: 20 put: anObject yourAddress!
  94447.  
  94448. row: rowInteger text: aString imageIndex: imageInteger indent: indentInteger 
  94449.     | mask iImage |
  94450.     self
  94451.         iItem: rowInteger - 1;
  94452.         pszText: (text := aString).
  94453.     mask := LVIF_TEXT.
  94454.     imageInteger notNil ifTrue: [iImage := imageInteger - 1].
  94455.     indentInteger notNil 
  94456.         ifTrue: 
  94457.             [self iIndent: indentInteger.
  94458.             mask := mask bitOr: LVIF_INDENT.
  94459.             indentInteger < 0 ifTrue: [iImage := -1]].
  94460.     iImage notNil 
  94461.         ifTrue: 
  94462.             [self iImage: iImage.
  94463.             mask := mask bitOr: LVIF_IMAGE].
  94464.     self mask: mask!
  94465.  
  94466. stateMask
  94467.     "Answer the receiver's stateMask field as a Smalltalk object."
  94468.  
  94469.     ^(bytes dwordAtOffset: 16)!
  94470.  
  94471. stateMask: anObject
  94472.     "Set the receiver's stateMask field to the value of anObject."
  94473.  
  94474.     bytes dwordAtOffset: 16 put: anObject!
  94475.  
  94476. stateValidMask
  94477.     "Private - Answer the bit mask the receiver uses to denote that the dwState
  94478.     field has valid contents."
  94479.  
  94480.     ^LVIF_STATE!
  94481.  
  94482. textPointerOffset
  94483.     "Private - Answer the offset of the text pointer in the receiver. "
  94484.  
  94485.     ^20!
  94486.  
  94487. textValidMask
  94488.     "Private - Answer the bit mask the receiver uses to denote that the pszText
  94489.     field has valid contents."
  94490.  
  94491.     ^LVIF_TEXT! !
  94492.  
  94493. TCITEM comment:
  94494. 'TCITEM is an <ExternalStructure> class which represents the Windows common control structure of the same name.
  94495.  
  94496. TCITEM is used to communicate information about the items (tabs) in a Tab Control.'!
  94497. !TCITEM class methodsFor!
  94498.  
  94499. defineFields
  94500.     "Define the fields of the Win32 TCITEM structure.
  94501.  
  94502.         TCITEM compileDefinition
  94503.  
  94504.     typedef struct _TCITEM { 
  94505.         UINT mask;            // value specifying which members to retrieve or set 
  94506.         DWORD dwState;        // Current item state
  94507.         DWORD dwStateMask;    // Mask of valid bits in dwState
  94508.         LPSTR pszText;        // pointer to string containing tab text 
  94509.         int cchTextMax;        // size of buffer pointed to by the pszText member 
  94510.         int iImage;            // index to tab control's image 
  94511.         LPARAM lParam;        // application-defined data associated with tab 
  94512.         } TCITEM;
  94513.     "
  94514.  
  94515.     self
  94516.         defineField: #mask type: DWORDField new;
  94517.         defineField: #dwState type: DWORDField new;
  94518.         defineField: #stateMask type: DWORDField writeOnly;
  94519.         defineField: #pszText type: (PointerField type: String);
  94520.         defineField: #cchTextMax type: SDWORDField new;
  94521.         defineField: #iImage type: SDWORDField new;
  94522.         defineField: #lParam type: SDWORDField writeOnly! !
  94523.  
  94524. !TCITEM methodsFor!
  94525.  
  94526. cchTextMax
  94527.     "Answer the receiver's cchTextMax field as a Smalltalk object."
  94528.  
  94529.     ^(bytes sdwordAtOffset: 16)!
  94530.  
  94531. cchTextMax: anObject
  94532.     "Set the receiver's cchTextMax field to the value of anObject."
  94533.  
  94534.     bytes sdwordAtOffset: 16 put: anObject!
  94535.  
  94536. dwState
  94537.     "Answer the receiver's dwState field as a Smalltalk object."
  94538.  
  94539.     ^(bytes dwordAtOffset: 4)!
  94540.  
  94541. dwState: anObject
  94542.     "Set the receiver's dwState field to the value of anObject."
  94543.  
  94544.     bytes dwordAtOffset: 4 put: anObject!
  94545.  
  94546. handle
  94547.     "Answer the 'handle' of the item described by the receiver."
  94548.  
  94549.     ^self shouldNotImplement!
  94550.  
  94551. iImage
  94552.     "Answer the receiver's iImage field as a Smalltalk object."
  94553.  
  94554.     ^(bytes sdwordAtOffset: 20)!
  94555.  
  94556. iImage: anObject
  94557.     "Set the receiver's iImage field to the value of anObject."
  94558.  
  94559.     bytes sdwordAtOffset: 20 put: anObject!
  94560.  
  94561. imageValidMask
  94562.     "Private - Answer the bit mask the receiver uses to denote that the pszText
  94563.     field has valid contents."
  94564.  
  94565.     ^TCIF_IMAGE!
  94566.  
  94567. lParam: anObject
  94568.     "Set the receiver's lParam field to the value of anObject."
  94569.  
  94570.     bytes sdwordAtOffset: 24 put: anObject!
  94571.  
  94572. mask
  94573.     "Answer the receiver's mask field as a Smalltalk object."
  94574.  
  94575.     ^(bytes dwordAtOffset: 0)!
  94576.  
  94577. mask: anObject
  94578.     "Set the receiver's mask field to the value of anObject."
  94579.  
  94580.     bytes dwordAtOffset: 0 put: anObject!
  94581.  
  94582. paramValidMask
  94583.     "Private - Answer the bit mask the receiver uses to denote that the lParam
  94584.     field has valid contents."
  94585.  
  94586.     ^TCIF_PARAM!
  94587.  
  94588. pszText
  94589.     "Answer the receiver's pszText field as a Smalltalk object."
  94590.  
  94591.     ^String fromAddress: (bytes sdwordAtOffset: 12)!
  94592.  
  94593. pszText: anObject
  94594.     "Set the receiver's pszText field to the value of anObject."
  94595.  
  94596.     bytes dwordAtOffset: 12 put: anObject yourAddress!
  94597.  
  94598. stateMask: anObject
  94599.     "Set the receiver's stateMask field to the value of anObject."
  94600.  
  94601.     bytes dwordAtOffset: 8 put: anObject!
  94602.  
  94603. stateValidMask
  94604.     "Private - Answer the bit mask the receiver uses to denote that the dwState
  94605.     field has valid contents."
  94606.  
  94607.     ^TCIF_STATE!
  94608.  
  94609. textPointerOffset
  94610.     "Private - Answer the offset of the text pointer in the receiver. "
  94611.  
  94612.     ^12!
  94613.  
  94614. textValidMask
  94615.     "Private - Answer the bit mask the receiver uses to denote that the pszText
  94616.     field has valid contents."
  94617.  
  94618.     ^TCIF_TEXT! !
  94619.  
  94620. TVITEM comment:
  94621. 'TVITEM is an <ExternalStructure> class which represents the Windows common control structure of the same name.
  94622.  
  94623. TVITEM is used to communicate information about the items (nodes) in a Tree View control such as the text, icon, state, etc.'!
  94624. !TVITEM class methodsFor!
  94625.  
  94626. defineFields
  94627.     "Define the fields of the Win32 TVITEM structure
  94628.  
  94629.         TVITEM compileDefinition
  94630.     "
  94631.  
  94632.     self 
  94633.         defineField: #mask type: DWORDField new;
  94634.         defineField: #hItem type: DWORDField new;
  94635.         defineField: #dwState type: DWORDField new;
  94636.         defineField: #stateMask type: DWORDField new;
  94637.         defineField: #pszText type: (PointerField type: String);
  94638.         defineField: #cchTextMax type: SDWORDField new;
  94639.         defineField: #iImage type: SDWORDField new;
  94640.         defineField: #iSelectedImage type: SDWORDField new;
  94641.         defineField: #cChildren type: SDWORDField new;
  94642.         defineField: #lParam type: DWORDField new.
  94643.  
  94644.     self assert: [(template at: #pszText) offset = 16].    "If fails must modify #textInBuffer which hard codes offset"! !
  94645.  
  94646. !TVITEM methodsFor!
  94647.  
  94648. allCallbacks
  94649.     "Set up the receiver to specify that callbacks are required for image, children count, and label text."
  94650.  
  94651.     self iImage: I_IMAGECALLBACK.
  94652.     self cChildren: I_CHILDRENCALLBACK.
  94653.     bytes dwordAtOffset: self textPointerOffset put: LPSTR_TEXTCALLBACK.
  94654.     self maskIn: ##(TVIF_TEXT | TVIF_CHILDREN | TVIF_IMAGE)!
  94655.  
  94656. beStateExpandedOnce
  94657.     "Sets the item state to reflect that this item has already been expanded"
  94658.  
  94659.     self stateMaskIn: TVIS_EXPANDEDONCE.!
  94660.  
  94661. cChildren
  94662.     "Answer the receiver's cChildren field as a Smalltalk object."
  94663.  
  94664.     ^(bytes sdwordAtOffset: 32)!
  94665.  
  94666. cChildren: anObject
  94667.     "Set the receiver's cChildren field to the value of anObject."
  94668.  
  94669.     bytes sdwordAtOffset: 32 put: anObject!
  94670.  
  94671. cchTextMax
  94672.     "Answer the receiver's cchTextMax field as a Smalltalk object."
  94673.  
  94674.     ^(bytes sdwordAtOffset: 20)!
  94675.  
  94676. cchTextMax: anObject
  94677.     "Set the receiver's cchTextMax field to the value of anObject."
  94678.  
  94679.     bytes sdwordAtOffset: 20 put: anObject!
  94680.  
  94681. children: anInteger
  94682.     "Set contents' cChildren member from anInteger"
  94683.  
  94684.     self cChildren: anInteger.
  94685.     self maskIn: TVIF_CHILDREN!
  94686.  
  94687. childrenCallback
  94688.     "Sets the receiver into children callback mode."
  94689.  
  94690.     self children: I_CHILDRENCALLBACK!
  94691.  
  94692. dwState
  94693.     "Answer the receiver's dwState field as a Smalltalk object."
  94694.  
  94695.     ^(bytes dwordAtOffset: 8)!
  94696.  
  94697. dwState: anObject
  94698.     "Set the receiver's dwState field to the value of anObject."
  94699.  
  94700.     bytes dwordAtOffset: 8 put: anObject!
  94701.  
  94702. getValidFields
  94703.     "Private - Answer a <sequencedReadableCollection> of the fields defined 
  94704.     in the receiver's template, sorted in ascending order of offset from the start of the
  94705.     structure, that are valid in this particular instance."
  94706.  
  94707.     | mask bit notValid |
  94708.     mask := self mask.
  94709.     bit := 1.
  94710.     notValid := #(#pszText #iImage #lParam #dwState #hItem #iSelectedImage #cChildren) 
  94711.                 select: 
  94712.                     [:each | 
  94713.                     | maskedIn |
  94714.                     maskedIn := mask allMask: bit.
  94715.                     bit := bit bitShift: 1.
  94716.                     maskedIn not].
  94717.     notValid first == #pszText ifTrue: [notValid := notValid copyWith: #cchTextMax].
  94718.     ^super getValidFields reject: [:each | notValid includes: each]!
  94719.  
  94720. handle
  94721.     "Answer the 'handle' of the item described by the receiver."
  94722.  
  94723.     ^self hItem!
  94724.  
  94725. hItem
  94726.     "Answer the receiver's hItem field as a Smalltalk object."
  94727.  
  94728.     ^(bytes dwordAtOffset: 4)!
  94729.  
  94730. hItem: anObject
  94731.     "Set the receiver's hItem field to the value of anObject."
  94732.  
  94733.     bytes dwordAtOffset: 4 put: anObject!
  94734.  
  94735. iImage
  94736.     "Answer the receiver's iImage field as a Smalltalk object."
  94737.  
  94738.     ^(bytes sdwordAtOffset: 24)!
  94739.  
  94740. iImage: anObject
  94741.     "Set the receiver's iImage field to the value of anObject."
  94742.  
  94743.     bytes sdwordAtOffset: 24 put: anObject!
  94744.  
  94745. imageValidMask
  94746.     "Private - Answer the bit mask the receiver uses to denote that the pszText
  94747.     field has valid contents."
  94748.  
  94749.     ^TVIF_IMAGE!
  94750.  
  94751. iSelectedImage
  94752.     "Answer the receiver's iSelectedImage field as a Smalltalk object."
  94753.  
  94754.     ^(bytes sdwordAtOffset: 28)!
  94755.  
  94756. iSelectedImage: anObject
  94757.     "Set the receiver's iSelectedImage field to the value of anObject."
  94758.  
  94759.     bytes sdwordAtOffset: 28 put: anObject!
  94760.  
  94761. isStateExpandedOnce
  94762.     "Answer whether the receiver has already been expanded"
  94763.  
  94764.     ^self dwState allMask: TVIS_EXPANDEDONCE.!
  94765.  
  94766. lParam
  94767.     "Answer the receiver's lParam field as a Smalltalk object."
  94768.  
  94769.     ^(bytes dwordAtOffset: 36)!
  94770.  
  94771. lParam: anObject
  94772.     "Set the receiver's lParam field to the value of anObject."
  94773.  
  94774.     bytes dwordAtOffset: 36 put: anObject!
  94775.  
  94776. mask
  94777.     "Answer the receiver's mask field as a Smalltalk object."
  94778.  
  94779.     ^(bytes dwordAtOffset: 0)!
  94780.  
  94781. mask: anObject
  94782.     "Set the receiver's mask field to the value of anObject."
  94783.  
  94784.     bytes dwordAtOffset: 0 put: anObject!
  94785.  
  94786. paramValidMask
  94787.     "Private - Answer the bit mask the receiver uses to denote that the lParam
  94788.     field has valid contents."
  94789.  
  94790.     ^TVIF_PARAM!
  94791.  
  94792. pszText
  94793.     "Answer the receiver's pszText field as a Smalltalk object."
  94794.  
  94795.     ^String fromAddress: (bytes sdwordAtOffset: 16)!
  94796.  
  94797. pszText: anObject
  94798.     "Set the receiver's pszText field to the value of anObject."
  94799.  
  94800.     bytes dwordAtOffset: 16 put: anObject yourAddress!
  94801.  
  94802. saveDetails
  94803.     "Private - Set the flag in the receiver's mask which informs the TreeView to save
  94804.     any details included in this item and not ask for them again."
  94805.  
  94806.     self maskIn: TVIF_DI_SETITEM!
  94807.  
  94808. selectedImage: anInteger
  94809.     "Set contents' iSelectedImage member to anInteger"
  94810.  
  94811.     self iSelectedImage: anInteger.
  94812.     self maskIn: TVIF_SELECTEDIMAGE!
  94813.  
  94814. stateMask
  94815.     "Answer the receiver's stateMask field as a Smalltalk object."
  94816.  
  94817.     ^(bytes dwordAtOffset: 12)!
  94818.  
  94819. stateMask: anObject
  94820.     "Set the receiver's stateMask field to the value of anObject."
  94821.  
  94822.     bytes dwordAtOffset: 12 put: anObject!
  94823.  
  94824. stateValidMask
  94825.     "Private - Answer the bit mask the receiver uses to denote that the dwState
  94826.     field has valid contents."
  94827.  
  94828.     ^TVIF_STATE!
  94829.  
  94830. textPointerOffset
  94831.     "Private - Answer the offset of the text pointer in the receiver. "
  94832.  
  94833.     ^16!
  94834.  
  94835. textValidMask
  94836.     "Private - Answer the bit mask the receiver uses to denote that the pszText
  94837.     field has valid contents."
  94838.  
  94839.     ^TVIF_TEXT! !
  94840.  
  94841. LocalFILETIME comment:
  94842. 'LocalFILETIME is an ExternalStructure class to represent the Win32 FILETIMEs that are in local time, as opposed to the usual UTC of normal FILETIMEs. See <FILETIME> for further details.'!
  94843. !LocalFILETIME class methodsFor!
  94844.  
  94845. fromSYSTEMTIME: aSYSTEMTIME
  94846.     "Answer a file time from the specified SYSTEMTIME (assumed to be in
  94847.     local time)."
  94848.  
  94849.     | answer |
  94850.     answer := self new.
  94851.     (KernelLibrary default systemTimeToFileTime: aSYSTEMTIME lpFileTime: answer) 
  94852.         ifFalse: [^KernelLibrary default systemError].
  94853.     ^answer!
  94854.  
  94855. now
  94856.     "Answer the current LocalFILETIME.
  94857.     Use the OLELibrary function if it is available.
  94858.  
  94859.         LocalFILETIME now
  94860.     "
  94861.  
  94862.     ^self fromSYSTEMTIME: SYSTEMTIME now! !
  94863.  
  94864. !LocalFILETIME methodsFor!
  94865.  
  94866. asLocalTime
  94867.     "Answer the receiver in local time (which it is already)."
  94868.  
  94869.     ^self!
  94870.  
  94871. asSYSTEMTIME
  94872.     "Answer the receiver converted to a SYSTEMTIME."
  94873.  
  94874.     ^self basicAsSYSTEMTIME!
  94875.  
  94876. asUTC
  94877.     "Answer the receiver as a UTC FILETIME."
  94878.  
  94879.     ^FILETIME fromLocalTime: self
  94880. ! !
  94881.  
  94882. MENUITEMINFOV5 comment:
  94883. ''!
  94884. !MENUITEMINFOV5 class methodsFor!
  94885.  
  94886. defineFields
  94887.     "Define the fields of the MENUITEMINFOV5 structure.
  94888.         MENUITEMINFOV5 compileDefinition
  94889.     "
  94890.  
  94891.     super defineFields.
  94892.     self
  94893.         defineField: #hbmpItem type: HANDLEField writeOnly! !
  94894.  
  94895. !MENUITEMINFOV5 methodsFor!
  94896.  
  94897. commandMenuItem: aCommandMenuItem 
  94898.     | mask |
  94899.     mask := ##(MIIM_FTYPE | MIIM_STRING | MIIM_ID).
  94900.     aCommandMenuItem bitmap ifNotNil: 
  94901.             [:bitmap | 
  94902.             mask := mask bitOr: MIIM_BITMAP.
  94903.             self hbmpItem: bitmap asParameter].
  94904.     self
  94905.         fType: aCommandMenuItem styleFlags;
  94906.         basicText: aCommandMenuItem text;
  94907.         wID: aCommandMenuItem id;
  94908.         fMask: mask!
  94909.  
  94910. hbmpItem: anObject
  94911.     "Set the receiver's hbmpItem field to the value of anObject."
  94912.  
  94913.     bytes dwordAtOffset: 44 put: anObject!
  94914.  
  94915. menuItem: aMenuItem text: aStringOrNil state: aString 
  94916.     "Private - Update the details for a normal menu item (i.e. the text, type flags, and state).
  94917.     This message is used when dynamically updating menu items."
  94918.  
  94919.     | mask |
  94920.     mask := aStringOrNil isNil 
  94921.                 ifTrue: [##(MIIM_FTYPE | MIIM_STATE)]
  94922.                 ifFalse: 
  94923.                     [self basicText: aStringOrNil.
  94924.                     ##(MIIM_FTYPE | MIIM_STATE | MIIM_STRING)].
  94925.     aMenuItem bitmap ifNotNil: 
  94926.             [:bitmap | 
  94927.             mask := mask bitOr: MIIM_BITMAP.
  94928.             self hbmpItem: bitmap asParameter].
  94929.     self
  94930.         fType: aMenuItem styleFlags;
  94931.         fState: aString;
  94932.         fMask: mask!
  94933.  
  94934. subMenu: aMenuOrHandle text: aString
  94935.     "Private - Set menu insertion details for a Sub-menu."
  94936.  
  94937.     self 
  94938.         basicText: aString;
  94939.         hSubMenu: aMenuOrHandle asParameter;
  94940.         fMask: ##(MIIM_SUBMENU|MIIM_STRING)!
  94941.  
  94942. type: anInteger
  94943.     "Private - Set the fType field only. Used when creating menu items."
  94944.  
  94945.     self 
  94946.         fType: anInteger;
  94947.         fMask: MIIM_FTYPE!
  94948.  
  94949. type: flagsInteger text: aString id: idInteger
  94950.     "Private - Set insertion details for a normal menu item (i.e. the text, type flags, and id)."
  94951.  
  94952.     self
  94953.         fType: flagsInteger;
  94954.         basicText: aString;
  94955.         wID: idInteger;
  94956.         fMask: ##(MIIM_FTYPE | MIIM_STRING | MIIM_ID)! !
  94957.  
  94958. NMCUSTOMDRAW comment:
  94959. 'NMCUSTOMDRAW is an <ExternalStructure> class to represent the Win32 structure of the same name.
  94960.  
  94961. NMCUSTOMDRAW structures are sent as parameter blocks along with certain WM_NOTIFY messages from Windows common controls such as the <ListView> and <TreeView> to request custom draw information for individual items (and optionally sub-items).
  94962.  
  94963. All the fields in this structure are read-only. Specialized sub-structures provide fields which can be written to in order to pass custom draw settings back to the control (for example the foreground and background text colours). The DC associated with this structure can also be updated by changing the font, and so forth.
  94964.  
  94965. '!
  94966. !NMCUSTOMDRAW class methodsFor!
  94967.  
  94968. defineFields
  94969.     "Define the structure template for Win32 NMCUSTOMDRAW structure.
  94970.         self compileDefinition
  94971.     "
  94972.  
  94973.     super defineFields.
  94974.     self 
  94975.         
  94976.         defineField: #dwDrawStage type: DWORDField readOnly;
  94977.         defineField: #hdc type: HANDLEField readOnly;
  94978.         defineField: #rc type: (StructureField type: RECT) beReadOnly;
  94979.         defineField: #dwItemSpec type: DWORDField readOnly;
  94980.         defineField: #uItemState type: DWORDField readOnly;
  94981.         defineField: #lParam type: DWORDField readOnly! !
  94982.  
  94983. !NMCUSTOMDRAW methodsFor!
  94984.  
  94985. applyFont
  94986.     "Private - Apply the new font (if changed) to the custom draw DC and answer whether
  94987.     a new font was indeed selected."
  94988.  
  94989.     ^font notNil and: [
  94990.         (font basicHandle ~= canvas font basicHandle) and: [
  94991.             #todo "It's definitely not a good idea to delete old font here (the default font will
  94992.              probably get deleted, but we rely on the fact that finalization happens in
  94993.              the background so that the font we supply in place is not deleted until
  94994.              after the drawing cycle is complete. This seems dangerous.".
  94995.             self canvas font: font.
  94996.             true]]!
  94997.  
  94998. backcolor
  94999.     "Answer the background <Color>."
  95000.  
  95001.     ^self canvas backcolor!
  95002.  
  95003. backcolor: aColor
  95004.     "Sets the background <Color>."
  95005.  
  95006.     self canvas backcolor: aColor!
  95007.  
  95008. boundingRectangle
  95009.     "Answer the <Rectangle> within which the item is being displayed (in the client co-ordinates
  95010.     of the view."
  95011.  
  95012.     ^self rc asRectangle!
  95013.  
  95014. canvas
  95015.     "Answer the <Canvas> associated with the receiver (useful for custom modifications,
  95016.     but private because care is needed to avoid leaks)."
  95017.  
  95018.     canvas isNil ifTrue: [canvas := Canvas withNonOwnedDC: self hdc].
  95019.     ^canvas!
  95020.  
  95021. dwDrawStage
  95022.     "Answer the receiver's dwDrawStage field as a Smalltalk object."
  95023.  
  95024.     ^(bytes dwordAtOffset: 12)!
  95025.  
  95026. dwItemSpec
  95027.     "Answer the receiver's dwItemSpec field as a Smalltalk object."
  95028.  
  95029.     ^(bytes dwordAtOffset: 36)!
  95030.  
  95031. evaluateDrawBlock: customDrawBlock
  95032.     "Private - Evaluate the <monadicValuable>, customDrawBlock, and answer the appropriate instruction
  95033.      for a common control to complete the draw operation (or skip it if total control is taken)."
  95034.  
  95035.     ^(customDrawBlock value: self) == true 
  95036.         ifTrue: [CDRF_SKIPDEFAULT]
  95037.         ifFalse: [
  95038.             self applyFont
  95039.                 ifTrue: [CDRF_NEWFONT]
  95040.                 ifFalse: [CDRF_DODEFAULT]]
  95041. !
  95042.  
  95043. font
  95044.     "Answer the character font."
  95045.     
  95046.     font isNil ifTrue: [font := self canvas font].
  95047.     ^font!
  95048.  
  95049. font: aFont
  95050.     "Set the character font.
  95051.     Implementation Note: Don't update the DC with the new font yet."
  95052.  
  95053.     font := aFont!
  95054.  
  95055. forecolor
  95056.     "Answer the foreground text colour."
  95057.  
  95058.     ^self canvas forecolor!
  95059.  
  95060. forecolor: aColor
  95061.     "Sets the foreground text <Color>."
  95062.  
  95063.     self canvas forecolor: aColor!
  95064.  
  95065. hasFocus
  95066.     "Answer whether the item being drawn has focus."
  95067.  
  95068.     ^self uItemState allMask: CDIS_FOCUS!
  95069.  
  95070. hdc
  95071.     "Answer the receiver's hdc field as a Smalltalk object."
  95072.  
  95073.     ^(bytes dwordAtOffset: 16) asExternalHandle!
  95074.  
  95075. isChecked
  95076.     "Answer whether the item being draw is 'checked' (i.e. in a list with checkboxes it is ticked)."
  95077.  
  95078.     ^self uItemState allMask: CDIS_CHECKED!
  95079.  
  95080. isDefault
  95081.     "Answer whether the item being drawn is the default."
  95082.  
  95083.     ^self uItemState allMask: CDIS_DEFAULT!
  95084.  
  95085. isDisabled
  95086.     "Answer whether the item being draw is disabled."
  95087.  
  95088.     ^self uItemState allMask: CDIS_DISABLED!
  95089.  
  95090. isGrayed
  95091.     "Answer whether the item being draw is greyed out."
  95092.  
  95093.     ^self uItemState allMask: CDIS_GRAYED!
  95094.  
  95095. isHot
  95096.     "Answer whether the item being drawn is hot (i.e. under the cursor 
  95097.     when hot tracking is enabled)."
  95098.  
  95099.     ^self uItemState allMask: CDIS_HOT!
  95100.  
  95101. isIndeterminate
  95102.     "Answer whether the item being drawn is an indeterminate state."
  95103.  
  95104.     ^self uItemState allMask: CDIS_INDETERMINATE  !
  95105.  
  95106. isMarked
  95107.     "Answer whether the item being drawn is marked (whatever that means)."
  95108.  
  95109.     ^self uItemState allMask: CDIS_MARKED!
  95110.  
  95111. isSelected
  95112.     "Answer whether the item being draw is selected."
  95113.  
  95114.     ^self uItemState allMask: CDIS_SELECTED!
  95115.  
  95116. item
  95117.     "Answer the object from the view's model that is being drawn (the item,
  95118.     which is pre-cached)."
  95119.  
  95120.     ^item!
  95121.  
  95122. item: anObject
  95123.     "Private - Private -Record the item being drawn."
  95124.  
  95125.     item := anObject!
  95126.  
  95127. itemHandle
  95128.     "Private - Answer the 'handle' of the receiver's item."
  95129.  
  95130.     ^self subclassResponsibility!
  95131.  
  95132. lParam
  95133.     "Answer the receiver's lParam field as a Smalltalk object."
  95134.  
  95135.     ^(bytes dwordAtOffset: 44)!
  95136.  
  95137. rc
  95138.     "Answer the receiver's rc field as a Smalltalk object."
  95139.  
  95140.     ^RECT fromAddress: (bytes yourAddress + 20)!
  95141.  
  95142. uItemState
  95143.     "Answer the receiver's uItemState field as a Smalltalk object."
  95144.  
  95145.     ^(bytes dwordAtOffset: 40)!
  95146.  
  95147. view
  95148.     "Answer the sub-instance of <IconListAbstract> for which this is a <customDrawContext>."
  95149.  
  95150.     ^view!
  95151.  
  95152. view: anIconListAbstract
  95153.     "Private -"
  95154.     view := anIconListAbstract! !
  95155.  
  95156. NMITEMACTIVATE comment:
  95157. ''!
  95158. !NMITEMACTIVATE class methodsFor!
  95159.  
  95160. defineFields
  95161.     "
  95162.         self compileDefinition
  95163.  
  95164.         typedef struct tagNMITEMACTIVATE{ 
  95165.             NMHDR hdr; 
  95166.             int iItem; 
  95167.             int iSubItem; 
  95168.             UINT uNewState; 
  95169.             UINT uOldState; 
  95170.             UINT uChanged; 
  95171.             POINT ptAction; 
  95172.             LPARAM lParam; 
  95173.             UINT uKeyFlags; 
  95174.         } NMITEMACTIVATE, *LPNMITEMACTIVATE; "
  95175.  
  95176.     super defineFields.
  95177.     self
  95178.         defineField: #iItem type: SDWORDField readOnly;
  95179.         defineField: #iSubItem type: SDWORDField readOnly;
  95180.         defineField: #uNewState type: DWORDField readOnly;
  95181.         defineField: #uOldState type: DWORDField readOnly;
  95182.         defineField: #uChanged type: DWORDField readOnly;
  95183.         defineField: #ptAction type: (StructureField type: POINTL) beReadOnly;
  95184.         defineField: #lParam type: DWORDField filler;
  95185.         defineField: #uKeyFlags type: DWORDField readOnly! !
  95186.  
  95187. !NMITEMACTIVATE methodsFor!
  95188.  
  95189. iItem
  95190.     "Answer the receiver's iItem field as a Smalltalk object."
  95191.  
  95192.     ^(bytes sdwordAtOffset: 12)!
  95193.  
  95194. iSubItem
  95195.     "Answer the receiver's iSubItem field as a Smalltalk object."
  95196.  
  95197.     ^(bytes sdwordAtOffset: 16)!
  95198.  
  95199. ptAction
  95200.     "Answer the receiver's ptAction field as a Smalltalk object."
  95201.  
  95202.     ^POINTL fromAddress: (bytes yourAddress + 32)!
  95203.  
  95204. uChanged
  95205.     "Answer the receiver's uChanged field as a Smalltalk object."
  95206.  
  95207.     ^(bytes dwordAtOffset: 28)!
  95208.  
  95209. uKeyFlags
  95210.     "Answer the receiver's uKeyFlags field as a Smalltalk object."
  95211.  
  95212.     ^(bytes dwordAtOffset: 44)!
  95213.  
  95214. uNewState
  95215.     "Answer the receiver's uNewState field as a Smalltalk object."
  95216.  
  95217.     ^(bytes dwordAtOffset: 20)!
  95218.  
  95219. uOldState
  95220.     "Answer the receiver's uOldState field as a Smalltalk object."
  95221.  
  95222.     ^(bytes dwordAtOffset: 24)! !
  95223.  
  95224. NMKEYDOWN comment:
  95225. 'NMKEYDOWN is an ExternalStructure class to represent the Win32 structures NMTVKEYDOWN, NMTCKEYDOWN and NMLVKEYDOWN, all of which have the same fields.
  95226. '!
  95227. !NMKEYDOWN class methodsFor!
  95228.  
  95229. defineFields
  95230.     "Define the fields of the Win32 NMKEYDOWN structure
  95231.         NMKEYDOWN compileDefinition
  95232.     "
  95233.  
  95234.     super defineFields.        "NMHDR fields"
  95235.     self defineField: #wVKey type: WORDField readOnly;
  95236.         defineField: #flags type: DWORDField readOnly! !
  95237.  
  95238. !NMKEYDOWN methodsFor!
  95239.  
  95240. flags
  95241.     "Answer the receiver's flags field as a Smalltalk object."
  95242.  
  95243.     ^(bytes dwordAtOffset: 16)!
  95244.  
  95245. wVKey
  95246.     "Answer the receiver's wVKey field as a Smalltalk object."
  95247.  
  95248.     ^(bytes wordAtOffset: 12)! !
  95249.  
  95250. NMLISTVIEW comment:
  95251. ''!
  95252. !NMLISTVIEW class methodsFor!
  95253.  
  95254. defineFields
  95255.     "Define the structure template for Win32 NMLISTVIEW structure.
  95256.         NMLISTVIEW compileDefinition
  95257.     "
  95258.  
  95259.     super defineFields.
  95260.     self 
  95261.         defineField: #iItem type: SDWORDField readOnly;
  95262.         defineField: #iSubItem type: SDWORDField readOnly;
  95263.         defineField: #uNewState type: DWORDField readOnly;
  95264.         defineField: #uOldState type: DWORDField readOnly;
  95265.         defineField: #uChanged type: DWORDField readOnly;
  95266.         defineField: #ptAction type: (StructureField type: POINTL) beReadOnly;
  95267.         defineField: #lParam type: DWORDField readOnly! !
  95268.  
  95269. !NMLISTVIEW methodsFor!
  95270.  
  95271. iItem
  95272.     "Answer the receiver's iItem field as a Smalltalk object.
  95273.     Automatically generated get method - do not modify"
  95274.  
  95275.     ^(bytes sdwordAtOffset: 12)!
  95276.  
  95277. iSubItem
  95278.     "Answer the receiver's iSubItem field as a Smalltalk object.
  95279.     Automatically generated get method - do not modify"
  95280.  
  95281.     ^(bytes sdwordAtOffset: 16)!
  95282.  
  95283. itemHandle
  95284.     "Answer the 'handle' of the receiver's item."
  95285.  
  95286.     ^self iItem + 1!
  95287.  
  95288. lParam
  95289.     "Answer the receiver's lParam field as a Smalltalk object.
  95290.     Automatically generated get method - do not modify"
  95291.  
  95292.     ^(bytes dwordAtOffset: 40)!
  95293.  
  95294. ptAction
  95295.     "Answer the receiver's ptAction field as a Smalltalk object.
  95296.     Automatically generated get method - do not modify"
  95297.  
  95298.     ^POINTL fromAddress: (bytes yourAddress + 32)!
  95299.  
  95300. uChanged
  95301.     "Answer the receiver's uChanged field as a Smalltalk object.
  95302.     Automatically generated get method - do not modify"
  95303.  
  95304.     ^(bytes dwordAtOffset: 28)!
  95305.  
  95306. uNewState
  95307.     "Answer the receiver's uNewState field as a Smalltalk object.
  95308.     Automatically generated get method - do not modify"
  95309.  
  95310.     ^(bytes dwordAtOffset: 20)!
  95311.  
  95312. uOldState
  95313.     "Answer the receiver's uOldState field as a Smalltalk object.
  95314.     Automatically generated get method - do not modify"
  95315.  
  95316.     ^(bytes dwordAtOffset: 24)! !
  95317.  
  95318. NMLVDISPINFO comment:
  95319. ''!
  95320. !NMLVDISPINFO class methodsFor!
  95321.  
  95322. defineFields
  95323.     "Define the fields of the Win32 NMLVDISPINFO structure.
  95324.         NMLVDISPINFO compileDefinition
  95325.     "
  95326.  
  95327.     super defineFields;
  95328.         defineField: #lvItem type: (StructureField type: LVITEM) beReadOnly! !
  95329.  
  95330. !NMLVDISPINFO methodsFor!
  95331.  
  95332. item
  95333.     "Answer the receiver's item member"
  95334.  
  95335.     item isNil ifTrue: [item := self lvItem].
  95336.     ^item!
  95337.  
  95338. itemHandle
  95339.     "Answer the 'handle' of the receiver's item."
  95340.  
  95341.     ^self item iItem + 1!
  95342.  
  95343. lvItem
  95344.     "Answer the receiver's lvItem field as a Smalltalk object."
  95345.  
  95346.     ^LVITEM fromAddress: (bytes yourAddress + 12)! !
  95347.  
  95348. NMLVFINDITEM comment:
  95349. ''!
  95350. !NMLVFINDITEM class methodsFor!
  95351.  
  95352. defineFields
  95353.     "Define the fields of the Win32 NMLVFINDITEM structure.
  95354.         NMLVFINDITEM compileDefinition
  95355.     "
  95356.  
  95357.     super defineFields;
  95358.         defineField: #iStart type: SDWORDField readOnly;
  95359.         defineField: #lvfi type: (StructureField type: LVFINDINFO) beReadOnly! !
  95360.  
  95361. !NMLVFINDITEM methodsFor!
  95362.  
  95363. iStart
  95364.     "Answer the receiver's iStart field as a Smalltalk object."
  95365.  
  95366.     ^(bytes sdwordAtOffset: 12)!
  95367.  
  95368. lvfi
  95369.     "Answer the receiver's lvfi field as a Smalltalk object."
  95370.  
  95371.     ^LVFINDINFO fromAddress: (bytes yourAddress + 16)! !
  95372.  
  95373. NMLVGETINFOTIPA comment:
  95374. ''!
  95375. !NMLVGETINFOTIPA class methodsFor!
  95376.  
  95377. defineFields
  95378.     "Define the structure template for Win32 NMLVGETINFOTIPA structure.
  95379.     Implementation Note: We define the text field as an address because we
  95380.     need to write back to the buffer pointed at by that field rather than overwrite
  95381.     it.
  95382.  
  95383.         NMLVGETINFOTIPA compileDefinition
  95384.  
  95385.         typedef struct tagNMLVGETINFOTIPA
  95386.         {
  95387.             NMHDR hdr;
  95388.             DWORD dwFlags;
  95389.             LPSTR pszText;
  95390.             int cchTextMax;
  95391.             int iItem;
  95392.             int iSubItem;
  95393.             LPARAM lParam;
  95394.         } NMLVGETINFOTIPA, *LPNMLVGETINFOTIPA;"
  95395.  
  95396.     super defineFields.
  95397.     self
  95398.         defineField: #dwFlags type: DWORDField readOnly;
  95399.         defineField: #pszText type: LPVOIDField readOnly;
  95400.         defineField: #cchTextMax type: SDWORDField readOnly;
  95401.         defineField: #iItem type: SDWORDField readOnly;
  95402.         defineField: #iSubItem type: SDWORDField readOnly;
  95403.         defineField: #lParam type: DWORDField filler
  95404. ! !
  95405.  
  95406. !NMLVGETINFOTIPA methodsFor!
  95407.  
  95408. cchTextMax
  95409.     "Answer the receiver's cchTextMax field as a Smalltalk object."
  95410.  
  95411.     ^(bytes sdwordAtOffset: 20)!
  95412.  
  95413. dwFlags
  95414.     "Answer the receiver's dwFlags field as a Smalltalk object."
  95415.  
  95416.     ^(bytes dwordAtOffset: 12)!
  95417.  
  95418. iItem
  95419.     "Answer the receiver's iItem field as a Smalltalk object."
  95420.  
  95421.     ^(bytes sdwordAtOffset: 24)!
  95422.  
  95423. iSubItem
  95424.     "Answer the receiver's iSubItem field as a Smalltalk object."
  95425.  
  95426.     ^(bytes sdwordAtOffset: 28)!
  95427.  
  95428. itemHandle
  95429.     "Answer the 'handle' of the receiver's item."
  95430.  
  95431.     ^self iItem + 1!
  95432.  
  95433. pszText
  95434.     "Answer the receiver's pszText field as a Smalltalk object."
  95435.  
  95436.     ^(bytes dwordAtOffset: 16) asExternalAddress!
  95437.  
  95438. text: text
  95439.     "Private - Set the receiver's tip text to the ANSI string representation of the argument, text,
  95440.     up to the maximum number of characters specified by the receiver's #cchTextMax field.
  95441.     Answer the potentially truncated text."
  95442.  
  95443.     | t max |
  95444.     t := text asString.
  95445.     max := self cchTextMax.
  95446.     t size >= max ifTrue: [t := (t copyFrom: 1 to: max-4), '...'].
  95447.     CRTLibrary default strncpy: self pszText strSource: t count: max.
  95448.     ^t
  95449. ! !
  95450.  
  95451. NMLVODSTATECHANGE comment:
  95452. ''!
  95453. !NMLVODSTATECHANGE class methodsFor!
  95454.  
  95455. defineFields
  95456.     "Define the structure template for Win32 NMLVODSTATECHANGE structure.
  95457.         NMLVODSTATECHANGE compileDefinition
  95458.     "
  95459.  
  95460.     super defineFields.
  95461.     self 
  95462.         defineField: #iFrom type: SDWORDField readOnly;
  95463.         defineField: #iTo type: SDWORDField readOnly;
  95464.         defineField: #uNewState type: DWORDField readOnly;
  95465.         defineField: #uOldState type: DWORDField readOnly! !
  95466.  
  95467. !NMLVODSTATECHANGE methodsFor!
  95468.  
  95469. iFrom
  95470.     "Answer the receiver's iFrom field as a Smalltalk object."
  95471.  
  95472.     ^(bytes sdwordAtOffset: 12)!
  95473.  
  95474. iTo
  95475.     "Answer the receiver's iTo field as a Smalltalk object."
  95476.  
  95477.     ^(bytes sdwordAtOffset: 16)!
  95478.  
  95479. uNewState
  95480.     "Answer the receiver's uNewState field as a Smalltalk object."
  95481.  
  95482.     ^(bytes dwordAtOffset: 20)!
  95483.  
  95484. uOldState
  95485.     "Answer the receiver's uOldState field as a Smalltalk object."
  95486.  
  95487.     ^(bytes dwordAtOffset: 24)! !
  95488.  
  95489. NMMOUSE comment:
  95490. 'NMMOUSE is the class of <ExternalStructure> which represent the Windows Common Control structure of the same name.
  95491.  
  95492. NMMOUSE accompanies certain notifications that are sent by a control bars (e.g. toolbars, statusbars) when a mouse action occurs such as a click.
  95493. '!
  95494. !NMMOUSE class methodsFor!
  95495.  
  95496. defineFields
  95497.     "Define the structure template for Win32 NMMOUSE structure.
  95498.         self compileDefinition
  95499.     "
  95500.  
  95501.     super defineFields.
  95502.     self 
  95503.         defineField: #dwItemSpec type: DWORDField readOnly;
  95504.         defineField: #dwItemData type: DWORDField readOnly;
  95505.         defineField: #pt type: (StructureField type: POINTL) beReadOnly;
  95506.         defineField: #dwHitInfo type: DWORDField readOnly! !
  95507.  
  95508. !NMMOUSE methodsFor!
  95509.  
  95510. dwHitInfo
  95511.     "Answer the receiver's dwHitInfo field as a Smalltalk object."
  95512.  
  95513.     ^(bytes dwordAtOffset: 28)!
  95514.  
  95515. dwItemData
  95516.     "Answer the receiver's dwItemData field as a Smalltalk object."
  95517.  
  95518.     ^(bytes dwordAtOffset: 16)!
  95519.  
  95520. dwItemSpec
  95521.     "Answer the receiver's dwItemSpec field as a Smalltalk object."
  95522.  
  95523.     ^(bytes dwordAtOffset: 12)!
  95524.  
  95525. iItem
  95526.     "Answer the item index (appropriate when originating from a control whose items
  95527.     are externally identified by integer keys)."
  95528.  
  95529.     ^bytes sdwordAtOffset: 12!
  95530.  
  95531. pt
  95532.     "Answer the receiver's pt field as a Smalltalk object."
  95533.  
  95534.     ^POINTL fromAddress: (bytes yourAddress + 20)! !
  95535.  
  95536. NMTOOLBAR comment:
  95537. 'NMTOOLBAR is the class of <ExternalStructure> which represent the Windows Common Control structure of the same name.
  95538.  
  95539. NMTOOLBAR accompanies certain notifications that are sent by a Toolbar control to its parent, e.g. when a drop-down button is pressed, such as the browser history list buttons (TBN_DROPDOWN). See the Win32 documentation for further details.
  95540. '!
  95541. !NMTOOLBAR class methodsFor!
  95542.  
  95543. defineFields
  95544.     "Define the structure template for Win32 NMTOOLBAR structure.
  95545.  
  95546.         NMTOOLBAR compileDefinition
  95547.  
  95548.     typedef struct  tagNMTOOLBAR {
  95549.         NMHDR hdr; 
  95550.         int iItem; 
  95551.         TBBUTTON tbButton; 
  95552.         int cchText; 
  95553.         LPTSTR pszText; 
  95554.      } NMTOOLBAR;"
  95555.  
  95556.     super defineFields.
  95557.     self
  95558.         defineField: #iItem type: SDWORDField readOnly;
  95559.         defineField: #tbButton type: (StructureField type: TBBUTTON) beReadOnly;
  95560.         defineField: #cchText type: SDWORDField new beReadOnly;
  95561.         defineField: #pszText type: (PointerField type: String) beReadOnly! !
  95562.  
  95563. !NMTOOLBAR methodsFor!
  95564.  
  95565. cchText
  95566.     "Answer the receiver's cchText field as a Smalltalk object."
  95567.  
  95568.     ^(bytes sdwordAtOffset: 36)!
  95569.  
  95570. iItem
  95571.     "Answer the receiver's iItem field as a Smalltalk object."
  95572.  
  95573.     ^(bytes sdwordAtOffset: 12)!
  95574.  
  95575. pszText
  95576.     "Answer the receiver's pszText field as a Smalltalk object."
  95577.  
  95578.     ^String fromAddress: (bytes sdwordAtOffset: 40)!
  95579.  
  95580. tbButton
  95581.     "Answer the receiver's tbButton field as a Smalltalk object."
  95582.  
  95583.     ^TBBUTTON fromAddress: (bytes yourAddress + 16)! !
  95584.  
  95585. NMTREEVIEW comment:
  95586. ''!
  95587. !NMTREEVIEW class methodsFor!
  95588.  
  95589. defineFields
  95590.     "Define the structure template for Win32 NMTREEVIEW structure.
  95591.         NMTREEVIEW compileDefinition
  95592.     "
  95593.  
  95594.     super defineFields.
  95595.     self 
  95596.         defineField: #action type: DWORDField readOnly;
  95597.         defineField: #itemOld type: (StructureField type: TVITEM) beReadOnly;
  95598.         defineField: #itemNew type: (StructureField type: TVITEM) beReadOnly;
  95599.         defineField: #ptDrag type: (StructureField type: POINTL) beReadOnly! !
  95600.  
  95601. !NMTREEVIEW methodsFor!
  95602.  
  95603. action
  95604.     "Answer the receiver's action field as a Smalltalk object."
  95605.  
  95606.     ^(bytes dwordAtOffset: 12)!
  95607.  
  95608. itemHandle
  95609.     "Answer the 'handle' of the receiver's item."
  95610.  
  95611.     ^self itemNew hItem!
  95612.  
  95613. itemNew
  95614.     "Answer the receiver's itemNew field as a Smalltalk object."
  95615.  
  95616.     ^TVITEM fromAddress: (bytes yourAddress + 56)!
  95617.  
  95618. itemOld
  95619.     "Answer the receiver's itemOld field as a Smalltalk object."
  95620.  
  95621.     ^TVITEM fromAddress: (bytes yourAddress + 16)!
  95622.  
  95623. ptDrag
  95624.     "Answer the receiver's ptDrag field as a Smalltalk object."
  95625.  
  95626.     ^POINTL fromAddress: (bytes yourAddress + 96)! !
  95627.  
  95628. NMTVDISPINFO comment:
  95629. ''!
  95630. !NMTVDISPINFO class methodsFor!
  95631.  
  95632. defineFields
  95633.     "Define the fields of the Win32 NMTVDISPINFO structure.
  95634.         NMTVDISPINFO compileDefinition
  95635.     "
  95636.  
  95637.     super defineFields;
  95638.         defineField: #tvItem type: (StructureField type: TVITEM) beReadOnly! !
  95639.  
  95640. !NMTVDISPINFO methodsFor!
  95641.  
  95642. item
  95643.     "Answer the receiver's item member"
  95644.  
  95645.     item isNil ifTrue: [item := self tvItem] .
  95646.     ^item!
  95647.  
  95648. itemHandle
  95649.     "Answer the 'handle' of the receiver's item."
  95650.  
  95651.     ^self item hItem!
  95652.  
  95653. tvItem
  95654.     "Answer the receiver's tvItem field as a Smalltalk object."
  95655.  
  95656.     ^TVITEM fromAddress: (bytes yourAddress + 12)! !
  95657.  
  95658. NMTVGETINFOTIPA comment:
  95659. ''!
  95660. !NMTVGETINFOTIPA class methodsFor!
  95661.  
  95662. defineFields
  95663.     "Define the fields of the Win32 NMTVGETINFOTIPA structure.
  95664.         NMTVGETINFOTIPA compileDefinition
  95665.     "
  95666.  
  95667.     super defineFields;
  95668.         defineField: #pszText type: LPVOIDField readOnly;
  95669.         defineField: #cchTextMax type: SDWORDField readOnly;
  95670.         defineField: #hItem type: DWORDField readOnly;
  95671.         defineField: #lParam type: DWORDField readOnly
  95672.  
  95673. ! !
  95674.  
  95675. !NMTVGETINFOTIPA methodsFor!
  95676.  
  95677. cchTextMax
  95678.     "Answer the receiver's cchTextMax field as a Smalltalk object."
  95679.  
  95680.     ^(bytes sdwordAtOffset: 16)!
  95681.  
  95682. hItem
  95683.     "Answer the receiver's hItem field as a Smalltalk object."
  95684.  
  95685.     ^(bytes dwordAtOffset: 20)!
  95686.  
  95687. itemHandle
  95688.     "Answer the 'handle' of the receiver's item."
  95689.  
  95690.     ^self hItem!
  95691.  
  95692. lParam
  95693.     "Answer the receiver's lParam field as a Smalltalk object."
  95694.  
  95695.     ^(bytes dwordAtOffset: 24)!
  95696.  
  95697. pszText
  95698.     "Answer the receiver's pszText field as a Smalltalk object."
  95699.  
  95700.     ^(bytes dwordAtOffset: 12) asExternalAddress!
  95701.  
  95702. text: text
  95703.     "Private - Set the receiver's tip text to the ANSI string representation of the argument, text,
  95704.     and answer that. If the receiver's #dwFlags field is zero then the text is appended to the existing
  95705.     text, but only up to the maximum number of characters specified by the receiver's
  95706.     #cchTextMax field."
  95707.  
  95708.     CRTLibrary default strncpy: self pszText strSource: text displayString count: self cchTextMax
  95709. ! !
  95710.  
  95711. TOOLTIPTEXTA comment:
  95712. 'TOOLTIPTEXTA is the class of <ExternalStructure> which represent the Windows Common Control structure of the same name.
  95713.  
  95714. TOOLTIPTEXTA accompanies TTN_NEEDTEXTA notifications that are sent by a Toolbar control to its parent when it wishes to determine the ANSI (single-byte character) tool-tip text to be displayed for a toolbar button which the user is hovering over. See the Win32 documentation for further details.'!
  95715. !TOOLTIPTEXTA class methodsFor!
  95716.  
  95717. defineFields
  95718.     "Define the structure template for Win32 TOOLTIPTEXTA structure.
  95719.  
  95720.         TOOLTIPTEXTA compileDefinition.
  95721.  
  95722.         typedef struct {
  95723.             NMHDR    hdr; 
  95724.             LPSTR    lpszText; 
  95725.             char        szText[80]; 
  95726.             HINSTANCE    hinst; 
  95727.             UINT        uFlags; 
  95728.             LPARAM    lParam;
  95729.         } TOOLTIPTEXTA;"
  95730.  
  95731.     super defineFields.
  95732.     self
  95733.         defineField: #lpszText type: (PointerField type: String) beWriteOnly;
  95734.         defineField: #szText type: (FillerField byteSize: 80);
  95735.         defineField: #hinst type: DWORDField filler;
  95736.         defineField: #uFlags type: DWORDField readOnly;
  95737.         defineField: #lParam type: DWORDField filler
  95738. ! !
  95739.  
  95740. !TOOLTIPTEXTA methodsFor!
  95741.  
  95742. lpszText: anObject
  95743.     "Set the receiver's lpszText field to the value of anObject."
  95744.  
  95745.     bytes dwordAtOffset: 12 put: anObject yourAddress!
  95746.  
  95747. text: aString
  95748.     "Private - Set the receiver's tip text to aN ANSI version of the argument, aString,
  95749.     and answer that.
  95750.     N.B. The answer must be referenced until the TOOLTIPTEXT is no longer required to
  95751.     prevent it being prematurely GC'd."
  95752.  
  95753.     | ansi |
  95754.     ansi := aString asString.
  95755.     self lpszText: ansi.
  95756.     ^ansi!
  95757.  
  95758. uFlags
  95759.     "Answer the receiver's uFlags field as a Smalltalk object."
  95760.  
  95761.     ^(bytes dwordAtOffset: 100)! !
  95762.  
  95763. TOOLTIPTEXTW comment:
  95764. 'TOOLTIPTEXTW is the class of <ExternalStructure> which represent the Windows Common Control structure of the same name.
  95765.  
  95766. TOOLTIPTEXTW accompanies TTN_NEEDTEXTW notifications that are sent by a Toolbar control to its parent when it wishes to determine the Unicode (double-byte character) tool-tip text to be displayed for a toolbar button which the user is hovering over. See the Win32 documentation for further details.'!
  95767. !TOOLTIPTEXTW class methodsFor!
  95768.  
  95769. defineFields
  95770.     "Define the structure template for Win32 TOOLTIPTEXTW structure.
  95771.  
  95772.         TOOLTIPTEXTW compileDefinition.
  95773.  
  95774.         typedef struct {
  95775.             NMHDR    hdr; 
  95776.             LPWSTR    lpszText; 
  95777.             WCHAR    szText[80]; 
  95778.             HINSTANCE    hinst; 
  95779.             UINT        uFlags; 
  95780.             LPARAM    lParma;
  95781.         } TOOLTIPTEXTW;"
  95782.  
  95783.     super defineFields.
  95784.     self
  95785.         defineField: #lpszText type: (PointerField type: UnicodeString) beWriteOnly;
  95786.         defineField: #szText type: (FillerField byteSize: 160);
  95787.         defineField: #hinst type: DWORDField filler;
  95788.         defineField: #uFlags type: DWORDField readOnly;
  95789.         defineField: #lParam type: DWORDField filler! !
  95790.  
  95791. !TOOLTIPTEXTW methodsFor!
  95792.  
  95793. lpszText: anObject
  95794.     "Set the receiver's lpszText field to the value of anObject."
  95795.  
  95796.     bytes dwordAtOffset: 12 put: anObject yourAddress!
  95797.  
  95798. text: aString
  95799.     "Private - Set the receiver's tip text to a Unicode version of the argument, aString,
  95800.     and answer that
  95801.     N.B. The answer must be referenced until the TOOLTIPTEXT is no longer required to
  95802.     prevent it being prematurely GC'd."
  95803.  
  95804.     | unicode |
  95805.     unicode := aString asUnicodeString.
  95806.     self lpszText: unicode.
  95807.     ^unicode!
  95808.  
  95809. uFlags
  95810.     "Answer the receiver's uFlags field as a Smalltalk object."
  95811.  
  95812.     ^(bytes dwordAtOffset: 180)! !
  95813.  
  95814. NMLVCUSTOMDRAW comment:
  95815. 'NMLVCUSTOMDRAW is an <ExternalStructure> class to represent the Win32 structure of the same name.
  95816.  
  95817. NMLVCUSTOMDRAW is sent by <ListView> controls to request custom draw information for the text of individual items (and optionally sub-items). We implement the <customDrawContext> protocol against it in order that it can be passed directly to the views customDrawBlock.'!
  95818. !NMLVCUSTOMDRAW class methodsFor!
  95819.  
  95820. defineFields
  95821.     "Define the structure template for Win32 NMLVCUSTOMDRAW structure.
  95822.         self compileDefinition
  95823.     "
  95824.  
  95825.     super defineFields.
  95826.     self 
  95827.         defineField: #clrText type: DWORDField new;
  95828.         defineField: #clrTextBk type: DWORDField new;
  95829.         defineField: #iSubItem type: SDWORDField readOnly! !
  95830.  
  95831. !NMLVCUSTOMDRAW methodsFor!
  95832.  
  95833. backcolor
  95834.     "Answer the background <Color>."
  95835.  
  95836.     ^ColorRef fromInteger: self clrTextBk!
  95837.  
  95838. backcolor: aColor
  95839.     "Sets the background <Color>.
  95840.     Implementation Note: We must convert to an RGB because a COLORREF is needed."
  95841.  
  95842.     self clrTextBk: aColor asColorRef asParameter!
  95843.  
  95844. clrText
  95845.     "Answer the receiver's clrText field as a Smalltalk object."
  95846.  
  95847.     ^(bytes dwordAtOffset: 48)!
  95848.  
  95849. clrText: anObject
  95850.     "Set the receiver's clrText field to the value of anObject."
  95851.  
  95852.     bytes dwordAtOffset: 48 put: anObject!
  95853.  
  95854. clrTextBk
  95855.     "Answer the receiver's clrTextBk field as a Smalltalk object."
  95856.  
  95857.     ^(bytes dwordAtOffset: 52)!
  95858.  
  95859. clrTextBk: anObject
  95860.     "Set the receiver's clrTextBk field to the value of anObject."
  95861.  
  95862.     bytes dwordAtOffset: 52 put: anObject!
  95863.  
  95864. column
  95865.     "Answer the <ListViewColumn> associated with the sub-item if this is a sub-item
  95866.     draw, otherwise nil."
  95867.  
  95868.     ^column!
  95869.  
  95870. column: aListViewColumn
  95871.     "Private -"
  95872.     column := aListViewColumn!
  95873.  
  95874. forecolor
  95875.     "Answer the foreground text colour."
  95876.  
  95877.     ^ColorRef fromInteger: self clrText!
  95878.  
  95879. forecolor: aColor
  95880.     "Sets the text foreground <Color>."
  95881.  
  95882.     self clrText: aColor asColorRef asParameter!
  95883.  
  95884. iSubItem
  95885.     "Answer the receiver's iSubItem field as a Smalltalk object."
  95886.  
  95887.     ^(bytes sdwordAtOffset: 56)!
  95888.  
  95889. itemHandle
  95890.     "Answer the 'handle' of the receiver's item."
  95891.  
  95892.     ^self dwItemSpec + 1! !
  95893.  
  95894. NMTVCUSTOMDRAW comment:
  95895. 'NMTVCUSTOMDRAW is an <ExternalStructure> class to represent the Win32 structure of the same name.
  95896.  
  95897. NMTVCUSTOMDRAW is sent by <TreeView> controls to request custom draw information for the text of individual nodes. We implement the <customDrawContext> protocol against it in order that it can be passed directly to the views customDrawBlock.'!
  95898. !NMTVCUSTOMDRAW class methodsFor!
  95899.  
  95900. defineFields
  95901.     "Define the structure template for Win32 NMTVCUSTOMDRAW structure.
  95902.         self compileDefinition
  95903.     "
  95904.  
  95905.     super defineFields.
  95906.     self 
  95907.         defineField: #clrText type: DWORDField new;
  95908.         defineField: #clrTextBk type: DWORDField new;
  95909.         defineField: #iLevel type: SDWORDField readOnly! !
  95910.  
  95911. !NMTVCUSTOMDRAW methodsFor!
  95912.  
  95913. backcolor
  95914.     "Answer the background <Color>."
  95915.  
  95916.     ^ColorRef fromInteger: self clrTextBk!
  95917.  
  95918. backcolor: aColor
  95919.     "Sets the background <Color>."
  95920.  
  95921.     self clrTextBk: aColor asColorRef asParameter!
  95922.  
  95923. clrText
  95924.     "Answer the receiver's clrText field as a Smalltalk object."
  95925.  
  95926.     ^(bytes dwordAtOffset: 48)!
  95927.  
  95928. clrText: anObject
  95929.     "Set the receiver's clrText field to the value of anObject."
  95930.  
  95931.     bytes dwordAtOffset: 48 put: anObject!
  95932.  
  95933. clrTextBk
  95934.     "Answer the receiver's clrTextBk field as a Smalltalk object."
  95935.  
  95936.     ^(bytes dwordAtOffset: 52)!
  95937.  
  95938. clrTextBk: anObject
  95939.     "Set the receiver's clrTextBk field to the value of anObject."
  95940.  
  95941.     bytes dwordAtOffset: 52 put: anObject!
  95942.  
  95943. forecolor
  95944.     "Answer the foreground text colour."
  95945.  
  95946.     ^ColorRef fromInteger: self clrText!
  95947.  
  95948. forecolor: aColor
  95949.     "Sets the text foreground <Color>."
  95950.  
  95951.     self clrText: aColor asColorRef asParameter!
  95952.  
  95953. iLevel
  95954.     "Answer the receiver's iLevel field as a Smalltalk object."
  95955.  
  95956.     ^(bytes sdwordAtOffset: 56)!
  95957.  
  95958. itemHandle
  95959.     "Private - Answer the 'handle' of the receiver's node."
  95960.  
  95961.     ^self dwItemSpec! !
  95962.  
  95963. AbsoluteFileLocator comment:
  95964. 'An AbsoluteFileLocator is used to indicate the location of an external file that may be referenced within the image. 
  95965. Instances of this class always locate files by their full absolute path.
  95966.  
  95967. Try the following examples:
  95968.  
  95969. relativePath := FileLocator absolute relativePathTo: SessionManager current imageFileName. "Display It"
  95970. FileLocator absolute localFileSpecFor: relativePath. "Display It"'!
  95971. !AbsoluteFileLocator class methodsFor!
  95972.  
  95973. current
  95974.     "Answer the singleton instance of the receiver"
  95975.  
  95976.     Current isNil ifTrue: [ Current := self new ].
  95977.     ^Current!
  95978.  
  95979. onPreStripImage
  95980.     "Private -  Assist in the image stripping process by clearning down any
  95981.     lazily initialized variables held by the receiver."
  95982.  
  95983.     self uninitialize!
  95984.  
  95985. uninitialize
  95986.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  95987.  
  95988.     Current := nil! !
  95989.  
  95990. !AbsoluteFileLocator methodsFor!
  95991.  
  95992. localFileSpecFor: aStringFilename
  95993.     "Answer a filespec for aStringFilename, which is expected to be an absolute path already."
  95994.  
  95995.     ^aStringFilename
  95996.  
  95997. !
  95998.  
  95999. relativePathTo: aFilename
  96000.     "Answer a minimal <readableString> relative path to the resource with the 
  96001.     specified <readableString> path, which the receiver can map back to a full
  96002.     path via its #localFileSpecFor: method. In this case we need an absolute path."
  96003.  
  96004.     ^File fullPathOf: aFilename
  96005. !
  96006.  
  96007. stbSaveOn: anSTBOutFiler
  96008.     "Save out a binary representation of the receiver to anSTBOutFiler."
  96009.  
  96010.     anSTBOutFiler
  96011.         saveObject: self
  96012.         as: (STBSingletonProxy for: self class using: #current)! !
  96013.  
  96014. ClassLocator comment:
  96015. 'A ClassLocator is used to find a class for an object being read from an external serialized stream (such as STB). The locator first tries to match an exsiting class already in the image and, if this fails, it is then used to indicate the location of an external binary class that may be loaded into the image. To do this, the locator holds the code base where the external BinaryPackage file resides and a key (usually the class name) that can be used to identify a particular class within the package.  The standard ClassLocator is used when the binary package file can be found on a UNC file system.  If the class is part of an applet and is to be located by a URL then a URLClassLocator should be used instead.
  96016.  
  96017. Instance Variables:
  96018.     packageName     <readableString> indicating the name of the package containing the required class.
  96019.     codeBase        <readableString> indicating the base directory from which a BinaryPackage should be loaded.
  96020.     key        <readableString> indicating the name of a class to load from the package.
  96021.  
  96022. Class Variables:
  96023.     ImportedClasses        <WeakLookupTable> holding the imported classes looked up by their full class keys.
  96024.     DefaultFileLocator        <ClassLocator> which is the default locator to use when loading external resource files.
  96025.     ImportedClassesMutex    <Mutex> to use when resolving imported classes.
  96026.     Aliases            <WeakLookupTable> mapping old class names to existing class.
  96027.  
  96028. '!
  96029. !ClassLocator class methodsFor!
  96030.  
  96031. addAlias: aSymbol forClass: aClass
  96032.     "Record the symbolic name, aSymbol, as an alias for the class name, aClass.
  96033.     This is useful where, for example, previously binary filed classes have been renamed, and one
  96034.     does not wish to keep a global variable for that alias. It can be useful to have the global variable
  96035.     as well to permit loading subclasses, but such globals may be removed by the image stripper, so
  96036.     some mechanism is needed to maintain backwards compatibility with old binary files."
  96037.  
  96038.     Aliases at: aSymbol asSymbol put: aClass!
  96039.  
  96040. binaryPackageExtension
  96041.     "Answers the standard file extension String used for binary package files."
  96042.  
  96043.     ^'pak'!
  96044.  
  96045. codeBase: codeBaseString 
  96046.     "Answer an instance of the receiver with a codeBase of codeBaseString and nil key. Such an instance
  96047.     is only useful when it also has a key."
  96048.  
  96049.     ^self codeBase: codeBaseString packageName: nil key: nil!
  96050.  
  96051. codeBase: codeBaseString packageName: packageString
  96052.     "Answer an instance of the receiver with a codeBase of  codeBaseString and nil key. Such an instance
  96053.     is only useful when it also has a key."
  96054.  
  96055.     ^self codeBase: codeBaseString packageName: packageString key: nil!
  96056.  
  96057. codeBase: codeBaseString packageName: packageString key: keyString
  96058.     "Answer an instance of the receiver with a codeBase of  codeBaseString and  keyString class key."
  96059.  
  96060.     ^(super new)
  96061.          codeBase: codeBaseString;
  96062.          packageName: packageString;
  96063.          key: keyString!
  96064.  
  96065. default
  96066.     "Answers an instance of the receiver that can be used to locate external files
  96067.     relative to the current installation directory."
  96068.  
  96069.     ^self new
  96070. !
  96071.  
  96072. importedClasses
  96073.     "Answer the LookupTable of classes that have been imported into this image."
  96074.  
  96075.     ^ImportedClasses!
  96076.  
  96077. importedClassesMutex
  96078.     "Private - Answer the mutex used to provide mutual exclusion to the locateClass
  96079.     method."
  96080.  
  96081.     ^ImportedClassesMutex!
  96082.  
  96083. initialize
  96084.     "Private - Initialize the class variables.
  96085.  
  96086.         self initialize
  96087.     "
  96088.  
  96089.     ImportedClasses := WeakLookupTable new haveWeakValues.
  96090.     ImportedClassesMutex := Mutex new.
  96091.     SessionManager current 
  96092.         when: #sessionStarted
  96093.         send: #onStartup
  96094.         to: self.
  96095.     Aliases := WeakLookupTable new haveWeakValues!
  96096.  
  96097. new
  96098.     "Answer a new, initialized, instance of the receiver."
  96099.  
  96100.     ^super new initialize!
  96101.  
  96102. onStartup
  96103.     "Private - The session has started. Clear down the cached file locators"
  96104.  
  96105.     DefaultFileLocator := nil.
  96106.     InstallationFileLocator := nil.
  96107.     ImportedClasses := WeakLookupTable new haveWeakValues.
  96108. !
  96109.  
  96110. removeAlias: aSymbol
  96111.     "Remove the symbolic name, aSymbol, a previously established class alias.
  96112.     Note that it is not strictly necessary to do this because the Aliases collection
  96113.     is weak, and the alias will disappear if the class is removed."
  96114.  
  96115.     Aliases removeKey: aSymbol asSymbol ifAbsent: []!
  96116.  
  96117. stbConvertFrom: anSTBClassFormat
  96118.     "Convert from earlier version models.
  96119.     1: Added 'packageName' instance variable."
  96120.  
  96121.     ^[:data | | newInst offset |
  96122.         newInst := self basicNew.
  96123.         data keysAndValuesDo: [:i :v | newInst instVarAt: i+1 put: v].
  96124.         newInst]!
  96125.  
  96126. stbVersion
  96127.     "Answer the current binary filer version number for instances of the receiver."
  96128.  
  96129.     ^1!
  96130.  
  96131. uninitialize
  96132.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  96133.  
  96134.     ImportedClasses := ImportedClassesMutex := nil.
  96135.     SessionManager current removeEventsTriggeredFor: self.
  96136.  
  96137. ! !
  96138.  
  96139. !ClassLocator methodsFor!
  96140.  
  96141. classNotSignedHandler
  96142.     "Private - Answer a <monadicValuable> which is to be evaluated if we receive
  96143.     a ClassNotSignedWarning during the import of a foreign class. "
  96144.  
  96145.     "For remote class imports, we pass the warning on"
  96146.     ^[:w | w pass ]!
  96147.  
  96148. codeBase
  96149.     "Answer the receiver's codeBase. This is used to complete a relative key."
  96150.  
  96151.     ^codeBase!
  96152.  
  96153. codeBase: aString
  96154.     "Private - Sets the receiver's codeBase instVar to aString. 
  96155.     This is used to complete a relative key."
  96156.  
  96157.     codeBase := aString.
  96158. !
  96159.  
  96160. copyWithCodeBase
  96161.     "Private - Answer a instance of the same class as the receiver with the same codeBase.
  96162.     This allows both the codeBase and the mechanism for using it to be propagated."
  96163.  
  96164.     ^(self class codeBase: codeBase) packageName: self packageName
  96165. !
  96166.  
  96167. errorClassCircularityDetected
  96168.     "Private - Signal an error indicating there exists a circular class dependency
  96169.     in involving the class identified by the receiver."
  96170.  
  96171.     self error: 'A circular class dependency has been encountered involving class ', key!
  96172.  
  96173. errorClassNotFound
  96174.     "Private - Signal an error indicating that a particular was not found in the image and 
  96175.     could not be dynamically loaded"
  96176.  
  96177.     self error: ('The class %1 could not be found in the image' formatWith:  key)!
  96178.  
  96179. findAvailableClass
  96180.     "Answer the class referred to by the receiver if the class is either resident or a loaded foreign
  96181.     import. If the class referred to by the receiver is a foreign class that has not yet been imported
  96182.     then answer nil."
  96183.  
  96184.     | class |
  96185.     (class := self findResidentClass) isNil
  96186.         ifTrue: [class := ImportedClasses at: self fullClassKey ifAbsent: []].
  96187.     ^class!
  96188.  
  96189. findResidentClass
  96190.     "Private - Answer the class referred to by the receiver if it is
  96191.     fully resident in the image."
  96192.  
  96193.     | className |
  96194.     className := key asSymbol.
  96195.     ^Smalltalk at: className ifAbsent: [Aliases at: className ifAbsent: []]!
  96196.  
  96197. fullClassKey
  96198.     "Answer the full specification of the class identified by the receiver."
  96199.  
  96200.     ^ self codeBase, self key
  96201. !
  96202.  
  96203. fullPackageKey
  96204.     "Answer the full specification of any package identified by the receiver or nil
  96205.     if there is none."
  96206.  
  96207.     ^self hasPackageName ifTrue: [ self codeBase, self packageName ]!
  96208.  
  96209. hasPackageName
  96210.     "Private - Answer true if the receiver has a package name specified"
  96211.  
  96212.     ^self packageName notNil!
  96213.  
  96214. initialize
  96215.     "Private - Initialize the receiver's identity instance variables."
  96216.  
  96217.     codeBase := ''!
  96218.  
  96219. installImportedClass: aClass
  96220.     "Private - Install aClass, an imported class into the system"
  96221.  
  96222.     | classKey |
  96223.     classKey := self codeBase, aClass name asString.
  96224.     ImportedClasses at: classKey ifAbsent: [
  96225.         ImportedClasses at: classKey put: aClass ]
  96226. !
  96227.  
  96228. key
  96229.     "Answer the receiver's key inst var."
  96230.  
  96231.     ^key!
  96232.  
  96233. key: aString
  96234.     "Private - Set the receiver's key inst var to aString."
  96235.  
  96236.     key := aString!
  96237.  
  96238. localFileSpecFor: aStringFilename
  96239.     "Answer a filespec for aStringFilename relative to the current installation
  96240.     directory and codebase."
  96241.  
  96242.     | filename |
  96243.     filename := aStringFilename.
  96244.     self codeBase notNil ifTrue: [
  96245.         filename := File composePath: codeBase subPath: filename ].
  96246.     ^super localFileSpecFor: filename
  96247. !
  96248.  
  96249. localFileSpecForPackage
  96250.     "Private - Answer a local filespec based on the fullPackageKey."
  96251.  
  96252.     ^self localFileSpecFor: self binaryPackageFilename!
  96253.  
  96254. locateClass
  96255.     "Answer the class referred to by the receiver."
  96256.  
  96257.     | class |
  96258.     (class := self findResidentClass) isNil ifTrue: [
  96259.         class := self findOrImportForeignClass ].
  96260.     ^class!
  96261.  
  96262. packageName
  96263.     "Answer the receiver's  package name <readableString>."
  96264.  
  96265.     ^packageName!
  96266.  
  96267. packageName: aString
  96268.     "Private - Set the receiver's package name to aString."
  96269.  
  96270.     packageName := aString!
  96271.  
  96272. printOn: aStream
  96273.     "Append, to aStream, a String whose characters are a description of the receiver as a developer
  96274.     would want to see it."
  96275.  
  96276.     super printOn: aStream.
  96277.     aStream
  96278.         nextPut: $(;
  96279.         print: packageName;
  96280.         nextPutAll: ', ';
  96281.         print: codeBase;
  96282.         nextPutAll: ', ';
  96283.         print: key;
  96284.         nextPut: $)! !
  96285.  
  96286. RelativeFileLocator comment:
  96287. 'RelativeFileLocator is the abstract class of <FileLocator>s that can be used to map between an absolute path and a path relative to a certain base directory.
  96288. RelativeFileLocators use absolute paths for files outside the local directory hierarchy below the base directory, and relative paths within their local directory hierarchy.'!
  96289. !RelativeFileLocator methodsFor!
  96290.  
  96291. relativePathTo: aString 
  96292.     "Answer a minimal <readableString> relative path to the resource with the 
  96293.     specified <readableString> path from the receiver's base path."
  96294.  
  96295.     ^self relativePathIfSubPath: aString! !
  96296.  
  96297. ValidatingClassLocator comment:
  96298. 'A ValidatingClassLocator is an extension to the standard ClassLocator which can be used to validate classes of objects being read from an external serial stream (such as STB).  STB is inherently an insecure format since it can contain any objects, including blocks of code which may be malicious in nature.  By plugging a ValidatingClassLocator into an STBInFiler then one is able to check the classes of objects in the input stream before they are allowed into the image.
  96299.  
  96300. The validation is controlled by a #validationBlock which is passed the symbolic class names of objects being loaded.  The block should return true if the load is to be permitted.  If the block returns false then an STBError exception is signalled.
  96301.  
  96302. Typically, ValidatingClassLocator can be considered a private class only instantiated as part of an STBValidatingInFiler.'!
  96303. !ValidatingClassLocator methodsFor!
  96304.  
  96305. copyWithCodeBase
  96306.     "Private - Answer a instance of the same class as the receiver with the same codeBase.
  96307.     This allows both the codeBase and the mechanism for using it to be propagated."
  96308.  
  96309.     ^super copyWithCodeBase validationBlock: self validationBlock!
  96310.  
  96311. findResidentClass
  96312.     "Private - Answer the class referred to by the receiver if it is fully resident in the image. 
  96313.     First see if the requested class is valid."
  96314.  
  96315.     (self validationBlock value: self key asSymbol) 
  96316.         ifFalse: [STBValidatingInFiler errorInvalidClass: self key].
  96317.     ^super findResidentClass!
  96318.  
  96319. initialize
  96320.     "Private - Initialize the receiver"
  96321.  
  96322.     super initialize.
  96323.     self validationBlock: [:className | true]!
  96324.  
  96325. validationBlock
  96326.     "Answer the monadic valuable (usually a block) that when passed a class name symbol will answer true if objects
  96327.     of this class are valid for loading into the image from the input stream associated with the receiver."
  96328.  
  96329.     ^validationBlock!
  96330.  
  96331. validationBlock: aMonadicValuable 
  96332.     "Set the monadic valuable (usually a block) that when passed a class name symbol will answer true if objects
  96333.     of this class are valid for loading into the image from the input stream associated with the receiver."
  96334.  
  96335.     validationBlock := aMonadicValuable.
  96336. ! !
  96337.  
  96338. FolderRelativeFileLocator comment:
  96339. 'FolderRelativeFileLocator is the class of <FileLocator>s that can be used to map between an absolute path and a path relative to a configurable base directory.
  96340. FolderRelativeFileLocators use absolute paths for files outside the local directory hierarchy below the base directory, and relative paths within their local directory hierarchy.
  96341.  
  96342. Instance Variables:
  96343.     basePath        <String>. Base folder path.
  96344.  
  96345. '!
  96346. !FolderRelativeFileLocator class methodsFor!
  96347.  
  96348. basePath: aString 
  96349.     "Answer a new instance of the receiver for the specified base path."
  96350.  
  96351.     ^(self new)
  96352.         basePath: aString;
  96353.         yourself! !
  96354.  
  96355. !FolderRelativeFileLocator methodsFor!
  96356.  
  96357. basePath
  96358.     ^basePath!
  96359.  
  96360. basePath: aString 
  96361.     basePath := aString! !
  96362.  
  96363. ImageRelativeFileLocator comment:
  96364. 'An ImageRelativeFileLocator is used to indicate the location of an external file that may be referenced within the image. 
  96365. Instances of this class always locate files relative to the image directory, unless the file is outside the local directory hierarchy below the image directory, in which case an absolute path is used.
  96366.  
  96367. Note that the ''image'' directory may dynamically change between image restarts, and in the case of a deployed application the ''image'' directory is the folder in which the executable resides.
  96368.  
  96369. Try the following examples:
  96370.  
  96371. relativePath := FileLocator imageRelative relativePathTo: SessionManager current imageFileName. "Display It - should be ''.\dolphin.img''"
  96372. FileLocator imageRelative localFileSpecFor: relativePath. "Display It - should be the full image path"'!
  96373. !ImageRelativeFileLocator class methodsFor!
  96374.  
  96375. current
  96376.     "Answer the singleton instance of the receiver"
  96377.  
  96378.     Current isNil ifTrue: [ Current := self new ].
  96379.     ^Current!
  96380.  
  96381. onPreStripImage
  96382.     "Private -  Assist in the image stripping process by clearning down any
  96383.     lazily initialized variables held by the receiver."
  96384.  
  96385.     self uninitialize!
  96386.  
  96387. uninitialize
  96388.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  96389.  
  96390.     Current := nil! !
  96391.  
  96392. !ImageRelativeFileLocator methodsFor!
  96393.  
  96394. stbSaveOn: anSTBOutFiler 
  96395.     "Save out a binary representation of the receiver to anSTBOutFiler."
  96396.  
  96397.     anSTBOutFiler saveObject: self
  96398.         as: (STBSingletonProxy for: self class using: #current)! !
  96399.  
  96400. InstallRelativeFileLocator comment:
  96401. 'An ImageRelativeFileLocator is used to indicate the location of an external file that may be referenced within the image. 
  96402. Instances of this class always locate files relative to the image directory, unless the file is outside the local directory hierarchy below the install directory, in which case an absolute path is used.
  96403. '!
  96404. !InstallRelativeFileLocator class methodsFor!
  96405.  
  96406. current
  96407.     "Answer the singleton instance of the receiver"
  96408.  
  96409.     Current isNil ifTrue: [ Current := self new ].
  96410.     ^Current!
  96411.  
  96412. onPreStripImage
  96413.     "Private -  Assist in the image stripping process by clearning down any
  96414.     lazily initialized variables held by the receiver."
  96415.  
  96416.     self uninitialize!
  96417.  
  96418. uninitialize
  96419.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  96420.  
  96421.     Current := nil! !
  96422.  
  96423. !InstallRelativeFileLocator methodsFor!
  96424.  
  96425. basePath
  96426.     ^SessionManager current installationDirectory!
  96427.  
  96428. stbSaveOn: anSTBOutFiler
  96429.     "Save out a binary representation of the receiver to anSTBOutFiler."
  96430.  
  96431.     anSTBOutFiler
  96432.         saveObject: self
  96433.         as: (STBSingletonProxy for: self class using: #current)! !
  96434.  
  96435. PackageFolder comment:
  96436. ''!
  96437. !PackageFolder class methodsFor!
  96438.  
  96439. dolphinRoot
  96440.     "Answer an instance of the receiver representing the current dolphin package hierarchy"
  96441.  
  96442.     ^self pathname: self dolphinRootPathname!
  96443.  
  96444. dolphinRootPathname
  96445.     ^'Object Arts\Dolphin'!
  96446.  
  96447. forPackage: aPackage
  96448.     "Answer an instance of the receiver for the folder of aPackage"
  96449.  
  96450.     ^self pathname: (File splitPathFrom: aPackage packagePathname)! !
  96451.  
  96452. !PackageFolder methodsFor!
  96453.  
  96454. icon
  96455.     "Answer an <Icon> to use when representing the receiver"
  96456.  
  96457.     ^self isDolphinFolder 
  96458.         ifTrue: [Icon fromId: 'DOLPHINPACKAGEFOLDER.ICO']
  96459.         ifFalse: [super icon]!
  96460.  
  96461. isDolphinFolder
  96462.     "Private - Answer true if the receiver represents a Dolphin base system package folder"
  96463.  
  96464.     ^self class dolphinRootPathname, '*' match: self pathname!
  96465.  
  96466. rootName
  96467.     "Private - Answer the name to use for the folder at the root of the current image hierarchy"
  96468.  
  96469.     ^'$'! !
  96470.  
  96471. AcceleratorTable comment:
  96472. ''!
  96473. !AcceleratorTable class methodsFor!
  96474.  
  96475. accelPartFromString: aString
  96476.     "Private - Answer a displayable key name string from the argument, aString.
  96477.     Used to format key names for display on menus, etc."
  96478.  
  96479.     ^(aString first asUppercase asString),
  96480.         (aString copyFrom: 2 to: aString size) asLowercase!
  96481.  
  96482. initialize
  96483.     "Private - Initialize the receiver's class variables.
  96484.  
  96485.     Evaluate me to initialize:
  96486.         AcceleratorTable initialize
  96487.     "
  96488.  
  96489.     Modifiers := LookupTable new.
  96490.     (Array with: VK_CONTROL -> FCONTROL
  96491.         with: VK_SHIFT -> FSHIFT
  96492.         with: VK_MENU -> FALT)
  96493.     do: [:a |
  96494.         Modifiers
  96495.             at: (Keyboard keyNameFromVKey: a key) asUppercase 
  96496.             put: a value].
  96497.     Modifiers shrink.
  96498.  
  96499.     #todo "This probably needs to be re-initialized on startup in case keyboard layout different"!
  96500.  
  96501. keyCode: virtualKey modifiers: modifierMask
  96502.     "Answer an accelerator key code (an <integer> packed with a virtual key code
  96503.     and accelerator modifiers) created from the 9-bit <integer> virtual key code (the high
  96504.     bit is used to mark extended keys), virtualKey, and the modifier flags <integer> (e.g. FALT), 
  96505.     modifierMask."
  96506.  
  96507.     ^(virtualKey bitAnd: 16r1FF) bitOr: (modifierMask bitShift: 9)!
  96508.  
  96509. keyCodeFromString: aString
  96510.     "Answer an accelerator key code (an integer packed with a virtual key code
  96511.     and accelerator modifiers) created from the accelerator key description,
  96512.     aString."
  96513.  
  96514.     | keys |
  96515.     keys := self splitKeyString: aString.
  96516.     keys isEmpty ifTrue: [^0].
  96517.     ^self keyCode: (Keyboard virtualKey: keys last) modifiers: (self keyModifiers: keys)!
  96518.  
  96519. keyModifierNames: anInteger
  96520.     "Answer a <sequencedReadableCollection> of <String>s , being the names of the 
  96521.     virtual key modifiers in the <integer> mask, anInteger."
  96522.  
  96523.     | answer |
  96524.     answer := OrderedCollection new.
  96525.     Modifiers keysAndValuesDo: [:k :v |
  96526.         (anInteger anyMask: v)
  96527.             ifTrue: [answer add: k]].
  96528.     ^answer!
  96529.  
  96530. keyModifiers: anArrayOfKeys
  96531.     "Answer virtual key flags generated from anArrayOfKeys
  96532.         #(['CTRL' ]['SHIFT' ]['ALT' ]<key>)
  96533.         eg #('CTRL' 'SHIFT' 'H') or #('CTRL' 'S')"
  96534.  
  96535.     | virtKey |
  96536.     virtKey := FVIRTKEY.
  96537.     anArrayOfKeys do: [:key |
  96538.         virtKey := virtKey bitOr: (Modifiers at: key asUppercase ifAbsent: [0])].
  96539.     ^virtKey!
  96540.  
  96541. keyName: vkInteger modifiers: maskInteger
  96542.     "Private - Answer an accelerator string constructed for the specified virtual
  96543.     key and modifiers."
  96544.  
  96545.     | keyString keyName |
  96546.     keyString := ''.
  96547.     (self keyModifierNames: maskInteger) do: [:s |
  96548.         keyString := keyString, (self accelPartFromString: s), (String with: self keySeparator)].
  96549.     keyName := Keyboard keyNameFromVKey: (vkInteger maskSet: (maskInteger maskClear: 16rFF)).
  96550.     ^keyString, (self accelPartFromString: keyName)!
  96551.  
  96552. keySeparator
  96553.     "Private - Answer the receivers keySeparator."
  96554.  
  96555.     ^$+!
  96556.  
  96557. keyStringFromCode: keyCode
  96558.     "Private - Answer an accelerator string corresponding to the accelerator
  96559.     key code, keyCode, as described by the current keyboard layout."
  96560.  
  96561.     | split |
  96562.     split := self splitKeyCode: keyCode.
  96563.     ^self keyStringFromCode: split first modifiers: split last!
  96564.  
  96565. keyStringFromCode: vkInteger modifiers: maskInteger
  96566.     "Private - Answer an accelerator string constructed for the specified virtual
  96567.     key and modifiers."
  96568.  
  96569.     | keyString keyName |
  96570.     keyString := ''.
  96571.     (self keyModifierNames: maskInteger) do: [:s |
  96572.         keyString := keyString, (self accelPartFromString: s), (String with: self keySeparator)].
  96573.     keyName := Keyboard keyNameFromVKey: ((vkInteger bitAnd: 16r1FF) maskSet: (maskInteger maskClear: 16rFF))
  96574.                         ifNone: [^keyString].
  96575.     ^keyString, (self accelPartFromString: keyName)!
  96576.  
  96577. splitKeyCode: keyCode
  96578.     "Answer a 2-element <Array> containing a virtual key code <integer>
  96579.     and accelerator table modifier flags <integer> from the <integer> accelerator 
  96580.     key code, keyCode."
  96581.  
  96582.     ^Array
  96583.         with: (keyCode bitAnd: 16r1FF)
  96584.         with: (keyCode bitShift: -9)!
  96585.  
  96586. splitKeyString: aString
  96587.     "Answer an <Array> of <String>s containing the names of the keys specified 
  96588.     in the <readableString> accelerator key description, aString. Note that this
  96589.     must not contain any spaces."
  96590.  
  96591.     ^aString subStrings: self keySeparator! !
  96592.  
  96593. !AcceleratorTable methodsFor!
  96594.  
  96595. accelerators
  96596.     "Answer the collection of accelerators that make the table.
  96597.     Each accelerator is an association between a virtual key code
  96598.     (including modifiers), and a command symbol."
  96599.  
  96600.     ^accelerators!
  96601.  
  96602. addKey: vKeyCode commandDescription: aCommandDescription
  96603.     "Add a new accelerator to the table. The argument, vKeyCode, is an integer
  96604.     with the following bit format:
  96605.         0-8    virtual key code
  96606.         1    extended key bit
  96607.         9-16 accelerator key modifier flags (e.g. FALT)."
  96608.  
  96609.     accelerators := accelerators copyWith: vKeyCode -> aCommandDescription!
  96610.  
  96611. basicFree
  96612.     "Private - Free up the Accelerator resource handle.
  96613.     Ignore any error return (e.g. due to an invalid handle)."
  96614.  
  96615.     UserLibrary default destroyAcceleratorTable: handle!
  96616.  
  96617. createHandle
  96618.     "Private - Realizes the handle for the accelerator table and registers all selectors.
  96619.     This does not usually happen until the first key press occurs in a new shell window."
  96620.  
  96621.     "NB: CreateAcceleratorTable requires a pointer to a variable sized array of ACCEL structures."
  96622.     | accels |
  96623.     accels := StructureArray length: accelerators size elementClass: ACCEL.
  96624.     accels beUnfinalizable.    "Nothing to free here"
  96625.     accels with: accelerators
  96626.         do: 
  96627.             [:struct :accelerator | 
  96628.             | vkey |
  96629.             vkey := accelerator key.
  96630.             struct
  96631.                 fVirt: ((vkey bitShift: -9) bitOr: FVIRTKEY);
  96632.                 key: (vkey bitAnd: 16rFF);
  96633.                 cmd: (CommandDescription idFor: accelerator value)    "Always add virtual key flag, or modifiers ignored"].
  96634.     ^UserLibrary default createAcceleratorTable: accels cEntries: accelerators size!
  96635.  
  96636. includes: commandSymbol
  96637.     "Answer whether there is an entry in the accelerator table for commandSymbol."
  96638.  
  96639.     ^self accelerators anySatisfy: [:each | each value == commandSymbol]!
  96640.  
  96641. initialize
  96642.     "Private - Initialize the receiver."
  96643.  
  96644.     super initialize.
  96645.     accelerators := Array new!
  96646.  
  96647. isEmpty
  96648.     "Answer whether any accelerator keys have been set."
  96649.  
  96650.     ^accelerators isEmpty!
  96651.  
  96652. isPersistent
  96653.     "Private - Answer true if the receiver holds sufficient information such that
  96654.     it can recreate itself when the image is saved and restored. This is also
  96655.     an indication as to whether the receiver can be filed out/in using the STB
  96656.     mechanism. Generally this ability corresponds to a useful implemenation
  96657.     of #basicRealize"
  96658.  
  96659.     ^true!
  96660.  
  96661. keyCodeFor: commandSymbol 
  96662.     "Private - Answer a key code (in the receiver's format, which includes
  96663.     modifiers in the high byte, and the virtual key code in the low byte)
  96664.     for the specified command symbol."
  96665.  
  96666.     | assoc |
  96667.     assoc := self accelerators detect: [:a | a value == commandSymbol].
  96668.     ^assoc key! !
  96669.  
  96670. Brush comment:
  96671. ''!
  96672. !Brush class methodsFor!
  96673.  
  96674. bitmap: aBitmap
  96675.     "Answer a new instance of the receiver based on aBitmap."
  96676.  
  96677.     ^self
  96678.         withStyle: BS_PATTERN
  96679.         color: 0
  96680.         hatch: aBitmap asParameter
  96681. !
  96682.  
  96683. black
  96684.     "Answer the stock black brush."
  96685.  
  96686.     ^StockBrush fromId: BLACK_BRUSH!
  96687.  
  96688. color: aColour
  96689.     "Answer a new instance of the receiver with the specified colour."
  96690.  
  96691.     ^self
  96692.         withStyle: BS_SOLID
  96693.         color: aColour
  96694.         hatch: 0
  96695. !
  96696.  
  96697. dkGray
  96698.     "Answer the stock dark grey Brush."
  96699.  
  96700.     ^StockBrush fromId: DKGRAY_BRUSH!
  96701.  
  96702. fromLogBrush: aLOGBRUSH
  96703.     "Answer a new instance of the receiver containing the given logical brush."
  96704.  
  96705.     ^self new
  96706.         logBrush: aLOGBRUSH;
  96707.         yourself!
  96708.  
  96709. gray
  96710.     "Answer the stock grey brush."
  96711.  
  96712.     ^StockBrush fromId: GRAY_BRUSH!
  96713.  
  96714. hatchedDiagonal
  96715.     "Answer a diagonal hatched instance of the receiver"
  96716.  
  96717.     ^self withStyle: BS_HATCHED color: 0 hatch: HS_BDIAGONAL!
  96718.  
  96719. ltGray
  96720.     "Answer the stock light grey brush."
  96721.  
  96722.     ^StockBrush fromId: LTGRAY_BRUSH!
  96723.  
  96724. transparent
  96725.     "Answer the stock transparent brush."
  96726.  
  96727.     ^StockBrush fromId: NULL_BRUSH!
  96728.  
  96729. white
  96730.     "Answer the stock white brush."
  96731.  
  96732.     ^StockBrush fromId: WHITE_BRUSH!
  96733.  
  96734. withStyle: styleFlags color: aColour hatch: hatchFlags
  96735.     "Answer a new instance of the receiver with the specified style, colour and hatching attributes."
  96736.  
  96737.     ^self fromLogBrush:
  96738.         (LOGBRUSH new
  96739.             style: styleFlags;
  96740.             color: aColour;
  96741.             hatch: hatchFlags;
  96742.             yourself)
  96743. ! !
  96744.  
  96745. !Brush methodsFor!
  96746.  
  96747. createHandle
  96748.     "Private - Answer an external handle to a new brush as described by the logbrush structure."
  96749.  
  96750.     ^GDILibrary default createBrushIndirect: logBrush!
  96751.  
  96752. handle: hBrush
  96753.     "Private - Sets the handle for the receiver and query its logical info."
  96754.  
  96755.     super handle: hBrush.
  96756.     logBrush := LOGBRUSH new.
  96757.     self getData: logBrush!
  96758.  
  96759. isPersistent
  96760.     "Private - Answer true if the receiver holds sufficient information such that
  96761.     it can recreate itself when the image is saved and restored. This is also
  96762.     an indication as to whether the receiver can be filed out/in using the STB
  96763.     mechanism. Generally this ability corresponds to a useful implemenation
  96764.     of #basicRealize."
  96765.  
  96766.     ^true!
  96767.  
  96768. logBrush: aLOGBRUSH
  96769.     "Private - Set the receiver's logical attributes. 
  96770.     This has no affect if the receiver is already realized."
  96771.  
  96772.     logBrush := aLOGBRUSH! !
  96773.  
  96774. Font comment:
  96775. ''!
  96776. !Font class methodsFor!
  96777.  
  96778. choose
  96779.     "Answer an instance of the receiver chosen by the user from the common
  96780.     font dialog."
  96781.  
  96782.     ^FontDialog showModal!
  96783.  
  96784. default
  96785.     "Answers the default font for the system."
  96786.  
  96787.     ^self system
  96788. !
  96789.  
  96790. defaultPointSize
  96791.     "Private - Answer a default point size to use when it is not explicitly specified"
  96792.  
  96793.     ^10!
  96794.  
  96795. fromLogFont: aLOGFONT
  96796.     "Answer a new instance of the receiver with specified logical attributes."
  96797.  
  96798.     ^self new
  96799.         logFont: aLOGFONT;
  96800.         yourself!
  96801.  
  96802. τV(4í⌐='«≤╠:ú0∩└éªùò■█¡σáA╛√╬~d_▄ù*SÖ\Aja]≤┴ \e#F╡yA*╡ú)∙╓    ╗≈▓ÅΓ╞
  96803. ¢qP.t╒ⁿy:½ë∩um╒£aεL╕=ç    ⌡RGI,Θa≥┤0└kRú(ìă▀Ω»}£)ûêâ"O»πPQ»eo╬»2╨÷yΦO;Ç╙│,o╣╬v╓G|╞>▓┘═┘├Æù▐¡°f┐≥╜.jAsh&╘J½;Viτ#ìÿ«TB0Fj╒Å;╤░ ▀¼╡!
  96804.  
  96805. icon
  96806.     "Answers an Icon that can be used to represent this class"
  96807.  
  96808.     ^##(self) defaultIcon!
  96809.  
  96810. name: aString
  96811.     "Answer a new instance of the receiver for fontname aString and a default point size"
  96812.  
  96813.     ^self name: aString pointSize: self defaultPointSize
  96814. !
  96815.  
  96816. name: aString pixelSize: anInteger
  96817.     "Answer a new instance of the receiver for fontname aString, and pixel size anInteger."
  96818.  
  96819.     ^self new
  96820.         name: aString; 
  96821.         pixelSize: anInteger;
  96822.         yourself!
  96823.  
  96824. name: aString pointSize: anInteger
  96825.     "Answer a new instance of the receiver for fontname aString, pointsize anInteger."
  96826.  
  96827.     ^self new
  96828.         name: aString; 
  96829.         pointSize: anInteger;
  96830.         yourself!
  96831.  
  96832. onPreStripImage
  96833.     "Private - The image is about to be stripped. Nil the lazily initialized cursors to allow
  96834.     them to be removed (and also perhaps the ref to the resource library)."
  96835.  
  96836.     self uninitialize!
  96837.  
  96838. publishedAspectsOfInstances
  96839.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  96840.     
  96841.         ^(super publishedAspectsOfInstances)
  96842.             add: (Aspect font: #yourself);
  96843.             yourself!
  96844.  
  96845. reset
  96846.     "Clear down the receiver's lazily initialized class variables."
  96847.  
  96848.     System := nil!
  96849.  
  96850. system
  96851.     "Answer the stock System font."
  96852.  
  96853.     System isNil ifTrue: [System := StockFont fromId: SYSTEM_FONT].
  96854.     ^System!
  96855.  
  96856. uninitialize
  96857.     "Uninitialize the class variables of the receiver as it is about to be removed from the system."
  96858.  
  96859.     System := nil! !
  96860.  
  96861. !Font methodsFor!
  96862.  
  96863. = aFont
  96864.     "Answer true if aFont is equal to (has the same logical font info) as the receiver."
  96865.  
  96866.     ^self species == aFont species and: [logfont = aFont logFont]!
  96867.  
  96868. beBold
  96869.     "Set the receiver's bold attribute."
  96870.  
  96871.     self isBold: true!
  96872.  
  96873. beItalic
  96874.     "Set the receiver's italic attribute."
  96875.  
  96876.     self isItalic: true!
  96877.  
  96878. beUnderlined
  96879.     "Set the receiver's underline attribute."
  96880.  
  96881.     self isUnderlined: true!
  96882.  
  96883. bold
  96884.     "Deprecated - Use #beBold or #isBold:"
  96885.  
  96886.     #deprecated.
  96887.     self beBold!
  96888.  
  96889. characterSet
  96890.     "Answer an <integer> identifying the character set of the receiver."
  96891.  
  96892.     ^logfont lfCharSet!
  96893.  
  96894. characterSet: anInteger
  96895.     "Set the <integer> identifying the character set of the receiver."
  96896.  
  96897.     anInteger = self characterSet ifFalse: [
  96898.         logfont lfCharSet: anInteger.
  96899.         self free]!
  96900.  
  96901. createHandle
  96902.     "Private - Answer an external handle to a new font as described by the logfont structure."
  96903.  
  96904.     ^GDILibrary default createFontIndirect: logfont!
  96905.  
  96906. desktopResolution
  96907.     "Private - Answer the resolution of the active desktop."
  96908.  
  96909.     ^Canvas desktopResolution!
  96910.  
  96911. displayOn: aStream
  96912.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  96913.     would want to see it."
  96914.  
  96915.     self name displayOn: aStream.
  96916.     aStream nextPut: $ .
  96917.     self pointSize displayOn: aStream.
  96918.     aStream nextPutAll: 'pt'.
  96919. !
  96920.  
  96921. handle: hFont
  96922.     "Sets the non-owned handle for the receiver and queries its logical info."
  96923.  
  96924.     super handle: hFont.
  96925.     self getData: logfont!
  96926.  
  96927. hash
  96928.     "Answer the SmallInteger hash value for the receiver."
  96929.  
  96930.     ^logfont hash!
  96931.  
  96932. initialize
  96933.     "Initialise the receiver."
  96934.  
  96935.     super initialize.
  96936.     (logfont := LOGFONT new) lfWeight: FW_NORMAL.
  96937.     resolution := self desktopResolution.!
  96938.  
  96939. isBold
  96940.     "Answer whether the receiver is bold."
  96941.  
  96942.     ^self weight = FW_BOLD!
  96943.  
  96944. isBold: aBoolean
  96945.     "Set the receiver's bold attribute."
  96946.  
  96947.     self weight: (aBoolean ifTrue: [FW_BOLD] ifFalse: [FW_NORMAL])!
  96948.  
  96949. isDefault
  96950.     "Answer true if the receiver is the default font"
  96951.  
  96952.     ^self = Font default!
  96953.  
  96954. isItalic
  96955.     "Answer whether the receiver is itatic."
  96956.  
  96957.     ^logfont lfItalic ~= 0!
  96958.  
  96959. isItalic: aBoolean
  96960.     "Set whether the receiver is an italic typeface."
  96961.  
  96962.     self isItalic == aBoolean ifFalse: [
  96963.         logfont lfItalic: aBoolean asParameter.
  96964.         "Cause the receiver to be re-realized"
  96965.         self free]!
  96966.  
  96967. isPersistent
  96968.     "Private - Answer true if the receiver holds sufficient information such that
  96969.     it can recreate itself when the image is saved and restored. This is also
  96970.     an indication as to whether the receiver can be filed out/in using the STB
  96971.     mechanism. Generally this ability corresponds to a useful implemenation
  96972.     of #basicRealize"
  96973.  
  96974.     ^true!
  96975.  
  96976. isStruckThrough
  96977.     "Answer whether the strike-out effect is set."
  96978.  
  96979.     ^logfont lfStrikeOut ~= 0!
  96980.  
  96981. isStruckThrough: aBoolean
  96982.     "Set the struck out character effect."
  96983.  
  96984.     self isStruckThrough == aBoolean ifFalse: [
  96985.         logfont lfStrikeOut: aBoolean asParameter.
  96986.         "Cause the receiver to be re-realized"
  96987.         self free]!
  96988.  
  96989. isUnderlined
  96990.     "Answer whether the receiver is underlined."
  96991.  
  96992.     ^logfont lfUnderline ~= 0!
  96993.  
  96994. isUnderlined: aBoolean
  96995.     "Reset the receiver's underline attribute."
  96996.  
  96997.     self isUnderlined == aBoolean ifFalse: [
  96998.         logfont lfUnderline: aBoolean asParameter.
  96999.         "Cause the receiver to be re-realized"
  97000.         self free]!
  97001.  
  97002. italic
  97003.     "Deprecated - Use beItalic or isItalic:"
  97004.  
  97005.     #deprecated.
  97006.     self beItalic!
  97007.  
  97008. logFont
  97009.     "Answer the receiver's logical attributes."
  97010.  
  97011.     ^logfont!
  97012.  
  97013. logFont: aLOGFONT
  97014.     "Set the receiver's logical attributes. This has no affect if the receiver is already realized."
  97015.  
  97016.     logfont := aLOGFONT!
  97017.  
  97018. name
  97019.     "Answer the face name of the font."
  97020.  
  97021.     ^logfont lfFaceName trimNulls!
  97022.  
  97023. name: aString
  97024.     "Set the receiver's font name attribute. This has no affect if the receiver is already realized."
  97025.  
  97026.     logfont lfFaceName: aString!
  97027.  
  97028. pixelFromPoints: size
  97029.     "Private - Answers a pixel size from a given point size."
  97030.  
  97031.     ^(size * resolution y / 72) rounded.
  97032. !
  97033.  
  97034. pixelSize
  97035.     "Answers the receiver's pixel size."
  97036.  
  97037.     ^self logFont lfHeight abs!
  97038.  
  97039. pixelSize: anInteger
  97040.     "Set's the receiver's pixel size to anInteger pixels.
  97041.     This has no affect if the receiver is already realized."
  97042.  
  97043.     self logFont lfHeight: anInteger negated!
  97044.  
  97045. pointFromPixels: size
  97046.     "Private - Answers a point size from a given pixel size."
  97047.  
  97048.     ^(size * 72 / resolution y) rounded.
  97049. !
  97050.  
  97051. pointSize
  97052.     "Answers the receiver's point size."
  97053.  
  97054.     ^self pointFromPixels: self logFont lfHeight abs!
  97055.  
  97056. pointSize: anInteger
  97057.     "Convert anInteger to pixels and store in the receiver's logfont lfHeight.
  97058.     This has no affect if the receiver is already realized."
  97059.  
  97060.     self logFont lfHeight: (self pixelFromPoints: anInteger) negated!
  97061.  
  97062. postCopy
  97063.     "Apply any final flourish to the copy that may be required
  97064.     in order to ensure that the copy does not share any state with
  97065.     the original, apart from the elements. Answer the receiver."
  97066.  
  97067.     super postCopy.
  97068.     logfont := logfont copy!
  97069.  
  97070. printOn: aStream
  97071.     "Append, to aStream, a String whose characters are a description of the receiver as a developer
  97072.     would want to see it."
  97073.  
  97074.     aStream
  97075.         basicPrint: self;
  97076.         nextPut: $(; display: self; nextPut: $)!
  97077.  
  97078. resolution
  97079.     "Answer the logical pixels per inch of the receiver"
  97080.  
  97081.     ^resolution!
  97082.  
  97083. resolution: aPoint 
  97084.     "Sets the logical pixels per inch of the receiver"
  97085.  
  97086.     "Check the resolution for the receiver to see if it matches
  97087.     the supplied resolution in aPoint. If not, then the logical font information
  97088.     is rescaled and the receiver's resolution is changed to that in aPoint."
  97089.  
  97090.     resolution = aPoint 
  97091.         ifFalse: 
  97092.             [| oldres |
  97093.             self free.
  97094.             oldres := resolution.
  97095.             
  97096.             [| ptSize |
  97097.             ptSize := self pointSize.
  97098.             resolution := aPoint.
  97099.             self pointSize: ptSize] 
  97100.                     ifCurtailed: [resolution := oldres]]!
  97101.  
  97102. strikeOut
  97103.     "Deprecated - use #isStruckThrough:"
  97104.  
  97105.     #deprecated.
  97106.     self isStruckThrough: true!
  97107.  
  97108. underline
  97109.     "Deprecated - use beUnderlined or #isUnderlined:"
  97110.  
  97111.     #deprecated.
  97112.     self beUnderlined!
  97113.  
  97114. weight
  97115.     "Answer the receiver's <integer> 'weight' (thickness)."
  97116.  
  97117.     ^logfont lfWeight!
  97118.  
  97119. weight: anInteger
  97120.     "Set the receiver's 'weight' (thickness)."
  97121.  
  97122.     self weight = anInteger ifFalse: [
  97123.         logfont lfWeight: anInteger.
  97124.         "Cause the receiver to be re-realized"
  97125.         self free]! !
  97126.  
  97127. Image comment:
  97128. ''!
  97129. !Image class methodsFor!
  97130.  
  97131. fromFile: aFilename
  97132.     "Answer an instance loaded from the file aFilename.
  97133.     Note that aFilename will be converted to an installation relative path. If you want 
  97134.     to access an image at an absolute path, you should set it up using #fromFile:usingLocator:
  97135.     in conjuction with an AbsoluteFileLocator. e.g:
  97136.  
  97137.         ImagePresenter show: 'Basic image' on: 
  97138.             (Bitmap
  97139.                 fromFile: (File composePath: SessionManager current windowsDirectory 
  97140.                             subPath: 'Soap Bubbles.bmp')
  97141.                 usingLocator: FileLocator absolute)
  97142.     "
  97143.  
  97144.     ^self  fromFile: aFilename usingLocator: FileLocator default
  97145. !
  97146.  
  97147. fromFile: aFilename usingLocator: aFileLocator
  97148.     "Answer an instance loaded from the file aFilename by using aFileLocator."
  97149.  
  97150.     | relativeFilename |
  97151.     relativeFilename := aFileLocator isNil 
  97152.                     ifTrue: [aFilename]
  97153.                     ifFalse: [aFileLocator relativePathTo: aFilename].
  97154.     ^(self fromId: relativeFilename in: nil) fileLocator: aFileLocator; yourself.!
  97155.  
  97156. fromId: anIntegerOrStringId
  97157.     "Answer a new instance with a resource Id of anIntegerOrStringId."
  97158.  
  97159.     ^self fromId: anIntegerOrStringId in: SessionManager current defaultResourceLibrary
  97160. !
  97161.  
  97162. fromId: anIntegerOrStringId in: anInstanceHandle
  97163.     "Answer a new instance with a resourceID of anIntegerOrStringId
  97164.     from the application instance anInstanceHandle"
  97165.  
  97166.     ^super new
  97167.         fileLocator: FileLocator default;
  97168.         identifier: anIntegerOrStringId;
  97169.         instanceHandle: anInstanceHandle;
  97170.         yourself
  97171. !
  97172.  
  97173. fromSystemId: anIntegerId
  97174.     "Answer a new instance of the Windows pre-defined icon specified by anIntegerID."
  97175.  
  97176.     ^self fromId: anIntegerId in: 0.
  97177. !
  97178.  
  97179. icon
  97180.     "Answers an Icon that can be used to represent this class"
  97181.  
  97182.     ^##(self) defaultIcon!
  97183.  
  97184. stbConvertFrom: anSTBClassFormat 
  97185.     "Version 3 adds locator instance variable."
  97186.  
  97187.     ^
  97188.     [:data | 
  97189.     | newInstance |
  97190.     newInstance := self basicNew.
  97191.     anSTBClassFormat version < 3 
  97192.         ifTrue: 
  97193.             [1 to: data size
  97194.                 do: 
  97195.                     [:i | 
  97196.                     | offset |
  97197.                     offset := i <= 2 ifTrue: [0] ifFalse: [1].
  97198.                     newInstance instVarAt: i + offset put: (data at: i)].
  97199.             newInstance fileLocator: FileLocator default].
  97200.     newInstance]!
  97201.  
  97202. stbVersion
  97203.     "Answer the current binary filer version number for instances of the receiver."
  97204.  
  97205.     ^3! !
  97206.  
  97207. !Image methodsFor!
  97208.  
  97209. = anObject 
  97210.     "Answer whether the receiver and anObject are equivalent.
  97211.     Two Images loaded by identifier are equal if they are of the same species, and have the same id and 
  97212.     instance handles."
  97213.  
  97214.     ^self == anObject or: 
  97215.             [self species == anObject species and: 
  97216.                     [self identifier isNil 
  97217.                         ifTrue: [handle = anObject basicHandle]
  97218.                         ifFalse: 
  97219.                             [self identifier = anObject identifier 
  97220.                                 and: [self instanceHandle = anObject instanceHandle]]]]!
  97221.  
  97222. addToImageList: aWinImageList mask: aColorOrNil
  97223.     "Private - Add a pictorial representation of the receiver to aWinImageList"
  97224.  
  97225.     ^self subclassResponsibility!
  97226.  
  97227. asSharedCopy
  97228.     "For compatibility with bitmaps."
  97229.  
  97230.     ^self!
  97231.  
  97232. createHandle
  97233.     "Private - Answer an external handle to the image represented by the receiver.
  97234.     Implementation Note: If the image's instance handle (resource module) is not
  97235.     nil, then we first attempt to load from that resource module. If that fails or there
  97236.     is no instance handle, but the id is not an integer then we attempt to load from a file.
  97237.     If we still haven't loaded the image, then we attempt to load it from the default resource 
  97238.     library. If even that fails then the answer will be nil."
  97239.  
  97240.     | spec |
  97241.     instanceHandle notNil 
  97242.         ifTrue: [(self loadFromInstance: instanceHandle) ifNotNil: [:hImage | ^hImage]].
  97243.     spec := self fileSpec.
  97244.     spec isInteger 
  97245.         ifFalse: [(self loadFromFile: spec extent: 0 @ 0) ifNotNil: [:hImage | ^hImage]].
  97246.     ^self loadFromInstance: SessionManager current defaultResourceLibrary!
  97247.  
  97248. drawOn: aCanvas
  97249.     "Draw the receiver to aCanvas at position aPoint (no stretching).
  97250.     Answer whether the operation succeeded."
  97251.  
  97252.     ^self drawOn: aCanvas at: Point zero!
  97253.  
  97254. drawOn: aCanvas at: aPoint
  97255.     "Draw the receiver to aCanvas at position aPoint (no stretching).
  97256.     Answer whether the operation succeeded."
  97257.  
  97258.     ^self drawOn: aCanvas at: aPoint extent: self extent!
  97259.  
  97260. drawOn: aCanvas at: aPoint extent: sizePoint
  97261.     "Draw the receiver on aCanvas at aPoint with size sizePoint."
  97262.  
  97263.     ^self subclassResponsibility
  97264.  
  97265. !
  97266.  
  97267. extent
  97268.     "Answers the dimensions of the receiver in pixels"
  97269.  
  97270.     ^self subclassResponsibility!
  97271.  
  97272. fileLocator
  97273.     "Answer the file locator for the receiver."
  97274.  
  97275.     ^fileLocator!
  97276.  
  97277. fileLocator: aClassLocator
  97278.     "Set the file locator of the receiver. This is used to determine how the image data will
  97279.     be located if it is to loaded from a file."
  97280.  
  97281.     fileLocator := aClassLocator!
  97282.  
  97283. fileSpec
  97284.     "Private - Answers the specifier to use when loading the receiver from a file"
  97285.  
  97286.     | id |
  97287.     ^((id := self identifier) isInteger or: [self fileLocator isNil])
  97288.         ifTrue: [id]
  97289.         ifFalse: [self fileLocator localFileSpecFor: id]
  97290. !
  97291.  
  97292. freeDC
  97293.     "Private - Free the receiver's cached memory DC, if any."
  97294.  
  97295.     !
  97296.  
  97297. fullIdentifier
  97298.     "Private - Answer the full identifier of the receiver. This is an Association containing
  97299.     the ExternalResourceLibrary as its key and the standard identifier as its
  97300.     value."
  97301.  
  97302.     ^self instanceHandle -> self identifier
  97303.  
  97304.         !
  97305.  
  97306. hash
  97307.     "Answer the hash of the identifier. Although #= is implemented to compare
  97308.     both identifer and instanceHandles we don't need to take account of the latter
  97309.     here since it is only necessary that equal objects have the same hash value not
  97310.     vice versa."
  97311.  
  97312.     ^self identifier hash!
  97313.  
  97314. hotspot
  97315.     "Answer a Point specifying the receiver's hot spot (only really relevant for cursors)."
  97316.  
  97317.     ^0@0
  97318. !
  97319.  
  97320. identifier
  97321.     "Answer the identifier of the receiver."
  97322.  
  97323.     ^identifier
  97324.  
  97325.         !
  97326.  
  97327. identifier: id
  97328.     "Set the identifier of the receiver. This can be a string or an integer."
  97329.  
  97330.     identifier := id.
  97331.         !
  97332.  
  97333. imageType
  97334.     "Private - Answer the Win32 image type for the receiver."
  97335.  
  97336.     ^self subclassResponsibility!
  97337.  
  97338. instanceHandle
  97339.     "Answers the instance handle for the receiver"
  97340.  
  97341.     ^instanceHandle!
  97342.  
  97343. instanceHandle: aHandle
  97344.     "Sets the instance handle for the receiver. This is used to indicate
  97345.     the DLL or executable from which the icon will be loaded when it is realized.
  97346.     If the instance handle is nil then it will be assumed that the icon should
  97347.     be loaded from a file."
  97348.  
  97349.     instanceHandle := aHandle.        !
  97350.  
  97351. isPersistent
  97352.     "Private - Answer true if the receiver holds sufficient information such that
  97353.     it can recreate itself when the image is saved and restored. This is also
  97354.     an indication as to whether the receiver can be filed out/in using the STB
  97355.     mechanism. Generally this ability corresponds to a useful implemenation
  97356.     of #basicRealize"
  97357.  
  97358.     ^true!
  97359.  
  97360. isShared
  97361.     "Private - Answer true if the receiver is in the shared cache.
  97362.     Shared images must be copied if they will be modified in any way."
  97363.  
  97364.     ^false!
  97365.  
  97366. loadFromFile: pathString extent: aPoint
  97367.     "Private - Attempts to load an image of the receivers type from a disk file.
  97368.     Answers the image's handle, or nil if the image could not be loaded."
  97369.  
  97370.     ^UserLibrary default 
  97371.         loadImage: 0
  97372.         lpszName: pathString asParameter
  97373.         uType: self imageType
  97374.         cxDesired: aPoint x
  97375.         cyDesired: aPoint y
  97376.         fuLoad: ##(LR_LOADFROMFILE | LR_COLOR)!
  97377.  
  97378. loadFromInstance: hModule
  97379.     "Private - Attempts to load the receiver as a resource from an instance.
  97380.     Answers nil if the load failed, or the image handle if successful."
  97381.  
  97382.     ^nil!
  97383.  
  97384. printOn: aStream
  97385.     "Append the ASCII representation of the receiver to aStream."
  97386.  
  97387.     self identifier 
  97388.         ifNil: [self basicPrintOn: aStream]
  97389.         ifNotNil: 
  97390.             [:id | 
  97391.             instanceHandle isNil 
  97392.                 ifTrue: 
  97393.                     [aStream
  97394.                         print: self class;
  97395.                         space;
  97396.                         nextPutAll: #fromFile:;
  97397.                         space;
  97398.                         print: id]
  97399.                 ifFalse: 
  97400.                     [aStream
  97401.                         print: self class;
  97402.                         space;
  97403.                         nextPutAll: #fromId:;
  97404.                         space;
  97405.                         print: id]]! !
  97406.  
  97407. Menu comment:
  97408. ''!
  97409. !Menu class methodsFor!
  97410.  
  97411. defaultNameForText: text
  97412.     "Private - Answer a symbolic name suggestion for a Menu with the <readableString> 
  97413.     caption, text."
  97414.  
  97415.     ^Compiler identifierFrom: text
  97416. !
  97417.  
  97418. description: text
  97419.     "Answer a new instance of the receiver with the specified menu text."
  97420.  
  97421.     ^self new
  97422.         text: text;
  97423.         yourself!
  97424.  
  97425. fromStrings: strings
  97426.     "Answer a new menu built from strings.
  97427.     strings is an array of arrays or nil if no menu is required.
  97428.  
  97429.     The first string is the title of the menu.
  97430.  
  97431.     After the first entry each string represent a menu item and
  97432.     can be in one of the following forms:
  97433.         (1)    '<title>/[keyString]/<command>'
  97434.     Menu Item with title as the text. This may include an & preceeding an Alt
  97435.     mnemonic. KeyString, if included, represents an accelerator key attached to this
  97436.     menu item, this is of the form [Ctrl+][Shift+]<key>, where key is a single character
  97437.     or a special key such as: Ins, Home, Del, etc. Command is processed if
  97438.     the menu item is chosen.
  97439.         (2)    '-'
  97440.     Separator menu item.
  97441.         (3)    '|'
  97442.     Menu break item.
  97443.         (4)    '||'
  97444.     Menu bar break item.
  97445.     Example: 
  97446.         Menu fromStrings: #('&File' 'Open//fileOpen' '-' '&Save/Ctrl+S/fileSave')
  97447.     "
  97448.  
  97449.     ^self new
  97450.         fromStrings: strings;
  97451.         yourself!
  97452.  
  97453. icon
  97454.     "Answers an Icon that can be used to represent this class"
  97455.  
  97456.     ^##(self) defaultIcon!
  97457.  
  97458. publishedAspectsOfInstances
  97459.     "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  97460.  
  97461.     "Note that the #items aspect must be immutable because the #items method answers an
  97462.     OrderedCollection which is a copy of the actual items Array."
  97463.  
  97464.     ^(super publishedAspectsOfInstances)
  97465.         add: (Aspect string: #text);
  97466.         add: (Aspect sequenceableCollection: #items
  97467.                     addEvaluationFrom: #('Menu new' 'CommandMenuItem new' 'DividerMenuItem separator' 'DividerMenuItem barBreak' 'DividerMenuItem break')) 
  97468.                         beImmutable;
  97469.         add: (Aspect string: #name);
  97470.         yourself!
  97471.  
  97472. stbConvertFrom: anSTBClassFormat
  97473.     "Convert from earlier Menu versions."
  97474.  
  97475.     ^[:data |
  97476.             self basicNew
  97477.                 instVarAt: 1 put: (data at: 1);
  97478.                 instVarAt: 2 put: (data at: 2);
  97479.                 items: (data at: 3);
  97480.                 text: (data at: 4);
  97481.                 yourself]
  97482.  
  97483. !
  97484.  
  97485. stbVersion
  97486.     "Answer the current binary filer version number for instances of the receiver."
  97487.  
  97488.     ^2!
  97489.  
  97490. text: textString fromStrings: strings
  97491.     "Answer a new menu built from strings."
  97492.  
  97493.     ^self fromStrings: (Array with: textString), strings! !
  97494.  
  97495. !Menu methodsFor!
  97496.  
  97497. acceleratorKey
  97498.     "Private - Answer the accelerator key code for the receiver.
  97499.     Menus have none, of course, but this is part of a composite
  97500.     pattern with MenuItem."
  97501.  
  97502.     ^0!
  97503.  
  97504. addCommand: command description: aString 
  97505.     "Append a <CommandMenuItem> to the receiver configured with the specified command
  97506.     and description, and answer it."
  97507.  
  97508.     ^self addItem: (CommandMenuItem command: command description: aString)!
  97509.  
  97510. addCommand: command description: aString  image: anImage
  97511.     "Append a <CommandMenuItem> to the receiver configured with the specified command
  97512.     and description, and answer it."
  97513.  
  97514.     ^self addItem: (CommandMenuItem command: command description: aString image: anImage)!
  97515.  
  97516. addCommandDescription: aCommandDescription
  97517.     "Append a <CommandMenuItem> to the receiver configured with the specified 
  97518.     <commandDescription>, and answer it."
  97519.  
  97520.     ^self addItem: (CommandMenuItem commandDescription: aCommandDescription)!
  97521.  
  97522. addItem: aMenuItem
  97523.     "Add aMenuItem as the last item of the receiver. Answer the newly added item."
  97524.  
  97525.     items := items copyWith: aMenuItem.
  97526.     self insertIntoMenu: aMenuItem at: items size+1.
  97527.     ^aMenuItem!
  97528.  
  97529. addSeparator
  97530.     "Add standard separator as the last item of the receiver.
  97531.     Answer that separator."
  97532.  
  97533.     ^self addItem: DividerMenuItem separator!
  97534.  
  97535. addSubmenu: aString 
  97536.     "Append a sub-<Menu> to the receiver with the specified title, and answer it."
  97537.  
  97538.     ^self addItem: (Menu description: aString)!
  97539.  
  97540. at: anIntegerIndex
  97541.     Notification deprecated.
  97542.     ^self itemAt: anIntegerIndex!
  97543.  
  97544. at: anIntegerIndex put: aMenuItem
  97545.     Notification deprecated.
  97546.     ^self itemAt: anIntegerIndex put: aMenuItem!
  97547.  
  97548. basicFree
  97549.     "Private - Free the Menu resource handle and all submenus."
  97550.  
  97551.     | lib |
  97552.     lib := UserLibrary default.
  97553.     items keysAndValuesDo: [:i :menuItem | | bSuccess |
  97554.         "Detach the menu from the receiver before recursively freeing it - N.B. does not destroy"
  97555.         bSuccess := lib removeMenu: handle uPosition: i-1 uFlags: MF_BYPOSITION.
  97556.         menuItem free].
  97557.     lib destroyMenu: handle!
  97558.  
  97559. basicRealize
  97560.     "Private - Realizes the handle for the context menu and all connected submenus."
  97561.  
  97562.     | info |
  97563.     super basicRealize.
  97564.     info := MENUITEMINFOA new.
  97565.     items keysAndValuesDo: [:i :menuItem | menuItem insertIntoMenu: self at: i info: info]!
  97566.  
  97567. bitmap
  97568.     "Answer the <Bitmap> image associated with this <menuItem>, or nil if none."
  97569.  
  97570.     ^nil!
  97571.  
  97572. clear
  97573.     "Delete all the receiver's sub-items."
  97574.  
  97575.     self isRealized ifTrue: [items size to: 1 by: -1 do: [:i | self deleteItemAt: i]].
  97576.     items := Array new!
  97577.  
  97578. command
  97579.     "Private - Answer the command selector for the receiver.
  97580.     Strictly speaking this is not a command, but it is useful  as part of a composite
  97581.     pattern with MenuItem (in fact as part of the <commandDescription> protocol)
  97582.     which enables us use the normal command querying process for routing, enabling,
  97583.     etc, of pop-up menus, as well as individual items."
  97584.  
  97585.     ^self name!
  97586.  
  97587. commandDescription
  97588.     "Answer a <CommandDescription> for the receiver.
  97589.     See #command."
  97590.  
  97591.     ^CommandDescription command: self command description: self description!
  97592.  
  97593. composerViewClass
  97594.         "Private - Answer the class of view used for displaying the receiver."
  97595.     
  97596.         ^ContextMenuComposerView!
  97597.  
  97598. createHandle
  97599.     "Private - Answer an external handle to a new popup menu."
  97600.  
  97601.     ^UserLibrary default createPopupMenu!
  97602.  
  97603. deleteItemAt: position
  97604.     "Private - Delete the receiver's item at the specified one-based index."
  97605.     
  97606.     (items at: position) free.
  97607.     (UserLibrary default deleteMenu: self handle uPosition: position-1 uFlags: MF_BYPOSITION)
  97608.         ifFalse: [UserLibrary default systemError]
  97609. !
  97610.  
  97611. description
  97612.     "Private - Answer a short textual description of the receiver's command.
  97613.     See also #command."
  97614.  
  97615.     ^self text!
  97616.  
  97617. edit
  97618.         "Private - Edit the receiver in a dialog box."
  97619.     
  97620.         (MenuDialog createOn: self) showModal!
  97621.  
  97622. find: aString
  97623.     "Answer the <MenuItem> whose text matches the <readableString> argument.
  97624.     Any & characters in the MenuItems are ignored for the comparison."
  97625.  
  97626.     ^self find: aString ifAbsent: [self errorNotFound: aString]!
  97627.  
  97628. find: aString ifAbsent: exceptionHandler
  97629.     "Answer the MenuItem whose text matches the <readableString> argument, or the 
  97630.     result of evaluating the <niladicValuable>, exceptionHandler, if there is no matching
  97631.     item. Any & characters in the MenuItems are ignored for the comparison."
  97632.  
  97633.     ^items detect: [:aMenuItem | (aMenuItem text copyWithout: $&) = aString]
  97634.         ifNone: exceptionHandler!
  97635.  
  97636. fromStrings: menuArray 
  97637.     "Private - Convert menuArray into a series of MenuItems.
  97638.     menuArray is an array of strings. 
  97639.     NB: Not realized yet."
  97640.  
  97641.     self text: (menuArray at: 1 ifAbsent: [^self]).
  97642.     menuArray 
  97643.         from: 2
  97644.         to: menuArray size
  97645.         do: 
  97646.             [:menuString | 
  97647.             self addItem: ((menuString isMemberOf: Array) 
  97648.                         ifTrue: [self class fromStrings: menuString]
  97649.                         ifFalse: [MenuItem fromString: menuString])]!
  97650.  
  97651. hasSubmenu
  97652.     "Private - Answer whether the receiver has a submenu connected to it."
  97653.  
  97654.     ^true!
  97655.  
  97656. height
  97657.     "Private - Answer the height of a menu item as currently configured."
  97658.  
  97659.     ^NONCLIENTMETRICS current iMenuHeight!
  97660.  
  97661. id
  97662.     "Private - Answers the menu item identifier for the receiver.
  97663.     This is part of the <menuItem> protocol, and only really implemented by the receiver
  97664.     to provide for complete polymorphism (via that protocol) between <MenuItem>s and
  97665.     <Menu>s, which significantly simplifies the task of managing menus containing
  97666.      a mix of commands and sub-menus."
  97667.  
  97668.     ^0!
  97669.  
  97670. indexOfCommand: target
  97671.     "Private - Answer the index of the first <MenuItem> in the receiver
  97672.     whose command symbol matches the <Command>, target."
  97673.  
  97674.     ^self indexOfCommand: target 
  97675.         ifAbsent: [self errorNotFound: target]!
  97676.  
  97677. indexOfCommand: target ifAbsent: exceptionHandler
  97678.     "Private - Answer the index of the first <MenuItem> within the receiver whose command 
  97679.     matches the <Command>, target, or if not present the result of evaluating the 
  97680.     <niladicValuable>, exceptionHandler."
  97681.  
  97682.     | index |
  97683.     index := items findFirst: [:item | item command = target].
  97684.     ^index == 0
  97685.         ifTrue: [exceptionHandler value]
  97686.         ifFalse: [index]!
  97687.  
  97688. initialize
  97689.     "Private - Initialize the state of the receiver."
  97690.  
  97691.     super initialize.
  97692.     items := Array new.
  97693.     text := String new.!
  97694.  
  97695. insertIntoMenu: aMenuItem at: anInteger
  97696.     self isRealized 
  97697.         ifTrue: 
  97698.             [aMenuItem 
  97699.                 insertIntoMenu: self
  97700.                 at: anInteger - 1
  97701.                 info: MENUITEMINFOA new]!
  97702.  
  97703. insertIntoMenu: parentMenu at: position info: aMENUITEMINFO
  97704.     "Append the receiver to the <Menu>, parentMenu, which can be nil if this is to be a 
  97705.     top-level menu."
  97706.  
  97707.     | hParent hMenu |
  97708.     hParent := parentMenu asParameter.
  97709.     hMenu := self handle.
  97710.     hParent isNull 
  97711.         ifFalse: 
  97712.             [aMENUITEMINFO subMenu: hMenu text: self text.
  97713.             (UserLibrary default 
  97714.                 insertMenuItem: hParent
  97715.                 uItem: position
  97716.                 fByPosition: true
  97717.                 lpmii: aMENUITEMINFO) 
  97718.                     ifFalse: 
  97719.                         [Win32Error signal: 'Unable to realize ' , self printString , ' in ' 
  97720.                                     , parentMenu printString]]!
  97721.  
  97722. insertItem: item after: predecessor
  97723.     "Append the <MenuItem>, item,  to this menu after the <Command>, predecessor.
  97724.     Answer item."
  97725.  
  97726.     ^self insertItem: item at: (self indexOfCommand: predecessor)+1!
  97727.  
  97728. insertItem: aMenuItem at: anInteger 
  97729.     "Insert the <MenuItem> into this menu at the <integer>
  97730.     position, shuffling any items currently at that index or
  97731.     below down one position."
  97732.  
  97733.     | newSize oldItems |
  97734.     oldItems := items.
  97735.     newSize := items size + 1.
  97736.     items := items copyEmpty: newSize.
  97737.     items
  97738.         replaceFrom: 1
  97739.             to: anInteger - 1
  97740.             with: oldItems
  97741.             startingAt: 1;
  97742.         at: anInteger put: aMenuItem;
  97743.         replaceFrom: anInteger + 1
  97744.             to: newSize
  97745.             with: oldItems
  97746.             startingAt: anInteger.
  97747.     self insertIntoMenu: aMenuItem at: anInteger.
  97748.     ^aMenuItem!
  97749.  
  97750. insertItem: aMenuItem before: successor
  97751.     "Append aMenuItem to this menu before the <Command>, successor.
  97752.     Answer aMenuItem."
  97753.  
  97754.     ^self insertItem: aMenuItem at: (self indexOfCommand: successor)!
  97755.  
  97756. isDefault
  97757.     "Answer whether the receiver is expecting to be the default item on a menu."
  97758.  
  97759.     ^false!
  97760.  
  97761. isDivider
  97762.     "Answer whether the receiver is a visual divider as opposed to a command item, 
  97763.     popup menu, or menu bar."
  97764.  
  97765.     ^false!
  97766.  
  97767. isEmpty
  97768.     "Answer whether the has any items."
  97769.  
  97770.     ^items isEmpty!
  97771.  
  97772. isMenuBar
  97773.     "Private - Answer whether the receiver is a menu bar rather
  97774.     than a popup menu."
  97775.  
  97776.     ^false!
  97777.  
  97778. isPersistent
  97779.     "Private - Answer true if the receiver holds sufficient information such that
  97780.     it can recreate itself when the image is saved and restored. This is also
  97781.     an indication as to whether the receiver can be filed out/in using the STB
  97782.     mechanism. Generally this ability corresponds to a useful implemenation
  97783.     of #basicRealize"
  97784.  
  97785.     ^true!
  97786.  
  97787. itemAt: anInteger
  97788.     "Answer the <MenuItem> at the specified <integer> index in the receiver."
  97789.  
  97790.     ^items at: anInteger!
  97791.  
  97792. itemAt: anInteger put: aMenuItem 
  97793.     "Set the <MenuItem> at the specified <integer> index in the receiver."
  97794.  
  97795.     ^items at: anInteger put: aMenuItem!
  97796.  
  97797. items
  97798.     "Answer an <OrderedCollection> of <MenuItem>s which are available from this menu.
  97799.     Note: We answer as an OrderedCollection for backwards compatibility and ease of
  97800.     external manipulation, even though the items are stored internally as an Array."
  97801.  
  97802.     ^items asOrderedCollection!
  97803.  
  97804. items: collection
  97805.     "Sets the collection of <MenuItem>s which are available from this menu
  97806.     to the Array representation of the <sequencedReadableCollection> argument."
  97807.  
  97808.     items := collection asArray!
  97809.  
  97810. menuFromHandle: menuHandle 
  97811.     "Return the Menu associated with this handle."
  97812.  
  97813.     handle = menuHandle 
  97814.         ifTrue: [^self]
  97815.         ifFalse: 
  97816.             [items do: 
  97817.                     [:item | 
  97818.                     | found |
  97819.                     found := item menuFromHandle: menuHandle.
  97820.                     found notNil ifTrue: [^found]]].
  97821.     ^nil!
  97822.  
  97823. name
  97824.     "Private - Answer the symbolic name of the receiver. The name is useful if the
  97825.     receiver is a dynamic menu whose contents are to be adjusted at run-time, or
  97826.     for which the application wishes to control the enablement state.
  97827.     This can be nil if the receiver is un-named, which is the default."
  97828.  
  97829.     ^name!
  97830.  
  97831. name: id
  97832.     "Private - Set the value of the receiver's 'name' instance variable to the argument, anObject."
  97833.  
  97834.     name := (id isNil or: [id isEmpty]) ifFalse: [id asSymbol]!
  97835.  
  97836. notEmpty
  97837.     ^self isEmpty not!
  97838.  
  97839. postCopy
  97840.     "Apply any final flourish to the copy that may be required."
  97841.  
  97842.     super postCopy.
  97843.     items := items collect: [:each | each copy]!
  97844.  
  97845. printOn: aStream
  97846.     "Append, to aStream, a String whose characters are a description of the receiver as a developer
  97847.     would want to see it."
  97848.  
  97849.     aStream
  97850.         basicPrint: self;
  97851.         nextPut: $(; display: self text; nextPut: $)!
  97852.  
  97853. queryAllAlong: route 
  97854.     "Private - Query the command status for the receiver and each of its command items
  97855.     and immediate sub-menus using the <commandPolicy>, route. The checked/enabled/default
  97856.     status of each item is updated to reflect the command status (as determined by the 
  97857.     <commandTarget>s on the route) at this time. If the receiver is itself named, then it
  97858.     is possible for the command targets to enable/disable the receiver. If enabled the command 
  97859.     target which indicated its willingness to handle the command is sent an #onAboutToDisplayMenu: 
  97860.     message to give it the opportunity to dynamically set or update the menu items. 
  97861.     Only after the set of items on the menu has been determined are those items themselves 
  97862.     routed around to determine their status, and to allow the text to be updated."
  97863.  
  97864.     | query itemInfo |
  97865.     query := self queryAlong: route.
  97866.     query isEnabled ifTrue: [query receiver onAboutToDisplayMenu: self].
  97867.     itemInfo := MENUITEMINFOA new.
  97868.     items keysAndValuesDo: 
  97869.             [:i :menuItem | 
  97870.             query := menuItem queryAlong: route.
  97871.             "Set the checked and enabled states, update the text (if desired), etc"
  97872.             itemInfo 
  97873.                 menuItem: menuItem
  97874.                 text: query text
  97875.                 state: ((query isChecked ifTrue: [MFS_CHECKED] ifFalse: [MFS_UNCHECKED]) 
  97876.                         | (query isEnabled ifTrue: [MFS_ENABLED] ifFalse: [MFS_DISABLED])) 
  97877.                             | (query isDefault ifTrue: [MFS_DEFAULT] ifFalse: [0]).
  97878.             self setItem: i info: itemInfo]!
  97879.  
  97880. queryAllFromView: aView
  97881.     "Private - Query each menu item along a route from the <View>, aView."
  97882.  
  97883.     ^self queryAllAlong: aView presenter commandPolicy.
  97884. !
  97885.  
  97886. queryAlong: route
  97887.     "Answer a <CommandQuery> reflecting the current state of the 
  97888.     receiver's command for the <commandPolicy>, route."
  97889.  
  97890.     ^route query: self commandDescription!
  97891.  
  97892. registerAcceleratorKeyIn: anAcceleratorTable
  97893.     "Register any keys associated with our menu items, and any submenus."
  97894.  
  97895.     items do: [:aMenuItem |
  97896.         aMenuItem registerAcceleratorKeyIn: anAcceleratorTable]!
  97897.  
  97898. removeItem: item
  97899.     "Remove the specified <MenuItem> from the receiver."
  97900.  
  97901.     ^self removeItemAt: (items indexOf: item ifAbsent: [self errorNotFound: item])!
  97902.  
  97903. removeItemAt: index
  97904.     "Remove the menu item at the specified <integer> index.
  97905.     Answer the removed item."
  97906.  
  97907.     | removed |
  97908.     removed := items at: index.
  97909.     items := (items copyFrom: 1 to: index - 1), (items copyFrom: index + 1).
  97910.     self isRealized ifTrue: [
  97911.         (UserLibrary default removeMenu: self handle uPosition: index-1 uFlags: MF_BYPOSITION)
  97912.             ifFalse: [UserLibrary default systemError]].
  97913.     ^removed!
  97914.  
  97915. setDefault: index
  97916.     "Set the item of the receiver with the specified 1-based <integer> index
  97917.     to be the default item. If the index is zero, then the menu has no default."
  97918.  
  97919.     UserLibrary default
  97920.         setMenuDefaultItem: self handle uItem: index - 1
  97921.         fByPos: TRUE!
  97922.  
  97923. setItem: index info: aMENUITEMINFO
  97924.     "Private - Set state and type information for the item of the receiver with <integer> index, i.
  97925.     This can control features such as whether the item is enabled or disabled, checked or unchecked
  97926.     (and if checked whether check-box or radio button style), command string, bitmap, etc.
  97927.     Answer whether the call succeeded."
  97928.  
  97929.     ^UserLibrary default
  97930.         setMenuItemInfo: handle 
  97931.             uItem: index - 1
  97932.             fByPosition: true
  97933.             lpmii: aMENUITEMINFO!
  97934.  
  97935. showIn: aView position: aPos
  97936.     "Show top level of context menu on screen at position aPos."
  97937.  
  97938.     ^UserLibrary default
  97939.         trackPopupMenu: self asParameter
  97940.         uFlags: ##(TPM_LEFTALIGN | TPM_RIGHTBUTTON)
  97941.         x: aPos x
  97942.         y: aPos y
  97943.         nReserved: 0
  97944.         hWnd: aView asParameter
  97945.         prcRect: nil!
  97946.  
  97947. size
  97948.     "Answer the number of items (including separators) in the menu."
  97949.  
  97950.     ^items size!
  97951.  
  97952. styleFlags
  97953.     "Private - Answer the MENUITEMINFO style flags of the receiver (see
  97954.     Win32 SDK docs for fType field)."
  97955.  
  97956.     ^0!
  97957.  
  97958. text
  97959.     "Answer the title of the Menu, used for menu items with this as a submenu."
  97960.  
  97961.     ^text!
  97962.  
  97963. text: textString
  97964.     "Set the title of the Menu to textString."
  97965.  
  97966.     text := textString    !
  97967.  
  97968. typeFlags
  97969.     "Private - Answer the MENUITEMINFO style flags of the receiver (see
  97970.     Win32 SDK docs for fType field)."
  97971.  
  97972.     ^0!
  97973.  
  97974. updateItem: index id: id text: newText
  97975.     "Private - Update the text of the menu item with the 1-based <integer> position, index, 
  97976.     within the receiver to the <readableString>, newText."
  97977.  
  97978.     UserLibrary default 
  97979.         modifyMenu: self handle 
  97980.         uPosition: index - 1
  97981.         uFlags: ##(MF_BYPOSITION | MFT_STRING)
  97982.         uIDNewItem: id
  97983.         lpNewItem: newText! !
  97984.  
  97985. Pen comment:
  97986. ''!
  97987. !Pen class methodsFor!
  97988.  
  97989. black
  97990.     "Answer the stock black pen."
  97991.  
  97992.     ^StockPen fromId: BLACK_PEN!
  97993.  
  97994. blue
  97995.     "Answer a blue pen."
  97996.  
  97997.     ^self color: Color blue!
  97998.  
  97999. color: aColour
  98000.     "Answer a new instance of the receiver with the specified colour."
  98001.     
  98002.     ^self
  98003.         withStyle: PS_SOLID
  98004.         width: 1
  98005.         color: aColour.
  98006. !
  98007.  
  98008. fromLogPen: aLOGPEN
  98009.     "Answer a new instance of the receiver containing the given logical pen."
  98010.  
  98011.     ^self new
  98012.         logPen: aLOGPEN;
  98013.         yourself
  98014. !
  98015.  
  98016. green
  98017.     "Answer a green pen."
  98018.  
  98019.     ^self color: Color green
  98020. !
  98021.  
  98022. publishedAspectsOfInstances
  98023.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  98024.     
  98025.         ^(super publishedAspectsOfInstances)
  98026.             add: (Aspect color: #color);
  98027.             add: (Aspect integer: #width);
  98028.             add: (Aspect choice: #styleName from: self styleNames);
  98029.             yourself!
  98030.  
  98031. red
  98032.     "Answer a red pen."
  98033.  
  98034.     ^self color: Color red
  98035. !
  98036.  
  98037. styleNames
  98038.     ^#(#solid #dash #dot #dashDot #dashDotDot #null #insideFrame)!
  98039.  
  98040. white
  98041.     "Answer the stock white pen."
  98042.  
  98043.     ^StockPen fromId: WHITE_PEN!
  98044.  
  98045. withStyle: styleFlags width: anInteger color: aColour
  98046.     "Answer a new instance of the receiver with the specified style, width and colour attributes."
  98047.  
  98048.     ^self fromLogPen:
  98049.         ((LOGPEN new)
  98050.             style: styleFlags;
  98051.             width: anInteger;
  98052.             color: aColour;
  98053.             yourself)
  98054. ! !
  98055.  
  98056. !Pen methodsFor!
  98057.  
  98058. color
  98059.     "Private - Answer the value of the receiver's <Color>."
  98060.  
  98061.     ^logPen color!
  98062.  
  98063. color: aColor 
  98064.     self color = aColor ifTrue: [^self].
  98065.     logPen color: (aColor isNil ifTrue: [Color black] ifFalse: [aColor]).
  98066.     self free!
  98067.  
  98068. createHandle
  98069.     "Private - Answer an external handle to a new pen as described by the logPen structure."
  98070.  
  98071.     ^GDILibrary default createPenIndirect: logPen!
  98072.  
  98073. handle: hPen
  98074.     "Private - Sets the handle for the receiver and query its logical info."
  98075.  
  98076.     super handle: hPen.
  98077.     logPen := LOGPEN new.
  98078.     self getData: logPen!
  98079.  
  98080. isPersistent
  98081.     "Private - Answer true if the receiver holds sufficient information such that
  98082.     it can recreate itself when the image is saved and restored. This is also
  98083.     an indication as to whether the receiver can be filed out/in using the STB
  98084.     mechanism. Generally this ability corresponds to a useful implemenation
  98085.     of #basicRealize"
  98086.  
  98087.     ^true!
  98088.  
  98089. logPen: aLOGPEN
  98090.     "Private - Set the receiver's logical attributes. 
  98091.     This has no affect if the receiver is already realized."
  98092.  
  98093.     logPen := aLOGPEN!
  98094.  
  98095. style
  98096.     "Private - Answer the value of the receiver's <integer> 'style' flags."
  98097.  
  98098.     ^logPen style!
  98099.  
  98100. style: flags 
  98101.     self style = flags ifTrue: [^self].
  98102.     logPen style: flags.
  98103.     self free!
  98104.  
  98105. styleName
  98106.     ^self class styleNames at: self style + 1!
  98107.  
  98108. styleName: aSymbol 
  98109.     "Set the style of the receiver to that named. Note that dotted/dashed styles 
  98110.     are only supported if the pen is one pixel wide."
  98111.  
  98112.     self style: (self class styleNames indexOf: aSymbol) - 1!
  98113.  
  98114. width
  98115.     "Answer the width (in pels) of the line drawn by the receiver."
  98116.  
  98117.     ^logPen width!
  98118.  
  98119. width: anInteger 
  98120.     "Set the <integer> width (in pixels) of the line drawn by the receiver.
  98121.     Note that if the width is greater than 1, then the pen style is ignored
  98122.     and the pen will always be solid."
  98123.  
  98124.     self width = anInteger ifTrue: [^self].
  98125.     logPen width: anInteger.
  98126.     self free! !
  98127.  
  98128. Region comment:
  98129. ''!
  98130. !Region class methodsFor!
  98131.  
  98132. empty
  98133.     "Answer an empty rectangular region"
  98134.  
  98135.     ^self rectangle: (Rectangle origin: Point zero extent: Point zero)!
  98136.  
  98137. rectangle: aRectangle
  98138.     "Answer a rectangular region defined by aRectangle"
  98139.  
  98140.     ^self fromOwnedHandle:
  98141.         (GDILibrary default createRectRgnIndirect: aRectangle asParameter)! !
  98142.  
  98143. !Region methodsFor!
  98144.  
  98145. combine: aRegion mode: anInteger
  98146.     "Private - Answers a new region which is the combination of the receiver with aRegion
  98147.     using anInteger mode"
  98148.  
  98149.     | result |
  98150.     result := Region empty.
  98151.     GDILibrary default 
  98152.         combineRgn: result asParameter 
  98153.             hrgnSrc1: self asParameter 
  98154.             hrgnSrc2: aRegion asParameter 
  98155.             fnCombineMode: anInteger.
  98156.     ^result!
  98157.  
  98158. containsPoint: aPoint
  98159.     "Answer whether aPoint is contained by the receiver"
  98160.  
  98161.     ^(GDILibrary default ptInRegion: self asParameter x: aPoint x y: aPoint y) asBoolean
  98162. !
  98163.  
  98164. exclude: aRegion
  98165.     "Answers a new region which is the receiver with aRegion excluded"
  98166.  
  98167.     ^self combine: aRegion mode: RGN_DIFF!
  98168.  
  98169. intersection: aRegion
  98170.     "Answers a new region which is the intersection of the receiver with aRegion"
  98171.  
  98172.     ^self combine: aRegion mode: RGN_AND!
  98173.  
  98174. union: aRegion
  98175.     "Answers a new region which is the union of the receiver with aRegion"
  98176.  
  98177.     ^self combine: aRegion mode: RGN_OR! !
  98178.  
  98179. WinImageList comment:
  98180. ''!
  98181. !WinImageList class methodsFor!
  98182.  
  98183. defaultColorDepth
  98184.     "Answer the default color depth based on that of the current screen driver.
  98185.     Implementation Note: Use the raw GDI calls to avoid creating a dependency
  98186.     on the Canvas class."
  98187.  
  98188.     | gdi hDC depth |
  98189.     gdi := GDILibrary default.
  98190.     hDC := gdi
  98191.         createDC: 'DISPLAY' 
  98192.         lpszDevice: nil lpszOutput: nil lpdvminit: nil.
  98193.     [depth := ((gdi getDeviceCaps: hDC index: BITSPIXEL) * (gdi getDeviceCaps: hDC index: PLANES)) max: 4]
  98194.         ensure: [gdi deleteDC: hDC].
  98195.     ^depth
  98196. !
  98197.  
  98198. defaultGrowthGranularity
  98199.     "Answers the amount by which an instance of the receiver will grow
  98200.     itself when adding images beyond its existing size."
  98201.  
  98202.     ^32!
  98203.  
  98204. defaultIconFlags
  98205.     "Answer the default flags setting for an instance of the receiver
  98206.     that is to hold icons."
  98207.  
  98208.     ^self defaultImageFlags  | ILC_MASK!
  98209.  
  98210. defaultImageFlags
  98211.     "Answer the default image flags setting for an instance of the receiver.
  98212.     Suggest a color depth based on that of the current screen driver.
  98213.     Implementation Note: Use the raw GDI calls to avoid creating a dependency
  98214.     on the Canvas class."
  98215.  
  98216.     ^self defaultColorDepth!
  98217.  
  98218. defaultInitialSize
  98219.     "Answers the default initial size of new image lists."
  98220.  
  98221.     ^1!
  98222.  
  98223. newExtent: aPoint
  98224.     "Answer a new instance to hold images with the given extent
  98225.     and no mask. All other parameters required to create
  98226.     an image list are defaulted."
  98227.  
  98228.     ^self newExtent: aPoint masked: false!
  98229.  
  98230. newExtent: aPoint depth: bppInteger initialSize: sizeInteger growBy: growthInteger masked: aBoolean
  98231.     "Answer a new instance with the given parameters."
  98232.  
  98233.     ^(self new)
  98234.         setExtent: aPoint
  98235.             depth: bppInteger
  98236.             initialSize: sizeInteger
  98237.             growBy: growthInteger
  98238.             masked: aBoolean;
  98239.         yourself!
  98240.  
  98241. newExtent: aPoint initialSize: anInteger masked: aBoolean
  98242.     "Answer a new instance with the given parameters."
  98243.  
  98244.     ^self 
  98245.         newExtent: aPoint
  98246.         depth: self defaultColorDepth
  98247.         initialSize: anInteger
  98248.         growBy: self defaultGrowthGranularity
  98249.         masked: aBoolean!
  98250.  
  98251. newExtent: aPoint masked: aBoolean
  98252.     "Answer a new instance with the given parameters."
  98253.  
  98254.     ^self 
  98255.         newExtent: aPoint
  98256.         initialSize: self defaultInitialSize
  98257.         masked: aBoolean!
  98258.  
  98259. width: cx height: cy flags: flags size: sizeInteger growthGranularity: growthInteger
  98260.     "Answer a new instances with the given parameters."
  98261.  
  98262.     #deprecated.
  98263.     ^self 
  98264.         newExtent: cx @ cy
  98265.         depth: flags
  98266.         initialSize: sizeInteger
  98267.         growBy: growthInteger
  98268.         masked: false! !
  98269.  
  98270. !WinImageList methodsFor!
  98271.  
  98272. addBitmap: aBitmap
  98273.     "Append the <Bitmap> argument to the list of images held by the receiver
  98274.     answering the zero-based <integer> index at which it was added."
  98275.  
  98276.     ^self addBitmap: aBitmap mask: nil!
  98277.  
  98278. addBitmap: aBitmap mask: aColorOrNil 
  98279.     "Append the <Bitmap> argument to the list of images held by the receiver
  98280.     answering the zero-based <integer> index at which it was added. The
  98281.     argument, aColor, specifies the mask colour to be used. If the return 
  98282.     value is -1, then the bitmap could not be added for some reason (e.g. it 
  98283.     could not be realized and hence has a null handle). This is not treated
  98284.     as an error, as the effect should only be cosmetic.
  98285.     Implementation Note: The image list will modify the bitmap in-place if
  98286.     the ILC_MASK flag is set (poor isn't it) and hence we must make sure we
  98287.     pass it it's own private copy of the bitmap if masking is enabled."
  98288.  
  98289.     | bmp hImgList |
  98290.     hImgList := self asParameter.
  98291.     bmp := self hasMask ifTrue: [aBitmap copy] ifFalse: [aBitmap].
  98292.     "#305 - We must make sure the bitmap is not selected into a DC, or the result will be a blank image in the list
  98293.          this won't damage the Bitmap in any way, because the canvas can be lazily recreated."
  98294.     bmp freeDC.
  98295.     ^CommCtrlLibrary default 
  98296.         imageListAddMasked: hImgList
  98297.         hbmImage: bmp asParameter
  98298.         crMask: (aColorOrNil isNil 
  98299.                 ifTrue: [CLR_NONE]
  98300.                 ifFalse: [aColorOrNil asColorRef asParameter])!
  98301.  
  98302. addIcon: anIcon
  98303.     "Append an icon to the receiver and return the zero-based <integer> index at 
  98304.     which it was added. Answer -1 if the icon could not be added for some reason 
  98305.     (we don't throw an error as this is probably only a cosmetic problem)."
  98306.  
  98307.     | index |
  98308.     index := CommCtrlLibrary default 
  98309.         imageListReplaceIcon: self asParameter i: -1 hIcon: anIcon asParameter.
  98310.     index < 0 ifTrue: [Notification signal: self printString, ': Failed to add icon ', anIcon printString].
  98311.     ^index!
  98312.  
  98313. addImage: anImage
  98314.     "Answer the index at which anImage is added to the receiver or -1 if an error occurs."
  98315.  
  98316.     ^anImage addToImageList: self mask: nil!
  98317.  
  98318. addTransparentBitmap: aBitmap
  98319.     "Append the <Bitmap> argument to the list of images held by the receiver
  98320.     answering the zero-based <integer> index at which it was added. The colour
  98321.     value of the first pixel in the image is used to compute the mask."
  98322.  
  98323.     ^self addBitmap: aBitmap
  98324.         mask: (self hasMask ifTrue: [aBitmap canvas pixelAt: 0 @ 0])!
  98325.  
  98326. backcolor
  98327.     "Answer the receiver's current background colour as a Colour.
  98328.     If the answer is nil then there is no background color set."
  98329.  
  98330.     | colorref |
  98331.     colorref := CommCtrlLibrary default imageListGetBkColor: handle.
  98332.     ^colorref = CLR_NONE ifFalse: [Color fromInteger: colorref]
  98333. !
  98334.  
  98335. backcolor: aColor
  98336.     "Set the receiver's background color to the <Color>, aColor.
  98337.     Answers the previous background <Color>, or nil if there was none."
  98338.  
  98339.     | colorref |
  98340.     colorref := CommCtrlLibrary default 
  98341.                     imageListSetBkColor: self asParameter
  98342.                     clrBk: (aColor isNil ifTrue: [CLR_NONE] ifFalse: [aColor asColorRef asParameter]).
  98343.     ^colorref = CLR_NONE ifFalse: [Color fromInteger: colorref]!
  98344.  
  98345. basicFree
  98346.     "Private - Free external resources held by the receiver"
  98347.  
  98348.     CommCtrlLibrary default imageListDestroy: handle!
  98349.  
  98350. beginDragImage: anInteger hotSpotX: x hotSpotY: y
  98351.     "Start a drag process using the image at the offset anInteger in the receiver."
  98352.  
  98353.     ^CommCtrlLibrary default
  98354.         imageListBeginDrag: handle
  98355.             iTrack: anInteger
  98356.             dxHotspot: x
  98357.             dyHotspot: y!
  98358.  
  98359. createHandle
  98360.     "Private - Create and answer an external resource handle associated with the receiver.
  98361.     This may be installed as the handle of the receiver if called from #basicRealize or it
  98362.     may be used by third parties who require a duplicate handle"
  98363.  
  98364.     ^CommCtrlLibrary default 
  98365.         imageListCreate: extent x
  98366.         cy: extent y
  98367.         flags: createFlags
  98368.         cInitial: initialSize
  98369.         cGrow: growBy!
  98370.  
  98371. dragEnter: aView at: aPoint
  98372.     "The drag for which the receiver is supplying images has entered the specified
  98373.     <View> at the specified point."
  98374.  
  98375.     ^CommCtrlLibrary default 
  98376.         imageListDragEnter: aView asParameter x: aPoint x y: aPoint y!
  98377.  
  98378. dragLeave: aView
  98379.     "The drag for which the receiver is supplying images has exited the specified
  98380.     <View>."
  98381.  
  98382.     ^CommCtrlLibrary default 
  98383.         imageListDragLeave: aView asParameter!
  98384.  
  98385. dragMoveTo: aPoint
  98386.     "Move the drag image to (x, y)."
  98387.  
  98388.     ^CommCtrlLibrary default 
  98389.         imageListDragMove: aPoint x
  98390.         y: aPoint y
  98391. !
  98392.  
  98393. dragShow: aBoolean
  98394.     "Show/hide the drag image as a 'fake' cursor."
  98395.  
  98396.     ^CommCtrlLibrary default imageListDragShowNoLock: aBoolean
  98397. !
  98398.  
  98399. draw: imageIndex on: target at: position flags: flags
  98400.     "Draw the image at <integer> index, imageIndex, in the receiver onto the <Canvas>,
  98401.     target, at the <Point>, position, with <integer> style mask, flags."
  98402.  
  98403.     ^CommCtrlLibrary default
  98404.         imageList_Draw: self asParameter
  98405.         i: imageIndex - 1
  98406.         hdcDst: target asParameter
  98407.         x: position x
  98408.         y: position y
  98409.         fStyle: flags.
  98410. !
  98411.  
  98412. endDrag
  98413.     "End the image drag operation."
  98414.  
  98415.     ^CommCtrlLibrary default imageListEndDrag
  98416. !
  98417.  
  98418. extent
  98419.     "Answer a <Point>, the x any y coordinates of which specify the width and height (respectively)
  98420.     of the bitmaps held by the receiver."
  98421.  
  98422.     ^extent!
  98423.  
  98424. getBkColor
  98425.     "Deprecated, use #backcolor."
  98426.  
  98427.     #deprecated.
  98428.     ^self backcolor!
  98429.  
  98430. getIcon: anIntegerIndex style: anIntegerStyle
  98431.     "Answer an instance of Icon generated from the image at anIntegerIndex."
  98432.  
  98433.     ^Icon fromOwnedHandle: (CommCtrlLibrary default imageListGetIcon: handle i: anIntegerIndex flags: anIntegerStyle)!
  98434.  
  98435. getImageCount
  98436.     "Answer the number of images held by the receiver."
  98437.  
  98438.     ^CommCtrlLibrary default imageListGetImageCount: handle!
  98439.  
  98440. hasMask
  98441.     ^createFlags allMask: ILC_MASK!
  98442.  
  98443. initialize
  98444.     "Initialize the receiver's instance variables."
  98445.  
  98446.     super initialize.
  98447.     extent := 16 @ 16.
  98448.     initialSize := 0.
  98449.     growBy := 16.
  98450.     createFlags := 0    "ILC_DEFAULT"!
  98451.  
  98452. setBkColor: aColor
  98453.     #deprecated.
  98454.     ^self backcolor: aColor!
  98455.  
  98456. setDragCursorImage: anInteger hotSpotX: x hotSpotY: y
  98457.     "Start a drag process using the image at the offset anInteger in the receiver."
  98458.  
  98459.     ^CommCtrlLibrary default
  98460.         imageListSetDragCursorImage: handle
  98461.         iDrag: anInteger
  98462.         dxHotspot: x
  98463.         dyHotspot: y!
  98464.  
  98465. setExtent: aPoint depth: bppInteger initialSize: sizeInteger growBy: growByInteger masked: aBoolean
  98466.     "Private - Initialize the receiver's instance variables."
  98467.  
  98468.     extent := aPoint.
  98469.     initialSize := sizeInteger.
  98470.     growBy := growByInteger.
  98471.     createFlags := (aBoolean ifTrue: [ILC_MASK] ifFalse: [0]) 
  98472.                 bitOr: bppInteger! !
  98473.  
  98474. StockBrush comment:
  98475. ''!
  98476. !StockBrush class methodsFor!
  98477.  
  98478. fromId: anInteger
  98479.     "Answer a new instance of the receiver representing the stock brush id anInteger."
  98480.  
  98481.     ^super new
  98482.         ownsHandle: false;
  98483.         id: anInteger;
  98484.         yourself!
  98485.  
  98486. new
  98487.     "StockBrushes should only be instantiated with #fromID:"
  98488.  
  98489.     ^self shouldNotImplement! !
  98490.  
  98491. !StockBrush methodsFor!
  98492.  
  98493. createHandle
  98494.     "Private - Get the handle for the stock brush with receiver's id."
  98495.  
  98496.     ^self getStockObject: id!
  98497.  
  98498. id: anInteger
  98499.     "Private - Set receiver's stock brush id to anInteger and obtain the handle."
  98500.  
  98501.     id := anInteger.
  98502.     self basicRealize! !
  98503.  
  98504. SysColorBrush comment:
  98505. ''!
  98506. !SysColorBrush methodsFor!
  98507.  
  98508. createHandle
  98509.     "Private - Get the handle of the system color brush with the receiver's id."
  98510.  
  98511.     ^UserLibrary default getSysColorBrush: id! !
  98512.  
  98513. StockFont comment:
  98514. ''!
  98515. !StockFont class methodsFor!
  98516.  
  98517. fromId: anInteger
  98518.     "Answer a new instance of the receiver representing the stock font id anInteger."
  98519.  
  98520.     ^self new
  98521.         ownsHandle: false;
  98522.         id: anInteger;
  98523.         yourself! !
  98524.  
  98525. !StockFont methodsFor!
  98526.  
  98527. = aFont
  98528.     "Answer true if aFont is equal to (has the same id as) the receiver."
  98529.  
  98530.     ^self species == aFont species and: [self id == aFont id]!
  98531.  
  98532. createHandle
  98533.     "Private - Get the handle for the stock font with id stockID."
  98534.  
  98535.     ^self getStockObject: self id!
  98536.  
  98537. hash
  98538.     "Answer the SmallInteger hash value for the receiver."
  98539.  
  98540.     ^self id hash!
  98541.  
  98542. id
  98543.     "Private - Answer the stock font id of the receiver"
  98544.  
  98545.     ^id!
  98546.  
  98547. id: anInteger
  98548.     "Private - Set receiver's id to anInteger and obtain the handle."
  98549.  
  98550.     id := anInteger.
  98551.     self basicRealize! !
  98552.  
  98553. Bitmap comment:
  98554. ''!
  98555. !Bitmap class methodsFor!
  98556.  
  98557. compatible: canvas extent: size
  98558.     "Answer a new instance of the receiver with suitable dimensions and
  98559.     available colours the same as canvas."
  98560.  
  98561.     ^self compatible: canvas width: size x height: size y!
  98562.  
  98563. compatible: canvas width: width height: height
  98564.     "Answer a new instance of the receiver with suitable dimensions and
  98565.     available colours the same as canvas."
  98566.  
  98567.     ^self fromOwnedHandle: (
  98568.         GDILibrary default createCompatibleBitmap: canvas asParameter nWidth: width nHeight: height).
  98569. !
  98570.  
  98571. displayCompatibleWithExtent: aPoint
  98572.     "Answer a new instance of the receiver with suitable dimensions and
  98573.     available a colour depth compatible with the display."
  98574.  
  98575.     | answer canvas |
  98576.     canvas := Canvas forDisplay.
  98577.     answer := self 
  98578.                 compatible: canvas
  98579.                 width: aPoint x
  98580.                 height: aPoint y.
  98581.     canvas free.
  98582.     ^answer!
  98583.  
  98584. filesType
  98585.     "Private - Answer a two element array suitable for adding to the FileDialog
  98586.     with the fileTypes: message."
  98587.  
  98588.     ^#('Bitmap Files (*.bmp)' '*.bmp')!
  98589.  
  98590. fromId: anIntegerOrStringId inFile: aString
  98591.     "Answer a new instance with a resourceID of anIntegerOrStringId
  98592.     from the resource library with the path, aString."
  98593.  
  98594.     ^self fromId: anIntegerOrStringId inFile: aString flags: LR_COLOR!
  98595.  
  98596. fromId: anIntegerOrStringId inFile: aString flags: anInteger 
  98597.     "Answer a new instance with a resourceID of anIntegerOrStringId
  98598.     from the resource library with the path, aString, and the LR_XXX
  98599.     flags in anInteger."
  98600.  
  98601.     | reslib icon |
  98602.     reslib := ExternalResourceLibrary open: aString.
  98603.     icon := self fromOwnedHandle: (UserLibrary default 
  98604.                 loadImage: reslib asParameter
  98605.                 lpszName: anIntegerOrStringId
  98606.                 uType: IMAGE_BITMAP
  98607.                 cxDesired: 0
  98608.                 cyDesired: 0
  98609.                 fuLoad: anInteger).
  98610.     icon instanceHandle: reslib handle.
  98611.     ^icon!
  98612.  
  98613. initialize
  98614.     "Private - Initialize the receiver's class variables
  98615.         Bitmap initialize
  98616.     "
  98617.  
  98618.     Map3DColorsMask := 16r1.
  98619.     IsSharedMask := 16r2.
  98620.  
  98621.     SharedBitmaps := WeakLookupTable new
  98622.     !
  98623.  
  98624. newAspect: aspectClass name: aSymbol 
  98625.         "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  98626.         which is appropriate for representing aspects of the receiver's type."
  98627.     
  98628.         ^aspectClass bitmap: aSymbol!
  98629.  
  98630. sharedCopyOf: aBitmap
  98631.     "Answers a cached copy of aBitmap if one has already been loaded from the same
  98632.     identifier. This can help save memory if the bitmap is not intended to be modified, 
  98633.     e.g. if it contains toolbar button images."
  98634.  
  98635.     ^SharedBitmaps at: aBitmap fullIdentifier ifAbsentPut: [aBitmap isShared: true. aBitmap]!
  98636.  
  98637. stbConvertFrom: anSTBClassFormat 
  98638.     "Convert from version 0 Bitmap. 
  98639.     Version 1 adds a caching inst var for the extent to avoid having to keep querying 
  98640.     the BITMAPINFOHEADER.. 
  98641.     Version 2  converts flags from a boolean to a Map3DColorsMask.
  98642.     Version 3 adds Image>>locator instance variable"
  98643.  
  98644.     ^
  98645.     [:data | 
  98646.     | newInstance |
  98647.     newInstance := self basicNew.
  98648.     1 to: data size do: [:i | newInstance instVarAt: i put: (data at: i)].
  98649.     anSTBClassFormat version < 3 
  98650.         ifTrue: 
  98651.             [data size to: 1
  98652.                 by: -1
  98653.                 do: 
  98654.                     [:i | 
  98655.                     | offset |
  98656.                     offset := i <= 2 ifTrue: [0] ifFalse: [1].
  98657.                     newInstance instVarAt: i + offset put: (newInstance instVarAt: i)].
  98658.             newInstance fileLocator: FileLocator default].
  98659.     anSTBClassFormat version < 2 
  98660.         ifTrue: 
  98661.             [| isMap3D |
  98662.             isMap3D := newInstance instVarAt: 7.
  98663.             newInstance instVarAt: 7 put: 0.
  98664.             newInstance setMap3DColors: isMap3D].
  98665.     newInstance]!
  98666.  
  98667. stbVersion
  98668.     "Answer the current binary filer version number for instances of the receiver."
  98669.  
  98670.     ^3!
  98671.  
  98672. width: width height: height planes: planes bitsPerPixel: bps bits: bits
  98673.     "Answer a new instance of the receiver with suitable dimensions."
  98674.  
  98675.     | bitmap |
  98676.     bitmap := self fromOwnedHandle: (
  98677.         GDILibrary default createBitmap: width nHeight: height cPlanes: planes cBitsPerPel: bps lpvBits: bits).
  98678.     ^bitmap! !
  98679.  
  98680. !Bitmap methodsFor!
  98681.  
  98682. addToImageList: aWinImageList mask: aColorOrNil
  98683.     "Private - Add a pictorial representation of the receiver to aWinImageList."
  98684.  
  98685.     ^aWinImageList addBitmap: self mask: aColorOrNil!
  98686.  
  98687. alphaBlendOn: aCanvas at: dstOrigin extent: dstExtent from: srcOrigin extent: srcExtent blend: blendFunction
  98688.     "Alpha blend the specified rectangle of the receiver to the specified destination
  98689.     rectangle with the specified raster op. The receiver is stretched to
  98690.     fit the destination rectangle. Answers zero if the operation fails"
  98691.  
  98692.     ^aCanvas alphaBlendBitmap: self 
  98693.         at: dstOrigin 
  98694.         extent: dstExtent 
  98695.         from: srcOrigin 
  98696.         extent: srcExtent 
  98697.         blend: blendFunction
  98698. !
  98699.  
  98700. asSharedCopy
  98701.     "Looks to see if an identical copy of the receiver has already be stored in the SharedBitmaps
  98702.     cache. If so this shared copy is answered"
  98703.  
  98704.     ^self class sharedCopyOf: self!
  98705.  
  98706. baseLoadFlags
  98707.     "Answer the basic load flags to be used when calling LoadImage() to realize the receiver."
  98708.  
  98709.     ^LR_COLOR!
  98710.  
  98711. basicFree
  98712.     "Private - Must be sent to the receiver before it dies to avoid loss of a DC 
  98713.     and a large memory bitmap."
  98714.  
  98715.     self freeDC.
  98716.     super basicFree.
  98717. !
  98718.  
  98719. cacheInfo
  98720.     "Private - Cache info about the receiver garnered from the bitmap itself."
  98721.  
  98722.     | bitmapInfo |
  98723.     bitmapInfo := self getInfo.
  98724.     extent := bitmapInfo extent.!
  98725.  
  98726. canvas
  98727.     "Private - Answer a Canvas to access the bitmap"
  98728.  
  98729.     hdc isNil 
  98730.         ifTrue: 
  98731.             [hdc := GDILibrary default createCompatibleDC: nil.
  98732.             GDILibrary default selectObject: hdc hgdiobj: self asParameter].
  98733.     ^Canvas withNonOwnedDC: hdc!
  98734.  
  98735. clearCached
  98736.     "Private - Clear down the receiver's handles and cached info."
  98737.  
  98738.     super clearCached.
  98739.     hdc := nil.
  98740.     "We don't always clear down the extent, because it may not be cached 
  98741.      information, but have been set by the instantiator. However if loading
  98742.      from an external resource we need to consider the possibility that
  98743.      the bitmap has been changed in the meantime."
  98744.     self identifier isNil ifFalse: [extent := nil]!
  98745.  
  98746. copy
  98747.     "Answer a <Bitmap> which is a copy of the receiver (one which shares the identifier
  98748.     information, but not the bitmap handle itself)."
  98749.  
  98750.     ^(self identifier isNil and: [handle notNull])
  98751.         ifTrue: [self copyBits]
  98752.         ifFalse: [super copy]!
  98753.  
  98754. copyBits
  98755.     "Private - Answer a <Bitmap> which is a copy of the receiver, made by copying the
  98756.     actual bits of the bitmap."
  98757.  
  98758.     | copy size hadDC |
  98759.     size := self extent.
  98760.     hadDC := hdc notNil.
  98761.     copy := self class compatible: self canvas extent: size.
  98762.     copy canvas 
  98763.         drawBitmap: self
  98764.         at: 0 @ 0
  98765.         extent: size
  98766.         from: 0 @ 0
  98767.         extent: size
  98768.         rop: SRCCOPY.
  98769.     copy freeDC.
  98770.     hadDC ifFalse: [self freeDC].
  98771.     ^copy!
  98772.  
  98773. copyToClipboard
  98774.     "Private - Copy the receiver to the clipboard."
  98775.  
  98776.     Clipboard current setBitmap: self copy!
  98777.  
  98778. createPalette
  98779.     "Private - Attempt the create an answer an HPALETTE for the receiver's palette.
  98780.     Answers nil if the receiver has no palette"
  98781.  
  98782.     | colors |
  98783.     colors := self getColorTable.
  98784.     ^colors notNil 
  98785.         ifTrue: 
  98786.             [| lp |
  98787.             lp := LOGPALETTE new.
  98788.             lp palVersion: 16r300.
  98789.             self getPaletteEntries: lp palPalEntry from: colors.
  98790.             lp palNumEntries: lp palPalEntry length.
  98791.             GDILibrary default createPalette: lp]!
  98792.  
  98793. depth
  98794.     "Answer the color depth (number of bits per pixel) of the receiver.
  98795.     At this level, this information is not cached."
  98796.  
  98797.     ^self getInfo depth!
  98798.  
  98799. detachHandle
  98800.     "Answer the receiver's handle, and if owned, relinquish ownership
  98801.     to the caller."
  98802.  
  98803.     self freeDC.
  98804.     ^super detachHandle!
  98805.  
  98806. drawOn: aCanvas at: dstOrigin extent: dstExtent
  98807.     "Copies the receiver to aCanvas at the position specified by the Point, dstOrigin,
  98808.     and the with size specified by the Point, dstExtent. The receiver is stretched
  98809.     to fit the destination rectangle."
  98810.  
  98811.     ^self 
  98812.         drawOn: aCanvas 
  98813.         at: dstOrigin
  98814.         extent: dstExtent
  98815.         from: Point zero
  98816.         extent: self extent
  98817.         rop: SRCCOPY!
  98818.  
  98819. drawOn: aCanvas at: dstOrigin extent: dstExtent from: srcOrigin extent: srcExtent
  98820.     "Copies the specified rectangle of the receiver to the specified destination
  98821.     rectangle. The specified source rectangle of the receiver is stretched to fit
  98822.     the specified destination rectangle of the canvas."
  98823.  
  98824.     ^self 
  98825.         drawOn: aCanvas 
  98826.         at: dstOrigin 
  98827.         extent: dstExtent 
  98828.         from: srcOrigin
  98829.         extent: srcExtent 
  98830.         rop: SRCCOPY!
  98831.  
  98832. drawOn: aCanvas at: dstOrigin extent: dstExtent from: srcOrigin extent: srcExtent rop: dwRasterOp
  98833.     "Draw the specified rectangle of the receiver to the specified destination
  98834.     rectangle with the specified raster op. The receiver is stretched to
  98835.     fit the destination rectangle. Answers zero if the operation fails"
  98836.  
  98837.     ^aCanvas drawBitmap: self 
  98838.         at: dstOrigin 
  98839.         extent: dstExtent 
  98840.         from: srcOrigin 
  98841.         extent: srcExtent 
  98842.         rop: dwRasterOp
  98843. !
  98844.  
  98845. drawOn: aCanvas at: dstOrigin from: srcOrigin extent: srcExtent
  98846.     "BitBlt (without stretching) the specified rectangle of the receiver to the 
  98847.     specified destination point, using the specified raster Op."
  98848.  
  98849.     ^self 
  98850.         drawOn: aCanvas 
  98851.         at: dstOrigin
  98852.         extent: srcExtent
  98853.         from: srcOrigin
  98854.         extent: srcExtent
  98855.         rop: SRCCOPY!
  98856.  
  98857. drawOn: aCanvas at: dstOrigin from: srcOrigin extent: srcExtent rop: dwROP
  98858.     "BitBlt (without stretching) the specified rectangle of the receiver to the 
  98859.     specified destination point, using the specified raster Op."
  98860.  
  98861.     ^self 
  98862.         drawOn: aCanvas 
  98863.         at: dstOrigin
  98864.         extent: srcExtent
  98865.         from: srcOrigin
  98866.         extent: srcExtent
  98867.         rop: dwROP.
  98868.  
  98869. !
  98870.  
  98871. extent
  98872.     "Answers the dimensions of the receiver in pixels"
  98873.  
  98874.     extent isNil ifTrue: [self cacheInfo].
  98875.     ^extent!
  98876.  
  98877. freeDC
  98878.     "Private - Free the receiver's cached memory DC.
  98879.     Implementation Note: The hdc is lazily created by #canvas so needs to be tested first."
  98880.  
  98881.     hdc notNil 
  98882.         ifTrue: 
  98883.             [GDILibrary default deleteDC: hdc.    "Ignore errors"
  98884.             hdc := nil]!
  98885.  
  98886. getColorTable
  98887.     "Answer an array of RGBQUADs describing the palette in the receiver.
  98888.     Answer nil if the receiver has no color table"
  98889.  
  98890.     "At present this method is only available for DIBSections"
  98891.     ^nil.
  98892. !
  98893.  
  98894. getInfo
  98895.     "Answers a bitmap information structure class containing details about the receiver."
  98896.  
  98897.     | bitmapInfo |
  98898.     bitmapInfo := BITMAP new.
  98899.     self getData: bitmapInfo.
  98900.     ^bitmapInfo!
  98901.  
  98902. getMap3DColors
  98903.     "Answer whether the receivers colours will be mapped to suitable 3D ones
  98904.     when loaded in."
  98905.  
  98906.     ^flags allMask: Map3DColorsMask.!
  98907.  
  98908. getPaletteEntries
  98909.     "Answer an array of PALETTEENTRY structs describing the palette in the receiver."
  98910.  
  98911.     | colors |
  98912.     colors := self getColorTable.
  98913.     ^self getPaletteEntries: (StructureArray length: 256 elementClass: PALETTEENTRY) from: colors.
  98914.     !
  98915.  
  98916. getPaletteEntries: aStructureArray from: colors 
  98917.     "Private - Populate an array of PALETTEENTRY structs in aStructureArray with
  98918.     the color table palette entries in colors. We assume aStructure array contains
  98919.     256 entries; it will be trucated to the actual length required.
  98920.     Answer aStructureArray"
  98921.  
  98922.     1 to: colors length
  98923.         do: 
  98924.             [:i | 
  98925.             | pe rgbq |
  98926.             pe := aStructureArray at: i.
  98927.             rgbq := colors at: i.
  98928.             pe peRed: rgbq rgbRed.
  98929.             pe peBlue: rgbq rgbBlue.
  98930.             pe peGreen: rgbq rgbGreen].
  98931.     aStructureArray length: colors length.
  98932.     ^aStructureArray!
  98933.  
  98934. imageType
  98935.     "Private - Answer the Win32 image type for the receiver."
  98936.  
  98937.     ^IMAGE_BITMAP!
  98938.  
  98939. initialize
  98940.     "Private - Initialize the state of the receiver."
  98941.  
  98942.     super initialize.
  98943.     flags := 0.!
  98944.  
  98945. isShared
  98946.     "Private - Answer true if the receiver is in the shared cache"
  98947.  
  98948.     ^flags allMask: IsSharedMask.!
  98949.  
  98950. isShared: aBoolean
  98951.     "Private - Sets the flag to indicate that the receiver is in the shared cache"
  98952.  
  98953.     flags := flags mask: IsSharedMask set: aBoolean
  98954. !
  98955.  
  98956. isTransparent
  98957.     "Answer whether the receiver will be, or was, loaded as a 'transparent' bitmap
  98958.     (that is with the LR_LOADTRANSPARENT flag)."
  98959.  
  98960.     ^flags allMask: LR_LOADTRANSPARENT.!
  98961.  
  98962. isTransparent: aBoolean 
  98963.     "Set whether the receiver will be loaded as a 'transparent' bitmap
  98964.     (that is with the LR_LOADTRANSPARENT flag). If the bitmap is already
  98965.     realized then this has no effect."
  98966.  
  98967.     flags := flags mask: LR_LOADTRANSPARENT set: aBoolean!
  98968.  
  98969. loadFlags
  98970.     | fuLoad |
  98971.     fuLoad := self baseLoadFlags.
  98972.     self getMap3DColors ifTrue: [fuLoad := fuLoad bitOr: LR_LOADMAP3DCOLORS].
  98973.     ^fuLoad bitOr: (flags bitAnd: ##((LR_LOADTRANSPARENT - 1) bitInvert))
  98974. !
  98975.  
  98976. loadFromFile: pathString extent: anObject
  98977.     "Private - Attempts to load the receiver from a disk file
  98978.     Answers the bitmap's handle, or nil if the image could not be loaded."
  98979.  
  98980.     | fuLoad |
  98981.     fuLoad := self baseLoadFlags bitOr: LR_LOADFROMFILE.
  98982.     self getMap3DColors ifTrue: [fuLoad := fuLoad bitOr: LR_LOADMAP3DCOLORS].
  98983.     ^UserLibrary default 
  98984.         loadImage: 0
  98985.         lpszName: pathString asParameter
  98986.         uType: self imageType
  98987.         cxDesired: 0
  98988.         cyDesired: 0
  98989.         fuLoad: fuLoad!
  98990.  
  98991. loadFromInstance: hModule
  98992.     "Private - Attempts to load the receiver as a resource from an instance.
  98993.     Answers the bitmaps handle, or nil if the bitmap could not be loaded."
  98994.  
  98995.     extent := nil.    "Any old cached extent may be invalid and no longer match the loaded resource."
  98996.     ^UserLibrary default 
  98997.         loadImage: hModule asParameter
  98998.         lpszName: identifier asParameter
  98999.         uType: self imageType
  99000.         cxDesired: 0
  99001.         cyDesired: 0
  99002.         fuLoad: self loadFlags!
  99003.  
  99004. setMap3DColors: aBoolean
  99005.     "Set whether the receivers colours will be mapped to suitable 3D ones
  99006.     when loaded in."
  99007.  
  99008.     flags := flags mask: Map3DColorsMask set: aBoolean.!
  99009.  
  99010. stbFixup: anSTBInFiler at: newObjectIndex
  99011.     "Answer the true object that must be used to represent the receiver when read from anSTBInFiler.
  99012.     If the receiver is flagged as being shared then make sure we answer a shared instance and
  99013.     patch the in-filer read map to use that shared instance for any other references."
  99014.  
  99015.     | answer |
  99016.     answer := super stbFixup: anSTBInFiler at: newObjectIndex.
  99017.     self isShared 
  99018.         ifTrue: 
  99019.             [answer := self asSharedCopy.
  99020.             anSTBInFiler fixup: newObjectIndex to: answer].
  99021.     ^answer! !
  99022.  
  99023. Icon comment:
  99024. ''!
  99025. !Icon class methodsFor!
  99026.  
  99027. asterisk
  99028.     "Answer a new instance of the Asterisk icon (used in informative messages)"
  99029.  
  99030.     ^self information!
  99031.  
  99032. blank
  99033.     Blank isNil ifTrue: [Blank := self fromId: 'Blank.ico'].
  99034.     ^Blank!
  99035.  
  99036. choose
  99037.     | filename |
  99038.     filename := (FileOpenDialog new)
  99039.                 fileTypes: (Array with: Icon filesType with: FileDialog allFilesType);
  99040.                 showModal.
  99041.     ^filename notNil ifTrue: [Icon fromFile: filename]!
  99042.  
  99043. clear
  99044.     "Clean up the image manager for all icons. We start with no image representation
  99045.     for our icons, they are added lazily as they are accessed usng #imageIndex."
  99046.  
  99047.     self imageManager purge!
  99048.  
  99049. defaultApplication
  99050.     "Answer a new instance of the default application icon"
  99051.  
  99052.     DefaultApplication isNil ifTrue: [DefaultApplication := self fromSystemId: IDI_APPLICATION].
  99053.     ^DefaultApplication
  99054. !
  99055.  
  99056. defaultExtent
  99057.     "Answer a Point that gives the dimensions of a standard size icon."
  99058.  
  99059.     ^self largeExtent
  99060. !
  99061.  
  99062. error
  99063.     "Answer a new instance of the default system 'error' icon (used in serious warning messages)"
  99064.  
  99065.     Error isNil ifTrue: [Error := self fromSystemId: 32513].
  99066.     ^Error
  99067. !
  99068.  
  99069. exclamation
  99070.     "Answer a new instance of the Exclamation mark icon (used in warning messages)"
  99071.  
  99072.     ^self warning!
  99073.  
  99074. filesType
  99075.     "Private - Answer a two element array suitable for adding to the FileDialog
  99076.     with the fileTypes: message."
  99077.  
  99078.     ^#('Icon Files (*.ico)' '*.ico')!
  99079.  
  99080. hand
  99081.     "Answer a new instance of the Hand-shaped icon (used in serious warning messages)"
  99082.  
  99083.     ^self error
  99084. !
  99085.  
  99086. icon
  99087.     "Answers an Icon that can be used to represent this class"
  99088.  
  99089.     ^##(self) defaultIcon!
  99090.  
  99091. imageManager
  99092.     "Answer the image manager to use for storing icons"
  99093.  
  99094.     ^IconImageManager current!
  99095.  
  99096. information
  99097.     "Answer a new instance of the default system 'information' icon (used in informative messages)"
  99098.  
  99099.     Information isNil ifTrue: [Information := self fromSystemId: 32516].
  99100.     ^Information!
  99101.  
  99102. largeExtent
  99103.     "Answer a Point that gives the dimensions of a standard size icon."
  99104.  
  99105.     | lib |
  99106.     lib := UserLibrary default.
  99107.     ^(lib getSystemMetrics: SM_CXICON) @
  99108.         (lib getSystemMetrics: SM_CYICON).
  99109. !
  99110.  
  99111. newAspect: aspectClass name: aSymbol 
  99112.         "Private - Answer a new <Aspect> of the class, aspectClass, and with name, aSymbol, 
  99113.         which is appropriate for representing aspects of the receiver's type."
  99114.     
  99115.         ^aspectClass icon: aSymbol!
  99116.  
  99117. onPreStripImage
  99118.     "Private - The image is about to be stripped. Nil out the cached converter to (potentially)
  99119.     allow RichTextEdit to be stripped."
  99120.  
  99121.     self uninitialize!
  99122.  
  99123. onStartup2
  99124.     "Private - Perform system startup processing for all subclasses."
  99125.  
  99126.     self clear!
  99127.  
  99128. question
  99129.     "Answer a new instance of the Question mark icon (used in prompting messages)"
  99130.  
  99131.     Question isNil ifTrue: [Question := self fromSystemId: 32514].
  99132.     ^Question!
  99133.  
  99134. smallExtent
  99135.     "Answer a Point that gives the dimensions of a small size icon."
  99136.  
  99137.     | user |
  99138.     user := UserLibrary default.
  99139.     ^(user getSystemMetrics: SM_CXSMICON) @
  99140.         (user getSystemMetrics: SM_CYSMICON).!
  99141.  
  99142. tileExtent
  99143.     "Answer a Point that gives the dimensions of a tile size icon."
  99144.  
  99145.     #todo. "Is there a system metric for this?"
  99146.  
  99147.     ^48 @ 48!
  99148.  
  99149. uninitialize
  99150.     "Uninitialize the class variables of the receiver."
  99151.  
  99152.     Blank := Error := Warning := Information := Question := WinLogo := DefaultApplication := nil!
  99153.  
  99154. warning
  99155.     "Answer a new instance of the default system 'warning' icon (used in warning messages)"
  99156.  
  99157.     Warning isNil ifTrue: [Warning := self fromSystemId: 32515].
  99158.     ^Warning!
  99159.  
  99160. window
  99161.     "Answer a new instance of the default Windows icon"
  99162.  
  99163.     WinLogo isNil ifTrue: [WinLogo := self fromSystemId: 32517].
  99164.     ^WinLogo
  99165.  
  99166. ! !
  99167.  
  99168. !Icon methodsFor!
  99169.  
  99170. addToImageList: aWinImageList mask: aColorOrNil
  99171.     "Private - Add a pictorial representation of the receiver to the <WinImageList>
  99172.     argument, using the <Color> argument as the mask colour (although in this
  99173.     case the specified mask colour is ignored as the Icon has its own mask)."
  99174.  
  99175.     instanceHandle isNil 
  99176.         ifTrue: 
  99177.             ["If loaded from a file, then need to reload to ensure has correct extent"
  99178.  
  99179.             (self loadFromFile: self fileSpec extent: aWinImageList extent) ifNotNil: 
  99180.                     [:hIcon | 
  99181.                     | index |
  99182.                     index := aWinImageList addIcon: hIcon.
  99183.                     UserLibrary default destroyIcon: hIcon.
  99184.                     ^index]].
  99185.     ^aWinImageList addIcon: self!
  99186.  
  99187. basicFree
  99188.     "Private - Free the receiver's Icon resource handle.
  99189.     Ignore any error return."
  99190.  
  99191.     UserLibrary default destroyIcon: handle!
  99192.  
  99193. createHandle
  99194.     "Private - Answer an external handle to the image represented by the receiver.
  99195.     If the icon is not found, then use the handle of a default icon. 
  99196.     We could allow a walkback to occur but this could interfere with the system 
  99197.     browsers so we silently display a dummy icon in place of the dud."
  99198.  
  99199.     | aHandle |
  99200.     ^(aHandle := super createHandle) notNil
  99201.         ifTrue: [aHandle]
  99202.         ifFalse: [ "Use Question icon if not realizable"
  99203.             self class question handle]!
  99204.  
  99205. drawOn: aCanvas at: aPoint
  99206.     "Copies the receiver to aCanvas at position aPoint."
  99207.  
  99208.     ^self 
  99209.         drawOn: aCanvas
  99210.         at: aPoint
  99211.         frame: 1
  99212.         background: nil!
  99213.  
  99214. drawOn: aCanvas at: aPoint extent: sizePoint
  99215.     "Copies the receiver to aCanvas at position aPoint with size sizePoint."
  99216.  
  99217.     ^self
  99218.         drawOn: aCanvas 
  99219.         at: aPoint 
  99220.         extent: sizePoint 
  99221.         frame: 1 
  99222.         background: nil!
  99223.  
  99224. drawOn: aCanvas at: aPoint extent: sizePoint frame: anInteger background: aBrush
  99225.     "Copies the receiver to aCanvas at position aPoint with size sizePoint
  99226.     with frame anInteger and background aBrush."
  99227.  
  99228.     ^self 
  99229.         drawOn: aCanvas 
  99230.         at: aPoint 
  99231.         extent: sizePoint 
  99232.         frame: anInteger 
  99233.         background: aBrush 
  99234.         flags: DI_NORMAL!
  99235.  
  99236. drawOn: aCanvas at: aPoint extent: sizePoint frame: anInteger background: aBrush flags: flagsInteger
  99237.     "Copies the receiver to aCanvas at position aPoint with size sizePoint
  99238.     with frame anInteger and background aBrush. Answer whether the frame
  99239.     could be drawn. Note that the frame number is ignored if the receiver is not
  99240.     an animated icon/cursor."
  99241.  
  99242.     ^UserLibrary default
  99243.         drawIconEx: aCanvas asParameter 
  99244.         xLeft: aPoint x 
  99245.         yTop: aPoint y 
  99246.         hIcon: self asParameter
  99247.         cxWidth: sizePoint x
  99248.         cyHeight: sizePoint y
  99249.         istepIfAniCur: anInteger
  99250.         hbrFlickerFreeDraw: aBrush asParameter
  99251.         diFlags: flagsInteger!
  99252.  
  99253. drawOn: aCanvas at: aPoint frame: anInteger background: aBrush
  99254.     "Copies the receiver to aCanvas at position aPoint with frame anInteger and 
  99255.     background aBrush."
  99256.  
  99257.     ^self
  99258.         drawOn: aCanvas 
  99259.         at: aPoint 
  99260.         extent: Point zero
  99261.         frame: anInteger 
  99262.         background: aBrush 
  99263.         flags: ##(DI_DEFAULTSIZE|DI_NORMAL)!
  99264.  
  99265. extent
  99266.     "Answers the dimensions of the receiver in pixels.
  99267.     This is determined from the extent of the foreground bitmap, which
  99268.     is accessed via GetIconInfo(). Note that we explicitly free
  99269.     the ICONINFO in order to release the bmp's."
  99270.  
  99271.     | info extent |
  99272.     info := self getIconInfo.
  99273.     extent := info extent.
  99274.     info free.
  99275.     ^extent!
  99276.  
  99277. getIconInfo
  99278.     "Private - Answer an ICONINFO structure populated with info. about the receiver.
  99279.     N.B. This is quite an expensive operation, as it involves the creation of foreground
  99280.     and mask bitmaps for the icon."
  99281.  
  99282.     | info |
  99283.     info := ICONINFO new.
  99284.     (UserLibrary default getIconInfo: self asParameter piconinfo: info)
  99285.         ifFalse: [UserLibrary default systemError].
  99286.     ^info
  99287.     !
  99288.  
  99289. hotspot
  99290.     "Answer a Point specifying the receiver's hot spot (only really relevant for cursors)."
  99291.  
  99292.     | info |
  99293.     info := self getIconInfo.
  99294.     ^info
  99295.         free;     "Free up the bitmaps which we don't need"
  99296.         xHotspot @ info yHotspot!
  99297.  
  99298. imageIndex
  99299.     "Answer the image index of the receiver in our ImageManager of all icons."
  99300.  
  99301.     ^self class imageManager indexOfImage: self.
  99302. !
  99303.  
  99304. imageType
  99305.     "Private - Answer the Win32 image type for the receiver."
  99306.  
  99307.     ^IMAGE_ICON!
  99308.  
  99309. includesFrame: frameNumber
  99310.     "Answer whether the receiver contains a frame of frameNumber.
  99311.     Sadly we need to attempt to draw the specified frame to determine whether it
  99312.     exists (unless we can find another way - suggestions please!!)
  99313.     Note that the answer will always be true, regardless of the frame number, if
  99314.     the receiver is not an animated cursor."
  99315.  
  99316.     | hDC includes screenDC |
  99317.     screenDC := UserLibrary default getDC: nil.
  99318.     hDC := GDILibrary default createCompatibleDC: screenDC.
  99319.     includes := self drawOn: hDC at: Point zero frame: frameNumber background: nil.
  99320.     GDILibrary default deleteDC: hDC.
  99321.     UserLibrary default releaseDC: nil hDC: screenDC.
  99322.     ^includes!
  99323.  
  99324. loadFromInstance: hModule
  99325.     "Private - Attempts to load the receiver as a resource from an instance. 
  99326.     I would have expected the User32 loadImage function to be capable of this but
  99327.     it does not appear to work for instance 0; the system. Hence this method 
  99328.     which tries the old way. Answers the loaded handle or nil if the load failed"
  99329.  
  99330.     ^UserLibrary default loadIcon: hModule asParameter lpIconName: identifier asParameter! !
  99331.  
  99332. OLEPicture comment:
  99333. 'OLEPicture is an <Image> class which wraps the standard OLE picture object.
  99334.  
  99335. OLEPicture is capable of representing a wide range of image types, including icons, bitmaps, metafiles, and also JPEGs and GIFs.'!
  99336. !OLEPicture methodsFor!
  99337.  
  99338. α@#.:⌐Ä5,ûáƒ>▀απµ┬╫┌▐╥╗▐¼@W ╢┴hx╙º1^ÿMk8@R_eƒ├.Ko0N╖y'Γè$■₧C@╕╛┤è°▌¢4L~r▀»h<║╚╘PG¢V£5║K│=é TF=≤$ï╤¥u}ó)1╥ò╞┌┼│g╞`⌡≥ºt╜▒@M«lJlì²8₧╓YºU'╔╚≡(h∩┬jéK}Ç0╖£üM`╛»Φ╛∩Φ²cS╖áª`UKo4╬∞ppA╠▀ÿßNd0O!!░Φ-Äù∙┬╜°!!µú┴┘Æ;⌡á└╬2? ╣<±
  99339. `Wφ╡'é1ül≈┐Çï╙N█▀╚τE±&)¬nínÿº╤≥;aLp$`    ▄ú╖@°]ûHδ
  99340. TG9╞[a║≥;╩$[═ĵD%zKz⌠╩▀╪T\└≡Y&▒┐D₧åö₧-_L╨▀6-4¥Q·æ▒╗¬£≡║╪ÄæºYùìK)íòè?┬9╣"g ù│┴╦e1䃠í╡!
  99341.  
  99342. πE46╢è7D╨└╬ù6≈╒√╔╛܃≤¼≈áB▒óÇ~k\S└è?^╫MA9aNAh
  99343. σ┴ \`#]ªrPoªδ"π₧V¡≈Ñ¢⌠╩Æfm    ≤▒}>½─┼W\öÜ{εm╣iò[╝fJI<εj╪╩ÅWd⌐/╓£╟╢╬Ñpëî₧╙k
  99344. ε⌡XJσtJlâß'│╡6≤No╚Z╓τ(!!φ╧}éeJΘ╣▌ì@x╢ε≈δ≥¡°vY¬¼≥dP\arÜΓpe@▌╚QÑì|-,JO╬ö=Ä7h  ╙▓∙b≡·û┼ƒ0⌡Ω▌I╞w╣}∩
  99345. pá▄¡2ⁿ¥òå£┌¥─└π!
  99346.  
  99347. ΓV"!!=îÄ<-╢¼ß@∞}╤╞µ┌ ├┌ò≤▓ä]P¿╛╥;rF╫£*WàQE&.SRe ·ä^Mif[½yc»¬' ₧P╕Ñ▓ì≥┴ô4\.t╥╣- ½╩┼P^É▌{╟j╗m£±TA9⌡mÉ╨▓M`⌐Z|τô╚≤î┤{ü▀öâl╝σBJ½t;ûαs▌▐\∩Do═▄Σmeⁿ╙y╦N}Ç>│╙ûP4ºª²ôèo╕²cH¼≥╖D@,8a.╬╙31KSë á{π⌐id?ç┴<₧Jä░╥¬∙`≡┐⌐╠ö:╣µçdÑl?;ⁿu∩!!aS屬2σ¬ôåïàá╗»Å+¥Pú+≥6╤≤±╤hF3╝-ûσ"%ö,ïK╤ Uf╞avé≥1ú    )U═¼√25N>╤╩╞╨J└τU<╛∞@É¢▀E╟l"URéτ,3╤ö·╘█½°£▄óΓóWæ}╕É@X0α╚╥S╬2╣gh ╗ΣφÄö ¬≈F╬ß∙R7Ñ⌡Φ,┘KZgε║|∩Eòτwì┤«QÿÅπ    Ç╜▓╙,æ■ƒ*╕ÆF
  99348. ▄·bM├¥╨╞░EA─.kÜΩâZ5╚╘δXÖªÖqVº╥'FàD]╙╖pK¬a╕τ╗∩╦Z╬uÑ·éÑñ╬RS╔*N6⌠5Åæ┼_∩ò╪ΣOδhM┘SO Æ░Éa&₧gò╥Vg«ƒ≤2╓·«V╖v$╝}m∙▀┴úπ?Åà∞vu4!
  99349.  
  99350. σV&6■╧3
  99351. ╗ºÜ+ûα└╡î τ╨▄░µσV[½╛╬o)E█₧;bÿVJ>1:)+ΣÇ    r.JπnViºó6 ╠ª≈╢╜÷┴
  99352. ä4_.aΩ│d<║ë╫P\¥VÇo½Ñtè╠^F,»&≥┤4÷+h∞5ôÜ╬▐╔⌐tÇ▀ôú}½σCAΓo▓ε?█╦KΓ.┬L═ßm}ö¡╥K.Üb±╧åHr≤╛±²⌠║±.1╙ë╖`HAKo!!┤±pxId█╚K╩Ügk=O_▀╝aµ0k₧²∙╜⌡f∞«┴ù╟~╜ε∞█9R≥ûb6Ωüh╠hO°▐█╬╬╧A█▐⌡τN║Z╙c╤2╔Γ∞╦g@g(²;╙■+Qâ!!܃#MoéPaü■!!≈eòΓεt04\mû
  99353. ▀▐▄Pà╣"ç■EÜüïB₧v=*|¿Ö%.åià╗éÅN╝│£▄óΓ∙ZÆ\Ñû%âôü╩9φcu(·¼▒├└+tà≈F╬ßΦQÑ╔⌠ ìT0/`φ║|σ┘αâ«│@╩é*╔Qv¢≤τ╥ ╦⌡á1ƒë^F∙┘eM⌐φéïåKA·5"╬úâSQí⌐ùR»⌠ƒ3+≥▒Yaü7¿▌.!!Γ6l²═╜Θ╔Éu≥ÿ·Φ╚▐uN┌>NSôy■∞┼I¬âí╬|▀+P1ïXfƒ⌐¬m║"ù─E{
  99354. ÅΩì^▒■≥8Ω=B└wj¬âô¿╥?ï╤ìNL6åK.iO╦ ∙K╝¡¢w7╬≥╜╖G±áδ╥6c╞WB°\:╝E$R╙.φºƒ>
  99355. 0▓VL⌐t£º1nñôÜüs┘ykX&[╖böö╕┤╙<╧∙╢i¢σⁿ+╚r.KΦ≈╕┴╥┬Æ=íƒ#Γ0&=í╒*!
  99356.  
  99357. Σ\3;,╔σ[k¢ºƒ=Ç-≥ö√─√ù█▄│≈½@J░╡╙;|N╞î;àZG/gMVyO Å^Io>J»o╚╞Jô═G «≈ºù⌠█     Æ:7BKn╔⌐7ε═┼MI£ÇVt╕B┐qæ≡TdRêZÜ╞MÖL`!
  99358.  
  99359. ΦI&0 ╜ƒ7D╨└╬ù6≈╒√╔╛܃⌠░ß▓VQ »╚~3_▄╫l₧RE-kGr≤┴Vtf[½yxº¿%≤╚GΣ≈╛ÿ╖▀ä}\ k.ÿ╤_─á■ ▌:£~╗Sé|Æ∙A /î÷╖0¥V.∞Q|├ç╫¼îë^⌐*║ñ▒U;â╨g╧
  99360. cδε'äƒ ºQ:╪Ü?▐ F▄°Qßm@¢R█╡Ω-g╗╝±≡δOΦ⌡t∙≤╖%V\r'£ú)aJ!
  99361.  
  99362. ΦW'+¡£&,┤╜ß@∞}╤╞µ┌ ├┌ò≤▓ä]P¿╛╥;gZC╫─7T╫KL/.IVh
  99363.  ùK&.@»x@*▒╛&ⁿ╫A    ¡╣ú▐■┴ày_go╘ⁿ~'¡┴ÇM@ö■|ºW÷~æ╝CJ
  99364. *Σeï█òVg⌐ :ôà╦≤┬αgÇ▀Æ₧}½▒^WΓs mçδs▀╤[ºS*▀K╒÷)/╗¬»(■6╡┘ìP}╡º²∞áºαNU╡!
  99365.  
  99366. φK&*½é ╢¼╓jò>⌡▄▄╪∞▐╤╥■≈╜GF▒»Ü;rFy╨Ä;Qâ2.C,kAb≈ò+fn╖hVg▓┐3║╩M@ñ╕╢Ü╖█╫f[ki╠╣r¿█╧TöVùfÑ░t£│D]víMÖ₧MöG4Ñ=╘ù«£Ñú|¥¢█¥sε≤R«o çδsû┌αo╪W▀V⌡$mⁿço├Q.╬0Ñ£àKa╜¬▒╛⌠¡· ]∙≡╗    pTPK Xτ± aF^╬W┘ÅßJy=MH█ô+╦Kôπ┼▒≤oñ╖Ç▀æ~╝α╞Å $K╣}Φ
  99367. póÉg╙z^■▐ò¢ïƒo┐ ¿î+ⁿ>╛gΣs╩ß╕╦C)_J)Σ%û╣o√Y⌡'╓DLwÅfiêΘuΩ U─Γé=XSCX╫═╫âkΩè5Cî─YûûïR╠)x
  99368. Qδ└-)ä~Æ╗▐└í£°║╬╤ïO¥L¿╖QD-«ò╧╪¼pg■¬╡▄°~Ö└lÅ║╒g$ê═▐;æObZgε║|òDû╗wß═╘=π≥.ÿb├╡τ¼C╕Ö∙W ⌐EΦ▓g%╛²╫┼╒t;-úSB⌐▐╨C;┼┴≥▄«█OC½╨6 ¿:;·╥{Iε{k╘ß·╤╘X╔ ▒≡╨ç│╥Z╨h ┘ú⌐çL¬▐₧πU░'[ÿOq/â¼╪(ªQì╙KhbßεÄ^▒çëR┤D┴q4∙▄╦µ█bmnß╛╨Cd#├s3'8¼?Σf╜┤à2~┴╒ü╖Nºá╜╒6éWYΘ@ Θ8$]:╢╗Éê{%╣]ⁿk ëá:-∩≡░ß┘]oQ#M%¥°±¡ú≈(╤¡°1üî├.╧,f0K╝σ»V±╡¼≈^æ╢4 g2:∙¢no¡█8T┌û0ÇÆB╧ü\ï╫Vïï½\!
  99369.  
  99370. ±M$ *íΓX@°Ö₧#ô>⌡╤»ü╛÷╤╞⌐≈╖W╖╛Ç'Zx_╤É+@Æ=|ZC{
  99371. ≥┴@&2Gª<Aoí«)∞█PNΩ┌▌≤¥ª ö`Kk ╙»C'ó┼ÇPNíå/εx╛|₧≡TSeíjû╥▄Qqá|┴ù┬·┼║v╡C≥±·Bº≥CQ░e!
  99372.  
  99373. ≥E1+éå>,αΘ£+æ7╥└²┼≡╨▓┐╫░ûRU║√╘sz[┬ì=FéMAjzTjO≡ê\&'[πh[oΓ╕0 ▌Kí▓│▐τ╬█4_j ▀ñd!!║└╬^ôƒ5»W÷iÿΦ<%`(αpù₧PÅ{║.─Ç╩Γ╪Ñ}╞O≥±■f▓▒DP░e v┬τ4╥╨]µMo╬F╬└${ⁿçhα[z┼,±└ε.á║Ω√ß Φ«=É╙ªdKh⌐&╠5]=ú~╧₧ñjd&F Ç▄oÿ_É░┴▒ u±¿äìë?úµΦΘ ;HC»hε
  99374. uRó╖Z┴{^┴ôó£₧╞█┬╫≤G║Z╙cµ?╩σ∙╙Z4]/⌠6₧╖%dƒ0ôKæu++sñytêΦu╣Wew═░ßR=Cl╫╟Æ▌Aü÷P>≈°EÉù₧K≥#;[Q╩≈( ?É`┘û▓╗5┼≥╫┐╟ÄïPî]«▐F%┤Ü╝┘#úe&⌠║╡öà|eàÅ"ñëΣQQº±■*ê01 ï└╡⌠ï^σ╬¬FâÅB∙x"Ü╜ó╥i╥ à0é▌
  99375. °á
  99376. W-░±âï°s8-ú9'╧ñ╞'Vó²╛OÆ⌡ë{G°£#φ<:┐╥XAΦ)EΩ▌·σ╪]▄ »ß╨å¡╥GP∞jT¥W╝╕╚@σÖ═¿(! !
  99377.  
  99378. DIBSection comment:
  99379. ''!
  99380. !DIBSection class methodsFor!
  99381.  
  99382. width: width height: height
  99383.     "Answers a true-colour DIBSection bitmap of dimensions width*height*24 bits/pixel."
  99384.  
  99385.     ^self
  99386.         width: width 
  99387.         height: height 
  99388.         depth: 24
  99389.         !
  99390.  
  99391. width: width height: height depth: depth
  99392.     "Answers a DIBSection bitmap of dimensions width*height. The number of colour bits
  99393.     per pixel are given by depth, which must be one of 1,4,8,16,24 or 32 (although
  99394.     see instance side for further current limitations)."
  99395.  
  99396.     ^super new
  99397.         width: width 
  99398.         height: height 
  99399.         depth: depth
  99400.         ! !
  99401.  
  99402. !DIBSection methodsFor!
  99403.  
  99404. baseLoadFlags
  99405.     "Answer the basic load flags to be used when calling LoadImage() to realize the receiver."
  99406.  
  99407.     ^##(LR_COLOR | LR_CREATEDIBSECTION)!
  99408.  
  99409. cacheInfo
  99410.     "Private - Cache info about the receiver garnered from the bitmap itself.
  99411.     Since we also grab a pointer to the image bits, it is now possible to scribble
  99412.     all over a DIB loaded from resources/a file. This should only get invoked
  99413.     for DIBSections loaded from a resource or file."
  99414.  
  99415.     | bitmapInfo |
  99416.     bitmapInfo := self getInfo.
  99417.     extent := bitmapInfo extent.
  99418.     depth := bitmapInfo depth.
  99419.     imageBits := bitmapInfo bmBits!
  99420.  
  99421. clearCached
  99422.     "Private - Clear down the receiver's handles and cached info."
  99423.  
  99424.     super clearCached.
  99425.     imageBits := nil.
  99426.     "The depth may doesn't change after creation, so we don't clear it."!
  99427.  
  99428. createHandle
  99429.     "Private - Answer an external handle to the image represented by the receiver.
  99430.     If the receiver has an identifier, then we attempt to load the external resource,
  99431.     otherwise we create a DIBSECTION for manipulation."
  99432.  
  99433.     | info dibSection |
  99434.     identifier isNil ifFalse: [^super createHandle].
  99435.     info := BITMAPINFOHEADER new.
  99436.     info
  99437.         biWidth: extent x;
  99438.         biHeight: extent y negated;
  99439.         biPlanes: 1;
  99440.         biBitCount: depth;
  99441.         biCompression: BI_RGB.    "Top down pixel order"
  99442.  
  99443.     "Slot for pointer to the bitmap bits"
  99444.     imageBits := ExternalAddress new.
  99445.  
  99446.     "Create the bitmap but differently for RGB and paletized usage"
  99447.     depth > 8 
  99448.         ifTrue: 
  99449.             ["RGB usage"
  99450.  
  99451.             dibSection := GDILibrary default 
  99452.                         createDIBSection: 0
  99453.                         pbmi: info
  99454.                         iUsage: DIB_RGB_COLORS
  99455.                         ppvBits: imageBits
  99456.                         hSection: 0
  99457.                         dwOffset: 0]
  99458.         ifFalse: 
  99459.             ["Paletized usage"
  99460.  
  99461.             | palBitmap canvas bits |
  99462.             bits := DWORD new.
  99463.             palBitmap := Bitmap 
  99464.                         width: 1
  99465.                         height: 1
  99466.                         planes: 1
  99467.                         bitsPerPixel: depth
  99468.                         bits: bits.
  99469.             canvas := palBitmap canvas.
  99470.             dibSection := GDILibrary default 
  99471.                         createDIBSection: canvas asParameter
  99472.                         pbmi: info
  99473.                         iUsage: DIB_PAL_COLORS
  99474.                         ppvBits: imageBits
  99475.                         hSection: 0
  99476.                         dwOffset: 0.
  99477.             palBitmap free].
  99478.     ^dibSection!
  99479.  
  99480. depth
  99481.     "Answer the colour depth of the receiver."
  99482.  
  99483.     depth isNil ifTrue: [self cacheInfo].
  99484.     ^depth!
  99485.  
  99486. erase
  99487.     "Private - Erase area occupied by the DIB."
  99488.  
  99489.     self canvas 
  99490.         fillRectangle: (Rectangle origin: Point zero extent: self extent) 
  99491.         brush: Brush white!
  99492.  
  99493. errorInappropriateColorTable: aRGBQUADArray
  99494.     "Raise an error that the receiver cannot hold aRGBQUADArray as its colour table"
  99495.  
  99496.     ^self error: 'Inappropriate color table'!
  99497.  
  99498. getColorTable
  99499.     "Answer a StructureArray of RGBQUADs which is the colour table for the receiver.
  99500.     Answer nil if the receiver has no color table"
  99501.  
  99502.     | bits canvas size quads |
  99503.     bits := self depth.
  99504.     bits > 8 ifTrue: [^nil].
  99505.     size := 2 raisedToInteger: bits.
  99506.     quads := StructureArray length: size elementClass: RGBQUAD.
  99507.     canvas := self canvas.
  99508.     size := GDILibrary default 
  99509.                 getDIBColorTable: canvas asParameter
  99510.                 uStartIndex: 0
  99511.                 cEntries: size
  99512.                 pColors: quads.
  99513.     size == 0 ifTrue: [^Win32Error signal].
  99514.     quads length: size.
  99515.     ^quads!
  99516.  
  99517. getDIBSECTION
  99518.     "Answers a DIBSECTION structure class containing details about the receiver."
  99519.  
  99520.     | ds |
  99521.     ds := DIBSECTION new.
  99522.     self getData: ds.
  99523.     ^ds!
  99524.  
  99525. imageBits
  99526.     "Answer the handle of the receiver's image bits"
  99527.  
  99528.     imageBits isNil ifTrue: [self cacheInfo].
  99529.     ^imageBits!
  99530.  
  99531. setColorTable: anRGBQUADArray 
  99532.     "Sets the colour table for the receiver to be that in anRGBQUADArray.
  99533.     Signals #errorInvalidColorTable if the table is the wrong size, or not appropriate,
  99534.     for the receiver"
  99535.  
  99536.     | bits size newSize canvas |
  99537.     bits := self depth.
  99538.     size := 2 raisedToInteger: bits.
  99539.     anRGBQUADArray size = size 
  99540.         ifFalse: 
  99541.             ["Inappropriate colour table size"
  99542.             self errorInappropriateColorTable: anRGBQUADArray].
  99543.     canvas := self canvas.
  99544.     newSize := GDILibrary default 
  99545.                 setDIBColorTable: canvas asParameter
  99546.                 uStartIndex: 0
  99547.                 cEntries: size
  99548.                 pColors: anRGBQUADArray.
  99549.     size == newSize ifFalse: [^Win32Error signal]!
  99550.  
  99551. width: w height: h depth: d
  99552.     "Private - Initializes the receiver to dimensions width*height. The number of colour bits
  99553.     per pixel are given by depth. Note that paletized DIBs are now supported but an
  99554.     appropriate color table will need to be set using #setColorTable before using the 
  99555.     DIBSection. Answer the receiver."
  99556.  
  99557.     extent := w@h.
  99558.     depth := d! !
  99559.  
  99560. Cursor comment:
  99561. ''!
  99562. !Cursor class methodsFor!
  99563.  
  99564. appStarting
  99565.     "Answer the instance that is the AppStarting cursor."
  99566.  
  99567.     AppStarting isNil ifTrue: [
  99568.         AppStarting := self fromSystemId: IDC_APPSTARTING].
  99569.  
  99570.     ^AppStarting!
  99571.  
  99572. arrow
  99573.     "Answer the instance that is the Arrow cursor."
  99574.  
  99575.     Arrow isNil ifTrue: [
  99576.         Arrow := self fromSystemId: IDC_ARROW].
  99577.  
  99578.     ^Arrow!
  99579.  
  99580. cross
  99581.     "Answer the instance that is the Cross cursor."
  99582.  
  99583.     Cross isNil ifTrue: [
  99584.         Cross := self fromSystemId: IDC_CROSS].
  99585.  
  99586.     ^Cross!
  99587.  
  99588. current
  99589.     "Answers the current global cursor. This may be nil."
  99590.  
  99591.     ^Current!
  99592.  
  99593. current: aCursorOrNil
  99594.     "Private - Set the current cursor to aCursorOrNil.
  99595.     Answers the previous current cursor (or nil)."
  99596.  
  99597.     | original |
  99598.     original := Current.
  99599.     Current := aCursorOrNil.
  99600.     UserLibrary default setCursor: Current asParameter.
  99601.     ^original!
  99602.  
  99603. ddCopy
  99604.     "Answer the instance that is the OLE DROPEFFECT_COPY cursor."
  99605.  
  99606.     DDCopy isNil ifTrue: [
  99607.         DDCopy := self fromId: 3 in: (ExternalResourceLibrary open: 'ole32')].
  99608.  
  99609.     ^DDCopy!
  99610.  
  99611. ddCopyScroll
  99612.     "Answer the instance that is the OLE DROPEFFECT_COPY | DROPEFFECT_SCROLL cursor."
  99613.  
  99614.     DDCopyScroll isNil ifTrue: [
  99615.         DDCopyScroll := self fromId: 6 in: (ExternalResourceLibrary open: 'ole32')].
  99616.  
  99617.     ^DDCopyScroll!
  99618.  
  99619. ddLink
  99620.     "Answer the instance that is the OLE DROPEFFECT_LINK cursor."
  99621.  
  99622.     DDLink isNil ifTrue: [
  99623.         DDLink := self fromId: 4 in: (ExternalResourceLibrary open: 'ole32')].
  99624.  
  99625.     ^DDLink!
  99626.  
  99627. ddLinkScroll
  99628.     "Answer the instance that is the OLE DROPEFFECT_LINK | DROPEFFECT_SCROLL cursor."
  99629.  
  99630.     DDLinkScroll isNil ifTrue: [
  99631.         DDLinkScroll := self fromId: 7 in: (ExternalResourceLibrary open: 'ole32')].
  99632.  
  99633.     ^DDLinkScroll!
  99634.  
  99635. ddMove
  99636.     "Answer the instance that is the OLE DROPEFFECT_MOVE cursor."
  99637.  
  99638.     DDMove isNil ifTrue: [
  99639.         DDMove := self fromId: 2 in: (ExternalResourceLibrary open: 'ole32')].
  99640.  
  99641.     ^DDMove!
  99642.  
  99643. ddMoveScroll
  99644.     "Answer the instance that is the OLE DROPEFFECT_MOVE | DROPEFFECT_SCROLL cursor."
  99645.  
  99646.     DDMoveScroll isNil ifTrue: [
  99647.         DDMoveScroll := self fromId: 5 in: (ExternalResourceLibrary open: 'ole32')].
  99648.  
  99649.     ^DDMoveScroll!
  99650.  
  99651. ddNone
  99652.     "Answer the instance that is the OLE DROPEFFECT_NONE cursor."
  99653.  
  99654.     DDNone isNil ifTrue: [
  99655.         DDNone := self fromId: 1 in: (ExternalResourceLibrary open: 'ole32')].
  99656.  
  99657.     ^DDNone!
  99658.  
  99659. filesType
  99660.     "Private - Answer a two element array suitable for adding to the FileDialog
  99661.     with the fileTypes: message."
  99662.  
  99663.     ^#('Cursor Files (*.cur)' '*.cur')!
  99664.  
  99665. help
  99666.     "Answer the instance that is the Help cursor."
  99667.  
  99668.     Help isNil ifTrue: [
  99669.         Help := self fromSystemId: 32651].
  99670.  
  99671.     ^Help!
  99672.  
  99673. hide
  99674.     "Hide the current cursor"
  99675.  
  99676.     self show: false!
  99677.  
  99678. iBeam
  99679.     "Answer the instance that is the IBeam cursor."
  99680.  
  99681.     IBeam isNil ifTrue: [
  99682.         IBeam := self fromSystemId: IDC_IBEAM].
  99683.  
  99684.     ^IBeam!
  99685.  
  99686. icon
  99687.     "Answers an Icon that can be used to represent this class"
  99688.  
  99689.     ^self arrow!
  99690.  
  99691. no
  99692.     "Answer the instance that is the No cursor."
  99693.  
  99694.     No isNil ifTrue: [
  99695.         No := self fromSystemId: IDC_NO].
  99696.  
  99697.     ^No!
  99698.  
  99699. onPreStripImage
  99700.     "Private - The image is about to be stripped. Nil the lazily initialized cursors to allow
  99701.     them to be removed (and also perhaps the ref to the resource library)."
  99702.  
  99703.     self uninitialize!
  99704.  
  99705. position
  99706.     "Answer a Point containing the current cursor position in screen co-ordinates."
  99707.  
  99708.     | pos |
  99709.     pos := POINTL new.
  99710.     UserLibrary default getCursorPos: pos.
  99711.     ^pos asPoint
  99712. !
  99713.  
  99714. show
  99715.     "Shows the current cursor"
  99716.  
  99717.     self show: true!
  99718.  
  99719. show: aBoolean
  99720.     "Show or hide the current cursor according to aBoolean"
  99721.  
  99722.     UserLibrary default showCursor: aBoolean asParameter!
  99723.  
  99724. sizeAll
  99725.     "Answer the instance that is the SizeAll cursor."
  99726.  
  99727.     SizeAll isNil ifTrue: [
  99728.         SizeAll := self fromSystemId: IDC_SIZEALL].
  99729.  
  99730.     ^SizeAll!
  99731.  
  99732. sizeNESW
  99733.     "Answer the instance that is the SizeNESW cursor."
  99734.  
  99735.     SizeNESW isNil ifTrue: [
  99736.         SizeNESW := self fromSystemId: IDC_SIZENESW].
  99737.  
  99738.     ^SizeNESW!
  99739.  
  99740. sizeNS
  99741.     "Answer the instance that is the SizeNS cursor."
  99742.  
  99743.     SizeNS isNil ifTrue: [
  99744.         SizeNS := self fromSystemId: IDC_SIZENS].
  99745.  
  99746.     ^SizeNS    !
  99747.  
  99748. sizeNWSE
  99749.     "Answer the instance that is the SizeNWSE cursor."
  99750.  
  99751.     SizeNWSE isNil ifTrue: [
  99752.         SizeNWSE := self fromSystemId: IDC_SIZENWSE].
  99753.  
  99754.     ^SizeNWSE!
  99755.  
  99756. sizeWE
  99757.     "Answer the instance that is the SizeWE cursor."
  99758.  
  99759.     SizeWE isNil ifTrue: [
  99760.         SizeWE := self fromSystemId: IDC_SIZEWE].
  99761.  
  99762.     ^SizeWE!
  99763.  
  99764. splitHorizontal
  99765.     "Answer the instance that is the SplitHorizontal cursor."
  99766.  
  99767.     SplitHorizontal isNil ifTrue: [SplitHorizontal := self fromId: 'HSPLIT' in: VMLibrary default].
  99768.     ^SplitHorizontal!
  99769.  
  99770. splitVertical
  99771.     "Answer the instance that is the SplitVertical cursor."
  99772.  
  99773.     SplitVertical isNil ifTrue: [SplitVertical := self fromId: 'VSPLIT' in: VMLibrary default].
  99774.     ^SplitVertical!
  99775.  
  99776. uninitialize
  99777.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  99778.  
  99779.     DDCopy := DDCopyScroll := 
  99780.         DDLink := DDLinkScroll := 
  99781.         DDMove := DDMoveScroll := 
  99782.         DDNone := nil.
  99783.  
  99784.     AppStarting := Arrow := Cross := Help := IBeam := No := Wait :=
  99785.         SizeAll := SizeNESW := SizeNS := SizeNWSE := SizeWE := 
  99786.         SplitHorizontal := SplitVertical := UpArrow := nil.
  99787.  
  99788.     Current := nil.!
  99789.  
  99790. upArrow
  99791.     "Answer the instance that is the UpArrow cursor."
  99792.  
  99793.     UpArrow isNil ifTrue: [
  99794.         UpArrow := self fromSystemId: IDC_UPARROW].
  99795.  
  99796.     ^UpArrow!
  99797.  
  99798. wait
  99799.     "Answer the instance that is the Wait cursor."
  99800.  
  99801.     Wait isNil ifTrue: [
  99802.         Wait := self fromSystemId: IDC_WAIT].
  99803.  
  99804.     ^Wait! !
  99805.  
  99806. !Cursor methodsFor!
  99807.  
  99808. imageType
  99809.     "Private - Answer the Win32 image type for the receiver."
  99810.  
  99811.     ^IMAGE_CURSOR!
  99812.  
  99813. loadFromInstance: hModule
  99814.     "Private - Attempts to load the receiver as a resource from an instance. 
  99815.     I would have expected the User32 loadImage function to be capable of this but
  99816.     it does not appear to work for instance 0; the system. Hence this method 
  99817.     which tries the old way. Answers the loaded handle or nil if the load failed"
  99818.  
  99819.     ^UserLibrary default loadCursor: hModule asParameter lpCursorName: identifier asParameter!
  99820.  
  99821. makeCurrent
  99822.     "Make the receiver become the current global cursor."
  99823.  
  99824.     self class current: self!
  99825.  
  99826. setCursor
  99827.     "Private - Set the receiver as the current Windows cursor. Answers the handle of the old
  99828.     cursor."
  99829.  
  99830.     ^UserLibrary default setCursor: self asParameter!
  99831.  
  99832. showWhile: aBlock
  99833.     "Maintain the wait cursor while aBlock is executed, answering the result of the block.
  99834.     The actual cursor which was current is restored (rather than the one we think is Current)."
  99835.  
  99836.     | previous actual |
  99837.     previous := Current.
  99838.     Current := self.
  99839.     actual := self setCursor.
  99840.     ^aBlock ensure: 
  99841.             [Current := previous.
  99842.             UserLibrary default setCursor: actual]! !
  99843.  
  99844. MenuBar comment:
  99845. ''!
  99846. !MenuBar class methodsFor!
  99847.  
  99848. publishedAspectsOfInstances
  99849.     "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  99850.  
  99851.     ^(super publishedAspectsOfInstances)
  99852.         add: ((Aspect menuBar: #yourself) isNullable: false);
  99853.         removeKey: #text;
  99854.         yourself! !
  99855.  
  99856. !MenuBar methodsFor!
  99857.  
  99858. composerViewClass
  99859.         "Private - Answer the class of view used for displaying the receiver."
  99860.     
  99861.         ^MenuBarComposerView!
  99862.  
  99863. createHandle
  99864.     "Private - Answer an external handle to a new menu."
  99865.  
  99866.     ^UserLibrary default createMenu!
  99867.  
  99868. isMenuBar
  99869.     "Private - Answer whether the receiver is a menu bar rather
  99870.     than a popup menu."
  99871.  
  99872.     ^true!
  99873.  
  99874. printOn: aStream
  99875.     "Append, to aStream, a String whose characters are a description of the receiver as a developer
  99876.     would want to see it."
  99877.  
  99878.     aStream basicPrint: self
  99879. !
  99880.  
  99881. queryAlong: route
  99882.     "Answer a <CommandQuery> reflecting the current state of the receiver's
  99883.     command for the <commandPolicy>, route. We want top-level MenuBars to 
  99884.     be enabled by default."
  99885.  
  99886.     | src |
  99887.     src := route source.
  99888.     ^(CommandQuery commandDescription: self commandDescription source: src)
  99889.         receiver: src topView;
  99890.         beEnabled;
  99891.         yourself!
  99892.  
  99893. showIn: aWindow position: aPos
  99894.     "Private - Show the receiver in aWindow at aPos."
  99895.  
  99896.     ^self shouldNotImplement! !
  99897.  
  99898. StockPen comment:
  99899. ''!
  99900. !StockPen class methodsFor!
  99901.  
  99902. fromId: anInteger
  99903.     "Answer a new instance of the receiver representing the stock pen id anInteger."
  99904.  
  99905.     ^self new
  99906.         ownsHandle: false;
  99907.         id: anInteger;
  99908.         yourself! !
  99909.  
  99910. !StockPen methodsFor!
  99911.  
  99912. createHandle
  99913.     "Private - Answer the handle for the stock pen with receiver's id."
  99914.  
  99915.     ^self getStockObject: id!
  99916.  
  99917. id: anInteger
  99918.     "Private - Set stockID to anInteger and obtain the handle."
  99919.  
  99920.     id := anInteger.
  99921.     self basicRealize! !
  99922.  
  99923. CLSID comment:
  99924. 'CLSID the class of 128-bit Globally Unique Identifiers (guids) which are specifically used to uniquely identify coclasses (components) in COM.
  99925.  
  99926. The CLSIDs of all coclasses registered on your machine can be found under the HKCR\CLSID key in your registry. Each correctly formed entry will have a human (are VB programmers human?) readable form (a ProgID) directly under HKCR.'!
  99927. !CLSID class methodsFor!
  99928.  
  99929. fromProgID: aString
  99930.     "Answer a new instance of the receiver instantiated from the argument, aString,
  99931.     which contains a ProgID which is expected to be in the registry."
  99932.  
  99933.     | answer unicodeString |
  99934.     answer := self newNull.
  99935.     unicodeString := aString asUnicodeString.
  99936.     OLELibrary default CLSIDFromProgID: unicodeString pclsid: answer.
  99937.     ^answer!
  99938.  
  99939. fromString: aString
  99940.     "Answer an instance of the receiver instantiated from the argument, aString."
  99941.  
  99942.     | answer unicodeString |
  99943.     aString isEmpty ifTrue: [^self null].
  99944.     aString first ~~ ${ ifTrue: [^self fromProgID: aString].
  99945.     answer := self newNull.
  99946.     unicodeString := aString asUnicodeString.
  99947.     OLELibrary default CLSIDFromString: unicodeString pclsid: answer.
  99948.     ^answer!
  99949.  
  99950. initialize
  99951.     "Private - Initialize the receiver's class variables.
  99952.         CLSID initialize
  99953.     "
  99954.  
  99955.     self extraInstanceSpec: self byteSize!
  99956.  
  99957. ∩A0)ü«¢É╓jë:∩╙√─ô╜╢ùƒⁿ╢DF¡√┴;}MAÆ╖t▓~vObb òXj/Uªx~¡δ(⌡╥F@⌠╛╣è≥╚ ╔8 kn▌¿e~ε└╬J\öÉfεL░=ä    ∙] ;Σmë█K╥/┼0=┴åâ∙╩αr╚    ÉÄæp
  99958. π⌡^W▓axè»#╠╨KΦB └╒·*h≈╞l╦LiÇ6┐£░eRûÅ╩╠┴?÷¬lY╖τªX`JPc<Ü)∩#bñ}á{πƒjLfmΦ│▓ô■╓¼⌠;ñ╢ä├¥*╜úá█_w║<ΩZε┤d┼cO╧
  99959. ƒÆÇ╘ƒ[₧┌├!
  99960.  
  99961. ≈PJp\zàü!!>┐╗╠>ì:íΓ╬■╩ε∩≡■║¬]F ┤╞;g@SÆ▓
  99962. m»g|jmT]x≈Å
  99963. J/fZ░yW*╢ñ`■█Q║╛╡¢╖█╫f[ki╠╣u╜ë¡3!!üâ5╣K│s╨∙A] +Σjï█]▄Kz∞|ÅñΓ─σü]╝S╤┘■b─ÿiß(+Cú·'╤╥^≤H ┬|╒α9`≈╙kéCzÜ≥Ω╖{Wƒ¥╤┌⌐k┬! !
  99964.  
  99965. !CLSID methodsFor!
  99966.  
  99967. asString
  99968.     "Answer a string representation of the receiver which is expected to be a CLSID (if not
  99969.     an error may result)."
  99970.  
  99971.     | buf answer |
  99972.     buf := COMTaskMemory new.
  99973.     OLELibrary default stringFromCLSID: self ppsz: buf.
  99974.     answer := String fromUnicodeString: buf.
  99975.     buf free.        "remove finalization overhead by explicity freeing"
  99976.     ^answer!
  99977.  
  99978. displayOn: aStream
  99979.     "Append an 'end-user suitable' textual representation of the receiver to aStream.
  99980.     GUIDs are a fairly technical concept, but they do appear in the registry in a
  99981.     certain format, which we use here."
  99982.  
  99983.     [aStream nextPutAll: self progID] on: HRESULTError do: [:e |
  99984.         aStream 
  99985. "            nextPutAll: ' (Unregistered) ';"
  99986.             nextPutAll: self asString]!
  99987.  
  99988. progID
  99989.     "Answer the ProgID associated with the receiver (if any). The result
  99990.     is a String, but is not really appropriate for end-user display.
  99991.     If the registry contains no relevant entry, then an appropriate
  99992.     HRESULTError will be raised.
  99993.     Note that a ProgID has a maximum of 39 characters."
  99994.  
  99995.     | pProgId answer |
  99996.     pProgId := COMTaskMemory new.
  99997.     OLELibrary default progIDFromCLSID: self lplpszProgID: pProgId.
  99998.     ^(UnicodeString fromAddress: pProgId) asString! !
  99999.  
  100000. IID comment:
  100001. 'IID is the class of 128-bit Globally Unique Identifiers (guids) which are specifically used to uniquely identify interfaces in COM.
  100002.  
  100003. Many interfaces are not recorded in the registry, but if they have marshalling support (a proxy/stub DLL) then they will be registered under HKCR\Interfaces. Registered IIDs will display with their registered name, otherwise the string representation of their GUID is printed.'!
  100004. !IID class methodsFor!
  100005.  
  100006. fromString: aString
  100007.     "Answer a new instance of the receiver instantiated from the argument, aString,
  100008.     which is in Microsoft(tm) GUID format."
  100009.  
  100010.     | answer unicodeString |
  100011.     answer := self newNull.
  100012.     unicodeString := aString asUnicodeString.
  100013.     OLELibrary default IIDFromString: unicodeString lpiid: answer.
  100014.     ^answer!
  100015.  
  100016. initialize
  100017.     "Private - Initialize the receiver's class variables.
  100018.         IID initialize
  100019.     "
  100020.  
  100021.     self extraInstanceSpec: self byteSize! !
  100022.  
  100023. !IID methodsFor!
  100024.  
  100025. asString
  100026.     "Answer a string representation of the receiver which is expected to be a CLSID (if not
  100027.     an error may result)."
  100028.  
  100029.     | buf answer |
  100030.     buf := COMTaskMemory new.
  100031.     OLELibrary default stringFromIID: self lplpsz: buf.
  100032.     answer := String fromUnicodeString: buf.
  100033.     buf free.        "remove finalization overhead by explicity freeing"
  100034.     ^answer
  100035.  
  100036. "
  100037. IUnknown iid asString
  100038. "!
  100039.  
  100040. displayOn: aStream
  100041.     "Append an 'end-user suitable' textual representation of the receiver to aStream.
  100042.     The interface name is rather more helpful, if available!!"
  100043.  
  100044.     | ifName |
  100045.     ifName := self interfaceName.
  100046.     ifName isNil 
  100047.         ifTrue: [super displayOn: aStream]
  100048.         ifFalse: [aStream nextPutAll: ifName]!
  100049.  
  100050. interfaceName
  100051.     "Answer the name of the interface associated with the receiver, or nil if it is
  100052.     not registered. This depends on the registry and is primarily included for
  100053.     development/debugging and tools, rather than for use in applications."
  100054.  
  100055.     ^(((RegKey classesRoot: #read) at: 'Interface') at: self asString ifAbsent: [^nil]) value
  100056. ! !
  100057.  
  100058. IconImageManager comment:
  100059. ''!
  100060. !IconImageManager class methodsFor!
  100061.  
  100062. current
  100063.     "Answer the singleton instance of the receiver"
  100064.  
  100065.     Current isNil ifTrue: [Current := super new].
  100066.     ^Current!
  100067.  
  100068. new
  100069.     "Private - The receiver is a singleton class"
  100070.  
  100071.     ^self shouldNotImplement!
  100072.  
  100073. reset
  100074.     "Reset the receiver. Kill off the current singleton instance"
  100075.  
  100076.     Current := nil!
  100077.  
  100078. uninitialize
  100079.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  100080.  
  100081.     Current := nil.! !
  100082.  
  100083. !IconImageManager methodsFor!
  100084.  
  100085. initialize
  100086.     "Private - Initialize the receiver."
  100087.  
  100088.     super initialize.
  100089.     maskcolor := Color none.!
  100090.  
  100091. stbSaveOn: anSTBOutFiler
  100092.     "Output the singleton receiver to anSTBOutFiler."
  100093.  
  100094.     anSTBOutFiler saveObject: self as: (STBSingletonProxy for: self class)! !
  100095.  
  100096. CapturingInteractor comment:
  100097. '<CapturingInteractor> is the class of interactors that intercept user input events and absorb them so that they do not reach the presenter. i.e. if a <CapturingInteractor> is installed into a view then it will appear to ignore all user input. Subclasses may use the input for other purposes, or selectively forward it on to the presenter.'!
  100098. !CapturingInteractor methodsFor!
  100099.  
  100100. onKeyPressed: aKeyEvent
  100101.     "The event source received a key press event, gobble it up."
  100102.  
  100103.     ^false!
  100104.  
  100105. onKeyReleased: aKeyEvent
  100106.     "The event source received a key upevent, gobble it up."
  100107.  
  100108.     ^false!
  100109.  
  100110. onKeyTyped: aKeyEvent
  100111.     "The event source received a key entry event, gobble it up.
  100112.     Implementation Note: These should not actually occur since
  100113.     key/up and down events are consumed and not passed on for
  100114.     default processing."
  100115.  
  100116.     ^false!
  100117.  
  100118. onLeftButtonDoubleClicked: aMouseEvent
  100119.     "The event source received a mouse left button double-click event
  100120.     gobble it up."
  100121.  
  100122.     ^false!
  100123.  
  100124. onLeftButtonPressed: aMouseEvent
  100125.     "The event source received a mouse left button down event,
  100126.     gobble it up."
  100127.  
  100128.     ^false!
  100129.  
  100130. onLeftButtonReleased: aMouseEvent
  100131.     "The event source received a mouse left button up event,
  100132.     gobble it up."
  100133.  
  100134.     ^false!
  100135.  
  100136. onMiddleButtonDoubleClicked: aMouseEvent 
  100137.     "The event source received a mouse middle button double-click event
  100138.     gobble it up."
  100139.  
  100140.     ^false!
  100141.  
  100142. onMiddleButtonPressed: aMouseEvent 
  100143.     "The event source received a mouse middle button down event,
  100144.     gobble it up."
  100145.  
  100146.     ^false!
  100147.  
  100148. onMiddleButtonReleased: aMouseEvent 
  100149.     "The event source received a mouse middle button up event,
  100150.     gobble it up."
  100151.  
  100152.     ^false!
  100153.  
  100154. onMouseMoved: aMouseEvent
  100155.     "The event source received a mouse move event,
  100156.     gobble it up."
  100157.  
  100158.     ^false!
  100159.  
  100160. onMouseWheeled: aMouseEvent 
  100161.     "The event source received a mouse wheel event,
  100162.     gobble it up."
  100163.  
  100164.     ^false!
  100165.  
  100166. onRightButtonDoubleClicked: aMouseEvent
  100167.     "The event source received a mouse right button double-click event,
  100168.     gobble it up."
  100169.  
  100170.     ^false!
  100171.  
  100172. onRightButtonPressed: aMouseEvent
  100173.     "The event source received a mouse right button down event,
  100174.     gobble it up."
  100175.  
  100176.     ^false!
  100177.  
  100178. onRightButtonReleased: aMouseEvent
  100179.     "The event source received a mouse right button up event,
  100180.     gobble it up."
  100181.  
  100182.     ^false! !
  100183.  
  100184. MouseTracker comment:
  100185. '<MouseTracker> is an <Interactor> that is used to manage the visual dragging of objects using the mouse. An instance should be created as the result of a mouse down event and once started using #startTracking: it captures the mouse and relays the drag messages that are part of the <mouseTrackerTarget> protocol to the target that is assigned to it. Once the drag has completed, and the originating button has been released, the mouse capture is also dropped. Tracking will also be cancelled if the user Alt+Tab''s to another application, or presses the ESC (escape) key (assuming the originating view still has focus).
  100186.  
  100187. Instance Variables:
  100188.     dragButton    <Symbol> identifying the button (either #left or #right) that started the drag
  100189.     target        <mouseTrackerTarget> that receives tracking messages.
  100190.     startPoint        <Point> at which the drag started.
  100191.     origin        <Point> which identifies the origin of an object being dragged.
  100192.     hysteresis        <Point> extent of rectangle outside of which the mouse must move before a drag is started.
  100193.     isTracking        <boolean> indicating whether a drag has actually started.
  100194.     trackPosition    <Point> holding the last drag position.
  100195.     constrain        <Symbol> or nil, identifying any drag constraint (either #horizontal or #vertical).
  100196.  
  100197. '!
  100198. !MouseTracker class methodsFor!
  100199.  
  100200. defaultHysteresis
  100201.     "Answer the default distance in pixels that the mouse must move before 
  100202.     a tracking operation is actually started"
  100203.  
  100204.     ^(UserLibrary default getSystemMetrics: SM_CXDRAG) 
  100205.         @ (UserLibrary default getSystemMetrics: SM_CYDRAG)!
  100206.  
  100207. forPresenter: aPresenter startingAt: aPoint 
  100208.     "Answers an instance of the receiver for tracking the mouse from aPoint
  100209.     in screen coordinates"
  100210.  
  100211.     ^(self forPresenter: aPresenter)
  100212.         startPoint: aPoint;
  100213.         yourself!
  100214.  
  100215. icon
  100216.     "Answers an Icon that can be used to represent this class"
  100217.  
  100218.     ^##(self) defaultIcon! !
  100219.  
  100220. !MouseTracker methodsFor!
  100221.  
  100222. beHorizontalOnly
  100223.     "Set the receiver for horizontal dragging only"
  100224.  
  100225.     constrain := #horizontal.!
  100226.  
  100227. beVerticalOnly
  100228.     "Set the receiver for vertical dragging only"
  100229.  
  100230.     constrain := #vertical.!
  100231.  
  100232. cancelTracking
  100233.     isTracking := false.
  100234.     self target cancelTrackingAt: self trackPosition!
  100235.  
  100236. constrainPositionFromDelta: aPoint
  100237.     "Private - Answers a target position constrained from a delta mouse movement.
  100238.     Applies vertical or horizontal constraints"
  100239.  
  100240.     | delta |
  100241.     delta := aPoint.
  100242.     self isHorizontalOnly ifTrue: [ delta y: 0 ].
  100243.     self isVerticalOnly ifTrue: [ delta x: 0 ].
  100244.     ^self origin + delta!
  100245.  
  100246. dragButton
  100247.     "Answer the receiver's dragButton inst var. This is one of #left or #right and identifies which mouse
  100248.     button up event will signal the end of the tracking operation."
  100249.  
  100250.     ^dragButton!
  100251.  
  100252. dragButton: buttonSymbol
  100253.     "Set the receiver's dragButton inst var to buttonSymbol. This is one of #left or #right and identifies which mouse
  100254.     button up event will signal the end of the tracking operation."
  100255.  
  100256.     dragButton := buttonSymbol!
  100257.  
  100258. dragButtonUp: aMouseEvent 
  100259.     "Private - The mouse has been released so end the current target tracking operation if,
  100260.     in fact, it had started"
  100261.  
  100262.     
  100263.     | delta wasTracking |
  100264.     delta := aMouseEvent position - self startPointLocal.
  100265.     wasTracking := self isTracking.
  100266.     isTracking := false.
  100267.  
  100268.     "Release mouse capture before informing target in case target pops up a message box
  100269.      which confuses Windows such that the drag cursor is only partially turned off.
  100270.      Note that a WM_CAPTURECHANGED will be sent."
  100271.     self releaseCapture.
  100272.     ^wasTracking 
  100273.         ifTrue: [self target endTrackingAt: (self constrainPositionFromDelta: delta). false]!
  100274.  
  100275. hysteresis
  100276.     "Private - Answer the hysteresis value; the radius by which the mouse must
  100277.     move away from the start point before position tracking begins"
  100278.  
  100279.     ^hysteresis!
  100280.  
  100281. hysteresis: anInteger
  100282.     "Sets the hysteresis value of the receiver to anInteger. This is the radius 
  100283.     by which the mouse must    move away from the start point before position 
  100284.     tracking begins"
  100285.  
  100286.     hysteresis := anInteger!
  100287.  
  100288. isHorizontalOnly
  100289.     "Private - Answer true if the receiver is constrained for horizontal dragging only"
  100290.  
  100291.     ^constrain == #horizontal!
  100292.  
  100293. isTracking
  100294.     "Private - Answer true if the receiver is currently tracking for the target.
  100295.     This implies that the mouse has moved outside the hysteresis radius"
  100296.  
  100297.     ^isTracking!
  100298.  
  100299. isVerticalOnly
  100300.     "Private - Answer true if the receiver is constrained for vertical dragging only"
  100301.  
  100302.     ^constrain == #vertical!
  100303.  
  100304. onCaptureChanged: aViewOrNil
  100305.     self view == aViewOrNil
  100306.         ifFalse: 
  100307.             [self view interactor: oldInteractor.
  100308.             self isTracking ifTrue: [self cancelTracking]].
  100309.     ^nil!
  100310.  
  100311. onKeyPressed: aKeyEvent
  100312.     "Default handler for a key press event."
  100313.  
  100314.     aKeyEvent code = VK_ESCAPE ifTrue: [
  100315.         self releaseCapture].
  100316.     "Absorb it"
  100317.     ^false!
  100318.  
  100319. onLeftButtonReleased: aMouseEvent
  100320.     "The left mouse button has been released so if this is the drag button then end the tracking operation."
  100321.  
  100322.     dragButton == #left
  100323.         ifTrue: [^self dragButtonUp: aMouseEvent].
  100324.     ^nil
  100325.  
  100326.  
  100327. !
  100328.  
  100329. onMouseMoved: aMouseEvent
  100330.     "Track the mouse movement to aMouseEvent"
  100331.  
  100332.     | constrainedPosition |
  100333.     constrainedPosition := self 
  100334.                 constrainPositionFromDelta: aMouseEvent position - self startPointLocal.
  100335.     self isTracking 
  100336.         ifTrue: 
  100337.             [self trackPosition: (self target continueTrackingAt: constrainedPosition
  100338.                         from: self trackPosition)]
  100339.         ifFalse: 
  100340.             ["We have not yet moved outside the hysteresis zone"
  100341.  
  100342.             ((Rectangle center: self startPoint extent: self hysteresis) 
  100343.                 containsPoint: aMouseEvent screenPosition) 
  100344.                     ifFalse: 
  100345.                         [isTracking := true.
  100346.                         self trackPosition: (self target startTrackingAt: constrainedPosition)]].
  100347.     ^false    "Don't perform default processing"!
  100348.  
  100349. onRightButtonReleased: aMouseEvent
  100350.     "The right mouse button has been released so if this is the drag button then end the tracking operation."
  100351.  
  100352.     dragButton == #right
  100353.         ifTrue: [^self dragButtonUp: aMouseEvent].
  100354.     ^nil
  100355.  
  100356.  
  100357. !
  100358.  
  100359. origin
  100360.     "Private - Answer the coordinates of the target's origin to aPoint. This is effectively the point
  100361.     being dragged, and is used as the origin for all coordiantes sent to the target during
  100362.     the tracking dialogue"
  100363.  
  100364.     ^origin!
  100365.  
  100366. origin: aPoint
  100367.     "Set the coordinates of the target's origin to aPoint. This is effectively the point
  100368.     being dragged, and is used as the origin for all coordiantes sent to the target during
  100369.     the tracking dialogue"
  100370.  
  100371.     origin := aPoint!
  100372.  
  100373. releaseCapture
  100374.     "Private - Release mouse capture."
  100375.  
  100376.     View releaseCapture.!
  100377.  
  100378. setCapture
  100379.     "Private - Sets mouse capture to the receiver's event source, replacing
  100380.     its current interactor so that all input events come here for the duration
  100381.     of the capture."
  100382.  
  100383.     | source |
  100384.     source := self view.
  100385.     oldInteractor := source interactor: self.
  100386.     source setCapture!
  100387.  
  100388. setPresenter: aPresenter
  100389.     super setPresenter: aPresenter.
  100390.  
  100391.     origin := Point new.
  100392.     hysteresis := self class defaultHysteresis.
  100393.     isTracking := false.
  100394.     dragButton := #left.
  100395.  
  100396. !
  100397.  
  100398. startPoint
  100399.     startPoint isNil ifTrue: [self startPoint: Cursor position].
  100400.     ^startPoint!
  100401.  
  100402. startPoint: aPoint
  100403.     "Private - Set the starting mouse position when the receiver was instantiated.
  100404.     to aPoint in screen coordinates."
  100405.  
  100406.     startPoint := aPoint.    
  100407.     startPointLocal := nil.!
  100408.  
  100409. startPointLocal
  100410.     "Private - Answer the starting mouse position when the receiver was instantiated
  100411.     in the coordinate system of the receiver's source."
  100412.  
  100413.     startPointLocal isNil ifTrue: [startPointLocal := View desktop mapPoint: self startPoint to: self view].
  100414.     ^startPointLocal!
  100415.  
  100416. startTracking: aMouseTrackerTarget 
  100417.     "Start tracking the mouse on behalf of the <mouseTrackerTarget> argument.
  100418.     The mouse is captured and will remain so until the button is released or capture
  100419.     is lost for some other reason."
  100420.  
  100421.     target := aMouseTrackerTarget.
  100422.     self setCapture.
  100423.     "Don't return until capture is released"
  100424.     SessionManager inputState loopWhile: [View capture == self view]!
  100425.  
  100426. target
  100427.     "Private - Answer the target object to be tracked by the receiver"
  100428.  
  100429.     ^target!
  100430.  
  100431. trackPosition
  100432.     "Private - Answer the latest tracking position of the target"
  100433.  
  100434.     ^trackPosition!
  100435.  
  100436. trackPosition: aPoint
  100437.     "Private - Set the latest tracking position of the target to aPoint.
  100438.     If the argument is nil, then stop tracking."
  100439.  
  100440.     (trackPosition := aPoint) isNil ifTrue: [self releaseCapture]!
  100441.  
  100442. trackPositionDelta: aPointDelta
  100443.     "Private - Set the latest tracking position of the target based on
  100444.     a delta value from the origin"
  100445.  
  100446.     trackPosition := self origin + aPointDelta! !
  100447.  
  100448. BorderLayout comment:
  100449. 'BorderLayout implements a general purpose <layoutManager> to layout <view> objects within a <compositeView>. It arranges views that have been added to their parent container with the #arrangement aspects #north, #south, #east, #west and #center. These identified views are arranged along the appropriate edges and in the centre of the container. A BorderLayout attempts to keep the radial dimension of the edge components fixed at either their current size or (if specified) the preferred size.
  100450.  
  100451. Instance Variables:
  100452.     hgap    <integer> horizontal gap between adjacent views
  100453.     vgap    <integer> verticall gap between adjacent views
  100454.     north    <view> that will be positioned at the top of the container
  100455.     south    <view> that will be positioned at the bottom of the container
  100456.     east    <view> that will be positioned at the right of the container
  100457.     west    <view> that will be positioned at the left of the container
  100458.     center    <view> that will be positioned at the centre of the container
  100459. '!
  100460. !BorderLayout class methodsFor!
  100461.  
  100462. horizontalGap: horizontal verticalGap: vertical
  100463.     "Answer a new instance of the receiver intialized with
  100464.     the supplied gaps."
  100465.  
  100466.     ^self new
  100467.         horizontalGap: horizontal;
  100468.         verticalGap: vertical;
  100469.         yourself!
  100470.  
  100471. publishedAspectsOfInstances
  100472.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  100473.     
  100474.         ^(super publishedAspectsOfInstances)
  100475.             add: (Aspect integer: #horizontalGap);
  100476.             add: (Aspect integer: #verticalGap);
  100477.             yourself! !
  100478.  
  100479. !BorderLayout methodsFor!
  100480.  
  100481. arrangementAspect
  100482.         "Private - Answer an Aspect description for the arrangement aspect of Views that
  100483.         are managed by the receiver."
  100484.     
  100485.         ^Aspect choice: #arrangement from: #(north south east west center) andNil: #none
  100486.     !
  100487.  
  100488. arrangementOf: aView
  100489.     "Answer the arrangement parameter of aView in the receiver.
  100490.     This will be one of #center, #east, #west, #north, #south
  100491.     or nil if no paramter has been set for aView"
  100492.  
  100493.     self center == aView ifTrue: [ ^#center ].
  100494.     self west == aView ifTrue: [ ^#west ].
  100495.     self east == aView ifTrue: [ ^#east ].
  100496.     self north == aView ifTrue: [ ^#north ].
  100497.     self south == aView ifTrue: [ ^#south ].
  100498.  
  100499.     ^nil
  100500. !
  100501.  
  100502. arrangementOf: aView put: arrange
  100503.     "Set the arrangement parameter of aView in the receiver to be anObject"
  100504.  
  100505.     self removeSubView: aView.
  100506.     arrange isNil ifTrue: [ ^aView ].
  100507.     arrange == #east
  100508.         ifTrue: [self east: aView]
  100509.         ifFalse: [arrange == #west
  100510.             ifTrue: [self west: aView]
  100511.             ifFalse: [arrange == #north
  100512.                 ifTrue: [self north: aView]
  100513.                 ifFalse: [arrange == #south
  100514.                     ifTrue: [self south: aView]
  100515.                     ifFalse: [arrange == #center
  100516.                         ifTrue: [self center: aView]
  100517.                         ifFalse: [self error: 'Unrecognized arrangement parameter']]]]].
  100518.     ^aView
  100519. !
  100520.  
  100521. center
  100522.     "Answer the view arranged to the center of the container
  100523.     view for which the receiver lays out subviews."
  100524.  
  100525.     ^center!
  100526.  
  100527. center: aView
  100528.     "Set the view arranged to the center of the container
  100529.     view for which the receiver lays out subviews."
  100530.  
  100531.     center := aView!
  100532.  
  100533. east
  100534.     "Answer the view arranged to the right edge of the container
  100535.     view for which the receiver lays out subviews."
  100536.  
  100537.     ^east!
  100538.  
  100539. east: aView
  100540.     "Set the view arranged to the right edge of the container
  100541.     view for which the receiver lays out subviews."
  100542.  
  100543.     east := aView!
  100544.  
  100545. hasCenter
  100546.     "Answer whether a view has been arranged to the centre
  100547.     of the layout."
  100548.  
  100549.     ^self center notNil!
  100550.  
  100551. hasEast
  100552.     "Answer whether a view has been arranged to the left
  100553.     edge."
  100554.  
  100555.     ^self east notNil!
  100556.  
  100557. hasNorth
  100558.     "Answer whether a view has been arranged to the top
  100559.     edge."
  100560.  
  100561.     ^self north notNil!
  100562.  
  100563. hasSouth
  100564.     "Answer whether a view has been arranged to the bottom
  100565.     edge."
  100566.  
  100567.     ^self south notNil!
  100568.  
  100569. hasWest
  100570.     "Answer whether a view has been arranged to the right
  100571.     edge."
  100572.  
  100573.     ^self west notNil!
  100574.  
  100575. horizontalGap
  100576.     "Answer the horizontal gap between items laid out bu the receiver"
  100577.  
  100578.     ^hgap!
  100579.  
  100580. horizontalGap: anInteger
  100581.     "set the horizontal gap between items laid out by the receiver to be anInteger"
  100582.  
  100583.     hgap := anInteger!
  100584.  
  100585. initialize
  100586.     "Private - Initialize the state of the receiver."
  100587.  
  100588.     super initialize.
  100589.     hgap := 0.
  100590.     vgap := 0.!
  100591.  
  100592. layoutContainer: aContainerView 
  100593.     "Performs a layout operation on the contents in aContainerView"
  100594.  
  100595.     | top bottom left right insets |
  100596.     insets := aContainerView actualInsets.
  100597.     top := insets top.
  100598.     bottom := aContainerView clientHeight - insets bottom.
  100599.     left := insets left.
  100600.     right := aContainerView clientWidth - insets right.
  100601.     self hasNorth 
  100602.         ifTrue: 
  100603.             [| d |
  100604.             self north extent: (right - left) @ self north height.
  100605.             d := self north layoutExtent.
  100606.             self north rectangle: (left @ top extent: (right - left) @ d y).
  100607.             top := top + d y + self verticalGap].
  100608.     self hasSouth 
  100609.         ifTrue: 
  100610.             [| d |
  100611.             self south extent: (right - left) @ self south height.
  100612.             d := self south layoutExtent.
  100613.             self south rectangle: (left @ (bottom - d y) extent: (right - left) @ d y).
  100614.             bottom := bottom - (d y + self verticalGap)].
  100615.     self hasEast 
  100616.         ifTrue: 
  100617.             [| d |
  100618.             self east extent: self east width @ (bottom - top).
  100619.             d := self east layoutExtent.
  100620.             self east rectangle: ((right - d x) @ top extent: d x @ (bottom - top)).
  100621.             right := right - (d x + self horizontalGap)].
  100622.     self hasWest 
  100623.         ifTrue: 
  100624.             [| d |
  100625.             self west extent: self west width @ (bottom - top).
  100626.             d := self west layoutExtent.
  100627.             self west rectangle: (left @ top extent: d x @ (bottom - top)).
  100628.             left := left + d x + self horizontalGap].
  100629.     self hasCenter 
  100630.         ifTrue: [self center rectangle: (left @ top extent: (right - left) @ (bottom - top))]!
  100631.  
  100632. north
  100633.     "Answer the view arranged to the top edge of the container
  100634.     view for which the receiver lays out subviews."
  100635.  
  100636.     ^north!
  100637.  
  100638. north: aView
  100639.     "Set the view arranged to the top edge of the container
  100640.     view for which the receiver lays out subviews."
  100641.  
  100642.     north := aView!
  100643.  
  100644. preferredLayoutExtentOf: aContainerView 
  100645.     "Answer aPoint which is the preferred extent when laying out aContainerView"
  100646.  
  100647.     | dim insets |
  100648.     dim := 0 @ 0.
  100649.     self hasEast 
  100650.         ifTrue: 
  100651.             [| d |
  100652.             d := self east layoutExtent.
  100653.             dim x: dim x + d x + self horizontalGap.
  100654.             dim y: (d y max: dim y)].
  100655.     self hasWest 
  100656.         ifTrue: 
  100657.             [| d |
  100658.             d := self west layoutExtent.
  100659.             dim x: dim x + d x + self horizontalGap.
  100660.             dim y: (d y max: dim y)].
  100661.     self hasCenter 
  100662.         ifTrue: 
  100663.             [| d |
  100664.             d := self center layoutExtent.
  100665.             dim x: dim x + d x.
  100666.             dim y: (d y max: dim y)].
  100667.     self hasNorth 
  100668.         ifTrue: 
  100669.             [| d |
  100670.             d := self north layoutExtent.
  100671.             dim x: (d x max: dim x).
  100672.             dim y: dim y + d y + self verticalGap].
  100673.     self hasSouth 
  100674.         ifTrue: 
  100675.             [| d |
  100676.             d := self south layoutExtent.
  100677.             dim x: (d x max: dim x).
  100678.             dim y: dim y + d y + self verticalGap].
  100679.     insets := aContainerView actualInsets.
  100680.     ^dim + insets topLeft + insets bottomRight!
  100681.  
  100682. removeSubView: aView
  100683.     "Remove aView from the collection of views which have been explicitly
  100684.     arranged by the receiver.
  100685.     Answer aView."
  100686.  
  100687.     self center == aView ifTrue: [self center: nil].
  100688.     self west == aView ifTrue: [self west: nil].
  100689.     self east == aView ifTrue: [self east: nil].
  100690.     self north == aView ifTrue: [self north: nil].
  100691.     self south == aView ifTrue: [self south: nil].
  100692.  
  100693.     ^super removeSubView: aView
  100694. !
  100695.  
  100696. reposition: aMovedView to: aPoint
  100697.     "Private - If aMovedView is not one of the receivers views then position
  100698.     it to where it wants to go, otherwise layout the receivers container."
  100699.  
  100700.     aMovedView position: aPoint.
  100701.     aMovedView arrangement notNil ifTrue: [
  100702.         super reposition: aMovedView to: aPoint]!
  100703.  
  100704. resize: aSizedView to: aRectangle
  100705.     "Private - If aSizedView is not one of the receivers views then resize
  100706.     it to its desired rectangle, otherwise layout the receivers container."
  100707.  
  100708.     aSizedView rectangle: aRectangle.
  100709.     aSizedView arrangement notNil ifTrue: [
  100710.         super resize: aSizedView to: aRectangle].
  100711.     ^self.
  100712. !
  100713.  
  100714. resolutionScaledBy: scale
  100715.     "Private - The receiver is being loaded and it has been determined that the pixel resolution
  100716.     has changed since the point at which the view was saved. Scale any internal pixels by <Point>
  100717.     scale."
  100718.  
  100719.     hgap := (hgap * scale x) truncated.
  100720.     vgap := (vgap * scale x) truncated.
  100721.  
  100722.  
  100723. !
  100724.  
  100725. south
  100726.     "Answer the view arranged to the bottom edge of the container
  100727.     view for which the receiver lays out subviews."
  100728.  
  100729.     ^south!
  100730.  
  100731. south: aView
  100732.     "Set the view arranged to the bottom edge of the container
  100733.     view for which the receiver lays out subviews."
  100734.  
  100735.     south := aView!
  100736.  
  100737. verticalGap
  100738.     "Answer the vertical gap between items laid out by the receiver"
  100739.  
  100740.     ^vgap!
  100741.  
  100742. verticalGap: anInteger
  100743.     "set the vertical gap between items laid out by the receiver to be anInteger"
  100744.  
  100745.     vgap := anInteger!
  100746.  
  100747. west
  100748.     "Answer the view arranged to the left edge of the container
  100749.     view for which the receiver lays out subviews."
  100750.  
  100751.     ^west!
  100752.  
  100753. west: aView
  100754.     "Set the view arranged to the left edge of the container
  100755.     view for which the receiver lays out subviews."
  100756.  
  100757.     west := aView! !
  100758.  
  100759. CardLayout comment:
  100760. 'CardLayout implements a specialised <layoutManager> to layout <view> objects within a <cardView>. It arranges the contained views so that they stack on top of one another in z-order sequence. Only one of the views, the so-called current card, is allowed to be visible at any one time.
  100761.  
  100762. The arrangement aspects of the managed views are used as a descriptive names for the cards. The containing <cardView> may make use of these names as it sees fit. For example, a CardContainer uses these as the names for the tabs that it displays.
  100763.  
  100764. Instance Variables:
  100765.     names        <OrderedCollection> of names for each of the managed views.
  100766.     currentCard     <view> that is currently visible in the container.
  100767.  
  100768. '!
  100769. !CardLayout class methodsFor!
  100770.  
  100771. publishedEventsOfInstances
  100772.         "Answer a Set of Symbols that describe the published events triggered
  100773.         by instances of the receiver."
  100774.     
  100775.         ^super publishedEventsOfInstances
  100776.             add: #currentCardChanged;
  100777.             yourself.
  100778.     ! !
  100779.  
  100780. !CardLayout methodsFor!
  100781.  
  100782. arrangementAspect
  100783.         "Private - Answer an Aspect description for the arrangement aspect of Views that
  100784.         are managed by the receiver."
  100785.     
  100786.         ^Aspect string: #arrangement
  100787.     !
  100788.  
  100789. arrangementOf: aView
  100790.     "Answer the arrangement parameter of aView in the receiver"
  100791.  
  100792.     names do: [ :each | each value==aView ifTrue: [ ^each key ]].
  100793.     ^nil
  100794. !
  100795.  
  100796. arrangementOf: aView put: anObject
  100797.     "Set the arrangement parameter of aView in the receiver to be anObject."
  100798.  
  100799.     | previous |
  100800.  
  100801.     "If the view has already an arrangement, we need to remove it."
  100802.     previous := names detect: [:each | each value==aView] ifNone: [].
  100803.     previous notNil ifTrue: [ names remove: previous ].
  100804.  
  100805.     "Now, we can add the new arrangement"
  100806.     names add: (anObject -> aView).
  100807.  
  100808. !
  100809.  
  100810. cards
  100811.     "Private - Answer an OrderedCollection of views that are managed by the 
  100812.     receiver. These views are in the z-order sequence of the ContainerView
  100813.     that manages them"
  100814.  
  100815.     | views container |
  100816.     views := names collect: [ :each | each value ].
  100817.     views isEmpty ifTrue: [ ^OrderedCollection new ].
  100818.     container := views first parentView.
  100819.     ^container managedSubViews select: [ :each | views includes: each ].
  100820. !
  100821.  
  100822. currentCard
  100823.     "Answer the current card or nil if there is none"
  100824.  
  100825.     ^currentCard!
  100826.  
  100827. cycleNextCard
  100828.     "Select the next card in z order sequence after the current card.
  100829.     Cycle round to the first card in the sequence where necessary.
  100830.     Answers the card selected"
  100831.  
  100832.     self nextCard isNil ifTrue: [ self firstCard ].
  100833.     ^self currentCard
  100834.     !
  100835.  
  100836. cyclePreviousCard
  100837.     "Select the previous card in z order sequence before the current card.
  100838.     Cycle round to the last card in the sequence where necessary.
  100839.     Answers the card selected"
  100840.  
  100841.     self previousCard isNil ifTrue: [ self lastCard ].
  100842.     ^self currentCard
  100843.     !
  100844.  
  100845. firstCard
  100846.     "Show the card which is first in the z-order sequence of the 
  100847.     associated container. It is an error to ask for the first card
  100848.     when there is none. Answers the view that is the first card."
  100849.     
  100850.     | card |
  100851.     card := self cards first.
  100852.     self showCard: card.
  100853.     ^card!
  100854.  
  100855. initialize
  100856.     "Private - Initialize the state of the receiver."
  100857.  
  100858.     super initialize.
  100859.     names := OrderedCollection new.!
  100860.  
  100861. lastCard
  100862.     "Show the card which is last in the z-order sequence of the 
  100863.     associated container. It is an error to ask for the first card
  100864.     when there is none. Answers the view that is the last card."
  100865.     
  100866.     | card |
  100867.     card := self cards last.
  100868.     self showCard: card.
  100869.     ^card!
  100870.  
  100871. layoutContainer: aContainerView
  100872.     "Performs a layout operation on the contents in aContainerView"
  100873.  
  100874.     | insets rect |
  100875.     insets := aContainerView actualInsets.
  100876.     rect := insets origin corner: aContainerView clientExtent - insets corner.
  100877.     aContainerView managedSubViews do: [ :view |
  100878.         view rectangle: rect ]!
  100879.  
  100880. nextCard
  100881.     "Show the card which is next in the z-order sequence of the 
  100882.     associated container after the current card that is visible. 
  100883.     Answers the view that is the next card or nil if there is none"
  100884.     
  100885.     | index cards card |
  100886.     cards := self cards.
  100887.     index := (cards indexOf: currentCard ifAbsent: [^self firstCard]) + 1.
  100888.     index <= cards size ifTrue: [
  100889.         card := cards at: index.
  100890.         self showCard: card].
  100891.     ^card!
  100892.  
  100893. preferredLayoutExtentOf: aContainerView
  100894.     "Answer aPoint which is the preferred extent when laying out aContainerView"
  100895.  
  100896.     | extent insets |
  100897.     extent := 0@0.
  100898.     aContainerView managedSubViews do: [:view |
  100899.         extent
  100900.             x: (extent x max: view width);
  100901.             y: (extent y max: view height)].
  100902.     insets := aContainerView actualInsets.
  100903.     ^extent + insets origin + insets corner!
  100904.  
  100905. previousCard
  100906.     "Show the card which is previous in the z-order sequence of the 
  100907.     associated container before the current card that is visible. 
  100908.     Answers the view that is the previous card or nil if there is none"
  100909.     
  100910.     | index cards card |
  100911.     cards := self cards.
  100912.     index := (cards indexOf: currentCard ifAbsent: [^self firstCard]) - 1.
  100913.     index > 0 ifTrue: [
  100914.         card := cards at: index.
  100915.         self showCard: card].
  100916.     ^card!
  100917.  
  100918. removeSubView: aView
  100919.     "Remove aView from the collection of views which have been explicitly
  100920.     arranged by the receiver.
  100921.     Answer aView."
  100922.  
  100923.     aView==currentCard ifTrue: [ currentCard := nil ].
  100924.     names copy do: [:assoc |
  100925.         assoc value == aView ifTrue: [ names remove: assoc ]].
  100926.     ^aView
  100927. !
  100928.  
  100929. showCard: aView
  100930.     "Show the card, aView and make this the current card. This is after
  100931.     hiding the existing current card"
  100932.     
  100933.     self assert: [ self cards includes: aView ].
  100934.  
  100935.     currentCard == aView ifFalse: [
  100936.         aView show.
  100937.         currentCard notNil ifTrue: [ currentCard hide ].
  100938.         currentCard := aView.
  100939.         self trigger: #currentCardChanged ].
  100940.  
  100941.     ^self.!
  100942.  
  100943. showCardWithArrangement: anObject
  100944.     "Show the card identified by an arrangement of anObject and make this the current card.
  100945.     Signals a NotFound exception if a matching view does not exist in the
  100946.     receiver. Answer the view that corresponds to anObject"
  100947.     
  100948.     | view |
  100949.     view := (names detect: [ :each | each key = anObject ]) value.
  100950.     self showCard: view.
  100951.     ^view! !
  100952.  
  100953. FlowLayout comment:
  100954. 'FlowLayout implements a general purpose <layoutManager> to layout <view> objects within a <compositeView>. The views are arranged in a similar manner to words on a page; from left to right and top to bottom. The FlowLayout fits as many views as possible into a single row before moving onto the next row. You can specify the overall alignment of the rows to be #left, #centre or #right. The separation between adjacent components can be specified with the #horizontalGap and #verticalGap aspects. 
  100955.  
  100956. Note that a FlowLayout takes no notice of the #arrangement aspects of the views that it manages.
  100957.  
  100958. A FlowLayout is typically used by a parent Toolbar to manage a series of child bars. This allows the child bars to overflow onto subsequent lines as the parent is re-sized. You can see this effect in action in any of the development tool windows.
  100959.  
  100960. Instance Variables:
  100961.     hgap    <integer> horizontal gap between adjacent views
  100962.     vgap    <integer> vertical gap between adjacent views
  100963.     alignment    <Symbol> either #left, #center or #right
  100964. '!
  100965. !FlowLayout class methodsFor!
  100966.  
  100967. publishedAspectsOfInstances
  100968.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  100969.     
  100970.         ^(super publishedAspectsOfInstances)
  100971.             add: (Aspect integer: #horizontalGap);
  100972.             add: (Aspect integer: #verticalGap);
  100973.             add: (Aspect choice: #alignment from: #(#left #center #right));
  100974.             yourself! !
  100975.  
  100976. !FlowLayout methodsFor!
  100977.  
  100978. alignment
  100979.     "Answers the alignment of the receiver. This will be either #left, #center or #right"
  100980.  
  100981.     ^alignment!
  100982.  
  100983. alignment: aSymbol
  100984.     "Sets the alignment of the receiver to aSymbol"
  100985.  
  100986.     alignment := aSymbol!
  100987.  
  100988. extentOf: aView
  100989.     "Private - Answer the extent required by aView when laid out by the receiver.
  100990.     This takes into account the horizontal and vertical gaps between elements"
  100991.  
  100992.     ^aView layoutExtent + (self horizontalGap @ self verticalGap)!
  100993.  
  100994. flowSplit: aContainerView 
  100995.     "Private - Split the managed views in aContainerView into an OrderedCollection of line collections"
  100996.  
  100997.     | lines thisLine thisWidth maxWidth |
  100998.     lines := OrderedCollection new.
  100999.     thisLine := OrderedCollection new.
  101000.     maxWidth := aContainerView clientWidth - aContainerView actualInsets width.
  101001.     thisWidth := 0.
  101002.     aContainerView managedSubViews do: 
  101003.             [:each | 
  101004.             | thisExtent |
  101005.             thisExtent := each layoutExtent + (self horizontalGap @ self verticalGap).
  101006.             (thisLine notEmpty and: [thisWidth + thisExtent x > maxWidth]) 
  101007.                 ifTrue: 
  101008.                     ["Break onto new line"
  101009.                     lines add: thisLine.
  101010.                     thisLine := OrderedCollection new.
  101011.                     thisWidth := 0].
  101012.             thisLine add: each.
  101013.             thisWidth := thisWidth + thisExtent x].
  101014.     thisLine notEmpty ifTrue: [lines add: thisLine].
  101015.     ^lines!
  101016.  
  101017. horizontalGap
  101018.     "Answer the horizontal gap between items laid out bu the receiver"
  101019.  
  101020.     ^hgap!
  101021.  
  101022. horizontalGap: anInteger
  101023.     "set the horizontal gap between items laid out by the receiver to be anInteger"
  101024.  
  101025.     hgap := anInteger!
  101026.  
  101027. initialize
  101028.     "Private - Initialize the receiver"
  101029.  
  101030.     super initialize.
  101031.     hgap := 0.
  101032.     vgap := 0.
  101033.     alignment := #left.!
  101034.  
  101035. layoutContainer: aContainerView 
  101036.     "Performs a layout operation on the contents in aContainerView"
  101037.  
  101038.     | lines pt insets |
  101039.     insets := aContainerView actualInsets.
  101040.     lines := self flowSplit: aContainerView.
  101041.     pt := 0 @ insets top.
  101042.     lines do: 
  101043.             [:eachLine | 
  101044.             | lineHeight |
  101045.             pt x: (self startOffsetFor: eachLine in: aContainerView).
  101046.             lineHeight := 0.
  101047.             eachLine do: 
  101048.                     [:each | 
  101049.                     | extent |
  101050.                     extent := each layoutExtent.
  101051.                     each rectangle: (pt extent: extent).
  101052.                     extent := extent + (self horizontalGap @ self verticalGap).
  101053.                     pt x: pt x + extent x.
  101054.                     lineHeight := lineHeight max: extent y].
  101055.             pt y: pt y + lineHeight]!
  101056.  
  101057. preferredLayoutExtentOf: aContainerView 
  101058.     "Answer aPoint which is the preferred extent when laying out aContainerView."
  101059.  
  101060.     | lines insets totalHeight totalWidth |
  101061.     totalHeight := totalWidth := 0.
  101062.     lines := self flowSplit: aContainerView.
  101063.  
  101064.     "If there are no lines in the receiver then use the existing extent of aContainerView"
  101065.     lines isEmpty ifTrue: [^aContainerView extent].
  101066.  
  101067.     "Otherwise calculate the maximum extent of all the lines"
  101068.     lines do: 
  101069.             [:eachLine | 
  101070.             | lineWidth lineHeight |
  101071.             lineHeight := lineWidth := 0.
  101072.             eachLine do: 
  101073.                     [:each | 
  101074.                     | layoutExtent |
  101075.                     layoutExtent := each layoutExtent.
  101076.                     lineHeight := lineHeight max: layoutExtent y.
  101077.                     lineWidth := lineWidth := lineWidth + layoutExtent x + self horizontalGap].
  101078.             totalHeight := totalHeight + lineHeight + self verticalGap.
  101079.             totalWidth := totalWidth max: lineWidth].
  101080.     insets := aContainerView actualInsets.
  101081.     ^(totalWidth + insets width) @ (totalHeight + insets height)!
  101082.  
  101083. resolutionScaledBy: scale
  101084.     "Private - The receiver is being loaded and it has been determined that the pixel resolution
  101085.     has changed since the point at which the view was saved. Scale any internal pixels by <Point>
  101086.     scale."
  101087.  
  101088.     hgap := (hgap * scale x) truncated.
  101089.     vgap := (vgap * scale y) truncated.
  101090.  
  101091.  
  101092. !
  101093.  
  101094. startOffsetFor: anOrderedCollection in: aContainerView
  101095.     "Private - Answers an <Integer> offset for where to start laying out the line of views held
  101096.     in anOrderedCollection. This will depend on the alignment of the receiver and the width
  101097.     and insets of aContainerView."
  101098.  
  101099.     | insets lineWidth maxWidth offset |
  101100.     insets := aContainerView actualInsets.
  101101.     maxWidth := aContainerView clientWidth - insets width.
  101102.  
  101103.     (self alignment=#left) ifTrue: [^insets left].
  101104.     lineWidth := anOrderedCollection inject: 0 into: [:w :each | w+each width].
  101105.     (self alignment=#right) ifTrue: [
  101106.         offset := aContainerView clientWidth - insets right - lineWidth ].
  101107.     (self alignment=#center) ifTrue: [
  101108.         offset := (aContainerView clientWidth - insets width - lineWidth)// 2 + insets left ].
  101109.  
  101110.     ^offset!
  101111.  
  101112. verticalGap
  101113.     "Answer the vertical gap between items laid out by the receiver"
  101114.  
  101115.     ^vgap!
  101116.  
  101117. verticalGap: anInteger
  101118.     "set the vertical gap between items laid out by the receiver to be anInteger"
  101119.  
  101120.     vgap := anInteger! !
  101121.  
  101122. FramingLayout comment:
  101123. 'FramingLayout implements a general purpose <layoutManager> to layout <view> objects within a <compositeView>. This is the most complex of the layout managers provided with the base Dolphin image but also the most flexible. Each of the managed views is given a series of constraints which indicate how it should be laid out within the parent. These constraints are instances of FramingConstraints and are specified by setting the #arrangement aspects of the various views. See the class comment for FramingConstraints for more details.
  101124.  
  101125. Some examples of the use of FramingLayout managers can be seen in the default views for ChoicePrompter and for AXTypeLibraryPrompter. Try evaluating the following and resizing the dialogs to see the effect.
  101126.  
  101127. ChoicePrompter choices: Object subclasses.
  101128. AXTypeLibraryPrompter showModal.
  101129.  
  101130. Instance Variables:
  101131.     framings    <LookupTable> mapping the managed views to their FramingConstraints
  101132. '!
  101133. !FramingLayout class methodsFor!
  101134.  
  101135. example1
  101136.     "A simple example of building a view with a framing layout."
  101137. "
  101138.     FramingLayout example1
  101139. "
  101140.  
  101141.     | shell layout label button text1 text2 |
  101142.     (shell := View desktop addSubView: ShellView new)
  101143.         caption: 'FramingLayout example 1';
  101144.         backcolor: (Color face3d);
  101145.         layoutManager: (layout := FramingLayout new);
  101146.         extent: 300@200.
  101147.  
  101148.     "Create some sample controls"
  101149.     (label := shell addSubView: StaticText new) value: 'Label'.
  101150.     (button := shell addSubView: PushButton new) text: 'Go'; command: #yourself.
  101151.     (text1 := shell addSubView: TextEdit new) value: 'Text 1'.
  101152.     (text2 := shell addSubView: TextEdit new) value: 'Text 2'.
  101153.  
  101154.     "Just leave the label where it is"
  101155.     label rectangle: (10@10 extent: 100@20).
  101156.  
  101157.     "Wish to button to stay at same extent but hug the topright"
  101158.     button arrangement leftFraming: #fixedParentRight; rightFraming: #fixedParentRight.
  101159.     layout resize: button to: (210@10 corner: 290@30).
  101160.  
  101161.     "Wish left text to consume half the width and all the bottom space"
  101162.     text1 arrangement rightFraming: #relativeParentWidth; bottomFraming: #fixedParentBottom.
  101163.     layout resize: text1 to: (10@40 corner: 130@190).
  101164.  
  101165.     "Wish bottom right text to float in the same relative postion, but same height and width"
  101166.     text2 arrangement leftFraming: #relativeParentWidth; rightFraming: #fixedViewLeft; topFraming: #relativeParentHeight; bottomFraming: #fixedViewTop.
  101167.     layout resize: text2 to: (140@40 corner: 290@80).
  101168.  
  101169.     shell show! !
  101170.  
  101171. !FramingLayout methodsFor!
  101172.  
  101173. arrangementAspect
  101174.     "Private - Answer an Aspect description for the arrangement aspect of Views that
  101175.         are managed by the recever. Since the aspect contains a FramingConstraints instance
  101176.         this must be marked as immutable to ensure that the changes are flushed back correctly"
  101177.  
  101178.     ^(Aspect name: #arrangement) beImmutable!
  101179.  
  101180. arrangementOf: aView 
  101181.     "Answer the current framing constraints for aView. This will lazily
  101182.     generate one if none has currently been set."
  101183.  
  101184.     ^framings at: aView
  101185.         ifAbsent: 
  101186.             [| framing |
  101187.             framing := FramingConstraints new.
  101188.             self 
  101189.                 updateFor: aView
  101190.                 framing: framing
  101191.                 rectangle: aView rectangle.
  101192.             self arrangementOf: aView put: framing.
  101193.             framing]!
  101194.  
  101195. arrangementOf: aView put: aFramingConstraints
  101196.     "Set the arrangement parameter of aView in the receiver to be "
  101197.  
  101198.     framings at: aView put: aFramingConstraints.
  101199. !
  101200.  
  101201. initialize
  101202.     "Private - Initialize the state of the receiver."
  101203.  
  101204.     super initialize.
  101205.     framings := LookupTable new.!
  101206.  
  101207. layoutContainer: aContainerView 
  101208.     "Performs a layout operation on the contents in aContainerView"
  101209.  
  101210.     | insets parentExtent |
  101211.     insets := aContainerView actualInsets.
  101212.     parentExtent := aContainerView clientExtent - insets origin - insets corner.
  101213.     aContainerView managedSubViews do: 
  101214.             [:aView | 
  101215.             | framing newRect |
  101216.             framing := self arrangementOf: aView.
  101217.             newRect := framing rectangleFor: aView from: parentExtent.
  101218.             aView rectangle: (newRect origin + insets origin extent: newRect extent)]!
  101219.  
  101220. preferredLayoutExtentOf: aContainerView
  101221.     "Answer aPoint which is the preferred extent when laying out aContainerView.
  101222.     It is not possible to come up with a useful value."
  101223.  
  101224.     ^aContainerView extent
  101225. !
  101226.  
  101227. removeSubView: aView
  101228.     "Remove view from the collection of views which have been explicitly
  101229.     arranged by the receiver.
  101230.     Answer view."
  101231.  
  101232.     framings removeKey: aView ifAbsent: [].
  101233.     ^super removeSubView: aView!
  101234.  
  101235. reposition: aMovedView to: aPoint
  101236.     "Private - Set the new position of aMovedView and update our framingConstraints object
  101237.     for it to reflect this new original rectangle."
  101238.  
  101239.     self
  101240.         updateFor: aMovedView framing: (self arrangementOf: aMovedView)
  101241.         rectangle: (aPoint extent: aMovedView extent).
  101242.     aMovedView position: aPoint.!
  101243.  
  101244. resize: aSizedView to: aRectangle
  101245.     "Private - Set the new size and position of aSizedView and update our framingConstraints object
  101246.     for it to reflect this new rectangle."
  101247.  
  101248.     self
  101249.         updateFor: aSizedView framing: (self arrangementOf: aSizedView)
  101250.         rectangle: aRectangle.
  101251.     aSizedView rectangle: aRectangle.!
  101252.  
  101253. resolutionScaledBy: scale
  101254.     "Private - The receiver is being loaded and it has been determined that the pixel resolution
  101255.     has changed since the point at which the view was saved. Scale any internal pixels by <Point>
  101256.     scale."
  101257.  
  101258.     framings do: [:each | each resolutionScaledBy: scale ]
  101259.  
  101260.  
  101261.  
  101262. !
  101263.  
  101264. updateFor: aView framing: framing rectangle: rectangle
  101265.     "Private - Update the framing constraints to a new rectangle."
  101266.  
  101267.     | insets parentView parentExtent viewRectangle |
  101268.     parentView := aView parentView.
  101269.     insets := parentView actualInsets.
  101270.     parentExtent := parentView clientExtent - insets origin - insets corner.
  101271.     viewRectangle := rectangle moveBy: insets origin negated.
  101272.     framing updateFor: aView from: parentExtent rectangle: viewRectangle! !
  101273.  
  101274. GridLayout comment:
  101275. 'GridLayout implements a general purpose <layoutManager> to layout <view> objects within a <compositeView>. The managed views are arranged in a rectangular grid with dimensions specified by the #rows and #columns aspects. The views are resized to be identical in size and to fill as much of the available area within the container as possible. The separation between the rows and columns can be specified with the #horizontalGap and #verticalGap aspects. 
  101276.  
  101277. Note that a GridLayout takes no notice of the #arrangement aspects of the views that it manages.
  101278.  
  101279. Instance Variables:
  101280.     rows    <integer>
  101281.     columns    <integer>
  101282.     hgap    <integer>
  101283.     vgap    <integer>
  101284. '!
  101285. !GridLayout class methodsFor!
  101286.  
  101287. publishedAspectsOfInstances
  101288.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  101289.     
  101290.         ^(super publishedAspectsOfInstances)
  101291.             add: (Aspect integer: #horizontalGap);
  101292.             add: (Aspect integer: #verticalGap);
  101293.             add: (Aspect integer: #rows);
  101294.             add: (Aspect integer: #columns);
  101295.             yourself! !
  101296.  
  101297. !GridLayout methodsFor!
  101298.  
  101299. columns
  101300.     "Answers the number of columns for the receiver"
  101301.  
  101302.     ^columns!
  101303.  
  101304. columns: anInteger
  101305.     "Set the number of columns for the receiver to anInteger.
  101306.     Zero implies any number of columns"
  101307.  
  101308.     columns := anInteger!
  101309.  
  101310. horizontalGap
  101311.     "Answer the horizontal gap between items laid out bu the receiver"
  101312.  
  101313.     ^hgap!
  101314.  
  101315. horizontalGap: anInteger
  101316.     "set the horizontal gap between items laid out by the receiver to be anInteger"
  101317.  
  101318.     hgap := anInteger!
  101319.  
  101320. initialize
  101321.     "Private - Initialize the receiver"
  101322.  
  101323.     super initialize.
  101324.  
  101325.     "Set up for a horizontal arrangement in one row"
  101326.     rows := 1.
  101327.     columns := 0.
  101328.     hgap := 0.
  101329.     vgap := 0.!
  101330.  
  101331. layoutContainer: aContainerView 
  101332.     "Performs a layout operation on the contents in aContainerView"
  101333.  
  101334.     | subviews count insets nrows ncols width height w h x wSpare hSpare |
  101335.     subviews := aContainerView managedSubViews.
  101336.     count := subviews size.
  101337.     count > 0 ifFalse: [^self].
  101338.     insets := aContainerView actualInsets.
  101339.     nrows := self rows.
  101340.     ncols := self columns.
  101341.     nrows > 0 
  101342.         ifTrue: [ncols := (count + nrows - 1) // nrows]
  101343.         ifFalse: [nrows := (count + ncols - 1) // ncols].
  101344.     width := aContainerView clientWidth - (insets left + insets right).
  101345.     height := aContainerView clientHeight - (insets top + insets bottom).
  101346.     width := width - ((ncols - 1) * self horizontalGap).
  101347.     height := height - ((nrows - 1) * self verticalGap).
  101348.     w := width // ncols.
  101349.     wSpare := width \\ ncols.
  101350.     h := height // nrows.
  101351.     hSpare := height \\ nrows.
  101352.     x := insets left.
  101353.     0 to: ncols - 1
  101354.         do: 
  101355.             [:column | 
  101356.             | y |
  101357.             y := insets top.
  101358.             0 to: nrows - 1
  101359.                 do: 
  101360.                     [:row | 
  101361.                     | i |
  101362.                     i := row * ncols + column + 1.
  101363.                     i <= count 
  101364.                         ifTrue: 
  101365.                             ["test for last column/row and include any rounding spares"
  101366.                             | extent |
  101367.                             extent := (column = (ncols - 1) ifTrue: [w + wSpare] ifFalse: [w]) 
  101368.                                         @ (row = (nrows - 1) ifTrue: [h + hSpare] ifFalse: [h]).
  101369.                             (subviews at: i) rectangle: (Rectangle origin: x @ y extent: extent)].
  101370.                     y := y + h + self verticalGap].
  101371.             x := x + w + self horizontalGap]!
  101372.  
  101373. preferredLayoutExtentOf: aContainerView 
  101374.     "Answer aPoint which is the preferred extent when laying out aContainerView"
  101375.  
  101376.     | subviews count nrows ncols w h insets |
  101377.     subviews := aContainerView managedSubViews.
  101378.     count := subviews size.
  101379.     insets := aContainerView actualInsets.
  101380.     nrows := self rows.
  101381.     ncols := self columns.
  101382.     nrows > 0 
  101383.         ifTrue: [ncols := (count + nrows - 1) // nrows]
  101384.         ifFalse: [nrows := (count + ncols - 1) // ncols].
  101385.     w := 0.
  101386.     h := 0.
  101387.     subviews do: 
  101388.             [:each | 
  101389.             | extent |
  101390.             extent := each layoutExtent.
  101391.             w < extent x ifTrue: [w := extent x].
  101392.             h < extent y ifTrue: [h := extent y]].
  101393.     ^(insets left + insets right + (ncols * w) + ((self columns - 1) * self horizontalGap)) 
  101394.         @ (insets top + insets bottom + (nrows * h) + ((self rows - 1) * self verticalGap))!
  101395.  
  101396. resolutionScaledBy: scale
  101397.     "Private - The receiver is being loaded and it has been determined that the pixel resolution
  101398.     has changed since the point at which the view was saved. Scale any internal pixels by <Point>
  101399.     scale."
  101400.  
  101401.     hgap := (hgap * scale x) truncated.
  101402.     vgap := (vgap * scale y) truncated.
  101403.  
  101404.  
  101405. !
  101406.  
  101407. rows
  101408.     "Answers the number of rows for the receiver"
  101409.  
  101410.     ^rows!
  101411.  
  101412. rows: anInteger
  101413.     "Set the number of rows for the receiver to anInteger.
  101414.     Zero implies any number of rows"
  101415.  
  101416.     rows := anInteger!
  101417.  
  101418. verticalGap
  101419.     "Answer the vertical gap between items laid out by the receiver"
  101420.  
  101421.     ^vgap!
  101422.  
  101423. verticalGap: anInteger
  101424.     "set the vertical gap between items laid out by the receiver to be anInteger"
  101425.  
  101426.     vgap := anInteger! !
  101427.  
  101428. ProportionalLayout comment:
  101429. 'ProportionalLayout implements a general purpose <layoutManager> to layout <view> objects within a <compositeView>. The managed views are arranged either vertically or horizontally depending on the setting of the <boolean> #isVertical aspect. The layout manager attempts to keep the relative sizes of the views in proportion according to the <number> arrangement aspects of each view. Any view that is given an arrangement of 0 will be left at its original size.
  101430.  
  101431. A ProportionalLayout is commonly used in conjunction with one or more Splitters. In the standard ClassBrowserShell default view you can see two ProportionalLayout managers at work; one separating the panes horizontally and one vertically. Each of the panes is separated by a Splitter which, when moved, can be used to adjust the proportions of the views on either side of it. Note that Splitters are always given an arrangement of 0 so they are not resized by the layout manager and can remain at their preferred with.
  101432.  
  101433. For example. You have four views in a container managed by a ProportionalLayout; each has an arrangement of 2, 0, 5, 3 respectively. The second view will always keep its current size. The remainder of the space available in the container will be split between the remaining views in the ratios 2:5:3. 
  101434.  
  101435. Instance Variables:
  101436.     proportions    <Dictionary>
  101437.     isVertical        <boolean>
  101438.  
  101439. '!
  101440. !ProportionalLayout class methodsFor!
  101441.  
  101442. publishedAspectsOfInstances
  101443.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  101444.     
  101445.         ^(super publishedAspectsOfInstances)
  101446.             add: (Aspect boolean: #isVertical);
  101447.             yourself! !
  101448.  
  101449. !ProportionalLayout methodsFor!
  101450.  
  101451. arrangementOf: aView
  101452.     "Answer the current proportion for aView. Answer the default
  101453.     if a specific value has not been set. The proportion is used to size 
  101454.     the views relative to the others managed by the receiver. A value of 
  101455.     zero indicates a fixed size view."
  101456.  
  101457.     ^self proportions at: aView ifAbsent: [self defaultArrangementFor: aView]!
  101458.  
  101459. arrangementOf: aView put: proportion
  101460.     "Set the arrangement parameter of aView in the receiver to be anObject"
  101461.  
  101462.     self proportions at: aView put: proportion abs.
  101463. !
  101464.  
  101465. beHorizontal
  101466.     "Orientate the views which the receiver lays out so they are stacked
  101467.     horizontally."
  101468.  
  101469.     self isVertical: false!
  101470.  
  101471. beVertical
  101472.     "Orientate the views which the receiver lays out so they are stacked
  101473.     vertically."
  101474.  
  101475.     self isVertical: true!
  101476.  
  101477. defaultArrangementFor: aView
  101478.     "Private - Answer the arrangement for a view which did not have one
  101479.     explicitly set when it was added to the receiver. Sorry, this involves a nasty test on type!!"
  101480.  
  101481.     ^(aView isKindOf: Splitter) ifTrue: [0] ifFalse: [1]
  101482. !
  101483.  
  101484. hasFixedSize: aView
  101485.     "Private - Answer whether aView is always of a fixed size."
  101486.  
  101487.     ^(self arrangementOf: aView) isZero!
  101488.  
  101489. initialize
  101490.     "Private - Initialize the state of the receiver."
  101491.  
  101492.     super initialize.
  101493.     proportions := LookupTable new.
  101494.     self beHorizontal.!
  101495.  
  101496. isHorizontal
  101497.     "Answer whether the receivers components are positioned horizontally."
  101498.  
  101499.     ^self isVertical not!
  101500.  
  101501. isVertical
  101502.     "Answer whether the receivers components are positioned vertically."
  101503.  
  101504.     ^isVertical!
  101505.  
  101506. isVertical: aBoolean
  101507.     "Set the receivers vertical instance variable. This acts
  101508.     as a mode and is in either vertical or horizontal."
  101509.  
  101510.     isVertical := aBoolean!
  101511.  
  101512. layoutContainer: aContainerView 
  101513.     "Performs a layout operation on the contents in aContainerView"
  101514.  
  101515.     | subviews extent majorExtent minorExtent point freeSize totalProportion fixedSize insets |
  101516.     subviews := aContainerView managedSubViews.
  101517.     insets := aContainerView actualInsets.
  101518.     extent := (aContainerView clientWidth - (insets left + insets right)) 
  101519.                 @ (aContainerView clientHeight - (insets top + insets bottom)).
  101520.     majorExtent := self majorDimensionOf: extent.
  101521.     minorExtent := self minorDimensionOf: extent.
  101522.     fixedSize := 0.
  101523.     (subviews select: [:aView | self hasFixedSize: aView]) 
  101524.         do: [:aView | fixedSize := fixedSize + (self majorDimensionOf: aView layoutExtent)].
  101525.     freeSize := majorExtent - fixedSize max: 0.
  101526.     totalProportion := self totalProportionsOf: subviews.
  101527.     point := insets origin.
  101528.     subviews keysAndValuesDo: 
  101529.             [:index :aView | 
  101530.             | viewMajorExtent viewExtent |
  101531.             viewMajorExtent := (self hasFixedSize: aView) 
  101532.                         ifTrue: [self majorDimensionOf: aView layoutExtent]
  101533.                         ifFalse: 
  101534.                             [index = subviews size 
  101535.                                 ifTrue: 
  101536.                                     [majorExtent + (self majorDimensionOf: insets origin) - (self majorDimensionOf: point)]
  101537.                                 ifFalse: [((self arrangementOf: aView) / totalProportion * freeSize) truncated]].
  101538.             viewExtent := self pointWithMajor: viewMajorExtent minor: minorExtent.
  101539.             aView basicInvalidateLayout.
  101540.             aView rectangle: (point extent: viewExtent).
  101541.             point := point + (self pointWithMajor: viewMajorExtent minor: 0)].
  101542.     aContainerView validateLayout!
  101543.  
  101544. majorDimensionOf: aPoint
  101545.     "Private - Answer the dimension of aPoint which coincides
  101546.     with direction which views are layout out in by the receiver."
  101547.  
  101548.     ^self isVertical
  101549.         ifTrue: [aPoint y]
  101550.         ifFalse: [aPoint x]!
  101551.  
  101552. minorDimensionOf: aPoint
  101553.     "Private - Answer the dimension of aPoint which is at right angles
  101554.     with direction which views are layout out in by the receiver."
  101555.  
  101556.     ^self isVertical
  101557.         ifTrue: [aPoint x]
  101558.         ifFalse: [aPoint y]!
  101559.  
  101560. nearestProportionalViewFrom: fromView inViews: views by: direction 
  101561.     "Private - Answer the first view in a direction from fromView
  101562.     which is proportional or nil if there aren't any."
  101563.  
  101564.     | index |
  101565.     index := views identityIndexOf: fromView.
  101566.     
  101567.     [index := index + direction.
  101568.     index between: 1 and: views size] whileTrue: 
  101569.                 [| aView |
  101570.                 aView := views at: index.
  101571.                 (self hasFixedSize: aView) ifFalse: [^aView]].
  101572.     ^nil!
  101573.  
  101574. pointWithMajor: major minor: minor
  101575.     "Private - Answer a new Point."
  101576.  
  101577.     ^self isVertical
  101578.         ifTrue: [minor @ major]
  101579.         ifFalse: [major @ minor]!
  101580.  
  101581. preferredLayoutExtentOf: aContainerView 
  101582.     "Answer aPoint which is the preferred extent when laying out aContainerView"
  101583.  
  101584.     | extent insets |
  101585.     extent := aContainerView managedSubViews inject: 0 @ 0
  101586.                 into: 
  101587.                     [:current :aView | 
  101588.                     | viewExtent |
  101589.                     viewExtent := aView layoutExtent.
  101590.                     self 
  101591.                         pointWithMajor: (self majorDimensionOf: current) + (self majorDimensionOf: viewExtent)
  101592.                         minor: ((self minorDimensionOf: current) max: (self minorDimensionOf: viewExtent))].
  101593.     insets := aContainerView actualInsets.
  101594.     ^extent + insets topLeft + insets bottomRight!
  101595.  
  101596. proportions
  101597.     "Private - Answer a Dictionary of Views to the proportion number.
  101598.     Use a proportion number of 0 to indicate a view of fixed size."
  101599.  
  101600.     ^proportions!
  101601.  
  101602. removeSubView: aView
  101603.     "Remove view from the collection of views which have been explicitly
  101604.     arranged by the receiver.
  101605.     Answer view."
  101606.  
  101607.     self proportions removeKey: aView ifAbsent: [].
  101608.     ^super removeSubView: aView!
  101609.  
  101610. reposition: aMovedView to: aPoint 
  101611.     "Private - This will expand/shrink the proportions of
  101612.     the two non fixed size views on either side of aMovedView."
  101613.  
  101614.     | subviews currentPoint prevView nextView totalProportion changeSize prevSize nextSize containerView |
  101615.     containerView := aMovedView parentView.
  101616.     subviews := containerView managedSubViews.
  101617.     currentPoint := aMovedView position.
  101618.     prevView := self 
  101619.                 nearestProportionalViewFrom: aMovedView
  101620.                 inViews: subviews
  101621.                 by: 1 negated.
  101622.     nextView := self 
  101623.                 nearestProportionalViewFrom: aMovedView
  101624.                 inViews: subviews
  101625.                 by: 1.
  101626.     (prevView isNil or: [nextView isNil]) ifTrue: [^self].
  101627.     prevSize := self majorDimensionOf: prevView extent.
  101628.     nextSize := self majorDimensionOf: nextView extent.
  101629.     changeSize := self majorDimensionOf: aPoint - currentPoint.
  101630.     changeSize := changeSize positive 
  101631.                 ifTrue: [changeSize min: nextSize - 2]
  101632.                 ifFalse: [changeSize max: prevSize negated + 2].
  101633.     prevSize := prevSize + changeSize.
  101634.     nextSize := nextSize - changeSize.
  101635.     totalProportion := self totalProportionsOf: (Array with: prevView with: nextView).
  101636.     prevSize + nextSize = 0 
  101637.         ifFalse: 
  101638.             [self arrangementOf: prevView put: prevSize / (prevSize + nextSize) * totalProportion.
  101639.             self arrangementOf: nextView put: nextSize / (prevSize + nextSize) * totalProportion].
  101640.     prevView basicInvalidateLayout.
  101641.     nextView basicInvalidateLayout!
  101642.  
  101643. totalProportionsOf: viewCollection
  101644.     "Private - Answer the sum of all the views proportions."
  101645.  
  101646.     ^viewCollection inject: 0 into: [:total :aView |
  101647.             total + (self arrangementOf: aView)].
  101648. !
  101649.  
  101650. vertical: aBoolean
  101651.     "Set the receivers vertical instance variable. This acts
  101652.     as a mode and is in either vertical or horizontal."
  101653.  
  101654.     isVertical := aBoolean! !
  101655.  
  101656. ScrollingDecoratorLayout comment:
  101657. 'ScrollingDecoratorLayout implements a specialised <layoutManager> to layout a single <view> object contained within a <scrolllingDecoratorView>. The ScrollingDecoratorLayout does not attempt to resize the managed view but, instead, it repositions it according to scroll information that it receives from the view''s parent. Scrollbars will become available in the parent <scrollingDecoratorView> when its extent goes below the preferred extent recommended by the ScrollingDecoratorLayout.
  101658.  
  101659.  
  101660. '!
  101661. !ScrollingDecoratorLayout methodsFor!
  101662.  
  101663. calcLayoutExtentOf: aScrollingDecorator using: aOneArgBlock 
  101664.     "Answer aPoint which is the extent when laying out aScrollingDecorator
  101665.     using aOneArgBlock to request extent dimensions from the subviews.
  101666.     This is a helper for #currentLayoutExtentOf: and #preferredLayoutExtentOf:"
  101667.  
  101668.     ^aScrollingDecorator managedSubViews inject: 0 @ 0
  101669.         into: 
  101670.             [:allExtent :view | 
  101671.             | extent |
  101672.             extent := aOneArgBlock value: view.
  101673.             (allExtent x max: extent x) @ (allExtent y + extent y)]!
  101674.  
  101675. layoutContainer: aScrollingDecorator
  101676.     "Performs a layout operation on the contents in aScrollingDecorator."
  101677.  
  101678.     | subviews clientExtent desiredExtent scrollOffset viewExtent newScroll rectangles |
  101679.     subviews := aScrollingDecorator managedSubViews.
  101680.     subviews isEmpty ifTrue: [^self].
  101681.  
  101682.     clientExtent := aScrollingDecorator clientExtent.
  101683.     desiredExtent := self preferredLayoutExtentOf: aScrollingDecorator.
  101684.     scrollOffset := aScrollingDecorator scrollOffset.
  101685.  
  101686.     viewExtent := (clientExtent x max: desiredExtent x) @
  101687.                     (clientExtent y max: desiredExtent y).
  101688.  
  101689.     newScroll := ((scrollOffset x min: viewExtent x - clientExtent x) max: 0) @
  101690.                 ((scrollOffset y min: viewExtent y - clientExtent y) max: 0).
  101691.  
  101692.     rectangles := self rectangles: subviews offset: newScroll extent: viewExtent.
  101693.     subviews with: rectangles do: [:view :rectangle |
  101694.         view rectangle: rectangle].
  101695.  
  101696.     aScrollingDecorator scrollOffset: newScroll; updateScrollBars.        !
  101697.  
  101698. positionViewsOf: aScrollingDecorator
  101699.     "Private - Reposition each of the receivers subviews."
  101700.  
  101701.     | subviews rectangles |
  101702.     subviews := aScrollingDecorator managedSubViews .
  101703.     rectangles := self
  101704.                 rectangles: subviews
  101705.                 offset: aScrollingDecorator scrollOffset
  101706.                 extent: aScrollingDecorator clientRectangle extent.
  101707.     subviews with: rectangles do: [:view :rectangle |
  101708.         view position: rectangle origin].!
  101709.  
  101710. preferredLayoutExtentOf: aScrollingDecorator
  101711.     "Answer aPoint which is the preferred extent when laying out aScrollingDecorator."
  101712.  
  101713.     ^self calcLayoutExtentOf: aScrollingDecorator using: [ :subview | subview layoutExtent ].!
  101714.  
  101715. rectangles: subviews offset: offset extent: extent 
  101716.     "Private - Answer an OrderedCollection of rectangles for each of the
  101717.     elements of subviews."
  101718.  
  101719.     | position rectangles |
  101720.     rectangles := OrderedCollection new.
  101721.     position := offset negated.
  101722.     subviews 
  101723.         from: 1
  101724.         to: subviews size - 1
  101725.         do: 
  101726.             [:view | 
  101727.             | preferredExtent |
  101728.             preferredExtent := view layoutExtent.
  101729.             rectangles addLast: (position extent: extent x @ preferredExtent y).
  101730.             position := position + (0 @ preferredExtent y)].
  101731.     rectangles addLast: (position extent: extent x @ extent y).
  101732.     ^rectangles! !
  101733.  
  101734. ShieldLayout comment:
  101735. 'ShieldLayout implements a specialised <layoutManager> for use with a <compositeView> in the ViewComposer. All of the managed views in the associated container are resized to occupy the full area of the container. This is used by the ViewComposer to ensure that it''s protective mouse Shield completely covers the editing arena.'!
  101736. !ShieldLayout methodsFor!
  101737.  
  101738. layoutContainer: aContainerView
  101739.     "Performs a layout operation on the contents in aContainerView.
  101740.     This will typically be used to ensure that a Shield view covers
  101741.     exactly the ContainerView it is shielding.
  101742.     Each subview will fill the parameter aContainerView.
  101743.     They will all be the same size."
  101744.  
  101745.     | rectangle |
  101746.     rectangle := aContainerView clientRectangle.
  101747.     aContainerView managedSubViews  do: [ :subview |
  101748.         subview rectangle: rectangle]!
  101749.  
  101750. preferredLayoutExtentOf: aContainerView
  101751.     "Answer aPoint which is the preferred extent when laying out aContainerView"
  101752.  
  101753.     ^aContainerView subViews size=0
  101754.         ifTrue: [0@0]
  101755.         ifFalse: [aContainerView subViews last layoutExtent]! !
  101756.  
  101757. MoenLink comment:
  101758. 'MoenLink is a private helper class that is part of the implementation of the <MoenTreeView>'!
  101759. !MoenLink class methodsFor!
  101760.  
  101761. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  101762. σäM&2G¬oi«¬3Θ£/j┼▌▐á┌└úf[Xi▀½-;¡╞╬!
  101763.  
  101764. ∙gu!!■╧+i┤¼ö>⌐6∩▀╡î √╓█╡ƒ╧:₧╡╙lvZ╙─0WÇ#`RGb·ê\bj¬r@~úÑ# ₧MΦú┐¢╖▌Æ}H|.ÿ╤_─á■[ÉòV{½[óQÖ≈ ΦjöùÅG`öZ|╦╥┌¼î╣! !
  101765.  
  101766. !MoenLink methodsFor!
  101767.  
  101768. ±V.!!¬╒r(ë╜₧/ä2î╛åÄ▀╟╧╨░÷σR½╛╪ofIZÆû;BàZW/`OR∙Å^V`f[½yxº¿%≤╚GΦú╕▐π╟^╦dKza╪░h║█┼XE╦VÆr╗N│sälû8Nxα$¢█OÖN{╝.ôƒ╩±─┤3ƒ æÅ╙hεΓRAΓi5└éY│╡6µr;▐Z█│@ É«v╟Zz≡*Ñå├OΦ├Æùë║²nHπá¬J"%_f [τµ$AZDΦ┴K╩µd-{!!░ΦF¢H ÿΣï°≥dⁿ«¡─ö5!
  101769.  
  101770. ≥A3"ox╝ª<=┐«ë8┼&╗ö÷σ≡├┌╥╗α╚9*²ï╥reIB╫─s╛QM>gZ_b≤┴
  101771. Qcf]ªVc┤«2╜═    ªñúƒ∙╠^üuL    ob╓╣~|├ú⌐xFåû5║K│=é TF=≤*▌│3±(┤@fÄ╥█▀┬┤vÅì╒■f╖▒Γy#uûΩ4█═!
  101772.  
  101773. ∙)Msw╢å$(«¼╠g┼∩╟°╔∞ù╦▌╗▓╜@░┤╥zFW╞ü|?²2.CPC!
  101774.  
  101775. °)Msw╢å$(«¼╠g┼∩╟°╔∞ù╦▌╗▓╝@░┤╥zFW╞üp·5)@eJ! !
  101776.  
  101777. Process comment:
  101778. 'A Process represents an individual thread of execution in the image.
  101779.  
  101780. A Process can in any of the following states:
  101781.     - active        The Process is actually running. Usually you will only be able to catch the main UI process in this state.
  101782.     - debug        The Process is currently being debugged.
  101783.     - ready        The Process is ready to run, but currently suspended on one of the Processors priority queues.
  101784.     - suspended    The Process has been suspended (see #suspend), and will not run again until sent #resume.
  101785.             Note that a suspended process with no active references will be garbage collected.
  101786.     - waiting        The Process is waiting on a <Semaphore>, i.e. it has sent #wait to a Semaphore with no excess signals.
  101787.             A Process remains waiting on a Semaphore until it reaches the front of that Semaphores queue of
  101788.             waiting Processes and the Semaphore is sent a #signal message.
  101789.     - dead        The Process has been terminated, or has run to completion.
  101790.  
  101791. A Process in any state other than #dead is considered alertable, and may be sent an interrupt by the VM at any time. See<ProcessorScheduler> for more details.
  101792.  
  101793. Note that the name "Process" is historic - a Smalltalk Process is much more similar to a "thread" than a true process, since all Processes share the same execution context (the image). Dolphin''s Processes do not map directly onto native threads, but are "green" threads. The multi-threading system is implemented internally by the VM and image, with all "green" threads running within a single Win32 thread. This means that a call to a long running (or blocking) external API call will block the entire system, so a facility is provided to "overlap" such calls. This is done by marking the external method with the "overlap" annotation, in which case the VM will perform the call on a separate native thread. For the duration of the overlapped operation the calling Process is blocked, but other Processes in the image will continue to run. 
  101794.  
  101795. In general it is not a good idea to manipulate the contents of a live process directly (e.g. in an Inspector). For performance reasons the VM tends to assume that a Process'' state is consistent, and it does not perform much error checking. Hence it is quite easy to crash the system by modification of instance variables and the stack. It is quite safe to view the contents, but if a live Process is inspected you may find that the snapshot is invalidated by the stack growing and shrinking to meet requirements, which could cause errors in the inspector when trying to access non-existant stack slots.
  101796.  
  101797. Instance Variables:
  101798.     suspendedFrame         <Integer> address of suspendedFrame when in states ready, waiting, or suspended, otherwise nil.
  101799.     priority             <Integer> priority level (see ProcessorScheduler).
  101800.     myList             <LinkedList> on which the process is currently queued if in states ready or waiting, otherwise nil.
  101801.     callbackDepth         <Integer> number of callbacks which have not yet been returned from (i.e. nested depth).
  101802.     primitiveFailureCode        <Integer> code reported by last primitive failure.
  101803.     primitiveFailureData         <Object> argument supplied by last primitive failure. Value depends on primitive and failure reason.
  101804.     fpeMask             <Integer> floating point exception mask specifying which FP exceptions to mask. See Intel/CRT docs.
  101805.     tls             Reserved for future use.
  101806.     thread             Pointer to overlapped call control block. For VM use only.
  101807.     exceptionEnvironment     List of active exception frames <ExceptionHandler> in LIFO order.
  101808.     _alreadyPrinted        <IdentitySet> of objects which have already printed in a recursive #printOn:
  101809.     errno            <integer>. C runtime library error code recorded after last overlapped external call
  101810.     debugger             <Debugger> associated with the Process, if any. Used as a destination for debug events.
  101811.     name             The <Object> ''name'' of the process. Usually a <String> or <CompiledMethod>.
  101812.     lastError             <integer>. Win32 GetLastError() code recorded after last overlapped external call.
  101813.  
  101814. Class Variables:
  101815.     DefaultFPEMask        <Integer> default floating point exception mask used to initialize fpeMask instance variable.
  101816.     DefaultMaxStack         <Integer> maximum stack depth (size up to which a Process may grow - virtual memory reserved).
  101817.     DefaultStack        <Integer> initial stack depth (initial virtual memory committed).'!
  101818. !Process class methodsFor!
  101819.  
  101820. forContext: aBlockClosure priority: anInteger 
  101821.     "Private - Answer a suspended instance of the receiver that will execute the block,
  101822.     aBlockClosure, at the priority, anInteger.
  101823.     N.B. There are certain requirements which must be met by the launch block, aBlockClosure,
  101824.     if the new process is to die quietly without causing a GPF:
  101825.         1) It must be a zero argument BlockClosure (not just any old niladic valuable)
  101826.         2) It must have a null home stack frame (i.e. its home context is marked as having
  101827.         already returned).
  101828.         3) It must catch ProcessTermination notifications, and proceed through to its 
  101829.         shutdown code (e.g. [...] on: ProcessTermination do: [:pt | pt return]).
  101830.         4) It must send #shutdown to the active process so that it is properly terminated.
  101831.         5) It must perform a ^-return as its last action.
  101832.     Items (2) and (5) ensure that any attempt to drop off the bottom of the process stack
  101833.     is trapped by the VM and results in a 'Context Expiry' walkback rather than an
  101834.     unrecoverable GPF."
  101835.  
  101836.     ^self new
  101837.         launchBlock: aBlockClosure;
  101838.         priority: anInteger;
  101839.         yourself.!
  101840.  
  101841. icon
  101842.     "Answers an Icon that can be used to represent this class"
  101843.  
  101844.     ^##(self) defaultIcon!
  101845.  
  101846. initialize
  101847.     "Initialize the class variables of the receiver:
  101848.         DefaultStack        -    The initial stack size of new Processes. This should be relatively
  101849.                             small so as not to waste space, and to reduce instantiation overhead,
  101850.                             but not so small that it causes a stack fault and growth. A default
  101851.                             value which corresponds to less than one OS page (normally 4k bytes, 
  101852.                             or 1024 object pointers) will be rounded up to one OS page. The
  101853.                             actual stack size will be slightly less than the number of pointers
  101854.                             which fit on one OS page, because the VM adjusts it to account for 
  101855.                             Process' fixed instance variables, and overhead.
  101856.         DefaultMaxStack    -    The maximum size to which the stack of new Processes can grow before
  101857.                             the VM signals a stack overflow. Processes grow by a page each time 
  101858.                             a stack overflow occurs, from the initial size, up to this maximum.
  101859.                             This value should be large enough to allow useful work to be done by 
  101860.                             recursive methods, but not so large that programming errors go 
  101861.                             undetected, It is unlikely that a stack need be large than 32768, 
  101862.                             and for those instances, specific instantiation is recommended.
  101863.  
  101864.     Evaluate me to initialize:
  101865.         Process initialize
  101866.     "
  101867.  
  101868.     DefaultStack := 1.            "Let the VM work out the minimum size (will be an OS page)"
  101869.     DefaultMaxStack := 32768.     "Grow to 32768 objects (128 Kbytes) before overflow. This corresponds
  101870.                             to the double the OS's normal virtual memory allocation granularity."
  101871.  
  101872.     "Floating point Inexact and Underflow exceptions will be masked (i.e. not raised) by default"
  101873.     DefaultFPEMask := _EM_INEXACT | _EM_UNDERFLOW.!
  101874.  
  101875. new
  101876.     "Private - Answer a new instance of the receiver. In order to create a runnable process,
  101877.     the suspendedFrame and priority must be set. The normal way to create a process
  101878.     is to use one of the #forkXX methods of BlockClosure."
  101879.  
  101880.     ^(self new: DefaultStack max: DefaultMaxStack) initialize! !
  101881.  
  101882. !Process methodsFor!
  101883.  
  101884. _alreadyPrinted
  101885.     ^_alreadyPrinted!
  101886.  
  101887. at: index
  101888.     "Answer the receiver's indexed instance variable at the argument index.
  101889.     As basicAt:, but may be reimplemented.
  101890.  
  101891.     Primitive Failure Reasons:
  101892.         0    - aSmallInteger is not a SmallInteger
  101893.         1    - aSmallInteger out of bounds (not in the range 1..receiver's indexable size)."
  101894.  
  101895.     <primitive: 49>
  101896.     ^self errorAt: index!
  101897.  
  101898. at: index ifAbsent: exceptionBlock
  101899.     "Answer an <Object> which is the element of the receiver 
  101900.     at the specified index. If the index is out of bounds answer
  101901.     the result of evaluating the <niladicValuable> exceptionBlock."
  101902.  
  101903.     ^(index > 0 and: [index <= self size])
  101904.         ifTrue: [self at: index]
  101905.         ifFalse: [exceptionBlock value]!
  101906.  
  101907. at: index put: value
  101908.     "Replace the receivers indexed instance variable at the argument,
  101909.     index, with the argument, value. Answer value.
  101910.     As basicAt:put: but may be reimplemented.
  101911.  
  101912.     Primitive Failure Reasons:
  101913.         0    - aSmallInteger is not a SmallInteger
  101914.         1    - aSmallInteger out of bounds (not in the range 1..receiver's indexable size) 
  101915.         2    - the argument, value, is not of a class which can be stored in the receiver
  101916.             (e.g. its a non-SmallInteger and the receiver is a ByteArray)."
  101917.  
  101918.     <primitive: 50>
  101919.     ^self errorAt: index put: value!
  101920.  
  101921. attachDebugger: titleString topFrame: aStackFrame resumable: aBoolean
  101922.     "Private - Bring up a debugger on the receiver with the specified
  101923.     frame as that shown at the top of the stack trace."
  101924.  
  101925.     self debuggerClass 
  101926.         show: titleString
  101927.         process: self 
  101928.         topFrame: aStackFrame
  101929.         resumable: aBoolean!
  101930.  
  101931. basicSuspendedFrame
  101932.     "Private - Answer the SmallInteger pointer into the stack of the suspended frame. If nil then
  101933.     the process has terminated (or is not yet initialized)."
  101934.  
  101935.     ^suspendedFrame!
  101936.  
  101937. callbackDepth
  101938.     "Private - Answer the depth of outstanding callbacks from the VM in the receivers stack.
  101939.     An example of a callback is an entry from the Smalltalk window procedure to
  101940.     View>>dispatchMessage:. Recursive callbacks (callbacks which occur during the
  101941.     processing of another callback, e.g. sending a Win32 message in the handler for
  101942.     another Win32 message) will increase the callback depth to a figure greater than one.
  101943.     The Main (user interface) process will always have a callback depth >= 1 when
  101944.     examined.
  101945.  
  101946.     Whether a Process' stack contains callbacks affects the way it must be unwound
  101947.     on termination, or when handling an exception, since the callbacks from the 
  101948.     VM must themselves be properly unwound, not just the Smalltalk stack."
  101949.  
  101950.     ^callbackDepth!
  101951.  
  101952. canDebug
  101953.     "Answer whether the receiver can be debugged (this requires that a debugger
  101954.     be available)."
  101955.  
  101956.     ^self respondsTo: #debuggerClass!
  101957.  
  101958. debug
  101959.         "Private - Bring up a debugger on the receiver."
  101960.     
  101961.         self debug: self printString topFrame: self topFrame resumable: self isTerminated not!
  101962.  
  101963. debug: titleString topFrame: aStackFrame resumable: aBoolean
  101964.     "Private - Bring up a debugger on the receiver with the specified
  101965.     frame as that shown at the top of the stack trace. Suspend the active process."
  101966.  
  101967.     self attachDebugger: titleString topFrame: aStackFrame resumable: aBoolean.
  101968.     debugger suspendProcess.
  101969.     "N.B. There MUST be no further code after this point"
  101970. !
  101971.  
  101972. debugger
  101973.     "Private - Answer the object which is currently claiming to be the 'debugger' on this
  101974.     process. This object will receiver debug events as and when they occur in the receiver
  101975.     (it need not be an actual <Debugger>). The answer will be nil if there is no debugger."
  101976.  
  101977.     ^debugger!
  101978.  
  101979. debugger: anObject
  101980.     "Private - anObject is claiming to be the debugger for the receiver, so save it so
  101981.     that it can later be sent debug events which occur in the receiver. Any 
  101982.     existing debugger is disconnected."
  101983.  
  101984.     debugger := anObject!
  101985.  
  101986. debuggerClass
  101987.         "Answer the class of <Debugger> to use for debugging this process."
  101988.     
  101989.         ^Smalltalk developmentSystem debuggerClass!
  101990.  
  101991. errno
  101992.     "Answer the value of the C runtime 'errno' global variable saved on completion of the last
  101993.     overlapped call made from the receiver."
  101994.  
  101995.     ^errno!
  101996.  
  101997. exceptionEnvironment
  101998.     "Private - Answer the receiver's exception environment (a LIFO stack of ExceptionHandlers).
  101999.     A linked list of ExceptionHandlers is maintained to expedite the search for handlers 
  102000.     when an exception occurs."
  102001.  
  102002.     ^exceptionEnvironment!
  102003.  
  102004. exceptionEnvironment: anExceptionHandler
  102005.     "Private - Set the receiver's exception environment to be the argument,
  102006.     anExceptionHandler. N.B. Use with care, the previous exception environment
  102007.     should be linked to the new exception environment."
  102008.  
  102009.     exceptionEnvironment := anExceptionHandler!
  102010.  
  102011. finalize
  102012.     "Private - Ensure the receiver is properly terminated.
  102013.     This method should only be invoked if the process dies because there
  102014.     are no outstanding references to it. If normally terminated, then
  102015.     it will not be finalized."
  102016.  
  102017.     self terminate!
  102018.  
  102019. fpeMask
  102020.     "Answer the current floating point exception mask for the receiver.
  102021.     This mask is set whenever the process is running (by the VM).
  102022.     Note that the mask determines which exceptions are masked out, rather
  102023.     than generated."
  102024.  
  102025.     ^fpeMask!
  102026.  
  102027. fpeMask: anInteger
  102028.     "Set the current floating point exception mask for the receiver.
  102029.     Answer the old mask (not the receiver as is normal for a set method).
  102030.     If the receiver is the current active process, then the current
  102031.     FP exception mask is established. The mask is recorded for future
  102032.     switching by the VM on context switches.
  102033.     Note that the mask determines which exceptions are masked out, rather
  102034.     than generated."
  102035.  
  102036.     | oldMask |
  102037.     oldMask := fpeMask.
  102038.     fpeMask := anInteger.
  102039.     self isActive ifTrue: [Float reset].
  102040.     ^oldMask!
  102041.  
  102042. frameAtAddress: spInteger
  102043.     "Private - Answer a frame representing the real stack frame at the specified SP (a
  102044.     SmallInteger address/2 in the receiver), or nil if the address is not within this process."
  102045.  
  102046.     ^self frameAtIndex: (self indexOfSP: spInteger)!
  102047.  
  102048. frameAtIndex: anInteger
  102049.     "Private - Answer a StackFrame represent a real frame in the receiver at the specified index,
  102050.     or nil if the index is out of bounds."
  102051.  
  102052.     ^self frameClass process: self index: anInteger!
  102053.  
  102054. frameClass
  102055.     "Private - Answer the class of object to use to represent the receiver's activation records"
  102056.  
  102057.     ^StackFrame!
  102058.  
  102059. halt: frame
  102060.         "Private - Bring up a Smalltalk debugger on the receiver in the specified frame."
  102061.     
  102062.         debugger isNil
  102063.             ifTrue: [
  102064.                 self walkback: 'Hard coded breakpoint' 
  102065.                     topFrame: frame
  102066.                     resumable: true]
  102067.             ifFalse: [debugger onHalt: frame]!
  102068.  
  102069. id
  102070.     "Answer an id which is unique for the lifetime of the process within
  102071.     this particular session. Should the process be terminated in the session
  102072.     then the id may be re-used, i.e. this is really only useful to help with debugging."
  102073.  
  102074.     ^self yourAddress bitShift: -16!
  102075.  
  102076. indexOfSP: anInteger
  102077.     "Private - Answer the index into the receiver of the VM stack pointer value, anInteger
  102078.     (which is a pointer, bitshifted right one position, although this is an implementation
  102079.     detail which may be changed)."
  102080.  
  102081.     <primitive: 175>
  102082.     ^((anInteger bitShift: -1) - (self yourAddress bitShift: -2)) - self class instSize + 1!
  102083.  
  102084. initialize
  102085.     "Private - Initialize the instance variables of the receiver to default values.
  102086.     Certain properties are inherited from the forking process (e.g. floating point
  102087.     exception mask). Also mark the receiver as finalizable so that the stack can be 
  102088.     correctly unwound if the receiver is not explicitly terminated.
  102089.     Answer the receiver."
  102090.  
  102091.     _alreadyPrinted := IdentitySet new.
  102092.     callbackDepth := 0.
  102093.     (fpeMask := Processor activeProcess fpeMask) isNil ifTrue: [fpeMask := DefaultFPEMask].
  102094.     self beFinalizable!
  102095.  
  102096. interruptWith: aBlock
  102097.     "Private - Interrupt the receiver with the specified block. The block is evaluated regardless of
  102098.     the receiver's current state (unless dead). On completion of the block, the receiver resumes whatever
  102099.     it was doing before, including waiting on a Semaphore, etc."
  102100.  
  102101.     "Implementation Note: aBlock is evaluated with asynchronous process switching disabled!!"
  102102.  
  102103.     ^self queueInterrupt: Processor genericInterrupt with: aBlock!
  102104.  
  102105. isActive
  102106.     "Answer whether the receiver is the current active process."
  102107.  
  102108.     ^Processor activeProcess == self
  102109.     
  102110.     !
  102111.  
  102112. isAlive
  102113.     "Answer whether the receiver is either ready, waiting, or active."
  102114.  
  102115.     ^self isActive or: [self suspendingList notNil]    !
  102116.  
  102117. isAlive: aSemaphore 
  102118.     "Private - Answer whether the receiver is either ready, waiting on the specified 
  102119.     Semaphore, or active."
  102120.  
  102121.     | state |
  102122.     state := self state.
  102123.     ^state == #ready 
  102124.         or: [state == #running or: [state == #waiting and: [self suspendingList == aSemaphore]]]!
  102125.  
  102126. isDead
  102127.     ^suspendedFrame isNil!
  102128.  
  102129. isDebuggee
  102130.     "Private - Answer whether the receiver is currently being debugged."
  102131.  
  102132.     ^debugger notNil!
  102133.  
  102134. isInCallback
  102135.     "Private - Answer whether the receiver is processing a callback from the VM.
  102136.  
  102137.     Whether a Process' stack contains callbacks affects the way it must be unwound
  102138.     on termination, or when handling an exception, since the callbacks from the 
  102139.     VM must themselves be properly unwound (and in the same order in which they
  102140.     were made), not just the Smalltalk stack."
  102141.  
  102142.     ^self callbackDepth > 0!
  102143.  
  102144. isMain
  102145.     "Answer whether the receiver is the main user I/F process (i.e. it
  102146.     manages the input queue)."
  102147.  
  102148.     ^SessionManager inputState main == self    
  102149.     !
  102150.  
  102151. isReady
  102152.     "Answer whether the receiver is Ready to run but inactive"
  102153.  
  102154.     ^self state == #ready    !
  102155.  
  102156. isSuspended
  102157.     "Answer whether the receiver is Suspended/Terminated."
  102158.  
  102159.     ^self state == #suspended
  102160.     
  102161.     !
  102162.  
  102163. isTerminated
  102164.     "Answer whether the receiver has Terminated."
  102165.  
  102166.     ^self state == #dead
  102167.     
  102168.     !
  102169.  
  102170. isWaiting
  102171.     "Answer whether the receiver is waiting on a Semaphore."
  102172.  
  102173.     ^self state == #waiting    !
  102174.  
  102175. kill
  102176.     "Terminate the receiver with extreme prejudice. Any outstanding unwind blocks
  102177.     will not be run. It is necessary, however, to correctly maintain the VM's callback stack,
  102178.     so all outstanding callbacks are unwound. Finally, the receiver is put to sleep, permanently.
  102179.     N.B. This should not be sent to a process which is not the active process if it has callbacks."
  102180.  
  102181.     self isDead ifTrue: [^self].
  102182.     self isActive 
  102183.         ifTrue: [self shutdown]
  102184.         ifFalse: 
  102185.             ["As the receiver is not active, we queue an interrupt which will
  102186.                 cause the VM to activate the receiver (even if Waiting or Suspended)."
  102187.  
  102188.             self queueInterrupt: Processor killInterrupt]!
  102189.  
  102190. lastError
  102191.     "Answer the value of the Win32 error code (i.e. the result of GetLastError()) saved on
  102192.     completion of the last overlapped external call made from the receiver."
  102193.  
  102194.     ^lastError!
  102195.  
  102196. launchBlock: aBlockClosure
  102197.     "Private - Install aBlockClosure as the launch frame of the receiver (which must be
  102198.     a new process). The VM needs a correctly established frame in order to start running
  102199.     a process."
  102200.  
  102201.     | baseFrame |
  102202.     baseFrame := self frameClass new setProcess: self index: 1.
  102203.     baseFrame
  102204.         basicSender: 0;                    "Mark as returned"
  102205.         basicIP: aBlockClosure initialIP + MemoryManager current objectHeaderSize - 1;
  102206.         sp: baseFrame frameSize;    "TOS points at last slot of frame"
  102207.         context: aBlockClosure.
  102208.     self suspendedFrame: baseFrame!
  102209.  
  102210. name
  102211.     "Answer the 'name' of the Process. This is usually defined by the creator of the process.
  102212.     The default name is the home method (which allows access to the source of the forking block, 
  102213.     even for immediate expressions). The name need not be a String (all Objects respond to #displayString)"
  102214.  
  102215.     ^name!
  102216.  
  102217. name: anObject
  102218.     "Set the name of the Process to the argument, anObject (see #name)"
  102219.  
  102220.     name := anObject!
  102221.  
  102222. primitiveFailureCode
  102223.     "Private - Answer the SmallInteger failure code set by the last primitive which failed 
  102224.     when executed by the receiver. This should be retrieved as soon as possible following a 
  102225.     failure so that it is not overwritten by a subsequent failure - remember that not all
  102226.     primitive failures are errors, and they are a faily common occurrence in SmallInteger arithmetic.
  102227.     Some primitives may not set a failure code when they fail.
  102228.     Currently each primitive defines its own failure codes (documented in the primitive call method), 
  102229.     and additional information of any type may also be present in 'primitiveFailureData'.
  102230.     The failure code/data are not normally affected by primitives which succeed."
  102231.  
  102232.     ^primitiveFailureCode!
  102233.  
  102234. primitiveFailureData
  102235.     "Private - Answer the extra failure data set by the last primitive which failed (and
  102236.     which had extra information to supply about the failure over and above the failure code).
  102237.     See #primitiveFailureCode for additional information."
  102238.  
  102239.     ^primitiveFailureData!
  102240.  
  102241. primStep: steps
  102242.         "Private - Resume the receiver for a single step (method/block activation), at 
  102243.         which point the receiver will receive a debug step interrupt. If the receiver
  102244.         hits a breakpoint instruction before the next method/block activation, then
  102245.         a different interrupt will be received. Other interrupts are disabled while
  102246.         the receiver is stepping.
  102247.     
  102248.         Primitive failure reasons:
  102249.             10 -    the receiver is waiting on a scheduler or semaphore list (only
  102250.                 suspended processes can be 'stepped').
  102251.             11 -    the receiver has been terminated."
  102252.     
  102253.         <primitive: 105>
  102254.         "Ignore the step failure"!
  102255.  
  102256. primTerminate
  102257.     "Private - Transition the receiver from its current state to the Terminated state. Once
  102258.     Terminated, a Process cannot (easily) be resumed or restarted.
  102259.  
  102260.     Primitive Failure Reasons:
  102261.         0    -    Not used
  102262.         1    -    The receiver is the last running process, so it cannot be terminated
  102263.                 until another process has been started (an Idle Panic interrupt
  102264.                 will also be generated). Assume correct recovery after the idle
  102265.                 panic, a second attempt at termination should succeed.
  102266.  
  102267.     Implementation Note: This primitive is approximately equivalent to:
  102268.  
  102269.         self suspendUnconditionally.
  102270.         suspendedFrame := nil
  102271.  
  102272.     except that the primitive can correctly terminate any process, even the active process. 
  102273.     The active process cannot terminate itself correctly in Smalltalk without the assistance 
  102274.     of another process, because as soon as it suspends itself, it will obviously stop running, 
  102275.     and so will be unable to nil out its suspended context. It is considered that the use of a simple
  102276.     primitive to terminate processes is both less error prone, and consumes less resources,
  102277.     than the alternative of dedicating another process to this task."
  102278.  
  102279.     <primitive: 91>
  102280.     ^primitiveFailureCode == 1
  102281.         ifTrue: [false]        "Please try again"
  102282.         ifFalse: [self primitiveFailed]
  102283.  
  102284.     "Would be equivalent to the following, except that active process would not reach 2nd line
  102285.  
  102286.     self suspendUnconditionally.
  102287.     suspendedFrame := nil"!
  102288.  
  102289. printOn: aStream
  102290.     "Append a short debug description of the receiver to aStream."
  102291.  
  102292.     aStream
  102293.         basicPrint: self;
  102294.         nextPut: $(;
  102295.         print: self name;
  102296.         nextPutAll: ', id: ';
  102297.         print: self id;
  102298.         nextPutAll: ', priority: ';
  102299.         print: self priority;
  102300.         nextPutAll: ', state: ';
  102301.         print: self state;
  102302.         nextPut: $)!
  102303.  
  102304. priority
  102305.     "Answer the receiver's priority (see ProcessorScheduler)"
  102306.  
  102307.     ^priority
  102308. !
  102309.  
  102310. priority: anInteger 
  102311.     "Set the receiver's priority to anInteger and Answer the previous priority. Note that 
  102312.     if the receiver is the currently active process, the new priority is lower, and there 
  102313.     are higher-priority processes ready to run, the active process will be preempted.
  102314.     If the receiver is not the active process, and its priority is increased above that of
  102315.     the active process, then the active process will be preempted.
  102316.  
  102317.     Primitive failure reasons:
  102318.         0 -    anInteger is not a SmallInteger.
  102319.         1 -    anInteger is not in the range of permissible priorities (1..highest priority)."
  102320.  
  102321.     <primitive: 92>
  102322.     ^((anInteger isMemberOf: SmallInteger) 
  102323.         and: [anInteger between: 1 and: Processor highestPriority]) 
  102324.             ifTrue: [self primitiveFailed]
  102325.             ifFalse: [self error: 'Invalid Process priority ' , priority printString]!
  102326.  
  102327. queueInterrupt: anInteger
  102328.     "Queue an interrupt with the specified number for the receiver (which can be in any resumable state)
  102329.     and a nil argument."
  102330.  
  102331.     ^self queueInterrupt: anInteger with: nil!
  102332.  
  102333. queueInterrupt: anInteger with: anObject
  102334.     "Queue an interrupt with the specified number for the receiver (which can be in any resumable state).
  102335.     The argument is passed to the interrupted process and can be of any type as necessary.
  102336.  
  102337.     Primitive failure reasons:
  102338.         0 -    anInteger is not a SmallInteger.
  102339.         1 -    the receiver is dead (i.e. not runnable)."
  102340.  
  102341.     <primitive: 98>
  102342.     ^self primitiveFailed!
  102343.  
  102344. resume
  102345.     "Change the state of the receiver from Suspended to Ready (by placing
  102346.     it at the end of the Processor's queue for the receiver's priority).
  102347.     Fail if the receiver is already waiting in a queue (in a Semaphore 
  102348.     or the Processor). See #resume: for further details (sending this message
  102349.     is equivalent to sending #resume: with nil as the argument)."
  102350.  
  102351.     <primitive: 87>
  102352.     ^self primitiveFailed!
  102353.  
  102354. resume: suspendingListOrNil
  102355.     "Change the state of the receiver from Suspended to Ready/Waiting 
  102356.     by placing it at the end of the Processor's queue for the receiver's priority
  102357.     if suspendingListOrNil is nil, otherwise returning it to the queue associated
  102358.     with suspendingListOrNil. Fail if the receiver is already waiting in a queue 
  102359.     (in a Semaphore or the Processor) - i.e. it is only appropriate to send this message to
  102360.     previously #suspend'd Processes, it is not the means by which to start
  102361.     currently Waiting or Ready processes (which have to wait either for the Semaphore
  102362.     on which they are Waiting to be signalled, or their turn to run after
  102363.     higher priority processes, and in a round robin fashion with respect to
  102364.     Processes of the same priority if they are Ready to run).
  102365.  
  102366.     Primitive failure reasons:
  102367.         0 -    the receiver is not suspended on a scheduler or semaphore list.
  102368.         1 -     the receiver has been terminated (or not properly initialized)."
  102369.  
  102370.     <primitive: 87>
  102371.     ^self primitiveFailed!
  102372.  
  102373. resumeUnconditionally
  102374.     "Change the state of the receiver to Ready to run regardless of its current
  102375.     state (unless terminated)."
  102376.  
  102377.     <primitive: 87>
  102378.     myList isNil ifTrue: [^self primitiveFailed]!
  102379.  
  102380. showWalkback: titleString callStack: stackTraceString debuggable: debuggableBoolean resumable: resumableBoolean
  102381.     "Private - Display a walkback dialog with the specified title and stack trace. Enable/disable
  102382.     the debug/resume buttons depending on the boolean arguments. If the Dolphin development 
  102383.     system walkback dialog is not available, then use a MessageBox."
  102384.  
  102385.     | dialogClass box response |
  102386.     dialogClass := Smalltalk at: #WalkbackDialog ifAbsent: [].
  102387.     dialogClass isNil 
  102388.         ifFalse: 
  102389.             [response := (dialogClass new)
  102390.                         caption: titleString;
  102391.                         callStack: stackTraceString;
  102392.                         debuggable: debuggableBoolean;
  102393.                         resumable: resumableBoolean;
  102394.                         showModal.
  102395.             response isNil ifFalse: [^response]].
  102396.     box := MessageBox new.
  102397.     box
  102398.         caption: titleString;
  102399.         taskModal.
  102400.     resumableBoolean 
  102401.         ifTrue: 
  102402.             [box
  102403.                 abortRetryIgnore;
  102404.                 defaultButton: 2]
  102405.         ifFalse: 
  102406.             [box
  102407.                 retryCancel;
  102408.                 defaultButton: 1].
  102409.     response := box errorMsg: stackTraceString.
  102410.     ^response == #retry 
  102411.         ifTrue: [#debug]
  102412.         ifFalse: [response == #ignore ifTrue: [#resume] ifFalse: [#terminate]]!
  102413.  
  102414. shutdown
  102415.     "Private - Terminate the receiver with extreme prejudice. Any outstanding unwind blocks
  102416.     will not be run. It is necessary, however, to correctly maintain the VM's callback stack,
  102417.     so all outstanding callbacks ARE unwound. Finally, the receiver is put to sleep, permanently.
  102418.     N.B. This should not be sent to a process which is not the active process if it has callbacks.
  102419.     Sending this method directly is not recommended (send either #kill or #terminate instead)."
  102420.  
  102421.     "Inform any debugger so that it can close.
  102422.     You will not be able to debug past this point."
  102423.  
  102424.     debugger notNil ifTrue: [debugger onTerminate].
  102425.  
  102426.     "Unwind any outstanding callbacks."
  102427.     Processor unwindCallbacks.
  102428.     self beUnfinalizable.
  102429.     [self primTerminate == true] whileFalse!
  102430.  
  102431. size
  102432.     "Answer the number of indexed variables in the receiver (0 for non-indexable objects,
  102433.     as the named instance variables are not included)."
  102434.  
  102435.     "Implementation Note: Access thisContext to get the process size saved down as the
  102436.     processes dynamically change size to accomodate their stack. Normally the process
  102437.     size is only recorded from the SP on process switches, when thisContext is accessed,
  102438.     on GC's, on invocations of the #allReferences primitive, and on image save."
  102439.  
  102440.     Processor activeProcess == self ifTrue: [thisContext].
  102441.     ^super size!
  102442.  
  102443. spOfIndex: anInteger
  102444.     "Private - Answer a VM stack pointer value (SmallInteger) for the specified index of the
  102445.     receiver."
  102446.  
  102447.     ^(self yourAddress bitShift: -1) + ((anInteger + self class instSize - 1) * 2)!
  102448.  
  102449. stackFramesFrom: startFrame depth: anInteger 
  102450.     "Private - Answer a <sequencedReadableCollection> containing up to the first anInteger stack 
  102451.     frames below the <StackFrame>, startFrame, in the receiver's stack (inclusive)."
  102452.  
  102453.     | answer |
  102454.     answer := OrderedCollection new: (anInteger min: 50).
  102455.     self 
  102456.         stackFramesFrom: startFrame
  102457.         depth: anInteger
  102458.         do: [:frame | answer addLast: frame].
  102459.     ^answer!
  102460.  
  102461. stackFramesFrom: aStackFrame depth: depth do: operation 
  102462.     "Private - Evaluate the <monadicValuable> operation for each of the receiver's stack frames
  102463.     up to a depth of <integer> depth (inclusive, maximum), below aStackFrame."
  102464.  
  102465.     | frame i |
  102466.     frame := aStackFrame.
  102467.     i := 0.
  102468.     [i < depth and: [frame notNil and: [frame method selector notNil]]] whileTrue: 
  102469.             [operation value: frame.
  102470.             frame := frame sender.
  102471.             i := i + 1]!
  102472.  
  102473. stackTrace: anInteger
  102474.     "Private - Answer a <readableString> containing a stack trace to the depth specified by the <integer>
  102475.     argument."
  102476.  
  102477.     ^self stackTraceFrom: self topFrame depth: anInteger!
  102478.  
  102479. stackTraceFrom: aStackFrame depth: anInteger 
  102480.     "Private - Answer a <readableString> containing a stack trace up to the <integer> depth, anInteger,
  102481.     or 50 frames, whichever is the smaller."
  102482.  
  102483.     | stackStream |
  102484.     stackStream := String writeStream: 25 * (anInteger min: 50).
  102485.     
  102486.     [(self stackFramesFrom: aStackFrame depth: anInteger) 
  102487.         do: [:frame | frame displayOn: stackStream]
  102488.         separatedBy: [stackStream cr]] 
  102489.             on: Error
  102490.             do: [:e | e notify].
  102491.     ^stackStream contents!
  102492.  
  102493. state
  102494.     "Private - Answer a symbol identifying the receiver's state."
  102495.  
  102496.     ^self isActive 
  102497.         ifTrue: [#running]
  102498.         ifFalse: 
  102499.             ["The state may change, so minimize chance of getting
  102500.             it wrong by storing suspendingList in a temporary"
  102501.             | list |
  102502.             list := self suspendingList.
  102503.             list isNil 
  102504.                 ifTrue: 
  102505.                     [self isDebuggee 
  102506.                         ifTrue: [#debug]
  102507.                         ifFalse: [self basicSuspendedFrame isNil ifTrue: [#dead] ifFalse: [#suspended]]]
  102508.                 ifFalse: [(list isKindOf: Semaphore) ifTrue: [#waiting] ifFalse: [#ready]]]!
  102509.  
  102510. stbSaveOn: anSTBOutFiler
  102511.     "Save out a binary representation of the receiver to anSTBOutFiler. 
  102512.     Processes cannot be saved and restored correctly so output them as 
  102513.     nil by default"
  102514.  
  102515.     anSTBOutFiler saveObject: self as: nil.!
  102516.  
  102517. step
  102518.         "Private - Resume the receiver for a single step (method/block activation), at 
  102519.         which point the receiver will receive a debug step interrupt. If the receiver
  102520.         hits a breakpoint instruction before the next method/block activation, then
  102521.         a different interrupt will be received. Other interrupts are disabled while
  102522.         the receiver is stepping.
  102523.     
  102524.         For safety (in case sent within a callback from the UI process) we defer the 
  102525.         single step until the current callback has returned to avoid deadlocking the 
  102526.         current UI process."
  102527.     
  102528.         self step: 1!
  102529.  
  102530. step: steps
  102531.         "Private - Resume the receiver for the specified number of steps (method/block 
  102532.         activation), at which point the receiver will receive a debug step interrupt. If 
  102533.         the receiver hits a breakpoint instruction before the next method/block activation, 
  102534.         then a different interrupt will be received. Other interrupts are disabled while
  102535.         the receiver is stepping.
  102536.     
  102537.         For safety (in case sent within a callback from the UI process) we defer the 
  102538.         single step until the current callback has returned to avoid deadlocking the 
  102539.         current UI process."
  102540.     
  102541.         SessionManager inputState queueDeferredAction: (MessageSend receiver: self selector: #primStep: argument: steps)!
  102542.  
  102543. suspend
  102544.     "Transition the receiver from Running (if active), Waiting (if waiting on a Semaphore) 
  102545.     or Ready (if waiting to be scheduled by the Processor) states to the Suspended state 
  102546.     (i.e. not runnable). If the receiver is the activeProcess, suspend it and schedule another, 
  102547.     otherwise remove the receiver from the list of Ready processes in the Processor, or the 
  102548.     list of Waiting processes in a Semaphore, and nil out its suspending list backpointer. 
  102549.     The receiver may be transitioned back to the Ready state at any time by sending it #resume 
  102550.     (but remember that resuming a Process that was waiting on a Semaphore when it was suspended 
  102551.     may upset process synchronisation because it will not return to the Semaphores waiting list).
  102552.     Report an error if the receiver is already Suspended (which is recognised by a null backpointer, 
  102553.     as this indicates that the process is not waiting in a list).
  102554.  
  102555.     Suspended processes have a 'nil' suspending list, are not the active process, and have
  102556.     a non-zero suspendedFrame address (which distinguishes them from terminated processes).
  102557.     If the process is the last runnable process, then answer false, otherwise answer the receiver 
  102558.     (when resumed).
  102559.  
  102560.     Primitive failure results:
  102561.         0 -    the process is already suspended.
  102562.         1 -    the process is the active process and could not be suspended because
  102563.             it is the only runnable process remaining."
  102564.  
  102565.     <primitive: 88>
  102566.     ^primitiveFailureCode == 1
  102567.         ifTrue: [false]
  102568.         ifFalse: [self primitiveFailed]!
  102569.  
  102570. suspendedFrame
  102571.     "Private - Answer a stack frame for the receiver's suspended context, nil if the receiver is dead."
  102572.  
  102573.     | frameAddress |
  102574.     frameAddress := self basicSuspendedFrame.
  102575.     ^frameAddress isNil ifFalse: [self frameAtAddress: frameAddress]!
  102576.  
  102577. suspendedFrame: aStackFrameOrIndex
  102578.     "Private - Set the suspended frame index of the receiver."
  102579.  
  102580.     suspendedFrame := self spOfIndex: aStackFrameOrIndex asInteger!
  102581.  
  102582. suspendingList
  102583.     "Private - Answer the list (semaphore or Processor queue) on which the receiver has been 
  102584.     suspended. A Process which has been suspended, or which is currently active,
  102585.     will answer nil."
  102586.  
  102587.     ^myList!
  102588.  
  102589. suspendUnconditionally
  102590.     "As #suspend, but fails silently attempts at suspending processes which are already Suspended.
  102591.     Answers the receiver.
  102592.  
  102593.     Primitive failure results:
  102594.         0 -    the process is already suspended.
  102595.         1 -    the process is the active process and could not be suspended because
  102596.             it is the only runnable process remaining.
  102597.         2-    the process is pending termination
  102598.  
  102599.     The first two failure codes are ignored. Any other failure code is unexpected, and will result in 
  102600.     normal failure handling."
  102601.  
  102602.     <primitive: 88>
  102603.     ^primitiveFailureCode == 1 
  102604.         ifTrue: [false]
  102605.         ifFalse: [primitiveFailureCode == 0 ifTrue: [self] ifFalse: [self primitiveFailed]]!
  102606.  
  102607. terminate
  102608.     "Transition the receiver from its current state to the Terminated state. Once Terminated, 
  102609.     a Process cannot be resumed or restarted.
  102610.  
  102611.     Implementation note: In order to ensure that all unwind blocks (see BlockClosure>>andFinally:
  102612.     and BlockClosure>>ifCurtailed:) are run, termination is achieved by raising a ProcessTermination 
  102613.     exception which is caught and handled by the launch block of the receiver (see 
  102614.     BlockClosure>>newProcess). The launch block handler for ProcessTermination #return:'s, dropping
  102615.     all later stack frames, and thus causing any unwind blocks to be executed. As its last action the launch
  102616.     block sends #shutdown message to the Process for final cleanup."
  102617.  
  102618.     self isDead ifTrue: [^self].
  102619.     self isActive 
  102620.         ifTrue: 
  102621.             [ProcessTermination signalWith: self.
  102622.             "Won't get this far unless the process hasn't completed its initialization,
  102623.              and established a based handler block for the ProcessTermination signal."
  102624.             self shutdown]
  102625.         ifFalse: 
  102626.             ["Exceptions can only be raised in active processes (and a process must be active
  102627.              to terminate itself), so as the receiver is not active, we must queue an interrupt 
  102628.              which will cause the VM to activate the receiver (even if Waiting or Suspended)."
  102629.  
  102630.             self queueInterrupt: Processor terminateInterrupt]!
  102631.  
  102632. topFrame
  102633.     "Private - Answer a frame representing the top activation record of the receiver's stack.
  102634.     We deliberately answer a frame for the sender if the receiver is the active
  102635.     process, as the current context will be invalidated immediately this method
  102636.     returns. Of course that frame will also be invalidated should the sender
  102637.     subsequently return too."
  102638.  
  102639.     ^self isActive 
  102640.         ifTrue: [(self frameAtAddress: thisContext) sender]
  102641.         ifFalse: [self suspendedFrame]!
  102642.  
  102643. walkback: titleString topFrame: aStackFrame resumable: aBoolean 
  102644.     "Private - Bring up a walkback window on the receiver with the specified title
  102645.     and with aStackFrame as the top frame of the stack trace"
  102646.  
  102647.     | answer traceStream debuggable |
  102648.     Processor enableAsyncEvents: true.
  102649.     debugger isNil 
  102650.         ifFalse: 
  102651.             [^debugger 
  102652.                 onWalkback: titleString
  102653.                 topFrame: aStackFrame
  102654.                 resumable: aBoolean].
  102655.     traceStream := String writeStream: 512.
  102656.     
  102657.     [self 
  102658.         stackFramesFrom: aStackFrame
  102659.         depth: 50
  102660.         do: 
  102661.             [:frame | 
  102662.             frame method selector == #wmPaint:wParam:lParam: 
  102663.                 ifTrue: [frame receiver validate    "prevent recusive paint walkback"].
  102664.             traceStream
  102665.                 display: frame;
  102666.                 cr]] 
  102667.             on: Error
  102668.             do: [:e | e notify].
  102669.  
  102670.     "Only show a walkback if the Debugger's global option, #showWalkbacks, is on"
  102671.     debuggable := self canDebug.
  102672.     answer := (debuggable not or: [self debuggerClass showWalkbacks]) 
  102673.                 ifTrue: 
  102674.                     [self 
  102675.                         showWalkback: titleString
  102676.                         callStack: traceStream contents
  102677.                         debuggable: debuggable
  102678.                         resumable: aBoolean]
  102679.                 ifFalse: 
  102680.                     [aBoolean ifTrue: [Sound warningBeep] ifFalse: [Sound errorBeep].
  102681.                     #debug].
  102682.     answer == #debug 
  102683.         ifTrue: 
  102684.             [self 
  102685.                 debug: titleString
  102686.                 topFrame: aStackFrame
  102687.                 resumable: aBoolean    "may not return"]
  102688.         ifFalse: [answer == #terminate ifTrue: [self terminate]]
  102689.     "Drop through to resume..."! !
  102690.  
  102691. ArithmeticValue comment:
  102692. ''!
  102693. !ArithmeticValue class methodsFor!
  102694.  
  102695. one
  102696.     "Answer the receiver's representation of one."
  102697.  
  102698.     ^self subclassResponsibility!
  102699.  
  102700. zero
  102701.     "Answer the receiver's representation of zero."
  102702.  
  102703.     ^self subclassResponsibility! !
  102704.  
  102705. !ArithmeticValue methodsFor!
  102706.  
  102707. - operand
  102708.     "Answer the difference between the receiver and the <number>
  102709.     argument, operand."
  102710.  
  102711.     ^self + operand negated!
  102712.  
  102713. % anArithmeticValue
  102714.     "Answer the remainder defined by division with truncation toward zero."
  102715.  
  102716.     ^self rem: anArithmeticValue!
  102717.  
  102718. * operand
  102719.     "Answer the result of multiplying the receiver by the <number>
  102720.     argument, operand."
  102721.  
  102722.     ^self subclassResponsibility!
  102723.  
  102724. ** aNumber 
  102725.     "Answer the receiver raised to the power of the argument, aNumber."
  102726.     
  102727.     ^self raisedTo: aNumber!
  102728.  
  102729. / operand
  102730.     "Answer the result of dividing the receiver by <number> argument, 
  102731.     operand. Raise a <ZeroDivide> exception if the operand is zero."
  102732.  
  102733.     ^self subclassResponsibility!
  102734.  
  102735. // operand
  102736.     "Answer the <integer> quotient defined by division with truncation toward
  102737.     negative infinity of the receiver by the <number> operand; 
  102738.     e.g. 7 // 2 = 1, -7 // 2 = -4. 
  102739.     Raise a ZeroDivide exception if the operand is zero."
  102740.  
  102741.     ^(self / operand) floor!
  102742.  
  102743. \\ operand
  102744.     "Answer the remainder defined by division of the receiver by the <number>, operand,
  102745.     with truncation toward negative infinity; e.g. 7 \\ 2 = 1, -7 \\ 2 = 1, 7 \\ -2 = -1. 
  102746.     This is the modulo operation, but it is not the same as C modulo (%) which truncates 
  102747.     towards zero (but see #rem:). 
  102748.     Raise a ZeroDivide exception if the operand is zero."
  102749.  
  102750.     ^self - (self // operand * operand)!
  102751.  
  102752. _expandRectangle: rect
  102753.     "Private - Expand the <Rectangle>, rect, by the magnitude of the receiver.
  102754.      All sides of the rectangle are expanded by the specified amount.
  102755.     Double-dispatched from the Rectangle itself."
  102756.  
  102757.     ^rect species
  102758.         origin: (rect origin - self)
  102759.         corner: (rect corner + self)!
  102760.  
  102761. _insetRectangle: rect
  102762.     "Private - Inset the <Rectangle>, rect, by the magnitude of the receiver.
  102763.      All sides of the rectangle are inset by the specified amount.
  102764.     Double-dispatched from the Rectangle itself."
  102765.  
  102766.     ^rect species
  102767.         origin: (rect origin + self)
  102768.         corner: (rect corner - self)!
  102769.  
  102770. + operand
  102771.     "Answer the sum of the receiver and the <number> argument, 
  102772.     operand."
  102773.  
  102774.     ^self subclassResponsibility!
  102775.  
  102776. = comparand
  102777.     "Answer whether the receiver is numerically equivalent to the <Object>, 
  102778.     comparand - i.e. whether the difference between the receiver and comparand
  102779.     is zero.
  102780.     Implementation Note: #isZero is used to test the difference instead of the 
  102781.     infinitely recursive '= 0'"
  102782.  
  102783.     ^comparand understandsArithmetic 
  102784.         and: [(self - comparand) isZero]!
  102785.  
  102786. abs
  102787.     "Answer a <number> that is the absolute value (positive magnitude) of the receiver."
  102788.  
  102789.     ^self negative
  102790.         ifTrue: [self negated] 
  102791.         ifFalse: [self]!
  102792.  
  102793. addToFloat: aFloat
  102794.     "Private - Answer the result of adding the receiver to the known Float, aFloat, by coercing 
  102795.     the less general of it and the receiver. Overridden by subclasses which can implement 
  102796.     more efficiently."
  102797.  
  102798.     ^aFloat retry: #+ coercing: self
  102799. !
  102800.  
  102801. addToFraction: aFraction
  102802.     "Private - Answer the result of adding the receiver to the known fraction, aFraction,
  102803.     by coercing the less general of it and the receiver. Overridden by subclasses 
  102804.     which can implement more efficiently."
  102805.  
  102806.     ^aFraction retry: #+ coercing: self!
  102807.  
  102808. addToInteger: anInteger
  102809.     "Private - Answer the result of adding the receiver to the known integer, anInteger, by    
  102810.     coercing the less general of it and the receiver. Overridden by subclasses which 
  102811.     can implement more efficiently."
  102812.  
  102813.     ^anInteger retry: #+ coercing: self!
  102814.  
  102815. addToPoint: aPoint
  102816.     "Private - Answer the result of adding the receiver to the known Point, aPoint, by coercing 
  102817.     the less general of it and the receiver. Overridden by subclasses which can implement 
  102818.     more efficiently."
  102819.  
  102820.     ^aPoint retry: #+ coercing: self
  102821. !
  102822.  
  102823. addToPoint3D: aPoint3D
  102824.     "Private - Answer the result of adding the receiver to the known Point3D, aPoint3D, by coercing 
  102825.     the less general of it and the receiver. Overridden by subclasses which can implement 
  102826.     more efficiently."
  102827.  
  102828.     ^aPoint3D retry: #+ coercing: self
  102829. !
  102830.  
  102831. addToScaledDecimal: operand
  102832.     "Private - Answer the result of adding the receiver to the known <ScaledDecimal>, operand."
  102833.  
  102834.     ^operand retry: #+ coercing: self!
  102835.  
  102836. ceiling
  102837.     "Answer the integer nearest the receiver toward positive infinity."
  102838.  
  102839.     ^self subclassResponsibility!
  102840.  
  102841. coerce: anArithmeticValue
  102842.     "Private - Coerce anArithmeticValue (which must be of a lower generality than the receiver) to be the 
  102843.     same type as a anArithmeticValue."
  102844.  
  102845.     ^self subclassResponsibility!
  102846.  
  102847. divideIntoFloat: aFloat
  102848.     "Private - Answer the result of dividing the receiver into the known Float, aFloat, by 
  102849.     coercing the less general of it and the receiver. Overridden by subclasses which 
  102850.     can implement more efficiently."
  102851.  
  102852.     ^aFloat retry: #/ coercing: self!
  102853.  
  102854. divideIntoFraction: aFraction
  102855.     "Private - Answer the result of dividing the receiver into the known fraction, aFraction,
  102856.     by coercing the less general of it and the receiver. Overridden by subclasses 
  102857.     which can implement more efficiently."
  102858.  
  102859.     ^aFraction retry: #/ coercing: self!
  102860.  
  102861. divideIntoInteger: anInteger
  102862.     "Private - Answer the result of dividing the receiver into the known integer, anInteger, 
  102863.     by coercing the less general of it and the receiver. Overridden by subclasses 
  102864.     which can implement more efficiently."
  102865.  
  102866.     ^anInteger retry: #/ coercing: self!
  102867.  
  102868. divideIntoPoint: aPoint
  102869.     "Private - Answer the result of dividing the receiver into the known Point, aPoint, by 
  102870.     coercing the less general of it and the receiver. Overridden by subclasses which 
  102871.     can implement more efficiently."
  102872.  
  102873.     ^aPoint retry: #/ coercing: self!
  102874.  
  102875. divideIntoPoint3D: aPoint3D
  102876.     "Private - Answer the result of dividing the receiver into the known Point3D, aPoint3D, by 
  102877.     coercing the less general of it and the receiver. Overridden by subclasses which 
  102878.     can implement more efficiently."
  102879.  
  102880.     ^aPoint3D retry: #/ coercing: self!
  102881.  
  102882. divideIntoScaledDecimal: operand
  102883.     "Private - Answer the result of dividing the known <ScaledDecimal>, operand, by the receiver."
  102884.  
  102885.     ^operand retry: #/ coercing: self!
  102886.  
  102887. floor
  102888.     "Answer the integer nearest the receiver toward negative infinity."
  102889.  
  102890.     ^self subclassResponsibility!
  102891.  
  102892. generality
  102893.     "Private - Answer the Smalltalk generality of the receiver, used for performing type conversions"
  102894.  
  102895.     ^self subclassResponsibility!
  102896.  
  102897. greaterThanFloat: aFloat
  102898.     "Private - Answer whether the receiver is greater than the known Float, aFloat, by coercing 
  102899.     the less general of it and the receiver. Overridden by subclasses which can implement 
  102900.     more efficiently."
  102901.  
  102902.     ^aFloat retry: #< coercing: self!
  102903.  
  102904. greaterThanFraction: aFraction
  102905.     "Private - Answer whether the receiver is greater than the known Fraction, aFraction, by 
  102906.     coercing the less general of it and the receiver. Overridden by subclasses which 
  102907.     can implement more efficiently."
  102908.  
  102909.     ^aFraction retry: #< coercing: self!
  102910.  
  102911. greaterThanInteger: anInteger
  102912.     "Private - Answer whether the receiver is greater than the known integer, anInteger, by 
  102913.     coercing the less general of it and the receiver. Overridden by subclasses which 
  102914.     can implement more efficiently."
  102915.  
  102916.     ^anInteger retry: #< coercing: self!
  102917.  
  102918. greaterThanScaledDecimal: operand
  102919.     "Private - Answer whether the receiver is greater than the known <ScaledDecimal>, operand."
  102920.  
  102921.     ^operand retry: #< coercing: self!
  102922.  
  102923. isZero
  102924.     "Answer whether the receiver is zero. Many subclasses cannot be zero, since
  102925.     there is a more compact representation for zero in SmallInteger (e.g. 
  102926.     Fraction and LargeIntegers)"
  102927.  
  102928.     ^self = self class zero!
  102929.  
  102930. multiplyByFloat: aFloat
  102931.     "Private - Answer the result of multiplying the known Float, aFloat,
  102932.     by the receiver, by coercing the less general of it and the recever.
  102933.     Overridden by subclasses which can implement more efficiently."
  102934.  
  102935.     ^aFloat retry: #* coercing: self!
  102936.  
  102937. multiplyByFraction: aFraction
  102938.     "Private - Answer the result of multiplying the known fraction, aFraction,
  102939.     by the receiver, by coercing the less general of it and the recever.
  102940.     Overridden by subclasses which can implement more efficiently."
  102941.  
  102942.     ^aFraction retry: #* coercing: self!
  102943.  
  102944. multiplyByInteger: anInteger
  102945.     "Private - Answer the result of multiplying the known integer, anInteger,
  102946.     by the receiver, by coercing the less general of it and the recever.
  102947.     Overridden by subclasses which can implement more efficiently."
  102948.  
  102949.     ^anInteger retry: #* coercing: self!
  102950.  
  102951. multiplyByPoint: aPoint
  102952.     "Private - Answer the result of multiplying the known Point, aPoint,
  102953.     by the receiver, by coercing the less general of it and the recever.
  102954.     Overridden by subclasses which can implement more efficiently."
  102955.  
  102956.     ^aPoint retry: #* coercing: self!
  102957.  
  102958. multiplyByPoint3D: aPoint3D
  102959.     "Private - Answer the result of multiplying the known Point3D, aPoint3D,
  102960.     by the receiver, by coercing the less general of it and the recever.
  102961.     Overridden by subclasses which can implement more efficiently."
  102962.  
  102963.     ^aPoint3D retry: #* coercing: self!
  102964.  
  102965. multiplyByScaledDecimal: operand
  102966.     "Private - Answer the result of multiplying the known <ScaledDecimal>, operand, by receiver."
  102967.  
  102968.     ^operand retry: #* coercing: self!
  102969.  
  102970. negated
  102971.     "Answer a <number> of the same type of the receiver
  102972.     which is its negation."
  102973.  
  102974.     ^self class zero - self!
  102975.  
  102976. negative
  102977.     "Answer whether the receiver is negative."
  102978.  
  102979.     ^self < self class zero!
  102980.  
  102981. positive
  102982.     "Answer whether the receiver is positive or zero."
  102983.  
  102984.     ^self negative not!
  102985.  
  102986. quo: operand
  102987.     "Answer the <number> quotient resulting from by division of the receiver
  102988.     by the argument, operand, with truncation toward zero.
  102989.     (i.e. 'C' like integer division);  e.g. 6 quo: 2 = 3, 7 quo: 2 = 3, -7 quo: 2 = -3 
  102990.     (whereas -7 // 3 = -4).
  102991.     Signal a ZeroDivide exception if operand is zero."
  102992.  
  102993.     ^(self / operand) truncated!
  102994.  
  102995. quoAndRem: aNumber
  102996.     "Private- Answer a two element array containing the integer quotient of 
  102997.     the receiver divided by aNumber with truncation toward zero (i.e. like C 
  102998.     integer division), and the corresponding remainder.
  102999.     As both quotient and remainder are typically calculated by a single division
  103000.     operation, if both are needed it is often more efficient to use this 
  103001.     method (assuming that the particular subclass implements it more efficiently!!)"
  103002.  
  103003.     ^Array with: (self quo: aNumber) with: (self rem: aNumber)!
  103004.  
  103005. quoAndRemFromInteger: anInteger 
  103006.     "Private - Answer the quotient and remainder resulting from division of 
  103007.     the argument, anInteger, by the receiver, with truncation towards zero."
  103008.  
  103009.     | quo |
  103010.     quo := self quotientFromInteger: anInteger.
  103011.     ^Array with: quo with: (anInteger - (quo * self))
  103012.     
  103013. !
  103014.  
  103015. quotientFromInteger: anInteger 
  103016.     "Private - Answer the quotient resulting from division of the argument, anInteger, by
  103017.     the receiver, with truncation towards zero."
  103018.  
  103019.     ^(anInteger / self) truncated!
  103020.  
  103021. raisedTo: operand
  103022.     "Answer an <ArithmeticValue> which is the receiver raised to the power of 
  103023.     the <number> argument, operand.
  103024.     Raise a FloatingPointException for overflow if the answer must be
  103025.     a <Float> and exceeds the representable range of a double precision
  103026.     floating point number."
  103027.  
  103028.     ^self subclassResponsibility    !
  103029.  
  103030. raisedToInteger: operand
  103031.     "Answer the receiver raised to the <integer> power, operand."
  103032.  
  103033.     | i answer |
  103034.     operand == 0 ifTrue: [^self class one].
  103035.     operand == 1 ifTrue: [^self].
  103036.     operand isInteger
  103037.         ifFalse: [ ^self error: 'expected integer argument' ].
  103038.     operand negative ifTrue: [^(self raisedToInteger: operand negated) reciprocal].
  103039.     i := 2.
  103040.     [i < operand] whileTrue: [i := i + i].
  103041.     answer := self class one.
  103042.     [i > 0] whileTrue: [
  103043.         answer := answer * answer.
  103044.         (operand bitAnd: i) == 0 ifFalse: [answer := answer * self].
  103045.         i := i bitShift: -1].
  103046.     ^answer!
  103047.  
  103048. reciprocal
  103049.     "Answer a <number> which is the reciprocal of the receiver (i.e. 1/receiver).
  103050.     Raise a <ZeroDivide> exception if the receiver is zero."
  103051.  
  103052.     ^self class one / self!
  103053.  
  103054. rem: operand
  103055.     "Answer the <number> remainder resulting from division of the receiver by
  103056.     the <number>, operand, with truncation toward zero; 
  103057.         e.g. 7 rem: 2 = 1, -7 rem: 2 = -1 (whereas -7 \\ 2 = 1)"
  103058.  
  103059.     ^self - ((self quo: operand) * operand)!
  103060.  
  103061. retry: aSymbol coercing: anArithmeticValue
  103062.     "Private - The binary selector, aSymbol, was attempted with a receiver and argument 
  103063.     of different type, and    could not be performed directly. This method requests
  103064.     the ArithmeticValue of higher generality to coerce (type convert) the ArithmeticValue 
  103065.     of lower generality to its generality, and then the message is retried. Equivalence, #=, 
  103066.     is special cased to answer false if the argument is not a number (since non-anArithmeticValue
  103067.     cannot be coerced). The method reports an error if both receiver and argument, 
  103068.     aNumber, have the same generality. "
  103069.  
  103070.     | selfGen argGen |
  103071.     selfGen := self generality.
  103072.     argGen := anArithmeticValue generality.
  103073.     selfGen > argGen
  103074.         ifTrue: [^self perform: aSymbol with: (self coerce: anArithmeticValue)].
  103075.     selfGen < argGen
  103076.         ifTrue: [^(anArithmeticValue coerce: self) perform: aSymbol with: anArithmeticValue].
  103077.     ^self error: 'cannot coerce ArithmeticValues of same generality'!
  103078.  
  103079. rounded
  103080.     "Answer the <integer> nearest the receiver according to the following rule:
  103081.         N rounded = the nearest integer I = N + (N sign * (1/2)) truncated toward zero"
  103082.  
  103083.     ^((self class zero + self sign)/2 + self) truncated!
  103084.  
  103085. roundTo: factor
  103086.     "Answer the multiple of the <number> argument, factor, that is nearest the receiver"
  103087.  
  103088.     ^(self / factor) rounded * factor!
  103089.  
  103090. roundUpTo: anArithmeticValue 
  103091.     "Answer the nearest multiple of the <ArithmeticValue> argument which
  103092.     is greater than or equal to the receiver."
  103093.  
  103094.     ^(self / anArithmeticValue) ceiling * anArithmeticValue!
  103095.  
  103096. sign
  103097.     "Answer the <integer> sign of the receiver:
  103098.         1 if the receiver is greater than 0, 
  103099.         -1 if less than 0
  103100.         0 if equal to 0."
  103101.  
  103102.     ^self negative 
  103103.         ifTrue: [-1]
  103104.         ifFalse: [
  103105.             self isZero
  103106.                 ifTrue: [0]
  103107.                 ifFalse: [1]]!
  103108.  
  103109. squared
  103110.     "Answer a <number> that is the receiver multiplied by itself."
  103111.  
  103112.     ^self * self!
  103113.  
  103114. strictlyPositive
  103115.     "Answer whether the receiver is greater than zero."
  103116.  
  103117.     ^self > self class zero!
  103118.  
  103119. subtractFromFloat: aFloat
  103120.     "Private - Answer the result of subtracting the receiver from the known Float,
  103121.     aFloat, by coercing the less general of it and the receiver. Overridden by 
  103122.     subclasses which can implement more efficiently."
  103123.  
  103124.     ^aFloat retry: #- coercing: self
  103125. !
  103126.  
  103127. subtractFromFraction: aFraction
  103128.     "Private - Answer the result of subtracting the receiver from the known fraction, aFraction,
  103129.     by coercing the less general of it and the receiver. Overridden by subclasses 
  103130.     which can implement more efficiently."
  103131.  
  103132.     ^aFraction retry: #- coercing: self!
  103133.  
  103134. subtractFromInteger: anInteger
  103135.     "Private - Answer the result of subtracting the receiver from the known integer,
  103136.      anInteger, by coercing the less general of it and the receiver. Overridden by 
  103137.     subclasses which can implement more efficiently."
  103138.  
  103139.     ^anInteger retry: #- coercing: self!
  103140.  
  103141. subtractFromPoint: aPoint
  103142.     "Private - Answer the result of subtracting the receiver from the known Point,
  103143.     aPoint, by coercing the less general of it and the receiver. Overridden by 
  103144.     subclasses which can implement more efficiently."
  103145.  
  103146.     ^aPoint retry: #- coercing: self
  103147. !
  103148.  
  103149. subtractFromPoint3D: aPoint3D
  103150.     "Private - Answer the result of subtracting the receiver from the known Point3D,
  103151.     aPoint3D, by coercing the less general of it and the receiver. Overridden by 
  103152.     subclasses which can implement more efficiently."
  103153.  
  103154.     ^aPoint3D retry: #- coercing: self
  103155. !
  103156.  
  103157. subtractFromScaledDecimal: operand
  103158.     "Private - Answer the result of subtracting the receiver from the 
  103159.     known <ScaledDecimal>, operand."
  103160.  
  103161.     ^operand retry: #- coercing: self!
  103162.  
  103163. truncated
  103164.     "Answer the <integer> nearest the receiver toward zero"
  103165.  
  103166.     ^self quo: 1!
  103167.  
  103168. truncateTo: factor
  103169.     "Answer the next multiple of the <number> argument, factor, that is nearest the receiver 
  103170.     toward zero."
  103171.  
  103172.     ^((self quo: factor) * factor)
  103173. !
  103174.  
  103175. understandsArithmetic
  103176.     "Answer whether the receiver understands basic arithmetic (+, -, etc). 
  103177.     All Numbers do."
  103178.  
  103179.     ^true! !
  103180.  
  103181. Association comment:
  103182. 'Association is a simple class to encapsulate the relationship between
  103183. a key and a value. It is used for the elements of Dictionaries.'!
  103184. !Association class methodsFor!
  103185.  
  103186. key: aKey value: aValue
  103187.     "Answer a new instance of the receiver whose key is aKey and
  103188.     value is aValue."
  103189.  
  103190.     <primitive: 157>
  103191.     ^self new key: aKey value: aValue
  103192. ! !
  103193.  
  103194. !Association methodsFor!
  103195.  
  103196. < anAssociation 
  103197.     "Answer whether the receiver is considered 'less than' the argument."
  103198.  
  103199.     ^key < anAssociation key!
  103200.  
  103201. = anAssociation 
  103202.     "Answer whether the receiver is equal to the argument."
  103203.  
  103204.     ^self species == anAssociation species 
  103205.         and: [key = anAssociation key
  103206.         and: [value = anAssociation value]]!
  103207.  
  103208. displayOn: aStream
  103209.     "Append a short textual description of the receiver to aStream."
  103210.  
  103211.     aStream
  103212.         display: key;
  103213.         nextPutAll: ' -> ';
  103214.         display: value!
  103215.  
  103216. hash
  103217.     "Answer the hash value of the receiver's key."
  103218.  
  103219.     ^key hash
  103220. !
  103221.  
  103222. key
  103223.     "Answer the lookup key of the receiver."
  103224.  
  103225.     ^key
  103226. !
  103227.  
  103228. key: aKey
  103229.     "Set the lookup key of the receiver."
  103230.  
  103231.     key := aKey
  103232. !
  103233.  
  103234. key: aKey value: aValue
  103235.     "Set the instance variables of the receiver to aKey->aValue"
  103236.  
  103237.     key := aKey.
  103238.     value := aValue
  103239. !
  103240.  
  103241. owningPackage: aPackage
  103242.     aPackage addGlobalNamed: self key!
  103243.  
  103244. printOn: aStream
  103245.     "Append a short textual description of the receiver to aStream."
  103246.  
  103247.     aStream 
  103248.         print: key;
  103249.         nextPutAll: ' -> ';
  103250.         print: value!
  103251.  
  103252. value
  103253.     "Answer the 'value' of the receiver."
  103254.  
  103255.     ^value!
  103256.  
  103257. value: aValue
  103258.     "Set the 'value' of the receiver. N.B. The meaning of #value: to an Association 
  103259.     is not the same as that defined by the ANSI monadic valuable protocol."
  103260.  
  103261.     value := aValue
  103262. ! !
  103263.  
  103264. Character comment:
  103265. 'Character is the class of objects which serve as the elemental values of Smalltalk Strings. There is a finite set of Characters (256 in the current Dolphin implementation). Characters have a literal syntax which is the $ symbol followed by the normal printed representation of the character.
  103266.  
  103267. Note that the ANSI standard does not require that Characters be identity objects, but they are in Dolphin.
  103268. '!
  103269. !Character class methodsFor!
  103270.  
  103271. backspace
  103272.     "Answer the backspace Character"
  103273.  
  103274.     ^##(self value: 8)
  103275. !
  103276.  
  103277. basicNew
  103278.     "Characters are immediate objects, and cannot be instantiated directly, they
  103279.     can only be created by literal references, by operations on other Characters,
  103280.     or with the Character>>value: message."
  103281.  
  103282.     ^self shouldNotImplement!
  103283.  
  103284. byteCharacterSet
  103285.     "Answer the first 256 characters"
  103286.     
  103287.     ^CharacterSet!
  103288.  
  103289. codePoint: integer
  103290.     "Answer an instance of the receiver with the <integer> encoding, integer.
  103291.  
  103292.     Note that at present the encodings are limited to 0..255, but in a future
  103293.     release the Unicode character set will be supported, and the encoding
  103294.     range will then be 0..65535."
  103295.  
  103296.     ^self value: integer!
  103297.  
  103298. cr
  103299.     "Answer the carriage return <Character>."
  103300.  
  103301.     ^##(self value: 13)!
  103302.  
  103303. digitValue: anInteger
  103304.     "Answer the Character that corresponds to anInteger.  0-9 map to $0-$9,
  103305.     10-35 map to $A-$Z. If anInteger is not in the range
  103306.     0..35, then the String #at: will fail with a bounds error."
  103307.  
  103308.     ^'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' at: anInteger+1!
  103309.  
  103310. eof
  103311.     "Answer the EOF (Ctrl+Z) character.
  103312.     DOS interprets this character as marking the end of a file."
  103313.  
  103314.     ^##(self value: 26)!
  103315.  
  103316. esc
  103317.     "Answer the escape Character"
  103318.  
  103319.     ^##(self value: 27)
  103320. !
  103321.  
  103322. icon
  103323.     "Answers an Icon that can be used to represent this class"
  103324.  
  103325.     ^##(self) defaultIcon!
  103326.  
  103327. lf
  103328.     "Answer the linefeed <Character>."
  103329.  
  103330.     ^##(self value: 10)!
  103331.  
  103332. new
  103333.     "Characters are immediate objects, and cannot be instantiated directly, they
  103334.     can only be created by literal references, by extraction from Strings, or
  103335.     from a code point."
  103336.  
  103337.     ^self shouldNotImplement
  103338. !
  103339.  
  103340. newPage
  103341.     "Answer the new page Character."
  103342.  
  103343.     ^##(self value: 12)
  103344. !
  103345.  
  103346. nl
  103347.     "Answer the new line <Character> (synonym for lf)"
  103348.  
  103349.     ^self lf!
  103350.  
  103351. null
  103352.     "Answer the NULL-terminator character"
  103353.  
  103354.     ^##(self value: 0)
  103355. !
  103356.  
  103357. space
  103358.     "Answer the space <Character>."
  103359.  
  103360.     ^$ .!
  103361.  
  103362. tab
  103363.     "Answer the tab <Character>."
  103364.  
  103365.     ^##(self value: 9)!
  103366.  
  103367. value: anInteger
  103368.     "Answer the character with ascii value, anInteger. If anInteger is not in the range 0..255, 
  103369.     then #at: primitive will fail"
  103370.  
  103371.     ^CharacterSet at: anInteger + 1
  103372. ! !
  103373.  
  103374. !Character methodsFor!
  103375.  
  103376. _separateSubStringsIn: tokens
  103377.     "Private - Answer the sub-strings of the <readableString> argument
  103378.      separated by the receiver.
  103379.     Implementation Note: Although this routine is rather more complex than
  103380.     it need be, the performance of #subStrings(:) is important, so it pays
  103381.     to optimize this routine. In particular we try to avoid performing any
  103382.     work in the common cases where the string is either empty, or does not
  103383.     contain the separator at all. However, we must be careful not to over 
  103384.     optimize and prevent correct operation for wide (Unicode) strings."
  103385.  
  103386.     | start answer size end |
  103387.     size := tokens size.
  103388.     size == 0 ifTrue: [^Array new].
  103389.     end := tokens nextIndexOf: self from: 1 to: size.
  103390.     end == 0 ifTrue: [^Array with: tokens].
  103391.     answer := Array writeStream: 5.
  103392.     start := 1.
  103393.     [
  103394.         answer nextPut: (tokens copyFrom: start to: end - 1).
  103395.         start := end + 1.
  103396.         end := tokens nextIndexOf: self from: start to: size.
  103397.         end == 0
  103398.     ] whileFalse.
  103399.     "Copy any remaining chars after the last separator"
  103400.     start <= size ifTrue: [answer nextPut: (tokens copyFrom: start to: size)].
  103401.     ^answer contents
  103402. !
  103403.  
  103404. < aCharacter
  103405.     "Answer whether the receiver is less than the parameter aCharacter."
  103406.  
  103407.     ^self asInteger < aCharacter asInteger
  103408. !
  103409.  
  103410. = comperand
  103411.     "Answer whether the receiver is the sames as the parameter, comperand.
  103412.     There is a unique Character instance for each possible value, so equality
  103413.     between characters is the same as object identity in Dolphin.
  103414.     The object identity primitive should not fail."
  103415.  
  103416.     <primitive: 110>
  103417.     ^self primitiveFailed!
  103418.  
  103419. > aCharacter
  103420.     "Answer whether the receiver is greater than the parameter aCharacter."
  103421.  
  103422.     ^self asInteger > aCharacter asInteger
  103423. !
  103424.  
  103425. appendToStream: puttableStream
  103426.     "Private - Append the receiver's elements to the argument, puttableStream.
  103427.     Answer the receiver.
  103428.     Implementation note: Double dispatched from streams."
  103429.  
  103430.     puttableStream nextPut: self!
  103431.  
  103432. asciiValue
  103433.     "Answers the ascii character value of the receiver.
  103434.     Although this is an ST-80 message, it is specific to ASCII char set, and will be obsolete when we go Unicode. 
  103435.     Use #codePoint instead."
  103436.  
  103437.     #deprecated.
  103438.     ^asciiValue!
  103439.  
  103440. asInteger
  103441.     "Answer the receiver's character code as an Integer. 
  103442.     For standard 8-byte characters, this is the ASCII value"
  103443.  
  103444.     ^asciiValue!
  103445.  
  103446. asLowercase
  103447.     "Answer a <Character> which is the lowercase equivalent of the receiver.
  103448.     If the receiver is already lowercase, then answer the receiver unchanged.
  103449.     Implementation Note: Apart from the ANSI asLowercase character mappings
  103450.     (basically all the uppercase letters are mapped to lowercase letters), this
  103451.     implementation will map other characters, depending on the configured
  103452.     locale of the host OS."
  103453.  
  103454.     ^UserLibrary default charLower: self!
  103455.  
  103456. asString
  103457.     "Answer a new <String> whose sole element is the receiver."
  103458.  
  103459.     ^String with: self
  103460. !
  103461.  
  103462. asSymbol
  103463.     "Answer the Symbol representation of the receiver."
  103464.  
  103465.     ^Symbol internCharacter: self!
  103466.  
  103467. asUppercase
  103468.     "Answer a <Character> which is the uppercase equivalent of the receiver.
  103469.     If the receiver is already uppercase, then answer the receiver unchanged.
  103470.     Implementation Note: Apart from the ANSI asUppercase character mappings
  103471.     (basically all the lowercase letters are mapped to uppercase letters), this
  103472.     implementation will map other characters, depending on the configured
  103473.     locale of the host OS."
  103474.  
  103475.     ^UserLibrary default charUpper: self!
  103476.  
  103477. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣`▓▀6£ê₧╠╛ü^s²4iPV√ÄDDzÇWMé{∙╜T╣oö[╝BJ>íeî≈WêGs⌐g╛°¬ƒ╒»fÜÜùò!
  103478.  
  103479. basicClass
  103480.     "Answer the class of the receiver."
  103481.  
  103482.     ^Character!
  103483.  
  103484. basicShallowCopy
  103485.     "Answer the receiver, as Characters have a unique representation for
  103486.     each possible value."
  103487.  
  103488.     ^self!
  103489.  
  103490. basicSize
  103491.     "Private - We must override the primitive implementation in Object,
  103492.     which does not expect to be invoked for immediate receivers."
  103493.  
  103494.     ^0!
  103495.  
  103496. class
  103497.     "Answer the class of the receiver.
  103498.     Implementation Note: The standard primitive will fail for immediate classes."
  103499.  
  103500.     ^Character!
  103501.  
  103502. codePoint
  103503.     "Answers the receiver's <integer> encoding value."
  103504.  
  103505.     ^self asInteger!
  103506.  
  103507. deepCopy
  103508.     "Answer the receiver, as Characters are immutable"
  103509.  
  103510.     ^self!
  103511.  
  103512. digitValue
  103513.     "Answer the digit representation of the receiver.
  103514.     'digit' is defined as either 0-9, or uppercase A-Z (for 10-35).
  103515.     Note: In versions of Dolphin prior to 3.0 this raised an error if the character
  103516.     was not a valid digit character, but for compatibility with VW it now returns
  103517.     -1. The method is now optimized for improved performance too."
  103518.  
  103519.     ^asciiValue > 127 
  103520.         ifTrue: [-1]
  103521.         ifFalse: [(#[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] at: asciiValue+1) - 1]!
  103522.  
  103523. displayOn: aStream
  103524.     "Append the end-user display representation of the receiver to aStream."
  103525.  
  103526.     aStream nextPut: self!
  103527.  
  103528. hash
  103529.     "Answer the SmallInteger hash value for the receiver."
  103530.  
  103531.     ^self asInteger!
  103532.  
  103533. identityHash
  103534.     "Answer the SmallInteger hash value for the receiver."
  103535.  
  103536.     ^self asInteger!
  103537.  
  103538. isAlphaNumeric
  103539.     "Answer whether the receiver is a letter or a digit."
  103540.  
  103541.     ^UserLibrary default isCharAlphaNumeric: self!
  103542.  
  103543. isControl
  103544.     "Answer whether the receiver is a control character."
  103545.  
  103546.     ^CRTLibrary default iswcntrl: self!
  103547.  
  103548. isDigit
  103549.     "Answer whether the receiver is a representation of a decimal-digit character
  103550.     (i.e. it is one of $0 $1 $2 $3 $4 $5 $6 $7 $8 $9)."
  103551.  
  103552.     ^self codePoint >= ##($0 codePoint) and: [self codePoint <= ##($9 codePoint)]!
  103553.  
  103554. isHexDigit
  103555.     "Answer whether the receiver is a valid Smalltalk hexadecimal digit (i.e. digits and the
  103556.     uppercase characters A through F)."
  103557.  
  103558.     ^self isDigit or: [self codePoint >= ##($A codePoint) and: [self codePoint <= ##($F codePoint)]]!
  103559.  
  103560. isImmediate
  103561.     "Answer whether the receiver has an immediate representation."
  103562.  
  103563.     ^true!
  103564.  
  103565. isLetter
  103566.     "Answer whether the receiver is an alphabetic character."
  103567.  
  103568.     ^UserLibrary default isCharAlpha: self
  103569. !
  103570.  
  103571. isLinefeed
  103572.     "Answer whether the receiver is the line-feed character."
  103573.  
  103574.     ^asciiValue = 10!
  103575.  
  103576. isLiteral
  103577.     "Private - Answer whether the receiver has a literal representation
  103578.     which is directly recognised by the Compiler."
  103579.  
  103580.     ^true!
  103581.  
  103582. isLowercase
  103583.     "Answer whether the receiver is a lowercase letter."
  103584.  
  103585.     ^UserLibrary default isCharLower: self
  103586. !
  103587.  
  103588. isLowerCase
  103589.     "Answer whether the receiver is a lowercase letter."
  103590.  
  103591.     ^self isLowercase!
  103592.  
  103593. isPrintable
  103594.     "Answer whether the receiver is a printable character."
  103595.  
  103596.     ^CRTLibrary default iswprint: self!
  103597.  
  103598. isPunctuation
  103599.     "Answer whether the receiver is a punctuation character."
  103600.  
  103601.     ^CRTLibrary default iswpunct: self!
  103602.  
  103603. isSeparator
  103604.     "Answer whether the receiver is a separator character (i.e. whitespace)."
  103605.  
  103606.     ^CRTLibrary default iswspace: self
  103607.  
  103608.     "This, rather ugly, Smalltalk code is faster, but will not localize.
  103609.     ^self == ##(self space) 
  103610.         or: [ self == ##(self tab)
  103611.             or: [ self == ##(self cr)
  103612.                 or: [ self == ##(self nl)
  103613.                     or: [ self == ##(self newPage)]]]]."
  103614.  
  103615.  
  103616. !
  103617.  
  103618. isUppercase
  103619.     "Answer whether the receiver is an uppercase letter."
  103620.  
  103621.     ^UserLibrary default isCharUpper: self!
  103622.  
  103623. isUpperCase
  103624.     "Answer whether the receiver is an uppercase letter."
  103625.  
  103626.     ^self isUppercase
  103627. !
  103628.  
  103629. isVowel
  103630.     "Answer whether the receiver is an English vowel (a, e, i, o, or u).
  103631.     This test is case insensitive."
  103632.  
  103633.     ^'aAeEiIoOuU' includes: self!
  103634.  
  103635. isWhitespace
  103636.     "Answer whether the receiver is a white space character.
  103637.     This is a synonym for #isSeparator as currently defined."
  103638.  
  103639.     ^self isSeparator!
  103640.  
  103641. printOn: aStream
  103642.     "Append the ASCII representation of the receiver to aStream as a 
  103643.     developer would want to see it."
  103644.  
  103645.     aStream nextPut: $$; nextPut: self!
  103646.  
  103647. shallowCopy
  103648.     "Answer the receiver, as Characters have a unique representation for
  103649.     each possible value."
  103650.  
  103651.     ^self!
  103652.  
  103653. size
  103654.     "Private - We must override the primitive implementation in Object,
  103655.     which does not expect to be invoked for immediate receivers."
  103656.  
  103657.     ^0!
  103658.  
  103659. species
  103660.     "Answer the 'species' of the receiver.
  103661.     Implementation Note: The primitive superclass implementation
  103662.     will fail for immediate classes, so we must override here."
  103663.  
  103664.     ^Character! !
  103665.  
  103666. Date comment:
  103667. 'Date is the class whose instances represent days of the year. The base date (day 0) is Jan 1, 1901.'!
  103668. !Date class methodsFor!
  103669.  
  103670. dateAndTimeNow 
  103671.     "Answer an Array whose first element is the current local Date and whose
  103672.     second element is the current local Time."
  103673.  
  103674.     ^Time dateAndTimeNow!
  103675.  
  103676. dateOrderFromFormat: aFormatString
  103677.     "Private - Answers a String giving the component order in aFormatString (e.g. 'DMY' or 'MDY')"
  103678.     
  103679.     ^aFormatString asUppercase copyWithoutDuplicates select: [:each | each isLetter]!
  103680.  
  103681. day: daysSinceBase inYear: anInteger
  103682.     "Private - Answer the julian day index of the argument, daysSinceBase, in the year, anInteger."
  103683.  
  103684.     "Day 0 is 1 Jan in base year, so we add 1"
  103685.     ^daysSinceBase - (self yearAsDays: anInteger) + 1!
  103686.  
  103687. dayOfWeek: dayName
  103688.     "Answer the index in a week, 1, 2, 3, ..., 7, of the day named by the argument, dayName."
  103689.  
  103690.     ^Locale default dayNames at: dayName asLowercase!
  103691.  
  103692. daysInMonth: monthName forYear: yearInteger
  103693.     "Answer the number of days in the month whose name is, monthName, in the year, yearInteger"
  103694.  
  103695.     ^self daysInMonthIndex: (self indexOfMonth: monthName) forYear: yearInteger!
  103696.  
  103697. daysInMonthIndex: monthIndex forYear: yearInteger
  103698.     "Private - Answer the number of days in the month whose index is, monthIndex,
  103699.     in the year, yearInteger"
  103700.  
  103701.     | days |
  103702.     days := DaysInMonth at: monthIndex.
  103703.     monthIndex == 2 ifTrue: [ days := days + (self leapYear: yearInteger) ].
  103704.     ^days
  103705. !
  103706.  
  103707. daysInYear: yearInteger
  103708.     "Answer the number of days in the year, yearInteger."
  103709.  
  103710.     ^365 + (self leapYear: yearInteger)
  103711. !
  103712.  
  103713. daysUntilMonth: monthIndex inYear: yearInteger
  103714.     "Private - Answer the number of days in year, yearInteger, which elapse before the
  103715.     first day of the month whose index (1..12), is monthIndex."
  103716.  
  103717.     | days |
  103718.     days := DaysUntilMonth at: monthIndex.
  103719.     monthIndex > 2 ifTrue: [ days := days + (self leapYear: yearInteger) ].
  103720.     ^days!
  103721.  
  103722. defaultLongFormat
  103723.     "Answer the default long date format."
  103724.  
  103725.     ^Locale default longDateFormat!
  103726.  
  103727. defaultLongPicture: aBoolean
  103728.     "Private - Set whether the default printing for dates uses long or short pictures."
  103729.  
  103730.     DefaultLongPicture := aBoolean!
  103731.  
  103732. defaultShortFormat
  103733.     "Answer the default short date format."
  103734.  
  103735.     ^Locale default dateFormat!
  103736.  
  103737. defaultYearPivot
  103738.     "Answer the default year pivot to use when converting date strings with 2 digit years."
  103739.  
  103740.     ^30!
  103741.  
  103742. errorInvalidFormat
  103743.     "Private - Raise an error that some attempt to create an instance of the receiver failed
  103744.     because the some input was in the wrong format."
  103745.  
  103746.     ^InvalidFormat signalWith: self!
  103747.  
  103748. fromDays: dayCount
  103749.     "Answer a new instance of the receiver that is dayCount days from (before or after depending on 
  103750.     the sign of dayCount) January 1, 1901."
  103751.  
  103752.     ^self basicNew setDays: dayCount
  103753. !
  103754.  
  103755. fromSeconds: anInteger
  103756.     "Answer a new instance of the receiver that incorporates the second which is anInteger
  103757.     seconds after the epoch."
  103758.  
  103759.     ^self fromDays: anInteger // ##(60*60*24)!
  103760.  
  103761. fromString: aString
  103762.     "Answer an instance of the receiver constructed from the string,
  103763.     aString, using the default conversion format."
  103764.  
  103765.     ^self readFrom: aString readStream!
  103766.  
  103767. fromString: aString format: aFormatStringOrNil
  103768.     "Answer an instance of the receiver constructed from the string,
  103769.     aString, using aFormatStringOrNil."
  103770.  
  103771.     ^self readFrom: aString readStream format: aFormatStringOrNil!
  103772.  
  103773. fromSYSTEMTIME: aSYSTEMTIME
  103774.     "Private - Answer a new instance of the receiver instantiated from the argument, aSYSTEMTIME."
  103775.     
  103776.     ^self newDay: aSYSTEMTIME wDay monthIndex: aSYSTEMTIME wMonth year: aSYSTEMTIME wYear!
  103777.  
  103778. icon
  103779.     "Answers an Icon that can be used to represent this class"
  103780.  
  103781.     ^##(self) defaultIcon!
  103782.  
  103783. indexOfMonth: monthName
  103784.     "Answer the index in a year (1 .. 12) of the month named by the argument, 
  103785.     monthName, where monthName is the full locale specific name, or its abbreviated form,
  103786.     in upper or lower case."
  103787.  
  103788.     ^Locale default monthNames at: monthName asLowercase!
  103789.  
  103790. initialize
  103791.     "Private - Initialize the class variables of the receiver
  103792.  
  103793.     Evaluate me to initialize:
  103794.         Date initialize
  103795.     "
  103796.  
  103797.     self defaultLongPicture: true.
  103798.     self yearPivot: self defaultYearPivot.
  103799.  
  103800.     "Days indices are for non-leap years"
  103801.     DaysInMonth := #(31 28 31 30 31 30 31 31 30 31 30 31).
  103802.     DaysUntilMonth := #(0 31 59 90 120 151 181 212 243 273 304 334 ).!
  103803.  
  103804. leapYear: yearInteger
  103805.     "Answer 1 if, yearInteger, is a leap year, otherwise answer 0. The Royal
  103806.     Observatory in Greenwich assure us that a year is a leap year if it is 
  103807.     divisible by 4, but not by 100, unless by 400, e.g: 1896 was a leap year, 
  103808.     but 1900 was not, but 2000 will be."
  103809.  
  103810.     ^(yearInteger \\ 4 ~= 0 or: [yearInteger \\ 100 == 0 and: [yearInteger \\ 400 ~= 0]])
  103811.         ifTrue: [ 0 ]
  103812.         ifFalse: [ 1 ]!
  103813.  
  103814. longFormats
  103815.     "Answer a collection of the long date formats for the user locale.
  103816.     This list could be used, for example, to populate a drop-down."
  103817.  
  103818.     ^Locale default longDateFormats!
  103819.  
  103820. monthIndexOfDay: dayInteger inYear: yearInteger
  103821.     "Private - Answer the index of the month of the specified julian day number in the specified year."
  103822.  
  103823.     | leap daysUntil |
  103824.     leap := self leapYear: yearInteger.
  103825.     1 to: 12 do: [ :monthIndex |
  103826.         daysUntil := (DaysUntilMonth at: monthIndex) + (monthIndex > 2 ifTrue: [leap] ifFalse: [0]).
  103827.         daysUntil >= dayInteger
  103828.             ifTrue: [ ^monthIndex - 1 ]].
  103829.     ^12!
  103830.  
  103831. nameOfDay: dayIndex
  103832.     "Answer a String that is the localised name of the day whose index is the argument, dayIndex, 
  103833.     where Monday is 1 and Sunday is 7."
  103834.  
  103835.     ^Locale default nameOfDay: dayIndex abbrev: false!
  103836.  
  103837. nameOfMonth: monthIndex
  103838.     "Answer a localised String name for the month whose index is the argument, monthIndex, where 
  103839.     January is month 1, and December is month 12."
  103840.  
  103841.     ^Locale default nameOfMonth: monthIndex abbrev: false!
  103842.  
  103843. new
  103844.     "Answer an instance of the receiver representing the current system date."
  103845.  
  103846.     ^self today!
  103847.  
  103848. newDay: day month: monthName year: year
  103849.     "Answer a new instance of the receiver that is the <integer> day numbered, day, 
  103850.     of the <readableString> month named, monthName in the <integer> year, year."
  103851.  
  103852.     ^self newDay: day monthIndex: (self indexOfMonth: monthName) year: year!
  103853.  
  103854. newDay: day monthIndex: month year: year
  103855.     "Answer a new instance of the receiver that is the <integer> day numbered, 
  103856.     day, of the <integer> month index (1..12), monthIndex in the year, 
  103857.     <integer> year, year."
  103858.  
  103859.     ^self newDay: day + (self daysUntilMonth: month inYear: year) year: year!
  103860.  
  103861. newDay: day monthNumber: month year: year
  103862.     "For compatibility with VisualWorks..."
  103863.  
  103864.     ^self newDay: day monthIndex: month year: year!
  103865.  
  103866. newDay: dayCount year: yearInteger
  103867.     "Answer a new instance of the receiver that is the day numbered, day, of the year, yearInteger"
  103868.  
  103869.     ^self fromDays: dayCount + (self yearAsDays: yearInteger) - 1
  103870. !
  103871.  
  103872. readDayFrom: aStream
  103873.     "Private - Answer a day index read from aStream"
  103874.  
  103875.     | day |
  103876.     aStream peek isDigit ifTrue: [ 
  103877.         day := Integer readFrom: aStream radix: 10.
  103878.             ((1 to: 31) includes: day) ifTrue: [^day]].
  103879.     ^self errorInvalidFormat
  103880.         !
  103881.  
  103882. readFrom: aStream
  103883.     "Answers an new instance of the receiver read from aStream with a format determined
  103884.     by the current locale"
  103885.     
  103886.     ^self readFrom: aStream format: nil!
  103887.  
  103888. readFrom: aStream format: aFormatStringOrNil
  103889.     "Answers a new instance of the receiver read from aStream according to aFormatString"
  103890.     
  103891.     | dd mm yy monthFirst x y dateOrder format |
  103892.  
  103893.     format := aFormatStringOrNil isNil
  103894.         ifTrue: [ self defaultShortFormat ]
  103895.         ifFalse: [ aFormatStringOrNil ].
  103896.  
  103897.     dateOrder := self dateOrderFromFormat: format.
  103898.     dateOrder do: [:each |
  103899.         aStream skipWhile: [:c | c isAlphaNumeric not].
  103900.         aStream atEnd ifTrue: [ self errorInvalidFormat ].
  103901.         each = $D ifTrue: [ dd := self readDayFrom: aStream ].
  103902.         each = $M ifTrue: [ mm := self readMonthFrom: aStream ].
  103903.         each = $Y ifTrue: [ yy := self readYearFrom: aStream ]].
  103904.  
  103905.     ((1 to: (self daysInMonthIndex: mm forYear: yy)) includes: dd) ifFalse: [
  103906.         self errorInvalidFormat].
  103907.     
  103908.     ^self newDay: dd monthIndex: mm year: yy!
  103909.  
  103910. readMonthFrom: aStream
  103911.     "Private - Answer a month index read from aStream. The stream may be positioned at,
  103912.     either a month number or a month name"
  103913.  
  103914.     | month |
  103915.     aStream peek isDigit ifTrue: [ 
  103916.         month := Integer readFrom: aStream radix: 10.
  103917.         ((1 to: 12) includes: month) ifFalse: [ self errorInvalidFormat ].
  103918.         ^month ].
  103919.  
  103920.     1 to: 12 do: [:mm | | shortName |
  103921.         shortName := (self shortNameOfMonth: mm) copyWithout: $..
  103922.         (shortName skipOver: aStream ignoreCase: true) 
  103923.             ifTrue: [ aStream skipWhile: [:c | c isLetter]. ^mm ]].
  103924.  
  103925.     ^self errorInvalidFormat
  103926.         !
  103927.  
  103928. readYearFrom: aStream
  103929.     "Private - Answer a year read from aStream"
  103930.  
  103931.     | yy |
  103932.     aStream peek isDigit ifTrue: [ 
  103933.         yy := Integer readFrom: aStream radix: 10.
  103934.         yy < 100 ifTrue: [ | offset |
  103935.             "Two digit date"
  103936.             offset := Date today year roundTo: 100.
  103937.             yy >= self yearPivot ifTrue: [
  103938.                 offset := offset - 100 ].
  103939.             yy := yy + offset].
  103940.         ^yy].
  103941.     ^self errorInvalidFormat
  103942.  
  103943.  
  103944. !
  103945.  
  103946. shortFormats
  103947.     "Private - Answer a collection of the short date formats for the user locale."
  103948.  
  103949.     ^Locale default shortDateFormats!
  103950.  
  103951. shortNameOfDay: dayIndex
  103952.     "Answer a String that is the localised name of the day whose index is the argument, dayIndex, where Monday is 1 
  103953.     and Sunday is 7."
  103954.  
  103955.     ^Locale default nameOfDay: dayIndex abbrev: true!
  103956.  
  103957. shortNameOfMonth: monthIndex
  103958.     "Answer a localised abbreviated String name for the month whose index is the argument, monthIndex, where January 
  103959.     is month 1, and December is month 12."
  103960.  
  103961.     ^Locale default nameOfMonth: monthIndex abbrev: true!
  103962.  
  103963. today
  103964.     "Answer an instance of the receiver representing the current system date."
  103965.  
  103966.     ^self fromSYSTEMTIME: SYSTEMTIME now!
  103967.  
  103968. yearAsDays: yearInteger
  103969.     "Private - Answer the number of days between January 1, 1901 and
  103970.     the first day of the year, yearInteger"
  103971.     
  103972.     | year |
  103973.     year := yearInteger - 1901.
  103974.     ^year * 365
  103975.         + (year // 4)
  103976.         - (year // 100)
  103977.         + (year + ##(1901-1601) // 400)!
  103978.  
  103979. yearPivot
  103980.     "Answers the pivot point for two digit years. Years greater or equal to this will be assumed to be
  103981.     in the current century. Years less than the pivot will be assumed to be in the next century"
  103982.  
  103983.     ^YearPivot!
  103984.  
  103985. yearPivot: anInteger
  103986.     "Sets the pivot point for two digit years to be anInteger. 
  103987.     Years greater or equal to this will be assumed to be in the current century. 
  103988.     Years less than the pivot will be assumed to be in the next century"
  103989.  
  103990.     YearPivot := anInteger! !
  103991.  
  103992. !Date methodsFor!
  103993.  
  103994. < aDate 
  103995.     "Answer whether the receiver precedes the argument, aDate"
  103996.  
  103997.     ^self asDays < aDate asDays!
  103998.  
  103999. = aDate 
  104000.     "Answer whether the receiver is the same data as the argument, aDate"
  104001.  
  104002.     ^self species == aDate species and: [self asDays = aDate asDays]!
  104003.  
  104004. addDays: dayCount
  104005.     "Answer a new Date that is dayCount days after the receiver."
  104006.  
  104007.     ^self class fromDays: self asDays + dayCount!
  104008.  
  104009. addMonths: monthCount
  104010.     "Answer a new Date that is monthCount months before/after the receiver (monthCount can be negative).
  104011.     If the receiver's current day is not valid in the destination month and year, then the day is truncated:
  104012.     i.e. 31 Jan becomes 30 Mar if 2 months added."
  104013.  
  104014.     ^self addMonths: monthCount desiredDay: 0!
  104015.  
  104016. addMonths: monthCount desiredDay: desiredDay
  104017.     "Answer a new Date that is monthCount months before/after the receiver (monthCount can be negative). If the receiver's 
  104018.     current day is not valid in the destination month and year, then the day is truncated. i.e. 31 Jan becomes 30 Mar if 2 
  104019.     months added. If desiredDay is non-zero then this day is set (this allows the caller to retain a particular day number 
  104020.     even should it be truncated by intermediate arithmetic operations."
  104021.  
  104022.     | dayOfMonth monthIndex daysInMonth year |
  104023.     ^self evaluateYYMMDD: [ :yy :mm :dd |
  104024.         monthIndex := mm + monthCount.
  104025.         year := yy.
  104026.         [ monthIndex < 1 ] whileTrue: [ monthIndex := monthIndex + 12. year := year - 1 ].
  104027.         [ monthIndex > 12 ] whileTrue: [ monthIndex := monthIndex - 12. year := year + 1 ].
  104028.         dayOfMonth := desiredDay == 0 ifTrue: [ dd ] ifFalse: [ desiredDay ].
  104029.         daysInMonth := self class daysInMonthIndex: monthIndex forYear: year.
  104030.         dayOfMonth > daysInMonth ifTrue: [ dayOfMonth := daysInMonth ].
  104031.         self class newDay: dayOfMonth monthIndex: monthIndex year: year ]!
  104032.  
  104033. addYears: yearCount
  104034.     "Answer a new Date that is yearCount years before/after the receiver (yearCount can be negative). If the receiver's 
  104035.     current day is not valid in the destination month and year, then the day is truncated. i.e. 31 Jan becomes 30 Mar
  104036.     if 2 months added."
  104037.  
  104038.     ^self addYears: yearCount desiredDay: 0!
  104039.  
  104040. addYears: yearCount desiredDay: desiredDay
  104041.     "Answer a new Date that is yearCount years before/after the receiver (yearCount can be negative). 
  104042.     If the receiver's current day is not valid in the destination month and year, then the day is truncated:
  104043.      i.e. 31 Jan becomes 30 Mar if 2 months added. If desiredDay is non-zero then this day is set (this allows
  104044.     the caller to retain a particular day number even should it be truncated by intermediate arithmetic operations."
  104045.  
  104046.     | dayOfMonth daysInMonth year |
  104047.     ^self evaluateYYMMDD: [ :yy :mm :dd |
  104048.         year := yy + yearCount.
  104049.         dayOfMonth := desiredDay == 0 ifTrue: [ dd ] ifFalse: [ desiredDay ].
  104050.         daysInMonth := self class daysInMonthIndex: mm forYear: year.
  104051.         dayOfMonth > daysInMonth ifTrue: [ dayOfMonth := daysInMonth ].
  104052.         self class newDay: dayOfMonth monthIndex: mm year: year ]!
  104053.  
  104054. asDays
  104055.     "Answer the number of days since 1901 which the receiver represents. As Dolphin dates are
  104056.     stored in this format internally, this is a simple accessor."
  104057.  
  104058.     ^days!
  104059.  
  104060. αW:9░ΓX@°êé9Æ:≤ö√─√ù≡∙¢╓ägf ⌐┼kaME╫è*SâVK$.TU+■ä^Kc%J¬jVx∞ΘMÉ│(iûñ▓ƱźuLce╬╣r»┌µUGö!
  104061.  
  104062. asMilliseconds
  104063.     "Answer the number of milliseconds between a Time on January 1, 1901, and the same time in 
  104064.     the receiver's day (this will probably be a LargeInteger). Can be used to perform 
  104065.     arithmetic with Dates and Times."
  104066.  
  104067.     ^self asSeconds * 1000!
  104068.  
  104069. asParameter
  104070.     "Answer the receiver in external system representation for passing to an external function call."
  104071.  
  104072.     | struct buf |
  104073.     struct := SYSTEMTIME new.
  104074.     self evaluateYYMMDD: [ :yy :mm :dd | struct wYear: yy; wMonth: mm; wDay: dd ].
  104075.     ^struct!
  104076.  
  104077. asSeconds
  104078.     "Answer the number of seconds between a Time on January 1, 1901, and the same time in the receiver's
  104079.     day (this could well be a LargeInteger). Can be used to perform arithmetic with Dates and
  104080.     Times."
  104081.  
  104082.     ^self asDays * ##(24*60*60)
  104083. !
  104084.  
  104085. asTimeStamp
  104086.     "Answer the receiver as <TimeStamp>."
  104087.  
  104088.     ^TimeStamp date: self
  104089. !
  104090.  
  104091. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣`▓▀6£êô┐├ΩUP╒4m    Σ»h>¿ë┴JxöÆp║Fñ=æ╩P]9∩p!
  104092.  
  104093. day
  104094.     "Answer the day of the year represented by the receiver."
  104095.  
  104096.     ^self class day: self asDays inYear: self year!
  104097.  
  104098. dayOfMonth
  104099.     "Answer the day of the month represented by the receiver."
  104100.  
  104101.     | year julianDay monthIndex |
  104102.     year := self year.
  104103.     julianDay := self class day: self asDays inYear: self year.
  104104.     monthIndex := self class monthIndexOfDay: julianDay inYear: year.
  104105.     ^julianDay - (self class daysUntilMonth: monthIndex inYear: year)!
  104106.  
  104107. evaluateYYMMDD: aBlock
  104108.     "Private - Compute the day, month, and year, and pass them to aBlock for evaluation, 
  104109.     answering the result."
  104110.  
  104111.     | year julianDay monthIndex |
  104112.     year := self year.
  104113.     julianDay := self class day: self asDays inYear: self year.
  104114.     monthIndex := self class monthIndexOfDay: julianDay inYear: year.
  104115.     ^aBlock value: year value: monthIndex value: julianDay - (self class daysUntilMonth: monthIndex inYear: year)!
  104116.  
  104117. firstDayOfMonth
  104118.     "Answer the julian day number of the first day of the receiver's month in the receiver's year."
  104119.  
  104120.     ^self firstDayOfMonthIndex: self monthIndex!
  104121.  
  104122. firstDayOfMonthIndex: monthIndex 
  104123.     "Private - Answer the julian day number of the first day of the given month at
  104124.     monthIndex in the receiver's year."
  104125.  
  104126.     ^(DaysUntilMonth at: monthIndex)
  104127.         + (monthIndex > 2
  104128.                 ifTrue: [self class leapYear: self year]
  104129.                 ifFalse: [0])
  104130.         + 1
  104131. !
  104132.  
  104133. hash
  104134.     "Answer the SmallInteger hash value for the receiver"
  104135.  
  104136.     ^self asDays hash!
  104137.  
  104138. monthIndex
  104139.     "Answer the month index represented by the receiver."
  104140.  
  104141.     | year julianDay |
  104142.     year := self year.
  104143.     julianDay := self class day: self asDays inYear: self year.
  104144.     ^self class monthIndexOfDay: julianDay inYear: year!
  104145.  
  104146. monthName
  104147.     "Answer the name of the month represented by the receiver (as a Symbol)."
  104148.  
  104149.     ^self class nameOfMonth: self monthIndex!
  104150.  
  104151. monthsSince: aDate
  104152.     "Answer the number of elapsed months Since the receiver and aDate.
  104153.     This methods adjusts correctly (for all cases I've tried) for part years
  104154.     and for part months, i.e. 28th Jan to 28th Feb is considered to be one month, 
  104155.     as is 29th Jan to 28th Feb, but 29th March to 28th April is 0 months. It correctly
  104156.     accounts for leap years."
  104157.     
  104158.     | calMonths |
  104159.     self evaluateYYMMDD: [ :y1 :m1 :d1 |
  104160.         aDate evaluateYYMMDD: [ :y2 :m2 :d2 |
  104161.             calMonths := (y1 - y2) * 12 + (m1 - m2).
  104162.             calMonths == 0 ifFalse: [
  104163.                 "Adjust for part months, but take account of the length of the month so that
  104164.                 29, Jan to 28, Feb is one month, but 29 Jun to 28 Jul is not."
  104165.                 calMonths > 0
  104166.                     ifTrue: [
  104167.                         (d1 < d2 and: [ d1 < (self class daysInMonthIndex: m1 forYear: y1) ])
  104168.                             ifTrue: [ calMonths := calMonths - 1 ]]
  104169.                     ifFalse: [
  104170.                         (d2 < d1 and: [ d2 < (self class daysInMonthIndex: m2 forYear: y2) ])
  104171.                             ifTrue: [ calMonths := calMonths + 1 ]]]]].
  104172.     ^calMonths
  104173. !
  104174.  
  104175. printOn: aStream
  104176.     "Append a default string representation of the receiver to aStream."
  104177.  
  104178.     self printOn: aStream longPicture: DefaultLongPicture!
  104179.  
  104180. printOn: aStream format: aString
  104181.     "Append a short textual description of the receiver to the <puttableStream> argument,
  104182.     aStream. The format is defined by the <readableString> argument, aString, the format 
  104183.     characters of which are as described in the Control Panel help for Windows Regional 
  104184.     Options/Date settings (e.g. dd/MM/yyyy, formats to, for example, 27/11/2001). If the
  104185.     format argument is nil then the receiver is printed to the stream in the currently
  104186.     configured default format of the host OS."
  104187.  
  104188.     self 
  104189.         printOn: aStream
  104190.         locale: Locale default
  104191.         flags: 0
  104192.         format: aString!
  104193.  
  104194. printOn: aStream locale: locale flags: dwFlags format: aStringOrNil
  104195.     "Private - Append a locale specific string representation of the receiver to aStream, using the specified
  104196.     format String (the default is used if it is nil). The format is as described in the Control Panel help     
  104197.     for Windows Regional Options/Date     settings (e.g. dd/MM/yyyy, formats to, for example, 27/11/2001)."
  104198.  
  104199.     aStream nextPutAll: (locale 
  104200.                 printDate: self
  104201.                 format: aStringOrNil
  104202.                 flags: dwFlags)!
  104203.  
  104204. printOn: aStream locale: locale format: aStringOrNil
  104205.     "Private - Append a locale specific string representation of the receiver to aStream, using the specified
  104206.     format String (the default is used if it is nil). The format is as described in the Control Panel help for
  104207.     Windows regional Time settings (e.g. hh:mm tt, formats to, for example, 10:15 pm)."
  104208.  
  104209.     self printOn: aStream locale: locale flags: 0 format: aStringOrNil!
  104210.  
  104211. printOn: aStream longPicture: aBoolean
  104212.     "Private - Append an string representation of the receiver to aStream in default locale long/short
  104213.     formats depending on aBoolean."
  104214.  
  104215.     self 
  104216.         printOn: aStream 
  104217.         locale: Locale default 
  104218.         flags: (aBoolean ifTrue: [DATE_LONGDATE] ifFalse: [DATE_SHORTDATE])
  104219.         format: nil!
  104220.  
  104221. setDays: dayCount
  104222.     "Private - Initialize the receiver to be dayCount days after January 1, 1901"
  104223.  
  104224.     days := dayCount
  104225. !
  104226.  
  104227. subtractDate: aDate
  104228.     "Answer the difference in days between the receiver and aData, as an Integer"
  104229.  
  104230.     ^self asDays - aDate asDays
  104231. !
  104232.  
  104233. subtractDays: dayCount
  104234.     "Answer a new Date that is dayCount days before the receiver."
  104235.  
  104236.     ^self class fromDays: self asDays - dayCount
  104237. !
  104238.  
  104239. weekday
  104240.     "Answer the day of the week represented by the receiver."
  104241.  
  104242.     ^self class nameOfDay: self weekdayIndex!
  104243.  
  104244. weekdayIndex
  104245.     "Answer the index of the receiver's day of the week (1..7)"
  104246.  
  104247.     ^(self asDays + 1) \\ 7 + 1!
  104248.  
  104249. year
  104250.     "Answer the year represented by the receiver."
  104251.  
  104252.     | temp q400 r400 q100 r100 q4 r4 |
  104253.     "Number of days since start of year 1600"
  104254.     temp := self asDays + ##(301*365+(301//4)-(301//100)+(301//400)).
  104255.     "Number of 400 year periods."
  104256.     q400 := temp // ##(400*365+(400//4)-(400//100)+(400//400)).
  104257.     r400 := temp \\ ##(400*365+(400//4)-(400//100)+(400//400)).
  104258.     "Number of remaining centuries"
  104259.     q100 := r400 // ##(100*365+(100//4)-(100//100)+(100//400)).
  104260.     r100 := r400 \\ ##(100*365+(100//4)-(100//100)+(100//400)).
  104261.     "Number of remaining leap year cycles"
  104262.     q4 := r100 // ##(4*365+(4//4)-(4//100)+(4//400)).
  104263.     r4 := r100 \\ ##(4*365+(4//4)-(4//100)+(4//400)).
  104264.     ^(q400*400) + (q100*100) + (q4*4) + (r4//365)+1600!
  104265.  
  104266. yearsSince: aDate
  104267.     "Answer the number of actual elapsed years since aDate."
  104268.     
  104269.     ^(self monthsSince: aDate) // 12! !
  104270.  
  104271. Time comment:
  104272. 'Time is the class whose instances represent a time of day as the number of seconds since midnight.'!
  104273. !Time class methodsFor!
  104274.  
  104275. amMarker
  104276.     "Answer the marker used to signify AM when using 12 hour format"
  104277.  
  104278.     ^Locale default amDesignator!
  104279.  
  104280. dateAndTimeNow 
  104281.     "Answer an Array whose first element is the current local Date and whose
  104282.     second element is the current local Time."
  104283.  
  104284.     | localTime |
  104285.     localTime := SYSTEMTIME now.
  104286.     ^Array with: (Date fromSYSTEMTIME: localTime)
  104287.         with: (self fromSYSTEMTIME: localTime)!
  104288.  
  104289. defaultFormat
  104290.     "Private - Answer a collection of the time formats for the default user locale."
  104291.  
  104292.     ^Locale default timeFormat!
  104293.  
  104294. errorInvalidFormat
  104295.     "Private - Raise an error that some attempt to create an instance of the receiver failed
  104296.     because the some input was in the wrong format."
  104297.  
  104298.     ^InvalidFormat signalWith: self!
  104299.  
  104300. formats
  104301.     "Private - Answer a collection of the time formats for the default user locale."
  104302.  
  104303.     ^Locale default timeFormats!
  104304.  
  104305. fromMilliseconds: anInteger
  104306.     "Answer a new instance of the receiver anInteger milliseconds since midnight."
  104307.  
  104308.     ^self basicNew setMilliseconds: anInteger
  104309. !
  104310.  
  104311. fromSeconds: anInteger
  104312.     "Answer a new instance of the receiver anInteger seconds since midnight."
  104313.  
  104314.     ^self fromMilliseconds: anInteger * 1000!
  104315.  
  104316. fromString: aString
  104317.     "Answer an instance of the receiver constructed from the string, aString"
  104318.  
  104319.     ^self readFrom: aString readStream!
  104320.  
  104321. fromSYSTEMTIME: aSYSTEMTIME
  104322.     "Private - Answer a new instance of the receiver instantiated from the argument,
  104323.     aWinSYSTEMTIME."
  104324.  
  104325.     ^self fromMilliseconds: aSYSTEMTIME wHour * 60 + 
  104326.                             aSYSTEMTIME wMinute * 60 + 
  104327.                                 aSYSTEMTIME wSecond * 1000 + 
  104328.                                     aSYSTEMTIME wMilliseconds!
  104329.  
  104330. icon
  104331.     "Answers an Icon that can be used to represent this class"
  104332.  
  104333.     ^##(self) defaultIcon!
  104334.  
  104335. microsecondClockValue
  104336.     "Answer the current value of the microsecond clock."
  104337.  
  104338.     | mus freq |
  104339.     mus := LargeInteger new64.
  104340.     KernelLibrary default queryPerformanceCounter: mus yourAddress.
  104341.  
  104342.     freq := LargeInteger new64.
  104343.     (KernelLibrary default queryPerformanceFrequency: freq yourAddress)
  104344.         ifFalse: [ self error: 'performance counter not available' ].
  104345.     ^mus * 1000000 // freq normalize!
  104346.  
  104347. microsecondsToRun: timedBlock
  104348.     "Answer the number of microseconds consumed by the evaluation of timedBlock
  104349.     (including the overhead)."
  104350.  
  104351.     | startTime endTime freq |
  104352.     freq := LargeInteger new64.
  104353.     (KernelLibrary default queryPerformanceFrequency: freq yourAddress)
  104354.         ifFalse: [ self error: 'performance counter not available' ].
  104355.     ^(self ticksToRun: timedBlock) - (self ticksToRun: [self]) 
  104356.         * 1000000 // freq normalize!
  104357.  
  104358. millisecondClockValue
  104359.     "Answer the current value of the system millisecond clock."
  104360.  
  104361.     "Implementation Note: Primitive 174 is actually just a call to the WinMM function timeGetTime()
  104362.     which should be accurate to 1mS (unlike GetTickCount() which is only accurate to 10mS)."
  104363.  
  104364.     <primitive: 174>
  104365.     ^self primitiveFailed!
  104366.  
  104367. millisecondsToRun: timedBlock
  104368.     "Answer the number of milliseconds consumed by the evaluation of timedBlock
  104369.     (including the overhead)."
  104370.  
  104371.     | startTime|
  104372.     startTime := self millisecondClockValue.
  104373.     timedBlock value.
  104374.     ^self millisecondClockValue - startTime
  104375. !
  104376.  
  104377. new
  104378.     "Answer a new instance of the receiver representing the current Time."
  104379.  
  104380.     ^self now!
  104381.  
  104382. now
  104383.     "Answer a new instance of the receiver representing the current Time."
  104384.  
  104385.     ^self fromSYSTEMTIME: SYSTEMTIME now!
  104386.  
  104387. pmMarker
  104388.     "Answer the marker used to signify PM when using 12 hour format"
  104389.  
  104390.     ^Locale default pmDesignator!
  104391.  
  104392. readFrom: aStream
  104393.     "Answers a new instance of the receiver read from aStream according to
  104394.     aFormatStringOrNil"
  104395.  
  104396.     | hours minutes seconds milliseconds separator am rounded |
  104397.     minutes := 0.
  104398.     seconds := 0.
  104399.     milliseconds := 0.
  104400.     hours := Integer readFrom: aStream radix: 10.
  104401.     separator := aStream peek.
  104402.     rounded := 0.
  104403.     (separator isNil or: [separator isLetter]) 
  104404.         ifFalse: 
  104405.             [aStream next.
  104406.             minutes := Integer readFrom: aStream radix: 10.
  104407.             (aStream peekFor: separator) 
  104408.                 ifTrue: 
  104409.                     [seconds := Integer readFrom: aStream radix: 10.
  104410.                     (aStream peekFor: separator) 
  104411.                         ifTrue: [milliseconds := Integer readFrom: aStream radix: 10]
  104412.                         ifFalse: 
  104413.                             [(aStream peekFor: $.) 
  104414.                                 ifTrue: 
  104415.                                     [| start |
  104416.                                     start := aStream position.
  104417.                                     milliseconds := Integer readFrom: aStream radix: 10.
  104418.                                     milliseconds isNil 
  104419.                                         ifTrue: 
  104420.                                             ["Actually just seconds with a trailing full stop"
  104421.  
  104422.                                             milliseconds := 0.
  104423.                                             aStream pop]
  104424.                                         ifFalse: 
  104425.                                             [| precision |
  104426.                                             precision := aStream position - start - 3.
  104427.                                             milliseconds == 0 
  104428.                                                 ifFalse: 
  104429.                                                     [milliseconds := (milliseconds / (10 raisedToInteger: precision)) asInteger.
  104430.                                                     rounded := 1]]]]]].
  104431.     aStream skipWhile: [:c | c isWhitespace].
  104432.     am := self amMarker.
  104433.     (am notEmpty and: [am skipOver: aStream ignoreCase: true]) 
  104434.         ifTrue: 
  104435.             [((0 to: 12) includes: hours) ifFalse: [^self errorInvalidFormat].
  104436.             hours := hours % 12]
  104437.         ifFalse: 
  104438.             [| pm |
  104439.             pm := self pmMarker.
  104440.             (pm notEmpty and: [pm skipOver: aStream ignoreCase: true]) 
  104441.                 ifTrue: 
  104442.                     [((0 to: 12) includes: hours) ifFalse: [^self errorInvalidFormat].
  104443.                     hours < 12 ifTrue: [hours := hours + 12]]].
  104444.     ((0 to: 23) includes: hours) ifFalse: [^self errorInvalidFormat].
  104445.     ((0 to: 59) includes: minutes) ifFalse: [^self errorInvalidFormat].
  104446.     ((0 to: 59) includes: seconds) ifFalse: [^self errorInvalidFormat].
  104447.     "Note that milliseconds may legitimately be rounded up to 1000, so to avoid having to carry this through we treat it as valid"
  104448.     ((0 to: 999 + rounded) includes: milliseconds) ifFalse: [^self errorInvalidFormat].
  104449.     ^Time fromMilliseconds: (60 * (60 * hours + minutes) + seconds) * 1000 + milliseconds!
  104450.  
  104451. secondClock
  104452.     "Private - Answer the current value of the second clock (seconds since midnight)."
  104453.     
  104454.     ^self now asSeconds!
  104455.  
  104456. ticksToRun: timedBlock
  104457.     "Answer the number of performance counter ticks consumed by the evaluation of timedBlock
  104458.     (including the overhead)."
  104459.  
  104460.     | startTime endTime freq |
  104461.     startTime := LargeInteger new64.
  104462.     endTime := LargeInteger new64.
  104463.     KernelLibrary default queryPerformanceCounter: startTime yourAddress.
  104464.     timedBlock value.
  104465.     KernelLibrary default queryPerformanceCounter: endTime yourAddress.
  104466.     ^endTime normalize - startTime normalize!
  104467.  
  104468. totalSeconds
  104469.     "Answer the total seconds since Jan. 1, 1901 (as an Integer) in local time."
  104470.     
  104471.     | dateAndTime |
  104472.     dateAndTime := self dateAndTimeNow.
  104473.     ^(dateAndTime at: 1) asSeconds + (dateAndTime at: 2) asSeconds! !
  104474.  
  104475. !Time methodsFor!
  104476.  
  104477. < aTime
  104478.     "Answer whether the receiver precedes (assuming the same date) the argument, aTime."
  104479.  
  104480.     ^self asMilliseconds < aTime asMilliseconds!
  104481.  
  104482. = aTime
  104483.     "Answer whether the receiver represent the same time of day as the argument, aTime."
  104484.  
  104485.     ^self species == aTime species and: [ self asMilliseconds = aTime asMilliseconds ]!
  104486.  
  104487. addTime: aTimeOrDate
  104488.     "Answer a new Time, aTimeOrDate after the receiver."
  104489.  
  104490.     ^self class fromMilliseconds: self asMilliseconds + aTimeOrDate asMilliseconds!
  104491.  
  104492. asMilliseconds
  104493.     "Answer the number of milliseconds since midnight represented by the receiver."
  104494.  
  104495.     ^milliseconds!
  104496.  
  104497. asParameter
  104498.     "Answer the host system representation of the receiver."
  104499.  
  104500.     ^SYSTEMTIME new
  104501.         wHour: self hours; 
  104502.         wMinute: self minutes; 
  104503.         wSecond: self seconds;
  104504.         yourself!
  104505.  
  104506. asSeconds
  104507.     "Answer the number of seconds since midnight represented by the receiver."
  104508.  
  104509.     ^milliseconds // 1000
  104510. !
  104511.  
  104512. asTimeStamp
  104513.     "Answer the receiver as TimeStamp"
  104514.  
  104515.     ^TimeStamp time: self!
  104516.  
  104517. hash
  104518.     "Answer the SmallInteger hash value for the receiver."
  104519.  
  104520.     ^self asMilliseconds hash!
  104521.  
  104522. hours
  104523.     "Answer the hour of the day represented by the receiver (24 hour clock)"
  104524.  
  104525.     ^(milliseconds // ##(60*60*1000)) \\ 24
  104526. !
  104527.  
  104528. minutes
  104529.     "Answer the minute of the hour of the day represented by the receiver."
  104530.  
  104531.     ^(milliseconds // ##(60*1000)) \\ 60
  104532. !
  104533.  
  104534. printOn: aStream
  104535.     "Append a short textual description of the receiver to aStream. The format is
  104536.     defined by the default User locale (i.e. it can be reconfigured using the
  104537.     Windows control panel)."
  104538.  
  104539.     self printOn: aStream locale: Locale default flags: 0 format: nil!
  104540.  
  104541. printOn: aStream format: aString
  104542.     "Append a short textual description of the receiver to the <puttableStream> argument,
  104543.     aStream. The format is defined by the <readableString> argument, aString, the format 
  104544.     characters of which are as described in the Control Panel help for Windows    Regional 
  104545.     Options/Time settings (e.g. hh:mm tt, formats to, for example, 10:15 pm). If the format 
  104546.     argument is nil then the receiver is printed to the stream in the currently configured default 
  104547.     format of the host OS."
  104548.  
  104549.     self 
  104550.         printOn: aStream
  104551.         locale: Locale default
  104552.         flags: 0
  104553.         format: aString!
  104554.  
  104555. printOn: aStream locale: locale flags: dwFlags format: aStringOrNil
  104556.     "Private - Append a locale specific string representation of the receiver to
  104557.     aStream, using the specified format String (the default is used if it is nil).
  104558.     The format is as described in the Control Panel help for Windows Regional 
  104559.     Options/Time settings (e.g. hh:mm tt, formats to, for example, 10:15 pm)."
  104560.  
  104561.     aStream nextPutAll: (locale printTime: self format: aStringOrNil flags: dwFlags)
  104562.  
  104563.  
  104564. !
  104565.  
  104566. seconds
  104567.     "Answer the second of the minute of the hour of the day represented by 
  104568.     the receiver."
  104569.  
  104570.     ^(milliseconds // 1000) \\ 60
  104571. !
  104572.  
  104573. setMilliseconds: anInteger
  104574.     "Private - Set the number of milliseconds since midnight represented by the receiver."
  104575.  
  104576.     milliseconds := anInteger!
  104577.  
  104578. subtractTime: aTimeOrDate
  104579.     "Answer a new Time, aTimeOrDate seconds before the receiver."
  104580.  
  104581.     ^self class fromMilliseconds: self asMilliseconds - aTimeOrDate asMilliseconds
  104582. ! !
  104583.  
  104584. TimeStamp comment:
  104585. 'TimeStamp is the class whose instances represent times of a particular day (i.e. a combination of a Date and Time).
  104586. This class is likely to be replaced by the forthcoming ANSI compliant DateAndTime class.'!
  104587. !TimeStamp class methodsFor!
  104588.  
  104589. current
  104590.     "Answer a new instance of the receiver representing the current
  104591.     date and time"
  104592.  
  104593.     ^self fromSYSTEMTIME: SYSTEMTIME now!
  104594.  
  104595. date: aDate
  104596.     "Answer a new instance of the receiver based on aDate."
  104597.  
  104598.     ^self date: aDate time: (Time fromSeconds: 0)!
  104599.  
  104600. date: aDate time: aTime
  104601.     "Answer a new instance of the receiver based on aDate and aTime"
  104602.  
  104603.     ^super new
  104604.         date: aDate;
  104605.         time: aTime;
  104606.         yourself!
  104607.  
  104608. τV(ɬhi╛¿ÿ/ΦUêû▀▐≈┴▐┴╗▓Φb▒¿╫~aWÆè;E╫VJ9zZ]h
  104609. ╢Är.JπnViºó6 ╠    ªñúƒ∙█âqZ@hr╒▒-&ª╠ÇnÖÆ+εBñzà ∙_[Exσeï█▄U|Ñ4╛°¬ ▀αr¢èûûxO║■Fº  u┬╬ ₧■J≤N"═K╙²mg÷╒u├V.Σ>Ñ┘═┘╟òöëΦτyO¡Θ┐By+?bu+¥Ω51ë$⌠"╛ätYniÜÅ*£oⁿÖ■ö┘@±«¡─ÿ,┤±╨I╦1
  104610. ¿<ΩfVπ┐}⌠dVΘ2æ▓è¥╦MûΓ╠δG«R4╗Σs╔≈╦╞    RlB2@0⌠m╙Σ4và=ÆKæu++]òelï╗3±(o±æ█rc4[îZ═╦╩Pìµ!
  104611.  
  104612. fromSeconds: anInteger
  104613.     "Answer a new instance of the receiver representing the point in time
  104614.     anInteger seconds after the epoch."
  104615.  
  104616.     | date |
  104617.     date := Date fromSeconds: anInteger.
  104618.     ^self 
  104619.         date: date 
  104620.         time: (Time fromSeconds: anInteger - date asSeconds)!
  104621.  
  104622. fromSYSTEMTIME: aSYSTEMTIME
  104623.     "Answer a new instance of the receiver representing the current
  104624.     date and time"
  104625.  
  104626.     ^self 
  104627.         date: (Date fromSYSTEMTIME: aSYSTEMTIME) 
  104628.         time: (Time fromSYSTEMTIME: aSYSTEMTIME)!
  104629.  
  104630. new
  104631.     "Answer a new instance of the receiver representing the current Time."
  104632.  
  104633.     ^self current!
  104634.  
  104635. time: aTime
  104636.     "Answer a new instance of the receiver based on aTime."
  104637.  
  104638.     ^self date: (Date fromDays: 0) time: aTime! !
  104639.  
  104640. !TimeStamp methodsFor!
  104641.  
  104642. < aTimeStamp
  104643.     "Answer whether the receiver precedes the argument, aTimeStamp."
  104644.  
  104645.     ^self date < aTimeStamp date
  104646.         or: [self date = aTimeStamp date and: [self time < aTimeStamp time]]!
  104647.  
  104648. = aTimeStamp
  104649.     "Answer whether the receiver represents the same time and date as the argument."
  104650.  
  104651.     ^self species == aTimeStamp species 
  104652.         and: [self date = aTimeStamp date and: [self time = aTimeStamp time]]!
  104653.  
  104654. αW:9░ΓX@°êé9Æ:≤ö√─√ù≡∙¢╓ägf ⌐┼kaME╫è*SâVK$.TU+■ä^Kc%J¬jVx∞ΘMÉ│(iûñ▓ƱźuLce╬╣r»┌µUGö!
  104655.  
  104656. asMilliseconds
  104657.     "Answer the number of milliseconds between January 1, 1901, and the time and date
  104658.     represented by the receiver (this will likely be a LargeInteger). Can be used to perform 
  104659.     arithmetic with Dates and Times."
  104660.  
  104661.     ^self date asMilliseconds + self time asMilliseconds!
  104662.  
  104663. asParameter
  104664.     "Answer the receiver in external system representation for passing to an external function call."
  104665.  
  104666.     | timeStampSt timeSt |
  104667.     timeStampSt := self date asParameter.
  104668.     timeSt := self time asParameter.
  104669.     timeStampSt
  104670.         wHour: timeSt wHour; 
  104671.         wMinute: timeSt wMinute; 
  104672.         wSecond: timeSt wSecond.
  104673.     ^timeStampSt!
  104674.  
  104675. asSeconds
  104676.     "Answer the number of seconds between January 1, 1901, and the time and date
  104677.     represented by the receiver (this will likely be a LargeInteger). Can be used to perform 
  104678.     arithmetic with Dates and Times."
  104679.  
  104680.     ^self date asSeconds + self time asSeconds!
  104681.  
  104682. asTimeStamp
  104683.     "Answer the receiver as <TimeStamp>."
  104684.  
  104685.     ^self!
  104686.  
  104687. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òΓ─äaj₧ò⌠%3ZS┬û;AÆQP+zR\eO∙ç^Mn#▒yPo½╜%Φ₧
  104688. Φüâí╙ε(;▐:m░╒S!!½┼╞Iå&ÆtúFóxéA²By*Φeæ╩!
  104689.  
  104690. date
  104691.     "Answer the Date of the receiver."
  104692.  
  104693.     ^date
  104694. !
  104695.  
  104696. date: aDate
  104697.     "Set the Date of the receiver. Answer the receiver."
  104698.  
  104699.     date := aDate
  104700. !
  104701.  
  104702. dateAndTime
  104703.     "Answer a two element Array containing the date and time."
  104704.  
  104705.     ^Array with: self date with: self time
  104706. !
  104707.  
  104708. hash
  104709.     "Answer the SmallInteger hash value for the receiver."
  104710.  
  104711.     ^(self date hash bitShift: 2) bitXor: self time hash!
  104712.  
  104713. printOn: aStream
  104714.     "Append a short textual description of the receiver to aStream."
  104715.  
  104716.     aStream
  104717.         print: self time;
  104718.         nextPutAll: ', ';
  104719.         print: self date!
  104720.  
  104721. printOn: aStream locale: aLocale flags: anInteger timeFormat: timeString dateFormat: dateString
  104722.     aStream
  104723.         nextPutAll: (aLocale 
  104724.                     printTime: self time
  104725.                     format: timeString
  104726.                     flags: anInteger);
  104727.         space;
  104728.         nextPutAll: (aLocale 
  104729.                     printDate: self date
  104730.                     format: dateString
  104731.                     flags: anInteger)!
  104732.  
  104733. printOn: aStream timeFormat: timeString dateFormat: dateString
  104734.     "Append a short textual description of the receiver to the <puttableStream> argument,
  104735.     aStream. The format is defined by the <readableString> argument, aString, the format 
  104736.     characters of which are as described in the Control Panel help for Windows     Regional 
  104737.     Options/Time & Date settings. If the format argument is nil then the receiver is printed 
  104738.     to the stream in the currently configured default date and time formats of the host OS."
  104739.  
  104740.     self 
  104741.         printOn: aStream
  104742.         locale: Locale default
  104743.         flags: 0
  104744.         timeFormat: timeString
  104745.         dateFormat: dateString!
  104746.  
  104747. time
  104748.     "Answer the Time of the receiver."
  104749.  
  104750.     ^time
  104751. !
  104752.  
  104753. time: aTime
  104754.     "Set the Time of the receiver. Answer the receiver."
  104755.  
  104756.     time := aTime
  104757. ! !
  104758.  
  104759. Number comment:
  104760. 'Number is the abstract class which defines the common protocol of all numeric objects.
  104761.  
  104762. Its messages support standard arithmetic operations and comparisons, which are mostly implemented by subclasses.'!
  104763. !Number class methodsFor!
  104764.  
  104765. fromString: aString
  104766.     "Instantiate a new instance of the receiver from the <readableString> argument."
  104767.  
  104768.     | stream answer |
  104769.     #todo "Should be separate fromDisplayString: version which converts from locale specific format (this method from Smalltalk format)".
  104770.  
  104771.     stream := aString readStream.
  104772.     answer := self readFrom: stream.
  104773.     stream atEnd ifFalse: [^self error: 'Invalid number format: ', aString printString].
  104774.     ^answer!
  104775.  
  104776. icon
  104777.     "Answers an Icon that can be used to represent this class"
  104778.  
  104779.     ^##(self) defaultIcon!
  104780.  
  104781. new
  104782.     "Answer a new instance of the receiver.
  104783.     Numbers are either immutable, or require more specific instantiation
  104784.     methods, therefore the standard instance creation protocol is not supported."
  104785.  
  104786.     ^self shouldNotImplement!
  104787.  
  104788. one
  104789.     "Answer the receiver's representation of one. For many Numbers this 
  104790.     is the SmallInteger 1"
  104791.  
  104792.     ^1!
  104793.  
  104794. readDecimalIntegerFrom: aStream allowPlus: aBoolean 
  104795.     "Private - Read a positive or negative decimal integer from the <gettableStream>, aStream, which
  104796.     has neither radix nor exponent. Return nil if there is no integer at the current position in
  104797.     the stream."
  104798.  
  104799.     | isNegative plus |
  104800.     isNegative := aStream peekFor: $-.
  104801.     plus := aBoolean and: [isNegative not and: [aStream peekFor: $+]].
  104802.     ^(self readIntegerFrom: aStream radix: 10) 
  104803.         ifNil: 
  104804.             [(isNegative or: [plus]) ifTrue: [aStream pop].
  104805.             nil]
  104806.         ifNotNil: [:value | isNegative ifTrue: [value negated] ifFalse: [value]]!
  104807.  
  104808. readExponentIntegerFrom: aStream initialInteger: anInteger 
  104809.     "Private - A partially recognised exponentInteger has been read from the <gettableStream>, aStream,
  104810.     which is positioned immediately after the $r. Read the rest of the Integer and answer its value,
  104811.     or if not an exponentInteger, pop the $r and answer anInteger. Note that the exponent is always
  104812.     considered to be expressed in base 10."
  104813.  
  104814.     "Allow plus prefix on exponent, e.g. 1.0e+16, although not strictly Smalltalk syntax."
  104815.  
  104816.     ^(self readDecimalIntegerFrom: aStream allowPlus: true) 
  104817.         ifNil: 
  104818.             [aStream pop.
  104819.             anInteger]
  104820.         ifNotNil: [:exponent | anInteger * (10 raisedToInteger: exponent)]!
  104821.  
  104822. readFractionFrom: aStream initialInteger: anInteger 
  104823.     "Private - A partially recognised Fraction has been read from the <gettableStream>, aStream,
  104824.     which is positioned immediate after the $/. Read the rest of the Fraction and answer its value,
  104825.     or if not a Fraction (determined by the immediate presence of an integer denominator), pop the 
  104826.     $/ and answer anInteger."
  104827.  
  104828.     ^(self readDecimalIntegerFrom: aStream allowPlus: false) 
  104829.         ifNil: 
  104830.             [aStream pop.
  104831.             anInteger]
  104832.         ifNotNil: [:denominator | Fraction numerator: anInteger denominator: denominator]!
  104833.  
  104834. readFrom: aStream
  104835.     "Instantiate a new sub-instance of the receiver from aStream and answer it.
  104836.     Any numbers in the stream are expected to obey Smalltalk syntax 
  104837.     rather than any locale specific formatting, i.e. this is not intended for reading
  104838.     user input. For convenience the set of recognised Number types is expanded
  104839.     from just the Smalltalk literal types to also include Fractions."
  104840.  
  104841.     | value |
  104842.     ^(value := self readSmalltalkSyntaxFrom: aStream) isNil 
  104843.         ifTrue: [0]
  104844.         ifFalse: [
  104845.             (value isInteger and: [aStream peekFor: $/]) 
  104846.                 ifTrue: [self readFractionFrom: aStream initialInteger: value]
  104847.                 ifFalse: [value]]
  104848. !
  104849.  
  104850. readIntegerFrom: aStream radix: radix
  104851.     "Private - Answer a positive <integer> instantiated from the text representation on aStream 
  104852.     using the specified radix. If no integer is found, then answer nil.
  104853.     Note: This is intended for reading Integer's obeying Smalltalk syntax, not locale specific
  104854.     formats, and therefore it does not handle NLS characters (e.g. thousand separators)."
  104855.  
  104856.     | value accumulator |
  104857.     accumulator := 0.
  104858.     [aStream atEnd] whileFalse: [ | char digit |
  104859.         char := aStream next.
  104860.         ((digit := char digitValue) < radix and: [digit >= 0])
  104861.             ifTrue: [value := accumulator := accumulator * radix + digit]
  104862.             ifFalse: [aStream pop. ^value]].
  104863.     ^value
  104864. !
  104865.  
  104866. readRadixIntegerFrom: aStream initialInteger: anInteger
  104867.     "Private - A partially recognised radixInteger has been read from the <gettableStream>, aStream,
  104868.     which is positioned immediately after the $r. Read the rest of the Integer and answer its value,
  104869.     or if not a radixInteger, pop the $r and answer anInteger."
  104870.  
  104871.     | radixInteger |
  104872.     ^(anInteger < 2 or: [anInteger > 36 or: [(radixInteger := self readIntegerFrom: aStream radix: anInteger) isNil]])
  104873.         ifTrue: [aStream pop. anInteger]
  104874.         ifFalse: [
  104875.             (aStream peekFor: $e) 
  104876.                 ifTrue: [self readExponentIntegerFrom: aStream initialInteger: radixInteger]
  104877.                 ifFalse: [radixInteger]]!
  104878.  
  104879. readScaledDecimalFrom: aStream mantissa: aNumber precision: anInteger
  104880.     "Private - A partially recognised ScaledDecimal has been read from the <gettableStream>, aStream,
  104881.     which is positioned immediate after the $s. Read the rest of the ScaledDecimal (which will just
  104882.     be the explict scale, if there is one) and answer it."
  104883.  
  104884.     | scale |
  104885.     (scale := self readIntegerFrom: aStream radix: 10) isNil ifTrue: [
  104886.         "Implied precision, .e.g. 2.50s"
  104887.         scale := anInteger].
  104888.     ^ScaledDecimal
  104889.         newFromNumber: aNumber
  104890.         scale: scale!
  104891.  
  104892. readSmalltalkRealFrom: aStream initialInteger: anInteger 
  104893.     "Private - Answer a new, positive, <Float> or <ScaledDecimal>, read from 
  104894.     the <gettableStream>, aStream. The <integer>, integerPart, has already been read from 
  104895.     the stream and we are currently positioned immediately after the decimal point."
  104896.  
  104897.     "Attempt to read positive fractional part"
  104898.  
  104899.     | nextChar precision fractionalPart start |
  104900.     start := aStream position.
  104901.     (fractionalPart := self readIntegerFrom: aStream radix: 10) isNil 
  104902.         ifTrue: 
  104903.             ["Actually just an Integer with a trailing full stop, which we must pop back onto the stream"
  104904.  
  104905.             aStream pop.
  104906.             ^anInteger].
  104907.     precision := aStream position - start.
  104908.     fractionalPart == 0 
  104909.         ifFalse: [fractionalPart := fractionalPart / (10 raisedToInteger: precision)].
  104910.  
  104911.     "Process any exponent..."
  104912.     ((nextChar := aStream peek) == $e or: [nextChar == $d or: [nextChar == $q]]) 
  104913.         ifTrue: 
  104914.             [| exponent |
  104915.             aStream next.    "Skip the exponent character"
  104916.             "Allow plus prefix on the exponent, although not ANSI Smalltalk syntax"
  104917.             (exponent := self readDecimalIntegerFrom: aStream allowPlus: true) notNil 
  104918.                 ifTrue: [^(fractionalPart asFloat + anInteger) * (10 raisedToInteger: exponent)].
  104919.  
  104920.             "Found Float with trailing exponent character which is not part of the number, e.g. 1.5e
  104921.             From ANSI standard p 28: 'An exponentLetter must be followed by an explicit exponent'"
  104922.             aStream pop]
  104923.         ifFalse: 
  104924.             [nextChar == $s 
  104925.                 ifTrue: 
  104926.                     [aStream next.    "Skip the $s"
  104927.                     ^self 
  104928.                         readScaledDecimalFrom: aStream
  104929.                         mantissa: fractionalPart + anInteger
  104930.                         precision: precision]].
  104931.  
  104932.     "Normal Float, such as 2.5 (perhaps with trailing exponent character)"
  104933.     ^fractionalPart asFloat + anInteger!
  104934.  
  104935. readSmalltalkSyntaxFrom: aStream 
  104936.     "Private - Instantiate a new sub-instance of the receiver from aStream and answer it.
  104937.     If no Number is found at the streams current position then answer nil.
  104938.     Any numbers in the stream are expected to obey Smalltalk syntax 
  104939.     rather than any locale specific formatting, i.e. this is not intended for reading
  104940.     user input.  
  104941.     WARNING: If you modify this method you may break the compiler.
  104942.     Implementation Note: The basic idea is to read the initial integer part and
  104943.     then proceed to read a Float if a decimal point is found, a ScaledDecimal if a
  104944.     $s is found, etc. Note that Fractions are not a literal type, as otherwise the
  104945.     meaning of expressions such as '1+3/4' would not be consistent with the
  104946.     normal language semantics (Smalltalk has no operator precedence)."
  104947.  
  104948.     | isNegative integerPart answer |
  104949.     isNegative := aStream peekFor: $-.
  104950.     (integerPart := self readIntegerFrom: aStream radix: 10) isNil 
  104951.         ifTrue: 
  104952.             ["There's nothing for you here"
  104953.  
  104954.             isNegative ifTrue: [aStream pop].
  104955.             ^nil].
  104956.  
  104957.     "The type of number is determined by what we find next"
  104958.     answer := aStream atEnd 
  104959.                 ifTrue: [integerPart]
  104960.                 ifFalse: 
  104961.                     [| nextChar |
  104962.                     nextChar := aStream next.
  104963.                     answer := nextChar == $. 
  104964.                                 ifTrue: [self readSmalltalkRealFrom: aStream initialInteger: integerPart]
  104965.                                 ifFalse: 
  104966.                                     [nextChar == $r 
  104967.                                         ifTrue: [self readRadixIntegerFrom: aStream initialInteger: integerPart]
  104968.                                         ifFalse: 
  104969.                                             [nextChar == $s 
  104970.                                                 ifTrue: 
  104971.                                                     [self 
  104972.                                                         readScaledDecimalFrom: aStream
  104973.                                                         mantissa: integerPart
  104974.                                                         precision: 0]
  104975.                                                 ifFalse: 
  104976.                                                     [nextChar == $e 
  104977.                                                         ifTrue: [self readExponentIntegerFrom: aStream initialInteger: integerPart]
  104978.                                                         ifFalse: 
  104979.                                                             [aStream pop.
  104980.                                                             integerPart]]
  104981.                                             "Also support St-80 format integer of the form 1e5, not valid ANSI syntax though"]]].
  104982.     ^isNegative ifTrue: [answer negated] ifFalse: [answer]!
  104983.  
  104984. zero
  104985.     "Answer the receiver's representation of zero. For many Numbers this 
  104986.     is the SmallInteger 0"
  104987.  
  104988.     ^0! !
  104989.  
  104990. !Number methodsFor!
  104991.  
  104992. @ yCoord
  104993.     "Answer a Point with the receiver as X and the argument as Y.
  104994.     The traditional Make Point primitive is present because this operation may be
  104995.     performed a few thousand times when opening a complex window (for example).
  104996.     The primitive is simply a VM level implementation of #x:y:, and does not fail."
  104997.  
  104998.     <primitive: 157>
  104999.     ^Point x: self y: yCoord!
  105000.  
  105001. arcCos
  105002.     "Answer a <Float> which is the inverse cosine of the receiver in radians"
  105003.  
  105004.     ^self asFloat arcCos!
  105005.  
  105006. arcSin
  105007.     "Answer a <Float> which is the inverse sine of the receiver in radians"
  105008.  
  105009.     ^self asFloat arcSin!
  105010.  
  105011. arcTan
  105012.     "Answer a <Float> which is the inverse tangent of the receiver in radians"
  105013.  
  105014.     ^self asFloat arcTan!
  105015.  
  105016. asFloat
  105017.     "Answer the receiver represented as the nearest possible <Float>.
  105018.      Implementation Note: Dolphin only suppots double precision floating 
  105019.     point numbers, so the answer will be such (i.e. a FloatD) even if a smaller 
  105020.     representation is possible."
  105021.  
  105022.     ^self subclassResponsibility!
  105023.  
  105024. asFloatD
  105025.     "Answer a 'd' precision floating-point number approximating the receiver."
  105026.  
  105027.     ^self asFloat!
  105028.  
  105029. asFloatE
  105030.     "Answer an 'e' precision floating-point number approximating the receiver.
  105031.      Implementation Note: Dolphin only suppots double precision floating 
  105032.     point numbers, so the answer will be such (i.e. a FloatD)."
  105033.  
  105034.     ^self asFloat!
  105035.  
  105036. asFloatQ
  105037.     "Answer a 'q' precision floating-point number approximating the receiver.
  105038.      Implementation Note: Dolphin only suppots double precision floating 
  105039.     point numbers, so the answer will be such (i.e. a FloatD)."
  105040.  
  105041.     ^self asFloat!
  105042.  
  105043. asFraction
  105044.     "Answer an <integer> or <fraction> approximating the receiver."
  105045.  
  105046.     ^self subclassResponsibility!
  105047.  
  105048. asInteger
  105049.     "Answer the nearest <integer> value to the receiver."
  105050.  
  105051.     ^self rounded!
  105052.  
  105053. asPoint
  105054.     "Answer a Point with the receiver as both co-ordinates."
  105055.  
  105056.     ^self @ self!
  105057.  
  105058. asPoint3D
  105059.     "Answer a Point with the receiver as all three co-ordinates."
  105060.  
  105061.     ^self @ self @ self!
  105062.  
  105063. asScaledDecimal: scale
  105064.     "Answer a <ScaledDecimal> number, with the fractional precision 
  105065.     specified by the <integer>, scale, which most nearly approximates
  105066.     the receiver."
  105067.  
  105068.     ^ScaledDecimal
  105069.         newFromNumber: self
  105070.         scale: scale
  105071. !
  105072.  
  105073. at: anInteger put: anObject 
  105074.     "Replace the receivers indexed instance variable at the <integer> argument with the <Object> argument. 
  105075.     Not valid for Numbers which are immutable."
  105076.  
  105077.     ^self shouldNotImplement!
  105078.  
  105079. ceiling
  105080.     "Answer the <integer> nearest the receiver toward positive infinity
  105081.     (i.e. the smallest <integer> greater than or equal to the receiver)."
  105082.  
  105083.     | anInteger |
  105084.     anInteger := self // 1.
  105085.     ^anInteger = self 
  105086.         ifTrue: [anInteger]
  105087.         ifFalse: [anInteger + 1]!
  105088.  
  105089. copy
  105090.     "Answer a copy of the receiver (by default a copy which shares the receiver's 
  105091.     instance variables). Numbers are immutable, so we answer the receiver itself."
  105092.  
  105093.     ^self!
  105094.  
  105095. cos
  105096.     "Answer a <Float> which is the cosine of the receiver, 
  105097.     which is treated as an angle in radians"
  105098.  
  105099.     ^self asFloat cos!
  105100.  
  105101. degreesToRadians
  105102.     "Answer a <Float> representing the receiver converted from degrees to radians."
  105103.     
  105104.     ^self * ##(Float pi / 180.0)!
  105105.  
  105106. denominator
  105107.     "Answer the <integer> denominator of the receiver."
  105108.  
  105109.     ^1!
  105110.  
  105111. divideByZero
  105112.     "Private - Generate a division by zero error"
  105113.  
  105114.     ^ZeroDivide dividend: self!
  105115.  
  105116. even
  105117.     "Answer whether the receiver is an even number. Zero is considered even"
  105118.  
  105119.     ^(self \\ 2) isZero!
  105120.  
  105121. exp
  105122.     "Answer a <Float> which is the natrual exponential value of the 
  105123.     receiver (i.e. 'e' raised to the power of the receiver).
  105124.     This is the inverse of #ln."
  105125.  
  105126.     ^self asFloat exp!
  105127.  
  105128. floor
  105129.     "Answer the <integer> nearest the receiver toward negative infinity
  105130.     (i.e. the largest integer less than or equal to the receiver)."
  105131.  
  105132.     ^self // 1!
  105133.  
  105134. floorLog: operand
  105135.     "Answer an <integer> which is the logarithm to the <number> base, operand,
  105136.     of the receiver, truncated towards negative infinity."
  105137.     
  105138.     ^(self log: operand) floor!
  105139.  
  105140. fractionPart
  105141.     "Answer a <number> of the same type as the receiver, representing the 
  105142.     fractional part of  the receiver."
  105143.  
  105144.     ^self - self truncated
  105145. !
  105146.  
  105147. hashBits
  105148.     "Private - Answer the maximum number of bits in a <Number>s hash value."
  105149.  
  105150.     ^30!
  105151.  
  105152. integerPart
  105153.     "Answer an <integer>  representing the whole integer part of 
  105154.     the receiver."
  105155.  
  105156.     ^self truncated!
  105157.  
  105158. isLiteral
  105159.     "Answer whether the receiver the receiver has a literal representation which
  105160.     is recognised by the Compiler"
  105161.  
  105162.     ^true!
  105163.  
  105164. ln
  105165.     "Answer a <Float> which is the natural logarithm of the receiver."
  105166.  
  105167.     ^self asFloat ln!
  105168.  
  105169. log
  105170.     "Answer the log to the base 10 of the receiver"
  105171.  
  105172.     ^self asFloat log!
  105173.  
  105174. log: operand
  105175.     "Answer a <Float> which is the logarithm to the <number> base, 
  105176.     operand, of the receiver."
  105177.  
  105178.     ^self ln / operand ln!
  105179.  
  105180. numerator
  105181.     "Answer the <integer> numerator of the receiver. Default is the receiver which can be 
  105182.     overridden by the subclasses (e.g. Fraction)."
  105183.  
  105184.     ^self!
  105185.  
  105186. odd
  105187.     "Answer whether the receiver is an odd number."
  105188.  
  105189.     ^self even not!
  105190.  
  105191. radiansToDegrees
  105192.     "Answer a <Float> which is the receiver converted from radians to degrees."
  105193.  
  105194.     ^self * ##(180.0 / Float pi)!
  105195.  
  105196. raisedTo: operand
  105197.     "Answer a <number> which is the receiver raised to the power of 
  105198.     the <number> argument, operand.
  105199.     Raise a FloatingPointException for overflow if the answer must be
  105200.     a <Float> and exceeds the representable range of a double precision
  105201.     floating point number."
  105202.  
  105203.     self isZero     ifTrue: [
  105204.         ^operand <= 0
  105205.             ifTrue: [self error: 'Invalid operands']
  105206.             ifFalse: [self]].
  105207.     self = self class one ifTrue: [^self].
  105208.     operand isInteger ifTrue: [^self raisedToInteger: operand].
  105209.     ^(self asFloat ln * operand) exp!
  105210.  
  105211. sin
  105212.     "Answer a <Float> which is the sine of the receiver, 
  105213.     which is treated as an angle in radians."
  105214.  
  105215.     ^self asFloat sin!
  105216.  
  105217. sqrt
  105218.     "Answer a <number> which is the positive square root of the receiver."
  105219.     
  105220.     ^self asFloat sqrt!
  105221.  
  105222. tan
  105223.     "Answer a <Float> which is the tangent of the receiver, 
  105224.     which is treated as an angle in radians."
  105225.  
  105226.     ^self asFloat tan!
  105227.  
  105228. to: stop
  105229.     "Answer an <interval> from the receiver up to the argument, stop, with an interval of 1 
  105230.     between elements."
  105231.  
  105232.     ^Interval from: self to: stop!
  105233.  
  105234. to: stop by: step
  105235.     "Answer an <interval> from the receiver up to the argument, stop, with an interval of 
  105236.     the argument, step, between elements."
  105237.  
  105238.     ^Interval from: self to: stop by: step!
  105239.  
  105240. to: stop by: step do: operation
  105241.     "Evaluate the <monadicBlock> argument, operation, for each <number> between the 
  105242.     receiver and the <number> argument, stop, in increments of the <number> argument, step.
  105243.     N.B. This implementation is not normally used since #to:by:do: is optimized by the compiler."
  105244.  
  105245.     (self to: stop by: step) do: operation!
  105246.  
  105247. to: stop do: operation
  105248.     "Evaluate the <monadicBlock> operation passing it the <number> sequence beginning 
  105249.     with the receiver, and incrementing by one until the <number> argument, stop, is reached, 
  105250.     inclusive. 
  105251.     Implementation Note: This method is critical to overall system performance, and is normally inlined by 
  105252.     the compiler, so this implementation is used only when #perform:'ed."
  105253.  
  105254.     (self to: stop) do: operation! !
  105255.  
  105256. Point comment:
  105257. 'A Point represents an x-y pair of numbers usually indicating a point on a two-dimensional Cartesian coordinate plane. Points are often used to designate the location of pixels within a Bitmap or on the display screen. By Smalltalk convention, x increases to the right and y down, consistent with the layout of text on a page and with pixels in Windows'' bitmaps. This "left-handed" coordinate system is the convention for Points used within the standard Smalltalk image (in classes such as Rectangle) but there is nothing in the Point class itself that prohibits the implied use of a "right-handed" coordinate system in which y increases in the upward direction.
  105258.  
  105259. A Point is typically created using the binary message @ to a Number:
  105260.  
  105261. 150 @ 200
  105262.  
  105263. Arithmetic operations can be carried out between two Points or between a Point and a Number. Each of the arithmetic messages returns a new Point as the result. Note the need to make use of parentheses in the expressions below due to the equal precedence assigned to all binary messages (such as @ and +).
  105264.  
  105265. (150 @ 200) + (50 @ 50) "Addition of Points"
  105266. (150 @ 200) + 100 "Addition of scalar"
  105267. (150 @ 200) * 3 "Scaling"'!
  105268. !Point class methodsFor!
  105269.  
  105270. icon
  105271.     "Answers an Icon that can be used to represent this class"
  105272.  
  105273.     ^##(self) defaultIcon!
  105274.  
  105275. new
  105276.     "Answer a new instance of the receiver equal to zero."
  105277.  
  105278.     ^self zero!
  105279.  
  105280. one
  105281.     "Answer the receiver's representation of one."
  105282.  
  105283.     ^1 @ 1!
  105284.  
  105285. publishedAspectsOfInstances
  105286.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  105287.     
  105288.         ^(super publishedAspectsOfInstances)
  105289.             add: (Aspect integer: #x);
  105290.             add: (Aspect integer: #y);
  105291.             yourself!
  105292.  
  105293. uninitialize
  105294.     "Private - Tidy up the receiver in preparation for removal from the system."
  105295.  
  105296.     VMLibrary default registryAt: #Point put: nil!
  105297.  
  105298. x: xCoord y: yCoord
  105299.     "Answer a new instance of the receiver with the specified
  105300.     x and y coordinates"
  105301.  
  105302.     <primitive: 157>
  105303.     ^self basicNew x: xCoord y: yCoord!
  105304.  
  105305. zero
  105306.     "Answer the receiver's representation of zero."
  105307.  
  105308.     ^0 @ 0! !
  105309.  
  105310. !Point methodsFor!
  105311.  
  105312. - anArithmeticValue
  105313.     "Answer the receiver minus anArithmeticValue as a Point."
  105314.  
  105315.     ^anArithmeticValue subtractFromPoint: self!
  105316.  
  105317. * anArithmeticValue
  105318.     "Answer a Point with the receiver's coordinates multiplied by anArithmeticValue."
  105319.  
  105320.     ^anArithmeticValue multiplyByPoint: self!
  105321.  
  105322. / operand
  105323.     "Answer a Point with the receiver's coordinates divided by the <number>, 
  105324.     operand. If the operand is zero then a <ZeroDivide> is raised."
  105325.  
  105326.     ^operand divideIntoPoint: self!
  105327.  
  105328. @ zCoord
  105329.     "Answer a Point3D with the receiver as X, Y coordinates and the argument as Z."
  105330.  
  105331.     ^Point3D x: x y: y z: zCoord!
  105332.  
  105333. + anArithmeticValue
  105334.     "Answer the sum of receiver and aPoint as a Point."
  105335.  
  105336.     ^anArithmeticValue addToPoint: self!
  105337.  
  105338. < anArithmeticValue
  105339.     "Answer whether the receiver is above and to the left of anArithmeticValue.
  105340.     N.B. No double dispatch, as would need to do for more than just #<."
  105341.  
  105342.     | aPoint |
  105343.     aPoint := anArithmeticValue asPoint.
  105344.     ^x < aPoint x and: [ y < aPoint y ]!
  105345.  
  105346. <= anArithmeticValue
  105347.     "Answer whether the receiver is neither below nor to the right of anArithmeticValue.
  105348.     A double dispatch of #< with the superclass implementation of #<= would not work here."
  105349.  
  105350.     | aPoint |
  105351.     aPoint := anArithmeticValue asPoint.
  105352.     ^x <= aPoint x and: [ y <= aPoint y ]!
  105353.  
  105354. = comperand
  105355.     "Answer whether the receiver is considered equivalent to the
  105356.     <Object> argument, comperand."
  105357.  
  105358.     ^self species == comperand species
  105359.         ifTrue: [x = comperand x and: [y = comperand y]]
  105360.         ifFalse: [super = comperand]!
  105361.  
  105362. > anArithmeticValue
  105363.     "Answer whether the receiver is below and to the right of anArithmeticValue.
  105364.     A double dispatch of #< with the superclass implementation of #> would not work here."
  105365.  
  105366.     | aPoint |
  105367.     aPoint := anArithmeticValue asPoint.
  105368.     ^x > aPoint x and: [y > aPoint y]
  105369. !
  105370.  
  105371. >= anArithmeticValue
  105372.     "Answer whether the receiver is neither above nor to the left of anArithmeticValue.
  105373.     A double dispatch of #< with the superclass implementation of #>= would not work here."
  105374.     
  105375.     | aPoint |
  105376.     aPoint := anArithmeticValue asPoint.
  105377.     ^x >= aPoint x and: [ y >= aPoint y ]
  105378. !
  105379.  
  105380. abs
  105381.     "Answer a <Point> that is the absolute value (positive magnitude) of the receiver."
  105382.  
  105383.     ^x abs @ y abs!
  105384.  
  105385. addToPoint: aPoint
  105386.     "Private - Answer the result of adding the receiver to the known Point,
  105387.     aPoint, by coercing the less general of it and the receiver. Overridden by 
  105388.     subclasses which can implement more efficiently."
  105389.  
  105390.     ^(aPoint x + x) @ (aPoint y + y)!
  105391.  
  105392. asDword
  105393.     "Answer the receiver in a form suitable for returning as the result of a window
  105394.     procedure (or passing to a function expecting a 32-bit value)."
  105395.  
  105396.     ^self asParameter asDword!
  105397.  
  105398. asParameter
  105399.     "Answer the receiver in a form suitable for passing to an external function."
  105400.  
  105401.     ^POINTL fromPoint: self!
  105402.  
  105403. asPoint
  105404.     "Answer the receiver"
  105405.  
  105406.     ^self!
  105407.  
  105408. asPoint3D
  105409.     "Answer a Point3D with the receiver."
  105410.  
  105411.     ^self x @ self y @ 0!
  105412.  
  105413. ceiling
  105414.     "Answer a new Point with the x and y values of the receiver truncated
  105415.     toward positive infinity."
  105416.  
  105417.     ^x ceiling @ y ceiling!
  105418.  
  105419. coerce: anArithmeticValue
  105420.     "Private - Answer the lower generality ArithmeticValue, anArithmeticValue, 
  105421.     converted to a Point."
  105422.  
  105423.     ^anArithmeticValue asPoint!
  105424.  
  105425. corner: aPoint
  105426.     "Answers a Rectangle defined by the receiver and aPoint."
  105427.  
  105428.     ^Rectangle origin: self corner: aPoint!
  105429.  
  105430. degrees
  105431.     "Answer the angle the receiver makes with origin in degrees. right is 0; down is 90."
  105432.     | tan theta |
  105433.     x = 0
  105434.         ifTrue: [y >= 0
  105435.             ifTrue: [^ 90.0]
  105436.             ifFalse: [^ 270.0]]
  105437.         ifFalse: 
  105438.             [tan := y asFloat / x asFloat.
  105439.             theta := tan arcTan.
  105440.             x >= 0
  105441.                 ifTrue: [y >= 0
  105442.                         ifTrue: [^theta radiansToDegrees]
  105443.                         ifFalse: [^360.0 + theta radiansToDegrees]]
  105444.                 ifFalse: [^180.0 + theta radiansToDegrees]]!
  105445.  
  105446. dist: aPoint 
  105447.     "Answer the distance between aPoint and the receiver."
  105448.  
  105449.     ^(aPoint - self) r!
  105450.  
  105451. divideIntoPoint: aPoint
  105452.     "Private - Answer the result of dividing the receiver into the known Point, aPoint, by 
  105453.     coercing the less general of it and the receiver. Overridden by subclasses which 
  105454.     can implement more efficiently."
  105455.  
  105456.     ^(aPoint x / x) @ (aPoint y / y)!
  105457.  
  105458. dotProduct: aPoint 
  105459.     "Answer a Number that is the sum of the product of the x coordinates
  105460.     and the product of the y coordinates of the receiver and aPoint"
  105461.  
  105462.     ^(x * aPoint x) + (y * aPoint y)!
  105463.  
  105464. extent: aPoint
  105465.     "Answers a Rectangle whose origin is the receiver and whose
  105466.     extent is the argument aPoint"
  105467.  
  105468.     ^Rectangle origin: self extent: aPoint!
  105469.  
  105470. floor
  105471.     "Answer a new Point with the x and y values of the receiver truncated
  105472.     toward negative infinity."
  105473.  
  105474.     ^x floor @ y floor!
  105475.  
  105476. generality
  105477.     "Private - Answer the Smalltalk generality of the receiver, used for performing type conversions"
  105478.  
  105479.     ^50!
  105480.  
  105481. hash
  105482.     "Answer the <integer> hash value for the receiver."
  105483.  
  105484.     ^(x hash bitShift: 2) bitXor: y hash!
  105485.  
  105486. max: aPoint
  105487.     "Answer a new Point with the maximum of the x coordinates
  105488.     and the maximum of the y coordinates of the receiver and aPoint"
  105489.  
  105490.     ^(x max: aPoint x) @ (y max: aPoint y)!
  105491.  
  105492. min: aPoint
  105493.     "Answer a new Point with the maximum of the x coordinates
  105494.     and the maximum of the y coordinates of the receiver and aPoint"
  105495.  
  105496.     ^(x min: aPoint x) @ (y min: aPoint y)!
  105497.  
  105498. multiplyByPoint: aPoint
  105499.     "Private - Answer the result of multiplying the known Point, aPoint,
  105500.     by the receiver, by coercing the less general of it and the recever.
  105501.     Overridden by subclasses which can implement more efficiently."
  105502.  
  105503.     ^(x * aPoint x) @ (y * aPoint y)!
  105504.  
  105505. printOn: target
  105506.     "Append a short textual description of the receiver to the
  105507.     <puttableStream>, target."
  105508.  
  105509.     target 
  105510.         print: x;
  105511.         nextPut: $@;
  105512.         print: y!
  105513.  
  105514. r
  105515.     "Answer the receiver's radius (magnitude) in a polar coordinate 
  105516.     system."
  105517.  
  105518.     ^(self dotProduct: self) sqrt!
  105519.  
  105520. raisedTo: operand
  105521.     "Answer an <ArithmeticValue> which is the receiver raised to the power of 
  105522.     the <number> argument, operand."
  105523.  
  105524.     ^(x raisedTo: operand) @ (y raisedTo: operand)!
  105525.  
  105526. rounded
  105527.     "Answer a new Point with the x and y values of the receiver rounded.
  105528.     Implementation Note: Superclass implemenation works, but we can do it more efficiently."
  105529.  
  105530.     ^x rounded @ y rounded!
  105531.  
  105532. subtractFromPoint: aPoint
  105533.     "Private - Answer the result of subtracting the receiver from the known Point,
  105534.     aPoint, by coercing the less general of it and the receiver. Overridden by 
  105535.     subclasses which can implement more efficiently."
  105536.  
  105537.     ^(aPoint x - x) @ (aPoint y - y)!
  105538.  
  105539. transpose
  105540.     "Answer a new Point with the x and y coordinates of the receiver
  105541.     reversed"
  105542.  
  105543.     ^y @ x!
  105544.  
  105545. truncated
  105546.     "Answer a new Point with the x and y values of the receiver truncated toward zero"
  105547.  
  105548.     ^x truncated @ y truncated!
  105549.  
  105550. x
  105551.     "Answer the receiver's x coordinate"
  105552.  
  105553.     ^x!
  105554.  
  105555. x: aNumber
  105556.     "Set the receiver's x coordinate"
  105557.  
  105558.     x := aNumber!
  105559.  
  105560. x: xCoord y: yCoord
  105561.     "Private - Set the x and y coordinates of the receiver.
  105562.     Primarily intended for instance creation. Answer the receiver."
  105563.  
  105564.     x := xCoord.
  105565.     y := yCoord!
  105566.  
  105567. y
  105568.     "Answer the receiver's y coordinate"
  105569.  
  105570.     ^y!
  105571.  
  105572. y: aNumber
  105573.     "Set the receiver's y coordinate"
  105574.  
  105575.     y := aNumber! !
  105576.  
  105577. Point3D comment:
  105578. 'A Point3D represents an x-y-z pair of numbers usually indicating a point in a three-dimensional Cartesian coordinate volume. Following the convention for Point, Point3D is often attributed a "left-handed" coordinate system. However, this is not essential and either left or right-handed systems may be adopted depending on the application.
  105579.  
  105580. A Point3D is typically created using the binary message @ to a Point:
  105581.  
  105582. 150 @ 200 @ 400
  105583.  
  105584. Arithmetic operations can be carried out between two Point3Ds or between a Point3D and a Number. Each of the arithmetic messages returns a new Point3D as the result. Note the need to make use of parentheses in the expressions below due to the equal precedence assigned to all binary messages (such as @ and +).
  105585.  
  105586. (150 @ 200 @ 400) + (50 @ 50 @ 50) "Addition of Point3Ds"
  105587. (150 @ 200 @ 400) + 100 "Addition of scalar"
  105588. (150 @ 200 @ 400) * 3 "Scaling"'!
  105589. !Point3D class methodsFor!
  105590.  
  105591. icon
  105592.     "Answers an Icon that can be used to represent this class"
  105593.  
  105594.     ^Point icon!
  105595.  
  105596. new
  105597.     "Answer a new instance of the receiver equal to zero."
  105598.  
  105599.     ^self zero!
  105600.  
  105601. one
  105602.     "Answer the receiver's representation of one."
  105603.  
  105604.     ^1 @ 1 @ 1!
  105605.  
  105606. origin
  105607.     "Answer a new instance of the receiver at the origin"    
  105608.  
  105609.     ^self x: 0 y: 0 z: 0!
  105610.  
  105611. publishedAspectsOfInstances
  105612.         "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  105613.     
  105614.         ^(super publishedAspectsOfInstances)
  105615.             add: (Aspect integer: #x);
  105616.             add: (Aspect integer: #y);
  105617.             add: (Aspect integer: #z);
  105618.             yourself!
  105619.  
  105620. x: xCoord y: yCoord z: zCoord
  105621.     "Answer a new instance of the receiver with the specified
  105622.     x, y and z coordinates"
  105623.  
  105624.     ^self basicNew x: xCoord y: yCoord z: zCoord!
  105625.  
  105626. xAxis
  105627.     "Answer an instance of the receiver that represents the x axis"
  105628.  
  105629.     ^self x: 1 y: 0 z: 0!
  105630.  
  105631. yAxis
  105632.     "Answer an instance of the receiver that represents the y axis"
  105633.  
  105634.     ^self x: 0 y: 1 z: 0!
  105635.  
  105636. zAxis
  105637.     "Answer an instance of the receiver that represents the z axis"
  105638.  
  105639.     ^self x: 0 y: 0 z: 1!
  105640.  
  105641. zero
  105642.     "Answer the receiver's representation of zero."
  105643.  
  105644.     ^0 @ 0 @ 0! !
  105645.  
  105646. !Point3D methodsFor!
  105647.  
  105648. - anArithmeticValue
  105649.     "Answer the receiver minus anArithmeticValue as a Point3D."
  105650.  
  105651.     ^anArithmeticValue subtractFromPoint3D: self!
  105652.  
  105653. * anArithmeticValue
  105654.     "Answer a Point3D with the receiver's coordinates multiplied by anArithmeticValue."
  105655.  
  105656.     ^anArithmeticValue multiplyByPoint3D: self!
  105657.  
  105658. / operand
  105659.     "Answer a Point3D with the receiver's coordinates divided by the <number>, 
  105660.     operand. If the operand is zero then a <ZeroDivide> is raised."
  105661.  
  105662.     ^operand divideIntoPoint3D: self!
  105663.  
  105664. + anArithmeticValue
  105665.     "Answer the sum of receiver and anArithmeticValue as a Point3D."
  105666.  
  105667.     ^anArithmeticValue addToPoint3D: self!
  105668.  
  105669. < anArithmeticValue
  105670.     "Answer whether the receiver is above and to the left of anArithmeticValue."
  105671.  
  105672.     | aPoint3D |
  105673.     aPoint3D := anArithmeticValue asPoint3D.
  105674.     ^x < aPoint3D x and: [y < aPoint3D y and: [z < aPoint3D z]]!
  105675.  
  105676. <= anArithmeticValue
  105677.     "Answer whether the receiver is neither below nor to the right of anArithmeticValue."
  105678.  
  105679.     | aPoint3D |
  105680.     aPoint3D := anArithmeticValue asPoint3D.
  105681.     ^x <= aPoint3D x and: [y <= aPoint3D y and: [z <= aPoint3D z]]!
  105682.  
  105683. = anObject
  105684.     "Answer whether the receiver is considered equivalent to the argument."
  105685.  
  105686.     ^self species == anObject species 
  105687.         ifTrue: [x = anObject x and: [y = anObject y  and: [z = anObject z]]]
  105688.         ifFalse: [super = anObject]!
  105689.  
  105690. > anArithmeticValue
  105691.     "Answer whether the receiver is below and to the right of anArithmeticValue."
  105692.  
  105693.     | aPoint3D |
  105694.     aPoint3D := anArithmeticValue asPoint3D.
  105695.     ^x > aPoint3D x and: [y > aPoint3D y and: [z > aPoint3D z]]!
  105696.  
  105697. >= anArithmeticValue
  105698.     "Answer whether the receiver is neither above nor to the left of anArithmeticValue."
  105699.  
  105700.     | aPoint3D |
  105701.     aPoint3D := anArithmeticValue asPoint3D.
  105702.     ^x >= aPoint3D x and: [y >= aPoint3D y and: [z >= aPoint3D z]]!
  105703.  
  105704. abs
  105705.     "Answer aPoint3D that is the absolute value - positive magnitude - of the receiver."
  105706.  
  105707.     ^x abs @ y abs @ z abs!
  105708.  
  105709. addToPoint3D: aPoint3D
  105710.     "Private - Answer the result of adding the receiver to the known Point3D"
  105711.  
  105712.     ^(aPoint3D x + x) @ (aPoint3D y + y) @ (aPoint3D z + z)!
  105713.  
  105714. asPoint
  105715.     "Answer a <Point> which is the 2D equivalent of the receiver, ignoring the z-axis component."
  105716.  
  105717.     ^x @ y!
  105718.  
  105719. asPoint3D
  105720.     "Answer the receiver"
  105721.  
  105722.     ^self!
  105723.  
  105724. ceiling
  105725.     "Answer a new Point3D with the x, y and z values of the receiver truncated
  105726.     toward positive infinity."
  105727.  
  105728.     ^x ceiling @ y ceiling @ z ceiling!
  105729.  
  105730. coerce: anArithmeticValue
  105731.     "Private - Answer the lower generality ArithmeticValue, anArithmeticValue, 
  105732.     converted to a Point3D."
  105733.  
  105734.     ^anArithmeticValue asPoint3D!
  105735.  
  105736. dist: aPoint 
  105737.     "Answer the distance between aPoint and the receiver."
  105738.  
  105739.     ^(aPoint - self) r!
  105740.  
  105741. divideIntoPoint3D: aPoint3D
  105742.     "Private - Answer the result of dividing the receiver into the known Point3D"
  105743.  
  105744.     ^(aPoint3D x / x) @ (aPoint3D y / y) @ (aPoint3D z / z)
  105745. !
  105746.  
  105747. dotProduct: aPoint3D
  105748.     "Answer a Number that is the dot product of the receiver and aPoint3D"
  105749.  
  105750.     ^(x * aPoint3D x) + (y * aPoint3D y) + (z * aPoint3D z)!
  105751.  
  105752. floor
  105753.     "Answer a new Point3D with the x, y and z values of the receiver truncated
  105754.     toward negative infinity."
  105755.  
  105756.     ^x floor @ y floor @ z floor!
  105757.  
  105758. generality
  105759.     "Private - Answer the Smalltalk generality of the receiver, 
  105760.     used for performing type conversions"
  105761.  
  105762.     ^60!
  105763.  
  105764. hash
  105765.     "Answer the <integer> hash value for the receiver."
  105766.  
  105767.     ^((x hash bitShift: 2) bitXor: (y hash bitShift: 1)) bitXor: (z hash)!
  105768.  
  105769. max: aPoint3D
  105770.     "Answer a new Point3D with the maximum of the x coordinates,
  105771.      y coordinates and z coordinates of the receiver and aPoint3D"
  105772.  
  105773.     ^(x max: aPoint3D x) @ (y max: aPoint3D y) @ (z max: aPoint3D z)
  105774. !
  105775.  
  105776. min: aPoint3D
  105777.     "Answer a new Point3D with the minimum of the x coordinates, y coordinates
  105778.     and z coordinates of the receiver and aPoint3D"
  105779.  
  105780.     ^(x min: aPoint3D x) @ (y min: aPoint3D y) @ (z min: aPoint3D z)
  105781. !
  105782.  
  105783. multiplyByPoint3D: aPoint3D
  105784.     "Private - Answer the result of multiplying the receiver by aPoint3D"
  105785.  
  105786.     ^(x * aPoint3D x) @ (y * aPoint3D y) @ (z* aPoint3D z)!
  105787.  
  105788. printOn: aStream
  105789.     "Append a short textual description of the receiver to aStream."
  105790.  
  105791.     aStream 
  105792.         print: x;
  105793.         nextPut: $@;
  105794.         print: y;
  105795.         nextPut: $@;
  105796.         print: z
  105797. !
  105798.  
  105799. r
  105800.     "Answer the receiver's radius (magnitude) in a polar coordinate 
  105801.     system."
  105802.  
  105803.     ^(self dotProduct: self) sqrt!
  105804.  
  105805. raisedTo: operand
  105806.     "Answer an <ArithmeticValue> which is the receiver raised to the power of 
  105807.     the <number> argument, operand."
  105808.  
  105809.     ^(x raisedTo: operand) @ (y raisedTo: operand) @ (z raisedTo: operand)!
  105810.  
  105811. rounded
  105812.     "Answer a new Point3D with the x, y and z values of the receiver rounded."
  105813.  
  105814.     ^x rounded @ y rounded @ z rounded!
  105815.  
  105816. subtractFromPoint3D: aPoint3D
  105817.     "Private - Answer the result of subtracting the receiver from aPoint3D"
  105818.  
  105819.     ^(aPoint3D x - x) @ (aPoint3D y - y) @ (aPoint3D z - z)
  105820. !
  105821.  
  105822. truncated
  105823.     "Answer a new Point3D with the x, y and z values of the receiver truncated."
  105824.  
  105825.     ^x truncated @ y truncated @ z truncated!
  105826.  
  105827. x
  105828.     "Answer the x coordinate of the receiver"
  105829.  
  105830.     ^x!
  105831.  
  105832. x: aNumber
  105833.     "Set the x coordinate of the receiver"
  105834.  
  105835.     x := aNumber!
  105836.  
  105837. x: xCoord y: yCoord z: zCoord
  105838.     "Set the coordinates of the receiver with the specified
  105839.     x, y and z coordinates"
  105840.  
  105841.     x := xCoord.
  105842.     y := yCoord.
  105843.     z := zCoord.!
  105844.  
  105845. y
  105846.     "Answer the y coordinate of the receiver"
  105847.  
  105848.     ^y!
  105849.  
  105850. y: aNumber
  105851.     "Set the y coordinate of the receiver"
  105852.  
  105853.     y := aNumber!
  105854.  
  105855. z
  105856.     "Answer the z coordinate of the receiver"
  105857.  
  105858.     ^z!
  105859.  
  105860. z: aNumber
  105861.     "Set the z coordinate of the receiver"
  105862.  
  105863.     z := aNumber! !
  105864.  
  105865. Float comment:
  105866. 'Float is the class of double precision floating point Numbers (64-bit) in IEEE-754 format. Note that the original Smalltalk-80 definition of Float, was only single precision, but this is considered somewhat outdated. Rather than introduce the complexity of multiple classes to represent floating point numbers, we have chosen to standardise on double precision.
  105867.  
  105868. Class Variables:
  105869.     SignificantDifference    <Float>. Difference between two Floats which is considered sufficient to deem them unequal. The smallest this can be is Float class>>epsilon.
  105870.     DefaultSigFigs    <SmallInteger>. Default digits of precision displayed.
  105871.  
  105872. '!
  105873. !Float class methodsFor!
  105874.  
  105875. denormalized
  105876.     "Answer whether the characterized floating point representation allows denormalized
  105877.     values."
  105878.  
  105879.     ^Processor activeProcess fpeMask allMask: (_EM_DENORMAL bitOr: _EM_UNDERFLOW)
  105880. !
  105881.  
  105882. e
  105883.     "Answer a <Float> representing the irrational number, 'e'
  105884.         Float e
  105885.     "
  105886.  
  105887.     ^##(1 exp)!
  105888.  
  105889. emax
  105890.     "Answer an <integer> representing the largest exponent
  105891.     of the characterized floating point representation.
  105892.  
  105893.         Float emax = 1024
  105894.     "
  105895.  
  105896.     ^##((2 raisedToInteger: 11-1))!
  105897.  
  105898. emin
  105899.     "Answer an <integer> representing the smallest exponent
  105900.     of the characterized floating point representation."
  105901.  
  105902.     ^-1021!
  105903.  
  105904. epsilon
  105905.     "Answer a <Float> representing the minimum relative spacing
  105906.     in the characterized floating point representation.
  105907.  
  105908.         Float epsilon = (self radix asFloat raisedTo: (1 - self precision))
  105909.     "
  105910.  
  105911.     ^2.2204460492503131e-016
  105912. !
  105913.  
  105914. fmax
  105915.     "Answer a <Float> representing the largest value
  105916.     allowed by the characterized floating point representation."
  105917.  
  105918.     ^FMax!
  105919.  
  105920. fmin
  105921.     "Answer a <Float> representing the smallest value
  105922.     allowed by the characterized floating point representation."
  105923.  
  105924.     ^self denormalized
  105925.         ifTrue: [self fminDenormalized]
  105926.         ifFalse: [self fminNormalized]!
  105927.  
  105928. fminDenormalized
  105929.     "Answer a <Float> representing the smallest denormalized value
  105930.     allowed by the characterized floating point representation."
  105931.  
  105932.     ^self radix asFloat raisedTo: self emin - self precision!
  105933.  
  105934. fminNormalized
  105935.     "Answer a <Float> representing the smallest normalized value
  105936.     allowed by the characterized floating point representation."
  105937.  
  105938.     ^FMin!
  105939.  
  105940. icon
  105941.     "Answers an Icon that can be used to represent this class"
  105942.  
  105943.     ^##(self) defaultIcon!
  105944.  
  105945. initialize
  105946.     "Private - Initialize the class variables of the receiver
  105947.         Float initialize
  105948.     "
  105949.  
  105950.     "There are only just over 15 digits of precision in a 64-bit IEEE float, but not 16 digits."
  105951.  
  105952.     DefaultSigFigs := 15.
  105953.     SignificantDifference := 1.0e-009.
  105954.     self assert: [SignificantDifference >= self epsilon].
  105955.     FMax := ((1 - (self radix raisedTo: self precision negated)) 
  105956.                 * (self radix raisedTo: self emax)) asFloat.
  105957.     FMin := self radix asFloat raisedTo: self emin - 1!
  105958.  
  105959. new
  105960.     "Answer a new instance of the receiver."
  105961.  
  105962.     ^self basicNew: 8
  105963. !
  105964.  
  105965. one
  105966.     "Answer the receiver's representation of one."
  105967.  
  105968.     ^1.0!
  105969.  
  105970. onStartup
  105971.     "Private - Re-initialize the receiver on session startup"
  105972.  
  105973.     self reset!
  105974.  
  105975. pi
  105976.     "Answer a <Float> representing 'pi'."
  105977.  
  105978.     ^##(1.0 arcTan * 4.0)!
  105979.  
  105980. precision
  105981.     "Answer an <integer> representing the precision (the number of bits in the mantissa) 
  105982.     of the characterized floating point representation. Note that the actual number of
  105983.     bits stored is 52. The normalized representation means that the high bit is always one
  105984.     and need not be stored."
  105985.  
  105986.     ^53!
  105987.  
  105988. radix
  105989.     "Answer an <integer> representing the radix
  105990.     of the characterized floating point representation."
  105991.  
  105992.     ^2!
  105993.  
  105994. readFrom: aStream
  105995.     "Instantiate a new instance of the receiver from aStream and answer it.
  105996.     Handles negative integers with a leading minus sign.
  105997.     Does not handle NLS characters (e.g. thousand separators and decimal separators
  105998.     other than $.)."
  105999.  
  106000.     ^(super readFrom: aStream) asFloat!
  106001.  
  106002. reset
  106003.     "Reset the floating point support. Win32 resets the exception mask to a standard value
  106004.     every time an exception occurs, so this must be sent after each FloatingPointException."
  106005.  
  106006.     CRTLibrary default _clearfp.
  106007.     self setExceptionMask: Processor activeProcess fpeMask!
  106008.  
  106009. setExceptionMask: anInteger
  106010.     "Private - Set the current floating point exception mask
  106011.     to anInteger. Answer the previous mask."
  106012.  
  106013.     ^CRTLibrary default _controlfp: anInteger mask: _MCW_EM!
  106014.  
  106015. zero
  106016.     "Answer the receiver's representation of zero."
  106017.  
  106018.     ^0.0! !
  106019.  
  106020. !Float methodsFor!
  106021.  
  106022. - aNumber
  106023.     "Answer the result of subtracting the argument, aNumber, from the receiver.
  106024.  
  106025.     Primitive failure reasons:
  106026.         0 -    aNumber is not a SmallInteger or a Float.
  106027.  
  106028.     May also raise a floating point exception."
  106029.  
  106030.     <primitive: 161>
  106031.     ^aNumber subtractFromFloat: self!
  106032.  
  106033. * aNumber
  106034.     "Answer the result of multiplying the receiver by the argument, aNumber.
  106035.  
  106036.     Primitive failure reasons:
  106037.         0 -    aNumber is not a SmallInteger or a Float.
  106038.  
  106039.     May also raise a floating point exception."
  106040.  
  106041.     <primitive: 164>
  106042.     ^aNumber multiplyByFloat: self!
  106043.  
  106044. / operand
  106045.     "Answer the result of dividing the receiver by the <number>, operand.
  106046.     Raise a <ZeroDivide> exception if the operand is zero.
  106047.  
  106048.     Primitive failure reasons:
  106049.         0 -    aNumber is not a SmallInteger or a Float."
  106050.  
  106051.     <primitive: 165>
  106052.     ^operand divideIntoFloat: self!
  106053.  
  106054. + aNumber
  106055.     "Answer the result of adding aNumber to the receiver.
  106056.  
  106057.     Primitive failure reasons:
  106058.         0 -    aNumber is not a SmallInteger or a Float.
  106059.  
  106060.     May also raise a floating point exception."
  106061.  
  106062.     <primitive: 160>
  106063.     ^aNumber addToFloat: self!
  106064.  
  106065. < aNumber
  106066.     "Answer true if the receiver is less than aNumber. This relational operator is 
  106067.     implemented as a primitive, and >, <=, and >= are expressed in terms of it.
  106068.  
  106069.     Primitive failure reasons:
  106070.         0 -    aNumber is not a SmallInteger or a Float.
  106071.  
  106072.     May also raise a floating point exception."
  106073.  
  106074.     <primitive: 162>
  106075.     ^aNumber greaterThanFloat: self
  106076. !
  106077.  
  106078. = comperand
  106079.     "Answer whether the receiver is numerically equivalent to the argument,
  106080.     comperand (e.g. 1 = 1.0 is true).
  106081.  
  106082.     Primitive failure reasons:
  106083.         0 -    aNumber is not a SmallInteger or a Float.
  106084.  
  106085.     May also raise a floating point exception."
  106086.  
  106087.     <primitive: 163>
  106088.     ^super = comperand!
  106089.  
  106090. abs
  106091.     "Answer a Number that is the absolute value - positive magnitude - of the receiver."
  106092.  
  106093.     ^CRTLibrary default fabs: self
  106094.     !
  106095.  
  106096. addToFloat: aFloat
  106097.     "Private - Answer the result of adding the receiver to the known Float, aFloat.
  106098.     If we get here, then the floating point subtraction must have failed due to some 
  106099.     floating point exception."
  106100.  
  106101.     ^self primitiveFailed!
  106102.  
  106103. addToFraction: aFraction
  106104.     "Private - Answer the result of adding the receiver to the known fraction, aFraction, 
  106105.     by coercing the less general of it and the receiver."
  106106.  
  106107.     ^aFraction asFloat + self!
  106108.  
  106109. addToInteger: anInteger
  106110.     "Private - Add the known integer, anInteger, to the receiver, converting anInteger 
  106111.     to a Float. Answer the result"
  106112.  
  106113.     ^anInteger asFloat + self!
  106114.  
  106115. arcCos
  106116.     "Answer a <Float> which is the inverse cosine of the receiver in radians. If the receiver is not in the 
  106117.     range -1 .. 1 (non-inclusive) then a FloatingPointException will be raised."
  106118.  
  106119.     ^CRTLibrary default acos: self!
  106120.  
  106121. arcSin
  106122.     "Answer a <Float> which is the inverse sine of the receiver in radians. If the receiver is not in the 
  106123.     range -1 .. 1 (non-inclusive) then a FloatingPointException will be raised."
  106124.  
  106125.     ^CRTLibrary default asin: self!
  106126.  
  106127. arcTan
  106128.     "Answer a <Float> which is the inverse tangent of the receiver in radians."
  106129.  
  106130.     ^CRTLibrary default atan: self!
  106131.  
  106132. arcTan: aFloat
  106133.     "Answer the arc-tangent of the receiver/aFloat in radians."
  106134.  
  106135.     ^CRTLibrary default atan: self x: aFloat!
  106136.  
  106137. asApproximateFraction
  106138.     "Answer a <rational> (e.g. Fraction or Integer) approximating the receiver.
  106139.     This conversion uses the continued fraction method to approximate a 
  106140.     floating point number."
  106141.  
  106142.     | num1 denom1 num2 denom2 int frac newD temp |
  106143.  
  106144.     num1 := self truncated.    "The first of two alternating numerators"
  106145.     denom1 := 1.            "The first of two alternating denominators"
  106146.     num2 := 1.                "The second numerator"
  106147.     denom2 := 0.            "The second denominator--will update"
  106148.     int := num1.            "The integer part of self"
  106149.     frac := self fractionPart.    "The fractional part of self"
  106150.     [frac = 0] whileFalse: [
  106151.         newD := 1.0 / frac.                "Take reciprocal of the fractional part"
  106152.         int := newD truncated.            "Get the integer part of this ..."
  106153.         frac := newD fractionPart.            "and save the fractional part for next time"
  106154.         temp := num2.                    "Get old numerator and save it"
  106155.         num2 := num1.                    "Set second numerator to first"
  106156.         num1 := num1 * int + temp.        "Update first numerator"
  106157.         temp := denom2.                "Get old denominator and save it"
  106158.         denom2 := denom1.                "Set second denominator to first"
  106159.         denom1 := int * denom1 + temp.        "Update first denominator"
  106160.         1e14 < denom1 ifTrue: [    "Is ratio past float precision?"
  106161.             "Pick which of the two ratios to use based on whether second denominator is 0"
  106162.             ^num2 = 0.0
  106163.                 ifTrue: [Fraction numerator: num1 denominator: denom1]
  106164.                 ifFalse: [Fraction numerator: num2 denominator: denom2]]].
  106165.  
  106166.     "If fractional part is zero, return the first ratio"
  106167.     ^denom1 = 1                                     "Am I really an Integer?"
  106168.         ifTrue: [num1]                                "Yes, return Integer result"
  106169.         ifFalse: [Fraction numerator: num1 denominator: denom1]     "Otherwise return Fraction result"
  106170.  
  106171. !
  106172.  
  106173. asFloat
  106174.     "Answer the receiver as a floating point number"
  106175.  
  106176.     ^self
  106177. !
  106178.  
  106179. asFloatD
  106180.     "Answer the double-precision floating point equivalent of the receiver."
  106181.  
  106182.     ^self!
  106183.  
  106184. asFloatE
  106185.     "Answer a <Float> approximating the receiver."
  106186.  
  106187.     ^self!
  106188.  
  106189. asFloatQ
  106190.     "Answer a <Float> approximating the receiver."
  106191.  
  106192.     ^self!
  106193.  
  106194. asFraction
  106195.     "Answer an <integer> or <fraction> approximating the receiver."
  106196.  
  106197.     ^self asApproximateFraction!
  106198.  
  106199. asTrueFraction
  106200.     "Answer a <rational> that precisely represents the binary fractional
  106201.     value of the receiver using all available bits of the double precision 
  106202.     IEEE floating point representation. Note that because <Float> is
  106203.     an imprecise representation, the result may have more precision than
  106204.     appropriate.  For example the decimal number 0.1 cannot be represented
  106205.     precisely as a binary floating point number, and hence the <Float>
  106206.     representation is itself only approximate. When <Float> representation of
  106207.     0.1 is converted using this method the result is a precisely equivalent Fraction 
  106208.     that is very close to (1/10), but not actually equal to 0.1."
  106209.  
  106210.     | shifty sign expPart exp fraction fractionPart result |
  106211.  
  106212.     " Extract the bits of an IEEE double float "
  106213.     shifty := VMLibrary default makeLargeUnsigned: self.
  106214.  
  106215.     " Extract the sign and the biased exponent "
  106216.     sign := (shifty bitShift: -63) == 0 ifTrue: [1] ifFalse: [-1].
  106217.     expPart := (shifty bitShift: -52) bitAnd: 16r7FF.
  106218.  
  106219.     " Extract fractional part; answer 0 if this is a true 0.0 value "
  106220.     fractionPart := shifty bitAnd: 16r000FFFFFFFFFFFFF.
  106221.     (expPart == 0 and: [fractionPart = 0]) ifTrue: [^0].
  106222.  
  106223.     "Add implied leading 1 into fraction"
  106224.     fraction := fractionPart bitOr: 16r0010000000000000.
  106225.  
  106226.     "Unbias exponent: 16r3FF is bias; 52 is fraction width"
  106227.     exp := ##(16r3FF + 52) - expPart.
  106228.  
  106229.     "Form the result. When exp>52, the exponent is adjusted by
  106230.       the number of trailing zero bits in the fraction to minimize
  106231.       the (huge) time otherwise spent in #gcd:. "
  106232.     ^exp negative
  106233.         ifTrue: [sign * fraction bitShift: exp negated ]
  106234.         ifFalse: [ | zeroBitsCount |
  106235.             zeroBitsCount := fraction lowBit - 1.
  106236.             exp := exp - zeroBitsCount.
  106237.             exp <= 0
  106238.                 ifTrue: [
  106239.                     zeroBitsCount := zeroBitsCount + exp.
  106240.                     sign * fraction bitShift: zeroBitsCount negated]
  106241.                 ifFalse: [
  106242.                     Fraction
  106243.                         numerator: (sign * fraction bitShift: zeroBitsCount negated)
  106244.                         denominator: (1 bitShift: exp)]]!
  106245.  
  106246. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣`▓▀6£êà╞╛ü^s²4iPV√ÄDDzÇ_ZÜ╡z»W∞=â≡W!
  106247.  
  106248. ceiling
  106249.     "Answer the integer nearest the receiver toward positive infinity."
  106250.  
  106251.     ^(CRTLibrary default ceil: self) truncated
  106252. !
  106253.  
  106254. coerce: anArithmeticValue
  106255.     "Private - Answer the lower generality ArithmeticValue, anArithmeticValue, 
  106256.     converted to a Float."
  106257.  
  106258.     ^anArithmeticValue asFloat
  106259. !
  106260.  
  106261. cos
  106262.     "Answer a <Float> which is the cosine of the receiver, which is treated as an angle in radians.
  106263.     May raise a FloatingPointException in the case of underflow."
  106264.  
  106265.     ^CRTLibrary default cos: self!
  106266.  
  106267. divideIntoFloat: aFloat
  106268.     "Private - Answer the result of dividing the receiver by the known Float, aFloat. 
  106269.     If we get here, then the floating point multiplication must have failed due to some floating
  106270.     point exception."
  106271.  
  106272.     ^self shouldNotImplement!
  106273.  
  106274. divideIntoFraction: aFraction
  106275.     "Private - Answer the result of dividing the receiver into the known fraction, aFraction, 
  106276.     by coercing the less general of it and the receiver."
  106277.  
  106278.     ^aFraction asFloat / self!
  106279.  
  106280. divideIntoInteger: anInteger
  106281.     "Private - Answer the result of dividing the receiver into the known integer, anInteger, 
  106282.     by coercing the less general of it and the receiver."
  106283.  
  106284.     ^anInteger asFloat / self!
  106285.  
  106286. equals: aNumber
  106287.     "Answer whether the receiver is numerically equivalent to aNumber, within the
  106288.     default numerical precision."
  106289.  
  106290.     | max |
  106291.     ^(max := self abs max: aNumber abs) <= SignificantDifference
  106292.         or:  [(self - aNumber) abs < (SignificantDifference * max)]
  106293. !
  106294.  
  106295. exp
  106296.     "Answer the exponential of the receiver. The primitive should not fail."
  106297.  
  106298.     ^CRTLibrary default exp: self!
  106299.  
  106300. exponent
  106301.     "Answer the SmallInteger which is the exponent part of the receiver as a Float."
  106302.  
  106303.     ^(CRTLibrary default _logb: self) truncated!
  106304.  
  106305. floor
  106306.     "Answer the integer nearest the receiver toward negative infinity."
  106307.  
  106308.     ^(CRTLibrary default floor: self) truncated
  106309. !
  106310.  
  106311. floorLog10
  106312.     "Answer the base 10 exponent of the receiver (an Integer between -308 and 308)."
  106313.  
  106314.     ^self log floor!
  106315.  
  106316. fractionPart
  106317.     "Answer a <Float> representing the fractional part of the receiver."
  106318.  
  106319.     ^CRTLibrary default modf: self intptr: Float new!
  106320.  
  106321. generality
  106322.     "Private - Answer the generality of the receiver. Floats are the highest generality numbers 
  106323.     (though they do not offer infinite precision)."
  106324.  
  106325.     ^40
  106326. !
  106327.  
  106328. greaterThanFraction: aFraction
  106329.     "Private - Answer whether the receiver is greater than the known Fraction, aFraction."
  106330.  
  106331.     ^aFraction asFloat < self!
  106332.  
  106333. greaterThanInteger: anInteger
  106334.     "Private - Answer whether the receiver is greater than the known Integer, anInteger."
  106335.  
  106336.     ^anInteger asFloat < self!
  106337.  
  106338. hash
  106339.     "Answer the <integer> hash value for the receiver."
  106340.  
  106341.     "Implementation Note: If the receiver is a whole number, then the hash of the integer 
  106342.     part is used (to maintain the invariant that when #= is true the two numbers must
  106343.     have the same #hash) , otherwise the integerPart is bitXor'd with the bits of the fractionPart."
  106344.  
  106345.     | integerPart fractionPart |
  106346.     integerPart := Float new.
  106347.     fractionPart := CRTLibrary default modf: self intptr: integerPart.
  106348.     fractionPart isZero ifTrue: [^integerPart truncated hash].
  106349.     fractionPart := (##(SmallInteger maximum + 1.0) * 
  106350.             fractionPart timesTwoPower: (fractionPart exponent abs truncated + 1)).
  106351.     ^(integerPart truncated bitXor: fractionPart truncated) bitAnd: ##(SmallInteger maximum)!
  106352.  
  106353. integerPart
  106354.     "Answer a <Float> representing the whole integer part of the receiver.
  106355.     Implementation Note: Avoid truncaction to integer which can be time
  106356.     consuming if the receiver is very large."
  106357.  
  106358.     | intPart |
  106359.     intPart := Float new.
  106360.     CRTLibrary default modf: self intptr: intPart.
  106361.     ^intPart
  106362. !
  106363.  
  106364. ln
  106365.     "Answer the a Float which is the natural logarithm of the receiver.
  106366.     May raise FloatingPointException (e.g. if the receiver is negative)."
  106367.  
  106368.     ^CRTLibrary default log: self!
  106369.  
  106370. log
  106371.     "Answer a <Float> which is the base 10 logarithm of the receiver.
  106372.     May raise a FloatingPointException (e.g. if the receiver is negative).
  106373.  
  106374.     Implementation Note: Although we could implement this in terms of #ln,
  106375.     that tends to lead to unfortunate precision errors such as '1000.0 log truncated'
  106376.     evaluating to 2. It is also faster to use the log10() function directly."
  106377.  
  106378.     ^CRTLibrary default log10: self!
  106379.  
  106380. multiplyByFloat: aFloat
  106381.     "Private - Answer the result of multiplying the known Float, aFloat, by the receiver. 
  106382.     If we get here, then the floating point multiplication must have failed due to some floating
  106383.     point exception."
  106384.  
  106385.     ^self primitiveFailed!
  106386.  
  106387. multiplyByFraction: aFraction
  106388.     "Private - Multiply the receiver by the known fraction, aFraction, by converting anInteger 
  106389.     to a Float. Answer the result"
  106390.  
  106391.     ^aFraction asFloat * self!
  106392.  
  106393. multiplyByInteger: anInteger
  106394.     "Private - Multiply the receiver by the known integer, anInteger, by converting anInteger 
  106395.     to a Float. Answer the result"
  106396.  
  106397.     ^anInteger asFloat * self!
  106398.  
  106399. negative
  106400.     "Answer whether the receiver is negative.
  106401.     Implementation Note: High-bit of IEEE float is sign bit."
  106402.  
  106403.     ^(self basicAt: 8) anyMask: 128!
  106404.  
  106405. printOn: target
  106406.     "Append the ASCII representation of the receiver to the <puttableStream>, target.
  106407.  
  106408.     The representation we use is a valid literal representation for floating point
  106409.     numbers, recognised by the Smalltalk compiler."
  106410.  
  106411.     self printOn: target significantFigures: DefaultSigFigs!
  106412.  
  106413. printOn: aStream decimalPlaces: anInteger 
  106414.     "Append the printed representation of the receiver to the <puttableStream>,
  106415.     aStream, rounded    to the <integer> number of decimal places, anInteger.
  106416.     Implementation Note: fcvt() is a jolly quirky function, hence the
  106417.     complexity. This seemed preferable to reinventing the wheel, but
  106418.     now I'm not so sure!!"
  106419.  
  106420.     | sign ptPos digits |
  106421.     anInteger < 1 ifTrue: [^self rounded printOn: aStream].
  106422.     ptPos := SDWORD new.
  106423.     sign := SDWORD new.
  106424.     digits := CRTLibrary default 
  106425.                 _fcvt: self
  106426.                 count: anInteger
  106427.                 dec: ptPos
  106428.                 sign: sign.
  106429.     sign asInteger = 0 ifFalse: [aStream nextPut: $-].
  106430.     ptPos := ptPos asInteger.
  106431.     ptPos <= 0 ifTrue: [aStream nextPut: $0].
  106432.     ptPos < 0 
  106433.         ifTrue: 
  106434.             [aStream
  106435.                 nextPut: $.;
  106436.                 next: (ptPos negated min: anInteger) put: $0;
  106437.                 nextPutAll: digits]
  106438.         ifFalse: 
  106439.             [aStream
  106440.                 next: ptPos
  106441.                     putAll: digits
  106442.                     startingAt: 1;
  106443.                 nextPut: $.;
  106444.                 next: digits size - ptPos
  106445.                     putAll: digits
  106446.                     startingAt: ptPos + 1]!
  106447.  
  106448. printOn: aStream significantFigures: anInteger
  106449.     "Append the printed representation of the receiver to aStream with
  106450.     anInteger significant figures. Ensure that there is always a digit
  106451.     following the decimal point.
  106452.     Implementation Note: Make use of the CRT to avoid reinventing the
  106453.     wheel. #printOn:decimalPlaces: may be more convenient when printing
  106454.     reports, formatting output fields, etc, as it does not drop into
  106455.     exponential format."
  106456.  
  106457.     | buf ptPos size |
  106458.     buf := String new: (anInteger bitShift: 1)+10.
  106459.     buf := CRTLibrary default _gcvt: self count: anInteger buffer: buf.
  106460.  
  106461.     "Ensure decimal separator is always a $. for printOn:, which outputs Smalltalk real syntax"
  106462.     ptPos := buf indexOfSubCollection: CRTLibrary default decimalSeparator.
  106463.     ptPos == 0 
  106464.         ifTrue: [aStream nextPutAll: buf; nextPutAll: '.0']
  106465.         ifFalse: [
  106466.             aStream 
  106467.                 next: ptPos-1 putAll: buf startingAt: 1;
  106468.                 nextPut: $..
  106469.             size := buf size.
  106470.             ptPos = size
  106471.                 ifTrue: [    "Smalltalk requires a trailing zero to follow decimal points"
  106472.                     aStream nextPut: $0]
  106473.                 ifFalse: [
  106474.                     (buf at: ptPos + 1) == $e
  106475.                         ifTrue: [aStream nextPut: $0].
  106476.                     aStream next: buf size - ptPos putAll: buf startingAt: ptPos+1]]
  106477. !
  106478.  
  106479. raisedTo: operand 
  106480.     "Answer a <Float> which is the receiver raised to the power of the <number>
  106481.     argument, operand.
  106482.     Note: ANSI standard says that it is an error for the receiver to be negative, but I 
  106483.     think that is bogus (unless the operand is non-integral). This implementation will, 
  106484.     however, raise an error (a ZeroDivide in fact, but ANSI doesn't specify the precise 
  106485.     exception) if the receiver is zero and the argument not strictly positive)."
  106486.  
  106487.     ^operand strictlyPositive 
  106488.         ifTrue: [CRTLibrary default pow: self y: operand asFloat]
  106489.         ifFalse: [CRTLibrary default pow: self reciprocal y: operand abs asFloat]!
  106490.  
  106491. sin
  106492.     "Answer a <Float> which is the sine of the receiver, 
  106493.     which is treated as an angle in radians.
  106494.     May raise FloatingPointException."
  106495.  
  106496.     ^CRTLibrary default sin: self!
  106497.  
  106498. sqrt
  106499.     "Answer the Float which is the square root of the receiver.
  106500.     Raises a FloatingPointExceptoin if the receiver is negative."
  106501.  
  106502.     ^CRTLibrary default sqrt: self!
  106503.  
  106504. subtractFromFloat: aFloat
  106505.     "Private - Answer the result of subtracting the receiver from the known Float, aFloat. 
  106506.     If we get here, then the floating point subtraction must have failed due to some floating
  106507.     point exception."
  106508.  
  106509.     ^self primitiveFailed!
  106510.  
  106511. subtractFromFraction: aFraction
  106512.     "Private - Answer the result of subtracting the receiver from the known fraction, aFraction."
  106513.  
  106514.     ^aFraction asFloat - self!
  106515.  
  106516. subtractFromInteger: anInteger
  106517.     "Private - Subtract the known integer, anInteger, from the receiver, converting anInteger 
  106518.     to a Float. Answer the result"
  106519.  
  106520.     ^anInteger asFloat - self!
  106521.  
  106522. tan
  106523.     "Answer a <Float> which is the tangent of the receiver, 
  106524.     which is treated as an angle in radians.
  106525.     May raise a FloatingPointException."
  106526.  
  106527.     ^CRTLibrary default tan: self!
  106528.  
  106529. timesTwoPower: aNumber
  106530.     "Answer the receiver times two to the power of the argument, aNumber."
  106531.  
  106532.     | int |
  106533.     int := aNumber asInteger.
  106534.     ^int class == SmallInteger
  106535.         ifTrue: [CRTLibrary default ldexp: self exp: int]
  106536.         ifFalse: [self * (2 raisedToInteger: int) asFloat]!
  106537.  
  106538. truncated
  106539.     "Answer the <integer> nearest the receiver toward zero.
  106540.     Note that for many large floats the answer may be reported
  106541.     to more digits of precision that the floating point receiver
  106542.     was capable of representing (there are only about 15 digits 
  106543.     of precision in a double).
  106544.     Implementation Note: Rather than calculate the integer approximation
  106545.     by a series of divisions (as in versions of Dolphin prior to 3.02), a
  106546.     process which was both very slow for large Floats and also prone
  106547.     to error, we use precise #asTrueFraction.
  106548.  
  106549.     Primitive failure results:
  106550.         0 -    the receiver is not finite.
  106551.         1 -    more than 64-bits are required to represent the receiver 
  106552.             as an Integer.
  106553.     May also raise a floating point exception."
  106554.  
  106555.     <primitive: 166>
  106556.     ^self asTrueFraction truncated
  106557. ! !
  106558.  
  106559. Fraction comment:
  106560. 'Instances of class Fraction represent rational numbers which are not integers, e.g. 3/4. They are always represented in the most reduced form possible. Fractions are usually created by a division operation between two integers where the numerator cannot be divided exactly the denominator. Unlike Float, Fraction has effectively limitless precision, and thus calculations involving Fractions do not suffer from rounding errors. This can be useful where absolute accuracy is required, but Fraction arithmetic is not supported directly by the CPU, and thus calculations are orders of magnitude slower.
  106561.  
  106562. Instance Variables:
  106563.     numerator        <integer>
  106564.     denominator    <integer>
  106565.  
  106566. '!
  106567. !Fraction class methodsFor!
  106568.  
  106569. icon
  106570.     "Answers an Icon that can be used to represent this class"
  106571.  
  106572.     ^##(self) defaultIcon!
  106573.  
  106574. numerator: top denominator: bottom
  106575.     "Answer a <Fraction> with numerator and denominator,
  106576.     initialised to the <integer> arguments, top, and, bottom.
  106577.     It is assumed that the arguments are such that a normalised
  106578.     <Fraction> will result - use #normalisedNumerator:denominator if
  106579.     you're not sure and require the smallest possible denominator."
  106580.  
  106581.     ^self basicNew numerator: top denominator: bottom!
  106582.  
  106583. rationalisedNumerator: numInteger denominator: divInteger
  106584.     "Answer a Fraction which is the rationalised form of numInteger
  106585.     divided by divInteger."
  106586.  
  106587.     | gcd denominator numerator |
  106588.     denominator := divInteger truncated abs.
  106589.     numerator := divInteger negative
  106590.         ifTrue: [numInteger truncated negated]
  106591.         ifFalse: [numInteger truncated].
  106592.     gcd := numerator gcd: denominator.
  106593.     denominator = gcd ifTrue: [^numerator // gcd].
  106594.     gcd == 1 ifTrue: [^self basicNew numerator: numerator denominator: denominator].
  106595.     ^self basicNew numerator: numerator // gcd denominator: denominator // gcd!
  106596.  
  106597. readFrom: aStream
  106598.     "Instantiate a new instance of the receiver from aStream and answer it.
  106599.     Handles negative fractions with a leading minus sign.
  106600.     Does not handle NLS characters (e.g. thousand separators)"
  106601.  
  106602.     ^(super readFrom: aStream) asFraction! !
  106603.  
  106604. !Fraction methodsFor!
  106605.  
  106606. - aNumber
  106607.     "Answer the difference between the receiver and aNumber."
  106608.  
  106609.     ^aNumber subtractFromFraction: self!
  106610.  
  106611. * aNumber
  106612.     "Answer the result of multiplying the receiver by aNumber."
  106613.  
  106614.     ^aNumber multiplyByFraction: self!
  106615.  
  106616. / operand
  106617.     "Answer the result of dividing the receiver by the <number>, operand.
  106618.     Raise a <ZeroDivide> exception if the operand is zero."
  106619.  
  106620.     ^operand divideIntoFraction: self!
  106621.  
  106622. // aNumber
  106623.     "Answer the integer quotient after dividing the receiver by aNumber
  106624.     with truncation towards negative infinity."
  106625.  
  106626.     ^(numerator * aNumber denominator) //
  106627.         (denominator * aNumber numerator)!
  106628.  
  106629. + aNumber
  106630.     "Answer sum of the receiver and aNumber."
  106631.  
  106632.     ^aNumber addToFraction: self!
  106633.  
  106634. < aNumber
  106635.     "Answer whether the receiver is less than the argument, aNumber"
  106636.  
  106637.     ^aNumber greaterThanFraction: self!
  106638.  
  106639. addToFloat: aFloat
  106640.     "Private - Add the receiver to the known Float, aFloat."
  106641.  
  106642.     ^aFloat + self asFloat
  106643. !
  106644.  
  106645. addToFraction: aFraction
  106646.     "Private - Add the known Fraction, aFraction, to the receiver. This is obviously fastest
  106647.     if the receiver and aFraction have the same denominator"
  106648.  
  106649.     ^denominator = aFraction denominator
  106650.         ifTrue: [ 
  106651.             Fraction
  106652.                 rationalisedNumerator: numerator + aFraction numerator
  106653.                 denominator: denominator ]
  106654.         ifFalse: [
  106655.             Fraction
  106656.                 rationalisedNumerator: numerator * aFraction denominator + (aFraction numerator * denominator)
  106657.                 denominator: denominator * aFraction denominator ]!
  106658.  
  106659. addToInteger: anInteger 
  106660.     "Private - Add the known integer, anInteger, to the receiver. There is no need
  106661.     to rationalise the result."
  106662.  
  106663.     ^Fraction
  106664.         numerator: anInteger * denominator + numerator
  106665.         denominator: denominator!
  106666.  
  106667. asFloat
  106668.     "Answer the receiver as a Float"
  106669.  
  106670.     ^numerator asFloat / denominator asFloat
  106671. !
  106672.  
  106673. asFraction
  106674.     "Answer a Fraction approximating the receiver."
  106675.  
  106676.     ^self
  106677. !
  106678.  
  106679. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣`▓▀6£êà╞╛üqt■ZQk ╬┤l&ε┘╥\K£Ü{εN╖d╨∙C+⌡*▌│3±(Æ9▀öâ≈▀åç ï█Æo9»π^E¼t!
  106680.  
  106681. coerce: anArithmeticValue
  106682.     "Private - Answer the lower generality <ArithmeticValue>, anArithmeticValue,
  106683.     converted to a Fraction"
  106684.  
  106685.     ^Fraction numerator: anArithmeticValue denominator: 1
  106686. !
  106687.  
  106688. denominator
  106689.     "Answer the smallest <integer> denominator of the receiver."
  106690.  
  106691.     ^denominator!
  106692.  
  106693. displayOn: aStream
  106694.     "Append to the <puttableStream>, aStream, a <readableString> whose characters are 
  106695.     a representation of the receiver as a user would want to see it (in this case sans parenthesis)."
  106696.     
  106697.     aStream 
  106698.         print: numerator;
  106699.         nextPut: $/;
  106700.         print: denominator!
  106701.  
  106702. divideIntoFloat: aFloat
  106703.     "Private - Divide the receiver into the known Float, aFloat.
  106704.     Answer the result."
  106705.  
  106706.     ^aFloat / self asFloat!
  106707.  
  106708. divideIntoFraction: aFraction
  106709.     "Private - Divide the receiver into the known Fraction, aFraction.
  106710.     Answer the result."
  106711.  
  106712.     ^Fraction
  106713.         rationalisedNumerator: denominator * aFraction numerator
  106714.         denominator: numerator * aFraction denominator!
  106715.  
  106716. divideIntoInteger: anInteger
  106717.     "Private - Divide the receiver into the known integer, anInteger.
  106718.     Answer the result."
  106719.  
  106720.     ^Fraction
  106721.         rationalisedNumerator: anInteger * denominator
  106722.         denominator: numerator!
  106723.  
  106724. generality
  106725.     "Private - Answer the generality of the receiver."
  106726.  
  106727.     ^30
  106728. !
  106729.  
  106730. greaterThanFloat: aFloat
  106731.     "Private - Answer whether the receiver is greater than the known Float, aFloat"
  106732.  
  106733.     ^aFloat < self asFloat!
  106734.  
  106735. greaterThanFraction: aFraction
  106736.     "Private - Answer whether the receiver is greater than the known Fraction, aFraction"
  106737.  
  106738.     | negative |
  106739.     negative := aFraction negative.
  106740.     negative = self negative ifFalse: [ ^negative ].
  106741.     ^aFraction numerator * denominator < 
  106742.         (numerator * aFraction denominator)!
  106743.  
  106744. greaterThanInteger: anInteger
  106745.     "Private - Answer whether the receiver is greater than the known integer, anInteger"
  106746.  
  106747.     ^anInteger * denominator < numerator!
  106748.  
  106749. hash
  106750.     "Answer the <integer> hash value for the receiver."
  106751.  
  106752.     "Implementation Note: This should be the same hash value as the equivalent <Integer> of <Float>"
  106753.  
  106754.     ^denominator = 1 
  106755.         ifTrue: [numerator hash]
  106756.         ifFalse: 
  106757.             [[self asFloat hash] on: FloatingPointException
  106758.                 do: [:ex | numerator hash bitXor: denominator hash]]!
  106759.  
  106760. isFraction
  106761.     "Answer true if receiver is an instance of class Fraction, else answer false."
  106762.  
  106763.     ^true
  106764. !
  106765.  
  106766. isZero
  106767.     "Answer whether the receiver is equal to its class' zero"
  106768.  
  106769.     ^numerator isZero!
  106770.  
  106771. multiplyByFloat: aFloat
  106772.     "Private - Multiply the receiver by the known Float, aFloat.
  106773.     Answer the result."
  106774.  
  106775.     ^aFloat * self asFloat!
  106776.  
  106777. multiplyByFraction: aFraction
  106778.     "Private - Multiply the receiver by the known Fraction, aFraction.
  106779.     Answer the result."
  106780.  
  106781.     ^Fraction
  106782.         rationalisedNumerator: numerator * aFraction numerator
  106783.         denominator: denominator * aFraction denominator
  106784. !
  106785.  
  106786. multiplyByInteger: anInteger
  106787.     "Private - Multiply the receiver by the known integer, anInteger.
  106788.     Answer the result."
  106789.  
  106790.     ^Fraction
  106791.         rationalisedNumerator: anInteger * numerator
  106792.         denominator: denominator!
  106793.  
  106794. negated
  106795.     "Answer an instance of class Fraction which is the negative of the receiver."
  106796.  
  106797.     ^Fraction
  106798.         numerator: self numerator negated
  106799.         denominator: self denominator
  106800. !
  106801.  
  106802. numerator
  106803.     "Answer the <integer> numerator of the receiver reduced to its lowest common denominator."
  106804.  
  106805.     ^numerator!
  106806.  
  106807. numerator: num denominator: div
  106808.     "Private - The numerator and denominator of the 
  106809.     receiver are set to the n and d arguments respectively.
  106810.     Intended for instance creation."
  106811.  
  106812.     div = 0
  106813.         ifTrue: [^num divideByZero].
  106814.     div negative
  106815.         ifTrue: [
  106816.             numerator := num negated.
  106817.             denominator := div negated ]
  106818.         ifFalse:[
  106819.             numerator := num.
  106820.             denominator := div ]
  106821. !
  106822.  
  106823. printOn: aStream
  106824.     "Append a short textual description of the receiver to aStream."
  106825.     
  106826.     "The ANSI standard states that the printString of a Fraction is not bracketed, but historically it has been.
  106827.      We provide displayString for end-user format."
  106828.  
  106829.     aStream 
  106830.         nextPut: $(;
  106831.         print: numerator;
  106832.         nextPut: $/;
  106833.         print: denominator;
  106834.         nextPut: $)
  106835. !
  106836.  
  106837. reciprocal
  106838.     "Answer the reciprocal of the receiver by dividing the denominator by the numerator."
  106839.  
  106840.     | n d |
  106841.     numerator positive
  106842.         ifTrue: [
  106843.             d := numerator.
  106844.             n := denominator]
  106845.         ifFalse: [
  106846.             d := numerator negated.
  106847.             n := denominator negated].
  106848.     d == 1
  106849.         ifTrue: [^n]
  106850.         ifFalse: [
  106851.             ^self class
  106852.                 numerator: n
  106853.                 denominator: d]!
  106854.  
  106855. squared
  106856.     "Answer the receiver multiplied by the receiver."
  106857.  
  106858.     ^self class
  106859.         numerator: numerator squared denominator: denominator squared
  106860. !
  106861.  
  106862. subtractFromFloat: aFloat
  106863.     "Private - Subtract the receiver from the known Float, aFloat."
  106864.  
  106865.     ^aFloat - self asFloat
  106866. !
  106867.  
  106868. subtractFromFraction: aFraction
  106869.     "Private - Subtract the receiver from the known Fraction, aFraction. This is obviously fastest
  106870.     if the receiver and aFraction have the same denominator"
  106871.  
  106872.     ^denominator = aFraction denominator
  106873.         ifTrue: [ 
  106874.             Fraction
  106875.                 rationalisedNumerator: aFraction numerator - numerator
  106876.                 denominator: denominator ]
  106877.         ifFalse: [
  106878.             Fraction
  106879.                 rationalisedNumerator: aFraction numerator * denominator - (numerator * aFraction denominator)
  106880.                 denominator: denominator * aFraction denominator ]!
  106881.  
  106882. subtractFromInteger: anInteger 
  106883.     "Private - Subtract the receiver from the known integer, anInteger.
  106884.     There is no need to rationalise the result."
  106885.  
  106886.     ^Fraction
  106887.         numerator: anInteger * denominator - numerator
  106888.         denominator: denominator!
  106889.  
  106890. truncated
  106891.     "Answer the receiver as a kind of Integer truncating the fraction part."
  106892.  
  106893.     ^numerator quo: denominator! !
  106894.  
  106895. Integer comment:
  106896. ''!
  106897. !Integer class methodsFor!
  106898.  
  106899. initialize
  106900.     "Private - Initialize the receiver's class variables.
  106901.  
  106902.         Integer initialize
  106903.  
  106904.         PrintBuf        - Buffer for CRTLibrary>>ltoa:string:radix: (which answers a new String)"
  106905.  
  106906.     #todo "Remove this when go multi-threaded unless external call primitive atomic?".
  106907.     PrintBuf := String new: 128!
  106908.  
  106909. primesUpTo: aNumber 
  106910.     "Answer a <sequencedReadableCollection> of all primes less than or equal to the <integer> argument."
  106911.  
  106912.     | limit flags prime primes |
  106913.     limit := aNumber asInteger - 1.
  106914.     flags := ByteArray new: limit withAll: 1.
  106915.     primes := OrderedCollection new.
  106916.     1 to: limit
  106917.         do: 
  106918.             [:i | 
  106919.             (flags at: i) == 1 
  106920.                 ifTrue: 
  106921.                     [| k |
  106922.                     prime := i + 1.
  106923.                     k := i + prime.
  106924.                     [k <= limit] whileTrue: 
  106925.                             [flags at: k put: 0.
  106926.                             k := k + prime].
  106927.                     primes addLast: prime]].
  106928.     ^primes!
  106929.  
  106930. readFrom: aStream
  106931.     "Instantiate a new subinstance of the receiver from aStream and answer it.
  106932.     Handles negative integers with a leading minus sign. Also allows for bases
  106933.     other than 10 (with leading nnr format) with digits greater than 10 being
  106934.     represented by characters A-Z.
  106935.     Does not handle NLS characters (e.g. thousand separators)."
  106936.  
  106937.     | neg answer |
  106938.     neg := aStream peekFor: $-.
  106939.     answer := self readFrom: aStream
  106940.                 initialInteger: (self readPositiveFrom: aStream radix: 10).
  106941.     ^neg ifTrue: [answer negated] ifFalse: [answer]!
  106942.  
  106943. readFrom: aStream initialInteger: initialInteger
  106944.     "Private - Instantiate a new instance of the receiver from aStream and answer it.
  106945.     The <integer>, initialInteger, has already been read from the stream.
  106946.     All we need to do is to check whether initialInteger is in fact a radix prefix, and
  106947.     proceed accordingly."
  106948.  
  106949.     ^(aStream peekFor: $r) 
  106950.         ifTrue: [self readPositiveFrom: aStream radix: initialInteger]
  106951.         ifFalse: [initialInteger]!
  106952.  
  106953. readFrom: aStream radix: anInteger
  106954.     "Instantiate a subinstance of the receiver from aStream using the specified
  106955.     radix, and answer it. 
  106956.     Note: This is intended for reading Integer's obeying Smalltalk syntax, not locale specific
  106957.     formats, and therefore it does not handle NLS characters (e.g. thousand separators)."
  106958.  
  106959.     | neg value |
  106960.     neg := aStream peekFor: $-.
  106961.     value := self readPositiveFrom: aStream radix: anInteger.
  106962.     ^neg ifTrue: [value negated] ifFalse: [value]!
  106963.  
  106964. readPositiveFrom: aStream radix: anInteger
  106965.     | value |
  106966.     value := 0.
  106967.     [aStream atEnd] whileFalse: 
  106968.             [| char digit |
  106969.             char := aStream next.
  106970.             ((digit := char digitValue) < anInteger and: [digit >= 0]) 
  106971.                 ifTrue: [value := value * anInteger + digit]
  106972.                 ifFalse: 
  106973.                     [aStream pop.
  106974.                     ^value]].
  106975.     ^value! !
  106976.  
  106977. !Integer methodsFor!
  106978.  
  106979. - operand
  106980.     "Answer a <number> which is the difference between the receiver and the argument, operand."
  106981.  
  106982.     ^operand subtractFromInteger: self!
  106983.  
  106984. & anInteger
  106985.     "Answer the result of a bitwise AND between the receiver and the argument, anInteger.
  106986.     N.B. Use of #bitAnd: is preferred (even though it is more typing) because it is
  106987.     a special selector (i.e. it is more compact and faster), and is portable."
  106988.  
  106989.     ^self bitAnd: anInteger!
  106990.  
  106991. * aNumber
  106992.     "Answer the result of multiplying the receiver by aNumber."
  106993.  
  106994.     ^aNumber multiplyByInteger: self!
  106995.  
  106996. / operand
  106997.     "Answer the <number> which is the result of dividing the receiver by <number>, operand. 
  106998.     If their is any remainder, then the result will be a <Fraction>. Raise a <ZeroDivide> 
  106999.     exception if the operand is zero."
  107000.  
  107001.     ^operand divideIntoInteger: self!
  107002.  
  107003. // aNumber
  107004.     "Answer the quotient resulting from dividing the receiver by aNumber with 
  107005.     truncation towards negative infinity."
  107006.  
  107007.     | quo |
  107008.     self isZero ifTrue: [^self].
  107009.     quo := self quo: aNumber.
  107010.     (quo negative    
  107011.         ifTrue: [quo * aNumber ~= self]
  107012.         ifFalse: [quo isZero and: [self negative ~= aNumber negative]])
  107013.                 ifTrue: [^quo - 1]
  107014.                 ifFalse: [^quo].
  107015. !
  107016.  
  107017. | anInteger
  107018.     "Answer the result of a bitwise OR between the receiver and the argument, 
  107019.     anInteger.
  107020.     N.B. Use of #bitOr: is preferred (even though it is more typing) because it is
  107021.     a special selector (i.e. it is more compact and faster), and is portable."
  107022.  
  107023.     ^self bitOr: anInteger!
  107024.  
  107025. + aNumber
  107026.     "Answer a Number which is the sum of the receiver and aNumber."
  107027.  
  107028.     ^aNumber addToInteger: self!
  107029.  
  107030. < aNumber
  107031.     "Answer whether the receiver is less than the argument, aNumber."
  107032.  
  107033.     ^aNumber greaterThanInteger: self!
  107034.  
  107035. << anInteger
  107036.     "Answer the result of shifting the receiver left anInteger bits.
  107037.     N.B. Use of #bitShift: is preferred (even though it is more typing) because it is
  107038.     a special selector (i.e. it is more compact and faster), and is portable."
  107039.  
  107040.     ^self bitShift: anInteger!
  107041.  
  107042. >> anInteger
  107043.     "Answer the result of shifting the receiver right anInteger bits.
  107044.     N.B. Use of #bitShift: (with a negative argument) is preferred (even 
  107045.     though it is more typing) because it is a special selector (i.e. it is 
  107046.     more compact and faster), and is portable."
  107047.  
  107048.     ^self bitShift: anInteger negated!
  107049.  
  107050. addToFloat: aFloat
  107051.     "Private - Add the receiver from the known Float, aFloat."
  107052.  
  107053.     ^aFloat + self asFloat!
  107054.  
  107055. addToFraction: aFraction
  107056.     "Private - Add the receiver to the known Fraction, aFraction.
  107057.     There is no need to normalise the result."
  107058.  
  107059.     ^Fraction
  107060.         numerator: self * aFraction denominator + aFraction numerator
  107061.         denominator: aFraction denominator!
  107062.  
  107063. allMask: mask
  107064.     "Answer whether all of the bits that are set in the <integer> mask are also set in 
  107065.     the receiver."
  107066.  
  107067.     ^(self bitAnd: mask) = mask!
  107068.  
  107069. anyMask: mask
  107070.     "Answer whether any of the bits that are set in the <integer> mask are also set 
  107071.     in the receiver."
  107072.  
  107073.     ^(self bitAnd: mask) ~= 0!
  107074.  
  107075. asBoolean
  107076.     "Answer whether the receiver is non-zero."
  107077.  
  107078.     ^self ~= 0
  107079. !
  107080.  
  107081. asCharacter
  107082.     "Answer the character whose Unicode code is the receiver."
  107083.  
  107084.     ^Character value: self
  107085. !
  107086.  
  107087. asDword
  107088.     "Answer the receiver as an unsigned double word value. Assumes the receiver is 
  107089.     a 32 bit integer.
  107090.     Implementation Note: LargeInteger constant receiver 
  107091.     to avoid always failing the SmallInteger bitAnd: primitive."
  107092.  
  107093.     ^16rFFFFFFFF bitAnd: self!
  107094.  
  107095. asExternalAddress
  107096.     "Answer the receiver as an ExternalAddress."
  107097.  
  107098.     ^VMLibrary default addressFromInteger: self!
  107099.  
  107100. asExternalHandle
  107101.     "Answer the receiver as an ExternalHandle.
  107102.     Implementation Note: Use the external call primitive coercion trick for speed."
  107103.  
  107104.     ^VMLibrary default handleFromInteger: self!
  107105.  
  107106. asFraction
  107107.     "Answer the normalized fractional representation of the receiver, in this
  107108.     case an exact representation."
  107109.  
  107110.     ^self!
  107111.  
  107112. asInteger
  107113.     "Answer the integer value of the receiver."
  107114.  
  107115.     ^self
  107116. !
  107117.  
  107118. asScaledDecimal: anInteger 
  107119.     "Answer a <ScaledDecimal> number, with the fractional precision 
  107120.     of 0 (i.e. the argument is effectively ignored). See ANSI 5.6.5.3 p127."
  107121.  
  107122.     ^ScaledDecimal newFromNumber: self scale: 0!
  107123.  
  107124. asSDword
  107125.     "Answer the receiver as an signed double word value. Assumes the receiver is 
  107126.     a 32 bit integer.
  107127.     Implementation Note: Get the external library primitive to perform the coercion
  107128.     for us."
  107129.  
  107130.     ^VMLibrary default signedFromUnsigned: self!
  107131.  
  107132. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣`▓▀6£ê₧╩╗Å**¿]L.o╚ⁿ[æⁿΘ█T■|─*ênò·\:Γh₧═J«Gg╝2└¢┴ └⌐gæ!
  107133.  
  107134. at: index
  107135.     "Answer the index'th byte of 2's complement representation of
  107136.     the receiver. e.g. 1 at: 1 = 1, -1 at: 1 = 255 (see also #byteAt:).
  107137.     Report an error if index is not greater than 0, but answer 0/255 if 
  107138.     index is greater than the size of the receiver as this is a sensible 
  107139.     action for Integers."
  107140.  
  107141.     ^index > 0 
  107142.         ifTrue: [(self bitShift: (1 - index) * 8) bitAnd: 255]
  107143.         ifFalse: [self errorSubscriptBounds: index]!
  107144.  
  107145. bitAnd: operand
  107146.     "Answer an <integer> whose bits are the logical AND of the
  107147.     receiver's bits and those of the <integer> argument, operand."
  107148.  
  107149.     ^self subclassResponsibility!
  107150.  
  107151. bitAt: index
  107152.     "Answer the <integer> 0 or 1 which is the binary value of the bit at 
  107153.     the <integer> position, index, in the receiver's 2's complement binary representation."
  107154.  
  107155.     ^(self bitAnd: (1 bitShift: index - 1)) == 0
  107156.         ifTrue: [0]
  107157.         ifFalse: [1]!
  107158.  
  107159. bitAt: index put: value
  107160.     "Set the binary value of the bit at the <integer> position, index, in the 
  107161.     receiver's 2's complement binary representation to the low-order bit
  107162.     of the <integer> argument, value.
  107163.     Note: Integers are immutable, so there is no effect on the receiver and the
  107164.     answer is a new integer."
  107165.  
  107166.     ^(self bitAnd: (1 bitShift: index-1) bitInvert)
  107167.         bitOr: ((value bitAnd: 1) bitShift: index - 1)!
  107168.  
  107169. bitInvert
  107170.     "Answer an integer whose bits are the complement of the receiver."
  107171.  
  107172.     ^-1 - self!
  107173.  
  107174. bitOr: operand
  107175.     "Answer an integer whose bits are the logical OR of the
  107176.     receiver's bits and those of the <integer> argument, operand."
  107177.  
  107178.     ^self subclassResponsibility!
  107179.  
  107180. bitShift: shift
  107181.     "Answer an <integer> which is the receiver shifted left by the
  107182.     <integer>, shift, number of bit positions if the operand is positive,     
  107183.     or shifted right for shift negated number of bit positions if the operand
  107184.     is negative."
  107185.  
  107186.     shift isInteger
  107187.         ifFalse: [self error: 'non-integer argument'].
  107188.     shift >= 0
  107189.         ifTrue: [^self * (2 raisedToInteger: shift)].
  107190.     ^self // (2 raisedToInteger: shift negated)!
  107191.  
  107192. bitXor: operand
  107193.     "Answer an <integer> whose bits are the logical XOR of the
  107194.     receiver's bits and those of the <integer> argument, operand"
  107195.  
  107196.     ^self subclassResponsibility!
  107197.  
  107198. byteSize
  107199.     "Private - Answer the number of bytes in the receiver's 2's complement
  107200.     representation."
  107201.  
  107202.     ^self subclassResponsibility!
  107203.  
  107204. ceiling
  107205.     "Answer the integer nearest the receiver toward positive infinity."
  107206.  
  107207.     ^self
  107208. !
  107209.  
  107210. clearBit: index
  107211.     "Answer the Integer which results from clearing the index'th bit of the receiver,
  107212.     where the least significant bit is considered to have index 1."
  107213.  
  107214.     ^self maskClear: (1 bitShift: index-1)!
  107215.  
  107216. coerce: anArithmeticValue
  107217.     "Private - Answer the Integer representation of anArithmeticValue."
  107218.  
  107219.     ^anArithmeticValue asInteger!
  107220.  
  107221. digitSize
  107222.     "Private - Answer the number of significant base-256 digits 
  107223.     in the receiver."
  107224.  
  107225.     ^self subclassResponsibility!
  107226.  
  107227. displayString
  107228.     "Answer a String whose characters are a representation of the receiver as a user
  107229.     would want to see it.
  107230.     Implementation Note: For Integers this is the same as the #printString, and for
  107231.     many cases that has an optimized implementation of which we wish to take
  107232.     advantage."
  107233.  
  107234.     ^self printString!
  107235.  
  107236. divideIntoFloat: aFloat
  107237.     "Private - Divide the receiver into the known Float, aFloat. Answer the result."
  107238.  
  107239.     ^aFloat / self asFloat!
  107240.  
  107241. divideIntoFraction: aFraction
  107242.     "Private - Answer the result of dividing the receiver into the argument, with
  107243.     truncation towards negative infinity. In general Integer division is more
  107244.     likely to be inexact, so assume a Fraction will be needed. The Fraction class
  107245.     instance creation method will answer an Integer if it can."
  107246.  
  107247.     ^Fraction
  107248.         rationalisedNumerator: aFraction numerator
  107249.         denominator: self * aFraction denominator!
  107250.  
  107251. divideIntoInteger: anInteger 
  107252.     "Private - Answer the result of dividing the receiver into the argument, with
  107253.     truncation towards negative infinity. In general Integer division is more
  107254.     likely to be inexact, so assume a Fraction will be needed. The Fraction class
  107255.     instance creation method will answer an Integer if it can."
  107256.  
  107257.     ^Fraction rationalisedNumerator: anInteger denominator: self!
  107258.  
  107259. even
  107260.     "Answer whether the receiver is an even integer. Zero is considered even.
  107261.     Override superclass as we've a more efficient implementation."
  107262.  
  107263.     ^(self bitAnd: 1) == 0!
  107264.  
  107265. factorial
  107266.     "Answer the <integer> factorial of the receiver. 
  107267.     The receiver must not be negative."
  107268.  
  107269.     ^self factorialIterative!
  107270.  
  107271. factorialIterative
  107272.     "Private - Answer the factorial of the receiver. The receiver must be not less than 0."
  107273.  
  107274.     | factorial |
  107275.     "self < 0
  107276.         ifTrue: [^self error: 'negative factorial' ]."
  107277.      factorial := 1.
  107278.     2 to: self asInteger do: [ :i | factorial := i * factorial ].
  107279.     ^factorial!
  107280.  
  107281. factorialRecursive
  107282.     "Private - Answer the factorial of the receiver. The receiver must be not less than 0.
  107283.     Likely to overflow stack for large receivers."
  107284.  
  107285.     self > 1
  107286.         ifTrue: [ ^(self - 1) factorialRecursive * self ].
  107287.     self < 0
  107288.         ifTrue: [ ^self error: 'negative factorial' ].
  107289.     ^1!
  107290.  
  107291. floor
  107292.     "Answer the integer nearest the receiver (i.e. the receiver)."
  107293.  
  107294.     ^self!
  107295.  
  107296. fractionPart
  107297.     "Answer a <number> of the same type as the receiver, representing the 
  107298.     fractional part of  the receiver."
  107299.  
  107300.     ^0!
  107301.  
  107302. gcd: operand 
  107303.     "Answer the greatest common divisor of the receiver and the <integer>, operand, computed 
  107304.     using Euclid's algorithm. See Knuth vol. II"
  107305.  
  107306.     | u v r |
  107307.     v := operand abs.
  107308.     u := self abs.
  107309.     [v == 0] whileFalse: [
  107310.         r := u \\ v.
  107311.         u := v.
  107312.         v := r].
  107313.     ^u!
  107314.  
  107315. gcdbin: operand 
  107316.     "Answer the greatest common divisor of the receiver and the <integer>, operand, computed 
  107317.     using Stein's binary algorithm. See Knuth vol. II"
  107318.  
  107319.     | k u v t |
  107320.     u := self abs.
  107321.     v := operand abs.
  107322.     k := 0.
  107323.     [u even and: [v even]] whileTrue: [
  107324.         k := k + 1. 
  107325.         u := u bitShift: -1.
  107326.         v := v bitShift: -1].
  107327.     u even
  107328.         ifTrue: [t := u bitShift: -1] 
  107329.         ifFalse: [t := v negated].
  107330.     [
  107331.         [t even] whileTrue: [t := t bitShift: -1].
  107332.         t > 0 ifTrue: [u := t] ifFalse: [v := t negated].
  107333.         t := u - v.
  107334.         t == 0] whileFalse.
  107335.     ^u bitShift: k!
  107336.  
  107337. greaterThanFloat: aFloat
  107338.     "Private - Answer whether the receiver is greater than the known Float, aFloat."
  107339.  
  107340.     ^aFloat < self asFloat!
  107341.  
  107342. greaterThanFraction: aFraction
  107343.     "Private - Answer whether the receiver is greater than the known Fraction, aFraction"
  107344.  
  107345.     ^aFraction numerator < (self * aFraction denominator)!
  107346.  
  107347. hash
  107348.     "Answer the <integer> hash value of the receiver."
  107349.  
  107350.     "Implementation Note: In order to satisfy the invariant that Floats that compare
  107351.     equal also have the same hash, we have to limit the precision of the hash by using 
  107352.     only the top hashBits bits of the absolute value of the receiver, xor'ing in the shift
  107353.     as a way of taking some account of the magnitude of the receiver.
  107354.     Thanks to John Brant for contributing this hash function."
  107355.  
  107356.     | bitCount shiftDistance |
  107357.     self negative ifTrue: [^self negated hash negated].
  107358.     bitCount := self highBit.
  107359.     ^bitCount > self hashBits 
  107360.         ifTrue: 
  107361.             [| value |
  107362.             shiftDistance := self hashBits - bitCount + 1.
  107363.             value := (self bitShift: shiftDistance) + 1 bitShift: -1.
  107364.             value highBit > self hashBits 
  107365.                 ifTrue: [(value bitShift: -1) bitXor: (shiftDistance - 1) abs]
  107366.                 ifFalse: [value bitXor: shiftDistance abs]]
  107367.         ifFalse: [self]!
  107368.  
  107369. hex
  107370.     "Answer a <readableString> whose characters are a description of 
  107371.     the receiver in the hexadecimal."
  107372.  
  107373.     ^self printStringRadix: 16 showRadix: true!
  107374.  
  107375. highBit
  107376.     "Answer the <integer> index of the most significant non-zero bit of the binary 
  107377.     representation of the receiver.
  107378.     N.B. This operation is not defined for negative integers."
  107379.  
  107380.     ^self highByte highBit + (self digitSize - 1 bitShift: 3)!
  107381.  
  107382. highByte
  107383.     "Private - Answer the most significant radix-256 digit of the receiver."
  107384.  
  107385.     ^self byteAt: self digitSize!
  107386.  
  107387. highSWord
  107388.     "Answers the high order signed word of the receiver (assumes the receiver is a 32-bit Integer)."
  107389.  
  107390.     ^(DWORD fromInteger: self) highSWord
  107391. !
  107392.  
  107393. highWord
  107394.     "Answers the high order unsigned word of the receiver (assumes the receiver is a 32-bit Integer)."
  107395.  
  107396.     ^(self bitShift: -16) bitAnd: 16rFFFF!
  107397.  
  107398. integerPart
  107399.     "Answer an <integer> representing the whole integer part of the receiver."
  107400.  
  107401.     ^self!
  107402.  
  107403. isBitSet: index
  107404.     "Answer whether the index'th bit of the receiver is set (has the value 1), 
  107405.     where the least significant bit is considered to have index 1."
  107406.  
  107407.     ^self anyMask: (1 bitShift: index-1)!
  107408.  
  107409. isInteger
  107410.     "Answer whether the receiver is an <integer>."
  107411.  
  107412.     ^true!
  107413.  
  107414. isNull
  107415.     "Answer whether the receiver is 'null' (equal to zero)."
  107416.  
  107417.     ^self == 0!
  107418.  
  107419. isSDWORD
  107420.     "Answer whether the receiver can be represented as a 32-bit two's complement
  107421.     signed integer (i.e. as an SDWORD)."
  107422.  
  107423.     ^self >= ##(-2 raisedToInteger: 31) and: [self < ##(2 raisedToInteger: 31)]
  107424. !
  107425.  
  107426. lcm: anInteger 
  107427.     "Answer the least common multiple of the receiver and the <integer> argument."
  107428.  
  107429.     | gcd |
  107430.     anInteger = 0 ifTrue: [^0].
  107431.     gcd := self gcd: anInteger.
  107432.     ^gcd == 0 ifTrue: [1] ifFalse: [(self // gcd * anInteger) abs]!
  107433.  
  107434. lowBit
  107435.     "Answer the index of the lowest order bit of the receiver which is set."
  107436.  
  107437.     | byte |
  107438.     1 to: self basicSize
  107439.         do: 
  107440.             [:i | 
  107441.             byte := self byteAt: i.
  107442.             byte == 0 ifFalse: [^byte lowBit + ((i - 1) * 8)]].
  107443.     ^0!
  107444.  
  107445. lowSWord
  107446.     "Answers the low order signed word of the receiver (assumes the receiver is a 32-bit Integer)."
  107447.  
  107448.     ^(DWORD fromInteger: self) lowSWord
  107449. !
  107450.  
  107451. lowWord
  107452.     "Answers the low order word of the receiver."
  107453.  
  107454.     ^self bitAnd: 16rFFFF.!
  107455.  
  107456. mask: integerMask set: aBoolean
  107457.     "Answer the result of setting/resetting the specified mask in the receiver."
  107458.  
  107459.     ^aBoolean 
  107460.         ifTrue: [self maskSet: integerMask]
  107461.         ifFalse: [self maskClear: integerMask]
  107462. !
  107463.  
  107464. maskClear: anInteger
  107465.     "Answer a copy of the receiver with the bits of the argument, anInteger, masked out."
  107466.  
  107467.     ^self bitAnd: anInteger bitInvert!
  107468.  
  107469. maskSet: anInteger
  107470.     "Answer a copy of the receiver with the bits of the argument, anInteger, masked in"
  107471.  
  107472.     ^self bitOr: anInteger!
  107473.  
  107474. multiplyByFloat: aFloat
  107475.     "Private - Multiply the receiver by the known Float, aFloat. Answer the result."
  107476.  
  107477.     ^aFloat * self asFloat!
  107478.  
  107479. multiplyByFraction: aFraction
  107480.     "Private - Answer the result of multiplying the receiver by the known Fraction, aFraction."
  107481.  
  107482.     ^Fraction
  107483.         rationalisedNumerator: self * aFraction numerator
  107484.         denominator: aFraction denominator!
  107485.  
  107486. negated
  107487.     "Answer a <number> of the same type of the receiver
  107488.     which is its negation.
  107489.  
  107490.     Implementation Note: Overridden purely for improved performance."
  107491.  
  107492.     ^0 - self!
  107493.  
  107494. negative
  107495.     "Answer whether the receiver is a negative number.
  107496.     Implementation Note: Override for performance only."
  107497.  
  107498.     ^self < 0!
  107499.  
  107500. noMask: mask
  107501.     "Answer whether none of the bits that are set in the <integer> argument, mask,
  107502.     are also set in the receiver."
  107503.  
  107504.     ^(self bitAnd: mask) == 0!
  107505.  
  107506. normalize
  107507.     "Private - Answer the receiver in its minimal representation (i.e. itself)."
  107508.  
  107509.     ^self!
  107510.  
  107511. notNull
  107512.     "Answer whether the receiver is not 'null' (not equal to zero)"
  107513.     
  107514.     ^(self == 0) == false!
  107515.  
  107516. printDigitsOn: aStream base: anInteger
  107517.     "Private - Recursively print the digits of the receiver in base anInteger to aStream.
  107518.     N.B. The receiver MUST be positive for this to work correctly."
  107519.  
  107520.     self printDigitsOnBody: aStream base: anInteger!
  107521.  
  107522. printDigitsOnBody: aStream base: anInteger
  107523.     "Private - Recursively print the digits of the receiver in base anInteger to aStream.
  107524.     N.B. The receiver MUST be positive for this to work correctly."
  107525.  
  107526.     self >= anInteger ifTrue: [self // anInteger printDigitsOnBody: aStream base: anInteger].
  107527.     aStream nextPut: (Character digitValue: self \\ anInteger)!
  107528.  
  107529. printOn: aStream
  107530.     "Append the ASCII representation of the receiver to aStream.
  107531.     Although not strictly part of the ANSI protocol <number>, this method is the
  107532.     means by which Integer complies with that protocol in order to produce
  107533.     a literal representation of the receiver."
  107534.  
  107535.     self printOn: aStream base: 10 showRadix: false!
  107536.  
  107537. printOn: output base: base
  107538.     "Append a text representation of the receiver on the <puttableStream>, output,
  107539.     in the specified <integer> base with a radix prefix."
  107540.  
  107541.     self printOn: output base: base showRadix: true!
  107542.  
  107543. printOn: output base: base showRadix: flag
  107544.     "Append a text representation of the receiver on the <puttableStream>, output,
  107545.     in the specified <integer> base, showing a radix prefix if requested."
  107546.  
  107547.     self negative
  107548.         ifTrue: [ 
  107549.             output nextPut: $-.
  107550.             self negated printOn: output base: base showRadix: flag]
  107551.         ifFalse: [
  107552.             flag ifTrue: [base printOn: output. output nextPut: $r].
  107553.             self printDigitsOn: output base: base]!
  107554.  
  107555. printStringRadix: base
  107556.     "Answer a <readableString> whose characters are a description of 
  107557.     the receiver in the specified <integer> radix."
  107558.  
  107559.     ^self printStringRadix: base showRadix: true!
  107560.  
  107561. printStringRadix: base showRadix: flag
  107562.     "Answer a String which represents the receiver in the radix, base (an Integer).
  107563.     The radix prefix is included if the boolean flag is true."
  107564.  
  107565.     | aStream |
  107566.     aStream := String writeStream: 16.
  107567.     self printOn: aStream base: base showRadix: flag.
  107568.     ^aStream contents
  107569. !
  107570.  
  107571. quo: aNumber
  107572.     "Answer the integer quotient of the receiver divided by aNumber with 
  107573.     truncation toward zero (i.e. like C integer division)."
  107574.  
  107575.     ^(self quoAndRem: aNumber) basicAt: 1
  107576. !
  107577.  
  107578. rounded
  107579.     "Answer the integer nearest the receiver."
  107580.  
  107581.     ^self
  107582. !
  107583.  
  107584. setBit: index
  107585.     "Answer the Integer which results from setting the index'th bit of the receiver,
  107586.     where the least significant bit is considered to have index 1."
  107587.  
  107588.     ^self maskSet: (1 bitShift: index-1)!
  107589.  
  107590. subtractFromFloat: aFloat
  107591.     "Private - Subtract the receiver from the known Float, aFloat, and answer the result."
  107592.  
  107593.     ^aFloat - self asFloat!
  107594.  
  107595. subtractFromFraction: aFraction
  107596.     "Private - Subtract the receiver from the known fraction, aFraction and answer the result.
  107597.     There is no need to normalise the result."
  107598.  
  107599.     ^Fraction
  107600.         numerator: aFraction numerator - (self * aFraction denominator)
  107601.         denominator: aFraction denominator!
  107602.  
  107603. timesRepeat: aBlock
  107604.     "Evaluate aBlock repeatedly, once for each integer from 1 to the floor of 
  107605.     the receiver. Note that this message is normally optimised by the Compiler."
  107606.  
  107607.     1 to: self do: [:i | aBlock value]!
  107608.  
  107609. truncated
  107610.     "Answer the integer nearest the receiver toward zero."
  107611.  
  107612.     ^self
  107613. ! !
  107614.  
  107615. ScaledDecimal comment:
  107616. 'ScaledDecimal is a Number class to represent fixed point decimal numbers. It supports unbounded precision, with no practical limit to the number of digits before and after the decimal point.
  107617.  
  107618. ScaledDecimal conforms to the following ANSI protocols:
  107619.     Float
  107620.     magnitude
  107621.     number
  107622.     Object
  107623.     rational
  107624.     scaledDecimal
  107625.  
  107626. A ScaledDecimal represents a value as a Fraction and the number of digits after the decimal point. This representation allows us to take advantage of the implementation of unbounded rational numbers provided by Fraction with very small amount of simple code.
  107627.  
  107628. We are grateful to Richard A. Harmon for contributing his ANSI compliant ScaledDecimal implementation from which this class was derived.
  107629. '!
  107630. !ScaledDecimal class methodsFor!
  107631.  
  107632. icon
  107633.     "Answers an Icon that can be used to represent this class"
  107634.  
  107635.     ^##(self) defaultIcon!
  107636.  
  107637. newFromNumber: aNumber scale: scaleInteger
  107638.     "Answer a new instance of me."
  107639.  
  107640.     ^self basicNew
  107641.         setFraction: aNumber asFraction scale: scaleInteger;
  107642.         yourself!
  107643.  
  107644. one
  107645.     "Answer the receiver's representation of one."
  107646.  
  107647.     ^self
  107648.         newFromNumber: 1
  107649.         scale: 0!
  107650.  
  107651. zero
  107652.     "Answer the receiver's representation of zero."
  107653.  
  107654.     ^self
  107655.         newFromNumber: 0
  107656.         scale: 0
  107657. ! !
  107658.  
  107659. !ScaledDecimal methodsFor!
  107660.  
  107661. - operand
  107662.     "Answer the difference between the receiver and the <number>
  107663.     argument, operand."
  107664.  
  107665.     ^operand subtractFromScaledDecimal: self!
  107666.  
  107667. * operand
  107668.     "Answer the result of multiplying the receiver by the <number>
  107669.     argument, operand."
  107670.  
  107671.     ^operand multiplyByScaledDecimal: self!
  107672.  
  107673. / operand
  107674.     "Answer the result of dividing the receiver by <number> argument, 
  107675.     operand. Raise a <ZeroDivide> exception if the operand is zero."
  107676.  
  107677.     ^operand divideIntoScaledDecimal: self!
  107678.  
  107679. // operand
  107680.     "Answer the <integer> quotient defined by division with truncation toward
  107681.     negative infinity of the receiver by the <number> operand; 
  107682.     e.g. 7 // 2 = 1, -7 // 2 = -4. 
  107683.     Raise a ZeroDivide exception if the operand is zero."
  107684.  
  107685.     ^fraction // operand!
  107686.  
  107687. + operand
  107688.     "Answer the sum of the receiver and the <number> argument, 
  107689.     operand."
  107690.  
  107691.     ^operand addToScaledDecimal: self
  107692. !
  107693.  
  107694. < operand
  107695.     "Answer whether the receiver is less than the <number>, operand."
  107696.  
  107697.     ^operand greaterThanScaledDecimal: self
  107698. !
  107699.  
  107700. addToScaledDecimal: operand
  107701.     "Private - Answer the <ScaledDecimal> result of adding the receiver
  107702.     to the known <ScaledDecimal>."
  107703.  
  107704.     ^self species
  107705.         newFromNumber: operand asFraction + fraction
  107706.         scale: (self scale max: operand scale)!
  107707.  
  107708. asFloat
  107709.     "Answer the receiver represented as the nearest possible <Float>."
  107710.  
  107711.     ^fraction asFloat
  107712. !
  107713.  
  107714. asFraction
  107715.     "Answer an <integer> or <fraction> approximating the receiver."
  107716.  
  107717.     ^fraction!
  107718.  
  107719. asScaledDecimal: newScale
  107720.     "Answer a new <ScaledDecimal>, with a fractional precision of scale, 
  107721.     which most nearly approximates the receiver."
  107722.  
  107723.     ^self species
  107724.         newFromNumber: fraction
  107725.         scale: newScale!
  107726.  
  107727. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òΓ─äaj₧ò⌠%3ZS┬û;AÆQP+zR\eO∙ç^Mn#▒yPo½╜%ΦÉ/j┴ò╕è Å**¿Wg@&c╧«7á╩┘öùVCÜ|ÆX│(╤pcI,°tÜ═ƒMz║.╟╥╫∙îôpë܃╖y ºⁿVH▒`Ç·'₧╦WΓ#═K╬ßmi°╘8├y╔;┤╬├ "τπ·≈⌠F╜·sU╛ε╖K%TTa7╬ φppF╚─ê¡\-/@M╓äc╦I╓∙┼╒ûφ⌐┴└ò,░ú┼─;R│<∩}K¼≤¬1à8¿áíº■f»û╦πU┤Z╙σ6╞ε⌡▐)\E;¬Z∙₧D|₧!!ì]┌G!
  107728.  
  107729. coerce: coercee
  107730.     "Private - Coerce the <ArithmeticValue>, coercee, which must be of a lower generality than the receiver, to be the 
  107731.     same type as the receiver."
  107732.  
  107733.     ^coercee asScaledDecimal: scale
  107734. !
  107735.  
  107736. denominator
  107737.     "Answer the <integer> denominator of the receiver."
  107738.  
  107739.     ^fraction denominator
  107740. !
  107741.  
  107742. displayOn: target
  107743.     "Append, to the <puttableStream, aStream, a String whose characters are a 
  107744.     representation of the receiver as a user would want to see it."
  107745.  
  107746.     | scaler quoRem num denom scaled |
  107747.     scaler := 10 raisedToInteger: scale.
  107748.     num := fraction numerator.
  107749.     denom := fraction denominator.
  107750.     scaled := num * scaler + (denom bitShift: -1) // denom.
  107751.     num negative ifTrue: [target nextPut: $-. scaled := scaled negated].
  107752.     quoRem := scaled quoAndRem: scaler.
  107753.     (quoRem at: 1) printOn: target.
  107754.     scale > 0 ifTrue: [ | rem |
  107755.         target nextPut: $..
  107756.         scale timesRepeat: [
  107757.             rem := (quoRem at: 2) * 10.
  107758.             quoRem := rem quoAndRem: scaler.
  107759.             target nextPut: (Character digitValue: (quoRem at: 1))]]!
  107760.  
  107761. divideIntoScaledDecimal: operand
  107762.     "Private - Answer the result of dividing the known <ScaledDecimal>, operand, by the receiver."
  107763.  
  107764.     ^self species
  107765.         newFromNumber: operand asFraction / fraction
  107766.         scale: (scale max: operand scale)!
  107767.  
  107768. fractionPart
  107769.     "Answer a <number> of the same type as the receiver, representing the 
  107770.     fractional part of  the receiver."
  107771.  
  107772.     ^self species
  107773.         newFromNumber: fraction fractionPart
  107774.         scale: scale!
  107775.  
  107776. generality
  107777.     "Private - Answer the Smalltalk generality of the receiver, used for performing type conversions.
  107778.     ScaledDecimals are considered more general than Fractions but less general than Floats."
  107779.  
  107780.     "There is some controversy as to whether this is the correct generality for ScaledDecimals.
  107781.     Theoretically ScaledDecimals are more general than Floats, however traditionally Floats
  107782.     have been considered more general than Fractions although they clearly aren't (perhaps
  107783.     this arrangement was chosen for reasons of efficiency). Therefore making ScaledDecimals
  107784.     sit in between fits with the historic arrangements. It may be that the whole scheme needs to
  107785.     be altered for ANSI compatibility (or that the ANSI standard needs to be altered for
  107786.     compatibility with existing applications)."
  107787.  
  107788.     ^35!
  107789.  
  107790. greaterThanScaledDecimal: comperand
  107791.     "Private - Answer whether the receiver is greater than the known <ScaledDecimal>, comperand."
  107792.  
  107793.     ^comperand asFraction < fraction!
  107794.  
  107795. hash
  107796.     "Answer the <integer> hash value for the receiver." 
  107797.  
  107798.     ^fraction hash
  107799. !
  107800.  
  107801. integerPart
  107802.     "Answer a <ScaledDecimal> representing the integral part of the receiver."
  107803.  
  107804.     ^self species
  107805.         newFromNumber: fraction integerPart
  107806.         scale: scale!
  107807.  
  107808. isZero
  107809.     "Answer whether the receiver is equal to its class' zero"
  107810.  
  107811.     ^fraction isZero!
  107812.  
  107813. multiplyByScaledDecimal: operand
  107814.     "Private - Multiply the receiver by the known <ScaledDecimal>, operand,
  107815.     answering the result."
  107816.  
  107817.     ^self species
  107818.         newFromNumber: operand asFraction * fraction
  107819.         scale: (scale max: operand scale)!
  107820.  
  107821. negated
  107822.     "Answer a <number> of the same type of the receiver
  107823.     which is its negation."
  107824.  
  107825.     ^self species
  107826.         newFromNumber: fraction negated
  107827.         scale: scale!
  107828.  
  107829. numerator
  107830.     "Answer the <integer> numerator of the receiver."
  107831.  
  107832.     ^fraction numerator
  107833. !
  107834.  
  107835. printOn: target
  107836.     "Append, to the <puttableStream>, target, a string whose characters are a 
  107837.     the same as those which would result from sending a #printString
  107838.     message to the receiver."
  107839.  
  107840.     self displayOn: target.
  107841.     target nextPut: $s!
  107842.  
  107843. raisedToInteger: operand
  107844.     "Answer the receiver raised to the <integer> power, operand."
  107845.  
  107846.     ^self species
  107847.         newFromNumber: (fraction raisedToInteger: operand)
  107848.         scale: self scale
  107849. !
  107850.  
  107851. reciprocal
  107852.     "Answer a <ScaledDecimal> which is the reciprocal of the receiver (i.e. 1/receiver).
  107853.     Raise a ZeroDivide exception if the receiver is zero.
  107854.     Implementation Note: Override because we can implement this much more
  107855.     efficiently by simply flipping over our Fraction (done in its own efficient reciprocal)."
  107856.  
  107857.     ^self species
  107858.         newFromNumber: fraction reciprocal
  107859.         scale: scale
  107860. !
  107861.  
  107862. scale
  107863.     "Answer an <integer> which represents the total number of digits used to 
  107864.     represent the fraction part of the receiver, including trailing zeroes."
  107865.  
  107866.     ^scale
  107867. !
  107868.  
  107869. setFraction: f scale: s
  107870.     "Private - Initialize the receiver's identity variables."
  107871.  
  107872.     fraction := f.
  107873.     scale := s.
  107874. !
  107875.  
  107876. subtractFromScaledDecimal: operand
  107877.     "Private - Answer the result of subtracting the receiver from the 
  107878.     known <ScaledDecimal>, operand."
  107879.  
  107880.     ^self species
  107881.         newFromNumber: operand asFraction - fraction
  107882.         scale: (scale max: operand scale)!
  107883.  
  107884. truncated
  107885.     "Answer the <integer> nearest the receiver toward zero."
  107886.  
  107887.     ^fraction truncated
  107888. ! !
  107889.  
  107890. LargeInteger comment:
  107891. 'Class LargeInteger is the class of Integers which are outside the range of SmallIntegers (i.e. outside (SmallInteger minimum..SmallInteger maximum). Basically any Integer requiring more than 31-bits to be represented in 2''s complement will be a LargeInteger.
  107892.  
  107893. LargeIntegers in Dolphin do not follow the standard signed-magnitude radix-256 Smalltalk representation, with separate subclasses for positive and negative integers. Dolphin''s LargeIntegers follow standard machine representation, in that they are 2''s complement, 32-bit granular (i.e. they might have 32, 64, 96, ...n*32 bits). This representation has the dual advantages of higher performance, and simplified external interfacing. In particular the 32 and 64-bit Integers have the same representation externally as they do in Dolphin.
  107894.  
  107895. LargeInteger includes high performance primitive implementations for the common arithmetical operations and bit manipulations.'!
  107896. !LargeInteger class methodsFor!
  107897.  
  107898. fromBytes: bytes
  107899.     "Answer an instance of the receiver instantiated from the the byte object, bytes,
  107900.     which is assumed to contain a positive Integer magnitude."
  107901.  
  107902.     | size answer |
  107903.     size := bytes size.
  107904.     answer := self basicNew: (size roundUpTo: 4) + 4.
  107905.     1 to: size do: [:i | answer basicAt: i put: (bytes basicAt: i)].
  107906.     ^answer normalize!
  107907.  
  107908. fromSmallInteger: anInteger
  107909.     "Private - Answer an instance of the receiver representing the SmallInteger value,
  107910.     anInteger. Note that the result is NOT normalized, as otherwise the answer
  107911.     would just be the SmallInteger!! Because the answer is not normalized, it is
  107912.     not strictly a valid LargeInteger in all circumstances, hence this routine is 
  107913.     private."
  107914.  
  107915.     ^(self basicNew: 4)
  107916.         sdwordAtOffset: 0 put: anInteger;
  107917.         yourself!
  107918.  
  107919. new: anInteger
  107920.     "Private - Answer a new LargeInteger of the requested number of 32-bit digits."
  107921.  
  107922.     ^self basicNew: (anInteger bitShift: 2)!
  107923.  
  107924. new64
  107925.     "Private - Answer a new 64-bit LargeInteger.
  107926.     N.B. The answer is not a valid LargeInteger since zero is a SmallInteger."
  107927.  
  107928.     ^self basicNew: 8! !
  107929.  
  107930. !LargeInteger methodsFor!
  107931.  
  107932. - operand
  107933.     "Answer a <number> which is the difference between the receiver and the <number> argument, 
  107934.     operand."
  107935.  
  107936.     <primitive: 22>
  107937.     ^operand subtractFromInteger: self!
  107938.  
  107939. * operand
  107940.     "Answer the <number> result of multiplying the receiver by 
  107941.     the <number> argument, operand."
  107942.  
  107943.     <primitive: 29>
  107944.     ^operand multiplyByInteger: self!
  107945.  
  107946. / operand
  107947.     "Answer the <number> which is the result of dividing the receiver by <number> argument, 
  107948.     operand. If their is any remainder, then the result will be a <Fraction>. Raise a <ZeroDivide> 
  107949.     exception if the operand is zero."
  107950.  
  107951.     <primitive: 30>
  107952.     ^operand divideIntoInteger: self!
  107953.  
  107954. // operand
  107955.     "Answer a <number> which is the quotient resulting from dividing the receiver 
  107956.     by the <number> argument, operand,  with truncation towards negative infinity."
  107957.  
  107958.     <primitive: 32>
  107959.     ^super // operand!
  107960.  
  107961. \\ operand
  107962.     "Answer the <integer> remainder defined by division with truncation toward negative 
  107963.     infinity; e.g. 7 \\ 2 = 1, -7 \\ 2 = 1, 7 \\ -2 = -1. 
  107964.     This is the modulo operation, but it is not the same as C modulo (%) which truncates 
  107965.     towards zero (use #mod:). Report an error if the aNumber is zero."
  107966.  
  107967.     <primitive: 31>
  107968.     ^super \\ operand!
  107969.  
  107970. + operand
  107971.     "Answer a <number> which is the sum of the receiver and 
  107972.     the <number> argument, operand."
  107973.  
  107974.     <primitive: 21>
  107975.     ^operand addToInteger: self!
  107976.  
  107977. < operand
  107978.     "Answer whether the receiver is less than the <number>, operand."
  107979.  
  107980.     <primitive: 23>
  107981.     ^super < operand!
  107982.  
  107983. <= operand
  107984.     "Answer whether the receiver is less than or equal to the <number>, operand."
  107985.  
  107986.     <primitive: 25>
  107987.     ^super <= operand!
  107988.  
  107989. = comperand
  107990.     "Answer whether the receiver is equal to the <Object>, comperand."
  107991.  
  107992.     <primitive: 27>
  107993.     ^super = comperand!
  107994.  
  107995. > operand
  107996.     "Answer whether the receiver is greater than the <number>, operand."
  107997.  
  107998.     <primitive: 24>
  107999.     ^super > operand!
  108000.  
  108001. >= aNumber
  108002.     "Answer whether the receiver is greater than or equal to aNumber."
  108003.  
  108004.     <primitive: 26>
  108005.     ^super >= aNumber!
  108006.  
  108007. addToInteger: anInteger
  108008.     "Private - Add the receiver to the known Integer, anInteger. 
  108009.     We should only normally get here if anInteger is a SmallInteger.
  108010.     Implementation Notes: As addition is commutative we can use the 
  108011.     large integer add primitive. We do not supersend if the primitive
  108012.     fails because it does not fail for Integer arguments, and a non-Integer
  108013.     argument breaks the preconditions of this method.
  108014.  
  108015.     Primitive Failure Reasons:
  108016.         0    - anInteger is not an Integer.
  108017.     "
  108018.  
  108019.     <primitive: 21>
  108020.     ^self primitiveFailed!
  108021.  
  108022. asFloat
  108023.     "Answer the floating point representation of the receiver. Some precision 
  108024.     may be lost.
  108025.  
  108026.     Primitive Failure Reasons:
  108027.         1    -     The receiver has more than 64-bits
  108028.     "
  108029.  
  108030.     | result |
  108031.     <primitive: 167>
  108032.     result := 0.0.
  108033.     self basicSize to: 1 by: -1 do: [ :i | result := result * 256.0 + (self byteAt: i) asFloat].
  108034.     ^result!
  108035.  
  108036. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣`▓▀6£ê₧╞╛üqt■]J@gsÜ╜cr½█╥VZ╒òVaªF÷oò∙XY *ímî₧MôM4á.╘ùâΓ├αqìMì₧ân
  108037. ╜⌠YPºdJrî»eèÆ]εU<é╖|₧G╟±Y≡kOε ±┌æKyƒ»Ω∙σ/ªαe[╝≥ΦJ`JS!
  108038.  
  108039. at: index
  108040.     "Answer the index'th byte of 2's complement representation of
  108041.     the receiver. 
  108042.     As Dolphin LargeIntegers are stored directly in 2's complement
  108043.     32-bit digits, we can make use of the standard byte accessing
  108044.     primitive, passing potential out of bounds accesses to the superclass
  108045.     implementation."
  108046.  
  108047.     <primitive: 60>
  108048.     ^super at: index!
  108049.  
  108050. bitAnd: mask
  108051.     "Answer an integer whose bits are the logical AND of the
  108052.     bits of the 2's complement representation of the receiver and 
  108053.     the bits of the 2's complement representation of the Integer 
  108054.     argument, mask. Note that this implies sign extension of the
  108055.     shorter of the two operands.
  108056.  
  108057.     Implementation Note: Because Dolphin Integers are always represented
  108058.     in 2's complement, this is a very fast operation.
  108059.     
  108060.     Primitive Failure Reasons:
  108061.         0    -    The argument is not an Integer (large or small).
  108062.     "
  108063.  
  108064.     <primitive: 34>
  108065.     ^self primitiveFailed!
  108066.  
  108067. bitInvert
  108068.     "Answer an integer whose bits are the complement of the receiver."
  108069.  
  108070.     <primitive: 38>
  108071.     ^self primitiveFailed!
  108072.  
  108073. bitOr: anInteger
  108074.     "Answer an integer whose bits are the logical OR of the
  108075.     receiver's bits and those of the argument, anInteger.
  108076.  
  108077.     Primitive Failure Reasons:
  108078.         0    -    The argument is not an Integer (large or small).
  108079.     "
  108080.  
  108081.     <primitive: 35>
  108082.     ^self primitiveFailed!
  108083.  
  108084. bitShift: delta
  108085.     "Answer an integer which is the receiver bits shifted by the
  108086.     SmallInteger argument, delta, bit positions. The shift direction
  108087.     is left if delta is positive, or right if delta is negative).
  108088.     Note that the shift is arithmetic, rather than logical, so sign
  108089.     bits are shifted in from the left on right shifts.
  108090.  
  108091.     Primitive Failure Reasons:
  108092.         0    - Argument, delta, is not a SmallInteger
  108093.  
  108094.     The superclass implementation is relatively slow, but does support 
  108095.     LargeInteger deltas!! However, it is rather unlikely you will have
  108096.     enough memory to store the result (you'll need 256Mb or more)."
  108097.  
  108098.     <primitive: 37>
  108099.     ^super bitShift: delta!
  108100.  
  108101. bitXor: anInteger
  108102.     "Answer an integer whose bits are the logical XOR of the
  108103.     receiver's bits and those of the argument, anInteger.
  108104.  
  108105.     Primitive Failure Reasons:
  108106.         0    -    The argument is not an Integer (large or small).
  108107.     "
  108108.  
  108109.     <primitive: 36>
  108110.     ^self primitiveFailed!
  108111.  
  108112. byteAt: index
  108113.     "Private - Answer the byte (radix 256 digit) at index in the receiver.
  108114.     Note that the receiver is in two's complement representation, so
  108115.     the answer may be negative."
  108116.  
  108117.     | size answer |
  108118.     size := self basicSize.
  108119.     ^index < size
  108120.         ifTrue: [super basicAt: index]
  108121.         ifFalse: [
  108122.             (index == size)
  108123.                 ifTrue: [
  108124.                     answer := super basicAt: index.
  108125.                     answer > 127
  108126.                         ifTrue: [answer - 256]
  108127.                         ifFalse: [answer]]
  108128.                 ifFalse: [self signBit * -1]].
  108129.  
  108130.     #todo "Either remove or implement more efficiently (may be useful for Smalltalk LI algorithms"!
  108131.  
  108132. byteSize
  108133.     "Private - Answer the number of bytes in the receiver's 2's complement
  108134.     representation."
  108135.  
  108136.     ^self basicSize!
  108137.  
  108138. digitSize
  108139.     "Answer the number of significant radix-256 digits necessary to
  108140.     represent the absolute magnitude of the receiver."
  108141.  
  108142.     | size signByte abs |
  108143.     abs := self abs.
  108144.     size := abs basicSize.
  108145.     signByte := 0.
  108146.     [(abs basicAt: size) == signByte and: [size > 0]] whileTrue: [size := size - 1].
  108147.     ^size!
  108148.  
  108149. dwordAtOffset: anInteger
  108150.     "Private - Answer the unsigned 4 byte integer at offset (i.e. zero relative) 
  108151.     anInteger in the receiver.
  108152.  
  108153.     Primitive failure reasons:
  108154.         0 -    anInteger is not a SmallInteger
  108155.         1 -    anInteger is out of bounds (not in the range 1..receiver's size - 4)."
  108156.  
  108157.     <primitive: 120>
  108158.     ^self primitiveFailed!
  108159.  
  108160. dwordAtOffset: anInteger put: anObject
  108161.     "Private - Store an unsigned 4 byte value at byte offset anInteger 
  108162.     within the receiver.
  108163.  
  108164.     Primitive failure reasons:
  108165.         0 -    anInteger is not a SmallInteger
  108166.         1 -    anInteger is out of bounds (not in the range 1..receiver's size - 4).
  108167.         2 -    anObject is not a SmallInteger or a 4-byte object
  108168.  
  108169.     Should the primitive fail, then the Smalltalk backup code may still be able
  108170.     to store down the value, but it will be slower."
  108171.     
  108172.     <primitive: 121>
  108173.     ^anObject isInteger 
  108174.         ifTrue: [self primitiveFailed]
  108175.         ifFalse: [self dwordAtOffset: anInteger put: anObject asInteger]!
  108176.  
  108177. generality
  108178.     "Private - Answer the generality of the receiver in the Smalltalk number system.
  108179.     Integers are the lowest generalities (20 Large, 10 Small)."
  108180.  
  108181.     ^20!
  108182.  
  108183. greaterThanInteger: anInteger
  108184.     "Private - Answer whether the receiver is greater than the known integer, anInteger."
  108185.  
  108186.     <primitive: 24>
  108187.     ^super greaterThanInteger: anInteger!
  108188.  
  108189. hash
  108190.     "Answer the <integer> hash value of the receiver."
  108191.  
  108192.     "Implementation Note: It is assumed here that #hashBits must be >= 30 (the minimum 
  108193.     LargeInteger is (2**30), and in fact hashBits should be = 30 for the result to be a SmallInteger."
  108194.  
  108195.     | shiftDistance highBits |
  108196.     self negative ifTrue: [^self negated hash negated].
  108197.     shiftDistance := self hashBits - self highBit + 1.
  108198.     highBits := (self bitShift: shiftDistance) + 1 bitShift: -1.
  108199.     ^highBits highBit > self hashBits 
  108200.         ifTrue: [(highBits bitShift: -1) bitXor: (shiftDistance - 1) abs]
  108201.         ifFalse: [highBits bitXor: shiftDistance abs]!
  108202.  
  108203. isZero
  108204.     "Answer whether the receiver is zero.
  108205.     LargeIntegers cannot be zero, because there is a more compact representation
  108206.     (i.e. SmallInteger 0)."
  108207.  
  108208.     ^false!
  108209.  
  108210. multiplyByInteger: anInteger
  108211.     "Private - Answer the result of multiplying the receiver by the argument, anInteger.
  108212.     N.B. If we get in here, then anInteger must be small, in which case we just perform
  108213.     the arithmetic in reverse (at present the SmallInteger prim's cannot handle LargeInteger arguments,
  108214.     but the the LI prims can handle SmallInteger args).
  108215.     The primitive should not fail for an Integer argument, so we treat that as an error."
  108216.  
  108217.     <primitive: 29>
  108218.     ^self primitiveFailed!
  108219.  
  108220. negated
  108221.     "Answer the negative value of the receiver.
  108222.     The primitive does not fail."
  108223.  
  108224.     <primitive: 39>
  108225.     ^self bitInvert + 1!
  108226.  
  108227. normalize
  108228.     "Private - Answer the receiver in its minimal 2's complement representation.
  108229.     The answer may be the receiver, a compressed version of the receiver (without
  108230.     leading sign digits), or a SmallInteger."
  108231.  
  108232.     <primitive: 28>
  108233.     ^self primitiveFailed!
  108234.  
  108235. printDigitsOn: aStream base: anInteger
  108236.     "Private - Recursively print the digits of the receiver in base anInteger to aStream.
  108237.     N.B. The receiver MUST be positive for this to work correctly."
  108238.  
  108239.     anInteger == 10
  108240.         ifTrue: [self printDigitsOn10: aStream]
  108241.         ifFalse: [super printDigitsOn: aStream base: anInteger]!
  108242.  
  108243. printDigitsOn10: aStream
  108244.     "Append the ASCII representation (radix 10) of the receiver
  108245.     to aStream. At least twice as fast as #printOn:base:showRadix:
  108246.     for base 10."
  108247.  
  108248.     | quotient remainder digits index quoAndRem |
  108249.     digits := ByteArray new: self basicSize * 3.
  108250.     index := 1.
  108251.     quotient := self.
  108252.     [quotient isImmediate] whileFalse: [
  108253.         quoAndRem := quotient quoAndRem: 100.
  108254.         digits basicAt: index put: (quoAndRem basicAt: 2).
  108255.         index := index + 1.
  108256.         quotient := quoAndRem basicAt: 1].
  108257.     quotient printOn: aStream.
  108258.     [(index := index - 1) > 0] whileTrue: [
  108259.         aStream 
  108260.             nextPut: (Character value: (digits basicAt: index) // 10 + ##($0 asInteger));
  108261.             nextPut: (Character value: (digits basicAt: index) \\ 10 + ##($0 asInteger))]!
  108262.  
  108263. quoAndRem: aNumber
  108264.     "Private- Answer a two element array containing the integer quotient of 
  108265.     the receiver divided by aNumber with truncation toward zero (i.e. like C 
  108266.     integer division), and the corresponding remainder.
  108267.     
  108268.     Primitive Failure Reasons:
  108269.         0    - aNumber is not an Integer.
  108270.     "
  108271.  
  108272.     <primitive: 33>
  108273.     ^aNumber quoAndRemFromInteger: self!
  108274.  
  108275. quoAndRemFromInteger: anInteger 
  108276.     "Private - Answer a two element Array containing the quotient and remainder
  108277.     resulting from dividing the integer receiver into the argument, anInteger.
  108278.     Truncation is towards zero. 
  108279.     Implementation Note: We should normally only be here when attempting
  108280.     to divide a SmallInteger by a LargeInteger, the result of which, by the
  108281.     definition must be (0, <self>), since ANY normalized LargeInteger must be greater
  108282.     in absolute magnitude than any SmallInteger, EXCEPT the special case of the
  108283.     largest negative SmallInteger the absolute value of which is a LargeInteger."
  108284.  
  108285.     ^(anInteger == SmallInteger minimum and: [self = ##(SmallInteger minimum negated)])
  108286.         ifTrue: [Array with: -1 with: 0]
  108287.         ifFalse: [Array with: 0 with: anInteger]!
  108288.  
  108289. rem: operand
  108290.     "Answer the <number> remainder resulting from division of the receiver by
  108291.     the <number>, operand, with truncation toward zero; 
  108292.         e.g. 7 rem: 2 = 1, -7 rem: 2 = -1 (whereas -7 \\ 2 = 1)
  108293.     The answer is always of the same sign as the receiver, regardless of
  108294.     the sign of the argument."
  108295.  
  108296.     ^(self quoAndRem: operand) basicAt: 2!
  108297.  
  108298. sdwordAtOffset: anInteger
  108299.     "Private - Answers the signed 4 byte integer at byte offset anInteger in the receiver.
  108300.  
  108301.     Primitive failure reasons:
  108302.         0 -    anInteger is not a SmallInteger
  108303.         1 -    anInteger is out of bounds."
  108304.  
  108305.     | answer |
  108306.     <primitive: 122>
  108307.     ^self primitiveFailed!
  108308.  
  108309. sdwordAtOffset: anInteger put: anObject
  108310.     "Private - Store anObject as a signed integer at anInteger offset in the receiver. anInteger must 
  108311.     be representable in 32-bits. Uses the dwordAtOffset:put: primitive."
  108312.  
  108313.     | int |
  108314.     <primitive: 123>
  108315.     int := anObject asInteger.
  108316.     int isSDWORD ifFalse: [^self errorCantHold: anObject].
  108317.     1 to: 4 do: [:index | self basicAt: anInteger + index put: (int at: index)].
  108318.     ^int!
  108319.  
  108320. signBit
  108321.     "Private - Answer the receiver's sign bit. This will be 0 for positive integers
  108322.     and 1 for negative integers."
  108323.  
  108324.     ^(self basicAt: self basicSize) bitShift: -7!
  108325.  
  108326. size
  108327.     "Answer the number of 32-bit words in the receiver."
  108328.  
  108329.     ^self basicSize bitShift: -2!
  108330.  
  108331. subtractFromInteger: anInteger
  108332.     "Private - Subtract the receiver from the known integer, anInteger
  108333.     and answer the result.
  108334.     N.B. The negated receiver may not be large if the receiver is 16r40000000
  108335.     and therefore it is better to send #+ that #addToInteger:."
  108336.  
  108337.     ^self negated + anInteger! !
  108338.  
  108339. SmallInteger comment:
  108340. 'Class SmallInteger is an optimized representation of 31-bit 2''s complement integers.
  108341.  
  108342. Wherever an Integer may be represented as a SmallInteger, then its only truly valid representation is as a SmallInteger. (i.e their "normalized" representation is as a SmallInteger). The range is such that the majority of integers used for counting and indexing, and even arithmetical tasks, will be SmallIntegers.'!
  108343. !SmallInteger class methodsFor!
  108344.  
  108345. basicNew
  108346.     "SmallIntegers are immediate objects, and cannot be instantiated directly, they
  108347.     can only be created by literal references or by operations on other SmallIntegers."
  108348.  
  108349.     ^self shouldNotImplement!
  108350.  
  108351. hasImmediateInstances
  108352.     "Answer whether the receiver's instances are immutable objects encoded entirely 
  108353.     in an Oop (e.g. SmallIntegers)."
  108354.  
  108355.     ^true!
  108356.  
  108357. maxBytes
  108358.     "Answer the largest number of radix-256 digits which can be represented
  108359.     in a SmallInteger (31-bits, so not all 4 byte numbers will fit)."
  108360.  
  108361.     ^4!
  108362.  
  108363. maximum
  108364.     "Answer the largest positive integer value which can be
  108365.     represented as a SmallInteger."
  108366.  
  108367.     ^16r3FFFFFFF!
  108368.  
  108369. minimum
  108370.     "Answer the largest negative integer value which can be 
  108371.     represented as a SmallInteger"
  108372.  
  108373.     ^-16r40000000! !
  108374.  
  108375. !SmallInteger methodsFor!
  108376.  
  108377. - operand
  108378.     "Answer the result of subtracting the <number>, operand, from the receiver.
  108379.  
  108380.     Primitive failure codes:
  108381.         0    - operand is not a SmallInteger."
  108382.  
  108383.     <primitive: 14>
  108384.     ^operand subtractFromInteger: self!
  108385.  
  108386. & anInteger
  108387.     "Answer the result of a bitwise AND between the receiver and the argument, anInteger.
  108388.     N.B. Use of #bitAnd: is preferred (even though it is more typing) because it is
  108389.     a special selector (i.e. it is more compact and faster), and is portable.
  108390.     
  108391.     Primitive failure codes:
  108392.         0    - anInteger is not a SmallInteger."
  108393.  
  108394.     <primitive: 40>
  108395.     ^anInteger bitAnd: self!
  108396.  
  108397. * aNumber
  108398.     "Answer the result of multiplying the receiver by aNumber. 
  108399.  
  108400.     Primitive failure codes:
  108401.         0    - aNumber is not a SmallInteger.
  108402.         1    - the result requires more than 31-bits to represent. 
  108403.  
  108404.     When the primitive fails we use a double dispatch to ask aNumber to multiply the receiver, 
  108405.     which we know to be a kind of Integer, by itself."
  108406.  
  108407.     <primitive: 9>
  108408.     ^aNumber multiplyByInteger: self!
  108409.  
  108410. / operand
  108411.     "Answer the result of dividing the receiver by the <number>, operand.
  108412.     Attempted division by zero will cause a <ZeroDivide> exception to be
  108413.     raised.
  108414.  
  108415.     Primitive failure codes:
  108416.         0 -    aNumber is not a SmallInteger.
  108417.         2 -    the result cannot be represented exactly as an Integer."
  108418.  
  108419.     <primitive: 10>
  108420.     ^operand divideIntoInteger: self!
  108421.  
  108422. // aNumber
  108423.     "Answer the integer quotient defined by division with truncation toward negative
  108424.     infinity.
  108425.  
  108426.     Primitive failure codes:
  108427.         0    - aNumber is not a SmallInteger.
  108428.  
  108429.     Attempted division by zero will cause a ZeroDivide exception to be
  108430.     raised by the VM."
  108431.  
  108432.     <primitive: 12>
  108433.     ^super // aNumber!
  108434.  
  108435. \\ aNumber
  108436.     "Answer the integer remainder defined by division with trunction toward negative infinity. This is 
  108437.     the modulo operation. N.B. This is not the same as the C/C++ modulus operator (%), which always
  108438.     truncates towards zero.
  108439.  
  108440.     Primitive failure codes:
  108441.         0 -    aNumber is not a SmallInteger.
  108442.  
  108443.     Attempted division by zero will cause a ZeroDivide exception to be
  108444.     raised by the VM."
  108445.  
  108446.     <primitive: 11>
  108447.     ^super \\ aNumber!
  108448.  
  108449. | anInteger
  108450.     "Answer the result of a bitwise OR between the receiver and the argument, anInteger.
  108451.     N.B. Use of #bitOr: is preferred (even though it is more typing) because it is
  108452.     a special selector (i.e. it is more compact and faster), and is portable.
  108453.  
  108454.     Primitive failure codes:
  108455.         0    - anInteger is not a SmallInteger."
  108456.  
  108457.     <primitive: 41>
  108458.     ^anInteger bitOr: self!
  108459.  
  108460. + aNumber
  108461.     "Add the argument, aNumber, to the receiver and answer the result.
  108462.  
  108463.     Primitive failure codes:
  108464.         0    - aNumber is not a SmallInteger."
  108465.  
  108466.     <primitive: 15>
  108467.     ^aNumber addToInteger: self!
  108468.  
  108469. < aNumber
  108470.     "Answer whether the receiver is less than the argument, aNumber.
  108471.  
  108472.     Primitive failure codes:
  108473.         0    - aNumber is not a SmallInteger."
  108474.  
  108475.     <primitive: 18>
  108476.     ^aNumber greaterThanInteger: self!
  108477.  
  108478. << anInteger
  108479.     "Answer the result of shifting the receiver left anInteger bits."
  108480.  
  108481.     <primitive: 43>
  108482.     ^self bitShift: anInteger!
  108483.  
  108484. <= aNumber
  108485.     "Answer whether the receiver is numerically less than or equal to the argument aNumber.
  108486.  
  108487.     Primitive failure codes:
  108488.         0    - aNumber is not a SmallInteger."
  108489.  
  108490.     <primitive: 20>
  108491.     ^super <= aNumber!
  108492.  
  108493. = aNumber
  108494.     "Answer whether the receiver is equal to aNumber. Numbers are considered
  108495.     equal if their difference is zero.
  108496.  
  108497.     Primitive failure codes:
  108498.         0    - aNumber is not a SmallInteger."
  108499.  
  108500.     <primitive: 16>
  108501.     ^super = aNumber!
  108502.  
  108503. > aNumber
  108504.     "Answer whether the receiver is greater than the argument, aNumber.
  108505.  
  108506.     Primitive failure codes:
  108507.         0    - aNumber is not a SmallInteger."
  108508.  
  108509.     <primitive: 19>
  108510.     ^super > aNumber!
  108511.  
  108512. >= aNumber
  108513.     "Answer whether the receiver is greater than or equal to the argument, aNumber.
  108514.  
  108515.     Primitive failure codes:
  108516.         0    - aNumber is not a SmallInteger."
  108517.  
  108518.     <primitive: 17>
  108519.     ^super >= aNumber!
  108520.  
  108521. allMask: mask
  108522.     "Answer whether all of the bits that are set in the <integer> mask are also set in 
  108523.     the receiver.
  108524.  
  108525.     Primitive failure reasons:
  108526.         0 -    mask is not a SmallInteger."
  108527.  
  108528.     <primitive: 146>
  108529.     ^super allMask: mask!
  108530.  
  108531. anyMask: mask
  108532.     "Answer whether any of the bits that are set in the <integer> mask are also set 
  108533.     in the receiver.
  108534.  
  108535.     Primitive failure reasons:
  108536.         0 -    mask is not a SmallInteger."
  108537.  
  108538.     <primitive: 145>
  108539.     ^super anyMask: mask!
  108540.  
  108541. asFloat
  108542.     "Answer the floating point representation of the receiver. The primitive should not fail."
  108543.  
  108544.     <primitive: 168>
  108545.     ^self primitiveFailed!
  108546.  
  108547. αW'1Ñü&D╨└╬ ï,÷╤²îΩ▀┌òê╙ùzbæÅÇivXD╫ù;\â^P#aUd    ╢ò\&4JáyZ|º╣`▓▀6£ê₧╩╛ü^s²4iPV√ÄDDzÇ_ZÜátóOƒsä√T]Sx≥aô╪!
  108548.  
  108549. basicAt: index
  108550.     "Private - Answer the receivers indexed instance variable at the
  108551.     argument, index. Not valid for immediate objects,  which have no indexable
  108552.     variables as such.
  108553.     Do not remove this method, as the primitive implementation in Object
  108554.     will behave unexpectedly for immediate objects."
  108555.  
  108556.     ^self shouldNotImplement!
  108557.  
  108558. basicAt: index put: value
  108559.     "Private - Replace the receivers indexed instance variable at the
  108560.     argument, index, with the argument, value. Not valid for immediate,
  108561.     objects which are constants.
  108562.     Do not remove this method, as the primitive implementation in Object
  108563.     will behave unexpectedly for immediate objects."
  108564.  
  108565.     ^self shouldNotImplement!
  108566.  
  108567. basicShallowCopy
  108568.     "SmallIntegers have an immediate representation - i.e. they have only
  108569.     one representation for a particular value - and are immutable."
  108570.  
  108571.     ^self
  108572. !
  108573.  
  108574. basicSize
  108575.     "Private - We must override the primitive implementation in Object,
  108576.     which does not expect to be invoked  for SmallInteger receivers"
  108577.  
  108578.     ^0!
  108579.  
  108580. basicYourAddress
  108581.     "Private - Answer the address of the bytes of the receiver. 
  108582.     Assumes the receiver is an address."
  108583.  
  108584.     ^self!
  108585.  
  108586. bitAnd: anInteger
  108587.     "Answer an Integer whose bits are the logical AND of the receiver's bits
  108588.     and those of the argument anInteger. 
  108589.  
  108590.     Primitive failure reasons:
  108591.         0 -    anInteger is not a SmallInteger."
  108592.  
  108593.     <primitive: 40>
  108594.     ^anInteger bitAnd: self!
  108595.  
  108596. bitOr: anInteger
  108597.     "Answer an Integer whose bits are the logical OR of the receiver's bits
  108598.     and those of the argument anInteger. 
  108599.  
  108600.     Primitive failure reasons:
  108601.         0 -    anInteger is not a SmallInteger."
  108602.  
  108603.     <primitive: 41>
  108604.     ^anInteger bitOr: self!
  108605.  
  108606. bitShift: anInteger
  108607.     "Answer an Integer whose value (in two's-complement representation) is the receiver's value 
  108608.     (in 2's complement) shifted left by the number of bits indicated by the argument anInteger. 
  108609.     Negative arguments shift right in left shifts. The sign bit is extended in right shifts.
  108610.     A right shift of more than 30 bits will lose all significant bits, so the result will be 0
  108611.     for positive receivers, and -1 for negative receivers (sign extension).
  108612.  
  108613.     Primitive failure codes:
  108614.         0 -    anInteger is not a SmallInteger.
  108615.         1 -    the result overflowed the SmallInteger range."
  108616.  
  108617.     <primitive: 43>
  108618.     ^(LargeInteger fromSmallInteger: self) bitShift: anInteger!
  108619.  
  108620. bitXor: mask
  108621.     "Answer an <integer> whose bits are the logical XOR of the receiver's
  108622.     bits and those of the argument, mask.
  108623.  
  108624.     Primitive failure codes:
  108625.         0 -    mask is not a SmallInteger."
  108626.  
  108627.     <primitive: 42>
  108628.     ^mask bitXor: self!
  108629.  
  108630. byteAt: index
  108631.     "Private - Answer the byte at index, index, of the absolute value of the
  108632.     receiver (i.e. magnitude  only representation).
  108633.  
  108634.     Primitive failure reasons:
  108635.         0 -    the argument, index, is not a SmallInteger
  108636.         1 -    the argument index is not in the range 1..4."
  108637.  
  108638.     <primitive: 158>
  108639.     ^index > 4
  108640.         ifTrue: [0]
  108641.         ifFalse: [self errorSubscriptBounds: index].
  108642.  
  108643.     "Equivalent to:
  108644.         ^(self abs bitShift: 1 - index * 8) bitAnd: 16rFF"!
  108645.  
  108646. byteSize
  108647.     "Private - Answer the number of bytes in the receiver's 2's complement
  108648.     representation."
  108649.  
  108650.     ^4!
  108651.  
  108652. coerce: anArithmeticValue
  108653.     "Private - Answer anArithmeticValue coerced to be a SmallInteger."
  108654.  
  108655.     ^anArithmeticValue truncated
  108656. !
  108657.  
  108658. deepCopy
  108659.     "SmallIntegers have an immediate representation - i.e. they have only
  108660.     one representation for a particular value - and are immutable."
  108661.  
  108662.     ^self
  108663. !
  108664.  
  108665. digitSize
  108666.     "Answer the number of radix-256 digits required to represent the absolute value of the receiver.
  108667.     Note that this is not the same as the number required for the 2's complement representation, as
  108668.     that may need an extra digit for the sign."
  108669.  
  108670.     | value |
  108671.     value := self abs.
  108672.     value < 16r100 ifTrue: [ ^1 ].
  108673.     value < 16r10000 ifTrue: [ ^2].
  108674.     value < 16r1000000 ifTrue: [ ^3].
  108675.     ^4!
  108676.  
  108677. generality
  108678.     "Private - Answer the generality in the Smalltalk number system of the receiver.
  108679.     SmallIntegers are the lowest generality (1)"
  108680.  
  108681.     ^10
  108682. !
  108683.  
  108684. hash
  108685.     "Answer the <integer> hash value for the receiver (itself)."
  108686.  
  108687.     "Implementation Note: Assumes #hashBits >= SmallInteger maximum highBit, i.e. 30"
  108688.  
  108689.     ^self!
  108690.  
  108691. highBit
  108692.     "Answer the index (1 based) of the high order bit of the positive 2's complement 
  108693.     representation of the receiver. e.g.
  108694.  
  108695.         SmallInteger maximum highBit
  108696.  
  108697.     Implementation Note: Although this can be implemented relatively efficiently
  108698.     in Smalltalk by using a series of conditional tests and a table lookup,
  108699.     it can be implemented in a single instruction in IX86 assembler, hence the
  108700.     (very fast) primitive.
  108701.  
  108702.     Primitive Failure Reasons:
  108703.         0    - Negative receiver (high bit would always be sign bit!!!!)
  108704.     "
  108705.  
  108706.     <primitive: 54>
  108707.     ^self primitiveFailed!
  108708.  
  108709. identityHash
  108710.     "Answer the SmallInteger identity hash value for the receiver (itself).
  108711.     We must override because the identity hash primitive does not work
  108712.     for immediate objects."
  108713.  
  108714.     ^self!
  108715.  
  108716. instVarAt: index
  108717.     "Private - Answer the receivers instance variable at the argument, index. 
  108718.     Not valid for SmallIntegers,  which have no instance variables in the true sense.
  108719.     Do not remove this method, as the primitive implementation in Object
  108720.     will behave unexpectedly for SmallIntegers."
  108721.  
  108722.     ^self shouldNotImplement!
  108723.  
  108724. instVarAt: index put: value
  108725.     "Private - Replace the receivers instance variable at the argument, index, 
  108726.     with the argument, value. Not valid for SmallIntegers, which are constants.
  108727.     Do not remove this method, as the primitive implementation in Object
  108728.     will behave unexpectedly for SmallIntegers."
  108729.  
  108730.     ^self shouldNotImplement!
  108731.  
  108732. isImmediate
  108733.     "Answer whether the receiver has an immediate representation."
  108734.  
  108735.     ^true
  108736. !
  108737.  
  108738. isSDWORD
  108739.     "Answer whether the receiver can be represented as a signed 32-bit two's complement
  108740.     integer (i.e. as an SDWORD).
  108741.     This must be true because SmallIntegers have a maximum size of 31-bits."
  108742.  
  108743.     ^true!
  108744.  
  108745. isZero
  108746.     "Answer whether the receiver is zero. SmallIntegers can be zero, and there is a
  108747.     very fast check."
  108748.  
  108749.     ^self == 0!
  108750.  
  108751. lowBit
  108752.     "Answer the index of the lowest bit of the receiver which is set.
  108753.     Unlike #highBit, this is meaningful for negative numbers too.
  108754.     Implementation Note: The primitive makes use of the Intel
  108755.     BSF instruction."
  108756.  
  108757.     | i t |
  108758.     <primitive: 152>
  108759.     self == 0 ifTrue: [^self].
  108760.     t := self.
  108761.     i := 1.
  108762.     [(t bitAnd: 16rF) == 0] whileTrue: [
  108763.         i := i + 4.
  108764.         t := t bitShift: -4].
  108765.     [(t bitAnd: 1) == 0] whileTrue: [
  108766.         i := i + 1.
  108767.         t := t bitShift: -1].
  108768.     ^i!
  108769.  
  108770. multiplyByInteger: anInteger
  108771.     "Private - Answer the result of multiplying the receiver by the argument, 
  108772.     anInteger.
  108773.     Implementation Note: Invoked when SmallInteger multiplied by another
  108774.     SmallInteger but the result overflows the SmallInteger range (a fairly
  108775.     common occurrence). The superclass implementation does not work
  108776.     because it goes through the generic coercion mechanism, which does
  108777.     not expect to be invoked for two numbers of the same generality."
  108778.  
  108779.     ^(LargeInteger fromSmallInteger: self) * anInteger.
  108780.  
  108781.     #todo "Support LargeInteger results from the primitive, won't need this then"!
  108782.  
  108783. printString
  108784.     "Answer the ASCII String representation of the receiver. Although this method
  108785.     is strictly not necessary (SmallInteger>>printOn:base:showRadix: makes it 
  108786.     redundant), printing SmallIntegers is such a common operation that it is worth 
  108787.     providing an optimised version generating a String (we can make use of the 
  108788.     C Runtime Library)."
  108789.  
  108790.     ^CRTLibrary default _ltoa: self string: PrintBuf radix: 10
  108791.  
  108792.     "A Smalltalk implementation might be..."
  108793.  
  108794.     "| value aString i |
  108795.     (value := self) < 0
  108796.         ifTrue: [ ^'-', self negated printString ].
  108797.     i := ##(SmallInteger maximum log truncated + 1).
  108798.     aString := String new: i.
  108799.     [ value < 10 ] whileFalse: [
  108800.         aString at: i put: (Character digitValue: ( value \\ 10 )).
  108801.         i := i - 1.
  108802.         value := value // 10].
  108803.     aString at: i put: (Character digitValue: (value \\ 10 )).
  108804.     ^aString copyFrom: i to: aString size"!
  108805.  
  108806. quo: aNumber
  108807.     "Answer the integer quotient defined by division with truncation toward zero.
  108808.  
  108809.     Primitive failure codes:
  108810.         0 -    aNumber is not a SmallInteger.
  108811.  
  108812.     Attempted division by zero will cause a ZeroDivide exception to be
  108813.     raised by the VM."
  108814.  
  108815.     <primitive: 53>
  108816.     ^(aNumber quoAndRemFromInteger: self) basicAt: 1
  108817. !
  108818.  
  108819. quoAndRem: aNumber
  108820.     "Answer a 2-element array containing the integer quotient and remainder
  108821.     resulting from division of the receiver by the argument with truncation 
  108822.     toward zero.
  108823.  
  108824.     Primitive failure codes:
  108825.         0 -    aNumber is not a SmallInteger.
  108826.  
  108827.     Attempted division by zero will cause a ZeroDivide exception to be
  108828.     raised by the VM."
  108829.  
  108830.     <primitive: 13>
  108831.     ^aNumber quoAndRemFromInteger: self!
  108832.  
  108833. shallowCopy
  108834.     "SmallIntegers have an immediate representation - i.e. they have only
  108835.     one representation for a particular value - and are immutable."
  108836.  
  108837.     ^self
  108838. !
  108839.  
  108840. size
  108841.     "We must override the primitive implementation in Object, which does
  108842.     not expect to be invoked for SmallInteger receivers."
  108843.  
  108844.     ^self shouldNotImplement!
  108845.  
  108846. species
  108847.     "Answer the 'species' of the receiver.
  108848.     Implementation Note: The primitive superclass implementation
  108849.     will fail for immediate classes, so we must override here."
  108850.  
  108851.     ^SmallInteger!
  108852.  
  108853. yourAddress
  108854.     "Answer the address of the bytes of the receiver. 
  108855.     Assume that the integer is being used as an address, so answer self."
  108856.  
  108857.     ^self! !
  108858.  
  108859. CommandMenuItem comment:
  108860. 'CommandMenuItem represents a <commandSource> menu item held by a <Menu>. The item is configured with a <CommandDescription> to be fired when the item is chosen.. 
  108861.  
  108862. Instance Variables:
  108863.     commandDescription    <CommandDescription> indicating the command to be fired for the item.
  108864.     image            <Icon> currently associated with the menu item, if any.
  108865.     bitmap            <Bitmap> cached bitmap representation of the image, if any
  108866. '!
  108867. !CommandMenuItem class methodsFor!
  108868.  
  108869. command: action description: text
  108870.     "Answer a new instance of the receiver containing a <CommandDescription> composed
  108871.     from the niladicValuable>, action, and the <readableString> description, text."
  108872.  
  108873.     ^self commandDescription: (CommandDescription command: action description: text)!
  108874.  
  108875. command: action description: text image: image
  108876.     "Answer a new instance of the receiver containing a <CommandDescription> composed
  108877.     from the niladicValuable>, action, the <readableString> description, text and the <Image>, image."
  108878.  
  108879.     ^self commandDescription: (CommandDescription command: action description: text image: image)!
  108880.  
  108881. commandDescription: aCommandDescription
  108882.     "Answers a new instance of the receiver for the specified command."
  108883.  
  108884.     ^self basicNew
  108885.         flags: MFT_STRING;
  108886.         commandDescription: aCommandDescription!
  108887.  
  108888. initialize
  108889.     "Private - Initialize the class variables of the receiver:
  108890.         self initialize
  108891.     "
  108892.  
  108893.     IsDefaultMask := 16r100000.
  108894.     !
  108895.  
  108896. new
  108897.     "Answers an instance of the receiver"
  108898.  
  108899.     ^self commandDescription: CommandDescription new!
  108900.  
  108901. publishedAspectsOfInstances
  108902.     "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  108903.  
  108904.     ^(super publishedAspectsOfInstances)
  108905.         add: (Aspect name: #commandDescription);
  108906.         add: (Aspect boolean: #isRadioButtonStyle);
  108907.         add: (Aspect boolean: #isDefault);
  108908.         yourself!
  108909.  
  108910. stbVersion
  108911.     "Answer the current binary filer version number for instances of the receiver."
  108912.  
  108913.     ^2! !
  108914.  
  108915. !CommandMenuItem methodsFor!
  108916.  
  108917. acceleratorKey
  108918.     "Answer the accelerator key code for the receiver."
  108919.  
  108920.     ^self commandDescription acceleratorKey!
  108921.  
  108922. acceleratorKey: key
  108923.     "Sets the accelerator key to the <Integer> accelerator key description, key."
  108924.  
  108925.     self commandDescription acceleratorKey: key!
  108926.  
  108927. acceleratorKeyString
  108928.     "Answer the accelerator key string for the receiver."
  108929.  
  108930.     ^self commandDescription acceleratorKeyString!
  108931.  
  108932. acceleratorKeyString: key
  108933.     "Sets the accelerator key to the <Integer> accelerator key description, key."
  108934.  
  108935.     self commandDescription acceleratorKeyString: key!
  108936.  
  108937. bitmap
  108938.     "Answer the <Bitmap> image associated with this <menuItem>, or nil if none."
  108939.  
  108940.     bitmap isNil ifTrue: [self image ifNotNil: [:icon | bitmap := self bitmapFromIcon: icon]].
  108941.     ^bitmap!
  108942.  
  108943. bitmapFromIcon: anIcon
  108944.     | canvas bmp extent |
  108945.     extent := NONCLIENTMETRICS current menuImageExtent.
  108946.     bmp := Bitmap displayCompatibleWithExtent: extent.
  108947.     canvas := bmp canvas.
  108948.     "Quickest way to erase to a system colour"
  108949.     canvas fillRectangle: (RECT 
  108950.                 left: 0
  108951.                 top: 0
  108952.                 right: extent x
  108953.                 bottom: extent y)
  108954.         brush: COLOR_MENU + 1.
  108955.     (Icon imageManager imageListWithExtent: Icon smallExtent) 
  108956.         draw: anIcon imageIndex
  108957.         on: canvas
  108958.         at: 0 @ 0
  108959.         flags: 0.
  108960.     bmp freeDC.
  108961.     ^bmp!
  108962.  
  108963. command: aCommandSelectorOrMessage
  108964.     "Sets the command symbol or message held by the receiver"
  108965.  
  108966.     self commandDescription command: aCommandSelectorOrMessage!
  108967.  
  108968. commandDescription
  108969.     "Private - Answer the CommandDescription for the receiver"
  108970.  
  108971.     ^commandDescription!
  108972.  
  108973. commandDescription: aCommandDescription
  108974.     "Private - Set the CommandDescription for the receiver"
  108975.  
  108976.     commandDescription := aCommandDescription!
  108977.  
  108978. commandString
  108979.     "Answer a String representation of the receiver's command."
  108980.  
  108981.     ^self commandDescription commandString!
  108982.  
  108983. commandString: commandText
  108984.     "Sets the receiver's command from the <readableString> representation, commandText."
  108985.  
  108986.     self commandDescription commandString: commandText!
  108987.  
  108988. description
  108989.     "Answers a short <readableString> description of the receiver's command."
  108990.  
  108991.     ^self commandDescription description!
  108992.  
  108993. description: aString
  108994.     "Sets the String description of the receiver's command."
  108995.  
  108996.     ^self commandDescription description: aString!
  108997.  
  108998. displayOn: aStream
  108999.     "Appends the receiver to aStream as a representation that a 
  109000.     user would want to see"
  109001.  
  109002.     aStream display: self description!
  109003.  
  109004. edit
  109005.         "Private - Edit the receiver in a dialog box."
  109006.     
  109007.         (CommandMenuItemDialog createOn: self) showModal!
  109008.  
  109009. free
  109010.     "Free any external resources owned by the receiver."
  109011.     
  109012.     self freeBitmap!
  109013.  
  109014. freeBitmap
  109015.     bitmap isNil 
  109016.         ifFalse: 
  109017.             [bitmap free.
  109018.             bitmap := nil]!
  109019.  
  109020. height
  109021.     "Private - Answer the height of a menu item as currently configured."
  109022.  
  109023.     ^NONCLIENTMETRICS current iMenuHeight!
  109024.  
  109025. id
  109026.     "Private - Answers the menu item identifier for the receiver. This is the command
  109027.     id that Windows uses to identify the command."
  109028.  
  109029.     ^self commandDescription id!
  109030.  
  109031. image
  109032.     "Answer the <Image> currently associated with this menu item."
  109033.  
  109034.     ^image ifNil: [self commandDescription image]!
  109035.  
  109036. image: anImageOrNil
  109037.     "Sets the image associoated with the receiver's command to anImageOrNil."
  109038.  
  109039.     image := nil.
  109040.     self freeBitmap.
  109041.     ^self commandDescription image: anImageOrNil!
  109042.  
  109043. isDefault
  109044.     "Answer whether the receiver is expecting to be the default item on a menu.
  109045.     Note that if other items on the same menu are also set up with the default
  109046.     style, then the behaviour is undefined (only one will get to be the default),
  109047.     also this static configuration may be overridden dynamically by the 
  109048.     command query mechanism."
  109049.  
  109050.     ^self flags allMask: IsDefaultMask!
  109051.  
  109052. isDefault: aBoolean
  109053.     "Set whether the receiver is expecting to be the default item on a menu."
  109054.  
  109055.     self flags: (self flags mask: IsDefaultMask set: aBoolean)!
  109056.  
  109057. isModalCommand
  109058.     ^self commandDescription isModalCommand!
  109059.  
  109060. isModalCommand: aBoolean
  109061.     self commandDescription isModalCommand: aBoolean!
  109062.  
  109063. isRadioButtonStyle
  109064.     "Answer whether the receiver is a radio button style checked item."
  109065.  
  109066.     ^self flags allMask: MFT_RADIOCHECK!
  109067.  
  109068. isRadioButtonStyle: aBoolean
  109069.     "Set whether the receiver is a radio button style checked item."
  109070.  
  109071.     self flags: (self flags mask: MFT_RADIOCHECK set: aBoolean)!
  109072.  
  109073. menuHeight
  109074.     "Private - Answer the height of this menu item as currently configured."
  109075.  
  109076.     ^NONCLIENTMETRICS current iMenuHeight!
  109077.  
  109078. populateItemInfo: aMENUITEMINFOA
  109079.     "Private - Copy the receiver's item information into the <MENUITEMINFOA> argument."
  109080.  
  109081.     aMENUITEMINFOA commandMenuItem: self!
  109082.  
  109083. postCopy
  109084.     "Apply any final flourish to the copy that may be required."
  109085.     
  109086.     commandDescription := commandDescription copy!
  109087.  
  109088. queryAlong: route
  109089.     "Answer a <CommandQuery> reflecting the current state of the 
  109090.     receiver's command for the <commandPolicy>, route.
  109091.     In this case we want to preconfigure the query with some static
  109092.     settings (actually only whether the command is the default at this
  109093.     time)."
  109094.  
  109095.     | query |
  109096.     query := route newCommandQuery: self commandDescription.
  109097.     query isDefault: self isDefault.
  109098.     route queryCommand: query.
  109099.     self freeBitmap.
  109100.     image := query image.
  109101.     ^query!
  109102.  
  109103. registerAcceleratorKeyIn: anAcceleratorTable
  109104.     "Private - Register the accelerator key associated with this menu item, if
  109105.     there is one, in anAcceleratorTable."
  109106.  
  109107.     self commandDescription registerAcceleratorKeyIn: anAcceleratorTable.
  109108. !
  109109.  
  109110. stbSaveOn: anSTBOutFiler 
  109111.     "Output the receiver to anSTBOutFiler. We don't want the cached images to be saved."
  109112.  
  109113.     anSTBOutFiler override: image with: nil.
  109114.     anSTBOutFiler override: bitmap with: nil.
  109115.     super stbSaveOn: anSTBOutFiler!
  109116.  
  109117. text
  109118.     "Private - Answer the menu text (i.e. the text that appears in the menu) for the receiver."
  109119.  
  109120.     ^self commandDescription menuText! !
  109121.  
  109122. DividerMenuItem comment:
  109123. 'DividerMenuItem represents a divider that can be placed between other items in a <Menu>. Separate singleton instances for the various styles are held in class variables and answered by the #separator, #break and #barBreak [instance creation] methods.
  109124.  
  109125. Instance Variables:
  109126.     flags        <integer> Windows style flags
  109127.  
  109128. Class Variables:
  109129.     Separator        <DividerMenuItem> singleton instance for the standard separator style.
  109130.     DividerLookup    <LookupTable> mapping <integer> style flags to their <Symbol> style names.
  109131.     BarBreak        <DividerMenuItem> singleton instance for the bar-break separater style.
  109132.     Break        <DividerMenuItem> singleton instance for the break separater style
  109133.  
  109134. '!
  109135. !DividerMenuItem class methodsFor!
  109136.  
  109137. barBreak
  109138.     "Answer unique DividerMenuItem which splits places following menu items in
  109139.     a new column. Vertical line splits the old and new column of menu items."
  109140.  
  109141.     BarBreak isNil ifTrue: [BarBreak := self basicNew flags: MFT_MENUBARBREAK; yourself].
  109142.     ^BarBreak
  109143. !
  109144.  
  109145. break
  109146.     "Answer unique DividerMenuItem which splits places following menu items in
  109147.     a new column."
  109148.  
  109149.     Break isNil ifTrue: [Break := self basicNew flags: MFT_MENUBREAK; yourself].
  109150.     ^Break
  109151. !
  109152.  
  109153. initialize
  109154.     "Private - Initialize the receiver's class variables.
  109155.  
  109156.         DividerMenuItem initialize
  109157.     "
  109158.  
  109159.     DividerLookup := LookupTable new
  109160.         at: MFT_SEPARATOR put: #separator;
  109161.         at: MFT_MENUBREAK put: #break;
  109162.         at: MFT_MENUBARBREAK put: #barBreak;
  109163.         yourself!
  109164.  
  109165. new
  109166.     "Answers an instance of the receiver"
  109167.  
  109168.     ^self separator !
  109169.  
  109170. onPreStripImage
  109171.     "Private - The image is about to be stripped. Nil the lazily initialized class variables."
  109172.  
  109173.     self uninitialize!
  109174.  
  109175. separator
  109176.     "Answer unique DividerMenuItem which draws a horizontal dividing line in menu."
  109177.  
  109178.     Separator isNil ifTrue: [Separator := self basicNew flags: MFT_SEPARATOR; yourself].
  109179.     ^Separator
  109180. !
  109181.  
  109182. stbConvertFrom: anSTBClassFormat 
  109183.     "Convert from earlier version models.
  109184.     1: Added 'typeFlags' inst var to MenuItem and removed own 'flags' inst var."
  109185.  
  109186.     ^
  109187.     [:data | 
  109188.     | newInst |
  109189.     newInst := self basicNew.
  109190.     data keysAndValuesDo: [:i :v | newInst instVarAt: i put: v].
  109191.     newInst]!
  109192.  
  109193. styleNameChoices
  109194.     "Answer an Array of available style names for instances of the receiver."
  109195.  
  109196.     ^DividerLookup values asArray!
  109197.  
  109198. uninitialize
  109199.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  109200.  
  109201.     BarBreak := Break := Separator := nil! !
  109202.  
  109203. !DividerMenuItem methodsFor!
  109204.  
  109205. acceleratorKey
  109206.     "Private - Answer the accelerator key code for the receiver.
  109207.     Dividers are of course inactive."
  109208.  
  109209.     ^0!
  109210.  
  109211. acceleratorKey: anInteger
  109212.     "Private - Set the receiver's accelerator key code to the argument, anInteger."
  109213.  
  109214.     !
  109215.  
  109216. command
  109217.     "Private - Answer the command selector for the receiver.
  109218.     There is of course no command associated with dividers."
  109219.  
  109220.     ^nil!
  109221.  
  109222. commandDescription
  109223.     "Private - Answer the <commandDescription> for the receiver"
  109224.  
  109225.     ^CommandDescription command: nil description: '|'!
  109226.  
  109227. displayOn: aStream
  109228.     "Appends the receiver to aStream as a representation that a 
  109229.     user would want to see"
  109230.  
  109231.     aStream display: '|'!
  109232.  
  109233. height
  109234.     "Private - Answer the height of a menu item as currently configured.
  109235.     It doesn't seem to be possible to determine this from system metrics."
  109236.  
  109237.     ^9!
  109238.  
  109239. id
  109240.     "Private - Answers the menu item identifier for the receiver"
  109241.  
  109242.     ^0!
  109243.  
  109244. isDivider
  109245.     "Answer whether the receiver is actually just a divider."
  109246.  
  109247.     ^true!
  109248.  
  109249. populateItemInfo: aMENUITEMINFO
  109250.     "Private - Copy the receiver's item information into the <MENUITEMINFOA> argument."
  109251.  
  109252.     aMENUITEMINFO     type: self styleFlags!
  109253.  
  109254. queryAlong: route
  109255.     "Answer an enabled <CommandQuery> as dividers must always be enabled."
  109256.  
  109257.     ^CommandQuery new beEnabled!
  109258.  
  109259. styleName
  109260.     "Answer a Symbol description of the style of the reciver"
  109261.  
  109262.     ^DividerLookup at: self styleFlags!
  109263.  
  109264. styleName: aSymbol
  109265.     "Private - Set the receiver's style from the description in aSymbol. 
  109266.     This can be one of #separator, #break or #barBreak."
  109267.  
  109268.     self styleFlags: (DividerLookup keyAtValue: aSymbol)!
  109269.  
  109270. text
  109271.     "Private - Answer the menu text (i.e. the text that appears in the menu) for the receiver."
  109272.  
  109273.     ^''! !
  109274.  
  109275. MessageSendAbstract comment:
  109276. 'A MessageSendAbstract is the abstract base class of fully closed <Message>s, that include a receiver object, a message selector, and an array of sufficient arguments. As a fully closed valuable, Message Sends can be evaluated by sending them the #value message, and they can frequently be employed where a <BlockClosure> might otherwise be used.
  109277.  
  109278. Athough Message Sends are complete in themselves, they also respond to the valuable messages which take arguments. The general principle is that the supplied arguments supplant those stored in the Message Send according to some algorithm determined by the particular subclass.'!
  109279. !MessageSendAbstract class methodsFor!
  109280.  
  109281. receiver: anObject selector: aSymbol
  109282.     "Answer a new instance of the receiver with the receiver, anObject, and selector, 
  109283.     aSymbol"
  109284.  
  109285.     ^self 
  109286.         receiver: anObject
  109287.         selector: aSymbol
  109288.         arguments: #()!
  109289.  
  109290. receiver: anObject selector: aSymbol argument: aParameter
  109291.     "Answer a new instance of the receiver with the receiver, anObject, selector, 
  109292.     aSymbol, and argument, anObject"
  109293.  
  109294.     ^self 
  109295.         receiver: anObject
  109296.         selector: aSymbol
  109297.         arguments: (Array with: aParameter)!
  109298.  
  109299. receiver: anObject selector: aSymbol arguments: anArray
  109300.     "Answer a new instance of the receiver with the receiver, anObject, selector, 
  109301.     aSymbol, and arguments, anArray"
  109302.  
  109303.     ^(self new)
  109304.         receiver: anObject;
  109305.         setSelector: aSymbol arguments: anArray! !
  109306.  
  109307. !MessageSendAbstract methodsFor!
  109308.  
  109309. = aMessageSend
  109310.     "Answer true if the receiver and aMessage are equal.
  109311.     Since we override #= we also override hash."
  109312.  
  109313.     ^super = aMessageSend and: [self receiver == aMessageSend receiver]!
  109314.  
  109315. deferredValue
  109316.     "Answer a <niladicValuable> that begins evaluating the receiver asynchronously,
  109317.     and which when evaluated will synchronously supply the result."
  109318.  
  109319.     ^self deferredValueAt: Processor activePriority!
  109320.  
  109321. deferredValueAt: priority
  109322.     "Answer a <niladicValuable> that begins evaluating the receiver asynchronously
  109323.     at the specified <Process> priority, and which when evaluated will synchronously 
  109324.     supply the result."
  109325.  
  109326.     ^DeferredValue evaluate: self at: priority!
  109327.  
  109328. forwardTo: anObject
  109329.     "Send the receiver Message to anObject for evaluation, 
  109330.     answering the result"
  109331.  
  109332.     ^self forwardTo: anObject withArguments: #()!
  109333.  
  109334. hash
  109335.     "Since we implement #= we must also implement hash to match."
  109336.  
  109337.     ^selector hash + args hash + self receiver hash!
  109338.  
  109339. printOn: target
  109340.     "Append a short textual description of the receiver to the <puttableStream>
  109341.     argument, target."
  109342.  
  109343.     target
  109344.         basicPrint: self;
  109345.         nextPut: $(;
  109346.         print: self receiver;
  109347.         nextPutAll: '>>';
  109348.         print: self selector.
  109349.     args isEmpty 
  109350.         ifFalse: 
  109351.             [target
  109352.                 nextPutAll: ', ';
  109353.                 print: args].
  109354.     target nextPut: $)!
  109355.  
  109356. queryCommand: query
  109357.     "Enters status and target details about the receiver's own command into the 
  109358.     <CommandQuery>, query.
  109359.     Implementation Note: As the receiver represents a fully closed command, we can
  109360.     skip all further routing (the CommandDescription itself is queried first by default)."
  109361.  
  109362.     query isEnabled: true; receiver: self receiver.
  109363.     ^true!
  109364.  
  109365. receiver
  109366.     "Answer the receiver instance variable of the receiver (i.e the object which is 
  109367.     the current destination of the receiver should it be evaluated)"
  109368.  
  109369.     ^self subclassResponsibility!
  109370.  
  109371. receiver: anObject
  109372.     "Set the receiver"
  109373.  
  109374.     ^self subclassResponsibility!
  109375.  
  109376. value
  109377.     "Evaluates the receiver send the message identified by the 
  109378.     receiver's selector to the receiver's receiver, with the 
  109379.     receiver's arguments, and answers the result."
  109380.     
  109381.     ^self receiver perform: selector withArguments: args!
  109382.  
  109383. value: anObject
  109384.     "Answer the result of sending the receiver. 
  109385.     Implementation Note: By implementing this selector from the <monadicValuable>
  109386.     protocol, we enable the substitution of MessageSends for a
  109387.     large number of parameterization cases where blocks would otherwise
  109388.     be required."
  109389.  
  109390.     ^self valueWithArguments: (Array with: anObject)!
  109391.  
  109392. value: arg1 value: arg2
  109393.     "Answer the result of sending the receiver.
  109394.     Implementation Note: By implementing this selector from the <dyadicValuable>
  109395.      protocol, we enable the substitution of MessageSends for a
  109396.     large number of parameterization cases where blocks would otherwise
  109397.     be required. In any case we must override this because the superclass
  109398.     implementation is wrong for us."
  109399.  
  109400.     ^self valueWithArguments: (Array with: arg1 with: arg2)!
  109401.  
  109402. valueWithArguments: triggerArguments
  109403.     "Executes the receiver with the specified <Array> of arguments. If insufficient arguments are
  109404.     supplied then these are substituted with arguments supplied at the time the event handler was
  109405.     registered, or nils if there are still insufficient. If the combined number of arguments is greater
  109406.     than that required, then the subclass determines which take precedence."
  109407.  
  109408.     ^self forwardTo: self receiver withArguments: triggerArguments! !
  109409.  
  109410. EventMessageSend comment:
  109411. 'An EventMessageSend is a fully closed <Message>, including receiver object, the message selector, and an array of sufficient arguments, however the receiver is referenced weakly.
  109412.  
  109413. When evaluate with extra arguments, an EventMessageSend merges its own argument with those supplied at evaluation time with the latter taking precedence from the left. For example if the message requires two arguments, and one is supplied at evaluation time, then the first argument sent will be that one, and the second the second of the arguments stored in the EventMessageSend itself.'!
  109414. !EventMessageSend class methodsFor!
  109415.  
  109416. new
  109417.     ^(self new: 1) beWeak; yourself! !
  109418.  
  109419. !EventMessageSend methodsFor!
  109420.  
  109421. forwardTo: anObject withArguments: triggerArguments
  109422.     "Private - Send the receiver Message to the <Object>, anObject, with the <Array> of arguments, anArray.    
  109423.     If insufficient arguments are supplied then these are substituted with arguments supplied at the     
  109424.     time the event handler was registered, or nils if there are still insufficient. If the combined number 
  109425.     of arguments is greater than that required, then the arguments supplied at trigger time take precedence."
  109426.  
  109427.     ^anObject perform: selector
  109428.         withArguments: (expectedArgCount = triggerArguments basicSize 
  109429.                 ifTrue: [triggerArguments]
  109430.                 ifFalse: [self mergeArguments: triggerArguments])!
  109431.  
  109432. mergeArguments: triggerArguments
  109433.     | actualArgs |
  109434.     actualArgs := Array new: expectedArgCount.
  109435.     actualArgs
  109436.         replaceFrom: 1
  109437.             to: (expectedArgCount min: args basicSize)
  109438.             with: args
  109439.             startingAt: 1;
  109440.         replaceFrom: 1
  109441.             to: (expectedArgCount min: triggerArguments basicSize)
  109442.             with: triggerArguments
  109443.             startingAt: 1.
  109444.     ^actualArgs!
  109445.  
  109446. postCopy
  109447.     self beWeak!
  109448.  
  109449. receiver
  109450.     ^self basicAt: 1!
  109451.  
  109452. receiver: anObject
  109453.     self basicAt: 1 put: anObject!
  109454.  
  109455. selector: aSelector
  109456.     "Sets the selector for the receiver to aSelector. Also
  109457.     computes the expected argument count that will be required
  109458.     when the selector is sent."
  109459.  
  109460.     super selector: aSelector.
  109461.     expectedArgCount := aSelector argumentCount.
  109462.     args := #()!
  109463.  
  109464. setSelector: aSymbol arguments: argArray
  109465.     "Private - Initialize the receiver's instance variables."
  109466.  
  109467.     selector := aSymbol.
  109468.     expectedArgCount := aSymbol argumentCount.
  109469.     self assert: [argArray size <= expectedArgCount].
  109470.     args := argArray!
  109471.  
  109472. value
  109473.     "Evaluates the receiver send the message identified by the 
  109474.     receiver's selector to the receiver's receiver, with the 
  109475.     receiver's arguments, and answers the result."
  109476.  
  109477.     ^self forwardTo: self receiver withArguments: #()! !
  109478.  
  109479. MessageSend comment:
  109480. 'A MessageSend is a fully closed <Message>, including receiver object, the message selector, and an array of sufficient arguments.
  109481.  
  109482. When evaluated with additional arguments the supplied arguments supplant those stored in the MessageSend itself by replacement from the right.
  109483.  
  109484. Instance Variables:
  109485.     receiver        <Object>, the destination of the message when evaluated'!
  109486. !MessageSend class methodsFor!
  109487.  
  109488. empty
  109489.     "Answers an instance of the receiver that does nothing.
  109490.     N.B. This is a shared object, and should not be modified."
  109491.  
  109492.     EmptySend isNil ifTrue: [
  109493.         EmptySend := self receiver: nil selector: #isNil].
  109494.     ^EmptySend! !
  109495.  
  109496. !MessageSend methodsFor!
  109497.  
  109498. forwardTo: anObject withArguments: anArgumentArray
  109499.     "Answer the result of evaluating the receiver replacing the stored arguments 
  109500.     with those from the <Array>, anArgumentArray, from the right, i.e. if two arguments 
  109501.     are supplied for a three argument message then the penultimate and last arguments 
  109502.     will be those supplied and the first will come from the stored argument <Array>,
  109503.     and then forwarding a message composed of those arguments and the selector stored 
  109504.     in the receiver to the <Object>, anObject. If more arguments are supplied than are 
  109505.     required for the message, then the extraneous arguments are simply ignored."
  109506.  
  109507.     ^args isEmpty 
  109508.         ifTrue: [anObject perform: selector]
  109509.         ifFalse: 
  109510.             [| actualArgs argCount |
  109511.             actualArgs := args shallowCopy.
  109512.             argCount := args basicSize.
  109513.             actualArgs 
  109514.                 replaceFrom: (argCount - anArgumentArray basicSize + 1 max: 1)
  109515.                 to: argCount
  109516.                 with: anArgumentArray
  109517.                 startingAt: 1.
  109518.             anObject perform: selector withArguments: actualArgs]!
  109519.  
  109520. receiver
  109521.     ^receiver!
  109522.  
  109523. receiver: anObject
  109524.     receiver := anObject.
  109525. ! !
  109526.  
  109527. EventMessageSequence comment:
  109528. ''!
  109529. !EventMessageSequence methodsFor!
  109530.  
  109531. add: aMessageSend
  109532.     "Adds a <MessageSend> to this sequence. Normally this would be an
  109533.     EventMessageSend, a special kind of message send that maintains only
  109534.     a weak reference to its receiver, and which merges trigger and registration
  109535.     arguments in a particular way. However, the argument can be any
  109536.     valuable that implements the #value[:] message appropriate for the number
  109537.     of arguments triggered with the event, and it must also implement #receiver.
  109538.     So, for example, blocks and normal MessageSends can be used.
  109539.     Note that we take an additional weak reference to the receiver for the sole
  109540.     purpose of being notified when the receiver has been garbage collected
  109541.     so that the message sequence can be updated."
  109542.  
  109543.     | receiver index |
  109544.     tally := tally + 1.
  109545.     receiver := aMessageSend receiver.
  109546.     index := receivers addAnsweringIndex: receiver.
  109547.     index > messages basicSize ifTrue: [messages resize: receivers basicSize].
  109548.     messages basicAt: index put: aMessageSend.
  109549.     ^aMessageSend!
  109550.  
  109551. elementsExpired: count of: aWeakArray
  109552.     "Private - Handle the loss of <integer> count values from the receiver's receiver <Array> (
  109553.     which is also the argument, aWeakArray). We nil the message corresponding to each corpse
  109554.     (although we don't bother nilling the dead receivers to speed up the search for an empty slot)."
  109555.  
  109556.     tally := tally - count.
  109557.     receivers corpsesDo: [:deathAt | messages at: deathAt put: nil]!
  109558.  
  109559. initialize
  109560.     "Private - Initialize the receiver.
  109561.     Implementation Note: The majority of instances only ever contain one message
  109562.     for the event against the receiver, so we use 1 as the initial capacity."
  109563.  
  109564.     receivers := (MourningWeakArray with: DeadObject current)
  109565.                 pathologist: self;
  109566.                 yourself.
  109567.     messages := Array new: 1.
  109568.     tally := 0!
  109569.  
  109570. messagesDo: aBlock
  109571.     "Private - Evaluates a block for all non-dead elements of the receiver.
  109572.     Passes a full EventMessageSend to the block"
  109573.  
  109574.     | corpse |
  109575.     corpse := DeadObject current.
  109576.     1 to: receivers basicSize
  109577.         do: 
  109578.             [:index | 
  109579.             | each |
  109580.             ((receivers at: index) == corpse or: [(each := messages at: index) isNil]) 
  109581.                 ifFalse: [aBlock value: each]]!
  109582.  
  109583. removeMessagesFor: anObject
  109584.     "Removes all the messages in this sequence that are destined for anObject. Answers the receiver."
  109585.  
  109586.     | corpse |
  109587.     corpse := DeadObject current.
  109588.     1 to: receivers basicSize
  109589.         do: 
  109590.             [:index | 
  109591.             (receivers at: index) == anObject 
  109592.                 ifTrue: 
  109593.                     [tally := tally - 1.
  109594.                     receivers at: index put: corpse.    "corpse marks empty slots"
  109595.                     messages at: index put: nil]]!
  109596.  
  109597. size
  109598.     "Answers the number of messages in the receiver"
  109599.  
  109600.     ^tally! !
  109601.  
  109602. MessageSequence comment:
  109603. ''!
  109604. !MessageSequence class methodsFor!
  109605.  
  109606. withMessages: aSequencedReadableCollection
  109607.     "Answer a new instance of the receiver with the specified sequence of <MessageSend>s."
  109608.  
  109609.     | answer |
  109610.     answer := self new.
  109611.     answer list addAll: aSequencedReadableCollection.
  109612.     ^answer! !
  109613.  
  109614. !MessageSequence methodsFor!
  109615.  
  109616. add: aMessage
  109617.     "Adds aMessage to the end of this sequence. Answers aMessage"
  109618.  
  109619.     ^list addLast: aMessage.
  109620. !
  109621.  
  109622. add: newElement afterIndex: index
  109623.     "Add newElement to the receiver immediately after the element currently at the
  109624.     specified <integer> index. index must be between 0 and the receiver's current 
  109625.     size (if not raise an exception). Answer newElement."
  109626.  
  109627.     ^list add: newElement afterIndex: index!
  109628.  
  109629. addAll: newElements afterIndex: index
  109630.     "Add all of the elements in the <collection>, newElements, after the existing element of
  109631.     the receiver at the one-based <integer> index, index. Answer the newly added elements."
  109632.  
  109633.     ^list addAll: newElements afterIndex: index!
  109634.  
  109635. initialize
  109636.     "Private - Initialize the receiver"
  109637.  
  109638.     super initialize.
  109639.     list := OrderedCollection new.!
  109640.  
  109641. list
  109642.     "Private - Answers the message list"
  109643.  
  109644.     ^list!
  109645.  
  109646. messagesDo: aBlock
  109647.     "Private - Enumerates through the receiver"
  109648.  
  109649.     ^list do: aBlock!
  109650.  
  109651. removeMessagesFor: anObject
  109652.     "Removes all the messages in this sequence that are destined for anObject.
  109653.     Answer the receiver."
  109654.  
  109655.     list := list reject: [ :each | each receiver == anObject]!
  109656.  
  109657. size
  109658.     "Answers the number of messages in the sequence"
  109659.  
  109660.     ^list size! !
  109661.  
  109662. AspectBuffer comment:
  109663. 'An AspectBuffer is used to buffer changes to the aspects of a subject object. These changes are held in a copy of the subject until the buffer receives an #apply message. A client of the buffer can request an aspect for the subject using #aspectValue: and it will receive an appropriate <ValueAspectAdapter>. Only the aspects that have been explicitly requested and then modified will be updated back to the subject when #apply is received.  
  109664.  
  109665. In order to be correctly used with an AspectBuffer, a subject object must be able to be sensibly duplicated using #copy. The advantage of keeping a complete copy of the subject within the buffer is that the validity of any changes made to it can be tested using #isValid before the changes are applied back. By default the validation check is made by sending #isValid to the subject copy. This default can be modified  by changing the isValidBlock in the buffer.
  109666.  
  109667. Instance Variables:
  109668.     subject        <Object> which is the subject whose aspects are being buffered.
  109669.     subjectCopy    <Object> copy of the subject.
  109670.     aspects        <IdentityDictionary> mapping put selectors of changed aspects to their values.
  109671.     gate        <ValueHolder> which when set true apply changes back to the subject.
  109672.     isValidBlock    <monadicValuable> to determine of the subject copy is valid before applying changes.
  109673.  
  109674. '!
  109675. !AspectBuffer class methodsFor!
  109676.  
  109677. icon
  109678.     "Answers an Icon that can be used to represent this class"
  109679.  
  109680.     ^##(self) defaultIcon!
  109681.  
  109682. new
  109683.     "Private - Use #subject:"
  109684.  
  109685.     self shouldNotImplement!
  109686.  
  109687. subject: aSubjectModel
  109688.     "Answer an instance of the receiver that buffers the aspects of aSubjectModel"
  109689.  
  109690.     ^super new subject: aSubjectModel
  109691. ! !
  109692.  
  109693. !AspectBuffer methodsFor!
  109694.  
  109695. apply
  109696.     "Apply the aspects held by the receiver in the model copy back to the 
  109697.     original model"
  109698.  
  109699.     aspects do: [:each | 
  109700.         self subject perform: each putSelector with: each value ]
  109701. !
  109702.  
  109703. aspectValue: anAspectSymbol
  109704.     "Answer a ValueAspectAdapter for anAspectSymbol of our copied model. 
  109705.     If a request for this aspect has already been registered then the same
  109706.     adapter model is answered. Otherwise a new one is created and registered
  109707.     in our aspects dictionary"
  109708.  
  109709.     ^aspects at: anAspectSymbol ifAbsentPut: [
  109710.             ValueAspectAdaptor subject: subjectCopy aspect: anAspectSymbol]!
  109711.  
  109712. defaultIsValidBlock
  109713.     "Private - Answer a default one argument block that can be used (by #isValid) to
  109714.     test whether changes made to the receiver's model copy are valid. The argument
  109715.     to the block is expected to be the copy. By default send #isValid to the copy
  109716.     to test validity."
  109717.  
  109718.     ^[:x | x isValid ]!
  109719.  
  109720. doesNotUnderstand: aMessage
  109721.     "The receiver has not understood aMessage. Most likely this is because it was intended for
  109722.     the buffered copy of the subject so we forward to this."
  109723.  
  109724.     ^aMessage forwardTo: subjectCopy!
  109725.  
  109726. gate
  109727.     "Answer the gate value model that controls when (and if) changes will be 
  109728.     flushed back to the original model."
  109729.  
  109730.     ^gate!
  109731.  
  109732. gate: aValueModelGate
  109733.     "Set the gate model to be aValueModelGate. Changes will be flushed back to 
  109734.     the original model when the value of aValueModelGate is set
  109735.     to true."
  109736.  
  109737.     gate := aValueModelGate.
  109738.     gate when: #valueChanged send: #onGateChanged to: self.!
  109739.  
  109740. initialize
  109741.     "Private - Initialize the receiver"
  109742.  
  109743.     gate := false asValue.
  109744.     aspects := IdentityDictionary new.
  109745.     isValidBlock := self defaultIsValidBlock!
  109746.  
  109747. isValid
  109748.     "Answer true if the updates to the model copy are valid.
  109749.     Evaluate the isValidBlock to check validity of the copy"
  109750.  
  109751.     ^self isValidBlock value: subjectCopy!
  109752.  
  109753. isValidBlock
  109754.     "Answer the validation block for the receiver"
  109755.  
  109756.     ^isValidBlock!
  109757.  
  109758. isValidBlock: aOneArgBlock
  109759.     "Sets the validation block to aOneArgBlock which will be passed the subject copy
  109760.     as its parameter. The block should answer true if the copy can be considered to be
  109761.     valid such that it's changes can be applied back to the actual subject"
  109762.  
  109763.     isValidBlock := aOneArgBlock!
  109764.  
  109765. onGateChanged
  109766.     "Private - Received when the gate has been triggered. 
  109767.     Use this to either flush changes back to the subject if required"
  109768.  
  109769.     self gate value ifTrue: [ self apply ]!
  109770.  
  109771. revert
  109772.     "Revert the aspects held by the receiver to their values from the original subject"
  109773.  
  109774.     subjectCopy := self subject copy.
  109775.     aspects do: [:each | 
  109776.         each subject: subjectCopy.
  109777.         each notifyChanged ].
  109778. !
  109779.  
  109780. subject
  109781.     "Answer the subject model of the receiver"
  109782.  
  109783.     ^subject
  109784.  
  109785.     !
  109786.  
  109787. subject: aSubjectModel
  109788.     "Attach the receiver to aSubjectModel. The model must respond intelligently to #copy
  109789.     since copy of it is made here to be used as the buffer for future updates"
  109790.  
  109791.     subject := aSubjectModel.
  109792.     subjectCopy := aSubjectModel copy.
  109793.     aspects := IdentityDictionary new.
  109794.  
  109795.     !
  109796.  
  109797. value
  109798.     "Answer the copy of the subject model"
  109799.  
  109800.     ^subjectCopy! !
  109801.  
  109802. PersonalAccount comment:
  109803. 'A PersonalAccount holds all details pertaining to a single account in the PersonalMoney system. 
  109804.  
  109805. Instance Variables
  109806.     accountNumber     <String> containing the account number.
  109807.     name        <String> containing the account name.
  109808.     initialBalance    <Number> that is the opening balance of the account.
  109809.     currentBalance    <Number> that is the current balance of the account after the transactions have been applied.
  109810.     transactions     <SortedCollection> of PersonalAccountTransactions.
  109811.  
  109812.  
  109813. '!
  109814. !PersonalAccount class methodsFor!
  109815.  
  109816. publishedEventsOfInstances
  109817.     "Answer a Set of Symbols that describe the published events triggered
  109818.     by instances of the receiver."
  109819.  
  109820.     ^super publishedEventsOfInstances
  109821.         add: #currentBalanceChanged;
  109822.         yourself.
  109823. ! !
  109824.  
  109825. !PersonalAccount methodsFor!
  109826.  
  109827. accountNumber
  109828.     "Answer the account number of the receiver"
  109829.  
  109830.     ^accountNumber!
  109831.  
  109832. accountNumber: aString
  109833.     "Set the account number of the receiver to aString"
  109834.  
  109835.     accountNumber := aString!
  109836.  
  109837. addTransaction: aPersonalAccountTransaction
  109838.     "Add aPersonalAccountTransactions to the collection of transactiosn owned by the receiver.
  109839.     Answers aPersonalAccountTransaction"
  109840.  
  109841.     self transactions add: aPersonalAccountTransaction.
  109842.     self calculateCurrentBalance.
  109843.     ^aPersonalAccountTransaction!
  109844.  
  109845. calculateCurrentBalance
  109846.     "Calculate and set the current balance of the receiver. Add the total
  109847.     of all the actual amounts to the initial balance"
  109848.  
  109849.     | balance |
  109850.     balance := self transactions inject: self initialBalance into: [:total :each |
  109851.         total + each actualAmount ].
  109852.     self currentBalance: balance.!
  109853.  
  109854. currentBalance
  109855.     "Answer the calculated current balance of the receiver."
  109856.  
  109857.     ^currentBalance!
  109858.  
  109859. currentBalance: aNumber
  109860.     "Set the current balance of the receiver to aNumber."
  109861.  
  109862.     currentBalance := aNumber.
  109863.     self trigger: #currentBalanceChanged!
  109864.  
  109865. displayOn: aStream
  109866.     "Append, to aStream, a String whose characters are a description of the receiver as a user
  109867.     would want to see it."
  109868.  
  109869.     self name displayOn: aStream.
  109870.     aStream nextPut: $-.
  109871.     self accountNumber displayOn: aStream.
  109872. !
  109873.  
  109874. initialBalance
  109875.     "Answer the account initial balance of the receiver"
  109876.  
  109877.     ^initialBalance!
  109878.  
  109879. initialBalance: aNumber
  109880.     "Set the account initial balance of the receiver to aNumber"
  109881.  
  109882.     initialBalance := aNumber.
  109883.     self calculateCurrentBalance!
  109884.  
  109885. initialize
  109886.     "Private - Initialize the receiver"
  109887.  
  109888.     name := 'New account'.
  109889.     initialBalance := currentBalance := 0.0.
  109890.     transactions := ListModel on: 
  109891.         (SortedCollection sortBlock: [:x :y | x date <= y date])!
  109892.  
  109893. name
  109894.     "Answer the account name of the receiver"
  109895.  
  109896.     ^name!
  109897.  
  109898. name: aString
  109899.     "Set the account name of the receiver to aString"
  109900.  
  109901.     name := aString!
  109902.  
  109903. printOn: aStream
  109904.     "Append, to aStream, a String whose characters are a description of the receiver as a developer
  109905.     would want to see it."
  109906.  
  109907.     aStream 
  109908.         basicPrint: self;
  109909.         nextPut: $(;
  109910.         display: self name;
  109911.         nextPut: $,;
  109912.         display: self accountNumber;
  109913.         nextPut: $,;
  109914.         display: self currentBalance;
  109915.         nextPut: $)!
  109916.  
  109917. removeTransaction: aPersonalAccountTransaction
  109918.     "Remove aPersonalAccountTransactions from the collection of transactiosn owned by the receiver.
  109919.     Answers aPersonalAccountTransaction"
  109920.  
  109921.     self transactions remove: aPersonalAccountTransaction.
  109922.     self calculateCurrentBalance.
  109923.     ^aPersonalAccountTransaction!
  109924.  
  109925. transactions
  109926.     "Answer the transactions collection"
  109927.  
  109928.     ^transactions! !
  109929.  
  109930. PersonalAccountTransaction comment:
  109931. 'A PersonalAccountTransaction holds details regarding a single transaction for an account within the PersonalMoney system.
  109932.  
  109933. Instance Variables
  109934.     amount        <Number> containing the amount of the transaction.
  109935.     description        <String> describing the purpose of the transactions.
  109936.     date        <Date> on which the transaction was made.
  109937.     isDebit        <Boolean> that indicates whether the transaction is a debit or credit.'!
  109938. !PersonalAccountTransaction methodsFor!
  109939.  
  109940. actualAmount
  109941.     "Answer the actual amount of the receiver taking into consideration
  109942.     whether it is a debit or credit transaction"
  109943.  
  109944.     ^self isDebit
  109945.         ifTrue: [ self amount negated ]
  109946.         ifFalse: [ self amount ]!
  109947.  
  109948. amount
  109949.     "Answer the amount of the receiver"
  109950.  
  109951.     ^amount!
  109952.  
  109953. amount: aNumber
  109954.     "Set the amount of the receiver to aNumber"
  109955.  
  109956.     amount := aNumber!
  109957.  
  109958. date
  109959.     "Answer the date of the receiver"
  109960.  
  109961.     ^date!
  109962.  
  109963. date: aDate
  109964.     "Set the date of the receiver to aDate"
  109965.  
  109966.     date := aDate!
  109967.  
  109968. description
  109969.     "Answer the String description of the receiver"
  109970.  
  109971.     ^description!
  109972.  
  109973. description: aString
  109974.     "Set the description of the receiver to aString"
  109975.  
  109976.     description := aString!
  109977.  
  109978. displayOn: aStream
  109979.     "Append, to aStream, a String whose characters are a description of the receiver as a user
  109980.     would want to see it."
  109981.  
  109982.     self date displayOn: aStream.
  109983.     aStream nextPutAll: ': '.
  109984.     aStream nextPutAll: self description.
  109985.     aStream nextPutAll: (self isDebit 
  109986.         ifTrue: [' - debit ']
  109987.         ifFalse: [ ' - credit ']).
  109988.     self amount displayOn: aStream.
  109989. !
  109990.  
  109991. initialize
  109992.     "Private - Initialize the receiver"
  109993.  
  109994.     date := Date today.
  109995.     description := String new.
  109996.     amount := 0.0.
  109997.     isDebit := true!
  109998.  
  109999. isDebit
  110000.     "Answer true if the receiver is a Debit transaction"
  110001.  
  110002.     ^isDebit!
  110003.  
  110004. isDebit: aBoolean
  110005.     "Set the receiver to a Debit transaction according to aBoolean.
  110006.     If aBoolean is true then the receiver is treated as a credit"
  110007.  
  110008.     isDebit := aBoolean!
  110009.  
  110010. printOn: aStream
  110011.     "Append, to aStream, a String whose characters are a description of the receiver as a developer
  110012.     would want to see it."
  110013.  
  110014.     aStream 
  110015.         basicPrint: self;
  110016.         nextPut: $(;
  110017.         display: self;
  110018.         nextPut: $)! !
  110019.  
  110020. PersonalMoney comment:
  110021. 'PersonalMoney represent the entirety of the Personal Money system for a single user. It hold owner details and a collection of accounts for this user.
  110022.  
  110023. Instance Variables
  110024.     owner    <String> containing the owner''s name
  110025.     accounts    <OrderedCollection> of PersonalAccounts.'!
  110026. !PersonalMoney methodsFor!
  110027.  
  110028. accounts
  110029.     "Answer the accounts collection"
  110030.  
  110031.     ^accounts!
  110032.  
  110033. addAccount: aPersonalAccount
  110034.     "Add aPersonalAccount to the collection of accounts owned by the receiver.
  110035.     Answers aPersonalAccount"
  110036.  
  110037.     ^self accounts add: aPersonalAccount!
  110038.  
  110039. initialize
  110040.     "Private - Initialize the receiver"
  110041.  
  110042.     accounts := ListModel new!
  110043.  
  110044. owner
  110045.     "Answer the owner of the receiver"
  110046.  
  110047.     ^owner!
  110048.  
  110049. owner: aString
  110050.     "Set the owner of the receiver to aString"
  110051.  
  110052.     owner := aString!
  110053.  
  110054. printOn: aStream
  110055.     "Append, to aStream, a String whose characters are a description of the receiver as a developer
  110056.     would want to see it."
  110057.  
  110058.     aStream basicPrint: self; nextPut: $(; print: self owner; nextPut: $).!
  110059.  
  110060. removeAccount: aPersonalAccount
  110061.     "Remove aPersonalAccount from the collection of accounts owned by the receiver.
  110062.     Answers aPersonalAccount"
  110063.  
  110064.     ^self accounts remove: aPersonalAccount! !
  110065.  
  110066. ResourceManager comment:
  110067. 'The ResourceManager manages the MVP resources in the system. Every class is capable of supporting a number of named resources.
  110068.  
  110069. Instance Variables:
  110070.     resourcePools        <IdentityDictionary> mapping classes to <PoolDictionary>s holding the named resources.
  110071.     clipboard            <DragDropObject> or nil, acting as an internal clipboard.
  110072.  
  110073. '!
  110074. !ResourceManager class methodsFor!
  110075.  
  110076. icon
  110077.     "Answers an Icon that can be used to represent this class."
  110078.  
  110079.     ^Icon fromId: '!!APPLICATION'!
  110080.  
  110081. onPreStripImage
  110082.     "Private - The image is about to be stripped. Nil any lazily initialized class variables."
  110083.  
  110084.     SessionManager current resourceManager clearClipboard!
  110085.  
  110086. publishedEventsOfInstances
  110087.         "Answer a Set of Symbols that describe the published events triggered
  110088.         by instances of the receiver."
  110089.     
  110090.         ^super publishedEventsOfInstances
  110091.             add: #resourceRemoved:;
  110092.             add: #resourceUpdated:;
  110093.             add: #resourceAdded:;
  110094.             yourself.
  110095.     ! !
  110096.  
  110097. !ResourceManager methodsFor!
  110098.  
  110099. addToClipboard: aDragDropObject
  110100.     "Add aDragDropObjects to the collection held in the receiver's clipboard inst var."
  110101.  
  110102.     clipboard isNil
  110103.         ifTrue: [clipboard := OrderedCollection new].
  110104.     clipboard add: aDragDropObject!
  110105.  
  110106. allResourceIdentifiers
  110107.     "Answer a collection of all ResourceIdentifiers."
  110108.  
  110109.     | allResIDs |
  110110.     allResIDs := OrderedCollection new.
  110111.     self classesWithResources do: [:cls |
  110112.         (self resourcesForClass: cls) keysDo: [:resName |
  110113.             allResIDs add: (ResourceIdentifier class: cls name: resName)]].
  110114.     ^allResIDs!
  110115.  
  110116. at: aResourceIdentifier
  110117.     "Deprecated as over-generic collection selector - use #resourceAt:"
  110118.  
  110119.     Notification deprecated.
  110120.     ^self resourceAt: aResourceIdentifier!
  110121.  
  110122. at: aResourceIdentifier ifAbsent: aNiladicValuable
  110123.     "Deprecated as over-generic collection selector - use #resourceAt:ifAbsent:"
  110124.  
  110125.     Notification deprecated.
  110126.     ^self resourceAt: aResourceIdentifier ifAbsent: aNiladicValuable!
  110127.  
  110128. at: aResourceIdentifier put: aResource
  110129.     "Deprecated as over-generic collection selector - use #resourceAt:put:"
  110130.  
  110131.     Notification deprecated.
  110132.     ^self resourceAt: aResourceIdentifier put: aResource!
  110133.  
  110134. classesWithResources
  110135.     "Answer a SortedCollection of those classes that own resources."
  110136.  
  110137.     ^resourcePools keys asSortedCollection!
  110138.  
  110139. clearClipboard
  110140.     "Clear the clipboard."
  110141.  
  110142.     clipboard := nil!
  110143.  
  110144. clipboard
  110145.     "Answer the receiver's clipboard inst var. This is either an OrdreredCollection of
  110146.     DragDropObjects or nil."
  110147.  
  110148.     ^clipboard!
  110149.  
  110150. clipboard: aCollectionOfDragDropObjects
  110151.     "Set the receiver's clipboard inst var to aCollectionOfDragDropObjects."
  110152.  
  110153.     clipboard := aCollectionOfDragDropObjects!
  110154.  
  110155. initialize
  110156.     "Private - Initialize the receiver."
  110157.  
  110158.     resourcePools := WeakIdentityDictionary newWithWeakKeys: 16.
  110159.     (self class environment)
  110160.         when: #classRemoved:
  110161.             send: #onClassRemoved:
  110162.             to: self;
  110163.         when: #globalRenamed:from:
  110164.             send: #onGlobalRenamed:from:
  110165.             to: self!
  110166.  
  110167. onClassRemoved: aClass
  110168.     "Remove the resources associated with aClass."
  110169.  
  110170.     (self resourcesForClass: aClass) keysDo: [:each |
  110171.         self removeResource: (ResourceIdentifier class: aClass name: each) ].!
  110172.  
  110173. onGlobalRenamed: anAssociation from: aSymbol
  110174.     | global |
  110175.     global := anAssociation value.
  110176.     global class isMeta 
  110177.         ifTrue: [(self resourceIdentifiersForClass: global) do: [:each | each isChanged: true]]!
  110178.  
  110179. remove: aResourceIdentifier
  110180.     "Deprecated as over-generic collection selector, use #removeResource: instead."
  110181.  
  110182.     Notification deprecated.
  110183.     ^self removeResource: aResourceIdentifier!
  110184.  
  110185. removeResource: aResourceIdentifier
  110186.     "Remove the resource identified by aResourceIdentifier."
  110187.  
  110188.     | owningClass pool assoc |
  110189.     owningClass := aResourceIdentifier owningClass.
  110190.     pool := resourcePools at: owningClass ifAbsent: [^self].
  110191.     assoc := pool associationAt: aResourceIdentifier name ifAbsent: [^self].
  110192.     pool removeKey: assoc key.
  110193.     pool isEmpty
  110194.         ifTrue: [resourcePools removeKey: owningClass].
  110195.  
  110196.     self trigger: #resourceRemoved: with: aResourceIdentifier
  110197. !
  110198.  
  110199. resetIcons
  110200.     "Private - Resets the icons for all resources kept by the receiver. New icons are determined
  110201.         by loading the resource and asking for its icon. This is really a boot method and not intended
  110202.         for user consumption since it really is pretty nasty"
  110203.  
  110204.     "Create a ShellView as a context into which view resources can be loaded"
  110205.  
  110206.     | shellView |
  110207.     shellView := ShellView new create.
  110208.     self allResourceIdentifiers do: 
  110209.             [:each | 
  110210.             (each resource isKindOf: ViewResource) 
  110211.                 ifTrue: 
  110212.                     ["View resources must be loaded into a parent and subsequently destroyed"
  110213.                     | parentView loaded |
  110214.                     parentView := (each owningClass includesBehavior: Shell) 
  110215.                                 ifTrue: [View desktop]
  110216.                                 ifFalse: [shellView].
  110217.                     loaded := each loadWithContext: parentView.
  110218.                     each resource icon: loaded icon.
  110219.                     loaded destroy]
  110220.                 ifFalse: 
  110221.                     ["Load other resources straight"
  110222.                     | loaded |
  110223.                     loaded := each loadWithContext: nil.
  110224.                     each resource icon: loaded icon]].
  110225.     shellView destroy!
  110226.  
  110227. resourceAt: aResourceIdentifier
  110228.     "Answer the <Resource> identified by aResourceIdentifer, or nil if not found."
  110229.  
  110230.     ^self resourceAt: aResourceIdentifier ifAbsent: []!
  110231.  
  110232. resourceAt: aResourceIdentifier ifAbsent: aNiladicValuable
  110233.     "Answer the Resource identified by aResourceIdentifer."
  110234.  
  110235.     | pool name |
  110236.     pool :=  resourcePools at: aResourceIdentifier owningClass ifAbsent: [^aNiladicValuable value].
  110237.     name := aResourceIdentifier name.
  110238.     ^name notNil 
  110239.         ifTrue: [pool at: name ifAbsent: aNiladicValuable]
  110240.         ifFalse: [aNiladicValuable value]!
  110241.  
  110242. resourceAt: aResourceIdentifier put: aResource
  110243.     "Add/update the resource identified by aResourceIdentifier with aResource."
  110244.  
  110245.     | pool assoc |
  110246.     pool := resourcePools at: aResourceIdentifier owningClass ifAbsentPut: [PoolDictionary new].
  110247.     assoc := pool associationAt: aResourceIdentifier name ifAbsent: [
  110248.             pool at: aResourceIdentifier name put: aResource.
  110249.             self trigger: #resourceAdded: with: aResourceIdentifier.
  110250.             ^aResource].
  110251.     assoc value: aResource.
  110252.     self trigger: #resourceUpdated: with: aResourceIdentifier.
  110253.     ^aResource!
  110254.  
  110255. resourceIdentifiersForClass: aClass
  110256.     "Answer a <collection> of all <ResourceIdentifier>s that identify all of the resources
  110257.     associated with the specified class.."
  110258.  
  110259.     | answer |
  110260.     answer := OrderedCollection new.
  110261.     (self resourcesForClass: aClass) keysDo: [:each |
  110262.             answer add: (ResourceIdentifier class: aClass name: each)].
  110263.     ^answer!
  110264.  
  110265. resourcePools
  110266.     "Private - Answer the value of the receiver's ''resourcePools'' instance variable."
  110267.  
  110268.     ^resourcePools!
  110269.  
  110270. resourcePools: anObject
  110271.     "Private - Set the value of the receiver's ''resourcePools'' instance variable to the argument, anObject."
  110272.  
  110273.     resourcePools := anObject!
  110274.  
  110275. resourcesForClass: aClass
  110276.     "Answer a PoolDictionary of resources owned by aClass."
  110277.  
  110278.     ^resourcePools at: aClass ifAbsent: [PoolDictionary new]!
  110279.  
  110280. resourcesForClass: aClass ifNone: exceptionHandler
  110281.     "Answer a <PoolDictionary> of resources owned by aClass,
  110282.     or the result of evaluating the <niladicValuable>, exceptionHandler,
  110283.     if the class has no resources."
  110284.  
  110285.     ^resourcePools at: aClass ifAbsent: exceptionHandler!
  110286.  
  110287. whichResourcesReference: anObject
  110288.     "Answer a <collection> of <ResourceIdentifier>s identifying all the resources managed by the receiver
  110289.         that reference the specified <Object>."
  110290.  
  110291.     ^self allResourceIdentifiers select: [:each | each resource refersTo: anObject]! !
  110292.  
  110293. SmalltalkSystem comment:
  110294. 'SmalltalkSystem is a Facade onto the Dolphin Smalltalk development environment. Most of the development tools hold the Singleton instance of SmalltalkSystem as their model and use it to act as a go-between between programmer, user interface, and the development image.
  110295.  
  110296. Instance Variables:
  110297.     classHierarchyModel        <ClassHierarchyModel> representing the hierarchy of classes in the system.
  110298.     unsued            <UndefinedObject> reserved for future use.
  110299.     isOAD            <boolean> indicating whether the system is configured for Object Arts development use.
  110300.     systemFolder        <treeModel> holding the contents of the System Folder.
  110301.  
  110302. Class Variables:
  110303.     RegisteredTools        <Set>
  110304.     Current            <SmalltalkSystem>
  110305.  
  110306. '!
  110307. !SmalltalkSystem class methodsFor!
  110308.  
  110309. current
  110310.     "Answer the singleton instance of the receiver.
  110311.     N.B. Special boot handling to create this."
  110312.  
  110313.     Current isNil ifTrue: [Current := self basicNew initialize; yourself].
  110314.     ^Current!
  110315.  
  110316. help: educationPage
  110317.     "Displays the education page specified by the <readableString> educationPage"
  110318.  
  110319.     self current openEducationTopic: educationPage!
  110320.  
  110321. icon
  110322.     "Answers an Icon that can be used to represent this class"
  110323.  
  110324.     ^Icon fromId: '!!APPLICATION'
  110325.  
  110326. !
  110327.  
  110328. new
  110329.     "Private - The receiver is a Singleton class; use #current"
  110330.  
  110331.     self shouldNotImplement!
  110332.  
  110333. publishedAspectsOfInstances
  110334.     "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  110335.  
  110336.     ^(super publishedAspectsOfInstances)
  110337.         add: (Aspect boolean: #autoFormatMethodSource);
  110338.         add: (Aspect font: #defaultFont);
  110339.         add: (Aspect name: #hierarchyBrowserClass);
  110340.         add: (Aspect name: #systemBrowserClass);
  110341.         add: (Aspect name: #debuggerClass);
  110342.         add: (Aspect name: #methodBrowserClass);
  110343.         add: (Aspect name: #packageBrowserClass);
  110344.         add: (Aspect name: #protocolBrowserClass);
  110345.         add: (Aspect name: #resourceBrowserClass);
  110346.         add: (Aspect name: #tipOfTheDayClass);
  110347.         add: (Aspect name: #viewComposerClass);
  110348.         add: (Aspect name: #workspaceClass);
  110349.         add: (Aspect name: #classChooserClass);
  110350.         add: (Aspect name: #resourceIdentifierDialogClass);
  110351.         add: (Aspect boolean: #backupOnImageSave);
  110352.         add: (Aspect boolean: #preferAlternateInspectors);
  110353.         add: (Aspect choice: #formatterClass
  110354.                     from: (ClassCategory name: 'System-Compiler-Formatters') contents);
  110355.         yourself!
  110356.  
  110357. publishedEventsOfInstances
  110358.     "Answer a <Set> of <Symbol>s, being the names of all events published 
  110359.     by instances of the receiver."
  110360.  
  110361.     ^(super publishedEventsOfInstances)
  110362.         add: #methodAdded:;
  110363.         add: #methodUpdated:;
  110364.         add: #methodRemoved:;
  110365.         add: #methodCategorized:;
  110366.         add: #classAdded:;
  110367.         add: #classUpdated:;
  110368.         add: #classRemoved:;
  110369.         add: #classCategorized:;
  110370.         add: #globalRenamed:from:;
  110371.         add: #globalRemoved:;
  110372.         add: #protocolUpdated:;
  110373.         add: #protocolRemoved:;
  110374.         yourself!
  110375.  
  110376. registeredTools
  110377.     "Answers the collection of tools registered for the receiver"
  110378.  
  110379.     RegisteredTools isNil ifTrue: [
  110380.         RegisteredTools := Set new ].
  110381.     ^RegisteredTools!
  110382.  
  110383. registerTool: aToolClass
  110384.     "Adds aToolClass to the collection of registered tools for the receiver"
  110385.  
  110386.     self registeredTools add: aToolClass.
  110387.     (aToolClass class conformsToProtocol: #installableSystemTool) 
  110388.         ifTrue: [aToolClass registerAsToolWith: self]!
  110389.  
  110390. uninitialize
  110391.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  110392.  
  110393.     Current isNil ifFalse: [Current uninitialize].
  110394.     Current := nil.
  110395.     RegisteredTools := nil.!
  110396.  
  110397. unregisterTool: aToolClass
  110398.     "Removes aToolClass from the collection of registered tools for the receiver."
  110399.  
  110400.     (aToolClass class conformsToProtocol: #installableSystemTool) 
  110401.         ifTrue: [aToolClass unregisterAsToolWith: self].
  110402.     self registeredTools remove: aToolClass ifAbsent: []! !
  110403.  
  110404. !SmalltalkSystem methodsFor!
  110405.  
  110406. aboutBoxClass
  110407.     "Private - Answer the class of about box to display on request."
  110408.  
  110409.     ^DolphinSplash!
  110410.  
  110411. aboutDolphin
  110412.     "Show the About box, or if the display is not capable a simple MessageBox with pertinent details."
  110413.  
  110414.     self aboutBoxClass canDisplay 
  110415.         ifTrue: [self aboutBoxClass new show]
  110416.         ifFalse: [ | msg version |
  110417.             version := VMLibrary default versionInfo.
  110418.             msg := 'Dolphin Smalltalk - %1%n%n%2'
  110419.                     formatWith: SessionManager current versionString
  110420.                     with: version legalCopyright.
  110421.             MessageBox new
  110422.                 caption: 'About Dolphin Smalltalk...';
  110423.                 icon: self icon;
  110424.                 text: msg;
  110425.                 open].!
  110426.  
  110427. add: selectors toProtocolWarning: targetProtocol
  110428.     "Private - Warn about the generation of stub methods if a protocol is being extended
  110429.     and doing so would require new stubs."
  110430.  
  110431.     | msg newSelectors stubs |
  110432.     "First determine if any warning is necessary"
  110433.     newSelectors := selectors difference: targetProtocol selectors.
  110434.     newSelectors isEmpty ifTrue: ["No change in protocol" ^true].
  110435.  
  110436.     stubs := (targetProtocol baseBehaviors collect: [:c |
  110437.             c -> (newSelectors reject: [:s | c canUnderstand: s])])
  110438.                 select: [:a | a value notEmpty].
  110439.  
  110440.     stubs isEmpty ifTrue: ["All classes still conform" ^true].
  110441.  
  110442.     msg := String writeStream.
  110443.     msg nextPutAll: 'Please be aware that extending the protocol '; display: targetProtocol; nextPutAll: ' to include:'; crtab.
  110444.     newSelectors do: [:s | msg print: s] separatedBy: [msg space].
  110445.     msg cr; cr;
  110446.         nextPutAll: 'will cause the following stub methods to be automatically generated:'; crtab.
  110447.     stubs do: [:a |
  110448.         msg nextPutAll: a key name; space; nextPut: $(.
  110449.         a value do: [:s | msg print: s] separatedBy: [msg space].
  110450.         msg nextPut: $); crtab].
  110451.     msg cr;
  110452.         nextPutAll: 'These stub methods can be subsequently be located by browsing the '; cr;
  110453.         nextPutAll: '''not yet implemented'' category.'; cr; cr;
  110454.         nextPutAll: 'Are you sure that you would like to proceed?'.
  110455.  
  110456.     ^(MessageBox new
  110457.         yesNo; defaultButton: 2;
  110458.         caption: 'Extend protocol ', targetProtocol displayString;
  110459.         warning: msg contents) == #yes!
  110460.  
  110461. addAdditionalToolsFolderIcon: aSmalltalkSystemIcon
  110462.     "Adds aSmalltalkSystemFolderIcon to the Additional Tools system folder.
  110463.     Note that an attempt is made to first remove any equivalent (same named) icons from 
  110464.     the entire sytem folder hierarchy. Answers aSmalltalkSystemIcon."
  110465.  
  110466.     self addSystemFolderIcon: aSmalltalkSystemIcon to: self additionalToolsFolder
  110467.  
  110468. !
  110469.  
  110470. addClass: class toProtocol: newProtocol 
  110471.     "Private - Add the <MethodProtocol>, newProtocol, to the <ClassDescription>, class, if
  110472.     either the class already implements all of the methods, or alternatively if the user 
  110473.     agrees to the generation of stub methods. Answer whether the protocol was actually    
  110474.     added."
  110475.  
  110476.     "Determine if the class includes the protocol already - if it does, then early out"
  110477.  
  110478.     | missing |
  110479.     (class conformsToProtocol: newProtocol) ifTrue: [^false].
  110480.     missing := newProtocol selectors reject: [:s | class canUnderstand: s].
  110481.     missing notEmpty 
  110482.         ifTrue: 
  110483.             [| stm |
  110484.             stm := String writeStream: 256.
  110485.             stm
  110486.                 nextPutAll: class name;
  110487.                 nextPutAll: ' does not currently implement or inherit the following selectors from';
  110488.                 cr;
  110489.                 nextPutAll: 'the protocol ';
  110490.                 display: newProtocol;
  110491.                 nextPut: $;;
  110492.                 cr;
  110493.                 cr.
  110494.             missing do: [:m | stm print: m] separatedBy: [stm space].
  110495.             stm
  110496.                 cr;
  110497.                 cr;
  110498.                 nextPutAll: 'Stub implementations will be automatically generated for the missing selectors.';
  110499.                 cr;
  110500.                 nextPutAll: 'Do you still wish to add the protocol to the class?'.
  110501.             (MessageBox new confirm: stm contents) ifFalse: [^false]].
  110502.     newProtocol addClass: class.
  110503.     self classChanged: class.
  110504.     ^true!
  110505.  
  110506. addGlobalName: aSymbol
  110507.     "Adds a global called aSymbol to the system dictionary"
  110508.  
  110509.     self environment at: aSymbol put: nil!
  110510.  
  110511. additionalToolsFolder
  110512.     "Private - Answer the <SmalltalkSystemFolder> that holds the addtional tools hierarchy. This is can
  110513.     be used by 3rd party tools to install themselves into the system folder"
  110514.  
  110515.     ^self systemFolder asOrderedCollection detect: [:each | each description='Additional Tools'].!
  110516.  
  110517. addMethod: method toProtocol: target
  110518.     "Add the <CompiledMethod>, method, to the <MethodProtocol> target"
  110519.  
  110520.     (self add: (Array with: method selector) toProtocolWarning: target) 
  110521.         ifTrue: [target addSelector: method selector]!
  110522.  
  110523. addProtocolSelectors: source toProtocol: target
  110524.     "Private - Add the all of the selectors from <MethodProtocol> source to the target <MethodProtocol>."
  110525.  
  110526.     self addSelectors: source selectors toProtocol: target
  110527. !
  110528.  
  110529. addSamplesFolderIcon: aSmalltalkSystemIcon
  110530.     "Adds aSmalltalkSystemFolderIcon to the Sample Applications system folder.
  110531.     Note that an attempt is made to first remove any equivalent (same named) icons from 
  110532.     the entire sytem folder hierarchy. Answers aSmalltalkSystemIcon."
  110533.  
  110534.     self addSystemFolderIcon: aSmalltalkSystemIcon to: self samplesFolder!
  110535.  
  110536. addSamplesFolderIconFor: anInstallableSystemTool description: titleString
  110537.     "Add a <SmalltalkSystemIcon> to the Sample Applications system folder for the
  110538.     specified <installableSystemTool> and with the <readableString> description, titleString."
  110539.  
  110540.     self addSamplesFolderIcon: (SmalltalkSystemIcon show: anInstallableSystemTool description: titleString)!
  110541.  
  110542. addSelectors: sels toProtocol: protocol 
  110543.     "Add the <collection> of selectors, sels, to the <MethodProtocol>, protocol.
  110544.     Bring up a warning indicating the ramifications of such a global action."
  110545.  
  110546.     sels notEmpty 
  110547.         ifTrue: 
  110548.             [(self add: sels toProtocolWarning: protocol) 
  110549.                 ifTrue: [sels do: [:s | protocol addSelector: s]]]!
  110550.  
  110551. addSystemFolderIcon: aSmalltalkSystemIcon
  110552.     "Adds aSmalltalkSystemFolderIcon to the root system folder.
  110553.     Note that an attempt is made to first remove any equivalent (same named) icons from 
  110554.     the entire sytem folder hierarchy. Answers aSmalltalkSystemIcon."
  110555.  
  110556.     self addSystemFolderIcon: aSmalltalkSystemIcon to: nil
  110557.  
  110558. !
  110559.  
  110560. addSystemFolderIcon: aSmalltalkSystemIcon to: aSmalltalkSystemFolderOrNil
  110561.     "Adds aSmalltalkSystemFolderIcon to the system folder identified by aSmalltalkSystemFolderOrNil.
  110562.     If the latter is nil then the icon is added to the root folder. Note that an attempt is made to first remove
  110563.     any equivalent (same named) icons from the entire sytem folder hierarchy. Answers
  110564.     aSmalltalkSystemIcon."
  110565.  
  110566.     self removeSystemFolderIcon: aSmalltalkSystemIcon.
  110567.     self systemFolder add: aSmalltalkSystemIcon asChildOf: aSmalltalkSystemFolderOrNil.
  110568.     ^aSmalltalkSystemIcon!
  110569.  
  110570. allImplementedSelectors
  110571.     "Answer a <Set> of all the <Symbol>s which currently have at least one implementation.
  110572.         SmalltalkSystem current allImplementedSelectors
  110573.     "
  110574.  
  110575.     | selectors |
  110576.     selectors := IdentitySet new: 10000.
  110577.     self environment allBehaviorsDo: [:c | selectors addAll: c understoodSelectors].
  110578.     ^selectors!
  110579.  
  110580. allReferencedSelectors
  110581.     "Answer a <Set> of all the <Symbol>s which might be selectors which are referenced from    
  110582.     methods in the image. N.B. This might take some time to execute, and may contain
  110583.     some symbols which are not actually selectors.
  110584.         SmalltalkSystem current allReferencedSelectors
  110585.     "
  110586.  
  110587.     | selectors |
  110588.     selectors := (IdentitySet new: 10000) addAll: VMLibrary default specialSelectors; yourself.
  110589.     self environment allBehaviorsDo: [:c |
  110590.         c methodDictionary do: [:m |
  110591.             "Deliberately exclude any #defineFields methods of classes"
  110592.             (m selector == #defineFields and: [c class isMeta]) ifFalse: [
  110593.                 m literalsDo: [:l | 
  110594.                     l class == Symbol 
  110595.                         ifTrue: [selectors add: l]
  110596.                         ifFalse: [
  110597.                             "Probe 1-level deep into literal arrays"
  110598.                             l class == Array ifTrue: [
  110599.                                 l do: [:e | e class == Symbol ifTrue: [selectors add: e]]]]]]]].
  110600.     "Now remove any event names"
  110601.     self environment allBehaviorsDo: [:c |
  110602.         #(publishedEvents publishedEventsOfInstances) do: [:s |
  110603.             (c includesSelector: s) ifTrue: [
  110604.                 (c compiledMethodAt: s) literalsDo: [:l | selectors remove: l ifAbsent: []]]]].
  110605.  
  110606.     "Remove all global names"
  110607.     self environment keysDo: [:k | selectors remove: k ifAbsent: []].
  110608.     ^selectors!
  110609.  
  110610. allResourceIdentifiers
  110611.     ^SessionManager current resourceManager allResourceIdentifiers!
  110612.  
  110613. allSentSelectors
  110614.     "Answer a <Set> of all the <Symbol>s which are directly sent by methods in the image.
  110615.     N.B. This will take execute, and will not contain any selectors which are only sent dynamically
  110616.     with #perform(etc), and which cannot therefore be safely used as the set of all required
  110617.     selectors.
  110618.         SmalltalkSystem current allSentSelectors
  110619.     "
  110620.  
  110621.     | selectors excluded |
  110622.     selectors := (IdentitySet new: 10000) addAll: VMLibrary default specialSelectors; yourself.
  110623.     excluded := (MethodCategory name: 'examples') contents.
  110624.     self environment allBehaviorsDo: [:c |
  110625.          c methodDictionary do: [:m | (excluded includes: m) ifFalse: [selectors addAll: m messages]]].
  110626.     ^selectors!
  110627.  
  110628. allSymbolsReferencedByResources
  110629.     "Answer a collection of all the symbols that are referenced from resources.
  110630.         Smalltalk developmentSystem allSymbolsReferencedByResources includes: #startsWith:
  110631.     "
  110632.  
  110633.     | answer |
  110634.     answer := IdentitySet new.
  110635.     self allResourceIdentifiers do: [:rid | answer addAll: rid resource hiddenSymbols].
  110636.     ^answer!
  110637.  
  110638. allUnimplementedSelectors
  110639.     "Answer a <Set> of all the <Symbol>s which are selectors which are referenced from    
  110640.     methods in the image but which have no corresponding implementation.
  110641.     N.B. This may not include any messages sent dynamically with #perform: and
  110642.     friends, and so should not be considered a guarantee that no send will ever result in 
  110643.     a DNU (which, of course, cannot be guaranteed anyway because there is no way of
  110644.     knowing that the object to which the message is sent actually implements that message).
  110645.  
  110646.         SmalltalkSystem current allUnimplementedSelectors asSortedCollection asArray
  110647.             do: [:m | SmalltalkSystem current browseReferencesTo: m]
  110648.     "
  110649.  
  110650.     ^self allSentSelectors difference: self allImplementedSelectors.!
  110651.  
  110652. autoFormatMethodSource
  110653.     ^MethodBrowser autoFormat!
  110654.  
  110655. autoFormatMethodSource: aBoolean
  110656.     MethodBrowser autoFormat: aBoolean!
  110657.  
  110658. availablePools
  110659.     "Answers a <sequencedReadableCollection> of all available pools in
  110660.     ascending name order.
  110661.         SmalltalkSystem current availablePools
  110662.     Implementation Note: The system pools (identified by a name that starts
  110663.     with an underscore) are specifically excluded. Note that we sort the 
  110664.     associations rather than the pools, as the latter must establish their
  110665.     global name by a reverse lookup in the system dictionary, which is
  110666.     very slow."
  110667.  
  110668.     ^(Smalltalk associations select: [:each |
  110669.         each key first ~~ $_ and: [
  110670.             (each value isKindOf: PoolDictionary) or: [
  110671.                 each value isKindOf: PoolConstantsDictionary]]])
  110672.         asSortedCollection asArray collect: [:each | each value]!
  110673.  
  110674. backupOnImageSave
  110675.     "Answer whether the image should be backed up (i.e. the old .img file is renamed to .bak when the new .img
  110676.     file is successfully written). Note that this will slow down the operation quite a bit, as the OS has to do a lot
  110677.     more juggling."
  110678.  
  110679.     ^SessionManager current backupOnImageSave!
  110680.  
  110681. backupOnImageSave: aBoolean
  110682.     SessionManager current backupOnImageSave: aBoolean!
  110683.  
  110684. basicCreateSubclass: aSymbol of: aClass subclasses: aCollection
  110685.     "Private - Create a subclass a named subclass of the specified class. Answer the new class."
  110686.  
  110687.     | builder newClass |
  110688.     aCollection notEmpty 
  110689.         ifTrue: [self error: 'Unable to reparent subclasses in this version of the system'].
  110690.     builder := (ClassBuilder new)
  110691.                 superclass: aClass;
  110692.                 className: aSymbol;
  110693.                 yourself.
  110694.     aClass isBytes 
  110695.         ifTrue: [builder beBytes]
  110696.         ifFalse: [aClass isVariable ifTrue: [builder beVariable]].
  110697.     newClass := builder modifyOrCreate.
  110698.     newClass notNil ifTrue: [newClass sourceManager logEvaluate: newClass definition].
  110699.     ^newClass!
  110700.  
  110701. beNotChanged
  110702.     "Private - Reset all of the changed flags for the entire system"
  110703.  
  110704.     Class allClasses do: [:c | c isChanged: false].
  110705.     PoolConstantsDictionary allInstances do: [:p | p isChanged: false].
  110706.     ResourceIdentifier allInstances do: [:p | p isChanged: false].
  110707.     self packageManager packages do: [:p | p isChanged: false].
  110708.  
  110709. !
  110710.  
  110711. binaryClassFilesType
  110712.     "Private - Answer a two element array suitable for adding to the FileDialog
  110713.     with the fileTypes: message."
  110714.  
  110715.     ^#('Binary Class Files (*.stc)' '*.stc')!
  110716.  
  110717. browseAllChangedMethods
  110718.     "Open a method browser on all methods in the system which have been changed (i.e. which
  110719.     have source in the change log and are in classes marked as changed."
  110720.  
  110721.     | changes |
  110722.     changes := self changedMethods.
  110723.     self 
  110724.         browseMethods: changes 
  110725.         caption: 'Changed methods'
  110726.         findString: nil
  110727.         filter: [:m | m hasChanged]!
  110728.  
  110729. browseAllUnimplementedSelectors
  110730.     "
  110731.         Smalltalk developmentSystem browseAllUnimplementedSelectors
  110732.     "
  110733.  
  110734.     (MessageBox 
  110735.         confirm: 'This will take a while and may open a lot of method browsers.
  110736. Are you sure you want to continue?'
  110737.         caption: 'Browser All Unimplemented Messages...') ifFalse: [^self].
  110738.     self allUnimplementedSelectors do: 
  110739.             [:each | 
  110740.             self 
  110741.                 browseMethods: (self referenceFilterFor: each)
  110742.                 caption: 'Senders of unimplemented message ' , each printString
  110743.                 sourceString: each]!
  110744.  
  110745. browseChangedMethodsIn: aClass
  110746.     "Open a method browser on methods in aClass which have been changed (i.e. which
  110747.     have source in the change log and are in classes marked as changed."
  110748.  
  110749.     | changes |
  110750.     changes := self changedMethods select: [:each | 
  110751.         each methodClass instanceClass==aClass].
  110752.  
  110753.     self 
  110754.         browseMethods: changes 
  110755.         caption: 'Changed methods in ', aClass displayString
  110756.         findString: nil
  110757.         filter: [:m | m hasChanged and: [m methodClass instanceClass==aClass]]!
  110758.  
  110759. browseChangedMethodsInClasses: classes
  110760.     "Open a method browser on methods that belong to the <collection> of <Class>, classes,
  110761.     and which have been changed (i.e. which have source in the change log and are in classes marked 
  110762.     as changed."
  110763.  
  110764.     | changes classesList |
  110765.     changes := self changedMethods select: [:each | 
  110766.                 classes includes: each methodClass instanceClass].
  110767.  
  110768.     classesList := String writeStream.
  110769.     classes
  110770.         do: [:c | classesList print: c]
  110771.         separatedBy: [classesList nextPutAll: ', '].
  110772.  
  110773.     changes isEmpty ifTrue: [
  110774.         MessageBox notify: 'There are no changed methods in any of the classes ', classesList contents.
  110775.         ^self].
  110776.  
  110777.     self 
  110778.         browseMethods: changes 
  110779.         caption: 'Changed methods in ', classesList contents
  110780.         findString: nil
  110781.         filter: [:m | m hasChanged and: [classes includes: m methodClass instanceClass]]!
  110782.  
  110783. browseClass
  110784.     "Opens a new default browser on Object"
  110785.  
  110786.     ^self browseClass: Object!
  110787.  
  110788. browseClass: aClass 
  110789.     "Opens a new default browser on aClass"
  110790.  
  110791.     ^self browseClass: aClass with: self defaultBrowserClass!
  110792.  
  110793. browseClass: aClass with: aBrowserClass
  110794.     "Opens a new browser of aBrowserClass on aClass"
  110795.  
  110796.     ^aBrowserClass show actualClass: aClass!
  110797.  
  110798. browseClassReferences: aClass
  110799.     "Opens a new MethodBrowser on all the methods which refer to the <Class>, aClass."
  110800.  
  110801.     self browseGlobalReferences: (self globalVariableNamed: aClass name)!
  110802.  
  110803. browseClassVariables: browseClass
  110804.     "Opens a selection dialog to choose one of the class variables of browseClass
  110805.     to browse. Then a MethodBrowser is opened on all methods that
  110806.     refer to the chosen variable."
  110807.  
  110808.     | aVariable classVars |
  110809.     classVars := OrderedCollection new.
  110810.     browseClass withAllSuperclassesDo: 
  110811.             [:aClass | 
  110812.             aClass classVarNames asSortedCollection asArray 
  110813.                 reverseDo: [:aName | classVars addFirst: aName]].
  110814.     aVariable := ChoicePrompter choices: classVars caption: 'Class Variables'.
  110815.     aVariable notNil 
  110816.         ifTrue: 
  110817.             [self browseReferencesToClassVar: aVariable inLocalHierarchyOf: browseClass]!
  110818.  
  110819. browseCompileFailedMethods
  110820.     "Open a method browser on all methods in the system which have failed compilation (i.e. which
  110821.     are instances of CompileFailedMethod"
  110822.  
  110823.     | failed |
  110824.     failed := CompileFailedMethod allInstances.
  110825.     self 
  110826.         browseMethods: failed 
  110827.         caption: 'Compilation failed methods'
  110828.         findString: nil
  110829.         filter: [:m | m isCompilationFailure]!
  110830.  
  110831. browseContainingText
  110832.     "Prompt for a search string, using contents of the clipboard as the initial suggestion, and open 
  110833.     a Method Browser on all the methods that contain that search string in their source."
  110834.  
  110835.     self browseContainingText: '' prompt: true!
  110836.  
  110837. browseContainingText: aString
  110838.     "Open a Method Browser on all the methods that contain the 
  110839.     search string, aString, in their source."
  110840.  
  110841.     self browseContainingText: aString prompt: false!
  110842.  
  110843. browseContainingText: aString prompt: aBoolean
  110844.     "Prompt for a search string, using the <readableString> argument as the initial suggestion or 
  110845.     if that is empty the contents of the clipboard, and open a Method Browser on all the methods 
  110846.     that contain the search string in their source."
  110847.  
  110848.     | searchString filter refs |
  110849.     searchString := aString isEmpty 
  110850.                 ifTrue: [Clipboard current getTextOrEmpty]
  110851.                 ifFalse: [aString].
  110852.     aBoolean 
  110853.         ifTrue: 
  110854.             [searchString := Prompter 
  110855.                         on: searchString
  110856.                         prompt: 'Enter a string (may contain wildcards):'
  110857.                         caption: 'Methods Containing ...'].
  110858.     (searchString isNil or: [searchString isEmpty]) ifTrue: [^self].
  110859.     filter := self sourceFilterFor: searchString.
  110860.     refs := Cursor wait showWhile: [self selectMethods: filter].
  110861.     refs isEmpty 
  110862.         ifTrue: 
  110863.             [MessageBox 
  110864.                 notify: 'There are no methods containing the text ' , searchString printString]
  110865.         ifFalse: 
  110866.             [self 
  110867.                 browseMethods: refs
  110868.                 caption: 'Containing text: ' , searchString printString
  110869.                 findString: searchString
  110870.                 filter: filter]!
  110871.  
  110872. browseDefinitionsOf: selectorPattern 
  110873.     "Opens a MethodBrowser on all the methods whose selectors match the specified
  110874.     <readableString> pattern."
  110875.  
  110876.     | defns |
  110877.     defns := self definitionsOf: selectorPattern.
  110878.     defns isEmpty 
  110879.         ifTrue: [MessageBox notify: '#' , selectorPattern , ' has no definitions']
  110880.         ifFalse: 
  110881.             [self 
  110882.                 browseMethods: defns
  110883.                 caption: 'Definitions of #' , selectorPattern
  110884.                 findString: nil
  110885.                 filter: (self definitionsFilterFor: selectorPattern)]!
  110886.  
  110887. browseDefinitionsOf: selector inLocalHierarchyOf: classDesc 
  110888.     "Opens a MethodBrowser on all the methods with the specified selector
  110889.     in the local hierarchy of the <ClassDescription>, classDesc."
  110890.  
  110891.     | defns class |
  110892.     class := classDesc instanceClass.
  110893.     defns := self definitionsOf: selector inLocalHierarchyOf: class.
  110894.     defns isEmpty 
  110895.         ifTrue: 
  110896.             [MessageBox 
  110897.                 notify: selector printString , ' has no definitions in the local hierarchy of ' 
  110898.                         , class name]
  110899.         ifFalse: 
  110900.             [self 
  110901.                 browseMethods: defns
  110902.                 caption: 'Definitions of ' , selector printString , ' in local hierarchy of ' , class name
  110903.                 findString: nil
  110904.                 filter: [:each | each selector == selector and: [each methodClass includesBehavior: class]]]!
  110905.  
  110906. browseFolder: aString 
  110907.     ShellLibrary default shellOpen: aString!
  110908.  
  110909. browseGlobalReferences: var
  110910.     "Opens a new Method Browser on all the methods which refer to the global
  110911.     binding <Association>, var."
  110912.  
  110913.     (self 
  110914.         browseMethods: (self referenceFilterForGlobal: var)
  110915.         caption: 'References to ', var key
  110916.         sourceString: var key) isEmpty ifTrue: [
  110917.             MessageBox notify: var key, ' has no references']
  110918. !
  110919.  
  110920. browseHierarchy
  110921.     "Open a new hierarchy browser at the root of the standard class hierarchy."
  110922.  
  110923.     ^self browseHierarchy: Object!
  110924.  
  110925. browseHierarchy: aClass
  110926.     "Open a new hierarchy browser on aClass"
  110927.  
  110928.     ^self browseClass: aClass with: self hierarchyBrowserClass!
  110929.  
  110930. browseInstanceVariableReaders: browseClass
  110931.     "Opens a selection dialog to choose one of the instance variables of browseClass. Then 
  110932.     a MethodBrowser is opened on all methods that read the chosen variable."
  110933.  
  110934.     self browseInstanceVariables: browseClass
  110935.         action: #browseReadersOfInstVar:inLocalHierarchyOf:!
  110936.  
  110937. browseInstanceVariables: browseClass
  110938.     "Opens a selection dialog to choose one of the class variables of browseClass
  110939.     to broswe. Then a MethodBrowser is opened on all methods that
  110940.     refer to the chosen variable."
  110941.  
  110942.     self browseInstanceVariables: browseClass
  110943.         action: #browseReferencesToInstVar:inLocalHierarchyOf:!
  110944.  
  110945. browseInstanceVariables: browseClass action: selector
  110946.     | instVars varName |
  110947.     instVars := OrderedCollection new.
  110948.     browseClass withAllSuperclassesDo: 
  110949.             [:each | 
  110950.             instVars addAllFirst: each instVarNames asSortedCollection].
  110951.     instVars isEmpty 
  110952.         ifFalse: 
  110953.             [varName := ChoicePrompter choices: instVars caption: 'Instance Variables']
  110954.         ifTrue: [MessageBox notify: browseClass name , ' has no instance variables.'].
  110955.     varName notNil 
  110956.         ifTrue: 
  110957.             [self 
  110958.                 perform: selector
  110959.                 with: varName
  110960.                 with: browseClass]!
  110961.  
  110962. browseInstanceVariableWriters: browseClass
  110963.     "Opens a selection dialog to choose one of the instance variables of browseClass. Then 
  110964.     a MethodBrowser is opened on all methods that write to the chosen variable."
  110965.  
  110966.     self browseInstanceVariables: browseClass
  110967.         action: #browseWritersOfInstVar:inLocalHierarchyOf:!
  110968.  
  110969. browseMessageDefinitions
  110970.     "Prompt for a selector and open a method browser displaying the
  110971.     implementors of that selector."
  110972.  
  110973.     self browseMessageDefinitions: ''!
  110974.  
  110975. browseMessageDefinitions: aString
  110976.     "Prompt for a selector and open a method browser displaying the
  110977.     implementors of that selector."
  110978.  
  110979.     | selector stream start suggestion |
  110980.     suggestion := aString isEmpty 
  110981.                 ifTrue: [Clipboard current getTextOrEmpty]
  110982.                 ifFalse: [aString].
  110983.     stream := suggestion readStream.
  110984.     stream skipSeparators.
  110985.     start := stream position + 1.
  110986.     stream skipWhile: [:c | c isSeparator not].
  110987.     suggestion := suggestion copyFrom: start to: stream position.
  110988.     selector := self 
  110989.                 promptForSelector: suggestion
  110990.                 caption: 'Definitions of ...'
  110991.                 allowWildcards: true.
  110992.     selector notNil 
  110993.         ifTrue: [self browseDefinitionsOf: selector]!
  110994.  
  110995. browseMessageReferences
  110996.     "Prompt for a selector and open a method browser displaying the
  110997.     references to that selector, using the the first word of the
  110998.     clipboard text as the initial suggestion."
  110999.  
  111000.     self browseMessageReferences: ''!
  111001.  
  111002. browseMessageReferences: aString
  111003.     "Prompt for a selector and open a method browser displaying the
  111004.     references to that selector, using the <readableString> argument
  111005.     as the initial suggestion (or if that is empty the first word of the
  111006.     clipboard text)."
  111007.  
  111008.     | selector suggestion stream start |
  111009.     suggestion := aString isEmpty 
  111010.                 ifTrue: [Clipboard current getTextOrEmpty]
  111011.                 ifFalse: [aString].
  111012.     stream := suggestion readStream.
  111013.     stream skipSeparators.
  111014.     start := stream position + 1.
  111015.     stream skipWhile: [:c | c isSeparator not].
  111016.     selector := self 
  111017.                 promptForSelector: (suggestion copyFrom: start to: stream position)
  111018.                 caption: 'References to...'
  111019.                 allowWildcards: true.
  111020.     selector notNil ifTrue: [self browseReferencesTo: selector asSymbol]!
  111021.  
  111022. browseMessagesIn: aCompiledMethod
  111023.     "Browse the definitions of one of the messages sent within
  111024.     the <CompiledMethod> argument. Prompt for which message to browse."
  111025.  
  111026.     | selectors selector |
  111027.     selectors := aCompiledMethod messages asSortedCollection.
  111028.     selectors isEmpty ifTrue: [
  111029.         ^MessageBox notify: aCompiledMethod printString, ' does not send any messages.'].
  111030.     selector := ChoicePrompter choices: selectors caption: 'Browse Definitions of...'.
  111031.     selector notNil ifTrue: [self browseDefinitionsOf: selector]!
  111032.  
  111033. browseMethod: aCompiledMethod 
  111034.     "Open a new default browser on aCompiledMethod."
  111035.  
  111036.     ^(self defaultBrowserClass show)
  111037.         selectMethod: aCompiledMethod;
  111038.         yourself!
  111039.  
  111040. browseMethodCategories: aCollection 
  111041.     "Browse the set of methods which is the union of all those belonging to 
  111042.     at least one of the <collection> of <MethodCategory>, categories."
  111043.  
  111044.     | methods names |
  111045.     aCollection size == 1 ifTrue: [^self browseMethodCategory: aCollection asArray first].
  111046.     methods := Set new.
  111047.     aCollection do: [:cat | methods addAll: cat contents].
  111048.     names := String writeStream.
  111049.     aCollection do: [:c | names nextPutAll: c name] separatedBy: [names nextPutAll: ', '].
  111050.     names := names contents.
  111051.     methods isEmpty 
  111052.         ifTrue: [^MessageBox notify: 'There are no methods in the categories: ' , names].
  111053.     methods size > 200 
  111054.         ifTrue: 
  111055.             [(MessageBox 
  111056.                 confirm: ('The categories contains %1!!d!! methods.%nAre you sure you would like to browse them?' 
  111057.                         formatWith: methods size)) 
  111058.                     ifFalse: [^self]].
  111059.     self 
  111060.         browseMethods: methods
  111061.         caption: 'Methods in ' , names
  111062.         findString: nil
  111063.         filter: [:m | (m categories intersection: aCollection) notEmpty]!
  111064.  
  111065. browseMethodCategory
  111066.     "Browse all the methods which belong to a chosen method category."
  111067.  
  111068.     | chosenCategory categories |
  111069.     categories := Object methodCategoryClass allMethodCategories.
  111070.     chosenCategory := (CategoryPrompter choices: categories
  111071.                 caption: 'Browse category ...')
  111072.                 allowReadOnly: true;
  111073.                 showModal.
  111074.     chosenCategory notNil ifTrue: [self browseMethodCategory: chosenCategory]!
  111075.  
  111076. browseMethodCategory: aCategoryOrString
  111077.     "Browse all the methods which belong to aCategoryOrString."
  111078.  
  111079.     | cat methods name |
  111080.     name := aCategoryOrString asString.
  111081.     cat := Object methodCategoryClass name: name.
  111082.     methods := cat contents.
  111083.     methods isEmpty ifTrue: [^MessageBox notify: 'There are no methods in the ''', name, ''' category.'].
  111084.     methods size > 200 ifTrue: [
  111085.         (MessageBox confirm: ('The method category ''%1'' contains %2!!d!! methods.%nAre you sure you would like to browse it?' formatWith: name with: methods size))
  111086.             ifFalse: [^self]].
  111087.     self
  111088.         browseMethods: cat contents
  111089.         caption: 'Methods in ', cat displayString
  111090.         findString: nil
  111091.         filter: [:m | m categories identityIncludes: cat]!
  111092.  
  111093. browseMethodHierarchy: aCompiledMethod 
  111094.     "Open a new hierarchy browser on aCompiledMethod."
  111095.  
  111096.     ^(self hierarchyBrowserClass show)
  111097.         selectMethod: aCompiledMethod;
  111098.         yourself!
  111099.  
  111100. browseMethodHierarchyFrom: aCompiledMethod 
  111101.     "Opens a MethodBrowser on all the overidden methods in the superclass chain for aCompiledMethod"
  111102.  
  111103.     | chain selector |
  111104.     selector := aCompiledMethod selector.
  111105.     chain := (aCompiledMethod methodClass withAllSuperclasses 
  111106.                 select: [:each | each includesSelector: selector]) 
  111107.                     collect: [:each | each compiledMethodAt: selector].
  111108.     self 
  111109.         browseMethods: chain
  111110.         caption: 'Method Hierarchy for ' , aCompiledMethod displayString
  111111.         findString: nil
  111112.         filter: [:each | false]!
  111113.  
  111114. browseMethodProtocols: protocolNames 
  111115.     "Browse all the methods which participate in the implementation of the 
  111116.     named method protocol."
  111117.  
  111118.     | protocols methods protDesc protClass |
  111119.     protClass := Object methodProtocolClass.
  111120.     protocols := (protocolNames collect: [:p | protClass name: p asSymbol]) 
  111121.                 asSortedCollection: [:a :b | a name < b name].
  111122.     methods := protocols inject: Set new into: [:set :p | set addAll: p contents].
  111123.     protDesc := String writeStream: 40.
  111124.     protocols size == 1 
  111125.         ifTrue: 
  111126.             [protDesc
  111127.                 nextPutAll: 'the ';
  111128.                 display: protocols first;
  111129.                 nextPutAll: ' protocol']
  111130.         ifFalse: 
  111131.             [protDesc nextPutAll: 'any of the protocols '.
  111132.             protocols do: [:p | protDesc display: p] separatedBy: [protDesc nextPutAll: ', ']].
  111133.     protDesc := protDesc contents.
  111134.     methods isEmpty 
  111135.         ifTrue: [^MessageBox notify: 'There are currently no methods participating in ' , protDesc].
  111136.     self 
  111137.         browseMethods: methods
  111138.         caption: ((String writeStream: 40)
  111139.                 nextPutAll: 'Methods in ';
  111140.                 nextPutAll: protDesc;
  111141.                 contents)
  111142.         findString: nil
  111143.         filter: [:m | (m protocols intersection: protocols) notEmpty]!
  111144.  
  111145. browseMethods: methods
  111146.     "Private - Open a method browser on the Collection of methods, methods.
  111147.     Answer the new browser instance."
  111148.  
  111149.     ^self 
  111150.         browseMethods: methods 
  111151.         caption: methods size displayString, ' methods' 
  111152.         findString: nil
  111153.         filter: [:m | methods includes: m]!
  111154.  
  111155. browseMethods: methods caption: aString findString: aStringOrNil filter: filter
  111156.     "Private - Open a method browser on the <collection> of methods, methods, with
  111157.     the caption, aString. Answer the new browser instance."
  111158.  
  111159.     | browser |
  111160.     browser := self methodBrowserClass create.
  111161.     browser caption: ((String writeStream: aString size*2)
  111162.                     nextPutAll: aString;
  111163.                     "nextPutAll: ' (';
  111164.                     display: methods size;
  111165.                     nextPut: $);"
  111166.                     contents).
  111167.  
  111168.     browser browser
  111169.         list: methods asOrderedCollection;
  111170.         filter: filter;
  111171.         findSelector: aStringOrNil.
  111172.     browser show.
  111173.     ^browser
  111174. !
  111175.  
  111176. browseMethods: filter caption: caption sourceString: findText 
  111177.     "Private - Open a Method Browser on all the methods for which the <monadicValuable>,
  111178.     filter, answers true. The <readableString>, findText, is set as the initial source search
  111179.     text in the browser, and the <readableString>, caption, is set as the browser's title.
  111180.     If no matching methods are found, then no browser is opened, and the answer will
  111181.     be an empty collection. Answers the set of matching methods, if any."
  111182.  
  111183.     | matched |
  111184.     matched := self selectMethods: filter.
  111185.     matched notEmpty 
  111186.         ifTrue: 
  111187.             [self 
  111188.                 browseMethods: matched
  111189.                 caption: caption
  111190.                 findString: findText
  111191.                 filter: filter].
  111192.     ^matched!
  111193.  
  111194. browsePackages
  111195.     "Open a new package browser."
  111196.     
  111197.     ^self packageBrowserClass show!
  111198.  
  111199. browsePackages: aPackageCollection
  111200.     "Open a new Package Browser on aPackageCollection"
  111201.     
  111202.     ^self packageBrowserClass show
  111203.         packages: aPackageCollection;
  111204.         yourself!
  111205.  
  111206. browsePoolConstantsDictionary: aPoolConstantsDictionary
  111207.     "Open a browser onto aRespourceIdentifier."
  111208.  
  111209.     aPoolConstantsDictionary inspect!
  111210.  
  111211. browseProtocols
  111212.     "Open a new protocol browser."
  111213.     
  111214.     ^self protocolBrowserClass show!
  111215.  
  111216. browseReadersOfClassVar: aString inLocalHierarchyOf: browseClass
  111217.     "Private - Open a MethodBrowser on all the methods that read the class
  111218.     variable named, aString, in the hierarchy of the <Behavior>, browseClass."
  111219.  
  111220.     | var |
  111221.     var := (browseClass whichClassDefinesClassVar: aString) classPool associationAt: aString.
  111222.     self 
  111223.         browseReferencesToClassVar: aString
  111224.         inLocalHierarchyOf: browseClass
  111225.         filter: [:method | method interpreter readsStatic: var]
  111226.         type: 'read'!
  111227.  
  111228. browseReadersOfInstVar: aString inLocalHierarchyOf: browseClass 
  111229.     "Private - Open a MethodBrowser on all the methods that read the instance
  111230.     variable named, aString, in the hierarchy of the <Behavior>, browseClass."
  111231.  
  111232.     | references startClass instIndex |
  111233.     references := Set new.
  111234.     startClass := browseClass withAllSuperclasses 
  111235.                 detect: [:aClass | aClass instVarNames includes: aString].
  111236.     instIndex := browseClass allInstVarNames indexOf: aString.
  111237.     startClass 
  111238.         withAllSubclassesDo: [:aClass | references addAll: (aClass whichMethodsRead: aString at: instIndex)].
  111239.     references isEmpty 
  111240.         ifTrue: 
  111241.             [MessageBox notify: startClass name , ' instance variable ' , aString printString 
  111242.                         , ' is never accessed']
  111243.         ifFalse: 
  111244.             [| caption |
  111245.             caption := (startClass == browseClass 
  111246.                         ifTrue: ['All methods that read %1.%2']
  111247.                         ifFalse: ['Methods that read %1.%2 in the hierarchy of %3']) 
  111248.                             formatWith: startClass name
  111249.                             with: aString
  111250.                             with: browseClass name.
  111251.             self 
  111252.                 browseMethods: references
  111253.                 caption: caption
  111254.                 findString: aString
  111255.                 filter: (self instVarReaderFilter: aString in: startClass)]!
  111256.  
  111257. browseReferencesTo: aString
  111258.     "Opens a MethodBrowser on all the methods that refer to aString from their literal
  111259.     frames (aString is normally a symbolic selector),"
  111260.  
  111261.     ^self browseReferencesToLiteral: aString sourceString: aString!
  111262.  
  111263. browseReferencesTo: selector inAndBelow: aBehavior 
  111264.     "Opens a MethodBrowser on all the methods which references the specified
  111265.     selector in the local hierarchy of aBehavior."
  111266.  
  111267.     | refs suffix |
  111268.     refs := self referencesTo: selector inAndBelow: aBehavior.
  111269.     suffix := ' from the local hierarchy of ' , aBehavior displayString.
  111270.     refs isEmpty 
  111271.         ifTrue: [MessageBox notify: selector printString , ' has no references' , suffix]
  111272.         ifFalse: 
  111273.             [self 
  111274.                 browseMethods: refs
  111275.                 caption: 'References to ' , selector printString , suffix
  111276.                 findString: selector
  111277.                 filter: (self referenceFilterFor: selector)]!
  111278.  
  111279. browseReferencesToClassVar: aString inLocalHierarchyOf: browseClass
  111280.     | var |
  111281.     var := (browseClass whichClassDefinesClassVar: aString) classPool associationAt: aString.
  111282.     self 
  111283.         browseReferencesToClassVar: aString
  111284.         inLocalHierarchyOf: browseClass
  111285.         filter: [:method | method refersToLiteral: var]
  111286.         type: 'reference'!
  111287.  
  111288. browseReferencesToClassVar: nameString inLocalHierarchyOf: browseClass filter: filterBlock type: typeString
  111289.     | references var definingClass |
  111290.     definingClass := browseClass whichClassDefinesClassVar: nameString.
  111291.     var := definingClass classPool associationAt: nameString.
  111292.     references := Set new.
  111293.     definingClass withAllSubclassesDo: 
  111294.             [:aClass | 
  111295.             references
  111296.                 addAll: (aClass whichMethodsReferTo: var);
  111297.                 addAll: (aClass class whichMethodsReferTo: var)].
  111298.     references := references select: filterBlock.
  111299.     references isEmpty 
  111300.         ifTrue: 
  111301.             [MessageBox notify: ('There are no such references to class variable %1.%2 in the hierarchy of %3' 
  111302.                         formatWith: definingClass name
  111303.                         with: var key
  111304.                         with: browseClass name)]
  111305.         ifFalse: 
  111306.             [| caption |
  111307.             caption := (definingClass == browseClass 
  111308.                         ifTrue: ['All methods that %4 %1.%2']
  111309.                         ifFalse: ['Methods that %4 %1.%2 in the hierarchy of %3']) 
  111310.                             formatWith: definingClass name
  111311.                             with: var key
  111312.                             with: browseClass name
  111313.                             with: typeString.
  111314.             self 
  111315.                 browseMethods: references
  111316.                 caption: caption
  111317.                 findString: var key
  111318.                 filter: filterBlock]!
  111319.  
  111320. browseReferencesToGlobal: aString
  111321.     | globalName suggestion |
  111322.     suggestion := aString isEmpty 
  111323.                 ifTrue: [Clipboard current getTextOrEmpty]
  111324.                 ifFalse: [aString].
  111325.     globalName := (Prompter 
  111326.                 createOn: suggestion
  111327.                 prompt: 'Enter the name of a global:'
  111328.                 caption: 'Browse References to Global...')
  111329.                 validationBlock: [:value | Smalltalk includesKey: value];
  111330.                 showModal.
  111331.     globalName notNil 
  111332.         ifTrue: [self browseGlobalReferences: (Smalltalk associationAt: globalName)]!
  111333.  
  111334. browseReferencesToInstVar: aString inLocalHierarchyOf: browseClass 
  111335.     "Private - Open a MethodBrowser on all the methods that refer to the instance
  111336.     variable named, ivar, in the hierarchy of the <Behavior>, class."
  111337.  
  111338.     | references startClass instIndex |
  111339.     references := Set new.
  111340.     startClass := browseClass withAllSuperclasses 
  111341.                 detect: [:aClass | aClass instVarNames includes: aString].
  111342.     instIndex := browseClass allInstVarNames indexOf: aString.
  111343.     startClass 
  111344.         withAllSubclassesDo: [:aClass | references addAll: (aClass whichMethodsAccess: aString at: instIndex)].
  111345.     references isEmpty 
  111346.         ifTrue: 
  111347.             [MessageBox notify: startClass name , ' instance variable ' , aString printString 
  111348.                         , ' is not referenced']
  111349.         ifFalse: 
  111350.             [| caption |
  111351.             caption := (startClass == browseClass 
  111352.                         ifTrue: ['All methods that reference %1.%2']
  111353.                         ifFalse: ['Methods that reference %1.%2 in the hierarchy of %3']) 
  111354.                             formatWith: startClass name
  111355.                             with: aString
  111356.                             with: browseClass name.
  111357.             self 
  111358.                 browseMethods: references
  111359.                 caption: caption
  111360.                 findString: aString
  111361.                 filter: (self instVarAccessFilter: aString in: startClass)]!
  111362.  
  111363. browseReferencesToLiteral: anObject sourceString: aString
  111364.     "Private - Open a Method Browser on all the methods that refer to anObject
  111365.     from their literal frames, using aString as the corresponding source search
  111366.     string."
  111367.  
  111368.     (self 
  111369.         browseMethods: (self referenceFilterFor: anObject)
  111370.         caption: 'References to ', anObject printString
  111371.         sourceString: aString) isEmpty ifTrue: [
  111372.             MessageBox notify: aString printString, ' has no references']!
  111373.  
  111374. browseReferencesToVariable: anAssociation
  111375.     "Open a MethodBrowser on all the methods that refer to the variable, anAssociation
  111376.     (which is presumably a variable from some PoolDictionary)."
  111377.  
  111378.     ^self browseReferencesToLiteral: anAssociation sourceString: anAssociation key!
  111379.  
  111380. browseResourceIdentifier: aResourceIdentifier
  111381.     "Open a browser onto aResourceIdentifier."
  111382.  
  111383.     aResourceIdentifier resource edit: aResourceIdentifier!
  111384.  
  111385. browseResources
  111386.     "Ensure the ResourceBrowser is visible."
  111387.  
  111388.     self resourceBrowserClass show!
  111389.  
  111390. browseResourcesReferencing
  111391.     "Prompt for a selector and open a resource browser displaying those 
  111392.     resources that reference that selector."
  111393.  
  111394.     self browseResourcesReferencingMessage: ''!
  111395.  
  111396. browseResourcesReferencing: anObject
  111397.     "Open a resource browser displaying the resources that reference 
  111398.     the specified object."
  111399.  
  111400.     self resourceBrowserClass showResourcesReferencing: anObject!
  111401.  
  111402. browseResourcesReferencingMessage: aString
  111403.     "Prompt for a selector and open a resource browser displaying the
  111404.     resources that reference that selector, using the <readableString> argument
  111405.     as the initial suggestion (or if that is empty the first word of the
  111406.     clipboard text)."
  111407.  
  111408.     | selector suggestion stream start |
  111409.     suggestion := aString isEmpty 
  111410.                 ifTrue: [Clipboard current getTextOrEmpty]
  111411.                 ifFalse: [aString].
  111412.     stream := suggestion readStream.
  111413.     stream skipSeparators.
  111414.     start := stream position + 1.
  111415.     stream skipWhile: [:c | c isSeparator not].
  111416.     selector := self 
  111417.                 promptForSelector: (suggestion copyFrom: start to: stream position)
  111418.                 caption: 'Resources Referencing...'
  111419.                 allowWildcards: false.
  111420.     selector notNil 
  111421.         ifTrue: [self browseResourcesReferencing: selector asSymbol]!
  111422.  
  111423. browseWritersOfClassVar: aString inLocalHierarchyOf: browseClass 
  111424.     "Private - Open a MethodBrowser on all the methods that assign to the class
  111425.     variable named, aString, in the hierarchy of the <Behavior>, browseClass."
  111426.  
  111427.     | var |
  111428.     var := (browseClass whichClassDefinesClassVar: aString) classPool associationAt: aString.
  111429.     self 
  111430.         browseReferencesToClassVar: aString
  111431.         inLocalHierarchyOf: browseClass
  111432.         filter: [:each | each interpreter writesStatic: var]
  111433.         type: 'write'!
  111434.  
  111435. browseWritersOfInstVar: aString inLocalHierarchyOf: browseClass 
  111436.     "Private - Open a MethodBrowser on all the methods that write to the instance
  111437.     variable named, ivar, in the hierarchy of the <Behavior>, class."
  111438.  
  111439.     | references startClass instIndex |
  111440.     references := Set new.
  111441.     startClass := browseClass withAllSuperclasses 
  111442.                 detect: [:aClass | aClass instVarNames includes: aString].
  111443.     instIndex := browseClass allInstVarNames indexOf: aString.
  111444.     startClass 
  111445.         withAllSubclassesDo: [:aClass | references addAll: (aClass whichMethodsAssign: aString at: instIndex)].
  111446.     references isEmpty 
  111447.         ifTrue: 
  111448.             [MessageBox notify: startClass name , ' instance variable ' , aString printString 
  111449.                         , ' is never assigned']
  111450.         ifFalse: 
  111451.             [| caption |
  111452.             caption := (startClass == browseClass 
  111453.                         ifTrue: ['All methods that assign to %1.%2']
  111454.                         ifFalse: ['Methods that assign to %1.%2 in the local hierarchy of %3']) 
  111455.                             formatWith: startClass name
  111456.                             with: aString
  111457.                             with: browseClass name.
  111458.             self 
  111459.                 browseMethods: references
  111460.                 caption: caption
  111461.                 findString: aString
  111462.                 filter: (self instVarWriterFilter: aString in: startClass)]!
  111463.  
  111464. buildMessageMenu: popup forMethod: method browseSelector: browseSelector extraArgs: extraArgs 
  111465.     "Private - Build a messages dynamic pop-up for [local] references to/definitions of."
  111466.  
  111467.     | messages |
  111468.     popup clear.
  111469.     method isNil ifTrue: [^self].
  111470.     (popup addCommand: (MessageSend 
  111471.                 receiver: self
  111472.                 selector: browseSelector
  111473.                 arguments: (Array with: method selector) , extraArgs)
  111474.         description: method selector) isDefault: true.
  111475.     "Rather than include only sent messages, we include all referenced symbols as useful for tracking down events, etc"
  111476.     messages := method allSymbolLiterals.
  111477.     messages remove: method selector ifAbsent: [].
  111478.     messages notEmpty 
  111479.         ifTrue: 
  111480.             [popup addSeparator.
  111481.             messages asSortedCollection do: 
  111482.                     [:selector | 
  111483.                     popup addCommand: (MessageSend 
  111484.                                 receiver: self
  111485.                                 selector: browseSelector
  111486.                                 arguments: (Array with: selector) , extraArgs)
  111487.                         description: selector]]!
  111488.  
  111489. canRefactor
  111490.     "Answer whether the receiver is capable of performing refactorings."
  111491.  
  111492.     ^false!
  111493.  
  111494. changedIcon
  111495.     "Private - Answer the icon to mark source objects that have been changed"
  111496.  
  111497.     changedIcon isNil ifTrue: [changedIcon := Icon fromId: 'Changed.ico'].
  111498.     ^changedIcon
  111499. !
  111500.  
  111501. changedMethods
  111502.     "Private - Answer a Set of all changed methods in the system We find out if a method has been changed by
  111503.     the fact that its source is in the change log rather than the sources file. However we only select changed
  111504.     methods from classes that are also flagged as being changed. This gives the chance to reduce the set
  111505.     of method changes as classes are flagged as being saved"
  111506.  
  111507.     | methods |
  111508.     methods := Set new.
  111509.     self environment allClasses do: [:aClass | aClass isChanged ifTrue: [
  111510.         methods 
  111511.             addAll: aClass changedMethods;
  111512.             addAll: aClass class changedMethods ]].
  111513.     ^methods!
  111514.  
  111515. changedResources
  111516.     "Answer a <collection> of <ResourceIdentifier>s identifying all the resources that
  111517.     have been changed."
  111518.  
  111519.     ^SessionManager current resourceManager allResourceIdentifiers select: [:each | each isChanged]!
  111520.  
  111521. chooseClass
  111522.     "Prompt for a, possibly wildcarded, class name. Answer the Class if it exists or nil 
  111523.     if it does not"
  111524.  
  111525.     | className class |
  111526.     className := Prompter prompt: 'Enter a Class name (may be wildcarded): '
  111527.                 caption: 'Find a Class'.
  111528.     className notNil 
  111529.         ifTrue: 
  111530.             [className := className trimBlanks.
  111531.             className notEmpty 
  111532.                 ifTrue: 
  111533.                     [| global |
  111534.                     global := self environment at: className asSymbol ifAbsent: [].
  111535.                     (global isNil or: [(global isKindOf: Class) not]) 
  111536.                         ifTrue: 
  111537.                             [| pattern classes |
  111538.                             pattern := (className notEmpty and: [className last = $*]) 
  111539.                                         ifTrue: [className]
  111540.                                         ifFalse: [className copyWith: $*].
  111541.                             classes := Smalltalk keys 
  111542.                                         select: [:aSymbol | (pattern match: aSymbol asString) and: [(Smalltalk at: aSymbol) isKindOf: Class]].
  111543.                             classes notEmpty 
  111544.                                 ifTrue: 
  111545.                                     [className := classes size = 1 
  111546.                                                 ifTrue: [classes asOrderedCollection first]
  111547.                                                 ifFalse: [ChoicePrompter choices: classes asSortedCollection caption: 'Matching classes']]]]].
  111548.     className notNil 
  111549.         ifTrue: 
  111550.             [class := self environment at: className asSymbol ifAbsent: [].
  111551.             (class notNil and: [class isKindOf: Class]) 
  111552.                 ifFalse: 
  111553.                     [MessageBox notify: 'No class matching ' , className.
  111554.                     class := nil]].
  111555.     ^class!
  111556.  
  111557. chooseDefaultPackage
  111558.     "Allow the user to set the default package which all new classes are added to."
  111559.  
  111560.     | package |
  111561.     package := PackagePrompter 
  111562.                 showModalOn: self defaultPackage asValue
  111563.                 caption: 'Default package for new objects'
  111564.                 default: nil.
  111565.     package notNil 
  111566.         ifTrue: [self defaultPackage: (package = Package uncommitted ifFalse: [package])]!
  111567.  
  111568. chooseSelectorsInProtocol: protocol forClass: class 
  111569.     "Private - Pop-up a multi-select <ChoicePrompter> displaying the selectors 
  111570.     implemented in the <Class> class  and its superclasses, with all those which are
  111571.     part of the <MethodProtocol> protocol selected. If class is nil then only those
  111572.     selectors in the protocol are displayed.
  111573.  
  111574.     Answers a <collection> of the selectors chosen or nil if the dialog was cancelled."
  111575.  
  111576.     | selectors newSelectors oldSelectors |
  111577.     selectors := IdentitySet new.
  111578.     class notNil ifTrue: [class withAllSuperclassesDo: [:s | selectors addAll: s selectors]].
  111579.     oldSelectors := protocol selectors.
  111580.     selectors := oldSelectors asSortedCollection asArray 
  111581.                 , (selectors difference: oldSelectors) asSortedCollection asArray.
  111582.     newSelectors := protocol selectors asArray asValue.
  111583.     (ChoicePrompter 
  111584.         on: newSelectors
  111585.         multipleChoices: selectors
  111586.         caption: ('Method Protocol <%1>' formatWith: protocol asSymbol)) isNil 
  111587.         ifTrue: [^nil].
  111588.     ^newSelectors value!
  111589.  
  111590. chooseViewOf: aClass
  111591.     "Choose one of the existing views of aClass.
  111592.     Allow the user to choose from a list if necessary"
  111593.  
  111594.     | viewResourceNames name |
  111595.     viewResourceNames := (self viewResourcesForClass: aClass) keys asOrderedCollection.
  111596.  
  111597.     name := viewResourceNames size==1 
  111598.         ifTrue: [ viewResourceNames first ]
  111599.         ifFalse: [ ChoicePrompter choices: viewResourceNames caption: 'Available views' ].
  111600.  
  111601.     ^name notNil ifTrue: [
  111602.         ResourceIdentifier class: aClass name: name ]!
  111603.  
  111604. classChanged: aClass
  111605.     "Private - The <ClassDescription>, aClass, has updated, but in such a way
  111606.     that only affects its 'changed' status rather than its representation in a browser
  111607.     (for example a loose method in  package has been given up back to its class
  111608.     which means that the class is now changed from the source code control
  111609.     point of view).    Add the instance class to our set of changed classes."
  111610.  
  111611.     aClass isChanged: true
  111612. !
  111613.  
  111614. classChooserClass
  111615.     "Answer the class of the tool used for debugging in the development system."
  111616.  
  111617.     classChooserClass isNil 
  111618.         ifTrue: 
  111619.             [classChooserClass := self environment at: #ChoosePackagedClassDialog
  111620.                         ifAbsent: [self environment at: #ChooseClassDialog]].
  111621.     ^classChooserClass!
  111622.  
  111623. classChooserClass: toolClass
  111624.     classChooserClass := toolClass!
  111625.  
  111626. classesReferencingPool: aPoolDictionary
  111627.     "Answer a <collection> of all classes that directly reference the specified <PoolDictionary>."
  111628.  
  111629.     ^self classesReferencingPoolNamed: aPoolDictionary name!
  111630.  
  111631. classesReferencingPoolNamed: aSymbol
  111632.     "Answer a <collection> of all classes that directly reference the named <PoolDictionary>."
  111633.  
  111634.     ^Smalltalk allClasses select: [:each | each sharedPoolNames includes: aSymbol]
  111635. !
  111636.  
  111637. classFileIn: aClass
  111638.     "The user has chosen to file in aClass. Prompt for a file and file it in"
  111639.  
  111640.     | filename |
  111641.     filename := (FileOpenDialog new)
  111642.                 caption: 'File In ' , aClass name , ' Class';
  111643.                 fileTypes: (Array with: self classFilesType with: FileDialog allFilesType);
  111644.                 value: aClass fileOutName;
  111645.                 showModal.
  111646.     filename notNil 
  111647.         ifTrue: [self sourceManager fileInPackagedClass: aClass from: filename]!
  111648.  
  111649. classFileOut: aClass
  111650.     "The user has chosen to file out aClass. Prompt for a file and file it out"
  111651.  
  111652.     | filename |
  111653.     filename := (FileSaveDialog new)
  111654.                 caption: 'File Out ' , aClass name , ' Class';
  111655.                 fileTypes: (Array with: self classFilesType with: FileDialog allFilesType);
  111656.                 value: aClass fileOutName;
  111657.                 showModal.
  111658.     filename notNil 
  111659.         ifTrue: [self sourceManager fileOutPackagedClass: aClass to: filename]!
  111660.  
  111661. classFilesType
  111662.     "Private - Answer a two element array suitable for adding to the FileDialog
  111663.     with the fileTypes: message."
  111664.  
  111665.     ^#('Class Files (*.cls)' '*.cls')!
  111666.  
  111667. classHierarchy
  111668.     "Answer the <ClassHierarchyModel> for the tree of classes managed by the
  111669.     receiver."
  111670.  
  111671.     ^ClassHierarchyModel withAllClasses!
  111672.  
  111673. clearSystemFolder
  111674.     "Private - Clear the system folder. Only intended to be called when image stripping"
  111675.  
  111676.     systemFolder := nil.!
  111677.  
  111678. closeAll
  111679.     "Close all views, prompting to save changes."
  111680.  
  111681.     ((MessageBox new)
  111682.         taskModal;
  111683.         confirm: 'All open windows will be closed, but you will be prompted to save or retain any changes.
  111684.  
  111685. Are you sure that you would like to proceed?') 
  111686.             ifFalse: [^self].
  111687.     View topLevelViews 
  111688.         do: [:each | each presenter class == self systemFolderClass ifFalse: [each close]]!
  111689.  
  111690. compilerNotification: aCompilerNotification
  111691.     "Private - A notification has been sent by the Compiler.
  111692.     Display a suitable MessageBox"
  111693.  
  111694.     MessageBox notify: aCompilerNotification displayString!
  111695.  
  111696. compressChanges
  111697.     "Compresses the current changes file to remove duplicate entries"
  111698.  
  111699.     ((MessageBox new)
  111700.         yesNo;
  111701.         defaultButton: 2;
  111702.         caption: 'Compress Changes...';
  111703.         warning: 'Compressing changes removes old method source and expression evaluations from the change log.
  111704.  
  111705. Are you sure you want to continue?') 
  111706.             == #yes ifTrue: [self sourceManager compressChanges]!
  111707.  
  111708. compressSources
  111709.     "Compresses the current changes file and transfers all source to the sources (.sml)
  111710.     file."
  111711.  
  111712.     ((MessageBox new)
  111713.         yesNo;
  111714.         defaultButton: 2;
  111715.         caption: 'Compress Sources...';
  111716.         warning: 'Compressing sources compacts the change log into the source (.sml) file. After compaction all record of what has changed will be lost and the change log will be empty. 
  111717.  
  111718. Compressing sources is useful when you want to consolidate your work into a a new baseline image, but should otherwise be avoided.
  111719.  
  111720. Are you absolutely sure you want to continue?') 
  111721.             == #yes 
  111722.             ifTrue: 
  111723.                 [| progress |
  111724.                 progress := ProgressDialog create: 'No cancel view' operation: [].
  111725.                 progress caption: 'Compressing  sources, please wait...'.
  111726.                 self sourceManager compressSourcesWith: progress]!
  111727.  
  111728. createSubclass: aSymbol of: aClass package: aPackage subclasses: aCollection
  111729.     "Create a subclass a named subclass of the specified class and assign it to the 
  111730.     specified package. Answer the new class."
  111731.  
  111732.     | newClass |
  111733.     newClass := self 
  111734.                 basicCreateSubclass: aSymbol
  111735.                 of: aClass
  111736.                 subclasses: aCollection.
  111737.     newClass notNil 
  111738.         ifTrue: 
  111739.             [aPackage notNil ifTrue: [newClass owningPackage: aPackage].
  111740.             newClass sourceManager logChanged: newClass].
  111741.     ^newClass!
  111742.  
  111743. createSubclassOf: aClass
  111744.     "Prompt for details of a new subclass of the <Class> argument (e.g. the name) and then create it.
  111745.     Answer the new class, or nil if none was created."
  111746.  
  111747.     | aPackage |
  111748.     aPackage := aClass owningPackage.
  111749.     ^self createSubclassOf: aClass inPackage: aPackage!
  111750.  
  111751. createSubclassOf: aClass inPackage: aPackageOrNil
  111752.     | details |
  111753.     details := CreateSubclassDialog subclassOf: aClass inPackage: aPackageOrNil.
  111754.     ^details answer isNil 
  111755.         ifFalse: 
  111756.             [self 
  111757.                 createSubclass: details subclassName asSymbol
  111758.                 of: details superclass
  111759.                 package: details package
  111760.                 subclasses: details subclasses]!
  111761.  
  111762. createVariableAccessors: classVariableNamePairs classVariables: aBoolean 
  111763.     "Generate get and set accessors for the specified class and variable name pairs."
  111764.  
  111765.     classVariableNamePairs do: 
  111766.             [:each | 
  111767.             self 
  111768.                 createVariableAccessors: each value
  111769.                 in: each key
  111770.                 classVariable: aBoolean]!
  111771.  
  111772. createVariableAccessors: aString in: aClass classVariable: aBoolean
  111773.     "Generate compiled 'get' and 'set' accessor methods for the
  111774.     aSelector. Note that if such a method is already defined it is left unchanged.
  111775.  
  111776.     Please heed Kent Beck's advice - don't introduce unecessary accessors. If you
  111777.     are using the Refactoring version of Dolphin it is a trivial matter to abstract
  111778.     an instance variable at a later date.
  111779.  
  111780.     This method is present to speed development when you really need them,
  111781.     but frankly it is better to directly access instance variables - it is a simple matter
  111782.     to add accessors and modify the existing usage sites using the browser's
  111783.     facilities. As accessor methods tend to expose implementation details of
  111784.     the class the generated methods are now private by default."
  111785.  
  111786.     | instVarNames stream categories catClass selector |
  111787.     aBoolean ifTrue: [^Error notYetImplemented].
  111788.     instVarNames := aClass instVarNames.
  111789.     (instVarNames includes: aString) ifFalse: [^aClass errorNotFound: aString].
  111790.     catClass := aClass methodCategoryClass.
  111791.     categories := Array with: (catClass name: 'accessing') with: catClass private.
  111792.     stream := String writeStream: 80.
  111793.     selector := aString asSymbol.
  111794.     (aClass includesSelector: selector) 
  111795.         ifFalse: 
  111796.             [stream
  111797.                 nextPutAll: selector;
  111798.                 crtab;
  111799.                 nextPutAll: '"Private - Answer the value of the receiver''s ''';
  111800.                 print: aString;
  111801.                 nextPutAll: ''' instance variable."';
  111802.                 cr;
  111803.                 crtab;
  111804.                 nextPut: $^;
  111805.                 nextPutAll: aString.
  111806.             aClass compile: stream contents categories: categories.
  111807.             stream reset].
  111808.     selector := (aString , ':') asSymbol.
  111809.     (aClass includesSelector: selector) 
  111810.         ifFalse: 
  111811.             [stream
  111812.                 nextPutAll: selector;
  111813.                 space;
  111814.                 nextPutAll: ' anObject';
  111815.                 crtab;
  111816.                 nextPutAll: '"Private - Set the value of the receiver''s ''';
  111817.                 print: aString;
  111818.                 nextPutAll: ''' instance variable to the argument."';
  111819.                 cr;
  111820.                 crtab;
  111821.                 nextPutAll: aString;
  111822.                 nextPutAll: ' := anObject'.
  111823.             aClass compile: stream contents categories: categories]!
  111824.  
  111825. debuggerClass
  111826.     "Answer the class of the tool used for debugging in the development system."
  111827.  
  111828.     debuggerClass isNil 
  111829.         ifTrue: [debuggerClass := self environment at: #Debugger].
  111830.     ^debuggerClass!
  111831.  
  111832. debuggerClass: toolClass
  111833.     "Set the class of the tool used for debugging in the development system."
  111834.     
  111835.     debuggerClass := toolClass!
  111836.  
  111837. defaultBrowserClass
  111838.     "Answer the class of browser (a <SmalltalkToolShell>)
  111839.     to be used by default in the development environment."
  111840.  
  111841.     defaultBrowserClass isNil 
  111842.         ifTrue: [defaultBrowserClass := self environment at: #ClassBrowserShell].
  111843.     ^defaultBrowserClass!
  111844.  
  111845. defaultBrowserClass: toolClass 
  111846.     "Set the class of browser (a <SmalltalkToolShell>)
  111847.     to be used by default in the development environment."
  111848.  
  111849.     defaultBrowserClass := toolClass!
  111850.  
  111851. defaultFont
  111852.     "Answer the default font to use for the development system tools"
  111853.  
  111854.     ^View desktop font!
  111855.  
  111856. defaultFont: aFontOrNil
  111857.     "Set the default font to use for the development system tools to aFontOrNil"
  111858.  
  111859.     View desktop font: aFontOrNil.
  111860. !
  111861.  
  111862. defaultMethodCategories
  111863.     "Answer an <collection> of the default method categories associated with new
  111864.     methods when there is no other sensible set."
  111865.  
  111866.     ^#()!
  111867.  
  111868. defaultPackage
  111869.     "Answer the default <Package> for new objects, or nil if they should not be
  111870.     placed into a package."
  111871.  
  111872.     ^self packageManager defaultPackage!
  111873.  
  111874. defaultPackage: aPackageOrNil
  111875.     "Set the default Package for new objects."
  111876.  
  111877.     self packageManager defaultPackage: aPackageOrNil!
  111878.  
  111879. definitionsFilterFor: selectorPattern
  111880.     "Private - Answer a <monadicValuable> that can be used to select the 
  111881.     methods of a class that implement selectors matching the <readableString> 
  111882.     pattern, selectorPattern. The pattern can contain the special characters #
  111883.     and * to match any single character, or sequence of characters , respectively."
  111884.  
  111885.     ^(selectorPattern includesAnyOf: '*?#') 
  111886.         ifTrue: [ | pattern |
  111887.             pattern := selectorPattern copyReplacing: $? withObject: $#.
  111888.             [:m | pattern match: m selector]]
  111889.         ifFalse: [[:m | m selector == selectorPattern asSymbol]]!
  111890.  
  111891. definitionsOf: selector
  111892.     "Answer a Set of all methods that implement the specified selector Symbol."
  111893.  
  111894.     | answer |
  111895.     answer := Set new: 16.
  111896.     self environment allRoots do: [:root | 
  111897.         answer addAll: (self definitionsOf: selector inAndBelow: root)].
  111898.     ^answer!
  111899.  
  111900. definitionsOf: selector inAndBelow: rootClass
  111901.     "Answer a Set of all methods that implement the specified selector Symbol."
  111902.  
  111903.     ^self definitionsOf: selector inClasses: rootClass withAllSubclasses!
  111904.  
  111905. definitionsOf: selectorPattern inClasses: classes 
  111906.     "Answer a <Set> of all methods that implement selectors matching
  111907.     the <readableString>, selectorPattern, in the <collection> of 
  111908.     <Class>, classes."
  111909.  
  111910.     | answer |
  111911.     answer := Set new.
  111912.     (selectorPattern includesAnyOf: '*?#') 
  111913.         ifTrue: 
  111914.             [| pattern |
  111915.             pattern := selectorPattern copyReplacing: $? withObject: $#.
  111916.             classes do: 
  111917.                     [:each | 
  111918.                     each methodDictionary 
  111919.                         keysAndValuesDo: [:s :m | (pattern match: s) ifTrue: [answer add: m]].
  111920.                     each class methodDictionary 
  111921.                         keysAndValuesDo: [:s :m | (pattern match: s) ifTrue: [answer add: m]]]]
  111922.         ifFalse: 
  111923.             [| selector |
  111924.             selector := selectorPattern asSymbol.
  111925.             classes do: 
  111926.                     [:each | 
  111927.                     "Since using a Set, since adding nil is no-op"
  111928.  
  111929.                     answer add: (each compiledMethodAt: selector ifAbsent: []).
  111930.                     answer add: (each class compiledMethodAt: selector ifAbsent: [])]].
  111931.     ^answer!
  111932.  
  111933. definitionsOf: selectorPattern inLocalHierarchyOf: aClass
  111934.     "Answer a Set of all methods that implement selectors matching the
  111935.     <readableString> pattern, selectorPattern, in the local hierarchy 
  111936.     of the <Class>, aClass. ."
  111937.  
  111938.     ^self 
  111939.         definitionsOf: selectorPattern 
  111940.         inClasses: aClass allSuperclasses, aClass withAllSubclasses!
  111941.  
  111942. deleteClassHierarchy: aClass 
  111943.     "Removes aClass from the system, and any subclasses, regardless of whether they
  111944.     are still referenced. Answer whether the class was removed."
  111945.  
  111946.     | subclasses prompt caption removedGlobals references oldClassName |
  111947.     oldClassName := aClass name asString.
  111948.     subclasses := aClass allSubclasses.
  111949.     subclasses isEmpty 
  111950.         ifTrue: 
  111951.             [prompt := 'Are you sure you want to delete %1?' formatWith: oldClassName.
  111952.             caption := 'Delete Class ...']
  111953.         ifFalse: 
  111954.             [prompt := 'Are you sure you want to delete %1 and its %2!!d!! subclass(es)?' 
  111955.                         formatWith: oldClassName
  111956.                         with: subclasses size.
  111957.             caption := 'Delete Class Hierarchy...'].
  111958.     (MessageBox confirm: prompt caption: caption) ifFalse: [^false].
  111959.     removedGlobals := OrderedCollection new.
  111960.     
  111961.     [aClass allSubclassesEndOrderDo: 
  111962.             [:c | 
  111963.             removedGlobals add: (self globalVariable: c).
  111964.             c removeFromSystem].
  111965.     references := self referencesTo: (self globalVariable: aClass).
  111966.     aClass removeFromSystem] 
  111967.             on: ClassBuilder invalidRemoveError
  111968.             do: 
  111969.                 [:e | 
  111970.                 MessageBox errorMsg: e description.
  111971.                 ^false].
  111972.     removedGlobals do: [:g | references addAll: (self referencesTo: g)].
  111973.     references notEmpty 
  111974.         ifTrue: 
  111975.             [self 
  111976.                 browseMethods: references
  111977.                 caption: ('Class ' , oldClassName) , ' deleted'
  111978.                 findString: oldClassName
  111979.                 filter: [:m | false]].
  111980.     ^true!
  111981.  
  111982. deleteResource: aResourceIdentifier
  111983.     (MessageBox 
  111984.         confirm: 'Are you sure you wish to delete ' , aResourceIdentifier displayString) 
  111985.             ifTrue: 
  111986.                 [self sourceManager 
  111987.                     logEvaluate: 'SessionManager current resourceManager removeResource: ' 
  111988.                             , aResourceIdentifier storeString.
  111989.                 SessionManager current resourceManager removeResource: aResourceIdentifier]!
  111990.  
  111991. displayOn: aStream
  111992.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  111993.     would want to see it. This will appear, for example, in the Tools/Options inspector."
  111994.  
  111995.     aStream nextPutAll: 'Development System'!
  111996.  
  111997. σK+
  111998. =1¬ú;?┐££.ä+Σ╣àÑ╝÷╦┴╗ ╡G½┤Çw|KW╞ü~FƒZ&oOVx╢ÆM&)IπlR~íú%Θ₧D║≈úû≥Å àf[z ╙▒l5½ï¡3% ┐c½vªyæ∙\7÷!
  111999.  
  112000. educationCenter
  112001.     "Open the Education Centre contents page"
  112002.  
  112003.     self openEducationContents
  112004. !
  112005.  
  112006. environment
  112007.     "Answer the global name space of the receiver."
  112008.  
  112009.     ^Smalltalk!
  112010.  
  112011. fileFileIn
  112012.     "The user has selected the standard File/File In command. Prompt for a file
  112013.     (containing chunks) and file it in"
  112014.  
  112015.     | filename |
  112016.     filename := (FileOpenDialog new)
  112017.                 caption: 'File in...';
  112018.                 fileTypes: (Array 
  112019.                             with: self smalltalkFilesType
  112020.                             with: self classFilesType
  112021.                             with: FileDialog allFilesType);
  112022.                 defaultExtension: '';
  112023.                 showModal.
  112024.     filename notNil 
  112025.         ifTrue: [Cursor wait showWhile: [self sourceManager fileIn: filename]]!
  112026.  
  112027. fileNew
  112028.     "Basic implementation of context-sensitive file-new command. Tools typically implement
  112029.     this to open their own favourite."
  112030.  
  112031.     self newWorkspace!
  112032.  
  112033. fileOpen
  112034.     "Basic implementation of context-sensitive file-open command. Tools typically implement
  112035.     this to open their own favourite file types."
  112036.  
  112037.     self openWorkspace!
  112038.  
  112039. formatterClass
  112040.     "Answer the <stParseNodeVisitor> that should be used for auto-formatting code in the system."
  112041.  
  112042.     formatterClass isNil ifTrue: [formatterClass := self environment at: #RBFormatter].
  112043.     ^formatterClass!
  112044.  
  112045. formatterClass: anStParseNodeVisitor
  112046.     "Set the <stParseNodeVisitor> that should be used for auto-formatting code in the system."
  112047.  
  112048.     formatterClass := anStParseNodeVisitor!
  112049.  
  112050. globalVariable: anObject
  112051.     "Private - Answer the global variable whose value is anObject.
  112052.     Clearly this will only work correctly if anObject has a single global referencing it."
  112053.  
  112054.     ^self globalVariableNamed: (self environment keyAtValue: anObject)!
  112055.  
  112056. globalVariableNamed: key
  112057.     "Private - Answer the global variable whose name is, key."
  112058.  
  112059.     ^self environment associationAt: key asSymbol!
  112060.  
  112061. guidedTour
  112062.     "Open the Guided Tour HTML page"
  112063.  
  112064.     self openEducationTopic: 'quicktour'.
  112065. !
  112066.  
  112067. hierarchyBrowserClass
  112068.     "Answer the class of Class Hierarchy Browser (a <SmalltalkToolShell>)
  112069.     to be used by default in the development environment."
  112070.  
  112071.     hierarchyBrowserClass isNil 
  112072.         ifTrue: [hierarchyBrowserClass := self environment at: #ClassBrowserShell].
  112073.     ^hierarchyBrowserClass!
  112074.  
  112075. hierarchyBrowserClass: toolClass 
  112076.     "Set the class of Class Hierarchy Browser (a <SmalltalkToolShell>)
  112077.     to be used by default in the development environment."
  112078.  
  112079.     hierarchyBrowserClass := toolClass!
  112080.  
  112081. imageFilesType
  112082.     "Private - Answer a two element array suitable for adding to the FileDialog
  112083.     with the fileTypes: message."
  112084.  
  112085.     ^#('Smalltalk Images (*.img)' '*.img')!
  112086.  
  112087. initialize
  112088.     "Private - Initialize the receiver.
  112089.  
  112090.     self initialize.
  112091. "
  112092.  
  112093.     super initialize.
  112094.     self registerSystemEvents.
  112095.  
  112096.     "Create and initialize the system folder"
  112097.     systemFolder := TreeModel new.
  112098.     self initializeSystemFolder.
  112099.     preferAlternateInspectors := false!
  112100.  
  112101. initializeSystemFolder
  112102.     "Private - Create the system folder that holds the development tool launchers and
  112103.     image options. If you evaluate the following you will reset the system folder to its
  112104.     default state.
  112105.  
  112106.         SmalltalkSystem current initializeSystemFolder
  112107.     "
  112108.  
  112109.     self systemFolder clear.
  112110.     self
  112111.         addSystemFolderIcon: (SmalltalkSystemIcon show: TranscriptShell
  112112.                     description: TranscriptShell displayString);
  112113.         registerTool: TranscriptShell;
  112114.         addSystemFolderIcon: (SmalltalkSystemFolder 
  112115.                     icon: (Icon fromId: 'SMALLTALKTOOLSFOLDER.ICO')
  112116.                     description: 'Additional Tools');
  112117.         addSystemFolderIcon: (SmalltalkSystemFolder 
  112118.                     icon: (Icon fromId: 'DICTIONARY.ICO')
  112119.                     description: 'Pool Dictionaries'
  112120.                     openBlock: 
  112121.                         [:folder :item | 
  112122.                         self inspectPoolDictionaries.
  112123.                         folder := item := nil]);
  112124.         addSystemFolderIcon: (SmalltalkSystemFolder description: 'Sample Applications');
  112125.         addSystemFolderIcon: (SmalltalkSystemFolder 
  112126.                     icon: (Icon fromId: 'SMALLTALKOPTIONSFOLDER.ICO')
  112127.                     description: 'User Preferences'
  112128.                     openBlock: 
  112129.                         [:folder :item | 
  112130.                         self inspectSystemOptions.
  112131.                         folder := item := nil]);
  112132.         addSamplesFolderIcon: (SmalltalkSystemIcon 
  112133.                     icon: self workspaceClass icon
  112134.                     description: 'Welcome to Dolphin'
  112135.                     openBlock: 
  112136.                         [:folder :item | 
  112137.                         self workspaceClass filename: (File 
  112138.                                     composePath: SessionManager current installationDirectory
  112139.                                     stem: 'Welcome'
  112140.                                     extension: 'rtf')])!
  112141.  
  112142. inspect: anObject
  112143.     ^((Keyboard default isShiftDown xor: self preferAlternateInspectors) 
  112144.         ifTrue: [anObject alternateInspectorClass]
  112145.         ifFalse: [anObject inspectorClass]) shellOn: anObject
  112146.  
  112147. !
  112148.  
  112149. inspectPoolDictionaries
  112150.     "Opens an inspector on the available pool dictionaries"
  112151.  
  112152.     | inspector |
  112153.     inspector := PublishedAspectInspector 
  112154.                 shellOn: self availablePools asOrderedCollection.
  112155.     inspector topShell caption: 'Available Pool Dictionaries'!
  112156.  
  112157. inspectSystemOptions
  112158.     "Open a PublishedAspectInspector on the system options."
  112159.  
  112160.     | inspector |
  112161.     inspector := PublishedAspectInspector 
  112162.                 shellOn: (Array with: self) , (self class registeredTools 
  112163.                                 asSortedCollection: [:t1 :t2 | t1 displayString < t2 displayString]).
  112164.     inspector topShell caption: 'User Preferences'!
  112165.  
  112166. inspectVisualObject
  112167.     | finder tracker |
  112168.     finder := VisualObjectFinder new.
  112169.     tracker := MouseTracker forPresenter: View active startingAt: 0@0.
  112170.     Cursor help showWhile: [tracker startTracking: finder].
  112171.     finder value ifNotNil: [:object | object inspect]!
  112172.  
  112173. instVarAccessFilter: aString in: startClass
  112174.     ^
  112175.     [:m | 
  112176.     (m methodClass includesBehavior: startClass) 
  112177.         and: [[m accessesInstVar: aString] on: NotFoundError do: [:e | false]]]!
  112178.  
  112179. instVarReaderFilter: aString in: startClass
  112180.     ^
  112181.     [:m | 
  112182.     (m methodClass includesBehavior: startClass) 
  112183.         and: [[m readsInstVar: aString] on: NotFoundError do: [:e | false]]]!
  112184.  
  112185. instVarWriterFilter: aString in: startClass
  112186.     ^
  112187.     [:m | 
  112188.     (m methodClass includesBehavior: startClass) 
  112189.         and: [[m writesInstVar: aString] on: NotFoundError do: [:e | false]]]!
  112190.  
  112191. isOAD
  112192.     "Private - Is this an Object Arts Development version"
  112193.  
  112194.     isOAD isNil ifTrue: [ isOAD := false ].
  112195.     ^isOAD!
  112196.  
  112197. isOAD: aBoolean
  112198.     "Private - Set this an Object Arts Development version according to aBoolean"
  112199.  
  112200.     isOAD := aBoolean!
  112201.  
  112202. isRegisteredTool: aClass
  112203.     "Answer true if aClass is registered as a tool with the receiver"
  112204.  
  112205.     ^self class registeredTools includes: aClass!
  112206.  
  112207. isValidClassVarName: aString for: aClass
  112208.     ^(ClassBuilder isValidClassName: aString) 
  112209.         and: [(Class allClassVarNames includes: aString) not]!
  112210.  
  112211. isValidInstanceVariableName: name for: aClass
  112212.     ^(Compiler isAValidLocalIdentifier: name) 
  112213.         and: [(aClass allInstVarNames includes: name) not]!
  112214.  
  112215. methodBrowserClass
  112216.     "Answer the class of browser to be used for browsing methods in the development system."
  112217.  
  112218.     methodBrowserClass isNil 
  112219.         ifTrue: [methodBrowserClass := self environment at: #MethodBrowserShell].
  112220.     ^methodBrowserClass!
  112221.  
  112222. methodBrowserClass: toolClass
  112223.     "Set the class of browser to be used for browsing method in the development system."
  112224.     
  112225.     methodBrowserClass := toolClass!
  112226.  
  112227. minimizeAll
  112228.     "Minimize all views"
  112229.  
  112230.     View topLevelViews do: [:each | each minimize]!
  112231.  
  112232. newWorkspace
  112233.     "The user has selected the standard File/New command. For most of the Smalltalk
  112234.     tools the only appropriate action is to create a new workspace."
  112235.  
  112236.     ^self workspaceClass show!
  112237.  
  112238. okToInstallPatchLevel: anInteger
  112239.     "Private - Check to see if an attempt to upgrade to a patch level of anInteger is valid. 
  112240.     If we are already at or above this level then the user notified. If additional patch levels 
  112241.     are needed then these are installed first. Answers true if it is okay to install the patch or
  112242.     signals an exception if not"
  112243.  
  112244.     | patchFiles |
  112245.     self patchLevel >= anInteger 
  112246.         ifTrue: [self error: 'Image is already at Patch Level ' , anInteger displayString].
  112247.     patchFiles := (self patchLevel + 1 to: anInteger - 1) 
  112248.                 collect: [:level | File composeStem: 'Patch Level ' , level displayString extension: 'st'].
  112249.  
  112250.     "Check patch files exist and then file them in"
  112251.     patchFiles 
  112252.         do: [:filename | (File exists: filename) ifFalse: [self errorNotFound: filename]].
  112253.     patchFiles do: [:filename | self sourceManager fileIn: filename].
  112254.     ^true!
  112255.  
  112256. onAboutToDisplayMenu: popup
  112257.     "The system is about to display the <Menu>, popup, this is our chance
  112258.     to fiddle with it."
  112259.  
  112260.     popup name == #toolsMenu ifTrue: [
  112261.         self populateToolsMenu: popup. ^self].
  112262.     popup name == #windowMenu ifTrue: [
  112263.         self populateWindowMenu: popup. ^self].
  112264. !
  112265.  
  112266. onClassAdded: aClass
  112267.     "The class aClass has been added to the system.
  112268.     Inform interested parties"
  112269.  
  112270.     self classChanged: aClass.
  112271.     self packageManager onClassAdded: aClass.
  112272.     self trigger: #classAdded: with: aClass!
  112273.  
  112274. onClassCategorized: aClass
  112275.     "The class aClass has been been recategorized.
  112276.     Inform interested parties"
  112277.  
  112278.     self classChanged: aClass.
  112279.     self trigger: #classCategorized: with: aClass!
  112280.  
  112281. onClassRemoved: aClass
  112282.     "The class aClass has been removed.
  112283.     Inform interested parties"
  112284.  
  112285.     aClass isChanged: false.
  112286.     self packageManager onClassRemoved: aClass.
  112287.     self trigger: #classRemoved: with: aClass!
  112288.  
  112289. onClassUpdated: aClass
  112290.     "The class aClass has been updated.
  112291.     Inform interested parties"
  112292.  
  112293.     self classChanged: aClass.
  112294.     self packageManager onClassUpdated: aClass.
  112295.     self trigger: #classUpdated: with: aClass!
  112296.  
  112297. onDragOverProtocol: session
  112298.     "The user is dragging over a method protocol pane.
  112299.     Set the operation of the <DragDropSession>, session,
  112300.     that would occur if a drop took place now of the objects in that session."
  112301.  
  112302.     | op formatOk |
  112303.     formatOk := (session isFormatAvailable: #CompiledMethod) 
  112304.                 or: [(session isFormatAvailable: #Class) or: [session isFormatAvailable: #MethodProtocol]].
  112305.     (session isTargetSameAsSource not and: 
  112306.             [formatOk 
  112307.                 and: [session suggestedTarget notNil and: [session suggestedTarget isReadOnly not]]]) 
  112308.         ifTrue: 
  112309.             [op := session intendedOperation == #move 
  112310.                         ifTrue: 
  112311.                             ["moves not permitted"
  112312.  
  112313.                             #copy]
  112314.                         ifFalse: [session intendedOperation]].
  112315.     session operation: op!
  112316.  
  112317. onDropOverProtocol: session
  112318.     "The drag operation described by <DragDropSession>, session, would like to 
  112319.     do a drop into the protocols pane.
  112320.     Override this method to accept the dragObject(s)."
  112321.  
  112322.     | target |
  112323.  
  112324.     target := session suggestedTarget.
  112325.     target isNil ifTrue: [Sound errorBeep. ^false].
  112326.  
  112327.     session dragObjects do: [:each |
  112328.  
  112329.         "See if the drop is a CompiledMethod"
  112330.         (each isFormatAvailable: #CompiledMethod) ifTrue: [ | method selectorPresent |
  112331.             method := each format: #CompiledMethod.
  112332.             selectorPresent := target includesSelector: method selector.
  112333.  
  112334.             "Check for a copy to additional protocol"
  112335.             (selectorPresent not and: [session operation==#copy]) ifTrue: [
  112336.                 self addMethod: method toProtocol: target].
  112337.  
  112338.             "Check for a removal from a protocol"
  112339.             (selectorPresent and: [session operation==#link]) ifTrue: [
  112340.                 self removeSelector: method selector fromProtocol: target]].
  112341.  
  112342.         "See if the drop is a Class"
  112343.         (each isFormatAvailable: #Class) ifTrue: [ | class classPresent |
  112344.             class := each format: #Class.
  112345.             classPresent := target behaviors includes: class.
  112346.  
  112347.             "Check for a copy to additional protocol"
  112348.             (classPresent not and: [session operation==#copy]) ifTrue: [
  112349.                 self addClass: class toProtocol: target].
  112350.  
  112351.             "Check for a removal from a protocol"
  112352.             (classPresent and: [session operation==#link]) ifTrue: [
  112353.                 self removeClass: class fromProtocol: target ]].
  112354.  
  112355.         "See if the drop is a Protocol"
  112356.         (each isFormatAvailable: #MethodProtocol) ifTrue: [ | protocol |
  112357.             protocol := each format: #MethodProtocol.
  112358.  
  112359.             "Check for a copy to additional protocol"
  112360.             session operation==#copy ifTrue: [
  112361.                 self addProtocolSelectors: protocol toProtocol: target]]].
  112362.  
  112363.     session operation==#move ifTrue: [
  112364.         self assert: [false].    "Moves into protocols are not permitted"
  112365.         "Operation must never be #move to avoid methods being removed"
  112366.         session operation: #copy].
  112367.         
  112368.     ^true!
  112369.  
  112370. onGlobalRemoved: anAssociation
  112371.     self packageManager onGlobalRemoved: anAssociation.
  112372.     self trigger: #globalRemoved: with: anAssociation!
  112373.  
  112374. onGlobalRenamed: anAssocation from: aSymbol
  112375.     "Inform the system that the global object has changed name."
  112376.  
  112377.     self packageManager onGlobalRenamed: anAssocation from: aSymbol.
  112378.     self 
  112379.         trigger: #globalRenamed:from:
  112380.         with: anAssocation
  112381.         with: aSymbol!
  112382.  
  112383. onMethodAdded: aCompilationResult
  112384.     self packageManager onMethodAdded: aCompilationResult.
  112385.     self trigger: #methodAdded: with: aCompilationResult
  112386. !
  112387.  
  112388. onMethodCategorized: aCompiledMethod
  112389.     "The method aCompiledMethod has been re-categorized.
  112390.     Inform interested parties"
  112391.  
  112392.     self packageManager onMethodCategorized: aCompiledMethod.
  112393.     self trigger: #methodCategorized: with: aCompiledMethod!
  112394.  
  112395. onMethodRemoved: aCompiledMethod
  112396.     "The method aCompiledMethod has been removed from the system.
  112397.     Inform interested parties"
  112398.  
  112399.     self packageManager onMethodRemoved: aCompiledMethod.
  112400.     self trigger: #methodRemoved: with: aCompiledMethod!
  112401.  
  112402. onMethodUpdated: aCompilationResult
  112403.     "The method aCompiledMethod has been added to the system.
  112404.     Inform interested parties"
  112405.  
  112406.     self packageManager onMethodUpdated: aCompilationResult.
  112407.     self trigger: #methodUpdated: with: aCompilationResult!
  112408.  
  112409. onProtocolRemoved: protocol
  112410.     "The <MethodProtocol>, protocol, has been removed from the system."
  112411.  
  112412.     self trigger: #protocolRemoved: with: protocol
  112413. !
  112414.  
  112415. onProtocolUpdated: aMethodProtocol
  112416.     "The <MethodProtocol>, aMethodProtcol, has been updated in some manner
  112417.     (normally by having classes/selectors added/removed). Inform interested parties."
  112418.  
  112419.     self trigger: #protocolUpdated: with: aMethodProtocol.
  112420. !
  112421.  
  112422. onSessionStopped
  112423.     "Handler for session shutting down"
  112424.  
  112425. !
  112426.  
  112427. onTipTextRequired: tool
  112428.     "Tool tip text is required for the <ToolbarItem>, tool."
  112429.  
  112430.     | cmd |
  112431.     cmd := tool command asSymbol.
  112432.     cmd == #saveImage ifTrue: [
  112433.         ^'Save image to ''%1''' formatWith: self sessionManager imageFileName].
  112434.  
  112435.     ^tool toolTipText
  112436. !
  112437.  
  112438. openEducationContents
  112439.     "Open the contents page in the Education Centre"
  112440.  
  112441.     self openEducationTopic: self sessionManager educationCentreContentsTopic
  112442.  
  112443.  
  112444. !
  112445.  
  112446. openEducationTopic: topic
  112447.     "Open the <readableString> Education Centre topic"
  112448.  
  112449.     self openEducationUrl: (File composePath: self sessionManager educationCentreRootUrl stem: topic extension: 'htm').!
  112450.  
  112451. openEducationTopicForTool: anObject
  112452.     "Open the HTML page in the Education Centre for anObject. The page
  112453.     with be the same name as the object's class"
  112454.  
  112455.     self openEducationTopic: (anObject class displayString copyWithout: Character space) asLowercase!
  112456.  
  112457. openEducationUrl: url
  112458.     "Open the url in the Education Centre. If the url cannot be opened by HTML help then
  112459.     a straightforward web browser will be used."
  112460.  
  112461.     ('*chm::*' match: url ignoreCase: true)
  112462.         ifTrue:  [ self openHelpUrl: url ] 
  112463.         ifFalse: [ self openUrl: url ]
  112464. !
  112465.  
  112466. openHelpUrl: aURLString
  112467.     "Open the HTML Help URL identified in aURLString "
  112468.  
  112469.     HTMLHelpLibrary default htmlHelpUrl: aURLString
  112470. !
  112471.  
  112472. openTool: folderItem
  112473.     "Private - Open the <SmalltalkSystemIcon>, folderItem, which is an item
  112474.     in the system folder/Tools menu."
  112475.  
  112476.     folderItem openIn: self systemFolder!
  112477.  
  112478. openUrl: aURLString
  112479.     "Open the URL identified in aURLString in a browser"
  112480.  
  112481.     ShellLibrary default 
  112482.         shellOpen: aURLString
  112483.         directory: self sessionManager installationDirectory.
  112484. !
  112485.  
  112486. openViewComposer
  112487.     "Open a new ViewComposer editing a new instance of ShellView."
  112488.     
  112489.     ^self viewComposerClass show showToolbox!
  112490.  
  112491. openViewComposerEmpty
  112492.     "Open a new empty ViewComposer."
  112493.     
  112494.     ^self viewComposerClass show!
  112495.  
  112496. openViewComposerOn: aResourceIdentifier
  112497.     ^self viewComposerClass openOn: aResourceIdentifier!
  112498.  
  112499. openViewComposerOnNewViewFor: aClass
  112500.     "Open a new ViewComposer editing a new default view for aClass."
  112501.     
  112502.     ^aClass editNewDefaultView!
  112503.  
  112504. openViewComposerOnViewOf: aClass
  112505.     "Open the View Composer on one of the existing views of aClass.
  112506.     Allow the user to choose from a list if necessary"
  112507.  
  112508.     | resourceId |
  112509.     resourceId := self chooseViewOf: aClass.
  112510.     resourceId notNil ifTrue: [self openViewComposerOn: resourceId]!
  112511.  
  112512. openWorkspace
  112513.     "Create a new workspace window on a file"
  112514.  
  112515.     | ws |
  112516.     ws := self workspaceClass open.
  112517.     ws notNil ifTrue: [ ws show ].
  112518.     ^ws!
  112519.  
  112520. packageBrowserClass
  112521.     "Answer the class of browser to be used for browsing packages in the development system."
  112522.  
  112523.     packageBrowserClass isNil 
  112524.         ifTrue: [packageBrowserClass := self environment at: #PackageBrowserShell].
  112525.     ^packageBrowserClass!
  112526.  
  112527. packageBrowserClass: toolClass
  112528.     "Set the class of <SmalltalkToolShell> to be used as the package browser (typically <PackageBrowserShell>)."
  112529.  
  112530.     packageBrowserClass := toolClass!
  112531.  
  112532. packageFilesType
  112533.     "Private - Answer a two element array suitable for adding to the FileDialog
  112534.     with the fileTypes: message for loading/saving packages."
  112535.  
  112536.     ^#('Package Files (*.pac,*.pax)' '*.pac;*.pax')!
  112537.  
  112538. packageManager
  112539.     "Private - Answer the package manager to be used by the receiver."
  112540.  
  112541.     ^Package manager!
  112542.  
  112543. patchLevel
  112544.     "Answer the current patch level of this image"
  112545.  
  112546.     ^self sessionManager patchLevel!
  112547.  
  112548. patchLevel: anInteger
  112549.     "Private - Set the current patch level of this image to anInteger"
  112550.  
  112551.     SessionManager current patchLevel: anInteger!
  112552.  
  112553. playSaveImageSound
  112554.     "Private - Plays the registered save image sound, if any."
  112555.  
  112556.     SessionManager current playImageSaveSound
  112557. !
  112558.  
  112559. poolDictionariesFolder
  112560.     "Private - Answer the <SmalltalkSystemFolder> that holds the available PoolDictionarys."
  112561.  
  112562.     ^self systemFolder asOrderedCollection detect: [:each | each description='Pool Dictionaries'].!
  112563.  
  112564. populateMenu: popup tree: folderModel items: folderItems 
  112565.     "Private - Populate the menu, popup, with items from the system folder, folder."
  112566.  
  112567.     | accels |
  112568.     accels := PluggableSet searchPolicy: SearchPolicy caseInsensitive.
  112569.     "Ensure any existing keyboard shortcuts are accounted for"
  112570.     popup items do: 
  112571.             [:e | 
  112572.             | i |
  112573.             (i := e text indexOf: $&) ~= 0 ifTrue: [accels add: (e text at: i + 1)]].
  112574.     (folderItems asSortedCollection: [:a :b | a description < b description]) do: 
  112575.             [:item | 
  112576.             "First generate the item text, with keyboard shortcut"
  112577.             | text i |
  112578.             text := item description.
  112579.             i := text findFirst: [:c | c isSeparator not and: [(accels includes: c) not]].
  112580.             i ~~ 0 
  112581.                 ifTrue: 
  112582.                     [accels add: (text at: i).
  112583.                     text := (text copyFrom: 1 to: i - 1) , '&' , (text copyFrom: i)].
  112584.             item isFolder 
  112585.                 ifTrue: 
  112586.                     [| children |
  112587.                     children := folderModel childrenOf: item.
  112588.                     children notEmpty 
  112589.                         ifTrue: 
  112590.                             [| subMenu |
  112591.                             subMenu := popup addSubmenu: text.
  112592.                             self 
  112593.                                 populateMenu: subMenu
  112594.                                 tree: folderModel
  112595.                                 items: children]]
  112596.                 ifFalse: 
  112597.                     [popup 
  112598.                         addCommand: (Message selector: #openTool: argument: item)
  112599.                         description: text
  112600.                         image: item icon]]!
  112601.  
  112602. populateMessagesMenus: popup fromMethod: method 
  112603.     "Private - The pop-up <Menu>, popup, is about to be displayed. If it is one of the standard message
  112604.     menus, then populate it with messages from the <CompiledMethod> argument, method."
  112605.  
  112606.     | menuName |
  112607.     menuName := popup name.
  112608.     menuName == #definitionsMenu 
  112609.         ifTrue: 
  112610.             [self 
  112611.                 buildMessageMenu: popup
  112612.                 forMethod: method
  112613.                 browseSelector: #browseDefinitionsOf:
  112614.                 extraArgs: #().
  112615.             ^true].
  112616.     menuName == #referencesMenu 
  112617.         ifTrue: 
  112618.             [self 
  112619.                 buildMessageMenu: popup
  112620.                 forMethod: method
  112621.                 browseSelector: #browseReferencesTo:
  112622.                 extraArgs: #().
  112623.             ^true].
  112624.     menuName == #localDefinitionsMenu 
  112625.         ifTrue: 
  112626.             [self 
  112627.                 buildMessageMenu: popup
  112628.                 forMethod: method
  112629.                 browseSelector: #browseDefinitionsOf:inLocalHierarchyOf:
  112630.                 extraArgs: (Array with: method methodClass).
  112631.             ^true].
  112632.     menuName == #localReferencesMenu 
  112633.         ifTrue: 
  112634.             [self 
  112635.                 buildMessageMenu: popup
  112636.                 forMethod: method
  112637.                 browseSelector: #browseReferencesTo:inAndBelow:
  112638.                 extraArgs: (Array with: method methodClass).
  112639.             ^true].
  112640.     "Not a message menu"
  112641.     ^false!
  112642.  
  112643. populateToolsMenu: toolsMenu
  112644.     "Private - Populate the Tools menu with the same hierarchy of items as the system folder.
  112645.     The menu is arranged in alphabetical order, with dynamically generated keyboard
  112646.     shortcuts using the earliest character not used as the shortcut for a previous item
  112647.     in the menu. All items will always be enabled. There is no default."
  112648.  
  112649.     | folder |
  112650.     toolsMenu clear.
  112651.     toolsMenu 
  112652.         addItem: (Menu fromStrings: #('&Options' '&Inspect//inspectSystemOptions' 
  112653.                                 '&Remember this Size//rememberThisSize'
  112654.                                 '&Forget Size//forgetSize'));
  112655.         addSeparator.
  112656.     ((toolsMenu itemAt: 1) itemAt: 1) isDefault: true.
  112657.     folder := self systemFolder.
  112658.     self populateMenu: toolsMenu tree: folder items: folder roots!
  112659.  
  112660. populateWindowMenu: windowMenu 
  112661.     "Private - Populate the open windows menu"
  112662.  
  112663.     | openShells allOpenClasses toolClasses otherClasses systemShell |
  112664.     windowMenu clear.
  112665.     openShells := (SessionManager inputState topLevelWindows 
  112666.                 select: [:each | each class conformsToProtocol: #topView]) 
  112667.                     collect: [:each | each presenter].
  112668.     allOpenClasses := openShells asSet collect: [:each | each class].
  112669.     toolClasses := allOpenClasses select: [:each | self isRegisteredTool: each].
  112670.     otherClasses := allOpenClasses difference: toolClasses.
  112671.  
  112672.     "System shell is always first"
  112673.     toolClasses remove: self systemFolderClass.
  112674.     systemShell := openShells detect: [:each | each class == self systemFolderClass].
  112675.     windowMenu 
  112676.         addCommand: (Message selector: #showShellWithHandle: argument: systemShell view handle)
  112677.         description: 'System Folder'
  112678.         image: systemShell icon.
  112679.  
  112680.     "Now tools"
  112681.     self 
  112682.         populateWindowMenu: windowMenu
  112683.         withShells: openShells
  112684.         ofClasses: toolClasses.
  112685.  
  112686.     "Now others"
  112687.     self 
  112688.         populateWindowMenu: windowMenu
  112689.         withShells: openShells
  112690.         ofClasses: otherClasses.
  112691.  
  112692.     "Finally the fixed commands"
  112693.     windowMenu addSeparator.
  112694.     windowMenu addCommand: (MessageSend receiver: self selector: #minimizeAll)
  112695.         description: '&Minimize All'.
  112696.     windowMenu 
  112697.         addCommand: (MessageSend receiver: self selector: #closeAll)
  112698.         description: '&Close All'
  112699.         image: false icon!
  112700.  
  112701. populateWindowMenu: windowMenu withShells: openShells ofClasses: toolClasses 
  112702.     toolClasses notEmpty ifTrue: [windowMenu addSeparator].
  112703.     toolClasses asSortedCollection do: 
  112704.             [:eachClass | 
  112705.             | shells |
  112706.             shells := openShells select: [:each | each class == eachClass].
  112707.             shells do: 
  112708.                     [:eachShell | 
  112709.                     | description |
  112710.                     description := eachShell view text.
  112711.                     eachShell view isWindowVisible ifFalse: [description := description , ' (hidden)'].
  112712.                     windowMenu 
  112713.                         addCommand: (Message selector: #showShellWithHandle: argument: eachShell view handle)
  112714.                         description: description
  112715.                         image: eachShell icon]]!
  112716.  
  112717. preferAlternateInspectors
  112718.     ^preferAlternateInspectors!
  112719.  
  112720. preferAlternateInspectors: aBoolean
  112721.     preferAlternateInspectors := aBoolean!
  112722.  
  112723. privatePrefix
  112724.     "Private - Answer the prefix to be used in the comments of private methods."
  112725.  
  112726.     ^'Private - '!
  112727.  
  112728. privatizeMethod: method 
  112729.     "Private - Make the <CompiledMethod> argument, method, private. This involves placing it
  112730.     in the private pseudo-category, and ensuring that its first comment (if any) starts with
  112731.     'Private - '."
  112732.  
  112733.     | catClass parseTree class |
  112734.     parseTree := method parseTree.
  112735.     class := method methodClass.
  112736.     catClass := class methodCategoryClass.
  112737.     parseTree comments notEmpty 
  112738.         ifTrue: 
  112739.             [| source commentStart start |
  112740.             source := method getSource.
  112741.             start := parseTree comments first start.
  112742.             commentStart := source indexOfSubCollection: '"' , self privatePrefix startingAt: start.
  112743.             commentStart == 0 
  112744.                 ifTrue: 
  112745.                     [commentStart := source 
  112746.                                 nextIndexOf: $"
  112747.                                 from: start
  112748.                                 to: source size.
  112749.                     commentStart == 0 
  112750.                         ifFalse: 
  112751.                             [class compile: (source 
  112752.                                         copyReplaceFrom: commentStart + 1
  112753.                                         to: commentStart
  112754.                                         with: self privatePrefix)
  112755.                                 categories: (method categories
  112756.                                         remove: catClass public ifAbsent: [];
  112757.                                         add: catClass private;
  112758.                                         yourself).
  112759.                             ^self]]].
  112760.  
  112761.     "Doesn't contain a comment, or comment is already suitably endowed"
  112762.     catClass private addMethod: method!
  112763.  
  112764. promptForClassVarName: nameString in: aClass prompt: promptString caption: captionString
  112765.     | newName |
  112766.     newName := (Prompter 
  112767.                 createOn: nameString
  112768.                 prompt: promptString
  112769.                 caption: captionString)
  112770.                 validationBlock: [:name | self isValidClassVarName: name for: aClass];
  112771.                 showModal.
  112772.     ^newName!
  112773.  
  112774. promptForInstVarName: nameString in: aClass prompt: promptString caption: captionString
  112775.     | newName |
  112776.     newName := (Prompter 
  112777.                 createOn: nameString
  112778.                 prompt: promptString
  112779.                 caption: captionString)
  112780.                 validationBlock: [:name | self isValidInstanceVariableName: name for: aClass];
  112781.                 showModal.
  112782.     ^newName!
  112783.  
  112784. promptForSelector: suggestionString caption: captionString allowWildcards: aBoolean
  112785.     "
  112786.         self current promptForSelector: 'abc' caption: 'Test...' allowWildcards: true.
  112787.         self current promptForSelector: 'abc' caption: 'Test...' allowWildcards: false.
  112788.     "
  112789.  
  112790.     | selector prompt validate |
  112791.     prompt := 'Enter a selector'.
  112792.     aBoolean 
  112793.         ifTrue: 
  112794.             [prompt := prompt , ' (may be wildcarded):'.
  112795.             validate := [:sel | sel trimBlanks notEmpty]]
  112796.         ifFalse: 
  112797.             [prompt := prompt , ':'.
  112798.             validate := [:sel | SmalltalkScanner isSelector: sel]].
  112799.     selector := (Prompter 
  112800.                 createOn: suggestionString
  112801.                 prompt: prompt
  112802.                 caption: captionString)
  112803.                 validationBlock: validate;
  112804.                 showModal.
  112805.     selector notNil 
  112806.         ifTrue: 
  112807.             [selector := selector trimBlanks.
  112808.             [selector first == $#] whileTrue: [selector := selector allButFirst]].
  112809.     ^selector!
  112810.  
  112811. protocolBrowserClass
  112812.     "Answer the class of browser to be used for browsing method protocols in the development system."
  112813.  
  112814.     protocolBrowserClass isNil 
  112815.         ifTrue: [protocolBrowserClass := self environment at: #ProtocolBrowserShell].
  112816.     ^protocolBrowserClass!
  112817.  
  112818. protocolBrowserClass: toolClass
  112819.     "Set the class of browser to be used for browsing method protocols in the development system."
  112820.     
  112821.     protocolBrowserClass := toolClass!
  112822.  
  112823. publicizeMethod: method 
  112824.     "Private - Make the <CompiledMethod> argument, method, public. This involves placing it
  112825.     in the public pseudo-category, and ensuring that its first comment (if any) does not start with
  112826.     'Private - '."
  112827.  
  112828.     | catClass class parseTree |
  112829.     parseTree := method parseTree.
  112830.     class := method methodClass.
  112831.     catClass := class methodCategoryClass.
  112832.     parseTree comments notEmpty 
  112833.         ifTrue: 
  112834.             [| source commentStart |
  112835.             source := method getSource.
  112836.             commentStart := source indexOfSubCollection: '"' , self privatePrefix
  112837.                         startingAt: parseTree comments first start.
  112838.             commentStart == 0 
  112839.                 ifFalse: 
  112840.                     [class compile: (source 
  112841.                                 copyReplaceFrom: commentStart + 1
  112842.                                 to: commentStart + self privatePrefix size
  112843.                                 with: '')
  112844.                         categories: (method categories
  112845.                                 remove: catClass private ifAbsent: [];
  112846.                                 add: catClass public;
  112847.                                 yourself).
  112848.                     ^self]].
  112849.     "Comment is absent or doesn't start with the private prefix."
  112850.     catClass public addMethod: method!
  112851.  
  112852. publishedAspects
  112853.     "Answer a <LookupTable> of the <Aspect>s published by the receiver."
  112854.  
  112855.     ^(super publishedAspects)
  112856.         add: (Aspect choice: #defaultBrowserClass
  112857.                     from: (Array with: self hierarchyBrowserClass with: self systemBrowserClass));
  112858.         yourself!
  112859.  
  112860. queryCommand: query
  112861.     "Private - Enter details about a potential command for the receiver 
  112862.     into the <CommandQuery>, query."
  112863.  
  112864.     | cmd |
  112865.     cmd := query commandSymbol.
  112866.  
  112867.     cmd == #toolsMenu ifTrue: [
  112868.         query isEnabled: true. 
  112869.         ^true].
  112870.  
  112871.     cmd == #windowMenu ifTrue: [
  112872.         query isEnabled: true. 
  112873.         ^true].
  112874.  
  112875.     cmd == #tipOfTheDay ifTrue: [
  112876.         query isEnabled: self tipOfTheDayClass notNil. 
  112877.         ^true].
  112878.  
  112879.     (query canPerformAgainst: self)
  112880.         ifTrue: [query isEnabled: true].
  112881.  
  112882.     ^false!
  112883.  
  112884. recompileReferences: aCollection replacing: string1 with: string2 
  112885.     "Private - Recompile the collection of methods, aCollection, replacing source references to
  112886.     string1 with string2.
  112887.     N.B. This is a form of global replace, and may not necessarily do exactly what you
  112888.     want, so it is advisable to save and backup the image before attempting it."
  112889.  
  112890.     aCollection do: 
  112891.             [:method | 
  112892.             | source |
  112893.             Notification signal: 'Recompiling method ' , method printString.
  112894.             source := method getSource.
  112895.             source := source copyReplaceAll: string1 with: string2.
  112896.             method methodClass compile: source categories: method categories]!
  112897.  
  112898. referenceFilterFor: anObject 
  112899.     "Private - Answer a <monadicValuable> than when evaluated against a method
  112900.     answers whether or not it references the specified object from its literal frame.
  112901.     If anObject is a kind of <String> containing wildcards then a wildcard pattern
  112902.     match is performed. Also takes accounts of special selectors that may not appear
  112903.     in the literal frame."
  112904.  
  112905.     | special |
  112906.     (anObject isKindOf: String) 
  112907.         ifTrue: 
  112908.             [(anObject includesAnyOf: '*?#') 
  112909.                 ifTrue: 
  112910.                     [| pattern |
  112911.                     pattern := anObject copyReplacing: $? withObject: $#.
  112912.                     ^
  112913.                     [:m | 
  112914.                     (m literalsDetect: [:l | l class == anObject class and: [pattern match: l]] ifNone: []) 
  112915.                         notNil]].
  112916.             special := VMLibrary default indexOfSpecialSelector: anObject ifAbsent: []].
  112917.     ^special isNil 
  112918.         ifTrue: [[:m | m refersToLiteral: anObject]]
  112919.         ifFalse: [[:m | (m refersToLiteral: anObject) or: [m sendsSpecialSelector: special]]]!
  112920.  
  112921. referenceFilterForGlobal: var
  112922.     "Private - Answer a <monadicValuable> which can be used to filter methods 
  112923.     that reference the global variable represented by the <Association>, var."
  112924.  
  112925.     | cookie |
  112926.     cookie := Object new.
  112927.     ^[:m | (m literalsDetect: [:l | l = var or: [l = var value]] ifNone: [cookie]) ~~ cookie]!
  112928.  
  112929. referencesTo: anObject
  112930.     "Answer a Set of all methods that reference anObject from their literal frame."
  112931.  
  112932.     ^self selectMethods: (self referenceFilterFor: anObject)
  112933. !
  112934.  
  112935. referencesTo: anObject inAndBelow: aBehavior
  112936.     "Answer a Set of all methods that reference anObject from their literal frame."
  112937.  
  112938.     ^self selectMethods: (self referenceFilterFor: anObject)
  112939.         inAndBelow: aBehavior!
  112940.  
  112941. referencesToGlobal: var
  112942.     "Private - Answer a Set of all methods that reference the global variable whose
  112943.     value is anObject either directly, or via its binding."
  112944.  
  112945.     ^self selectMethods: (self referenceFilterForGlobal: var)!
  112946.  
  112947. referencesToGlobalNamed: aSymbol
  112948.     "Private - Answer a Set of all methods that reference the global variable whose
  112949.     key is aSymbol."
  112950.  
  112951.     ^self referencesToGlobal: (self globalVariableNamed: aSymbol)!
  112952.  
  112953. registerSystemEvents
  112954.     "Private - Register interest with the 'standard' development environment. 
  112955.     Many of the receiver's events are just forwarding those from the SystemDictionary.
  112956.         SmalltalkSystem current registerSystemEvents
  112957.     "
  112958.  
  112959.     (self environment)
  112960.         removeEventsTriggeredFor: self;
  112961.         when: #methodAdded:
  112962.             send: #onMethodAdded:
  112963.             to: self;
  112964.         when: #methodUpdated:
  112965.             send: #onMethodUpdated:
  112966.             to: self;
  112967.         when: #methodRemoved:
  112968.             send: #onMethodRemoved:
  112969.             to: self;
  112970.         when: #methodCategorized:
  112971.             send: #onMethodCategorized:
  112972.             to: self;
  112973.         when: #classAdded:
  112974.             send: #onClassAdded:
  112975.             to: self;
  112976.         when: #classUpdated:
  112977.             send: #onClassUpdated:
  112978.             to: self;
  112979.         when: #classCategorized:
  112980.             send: #onClassCategorized:
  112981.             to: self;
  112982.         when: #classRemoved:
  112983.             send: #onClassRemoved:
  112984.             to: self;
  112985.         when: #protocolUpdated:
  112986.             send: #onProtocolUpdated:
  112987.             to: self;
  112988.         when: #protocolRemoved:
  112989.             send: #onProtocolRemoved:
  112990.             to: self;
  112991.         when: #globalRemoved:
  112992.             send: #onGlobalRemoved:
  112993.             to: self;
  112994.         when: #globalRenamed:from:
  112995.             send: #onGlobalRenamed:from:
  112996.             to: self!
  112997.  
  112998. registerTool: aToolClass
  112999.     "Adds aToolClass to the collection of registered tools for the receiver"
  113000.  
  113001.     self class registerTool: aToolClass!
  113002.  
  113003. removeClass: class fromProtocol: protocol
  113004.     "Private - Remove the <Class> class from the <MethodProtocol> protocol."
  113005.  
  113006.     (MessageBox confirm: (
  113007. 'Are you sure you would like to remove the class %1 from method protocol %2? 
  113008.  
  113009. (The class will not be deleted, but it and any subclasses will no longer conform to %2)'
  113010.                         formatWith: class name with: protocol displayString)) ifTrue: [
  113011.         protocol removeClass: class ]
  113012. !
  113013.  
  113014. removeGlobalNamed: aSymbol
  113015.     "Remove the global called aSymbol from the system dictionary."
  113016.  
  113017.     self environment removeGlobalNamed: aSymbol.
  113018. !
  113019.  
  113020. removeMethod: method 
  113021.     "Removes the <CompiledMethod>, method, from its class after first verifying with the user.
  113022.     If the method is implementing any protocols on behalf of its owner class or subclasses then 
  113023.     we must either remove the method from the protocol, or remove the protocol(s) from the class(es)."
  113024.  
  113025.     | prots sel |
  113026.     sel := method selector.
  113027.     prots := IdentitySet withAll: method protocols.
  113028.     "We must also consider all protocols of sub-classes dependent on this method"
  113029.     method methodClass allSubclasses do: 
  113030.             [:eachClass | 
  113031.             eachClass protocols 
  113032.                 do: [:eachProtocol | (eachProtocol includesSelector: sel) ifTrue: [prots add: eachProtocol]]].
  113033.     (prots isEmpty or: 
  113034.             [| s |
  113035.             (s := method methodClass superclass) notNil and: [s canUnderstand: sel]]) 
  113036.         ifTrue: 
  113037.             [(MessageBox confirm: ('Remove %1?' formatWith: method printString)) ifFalse: [^self]]
  113038.         ifFalse: 
  113039.             [| desc plural response |
  113040.             desc := String writeStream.
  113041.             (plural := prots size > 1) 
  113042.                 ifFalse: 
  113043.                     [desc
  113044.                         space;
  113045.                         display: prots asArray first]
  113046.                 ifTrue: 
  113047.                     [desc nextPutAll: 's '.
  113048.                     prots asSortedCollection do: [:p | p displayOn: desc] separatedBy: [desc nextPutAll: ', ']].
  113049.             desc := desc contents.
  113050.             response := (MessageBox new)
  113051.                         defaultButton: 3;
  113052.                         confirmOrCancel: ('%1 is part of the implementation of the protocol %2 in %3 and/or its subclasses.%n
  113053. Are you sure that you would like to remove %1 from the protocol %4 as well as from the class?%n
  113054. Press Yes to remove the method from the %3, and its selector from the protocol %2. %3 will still conform to the reduced protocol %4, but contracting protocols can affect other conforming classes or the users of those classes.%n
  113055. Press No to remove the method and the dependent protocol %2 from the %3 and subclasses. %3 will no longer conform to the protocol %4, which might affect the users of %3 or its subclasses. The protocol %4 will be unaffected.%n
  113056. It is recommended that you press Cancel to abort deletion unless you are absolutely sure.' 
  113057.                                     formatWith: sel printString
  113058.                                     with: desc
  113059.                                     with: method methodClass name
  113060.                                     with: (plural ifTrue: ['s'] ifFalse: [''])).
  113061.             response == #cancel ifTrue: [^self].
  113062.             response == #yes 
  113063.                 ifTrue: [prots do: [:p | p removeSelector: sel]]
  113064.                 ifFalse: 
  113065.                     ["Removing the selector from the class will remove protocols from the class and subclasses"
  113066.  
  113067.                     ]].
  113068.     method methodClass removeSelector: method selector!
  113069.  
  113070. removeSelector: sel fromProtocol: target
  113071.     "Remove the <Symbol> selectors, sels from the <MethodProtocol>,    target."
  113072.  
  113073.     self removeSelectors: (Array with: sel)  fromProtocol: target.
  113074. !
  113075.  
  113076. removeSelectors: sels fromProtocol: target
  113077.     "Remove the <collection> of selectors, sels, from the <MethodProtocol>,
  113078.     target.
  113079.     Implementation Note: This is an important operation so we need to warn 
  113080.     the user of its consequences."
  113081.  
  113082.     | response stream list |
  113083.  
  113084.     list := sels asArray.
  113085.     list isEmpty ifTrue: [^self].
  113086.  
  113087.     stream := WriteStream on: String new.
  113088.     stream tab nextPutAll: list first printString.
  113089.     (list copyWithout: list first) do: [:each |
  113090.         stream nextPutAll: ', '; nextPutAll: each printString ].
  113091.     
  113092.     response := MessageBox new
  113093.         defaultButton: 2;
  113094.         okCancel;
  113095.         prompt;
  113096.         text:
  113097. ('Are you sure that you would like to remove the following selectors
  113098. from the protocol <%1>?%n%n%2
  113099.  
  113100. Removing selectors from a protocol may affect other conforming
  113101. classes or the users of those classes. 
  113102.  
  113103. It is recommended that you cancel this operation unless you are sure.'
  113104.         formatWith: target asSymbol with: stream contents);
  113105.         open.
  113106.  
  113107.     (response == #ok) ifTrue: [
  113108.         Cursor wait showWhile: [
  113109.             target removeAllSelectors: sels.
  113110.             target baseBehaviors do: [:each | self classChanged: each]]].!
  113111.  
  113112. removeSystemFolderIcon: aSmalltalkSystemIcon 
  113113.     "Removes any equivalent (same named) icon matching aSmalltalkSystemFolderIcon
  113114.     from the system folder hierarchy. Answers the icon removed or nil if no match was
  113115.     found.
  113116.     Implementation Note: This method may be called during stripping when classes are
  113117.     removed, but after the system folder has been cleared, therefore we try and avoid
  113118.     lazily re-initializing the system folder!!"
  113119.  
  113120.     systemFolder isNil ifTrue: [^self].
  113121.     ^(systemFolder asOrderedCollection detect: [:each | each = aSmalltalkSystemIcon]
  113122.         ifNone: [nil]) ifNotNil: [:matchingIcon | self systemFolder remove: matchingIcon]!
  113123.  
  113124. removeSystemFolderIconNamed: aString 
  113125.     "Removes any aSmalltalkSystemIcon whose name matches the <readableString>
  113126.     argument from the system folder hierarchy. Answers the icon removed or nil if no match was
  113127.     found.
  113128.     Implementation Note: This method may be called during stripping when classes are
  113129.     removed, but after the system folder has been cleared, therefore we try and avoid
  113130.     lazily re-initializing the system folder!!"
  113131.  
  113132.     systemFolder isNil ifTrue: [^self].
  113133.     ^(systemFolder asOrderedCollection detect: [:each | each description = aString] ifNone: []) 
  113134.         ifNotNil: [:matchingIcon | self systemFolder remove: matchingIcon]!
  113135.  
  113136. renameClass: aClass 
  113137.     "Rename aClass to a new name requested from the user."
  113138.  
  113139.     | oldClassName |
  113140.     oldClassName := aClass name asString.
  113141.     (Prompter 
  113142.         on: oldClassName
  113143.         prompt: 'New name for ' , oldClassName
  113144.         caption: 'Rename Class') 
  113145.             ifNotNil: [:newClassName | self renameClass: aClass to: newClassName]!
  113146.  
  113147. renameClass: aClass to: newClassName
  113148.     "Rename aClass to newClassName. Also list all of the methods which reference
  113149.     the class. Their source must be modified to include the newClassName."
  113150.  
  113151.     | oldClassName references global |
  113152.     oldClassName := aClass name asString.
  113153.     global := self globalVariable: aClass.
  113154.     references := self referencesTo: global.
  113155.     ClassBuilder renameClass: aClass to: newClassName.
  113156.     references isEmpty 
  113157.         ifTrue: [MessageBox notify: 'No methods referenced ' , oldClassName]
  113158.         ifFalse: 
  113159.             [self 
  113160.                 browseMethods: references
  113161.                 caption: oldClassName , ' renamed to ' , newClassName
  113162.                 findString: oldClassName
  113163.                 filter: [:m | false]]!
  113164.  
  113165. renameClassVariable: aString in: aClass
  113166.     "Implements the Rename Class Variable refactoring."
  113167.  
  113168.     | newName |
  113169.     newName := self 
  113170.                 promptForClassVarName: aString
  113171.                 in: aClass
  113172.                 prompt: 'Please enter a new name for the variable:'
  113173.                 caption: ('Rename Class Variable ''%1''...' formatWith: aString).
  113174.     newName isNil 
  113175.         ifFalse: 
  113176.             [self 
  113177.                 renameClassVariable: aString
  113178.                 to: newName
  113179.                 in: aClass]!
  113180.  
  113181. renameClassVariable: aString to: newName in: aClass
  113182.     aClass renameClassVar: aString to: newName.
  113183.     self browseReferencesToClassVar: newName inLocalHierarchyOf: aClass!
  113184.  
  113185. renameGlobal: oldSymbol to: newSymbol
  113186.     "Rename the global, informing the system of the change."
  113187.  
  113188.     self environment 
  113189.         renameGlobal: oldSymbol to: newSymbol!
  113190.  
  113191. renameInstanceVariable: aString in: aClass
  113192.     "Implements the Rename Instance Variable refactoring."
  113193.  
  113194.     | newName |
  113195.     newName := self 
  113196.                 promptForInstVarName: aString
  113197.                 in: aClass
  113198.                 prompt: 'Please enter a new name for the variable:'
  113199.                 caption: ('Rename Instance Variable ''%1''...' formatWith: aString).
  113200.     newName isNil 
  113201.         ifFalse: 
  113202.             [self 
  113203.                 renameInstanceVariable: aString
  113204.                 to: newName
  113205.                 in: aClass]!
  113206.  
  113207. renameInstanceVariable: aString to: newName in: aClass
  113208.     aClass renameInstVar: aString to: newName.
  113209.     self browseReferencesToInstVar: newName inLocalHierarchyOf: aClass.
  113210.     ^newName!
  113211.  
  113212. renameVariable: string1 to: string2 in: aPoolDictionary 
  113213.     "Rename the specified pool variable from the specified pool, automatically modifying
  113214.     and recompiling source references.
  113215.     N.B. This uses a global replace, so it may not do exactly what you expect/want.
  113216.     BE WARNED."
  113217.  
  113218.     | var refs count filter |
  113219.     var := aPoolDictionary associationAt: string1.
  113220.     refs := self referencesTo: var.
  113221.     count := refs size.
  113222.     aPoolDictionary changeKey: string1 to: string2.
  113223.     self 
  113224.         recompileReferences: refs
  113225.         replacing: string1
  113226.         with: string2.
  113227.     filter := self sourceFilterFor: string1.
  113228.     refs := self selectMethods: filter.
  113229.     count := count + refs size.
  113230.     refs notEmpty 
  113231.         ifTrue: 
  113232.             [self 
  113233.                 browseMethods: refs
  113234.                 caption: ((('Possible references to: ' , aPoolDictionary name) , '(') , var printString) 
  113235.                         , ')'
  113236.                 findString: string1
  113237.                 filter: filter].
  113238.     Notification signal: 'Found ' , count displayString , ' references to ' , string1!
  113239.  
  113240. resourceBrowserClass
  113241.     "Answer the class of browser for browsing resources in the development system."
  113242.  
  113243.     resourceBrowserClass isNil 
  113244.         ifTrue: [resourceBrowserClass := self environment at: #ResourceBrowser].
  113245.     ^resourceBrowserClass!
  113246.  
  113247. resourceBrowserClass: toolClass
  113248.     "Set the class of browser for browsing resources in the development system."
  113249.  
  113250.     resourceBrowserClass := toolClass!
  113251.  
  113252. resourceIdentifierDialogClass
  113253.     resourceIdentifierDialogClass isNil 
  113254.         ifTrue: 
  113255.             [resourceIdentifierDialogClass := self environment at: #PackagedResourceIdentifierDialog
  113256.                         ifAbsent: [self environment at: #ResourceIdentifierDialog]].
  113257.     ^resourceIdentifierDialogClass!
  113258.  
  113259. resourceIdentifierDialogClass: aDialogClass 
  113260.     resourceIdentifierDialogClass := aDialogClass!
  113261.  
  113262. samplesFolder
  113263.     "Private - Answer the <SmalltalkSystemFolder> that holds the available Sample Applications"
  113264.  
  113265.     ^self systemFolder asOrderedCollection detect: [:each | each description='Sample Applications'].!
  113266.  
  113267. saveImage
  113268.     "Save the Smalltalk image."
  113269.  
  113270.     self playSaveImageSound.
  113271.     ^self sessionManager saveImage!
  113272.  
  113273. saveImageAs
  113274.     "Save the Smalltalk image and sources to a user chosen filename."
  113275.  
  113276.     | fileName |
  113277.     fileName := (FileSaveDialog new)
  113278.                 fileTypes: (Array with: self imageFilesType with: FileDialog allFilesType);
  113279.                 defaultExtension: '';
  113280.                 value: self sessionManager imagePath;
  113281.                 caption: 'Save Image As';
  113282.                 showModal.
  113283.     fileName isNil ifTrue: [^self].
  113284.     fileName = self sessionManager imageFileName 
  113285.         ifTrue: [self saveImage]
  113286.         ifFalse: 
  113287.             [((File exists: fileName) not or: 
  113288.                     [MessageBox 
  113289.                         confirm: ('%1%nThis image file already exists, are you sure you would like to overwrite it?' 
  113290.                                 formatWith: fileName)
  113291.                         caption: SessionManager current applicationName]) 
  113292.                 ifTrue: 
  113293.                     [Cursor wait showWhile: 
  113294.                             [self playSaveImageSound.
  113295.                             self sessionManager saveImage: fileName]]]!
  113296.  
  113297. selectMethods: discriminator
  113298.     "Private - Answer a Set of all methods for which the monadic value, discriminator, answers true."
  113299.  
  113300.     | answer |
  113301.     answer := Set new: 50.
  113302.     self environment allRoots do: [:root | answer addAll: (self selectMethods: discriminator inAndBelow: root)].
  113303.     ^answer!
  113304.  
  113305. selectMethods: discriminator inAndBelow: aBehavior 
  113306.     "Private - Answer a Set of all methods for which the monadic value, discriminator, answers 
  113307.     true in the local hierarchy of aBehavior.."
  113308.  
  113309.     | answer meta class |
  113310.     answer := Set new: 50.
  113311.     class := aBehavior instanceClass.
  113312.     meta := class class.
  113313.     class withAllSubclassesDo: 
  113314.             [:eachClass | 
  113315.             eachClass methodDictionary 
  113316.                 do: [:eachMethod | (discriminator value: eachMethod) ifTrue: [answer add: eachMethod]].
  113317.             eachClass class methodDictionary 
  113318.                 do: [:eachMethod | (discriminator value: eachMethod) ifTrue: [answer add: eachMethod]]].
  113319.     ^answer!
  113320.  
  113321. sessionManager
  113322.     "Private - Answer the receiver's default session manager."
  113323.  
  113324.     ^DevelopmentSessionManager current!
  113325.  
  113326. showPrerequisitesForPackage: aPackage
  113327.     (self browsePackages: (Array with: aPackage)) showPrerequisitesFor: aPackage!
  113328.  
  113329. showShellWithHandle: aShellHandle
  113330.     "Private - Displays the open window identified by aShellHandle"
  113331.  
  113332.     (View withHandle: aShellHandle)
  113333.         show;
  113334.         zOrderTop!
  113335.  
  113336. showTranscript
  113337.     "Shows the transcript"
  113338.  
  113339.     TranscriptShell current show; setFocus!
  113340.  
  113341. smalltalkExit
  113342.     "Request system shutdown - may be cancelled by user."
  113343.  
  113344.     self sessionManager exit!
  113345.  
  113346. smalltalkFilesType
  113347.     "Private - Answer a two element array suitable for adding to the FileDialog
  113348.     with the fileTypes: message."
  113349.  
  113350.     ^#('Smalltalk Files (*.st)' '*.st')!
  113351.  
  113352. sourceFilterFor: aString 
  113353.     "Private - Answer a <monadicValuable> that can be used to select from a collection of
  113354.     methods those which contain the specified source string or pattern."
  113355.  
  113356.     ^(aString includesAnyOf: '*?#') 
  113357.         ifTrue: 
  113358.             [| pattern |
  113359.             pattern := aString copyReplacing: $? withObject: $#.
  113360.             
  113361.             [:each | 
  113362.             | src |
  113363.             (src := each getSource) notNil and: [pattern match: src]]]
  113364.         ifFalse: [[:each | each containsSource: aString]]!
  113365.  
  113366. sourceManager
  113367.     "Answer the default <SourceManager> used for change logging, etc."
  113368.  
  113369.     ^self class sourceManager!
  113370.  
  113371. stbSaveOn: anSTBOutFiler
  113372.     "Output the singleton receiver to anSTBOutFiler."
  113373.  
  113374.     anSTBOutFiler saveObject: self as: (STBSingletonProxy for: self class)!
  113375.  
  113376. systemBrowserClass
  113377.     "Answer the class of System Browser (a <SmalltalkToolShell>)
  113378.     to be used by default in the development environment."
  113379.  
  113380.     systemBrowserClass isNil 
  113381.         ifTrue: [systemBrowserClass := self environment at: #SystemBrowserShell ifAbsent: []].
  113382.     ^systemBrowserClass!
  113383.  
  113384. systemBrowserClass: toolClass
  113385.     "Set the class of System Browser (a <SmalltalkToolShell>)
  113386.     to be used by default in the development environment."
  113387.  
  113388.     systemBrowserClass := toolClass!
  113389.  
  113390. systemFolder
  113391.     "Answer the <TreeModel> that holds the system folder hierarchy.
  113392.     We'll lazily initialize this in order to avoid problems with the boot."
  113393.  
  113394.     systemFolder isNil ifTrue: [
  113395.         systemFolder := TreeModel new.
  113396.         self initializeSystemFolder ].
  113397.     ^systemFolder!
  113398.  
  113399. systemFolderClass
  113400.     "Answer the class of System Folder (a <SmalltalkToolShell>)
  113401.     to be used by default in the development environment."
  113402.  
  113403.     ^SmalltalkSystemShell!
  113404.  
  113405. tipOfTheDay
  113406.     "Show the tip of the day"
  113407.  
  113408.     self tipOfTheDayClass show!
  113409.  
  113410. tipOfTheDayAtStartup
  113411.     "Private - Show the tip of the day on startup if requested"
  113412.  
  113413.     (self tipOfTheDayClass notNil and: [self tipOfTheDayClass showTipsAtStartup]) ifTrue: [
  113414.         self tipOfTheDayClass show ]!
  113415.  
  113416. tipOfTheDayClass
  113417.     "Answer the class to use for the tip of the day"
  113418.  
  113419.     tipOfTheDayClass isNil ifTrue: [tipOfTheDayClass := self environment at: #TipOfTheDay].
  113420.     ^tipOfTheDayClass!
  113421.  
  113422. tipOfTheDayClass: toolClass
  113423.     "Set the class for showing the tip of the day"
  113424.  
  113425.     tipOfTheDayClass := toolClass!
  113426.  
  113427. uninitialize
  113428.     "Private - Uninitialize the receiver."
  113429.  
  113430.     self clearSystemFolder.
  113431.     self environment removeEventsTriggeredFor: self.!
  113432.  
  113433. unregisterTool: aToolClass
  113434.     "Removes aToolClass from the collection of registered tools for the receiver."
  113435.  
  113436.     self class unregisterTool: aToolClass!
  113437.  
  113438. viewComposerClass
  113439.     "Answer the class of ViewComposer to be used for editing view resources in the
  113440.     development system."
  113441.     
  113442.     viewComposerClass isNil ifTrue: [viewComposerClass := self environment at: #ViewComposer].
  113443.     ^viewComposerClass!
  113444.  
  113445. viewComposerClass: toolClass
  113446.     "Set the class of ViewComposer to be used for editing view resources in the
  113447.     development system."
  113448.     
  113449.     viewComposerClass := toolClass!
  113450.  
  113451. viewResourcesForClass: aClass 
  113452.     "Private - Answer a collection of the <ViewResource>s for the <Class>, aClass."
  113453.  
  113454.     ^(self sessionManager resourceManager resourcesForClass: aClass) 
  113455.         select: [:each | each isViewResource]!
  113456.  
  113457. workspaceClass
  113458.     "Answer the class of presenter to be used for workspace shells."
  113459.  
  113460.     workspaceClass isNil 
  113461.         ifTrue: [workspaceClass := self environment at: #SmalltalkWorkspaceDocument].
  113462.     ^workspaceClass!
  113463.  
  113464. workspaceClass: toolClass
  113465.     "Set the class of presenter to be used for workspace shells."
  113466.     
  113467.     workspaceClass := toolClass! !
  113468.  
  113469. TreeModelAbstract comment:
  113470. 'TreeModelAbstract is the abstract superclass for classes implementing the <treeModel> protocol. All of the manipulations that modify  the underlying tree structure will trigger notification events such that Observers will be informed of the changes. The <treeModel> protocol defines the following events:
  113471.  
  113472. #treeChanged:
  113473. #item:addedInParent:
  113474. #item:movedToParent:
  113475. #item:removedFromParent:
  113476. #itemUpdated:'!
  113477. !TreeModelAbstract class methodsFor!
  113478.  
  113479. icon
  113480.     "Answers an Icon that can be used to represent this class"
  113481.  
  113482.     ^##(self) defaultIcon!
  113483.  
  113484. publishedEventsOfInstances
  113485.         "Answer a Set of Symbols that describe the published events triggered
  113486.         by instances of the receiver."
  113487.     
  113488.         ^super publishedEventsOfInstances
  113489.             add: #itemUpdated:;
  113490.             add: #treeChanged:;
  113491.             yourself.
  113492.     !
  113493.  
  113494. withRoots: aCollection
  113495.     "Answer an instance of the receiver with the roots in the <Collection> argument."
  113496.  
  113497.     ^super new setRoots: aCollection! !
  113498.  
  113499. !TreeModelAbstract methodsFor!
  113500.  
  113501. add: leaf asChildOf: branch
  113502.     "Adds the <Object>, leaf, to the receiver as a child of the <Object>,
  113503.     branch. If branch is nil then leaf is added as a root of the tree.
  113504.     Answer leaf, or the existing leaf if already present."
  113505.  
  113506.     ^self subclassResponsibility!
  113507.  
  113508. addRoot: anObject
  113509.     ^self add: anObject asChildOf: nil!
  113510.  
  113511. allParentsOf: anObject 
  113512.     "Answer the an OrderedCollection of all the parents of anObject 
  113513.     within the hierarchy managed by the receiver. The collection is
  113514.     ordered oldest ancestor first (i.e. the immediate parent is last).
  113515.     If anObject is a root of the hierarchy then answer an empty collection. 
  113516.     If anObject does not exist in the receiver then raise a suitable exception."
  113517.  
  113518.     | parent |
  113519.     parent := self parentOf: anObject.
  113520.     ^parent isNil 
  113521.         ifTrue: [OrderedCollection new: 16]
  113522.         ifFalse: 
  113523.             [(self allParentsOf: parent)
  113524.                 add: parent;
  113525.                 yourself]!
  113526.  
  113527. approxSize
  113528.     "Private - Answer the approximate size of the receiver.
  113529.     Implementation Note: This does not have to be accurate, but it should be fast
  113530.     (i.e. don't calculate it by counting the receiver's elements).
  113531.     The default is to guess at 2. Subclasses which can give a more
  113532.     accurate size quickly will get better conversion performance."
  113533.  
  113534.     ^2!
  113535.  
  113536. asArray
  113537.     "Answer an Array whose elements are those of the receiver.
  113538.     (ordering is that of the #do: operation as implemented by the receiver)."
  113539.  
  113540.     | anArray i |
  113541.     anArray := Array new: self size.
  113542.     i := 1.
  113543.     self do: [ :e |
  113544.         anArray basicAt: i put: e.
  113545.         i := i + 1].
  113546.     ^anArray!
  113547.  
  113548. asBag
  113549.     "Answer a Bag whose elements are those stored in the receiver"
  113550.  
  113551.     ^(Bag new: self size) 
  113552.         addAll: self; 
  113553.         yourself
  113554. !
  113555.  
  113556. asOrderedCollection
  113557.     "Answer an <OrderedCollection> whose elements are those of the receiver
  113558.     (ordering is that of the #do: operation as implemented by the receiver).
  113559.     Implementation Note: Avoid OrderedCollection>>addAll:, because
  113560.     it sends (indirectly) #size, which is slow to calculate."
  113561.  
  113562.     | answer |
  113563.     answer := OrderedCollection new: self approxSize.
  113564.     self do: [:each | answer addLast: each].
  113565.     ^answer!
  113566.  
  113567. asSet
  113568.     "Answer a Set whose elements are those stored in the receiver (any duplicates are therefore 
  113569.     eliminated)."
  113570.  
  113571.     ^(Set new: self approxSize) 
  113572.         addAll: self; 
  113573.         yourself
  113574. !
  113575.  
  113576. asSortedCollection
  113577.     "Answer a SortedCollection whose elements are those of the receiver, sorted so that each 
  113578.     element is less than or equal to (<=) its successors. The elements must understand #<=."
  113579.  
  113580.     ^(SortedCollection new: self approxSize) 
  113581.         addAll: self; 
  113582.         yourself
  113583. !
  113584.  
  113585. asSortedCollection: discriminator
  113586.     "Answer a SortedCollection whose elements are those of the receiver, sorted according to 
  113587.     the argument dynadic valuable argument, discriminator.
  113588.     Note: The discriminator does not need to be a BlockClosure, it must simply
  113589.     understand the #value:value: message from the dyadic valuable protocol."
  113590.  
  113591.     ^(SortedCollection new: self approxSize)
  113592.         sortBlock: discriminator;
  113593.         addAll: self;
  113594.         yourself
  113595. !
  113596.  
  113597. basicRoots: aCollection
  113598.     "Private - Set the roots of the receiver's hierarchy to be
  113599.     the elements of the <collection> argument, added in that
  113600.     collections #do: order."
  113601.  
  113602.     ^self subclassResponsibility!
  113603.  
  113604. childrenOf: anObject
  113605.     "Answer an <OrderedCollection> of the children of anObject within 
  113606.     the hierarchy managed by the receiver. If anObject is nil then answer
  113607.     the roots. If anObject does not exist in the receiver then raise a suitable 
  113608.     exception."
  113609.  
  113610.     ^anObject isNil
  113611.         ifTrue: [self roots]
  113612.         ifFalse: [self getChildrenOf: anObject]!
  113613.  
  113614. clear
  113615.     "Clear the receiver (remove all nodes)."
  113616.  
  113617.     ^self subclassResponsibility!
  113618.  
  113619. collapse: anObject
  113620.     "Removes the sub-trees beneath anObject in the receiver. If anObject does not exist
  113621.     in the tree then raise a suitable exception."
  113622.  
  113623.     ^self collapse: anObject ifAbsent: [self errorNotFound: anObject]!
  113624.  
  113625. collapse: anObject ifAbsent: exceptionHandler
  113626.     "Removes the sub-trees beneath anObject in the receiver. If anObject does not 
  113627.     exist in the tree then answer the result of evaluating the <niladicValuable>, 
  113628.     exceptionHandler, otherwise answer anObject."
  113629.  
  113630.     ^self subclassResponsibility!
  113631.  
  113632. countElements
  113633.     "Private - Count, and answer, the number of elemens in the receiver.
  113634.     Implementation Note: Could be implemented more elegantly with #inject:into:, but
  113635.     this implementation is about twice as fast."
  113636.  
  113637.     | tally |
  113638.     tally := 0.
  113639.     self do: [ :each | tally := tally + 1].
  113640.     ^tally!
  113641.  
  113642. do: operation
  113643.     "Evaluate monadic value argument, operation, for each of the elements of the 
  113644.     receiver. Answers the receiver. The elements are enumerated using a 'pre-order'
  113645.     or 'depth-first' traversal where the parent is visited before the children."
  113646.  
  113647.     ^self preOrderDo: operation
  113648.  
  113649.     !
  113650.  
  113651. endOrderDo: operation
  113652.     "Evaluate monadic value argument, operation, for each of the elements of the 
  113653.     receiver. Answers the receiver. The elements are enumerated using an 'end-order'
  113654.     traversal where the parent is visited after the children."
  113655.  
  113656.     self roots do: [ :each |
  113657.         self endOrderDo: operation on: each ]!
  113658.  
  113659. endOrderDo: operation on: anObject
  113660.     "Private - Evaluate monadic value argument, operation, for each of the elements 
  113661.     beneath anObject in the receiver. Answers the receiver. The elements are enumerated 
  113662.     using a 'end-order' traversal where anObject is visited after it's children."
  113663.  
  113664.     (self childrenOf: anObject) do: [:each |
  113665.         self endOrderDo: operation on: each ].
  113666.     operation value: anObject.
  113667.  
  113668.  
  113669.     !
  113670.  
  113671. formattedPrintOn: aStream
  113672.     "Print the receiver on aStream using a depth first traversal and with
  113673.     hyphens to indent levels in the hierarchy"
  113674.  
  113675.     self do: 
  113676.             [:each | 
  113677.             (self allParentsOf: each) size timesRepeat: [aStream nextPut: $-].
  113678.             each printOn: aStream.
  113679.             aStream cr]!
  113680.  
  113681. getChildrenOf: anObject
  113682.     "Private - Answer a <sequencedReadableCollection> of the children of #
  113683.     anObject within the hierarchy managed by the receiver. If anObject does not 
  113684.     exist in the receiver then raise a suitable exception."
  113685.  
  113686.     ^self subclassResponsibility!
  113687.  
  113688. hasChildren: anObject
  113689.     "Answer true if anObject has children within the hierarchy managed by the
  113690.     receiver. If anObject does not exist in the receiver then raise a
  113691.     suitable exception. Subclasses may be able to provide a more efficient 
  113692.     implementation."
  113693.  
  113694.     ^(self childrenOf: anObject) size > 0!
  113695.  
  113696. includes: anObject
  113697.     "Answer whether the argument, anObject, is one of the elements of the receiver.
  113698.     Uses identity for comparison. Subclasses may be able to provide a more
  113699.     efficient implementation."
  113700.  
  113701.     | roots |
  113702.     roots := self roots.
  113703.     ^(roots includes: anObject) or: [ 
  113704.         (roots intersection: (self allParentsOf: anObject)) isEmpty not]!
  113705.  
  113706. isEmpty
  113707.     "Answer whether the receiver contains any objects."
  113708.  
  113709.     ^self roots isEmpty!
  113710.  
  113711. keyOfNode: node in: collection ifAbsent: exceptionHandler
  113712.     "Answer the 'key' of the specified <Object> node in the
  113713.     specified keyed collection, or the result of evaluating the <niladicValuable>
  113714.     exception handler if no match is found. This method is used to allow
  113715.     the model to determine the comparison policy used to
  113716.     locate elements in collections (e.g. equality vs. identity).
  113717.     Implementation Note: Default to #keyAtValue:, which is 
  113718.     an identity comparison."
  113719.  
  113720.     ^self searchPolicy keyAtValue: node in: collection ifAbsent: exceptionHandler!
  113721.  
  113722. move: anObject asChildOf: aParentObject
  113723.     "Moves anObject in the receiver to be a child of aParentObject. If
  113724.     aParentObject is nil then anObject is added as a root of the tree.
  113725.     If anObject does not exist in the tree or aParentObject does not exist
  113726.     then raise a suitable exception. Answer anObject." 
  113727.  
  113728.     ^self subclassResponsibility
  113729.  
  113730.  
  113731.     !
  113732.  
  113733. parentOf: anObject
  113734.     "Answer the parent of anObject within the hierarchy managed by the
  113735.     receiver. If anObject is a root of the hierarchy then answer nil.
  113736.     If anObject does not exist in the receiver then raise a suitable
  113737.     exception."
  113738.  
  113739.     ^self subclassResponsibility
  113740. !
  113741.  
  113742. preOrderDo: operation
  113743.     "Evaluate monadic value argument, operation, for each of the elements of the 
  113744.     receiver. Answers the receiver. The elements are enumerated using a 'pre-order'
  113745.     or 'depth-first' traversal where the parent is visited before the children."
  113746.  
  113747.     self roots do: [ :each |
  113748.         self preOrderDo: operation on: each ]!
  113749.  
  113750. preOrderDo: operation on: anObject
  113751.     "Private - Evaluate monadic value argument, operation, for each of the elements 
  113752.     beneath anObject in the receiver. Answers the receiver. The elements are enumerated 
  113753.     using a 'pre-order' or 'depth-first' traversal where anObject is visited before 
  113754.     it's children."
  113755.  
  113756.     operation value: anObject.
  113757.     (self childrenOf: anObject) do: [:each |
  113758.         self preOrderDo: operation on: each ].
  113759.  
  113760.  
  113761.     !
  113762.  
  113763. refresh: anObject
  113764.     "Update anObject in the receiver because it's contents have changed although
  113765.     it's position in the hierarchy has not. If anObject does not exist in the tree 
  113766.     then raise a suitable exception. Answer anObject."
  113767.  
  113768.     ^self refresh: anObject ifAbsent: [self errorNotFound: anObject]!
  113769.  
  113770. refresh: anObject ifAbsent: exceptionHandler
  113771.     "Update anObject in the receiver because it's contents have changed although
  113772.     it's position in the hierarchy has not. If anObject does not exist in the tree 
  113773.     then answer the result of evaluating the <niladicValuable>, exceptionHandler,
  113774.     otherwise answer anObject."
  113775.  
  113776.     (self includes: anObject) ifFalse: [^exceptionHandler value].
  113777.     self trigger: #itemUpdated: with: anObject.
  113778.     ^anObject
  113779.  
  113780.  
  113781.     !
  113782.  
  113783. refreshTree: anObjectOrNil
  113784.     "Update the hierarchy below anObjectOrNil in the receiver.
  113785.     If anObjectOrNil does not exist in the tree then raise a suitable exception. 
  113786.     Answer anObject."
  113787.  
  113788.     anObjectOrNil isNil ifFalse: [
  113789.         (self includes: anObjectOrNil) ifFalse: [
  113790.             self errorNotFound: anObjectOrNil ]].
  113791.     self trigger: #treeChanged: with: anObjectOrNil.
  113792.     ^anObjectOrNil
  113793.  
  113794.  
  113795.     !
  113796.  
  113797. remove: anObject
  113798.     "Removes anObject from the receiver. If anObject does not exist
  113799.     in the tree then raise a suitable exception. Answer anObject."
  113800.  
  113801.     ^self remove: anObject ifAbsent: [self errorNotFound: anObject]!
  113802.  
  113803. remove: anObject ifAbsent: exceptionHandler
  113804.     "Removes anObject from the receiver. If anObject does not exist
  113805.     in the tree then answer the result of evaluating the <niladicValuable>,
  113806.     exceptionHandler, otherwise answer anObject."
  113807.  
  113808.     ^self subclassResponsibility!
  113809.  
  113810. removeAll
  113811.     "Removes all the objects in the receiver. A synonym for #clear"
  113812.  
  113813.     self clear
  113814.  
  113815.     !
  113816.  
  113817. reset
  113818.     "Private - Reinitialize the receiver."
  113819.  
  113820.     ^self!
  113821.  
  113822. roots
  113823.     "Answer the roots of the receiver's hierarchy."
  113824.  
  113825.     ^self subclassResponsibility
  113826. !
  113827.  
  113828. roots: aCollection
  113829.     "Set the roots of the receiver's hierarchy to aCollection"
  113830.  
  113831.     self reset.
  113832.     self basicRoots: aCollection.
  113833.     self trigger: #treeChanged: with: nil.!
  113834.  
  113835. searchPolicy
  113836.     "Answer the <searchPolicy> used to compare and search for elements by the receiver."
  113837.  
  113838.     ^SearchPolicy identity!
  113839.  
  113840. setRoots: aCollection
  113841.     "Private - Initialize the receiver with the roots in the <Collection> argument."
  113842.  
  113843.     self initialize.
  113844.     self basicRoots: aCollection!
  113845.  
  113846. size
  113847.     "Answer the number of elements in the receiver.
  113848.     Implementation Note: This implementation is rather inefficient, 
  113849.     and subclasses will probably want to override it."
  113850.  
  113851.     ^self countElements!
  113852.  
  113853. withAllChildren: anObject
  113854.     "Answer an <OrderedCollection> containing the <Object> argument
  113855.     (which must be in the tree represented by the receiver)  and all of the
  113856.     children of that object in this tree."
  113857.  
  113858.     | children |
  113859.     children := OrderedCollection new: 64.
  113860.     children add: anObject.
  113861.     (self childrenOf: anObject) do: [:each |
  113862.         children addAll: (self withAllChildren: each) ].
  113863.     ^children!
  113864.  
  113865. withAllParents: anObject
  113866.     "Answer an <OrderedCollection> containing the <Object> argument
  113867.     (which must be in the tree represented by the receiver)  and all of the
  113868.     parents of that object in this tree."
  113869.  
  113870.     | parents |
  113871.     parents := OrderedCollection new: 64.
  113872.     parents add: anObject.
  113873.     parents addAll: (self allParentsOf: anObject).
  113874.     ^parents! !
  113875.  
  113876. ValueModel comment:
  113877. 'ValueModel is an abstract class whose subclasses provide the capability to adapt the protocol of a subject object to a simple <value> protocol. The intention is to allow general purpose objects, such as <views>, to interact with more specific objects, by providing an adapted layer between them. A client of a <valueModel> can set the value of the subject using a #value: message and similarly the value can be retrieved by sending #value:. 
  113878.  
  113879. An additional benefit is that <valueModel>s trigger a #value change notification whenever  the value is modified. This allows <valueModel>s to share data with several observers following the standard Observer pattern.  All <valueModel>s hold a <ComparisonPolicy> which determines when to trigger an update notification that the value has changed. By default, a change is notified when an attempt is made to set the value to a new one which is not equal to the existing value. 
  113880.  
  113881. The most commonly used subclass of ValueModel is ValueHolder whose instances wrap a subject object and use this as the value. 
  113882.  
  113883. Instance Variables:
  113884.     comparisonPolicy    <ComparisonPolicy> for determining whether a new value is different from the existing value
  113885. '!
  113886. !ValueModel class methodsFor!
  113887.  
  113888. comparisonPolicy: aComparisonPolicy
  113889.     "Answer a new instance of the receiver with the specified comparison
  113890.     policy and a 'nil' initial value."
  113891.  
  113892.     ^(self new)
  113893.         comparisonPolicy: aComparisonPolicy;
  113894.         yourself!
  113895.  
  113896. icon
  113897.     "Answers an Icon that can be used to represent this class"
  113898.  
  113899.     ^##(self) defaultIcon!
  113900.  
  113901. publishedAspectsOfInstances
  113902.     "Answer a <LookupTable> of the <Aspect>s published by instances of the receiver."
  113903.  
  113904.     ^(super publishedAspectsOfInstances)
  113905.         add: (Aspect name: #value);
  113906.         yourself!
  113907.  
  113908. publishedEventsOfInstances
  113909.         "Answer a Set of Symbols that describe the published events triggered
  113910.         by instances of the receiver."
  113911.     
  113912.         ^super publishedEventsOfInstances
  113913.             add: #valueChanged;
  113914.             yourself.
  113915.     !
  113916.  
  113917. stbConvertFrom: anSTBClassFormat
  113918.     "Convert from earlier version models.
  113919.     2: Added 'settingValue' instance variable."
  113920.  
  113921.     ^[:data | | newInst offset |
  113922.         newInst := self basicNew.
  113923.         (anSTBClassFormat version=0) ifTrue: [offset := 2].
  113924.         (anSTBClassFormat version=1) ifTrue: [offset := 1].
  113925.         data keysAndValuesDo: [:i :v | newInst instVarAt: i+offset put: v].
  113926.         newInst]!
  113927.  
  113928. stbVersion
  113929.     "Answer the current binary filer version number for instances of the receiver."
  113930.  
  113931.     ^2! !
  113932.  
  113933. !ValueModel methodsFor!
  113934.  
  113935. asValue
  113936.     "Answer the receiver as a ValueModel"
  113937.  
  113938.     ^self!
  113939.  
  113940. canGet
  113941.     "Private - Answer whether the receiver can be read using #value."
  113942.  
  113943.     ^true!
  113944.  
  113945. canSet
  113946.     "Private - Answer whether the receiver can be set using #value:."
  113947.  
  113948.     ^true!
  113949.  
  113950. comparisonPolicy
  113951.     "Answer the ComparisonPolicy for the receiver. This is used
  113952.     to determine whether a value has actually been changed and
  113953.     therefore whether dependents should be informed of the event"
  113954.  
  113955.     ^comparisonPolicy!
  113956.  
  113957. comparisonPolicy: aComparisonPolicy
  113958.     "Sets the comparison policy to be used by the receiver.
  113959.     This is used to determine whether a value has actually been 
  113960.     changed and therefore whether dependents should be informed 
  113961.     of the event"
  113962.  
  113963.     comparisonPolicy := aComparisonPolicy!
  113964.  
  113965. debugPrintString
  113966.     "Answer a <readableString> whose characters are a description of the receiver 
  113967.     as the debugger would want to see it.
  113968.     Implementation Note: Since #value is used by #printOn:, we implement this to 
  113969.     allow us to debug #value, otherwise setting a breakpoint in #value results in a
  113970.     meltdown."
  113971.  
  113972.     ^self basicPrintString
  113973. !
  113974.  
  113975. defaultComparisonPolicy
  113976.     "Private - Answer the default comparison policy to use for the receiver.
  113977.     By default we don't want to trigger change notifications if the values are equal"
  113978.  
  113979.     ^SearchPolicy equality!
  113980.  
  113981. initialize
  113982.     "Private - Initialize the receiver with a default comparison policy that
  113983.     always considers new values as different from existing ones"
  113984.  
  113985.     super initialize.
  113986.     self comparisonPolicy: self defaultComparisonPolicy.
  113987.     settingValue := false.!
  113988.  
  113989. notifyChanged
  113990.     "Private - The receiver's value has changed. Notify observers appropriately"
  113991.  
  113992.     settingValue ifFalse: [ self trigger: #valueChanged ]
  113993. !
  113994.  
  113995. printOn: aStream
  113996.     "Append the ASCII representation of the receiver to aStream as a developer would wish to see it."
  113997.  
  113998.     super printOn: aStream.
  113999.     aStream nextPut: $(.
  114000.     aStream print: self value.
  114001.     aStream nextPut: $).!
  114002.  
  114003. setValue: newValue
  114004.     "Private - Set the value of the receiver to be the <Object> newValue
  114005.     without notifying dependents of the change."
  114006.  
  114007.     ^self subclassResponsibility!
  114008.  
  114009. value
  114010.     "Answer the <Object> value of the receiver."
  114011.  
  114012.     ^self subclassResponsibility!
  114013.  
  114014. value: anObject
  114015.     "Assigns the value for the receiver and notify dependents if it
  114016.     has changed according to our comparisonPolicy"
  114017.  
  114018.     (self comparisonPolicy compare: self value with: anObject) ifFalse: [ 
  114019.         [settingValue := true. self setValue: anObject] ensure: [settingValue := false].
  114020.         self notifyChanged ]! !
  114021.  
  114022. TreeModel comment:
  114023. 'TreeModel implements the <treeModel> protocol and organises a collection of objects into a tree like data structure. The tree is built of a hierarchy of <TreeNodes>. Objects can be added to the tree using #add:asChildOf: and they can be removed using #remove:. An object already in the tree can be moved from one location in the hierarchy to another by using the #move:asChildOf: message. Root nodes in the tree can be considered as having a parent of nil. 
  114024.  
  114025. Instance Variables:
  114026.     anchorNode    <TreeNode> or nil, representing the root of the tree.
  114027.     objectNodeMap    <IdentityDictionary> mapping tree objects to <TreeNodes>
  114028.  
  114029. '!
  114030. !TreeModel class methodsFor!
  114031.  
  114032. defaultSearchPolicy
  114033.     "Answer the default <searchPolicy> used by instances of the receiver."
  114034.  
  114035.     ^SearchPolicy identity!
  114036.  
  114037. new
  114038.     "Answer a new empty instance of the receiver with the 
  114039.     default search policy."
  114040.  
  114041.     ^self withRoots: #()!
  114042.  
  114043. publishedEventsOfInstances
  114044.         "Answer a Set of Symbols that describe the published events triggered
  114045.         by instances of the receiver."
  114046.     
  114047.         ^super publishedEventsOfInstances
  114048.             add: #item:movedToParent:;
  114049.             add: #item:removedFromParent:;
  114050.             add: #item:addedInParent:;
  114051.             yourself.
  114052.     !
  114053.  
  114054. stbConvertFrom: anSTBClassFormat
  114055.     "Convert from earlier version models.
  114056.     1:See Model
  114057.     2: Added 'searchPolicy' instance variable."
  114058.  
  114059.     ^[:data | | newInst |
  114060.         newInst := self basicNew.
  114061.         newInst searchPolicy: self defaultSearchPolicy.
  114062.         data keysAndValuesDo: [:i :v | newInst instVarAt: i put: v].
  114063.         newInst]!
  114064.  
  114065. stbVersion
  114066.     ^2!
  114067.  
  114068. withRoots: aCollection 
  114069.     "Answer an instance of the receiver with the roots in aCollection"
  114070.  
  114071.     ^self withRoots: aCollection searchPolicy: self defaultSearchPolicy!
  114072.  
  114073. withRoots: aCollection searchPolicy: aSearchPolicy
  114074.     "Answer an instance of the receiver with the roots in aCollection"
  114075.  
  114076.     ^self basicNew
  114077.         setRoots: aCollection searchPolicy: aSearchPolicy! !
  114078.  
  114079. !TreeModel methodsFor!
  114080.  
  114081. add: leafObject asChildOf: parentObject
  114082.     "Adds the <Object>, leafObject, to the receiver as a child of the <Object>,
  114083.     parentObject, answering the new leaf. If the parent is nil then leaf is added 
  114084.     as a root of the tree. If leaf already exists in the tree, then answer the existing 
  114085.     node which is left in place (i.e. it is not an error to attempt to add an equivalent 
  114086.     node     twice, and the existing node is not overwritten with the new object).
  114087.     If the parent does not exist then raise a <NotFoundError>. "
  114088.  
  114089.     | parentNode childNode |
  114090.     childNode := self getNodeFor: leafObject ifAbsent: [].
  114091.     childNode notNil ifTrue: [^childNode object].
  114092.     parentNode := parentObject isNil 
  114093.                 ifTrue: [anchorNode]
  114094.                 ifFalse: [self getNodeFor: parentObject].
  114095.     self addChild: leafObject parentNode: parentNode.
  114096.     self 
  114097.         trigger: #item:addedInParent:
  114098.         with: leafObject
  114099.         with: parentObject.
  114100.     ^leafObject!
  114101.  
  114102. add: anObject asChildOfNode: aTreeNode
  114103.     "Private - Adds the <Object>, anObject, to the receiver as a child of the <TreeNode>,
  114104.     aTreeNode, answering the new leaf <TreeNode>. If the object already exists in the tree 
  114105.     (determined by comparison using the receiver's search policy), then the existing node is 
  114106.     answered and no change is made to the tree (an invariant of TreeModels is that they may
  114107.     not contain duplicate nodes)."
  114108.  
  114109.     | childNode |
  114110.     childNode := self getNodeFor: anObject ifAbsent: [].
  114111.     ^childNode isNil 
  114112.         ifTrue: [self addChild: anObject parentNode: aTreeNode]
  114113.         ifFalse: [childNode]!
  114114.  
  114115. addChild: anObject parentNode: parentNode
  114116.     "Private - Create a child leaf and add under the specified parent node.
  114117.     Answer the new child node. This is the basic add operation."
  114118.  
  114119.     | childNode |
  114120.     childNode := self newNode: anObject.
  114121.     objectNodeMap at: anObject put: childNode.
  114122.     parentNode addChildNode: childNode.
  114123.     ^childNode!
  114124.  
  114125. approxSize
  114126.     "Private - Answer the approximate size of the receiver. Since TreeModels keep an
  114127.     object to node maping dictionary we can use the size of this"
  114128.  
  114129.     ^self size!
  114130.  
  114131. asBag
  114132.     "Answer a Bag whose elements are those stored in the receiver"
  114133.  
  114134.     ^objectNodeMap keys asBag!
  114135.  
  114136. asSet
  114137.     "Answer a Set whose elements are those stored in the receiver (any duplicates are therefore 
  114138.     eliminated)."
  114139.  
  114140.     ^objectNodeMap keys asSet!
  114141.  
  114142. basicRoots: aCollection
  114143.     "Private - Set the roots of the receiver's hierarchy to be
  114144.     the elements of the <collection> argument, added in that
  114145.     collections #do: order."
  114146.  
  114147.     aCollection do: [:each | self addChild: each parentNode: anchorNode]!
  114148.  
  114149. childrenOfNode: node
  114150.     "Private - Answer an <OrderedCollection> of the child nodes of the <TreeNode>, node."
  114151.  
  114152.     ^node children!
  114153.  
  114154. clear
  114155.     "Clear the receiver (remove all nodes)."
  114156.  
  114157.     self reset.
  114158.     self refreshTree: nil.!
  114159.  
  114160. collapse: anObject ifAbsent: exceptionHandler
  114161.     "Removes the sub-trees beneath anObject in the receiver. If anObject does not 
  114162.     exist in the tree then answer the result of evaluating the <niladicValuable>, 
  114163.     exceptionHandler, otherwise answer anObject."
  114164.  
  114165.     | node |
  114166.     node := self getNodeFor: anObject ifAbsent: [^exceptionHandler value].
  114167.     self forgetChildrenOfNode: node.
  114168.     node beChildless.
  114169.     self refreshTree: anObject!
  114170.  
  114171. forgetChildrenOfNode: aTreeNode
  114172.     "Private - Note that we access the children collection directly as we merely want to 
  114173.     remove existing children from the objectNodeMap."
  114174.  
  114175.     aTreeNode getChildren 
  114176.         ifNotNil: [:childNodes | childNodes do: [:each | self forgetNode: each]]!
  114177.  
  114178. forgetNode: aTreeNode
  114179.     self forgetChildrenOfNode: aTreeNode.
  114180.     objectNodeMap removeKey: aTreeNode object!
  114181.  
  114182. getChildrenOf: anObject
  114183.     "Private - Answer an OrderedCollection of the children of anObject within 
  114184.     the hierarchy managed by the receiver. If anObject does not exist 
  114185.     in the receiver then raise a suitable exception."
  114186.  
  114187.     | node |
  114188.     node := self getNodeFor: anObject.
  114189.     ^(self childrenOfNode: node) collect: [:each | each object]!
  114190.  
  114191. getNodeFor: anObject
  114192.     "Private - Answer the <TreeNode> that represents the <Object>, anObject, which
  114193.     must be an element of this tree model."
  114194.  
  114195.     ^self getNodeFor: anObject ifAbsent: [self errorNotFound: anObject]!
  114196.  
  114197. getNodeFor: anObject ifAbsent: exceptionHandler
  114198.     "Private - Answers the TreeNode in the receiver that corresponds to anObject.
  114199.     If anObject does not exist in the tree answer the result of evaluating the 
  114200.     niladic valuable exceptionHandler. If anObject is nil it is treated as being
  114201.     the anchorNode"
  114202.     
  114203.     ^objectNodeMap at: anObject ifAbsent: exceptionHandler!
  114204.  
  114205. hasChildren: anObject
  114206.     "Answer true if anObject has children within the hierarchy managed by the
  114207.     receiver. If anObject does not exist in the receiver then raise a suitable
  114208.     exception"
  114209.  
  114210.     ^(self childrenOfNode: (anObject isNil 
  114211.                 ifTrue: [anchorNode]
  114212.                 ifFalse: [self getNodeFor: anObject])) 
  114213.         notEmpty!
  114214.  
  114215. includes: anObject
  114216.     "Answer whether the argument, anObject, is one of the elements of the receiver.
  114217.     Uses identity for comparison"
  114218.  
  114219.     ^(self getNodeFor: anObject ifAbsent: []) notNil!
  114220.  
  114221. initialize
  114222.     "Private - Initialize the receiver"
  114223.  
  114224.     self reset!
  114225.  
  114226. move: anObject asChildOf: aParentObject
  114227.     "Moves anObject in the receiver to be a child of aParentObject. If
  114228.     aParentObject is nil then anObject is added as a root of the tree.
  114229.     If anObject does not exist in the tree or aParentObject does not exist
  114230.     then raise a suitable exception. Answer anObject."
  114231.  
  114232.     | parentNode childNode |
  114233.  
  114234.     "Find the parent node"
  114235.     parentNode := aParentObject isNil
  114236.         ifTrue: [anchorNode]
  114237.         ifFalse: [self getNodeFor: aParentObject].
  114238.  
  114239.     "Find the child node"
  114240.     childNode := self getNodeFor: anObject.
  114241.  
  114242.     "Move it"
  114243.     childNode parent removeChildNode: childNode.
  114244.     parentNode addChildNode: childNode.
  114245.  
  114246.     "Inform dependents"    
  114247.     self trigger: #item:movedToParent: with: anObject with: aParentObject.
  114248.  
  114249.     ^anObject!
  114250.  
  114251. newNode: anObject
  114252.     ^self nodeClass for: anObject!
  114253.  
  114254. nodeClass
  114255.     "Answer the class of object to be used to represent the receiver's nodes."
  114256.  
  114257.     ^TreeNode!
  114258.  
  114259. parentNodeOf: anObject
  114260.     | node parentNode |
  114261.     node := self getNodeFor: anObject.
  114262.     parentNode := node parent.
  114263.     ^parentNode!
  114264.  
  114265. parentOf: anObject
  114266.     "Answer the parent of anObject within the hierarchy managed by the
  114267.     receiver. If anObject is a root of the hierarchy then answer nil.
  114268.     If anObject does not exist in the receiver then raise a suitable
  114269.     exception."
  114270.  
  114271.     ^(self parentNodeOf: anObject) object!
  114272.  
  114273. remove: anObject ifAbsent: exceptionHandler
  114274.     "Removes anObject from the receiver. If anObject does not exist
  114275.     in the tree then answer the result of evaluating the <niladicValuable>,
  114276.     exceptionHandler, otherwise answer anObject."
  114277.  
  114278.     | node parentNode |
  114279.     node := self getNodeFor: anObject ifAbsent: [^exceptionHandler value].
  114280.     parentNode := node parent.
  114281.     parentNode removeChildNode: node.
  114282.     self forgetNode: node.
  114283.  
  114284.     "Inform dependents"
  114285.     self 
  114286.         trigger: #item:removedFromParent:
  114287.         with: anObject
  114288.         with: parentNode object.
  114289.     ^anObject!
  114290.  
  114291. reset
  114292.     "Private - Reset the receiver (remove all nodes)."
  114293.  
  114294.     anchorNode := self newNode: nil.
  114295.     objectNodeMap := searchPolicy newLookupTable!
  114296.  
  114297. rootNodes
  114298.     ^self childrenOfNode: anchorNode!
  114299.  
  114300. roots
  114301.     "Answer the roots of the receiver's hierarchy.
  114302.     Note that the roots of the tree must always be available."
  114303.  
  114304.     ^self rootNodes collect: [:each | each object]!
  114305.  
  114306. searchPolicy
  114307.     "Answer the <searchPolicy> used to compare and search for elements by the receiver."
  114308.  
  114309.     ^searchPolicy!
  114310.  
  114311. searchPolicy: aSearchPolicy
  114312.     "Private - N.B. The searchPolicy cannot be changed after a tree has been created.
  114313.     This method is only for use during STB conversion of old instances."
  114314.  
  114315.     searchPolicy := aSearchPolicy!
  114316.  
  114317. setRoots: aCollection searchPolicy: aSearchPolicy
  114318.     "Private - Initialize the receiver with the roots in the <Collection> argument and
  114319.     the specified <SearchPolicy>."
  114320.  
  114321.     searchPolicy := aSearchPolicy.
  114322.     self setRoots: aCollection!
  114323.  
  114324. size
  114325.     "Answer the number of elements in the receiver"
  114326.  
  114327.     ^objectNodeMap size! !
  114328.  
  114329. VirtualTreeModel comment:
  114330. 'VirtualTreeModel provides an <treeModel> interface onto a tree like data structure where the elements in the tree are always aware of their position in the hierarchy. In general, Smalltalk Collections organise objects into groups, but the objects are unaware of their grouping. In this way an object can belong to more than one Collection at a time. For a tree that follows this behaviour use a <TreeModel>. However, some objects are implicitly aware of their location within a tree hierarchy (e.g. Smalltalk classes); in such cases a VirtualTreeModel can be used to represent the structure without having to duplicate it as a hierarchy of <TreeNode>s.  
  114331.  
  114332. VirtualTreeModel triggers the same modification events as a standard <treeModel>. However, the methods #add:asChildOf:, #move:asChildOf: and #remove: are only used to inform the tree model of changes that have been made externally to its structure. They do not actually modify the structure, though, since the VirtualTreeModel cannot be considered as owning it elements; they simply trigger the appropriate change notifications to inform the tree''s Observers. 
  114333.  
  114334. The virtual tree is represented by a collection of objects that are the root of the hierarchy. Navigation around the tree is specifying by three monadic valuables; the getChildrenBlock, the getParentBlock and the hasChildrenBlock. A monadic filter valuable can also be specified to determine which of the objects in the actual hierarchy will appear in the virtual tree, though by default all objects are included.
  114335.  
  114336. A VirtualTreeModel tree is configured by supplying a number of root objects using the #roots aspect and also by setting number of <monadicValuable> (usually blocks) to define the structure. The following aspects are used to do this:
  114337.  
  114338. #getChildrenBlock    : which answers a <sequencedCollection> of children for an object in the tree.
  114339. #hasChildrenBlock    : which answers a <boolean> to quickly identify whether an object has any children.
  114340. #getParentBlock    : which answer the parent of an object, or nil if it is one of the roots.
  114341.  
  114342. Instance Variables:
  114343.     roots        <OrderedCollection> of root objects.
  114344.     getChildrenBlock     <monadicValuable> used to identify the children of anobject in the tree.
  114345.     getParentBlock     <monadicValuable> used to identify the parent of an object in the tree.
  114346.     hasChildrenBlock     <monadicValuable> used to determine whether an object has children.
  114347.     filter        <monadicValuable> used to determine whether a object should be treated as part of the tree.'!
  114348. !VirtualTreeModel class methodsFor!
  114349.  
  114350. new
  114351.     "Answer an instance of the receiver; instances must be initialized"
  114352.  
  114353.     ^self withRoots: OrderedCollection new!
  114354.  
  114355. publishedEventsOfInstances
  114356.         "Answer a Set of Symbols that describe the published events triggered
  114357.         by instances of the receiver."
  114358.     
  114359.         ^super publishedEventsOfInstances
  114360.             add: #item:movedToParent:;
  114361.             add: #treeChanged:;
  114362.             add: #item:removedFromParent:;
  114363.             add: #item:addedInParent:;
  114364.             yourself.
  114365.     ! !
  114366.  
  114367. !VirtualTreeModel methodsFor!
  114368.  
  114369. add: anObject asChildOf: aParentObject
  114370.     "Pseudo-adds anObject to the receiver as a child of aParentObject. 
  114371.     Since the tree is managed externally to the receiver we just 
  114372.     inform our dependents of the change. Answer anObject"
  114373.  
  114374.     "Note that we must add the root, regardless of whether it passes the filter, as it
  114375.      is needed to maintain the structure of the tree."
  114376.  
  114377.     aParentObject isNil ifTrue: [roots add: anObject].
  114378.     (filter value: anObject) 
  114379.         ifTrue: 
  114380.             [self 
  114381.                 trigger: #item:addedInParent:
  114382.                 with: anObject
  114383.                 with: aParentObject].
  114384.     ^anObject!
  114385.  
  114386. basicRoots: aCollection
  114387.     "Private - Set the roots of the receiver's hierarchy to be
  114388.     the elements of the <collection> argument.
  114389.     N.B. the root collection may be updated so to avoid having
  114390.     a side effect on a shared object, it is copied."
  114391.  
  114392.     roots := aCollection asOrderedCollection.
  114393.     roots == aCollection ifTrue: [roots := roots copy]!
  114394.  
  114395. clear
  114396.     "Clear the receiver (remove all nodes)."
  114397.  
  114398.     self roots: OrderedCollection new.
  114399. !
  114400.  
  114401. collapse: anObject ifAbsent: exceptionHandler
  114402.     "Removes the sub-trees beneath anObject in the receiver. If anObject does not 
  114403.     exist in the tree then answer the result of evaluating the <niladicValuable>, 
  114404.     exceptionHandler, otherwise answer anObject."
  114405.  
  114406.     anObject isNil ifTrue: [self basicRoots: #()].
  114407.     ^self refreshTree: anObject!
  114408.  
  114409. filter
  114410.     "Answers the <monadicValuable> filter block that determines which
  114411.     elements within the virtual hierachy are to be considered part of the receiver."
  114412.  
  114413.     ^filter!
  114414.  
  114415. filter: aOneArgBlock
  114416.     "Answers the <monadicValuable> filter block that determines which
  114417.     elements within the virtual hierachy are to be considered part of the receiver."
  114418.  
  114419.     filter := aOneArgBlock.!
  114420.  
  114421. getChildrenBlock: aBlock
  114422.     "Set the receiver's getChildrenBlock to aBlock.
  114423.      The block should answer a collection of children of the object 
  114424.     passed as its parameter."
  114425.  
  114426.     getChildrenBlock := aBlock
  114427.  
  114428. !
  114429.  
  114430. getChildrenOf: anObject
  114431.     ^(getChildrenBlock value: anObject) select: filter!
  114432.  
  114433. getParentBlock: aBlock
  114434.     "Set the receiver's getParentBlock to aBlock.
  114435.      The block should answer the parent of the object
  114436.     passed as its parameter."
  114437.  
  114438.     getParentBlock := aBlock
  114439.  
  114440. !
  114441.  
  114442. hasChildren: anObject
  114443.     "Answer true if anObject has children within the hierarchy represented by the
  114444.     receiver. Evaluates the hasChildrenBlock for this purpose"
  114445.  
  114446.     ^anObject isNil 
  114447.         ifTrue: [self roots notEmpty]
  114448.         ifFalse: 
  114449.             [(filter value: anObject) and: 
  114450.                     [hasChildrenBlock isNil 
  114451.                         ifTrue: [(self childrenOf: anObject) notEmpty]
  114452.                         ifFalse: [hasChildrenBlock value: anObject]]]!
  114453.  
  114454. hasChildrenBlock: discriminator
  114455.     "Set the receiver's hasChildrenBlock to the <monadicValuable>, discriminator,
  114456.     which may also be nil to specify the default behaviour.
  114457.     The valuable should answer true if there are children of the object passed 
  114458.     as its parameter. If discriminator is nil then the getChildrenBlock will be used 
  114459.     and the size of the resulting collection after passing through the filter used to
  114460.     determine the result."
  114461.  
  114462.     hasChildrenBlock := discriminator!
  114463.  
  114464. initialize
  114465.     "Private - Initialize some instance variables to defaults."
  114466.  
  114467.     filter := ##(Message selector: #notNil)!
  114468.  
  114469. move: anObject asChildOf: aParentObject
  114470.     "Pseudo-moves anObject in the receiver to be a child of aParentObject. 
  114471.     Since the tree is mainly managed externally to the receiver for the most
  114472.     part this simply involves informing our dependents of the change. The
  114473.     exception is where an object is being promoted to a root, or conversely
  114474.     being demoted from a root, in which case the roots collection needs
  114475.     to be maintained."
  114476.  
  114477.     aParentObject isNil
  114478.         ifTrue: [
  114479.             "Might have been promoted to root - if not one already"
  114480.             (roots includes: anObject) ifFalse: [roots add: anObject]]
  114481.         ifFalse: [
  114482.             "Might have been demoted from being a root"
  114483.             roots remove: anObject ifAbsent: []].
  114484.     (filter value: anObject) ifTrue: [
  114485.         self trigger: #item:movedToParent: with: anObject with: aParentObject].
  114486.     ^anObject!
  114487.  
  114488. parentOf: anObject
  114489.     "Answer the parent of anObject within the hierarchy represented by the
  114490.     receiver. If anObject is a root of the hierarchy then answer nil.
  114491.     The getParentBlock is evaluated for this purpose"
  114492.  
  114493.     ((self roots includes: anObject) or: [anObject isNil]) ifTrue: [^nil].
  114494.     ^getParentBlock value: anObject!
  114495.  
  114496. remove: anObject ifAbsent: exceptionHandler
  114497.     "Removes anObject from the receiver. If anObject does not exist
  114498.     in the tree then answer the result of evaluating the <niladicValuable>,
  114499.     exceptionHandler, otherwise answer anObject.
  114500.     Implementation Note: Since the tree is managed
  114501.     externally to the receiver we just inform our dependents of the change."
  114502.  
  114503.     | parent |
  114504.     roots remove: anObject ifAbsent: [parent := self parentOf: anObject].
  114505.     self 
  114506.         trigger: #item:removedFromParent:
  114507.         with: anObject
  114508.         with: parent.
  114509.     ^anObject!
  114510.  
  114511. roots
  114512.     "Answer the roots of the receiver's hierarchy"
  114513.  
  114514.     ^roots select: filter!
  114515.  
  114516. setRoots: aCollection
  114517.     "Private - Initialize the receiver with the roots in aCollection"
  114518.  
  114519.     getParentBlock := Message selector: #parent.
  114520.     getChildrenBlock := Message selector: #children.
  114521.     self basicRoots: aCollection!
  114522.  
  114523. withRoots: aCollection
  114524.     #deprecated.    "N.B. Overrides of #withRoots: in subclasses should be renamed as the overrides will not be called"
  114525.     self setRoots: aCollection! !
  114526.  
  114527. CategoryTreeModel comment:
  114528. 'CategoryTreeModel represents a <treeModel> holding <Category> objects.
  114529.  
  114530. Instance Variables:
  114531.     title    <IntermediateCategory> the root of the tree.
  114532.  
  114533. '!
  114534. !CategoryTreeModel class methodsFor!
  114535.  
  114536. defaultSearchPolicy
  114537.     ^SearchPolicy equality! !
  114538.  
  114539. !CategoryTreeModel methodsFor!
  114540.  
  114541. addCategory: aCategory 
  114542.     "Private - Adds aCategory and all of its parent categories to the receiver. 
  114543.     Parses the name of aCategory to split off the parents"
  114544.  
  114545.     | name sep parent |
  114546.     name := aCategory name.
  114547.     sep := aCategory class separator.
  114548.     parent := title.
  114549.  
  114550.     "Do fast check to avoid expense of subStrings: for common case"
  114551.     (name identityIncludes: sep) 
  114552.         ifTrue: 
  114553.             [| names moniker class |
  114554.             class := IntermediateCategory.    "aCategory class."
  114555.             names := name subStrings: sep.
  114556.             moniker := String new.
  114557.             names 
  114558.                 from: 1
  114559.                 to: names size - 1
  114560.                 do: 
  114561.                     [:part | 
  114562.                     | branch |
  114563.                     moniker := moniker , part.
  114564.                     branch := self add: (class name: moniker) asChildOf: parent.
  114565.                     moniker := moniker copyWith: sep.
  114566.                     parent := branch]].
  114567.     self add: aCategory asChildOf: parent!
  114568.  
  114569. list: list
  114570.     "Set the contents of the receiver to be the <Collection>, of <Category>s in list"
  114571.  
  114572.     self clear.
  114573.  
  114574.     "Add a title node if there is one"
  114575.     title notNil ifTrue: [self addRoot: title].
  114576.     (list asSortedCollection: [:a :b | a name < b name]) 
  114577.         do: [:each | self addCategory: each]!
  114578.  
  114579. title
  114580.     "Answer the top most node in the tree."
  114581.  
  114582.     ^title!
  114583.  
  114584. title: category
  114585.     "Set the topmost node of the tree to be the specified <Category>"
  114586.  
  114587.     title := category! !
  114588.  
  114589. ExpandingTreeModel comment:
  114590. 'ExpandingTreeModel is a specialized <TreeModel> that dynamically generates the set of child nodes for a node, but only on first request. The tree is still built with a hierarchy of <TreeNodes>, but starts off only with the roots. As the user navigates through the tree (actually as the client view requests them) the tree is fleshed out.
  114591.  
  114592. See also VirtualTreeModel, which is a fully dynamic tree model.
  114593.  
  114594. Instance Variables:
  114595.     getChildrenBlock     <monadicValuable> used to identify the children of an object in the tree.
  114596.  
  114597. '!
  114598. !ExpandingTreeModel methodsFor!
  114599.  
  114600. approxSize
  114601.     "Private - Answer the approximate size of the receiver.
  114602.     Implementation Note: This does not have to be accurate, but it should be fast
  114603.     (i.e. don't calculate it by counting the receiver's elements)."
  114604.  
  114605.     ^50!
  114606.  
  114607. childrenOfNode: node
  114608.     "Private - Answer an <OrderedCollection> of the child nodes of the <TreeNode>, node."
  114609.  
  114610.     | children |
  114611.     (children := node getChildren) isNil 
  114612.         ifTrue: 
  114613.             [self expandNodeChildren: node.
  114614.             children := node children].
  114615.     ^children!
  114616.  
  114617. defaultGetChildrenBlock
  114618.     ^Message selector: #children!
  114619.  
  114620. expandNodeChildren: aTreeNode
  114621.     "Private - Dynamically expand the <ExpandingTreeNode>, node, to populate it
  114622.     with its children. Answer an <OrderedCollection> of <TreeNode> containing the
  114623.     children. Note that because TreeNode stores nil instead of an empty
  114624.     collection (to save space), each access to the children of a leaf node will
  114625.     required a further attempt at expanding the children. This has an upside, in that
  114626.     a connected tree view will update to display an expansion button when/if a former
  114627.     leaf acquires children."
  114628.  
  114629.     (self getChildrenOfNode: aTreeNode) 
  114630.         do: [:each | self add: each asChildOfNode: aTreeNode]!
  114631.  
  114632. getChildrenBlock
  114633.     "Answer the <monadicValuable> which when evaluated answers a <sequencedReadableCollection>
  114634.     of the children of its argument."
  114635.  
  114636.     ^getChildrenBlock!
  114637.  
  114638. getChildrenBlock: monad
  114639.     "Set the <monadicValuable> which when evaluated answers a <sequencedReadableCollection>
  114640.     of the children of its argument."
  114641.  
  114642.     getChildrenBlock := monad!
  114643.  
  114644. getChildrenOfNode: aTreeNode
  114645.     "Private - Answer an <OrderedCollection> of <TreeNode>s, being the calculated collection
  114646.     of children of the specified parent node."
  114647.  
  114648.     ^self getChildrenBlock value: aTreeNode object!
  114649.  
  114650. hasChildren: anObject
  114651.     "Answer true if anObject has children within the hierarchy managed by the
  114652.     receiver. If anObject does not exist in the receiver then raise a suitable
  114653.     exception"
  114654.  
  114655.     | node |
  114656.     node := anObject isNil ifTrue: [anchorNode] ifFalse: [self getNodeFor: anObject].
  114657.     ^node getChildren notNil or: 
  114658.             [self hasChildrenBlock 
  114659.                 ifNil: 
  114660.                     [self expandNodeChildren: node.
  114661.                     node children notEmpty]
  114662.                 ifNotNil: [:block | block value: anObject]]!
  114663.  
  114664. hasChildrenBlock
  114665.     ^hasChildrenBlock!
  114666.  
  114667. hasChildrenBlock: aMonadicValuableOrNil
  114668.     "If the hasChildrenBlock is nil (the default) then the tree determines whether there are 
  114669.     any children by expanding them using the getChildrenBlock (i.e. they will be retained)."
  114670.  
  114671.     hasChildrenBlock := aMonadicValuableOrNil!
  114672.  
  114673. initialize
  114674.     "Private - Initialize the receiver"
  114675.  
  114676.     getChildrenBlock := self defaultGetChildrenBlock.
  114677.     super initialize.
  114678. !
  114679.  
  114680. roots
  114681.     "Answer the roots of the receiver's hierarchy.
  114682.     Implementation Note: Override because we don't want to apply the getChildrenBlock
  114683.     against the anchor node if it is empty."
  114684.  
  114685.     ^anchorNode children collect: [:each | each object]! !
  114686.  
  114687. FolderHierarchyModel comment:
  114688. 'FolderHierarchyModel is a specialized <TreeModel> that holds a directory hierarchy, with nodes representing each directory/folder in the hierarchy. The nodes are maintained in sorted order.
  114689. '!
  114690. !FolderHierarchyModel class methodsFor!
  114691.  
  114692. defaultSearchPolicy
  114693.     ^SearchPolicy equality! !
  114694.  
  114695. !FolderHierarchyModel methodsFor!
  114696.  
  114697. addFolder: aString
  114698.     "Add the hierarchy of folders in the <readableString> path argument to the receiver."
  114699.  
  114700.     | parent newFolder |
  114701.     newFolder := self folderClass pathname: aString.
  114702.     (aString isEmpty or: [File isRootPath: aString]) 
  114703.         ifFalse: 
  114704.             [parent := newFolder parent.
  114705.             self addFolder: parent pathname].
  114706.     self add: newFolder asChildOf: parent!
  114707.  
  114708. folderClass
  114709.     ^Folder!
  114710.  
  114711. newNode: anObject
  114712.     ^(super newNode: anObject)
  114713.         children: (SortedCollection sortBlock: [:x :y | x object <= y object]);
  114714.         yourself! !
  114715.  
  114716. PackageHierarchyModel comment:
  114717. 'PackageHierarchyModel is a <FolderHierarchyModel> specialized to represent the hierarchy of folders of installed packages.
  114718. '!
  114719. !PackageHierarchyModel methodsFor!
  114720.  
  114721. addPackage: aPackage
  114722.     "Private - Add a the hierarchy of folders leading to the specified <Package> to the receiver."
  114723.  
  114724.     self addFolder: (File splitPathFrom: aPackage packagePathname)!
  114725.  
  114726. folderClass
  114727.     ^PackageFolder!
  114728.  
  114729. initialize
  114730.     super initialize.
  114731.     Package manager 
  114732.         when: #loadedChanged
  114733.         send: #refresh
  114734.         to: self.
  114735.     self refresh!
  114736.  
  114737. refresh
  114738.     "Private - Clear the receiver's existing contents and rebuild from the currently installed set
  114739.     of <Package>s."
  114740.  
  114741.     self clear.
  114742.     Package manager packages do: [:each | self addPackage: each]! !
  114743.  
  114744. ClassHierarchyModel comment:
  114745. 'ClassHierarchyModel implements a <treeModel> representing the hierarchy (or a subset of it) of <Class>es in the system.'!
  114746. !ClassHierarchyModel class methodsFor!
  114747.  
  114748. withAllClasses
  114749.     "Answer an instance of the receiver on the entire class hiearchy"
  114750.  
  114751.     ^self withRoots: Smalltalk allRoots
  114752. ! !
  114753.  
  114754. !ClassHierarchyModel methodsFor!
  114755.  
  114756. approxSize
  114757.     "Private - Answer the approximate size of the receiver.
  114758.     Implementation Note: This does not have to be accurate, but it should be fast
  114759.     (i.e. don't calculate it by counting the receiver's elements)."
  114760.  
  114761.     ^500!
  114762.  
  114763. onClassAdded: aClass
  114764.     self add: aClass asChildOf: aClass superclass!
  114765.  
  114766. onClassRemoved: aClass
  114767.     self remove: aClass
  114768. !
  114769.  
  114770. onClassUpdated: aClass
  114771.     "Note that we only trigger #item:movedToParent: events if the updated class
  114772.     is a <Class>, not if it is a <Metaclass>."
  114773.  
  114774.     aClass isMeta ifFalse: [self move: aClass asChildOf: aClass superclass].
  114775.     self refresh: aClass ifAbsent: []!
  114776.  
  114777. setRoots: aCollection
  114778.     "Private - Initialize the receiver with the roots in aCollection"
  114779.  
  114780.     "Deliberately omit super initialize"
  114781.  
  114782.     getChildrenBlock := Message selector: #subclasses.
  114783.     getParentBlock := Message selector: #superclass.
  114784.     "Leave hasChildrenBlock and filter at defaults"
  114785.     self basicRoots: aCollection.
  114786.     (self class environment)
  114787.         when: #classAdded:
  114788.             send: #onClassAdded:
  114789.             to: self;
  114790.         when: #classUpdated:
  114791.             send: #onClassUpdated:
  114792.             to: self;
  114793.         when: #classRemoved:
  114794.             send: #onClassRemoved:
  114795.             to: self! !
  114796.  
  114797. RegTreeModel comment:
  114798. 'RegTreeModel implements a <treeModel> representing the hierarchy of <RegKey>s in the Windows system registry. For an example of its use, see the RegEdit sample application.'!
  114799. !RegTreeModel methodsFor!
  114800.  
  114801. approxSize
  114802.     "Private - Answer the approximate size of the receiver.
  114803.     Implementation Note: This does not have to be accurate, but it should be fast
  114804.     (i.e. don't calculate it by counting the receiver's elements)."
  114805.  
  114806.     ^5000!
  114807.  
  114808. searchPolicy
  114809.     "Answer the <searchPolicy> used to compare and search for elements by the receiver.
  114810.     Implementation Note: As we are fronting an externally represented tree (i.e
  114811.     the Registry) the nodes are created to represent the external keys and values,
  114812.     and are not, therefore, identical."
  114813.  
  114814.     ^SearchPolicy equality!
  114815.  
  114816. setRoots: aCollection
  114817.     "Private - Initialize the receiver with the roots in aCollection"
  114818.  
  114819.     "Deliberately omit super initialize"
  114820.  
  114821.     getChildrenBlock := [:each | each asSortedCollection: [:a :b | a name < b name]].
  114822.     getParentBlock := Message selector: #parentKey.
  114823.     hasChildrenBlock := Message selector: #notEmpty.
  114824.     self basicRoots: aCollection! !
  114825.  
  114826. ViewHierarchyModel comment:
  114827. 'ViewHierarchyModel implements a <treeModel> representing the hierarchy (or a subset of it) of open <views> in the system.'!
  114828. !ViewHierarchyModel class methodsFor!
  114829.  
  114830. withAllViews
  114831.     "Answer an instance of the receiver on the entire view hiearchy"
  114832.  
  114833.     ^self withRoots: (Array with: View desktop)! !
  114834.  
  114835. !ViewHierarchyModel methodsFor!
  114836.  
  114837. setRoots: aCollection
  114838.     "Private - Initialize the receiver with the roots in aCollection"
  114839.  
  114840.     "Deliberately omit super initialize"
  114841.  
  114842.     getChildrenBlock := Message selector: #managedSubViews.
  114843.     getParentBlock := Message selector: #parentView.
  114844.     self basicRoots: aCollection! !
  114845.  
  114846. ValueAdaptor comment:
  114847. 'An abstract class whose subclasses allow some part of a subject object (typically an aspect or keyed element) to be treated a <valueModel>.
  114848.  
  114849. Instance Variables
  114850.     subject    <Object> whose content will be adapted to be accessed as a <value>'!
  114851. !ValueAdaptor class methodsFor!
  114852.  
  114853. icon
  114854.     "Answers an Icon that can be used to represent this class"
  114855.  
  114856.     ^##(self) defaultIcon! !
  114857.  
  114858. !ValueAdaptor methodsFor!
  114859.  
  114860. printOn: aStream 
  114861.     "Append a short textual description of the receiver to, aStream."
  114862.  
  114863.     aStream
  114864.         basicPrint: self;
  114865.         nextPut: $(; display: self; nextPut: $)
  114866. !
  114867.  
  114868. subject
  114869.     "Private - Answers the subject model for the receiver"
  114870.  
  114871.     ^subject
  114872. !
  114873.  
  114874. subject: anObject
  114875.     "Private - Sets the subject object"
  114876.  
  114877.     subject := anObject.
  114878. ! !
  114879.  
  114880. ValueConverter comment:
  114881. 'A ValueConverter sits between a subject <valueModel> and some <value> client of this. It supports the <valueModel> protocol such that when the client attempts to get the subject value it is converted into another type of object that is more palatable to the client. Similarly when the client tries to put a value back into the subject the type can again be converted, this time to suit the subject''s needs.
  114882.  
  114883. An assumption is made that the subject will be a <valueModel> and will therefore trigger its own #value events when it is updated. A ValueConverter simply forwards this event to any of its own clients.
  114884.  
  114885. Instance Variables:
  114886.     subject        <valueModel> subject.
  114887.     typeConverter    <typeConverter> for mapping the subject value to another type.
  114888.  
  114889. '!
  114890. !ValueConverter class methodsFor!
  114891.  
  114892. icon
  114893.     "Answers an Icon that can be used to represent this class"
  114894.  
  114895.     ^##(self) defaultIcon!
  114896.  
  114897. new
  114898.     "Private - An instance of this class requires parameters, use: #subject:typeConverter"
  114899.  
  114900.     ^self shouldNotImplement!
  114901.  
  114902. publishedEventsOfInstances
  114903.         "Answer a Set of Symbols that describe the published events triggered
  114904.         by instances of the receiver."
  114905.     
  114906.         ^super publishedEventsOfInstances
  114907.             yourself.
  114908.     !
  114909.  
  114910. subject: aValueModel typeConverter: aTypeConverter
  114911.     "Answers an instance of the receiver that is a converter of the value of aValueModel
  114912.     using aTypeConverter for the conversion process"
  114913.  
  114914.     ^super new subject: aValueModel; typeConverter: aTypeConverter; yourself! !
  114915.  
  114916. !ValueConverter methodsFor!
  114917.  
  114918. format
  114919.     "Answers the format of the current type converter. 
  114920.     Not all type converters support different formats and where they do, the format
  114921.     descriptors are specific to the converter chosen"
  114922.  
  114923.     ^self typeConverter format!
  114924.  
  114925. format: anObject 
  114926.     "Sets the format of the current type converter to be aFormatDescriptor. 
  114927.     Not all type converters support different formats and where they do, the format
  114928.     descriptors are specific to the converter chosen"
  114929.  
  114930.     self typeConverter format: anObject!
  114931.  
  114932. setValue: aClientObject 
  114933.     "Private - Sets aClientObject back into the subjects's value after first converting it
  114934.     using the associated type converter."
  114935.  
  114936.     self subject 
  114937.         value: (self typeConverter convertFromRightToLeft: aClientObject)!
  114938.  
  114939. subject
  114940.     "Private - Answers the subject model for the receiver"
  114941.  
  114942.     ^subject!
  114943.  
  114944. subject: anObject
  114945.     "Private - Sets the subject object that is being interfaced
  114946.     to by the receiver and whose value needs converting. If
  114947.     the object is nil, then disconnect from any pre-existing
  114948.     subject."
  114949.  
  114950.     anObject isNil 
  114951.         ifTrue: [subject isNil ifFalse: [subject removeEventsTriggeredFor: self]]
  114952.         ifFalse: 
  114953.             [anObject 
  114954.                 when: #valueChanged
  114955.                 send: #trigger:
  114956.                 to: self
  114957.                 with: #valueChanged].
  114958.     subject := anObject!
  114959.  
  114960. typeConverter
  114961.     "Answers the <TypeConverter> being used by the receiver"
  114962.  
  114963.     ^typeConverter!
  114964.  
  114965. typeConverter: aTypeConverter 
  114966.     "Sets the <TypeConverter> being used by the receiver."
  114967.  
  114968.     typeConverter := aTypeConverter!
  114969.  
  114970. value
  114971.     "Answer the <Object> value of the receiver."
  114972.  
  114973.     ^self typeConverter convertFromLeftToRight: self subject value! !
  114974.  
  114975. ValueHolder comment:
  114976. 'A ValueHolder wraps an object and notifies its dependants when that object is replaced. Since ValueHolders are commonly used, there is a short cut available for creating them. Sending #asValue to any object will answer that object wrapped inside a ValueHolder. 
  114977.  
  114978. Instance Variables:
  114979.     value    <Object> which is the value held by the receiver.
  114980.  
  114981. '!
  114982. !ValueHolder class methodsFor!
  114983.  
  114984. icon
  114985.     "Answers an Icon that can be used to represent this class"
  114986.  
  114987.     ^##(self) defaultIcon!
  114988.  
  114989. with: anObject
  114990.     "Answers an instance of the receiver holding anObject as its value"
  114991.  
  114992.     ^(self new) setValue: anObject; yourself! !
  114993.  
  114994. !ValueHolder methodsFor!
  114995.  
  114996. setValue: anObject
  114997.     "Private - Assigns the value for the receiver without notifying 
  114998.     dependents of the change"
  114999.     
  115000.     value := anObject!
  115001.  
  115002. value
  115003.     "Answers the value of the receiver"
  115004.     
  115005.     ^value! !
  115006.  
  115007. AspectAccessor comment:
  115008. 'Part of the PublishedAspectInspector framework. This is a <ValueAspectAdaptor> on a particular aspect of an object. It also holds an <Aspect> that describes the aspect so that sufficient information is available to be able to display or edit it within a presenter UI. An AspectAccessor instance is also capable of knowing it''s "parent" accessor. This allows instances to be manipulated by an <AspectAccessorTreeModel>.
  115009.  
  115010. Instance Variables:
  115011.     aspectDescriptor    <Aspect> the descriptor for the aspect being accessed.
  115012.     parentAccessor    <AspectAccessor> the parent accessor or nil.
  115013. '!
  115014. !AspectAccessor class methodsFor!
  115015.  
  115016. new
  115017.     "Private - An instance of this class requires parameters"
  115018.  
  115019.     ^self shouldNotImplement!
  115020.  
  115021. subject: anObject aspect: anAspect
  115022.     "Answers an instance of the receiver that is an interface onto
  115023.     aAspect of anObject"
  115024.  
  115025.     ^(super new)
  115026.         setSubject: anObject aspectDescriptor: anAspect;
  115027.         yourself! !
  115028.  
  115029. !AspectAccessor methodsFor!
  115030.  
  115031. <= anAspectAccessor
  115032.     "Answer whether the receiver is 'less than' anAspectAccessor.
  115033.     By implementing this method, we enable AspectAccessor objects to be stored
  115034.     in a SortedCollection with the default sort block."
  115035.  
  115036.     ^self aspectDescriptor <= anAspectAccessor aspectDescriptor!
  115037.  
  115038. = comperand
  115039.     "Answer whether the receiver is considered equal to the <Object>, comperand."
  115040.  
  115041.     ^self == comperand or: 
  115042.             [self species == comperand species 
  115043.                 and: [self aspectDescriptor = comperand aspectDescriptor and: [self subject == comperand subject]]]!
  115044.  
  115045. aspectDescriptor
  115046.     "Private - Answer the Aspect descriptor of the receiver"
  115047.  
  115048.     ^aspectDescriptor!
  115049.  
  115050. aspectDescriptor: anObject
  115051.     aspectDescriptor := anObject!
  115052.  
  115053. canEdit
  115054.     "Private - Answer true if the receiver can be edited"
  115055.  
  115056.     ^self canSet and: [self aspectDescriptor canEdit or: [self yourselfAspect canEdit]]!
  115057.  
  115058. canGet
  115059.     "Private - Answer whether the receiver can be read using #value."
  115060.  
  115061.     ^self aspectDescriptor canReadFrom: self subject!
  115062.  
  115063. canNil
  115064.     "Private - Answer whether the receiver can be nulled."
  115065.  
  115066.     ^self canSet and: [self aspectDescriptor isNullable]!
  115067.  
  115068. canSet
  115069.     "Private - Answer whether the receiver can be set using #value:."
  115070.  
  115071.     ^self aspectDescriptor canWriteInto: self subject!
  115072.  
  115073. defaultComparisonPolicy
  115074.     "Private - Answer the default comparison policy to use for the receiver.
  115075.     By default always want to trigger change notifications"
  115076.  
  115077.     ^SearchPolicy never!
  115078.  
  115079. displayOn: aStream
  115080.     "Append the receiver to aStream in a format that a user would want to see"
  115081.  
  115082.     self aspectDescriptor display: self subject on: aStream!
  115083.  
  115084. editableValue
  115085.     "Private - For immutable objects we must edit a copy of the aspect value"
  115086.  
  115087.     ^self isMutable ifTrue: [self value] ifFalse: [self value copy]!
  115088.  
  115089. editedValue: anObject
  115090.     "Private - For immutable aspects we must ensure that the value we are editing is not the same as 
  115091.      that in the subject, so when saving back a changed value from the editor's model 
  115092.     we may need to copy."
  115093.  
  115094.     self value: (self isMutable ifTrue: [anObject] ifFalse: [anObject copy])!
  115095.  
  115096. editUsing: aPresenter
  115097.     "Perform an edit action on the receiver using the aspect descriptors edit block and
  115098.     using aPresenter supplied."
  115099.  
  115100.     | yourselfAspect |
  115101.     self aspectDescriptor canEdit ifTrue: [^self aspectDescriptor editBlock value: aPresenter].
  115102.     yourselfAspect := self yourselfAspect.
  115103.     yourselfAspect canEdit ifTrue: [yourselfAspect editBlock value: aPresenter]!
  115104.  
  115105. hash
  115106.     "Answer the <Integer> hash value for the receiver."
  115107.  
  115108.     ^(self aspectDescriptor hash bitShift: 1) bitXor: self subject hash!
  115109.  
  115110. isMutable
  115111.     ^self aspectDescriptor isMutable!
  115112.  
  115113. name
  115114.     "Answer the <readableString> that describes the receiver's aspect"
  115115.  
  115116.     ^self aspectDescriptor nameIn: self subject!
  115117.  
  115118. objectRef
  115119.     "Private - Answer an association to used when the value of the receiver is dragged as an #ObjectRef"
  115120.  
  115121.     ^self objectRefName -> self value!
  115122.  
  115123. objectRefName
  115124.     "Private - Answer name to use when the value of the receiver is dragged as an #ObjectRef"
  115125.  
  115126.     ^self aspectDescriptor objectRefName: self subject!
  115127.  
  115128. presentIn: aCompositePresenter
  115129.     "Invoke a Presenter to display (and possibly edit) the receiver's aspect.
  115130.     The presenter can occupy an area in aCompositePresenter. 
  115131.     Answer the presenter created"
  115132.  
  115133.     | presenter |
  115134.     ((presenter := self aspectDescriptor presenterFor: self in: aCompositePresenter)
  115135.         show;
  115136.         view) isEnabled: true.    "self canSet."
  115137.     aCompositePresenter view validateLayout.
  115138.     ^presenter!
  115139.  
  115140. selectIn: anInspector
  115141.     anInspector selectAspect: self!
  115142.  
  115143. setSubject: anObject aspectDescriptor: anAspectDescriptor
  115144.     "Private - Sets the subject object and its aspect that is being interfaced
  115145.     to by the receiver"
  115146.  
  115147.     self subject: anObject.
  115148.     self aspectDescriptor: anAspectDescriptor!
  115149.  
  115150. setValue: anObject
  115151.     "Private - Assigns the value for the receiver without notifying 
  115152.     dependents of the change"
  115153.  
  115154.     self aspectDescriptor writeInto: self subject value: anObject!
  115155.  
  115156. value
  115157.     "Answers the <Object> value of the receiver.
  115158.     If an exception is raised attempting to access the value, then answer that instead."
  115159.  
  115160.     ^self aspectDescriptor readFrom: self subject!
  115161.  
  115162. valueIcon
  115163.     ^self value icon!
  115164.  
  115165. yourselfAspect
  115166.     "Answers the AspectAccessor for the #yourself published aspect of the 
  115167.     receiver's value."
  115168.  
  115169.     ^self value publishedAspects detect: [:each | each name == #yourself]! !
  115170.  
  115171. ValueAspectAdaptor comment:
  115172. 'A ValueAspectAdaptor is capable of adapting an aspect of a subject object and treating this as a <value>. An aspect is considered to be an attribute of an object that can be fetched and set using a pair of accessor methods (aspect and aspect: say). 
  115173.  
  115174. ValueAspectAdaptors are typically used in two situations. The first is to adapt an aspect of a model to the generic <value> protocol of #value, #value: messages. This is a common requirement of <dialogPresenter>s which need to present multiple aspects of a model within their sub-presenters. The second is to allow aspects of a domain class which does  not generate change notifications to be used in situations that require them.  
  115175.  
  115176. Instance Variables:
  115177.     aspect        <Symbol> identifying the aspect
  115178.     putSelector    <Symbol> message selector used to set the aspect
  115179.     getSelector    <Symbol> message selector used to get the aspect
  115180. '!
  115181. !ValueAspectAdaptor class methodsFor!
  115182.  
  115183. new
  115184.     "Private - An instance of this class requires parameters"
  115185.  
  115186.     ^self shouldNotImplement!
  115187.  
  115188. subject: anObject aspect: aSymbol
  115189.     "Answers an instance of the receiver that is an interface onto
  115190.     an aspect of anObject identified by aSymbol"
  115191.  
  115192.     ^(super new) subject: anObject aspect: aSymbol; yourself! !
  115193.  
  115194. !ValueAspectAdaptor methodsFor!
  115195.  
  115196. = comperand
  115197.     "Answer whether the receiver is considered equal to the <Object>, comperand."
  115198.  
  115199.     ^self == comperand or: [
  115200.         self species == comperand species
  115201.             and: [self aspect == comperand aspect 
  115202.                 and: [self subject == comperand subject]]]!
  115203.  
  115204. aspect
  115205.     "Private - Answers the aspect of the subject that the receiver is to treat as a value"
  115206.  
  115207.     ^aspect
  115208. !
  115209.  
  115210. aspectTriggers: aSymbol
  115211.     "Inform the receiver that we expect the subject to trigger aSymbol whenever the aspect is changed."
  115212.  
  115213.     subject when: aSymbol send: #notifyChanged to: self
  115214. !
  115215.  
  115216. aspectTriggersUpdates
  115217.     "Private - This method is now deprecated"
  115218.  
  115219.     Notification deprecated.
  115220. !
  115221.  
  115222. canGet
  115223.     "Private - Answer whether the receiver can be read using #value."
  115224.  
  115225.     ^self subject respondsTo: self getSelector!
  115226.  
  115227. canSet
  115228.     "Private - Answer whether the receiver can be set using #value:."
  115229.  
  115230.     ^self subject respondsTo: self putSelector!
  115231.  
  115232. displayOn: aStream 
  115233.     "Append a short textual description of the receiver to, aStream"
  115234.  
  115235.     aStream
  115236.         display: subject;
  115237.         nextPut: $[;
  115238.         print: self aspect;
  115239.         nextPut: $]!
  115240.  
  115241. getSelector
  115242.     "Private - Answers the selector used for getting the aspect value from the subject"
  115243.  
  115244.     ^getSelector
  115245. !
  115246.  
  115247. getValue
  115248.     ^self subject perform: self getSelector!
  115249.  
  115250. hash
  115251.     "Answer the <Integer> hash value for the receiver."
  115252.  
  115253.     ^(self aspect hash bitShift: 1) bitXor: self subject hash!
  115254.  
  115255. putSelector
  115256.     "Private - Answers the selector used for setting the aspect value into the subject"
  115257.  
  115258.     ^putSelector
  115259. !
  115260.  
  115261. setValue: anObject
  115262.     "Private - Assigns the value for the receiver without notifying 
  115263.     dependents of the change"
  115264.     
  115265.     self subject perform: self putSelector with: anObject.!
  115266.  
  115267. subject: anObject aspect: aSymbol
  115268.     "Private - Sets the subject object and its aspect that is being interfaced
  115269.     to by the receiver"
  115270.  
  115271.     super subject: anObject.
  115272.     aspect := aSymbol.
  115273.     getSelector := aspect.
  115274.     putSelector := (aspect , ':') asSymbol.
  115275.  
  115276. !
  115277.  
  115278. value
  115279.     "Answers the <Object> value of the receiver, obtained
  115280.     by sending a message to the receiver's subject."
  115281.  
  115282.     ^self getValue! !
  115283.  
  115284. ValueKeyedAdaptor comment:
  115285. 'A ValueKeyedAdaptor is capable of adapting a keyed element of a subject object (typically a Collection) and treating this as a <value>. A keyed element one which can be accessed from the subject object using #at: and #at:put:.
  115286.  
  115287. Instance Variables:
  115288.     key        <Object> used as the key to access an element of the subject
  115289.     putSelector    <selector> message used to set the aspect
  115290.     getSelector    <selector> message used to get the aspect
  115291. '!
  115292. !ValueKeyedAdaptor class methodsFor!
  115293.  
  115294. new
  115295.     "Private - An instance of this class requires parameters"
  115296.  
  115297.     ^self shouldNotImplement!
  115298.  
  115299. subject: anObject key: aKey
  115300.     "Answers an instance of the receiver that is an interface onto
  115301.     an element of anObject identified by aKey"
  115302.  
  115303.     ^(super new) subject: anObject key: aKey; yourself! !
  115304.  
  115305. !ValueKeyedAdaptor methodsFor!
  115306.  
  115307. = comperand
  115308.     "Answer whether the receiver is considered equal to the <Object>, comperand.
  115309.     In order to be so the comperand must be of the same species, equal key, and
  115310.     identical subject."
  115311.  
  115312.     ^self == comperand 
  115313.         or: [self species == comperand species 
  115314.             and: [self key = comperand key 
  115315.                 and: [self subject == comperand subject]]]!
  115316.  
  115317. canGet
  115318.     "Private - Answer whether the receiver can be read using #value."
  115319.  
  115320.     ^self subject respondsTo: self getSelector!
  115321.  
  115322. canSet
  115323.     "Private - Answer whether the receiver can be set using #value:."
  115324.  
  115325.     ^self subject respondsTo: self putSelector!
  115326.  
  115327. displayOn: aStream 
  115328.     "Append a short textual description of the receiver to, aStream"
  115329.  
  115330.     aStream
  115331.         display: subject;
  115332.         nextPut: $[;
  115333.         print: self key;
  115334.         nextPut: $]!
  115335.  
  115336. getSelector
  115337.     "Private - Answers the selector used for getting the indexed value from the subject"
  115338.  
  115339.     ^getSelector!
  115340.  
  115341. hash
  115342.     "Answer the <Integer> hash value for the receiver."
  115343.  
  115344.     ^(self key hash bitShift: 1) bitXor: self subject hash!
  115345.  
  115346. key
  115347.     "Private - Answers the key used to access the element of the subject that
  115348.     the receiver is to treat as a value"
  115349.  
  115350.     ^key!
  115351.  
  115352. objectRefName
  115353.     "Private - Answer name to use when the value of the receiver is dragged as an #ObjectRef"
  115354.  
  115355.     ^self value basicPrintString , self key displayString 
  115356.         copyWithout: Character space!
  115357.  
  115358. putSelector
  115359.     "Private - Answers the selector used for setting the aspect value into the subject"
  115360.  
  115361.     ^putSelector
  115362. !
  115363.  
  115364. setValue: anObject
  115365.     "Private - Assigns the value for the receiver without notifying 
  115366.     dependents of the change"
  115367.     
  115368.     self subject perform: self putSelector with: self key with: anObject.!
  115369.  
  115370. subject: anObject key: aKey
  115371.     "Private - Sets the subject object and the key being used to access an element of it"
  115372.  
  115373.     super subject: anObject.
  115374.     key := aKey.
  115375.     getSelector := #at:.
  115376.     putSelector := #at:put:.
  115377.  
  115378. !
  115379.  
  115380. value
  115381.     "Answers the <Object> value of the receiver, obtained by
  115382.     sending a message to the receiver's subject with the key."
  115383.     
  115384.     ^self subject perform: self getSelector with: self key! !
  115385.  
  115386. BatchAspectAccessor comment:
  115387. ''!
  115388. !BatchAspectAccessor class methodsFor!
  115389.  
  115390. aspectClass
  115391.     ^KeyedAspectBatch!
  115392.  
  115393. icon
  115394.     "Answers an Icon that can be used to represent this class"
  115395.  
  115396.     ^##(self) defaultIcon!
  115397.  
  115398. subject: anObject keys: aSequencedReadableCollection startingAt: startInteger batchSize: sizeInteger
  115399.     "Answers an instance of the receiver that is an interface onto a range of
  115400.     keyed elements of the subject <Object>, anObject."
  115401.  
  115402.     ^self subject: anObject
  115403.         aspect: (self aspectClass 
  115404.                 keys: aSequencedReadableCollection
  115405.                 startingAt: startInteger
  115406.                 batchSize: sizeInteger)! !
  115407.  
  115408. !BatchAspectAccessor methodsFor!
  115409.  
  115410. aspectClass
  115411.     ^self subclassResponsibility!
  115412.  
  115413. batchSize
  115414.     ^self aspectDescriptor batchSize!
  115415.  
  115416. displayOn: aStream
  115417.     "Append the receiver to aStream in a format that a user would want to see"
  115418.  
  115419.     self batchSize > 1 
  115420.         ifTrue: 
  115421.             [aStream 
  115422.                 display: ('next %1 items' formatWith: self batchSize displayString)]
  115423.         ifFalse: [aStream display: 'next item']!
  115424.  
  115425. keys
  115426.     ^self aspectDescriptor keys!
  115427.  
  115428. nextBatch
  115429.     "Private - Answer the <BatchAspectAccessor> that will follow the receiver or nil if there is none"
  115430.  
  115431.     | nextKey |
  115432.     nextKey := self startKey + self batchSize.
  115433.     ^(self subjectIncludesKey: nextKey) 
  115434.         ifTrue: 
  115435.             [self class 
  115436.                 subject: self subject
  115437.                 keys: self keys
  115438.                 startingAt: nextKey
  115439.                 batchSize: self batchSize]!
  115440.  
  115441. selectIn: anInspector
  115442.     anInspector expandBatchAccessor: self!
  115443.  
  115444. startKey
  115445.     "Private - Answers the index of the key used to access the first element of the subject that
  115446.     the receiver is to treat as a value"
  115447.  
  115448.     ^self aspectDescriptor key!
  115449.  
  115450. subjectIncludesKey: nextKey
  115451.     ^nextKey <= self keys size!
  115452.  
  115453. value
  115454.     "Answers the <Object> value of the receiver, obtained by
  115455.     sending a message to the receiver's subject with the key."
  115456.  
  115457.     ^nil!
  115458.  
  115459. valueIcon
  115460.     ^self icon! !
  115461.  
  115462. IndexedInstVarBatchAccessor comment:
  115463. 'Part of the InstVarInspector framework. IndexedInstVarBatchAccessors are used to give access to a group of <IndexedInstVarAccessors> for indexed slots of an object. Batching the accessors up in this way allows the InstVarInspector to only display a certain number of elements at a time. This can substantially improve performance when displaying large indexed objects.'!
  115464. !IndexedInstVarBatchAccessor class methodsFor!
  115465.  
  115466. subject: anObject batchSize: sizeInteger
  115467.     "Answers an instance of the receiver that is an interface onto a range of
  115468.     keyed elements of the subject <Object>, anObject."
  115469.  
  115470.     ^self 
  115471.         subject: anObject
  115472.         keys: (1 to: anObject basicSize)
  115473.         startingAt: 1
  115474.         batchSize: sizeInteger! !
  115475.  
  115476. !IndexedInstVarBatchAccessor methodsFor!
  115477.  
  115478. aspectClass
  115479.     ^InstVarAspect!
  115480.  
  115481. getBatchAccessors
  115482.     "Answer an <OrderedCollection> of the IndexedInstVarAccessors represented by the receiver"
  115483.  
  115484.     | accessors subj offset |
  115485.     accessors := OrderedCollection new: self batchSize.
  115486.     subj := self subject.
  115487.     offset := subj class instSize.
  115488.     self startKey to: (self startKey + self batchSize - 1 min: subj basicSize)
  115489.         do: 
  115490.             [:n | 
  115491.             | item |
  115492.             item := subj basicAt: n.
  115493.             accessors 
  115494.                 add: ((item class newAspect: self aspectClass name: n + offset) accessorFor: self subject)].
  115495.     self nextBatch ifNotNil: [:nextBatch | accessors add: nextBatch].
  115496.     ^accessors!
  115497.  
  115498. keys
  115499.     ^1 to: self subject basicSize!
  115500.  
  115501. subjectIncludesKey: nextKey
  115502.     ^nextKey <= self subject basicSize! !
  115503.  
  115504. KeyedAspectBatchAccessor comment:
  115505. 'Part of the PublishedAspectorInspector framework. KeyedAspectBatchAccessors are used to give access to a group of <KeyedAspectAccessors> for elements of a keyed collection. Batching the accessors up in this way allows the PAI to only display a certain number of elements at a time. This can substantially improve performance when displaying large (or slow to access) collections.'!
  115506. !KeyedAspectBatchAccessor class methodsFor!
  115507.  
  115508. subject: anObject batchSize: sizeInteger
  115509.     "Answers an instance of the receiver that is an interface onto a range of
  115510.     keyed elements of the subject <Object>, anObject."
  115511.  
  115512.     ^self 
  115513.         subject: anObject
  115514.         keys: anObject keys
  115515.         startingAt: 1
  115516.         batchSize: sizeInteger! !
  115517.  
  115518. !KeyedAspectBatchAccessor methodsFor!
  115519.  
  115520. aspectClass
  115521.     ^KeyedAspect!
  115522.  
  115523. getBatchAccessors
  115524.     "Answer an <OrderedCollection> of the <AspectAccessors> on the batch of
  115525.     <KeyedAspect>s represented by the receiver"
  115526.  
  115527.     | accessors absentCookie start end subj keys |
  115528.     start := self startKey.
  115529.     keys := self keys.
  115530.     end := start + self batchSize - 1 min: keys size.
  115531.     accessors := OrderedCollection new: end - start + 1.
  115532.     absentCookie := Object new.
  115533.     subj := self subject.
  115534.     keys 
  115535.         from: start
  115536.         to: end
  115537.         do: 
  115538.             [:eachKey | 
  115539.             | item |
  115540.             item := subj at: eachKey ifAbsent: [absentCookie].
  115541.             item == absentCookie 
  115542.                 ifFalse: 
  115543.                     [accessors add: ((item class newAspect: self aspectClass name: eachKey) accessorFor: subj)]].
  115544.     self nextBatch ifNotNil: [:nextBatch | accessors add: nextBatch].
  115545.     ^accessors!
  115546.  
  115547. publishedAspects
  115548.         "Answer a <LookupTable> of the <Aspect>s published by the receiver.
  115549.     Implementation Note: Prevent the PublishedAspectInspector from displaying any sub-aspects
  115550.     for this node (without this one gets a + and can expand it)."
  115551.  
  115552.     ^LookupTable new! !
  115553.  
  115554. ValueBuffer comment:
  115555. 'A ValueBuffer can be used to buffer changes to a subject <valueModel>. It presents the same <value> protocol as its subject but, when the value is changed, the change is not immediately passed to the subject. This only happens when the ValueBuffer receives an #apply message to indicate that any changes should flushed.
  115556.  
  115557. It is important to note that, in order to be used with a ValueBuffer
  115558.  
  115559. Instance Variables:
  115560.     subject        <valueModel> being buffered.
  115561.     modified        <boolean> indicating whether the subject has been modified.
  115562.     gate        <valueModel> which, when set true will apply changes back to the subject.
  115563.  
  115564.  
  115565. '!
  115566. !ValueBuffer class methodsFor!
  115567.  
  115568. icon
  115569.     "Answers an Icon that can be used to represent this class"
  115570.  
  115571.     ^##(self) defaultIcon!
  115572.  
  115573. new
  115574.     "Private - Use #subject:"
  115575.  
  115576.     ^self shouldNotImplement!
  115577.  
  115578. subject: aSubjectValueModel
  115579.     "Answer an instance of the receiver that buffers the value of aSubjectValueModel"
  115580.  
  115581.     ^super new subject: aSubjectValueModel
  115582.  
  115583.     ! !
  115584.  
  115585. !ValueBuffer methodsFor!
  115586.  
  115587. apply
  115588.     "Apply any buffered changes back to the subject"
  115589.  
  115590.     modified ifTrue: [
  115591.         subject value: self value.
  115592.         modified := false. ]!
  115593.  
  115594. gate
  115595.     "Answer the gate value model that controls when (and if) changes will be 
  115596.     flushed back to the original model."
  115597.  
  115598.     ^gate!
  115599.  
  115600. gate: aValueModelGate
  115601.     "Set the gate model to be aValueModelGate. Changes will be flushed back to 
  115602.     the original model when the value of aValueModelGate is set
  115603.     to true."
  115604.  
  115605.     gate := aValueModelGate.
  115606.     gate when: #valueChanged send: #onGateChanged to: self.!
  115607.  
  115608. isValid
  115609.     "Answer true if the updates to the model are valid. Provided
  115610.     for protocol compatibility with AspectBuffer"
  115611.  
  115612.     ^true!
  115613.  
  115614. onGateChanged
  115615.     "Private - Received when the gate has been triggered. 
  115616.     Use this to either flush changes back to the subject if required"
  115617.  
  115618.     self gate value ifTrue: [self apply]!
  115619.  
  115620. setValue: anObject
  115621.     "Private - Assigns the value for the receiver without notifying 
  115622.     dependents of the change. The value is saved in the buffer and
  115623.     not directed to the subject (yet)"
  115624.     
  115625.     super setValue: anObject.
  115626.     modified := true.!
  115627.  
  115628. subject: aSubjectValueModel
  115629.     "Private - Initializes the receiver on aSubjectValueModel"
  115630.  
  115631.     gate := false asValue.
  115632.     subject := aSubjectValueModel.
  115633.     modified := false!
  115634.  
  115635. value
  115636.     "Answers the value of the receiver. If the value has been modified then
  115637.     answer the buffered value otherwise answer that of the subject"
  115638.     
  115639.     ^modified ifTrue: [ super value ] ifFalse: [ subject value ].! !
  115640.  
  115641. PermanentRegistry comment:
  115642. 'PermanentRegistry is a specialized class of <ObjectRegistry>s which maintain a strong reference to registered objects, preventing them from being garbage collected. They are useful where the objects may only be referenced ''externally'' (e.g. COM server objects).
  115643.  
  115644. The superclass instance variable ''registry'' is initialized to an <Array> in instances of this class. The slots of the array are populated either with registered objects, or linked onto a free list by index (the content of the slot being the next free entry). The last element of the <Array> is always zero to mark the end of the free list. When a new object is registered the first slot on the free list is used, unless there are no free slots in which case the array is resized to increase its capacity.
  115645.  
  115646. Note: The implementation of the free list in this class using integer indices means that PermanentRegistry instances are not suitable for registries of <Integer>s.
  115647.  
  115648. Instance Variables:
  115649.     freeHead        <integer> index of the first free slot in the registry.'!
  115650. !PermanentRegistry methodsFor!
  115651.  
  115652. addAnsweringIndex: anObject
  115653.     "Register the argument, anObject, answering a unique SmallInteger id which can be used
  115654.     subsequently to retrieve that object.
  115655.     Implementation Note: Permanent object registries cannot reliably locate registered
  115656.     integers by value, though they can hold them."
  115657.  
  115658.     | id |
  115659.     freeHead == 0 ifTrue: [self grow].
  115660.     id := freeHead.
  115661.     freeHead := registry basicAt: freeHead.
  115662.     registry basicAt: id put: anObject.
  115663.     ^id!
  115664.  
  115665. grow
  115666.     "Private - Increase the capacity of the receiver. We do this by increasing
  115667.     the size of the registry, and building a free list."
  115668.  
  115669.     | capacity |
  115670.     capacity := registry size.
  115671.     registry := registry, (capacity+2 to: capacity*2), (Array with: freeHead).
  115672.     freeHead := capacity+1
  115673. !
  115674.  
  115675. initialize: anInteger
  115676.     "Private - Initialize the receiver with the specified initial capacity."
  115677.  
  115678.     registry := (2 to: anInteger), ##(Array with: 0).
  115679.     freeHead := 1!
  115680.  
  115681. removeAtIndex: anInteger
  115682.     "Remove, and answer, the registered object with <integer> id, anInteger, in the receiver. 
  115683.     Raise an error if there is no element indexed by anInteger."
  115684.  
  115685.     (registry basicAt: anInteger) isInteger ifFalse: [
  115686.         registry basicAt: anInteger put: freeHead.
  115687.         freeHead := anInteger]! !
  115688.  
  115689. WeakRegistry comment:
  115690. 'WeakRegistry comment: ''WeakRegistry is the class of <ObjectRegistry>s which maintain only a weak reference to registered objects. Thus registration in a WeakRegistry will not prevent the registrant from being garbage collected, which makes it useful where a unique identifier is needed for an object only for as long as it is still referred to from elsewhere in the image. An example usage is the register of extant <ExternalCallback> objects.
  115691.  
  115692. The superclass instance variable ''''registry'''' is initialized to an <WeakArray> in instances of this class. The slots of the array are populated either with registered objects, or with the corpse object (i.e. the DeadObject singleton instance). When a new object is registered the first slot currently occuppied by a corpse is used, unless there are no ''''dead'''' entries, in which case the weak array is resized to increase its capacity. The integer key associated with a registered object is its index in the array.
  115693. '!
  115694. !WeakRegistry methodsFor!
  115695.  
  115696. addAnsweringIndex: anObject
  115697.     "Register the argument, anObject, answering a unique SmallInteger id which can be used
  115698.     subsequently to retrieve that object."
  115699.  
  115700.     ^registry addAnsweringIndex: anObject!
  115701.  
  115702. initialize: anInteger
  115703.     "Private - Initialize the receiver with the specified initial capacity."
  115704.  
  115705.     registry := WeakArray new: anInteger.
  115706.     registry replaceFrom: 1 to: anInteger withObject: DeadObject current!
  115707.  
  115708. removeAtIndex: anInteger
  115709.     "Remove, and answer, the registered object with id anInteger in the receiver. 
  115710.     Raise an error if there is no element indexed by anInteger."
  115711.  
  115712.     | object |
  115713.     object := registry basicAt: anInteger.
  115714.     registry basicAt: anInteger put: DeadObject current.
  115715.     ^object! !
  115716.  
  115717. RegularPolygon comment:
  115718. 'A RegularPolygon describes a particular type of <PlayShape> that may be added to a <Playground>. It is part of the Playground sample package used as a Smalltalk learning aid. See this package''s comment for more details.
  115719.  
  115720. A RegularPolygon has a number of sides and is drawn within a bounding circle of a given radius and centre position. The polygon, when drawn, is filled with a particular background color. This information is held in the instance variables of a RegularPolygon instance.
  115721.  
  115722. Instance Variables:
  115723.     color        <color> used to fill the polygon.
  115724.     sides        <integer> number of sides.
  115725.     position        <Point> position of the polygon centre within the playground.
  115726.     rotation        <number> of degrees by which the polygon is rotated.
  115727.     radius        <number> of pixels radius to the boundary of the polygon.
  115728.  
  115729. '!
  115730. !RegularPolygon class methodsFor!
  115731.  
  115732. new
  115733.     "Create an instance of the receiver with a default number of sides"
  115734.     
  115735.     ^super new initialize! !
  115736.  
  115737. !RegularPolygon methodsFor!
  115738.  
  115739. chooseColor
  115740.     "Open a color picking dialog on the receiver to allow the color to be changed"
  115741.  
  115742.     ColorDialog showModalOn: (self aspectValue: #color)
  115743.  
  115744.     !
  115745.  
  115746. color
  115747.     "Answer the color of the receiver."
  115748.  
  115749.     ^color
  115750. !
  115751.  
  115752. color: aColor
  115753.     "Set the color of the receiver to aColor and ask for it to be redrawn."
  115754.  
  115755.     color := aColor.
  115756.     self redraw.!
  115757.  
  115758. defaultColor
  115759.     "Answer a default background color for the receiver. This may be overidden
  115760.     by subclasses that wish to start off with a different color."
  115761.  
  115762.     ^Color white!
  115763.  
  115764. defaultPosition
  115765.     "Answer a default position for the centre of the receiver. This may be overidden
  115766.     by subclasses that wish to start off at another location"
  115767.  
  115768.     ^100 @ 100!
  115769.  
  115770. defaultRadius
  115771.     "Answer a default radius for the receiver. This may be overidden
  115772.     by subclasses that wish to start off at another size"
  115773.  
  115774.     ^50!
  115775.  
  115776. defaultRotation
  115777.     "Answer a default rotation in degrees for the receiver. This may be overidden
  115778.     by subclasses that wish to start off at another angle"
  115779.  
  115780.     ^0!
  115781.  
  115782. defaultSides
  115783.     "Answer a default number of sides for the receiver. This may be overidden
  115784.     by subclasses that wish to start off with a different number of sides."
  115785.  
  115786.     ^4!
  115787.  
  115788. drawOn: aCanvas
  115789.     "Private - Draws the receiver on aCanvas. We use some simple trigonometry
  115790.     to calculate the vertex points of the polygon. We can then ask the canvas
  115791.     #polygon: method to plot these points."
  115792.  
  115793.     | angleOrigin angleIncrement angle vertices pt |
  115794.     angleOrigin := self rotation degreesToRadians. "Convert from degrees"
  115795.     angleIncrement := (360 / self sides) degreesToRadians. "The incremental angle between each corner"
  115796.  
  115797.     vertices := Array new: self sides.
  115798.     1 to: self sides do: [:n |
  115799.         angle := angleOrigin+(angleIncrement*(n-1)).
  115800.         pt := (angle cos @ angle sin) * self radius.
  115801.         vertices at: n put: (pt+self position) rounded ].
  115802.  
  115803.     "Draw the polygon"
  115804.     aCanvas 
  115805.         brush: (Brush color: self color);
  115806.         polygon: vertices!
  115807.  
  115808. growBy: aNumberOfUnits
  115809.     "Grow the receiver by aNumberOfUnits and cause it to be redrawn"
  115810.  
  115811.     self radius: self radius+aNumberOfUnits!
  115812.  
  115813. initialize
  115814.     "Private - Initialize the receiver to a suitable default state.
  115815.     This method is called only during instance creation and is 
  115816.     therefore marked as private."
  115817.  
  115818.     radius := self defaultRadius.
  115819.     position := self defaultPosition.
  115820.     rotation := self defaultRotation.
  115821.     color := self defaultColor.
  115822.     sides := self defaultSides.
  115823. !
  115824.  
  115825. moveBy: aPoint
  115826.     "Move the receiver by aPoint and cause it to be redrawn"
  115827.  
  115828.     self position: self position+aPoint!
  115829.  
  115830. moveDown: anInteger
  115831.     "Move the receiver down by anInteger number of units and cause it to be redrawn"
  115832.  
  115833.     self moveBy: 0 @ anInteger!
  115834.  
  115835. moveLeft: anInteger
  115836.     "Move the receiver left by anInteger number of units and cause it to be redrawn"
  115837.  
  115838.     self moveRight: anInteger negated!
  115839.  
  115840. moveRight: anInteger
  115841.     "Move the receiver right by anInteger number of units and cause it to be redrawn"
  115842.  
  115843.     self moveBy: anInteger @ 0.!
  115844.  
  115845. moveUp: anInteger
  115846.     "Move the receiver up by anInteger number of units and cause it to be redrawn"
  115847.  
  115848.     self moveDown: anInteger negated!
  115849.  
  115850. position
  115851.     "Answer the position of the centre of the receiver."
  115852.  
  115853.     ^position!
  115854.  
  115855. position: aPoint
  115856.     "Set the position of the receiver's centres to aPoint
  115857.     and ask for it to be redrawn."
  115858.  
  115859.     position := aPoint.
  115860.     self redraw.!
  115861.  
  115862. radius
  115863.     "Answer the radius of the receiver's bounding circle."
  115864.  
  115865.     ^radius!
  115866.  
  115867. radius: aNumberOfUnits
  115868.     "Set the radius of the receiver's bounding circle to aNumberOfUnits
  115869.     and ask for it to be redrawn. This method rounds the number to an
  115870.     integer value and checks to ensure that the radius does not become negative"
  115871.  
  115872.     aNumberOfUnits <= 0 ifTrue: [
  115873.         self error: 'can''t have a negative radius' ].
  115874.  
  115875.     radius := aNumberOfUnits rounded.
  115876.     self redraw.!
  115877.  
  115878. rotateBy: aNumberOfDegrees
  115879.     "Rotate the receiver by aNumberOfDegrees and cause it to be redrawn"
  115880.  
  115881.     self rotation: (self rotation+aNumberOfDegrees) \\ 360!
  115882.  
  115883. rotation
  115884.     "Answer the rotation of the receiver in degrees"
  115885.  
  115886.     ^rotation!
  115887.  
  115888. rotation: aNumberOfDegrees
  115889.     "Set the rotation of the receiver to be aNumberOfDegrees
  115890.     and ask for it to be redrawn."
  115891.  
  115892.     rotation := aNumberOfDegrees.
  115893.     self redraw.!
  115894.  
  115895. shrinkBy: aNumberOfUnits
  115896.     "Shrink the receiver by aNumberOfUnits and cause it to be redrawn"
  115897.  
  115898.     self growBy: aNumberOfUnits negated!
  115899.  
  115900. sides
  115901.     "Answer the number of sides that the receiver has. This is set when
  115902.     the receiver is created and should not be subsequently changed."
  115903.  
  115904.     ^sides!
  115905.  
  115906. sides: anInteger
  115907.     "Set the number of sides of the receiver and cause it to be redrawn"
  115908.  
  115909.     sides := anInteger.
  115910.     self redraw.
  115911. ! !
  115912.  
  115913. Circle comment:
  115914. 'A Circle is a particular type of <PlayShape> that may be added to a <Playground>. It is part of the Playground sample package used as a Smalltalk learning aid. See this package''s comment for more details.'!
  115915. !Circle methodsFor!
  115916.  
  115917. defaultColor
  115918.     "Answer a default background color for the receiver. 
  115919.     Let's make Circles blue to start with."
  115920.  
  115921.     ^Color blue!
  115922.  
  115923. defaultPosition
  115924.     "Answer a default position for the centre of the receiver. This may be overidden
  115925.     by subclasses that wish to start off at another location"
  115926.  
  115927.     ^100 @ 200!
  115928.  
  115929. defaultSides
  115930.     "Answer a default number of sides for the receiver. 
  115931.     Circles effectively have many sides"
  115932.  
  115933.     ^100! !
  115934.  
  115935. Square comment:
  115936. 'A Square is a particular type of <PlayShape> that may be added to a <Playground>. It is part of the Playground sample package used as a Smalltalk learning aid. See this package''s comment for more details.'!
  115937. !Square methodsFor!
  115938.  
  115939. defaultColor
  115940.     "Answer a default background color for the receiver. 
  115941.     Let's make Squares red to start with."
  115942.  
  115943.     ^Color red!
  115944.  
  115945. defaultPosition
  115946.     "Answer a default position for the centre of the receiver. This may be overidden
  115947.     by subclasses that wish to start off at another location"
  115948.  
  115949.     ^200 @ 100! !
  115950.  
  115951. Triangle comment:
  115952. 'A Triangle is a particular type of <PlayShape> that may be added to a <Playground>. It is part of the Playground sample package used as a Smalltalk learning aid. See this package''s comment for more details.'!
  115953. !Triangle methodsFor!
  115954.  
  115955. defaultColor
  115956.     "Answer a default background color for the receiver. 
  115957.     Let's make Trangles yellow to start with."
  115958.  
  115959.     ^Color yellow!
  115960.  
  115961. defaultPosition
  115962.     "Answer a default position for the centre of the receiver."
  115963.  
  115964.     ^200 @ 200!
  115965.  
  115966. defaultSides
  115967.     "Answer a default number of sides for the receiver.
  115968.     Triangles have 3 sides"
  115969.  
  115970.     ^3! !
  115971.  
  115972. ClassBrowserPluginAbstract comment:
  115973. '<ClassBrowserPluginAbstract> is the abstract superclass that implements the basic <classBrowserPlugin> protocol to support plug-in views for class browsers. The plug-ins are appended to the standard set of tabbed cards in the lower half of the browser and can be displayed by selecting the appropriate tab. Each browser class maintains an <OrderedCollection> of plug-ins that will be installed when instances of the browser are created. This collection can be modified through the User Preferences for that browser.
  115974.  
  115975. When a plug-in is created it is assigned the class browser to which it is attached as its model. From this, the plug-in can observe events in the browser (such as #classSelected, #methodSelected, #packageSelected etc) and use these to initiate the rendition of its own display. In situations where creating this rendition may be a time consuming process, the plug-in may choose to defer this step until its card is actually made visible in the browser. This can be intercepted by overriding #onShownInBrowser.'!
  115976. !ClassBrowserPluginAbstract methodsFor!
  115977.  
  115978. browser
  115979.     ^self model!
  115980.  
  115981. createSchematicWiring
  115982.     "Create the trigger wiring for the receiver"
  115983.  
  115984.     super createSchematicWiring.
  115985.     self model cardsPresenter view when: #currentCardChanged send: #onBrowserCardChanged to: self.
  115986. !
  115987.  
  115988. isCurrentCard
  115989.     "Answer true if the receiver is the current card shown in the browser"
  115990.  
  115991.     ^self browser cardsPresenter view currentCard == self view!
  115992.  
  115993. onBrowserCardChanged
  115994.     "Private - Event handler for a card being selected in the receiver's browser"
  115995.  
  115996.     self isCurrentCard ifTrue: [self onShownInBrowser]!
  115997.  
  115998. onShownInBrowser
  115999.     "Event handler indicating that the receiver has been displayed within it's browser. 
  116000.     Overridden by subclasses to perform just-in-time rendering of the receiver's contents."! !
  116001.  
  116002. EtchASketch comment:
  116003. 'EtchASketch is a <compositePresenter> component that emulates the popular Etch-a-Sketch toy. It allows "ink" to be drawn onto a sketch pad by means of two "knobs"; one for horizontal movement and one for vertical movement. In the basic view the knobs are represented by scroll bars. EtchASketch makes use of the Scribble component for its sketch area.
  116004.  
  116005. There are a couple of limitations that make this example not ideal:
  116006.  
  116007. 1/ It is not possible (with the Windows interface) to move both "knobs" simultaneously. This means that it is not possible to draw diagonal lines.
  116008.  
  116009. 2/ A new InkStroke object is added for each incremental movement of a "knob". This is relatively inefficient, since a scrollbar will create many events as it is moved, resulting in many InkStrokes being created. A more sophisticated approach would be to coalesce the consequetive movements of a knob into one stroke. This is left as an exercise for the reader.
  116010.  
  116011. Example: 
  116012.  
  116013. EtchASketch show.
  116014.  
  116015. See the package comment for further examples of use.
  116016.  
  116017. Instance Variables:
  116018.     upDownKnob    <NumberPresenter> for the vertical drawing "knob".
  116019.     leftRightKnob    <NumberPresenter> for the horizontal drawing "knob".
  116020.     sketchPad        <Scribble> displaying the picture.
  116021.     lastLocation    <Point> holding the last location drawn to.
  116022.  
  116023.  
  116024.  
  116025.  
  116026.  
  116027. '!
  116028. !EtchASketch class methodsFor!
  116029.  
  116030. defaultModel
  116031.     "Answer a default model to be assigned to the receiver when it
  116032.     is initialized."
  116033.  
  116034.     ^ListModel new!
  116035.  
  116036. icon
  116037.     "Answers an Icon that can be used to represent this class"
  116038.  
  116039.     ^##(self) defaultIcon!
  116040.  
  116041. initialize
  116042.     "Private - Initialize the receiver's class variables
  116043.         self initialize
  116044.     "
  116045.  
  116046.     Smalltalk developmentSystem
  116047.         addSamplesFolderIconFor: self description: self sampleDescription!
  116048.  
  116049. sampleDescription
  116050.     "Private - Answer the description of the receiver to be used in the samples folder."
  116051.  
  116052.     ^'Etch-a-Sketch'!
  116053.  
  116054. uninitialize
  116055.     "Private - Un-register the system folder icon for the receiver.
  116056.         self uninitialize
  116057.     "
  116058.  
  116059.     Smalltalk developmentSystem 
  116060.         removeSystemFolderIconNamed: self sampleDescription! !
  116061.  
  116062. !EtchASketch methodsFor!
  116063.  
  116064. createComponents
  116065.     "Create the presenters contained by the receiver"
  116066.  
  116067.     super createComponents.
  116068.     upDownKnob := self add: NumberPresenter new name: 'upDownKnob'.
  116069.     leftRightKnob := self add: NumberPresenter new name: 'leftRightKnob'.
  116070.     sketchPad := self add: Scribble new name: 'sketchPad'.
  116071. !
  116072.  
  116073. createSchematicWiring
  116074.     "Create the trigger wiring for the receiver"
  116075.  
  116076.     super createSchematicWiring.
  116077.     leftRightKnob when: #valueChanged send: #onKnobChanged to: self.
  116078.     upDownKnob when: #valueChanged send: #onKnobChanged to: self.
  116079. !
  116080.  
  116081. initialize
  116082.     "Private - Initialize the receiver"
  116083.  
  116084.     super initialize.
  116085.     lastLocation := 0@0.!
  116086.  
  116087. model: aListModel
  116088.     "Connects the receiver to aListModel. Since the receiver has the same model as the
  116089.     sketch pad (Scribble) component that it holds we pass this down to it."
  116090.  
  116091.     super model: aListModel.
  116092.     sketchPad model: aListModel.!
  116093.  
  116094. onKnobChanged
  116095.     "Private - Once of the knobs has been moved. Draw to the correct location in the sketch pad"
  116096.  
  116097.     | newLocation inkStroke scale |
  116098.  
  116099.     "Find the location indicated by the current state of the knobs. Their range is 0-100%
  116100.     so scale this to the extent of the sketch pad view"
  116101.     scale := sketchPad view extent / 100.
  116102.     newLocation := ((leftRightKnob value @ upDownKnob value) * scale) truncated.
  116103.  
  116104.     "Create an InkStroke representing this movement from the last known location.
  116105.     Add this to the model."
  116106.     inkStroke := InkStroke new
  116107.         addPoint: lastLocation;
  116108.         addPoint: newLocation;
  116109.         yourself.
  116110.     self model add: inkStroke.
  116111.  
  116112.     "Remember the current location as the last"
  116113.     lastLocation := newLocation.! !
  116114.  
  116115. PackagePrerequisites comment:
  116116. 'PackagePrerequisitesShell is a <SmalltalkSystemTool> that displays a package pre-requisite hierarchy, rooted in the immedaite pre-requisites of a particular <Package>. For each prerequisite the list of all the links from the package to the prerequisite are listed. Each link shows: the object belonging to the package,  why it forced the prerequisite, and the object owned by the prerequisite which it relies upon. The links are generated and described within the Package>>tracePrerequisites method.
  116117.  
  116118. Instance Variables:
  116119.     prerequisitesPresenter        <TreePresenter> holding the dependency tree for a package.
  116120.     tracesPresenter            <ListPresenter> holding the list of traces.
  116121.     traces                <IdentityDictionary> of traces generated by Package>>tracePrerequisites.
  116122.     package                <Package> whose prerequisites are being displayed.
  116123.  
  116124.     '!
  116125. !PackagePrerequisites class methodsFor!
  116126.  
  116127. displayOn: aStream
  116128.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  116129.     would want to see it."
  116130.  
  116131.     aStream nextPutAll: 'Package Prerequisites'
  116132. !
  116133.  
  116134. icon
  116135.     "Answers an Icon that can be used to represent this class"
  116136.  
  116137.     ^Package icon! !
  116138.  
  116139. !PackagePrerequisites methodsFor!
  116140.  
  116141. browsePackages
  116142.     "Browse the currently selected prerequisite package."
  116143.  
  116144.     | selected |
  116145.     selected := prerequisitesPresenter selectionOrNil.
  116146.     selected notNil ifTrue: [selected key browse].!
  116147.  
  116148. browseTrace
  116149.     "Browse the currently selected trace object."
  116150.  
  116151.     | trace |
  116152.     trace := tracesPresenter selectionOrNil.
  116153.     trace notEmpty ifTrue: [trace first first browse]!
  116154.  
  116155. buildPrerequisiteNodes: prereqs for: node
  116156.     "Private - Answer a <sequencedReadableCollection> of the child nodes, children, below the package
  116157.     prerequisites tree node, node."
  116158.  
  116159.     ^(prereqs asSortedCollection: [:a :b | a name < b name])
  116160.         collect: [:p | p -> node]!
  116161.  
  116162. childrenFor: node
  116163.     "Private - Answer a <sequencedReadableCollection> of the child nodes below the package
  116164.     prerequisites tree node."
  116165.  
  116166.     | prereqs |
  116167.     prereqs := Cursor wait showWhile: [node key getPrerequisites].
  116168.     ^self buildPrerequisiteNodes: prereqs for: node!
  116169.  
  116170. choosePackage
  116171.     "Prompt for the user to repackage the selected objects."
  116172.  
  116173.     | pkg newPkg dependees |
  116174.     dependees := tracesPresenter selectionOrNil collect: [:t | t first].
  116175.     "Default to moving the selected objects to the pre-requisite package"
  116176.     pkg := prerequisitesPresenter selection key.
  116177.     pkg == Package uncommitted ifTrue: [pkg := nil].
  116178.     newPkg := PackagePrompter 
  116179.                 showModalOn: pkg asValue
  116180.                 caption: 'Re-package dependencies...'
  116181.                 default: nil.
  116182.     newPkg isNil ifFalse: [self queryMoveObjects: dependees toPackage: newPkg]!
  116183.  
  116184. clear
  116185.     "Clear down the receiver"
  116186.  
  116187.     prerequisitesPresenter model clear!
  116188.  
  116189. createComponents
  116190.     "Create the presenters contained by the receiver"
  116191.  
  116192.     super createComponents.
  116193.  
  116194.     prerequisitesPresenter := self add: TreePresenter new name: 'prerequisites'.
  116195.     tracesPresenter := self add: ListPresenter new name: 'traces'.
  116196. !
  116197.  
  116198. createSchematicWiring
  116199.     "Create the trigger wiring for the receiver"
  116200.     
  116201.     super createSchematicWiring.
  116202.  
  116203.     prerequisitesPresenter
  116204.         when: #selectionChanged send: #onPrerequisiteSelected to: self;
  116205.         when: #actionPerformed send: #browsePackages to: self.
  116206.     tracesPresenter
  116207.         when: #actionPerformed send: #browseTrace to: self.
  116208.     self packageManager
  116209.         when: #prerequisitesReset: send: #onPrerequisitesReset: to: self.
  116210. !
  116211.  
  116212. onPrerequisiteSelected
  116213.     "Private - One of the prerequisite packages has been selected. Populate the
  116214.     traces presenter with a list of all of the links between owned objects of the
  116215.     receivers package and the selected prerequisite."
  116216.  
  116217.     | prerequisite |
  116218.     prerequisite := self prerequisite.
  116219.     (prerequisite notNil and: [prerequisite value notNil])
  116220.         ifTrue: [ | prereq pkg |
  116221.             prereq := prerequisite key.
  116222.             pkg := prerequisite value key.
  116223.             tracesPresenter list: ((self prerequisiteTraceFor: pkg) at: prereq ifAbsent: [#()])]
  116224.         ifFalse: [tracesPresenter clear].!
  116225.  
  116226. onPrerequisitesReset
  116227.     "Private - Calculate the prerequisites of the receivers package, and what
  116228.     forced that prerequisite, then fill the prerequisitesPresenter with that.
  116229.     Implementation Note: In order to avoid having to immediately calculate
  116230.     the pre-requisites of all the pre-requisites of the package when the 
  116231.     tree view asks if the root nodes have any children, we put the starting
  116232.     package in as the single root. This is also more consistent from a usability
  116233.     point of view, since when selected the pre-requisites list shows the dependencies
  116234.     on the parent node. It does mean we need to treat selection of the root as
  116235.     a special case however."
  116236.  
  116237.     | selected |
  116238.     packages isEmpty ifTrue: [^self].
  116239.     selected := self prerequisite.
  116240.     traces := LookupTable new.
  116241.     prerequisitesPresenter
  116242.         selectionOrNil: nil;
  116243.         model: (self prerequisitesModelWithRoots: (packages collect: [:each | each -> nil])).
  116244.     self prerequisite: selected!
  116245.  
  116246. onPrerequisitesReset: updatee
  116247.     "Private - The <Package>, updatee, has reset its prerequisites. If it is the selected package
  116248.     then we need to update our display to reflect the changes. We could do this more efficiently
  116249.     by locating the relevant nodes and collapsing only those, but at present we opt for the simple
  116250.     approach of collapsing the entire tree."
  116251.  
  116252.     self onPrerequisitesReset!
  116253.  
  116254. onViewClosed
  116255.     "Sent by the receiver's view when it has been closed.
  116256.     Disconnect from any events triggered by the devlopment system"
  116257.  
  116258.     super onViewClosed.
  116259.     self packageManager removeEventsTriggeredFor: self!
  116260.  
  116261. onViewOpened
  116262.     "Received when the receiver's view has been connected. "
  116263.  
  116264.     super onViewOpened.
  116265.     self packageManager youShouldBeProcessingEvents!
  116266.  
  116267. packageManager
  116268.     "Private - Answer the current PackageManager."
  116269.  
  116270.     ^Package manager
  116271.  
  116272. !
  116273.  
  116274. packages
  116275.     "Answer the packages which the receiver is showing the prerequisites of."
  116276.  
  116277.     ^packages!
  116278.  
  116279. packages: aPackageCollection
  116280.     "Set the packages which the receiver is showing the prerequisites of."
  116281.  
  116282.     packages := aPackageCollection.
  116283.     self onPrerequisitesReset!
  116284.  
  116285. prerequisite
  116286.     "Answer the currently selected prerequisite package."
  116287.  
  116288.     ^prerequisitesPresenter selectionOrNil!
  116289.  
  116290. prerequisite: aPackageOrNil
  116291.     "Set the currently selected prerequisite package."
  116292.  
  116293.     aPackageOrNil notNil
  116294.         ifTrue: [prerequisitesPresenter selection: aPackageOrNil ifAbsent: []]
  116295.         ifFalse: [prerequisitesPresenter resetSelection]!
  116296.  
  116297. prerequisitesModelWithRoots: anOrderedCollection 
  116298.     "Private - Answer an appropriately configured tree model for the immediate prerequisites of
  116299.     of the package under scrutiny."
  116300.  
  116301.     ^(ExpandingTreeModel withRoots: anOrderedCollection)
  116302.         getChildrenBlock: (MessageSend receiver: self selector: #childrenFor: arguments: #(nil));
  116303.         yourself!
  116304.  
  116305. prerequisiteTraceFor: aPackage
  116306.     "Private - Answer the pre-requisite trace for the specified package.
  116307.     We cache the info. for speed."
  116308.  
  116309.     ^traces at: aPackage ifAbsentPut: [Cursor wait showWhile: [aPackage tracePrerequisites]]!
  116310.  
  116311. queryCommand: aCommandQuery
  116312.     "Private - Enter details about a potential command for the receiver 
  116313.     into the <CommandQuery> argument."
  116314.  
  116315.     | selector |
  116316.     selector := aCommandQuery commandSymbol.
  116317.     #toggleStatusIcons == selector 
  116318.         ifTrue: 
  116319.             [aCommandQuery
  116320.                 isEnabled: true;
  116321.                 isChecked: prerequisitesPresenter view viewMode == #smallIcons.
  116322.             ^true].
  116323.     #browseTrace == selector 
  116324.         ifTrue: 
  116325.             [aCommandQuery isEnabled: tracesPresenter selectionOrNil size = 1.
  116326.             ^true].
  116327.     #browsePackages == selector 
  116328.         ifTrue: 
  116329.             [aCommandQuery isEnabled: prerequisitesPresenter hasSelection.
  116330.             ^true].
  116331.     #choosePackage == selector 
  116332.         ifTrue: 
  116333.             [aCommandQuery isEnabled: tracesPresenter hasSelection.
  116334.             ^true].
  116335.     ^super queryCommand: aCommandQuery!
  116336.  
  116337. queryMoveObjects: anArray toPackage: aPackage 
  116338.     "Private - Move the array of packageable objects, anArray, to the specified package."
  116339.  
  116340.     (MessageBox confirm: ('Are you sure you would like to move these %1!!d!! objects to the package ''%2''?'
  116341.                         formatWith: anArray size with: aPackage name))
  116342.         ifTrue: [
  116343.             anArray do: [:each | each owningPackage: aPackage]]!
  116344.  
  116345. toggleStatusIcons
  116346.     prerequisitesPresenter view viewMode: (prerequisitesPresenter view viewMode == #noIcons 
  116347.                 ifTrue: [#smallIcons]
  116348.                 ifFalse: [#noIcons])! !
  116349.  
  116350. Scribble comment:
  116351. 'Scribble is a <presenter> component that displays a <listModel> of <InkStroke>s within a <ScribbleView>. It is used to for accepting ''ink'' as a series of mouse or pen strokes and populate the model with this data. Scribble is part of the Scribble sample package. For examples of use please see the package comment.'!
  116352. !Scribble class methodsFor!
  116353.  
  116354. defaultModel
  116355.     "Answer a default model to be assigned to the receiver when it
  116356.     is initialized."
  116357.  
  116358.     ^ListModel new!
  116359.  
  116360. icon
  116361.     "Answers an Icon that can be used to represent this class"
  116362.  
  116363.     ^##(self) defaultIcon!
  116364.  
  116365. initialize
  116366.     "Private - Initialize the receiver's class variables
  116367.         self initialize
  116368.     "
  116369.  
  116370.     Smalltalk developmentSystem
  116371.         addSamplesFolderIconFor: self description: self sampleDescription!
  116372.  
  116373. sampleDescription
  116374.     "Private - Answer the description of the receiver to be used in the samples folder."
  116375.  
  116376.     ^'Scribble Pad'!
  116377.  
  116378. uninitialize
  116379.     "Private - Un-register the system folder icon for the receiver.
  116380.         self uninitialize
  116381.     "
  116382.  
  116383.     Smalltalk developmentSystem 
  116384.         removeSystemFolderIconNamed: self sampleDescription! !
  116385.  
  116386. !Scribble methodsFor!
  116387.  
  116388. cancelTrackingAt: aPoint 
  116389.     "Private - Nothing to do"
  116390.  
  116391.     !
  116392.  
  116393. continueTrackingAt: aPoint from: aPreviousPoint
  116394.     "Private - Continue ink tracking for the associated view at aPoint when
  116395.     the previous tracking position was at aPreviousPoint. Part of the <MouseTracker>
  116396.     target protocol. Answers the actual position achieved"
  116397.  
  116398.     "Continue with the visual feedback"
  116399.     trackingCanvas lineTo: aPoint.
  116400.  
  116401.     "Add aPoint to the stroke we're assembing"
  116402.     ^newStroke addPoint: aPoint!
  116403.  
  116404. endTrackingAt: aPoint
  116405.     "Private - End ink tracking for the new position of the receiver.
  116406.     Part of the <MouseTracker> target protocol."
  116407.  
  116408.     "Add the new stroke to the model and tidy up"
  116409.     self model add: newStroke.
  116410.     newStroke := trackingCanvas := nil!
  116411.  
  116412. initialize
  116413.     "Private - Initialize the receiver"
  116414.  
  116415.     super initialize.
  116416.  
  116417.     "When running as an applet it can be useful do load all necessary classes when the
  116418.     applet is started rather than waiting for each to be fetched on demand. The easiest
  116419.     way to effect this is by adding references to required classes in the applet's
  116420.     initialization. Let's fetch the InkStroke class here... "
  116421.  
  116422.     InkStroke yourself.!
  116423.  
  116424. onLeftButtonPressed: aMouseEvent
  116425.     "A left button down mouse event has occurred. Create a MouseTracker to monitor the mouse
  116426.     movement from this point until the button is released."
  116427.  
  116428.     (MouseTracker forPresenter: self startingAt: aMouseEvent screenPosition) 
  116429.         origin: aMouseEvent position;
  116430.         startTracking: self.!
  116431.  
  116432. startTrackingAt: aPoint
  116433.     "Private - Start ink tracking for the associated view at aPoint. Part of the 
  116434.     <MouseTracker> target protocol. Answers the actual position achieved."
  116435.  
  116436.     "Draw some visual feedback"
  116437.     trackingCanvas := self view canvas.
  116438.     trackingCanvas moveTo: aPoint.
  116439.  
  116440.     "Create a new stroke"
  116441.     newStroke := InkStroke new.
  116442.     ^newStroke addPoint: aPoint.! !
  116443.  
  116444. SelectableItemsPresenter comment:
  116445. 'SelectableItemsPresenter ia an abstract class that implements the <selectableItems> protocol for components that need to make one or more selections from multiple items held by their model. Typically the model will be either a <listModel> or <treeModel>.'!
  116446. !SelectableItemsPresenter class methodsFor!
  116447.  
  116448. icon
  116449.     "Answers an Icon that can be used to represent this class"
  116450.  
  116451.     ^ListPresenter icon! !
  116452.  
  116453. !SelectableItemsPresenter methodsFor!
  116454.  
  116455. ensureSelectionVisible
  116456.     "Ensure the selected item is visible, scrolling it into view if necessary.
  116457.     Raise an error if there is no selection."
  116458.  
  116459.     self selectableItems ensureSelectionVisible!
  116460.  
  116461. hasSelection
  116462.     "Answer true if the receiver has a current selection"
  116463.  
  116464.     ^self selectableItems hasSelection!
  116465.  
  116466. onSelectionChanged
  116467.     "Handler for a selection change in the receiver's view"
  116468.  
  116469.     self selectableItems onSelectionChanged!
  116470.  
  116471. onSelectionChanging: aSelectionChangingEvent
  116472.     "Handler to indicate that the receiver's selection is about to change.
  116473.     To prevent the proposed change under certain circumstances a handler
  116474.     can set the value of aValueHolder to false."
  116475.  
  116476.     self view onSelectionChanging: aSelectionChangingEvent!
  116477.  
  116478. resetForItem: anObject
  116479.     "Private - Try to ensure that the receiver is set to display anObject if possible"
  116480.  
  116481.     !
  116482.  
  116483. resetForItems: aCollection
  116484.     "Private - Try to ensure that the filter is set to display aCollection if possible"
  116485.  
  116486.     aCollection isEmpty ifFalse: [self resetForItem: aCollection first]!
  116487.  
  116488. resetSelection
  116489.     "Set the receiver to have no selection"
  116490.  
  116491.     self selectableItems resetSelection!
  116492.  
  116493. selectableItems
  116494.     "Private - Answer the name of the <selectableItems> component that actually handles the selectable items in the receiver"
  116495.     
  116496.     ^self subclassResponsibility!
  116497.  
  116498. selection
  116499.     "Return the selected object or signals a NotFoundError if there is none"
  116500.  
  116501.     ^self selectableItems selection!
  116502.  
  116503. selection: anObject
  116504.     "Select the first occurence of anObject in the receiver. If not present then signal a NotFoundError.
  116505.     Answer anObject"
  116506.  
  116507.     ^self selectableItems selection: anObject
  116508.         ifAbsent: 
  116509.             [self resetForItem: anObject.
  116510.             self selectableItems selection: anObject]!
  116511.  
  116512. selection: anObject ifAbsent: exceptionHandler
  116513.     "Select the first occurence of the <Object>, anObject, in the receiver. 
  116514.     Answer anObject, or, if not present, the result of evaluating the
  116515.     <niladicValuable>, exceptionHandler."
  116516.  
  116517.     ^self selectableItems selection: anObject
  116518.         ifAbsent: 
  116519.             [self resetForItem: anObject.
  116520.             self selectableItems selection: anObject ifAbsent: exceptionHandler]!
  116521.  
  116522. selectionIfNone: aBlock
  116523.     "Answer the current selection for the receiver or evaluate aBlock
  116524.     if there is none"
  116525.  
  116526.     ^self selectableItems selectionIfNone: aBlock!
  116527.  
  116528. selectionOrNil
  116529.     "Return the selected object or nil if no selection."
  116530.  
  116531.     ^self selectableItems selectionOrNil!
  116532.  
  116533. selectionOrNil: anObject
  116534.     "Select the first occurence of the <Object>, anObject, in the
  116535.     receiver. If anObject  is nil, then simply remove the existing
  116536.     selection. If anObject is not present then signal a NotFoundError.
  116537.     Answer anObject."
  116538.  
  116539.     ^[self selectableItems selectionOrNil: anObject] on: NotFoundError
  116540.         do: 
  116541.             [:ex | 
  116542.             self resetForItem: anObject.
  116543.             self selectableItems selectionOrNil: anObject]!
  116544.  
  116545. selections
  116546.     "Answer a <sequencedReadableCollection> of the selected items.
  116547.     If there is no selection, then the collection will be empty."
  116548.  
  116549.     ^self selectableItems selections!
  116550.  
  116551. selections: aSequencedReadableCollection
  116552.     "Select the specified collection of objects in the receiver. If any are not present then
  116553.     signal a NotFoundError. Answer the selections."
  116554.  
  116555.     ^self selectableItems selections: aSequencedReadableCollection
  116556.         ifAbsent: 
  116557.             [self resetForItems: aSequencedReadableCollection.
  116558.             self selectableItems selections: aSequencedReadableCollection]!
  116559.  
  116560. selections: anObject ifAbsent: exceptionHandler
  116561.     "Select the specified collection of objects in the receiver. If any are not present then
  116562.     answer the result of evaluating the <niladicValuable>, exceptionHandler.
  116563.     Answer the selections."
  116564.  
  116565.     ^self selectableItems selections: anObject
  116566.         ifAbsent: 
  116567.             [self resetForItems: anObject.
  116568.             self selectableItems selections: anObject ifAbsent: exceptionHandler]! !
  116569.  
  116570. Shell comment:
  116571. 'Shell implements the <topPresenter> protocol for presenters that are to appear in <topView>s; i.e. in top-level windows on the desktop.A Shell provides methods for supplying a caption for the associated <topView> and for maintaining a <HistoryList> of commands that have recently been performed within it. By default, a Shell will not maintain a command history unless it is explicitly told to do so using its #hasCommandHistory aspect. The purpose of maintaining a command history is to support the potential for #undo and #redo operations. For these to work successfully, each <Command> must be provided with an appropriate undo action after it has been performed. For more details see the comment for Command.
  116572.  
  116573. Instance Variables:
  116574.     caption        <readableString> or nil, holding and explicit caption for the associated <topView>.
  116575.     commandHistory    <HistoryList> or nil, holding a history of <Command>s that the presenter has recently performed.
  116576.  
  116577. '!
  116578. !Shell class methodsFor!
  116579.  
  116580. create: aResourceNameString
  116581.     "Answers an instance of the receiver created with no parent presenter
  116582.     and wired up to a view identified by the resource name aResourceNameString. 
  116583.     The view must be a Shell and will be a child of the desktop"
  116584.  
  116585.     | newOne |
  116586.     newOne := self new.
  116587.     newOne createView: aResourceNameString.
  116588.     ^newOne!
  116589.  
  116590. icon
  116591.     "Answers an Icon that can be used to represent this class"
  116592.  
  116593.     ^##(self) defaultIcon!
  116594.  
  116595. registerAsToolWith: aSmalltalkSystem
  116596.         "The receiver is being registered as a tool with aSmalltalkSystem. Perform any
  116597.         additional registration operations here. Part of the <installableSystemTool>
  116598.         protocol, and implemented at this level so that 3.0 tools can be installed
  116599.         without amendment."
  116600.     
  116601.         !
  116602.  
  116603. unregisterAsToolWith: aSmalltalkSystem
  116604.         "The receiver is being unregistered as a tool with aSmalltalkSystem. Perform any
  116605.         additional unregistration operations here. Part of the <installableSystemTool>
  116606.         protocol, and implemented at this level so that 3.0 tools can be installed
  116607.         without amendment."
  116608.     
  116609.         ! !
  116610.  
  116611. !Shell methodsFor!
  116612.  
  116613. addCommandHistory: aCommand
  116614.     "Private - Adds aCommand to the receiver's command history list.
  116615.     Only do this if the command is undoable. If not then clear the list unless
  116616.     the command has been marked as being benign."
  116617.  
  116618.     self hasCommandHistory ifTrue: [
  116619.         aCommand isBenign ifTrue: [^self].
  116620.         aCommand canUndo
  116621.             ifTrue: [ commandHistory addLast: aCommand ]
  116622.             ifFalse: [ self clearCommandHistory ]]!
  116623.  
  116624. allAdditionalAccelerators
  116625.     "Private - Answer a collection of additional accelerator definitions for commands not on the menu bar of the receiver's view(s),
  116626.     but which either the receiver of one of its sub-presenters wants to define.
  116627.     Each element of the collection should be a two element <Array>, the first element of which is the command symbol
  116628.     and the second the accelerator key string."
  116629.  
  116630.     | answer |
  116631.     answer := OrderedCollection withAll: self additionalAccelerators.
  116632.     self allSubPresentersDo: [:each | answer addAll: each additionalAccelerators].
  116633.     ^answer!
  116634.  
  116635. caption
  116636.     "Answer the caption of the receiver"
  116637.  
  116638.     ^caption!
  116639.  
  116640. caption: aString
  116641.     "Set the caption of the receiver to aString"
  116642.  
  116643.     caption := aString.
  116644.     self view notNil ifTrue: [ self view caption: aString ].!
  116645.  
  116646. clearCommandHistory
  116647.     "Clear the receiver's command history list if one is available"
  116648.  
  116649.     commandHistory notNil ifTrue: [
  116650.         commandHistory := HistoryList new ]!
  116651.  
  116652. commandHistory
  116653.     "Private - Answer the history list of recent commands for the receiver"
  116654.  
  116655.     ^commandHistory!
  116656.  
  116657. commandPolicyClass
  116658.     "Answers the class of <commandPolicy> to use for routing commands originating
  116659.     in the receiver or one of its sub-presenters."
  116660.  
  116661.     ^CommandPolicy defaultClass!
  116662.  
  116663. commandPolicyWithSource: sourceView
  116664.     "Answers a <CommandPolicy> object for routing commands originating
  116665.     from the <View>, source. 
  116666.     This can be overridden by subclasses which wish to use a different routing policy, 
  116667.     although to substitute a specialized <commandPolicy> one should override 
  116668.     #commandPolicyClass."
  116669.  
  116670.     ^self commandPolicyClass
  116671.         commandSource: sourceView!
  116672.  
  116673. createView: aResourceNameString
  116674.     "Private - Creates and connects a view for the receiver from the resource identified
  116675.     by aResourceNameString. Answers the new view created"
  116676.  
  116677.     self view: (self class loadViewResource: aResourceNameString inContext: View desktop).
  116678.     ^self view!
  116679.  
  116680. exit
  116681.     "Attempt to close the receiver's view."
  116682.  
  116683.     self view close!
  116684.  
  116685. hasCommandHistory
  116686.     "Answer true if the receiver can undo/redo commands"
  116687.  
  116688.     ^commandHistory notNil!
  116689.  
  116690. hasCommandHistory: aBoolean
  116691.     "Set the receiver to allow it to keep a command history list
  116692.     to allow commands to be undone"
  116693.  
  116694.     commandHistory := aBoolean ifTrue: [ HistoryList new ].!
  116695.  
  116696. onAboutToDisplaySystemMenu: hMenu
  116697.     "The system menu with <integer> handle, hMenu, is about to be displayed.
  116698.     This is our opportunity to update it, e.g. to add our own items."
  116699.  
  116700.     ^self view onAboutToDisplaySystemMenu: hMenu!
  116701.  
  116702. onIdleEntered
  116703.     "There are no messages in the input queue and the input state is
  116704.     about to go idle. Reflect back to the view so that it can update
  116705.     any visible UI elements such as toolbar buttons."
  116706.  
  116707.     ^self view onIdleEntered!
  116708.  
  116709. onViewActivated: anEvent
  116710.     "Default handler for activation. Pass on the the view"
  116711.  
  116712.     ^self view onViewActivated: anEvent!
  116713.  
  116714. onViewDeactivated: anEvent
  116715.     "Default handler for de-activation. Pass on to view"
  116716.  
  116717.     ^self view onViewDeactivated: anEvent!
  116718.  
  116719. onViewMinimized: aSizeEvent
  116720.     "Default handler for window minimized. Pass on to the view"
  116721.  
  116722.     ^self view onViewMinimized: aSizeEvent!
  116723.  
  116724. onViewOpened
  116725.     "Received when the receiver's view has been connected."
  116726.  
  116727.     super onViewOpened.
  116728.     self
  116729.         updateIcon;
  116730.         invalidateUserInterface;
  116731.         updateCaption;
  116732.         registerAdditionalAccelerators.
  116733.     self class trigger: #viewOpened: with: self!
  116734.  
  116735. onViewRestored: aSizeEvent
  116736.     "Default handler for window restored. Pass on to the view"
  116737.  
  116738.     ^self view onViewRestored: aSizeEvent!
  116739.  
  116740. performCommand: aCommand
  116741.     "Performs aCommand on the receiver and answer the result.
  116742.     Can be overridden by subclasses that wish, perhaps, to add some
  116743.     generic undo/redo ability for all commands."
  116744.  
  116745.     ^self view performCommand: aCommand!
  116746.  
  116747. queryCommand: query 
  116748.     "Enters details about a potential command for the receiver into the 
  116749.     <CommandQuery>,  query."
  116750.  
  116751.     | cmd |
  116752.     cmd := query commandSymbol.
  116753.  
  116754.     "Handle Undo/Redo commands"
  116755.     cmd == #undo 
  116756.         ifTrue: 
  116757.             [| description |
  116758.             description := ''.
  116759.             query beDisabled.
  116760.             self hasCommandHistory 
  116761.                 ifTrue: 
  116762.                     [commandHistory pastSize >= 0 
  116763.                         ifTrue: 
  116764.                             [| command |
  116765.                             command := self commandHistory current.
  116766.                             description := command description.
  116767.                             query beEnabled].
  116768.                     query text: (query commandDescription menuText formatWith: description)].
  116769.             ^true].
  116770.     cmd == #redo 
  116771.         ifTrue: 
  116772.             [| description |
  116773.             description := ''.
  116774.             query beDisabled.
  116775.             self hasCommandHistory 
  116776.                 ifTrue: 
  116777.                     [commandHistory hasFuture 
  116778.                         ifTrue: 
  116779.                             [| command |
  116780.                             command := self commandHistory next.
  116781.                             command canRedo 
  116782.                                 ifTrue: 
  116783.                                     [description := self commandHistory next description.
  116784.                                     query beEnabled]].
  116785.                     query text: (query commandDescription menuText formatWith: description)].
  116786.             ^true].
  116787.     ^super queryCommand: query!
  116788.  
  116789. redo
  116790.     "Redo the last command that is forward in the command history list. During the redo operation
  116791.     we place the receiver in a state where it will not accept any further command histories."
  116792.  
  116793.     self hasCommandHistory 
  116794.         ifTrue: 
  116795.             ["Save the original history list"
  116796.             | history |
  116797.             history := commandHistory.
  116798.             commandHistory := nil.
  116799.             [(history goForward: 1) redo] ensure: 
  116800.                     ["Restore the original history list"
  116801.                     commandHistory := history].
  116802.  
  116803.             "Mark the current command (#redo) as benign so that it will
  116804.         not require the command history to be cleared even though it has no
  116805.         explicit undo action"
  116806.             Command current beBenign]!
  116807.  
  116808. registerAdditionalAccelerators
  116809.     "Private - Register any accelerators supported by the receiver which are not in the menu bar."
  116810.  
  116811.     | additions |
  116812.     additions := self allAdditionalAccelerators.
  116813.     additions isEmpty 
  116814.         ifFalse: 
  116815.             [| accelerators |
  116816.             (accelerators := self view acceleratorTable) isNil 
  116817.                 ifTrue: [accelerators := AcceleratorTable new].
  116818.             additions do: 
  116819.                     [:each | 
  116820.                     (CommandDescription command: each first)
  116821.                         acceleratorKeyString: each last;
  116822.                         registerAcceleratorKeyIn: accelerators].
  116823.             self view acceleratorTable: accelerators]!
  116824.  
  116825. setInitialFocus
  116826.     "Received when the receiver's view is first opened.
  116827.     Set the initial keyboard focus to the first view in the tab sequence.
  116828.     Can be overidden by subclasses that find this behaviour 
  116829.     unacceptable"
  116830.  
  116831.     self view setInitialFocus!
  116832.  
  116833. topShell
  116834.     "Answer the first <topPresenter> located in the parent chain of the receiver."
  116835.  
  116836.     ^self!
  116837.  
  116838. undo
  116839.     "Undo the current command in the command history list. During the undo operation
  116840.     we place the receiver in a state where it will not accept any further command histories."
  116841.  
  116842.     | command |
  116843.     self hasCommandHistory 
  116844.         ifTrue: 
  116845.             ["Save the original history list"
  116846.             | history |
  116847.             history := commandHistory.
  116848.             commandHistory := nil.
  116849.  
  116850.             "Perform the undo"
  116851.             
  116852.             [command := history current.
  116853.             command undo] ensure: 
  116854.                         ["Restore the original history list. If the command executed can be redone
  116855.             then backup by one command. Otherwise we clear the redo portion of the list."
  116856.                         commandHistory := history].
  116857.             commandHistory goBack: 1.
  116858.             command canRedo ifFalse: [commandHistory clearFuture].
  116859.  
  116860.             "Mark the current command (#undo) as benign so that it will
  116861.         not require the command history to be cleared even though it has no
  116862.         explicit undo action"
  116863.             Command current beBenign]!
  116864.  
  116865. updateCaption
  116866.     "The receiver has changed in such a way that the caption may need to be refreshed.
  116867.     Overidden in subclasses that need to provide a dynamic caption that changes
  116868.     according to the state of the receiver"
  116869.  
  116870.     !
  116871.  
  116872. updateIcon
  116873.     "Private - Transfer any icon across to the view"
  116874.  
  116875.     self view largeIcon isNil ifTrue: [
  116876.         "Update the view's icon if not explicitly specified"
  116877.         self view largeIcon: self icon ].
  116878. !
  116879.  
  116880. view: aShellView
  116881.     "Set the view for the receiver to aShellView. 
  116882.     After this is complete we inform all our sub presenters that
  116883.     everything is open and ready to go."
  116884.  
  116885.     super view: aShellView.
  116886.     self onViewOpened; setInitialFocus
  116887. ! !
  116888.  
  116889. SmalltalkWorkspace comment:
  116890. 'SmalltalkWorkspace is a <presenter> for displaying a workspace area within a <TextEdit> view. Note that, for efficiency purposes, a SmalltakWorkspacedoes not have a model. The textual data is held only within the associated <TextEdit> view. since there seems little point in duplicating this text and holding it within the image as, say, a <readableString>.
  116891.  
  116892. Instance Variables:
  116893.     evaluationContext        <Object> used as the "self" context for evaluations.
  116894.     errorModel        <valueModel> holding the first error notification from the last compilation.
  116895.     findDetails        <Array> specifying text search details.
  116896.     workspacePool        <PoolDictionary> holding local variables held by the workspace.
  116897.     evaluationPools        <Array> of <PoolDictionary>s for lookup pools during evaluations.
  116898.     compilationErrors        <OrderedCollection> of <CompilerNotification>s
  116899.  
  116900. Class Variables:
  116901.     DefaultBackcolor        <color> of the background to use.
  116902.     WordWrap        <boolean> indicating whether the workspace should word wrap text.
  116903.     DefaultFont        <Font> for source text
  116904.     AdditionalAccelerators    <Array> of 2-element <Array>s, being command <Symbol> accelerator key <String> pairs
  116905.  
  116906. '!
  116907. !SmalltalkWorkspace class methodsFor!
  116908.  
  116909. abbreviations
  116910.     ^(self classPool at: 'Abbreviations' ifAbsent: [])
  116911.         ifNil: [self classPool at: 'Abbreviations' put: self defaultAbbreviations]!
  116912.  
  116913. actualFont
  116914.     "Answer the actual  font to use for instances of the receiver"
  116915.  
  116916.     ^self defaultFont notNil 
  116917.         ifTrue: [self defaultFont]
  116918.         ifFalse: [View desktop actualFont]!
  116919.  
  116920. defaultAbbreviations
  116921.     ^(Dictionary new)
  116922.         at: 'in' put: 'isNil ';
  116923.         at: 'nn' put: 'notNil ';
  116924.         at: 'it' put: 'ifTrue: []';
  116925.         at: 'if' put: 'ifFalse: []';
  116926.         at: 'int' put: 'isNil ifTrue: []';
  116927.         at: 'inf' put: 'isNil ifFalse: []';
  116928.         at: 'ints' put: 'isNil ifTrue: [^self]';
  116929.         at: 'infs' put: 'isNil ifFalse: [^self]';
  116930.         at: 'wt' put: 'whileTrue: []';
  116931.         at: 'wf' put: 'whileFalse: []';
  116932.         at: 'do' put: 'do: [:each | ]';
  116933.         at: 'dt' put: 'detect: [:each | ]';
  116934.         at: 'dtn' put: 'detect: [:each | ] ifNone: []';
  116935.         at: 'cl' put: 'collect: [:each | ]';
  116936.         at: 'sl' put: 'select: [:each | ]';
  116937.         at: 'rj' put: 'reject: [:each | ]';
  116938.         at: 'np' put: 'nextPut: ';
  116939.         at: 'npa' put: 'nextPutAll: ';
  116940.         at: 'y' put: 'yourself.';
  116941.         at: 'sh' put: 'self halt.';
  116942.         at: 'ps' put: 'printString';
  116943.         at: 'sr' put: 'self subclassResponsibility';
  116944.         at: 'st' put: 'Smalltalk';
  116945.         at: 'trs' put: 'Transcript cr; show: ';
  116946.         at: 'ik' put: 'includesKey: #';
  116947.         at: 'abb' put: 'SmalltalkWorkspace abbreviations inspect';
  116948.         shrink;
  116949.         yourself!
  116950.  
  116951. defaultAdditionalAccelerators
  116952.     "Private - Answer a collection of additional accelerator definitions to be bound to the receiver's commands.
  116953.     Each element of the collection should be a two element <Array>, the first element of which is the command symbol
  116954.     and the second the accelerator key string."
  116955.  
  116956.     ^#(#(#cutLine 'Ctrl+L') #(#deleteLine 'Ctrl+Shift+L') #(#toggleWordWrap 'Ctrl+R'))!
  116957.  
  116958. defaultBackcolor
  116959.     "Answer the default background to use for instances of the receiver"
  116960.  
  116961.     ^DefaultBackcolor!
  116962.  
  116963. defaultBackcolor: aColorOrNil
  116964.     "Set the default background to use for instances of the receiver"
  116965.  
  116966.     DefaultBackcolor := aColorOrNil.
  116967. !
  116968.  
  116969. defaultFont
  116970.     "Answer the default  font to use for instances of the receiver"
  116971.  
  116972.     ^DefaultFont!
  116973.  
  116974. defaultFont: aFontOrNil
  116975.     "Set the default  font to use for instances of the receiver"
  116976.  
  116977.     DefaultFont := aFontOrNil.
  116978.     self resetCompilerFont
  116979.  
  116980. !
  116981.  
  116982. getAdditionalAccelerators
  116983.     ^AdditionalAccelerators!
  116984.  
  116985. icon
  116986.     "Answers an Icon that can be used to represent this class"
  116987.  
  116988.     ^##(self) defaultIcon!
  116989.  
  116990. initialize
  116991.     "Private - Initialize the receiver's class variables.
  116992.         SmalltalkWorkspace initialize
  116993.     "
  116994.  
  116995.     self 
  116996.         defaultBackcolor: (Color red: 255 green: 255 blue: 230);
  116997.         defaultFont: (Font name: 'Times New Roman' pointSize: 10);
  116998.         wordWrap: true
  116999. !
  117000.  
  117001. publishedEventsOfInstances
  117002.     "Answer a Set of Symbols that describe the published events triggered
  117003.     by instances of the receiver."
  117004.  
  117005.     ^super publishedEventsOfInstances
  117006.         add: #expressionEvaluated:;
  117007.         yourself.
  117008. !
  117009.  
  117010. resetCompilerFont
  117011.     "Private - Reset the font used by the compiler when outputting coloured source text for
  117012.     use in the browsers. Note that this is only necessary because the point size is encoded
  117013.     in the RTF and the RTE control ignores the size of the font set into it, even though it
  117014.     respects the face."
  117015.  
  117016.     Compiler defaultFont: SmalltalkWorkspace actualFont!
  117017.  
  117018. setAdditionalAccelerators: anArray 
  117019.     AdditionalAccelerators := anArray!
  117020.  
  117021. wordWrap
  117022.     "Answer true if instances of the receiver use word wrapping by default."
  117023.  
  117024.     ^WordWrap!
  117025.  
  117026. wordWrap: aBoolean
  117027.     "Sets the word wrapping state for instances of the receiver to aBoolean."
  117028.  
  117029.     WordWrap := aBoolean! !
  117030.  
  117031. !SmalltalkWorkspace methodsFor!
  117032.  
  117033. allPools
  117034.     "Private - Answers an Array of all the PoolDictionaries used
  117035.     during evaluations in the receiver. The workspacePool of locals
  117036.     must be the first element of the array"
  117037.  
  117038.     ^(OrderedCollection with: self workspacePool) 
  117039.         addAll: self evaluationPools; 
  117040.         asArray!
  117041.  
  117042. applyOptions
  117043.     "Apply the class options to the receiver"
  117044.  
  117045.     self view backcolor isNil ifTrue: [
  117046.         self view backcolor: self class defaultBackcolor ].
  117047.     self view font: self class actualFont.
  117048.     self view wordWrap: self class wordWrap
  117049. !
  117050.  
  117051. basicFindNext
  117052.     "Hilight the next occurrence which satisfies the find operation held in findDetails."
  117053.  
  117054.     ^self findDetails notNil and: [
  117055.         self view
  117056.             findNextWrapped: (findDetails at: 1)
  117057.             down: (findDetails at: 2)
  117058.             wholeWord: (findDetails at: 3)
  117059.             matchCase: (findDetails at: 4)]
  117060.  
  117061. !
  117062.  
  117063. basicInspectIt
  117064.     "Evaluate and basic inspect the currently selected text (or the current
  117065.     line if there is no selection)."
  117066.  
  117067.     (self evaluateItIfFail: [^self]) basicInspect!
  117068.  
  117069. browseDefinitions
  117070.     "Prompt for a selector and open a method browser displaying the
  117071.     implementors of that selector."
  117072.  
  117073.     self systemModel browseMessageDefinitions: self selectedWord!
  117074.  
  117075. browseIt
  117076.     "Evaluate currently selected text (or the current line if there is no selection)
  117077.     in the receiver and browse the result."
  117078.  
  117079.     (self evaluateItIfFail: [^self]) browse!
  117080.  
  117081. browseReferences
  117082.     "Prompt for a selector and open a method browser displaying the
  117083.     references to that selector."
  117084.  
  117085.     self systemModel browseMessageReferences: self selectedWord!
  117086.  
  117087. canRefactor
  117088.     ^self systemModel canRefactor!
  117089.  
  117090. chooseEvaluationPools
  117091.     "Display a ListPrompter to allow the user to choose the evaluation pools associated with
  117092.     the receiver"
  117093.  
  117094.     ChoicePrompter 
  117095.         on: (self aspectValue: #evaluationPools) 
  117096.         multipleChoices: Smalltalk developmentSystem availablePools asArray
  117097.         caption: 'Available pools'.
  117098.     !
  117099.  
  117100. chunkFilerClass
  117101.     ^ChunkSourceFiler!
  117102.  
  117103. clear
  117104.     "Remove all contents in the receiver's view"
  117105.  
  117106.     self view clear.
  117107.     self newVariablePool!
  117108.  
  117109. clearErrors
  117110.     "Clear down the receiver's error model, if any, e.g. in preparation for a compilation"
  117111.  
  117112.     self clearStatus.
  117113.     compilationErrors := OrderedCollection new!
  117114.  
  117115. clearStatus
  117116.     self errorModel ifNotNil: [:errors | errors value: nil]!
  117117.  
  117118. cloneNew
  117119.     "Opens a SmalltalkWorkspace document which is effectively a clone of the receiver.
  117120.     It will contain the same contents and have the same evaluation context and workspace
  117121.     pools. Answers the clone"
  117122.  
  117123.     | clone |
  117124.     clone := Smalltalk developmentSystem newWorkspace.
  117125.     
  117126.     clone workspace 
  117127.         text: self text;
  117128.         workspacePool: self workspacePool;
  117129.         evaluationPools: self evaluationPools;
  117130.         evaluationContext: self evaluationContext.
  117131.  
  117132.     ^clone!
  117133.  
  117134. coloredSource
  117135.     "Answer the receiver's RTF source text as a RichText"
  117136.  
  117137.     ^self view richText!
  117138.  
  117139. compileAll
  117140.     "Compile the entire contents of the receiver and show the syntax colored result."
  117141.  
  117142.     self compileAllIfFail: [^self]
  117143. !
  117144.  
  117145. compileAllIfFail: failBlock
  117146.     "Private - Compile the entire contents of the receiver and show the syntax colored result.
  117147.     Show the syntax coloured result. Evaluate failBlock if there is a compilation error."
  117148.  
  117149.     ^self compileRange: self view textRange ifFail: failBlock
  117150. !
  117151.  
  117152. compileIt
  117153.     "Compile the currently selected text (or the current line if there is no selection). 
  117154.     Show the syntax colored result."
  117155.  
  117156.     self compileItIfFail: [^self]
  117157. !
  117158.  
  117159. compileItIfFail: failBlock
  117160.     "Private - Compile the currently selected text (or the current
  117161.     line if there is no selection) within the receiver's evaluation context.
  117162.     Show the syntax coloured result"
  117163.  
  117164.     ^self compileRange: self selectEvaluationRange ifFail: failBlock
  117165. !
  117166.  
  117167. compileRange: anInterval ifFail: failBlock
  117168.     "Private - Compile the specified, inclusive, range of text in the receiver within the
  117169.     receiver's evaluation context, evaluating failBlock if the compilation experiences errors, 
  117170.     or the expression fails to complete when evaluated. Answers an instance of CompiledExpression."
  117171.  
  117172.     ^self compileRange: anInterval ifFail: failBlock debug: false
  117173. !
  117174.  
  117175. compileRange: anInterval ifFail: failBlock debug: aBoolean
  117176.     "Private - Compile the specified, inclusive, range of text in the receiver within the
  117177.     receiver's evaluation context, evaluating failBlock if the compilation experiences errors, 
  117178.     or the expression fails to complete when evaluated. Answers an instance of CompiledExpression."
  117179.  
  117180.     | result source hadErrors offset changed |
  117181.     anInterval isEmpty 
  117182.         ifTrue: 
  117183.             [source := String new.
  117184.             offset := 0]
  117185.         ifFalse: 
  117186.             [offset := anInterval first - 1.
  117187.             source := self view plainTextRange: anInterval].
  117188.     self selectionRange: anInterval.
  117189.     hadErrors := false.
  117190.     self clearErrors.
  117191.     
  117192.     [| flags context |
  117193.     flags := self defaultCompilerFlags.
  117194.     aBoolean ifTrue: [flags := flags | DebugMethod].
  117195.     context := self evaluationContext.
  117196.     result := context class compilerClass 
  117197.                 compileForEvaluation: source
  117198.                 in: context class
  117199.                 evaluationPools: self allPools
  117200.                 logged: true
  117201.                 flags: flags] 
  117202.             on: CompilerWarningNotification
  117203.             do: [:cw | self compilerNotification: cw offset: offset]
  117204.             on: CompilerErrorNotification
  117205.             do: 
  117206.                 [:cn | 
  117207.                 hadErrors 
  117208.                     ifFalse: 
  117209.                         [hadErrors := true.
  117210.                         self
  117211.                             selectionRange: anInterval;
  117212.                             replaceSelection: (self syntaxColorOfExpression: source).
  117213.                         "Ensure view left in default character format mode"
  117214.                         self view resetCharFormat].
  117215.                 "Note that this method sets the source selection appropriately"
  117216.                 self compilerNotification: cn offset: offset].
  117217.     "A number of errors may have been recorded and displayed, go back to the first"
  117218.     self showFirstError: offset.
  117219.  
  117220.     "If the compilation failed, then evaluate the fail block and answer the result."
  117221.     (result isNil or: [result method isNil]) ifTrue: [^failBlock value].
  117222.     "Otherwise update the display with coloured source..."
  117223.     "#941: Avoid the loss of modification state that might result from just colouring the source"
  117224.     changed := self isModified.
  117225.     self
  117226.         selectionRange: anInterval;
  117227.         replaceSelection: result coloredSource.
  117228.     self isModified: changed.
  117229.     ^result!
  117230.  
  117231. compilerNotification: notification offset: anInteger
  117232.     "Private - A notification has been sent by the Compiler. If an errorsModel has
  117233.     been set up then the the notification will be sent to that, and the offending
  117234.     range of source selected. Only the first error notification of any compilation 
  117235.     will be set into any configured errorsModel, displacing any previous warning,
  117236.     further ones will be ignored. 
  117237.     The default behavior (where there is no error model) is to select the offending
  117238.     range of source, and display an Ok/Cancel message box with the error/warning.
  117239.     If the user presses Ok, then the compilation is permitted to continue, whereas
  117240.     Cancel aborts it."
  117241.  
  117242.     compilationErrors addLast: notification.
  117243.     self errorModel notNil 
  117244.         ifTrue: 
  117245.             [self showError: notification offset: anInteger.
  117246.             ^notification exit: nil].
  117247.  
  117248.     "Nothing set up so highlight the error/warning and display a message box"
  117249.     self selectionRange: notification range + anInteger.
  117250.     notification okToContinue!
  117251.  
  117252. debugIt
  117253.     "Debug the evaluation of the currently selected text (or the current
  117254.     line if there is no selection) within the receiver's evaluation context"
  117255.  
  117256.     ^self debugItIfFail: []!
  117257.  
  117258. debugItIfFail: failBlock
  117259.     "Private - Debug the evaluation of the currently selected text (or the current
  117260.     line if there is no selection) within the receiver's evaluation context"
  117261.  
  117262.     ^self evaluateItIfFail: failBlock debug: true
  117263. !
  117264.  
  117265. defaultCompilerFlags
  117266.     "Private - Answer the flags to be used by default when compiling expressions in the receiver."
  117267.  
  117268.     ^RTF|Interactive!
  117269.  
  117270. displayIt
  117271.     "Evaluate the currently selected text (or the current line if there is no selection). 
  117272.     Display the result at the current insert point (i.e. immediately after the selection)."
  117273.  
  117274.     | result evalRange |
  117275.     evalRange := self selectEvaluationRange.
  117276.     result := self evaluateRange: evalRange ifFail: [^self].
  117277.     "Source range is inclusive, so we want to move caret to immediately after
  117278.     that range"
  117279.     self showResult: result at: evalRange stop+1!
  117280.  
  117281. dragOver: session
  117282.     "The drag operation described by the <DragDropSession>, session,
  117283.     has moved to a new position over the receiver's window. Use the session 
  117284.     to provide feedback to the user about allowable operations etc.
  117285.     Implementation Note: Override this message to suggest a default drop action of 
  117286.     pasting in the Chunk/String at the drop position."
  117287.  
  117288.     session operation: ((session isFormatAvailable: #Chunk) 
  117289.                 ifTrue: [#copy]
  117290.                 ifFalse: 
  117291.                     [(#(#String #ObjectRef) anySatisfy: [:e | session isFormatAvailable: e]) 
  117292.                         ifTrue: [session intendedOperation]]).
  117293.  
  117294.     "Superclass triggers event to allow observers to override."
  117295.     super dragOver: session!
  117296.  
  117297. drop: session
  117298.     "The drag operation described by the <DragDropSession>, session, has culminated
  117299.     in a drop over the receiver.
  117300.     Implementation Note: Override this message to implement default action of 
  117301.     pasting in the String or Chunk at the drop position. However any observers of the
  117302.     #drop: trigger of the receiver get first crack - they should set the suggested target to 
  117303.     nil in order to pre-empt the default action."
  117304.  
  117305.     | targetPos answer |
  117306.     answer := super drop: session.
  117307.     targetPos := session suggestedTarget.
  117308.     targetPos isNil 
  117309.         ifFalse: 
  117310.             [self view caretPosition: targetPos.
  117311.             session dragObjects do: 
  117312.                     [:each | 
  117313.                     (each isFormatAvailable: #ObjectRef) 
  117314.                         ifTrue: [self dropObjectRef: (each format: #ObjectRef)]
  117315.                         ifFalse: 
  117316.                             [| text |
  117317.                             text := each format: #Chunk ifAbsent: [each format: #String].
  117318.                             self replaceSelection: text]]].
  117319.     ^answer!
  117320.  
  117321. dropObjectRef: anObjectRef 
  117322.     "Private - Drops the anObjectRef into the receiver as a workspace variable. Prompts for the name
  117323.     of the variable"
  117324.  
  117325.     | varName |
  117326.     varName := self promptForVariableName: anObjectRef.
  117327.     varName notNil 
  117328.         ifTrue: 
  117329.             [| selStart |
  117330.             self workspacePool at: varName put: anObjectRef value.
  117331.             self view resetCharFormat.
  117332.             selStart := self view caretPosition.
  117333.             self replaceSelection: varName.
  117334.             self selectionRange: (selStart to: selStart + varName size - 1).
  117335.             self setFocus]!
  117336.  
  117337. errorModel
  117338.     "Answer the receivers errorModel. Its value is the first notification
  117339.     from the last compilation. Note that this model may be shared
  117340.     by a number of presenters all contained within a single shell."
  117341.  
  117342.     ^errorModel!
  117343.  
  117344. errorModel: aValueModel
  117345.     "Set the receivers errorModel."
  117346.  
  117347.     errorModel := aValueModel!
  117348.  
  117349. evaluateIt
  117350.     "Evaluate the currently selected text (or the current
  117351.     line if there is no selection) within the receiver's evaluation context"
  117352.  
  117353.     ^self evaluateItIfFail: []!
  117354.  
  117355. evaluateItIfFail: failBlock
  117356.     "Private - Evaluate the currently selected text (or the current
  117357.     line if there is no selection) within the receiver's evaluation context"
  117358.  
  117359.     ^self evaluateItIfFail: failBlock debug: false
  117360. !
  117361.  
  117362. evaluateItIfFail: failBlock debug: aDebugBoolean
  117363.     "Private - Evaluate the currently selected text (or the current
  117364.     line if there is no selection) within the receiver's evaluation context"
  117365.  
  117366.     | evalRange result |
  117367.     evalRange := self selectEvaluationRange.
  117368.     result := self 
  117369.                 evaluateRange: evalRange
  117370.                 ifFail: [^failBlock value]
  117371.                 debug: aDebugBoolean.
  117372.     self selectionRange: (evalRange stop + 1 to: evalRange stop).
  117373.     "Due to a bug in the RichEdit control, it tends to leave behind the formatting
  117374.     of the last section, resisting any attempts to close the RTF block properly,
  117375.     we therefore forcibly reset the default character format."
  117376.     "expression may have closed the view!!"
  117377.     self isOpen ifTrue: [self view resetCharFormat].
  117378.     ^result!
  117379.  
  117380. evaluateRange: anInterval ifFail: failBlock
  117381.     "Private - Evaluate the specified, inclusive, range of text in the receiver within the receiver's evaluation context, 
  117382.     evaluating failBlock if the compilation experiences errors, or the expression fails to complete when evaluated."
  117383.  
  117384.     ^self evaluateRange: anInterval ifFail: failBlock debug: false
  117385. !
  117386.  
  117387. evaluateRange: anInterval ifFail: failBlock debug: aBoolean 
  117388.     "Private - Evaluate the specified, inclusive, range of text in the receiver within the
  117389.     receiver's evaluation context, evaluating failBlock if the compilation experiences errors, 
  117390.     or the expression fails to complete when evaluated. If aBoolean is true then a debugger 
  117391.     is brought up on the evaluation."
  117392.  
  117393.     | result |
  117394.     result := self 
  117395.                 compileRange: anInterval
  117396.                 ifFail: failBlock
  117397.                 debug: aBoolean.
  117398.  
  117399.     ".. if it is a debug request then associate a debugger with the active process"
  117400.     aBoolean 
  117401.         ifTrue: 
  117402.             [| process |
  117403.             process := Processor activeProcess.
  117404.             process 
  117405.                 attachDebugger: 'Debug it'
  117406.                 topFrame: process topFrame
  117407.                 resumable: true].
  117408.  
  117409.     "... and evaluate the expression"
  117410.     result := result method value: self evaluationContext.
  117411.     self trigger: #expressionEvaluated: with: result.
  117412.     ^result!
  117413.  
  117414. evaluationContext
  117415.     "Answers the evaluation context for this workspace."
  117416.  
  117417.     ^evaluationContext!
  117418.  
  117419. evaluationContext: anObject
  117420.     "Sets the evaluation context for this workspace. Normally this is nil but
  117421.     for example in inspector workspaces evaluations are performed in the context
  117422.     of the object being inspected. This allows access to class variables and such like"
  117423.  
  117424.     evaluationContext := anObject.!
  117425.  
  117426. evaluationPools
  117427.     "Answers the evaluation pool for this workspace."
  117428.  
  117429.     ^evaluationPools!
  117430.  
  117431. evaluationPools: aCollectionOfPools
  117432.     "Sets the evaluation pools for this workspace to aCollectionOfPools"
  117433.  
  117434.     evaluationPools := aCollectionOfPools asArray!
  117435.  
  117436. expandAbbreviation
  117437.     | startAssoc replace end start abbrev |
  117438.     startAssoc := self findSeparatorLeftAndKey: self selectionRange stop.
  117439.     start := startAssoc value + 1.
  117440.     abbrev := startAssoc key.
  117441.     replace := self class abbreviations at: abbrev
  117442.                 ifAbsent: 
  117443.                     ["TextEdit normally inserts a space on Shift+Space, so continue to do that if not an abbreviation..."
  117444.                     self replaceSelection: ' '.
  117445.                     ^self].
  117446.     self selectionRange: (start to: start + abbrev size - 1).
  117447.     self replaceSelection: replace.
  117448.     end := start + replace size.
  117449.     (replace last == $] or: [replace last == $)]) ifTrue: [end := end - 1].
  117450.     self selectionRange: (end to: end - 1)!
  117451.  
  117452. fileItIn
  117453.     "Files in the current selection in chunk format"
  117454.  
  117455.     ^(self chunkFilerClass on: self selection readStream) fileIn!
  117456.  
  117457. findDetails
  117458.     "Answers the findDetails instance variable. The Array has four elements:
  117459.     (findWhatString, isForwardsBoolean, isCaseSensitiveBoolean, isWholeWordBoolean)."
  117460.  
  117461.     ^findDetails!
  117462.  
  117463. findDetails: anArray
  117464.     "Sets the findDetails instance variable to anArray. The Array has four elements:
  117465.     (findWhatString, isForwardsBoolean, isCaseSensitiveBoolean, isWholeWordBoolean)."
  117466.  
  117467.     findDetails := anArray!
  117468.  
  117469. findSeparatorLeftAndKey: anInteger 
  117470.     "find the first separator char to the left. Return an
  117471.     Association with the key being the substring, and
  117472.     the value the index of the separator"
  117473.  
  117474.     | text position start edit |
  117475.     edit := self view.
  117476.     start := edit positionAtLine: (edit lineFromPosition: anInteger).
  117477.     text := edit plainTextFrom: start to: anInteger.
  117478.     position := anInteger - start + 1.
  117479.     [position > 0 and: [(text at: position) isAlphaNumeric]] 
  117480.         whileTrue: [position := position - 1].
  117481.     ^Association key: (text copyFrom: position + 1) value: position + start - 1!
  117482.  
  117483. hasSelection
  117484.     "Answers whether any text is selected in the receiver's view."
  117485.     
  117486.     ^self view hasSelection!
  117487.  
  117488. initialize
  117489.     "Private - Initialize the receiver"
  117490.  
  117491.     super initialize.
  117492.  
  117493.     "Set up the pools for evaluations in the receiver"
  117494.     self evaluationPools: Array new.
  117495.     self newVariablePool.
  117496.     self clearErrors!
  117497.  
  117498. inspectIt
  117499.     "Evaluate and inspect the currently selected text (or the current
  117500.     line if there is no selection). Inspect the result."
  117501.  
  117502.     (self evaluateItIfFail: [^self]) inspect!
  117503.  
  117504. inspectWorkspacePool
  117505.     "Private - Open a DictionaryInspector on the Workspace Pool containing the receiver's
  117506.     shared variables."
  117507.  
  117508.     self workspacePool inspect!
  117509.  
  117510. isModified
  117511.     "Answer whether the text in the receiver has been modified."
  117512.  
  117513.     ^self view isModified!
  117514.  
  117515. isModified: aBoolean
  117516.     "Set/reset the receiver's dirty flag."
  117517.  
  117518.     self view isModified: aBoolean!
  117519.  
  117520. newVariablePool
  117521.     workspacePool := PoolDictionary new!
  117522.  
  117523. onTextOverflow
  117524.     "Default handler for EN_MAXTEXT notification. Can be overridden, but the
  117525.     preferred customization route is to observe the #textOverflow event."
  117526.  
  117527.     ^self view onTextOverflow!
  117528.  
  117529. onTipTextRequired: tool
  117530.     "Tool tip text is required for the <ToolbarItem>, tool."
  117531.  
  117532.     | cmd |
  117533.     cmd := tool command asSymbol.
  117534.     #clearSelection == cmd ifTrue: [^'Delete selected text'].
  117535.     ^super onTipTextRequired: tool!
  117536.  
  117537. onViewOpened
  117538.     "Received when the receiver's view is been connected. "
  117539.  
  117540.     super onViewOpened.
  117541.     self applyOptions.
  117542. !
  117543.  
  117544. plainText
  117545.     "Answer the receiver's unformatted source text as a String."
  117546.  
  117547.     ^self view plainText!
  117548.  
  117549. prompt: aString toSaveChanges: aSelectionChangingEvent
  117550.     self isModified 
  117551.         ifTrue: 
  117552.             [| response prompt |
  117553.             self ensureVisible.
  117554.             prompt := aSelectionChangingEvent canIntercept 
  117555.                         ifTrue: ['Do you wish to retain them']
  117556.                         ifFalse: ['Would you like them copied to the clipboard'].
  117557.             response := (MessageBox new)
  117558.                         taskModal;
  117559.                         owner: self view;
  117560.                         confirm: ('There are unsaved %1 changes.%n%n%2?' formatWith: aString with: prompt).
  117561.             aSelectionChangingEvent canIntercept 
  117562.                 ifTrue: 
  117563.                     [response 
  117564.                         ifTrue: 
  117565.                             [self ensureVisible.
  117566.                             aSelectionChangingEvent value: false]
  117567.                         ifFalse: [self isModified: false]]
  117568.                 ifFalse: 
  117569.                     [self isModified: false.
  117570.                     response ifTrue: [self text copyToClipboard]]].
  117571.     ^aSelectionChangingEvent value!
  117572.  
  117573. promptForVariableName: anObjectRef 
  117574.     "Prompt for a variable name to represent anObjectRef in the receiver's workspace pool"
  117575.  
  117576.     | nameValue |
  117577.     nameValue := anObjectRef key asValue.
  117578.     
  117579.     [| name |
  117580.     name := Prompter 
  117581.                 on: nameValue
  117582.                 prompt: 'Enter a variable name:'
  117583.                 caption: ('Drop of %1 onto workspace' formatWith: anObjectRef value basicPrintString).
  117584.     name isNil ifTrue: [^nil].
  117585.     (SmalltalkScanner isVariable: name) 
  117586.         ifTrue: [true]
  117587.         ifFalse: 
  117588.             [MessageBox errorMsg: ('"%1" is not a valid variable name.' formatWith: name).
  117589.             false]] 
  117590.             whileFalse: [].
  117591.     ^nameValue value!
  117592.  
  117593. queryCommand: aCommandQuery
  117594.     "Private - Enter details about a potential command for the receiver 
  117595.     into the <CommandQuery>."
  117596.  
  117597.     | cmd |
  117598.     cmd := aCommandQuery commandSymbol.
  117599.     #fileItIn == cmd 
  117600.         ifTrue: 
  117601.             [aCommandQuery isEnabled: self view hasSelection.
  117602.             ^true].
  117603.     #reformatSource == cmd 
  117604.         ifTrue: 
  117605.             [aCommandQuery isEnabled: (self view hasSelection and: [self view isReadOnly not]).
  117606.             ^true].
  117607.     (self canRefactor and: [self queryRefactoringCommand: aCommandQuery]) ifTrue: [^true].
  117608.     ^super queryCommand: aCommandQuery!
  117609.  
  117610. reformatSource
  117611.     "Reformat and syntax colour the selected range of source in the receiver as if it is an expression. 
  117612.     Attempts to maintain the base indentation of the first selected line."
  117613.  
  117614.     | source formatter reformatted expr tabs colored |
  117615.     source := self selection.
  117616.     tabs := (source findFirst: [:each | each ~~ Character tab]) - 1.
  117617.     [expr := SmalltalkParser parseExpression: source in: evaluationContext class] 
  117618.         on: SmalltalkCompilerError
  117619.         do: 
  117620.             [:e | 
  117621.             e okToContinue.
  117622.             ^self].
  117623.     formatter := expr formatterClass new.
  117624.     tabs <= 0 
  117625.         ifTrue: [reformatted := formatter format: expr]
  117626.         ifFalse: 
  117627.             [formatter indent: tabs
  117628.                 around: [reformatted := (source copyFrom: 1 to: tabs) , (formatter format: expr)]].
  117629.     colored := self syntaxColorOfExpression: reformatted.
  117630.     ^self replaceSelection: colored!
  117631.  
  117632. replaceSelection: aString
  117633.     "Replace the current selected range of text with aString"
  117634.     
  117635.     ^self view replaceSelection: aString!
  117636.  
  117637. richText
  117638.     "Answer the receiver's RTF source text as a RichText"
  117639.  
  117640.     ^self view richText!
  117641.  
  117642. selectedWord
  117643.     "Private - Answers a selection that may be of interest given by the current state
  117644.     of the receiver. This is used by #browseImplementors, #browseSenders, etc,
  117645.     as a suitable starting point for the search"
  117646.  
  117647.     | selected |
  117648.     selected := self selection.
  117649.     ^selected isEmpty ifTrue: [selected] ifFalse: [selected subStrings first]!
  117650.  
  117651. selectEvaluationRange
  117652.     "Private - Answer the current evaluation range, selecting the current
  117653.     line and answering its entire range if there is no selection."
  117654.     
  117655.     | te range |
  117656.     te := self view.
  117657.     range := te selectionRange.
  117658.     range isEmpty
  117659.         ifTrue: [range := te selectCurrentLine].
  117660.     ^range!
  117661.  
  117662. selection
  117663.     "Answer the currently selected text in the receiver's source"
  117664.  
  117665.     ^self view selection!
  117666.  
  117667. selectionRange
  117668.     "Answers an interval identifying the selected range of text.
  117669.     N.B. The last entry in the selection is exclusive (this is the way
  117670.     the underlying Windows controls identify an empty selection and 
  117671.     caret position with the same interval)."
  117672.     
  117673.     ^self view selectionRange!
  117674.  
  117675. selectionRange: anInterval
  117676.     "Sets anInterval to be the selected range of text.
  117677.     The last character in the interval is not included in
  117678.     the actual selection."
  117679.     
  117680.     ^self view selectionRange: anInterval
  117681. !
  117682.  
  117683. selectLine: anInteger
  117684.     "Selects the complete line of text in the receiver at
  117685.     line number, anInteger. Line 1 is the first line of
  117686.     text. A BoundsError will be generated if anInteger
  117687.     is greater than the last line number in the receiver."
  117688.  
  117689.     ^self view selectLine: anInteger!
  117690.  
  117691. showError: aCompilerError offset: anInteger
  117692.     self errorModel value isNil ifTrue: [aCompilerError beep].
  117693.     self errorModel value: aCompilerError.
  117694.     self selectionRange: aCompilerError range + anInteger!
  117695.  
  117696. showErrors: aSequenceableCollection
  117697.     "Inform the receiver that the compilation which had the receiver
  117698.     as the notifier for any errors has not ceased. Highlight any
  117699.     errors that occurred."
  117700.  
  117701.     | errors |
  117702.     errors := self errorModel.
  117703.     errors notNil 
  117704.         ifTrue: 
  117705.             [aSequenceableCollection isEmpty 
  117706.                 ifTrue: [self clearErrors]
  117707.                 ifFalse: 
  117708.                     [| first |
  117709.                     first := aSequenceableCollection 
  117710.                                 detect: [:each | each severityClass == Error]
  117711.                                 ifNone: [aSequenceableCollection first].
  117712.                     self showError: first offset: 0]]!
  117713.  
  117714. showFirstError: anInteger
  117715.     "Private - Display the first error, or warning, in the receiver's compilation errors collection,
  117716.     which contains errors collected on the last compilation or evaluation. Answer
  117717.     whether there are any errors."
  117718.  
  117719.     | errors |
  117720.     errors := self errorModel.
  117721.     errors notNil 
  117722.         ifTrue: 
  117723.             [compilationErrors isEmpty 
  117724.                 ifTrue: [errors value: nil]
  117725.                 ifFalse: 
  117726.                     [| first |
  117727.                     first := compilationErrors detect: [:each | each severityClass == Error]
  117728.                                 ifNone: [compilationErrors first].
  117729.                     self showError: first offset: anInteger]].
  117730.     ^compilationErrors notEmpty!
  117731.  
  117732. showResult: anObject at: caretPos
  117733.     "Private - Show the result of an evaluation."
  117734.  
  117735.     | result selStart |
  117736.     self isOpen ifFalse: [^self].
  117737.  
  117738.     result := anObject printString.
  117739.  
  117740.     self view
  117741.         caretPosition: caretPos;
  117742.         resetCharFormat.
  117743.     selStart := caretPos.
  117744.     self replaceSelection: result.
  117745.     self selectionRange: (selStart to: selStart + result size-1)!
  117746.  
  117747. snatchAbbreviation
  117748.     | key text |
  117749.     (text := self selection) isNil ifTrue: [^self].
  117750.     ((key := Prompter prompt: 'Desired abbreviation for this text?') notNil 
  117751.         and: [key notEmpty]) 
  117752.             ifTrue: 
  117753.                 [(key occurrencesOf: $:) > 0 
  117754.                     ifTrue: [^MessageBox warning: 'Do not enter an abbreviation containing a colon.'].
  117755.                 self class abbreviations at: key put: text]!
  117756.  
  117757. syntaxColorOfExpression: aString 
  117758.     | context |
  117759.     context := self evaluationContext.
  117760.     ^context class compilerClass 
  117761.         syntaxColorOfExpression: aString
  117762.         in: context class
  117763.         evaluationPools: self allPools!
  117764.  
  117765. systemModel
  117766.     "Private - Answer the development system model."
  117767.  
  117768.     ^Smalltalk developmentSystem!
  117769.  
  117770. text
  117771.     "Answer the receiver's text contents (may be plain or rich text
  117772.     depending on the connected view). Access to source code in the
  117773.     receiver is best achieved by sending #plainText."
  117774.  
  117775.     ^self view text!
  117776.  
  117777. text: aString
  117778.     "Set the text in the receiver to aString"
  117779.  
  117780.     ^self view resetCharFormat; text: aString!
  117781.  
  117782. textLength
  117783.     "Answer the number of characters in plain text of the receiver"
  117784.  
  117785.     ^self view textLength!
  117786.  
  117787. workspacePool
  117788.     "Answer the PoolDictionary for locals used in evaluations within the receiver"
  117789.  
  117790.     ^workspacePool!
  117791.  
  117792. workspacePool: aPoolDictionaryOrNil
  117793.     "Set the PoolDictionary for locals used in evaluations within the receiver"
  117794.     
  117795.     workspacePool := aPoolDictionaryOrNil! !
  117796.  
  117797. ValuePresenter comment:
  117798. 'ValuePresenter is a <valuePresenter>s that presents the contents of a <valueModel> within a <valueView>.
  117799.  
  117800. When designing a <presenter> it is necessary to make an initial decision as to how its model data should be displayed and edited. If the model is a mutable object, in that it is legal (and sensible) to modify it in place, then it is usual to treat it as a simple <presenter> and create a class descended directly from Presenter itself. If, on the other hand, the model is to be immutable then the presenter should be implemented as a <valuePresenter>. If the identity of the underlying model data must remain unchanged then use a standard <presenter>. If this is not the case then a <valuePresenter> will be more suitable.
  117801.  
  117802. In many cases a <valuePresenter> will be implemented as a subclass of ValuePresenter. However, this is not essential and instances of ValuePresenter can be created and use directly.
  117803.  
  117804. '!
  117805. !ValuePresenter class methodsFor!
  117806.  
  117807. defaultModel
  117808.     "Answer a default model to be assigned to the receiver when it
  117809.     is initialized."
  117810.  
  117811.     ^nil asValue
  117812. !
  117813.  
  117814. icon
  117815.     "Answers an Icon that can be used to represent this class"
  117816.  
  117817.     ^##(self) defaultIcon!
  117818.  
  117819. publishedEventsOfInstances
  117820.         "Answer a Set of Symbols that describe the published events triggered
  117821.         by instances of the receiver."
  117822.     
  117823.         ^super publishedEventsOfInstances
  117824.             add: #valueChanged;
  117825.             yourself.
  117826.     ! !
  117827.  
  117828. !ValuePresenter methodsFor!
  117829.  
  117830. findDetails
  117831.     "Required so can be used with a TextEdit view."
  117832.  
  117833.     ^nil!
  117834.  
  117835. model: anObject
  117836.     "Set the model of the receiver to be a value model on anObject. Usually anObject is expected
  117837.     to be a ValueModel itself. If not, it is automatically wrapped in a valueHolder. 
  117838.     Register with it's #valueChanged event"
  117839.  
  117840.     | valueModel |
  117841.     valueModel := anObject asValue.
  117842.     super model: valueModel.
  117843.     valueModel when: #valueChanged send: #onValueChanged to: self!
  117844.  
  117845. onValueChanged
  117846.     "The value held by the receiver's model has changed.
  117847.     The default is to trigger a #valueChanged event off the receiver"
  117848.  
  117849.     self trigger: #valueChanged!
  117850.  
  117851. setValue: anObject
  117852.     "Private - Set the model data of the receiver to be anObject but without propagating
  117853.     any change triggers"
  117854.  
  117855.     self model setValue: anObject.
  117856. !
  117857.  
  117858. value
  117859.     "Answer the model value of the receiver. 
  117860.     Any view changes may first need to be flushed"
  117861.  
  117862.     self view notNil ifTrue: [ self view updateModel ].
  117863.     ^self model value!
  117864.  
  117865. value: anObject
  117866.     "Set the model value of the receiver to be anObject"
  117867.  
  117868.     self model value: anObject.
  117869. ! !
  117870.  
  117871. ClassDiagramPlugin comment:
  117872. 'ClassDiagramPlugin is a simple example of a <classBrowserPlugin> that renders the hierarchy below the browser''s currently selected class in a moen tree diagram. Although the time taken to perform this rendition is not significant, for illustrative purposes, we have chosen to defer the building of the class diagram until the plug-in''s card is selected in the browser.
  117873.  
  117874. Instance Variables:
  117875.     classesPresenter        <ClassHierarchySelector> used to show the class hierarchy diagram
  117876.  
  117877. '!
  117878. !ClassDiagramPlugin methodsFor!
  117879.  
  117880. buildClassDiagram
  117881.     "Private - Create the diagram for the browser's currently selected class"
  117882.  
  117883.     Cursor wait showWhile: 
  117884.             [| classModel instClass showAllClasses |
  117885.             instClass := self browser actualClass 
  117886.                         ifNotNil: [:actualClass | actualClass instanceClass].
  117887.             classModel := ClassHierarchyModel withAllClasses.
  117888.             showAllClasses := instClass isNil or: [instClass == Object].
  117889.             showAllClasses 
  117890.                 ifFalse: 
  117891.                     [classModel filter: 
  117892.                             [:x | 
  117893.                             (instClass allSuperclasses includes: x) or: [instClass withAllSubclasses includes: x]]].
  117894.             classesPresenter model: classModel.
  117895.             classesPresenter selectionOrNil: instClass.
  117896.  
  117897.             "Don't expand Object since it just wastes times"
  117898.             showAllClasses ifFalse: [classesPresenter expandAll: nil]]!
  117899.  
  117900. createComponents
  117901.     "Create the presenters contained by the receiver"
  117902.  
  117903.     super createComponents.
  117904.     classesPresenter := self add: ClassHierarchySelector new name: 'classes'.
  117905. !
  117906.  
  117907. createSchematicWiring
  117908.     "Create the trigger wiring for the receiver"
  117909.  
  117910.     super createSchematicWiring.
  117911.     classesPresenter when: #selectionChanged send: #onClassSelected to: self.
  117912.     self model when: #classSelected send: #onBrowserClassSelected to: self
  117913. !
  117914.  
  117915. displayOn: aStream
  117916.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  117917.     would want to see it. This will be used as the label for the tab when the receiver is being displayed
  117918.     as a plugin within the Class Browser"
  117919.  
  117920.     aStream nextPutAll: 'Class Diagram'!
  117921.  
  117922. onBrowserClassSelected
  117923.     "Event handler for a class being selected within the receiver's associated browser. "
  117924.  
  117925.     "For efficiency we only build the diagram if we are the current card"
  117926.  
  117927.     self isCurrentCard ifTrue: [self buildClassDiagram]!
  117928.  
  117929. onClassSelected
  117930.     "Event handler for a class being selected within the receiver's diagram. 
  117931.     Pass the class selection on to the browser"
  117932.  
  117933.     | classRequired |
  117934.     classRequired := classesPresenter selectionOrNil.
  117935.     classRequired notNil 
  117936.         ifTrue: [self browser isInstanceMode ifFalse: [classRequired := classRequired class]].
  117937.     self browser actualClass: classRequired!
  117938.  
  117939. onShownInBrowser
  117940.     "Event handler indicating that the receiver has been displayed within it's browser. "
  117941.  
  117942.     "For efficiency we defer the creation of the diagram until the receiver becomes the current card"
  117943.  
  117944.     self buildClassDiagram! !
  117945.  
  117946. ClassSelector comment:
  117947. 'A ClassSelector is an abstract class used to implement the common behaviour for selecting a class from the Smalltalk class hierarchy. It also provides the ability to source and sink drag and drop operations. Dropping a class object onto another class in the tree will change the superclass of the dropped class. A drop of a <CompiledMethod> will copy or move the method to the class under the drop, maintaining its existing method categories. Class objects may also be dragged from a ClassHierarchySelector in a variety of formats: as <Class> objects, as <String> definitions, or as a chunk format definitions.
  117948.  
  117949. Note that a ClassSelector maintains whether it is in ''''class'''' (actually metaclass) or ''''instance'''' mode. A number of commands and operations supported by the receiver can be applied to either <Metaclass> or <Class> objects, and which is operated on is determined by the selection and the mode. See #actualClass and its references.
  117950.  
  117951. Instance Variables:
  117952.     flags        <integer>. Various flags.
  117953.  
  117954. Class Variables:
  117955.     ClassModeMask    <integer>. Masks flags inst. var. to determine if in class mode.'!
  117956. !ClassSelector class methodsFor!
  117957.  
  117958. initialize
  117959.     "Private - Initialize the receiver's class variables.
  117960.         self initialize
  117961.     "
  117962.  
  117963.     ClassModeMask := 1! !
  117964.  
  117965. !ClassSelector methodsFor!
  117966.  
  117967. actualClass
  117968.     "Answer the actual class selected in the receiver after taking account
  117969.     of instance or class mode. Answer nil if there is no class selected."
  117970.  
  117971.     | selectedClass |
  117972.     selectedClass := self selectionOrNil.
  117973.     ^selectedClass isNil ifFalse: [
  117974.         self isInstanceMode
  117975.             ifTrue: [selectedClass]
  117976.             ifFalse: [selectedClass class]]!
  117977.  
  117978. actualClass: class
  117979.     "Sets the actual class selected and determines the current mode"
  117980.  
  117981.     ^self actualClass: class ifAbsent: [
  117982.             MessageBox new
  117983.                 owner: self view;
  117984.                 errorMsg: class name, ' is not available for browsing'].!
  117985.  
  117986. actualClass: aClass ifAbsent: exceptionHandler
  117987.     "Sets the actual class selected and determines the current mode."
  117988.  
  117989.     | class |
  117990.     aClass isNil ifTrue: [^self resetSelection].
  117991.     class := aClass instanceClass.
  117992.     self isInstanceMode: class == aClass.
  117993.     self selection: class ifAbsent: exceptionHandler!
  117994.  
  117995. browseChangedMethods
  117996.     "Browse the changed methods in the selected classes"
  117997.  
  117998.     self systemModel 
  117999.         browseChangedMethodsInClasses: (Array with: self selection)!
  118000.  
  118001. browseClass
  118002.     self selection browse!
  118003.  
  118004. browseClassPackage
  118005.     "Open a package browser on the selected class' package."
  118006.     
  118007.     | pkg |
  118008.     pkg := self selection owningPackage.
  118009.     pkg isNil
  118010.         ifTrue: [self systemModel browsePackages]
  118011.         ifFalse: [pkg browse]!
  118012.  
  118013. browseClassReferences
  118014.     "Browse all the methods which refer to the class selected in
  118015.     the receiver."
  118016.  
  118017.     self systemModel browseClassReferences: self selection!
  118018.  
  118019. browseClassVariables
  118020.     "Browse one of the class variables of the selected class."
  118021.  
  118022.     self systemModel browseClassVariables: self selection!
  118023.  
  118024. browseHierarchy
  118025.     "Open a new class hierarchy browser on the hierarchy at the same point as the receiver."
  118026.  
  118027.     self systemModel browseHierarchy: self actualClass
  118028. !
  118029.  
  118030. browseInstanceVariableReaders
  118031.     "Browse methods in the selected class and its subclasses that read one of its variables."
  118032.  
  118033.     self systemModel browseInstanceVariableReaders: self actualClass!
  118034.  
  118035. browseInstanceVariables
  118036.     "Browse methods in the selected class and its subclasses that reference one of its variables."
  118037.  
  118038.     self systemModel browseInstanceVariables: self actualClass!
  118039.  
  118040. browseInstanceVariableWriters
  118041.     "Browse methods in the selected class and its subclasses that read one of its variables."
  118042.  
  118043.     self systemModel browseInstanceVariableWriters: self actualClass!
  118044.  
  118045. browseIt
  118046.     "Browse the selected item in the pane with focus."
  118047.  
  118048.     self perform: self browseItCommand!
  118049.  
  118050. browseItCommand
  118051.     "Private - Answer the command that the context-sensitive 'Browse-It' command would be linked
  118052.     to if sent to the receiver at this moment."
  118053.  
  118054.     classesPresenter hasFocus ifTrue: [^#browseClass].
  118055.     ^nil!
  118056.  
  118057. browsePackages
  118058.     "Implement the context-sensitive browse packages command by browsing to the currently
  118059.     selected class' package."
  118060.     
  118061.     self browseClassPackage!
  118062.  
  118063. browsePublishedAspects
  118064.     "Browse the published aspects for the current class. Copy the choice (if any) to the clipboard."
  118065.  
  118066.     | class pubs choice |
  118067.     class := self selection.
  118068.     pubs  := class publishedAspectsOfInstances.
  118069.     pubs isEmpty ifTrue: [^MessageBox notify: class displayString, ' does not publish any aspects.'].
  118070.     choice := ChoicePrompter choices: pubs asSortedCollection caption: class name, ' published aspects'.
  118071.     choice notNil ifTrue: [choice name copyToClipboard].
  118072.     ^choice!
  118073.  
  118074. browsePublishedEvents
  118075.     "Browse the published events that can be triggered by instances of the current class.
  118076.     Copy the chosen symbolic event name (if any) to the clipboard."
  118077.  
  118078.  
  118079.     | pubEvents choice class name |
  118080.     class := self selection.
  118081.     pubEvents := class publishedEventsOfInstances asSortedCollection.
  118082.     name := class name.
  118083.     pubEvents isEmpty ifTrue: [^MessageBox notify: name, ' does not publish any events.'].
  118084.     choice := ChoicePrompter choices: pubEvents caption: name, ' published events'.
  118085.     choice notNil ifTrue: [choice printString copyToClipboard].
  118086.     ^choice
  118087. !
  118088.  
  118089. browseReferences
  118090.     "Context-sensitive browse references command (Shift+F12)."
  118091.  
  118092.     self browseClassReferences!
  118093.  
  118094. browseTests
  118095.     "Open an SUnit Test Browser on the selected Test Case."
  118096.  
  118097.     self testBrowserClass sunitbShow: self selection!
  118098.  
  118099. buildAllVariablesMenu: aMenu instVarSelectors: instVarSelectors classVarSelectors: classVarSelectors
  118100.     "Private - Build a dynamic pull-out menu which lists all of a class' existing 
  118101.     instance and class variable names so that one or other can be removed, renamed, 
  118102.     etc."
  118103.  
  118104.     | class instVars classVars |
  118105.     aMenu clear.
  118106.     class := self actualClass.
  118107.     instVars := OrderedCollection new.
  118108.     class withAllSuperclassesDo: 
  118109.             [:eachClass | 
  118110.             eachClass instVarNames do: [:each | instVars add: eachClass -> each]].
  118111.     instVars size > self maximumVariableMenuEntries 
  118112.         ifTrue: 
  118113.             [aMenu addCommand: instVarSelectors last
  118114.                 description: '&Instance Variable...']
  118115.         ifFalse: 
  118116.             [self 
  118117.                 populateVarMenu: aMenu
  118118.                 class: class
  118119.                 command: instVarSelectors first
  118120.                 variables: instVars
  118121.                 format: '%1.%2'].
  118122.     class := class instanceClass.
  118123.     classVars := OrderedCollection new.
  118124.     class withAllSuperclassesDo: 
  118125.             [:eachClass | 
  118126.             eachClass classVarNames do: [:each | classVars add: eachClass -> each]].
  118127.     (aMenu isEmpty not and: [classVars notEmpty]) ifTrue: [aMenu addSeparator].
  118128.     classVars size > self maximumVariableMenuEntries 
  118129.         ifTrue: 
  118130.             [aMenu addCommand: classVarSelectors last description: '&Class Variable...']
  118131.         ifFalse: 
  118132.             [self 
  118133.                 populateVarMenu: aMenu
  118134.                 class: class
  118135.                 command: classVarSelectors first
  118136.                 variables: classVars
  118137.                 format: '%1.%2']!
  118138.  
  118139. buildViewsMenu: aMenu command: selector 
  118140.     "Private - Build a dynamic pull-out menu with all views of the current selection
  118141.     as the choices."
  118142.  
  118143.     | class |
  118144.     aMenu clear.
  118145.     class := self selection.
  118146.     (self systemModel viewResourcesForClass: class) keys asSortedCollection do: 
  118147.             [:viewName | 
  118148.             | msg |
  118149.             msg := MessageSend 
  118150.                         receiver: self
  118151.                         selector: selector
  118152.                         argument: viewName.
  118153.             aMenu addCommand: msg description: viewName.
  118154.             class defaultView = viewName ifTrue: [aMenu setDefault: aMenu items size]]!
  118155.  
  118156. canRefactor
  118157.     ^self systemModel canRefactor!
  118158.  
  118159. categorizeClass
  118160.     "Invokes a dialog to categorize the current class"
  118161.  
  118162.     | chosenCategories aClass originalCategories categories |
  118163.     aClass := self selection.
  118164.     originalCategories := aClass categories.
  118165.     categories := aClass classCategoryClass allClassCategories asSortedCollection.
  118166.  
  118167.     chosenCategories := (ChoicePrompter 
  118168.                         create: 'Extensible multi-selection choice prompter'
  118169.                         on: originalCategories
  118170.                         multipleChoices: categories
  118171.                         caption: 'Categorize ', aClass name)
  118172.                     newBlock: [:aString | Object classCategoryClass name: aString];
  118173.                     showModal.
  118174.  
  118175.     (chosenCategories notNil and: [(chosenCategories symmetricDifference: originalCategories) notEmpty]) 
  118176.         ifTrue: [aClass categories: chosenCategories]!
  118177.  
  118178. chooseVariables: aBoolean caption: aString
  118179.     "Note that this is deliberately _not_ part of the 'Dolphin Refactoring Browse' package"
  118180.  
  118181.     | varNames class |
  118182.     varNames := (aBoolean 
  118183.                 ifTrue: 
  118184.                     [class := self selection.
  118185.                     class classVarNames]
  118186.                 ifFalse: 
  118187.                     [class := self actualClass.
  118188.                     class instVarNames]) 
  118189.                     asSortedCollection.
  118190.     varNames := ChoicePrompter 
  118191.                 multipleChoices: varNames
  118192.                 caption: aString.
  118193.     ^varNames isNil ifFalse: [varNames collect: [:each | class -> each]]!
  118194.  
  118195. classesPresenter
  118196.     ^classesPresenter!
  118197.  
  118198. classPackage
  118199.     "Prompt for the user to repackage the selected class."
  118200.  
  118201.     | class newPkg oldPkg |
  118202.     class := self selection.
  118203.     oldPkg := class owningPackage.
  118204.     newPkg := PackagePrompter 
  118205.                 showModalOn: oldPkg asValue
  118206.                 caption: 'Package of ' , class name , '...'
  118207.                 default: nil.
  118208.     (newPkg isNil or: [newPkg = oldPkg]) 
  118209.         ifFalse: [self queryMoveClass: class toPackage: newPkg]!
  118210.  
  118211. clearSelection
  118212.     "Private - Remove the selected object from the system"
  118213.  
  118214.     self perform: self deleteItCommand!
  118215.  
  118216. createInstanceVariableAccessors
  118217.     "Prompt to generate compiled 'get' and 'set' accessor methods for each of the immediate
  118218.     instance variables of the current class that are not currently endowed with both."
  118219.  
  118220.     self createVariableAccessors: false!
  118221.  
  118222. createSchematicWiring
  118223.     "Create the trigger wiring for the receiver"
  118224.  
  118225.     super createSchematicWiring.
  118226.     (self selectableItems)
  118227.         when: #selectionChanged
  118228.             send: #onSelectionChanged
  118229.             to: self;
  118230.         when: #selectionChanging:
  118231.             send: #onSelectionChanging:
  118232.             to: self;
  118233.         when: #actionPerformed
  118234.             send: #onActionPerformed
  118235.             to: self;
  118236.         when: #labelOf:editedTo:accept:
  118237.             send: #onClass:renameTo:accept:
  118238.             to: self;
  118239.         when: #drag:
  118240.             send: #onDrag:
  118241.             to: self;
  118242.         when: #drop:
  118243.             send: #onDropOver:
  118244.             to: self;
  118245.         when: #dragEnter:
  118246.             send: #onDragOver:
  118247.             to: self;
  118248.         when: #dragOver:
  118249.             send: #onDragOver:
  118250.             to: self
  118251.  
  118252.     "when: #dragCut: send: #onClassCut: to: self;"    "Nothing to do"!
  118253.  
  118254. createVariableAccessors: aBoolean 
  118255.     (self chooseVariables: aBoolean caption: 'Create Accessors for...') 
  118256.         ifNotNil: 
  118257.             [:varNames | 
  118258.             self systemModel createVariableAccessors: varNames classVariables: aBoolean]!
  118259.  
  118260. deleteClassHierarchy
  118261.     "Private - Removes the selected class and any subclasses from the system, 
  118262.     regardless of whether it is referenced from any methods.
  118263.     Note: This is a general menu command available whenever a class is selected,
  118264.     not just when the class hierarchy presenter has focus."
  118265.  
  118266.     self permitSelectionChange 
  118267.         ifTrue: [self systemModel deleteClassHierarchy: self selection]!
  118268.  
  118269. deleteItCommand
  118270.     classesPresenter hasFocus ifTrue: [^#deleteClassHierarchy].
  118271.     ^nil!
  118272.  
  118273. dropClass: aSourceClass onto: aTargetClass 
  118274.     "Private - Handle the drop of aSourceClass on aTargetClass in the receiver"
  118275.  
  118276.     (aSourceClass ~~ aTargetClass and: [aSourceClass superclass ~~ aTargetClass]) 
  118277.         ifTrue: 
  118278.             [(MessageBox 
  118279.                 confirm: ('Move class %1 to be subclass of %2?' formatWith: aSourceClass displayString
  118280.                         with: aTargetClass displayString)) 
  118281.                     ifTrue: 
  118282.                         [| code |
  118283.                         code := 'ClassBuilder moveClass: ' , aSourceClass name , ' toSuperclass: ' 
  118284.                                     , aTargetClass name.
  118285.                         Compiler evaluate: code logged: true]]!
  118286.  
  118287. dropMethod: aCompiledMethod onto: targetClass
  118288.     "Private - Handle the drop of  the <CompiledMethod> on to the class,
  118289.     targetClass, in the receiver."
  118290.  
  118291.     targetClass == aCompiledMethod methodClass ifTrue: [^aCompiledMethod].
  118292.     (targetClass includesSelector: aCompiledMethod selector)
  118293.         ifTrue: 
  118294.             [(MessageBox 
  118295.                 confirm: ('The selector #%1 already exists in %2%n%nDo you wish to overwrite it?' 
  118296.                         formatWith: aCompiledMethod selector
  118297.                         with: targetClass name)) 
  118298.                     ifFalse: [^nil]].
  118299.     ^targetClass copy: aCompiledMethod selector from: aCompiledMethod methodClass!
  118300.  
  118301. editView: viewName
  118302.     "Open the ViewComposer on an existing view resource belonging to the
  118303.     selected class of the specified name."
  118304.  
  118305.     self systemModel 
  118306.         openViewComposerOn: (ResourceIdentifier class: self selection name: viewName)!
  118307.  
  118308. errorInSomeCompilation
  118309.     "Private - One or more methods have not compiled successfully after a drop.
  118310.     Inform the user. Answer false"
  118311.  
  118312.     MessageBox errorMsg: 
  118313. 'One or more methods did not recompile successfully
  118314. Check Transcript for details
  118315. Drop operation did not complete.'.
  118316.     ^false.!
  118317.  
  118318. fileInClass
  118319.     "Files in the selected class via the package that owns it"
  118320.  
  118321.     self systemModel classFileIn: self selection!
  118322.  
  118323. fileOutClass
  118324.     "Files out the selected class via the package that owns it"
  118325.  
  118326.     self systemModel classFileOut: self selection
  118327. !
  118328.  
  118329. initialize
  118330.     "Private - Initialize the receiver"
  118331.  
  118332.     super initialize.
  118333.     flags := 0!
  118334.  
  118335. inspectIt
  118336.     "Open an inspector on the currently selected class."
  118337.  
  118338.     self selection inspect!
  118339.  
  118340. isInstanceMode
  118341.     "Answer whether the receiver is in instance mode."
  118342.  
  118343.     ^flags noMask: ClassModeMask!
  118344.  
  118345. isInstanceMode: aBoolean
  118346.     "Set whether the receiver is in instance mode.
  118347.     When in instance mode the receiver displays and operates on classes,
  118348.     when in class mode it displays and operates on metaclasses. This may or
  118349.     may not make any visual difference, but it affects the operation of certain
  118350.     commands."
  118351.  
  118352.     self isInstanceMode == aBoolean 
  118353.         ifFalse: 
  118354.             [flags := flags mask: ClassModeMask set: aBoolean not.
  118355.             self trigger: #modeChanged]!
  118356.  
  118357. maximumVariableMenuEntries
  118358.     "The maximum number of variables that should be listed in the variable refactoring menus
  118359.     before switching over to the use of a <ChoicePrompter>."
  118360.  
  118361.     ^20!
  118362.  
  118363. model: aClassHierarchyModel 
  118364.     "Connects the receiver to aClassHierarchyModel."
  118365.  
  118366.     super model: aClassHierarchyModel.
  118367.     classesPresenter model: aClassHierarchyModel!
  118368.  
  118369. newClass
  118370.     "Create a new subclass of the selected class (or a subclass of nil if no class is actually selected)."
  118371.  
  118372.     | aClass package |
  118373.     aClass := self selectionOrNil.
  118374.     package := aClass isNil ifFalse: [aClass owningPackage].
  118375.     (self systemModel createSubclassOf: aClass inPackage: package) 
  118376.         ifNotNil: [:newClass | self actualClass: newClass]!
  118377.  
  118378. newView
  118379.     "Open the ViewComposer on an new default view resource for the
  118380.     selected class. If there are several possibilities allow the user to select
  118381.     the one to edit"
  118382.  
  118383.     self systemModel openViewComposerOnNewViewFor: self selection
  118384.     !
  118385.  
  118386. onAboutToDisplayMenu: aMenu
  118387.     "The pop-up <Menu>, popup, is about to be displayed.
  118388.     This is our opportunity to update it, e.g. to add/remove items."
  118389.  
  118390.     | menuName |
  118391.     super onAboutToDisplayMenu: aMenu.
  118392.     menuName := aMenu name.
  118393.     menuName == #viewsEditMenu 
  118394.         ifTrue: [^self buildViewsMenu: aMenu command: #editView:].
  118395.     menuName == #viewsShowMenu 
  118396.         ifTrue: [^self buildViewsMenu: aMenu command: #showPresenter:].
  118397.     menuName == #browseVariableRefsMenu 
  118398.         ifTrue: 
  118399.             [^self 
  118400.                 buildAllVariablesMenu: aMenu
  118401.                 instVarSelectors: #(#browseReferencesToInstVar:inLocalHierarchyOf: #browseInstanceVariables)
  118402.                 classVarSelectors: #(#browseReferencesToClassVar:inLocalHierarchyOf: #browseClassVariables)].
  118403.     menuName == #browseVariableReadersMenu 
  118404.         ifTrue: 
  118405.             [^self 
  118406.                 buildAllVariablesMenu: aMenu
  118407.                 instVarSelectors: #(#browseReadersOfInstVar:inLocalHierarchyOf: #browseInstanceVariableReaders)
  118408.                 classVarSelectors: #(#browseReadersOfClassVar:inLocalHierarchyOf: #browseClassVariableReaders)].
  118409.     menuName == #browseVariableWritersMenu 
  118410.         ifTrue: 
  118411.             [^self 
  118412.                 buildAllVariablesMenu: aMenu
  118413.                 instVarSelectors: #(#browseWritersOfInstVar:inLocalHierarchyOf: #browseInstanceVariableWriters)
  118414.                 classVarSelectors: #(#browseWritersOfClassVar:inLocalHierarchyOf: #browseClassVariableWriters)].
  118415.     self canRefactor ifTrue: [^self populateRefactoringMenu: aMenu]!
  118416.  
  118417. onClass: aClass renamedTo: text
  118418.     "The class, aClass, has been renamed by the user to, text, by editing the label
  118419.     in the classes presenter and subsequently confirmed. Ask the receiver's
  118420.     model to actually rename the class, converting any exception raised to a
  118421.     friendlier message box."
  118422.  
  118423.     [Cursor wait showWhile: [self systemModel renameClass: aClass to: text]] 
  118424.         on: Error
  118425.         do: [:e | e okCancel]!
  118426.  
  118427. onClass: aClass renameTo: text accept: booleanValue
  118428.     "The user has initiated a rename of the class, aClass, by editing the label
  118429.     in the class tree. Ask the user to confirm the action, and if so queue a deferred 
  118430.     action to perform the actual rename. 
  118431.  
  118432.     Implementation Notes: A deferred action is queued, rather than performing
  118433.     the rename directly, because we need to delete and re-add the class to the tree view
  118434.     in order that it appears in the correct position. If we deleted the tree view item while 
  118435.     responding to this notification about it (it originates from a TVN_ENDLABELEDIT)
  118436.     then we would be rather pulling the rug from under the treeview's feet, since it 
  118437.     needs to refer to the item to complete its actions.
  118438.     We don't set the booleanValue holder to true, because the rename may not work.
  118439.     We intend that the current in-place label editing implementation will be modified in a future
  118440.     version to support 3 events, namely:
  118441.         aboutToChange (can refuse request)
  118442.         changing    (can refuse change)
  118443.         changed (too late, its changed)"
  118444.  
  118445.     text isEmpty ifTrue: [booleanValue value: false. ^self].
  118446.     (MessageBox confirm: ('Are you sure you would like to rename %1 to %2?' 
  118447.                     formatWith: aClass name with: text))
  118448.         ifTrue: [
  118449.             "Queue deferred action as we can't delete the old item now while still in use (causes GPF in TreeView)"
  118450.             SessionManager inputState queueDeferredAction: [self onClass: aClass renamedTo: text]]!
  118451.  
  118452. onDrag: session
  118453.     "Private - A class drag has been started. Populate the <DragDropSession>, 
  118454.     session, with the objects to be dragged."
  118455.  
  118456.     | dragDropObject dragClass |
  118457.     dragClass := session suggestedSource.
  118458.     dragDropObject := session newDragObject: dragClass.
  118459.     dragDropObject
  118460.         format: #Class data: dragClass;
  118461.         format: #String data: dragClass definition;
  118462.         format: #Chunk data: dragClass definitionChunk.
  118463.     session dragObjects: (OrderedCollection with: dragDropObject)!
  118464.  
  118465. onDragOver: session
  118466.     "Private - The user is dragging over the class hierarchy pane.
  118467.     Set the operation of the <DragDropSession>, session,
  118468.     that would occur if a drop took place now of the objects in that session."
  118469.  
  118470.     "Default the operation to nil to signal that we don't want the drop"
  118471.  
  118472.     | dropClass |
  118473.     session operation: nil.
  118474.     session isTargetSameAsSource ifTrue: [^self].
  118475.     dropClass := session suggestedTarget.
  118476.     dropClass isNil ifTrue: [^self].
  118477.     "Note that we don't want to permit a drop of a class' own methods over itself, as if a move they'll get deleted"
  118478.     (session dragObjects allSatisfy: 
  118479.             [:each | 
  118480.             (each isFormatAvailable: #CompiledMethod) 
  118481.                 and: [(each format: #CompiledMethod) methodClass instanceClass ~~ dropClass]]) 
  118482.         ifTrue: 
  118483.             [session operation: session intendedOperation.
  118484.             ^self].
  118485.     (session isFormatAvailable: #Class) 
  118486.         ifTrue: 
  118487.             [session operation: #move.
  118488.             ^self].
  118489.     (session isFormatAvailable: #MethodProtocol) 
  118490.         ifTrue: 
  118491.             [session operation: #copy.
  118492.             ^self]!
  118493.  
  118494. onDropOver: session
  118495.     "Private - The drag operation described by the <DragDropSession>, session, would like 
  118496.     to do a drop over the receiver's class pane. 
  118497.     Implementation Note: If the drop fails then we must set the operation to nil in order that 
  118498.     the DD session can detect the failure (as this is an event handler the return value is ignored)."
  118499.  
  118500.     | dropClass compileError |
  118501.  
  118502.     dropClass := session suggestedTarget.
  118503.     dropClass isNil ifTrue: [ Sound errorBeep. session operation: nil. ^self].
  118504.  
  118505.     compileError := false.
  118506.     session dragObjects do: [:each | 
  118507.         [
  118508.             "See if the drop is a CompiledMethod"
  118509.             (each isFormatAvailable: #CompiledMethod) ifTrue: [ | targetClass method |
  118510.                 method := each format: #CompiledMethod.
  118511.                 targetClass := method isClassMethod ifTrue: [dropClass class] ifFalse: [dropClass].
  118512.                 (self dropMethod: method onto: targetClass) isNil ifTrue: [
  118513.                     "The drop operation failed (probably due to a duplicate method)"
  118514.                     session operation: nil.
  118515.                     ^self ]].
  118516.  
  118517.             "See if the drop is a Class"
  118518.             (each isFormatAvailable: #Class) ifTrue: [  | class |
  118519.                 class := each format: #Class.
  118520.                 self dropClass: class onto: dropClass].
  118521.             
  118522.             (each isFormatAvailable: #MethodProtocol) ifTrue: [
  118523.                 self systemModel addClass: dropClass toProtocol: (each format: #MethodProtocol)]
  118524.  
  118525.         ] on: Error do: [:e | 
  118526.             MessageBox errorMsg: e description. 
  118527.             session operation: nil.
  118528.             ^self]
  118529.           on: MethodCompileFailed do: [:n | 
  118530.             compileError := true. 
  118531.             n resumeWithStubMethod]].
  118532.  
  118533.     compileError ifTrue: [^self errorInSomeCompilation].!
  118534.  
  118535. onSelectionChanged
  118536.     "Sent by #onSelChange when the receiver's selection has changed.
  118537.     The default is to trigger an #selectionChanged event off the presenter"
  118538.  
  118539.     self trigger: #selectionChanged.
  118540. !
  118541.  
  118542. onSelectionChanging: aSelectionChangingEvent
  118543.     "Handler to indicate that the receiver's selection is about to change.
  118544.     To prevent the proposed change under certain circumstances a handler
  118545.     can set the value of aValueHolder to false."
  118546.  
  118547.     self trigger: #selectionChanging: with: aSelectionChangingEvent!
  118548.  
  118549. onTipTextRequired: tool
  118550.     "Tool tip text is required for the <ToolbarItem>, tool."
  118551.  
  118552.     | cmd |
  118553.     cmd := tool command asSymbol.
  118554.     cmd == #clearSelection ifTrue: [^'Delete class ' , self selection name].
  118555.     cmd == #browseHierarchy ifTrue: [^'Open Hierarchy Browser on ' , self actualClass name].
  118556.     cmd == #browseSystem ifTrue: [^'Open System Browser on ' , self actualClass name].
  118557.     ^super onTipTextRequired: tool!
  118558.  
  118559. permitSelectionChange
  118560.     | proceed |
  118561.     proceed := SelectionChangingEvent forSource: self.
  118562.     self onSelectionChanging: proceed.
  118563.     ^proceed value!
  118564.  
  118565. populateVarMenu: aMenu class: class command: cmdSelector variables: aCollection format: aString
  118566.     "Private - Populate a dynamic menu with commands which send
  118567.     the selector, cmdSelector, to the development system model with
  118568.     each of the items and the <ClassDescription>, class, as its 
  118569.     arguments. The items are used as the descriptions too."
  118570.  
  118571.     aCollection do: 
  118572.             [:each | 
  118573.             | msg |
  118574.             msg := MessageSend 
  118575.                         receiver: self systemModel
  118576.                         selector: cmdSelector
  118577.                         arguments: (Array with: each value with: class).
  118578.             aMenu addCommand: msg
  118579.                 description: (aString formatWith: each key name with: each value)]!
  118580.  
  118581. queryCommand: aCommandQuery 
  118582.     "Private - Enter details about a potential command for the receiver 
  118583.     into the <CommandQuery> argument."
  118584.  
  118585.     | selector class |
  118586.     selector := aCommandQuery commandSymbol.
  118587.     class := self selectionOrNil.
  118588.     #browseIt == selector 
  118589.         ifTrue: 
  118590.             [selector := self browseItCommand.
  118591.             selector isNil 
  118592.                 ifTrue: 
  118593.                     [aCommandQuery isEnabled: false.
  118594.                     ^true]].
  118595.     #clearSelection == selector 
  118596.         ifTrue: 
  118597.             [selector := self deleteItCommand.
  118598.             selector isNil 
  118599.                 ifTrue: 
  118600.                     [aCommandQuery isEnabled: false.
  118601.                     ^true]].
  118602.     selector == #browseHierarchy 
  118603.         ifTrue: 
  118604.             [| name |
  118605.             class notNil 
  118606.                 ifTrue: 
  118607.                     [name := class name.
  118608.                     aCommandQuery
  118609.                         isDefault: true;
  118610.                         isEnabled: true]
  118611.                 ifFalse: 
  118612.                     [name := 'Class'.
  118613.                     aCommandQuery isEnabled: false].
  118614.             aCommandQuery text: (aCommandQuery commandDescription menuText formatWith: name).
  118615.             ^true].
  118616.     #browseSystem == selector 
  118617.         ifTrue: 
  118618.             [aCommandQuery isEnabled: (class notNil and: [self respondsTo: #browseSystem]).
  118619.             ^true].
  118620.     #browseClassPackage == selector 
  118621.         ifTrue: 
  118622.             [| name pkg |
  118623.             (class isNil or: [(pkg := class owningPackage) isNil]) 
  118624.                 ifTrue: 
  118625.                     [aCommandQuery isEnabled: false.
  118626.                     name := '']
  118627.                 ifFalse: 
  118628.                     [aCommandQuery isEnabled: true.
  118629.                     name := pkg name printString].
  118630.             aCommandQuery text: (aCommandQuery commandDescription menuText formatWith: name).
  118631.             ^true].
  118632.     (#(#browseClass #fileInClass #fileOutClass #checkInClass #checkOutClass #categorizeClass #clearSelection #deleteClassHierarchy #renameClass #inspectIt #browseMenu #browseHierarchy #browseReferences #browseClassReferences #browseClassVariables #browseInstanceVariables #browseAllMethods #browsePackages #classPackage #browseChangedMethods #browseVariableRefsMenu #browseVariableReadersMenu #browseVariableWritersMenu) 
  118633.         identityIncludes: selector) 
  118634.             ifTrue: 
  118635.                 [aCommandQuery isEnabled: class notNil.
  118636.                 ^true].
  118637.     #browsePublishedEvents == selector 
  118638.         ifTrue: 
  118639.             [aCommandQuery 
  118640.                 isEnabled: (class notNil and: [class respondsTo: #publishedEventsOfInstances]).
  118641.             ^true].
  118642.     #browsePublishedAspects == selector 
  118643.         ifTrue: 
  118644.             [aCommandQuery 
  118645.                 isEnabled: (class notNil and: [class respondsTo: #publishedAspectsOfInstances]).
  118646.             ^true].
  118647.     #viewsMenu == selector 
  118648.         ifTrue: 
  118649.             [aCommandQuery isEnabled: (class notNil 
  118650.                         and: [(class includesBehavior: Presenter) or: [class includesBehavior: View]]).
  118651.             ^true].
  118652.     (#(#viewsEditMenu #viewsShowMenu) identityIncludes: selector) 
  118653.         ifTrue: 
  118654.             [aCommandQuery 
  118655.                 isEnabled: (class notNil and: [(self systemModel viewResourcesForClass: class) notEmpty]).
  118656.             #viewsShowMenu == selector ifTrue: [aCommandQuery isDefault: true].
  118657.             ^true].
  118658.     (#(#browseInstanceVariables #createInstanceVariableAccessors) identityIncludes: selector) 
  118659.         ifTrue: 
  118660.             [aCommandQuery isEnabled: (class notNil and: [self actualClass instVarNames notEmpty]).
  118661.             ^true].
  118662.     #testsMenu == selector 
  118663.         ifTrue: 
  118664.             [aCommandQuery 
  118665.                 isEnabled: (self testBrowserClass notNil and: 
  118666.                             [class notNil and: 
  118667.                                     ["This odd way of testing if the selected class is a kind of TestCase is 
  118668.                                     used to avoid creating a dependency on the SUnit package, so it can 
  118669.                                 be uninstalled if desired."
  118670.  
  118671.                                     class allSuperclasses anySatisfy: [:each | each name = #TestCase]]]).
  118672.             ^true].
  118673.     (self canRefactor and: [self queryRefactoringCommand: aCommandQuery]) ifTrue: [^true].
  118674.     ^super queryCommand: aCommandQuery!
  118675.  
  118676. queryMoveClass: aClass toPackage: package 
  118677.     "Private - Move aClass from its existing package to the receivers current package if
  118678.     the user agrees."
  118679.  
  118680.     | classPackage response packMan subclasses |
  118681.     packMan := self systemModel packageManager.
  118682.     classPackage := packMan packageOfClass: aClass.
  118683.     subclasses := (aClass allSubclasses collect: [:s | s -> (packMan packageOfClass: s)]) 
  118684.                 select: [:a | a value isNil or: [a value == classPackage]].
  118685.     classPackage isNil 
  118686.         ifTrue: [response := #yes    "Move all subclasses without package too"]
  118687.         ifFalse: 
  118688.             [| prompt |
  118689.             prompt := 'The class %1 is currently owned by the ''%2'' package' formatWith: aClass name
  118690.                         with: classPackage name.
  118691.             subclasses isEmpty 
  118692.                 ifTrue: 
  118693.                     [prompt := prompt 
  118694.                                 , ('.%n%nAre you sure you would like to move it to ''%1''?' formatWith: package name).
  118695.                     response := (MessageBox new)
  118696.                                 caption: 'Moving class to new package...';
  118697.                                 defaultButton: 2;
  118698.                                 confirm: prompt.
  118699.                     response ifFalse: [^false]]
  118700.                 ifFalse: 
  118701.                     [prompt := prompt 
  118702.                                 , (', and will be moved to ''%2''.
  118703.  
  118704. Would you like to move its subclasses in ''%1'', or without a package, too?' 
  118705.                                         formatWith: classPackage name
  118706.                                         with: package name).
  118707.                     (response := MessageBox new confirmOrCancel: prompt) == #cancel ifTrue: [^false]]].
  118708.     packMan addClass: aClass to: package.
  118709.     response == #yes 
  118710.         ifTrue: 
  118711.             ["Move the subclasses too"
  118712.             subclasses do: [:a | packMan addClass: a key to: package]].
  118713.     ^true!
  118714.  
  118715. renameClass
  118716.     "Private - Initiate in-place label edit for the selected class."
  118717.  
  118718.     self selectableItems view editSelectionLabel!
  118719.  
  118720. renameClassVariable
  118721.     "Private - Initiate the rename of a class variable. Note that the view may also implement this 
  118722.     command with a dynamic pull-out menu (of the same name)."
  118723.  
  118724.     | classVar class |
  118725.     class := self selection.
  118726.     classVar := ChoicePrompter choices: class classVarNames asSortedCollection
  118727.                 caption: 'Rename Class Variable...'.
  118728.     classVar isNil 
  118729.         ifFalse: [self systemModel renameClassVariable: classVar in: class]!
  118730.  
  118731. renameInstanceVariable
  118732.     "Private - Initiate the rename of an instance variable. Note that the view may also implement this 
  118733.     command with a dynamic pull-out menu (of the same name)."
  118734.  
  118735.     | instVar class |
  118736.     class := self actualClass.
  118737.     instVar := ChoicePrompter choices: class instVarNames asSortedCollection
  118738.                 caption: 'Rename Instance Variable...'.
  118739.     instVar isNil 
  118740.         ifFalse: [self systemModel renameInstanceVariable: instVar in: class]!
  118741.  
  118742. runTests
  118743.     "Open an SUnit Test Browser on the selected Test Case and start running the tests."
  118744.  
  118745.     self testBrowserClass sunitbShowAndRun: self selection!
  118746.  
  118747. selectableItems
  118748.     "Private - Answer the name of the <selectableItems> component that actually handles the selectable items in the receiver"
  118749.     
  118750.     ^classesPresenter!
  118751.  
  118752. showPresenter: viewName
  118753.     "Show the selected presenter class in an existing view resource, of the <readableString> name,
  118754.     viewName, belonging to the selected class."
  118755.  
  118756.     self selection show: viewName
  118757.     !
  118758.  
  118759. systemModel
  118760.     "Private - Answer the development system model."
  118761.  
  118762.     ^Smalltalk developmentSystem!
  118763.  
  118764. testBrowserClass
  118765.     ^Smalltalk at: #SUnitBrowser ifAbsent: []! !
  118766.  
  118767. ListPresenter comment:
  118768. 'ListPresenter implements a <listPresenter> component that can be used to display the contents of a <listModel> within a <listView>.  It also conforms to <selectableItems> and <indexSelectableItems> to provide methods for accessing the current selection(s) in the list.
  118769.  
  118770. Instance Variables:
  118771.     sortBlock        <dyadicValuable> or nil, specifying how a objects should be sorted.
  118772.  
  118773.  
  118774.  
  118775. '!
  118776. !ListPresenter class methodsFor!
  118777.  
  118778. defaultModel
  118779.     "Answer a default model to be assigned to the receiver when it
  118780.     is initialized."
  118781.  
  118782.     ^ListModel new!
  118783.  
  118784. icon
  118785.     "Answers an Icon that can be used to represent this class"
  118786.  
  118787.     ^##(self) defaultIcon! !
  118788.  
  118789. !ListPresenter methodsFor!
  118790.  
  118791. basicBeSorted
  118792.     "Private - Change the receiver's model sortblock to a default sort block.
  118793.     The sort is not actually performed"
  118794.  
  118795.     self sortBlock: self defaultSortBlock!
  118796.  
  118797. beNotSorted
  118798.     "Change the receiver's view model to be an OrderedCollection"
  118799.  
  118800.     self sortBlock: nil.
  118801.     self list: self list asOrderedCollection!
  118802.  
  118803. beSorted
  118804.     "Change the receiver's model to be a SortedCollection 
  118805.     using a default sort block"
  118806.  
  118807.     self basicBeSorted.
  118808.     self list: self list asOrderedCollection.!
  118809.  
  118810. beSorted: aSortBlock
  118811.     "Change the receiver's model to be a SortedCollection using aSortBlock to determine sort order"
  118812.  
  118813.     self sortBlock: aSortBlock.
  118814.     self list: self list!
  118815.  
  118816. clear
  118817.     "Remove all contents in the receiver's model"
  118818.  
  118819.     self model removeAll!
  118820.  
  118821. defaultSortBlock
  118822.     "Private - Answer a default sort block to use when the receiver is sorted"
  118823.  
  118824.     ^SortedCollection defaultSortBlock!
  118825.  
  118826. isSorted
  118827.     "Answer true if the receiver is sorted by default"
  118828.  
  118829.     ^self sortBlock notNil!
  118830.  
  118831. list 
  118832.     "Answer the contents of the receiver"
  118833.  
  118834.     ^self model list!
  118835.  
  118836. list: aSequenceableCollection
  118837.     "Set the contents of the receiver to be aSequenceableCollection"
  118838.  
  118839.     | list |
  118840.     list := self isSorted 
  118841.                 ifTrue: [aSequenceableCollection asSortedCollection: self sortBlock]
  118842.                 ifFalse: [aSequenceableCollection].
  118843.     ^self model list: list!
  118844.  
  118845. onAboutToEditLabel: anObject
  118846.     "The receiver's element, anObject, is about to have its label edited in the receiver.
  118847.     Forward back to the view."
  118848.  
  118849.     ^self view onAboutToEditLabel: anObject!
  118850.  
  118851. onLabelOf: anObject editedTo: text
  118852.     "The receiver's element, anObject, has had its label edited in the receiver to the 
  118853.     specified text. Answer whether to accept the edited text."
  118854.  
  118855.     ^self view onLabelOf: anObject editedTo: text!
  118856.  
  118857. selectableItems
  118858.     "Private - Answer the name of the <selectableItems> component that actually handles the selectable items in the receiver"
  118859.     
  118860.     ^self view!
  118861.  
  118862. selectionByIndex
  118863.     "Answers the index of the selected object in the receiver or zero if there is none."
  118864.     
  118865.     ^self selectableItems selectionByIndex!
  118866.  
  118867. selectionByIndex: anInteger
  118868.     "Select the object in the receiver with anInteger index."
  118869.  
  118870.     self selectableItems selectionByIndex: anInteger!
  118871.  
  118872. selectionByIndex: newSelection ifAbsent: exceptionHandler
  118873.     "Select the object identified by the <integer> index, newSelection, in the receiver. 
  118874.     If  newSelection is zero then all selections are cleared. "
  118875.  
  118876.     self selectableItems selectionByIndex: newSelection ifAbsent: exceptionHandler
  118877. !
  118878.  
  118879. selectionByIndexIfNone: exceptionHandler
  118880.     "Answer the index of the selectd item in the list (1 based), or if no item is
  118881.     selected, then the result of evaluating the niladic valuable, exceptionHandler."
  118882.  
  118883.     ^self selectableItems selectionByIndexIfNone: exceptionHandler
  118884. !
  118885.  
  118886. sortBlock
  118887.     ^sortBlock!
  118888.  
  118889. sortBlock: anObject
  118890.     sortBlock := anObject! !
  118891.  
  118892. PackageSelector comment:
  118893. 'A PackageSelector is used to choose a Package from the complete set of packages available in the development system. It presents two panes; a hierarchical display of the folders in which the packages reside and a list of available packages. The folder display can be used as a filter to refine which packages are displayed in the list. When a folder is selected, only packages in the hierarchy beneath it are visible.
  118894.  
  118895. Instance Variables:
  118896.     filterPresenter        <treePresenter> showing the folders in which packages reside
  118897.     packagesPresenter        <listPresenter> showing the packages filtered by the selected folder
  118898.  
  118899. '!
  118900. !PackageSelector class methodsFor!
  118901.  
  118902. defaultModel
  118903.     "Answer a default model to be assigned to the receiver when it
  118904.     is initialized."
  118905.  
  118906.     ^PackageHierarchyModel new! !
  118907.  
  118908. !PackageSelector methodsFor!
  118909.  
  118910. aboutPackage
  118911.     "Show an About box for the currently selected package"
  118912.  
  118913.     self selections first about!
  118914.  
  118915. addClass
  118916.     "Request an available Class to add to the receivers current package from the user. Only
  118917.     classes which are not currently owned by any other package are shown."
  118918.  
  118919.     | classes |
  118920.     classes := self class environment allClasses asIdentitySet - self packageManager allPackagedClasses.
  118921.     classes isEmpty 
  118922.         ifTrue: [MessageBox notify: 'All Classes are currently owned by packages']
  118923.         ifFalse: 
  118924.             [| newClasses |
  118925.             newClasses := classes asSortedCollection.
  118926.             newClasses := ChoicePrompter 
  118927.                         on: newClasses
  118928.                         multipleChoices: newClasses
  118929.                         caption: 'Add Classes to ' , self singlePackage name , ' package'.
  118930.             newClasses notNil 
  118931.                 ifTrue: [newClasses do: [:c | self packageManager addClass: c to: self singlePackage]]]!
  118932.  
  118933. addGlobal
  118934.     "Request an available global object to add the receivers current package. Only
  118935.     globals which are not currently owned by any other package are shown."
  118936.  
  118937.     | globalNames pack pacman |
  118938.     pack := self singlePackage.
  118939.     globalNames := pack environment keys.
  118940.     pacman := self packageManager.
  118941.     globalNames
  118942.         removeAll: (pack environment allClasses collect: [:aClass | aClass name]);
  118943.         removeAll: pacman allPackagedGlobalNames.
  118944.     globalNames isEmpty 
  118945.         ifTrue: [MessageBox notify: 'All Global objects are currently owned by packages']
  118946.         ifFalse: 
  118947.             [| globals |
  118948.             globals := ChoicePrompter multipleChoices: globalNames asSortedCollection
  118949.                         caption: 'Add global objects to ' , pack name , ' package'.
  118950.             globals notNil ifTrue: [globals do: [:each | pacman addGlobalNamed: each to: pack]]]!
  118951.  
  118952. autoSelect
  118953.     ^autoSelect!
  118954.  
  118955. autoSelect: aBoolean
  118956.     autoSelect := aBoolean!
  118957.  
  118958. browseFolder
  118959.     | folder |
  118960.     folder := self selectedFolder.
  118961.     [self systemModel browseFolder: folder] on: Win32Error
  118962.         do: 
  118963.             [:ex | 
  118964.             MessageBox errorMsg: ex messageText
  118965.                 caption: ('Unable to browse ''%1''...' formatWith: folder)]!
  118966.  
  118967. browseIt
  118968.     "Browse the selected item in the pane with focus."
  118969.  
  118970.     self perform: self browseItCommand!
  118971.  
  118972. browseItCommand
  118973.     "Private - Answer the command that the context-sensitive 'Browse-It' command would be linked
  118974.     to if sent to the receiver at this moment."
  118975.  
  118976.     filterPresenter hasFocus ifTrue: [^#browseFolder].
  118977.     packagesPresenter hasFocus ifTrue: [^nil].
  118978.     ^nil!
  118979.  
  118980. browsePackage
  118981.     self singlePackage browse!
  118982.  
  118983. checkCanUninstall: package
  118984.     "Private - Uninstallation of the <Package>, package, has been initiated. Verify that it can be uninstalled
  118985.     and if not inform the user accordingly and abort the operation."
  118986.  
  118987.     | err |
  118988.     [package okToUninstall] on: Error do: [:ex | err := ex].
  118989.     err notNil ifTrue: [
  118990.         MessageBox errorMsg: err description.
  118991.         ^self operationAbortedSignal signalWith: package]!
  118992.  
  118993. clearSelection
  118994.     "Private - Remove the selected object from the system"
  118995.  
  118996.     self perform: self deleteItCommand!
  118997.  
  118998. commonFolder: packages
  118999.     | commonPrefix |
  119000.     commonPrefix := File splitPathFrom: packages first packagePathname.
  119001.     packages 
  119002.         from: 2
  119003.         to: packages size
  119004.         do: [:each | commonPrefix := File commonPrefixOf: commonPrefix and: each packagePathname].
  119005.     ^commonPrefix isEmpty 
  119006.         ifTrue: [PackageFolder root]
  119007.         ifFalse: [PackageFolder pathname: (File appendPathDelimiter: commonPrefix)]!
  119008.  
  119009. confirmUninstall: package
  119010.     "Private - If the <Package>, package, has any dependents, then prompt the user to confirm 
  119011.     that they should also be uninstalled, if not then double check that the package should be 
  119012.     uninstalled anyway. If this method returns then all dependent packages were successfully 
  119013.     uninstalled, and uninstallation of the package may proceed."
  119014.  
  119015.     | deps msg prompt |
  119016.     self promptToSavePackageChanges: package.
  119017.     Cursor wait showWhile: [deps := package allDependentPackages].
  119018.     prompt := 'Uninstalling ''%1'' package...' formatWith: package name.
  119019.     deps isEmpty 
  119020.         ifTrue: 
  119021.             [msg := 'Do you really want to uninstall the ''%1'' package and remove all its owned objects from the system?' 
  119022.                         formatWith: package name.
  119023.             ((MessageBox new)
  119024.                 taskModal;
  119025.                 caption: prompt;
  119026.                 confirm: msg) ifFalse: [^self operationAbortedSignal signalWith: package].
  119027.             ^self].
  119028.     msg := String writeStream.
  119029.     msg
  119030.         nextPutAll: 'The following packages depend on ';
  119031.         print: package name;
  119032.         nextPutAll: ' as a prerequisite, and will also be uninstalled:';
  119033.         cr;
  119034.         cr.
  119035.     (deps collect: [:e | e name]) asSortedCollection do: 
  119036.             [:e | 
  119037.             msg
  119038.                 nextPutAll: '    ';
  119039.                 nextPutAll: e;
  119040.                 cr].
  119041.     msg
  119042.         cr;
  119043.         nextPutAll: 'Are you sure that you like to proceed?'.
  119044.     ((MessageBox new)
  119045.         taskModal;
  119046.         caption: prompt;
  119047.         yesNo;
  119048.         warning: msg contents) == #no 
  119049.         ifTrue: [^self operationAbortedSignal signalWith: package].
  119050.     deps do: [:e | self promptToSavePackageChanges: e]!
  119051.  
  119052. createComponents
  119053.     "Create the presenters contained by the receiver"
  119054.  
  119055.     super createComponents.
  119056.     filterPresenter := self add: (TreePresenter on: PackageHierarchyModel new)
  119057.                 name: 'filter'.
  119058.     packagesPresenter := self add: ListPresenter new name: 'packages'!
  119059.  
  119060. createSchematicWiring
  119061.     "Create the trigger wiring for the receiver"
  119062.  
  119063.     super createSchematicWiring.
  119064.     self filterPresenter 
  119065.         when: #selectionChanged
  119066.         send: #onFilterSelected
  119067.         to: self.
  119068.     (self packagesPresenter)
  119069.         when: #selectionChanged
  119070.             send: #onSelectionChanged
  119071.             to: self;
  119072.         when: #actionPerformed
  119073.             send: #onPackageChosen
  119074.             to: self;
  119075.         when: #drop:
  119076.             send: #onDropOverPackage:
  119077.             to: self;
  119078.         when: #dragEnter:
  119079.             send: #onDragOverPackage:
  119080.             to: self;
  119081.         when: #dragOver:
  119082.             send: #onDragOverPackage:
  119083.             to: self.
  119084.     (Package manager)
  119085.         when: #loadedChanged
  119086.             send: #onPackagesChanged
  119087.             to: self;
  119088.         when: #packageChanged:
  119089.             send: #onPackageChanged:
  119090.             to: self!
  119091.  
  119092. deleteItCommand
  119093.     "Private - Answer the command that the context-sensitive 'Browse-It' command would be linked
  119094.     to if sent to the receiver at this moment."
  119095.  
  119096.     filterPresenter hasFocus ifTrue: [^nil].
  119097.     packagesPresenter hasFocus ifTrue: [^#removePackage].
  119098.     ^nil!
  119099.  
  119100. filter
  119101.     "Answer the current value of the filter"
  119102.  
  119103.     ^self folder ifNil: [''] ifNotNil: [:folder | folder pathname]!
  119104.  
  119105. filterPresenter
  119106.     ^filterPresenter!
  119107.  
  119108. folder
  119109.     ^self filterPresenter selectionOrNil!
  119110.  
  119111. hasChangedPackages
  119112.     "Private - Answer whether any changed packages are currently selected."
  119113.  
  119114.     ^self packages anySatisfy: [:each | each isChanged].
  119115. !
  119116.  
  119117. hasPackages
  119118.     "Private - Answer whether one or more packages are currently selected."
  119119.  
  119120.     ^self packages notEmpty!
  119121.  
  119122. hasSinglePackage
  119123.     "Private - Answer whether a single package is currently selected."
  119124.  
  119125.     ^self singlePackage notNil!
  119126.  
  119127. initialize
  119128.     "Private - Initialize the receiver."
  119129.  
  119130.     super initialize.
  119131.     self autoSelect: true!
  119132.  
  119133. inspectIt
  119134.     "Open an inspector on the currently selected class."
  119135.  
  119136.     | packages |
  119137.     packages := self packages.
  119138.     (packages size = 1 ifTrue: [packages first] ifFalse: [packages]) inspect!
  119139.  
  119140. inspectPackage
  119141.     "Open an AccessorInspector on the currently selected package."
  119142.  
  119143.     PublishedAspectInspector shellOn: self singlePackage!
  119144.  
  119145. installWarning: aWarning
  119146.     ^((MessageBox new)
  119147.         taskModal;
  119148.         okCancel;
  119149.         defaultButton: 2;
  119150.         warning: ('%1%n%nClick OK to bypass this warning and continue with the installation, or Cancel to abort.' 
  119151.                     formatWith: aWarning description)) 
  119152.             == #ok!
  119153.  
  119154. isEnabled: aBoolean
  119155.      filterPresenter view isEnabled: aBoolean.
  119156.      packagesPresenter view isEnabled: aBoolean!
  119157.  
  119158. isSaveablePackage: aPackage 
  119159.     "Private - Answer whether aPackage can be saved."
  119160.  
  119161.     ^aPackage ~= self packageManager systemPackage 
  119162.         or: [Smalltalk developmentSystem isOAD]!
  119163.  
  119164. newPackage
  119165.     "Request the name of a new Package to add to the PackageManager."
  119166.  
  119167.     | pathname dialog directory |
  119168.     directory := File fullPathOf: self filter relativeTo: SessionManager current imageBase.
  119169.     [File createDirectoryPath: directory] on: Win32Error
  119170.         do: 
  119171.             [:ex | 
  119172.             "User probably doesn't have access rights"
  119173.             ].
  119174.     dialog := (FileSaveDialog new)
  119175.                 initialDirectory: directory;
  119176.                 fileTypes: (Array with: self pacFileDialogType);
  119177.                 defaultExtension: Package packageExtension;
  119178.                 caption: 'New Package'.
  119179.     pathname := dialog showModal.
  119180.     pathname notNil 
  119181.         ifTrue: 
  119182.             [| packageName |
  119183.             packageName := File splitStemFrom: pathname.
  119184.             packageName notEmpty 
  119185.                 ifTrue: 
  119186.                     [| packMan |
  119187.                     packMan := self packageManager.
  119188.                     
  119189.                     [| package |
  119190.                     package := packMan newPackage: pathname.
  119191.                     self packages: (Array with: package)] 
  119192.                             on: packMan duplicatePackageSignal
  119193.                             do: [:e | e okCancel]]]!
  119194.  
  119195. okToSavePackage: aPackage
  119196.     "Private - Verify that the <Package>, aPackage, is in a fit state to save (i.e. that it is reloadable),
  119197.     and answer whether it is>"
  119198.  
  119199.     | err |
  119200.     [^aPackage okToSaveOrDeploy] on: Package unsaveableSignal do: [:ex | err := ex].
  119201.     ((MessageBox new)
  119202.         warning;
  119203.         caption: 'Cannot save package ' , aPackage name printString;
  119204.         confirm: err description 
  119205.                     , '
  119206.  
  119207. The package will NOT load if saved in this form so the package file has not been saved.
  119208.  
  119209. Would you like to browse the packages prerequisites in order to track down the problem?') 
  119210.             ifTrue: [self systemModel showPrerequisitesForPackage: aPackage].
  119211.     ^false!
  119212.  
  119213. onDragOverPackage: session
  119214.     "Private - A drag session is passing over the receiver's package list pane.
  119215.     Update the <DragDropSession>, session, with the drop operation supported
  119216.     (if any)."
  119217.  
  119218.     session operation: nil.
  119219.     (session suggestedTarget notNil and: [
  119220.             #(CompiledMethod Class ResourceIdentifier GlobalSymbol) 
  119221.                 anySatisfy: [:e | session isFormatAvailable: e]])
  119222.         ifTrue: [session operation: #move. ^true]!
  119223.  
  119224. onDropOverPackage: session
  119225.     "Private - The drag operation described by session would like to do a drop.
  119226.     Override this method to accept the dragObject(s)."
  119227.  
  119228.     | targetPackage packageManager |
  119229.  
  119230.     targetPackage := session suggestedTarget.
  119231.     targetPackage isNil ifTrue: [ Sound errorBeep. ^false ].
  119232.  
  119233.     packageManager := Package manager.
  119234.  
  119235.     Cursor wait showWhile: [
  119236.         session dragObjects do: [:each |
  119237.             "See if the drop is a CompiledMethod"
  119238.             (each isFormatAvailable: #CompiledMethod) ifTrue: [ | method |
  119239.                 method := each format: #CompiledMethod.
  119240.                 packageManager addMethod: method to: targetPackage ].
  119241.     
  119242.             (each isFormatAvailable: #ResourceIdentifier) ifTrue: [ | resource |
  119243.                 resource := each format: #ResourceIdentifier.
  119244.                 packageManager addResourceIdentifier: resource to: targetPackage ].
  119245.  
  119246.             (each isFormatAvailable: #GlobalSymbol) ifTrue: [ | global |
  119247.                 global := each format: #GlobalSymbol.
  119248.                 packageManager addGlobalNamed: global to: targetPackage ].
  119249.  
  119250.             (each isFormatAvailable: #Class) ifTrue: [ | class |
  119251.                 class := each format: #Class.
  119252.                 packageManager addClass: class to: targetPackage ]]].
  119253.     
  119254.     "Operation must never be #move to avoid methods being removed"
  119255.     session operation: #copy.
  119256.         
  119257.     ^true!
  119258.  
  119259. onFilterSelected
  119260.     "Private - A filter directory has been selected. Refresh the packages list to include only
  119261.     those withing the filter directory hierarchy"
  119262.  
  119263.     self refresh!
  119264.  
  119265. onPackageChanged: aPackage
  119266.     "Private - The development system has marked aPackage as being changed,
  119267.     update the package list to show any change in the appearance of the package."
  119268.  
  119269.     self packagesPresenter view updateAll!
  119270.  
  119271. onPackageChosen
  119272.     "Private - The user has double clicked a package, resync the folder hierarchy to its containing directory."
  119273.  
  119274.     self synchronizeFilter!
  119275.  
  119276. onPackagesChanged
  119277.     "Private - The set of loaded packages has changed. Refresh the receiver appropriately"
  119278.  
  119279.     self refresh.
  119280.     self filterPresenter expand: PackageFolder root!
  119281.  
  119282. onSelectionChanged
  119283.     "Sent by #onSelChange when the receiver's selection has changed.
  119284.     The default is to trigger an #selectionChanged event off the presenter"
  119285.  
  119286.     self trigger: #selectionChanged!
  119287.  
  119288. onTipTextRequired: tool
  119289.     "Tool tip text is required for the <ToolbarItem>, tool."
  119290.  
  119291.     | cmd |
  119292.     cmd := tool command asSymbol.
  119293.     cmd == #clearSelection ifTrue: [^'Uninstall ''%1'''  formatWith: self singlePackage name].
  119294.     ^super onTipTextRequired: tool!
  119295.  
  119296. onViewOpened
  119297.     "Received when the receiver's view is been connected. "
  119298.  
  119299.     super onViewOpened.
  119300.     self filterPresenter expand: PackageFolder root!
  119301.  
  119302. openFileDialogTypes
  119303.     "Private - Answer a file types array for use with a FileDialog to save/load packages."
  119304.  
  119305.     | filter |
  119306.     filter := '*.%1;*.%2' formatWith: Package packageExtension
  119307.                 with: Package sourcePackageExtension.
  119308.     ^Array 
  119309.         with: (Array with: ('Packages (%1)' formatWith: filter) with: filter)
  119310.         with: self pacFileDialogType
  119311.         with: self paxFileDialogType
  119312.         with: FileDialog allFilesType!
  119313.  
  119314. openPackage
  119315.     "Request the file name of an existing package to load."
  119316.  
  119317.     | pathname |
  119318.     pathname := (FileOpenDialog new)
  119319.                 fileTypes: self openFileDialogTypes;
  119320.                 initialDirectory: (FileLocator imageRelative 
  119321.                             localFileSpecFor: self filter);
  119322.                 caption: 'Install Package';
  119323.                 showModal.
  119324.     pathname isNil ifTrue: [^self].
  119325.     "As loading a package is a lengthy operation, we repaint the package browser first"
  119326.     self view update.
  119327.     Cursor wait showWhile: [self openPackageFile: pathname]!
  119328.  
  119329. openPackageFile: aString
  119330.     | packages manager |
  119331.     manager := self packageManager.
  119332.     [packages := manager install: aString] 
  119333.         on: manager duplicatePackageSignal
  119334.         do: 
  119335.             [:ex | 
  119336.             (MessageBox new)
  119337.                 taskModal;
  119338.                 caption: 'Error installing ' , aString printString;
  119339.                 errorMsg: ex description.
  119340.             ^nil]
  119341.         on: manager prerequisiteNotFoundSignal
  119342.         do: [:ex | (self requestPackageFileName: ex messageText) ifNotNil: [:path | ex resume: path]]
  119343.         on: Package clashSignal
  119344.         do: [:ex | (self overlappingObjectsError: ex) ifTrue: [ex resume]]
  119345.         on: Warning
  119346.         do: [:ex | (self installWarning: ex) ifTrue: [ex resume]]
  119347.         on: CompilerNotification
  119348.         do: 
  119349.             [:ex | 
  119350.             ex toTrace.
  119351.             ex resume]
  119352.         on: Notification
  119353.         do: 
  119354.             [:ex | 
  119355.             self systemModel sourceManager logComment: ex description.
  119356.             ex resume].
  119357.     (packages notNil and: [packages notEmpty]) 
  119358.         ifTrue: 
  119359.             [self packages: packages.
  119360.             packages last about]!
  119361.  
  119362. operationAbortedSignal
  119363.     "Private - Answer the signal raised when the user aborts some operation in the receiver."
  119364.  
  119365.     ^OperationAborted!
  119366.  
  119367. overlappingObjectsError: anError
  119368.     "Private - The resumeable <Error>, anError, was raised when an attempt to install a new 
  119369.     package failed because existing packages in the image already contain global objects of the 
  119370.     same name as some of the objects in the new package. Answers true if the load should continue."
  119371.  
  119372.     | msg |
  119373.     msg := String writeStream.
  119374.     msg
  119375.         nextPutAll: 'The following objects in the package are already installed in the image:';
  119376.         cr;
  119377.         crtab.
  119378.     anError tag do: [:e | msg display: e] separatedBy: [msg nextPutAll: ', '].
  119379.     msg
  119380.         cr;
  119381.         cr;
  119382.         nextPutAll: 'If you proceed with installation the system will remove the clashing items from their existing packages (if any).
  119383. This may change existing packages, and if you later uninstall this package the clashing objects will be removed along with it.
  119384.  
  119385. Do you wish to continue with the installation?'.
  119386.     ^((MessageBox new)
  119387.         taskModal;
  119388.         yesNo;
  119389.         defaultButton: 2;
  119390.         caption: anError messageText;
  119391.         warning: msg contents) == #yes!
  119392.  
  119393. pacFileDialogType
  119394.     "Private - Answer a file types array for use with a FileDialog to save/load PAC packages."
  119395.  
  119396.     | pac |
  119397.     pac := '*.' , Package packageExtension.
  119398.     ^Array with: ('Package (%1)' formatWith: pac) with: pac!
  119399.  
  119400. packageManager
  119401.     "Private - Answer the current PackageManager."
  119402.  
  119403.     ^Package manager
  119404.  
  119405. !
  119406.  
  119407. packages
  119408.     "Private - Answer the collection of currently selected packages"
  119409.  
  119410.     ^self selections
  119411. !
  119412.  
  119413. packages: aPackageCollection
  119414.     "Private - Set the selected packages."
  119415.  
  119416.     self
  119417.         selections: aPackageCollection;
  119418.         ensureSelectionVisible;
  119419.         synchronizeFilter!
  119420.  
  119421. packageSortBlock
  119422.     "Private - Answer a default sort block to use when the receiver's package list is sorted"
  119423.  
  119424.     ^[:a :b | a name < b name]
  119425.         receiver: nil;
  119426.         yourself!
  119427.  
  119428. packagesPresenter
  119429.     "Private - Answer the name of the <selectableItems> component that actually handles the selectable items in the receiver"
  119430.     
  119431.     ^packagesPresenter!
  119432.  
  119433. paxFileDialogType
  119434.     "Private - Answer a file types array for use with a FileDialog to save/load PAX packages."
  119435.  
  119436.     | pax |
  119437.     pax := '*.', Package sourcePackageExtension.
  119438.     ^Array with: ('Multi-file Package (%1)' formatWith: pax) with: pax.
  119439. !
  119440.  
  119441. promptToSavePackageChanges: package
  119442.     "Private - Uninstallation of the <Package>, package, has been initiated. Prompt the user to save
  119443.     any changes."
  119444.  
  119445.     | resp |
  119446.     package isChanged ifFalse: [^self].
  119447.  
  119448.     resp := MessageBox new
  119449.         taskModal;
  119450.         confirmOrCancel: ('The ''%1'' package has unsaved changes
  119451. Would you like to save it before uninstalling it?'
  119452.                             formatWith: package name).
  119453.  
  119454.     resp == #no ifFalse: [
  119455.         resp == #yes ifTrue: [
  119456.             (Cursor wait showWhile: [self savePackageChanges: (Array with: package)]) ifTrue: [^self]].
  119457.         self operationAbortedSignal signalWith: package]!
  119458.  
  119459. queryCommand: aCommandQuery
  119460.     "Private - Enters details about a potential command for the receiver into 
  119461.     the <CommandQuery>, query"
  119462.  
  119463.     | selector |
  119464.     selector := aCommandQuery commandSymbol.
  119465.     #browseIt == selector 
  119466.         ifTrue: 
  119467.             [selector := self browseItCommand.
  119468.             selector isNil 
  119469.                 ifTrue: 
  119470.                     [aCommandQuery isEnabled: false.
  119471.                     ^true]].
  119472.     #clearSelection == selector 
  119473.         ifTrue: 
  119474.             [selector := self deleteItCommand.
  119475.             selector isNil 
  119476.                 ifTrue: 
  119477.                     [aCommandQuery isEnabled: false.
  119478.                     ^true]].
  119479.     #aboutPackage == selector 
  119480.         ifTrue: 
  119481.             [aCommandQuery 
  119482.                 isEnabled: (self singlePackage ifNil: [false] ifNotNil: [:package | package canShowAbout]).
  119483.             ^true].
  119484.     (#(#browseSources #browsePackageSources) identityIncludes: selector) 
  119485.         ifTrue: 
  119486.             [aCommandQuery isEnabled: self hasPackages.
  119487.             ^true].
  119488.     (#(#checkOut #checkIn) identityIncludes: selector) 
  119489.         ifTrue: 
  119490.             [aCommandQuery isEnabled: ((self respondsTo: selector) and: [self hasPackages]).
  119491.             ^true].
  119492.     #deploy == selector 
  119493.         ifTrue: 
  119494.             [aCommandQuery isEnabled: (self hasSinglePackage and: [self respondsTo: selector]).
  119495.             ^true].
  119496.     #setAsDefaultPackage == selector 
  119497.         ifTrue: 
  119498.             [self singlePackage 
  119499.                 ifNil: [aCommandQuery isEnabled: false]
  119500.                 ifNotNil: 
  119501.                     [:package | 
  119502.                     aCommandQuery
  119503.                         isEnabled: true;
  119504.                         isChecked: package isDefaultPackage].
  119505.             ^true].
  119506.     (#(#addClass #addGlobal #inspectPackage #savePackageAs #browsePackage #addMenu) 
  119507.         identityIncludes: selector) 
  119508.             ifTrue: 
  119509.                 [aCommandQuery isEnabled: self hasSinglePackage.
  119510.                 ^true].
  119511.     selector == #saveBinaryPackage 
  119512.         ifTrue: 
  119513.             [aCommandQuery 
  119514.                 isEnabled: ((self respondsTo: #saveBinaryPackage) and: [self hasSinglePackage]).
  119515.             ^true].
  119516.     (#(#savePackages #removePackage #sourceControlMenu #inspectIt) identityIncludes: selector) 
  119517.         ifTrue: 
  119518.             [aCommandQuery isEnabled: self hasPackages.
  119519.             ^true].
  119520.     (#(#savePackageChanges #resetChangeFlags) identityIncludes: selector) 
  119521.         ifTrue: 
  119522.             [aCommandQuery isEnabled: self hasChangedPackages.
  119523.             ^true].
  119524.     (#(#checkOutChanges) identityIncludes: selector) 
  119525.         ifTrue: 
  119526.             [aCommandQuery isEnabled: (self hasChangedPackages and: [self respondsTo: selector]).
  119527.             ^true].
  119528.     (#(#browseFolder) identityIncludes: selector) 
  119529.         ifTrue: 
  119530.             [aCommandQuery isEnabled: (self selectedFolder 
  119531.                         ifNil: [false]
  119532.                         ifNotNil: [:folder | File isDirectory: folder]).
  119533.             ^true].
  119534.     #synchronizeFilter == selector 
  119535.         ifTrue: 
  119536.             [| packages |
  119537.             packages := self packages.
  119538.             aCommandQuery isEnabled: (packages notEmpty 
  119539.                         and: [(self commonFolder: packages) ~= filterPresenter selectionOrNil]).
  119540.             ^true].
  119541.     selector == #toggleUsingPAX 
  119542.         ifTrue: 
  119543.             [| syspkg first enable usingPax |
  119544.             syspkg := self packageManager systemPackage.
  119545.             enable := false.
  119546.             first := true.
  119547.             usingPax := false.
  119548.             self packages do: 
  119549.                     [:each | 
  119550.                     each == syspkg ifTrue: [enable := false].
  119551.                     first 
  119552.                         ifTrue: 
  119553.                             [enable := true.
  119554.                             usingPax := each isUsingPAX.
  119555.                             first := false]
  119556.                         ifFalse: [each isUsingPAX ~~ usingPax ifTrue: [enable := false]]].
  119557.             aCommandQuery
  119558.                 isEnabled: enable;
  119559.                 isChecked: usingPax.
  119560.             ^true].
  119561.     (self systemModel canRefactor and: [self queryRefactoringCommand: aCommandQuery]) 
  119562.         ifTrue: [^true].
  119563.     ^super queryCommand: aCommandQuery!
  119564.  
  119565. refresh
  119566.     "Private - Refresh the contents of the receiver."
  119567.  
  119568.     | filteredPackages filter packages newSelections oldSelections |
  119569.     filter := self filter.
  119570.     "Because the pluggable collection used by the package manager is a bit slow for selects, we convert to an array first"
  119571.     packages := Package manager packages asArray.
  119572.     filteredPackages := (filter isEmpty 
  119573.                 ifTrue: [packages select: [:each | File isRelativePath: each packagePathname]]
  119574.                 ifFalse: 
  119575.                     [| searchPrefix |
  119576.                     searchPrefix := filter , '*'.
  119577.                     packages select: [:each | searchPrefix match: each packagePathname]]) 
  119578.                     asSortedCollection: self packageSortBlock.
  119579.     oldSelections := self selections.
  119580.     newSelections := self autoSelect 
  119581.                 ifTrue: [filteredPackages]
  119582.                 ifFalse: [oldSelections intersection: filteredPackages].
  119583.     "Deliberately suppress the selection chanage event caused by resetting the list to avoid
  119584.      generating two selection change events"
  119585.     self packagesPresenter noEventsDo: 
  119586.             [self packagesPresenter list: filteredPackages.
  119587.             self selections: newSelections].
  119588.     (newSelections symmetricDifference: oldSelections) isEmpty 
  119589.         ifFalse: [self packagesPresenter onSelectionChanged]!
  119590.  
  119591. removePackage
  119592.     "Prompt for confirmation and, if given, uninstall the selected packages."
  119593.  
  119594.     self packages do: 
  119595.             [:each | 
  119596.             [self uninstall: each] on: self operationAbortedSignal
  119597.                 do: 
  119598.                     [:e | 
  119599.                     e tag ~~ each 
  119600.                         ifTrue: 
  119601.                             [MessageBox 
  119602.                                 warning: ('Uninstallation of ''%1'' was aborted, but some dependent packages may have been removed' 
  119603.                                         formatWith: each name)]]]!
  119604.  
  119605. requestPackageFileName: pathname
  119606.     "Private - Answer a <readableString> being a revised the path for the package,
  119607.     or nil if no suggestions are available (e.g. this is not an interactive session and so
  119608.     user input is not available)."
  119609.  
  119610.     | stem |
  119611.     stem := File splitStemFrom: pathname.
  119612.     ^(FileOpenDialog new)
  119613.         fileTypes: self openFileDialogTypes;
  119614.         defaultExtension: (File splitExtensionFrom: pathname);
  119615.         value: stem;
  119616.         caption: 'Open prerequisite Package: ' , stem;
  119617.         showModal!
  119618.  
  119619. resetChangeFlags
  119620.     "Reset the change flags for the selected packages"
  119621.  
  119622.     self packages do: [:each | each resetChangeFlags]!
  119623.  
  119624. resetForItem: aPackage
  119625.     "Private - Try to ensure that the filter is set to display aPackage if possible"
  119626.  
  119627.     self filterPresenter 
  119628.         selectionOrNil: (PackageFolder forPackage: aPackage)!
  119629.  
  119630. resetForItems: packages
  119631.     packages notEmpty 
  119632.         ifTrue: 
  119633.             [filterPresenter selection: (self commonFolder: packages).
  119634.             self selections: packages]!
  119635.  
  119636. saveFileDialogTypes
  119637.     "Private - Answer a file types array for use with a FileDialog to save packages."
  119638.  
  119639.     ^Array 
  119640.         with: self pacFileDialogType
  119641.         with: self paxFileDialogType!
  119642.  
  119643. savePackageAs
  119644.     "Save the selected package to a user set pathname."
  119645.  
  119646.     | pathname package |
  119647.     package := self singlePackage.
  119648.     (self okToSavePackage: package) ifFalse: [^self].
  119649.     pathname := (FileSaveDialog new)
  119650.                 fileTypes: self saveFileDialogTypes;
  119651.                 defaultExtension: Package packageExtension;
  119652.                 value: (File removeExtension: package packageFileName);
  119653.                 caption: ('Save Package ''%1'' As...' formatWith: package name);
  119654.                 showModal.
  119655.     pathname notNil 
  119656.         ifTrue: 
  119657.             [self packageManager renamePackage: package to: pathname.
  119658.             package save.
  119659.             self packages: (Array with: package)]!
  119660.  
  119661. savePackageChanges
  119662.     "Save out the selected package (if changed) and its changed owned objects."
  119663.  
  119664.     self savePackageChanges: self packages!
  119665.  
  119666. savePackageChanges: aPackageCollection 
  119667.     "Save out the packages in aPackageCollection having first checked that they are in a reloadable state.
  119668.     Answer whether the packages were saved."
  119669.  
  119670.     | ok |
  119671.     ok := true.
  119672.     (aPackageCollection 
  119673.         select: [:each | each isChanged and: [self isSaveablePackage: each]]) do: 
  119674.                 [:each | 
  119675.                 (self okToSavePackage: each) 
  119676.                     ifTrue: [each saveChanges]
  119677.                     ifFalse: [ok := false]].
  119678.     ^ok!
  119679.  
  119680. savePackages
  119681.     "Save out the selected packages"
  119682.  
  119683.     self savePackages: self packages!
  119684.  
  119685. savePackages: aPackageCollection 
  119686.     "Save out the packages in aPackageCollection having first checked that they are in a reloadable state.
  119687.     Answer whether the package was saved."
  119688.  
  119689.     | ok |
  119690.     ok := true.
  119691.     (aPackageCollection select: [:each | self isSaveablePackage: each]) 
  119692.         do: [:each | (self okToSavePackage: each) ifTrue: [each save] ifFalse: [ok := false]].
  119693.     ^ok!
  119694.  
  119695. selectableItems
  119696.     "Private - Answer the name of the <selectableItems> component that actually handles the selectable items in the receiver"
  119697.     
  119698.     ^self packagesPresenter!
  119699.  
  119700. selectedFolder
  119701.     ^self filterPresenter selectionOrNil
  119702.         ifNotNil: [:folder | FileLocator imageRelative localFileSpecFor: folder pathname]!
  119703.  
  119704. selectedSourceObjects
  119705.     "Private - Answer a collection of all the source objects from the selected packages"
  119706.  
  119707.     | answer |
  119708.     answer := OrderedCollection new.
  119709.     self packages 
  119710.         do: [:eachPackage | eachPackage allSourceObjectsDo: [:each | answer addLast: each]].
  119711.     ^answer!
  119712.  
  119713. setAsDefaultPackage
  119714.     | package |
  119715.     package := self singlePackage.
  119716.     self packageManager defaultPackage: (package isDefaultPackage ifFalse: [package]).
  119717.     self selectableItems model updateItem: package!
  119718.  
  119719. singlePackage
  119720.     "Private - Answer the selected package iff a single package is selected, otherwise nil."
  119721.  
  119722.     | packages |
  119723.     packages := self packages.
  119724.     ^packages size == 1 ifTrue: [packages first]!
  119725.  
  119726. synchronizeFilter
  119727.     self resetForItems: self selections!
  119728.  
  119729. systemModel
  119730.     "Private - Answer the development system model."
  119731.  
  119732.     ^Smalltalk developmentSystem!
  119733.  
  119734. toggleUsingPAX
  119735.     "Toggles the use of PAX mode."
  119736.  
  119737.     ^self packages do: [:each | each toggleUsingPAX]!
  119738.  
  119739. uninstall: package
  119740.     "Private - Uninstall the <Package>, package, prompting the user to first save changes (if any),
  119741.     and to remove dependent packages (if any)."
  119742.  
  119743.     | currentFolder |
  119744.     package isInstalled ifFalse: [^self].
  119745.     self checkCanUninstall: package.
  119746.     self confirmUninstall: package.
  119747.     currentFolder := self filterPresenter selectionOrNil.
  119748.     "Remove selection first to avoid losing objects required to maintain display"
  119749.     self packages: (self packages copyWithout: package).
  119750.     [self packageManager uninstall: package] 
  119751.         on: ClassBuilder invalidRemoveError
  119752.         do: 
  119753.             [:e | 
  119754.             e resume: ((MessageBox new)
  119755.                         taskModal;
  119756.                         confirm: ('%1%n%nWould you like to remove the class anyway?' formatWith: e description))]
  119757.         on: Notification
  119758.         do: 
  119759.             [:ex | 
  119760.             self systemModel sourceManager logComment: ex description.
  119761.             ex resume].
  119762.  
  119763.     "Select nearest available folder in filter hierarchy"
  119764.     
  119765.     [currentFolder notNil 
  119766.         and: [(self filterPresenter selection: currentFolder ifAbsent: []) isNil]] 
  119767.             whileTrue: [currentFolder := currentFolder parent]! !
  119768.  
  119769. TreePresenter comment:
  119770. 'TreePresenter implements a <treePresenter> component that can be used to display the contents of a <treeModel> within a <treeView>. This is similar to the way a tree view is used to display a file system''s contents in the Window''s explorer. For presentation of a tree as a hierarchy of nested "folders" see the <FolderPresenter> class.
  119771.  
  119772. TreePresenter conforms to <selectableItems> to provide methods for accessing the current selection. In addition, the <treePresenter> protocol allows the tree to be navigating using the #expand: , #collapse: and #up methods.
  119773.  
  119774. '!
  119775. !TreePresenter class methodsFor!
  119776.  
  119777. defaultModel
  119778.     "Answer a default model to be assigned to the receiver when it
  119779.     is initialized."
  119780.  
  119781.     ^TreeModel new!
  119782.  
  119783. icon
  119784.     "Answers an Icon that can be used to represent this class"
  119785.  
  119786.     ^##(self) defaultIcon! !
  119787.  
  119788. !TreePresenter methodsFor!
  119789.  
  119790. collapse: anObject
  119791.     "Collapse the displayed hierarchy below anObject.
  119792.     Note that this does not actually remove any nodes from the receiver's model,
  119793.     i.e. the effect is purely on the view (but see TreeModel>>collapse:)"
  119794.  
  119795.     self view collapse: anObject!
  119796.  
  119797. expand: anObject
  119798.     "Expand the displayed hierarchy below anObject."
  119799.  
  119800.     self view expand: anObject!
  119801.  
  119802. expandAll: anObject 
  119803.     "Expand the complete hierarchy below anObject (i.e. expand the node and, recursively, all its sub-nodes)."
  119804.  
  119805.     self view expandAll: anObject!
  119806.  
  119807. hasSelection
  119808.     "Answer true if the receiver has a selection."
  119809.  
  119810.     ^self view hasSelection!
  119811.  
  119812. onAboutToEditLabel: anObject
  119813.     "The receiver's element, anObject, is about to have its label edited in the receiver.
  119814.     Forward back to the view."
  119815.  
  119816.     ^self view onAboutToEditLabel: anObject!
  119817.  
  119818. onLabelOf: anObject editedTo: text
  119819.     "The receiver's element, anObject, has had its label edited in the receiver to the 
  119820.     specified text. Answer whether to accept the edited text."
  119821.  
  119822.     ^self view onLabelOf: anObject editedTo: text!
  119823.  
  119824. selectableItems
  119825.     "Private - Answer the name of the <selectableItems> component that actually handles the selectable items in the receiver"
  119826.     
  119827.     ^self view!
  119828.  
  119829. up    
  119830.     "Display the contents of the immediate parent of the selected tree item"
  119831.  
  119832.     | parent |
  119833.     parent := self model parentOf: self selectionOrNil.
  119834.     self expand: parent! !
  119835.  
  119836. ClassHierarchySelector comment:
  119837. 'A ClassHierarchySelector is used to display a tree of classes. It implements the behaviour common to the class hierarchy panes in the <ClassBrowserShell> and <ClassHierarchyDiagram>.'!
  119838. !ClassHierarchySelector class methodsFor!
  119839.  
  119840. defaultModel
  119841.     "Answer a default model to be assigned to the receiver when it
  119842.     is initialized."
  119843.  
  119844.     ^Smalltalk developmentSystem classHierarchy! !
  119845.  
  119846. !ClassHierarchySelector methodsFor!
  119847.  
  119848. createComponents
  119849.     "Create the presenters contained by the receiver"
  119850.  
  119851.     super createComponents.
  119852.     classesPresenter := self add: (TreePresenter on: Smalltalk developmentSystem classHierarchy) name: 'classes'.
  119853. !
  119854.  
  119855. expand: aClass
  119856.     "Expands aClass in the displayed hierarchy"
  119857.  
  119858.     classesPresenter expand: aClass!
  119859.  
  119860. expandAll: aClass
  119861.     "Expands aClass and all it's subclasses in the displayed hierarchy"
  119862.  
  119863.     classesPresenter expandAll: aClass! !
  119864.  
  119865. FolderPresenter comment:
  119866. 'FolderPresenter is a <treePresenter> component that can be used to display the contents of a <treeModel> within a <listView>. The list is used to display the contents of individual parent nodes within the tree. This is similar to the way a folder view (hence the name) is used to display a directory''s contents in the Windows Shell.. For presentation of a tree but viewing it as a complete hierarchy see the TreePresenter class.
  119867.  
  119868. A FolderPresenter can navigate the tree hierarchy using the #expand:, #collapse: and #up <treePresenter> methods. 
  119869.  
  119870. Instance Variables:
  119871.     treeItem            <Object> the tree node whose child objects are currently displayed.
  119872.     contentsModel        <listModel> holding the current contents.
  119873.     isAutoNavigate        <boolean> true if presenter will implicitly navigate the tree.
  119874.     openBlock        <dyadicValuable> specifying how an object should be opened.
  119875.  
  119876. '!
  119877. !FolderPresenter class methodsFor!
  119878.  
  119879. defaultModel
  119880.     "Answer a default model to be assigned to the receiver when it
  119881.     is initialized."
  119882.  
  119883.     ^TreeModel new!
  119884.  
  119885. icon
  119886.     "Answers an Icon that can be used to represent this class"
  119887.  
  119888.     ^##(self) instanceClass defaultIcon! !
  119889.  
  119890. !FolderPresenter methodsFor!
  119891.  
  119892. beNotSorted
  119893.     "Change the receiver's view model to be unsorted. We override this
  119894.     here to ensure that the receiver's display returns to the true order
  119895.     held by the tree model at this level."
  119896.  
  119897.     self sortBlock: nil.
  119898.     self list: (self model childrenOf: treeItem)!
  119899.  
  119900. collapse: anObject
  119901.     "Collapse the displayed hierarchy below anObject.If the receiver is currently displaying
  119902.     a tree node below anObject's parent then collapse to be displaying the contents of the 
  119903.     parent only. Note that is is not legal to collapse nil."
  119904.  
  119905.     | parentChain |
  119906.     parentChain := self model allParentsOf: treeItem.
  119907.     (parentChain includes: anObject) ifTrue: [
  119908.         self expand: (self model parentOf: anObject)]!
  119909.  
  119910. contents
  119911.     "Answers a ListModel that contains the receiver's current displayed contents"
  119912.  
  119913.     ^contentsModel!
  119914.  
  119915. expand: anObjectOrNil
  119916.     "Private - Set the receiver to be displaying the contents of anObjectOrNil in the
  119917.     receiver's tree. If nil then the roots of the tree are displayed"
  119918.     
  119919.     | contents |
  119920.     treeItem := anObjectOrNil.
  119921.     history visit: treeItem.
  119922.     contents := treeItem isNil
  119923.         ifTrue: [self model roots]
  119924.         ifFalse: [self model childrenOf: treeItem].
  119925.     self contents removeAll; addAll: contents.!
  119926.  
  119927. expandAll: anObject 
  119928.     "Expand the complete hierarchy below anObject (i.e. expand the node and, recursively, 
  119929.     all its sub-nodes).
  119930.     Implementation Note: We only show a single 'level' at a time, so we just implement this
  119931.     to be the same as #expand:"
  119932.  
  119933.     self expand: anObject!
  119934.  
  119935. historyBack
  119936.     self expand: (history goBack: 1)!
  119937.  
  119938. historyForward
  119939.     "Navigate forward one position in the history list."
  119940.  
  119941.     self expand: (history goForward: 1)
  119942. !
  119943.  
  119944. initialize
  119945.     "Private - Initialize the receiver"
  119946.  
  119947.     super initialize.
  119948.     history := HistoryList new: 10.    "A fairly short history list is appropriate"
  119949.     contentsModel := ListModel new.
  119950.     self 
  119951.         isAutoNavigate: true;
  119952.         openBlock: (Message selector: #expand:)
  119953. !
  119954.  
  119955. isAutoNavigate
  119956.     "Answer true if the receiver is in automatic navigation mode; i.e. it will
  119957.     automatically attempt to move around the tree hierarchy using standard
  119958.     keyboard and mouse gestures"
  119959.  
  119960.     ^isAutoNavigate!
  119961.  
  119962. isAutoNavigate: aBoolean
  119963.     "Set the receiver into automatic navigation mode according to aBoolean"
  119964.  
  119965.     isAutoNavigate := aBoolean!
  119966.  
  119967. list 
  119968.     "Private - Answer the contents of the receiver"
  119969.  
  119970.     ^self viewModel list!
  119971.  
  119972. list: aSequenceableCollection
  119973.     "Private - Set the contents of the receiver to be aSequenceableCollection"
  119974.  
  119975.     | list |
  119976.     list := self isSorted 
  119977.                 ifTrue: [aSequenceableCollection asSortedCollection: self sortBlock]
  119978.                 ifFalse: [aSequenceableCollection].
  119979.     ^self viewModel list: list!
  119980.  
  119981. model: aTreeModel
  119982.     "Connects the receiver to aTreeModel"
  119983.  
  119984.     super model: aTreeModel.
  119985.     self model
  119986.         when: #treeChanged: send: #onTreeChanged: to: self;
  119987.         when: #item:addedInParent: send: #onItem:addedInParent: to: self;
  119988.         when: #item:removedFromParent: send: #onItem:removedFromParent: to: self;
  119989.         when: #item:movedToParent: send: #onItem:movedToParent: to: self;
  119990.         when: #itemUpdated: send: #onItemUpdated: to: self.
  119991.     self onTreeChanged: nil!
  119992.  
  119993. onActionPerformed
  119994.     "Handler for an action in the receiver's view.
  119995.     An auto-navigate instance evaluates the open block, unless there is none
  119996.     in which case the default is to send #openIn: to the item with the receiver    
  119997.     as its argument."
  119998.  
  119999.     self isAutoNavigate ifTrue: [
  120000.         self openBlock value: self value: (self selectionIfNone: [^self]).
  120001.         self invalidateUserInterface]!
  120002.  
  120003. onItem: anObject addedInParent: aParentObject
  120004.     "Private - Event received when anObject has been added to the receiver's
  120005.     model within aParentObject. We only need to add the object to the receiver's
  120006.     contents if we are currently displaying the parent."
  120007.  
  120008.     treeItem == aParentObject ifTrue: [
  120009.         self contents add: anObject ]
  120010.  
  120011.  
  120012.     !
  120013.  
  120014. onItem: anObject movedToParent: aParentObject
  120015.     "Private - Event received when anObject has been moved to the receiver's
  120016.     model within aParentObject. We only need to add the object to the receiver's
  120017.     contents if we are currently displaying the parent."
  120018.  
  120019.     (self contents identityIncludes: anObject) ifFalse: [
  120020.         treeItem == aParentObject ifTrue: [
  120021.             self contents add: anObject ]]
  120022.  
  120023.  
  120024.     !
  120025.  
  120026. onItem: anObject removedFromParent: aParentObject
  120027.     "Private - Event received when anObject has been removed from the receiver's
  120028.     model within aParentObject. We only need to remove the object from the receiver's
  120029.     contents if we are currently displaying the parent."
  120030.  
  120031.     treeItem == aParentObject ifTrue: [
  120032.         self contents remove: anObject ]!
  120033.  
  120034. onItemUpdated: anObject
  120035.     "Private - Event received when anObject has been updated. Refresh the displayed
  120036.     contents if they currently contain anObject"
  120037.  
  120038.     self contents updateItem: anObject!
  120039.  
  120040. onKeyTyped: aKeyEvent
  120041.     "Default handler for the receiver's view receiving a key entry."
  120042.  
  120043.     self isAutoNavigate ifTrue: [
  120044.         aKeyEvent code==VK_BACK ifTrue: [ ^self up ]].
  120045.     ^self view onKeyTyped: aKeyEvent!
  120046.  
  120047. onTreeChanged: anObject
  120048.     "Private - Event received when the tree has been changed at anObject"
  120049.  
  120050.     self expand: anObject!
  120051.  
  120052. openBlock
  120053.     "Answers the <dyadicValuable> open block for the receiver"
  120054.  
  120055.     ^openBlock!
  120056.  
  120057. openBlock: aDyadicValuable
  120058.     "Sets the <dyadicValuable> open block for the receiver to aDyadicValuable. This is
  120059.     evaluated to determine what action to take when an attempt is made to open one of
  120060.     the objects in the receiver. The first parameter is the folder presenter itself and the
  120061.     second is the object being opened."
  120062.  
  120063.     openBlock := aDyadicValuable!
  120064.  
  120065. openItem: item
  120066.     "Private - Open the specified item in the context of the receiver."
  120067.  
  120068.     ^item openIn: self!
  120069.  
  120070. queryCommand: query
  120071.     "Private - Enter details about a potential command for the receiver 
  120072.     into the <CommandQuery>, query."
  120073.  
  120074.     | cmd |
  120075.     cmd := query commandSymbol.
  120076.  
  120077.     cmd == #up ifTrue: [
  120078.         query isEnabled: treeItem notNil.
  120079.         ^true].
  120080.  
  120081.     cmd == #historyBack ifTrue: [
  120082.         query isEnabled: history hasPast.
  120083.         ^true].
  120084.  
  120085.     cmd == #historyForward ifTrue: [
  120086.         query isEnabled: history hasFuture.
  120087.         ^true].
  120088.  
  120089.     ^super queryCommand: query!
  120090.  
  120091. up
  120092.     "Display the contents of the immediate parent of the current tree item"
  120093.  
  120094.     treeItem notNil 
  120095.         ifTrue: 
  120096.             [| parent |
  120097.             parent := self model parentOf: treeItem.
  120098.             history visit: parent.
  120099.             parent == treeItem ifFalse: [self expand: parent]]!
  120100.  
  120101. viewModel
  120102.     "Private - Answer the model that is to be connected to the view. It is actually
  120103.     connected to the receiver's contentsModel - not the receiver's tree model"
  120104.  
  120105.     ^self contents! !
  120106.  
  120107. MethodBrowser comment:
  120108. 'MethodBrowser is a <compositePresenter> used to display a <collection> of <CompiledMethod>s. The browser can be instantiated and then filled with methods using #methodsList aspect.
  120109.  
  120110. Example:
  120111. MethodBrowser show methodsList: Object methodDictionary values.
  120112.  
  120113. Note that it is also possible to specify a <monadicValuable> filter that can be used to affect the subsequent maintenance of the browsers content. All methods in the original list are displayed (contrary to the 3.0x class comment). This is useful for when the browser is required to present a number methods meeting a specific criteria. If any of these methods are recompiled (possibly in another browser) the filter is applied once more to see whether the browser should continue to display the method in its list.
  120114.  
  120115. Instance Variables:
  120116.     methodsPresenter        <ListPresenter> holding the methods being displayed.
  120117.     sourcePresenter        <SmalltalkWorkspace> for displaying the source of the selected method.
  120118.     filter            <monadicValuable> to determine a factor by which methods are included in the list.
  120119.     methodAST        <StMethodNode>
  120120.  
  120121. Class Variables:
  120122.     AdditionalAccelerators    <Array> of <Array> of <Symbol>, <String> pairs.
  120123.     WordWrap        <boolean> indicating whether the source pane should wrap its text.
  120124.     AutoFormat        <boolean> indicating whether source is pretty printed when displayed.
  120125. '!
  120126. !MethodBrowser class methodsFor!
  120127.  
  120128. autoFormat
  120129.     ^AutoFormat!
  120130.  
  120131. autoFormat: aBoolean
  120132.     AutoFormat := aBoolean!
  120133.  
  120134. defaultAdditionalAccelerators
  120135.     ^#(#(#widenSourceSelection 'Ctrl+Y'))!
  120136.  
  120137. defaultModel
  120138.     "Answer a default model to be assigned to the receiver when it
  120139.     is initialized."
  120140.  
  120141.     ^ListModel newWithSearchPolicy: CompiledMethodSearchPolicy current!
  120142.  
  120143. getAdditionalAccelerators
  120144.     ^AdditionalAccelerators!
  120145.  
  120146. icon
  120147.     "Answers an Icon that can be used to represent this class"
  120148.  
  120149.     ^##(self) defaultIcon!
  120150.  
  120151. initialize
  120152.     "Private - Initialize the receiver's class variables.
  120153.         self initialize
  120154.     "
  120155.  
  120156.     self wordWrap: true.
  120157.     self autoFormat: false.
  120158. !
  120159.  
  120160. publishedEventsOfInstances
  120161.     "Answer a Set of Symbols that describe the published events triggered
  120162.     by instances of the receiver."
  120163.  
  120164.     ^super publishedEventsOfInstances
  120165.         add: #methodChanged;
  120166.         add: #dragOver:;
  120167.         add: #drop:;
  120168.         yourself.
  120169. !
  120170.  
  120171. setAdditionalAccelerators: anArray 
  120172.     AdditionalAccelerators := anArray!
  120173.  
  120174. wordWrap
  120175.     "Answer true if instances of the receiver use word wrapping by default."
  120176.  
  120177.     ^WordWrap!
  120178.  
  120179. wordWrap: aBoolean
  120180.     "Sets the word wrapping state for instances of the receiver to aBoolean."
  120181.  
  120182.     WordWrap := aBoolean! !
  120183.  
  120184. !MethodBrowser methodsFor!
  120185.  
  120186. applyOptions
  120187.     "Apply the class options to the receiver"
  120188.  
  120189.     sourcePresenter view wordWrap: self class wordWrap.
  120190. !
  120191.  
  120192. browseContainingText
  120193.     "Prompt for a string and open a method browser displaying the
  120194.     methods containing that string."
  120195.  
  120196.     self systemModel browseContainingText: self selectedWord prompt: true!
  120197.  
  120198. browseDefinitions
  120199.     "Context-sensitive 'Browse Definitions' command."
  120200.  
  120201.     self systemModel browseDefinitionsOf: self selection selector!
  120202.  
  120203. browseHierarchy
  120204.     "Open a hierarchy browser on the current method"
  120205.  
  120206.     self systemModel browseMethodHierarchy: self selection!
  120207.  
  120208. browseIt
  120209.     "Open a default browser on the current method"
  120210.  
  120211.     self browseMethodClass!
  120212.  
  120213. browseMethodClass
  120214.     "Open a class browser on the current method's class."
  120215.  
  120216.     self selection browse!
  120217.  
  120218. browseMethodInheritanceChain
  120219.     "Open a method browser displaying the definitions of the 
  120220.     current selector in the superclass chain."
  120221.  
  120222.     self systemModel browseMethodHierarchyFrom: self selection!
  120223.  
  120224. browseMethodPackage
  120225.     "Open a package browser on the current method's owning package."
  120226.  
  120227.     | pkg |
  120228.     pkg := self selection owningPackage.
  120229.     pkg isNil
  120230.         ifTrue: [self systemModel browsePackages]
  120231.         ifFalse: [pkg browse]!
  120232.  
  120233. browsePackages
  120234.     "Implement the context-sensitive browse packages command by browsing the package
  120235.     of the selected method."
  120236.  
  120237.     self browseMethodPackage!
  120238.  
  120239. browseReferences
  120240.     "Context-sensitive 'Browse References' command. In this case browse refs. to the 
  120241.     current selector."
  120242.  
  120243.     self systemModel browseReferencesTo: self selection selector!
  120244.  
  120245. browseReferencesToGlobal
  120246.     "Prompt for a global name and open a method browser displaying the
  120247.     references to that global."
  120248.  
  120249.     self systemModel browseReferencesToGlobal: self selectedWord!
  120250.  
  120251. buildAddCategoryMenu: aMenu 
  120252.     "Private - Build a dynamic pull-out menu to hold suggested categories and an 'Other...' 
  120253.     command to bring up the traditional prompter."
  120254.  
  120255.     "First clear away any previously set-up category addition commands"
  120256.  
  120257.     | method suggestions |
  120258.     aMenu clear.
  120259.     (method := self selectionOrNil) isNil ifTrue: [^self].
  120260.     suggestions := self methodCategorizationPolicy suggestionsFor: method.
  120261.     suggestions isEmpty 
  120262.         ifFalse: 
  120263.             [| suggested |
  120264.             suggested := IdentitySet new.
  120265.             suggestions do: 
  120266.                     [:cat | 
  120267.                     (suggested includes: cat) 
  120268.                         ifFalse: 
  120269.                             [| msg desc |
  120270.                             suggested add: cat.
  120271.                             msg := MessageSend 
  120272.                                         receiver: cat
  120273.                                         selector: #addMethod:
  120274.                                         argument: method.
  120275.                             desc := cat name.
  120276.                             (desc identityIncludes: $&) ifTrue: [desc := desc copyReplaceAll: '&' with: '&&'].
  120277.                             aMenu addCommand: msg description: desc]]].
  120278.     aMenu addSeparator.
  120279.     aMenu addCommand: #categorizeMethod description: 'Other...'.
  120280.     aMenu setDefault: aMenu items size!
  120281.  
  120282. buildParseTree
  120283.     ^self selectionOrNil 
  120284.         ifNotNil: [:method | SmalltalkParser parseExistingMethodNoError: method]!
  120285.  
  120286. buildRemoveCategoryMenu: aMenu 
  120287.     "Private - Build a dynamic pull-out menu which lists all of a methods existing categories so
  120288.     that they can be removed."
  120289.  
  120290.     "First clear away any previously set-up category removal commands"
  120291.  
  120292.     | method |
  120293.     aMenu clear.
  120294.     (method := self selectionOrNil) isNil ifTrue: [^self].
  120295.     (method categories reject: [:cat | cat isVirtual]) do: 
  120296.             [:cat | 
  120297.             | msg desc |
  120298.             msg := MessageSend 
  120299.                         receiver: cat
  120300.                         selector: #removeMethod:
  120301.                         argument: method.
  120302.             desc := cat name.
  120303.             (desc identityIncludes: $&) 
  120304.                 ifTrue: [desc := desc copyReplaceAll: '&' with: '&&'].
  120305.             aMenu addCommand: msg description: desc]!
  120306.  
  120307. canRefactorMethod
  120308.     ^self systemModel canRefactor 
  120309.         and: [self hasEditableMethodSelected and: [self parseTree notNil]]!
  120310.  
  120311. categorizeMethod
  120312.     "Invokes a dialog to categorize the current method"
  120313.  
  120314.     | originalMethod originalCategory chosenCategory categories |
  120315.     originalMethod := self selection.
  120316.     originalCategory := originalMethod categories asSortedCollection first.
  120317.     categories := originalMethod methodClass methodCategoryClass allMethodCategories.
  120318.     chosenCategory := (CategoryPrompter
  120319.                         on: originalCategory
  120320.                         choices: categories
  120321.                         caption: 'Categorize ', originalMethod selector printString) showModal.
  120322.  
  120323.     (chosenCategory notNil and: [chosenCategory ~= originalCategory]) ifTrue: [
  120324.         chosenCategory addMethod: originalMethod.
  120325.         originalMethod storeCategories]!
  120326.  
  120327. clearParseTree
  120328.     "Private - Set the parse tree cache for the current method to the DeafObject to distinguish the case 
  120329.     where the method has not yet been parsed from the case where the method failed to compile 
  120330.     (in which case methodAST will have the value nil)."
  120331.  
  120332.     methodAST := DeafObject current!
  120333.  
  120334. clearSelection
  120335.     "Removes the selected method from the system"
  120336.  
  120337.     self perform: self deleteItCommand!
  120338.  
  120339. createComponents
  120340.     "Create the presenters contained by the receiver"
  120341.  
  120342.     super createComponents.
  120343.     methodsPresenter := self add: (ListPresenter 
  120344.                         on: (ListModel newWithSearchPolicy: CompiledMethodSearchPolicy current))
  120345.                 name: 'methods'.
  120346.     sourcePresenter := self add: SmalltalkWorkspace new name: 'source'!
  120347.  
  120348. createSchematicWiring
  120349.     "Create the trigger wiring for the receiver"
  120350.  
  120351.     super createSchematicWiring.
  120352.     (self selectableItems)
  120353.         when: #actionPerformed
  120354.             send: #browseIt
  120355.             to: self;
  120356.         when: #selectionChanged
  120357.             send: #onMethodSelected
  120358.             to: self;
  120359.         when: #selectionChanging:
  120360.             send: #onMethodSelectionChanging:
  120361.             to: self;
  120362.         when: #drag:
  120363.             send: #onDrag:
  120364.             to: self;
  120365.         when: #dragCut:
  120366.             send: #onDragCut:
  120367.             to: self;
  120368.         when: #dragOver:
  120369.             send: #onDragOver:
  120370.             to: self;
  120371.         when: #drop:
  120372.             send: #onDropOver:
  120373.             to: self.
  120374.     (self systemModel)
  120375.         when: #methodAdded:
  120376.             send: #onMethodAdded:
  120377.             to: self;
  120378.         when: #methodUpdated:
  120379.             send: #onMethodUpdated:
  120380.             to: self;
  120381.         when: #methodRemoved:
  120382.             send: #onMethodRemoved:
  120383.             to: self;
  120384.         when: #methodCategorized:
  120385.             send: #onMethodCategorized:
  120386.             to: self!
  120387.  
  120388. deleteItCommand
  120389.     methodsPresenter hasFocus ifTrue: [^#removeMethod].
  120390.     ^nil!
  120391.  
  120392. enableSource: aBoolean
  120393.     "Private - Enable the source pane of the receiver according to aBoolean."
  120394.  
  120395.     "We can't just disable the source pane since the underlying Windows control will also disable any scroll bar.
  120396.     Just using the #isReadOnly flag results in no visual cue so we also choose to replace the background colour"
  120397.  
  120398.     | sourceView isReadOnly |
  120399.     sourceView := sourcePresenter view.
  120400.     isReadOnly := sourceView isReadOnly.
  120401.     isReadOnly == aBoolean 
  120402.         ifTrue: 
  120403.             [isReadOnly 
  120404.                 ifFalse: 
  120405.                     ["Save the original background colour as a property"
  120406.  
  120407.                     sourceView propertyAt: #_backcolor put: sourceView backcolor].
  120408.             sourceView isReadOnly: aBoolean not.
  120409.             sourceView backcolor: (aBoolean 
  120410.                         ifTrue: [sourceView propertyAt: #_backcolor ifAbsent: [^self]]
  120411.                         ifFalse: [Color buttonFace])]!
  120412.  
  120413. errorModel: aValueModel
  120414.     "Set the errorModel used to collect notifications from the Compiler."
  120415.  
  120416.     sourcePresenter errorModel: aValueModel!
  120417.  
  120418. evaluationContext
  120419.     ^sourcePresenter evaluationContext!
  120420.  
  120421. evaluationContext: aClassDescription
  120422.     sourcePresenter evaluationContext: aClassDescription!
  120423.  
  120424. filter
  120425.     "Answers the oneArgBlock that sppecifies a filter that determines how methods 
  120426.     are selected for display within the receiver. The filter must include any 
  120427.     criteria that are implicitly present in the methodsList."
  120428.  
  120429.     ^filter!
  120430.  
  120431. filter: aOneArgBlock
  120432.     "Sets the filter that determines how methods are selected for display
  120433.     within the receiver. The filter must include any criteria that are
  120434.     implicitly present in the original methodsList."
  120435.  
  120436.     filter := aOneArgBlock.
  120437. !
  120438.  
  120439. findNextMatch
  120440.     "Hilight the next occurrence of the sourcePresenter's findString in its
  120441.     current source."
  120442.  
  120443.     sourcePresenter view basicFindNext!
  120444.  
  120445. findSelector: aSelector 
  120446.     "Set the String to search for in the receivers source to be one that
  120447.     describes aSelector"
  120448.  
  120449.     aSelector notNil 
  120450.         ifTrue: 
  120451.             [| findString colonIndex |
  120452.             findString := aSelector asString.
  120453.             (colonIndex := findString indexOf: $:) ~~ 0 
  120454.                 ifTrue: [findString := findString copyFrom: 1 to: colonIndex].
  120455.             sourcePresenter findDetails: (Array 
  120456.                         with: findString
  120457.                         with: true
  120458.                         with: true
  120459.                         with: true)    "find what"    "forwards"    "case sensitive"    "whole word"]!
  120460.  
  120461. hasEditableMethodSelected
  120462.     ^self hasMethodSelected and: [self isSourceReadOnly not]!
  120463.  
  120464. hasMethodSelected
  120465.     "Answer true if the receiver currently has a method selected
  120466.     in the methodsPresenter"
  120467.  
  120468.     ^self hasSelection!
  120469.  
  120470. initialize
  120471.     "Private - Initialize the receiver"
  120472.  
  120473.     super initialize.
  120474.     "Initially the filter excludes all methods, this fixes the bug where a class browser
  120475.     without selection was picking up all methods added/modified."
  120476.     filter := Message selector: #isNil.!
  120477.  
  120478. inspectIt
  120479.     "Open an inspector on the currently selected method."
  120480.  
  120481.     self selection inspect!
  120482.  
  120483. isSourceReadOnly
  120484.     ^sourcePresenter view isReadOnly!
  120485.  
  120486. list: aSequenceableCollection
  120487.     "Set the list of methods that acts as the initial list from which the browser
  120488.     is populated. Subsequently any methods which are added to the system which 
  120489.     pass the filter will be added to this list. Similarly methods may be removed.
  120490.     Note that the 3.0 comment for this method incorrectly stated that the 
  120491.     aCollection was passed through the filter to arrive at the initial display list."
  120492.  
  120493.     self clearParseTree.
  120494.     super list: aSequenceableCollection.
  120495.     sourcePresenter clear.!
  120496.  
  120497. method
  120498.     "Answer the currently selected method, or nil if none
  120499.     is selected"
  120500.  
  120501.     ^self selectionOrNil!
  120502.  
  120503. method: aCompiledMethodOrNil
  120504.     "Set the currently selected method to aCompiledMethodOrNil"
  120505.  
  120506.     self selectionOrNil: aCompiledMethodOrNil
  120507. !
  120508.  
  120509. methodCategorizationPolicy
  120510.     "Private - Answer the <MethodCategorizationPolicy> used by the receiver."
  120511.  
  120512.     ^MethodCategorizationPolicy default!
  120513.  
  120514. methodPackage
  120515.     "Prompt for the user to repackage the selected method."
  120516.  
  120517.     | method oldPkg newPkg |
  120518.     method := self selection.
  120519.     oldPkg := method owningPackage.
  120520.     newPkg := PackagePrompter 
  120521.                 showModalOn: oldPkg asValue
  120522.                 caption: 'Package of ' , method displayString , '...'
  120523.                 default: method methodClass owningPackage.
  120524.     (newPkg notNil and: [newPkg ~= oldPkg]) 
  120525.         ifTrue: 
  120526.             [Package manager addMethod: method to: newPkg.
  120527.             self model updateAtIndex: self selectionByIndex]!
  120528.  
  120529. methodsList
  120530.     #deprecated. "Use #list"
  120531.     ^self list!
  120532.  
  120533. methodsList: aSequenceableCollection
  120534.     #deprecated. "Use #list::"
  120535.     self list: aSequenceableCollection !
  120536.  
  120537. model: aListModel
  120538.     "Set the receiver's model to aListModel of CompiledMethods"
  120539.  
  120540.     super model: aListModel.
  120541.     self selectableItems model: aListModel.
  120542. !
  120543.  
  120544. newMethod
  120545.     "Sets the receiver up for creating a new method"
  120546.  
  120547.     "Are there outstanding changes?"
  120548.  
  120549.     self promptToSaveChanges ifFalse: [^self].
  120550.     self method: nil.
  120551.     "#833: If there was previously no method selection (i.e. no selection change event occurred when the selection
  120552.     was reset), then we will need to clear down the source presenter, so do that regardless"
  120553.     sourcePresenter
  120554.         text: String new asRichText;
  120555.         setFocus!
  120556.  
  120557. onAboutToDisplayMenu: aMenu
  120558.     "The pop-up <Menu>, popup, is about to be displayed.
  120559.     This is our opportunity to update it, e.g. to add/remove items."
  120560.  
  120561.     | menuName |
  120562.     super onAboutToDisplayMenu: aMenu.
  120563.     menuName := aMenu name.
  120564.     menuName == #addCategoryMenu ifTrue: [^self buildAddCategoryMenu: aMenu].
  120565.     menuName == #removeCategoryMenu ifTrue: [^self buildRemoveCategoryMenu: aMenu].
  120566.     (self systemModel canRefactor and: [self populateRefactoringMenu: aMenu]) ifTrue: [^self].
  120567.  
  120568.     "Otherwise pass on to the dev. system model to populate message menus"
  120569.     self systemModel populateMessagesMenus: aMenu fromMethod: self selection!
  120570.  
  120571. onCloseRequested: boolValueHolder
  120572.     "A request to close the view onto the receiver as occurred.
  120573.     Prompt to save any outstanding changed"
  120574.  
  120575.     boolValueHolder value: self promptToSaveChanges!
  120576.  
  120577. onDrag: aDragDropSession 
  120578.     "A drag has been started. Drag the currently selected method"
  120579.  
  120580.     | dragMethod stream |
  120581.     aDragDropSession dragObjects: nil.
  120582.     dragMethod := aDragDropSession suggestedSource.
  120583.     stream := String writeStream.
  120584.     (ChunkSourceFiler on: stream) 
  120585.         fileOutMessages: (Array with: dragMethod selector)
  120586.         ofBehavior: dragMethod methodClass.
  120587.     aDragDropSession 
  120588.         addDragObject: ((aDragDropSession newDragObject: dragMethod)
  120589.                 format: #CompiledMethod data: dragMethod;
  120590.                 format: #String data: dragMethod getSource;
  120591.                 format: #Chunk data: stream contents;
  120592.                 yourself).
  120593.     aDragDropSession defaultOperation: #copy!
  120594.  
  120595. onDragCut: session
  120596.     "The <DragDropSession>, session, has just completed a successful move 
  120597.     operation. The receiver is now responsible for deleting the dragged object 
  120598.     from itself."
  120599.  
  120600.     session dragObjects do: [:each | | method |
  120601.         method := each format: #CompiledMethod.
  120602.         method methodClass removeSelector: method selector]!
  120603.  
  120604. onDragOver: session
  120605.     "Private - A drag operation described by the <DragDropSession>, session, has 
  120606.     moved over the receiver's method list pane. Forward on notification to any observers
  120607.     that might be interested."
  120608.  
  120609.     self trigger: #dragOver: with: session!
  120610.  
  120611. onDropOver: session
  120612.     "Private - A drag operation described by the <DragDropSession>, session, has 
  120613.     dropped over the receiver's method list pane. Forward on notification to any observers
  120614.     that might be interested."
  120615.  
  120616.     self trigger: #drop: with: session!
  120617.  
  120618. onMethod: oldCompiledMethod updatedTo: newCompiledMethod
  120619.     | wasSelected index |
  120620.     index := self model indexOf: oldCompiledMethod.
  120621.     index == 0 
  120622.         ifTrue: [wasSelected := false]
  120623.         ifFalse: 
  120624.             [wasSelected := self selectionByIndex == index.
  120625.             self model remove: oldCompiledMethod].
  120626.     wasSelected ifTrue: [self clearParseTree].
  120627.     (self filter value: newCompiledMethod) 
  120628.         ifTrue: 
  120629.             [self model add: newCompiledMethod.
  120630.             "Reselect it if an old instance was previously selected BUT NOT if the source presenter
  120631.              is preserving prevously changed text for this method."
  120632.             (wasSelected and: [sourcePresenter isModified not]) 
  120633.                 ifTrue: [self selection: newCompiledMethod ifAbsent: []]].
  120634.  
  120635.     "There may be visible effects (override markers) that need to be updated even when
  120636.     the added method is from a different class. Force the method presenter to redraw
  120637.     in order to guarantee that these are kept consistent"
  120638.     self selectableItems view updateAll!
  120639.  
  120640. onMethodAdded: aCompilationResult
  120641.     | method |
  120642.     self assert: [aCompilationResult isNew].
  120643.     method := aCompilationResult method.
  120644.     (self filter value: method) ifTrue: [self model add: method].
  120645.     "There may be visible effects (override markers) that need to be updated even when
  120646.     the added method is from a different class. Force the method presenter to redraw
  120647.     in order to guarantee that these are kept consistent"
  120648.     self selectableItems view updateAll!
  120649.  
  120650. onMethodCategorized: aCompiledMethod 
  120651.     "Private - The development system has re-categorized aCompiledMethod, update 
  120652.     appropriately, depending on whether the method passes the receiver's filter."
  120653.  
  120654.     (filter value: aCompiledMethod) 
  120655.         ifTrue: [self model updateItem: aCompiledMethod ifAbsent: [self model add: aCompiledMethod]]
  120656.         ifFalse: [self model remove: aCompiledMethod ifAbsent: []]!
  120657.  
  120658. onMethodRemoved: aCompiledMethod
  120659.     "Private - The development system has removed aCompiledMethod. Remove this from
  120660.     our methods display if it includes it"
  120661.  
  120662.     self model remove: aCompiledMethod ifAbsent: [].
  120663.  
  120664.     "There may be visible effects (override markers) that need to be updated even when
  120665.     the removed method is from a different class. Force the method presenter to redraw 
  120666.     in order to guarantee that these are kept consistent"
  120667.     self selectableItems view updateAll
  120668.  
  120669.  
  120670.     !
  120671.  
  120672. onMethodSelected
  120673.     "Private - The method selected within the receiver has changed. 
  120674.     Refresh the source pane"
  120675.  
  120676.     | text method |
  120677.     self promptToCopyChanges.
  120678.     text := String new asRichText.
  120679.     method := self selectionOrNil.
  120680.     self clearParseTree.
  120681.     method notNil 
  120682.         ifTrue: 
  120683.             [sourcePresenter ensureVisible.
  120684.             text := method getColoredSource: (AutoFormat 
  120685.                                 ifTrue: [self parseTree ifNil: [method getSource] ifNotNil: [:tree | tree formattedCode]]
  120686.                                 ifFalse: [method getSource]).
  120687.             self evaluationContext: method methodClass instanceClass].
  120688.     sourcePresenter
  120689.         clearStatus;
  120690.         text: text;
  120691.         selectionRange: (1 to: 0).
  120692.     self trigger: #methodChanged!
  120693.  
  120694. onMethodSelectionChanging: aSelectionChangingEvent
  120695.     "Private - A selection is about to change  within the receiver.
  120696.     Prompt to save any outstanding changes"
  120697.  
  120698.     self clearParseTree.
  120699.     self onPromptToSaveChanges: aSelectionChangingEvent!
  120700.  
  120701. onMethodUpdated: aCompilationResult
  120702.     "Private - The development system has added aCompiledMethod. Check to see if this should
  120703.     be included in the receiver's display of methods by running it through the filter. If it
  120704.     shouldn't then remove any existing occurence of it from the display"
  120705.  
  120706.     self onMethod: aCompilationResult oldMethod updatedTo: aCompilationResult method!
  120707.  
  120708. onPromptToSaveChanges: aSelectionChangingEvent
  120709.     "Private - Check to see if the method source has been changed. 
  120710.     If so prompt to see if the changes should be retained and if they should then
  120711.     set the value of the parameter to false"
  120712.  
  120713.     ^sourcePresenter prompt: 'source' toSaveChanges: aSelectionChangingEvent!
  120714.  
  120715. onTipTextRequired: tool
  120716.     "Tool tip text is required for the <ToolbarItem>, tool."
  120717.  
  120718.     | cmd |
  120719.     cmd := tool command.
  120720.     cmd == #browseHierarchy 
  120721.         ifTrue: [^'Open Hierarchy Browser on ' , self selection printString].
  120722.     cmd == #browseSystem 
  120723.         ifTrue: [^'Open System Browser on ' , self selection printString].
  120724.     #clearSelection == cmd ifTrue: [^'Delete ' , self selection printString].
  120725.     ^super onTipTextRequired: tool!
  120726.  
  120727. onViewClosed
  120728.     "Sent by the receiver's view when it has been closed.
  120729.     Disconnect from any events triggered by the devlopment system"
  120730.  
  120731.     super onViewClosed.
  120732.     self systemModel removeEventsTriggeredFor: self!
  120733.  
  120734. onViewOpened
  120735.     "Received when the receiver's view is been connected. "
  120736.  
  120737.     super onViewOpened.
  120738.     self applyOptions!
  120739.  
  120740. parseTree
  120741.     methodAST == DeafObject current ifTrue: [methodAST := self buildParseTree].
  120742.     ^methodAST!
  120743.  
  120744. promptToCopyChanges
  120745.     "Private - If there are any changes, prompt the user as to whether they wish to copy them
  120746.     to the clipboard because a class selection change has occurred that is not preventable."
  120747.  
  120748.     ^self onPromptToSaveChanges: (SelectionChangedEvent forSource: self) yourself!
  120749.  
  120750. promptToSaveChanges
  120751.     ^self onPromptToSaveChanges: ((SelectionChangingEvent forSource: self)
  120752.                 oldSelection: self method;
  120753.                 yourself)!
  120754.  
  120755. queryCommand: aCommandQuery 
  120756.     "Private - Enters details about a potential command for the receiver into the 
  120757.     <CommandQuery> argument."
  120758.  
  120759.     | selector method hasMethodSelected |
  120760.     selector := aCommandQuery commandSymbol.
  120761.     method := self selectionOrNil.
  120762.     hasMethodSelected := method notNil.
  120763.     #clearSelection == selector 
  120764.         ifTrue: 
  120765.             [selector := self deleteItCommand.
  120766.             selector isNil 
  120767.                 ifTrue: 
  120768.                     [aCommandQuery isEnabled: false.
  120769.                     ^true]].
  120770.     #newMethod == selector 
  120771.         ifTrue: 
  120772.             [aCommandQuery isEnabled: false.
  120773.             ^false].    "Can't add new methods as don't know class"
  120774.     #browseMethodInheritanceChain == selector 
  120775.         ifTrue: 
  120776.             [aCommandQuery isEnabled: (hasMethodSelected and: [method isOverride]).
  120777.             ^true].
  120778.     (#(#browseMessages #browseDefinitions #browseReferences #definitionsMenu #referencesMenu #localDefinitionsMenu #localReferencesMenu #browseIt #inspectIt #browseHierarchy #browsePackages) 
  120779.         identityIncludes: selector) 
  120780.             ifTrue: 
  120781.                 [aCommandQuery isEnabled: hasMethodSelected.
  120782.                 ^true].
  120783.     #browseMethodInheritanceChain == selector 
  120784.         ifTrue: 
  120785.             [aCommandQuery isEnabled: (hasMethodSelected and: [method isOverride]).
  120786.             ^true].
  120787.     #browseSystem == selector 
  120788.         ifTrue: 
  120789.             [aCommandQuery isEnabled: (hasMethodSelected and: [self respondsTo: #browseSystem]).
  120790.             ^true].
  120791.     (#(#addCategoryMenu #removeCategoryMenu #categorizeMethod #methodPackage #removeMethod #reformatSource) 
  120792.         identityIncludes: selector) 
  120793.             ifTrue: 
  120794.                 [aCommandQuery isEnabled: self hasEditableMethodSelected.
  120795.                 ^true].
  120796.     #removeCategoryMenu == selector 
  120797.         ifTrue: 
  120798.             [aCommandQuery isEnabled: (hasMethodSelected 
  120799.                         and: [(method categories reject: [:cat | cat isVirtual]) notEmpty]).
  120800.             ^true].
  120801.     #browseMethodClass == selector 
  120802.         ifTrue: 
  120803.             [| name |
  120804.             name := method isNil ifTrue: ['Class'] ifFalse: [method methodClass name].
  120805.             aCommandQuery text: (aCommandQuery commandDescription menuText formatWith: name).
  120806.             aCommandQuery isEnabled: hasMethodSelected.
  120807.             ^true].
  120808.     #browseMethodPackage == selector 
  120809.         ifTrue: 
  120810.             [| name pkg |
  120811.             (hasMethodSelected and: [(pkg := method owningPackage) notNil]) 
  120812.                 ifTrue: 
  120813.                     [name := pkg name printString.
  120814.                     aCommandQuery isEnabled: true]
  120815.                 ifFalse: 
  120816.                     [name := 'Package'.
  120817.                     aCommandQuery isEnabled: false].
  120818.             aCommandQuery text: (aCommandQuery commandDescription menuText formatWith: name).
  120819.             ^true].
  120820.     "We want find next to work, even when the source pane does not have focus"
  120821.     #findNext == selector 
  120822.         ifTrue: 
  120823.             [(hasMethodSelected and: [sourcePresenter findDetails notNil]) 
  120824.                 ifTrue: 
  120825.                     [aCommandQuery
  120826.                         isEnabled: true;
  120827.                         receiver: sourcePresenter view.
  120828.                     ^true]].
  120829.     #togglePrivate == selector 
  120830.         ifTrue: 
  120831.             [aCommandQuery
  120832.                 isEnabled: self hasEditableMethodSelected;
  120833.                 isChecked: (hasMethodSelected and: [method isPrivate]).
  120834.             ^true].
  120835.     #widenSourceSelection == selector 
  120836.         ifTrue: 
  120837.             [| node |
  120838.             node := self selectedNode.
  120839.             aCommandQuery isEnabled: (node isNil or: [node isMethod]) not.
  120840.             ^true].
  120841.     (self systemModel canRefactor and: [self queryRefactoringCommand: aCommandQuery]) 
  120842.         ifTrue: [^true].
  120843.     ^super queryCommand: aCommandQuery!
  120844.  
  120845. reformatSource
  120846.     "Reformat and syntax colour the current contents of the method source pane, but do not accept it.
  120847.     This is linked to the source pane's Edit/Reformat context menu command, but is invoked only when
  120848.     there is a method selected and no selection in the source pane itself."
  120849.  
  120850.     self reformatSourceIn: self selection methodClass!
  120851.  
  120852. reformatSourceIn: class
  120853.     (self reformattedMethodSourceIn: class) ifNotNil: 
  120854.             [:formatted | 
  120855.             | colored |
  120856.             colored := self syntaxColorOfMethod: formatted in: class.
  120857.             self source: colored]!
  120858.  
  120859. reformattedMethodSourceIn: aClass
  120860.     "Private - Reformat the and answer the current method source, compiling it in the context of the 
  120861.     <ClassDescription> argument."
  120862.  
  120863.     | reformatted source |
  120864.     source := self source.
  120865.     sourcePresenter clearErrors.
  120866.     
  120867.     [reformatted := (SmalltalkParser parseMethod: source in: aClass) 
  120868.                 formattedCode] 
  120869.             on: SmalltalkCompilerError
  120870.             do: 
  120871.                 [:e | 
  120872.                 sourcePresenter
  120873.                     selectionRange: e range;
  120874.                     compilerNotification: e offset: 0.
  120875.                 e okToContinue].
  120876.     ^reformatted!
  120877.  
  120878. removeMethod
  120879.     "Removes the selected method from the system"
  120880.  
  120881.     self promptToSaveChanges ifFalse: [^self].
  120882.     self systemModel removeMethod: self selection!
  120883.  
  120884. reportError: err parsing: method
  120885.     Transcript
  120886.         nextPutAll: 'Error ';
  120887.         print: err errorCode;
  120888.         nextPutAll: ' on line ';
  120889.         display: err line;
  120890.         nextPutAll: ' of ';
  120891.         print: method;
  120892.         nextPutAll: ' -> ';
  120893.         print: err errorMessage;
  120894.         cr!
  120895.  
  120896. saveMethod: aString fromOriginal: aCompiledMethod
  120897.     ^self 
  120898.         saveMethod: aString
  120899.         in: aCompiledMethod methodClass
  120900.         categories: aCompiledMethod categories
  120901.         package: aCompiledMethod owningPackage!
  120902.  
  120903. saveMethod: aString in: aClass categories: aCollection package: aPackageOrNil 
  120904.     | modified originalSelection newMethod |
  120905.     originalSelection := sourcePresenter selectionRange.
  120906.     modified := sourcePresenter isModified.
  120907.     sourcePresenter
  120908.         clearErrors;
  120909.         isModified: false.
  120910.     
  120911.     [newMethod := aClass 
  120912.                 compile: aString
  120913.                 categories: aCollection
  120914.                 package: aPackageOrNil] 
  120915.             on: CompilerNotification
  120916.             do: [:cn | sourcePresenter compilerNotification: cn offset: 0].
  120917.     newMethod isNil 
  120918.         ifTrue: 
  120919.             ["If the compilation fails we need a visual indication, and want to restore the modified flag"
  120920.             sourcePresenter text: (self syntaxColorOfMethod: aString in: aClass).
  120921.             sourcePresenter isModified: modified]
  120922.         ifFalse: [self selectionOrNil == newMethod ifFalse: [self selection: newMethod ifAbsent: []]].
  120923.     (sourcePresenter showFirstError: 0) 
  120924.         ifFalse: [sourcePresenter view selectionRange: originalSelection].
  120925.     ^newMethod!
  120926.  
  120927. selectableItems
  120928.     "Private - Answer the name of the <selectableItems> component that actually handles the selectable items in the receiver"
  120929.  
  120930.     ^methodsPresenter!
  120931.  
  120932. selectedNode
  120933.     | range |
  120934.     range := sourcePresenter selectionRange.
  120935.     range isEmpty ifTrue: [range := range start to: range start].
  120936.     ^self parseTree ifNotNil: 
  120937.             [:tree | 
  120938.             | node |
  120939.             node := tree whichNodeIsContainedBy: range.
  120940.             node isNil ifTrue: [node := tree bestNodeFor: range].
  120941.             node]!
  120942.  
  120943. selectedWord
  120944.     ^sourcePresenter selectedWord!
  120945.  
  120946. selection: aCompiledMethod ifAbsent: exceptionHandler
  120947.     "Set the currently selected method to aCompiledMethod"
  120948.  
  120949.     aCompiledMethod isNil 
  120950.         ifTrue: [self resetSelection]
  120951.         ifFalse: [super selection: aCompiledMethod ifAbsent: exceptionHandler]!
  120952.  
  120953. sortBlock
  120954.     ^self selectableItems sortBlock!
  120955.  
  120956. sortBlock: anObject
  120957.     self selectableItems sortBlock: anObject
  120958. !
  120959.  
  120960. source
  120961.     "Answer the source for the currently selected method as a String"
  120962.  
  120963.     ^sourcePresenter plainText!
  120964.  
  120965. source: aString 
  120966.     "Replace the method source with the <readableString> argument."
  120967.  
  120968.     ^sourcePresenter text: aString; isModified: true!
  120969.  
  120970. sourceSelection
  120971.     "Answer the current selection of the selected methods source."
  120972.  
  120973.     ^sourcePresenter view selection!
  120974.  
  120975. syntaxColorOfMethod: source in: class 
  120976.     ^class compilerClass syntaxColorOfMethod: source in: class!
  120977.  
  120978. systemModel
  120979.     ^SmalltalkSystem current!
  120980.  
  120981. togglePrivate
  120982.     "Private - Toggle the selected method between public and private status."
  120983.  
  120984.     | method |
  120985.     method := self selection.
  120986.     method isPrivate 
  120987.         ifTrue: [self systemModel publicizeMethod: method]
  120988.         ifFalse: [self systemModel privatizeMethod: method]!
  120989.  
  120990. widenSourceSelection
  120991.     | node |
  120992.     node := self selectedNode.
  120993.     [sourcePresenter selectionRange = node sourceInterval] whileTrue: 
  120994.             [node := node parent.
  120995.             node isNil 
  120996.                 ifTrue: 
  120997.                     [Sound warningBeep.
  120998.                     ^self]].
  120999.     sourcePresenter selectionRange: node sourceInterval! !
  121000.  
  121001. ResourceListPresenter comment:
  121002. 'ResourceListPresenter implements a <listPresenter> used to display a list of <ResourceIdentifier>s. It adds the ability to source drag and drop operations for resources, and various commands to operate on resources such as showing them, editing them, browsing their owning class, etc.
  121003.  
  121004. Instance Variables:
  121005.     filterBlock        <monadicValuable> used as a discrimator to select resources for inclusion in the list.
  121006.  
  121007.  
  121008.  
  121009. '!
  121010. !ResourceListPresenter class methodsFor!
  121011.  
  121012. defaultModel
  121013.     "Answer a default model to be assigned to the receiver when it
  121014.     is initialized."
  121015.  
  121016.     ^ListModel newEquality! !
  121017.  
  121018. !ResourceListPresenter methodsFor!
  121019.  
  121020. browseHierarchy
  121021.     "Open a new class browser on the hierarchy at the same point as the receiver."
  121022.  
  121023.     self systemModel browseHierarchy: self resourceIdentifier owningClass!
  121024.  
  121025. browseIt
  121026.     "Open a new browser (i.e. a view composer) on the selected resource."
  121027.  
  121028.     self editResource!
  121029.  
  121030. caption
  121031.     ^caption!
  121032.  
  121033. clearSelection
  121034.     "Remove the selected resource from the ResourceManager."
  121035.  
  121036.     self deleteResource!
  121037.  
  121038. createSchematicWiring
  121039.     "Create the trigger wiring for the receiver"
  121040.  
  121041.     super createSchematicWiring.
  121042.     (self resourceManager)
  121043.         when: #resourceAdded:
  121044.             send: #onResourceAdded:
  121045.             to: self;
  121046.         when: #resourceRemoved:
  121047.             send: #onResourceRemoved:
  121048.             to: self.
  121049.     self
  121050.         when: #drag:
  121051.             send: #onDragResource:
  121052.             to: self;
  121053.         when: #actionPerformed
  121054.             send: #editResource
  121055.             to: self.
  121056.     self systemModel packageManager 
  121057.         when: #resourceRepackaged:from:to:
  121058.         send: #onResourceRepackaged:from:to:
  121059.         to: self!
  121060.  
  121061. defaultSortBlock
  121062.     "Private - Answer a default sort block to use when the receiver is sorted"
  121063.  
  121064.     ^ResourceIdentifier!
  121065.  
  121066. deleteResource
  121067.     "Remove the selected resource from the system."
  121068.  
  121069.     self selections do: [:each | self systemModel deleteResource: each]!
  121070.  
  121071. editResource
  121072.     "Invoke an appropriate editor on the selected resource."
  121073.  
  121074.     self resourceIdentifier browse!
  121075.  
  121076. filterBlock: monadicValuable
  121077.     "Set the receiver's filterBlock inst var to monadicValuable. The monadicValuable is used as a
  121078.     disciminator to select from all potential <ResourceIdentifier>s only those of interest to the receiver."
  121079.  
  121080.     | sel |
  121081.     filterBlock := monadicValuable.
  121082.     caption := ''.
  121083.     sel := self selectionOrNil.
  121084.     self refresh.
  121085.     self selection: sel ifAbsent: []!
  121086.  
  121087. initialize
  121088.     "Private - Initialize the receiver"
  121089.  
  121090.     super initialize.
  121091.     caption := ''.
  121092.     self basicBeSorted!
  121093.  
  121094. onDragResource: aDragDropSession 
  121095.     "This is where the receiver specifies which object(s) the <DragDropSession>
  121096.     session is to drag using #addDragObject: or #dragObjects:."
  121097.  
  121098.     | resId ddObject |
  121099.     resId := aDragDropSession suggestedSource.
  121100.     ddObject := aDragDropSession newDragObject: resId resource copy.
  121101.     ddObject format: #ResourceIdentifier data: resId.
  121102.     aDragDropSession
  121103.         dragObjects: (OrderedCollection with: ddObject);
  121104.         defaultOperation: #copy!
  121105.  
  121106. onResourceAdded: aResourceIdentifier
  121107.     "Private - The resource identified by aResourceIdentifier has been removed.
  121108.     Refresh the receiver appropriately."
  121109.  
  121110.     (self passesFilter: aResourceIdentifier) ifTrue: [self model add: aResourceIdentifier]!
  121111.  
  121112. onResourceRemoved: aResourceIdentifier
  121113.     "Private - The resource identified by aResourceIdentifier has been removed.
  121114.     Refresh the receiver appropriately."
  121115.  
  121116.     self model remove: aResourceIdentifier ifAbsent: [].!
  121117.  
  121118. onResourceRepackaged: aResourceIdentifier from: aPackage to: aPackage2
  121119.     | index |
  121120.     index := self model indexOf: aResourceIdentifier.
  121121.     (self passesFilter: aResourceIdentifier) 
  121122.         ifTrue: 
  121123.             [index = 0 
  121124.                 ifTrue: [self model add: aResourceIdentifier]
  121125.                 ifFalse: [self model updateAtIndex: index]]
  121126.         ifFalse: [index ~= 0 ifTrue: [self model removeAtIndex: index]]!
  121127.  
  121128. onViewDestroyed
  121129.     "Handler for view final view destruction. This is sent on receipt of WM_NCDESTROY,
  121130.     and is expected to be the last communication from Windows."
  121131.  
  121132.     self resourceManager removeEventsTriggeredFor: self.
  121133.     ^super onViewDestroyed!
  121134.  
  121135. onViewOpened
  121136.     "The view has been opened on the receiver. Display initial contents"
  121137.  
  121138.     super onViewOpened.
  121139.     self showAllResources!
  121140.  
  121141. passesFilter: aResourceIdentifier
  121142.     ^filterBlock isNil or: [filterBlock value: aResourceIdentifier]!
  121143.  
  121144. queryCommand: aCommandQuery 
  121145.     "Private - Enter details about a potential command for the receiver 
  121146.     into the <CommandQuery>, query."
  121147.  
  121148.     | selector |
  121149.     selector := aCommandQuery commandSymbol.
  121150.     (#(#clearSelection #deleteResource) identityIncludes: selector) 
  121151.         ifTrue: 
  121152.             [aCommandQuery isEnabled: self selections notEmpty.
  121153.             ^true].
  121154.     #showResource == selector 
  121155.         ifTrue: 
  121156.             [| rid |
  121157.             rid := self resourceIdentifier.
  121158.             aCommandQuery isEnabled: (rid notNil and: [rid canShow]).
  121159.             ^true].
  121160.     (#(#properties #resourcePackage #browseIt #editResource) identityIncludes: selector) 
  121161.         ifTrue: 
  121162.             [aCommandQuery isEnabled: self resourceIdentifier notNil.
  121163.             ^true].
  121164.     (#(#browseHierarchy #browseSystem) identityIncludes: selector) 
  121165.         ifTrue: 
  121166.             [| name rid |
  121167.             rid := self resourceIdentifier.
  121168.             name := rid isNil ifTrue: ['Classes'] ifFalse: [rid owningClass name].
  121169.             aCommandQuery
  121170.                 isEnabled: rid notNil;
  121171.                 text: (aCommandQuery commandDescription menuText formatWith: name).
  121172.             ^true].
  121173.     ^super queryCommand: aCommandQuery!
  121174.  
  121175. queryMoveResource: aResourceIdentifier toPackage: aPackage 
  121176.     "Private - Move aResourceIdentifier from its existing package to the specified
  121177.     <Package> if the user confirms."
  121178.  
  121179.     | resourcePackage |
  121180.     resourcePackage := aResourceIdentifier owningPackage.
  121181.     (MessageBox 
  121182.         confirm: ('The resource ''%1'' is currently owned by the ''%2'' package%n%nAre you sure you would like to move it to ''%3''?' 
  121183.                 formatWith: aResourceIdentifier printString
  121184.                 with: resourcePackage name
  121185.                 with: aPackage name)
  121186.         caption: 'Move resource to new package...') 
  121187.             ifTrue: [aPackage addResourceIdentifier: aResourceIdentifier]!
  121188.  
  121189. refresh
  121190.     "Private - Re-display the receiver's contents"
  121191.  
  121192.     | rids |
  121193.     rids := self resourceManager allResourceIdentifiers.
  121194.     filterBlock notNil ifTrue: [rids := rids select: filterBlock].
  121195.     self list: rids!
  121196.  
  121197. resourceIdentifier
  121198.     "Answer the selected <ResourceIdentifier> iff there is exactly one selection."
  121199.  
  121200.     | rids |
  121201.     rids := self selections.
  121202.     ^rids size = 1 ifTrue: [rids first]!
  121203.  
  121204. resourceManager
  121205.     "Answer the system ResourceManager."
  121206.  
  121207.     ^SessionManager current resourceManager
  121208. !
  121209.  
  121210. resourcePackage
  121211.     "Prompt for the user to repackage the selected resource."
  121212.  
  121213.     | pkg newPkg rid |
  121214.     rid := self resourceIdentifier.
  121215.     pkg := rid owningPackage.
  121216.     newPkg := PackagePrompter 
  121217.                 showModalOn: pkg asValue
  121218.                 caption: 'Package of ' , rid displayString , '...'
  121219.                 default: rid owningClass owningPackage.
  121220.     (newPkg notNil and: [newPkg ~= pkg]) 
  121221.         ifTrue: [self queryMoveResource: rid toPackage: newPkg]!
  121222.  
  121223. showAllResources
  121224.     "Set the receiver's filter block to display all resources."
  121225.  
  121226.     self filterBlock: nil.
  121227.     caption := 'All Resources'!
  121228.  
  121229. showResource
  121230.     "Display the selected resource in whatever manner is appropriate for it."
  121231.  
  121232.     self resourceIdentifier show!
  121233.  
  121234. showResourcesOfKind: aClass
  121235.     "Set the receiver's filter block to display resources that 
  121236.     are a kind of aClass"
  121237.  
  121238.     caption := 'Resources of type: ' , aClass name.
  121239.     self filterBlock: ([:resID | resID resource isKindOf: aClass]
  121240.                 receiver: nil;
  121241.                 yourself)!
  121242.  
  121243. showResourcesOwnedByPackages: aPackageCollection
  121244.     "Set the receiver's filter block to display resources owned by aPackage"
  121245.  
  121246.     caption := 'Resources in Package(s)'.
  121247.     self filterBlock: (
  121248.             [:resID | 
  121249.             aPackageCollection 
  121250.                 includes: (Package manager packageOfResourceIdentifierOrItsClass: resID)]
  121251.                 receiver: nil;
  121252.                 yourself).
  121253. !
  121254.  
  121255. showResourcesReferencing: anObject
  121256.     "Set the receiver's filter block to display resources that 
  121257.     reference the specified <Object>."
  121258.  
  121259.     self filterBlock: [:resID | resID resource refersTo: anObject].
  121260.     caption := 'Resources referencing ', anObject printString!
  121261.  
  121262. systemModel
  121263.     "Private - Answer the development system model."
  121264.  
  121265.     ^Smalltalk developmentSystem! !
  121266.  
  121267. TreeListPresenter comment:
  121268. 'TreeListPresenter implements a <listPresenter> component that can be used to display the contents of a <listModel> within a <treeView>.  It also conforms to <selectableItems> and <indexSelectableItems> to provide methods for accessing the current selection(s) in the list. The hierarchical presentation is controlled by a tree model (set separately using #treeModel:) but the actual visible nodes are determined by the contents of the list. Only those nodes that are actually in the list or are parents of those in the list will be displayed. 
  121269.  
  121270. In the default view, the intermediate nodes (i.e. those not in the list) are displayed in a faded colour. By default, these nodes are selectable but this decision can be controlled using #hasProtectedIntermediateNodes:.
  121271.  
  121272. Instance Variables:
  121273.     treePresenter            <treePresenter> used to display the objects in the receiver''s list in a hierarchical format.
  121274.     tlpFlags                <Integer> for flag bits.
  121275.  
  121276. Class Variables:
  121277.     ProtectIntermediateNodesMask    <Integer> flag mask to indicate whether intermediate tree nodes should be protected.
  121278.  
  121279.  
  121280.  
  121281. '!
  121282. !TreeListPresenter class methodsFor!
  121283.  
  121284. defaultModel
  121285.     "Answer a default model to be assigned to the receiver when it
  121286.     is initialized."
  121287.  
  121288.     ^ListModel new!
  121289.  
  121290. initialize
  121291.     "Private - Initialise the receiver's class variables:
  121292.  
  121293.     self initialize
  121294.     "
  121295.  
  121296.     ProtectIntermediateNodesMask := 16r01.
  121297. ! !
  121298.  
  121299. !TreeListPresenter methodsFor!
  121300.  
  121301. createSchematicWiring
  121302.     "Create the trigger wiring for the receiver"
  121303.  
  121304.     super createSchematicWiring.
  121305.     self model 
  121306.         when: #listChanged
  121307.         send: #onListChanged
  121308.         to: self!
  121309.  
  121310. initialize
  121311.     "Private - Initialize the receiver"
  121312.  
  121313.     super initialize.
  121314.     self treeModel: VirtualTreeModel new.
  121315. !
  121316.  
  121317. list 
  121318.     "Answer the contents of the receiver"
  121319.  
  121320.     ^self model list!
  121321.  
  121322. list: aSequenceableCollection
  121323.     "Set the contents of the receiver to be aSequenceableCollection"
  121324.  
  121325.     ^self model list: aSequenceableCollection!
  121326.  
  121327. model
  121328.     "Private - Answer the list model used to display the contents of the receiver"
  121329.  
  121330.     ^listModel!
  121331.  
  121332. model: aListModel
  121333.     "Set the list model used to display the contents of the receiver"
  121334.  
  121335.     listModel := aListModel!
  121336.  
  121337. onListChanged
  121338.     "Private - The receiver's list has changed. Repopulate the tree"
  121339.  
  121340.     | set |
  121341.     set := Set new.
  121342.     self list do: 
  121343.             [:each | 
  121344.             set
  121345.                 addAll: (self treeModel allParentsOf: each);
  121346.                 add: each].
  121347.     self treeModel filter: [:x | set includes: x].
  121348.     self treeModel: self treeModel
  121349. !
  121350.  
  121351. onViewOpened
  121352.     "Received when the receiver's view is been connected. "
  121353.  
  121354.     super onViewOpened.
  121355.     self onListChanged.!
  121356.  
  121357. refresh
  121358.     "Private - Refresh the display of the receiver"
  121359.  
  121360.     | originalSelection |
  121361.     originalSelection := self selectionOrNil.
  121362.     self noEventsDo: 
  121363.             [self onListChanged.
  121364.             self selection: originalSelection ifAbsent: []]!
  121365.  
  121366. treeModel
  121367.     "Private - Answer the tree model used to display the contents of the receiver"
  121368.  
  121369.     ^super model!
  121370.  
  121371. treeModel: aTreeModel
  121372.     "Set the tree model used to display the contents of the receiver to aTreeModel"
  121373.  
  121374.     super model: aTreeModel.!
  121375.  
  121376. viewModel
  121377.     "Private - Answer the model that is to be connected to the view. It is actually
  121378.     connected to the receiver's tree model - not the receiver's list model"
  121379.  
  121380.     ^self treeModel! !
  121381.  
  121382. Calculator comment:
  121383. 'Calculator is a <topShell> sample application which illustrates the use of the Dolphin Compiler class in a runtime application. See the package comment for more details.'!
  121384. !Calculator class methodsFor!
  121385.  
  121386. displayOn: aStream
  121387.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  121388.     would want to see it."
  121389.  
  121390.     aStream nextPutAll: 'Smalltalk Calculator'!
  121391.  
  121392. icon
  121393.     "Answers an Icon that can be used to represent this class"
  121394.  
  121395.     ^##(self) defaultIcon!
  121396.  
  121397. initialize
  121398.     "Private - Initialize the receiver's class variables
  121399.         self initialize
  121400.     "
  121401.  
  121402.     Smalltalk developmentSystem 
  121403.         addSamplesFolderIconFor: self description: self displayString!
  121404.  
  121405. uninitialize
  121406.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  121407.  
  121408.     Smalltalk developmentSystem
  121409.         removeSystemFolderIconNamed: self displayString! !
  121410.  
  121411. !Calculator methodsFor!
  121412.  
  121413. clearTape
  121414.     "Clears the tape output window"
  121415.  
  121416.     output clear
  121417. !
  121418.  
  121419. createComponents
  121420.     "Private - Create the presenters contained by the receiver"
  121421.  
  121422.     super createComponents.
  121423.     input := self add: TextPresenter new name: 'input'.
  121424.     output := self add: TextPresenter new name: 'output'.
  121425. !
  121426.  
  121427. displayIt
  121428.     "Evaluates the contents of the input field as a Smalltalk expression and displays
  121429.     the result in the output window"
  121430.     
  121431.     self print: self evaluateIt printString
  121432. !
  121433.  
  121434. evaluateIt
  121435.     "Evaluates the contents of the input field as a Smalltalk expression and answers the result"
  121436.     
  121437.     | result |
  121438.     [[ result := Compiler evaluate: input value logged: false ]
  121439.         on: CompilerErrorNotification do: [:x | self print: x description ]]
  121440.             on: Error do: [:x | self print: 'Error: ', x description ].
  121441.     input clear.    
  121442.     ^result
  121443. !
  121444.  
  121445. print: aString 
  121446.     "Private - Prints aString to the output tape"
  121447.  
  121448.     | stream |
  121449.     stream := String new writeStream.
  121450.     stream 
  121451.         nextPutAll: output value;
  121452.         nextPutAll: aString; cr.
  121453.     output value: stream contents.
  121454.     output view lineScroll: output view lineCount.
  121455. ! !
  121456.  
  121457. Dialog comment:
  121458. 'Dialog is an abstract <dialogPresenter> superclass for allowing model data to be displayed and edited within a top-level modal dialog window. The fact that a Dialog is modal means that any changes made to the displayed data are usually buffered and not written directly back to the model until they are explicitly applied. This happens, usually after clicking an OK button. Hence a user has the opportunity of cancelling out of a Dialog without any changes being made to the underlying model.
  121459.  
  121460. When designing a <dialogPresenter> it is necessary to make an initial decision as to how the model data should be edited. If the model is a mutable object, in that it is legal (and sensible) to modify it in place using its aspect accessors, then it is sensible to treat it as a simple <dialogPresenter> and it can be subclassed directly from Dialog itself. If, on the other hand, the model is to be immutable then the dialog should be implemented as a <valueDialogPresenter> and, most likely, be subclassed from the ValueDialog class. The decision made here can often be quite subtle. On the one hand, making changes to a mutable object seems the most direct approach, however, a <valueDialogPresenter> can often be more flexible because it can be connected to anything that supports the <valueModel> protocol. Often the choice comes down to this: If the identity of the underlying model data must remain unchanged then use a standard <dialogPresenter>. If this is not the case then a <valueDialogPresenter> will be more suitable.
  121461.  
  121462. From this point let us consider the operation of a standard <dialogPresenter>. When the dialog is created, and given a subject model on which to operate, an <AspectBuffer> is created onto this subject. This is used to buffer the changes to any of the subject''s aspects so that they do not affect the original data directly. It is this <AspectBuffer> that is used as the actual model for the <dialogPresenter>. Interestingly, the use of an <AspectBuffer> imposes an additional factor in the decision to use a standard <dialogPresenter> rather than a <valueDialogPresenter>, this being, that the subject model must be capable of being cloned correctly using #copy. For more details see the comment for AspectBuffer itself.
  121463.  
  121464. Instance Variables:
  121465.     confirmed        <boolean> indicating whether the dialog has been confirmed and the changes applied.
  121466.     ownerView    <topView> which owns the dialog and is suspended waiting for it to complete.
  121467.  
  121468. '!
  121469. !Dialog class methodsFor!
  121470.  
  121471. icon
  121472.     "Answers an Icon that can be used to represent this class"
  121473.  
  121474.     ^##(self) defaultIcon!
  121475.  
  121476. showModal
  121477.     "Creates a default instance of the receiver with a default view    and displays it modal 
  121478.     to the current active window. 
  121479.     Answers the result of the dialog if confirmed or nil otherwise"
  121480.  
  121481.     ^self create showModal!
  121482.  
  121483. showModal: aDialogResourceNameString
  121484.     "Creates an instance of the receiver with a view identified by aResourceNameString
  121485.     and displays it modal to the current    active window. 
  121486.     Answers the result of dialog if confirmed or nil otherwise"
  121487.  
  121488.     ^(self create: aDialogResourceNameString) showModal!
  121489.  
  121490. showModal: aDialogResourceNameString on: aModel
  121491.     "Creates an instance of the receiver with a view identified by aResourceNameString
  121492.     and connected to aModel. The view is displayed modal to the current active window. 
  121493.     Answers the result of dialog if confirmed or nil otherwise"
  121494.  
  121495.     ^(self create: aDialogResourceNameString on: aModel) showModal!
  121496.  
  121497. showModalOn: aModel
  121498.     "Creates an instance of the receiver with a default view and connected to aModel. 
  121499.     The view is displayed modal to the current active window. 
  121500.     Answers the result of dialog if confirmed or nil otherwise"
  121501.  
  121502.     ^(self createOn: aModel) showModal! !
  121503.  
  121504. !Dialog methodsFor!
  121505.  
  121506. answer
  121507.     "Answer the model if the receiver was confirmed (with #apply, #ok) or nil otherwise"
  121508.  
  121509.     ^self isConfirmed
  121510.         ifTrue: [ self model subject ]
  121511.         ifFalse: [ nil ]!
  121512.  
  121513. apply
  121514.     "Apply the changes cached in the receiver back to the original model. This can be used to
  121515.     dynamically see the effect of the changes without closing the dialog. More often
  121516.     it is sent by the #ok method just before closing the associated view."
  121517.  
  121518.     | focus |
  121519.  
  121520.     "First ensure that any changes cached in the view with focus (if any) are flushed"
  121521.     focus := View focus.
  121522.     focus isNil ifFalse: [focus updateModel].
  121523.  
  121524.     self model apply.
  121525.     confirmed := true.!
  121526.  
  121527. bufferedModelFor: aSubjectModel
  121528.     "Private - Answers a buffer suitable for the receiver on aSubjectModel. This will become the
  121529.     actual model to which the receiver is bound. May be overriden by subclasses that
  121530.     wish to use a different buffering scheme."
  121531.  
  121532.     ^AspectBuffer subject: aSubjectModel.
  121533.  
  121534.  
  121535.     !
  121536.  
  121537. cancel
  121538.     "Close the receiver without applying the changes back to the original model"
  121539.  
  121540.     self view close.
  121541. !
  121542.  
  121543. initialize
  121544.     "Private - Initialize the receiver"
  121545.  
  121546.     super initialize.
  121547.     self ownerView: View active.
  121548.     confirmed := false
  121549. !
  121550.  
  121551. isConfirmed
  121552.     "Answer true if the receiver has been confirmed and changes have been applied
  121553.     to the associated model. Can be sent after the dialog view has closed
  121554.     to determine (usually) if the Ok button was pressed."
  121555.  
  121556.     ^confirmed!
  121557.  
  121558. model: aSubjectModel
  121559.     "Set the model of the receiver to be a buffer onto of aSubjectModel."
  121560.     
  121561.     | actualModel |
  121562.     actualModel := aSubjectModel notNil ifTrue: [
  121563.         self bufferedModelFor: aSubjectModel ].
  121564.     super model: actualModel.!
  121565.  
  121566. ok
  121567.     "Close the receiver and apply the changes cached in the receiver back to the model"
  121568.  
  121569.     self apply.
  121570.     self view close.
  121571. !
  121572.  
  121573. ownerView
  121574.     "Answer the view that is parent/owner of the receiver"
  121575.  
  121576.     ^ownerView
  121577. !
  121578.  
  121579. ownerView: aView
  121580.     "Private - Set the view that is parent/owner of the receiver"
  121581.  
  121582.     ownerView := aView.
  121583. !
  121584.  
  121585. revert
  121586.     "Revert the changes cached in the receiver and go back to the data in the original subject."
  121587.  
  121588.     self model revert
  121589. !
  121590.  
  121591. showModal
  121592.     "Show the receiver's view as a modal dialog.
  121593.     Answer the model if the receiver was confirmed (with #apply, #okay) or nil otherwise"
  121594.  
  121595.     self view showModalTo: ownerView.
  121596.     ^self answer    !
  121597.  
  121598. showShell
  121599.     "Show the receiver a modeless dialog"
  121600.  
  121601.     self show!
  121602.  
  121603. subject
  121604.     "Answer the original model onto which the receiver was created"
  121605.     
  121606.     ^self model subject! !
  121607.  
  121608. DocumentShell comment:
  121609. 'DocumentShell is an abstract class describing <documentPresenter>s that wish to be able to load and save their model data from/to a file. 
  121610.  
  121611. The <documentPresenter> protocol defines a number of methods which may be overriden by the concrete subclasses of DocumentShell. In particular, #isText and #isRichText are available to indicate whether the document data can be saved to one of these two common file formats (ASCII and RTF). If both these methods answer false then the default implementation will choose to save the model data to an STB file stream.
  121612.  
  121613. Instance Variables:
  121614.     filename        <readableString> or nil, describing the document filename (if it has been set).
  121615.  
  121616. '!
  121617. !DocumentShell class methodsFor!
  121618.  
  121619. defaultFileExtension
  121620.     "Answer a default extension that will be used for files saved from
  121621.     the receiver"
  121622.  
  121623.     ^''!
  121624.  
  121625. filename: aStringFilename
  121626.     "Answers an instance of the receiver open on aStringFilename"
  121627.  
  121628.     ^self show filename: aStringFilename; fileLoad; yourself!
  121629.  
  121630. fileTypes
  121631.     "Answer an Array of file types that can be associated with this
  121632.     class of document. Overidden by documents that have their own file
  121633.     types"
  121634.  
  121635.     ^Array with: FileDialog allFilesType
  121636. !
  121637.  
  121638. open
  121639.     "Answers an instance of the receiver open on a filename that has been
  121640.     prompted for. If 'Cancel' is pressed in the file open dialog then
  121641.     answer nil"
  121642.  
  121643.     | openFilename |
  121644.     openFilename := FileOpenDialog new
  121645.         fileTypes: self fileTypes;
  121646.         defaultExtension: self defaultFileExtension;
  121647.         showModal.
  121648.     openFilename isNil ifTrue: [ ^nil ].
  121649.     ^self filename: openFilename! !
  121650.  
  121651. !DocumentShell methodsFor!
  121652.  
  121653. basicCaption
  121654.     "Answer a basic caption that can be used to label the receiver's view.
  121655.     Normally this is augmented (in #updateCaption) by appending the document file
  121656.     name"
  121657.  
  121658.     ^''!
  121659.  
  121660. createSchematicWiring
  121661.     "Create the trigger wiring for the receiver"
  121662.     
  121663.     super createSchematicWiring.
  121664.     self when: #closeRequested: send: #onCloseRequested: to: self.!
  121665.  
  121666. fileLoad
  121667.     "Loads the receiver from its associated file (if any)"
  121668.  
  121669.     self hasFilename 
  121670.         ifTrue: 
  121671.             [| stream |
  121672.             stream := FileStream read: self filename text: self isText.
  121673.             self streamIn: stream.
  121674.             stream close]!
  121675.  
  121676. filename
  121677.     "Answers the name of the file associated with the receiver or nil
  121678.     if there is none"
  121679.  
  121680.     ^filename!
  121681.  
  121682. filename: aStringOrNil
  121683.     "Sets the name of the file associated with the receiver"
  121684.  
  121685.     filename := nil.
  121686.     (aStringOrNil notNil and: [ aStringOrNil notEmpty ])
  121687.         ifTrue: [ filename := aStringOrNil ].
  121688.     self updateCaption!
  121689.  
  121690. fileOpen
  121691.     "Prompts for a file to open into the receiver"
  121692.  
  121693.     self promptToSaveChanges ifTrue: [ | openFilename |
  121694.         openFilename := FileOpenDialog new
  121695.             fileTypes: self class fileTypes;
  121696.             defaultExtension: self class defaultFileExtension;
  121697.             showModal.
  121698.         openFilename notNil ifTrue: [
  121699.             self filename: openFilename.
  121700.             self fileLoad]].!
  121701.  
  121702. fileRevert
  121703.     "Revert the contents of the receiver's document to those in the
  121704.     associated file"
  121705.  
  121706.     self isModified 
  121707.         ifTrue: 
  121708.             [(MessageBox 
  121709.                 confirm: 'There are unsaved changes. Are you sure you wish to revert to the previously saved copy?') 
  121710.                     ifTrue: [self fileLoad]]
  121711.         ifFalse: [self fileLoad    "Load without prompt it not modified"]!
  121712.  
  121713. fileSave
  121714.     "Saves the receiver to its associated file (if any).
  121715.     Prompts for a filename if none is yet specified."
  121716.  
  121717.     | saved |
  121718.     saved := false.
  121719.     
  121720.     [self hasFilename 
  121721.         ifTrue: 
  121722.             [| stream |
  121723.             stream := FileStream write: self filename text: self isText.
  121724.             [self streamOut: stream] ensure: [stream close].
  121725.             self isModified: false.
  121726.             saved := true]
  121727.         ifFalse: [saved := self fileSaveAs]] 
  121728.             on: FileException
  121729.             do: 
  121730.                 [:e | 
  121731.                 MessageBox errorMsg: 'Unable to save file ' , e file name printString
  121732.                     caption: 'Error - ' , e messageText].
  121733.     ^saved!
  121734.  
  121735. fileSaveAs
  121736.     "Associated the receiver with a file and saves it.
  121737.     Answers whether the file was actually saved."
  121738.  
  121739.     | newFilename proceed |
  121740.     newFilename := (FileSaveDialog on: self filename asValue)
  121741.                 fileTypes: self class fileTypes;
  121742.                 defaultExtension: self class defaultFileExtension;
  121743.                 caption: 'Save Document As...';
  121744.                 showModal.
  121745.     (proceed := newFilename notNil and: 
  121746.                     [(File exists: newFilename) not or: 
  121747.                             [MessageBox 
  121748.                                 confirm: ('%1%nThis file already exists, are you sure you would like to overwrite it?' 
  121749.                                         formatWith: newFilename)
  121750.                                 caption: SessionManager current applicationName]]) 
  121751.         ifTrue: 
  121752.             ["Install the new filename"
  121753.  
  121754.             self
  121755.                 filename: newFilename;
  121756.                 fileSave].
  121757.     ^proceed!
  121758.  
  121759. getDocumentData
  121760.     "Private - Answer the data for the receiver's document.
  121761.     Can be overidden by subclasses"
  121762.  
  121763.     ^self model!
  121764.  
  121765. hasFilename
  121766.     "Answers true if the receiver has an associated file"
  121767.  
  121768.     ^filename notNil
  121769. !
  121770.  
  121771. isModified
  121772.     "Answer whether the document in the receiver has been modified."
  121773.  
  121774.     ^false!
  121775.  
  121776. isModified: aBoolean
  121777.     "Set/reset the receiver's dirty flag.
  121778.     To be overridden by subclasses which support such a concept."
  121779. !
  121780.  
  121781. isRichText
  121782.     "Answer true if the receiver is a rich text document. Overriden by subclasses
  121783.     to determine how the document data should be written and read.
  121784.     N.B. If the answer is true, then #isText must also answer true."
  121785.  
  121786.     ^false!
  121787.  
  121788. isText
  121789.     "Answer true if the receiver is a text document. Overriden by subclasses
  121790.     to determine how the document data should be written and read"
  121791.  
  121792.     ^false!
  121793.  
  121794. onCloseRequested: boolValueHolder
  121795.     "A request to close the view onto the receiver as occurred.
  121796.     Prompt to save any outstanding changed"
  121797.  
  121798.     self onPromptToSaveChanges: boolValueHolder!
  121799.  
  121800. onPromptToSaveChanges: aBooleanValue 
  121801.     "Private - The receiver is about to lose its current contents (or is being closed)
  121802.     as the result of some user action. If the displayed document has been changed
  121803.     then prompt to see if those changes should be retained, giving the user the option 
  121804.     of (a) saving the changes now, (b) discarding the changes, or (c) retaining the 
  121805.     changes and aborting whatever operation brought us to this point. If the 
  121806.     operation is to be aborted, then the boolean <ValueHolder> argument is 
  121807.     set to false."
  121808.  
  121809.     self isModified 
  121810.         ifTrue: 
  121811.             [| docName |
  121812.             docName := self hasFilename ifTrue: [self filename] ifFalse: ['(untitled)'].
  121813.             MessageBox 
  121814.                 confirm: ('Save changes to %1?' formatWith: docName)
  121815.                 onYes: [aBooleanValue value: self fileSave]
  121816.                 onNo: [self isModified: false]
  121817.                 onCancel: [aBooleanValue value: false]].
  121818.     ^aBooleanValue value!
  121819.  
  121820. promptToSaveChanges
  121821.     "Private - If the receiver's document has been modified, prompt to save changes.
  121822.     Answer false if the user cancelled the action or if an attempt to save the document 
  121823.     failed, else true."
  121824.  
  121825.     | continue |
  121826.     continue := true asValue.
  121827.     self onPromptToSaveChanges: continue.
  121828.     ^continue value!
  121829.  
  121830. queryCommand: query
  121831.     "Private - Enters details about a potential command for the receiver into 
  121832.     the <CommandQuery>, query"
  121833.  
  121834.     (query commandSymbol == #fileRevert) ifTrue: [
  121835.         query isEnabled: self hasFilename.
  121836.         ^true].
  121837.  
  121838.     ^super queryCommand: query
  121839. !
  121840.  
  121841. setDocumentData: anObject
  121842.     "Private - Set the data for the receiver's document to be anObject.
  121843.     Can be overidden by subclasses"
  121844.  
  121845.     self model: anObject!
  121846.  
  121847. streamIn: aStream
  121848.     "Private - Stream the receiver's model contents in from aStream"
  121849.  
  121850.     | data |
  121851.     self isText 
  121852.         ifTrue: [
  121853.             data := aStream setToEnd; contents.
  121854.             self isRichText ifTrue: [data := RichText fromRtf: data]]
  121855.         ifFalse: [data := Object binaryReadFrom: aStream].
  121856.     self setDocumentData: data.!
  121857.  
  121858. streamOut: aStream
  121859.     "Private - Stream the receiver's model out to aStream"
  121860.  
  121861.     | data |
  121862.     data := self getDocumentData.
  121863.     self isText 
  121864.         ifTrue: [aStream nextPutAll: data]
  121865.         ifFalse: [data binaryStoreOn: aStream]!
  121866.  
  121867. updateCaption
  121868.     "The receiver has changed in such a way that the caption may need to be refreshed.
  121869.     Do this here"
  121870.  
  121871.     | text suffix |
  121872.     text := (self hasFilename 
  121873.             ifTrue: [self filename ]
  121874.             ifFalse: ['Untitled']).
  121875.     suffix := self basicCaption.
  121876.     suffix isEmpty ifFalse: [text := text, ' - ', suffix].
  121877.     self caption: text
  121878.  
  121879.     ! !
  121880.  
  121881. PersonalAccountShell comment:
  121882. 'PersonalAccountShell is a <topPresenter> for displaying and editing a <PersonalAccount> model. It displays the list of <PersonalAccountTransaction>s currently held by the account together with the initial and current balances. The ability to create, delete and modify existing transactions is provided.
  121883.  
  121884. Example of an PersonalAccountShell operating on a new account:
  121885. PersonalAccountShell show
  121886.  
  121887. Instance Variables:
  121888.     namePresenter        <TextPresenter> holding the account name.
  121889.     accountNumberPresenter    <TextPresenter> holding the account number.
  121890.     initialBalancePresenter    <NumberPresenter> holding the initial balance.
  121891.     transactionsPresenter        <ListPresenter> holding a list of <PersonalAccountTransaction>s.
  121892.     currentBalancePresenter    <NumberPresenter> displaying the current balance.
  121893.  
  121894.  
  121895.  
  121896. '!
  121897. !PersonalAccountShell class methodsFor!
  121898.  
  121899. defaultModel
  121900.     "Answer a default model to be assigned to the receiver when it
  121901.     is initialized."
  121902.  
  121903.     ^PersonalAccount new
  121904. ! !
  121905.  
  121906. !PersonalAccountShell methodsFor!
  121907.  
  121908. createComponents
  121909.     "Create the presenters contained by the receiver"
  121910.  
  121911.     super createComponents.
  121912.     namePresenter := self add: TextPresenter new name: 'name'.
  121913.     accountNumberPresenter := self add: TextPresenter new name: 'accountNumber'.
  121914.     initialBalancePresenter := self add: NumberPresenter new name: 'initialBalance'.
  121915.     transactionsPresenter := self add: ListPresenter new name: 'transactions'.
  121916.     currentBalancePresenter := self add: NumberPresenter new name: 'currentBalance'.
  121917.  
  121918.  
  121919. !
  121920.  
  121921. createSchematicWiring
  121922.     "Create the trigger wiring for the receiver"
  121923.     
  121924.     super createSchematicWiring.
  121925.     transactionsPresenter when: #actionPerformed send: #editTransaction to: self.
  121926.     !
  121927.  
  121928. editTransaction
  121929.     "Edit the selected transaction"
  121930.  
  121931.     | transaction |
  121932.     transaction := self selectedTransactionOrNil.
  121933.     transaction notNil ifTrue: [
  121934.         self model removeTransaction: transaction.
  121935.         PersonalAccountTransactionDialog showModalOn: transaction.
  121936.         self model addTransaction: transaction.
  121937.         self selectedTransactionOrNil: transaction ]
  121938.     !
  121939.  
  121940. hasSelectedTransaction
  121941.     "Answer true it there is a currently selected transaction in the receiver"
  121942.  
  121943.     ^transactionsPresenter hasSelection!
  121944.  
  121945. model: aPersonalAccount
  121946.     "Set the model associated with the receiver."
  121947.  
  121948.     super model: aPersonalAccount.
  121949.     namePresenter model: (aPersonalAccount aspectValue: #name).
  121950.     accountNumberPresenter model: (aPersonalAccount aspectValue: #accountNumber).
  121951.     initialBalancePresenter model: (aPersonalAccount aspectValue: #initialBalance).
  121952.     transactionsPresenter model: (aPersonalAccount transactions).
  121953.     currentBalancePresenter model: (aPersonalAccount aspectValue: #currentBalance).
  121954.  
  121955.     "Sometimes a model may trigger events when some aspects it owns are changed. For these aspects
  121956.     we must inform the ValueAspectAdaptor that this is the case. This prevents the adaptor from updating
  121957.     its observers twice. I the case a a PersonalAccount, the only aspect that triggers a change itself is
  121958.     #currentBalance. We inform our newly created aspect adaptor that its model triggers #currentBalanceChanged
  121959.     whenever the currentBalance is updated. See PersonalAccount>>currentBalance:."
  121960.  
  121961.     currentBalancePresenter model aspectTriggers: #currentBalanceChanged.
  121962. !
  121963.  
  121964. newTransaction
  121965.     "Prompt for a new transaction and add it to the receiver's model"
  121966.  
  121967.     | newTransaction |
  121968.     (newTransaction := PersonalAccountTransactionDialog showModal) notNil ifTrue: [
  121969.         self model addTransaction: newTransaction.
  121970.         self selectedTransactionOrNil: newTransaction ]
  121971.     !
  121972.  
  121973. queryCommand: aCommandQuery
  121974.     "Enters details about a potential command for the receiver into aCommandQuery"
  121975.  
  121976.     super queryCommand: aCommandQuery.
  121977.     (#(editTransaction removeTransaction) includes: aCommandQuery command) ifTrue: [
  121978.         aCommandQuery isEnabled: self hasSelectedTransaction ]
  121979. !
  121980.  
  121981. removeTransaction
  121982.     "Removes the current transaction from the receiver's model"
  121983.  
  121984.     | transaction |
  121985.     transaction := self selectedTransactionOrNil.
  121986.     transaction notNil ifTrue: [
  121987.         self model removeTransaction: transaction ]
  121988.     !
  121989.  
  121990. selectedTransactionOrNil
  121991.     "Answer the currently selected transaction or nil if there is none"
  121992.  
  121993.     ^transactionsPresenter selectionOrNil!
  121994.  
  121995. selectedTransactionOrNil: aPersonalAccountTransactionOrNil
  121996.     "Sets the currently selected transaction to aPersonalAccountTransactionOrNil.
  121997.     If nil if there will be no selection"
  121998.  
  121999.     ^transactionsPresenter selectionOrNil: aPersonalAccountTransactionOrNil! !
  122000.  
  122001. RegEdit comment:
  122002. 'RegEdit is a <topShell> sample application which implements most of the functionality of the Windows utility, RegEdit. It does not implement the full functionality of the standard tool because it is primarily intended as a demonstration of the use of registry access classes, and the tree and enhanced list views. It supports in-place registry key name editing.
  122003.  
  122004. Example:
  122005. RegEdit show
  122006.  
  122007. BE WARNED, as with the standard RegEdit, it is possible to corrupt your registry with this tool, so please use with care!!
  122008.  
  122009. Instance Variables:
  122010.     keyPresenter    <TreePresenter> holding the hierarchy of registry keys.
  122011.     valuesPresenter    <ListPresenter> displaying the registry entries for selected keys.
  122012.     statusModel    <ValueHolder> for displaying status information.
  122013.  
  122014. Class Variables:
  122015.     ResourceLib    <ExternalResourceLibrary> for accessing resources within the standard REGEDIT.EXE.
  122016.  
  122017.  
  122018.  
  122019.  
  122020.  
  122021. '!
  122022. !RegEdit class methodsFor!
  122023.  
  122024. about
  122025.     "Private - Pop up a little helpful info. about this sample program."
  122026.  
  122027.     MessageBox new
  122028.         caption: 'About Dolphin Registry Editor';
  122029.         icon: self icon;
  122030.         text: ('Simple Registry Editor Sample. Copyright (c) Object Arts Ltd, 1998-2002.%n%1%n
  122031. This is a reduced functionality implementation of the standard system utility REGEDIT.EXE,
  122032. intended to demonstrate various features of Dolphin''s application framework such as
  122033. virtual tree models, and in-place label editing.%n 
  122034. DISCLAIMER: This software is freely provided purely as an educational sample and as such it
  122035. is provided "as is", WITHOUT ANY WARRANTY; without even the implied warranty of 
  122036. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Furthermore, as with 
  122037. the real registry editor extreme care and expert knowledge are required to avoid damaging the 
  122038. installation of the operating system or other software on your machine if any modifications to the 
  122039. registry are attempted. Please take care - we accept no responsibility for any damage to your 
  122040. computer''s configuration which may be caused by the use of this sample.'
  122041.             formatWith: VMLibrary default fullVersion);
  122042.         open
  122043.         !
  122044.  
  122045. binaryIcon
  122046.     "Answers an Icon that can be used to represent binary values."
  122047.  
  122048.     ^Icon fromId: 206 in: self resourceLib!
  122049.  
  122050. closeResourceLib
  122051.     "Private - Tidy up the resource library that we used to obtain an icon"
  122052.  
  122053.     ResourceLib isNil ifFalse: [ResourceLib close. ResourceLib := nil].
  122054. !
  122055.  
  122056. displayOn: aStream
  122057.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  122058.     would want to see it."
  122059.  
  122060.     aStream nextPutAll: 'Registry Editor'!
  122061.  
  122062. displayStringForValue: anObject
  122063.     "Private - Answer an appropriate registry editor display string for the argument, anObject.
  122064.     Not clean, but we don't want to add these as polymorphic operations into the types
  122065.     of object in the registry.
  122066.     This method also illustrates the use of the C-runtime library function sprintf() for
  122067.     fast string formatting."
  122068.  
  122069.     | s n crt max |
  122070.     anObject isNil ifTrue: [^String fromId: 27 in: self resourceLib].
  122071.     crt := CRTLibrary default.
  122072.     anObject isInteger ifTrue: [^'0x%08x (%u)' sprintfWith: anObject with: anObject].
  122073.     (anObject isKindOf: String) ifTrue: [^'"', anObject, '"'].
  122074.     "Assume its a byte array"
  122075.     anObject isEmpty ifTrue: [^String fromId: 22 in: self resourceLib].
  122076.     n := anObject size.
  122077.     max := 64 min: n.
  122078.     s := String writeStream: max+1 * 3.
  122079.     (1 to: max) do: [:i |
  122080.         s nextPutAll: ('%02x' sprintfWith: (anObject basicAt: i))]
  122081.         separatedBy: [s space].
  122082.     max < n ifTrue: [s nextPutAll: '...'].
  122083.     ^s contents!
  122084.  
  122085. icon
  122086.     "Answers an Icon that can be used to represent this class.
  122087.     Use the one from the real Windows Registry Editor for fun."
  122088.  
  122089.     ^Icon fromId: 100 in: self resourceLib!
  122090.  
  122091. iconFor: anObject
  122092.     "Private - Answer an appropriate registry editor icon for the argument, anObject.
  122093.     Not clean, but..."
  122094.  
  122095.     ^(anObject isNil or: [anObject isKindOf: String])
  122096.         ifTrue: [self stringIcon]
  122097.         ifFalse: [self binaryIcon]!
  122098.  
  122099. initialize
  122100.     "Private - Initialize the receiver's class variables
  122101.         self initialize
  122102.     "
  122103.  
  122104.     Smalltalk developmentSystem
  122105.         addSamplesFolderIconFor: self description: self displayString!
  122106.  
  122107. keyIcon
  122108.     "Answers an Icon that can be used to registry keys."
  122109.  
  122110.     ^Icon fromId: 203 in: self resourceLib!
  122111.  
  122112. onPreStripImage
  122113.     "Private - The image is about to be stripped. Nil any lazily initialized class variables."
  122114.  
  122115.     self closeResourceLib!
  122116.  
  122117. resourceLib
  122118.     "Private - Answer the registry editor resource library (regedit.exe)"
  122119.  
  122120.     ResourceLib isNil ifTrue: [ResourceLib := ExternalResourceLibrary open: 'regedit.exe'].
  122121.     ^ResourceLib!
  122122.  
  122123. stringIcon
  122124.     "Answers an Icon that can be used to string values."
  122125.  
  122126.     ^Icon fromId: 205 in: self resourceLib!
  122127.  
  122128. uninitialize
  122129.     "Private - Uninitialize the receiver as it is about to be removed from the system.
  122130.         self uninitialize
  122131.     "
  122132.  
  122133.     self closeResourceLib.
  122134.     Smalltalk developmentSystem
  122135.         removeSystemFolderIconNamed: self displayString! !
  122136.  
  122137. !RegEdit methodsFor!
  122138.  
  122139. aboutRegistryEditor
  122140.     "Private - Pop up a little helpful info. about this sample program."
  122141.  
  122142.     self class about!
  122143.  
  122144. additionalAccelerators
  122145.     ^#(#(#renameIt 'F2'))!
  122146.  
  122147. copyKeyName
  122148.     "Private - Copy the full path name of the currently selected key to the clipboard."
  122149.  
  122150.     self selectedKey fullPath copyToClipboard!
  122151.  
  122152. createComponents
  122153.     "Create the presenters contained by the receiver"
  122154.  
  122155.     super createComponents.
  122156.     keyPresenter := self add: (TreePresenter on: RegTreeModel new)  name: 'keys'.
  122157.     valuesPresenter := self add: ListPresenter new name: 'values'.!
  122158.  
  122159. createSchematicWiring
  122160.     "Create the trigger wiring for the receiver"
  122161.     
  122162.     super createSchematicWiring.
  122163.  
  122164.     keyPresenter 
  122165.         when: #selectionChanged send: #onKeySelected to: self;
  122166.         when: #labelOf:editedTo:accept: send: #onKey:renamedTo:accept: to: self;
  122167.         when: #aboutToEditLabel:accept: send: #onAboutToRenameKey:accept: to: self";
  122168.         when: #selectionChanging: send: #onSelectionChanging: to: self".
  122169.  
  122170.     valuesPresenter
  122171.         when: #labelOf:editedTo:accept: send: #onValue:renamedTo:accept: to: self;
  122172.         when: #aboutToEditLabel:accept: send: #onAboutToRenameValue:accept: to: self
  122173.         !
  122174.  
  122175. delete
  122176.     "Private - Delete the selected item (if confirmed)."
  122177.  
  122178.     keyPresenter view hasFocus ifTrue: [^self deleteSelectedKey].
  122179.     valuesPresenter view hasFocus ifTrue: [^self deleteSelectedValue].
  122180.     Sound warningBeep!
  122181.  
  122182. deleteSelectedKey
  122183.     "Private - Delete the selected registry key."
  122184.  
  122185.     | key parentKey |
  122186.     key := self selectedKey.
  122187.     key isRoot ifTrue: [^nil].        "Can't delete root key."
  122188.     (MessageBox new
  122189.             text: (String fromId: 48 in: self resourceLib);
  122190.             caption: (String fromId: 49 in: self resourceLib);
  122191.             icon: Warning icon;
  122192.             yesNo;
  122193.             open) == #yes
  122194.         ifTrue: [
  122195.             parentKey := key parentKey.
  122196.             [
  122197.                 parentKey removeKey: key name ifAbsent: [^self].
  122198.                 keyPresenter  model remove: key.
  122199.             ] on: HRESULTError do: [:e | e okCancel]]!
  122200.  
  122201. deleteSelectedValue
  122202.     "Private - Delete the selected registry value."
  122203.  
  122204.     | idx value parentKey |
  122205.     idx := valuesPresenter selectionByIndex.
  122206.     idx == 0 ifTrue: [^self].
  122207.     (MessageBox new
  122208.             text: (String fromId: 50 in: self resourceLib);
  122209.             caption: (String fromId: 51 in: self resourceLib);
  122210.             icon: Warning icon;
  122211.             yesNo;
  122212.             open) == #yes
  122213.         ifTrue: [
  122214.             [
  122215.                 value := valuesPresenter model at: idx.
  122216.                 self selectedKey subValues removeKey: value key ifAbsent: [^self].
  122217.                 value value: nil.
  122218.                 value key isEmpty 
  122219.                     ifTrue: [valuesPresenter model updateAtIndex: idx]
  122220.                     ifFalse: [valuesPresenter model removeAtIndex: idx].
  122221.             ] on: HRESULTError do: [:e | e okCancel]]!
  122222.  
  122223. exportKey: key toFile: path
  122224.     "Private - Write a .reg file describing the selected key and its subkeys to the specified
  122225.     path."
  122226.  
  122227.     | stream sel |
  122228.     stream := FileStream write: path.
  122229.     stream nextPutAll: 'REGEDIT4'; cr; cr.        "RegEdit 4.0 format"
  122230.     key fileOutOn: stream.
  122231.     stream close!
  122232.  
  122233. exportRegistryFile
  122234.     "Private - Write a .reg file describing the selected key and its subkeys."
  122235.  
  122236.     | openFilename |
  122237.     openFilename := (FileSaveDialog new)
  122238.                 fileTypes: self fileTypes;
  122239.                 caption: 'Export Registry File';
  122240.                 showModal.
  122241.     openFilename notNil 
  122242.         ifTrue: [Cursor wait showWhile: [self exportKey: self selectedKey toFile: openFilename]].
  122243.     #todo    "Implement - custom file save dialog template"!
  122244.  
  122245. fileTypes
  122246.     "Private - Answer an Array of file types used for registry import/export."
  122247.  
  122248.     | strings |
  122249.     strings := #('Registration Files (*.reg)' '*.reg' 'Registry Hive Files (*.*)' '*.*' 'All Files' '*.*').
  122250.     ^(1 to: strings size by: 2) 
  122251.         collect: [:i | Array with: (strings at: i) with: (strings at: i + 1)]!
  122252.  
  122253. helpTopics
  122254.     "Private - Pop up the registry editor help"
  122255.  
  122256.     ShellLibrary default 
  122257.         shellOpen: 'regedit.hlp' 
  122258.         directory: (File composePath: SessionManager current windowsDirectory subPath: 'help')!
  122259.  
  122260. importRegistryFile
  122261.     "Private - Import a .reg file selected by the user into the registry."
  122262.  
  122263.     | openFilename |
  122264.     openFilename := (FileOpenDialog new)
  122265.                 fileTypes: self fileTypes;
  122266.                 caption: 'Import Registry File';
  122267.                 showModal.
  122268.     openFilename notNil ifTrue: [ShellLibrary default shellOpen: openFilename]!
  122269.  
  122270. initialize
  122271.     "Private - Initialize the receiver"
  122272.  
  122273.     super initialize.
  122274.     keyPresenter model roots: RegKey roots!
  122275.  
  122276. newBinaryValue
  122277.     "Add a new, empty, string value under the currently selected key."
  122278.  
  122279.     self newValue: ByteArray new!
  122280.  
  122281. newDWORDValue
  122282.     "Add a new, empty, string value under the currently selected key."
  122283.  
  122284.     self newValue: 0!
  122285.  
  122286. newKey
  122287.     "Add a new, empty, sub-key under the currently selected key, 
  122288.     and leave the receiver in key renaming mode."
  122289.  
  122290.     | stem i sel newKey |
  122291.     stem := (String fromId: 23 in: self resourceLib) upTo: $%.
  122292.     i := 1.
  122293.     sel := self selectedKey.
  122294.     "Generate a unique key name"
  122295.     [newKey := stem, i displayString. sel includesKey: newKey] whileTrue: [i := i + 1].
  122296.     newKey := sel createKey: newKey.
  122297.     keyPresenter model add: newKey asChildOf: sel.
  122298.     keyPresenter
  122299.         selection: newKey;
  122300.         view editSelectionLabel!
  122301.  
  122302. newStringValue
  122303.     "Add a new, empty, string value under the currently selected key."
  122304.  
  122305.     self newValue: ''!
  122306.  
  122307. newValue: anObject
  122308.     "Add a new, empty, value under the currently selected key
  122309.     initialized with the specified value."
  122310.  
  122311.     | sel newValue |
  122312.     newValue := self newValueName.
  122313.     sel := self selectedKey subValues.
  122314.     sel at: newValue put: anObject.
  122315.     sel := valuesPresenter model addAnsweringIndex: newValue -> anObject.
  122316.     valuesPresenter
  122317.         selectionByIndex: sel;
  122318.         view editSelectionLabel!
  122319.  
  122320. newValueName
  122321.     "Private - Answer a new unique value name under the currently selected key."
  122322.  
  122323.     | stem i sel unique |
  122324.     stem := (String fromId: 24 in: self resourceLib) upTo: $%.
  122325.     i := 1.
  122326.     sel := self selectedKey subValues.
  122327.     [
  122328.         unique := stem, i displayString.
  122329.         sel includesKey: unique] whileTrue: [i := i + 1].
  122330.     ^unique!
  122331.  
  122332. onAboutToRenameKey: key accept: booleanValue
  122333.     "The registry key, key, is about to experience an in-place label edit.
  122334.     Determine whether to allow it."
  122335.  
  122336.     booleanValue value: key isRoot not!
  122337.  
  122338. onAboutToRenameValue: value accept: booleanValue
  122339.     "The registry value represented by the <Association>, value, 
  122340.     is about to experience an in-place label edit.  Determine 
  122341.     whether to allow it and set the <valueHolder>, booleanValue
  122342.     accordingly."
  122343.  
  122344.     booleanValue value: value key notEmpty!
  122345.  
  122346. onKey: key renamedTo: text accept: booleanValue
  122347.     "The registry key, key, has been renamed by the user to, text, by editing the label
  122348.     in the tree. Attempt to rename the key, and if successful, then set booleanValue 
  122349.     accordingly to indicate acceptance or otherwise."
  122350.  
  122351.     Warning signal: 'Key renaming is not yet implemented'.
  122352.     booleanValue value: key isRoot not!
  122353.  
  122354. onKeySelected
  122355.     "Private - The key selected within the receiver has changed. 
  122356.     Refresh the value pane."
  122357.  
  122358.     | key values |
  122359.     key := self selectedKey.
  122360.     key isNil 
  122361.         ifTrue: [
  122362.             valuesPresenter clear.
  122363.             "statusModel value: nil"]
  122364.         ifFalse: [
  122365.             values := SortedCollection sortBlock: [:a :b | a key < b key].
  122366.             key subValues keysAndValuesDo: [:k :v |
  122367.                 values add: k -> v].
  122368.             (values isEmpty or: [values first key notEmpty])
  122369.                 ifTrue: [values add: ('' -> nil)].
  122370.         valuesPresenter list: values asOrderedCollection.
  122371.         statusModel value: key]!
  122372.  
  122373. onValue: value renamedTo: text accept: booleanValue
  122374.     "The registry value represented by the <Association>, value, 
  122375.     has been renamed by the user to, text, by editing the label
  122376.     in the list view. Attempt to rename the value, and if successful, 
  122377.     then set <ValueHolder> booleanValue accordingly to indicate 
  122378.     acceptance or otherwise."
  122379.  
  122380.     | key |
  122381.     key := self selectedKey.
  122382.     key subValues changeKey: value key to: text.
  122383.     "We must also update the value to reflect the modification (could hook off nmSetDispInfo: ?)"
  122384.     value key: text.
  122385.     booleanValue value: true!
  122386.  
  122387. onViewOpened
  122388.     "Received when the receiver's view is been connected. "
  122389.  
  122390.     | statusItem |
  122391.     super onViewOpened.
  122392.     self class resourceLib.
  122393.     statusItem := self view viewNamed: 'key name' ifNone: [^self].
  122394.     statusModel := ValueHolder new.
  122395.     statusItem model: statusModel!
  122396.  
  122397. queryCommand: query
  122398.     "Private - Enters details about a potential command for the receiver into the 
  122399.     <CommandQuery>,  query."
  122400.  
  122401.     | command selKey selVal |
  122402.     command := query command.
  122403.  
  122404.     #toggleStatusBar == command ifTrue: [
  122405.         query isEnabled: false; isChecked: true.
  122406.         ^true].
  122407.  
  122408.     selKey := self selectedKey.
  122409.     (#(newKey newStringValue newDWORDValue newBinaryValue 
  122410.             exportRegistryFile copyKeyName) includes: command) ifTrue: [
  122411.         query isEnabled: selKey notNil. 
  122412.         ^true].
  122413.  
  122414.     "Modification of the root keys is not permitted."
  122415.     (#(deleteSelectedKey renameSelectedKey) includes: command) ifTrue: [
  122416.         query isEnabled: (selKey notNil and: [selKey isRoot not]). 
  122417.         ^true].
  122418.  
  122419.     selVal := self selectedValue.
  122420.  
  122421.     #renameSelectedValue == command ifTrue: [
  122422.         query isEnabled: (selVal notNil and: [selVal key notEmpty]). 
  122423.         ^true].
  122424.  
  122425.     #deleteSelectedValue == command ifTrue: [
  122426.         query isEnabled: selVal notNil.
  122427.         ^true].
  122428.  
  122429.     (#(delete rename) includes: query command) ifTrue: [
  122430.         keyPresenter view hasFocus ifTrue: [
  122431.             query isEnabled: (selKey notNil and: [selKey isRoot not]). 
  122432.             ^true].
  122433.         valuesPresenter view hasFocus ifTrue: [
  122434.             query isEnabled: (selVal notNil and: [selVal key notEmpty]). 
  122435.             ^true]].
  122436.  
  122437.     ^super queryCommand: query.
  122438. !
  122439.  
  122440. rename
  122441.     "Private - Initiate in-place label edit of the selected item."
  122442.  
  122443.     keyPresenter view hasFocus ifTrue: [^self renameSelectedKey].
  122444.     valuesPresenter view hasFocus ifTrue: [^self renameSelectedValue].
  122445.     Sound warningBeep!
  122446.  
  122447. renameSelectedKey
  122448.     "Private - Initiate in-place label edit of the selected key."
  122449.  
  122450.     keyPresenter view editSelectionLabel!
  122451.  
  122452. renameSelectedValue
  122453.     "Private - Initiate in-place label edit of the selected key."
  122454.  
  122455.     valuesPresenter view editSelectionLabel!
  122456.  
  122457. resourceLib
  122458.     "Answer the registry editor resource library (regedit.exe)."
  122459.  
  122460.     ^ResourceLib!
  122461.  
  122462. selectedKey
  122463.     "Answer the currently selected registry key."
  122464.  
  122465.     ^keyPresenter selectionOrNil!
  122466.  
  122467. selectedValue
  122468.     "Answer the currently selected registry entry."
  122469.  
  122470.     ^valuesPresenter selectionOrNil! !
  122471.  
  122472. SmalltalkToolShell comment:
  122473. 'SmalltalkToolShell is an abstract <topPresenter> providing umbrella functionality for most of the Dolphin development tools. 
  122474.  
  122475. All of the tools have the singleton instance of SmalltalkSystem as their model. This makes sense because the SmalltalkSystem is effectively a Facade onto the Smalltalk development image; all user interface modifications to the image should go through this central point. In this way, a tool is effectively acting as a view onto the development image. It is also convenient since all <model>s are also <commandTarget>s. This means that some user interface commands can be directly picked up and acted upon by the SmalltalkSystem without any intervention being required from the tool itself.
  122476.  
  122477. Class Variables:
  122478.     ReuseIfOpenMask        <integer> mask used to get/set the ''re-use if open'' flag.
  122479.  
  122480. Class Instance Variables:
  122481.     optionFlags        <integer>
  122482.     defaultView        <String> name of the default view.
  122483.     defaultExtent        <Point> specifying the default size of new views, nil if none set.
  122484.     additionalAccelerators    <Array> of 2-element <Array>s, being command <Symbol> accelerator key <String> pairs
  122485.  
  122486. '!
  122487. !SmalltalkToolShell class methodsFor!
  122488.  
  122489. defaultAdditionalAccelerators
  122490.     "Answer a collection of additional accelerator definitions for commands not on the menu bar of the receiver's view(s).
  122491.     Each element of the collection should be a two element <Array>, the first element of which is the command symbol
  122492.     and the second the accelerator key string."
  122493.  
  122494.     ^#(#(#inspectIt 'Shift+Ctrl+I'))!
  122495.  
  122496. defaultExtent
  122497.     "Answer a <Point> which is the user's chosen default extent for new instances
  122498.     of the receiver, or nil if left up to Windows."
  122499.  
  122500.     ^defaultExtent!
  122501.  
  122502. defaultExtent: aPoint
  122503.     "Set the default extent to be used for instances of the receiver to the <Point> argument.
  122504.     If the argument is nil, then let Windows decide."
  122505.  
  122506.     defaultExtent := aPoint!
  122507.  
  122508. defaultModel
  122509.     "Answer a default model to be assigned to the receiver when it
  122510.     is initialized."
  122511.  
  122512.     ^SmalltalkSystem current!
  122513.  
  122514. defaultView
  122515.     "Answer the resource name of the default view for the receiver.
  122516.     This is configurable for tool shells so that the developer can easily replace the
  122517.     standard Dolphin views if he or she wishes. For example one can reconfigure 
  122518.     to use simple class browser view if using a portable machine with limited screen 
  122519.     real estate."
  122520.  
  122521.     defaultView isNil ifTrue: [defaultView := super defaultView].
  122522.     ^defaultView!
  122523.  
  122524. defaultView: aString
  122525.     "Set the default view name."
  122526.  
  122527.     defaultView := aString!
  122528.  
  122529. getAdditionalAccelerators
  122530.     ^additionalAccelerators!
  122531.  
  122532. icon
  122533.     "Answers an Icon that can be used to represent this class"
  122534.  
  122535.     ^##(self) defaultIcon!
  122536.  
  122537. initialize
  122538.     "Private - Initialize the receiver's class variables."
  122539.  
  122540.     ReuseIfOpenMask := 1.        "Flags up to 16r80000 are reserved for common flags"!
  122541.  
  122542. initializeAfterLoad
  122543.     "Perform any post-load initialisation for the class.
  122544.     Superclass method only initializes direct implementors, so we must initialize others."
  122545.  
  122546.     self initializeOptionFlags.
  122547.     super initializeAfterLoad.!
  122548.  
  122549. initializeOptionFlags
  122550.     "Private - Set the default option flags."
  122551.  
  122552.     optionFlags := 0!
  122553.  
  122554. notificationGetImageBlock
  122555.     "Private - Answer a monadic valuable used for getting the image for a compiler
  122556.     notification status pane."
  122557.  
  122558.     ^IconicListAbstract!
  122559.  
  122560. notificationGetTextBlock
  122561.     "Private - Answer a monadic valuable used for getting the text for an compiler
  122562.     notification status pane."
  122563.  
  122564.     ^BasicListAbstract!
  122565.  
  122566. publishedAspects
  122567.     "Answer a <LookupTable> of the <Aspect>s published by the receiver."
  122568.  
  122569.     ^(super publishedAspects)
  122570.         add: (Aspect choice: #defaultView
  122571.                     from: (Smalltalk developmentSystem viewResourcesForClass: self) keys asSortedCollection);
  122572.         add: (Aspect name: #defaultExtent);
  122573.         add: (Aspect dictionary: #acceleratorKeyBindings) beImmutable;
  122574.         yourself!
  122575.  
  122576. registerAsToolWith: aSmalltalkSystem
  122577.     "The receiver is being registered as a tool with aSmalltalkSystem. Perform any
  122578.     additional registration operations here. Part of the <installableSystemTool>
  122579.     protocol, and implemented at this level so that 3.0 tools can be installed
  122580.     without amendment."
  122581.  
  122582.     !
  122583.  
  122584. reuseIfOpen
  122585.     "Answers true if an already open instance of the receiver should be reused instead of
  122586.     creating additional instances. In fact, it does not always make sense for a system tool
  122587.     to allow re-use. Therefore, although all tools support this functionality, only some
  122588.     expose it as a published aspect so that it may be set as a system option."
  122589.  
  122590.     ^optionFlags allMask: ReuseIfOpenMask 
  122591. !
  122592.  
  122593. reuseIfOpen: aBoolean
  122594.     "Set the receiver to reuse an already open instance of the receiver instead of
  122595.     creating an additional one according to aBoolean."
  122596.  
  122597.     optionFlags := optionFlags mask: ReuseIfOpenMask set: aBoolean!
  122598.  
  122599. setAdditionalAccelerators: anArray 
  122600.     additionalAccelerators := anArray isEmpty ifFalse: [anArray]!
  122601.  
  122602. show
  122603.     "Shows an instance of the receiver. If reuseIfOpen has been set to true then an 
  122604.     existing instance of the receiver will be shown and answered rather than
  122605.     a new instance."
  122606.  
  122607.     self reuseIfOpen 
  122608.         ifTrue: [self showExistingInstance ifNotNil: [:tool | ^tool]].
  122609.     ^super show!
  122610.  
  122611. showExistingInstance
  122612.     "Private - Show and answer an the existing, open, instance of this tool, if there is one."
  122613.  
  122614.     | allInstances openInstances |
  122615.     allInstances := self allInstances.
  122616.     openInstances := allInstances select: [:e | e isOpen].
  122617.     allInstances size > openInstances size 
  122618.         ifTrue: 
  122619.             [Notification signal: 'Warning: Zombie ' , self name , 's detected'.
  122620.             (allInstances difference: openInstances) do: [:e | e release]].
  122621.     ^openInstances size > 0 
  122622.         ifTrue: 
  122623.             [| tool |
  122624.             tool := openInstances first.
  122625.             (tool view)
  122626.                 zOrderTop;
  122627.                 show.
  122628.             tool]!
  122629.  
  122630. toolDescription
  122631.     "Answer the description of this tool that should be displayed in, for example,
  122632.     the system shell window."
  122633.  
  122634.     ^self displayString!
  122635.  
  122636. toolsFolderIcon
  122637.     "Answer an instance of SmalltalkSystemIcon suitable for representing the
  122638.     receiver in the system folder."
  122639.  
  122640.     ^SmalltalkSystemIcon 
  122641.         show: self 
  122642.         description: self toolDescription!
  122643.  
  122644. unregisterAsToolWith: aSmalltalkSystem
  122645.     "The receiver is being unregistered as a tool with aSmalltalkSystem. Perform any
  122646.     additional unregistration operations here. Part of the <installableSystemTool>
  122647.     protocol, and implemented at this level so that 3.0 tools can be installed
  122648.     without amendment."
  122649.  
  122650.     ! !
  122651.  
  122652. !SmalltalkToolShell methodsFor!
  122653.  
  122654. browseHierarchy
  122655.     "Open a new class hierarchy browser on Object."
  122656.  
  122657.     ^self systemModel browseHierarchy!
  122658.  
  122659. browseIt
  122660.     "Open a new default browser at the same point as the receiver.
  122661.     This is the workspace Browse-It command which is subtly different to the Browse Classes
  122662.     command, but for many cases the appropriate action is to open a class browser so we
  122663.     wire up to the #browseClasses command by default."
  122664.  
  122665.     Object browse!
  122666.  
  122667. canRefactor
  122668.     "Private - Answer whether the development tools support refactoring (requires that the Refactoring Engine be
  122669.     installed."
  122670.  
  122671.     ^self systemModel canRefactor!
  122672.  
  122673. forgetSize
  122674.     "Forget the default size for new instances of this tool."
  122675.  
  122676.     self class defaultExtent: nil!
  122677.  
  122678. help
  122679.     "Bring up a help page for this tool."
  122680.  
  122681.     self model openEducationTopicForTool: self!
  122682.  
  122683. inspectSystemOptions
  122684.     "Open an <AccessorInspector > on the system options."
  122685.  
  122686.     | inspector |
  122687.     inspector := PublishedAspectInspector shellOn: self class.
  122688.     inspector topShell caption: self class name , ' Options'.
  122689.         !
  122690.  
  122691. packageManager
  122692.     "Private - Answer the current PackageManager."
  122693.  
  122694.     ^Package manager
  122695.  
  122696. !
  122697.  
  122698. queryCommand: aCommandQuery 
  122699.     "Private - Enter details about a potential command for the receiver into the 
  122700.     <CommandQuery>."
  122701.  
  122702.     | command |
  122703.     command := aCommandQuery commandSymbol.
  122704.     #forgetSize == command 
  122705.         ifTrue: 
  122706.             [aCommandQuery isEnabled: self class defaultExtent notNil.
  122707.             ^true].
  122708.     (self canRefactor and: [self queryRefactoringCommand: aCommandQuery]) ifTrue: [^true].
  122709.     ^super queryCommand: aCommandQuery!
  122710.  
  122711. rememberThisSize
  122712.     "Record the size of the receiver as the default extent for its tool class."
  122713.  
  122714.     self class defaultExtent: self view extent!
  122715.  
  122716. show
  122717.     "Shows the view of the receiver.
  122718.     Pick up the default extent if any."
  122719.  
  122720.     | ext |
  122721.     ext := self class defaultExtent.
  122722.     ext isNil ifFalse: [self view extent: ext].
  122723.     ^super show!
  122724.  
  122725. systemModel
  122726.     ^SmalltalkSystem current! !
  122727.  
  122728. TestRunner comment:
  122729. 'A TestRunner is a simple graphical user interface to run test cases. A window can be opened via "TestRunner show". '!
  122730. !TestRunner class methodsFor!
  122731.  
  122732. defaultView
  122733.     ^'SUnit Runner 3.0'!
  122734.  
  122735. initialize
  122736.     "Private - Initialize the receiver. Register the tools folder icon with SmalltalkSystem.
  122737.  
  122738.         self initialize.
  122739.     "
  122740.     
  122741.     Smalltalk developmentSystem
  122742.         addAdditionalToolsFolderIcon: (SmalltalkSystemIcon show: self description: self toolDescription);
  122743.         registerTool: self!
  122744.  
  122745. open
  122746.     ^self show!
  122747.  
  122748. toolDescription
  122749.     "Answer the description of this tool that should be displayed in, for example,
  122750.     the system shell window."
  122751.  
  122752.     ^self displayString!
  122753.  
  122754. uninitialize
  122755.     "Private - Un-register the system tools folder icon for the receiver to allow clean
  122756.     removal of this class from the system.
  122757.         self uninitialize
  122758.     "
  122759.  
  122760.     Smalltalk developmentSystem
  122761.         removeSystemFolderIconNamed: self toolDescription;
  122762.         unregisterTool: self! !
  122763.  
  122764. !TestRunner methodsFor!
  122765.  
  122766. allTestSuite
  122767.     ^TestCase buildSuite!
  122768.  
  122769. createSchematicWiring
  122770.     | list |
  122771.     list := self view viewNamed: 'defects' ifNone: [^self].
  122772.     list when: #selectionChanged send: #debugTest to: self.    
  122773. !
  122774.  
  122775. debugFailedTest
  122776.     self debugTest!
  122777.  
  122778. debugTest
  122779.     | list button |
  122780.     list := self view viewNamed: 'defects' ifNone: [^self].
  122781.     list selectionOrNil isNil ifTrue: [^self].
  122782.     self debugTest: list selection.
  122783. !
  122784.  
  122785. debugTest: aTestCase 
  122786.     aTestCase isNil ifTrue: [^self].
  122787.     self displayMode: 'Debugging'.
  122788.     aTestCase debug!
  122789.  
  122790. displayClear
  122791.     self displayColor: #default!
  122792.  
  122793. displayColor: aSymbol
  122794.      (self view viewNamed: 'colorField') backcolor: (Color perform: aSymbol).
  122795.      (self view viewNamed: 'mode') backcolor: (Color perform: aSymbol).
  122796.      (self view viewNamed: 'details') backcolor: (Color perform: aSymbol)!
  122797.  
  122798. displayDefects: aCollection
  122799.     | list button |
  122800.     list := self view viewNamed: 'defects' ifNone: [^self].
  122801.     list selectionOrNil: nil.
  122802.     list list: aCollection.
  122803.     list isEnabled: aCollection isEmpty not.
  122804. !
  122805.  
  122806. displayDetails: aString
  122807.     | details |
  122808.     details := self view viewNamed: 'details' ifNone: [^self].
  122809.     details value: aString.
  122810.     !
  122811.  
  122812. displayFail
  122813.     self displayRed.
  122814.     self displayMode: 'Fail'.
  122815.     self displayDetails: result printString.!
  122816.  
  122817. displayGreen
  122818.      self displayColor: #green!
  122819.  
  122820. displayMode: aString
  122821.      | mode |
  122822.     mode := self view viewNamed: 'mode' ifNone: [^self].
  122823.     mode value: aString.
  122824.     !
  122825.  
  122826. displayPass
  122827.     self displayGreen.
  122828.     self displayMode: 'Pass'.
  122829.     self displayDetails: result runCount printString , ' run' , self timeSinceLastPassAsString.
  122830.     lastPass := Time now!
  122831.  
  122832. displayRed
  122833.      self displayColor: #red!
  122834.  
  122835. displayReset
  122836.     self displayClear.
  122837.     self displayMode: 'N/A'.
  122838.     self displayDetails: '...'.
  122839.     self displayDefects: OrderedCollection new.!
  122840.  
  122841. displayRunning
  122842.     self displayYellow.
  122843.     self displayMode: 'running'. 
  122844.     self displayDetails: '...'.!
  122845.  
  122846. displayYellow
  122847.      self displayColor: #yellow!
  122848.  
  122849. formatTime: aTime 
  122850.     aTime hours > 0 ifTrue: [^aTime hours printString , 'h'].
  122851.     aTime minutes > 0 ifTrue: [^aTime minutes printString , 'min'].
  122852.     ^aTime seconds printString , ' sec'!
  122853.  
  122854. onViewOpened
  122855.  
  122856.     super onViewOpened.
  122857.     self caption: 'SUnit Camp Smalltalk ', TestCase sunitVersion, ' TestRunner'.
  122858.     (self view viewNamed: 'scriptModel') 
  122859.         list: TestCase allSubclasses.
  122860.     !
  122861.  
  122862. refreshTests
  122863.     (self view viewNamed: 'scriptModel') 
  122864.         list: TestCase allSubclasses; 
  122865.         selectionByIndex: 0; 
  122866.         updateAll.
  122867.     self displayReset.
  122868.  
  122869. !
  122870.  
  122871. runAllTests
  122872.     self runSuite: self allTestSuite!
  122873.  
  122874. runSuite: aTestSuite 
  122875.     self displayRunning.
  122876.     aTestSuite addDependentToHierachy: self.
  122877.     [result := aTestSuite run]
  122878.         ensure: [aTestSuite removeDependentFromHierachy: self].
  122879.     self updateWindow!
  122880.  
  122881. runTests
  122882.     self script isNil ifFalse: 
  122883.         [self runSuite: self script suite]!
  122884.  
  122885. script
  122886.     | scriptModel |
  122887.     scriptModel := self view viewNamed: 'scriptModel' ifNone: [^nil].
  122888.     scriptModel selectionOrNil isNil ifTrue: [^nil].
  122889.     ^scriptModel selection!
  122890.  
  122891. timeSinceLastPassAsString
  122892.     lastPass isNil ifTrue: [^''].
  122893.     ^', ' , (self formatTime: (Time now subtractTime: lastPass)) , ' since last Pass'!
  122894.  
  122895. update: anObject 
  122896.     (anObject isKindOf: TestCase)
  122897.         ifTrue: [self displayDetails: anObject printString]
  122898.         ifFalse: [super update: anObject]!
  122899.  
  122900. updateDefects
  122901.     self displayDefects: result defects!
  122902.  
  122903. updateWindow
  122904.     result hasPassed
  122905.         ifTrue: [self displayPass]
  122906.         ifFalse: [self displayFail].
  122907.     self updateDefects! !
  122908.  
  122909. TranscriptShell comment:
  122910. 'TranscriptShell is a <SmalltalkToolShell> that implements the Transcript notification logging window.
  122911.  
  122912. Note that although TranscriptShell is a development tool, it is not dependent on the Development System package to operate. Among the Dolphin development tools it is unusual in that its model is not SmalltalkSystem, which means that it has to reproduce some of the functionality normally implemented there.
  122913.  
  122914. Instance Variables:
  122915.     workspacePresenter        <SmalltalkWorkspace> displaying the contents of the Transcript.
  122916.     buffer            <WriteStream> for accepting logging information.
  122917.     bufferProtect        <Mutex> protecting the buffer.
  122918.  
  122919. '!
  122920. !TranscriptShell class methodsFor!
  122921.  
  122922. create
  122923.     "Answers an instance of the receiver with a default view.
  122924.     The receiver is a singleton whose single instance is referenced
  122925.     via a global variable (for historical and convenience reasons)
  122926.     and so we intervene to subdue calls for a new king."
  122927.  
  122928.     ^self current
  122929.     !
  122930.  
  122931. current
  122932.     "Answer the singleton instance of the receiver"
  122933.  
  122934.     Transcript isNil 
  122935.         ifTrue: 
  122936.             [Transcript := super create.
  122937.             self defaultExtent ifNotNil: [:ext | Transcript view extent: ext]].
  122938.     ^Transcript!
  122939.  
  122940. default
  122941.     "Answer the singleton instance of the receiver (implemented for polymorphism with 
  122942.     SmalltalkSystemShell)."
  122943.  
  122944.     ^self current!
  122945.  
  122946. defaultExtent
  122947.     "Answer a <Point> which is the user's chosen default extent for new instances
  122948.     of the receiver, or nil if left up to Windows."
  122949.  
  122950.     ^DefaultExtent!
  122951.  
  122952. defaultExtent: aPoint
  122953.     "Set the default extent to be used for instances of the receiver to the <Point> argument.
  122954.     If the argument is nil, then let Windows decide."
  122955.  
  122956.     DefaultExtent := aPoint!
  122957.  
  122958. displayOn: aStream
  122959.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  122960.     would want to see it."
  122961.  
  122962.     aStream nextPutAll: 'System Transcript'!
  122963.  
  122964. flashOnOutput
  122965.     "Answer whether the Transcript should alert the user to output when it might not
  122966.     be visible (by appearing in the tray, if not already there, and flashing a few times)."
  122967.  
  122968.     ^FlashOnOutput!
  122969.  
  122970. flashOnOutput: aBoolean
  122971.     "Set whether the Transcript should alert the user to output when it might not
  122972.     be visible."
  122973.  
  122974.     FlashOnOutput := aBoolean!
  122975.  
  122976. free
  122977.     "Close and release the current transcript (e.g. to create a runtime image)."
  122978.  
  122979.     Transcript notNil ifTrue: [Transcript view destroy].
  122980.     Transcript := nil!
  122981.  
  122982. icon
  122983.     "Answers an Icon that can be used to represent this class"
  122984.  
  122985.     ^##(self) defaultIcon!
  122986.  
  122987. initialize
  122988.     "Private - Initialize the receiver's class variables
  122989.         self initialize
  122990.     "
  122991.  
  122992.     FlashOnOutput := true        "By default, flash when output occurs to a Transcript which is not the active window"!
  122993.  
  122994. onStartup
  122995.     "Private - The system is starting, perform initialization actions.
  122996.     Sent after windows are restored."
  122997.  
  122998.     self current updateCaption!
  122999.  
  123000. publishedAspects
  123001.         "Answer a <LookupTable> of the aspects published by this class."
  123002.     
  123003.         ^super publishedAspects
  123004.             add: (Aspect name: #defaultExtent);
  123005.             add: (Aspect boolean: #flashOnOutput);
  123006.             yourself!
  123007.  
  123008. reset
  123009.     "Private - Reset the class. 
  123010.     Force the creation of an new singleton instance of the Transcript"
  123011.  
  123012.     self free; current show!
  123013.  
  123014. uninitialize
  123015.     "Private - This is a singleton class so free the single instance to
  123016.     allow clean removal from the system."
  123017.  
  123018.     self free! !
  123019.  
  123020. !TranscriptShell methodsFor!
  123021.  
  123022. addToCommandRoute: route
  123023.     "Update the <OrderedCollection>, path, with the receiver's contribution to the command path
  123024.     held by the <CommandPolicy>, route. Answer self to have the command policy decide where
  123025.     to go next.
  123026.     Implementation Note: We want to include the development system if it is present."
  123027.  
  123028.     route 
  123029.         appendPresenter: self;
  123030.         appendTarget: Smalltalk developmentSystem!
  123031.  
  123032. alertUser
  123033.     "Private - Attempt to catch the users attention to inform them that output has been
  123034.     displayed in this window."
  123035.  
  123036.     | shell |
  123037.     shell := self view.
  123038.     shell isWindowVisible ifFalse: [shell showMinimized].
  123039.     shell flash: 3 flags: FLASHW_TRAY.
  123040. !
  123041.  
  123042. basicPrint: printee
  123043.     "Private - Ask the <Object>, printee, to append its basic textual description
  123044.     to the receiver."
  123045.  
  123046.     bufferProtect critical: [printee basicPrintOn: buffer]
  123047. !
  123048.  
  123049. clear
  123050.     "Remove all contents in the receiver's view"
  123051.  
  123052.     self clearAll!
  123053.  
  123054. clearAll
  123055.     "Remove all contents in the receiver's view"
  123056.  
  123057.     self flush.
  123058.     self hasOutputWindow ifTrue: [outputWindow clear]!
  123059.  
  123060. close
  123061.     "This is present to complete the implementation of the protocol <sequencedStream>."
  123062.  
  123063.     self flush!
  123064.  
  123065. comma
  123066.     #deprecated.
  123067.     self nextPutAll: ','!
  123068.  
  123069. contents
  123070.     "Answer all of the objects in the collection accessed by the receiver.
  123071.     Generally the collection will be the same class as the one accessed by the receiver."
  123072.  
  123073.     | text |
  123074.     text := self hasOutputWindow
  123075.         ifTrue: [outputWindow plainText]
  123076.         ifFalse: [''].
  123077.     bufferProtect critical: [text := text, buffer contents].
  123078.     ^text!
  123079.  
  123080. cr
  123081.     "Append a line delimiter to the receiver (N.B. For Windows this is a CR-LF sequence)."
  123082.  
  123083.     self nextPutAll: String lineDelimiter; flush!
  123084.  
  123085. createComponents
  123086.     "Create the presenters contained by the receiver.
  123087.     There are none. We use access the output window view directly."
  123088.  
  123089.     super createComponents.
  123090.  
  123091.     outputWindow := DeafObject current!
  123092.  
  123093. createSchematicWiring
  123094.     "Create the trigger wiring for the receiver"
  123095.     
  123096.     super createSchematicWiring.
  123097.     self when: #closeRequested: send: #onCloseRequested: to: self.!
  123098.  
  123099. crtab
  123100.     "Append a new line to the receiver followed by a tab"
  123101.  
  123102.     self crtab: 1!
  123103.  
  123104. crtab: count
  123105.     "Append a new line to the receiver followed by <integer>, count, tabs."
  123106.  
  123107.     self cr.
  123108.     count timesRepeat: [self tab]!
  123109.  
  123110. display: anObject
  123111.     "Ask anObject to append its end-user textual description to the receiver."
  123112.  
  123113.     bufferProtect critical: [anObject displayOn: buffer]!
  123114.  
  123115. fileFileIn
  123116.     "The user has selected the standard File/File In command. Prompt for a file
  123117.     (containing chunks) and file it in."
  123118.  
  123119.     | filename |
  123120.     filename := FileOpenDialog new
  123121.         caption: 'File in...';
  123122.         fileTypes: (Array with: self smalltalkFilesType with: FileDialog allFilesType);
  123123.         defaultExtension: '';
  123124.         showModal.
  123125.     filename notNil ifTrue: [
  123126.         Cursor wait showWhile: [self class sourceManager fileIn: filename]]!
  123127.  
  123128. flush
  123129.     "Flush the buffered output to the display."
  123130.  
  123131.     buffer position == 0 
  123132.         ifFalse: 
  123133.             [bufferProtect critical: 
  123134.                     [self hasOutputWindow 
  123135.                         ifTrue: 
  123136.                             [outputWindow
  123137.                                 caretPosition: 0;
  123138.                                 replaceSelection: buffer contents.
  123139.                             buffer reset]].
  123140.             (self class flashOnOutput and: [self view isActive not]) ifTrue: [self alertUser]]!
  123141.  
  123142. forgetSize
  123143.     "Forget the default size for new instances of this tool."
  123144.  
  123145.     self class defaultExtent: nil!
  123146.  
  123147. hasOutputWindow
  123148.     "Private - Answer whether the receiver has an open output window available."
  123149.  
  123150.     ^outputWindow isOpen == true!
  123151.  
  123152. help
  123153.         "Brings up a help page for the receiver"
  123154.     
  123155.         SmalltalkSystem current openEducationTopicForTool: self!
  123156.  
  123157. initialize
  123158.     "Private - Initialize the receiver."
  123159.  
  123160.     super initialize.
  123161.     buffer := String writeStream.
  123162.     bufferProtect := Mutex new.!
  123163.  
  123164. isEmpty
  123165.     "Answer whether the Stream is accessing an empty collection"
  123166.  
  123167.     ^self contents isEmpty!
  123168.  
  123169. next: anInteger put: anObject
  123170.     "Store the argument, anObject, as the next anInteger number of elements accessible by the receiver. 
  123171.     Answer anObject."
  123172.  
  123173.     anInteger timesRepeat: [self nextPut: anObject].
  123174.     ^anObject!
  123175.  
  123176. next: size putAll: aSequenceableCollection startingAt: start
  123177.     "Append countInteger elements of aSequenceableCollection from startInteger
  123178.     to the receiver. Answer aSequenceableCollection."
  123179.  
  123180.     self nextPutAll: (aSequenceableCollection copyFrom: start to: start+size-1).
  123181.     ^aSequenceableCollection!
  123182.  
  123183. nextPut: newElem
  123184.     "Append the <character>, newElem, to the receiver."
  123185.  
  123186.     self nextPutAll: newElem asString.
  123187.     ^newElem!
  123188.  
  123189. nextPutAll: insertString
  123190.     "Append the <readableString>, insertString, to the text of the receiver."
  123191.  
  123192.     bufferProtect critical: [buffer nextPutAll: insertString].
  123193.     ^insertString!
  123194.  
  123195. notEmpty
  123196.     "Answer whether the Stream is accessing an empty collection"
  123197.  
  123198.     ^self isEmpty not!
  123199.  
  123200. onCloseRequested: aBooleanValue
  123201.     "Handler for a close request event. The Transcript is never closed
  123202.     but is hidden instead"
  123203.  
  123204.     self == Transcript ifTrue: [
  123205.         self hide.
  123206.         "If this Transcript was the only visible window, then perhaps exit?"
  123207.         SessionManager inputState hasVisibleWindows 
  123208.             ifFalse: [SessionManager current exit].
  123209.         aBooleanValue value: false]!
  123210.  
  123211. onViewOpened
  123212.     "Received when the receiver's view is been connected. "
  123213.  
  123214.     super onViewOpened.
  123215.  
  123216.     outputWindow := self view viewNamed: 'workspace'
  123217. !
  123218.  
  123219. position
  123220.     "Answer the receiver's current position reference for accessing the collection"
  123221.  
  123222.     self flush.
  123223.     ^outputWindow caretPosition!
  123224.  
  123225. position: pos
  123226.     "Set the receiver's current position reference for accessing the collection
  123227.     to the the <Integer> argument, pos. If the argument is not within the bounds of
  123228.     the receiver's collection, report an error."
  123229.  
  123230.     self flush.
  123231. !
  123232.  
  123233. print: anObject
  123234.     "Prints anObject at the end of the receiver."
  123235.  
  123236.     bufferProtect critical: [anObject printOn: buffer]!
  123237.  
  123238. queryCommand: aCommandQuery
  123239.     "Private - Enter details about a potential command for the receiver into the 
  123240.     <CommandQuery>."
  123241.  
  123242.     | command |
  123243.     command := aCommandQuery commandSymbol.
  123244.     #forgetSize == command 
  123245.         ifTrue: 
  123246.             [aCommandQuery isEnabled: self class defaultExtent notNil.
  123247.             ^true].
  123248.     ^super queryCommand: aCommandQuery!
  123249.  
  123250. rememberThisSize
  123251.     "Record the size of the receiver as the default extent for its tool class."
  123252.  
  123253.     self class defaultExtent: self view extent!
  123254.  
  123255. reset
  123256.     "Set the receiver's position reference to the beginning of the collection"
  123257.  
  123258.     self position: 0
  123259. !
  123260.  
  123261. setToEnd
  123262.     "Set the receiver to the end of its sequence. This is part of the protocol <sequencedStream>."
  123263.  
  123264.     self flush.
  123265.     self hasOutputWindow ifTrue: [outputWindow caretPosition: 0]!
  123266.  
  123267. show
  123268.     "Shows the view of the receiver"
  123269.  
  123270.     self view zOrderTop.
  123271.     super show!
  123272.  
  123273. show: aString
  123274.     "Append aString to the bottom of the receiver.
  123275.     Although an original Smalltalk-80 selector, this is now deprecated because it is redundant.
  123276.     The standard stream protocols should be used when writing to the Transcript."
  123277.  
  123278.     #deprecated.
  123279.     self nextPutAll: aString; flush!
  123280.  
  123281. smalltalkFilesType
  123282.     "Private - Answer a two element array suitable for adding to the FileDialog
  123283.     with the fileTypes: message."
  123284.  
  123285.     ^#('Smalltalk Files (*.st)' '*.st')!
  123286.  
  123287. space
  123288.     "Append a space to the receiver."
  123289.  
  123290.     self nextPutAll: ' '!
  123291.  
  123292. tab
  123293.     "Store a tab character as the next element of the receiver."
  123294.  
  123295.     self nextPutAll: String tab!
  123296.  
  123297. tab: tabCount
  123298.     "Append the specified number of tabs to the receiver."
  123299.  
  123300.     tabCount timesRepeat: [self tab]! !
  123301.  
  123302. VideoLibraryShell comment:
  123303. 'VideoLibraryShell a modeless user interface for displaying and editing the contents of a VideoLibrary. This class is part of the Video Library sample package. Please see the package comment for more details.
  123304.  
  123305. Example:usage
  123306.  
  123307. VideoLibraryShell show.
  123308.  
  123309. or 
  123310.  
  123311. VideoLibraryShell showOn: (VideoLibrary new owner: ''Mary Joe'')'!
  123312. !VideoLibraryShell class methodsFor!
  123313.  
  123314. defaultModel
  123315.     "Answer a default model to be assigned to the receiver when it
  123316.     is initialized."
  123317.  
  123318.     ^VideoLibrary default!
  123319.  
  123320. displayOn: aStream
  123321.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  123322.     would want to see it."
  123323.  
  123324.     aStream nextPutAll: 'Video Library'!
  123325.  
  123326. icon
  123327.     "Answers an Icon that can be used to represent this class"
  123328.  
  123329.     ^VideoLibrary icon!
  123330.  
  123331. initialize
  123332.     "Private - Initialize the receiver's class variables
  123333.         self initialize
  123334.     "
  123335.  
  123336.     Smalltalk developmentSystem
  123337.         addSamplesFolderIconFor: self description: self displayString!
  123338.  
  123339. uninitialize
  123340.     "Private - Uninitialize the receiver as it is about to be removed from the system.
  123341.         self uninitialize
  123342.     "
  123343.  
  123344.     Smalltalk developmentSystem
  123345.         removeSystemFolderIconNamed: self displayString! !
  123346.  
  123347. !VideoLibraryShell methodsFor!
  123348.  
  123349. addTape
  123350.     "Create a new tape and add it to the receiver's library"
  123351.  
  123352.     | tape |
  123353.     tape := NewVideoTapeDialog showModal.
  123354.     tape notNil ifTrue: [
  123355.         tapesPresenter model add: tape.
  123356.         self tape: tape ]!
  123357.  
  123358. createComponents
  123359.     "Create the presenters contained by the receiver"
  123360.  
  123361.     super createComponents.
  123362.     ownerPresenter := self add: TextPresenter new name: 'owner'.
  123363.     tapesPresenter := self add: ListPresenter new name: 'tapes'.
  123364.     recordingsPresenter := self add: ListPresenter new name: 'recordings'.
  123365.  
  123366. !
  123367.  
  123368. createSchematicWiring
  123369.     "Create the trigger wiring for the receiver"
  123370.     
  123371.     super createSchematicWiring.
  123372.     tapesPresenter when: #selectionChanged send: #onTapeSelected to: self.
  123373.     recordingsPresenter when: #actionPerformed send: #editRecording to: self.
  123374.     !
  123375.  
  123376. editRecording
  123377.     "Edits the current recording in a VideoRecordingDialog"
  123378.  
  123379.     VideoRecordingDialog showModalOn: self recording
  123380.     !
  123381.  
  123382. erase
  123383.     "Removes a programme recording from the current tape"
  123384.  
  123385.     recordingsPresenter model remove: self recording.
  123386.     !
  123387.  
  123388. hasSelectedRecording
  123389.     "Answer true if there is a recording selected in the receiver"
  123390.  
  123391.     ^recordingsPresenter hasSelection!
  123392.  
  123393. hasSelectedTape
  123394.     "Answer true if there is a tape selected in the receiver"
  123395.  
  123396.     ^tapesPresenter hasSelection!
  123397.  
  123398. model: aVideoLibrary
  123399.     "Set the model associated with the receiver to be aVideoLibrary."
  123400.  
  123401.     super model: aVideoLibrary.
  123402.     ownerPresenter model: (self model aspectValue: #owner).
  123403.     tapesPresenter model: (ListModel on: self model tapes).
  123404.  
  123405. !
  123406.  
  123407. onTapeSelected
  123408.     "Private - Event handler for when a new tape has been selected. Transfer the
  123409.     recordings into the recordingsPresenter."
  123410.  
  123411.     recordingsPresenter clear.
  123412.     self hasSelectedTape ifTrue: [
  123413.         recordingsPresenter list: self tape recordings ].!
  123414.  
  123415. onViewOpened
  123416.     "Received when the receiver's view is been connected. "
  123417.  
  123418.     super onViewOpened.
  123419.     self onTapeSelected.
  123420. !
  123421.  
  123422. queryCommand: aCommandQuery
  123423.     "Enters details about a potential command for the receiver into aCommandQuery"
  123424.  
  123425.     super queryCommand: aCommandQuery.
  123426.     (#(removeTape record) includes: aCommandQuery command) ifTrue: [
  123427.         aCommandQuery isEnabled: self hasSelectedTape ].
  123428.     (#(erase) includes: aCommandQuery command) ifTrue: [
  123429.         aCommandQuery isEnabled: self hasSelectedRecording ]
  123430. !
  123431.  
  123432. record
  123433.     "Adds a programme recording to the current tape"
  123434.  
  123435.     | recording |
  123436.     recording := VideoRecordingDialog showModalOn: VideoRecording new.
  123437.     recording notNil ifTrue: [
  123438.         recordingsPresenter model add: recording.
  123439.         self recording: recording ].
  123440.     !
  123441.  
  123442. recording
  123443.     "Answer the current selected recording in the receiver or nil if there is none"
  123444.  
  123445.     ^recordingsPresenter selectionOrNil!
  123446.  
  123447. recording: aVideoRecordingOrNil
  123448.     "Sets the current selected video recording  in the receiver to aVideoRecordingOrNil"
  123449.  
  123450.     ^recordingsPresenter selectionOrNil: aVideoRecordingOrNil!
  123451.  
  123452. removeTape
  123453.     "Removes the current tape from the receiver's library"
  123454.  
  123455.     | index |
  123456.     index := tapesPresenter selectionByIndex.
  123457.     (MessageBox confirm: ('Are you sure you wish to remove the tape:
  123458. %1 from this library?' 
  123459.                 formatWith: self tape displayString)
  123460.         caption: 'Remove Tape') ifTrue: [tapesPresenter model remove: self tape]!
  123461.  
  123462. tape
  123463.     "Answer the current selected tape in the receiver or nil if there is none"
  123464.  
  123465.     ^tapesPresenter selectionOrNil!
  123466.  
  123467. tape: aVideoTapeOrNil
  123468.     "Sets the current selected tape in the receiver to aVideoTapeOrNil"
  123469.  
  123470.     ^tapesPresenter selectionOrNil: aVideoTapeOrNil! !
  123471.  
  123472. WebBrowserShell comment:
  123473. 'WebBrowserShell is a simple web browser application built around the Microsoft Web Browser control (the basis of Internet Explorer).
  123474.  
  123475. This sample does wire up to a few events from the brower control (mainly for illustrative purposes), but if you want to learn more about what events are fired and when it is recommended that you monitor the behaviour of the control using the ''Active-X Control Browser'' tool.
  123476.  
  123477. Try:
  123478.     WebBrowserShell show
  123479.  
  123480. Instance Variables:
  123481.     address        <TextPresenter>. The text URL being browsed/to be browsed.
  123482.     browser        <URLPresenter>. Presenter behind the explorer view.
  123483.     statusModel    <ValueHolder>. Model to hold status text updated by events from the explorer control.
  123484.  
  123485. '!
  123486. !WebBrowserShell class methodsFor!
  123487.  
  123488. displayOn: aStream
  123489.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  123490.     would want to see it."
  123491.  
  123492.     aStream nextPutAll: 'Simple Web Browser'!
  123493.  
  123494. icon
  123495.     "Answers an Icon that can be used to represent this class"
  123496.  
  123497.     ^Icon fromId: 14 in: ShellLibrary default!
  123498.  
  123499. initialize
  123500.     "Private - Initialize the receiver's class variables
  123501.         self initialize
  123502.     "
  123503.  
  123504.     Smalltalk developmentSystem
  123505.         addSamplesFolderIconFor: self description: self displayString!
  123506.  
  123507. uninitialize
  123508.     "Private - Uninitialize the receiver as it is about to be removed from the system.
  123509.         self uninitialize
  123510.     "
  123511.  
  123512.     Smalltalk developmentSystem
  123513.         removeSystemFolderIconNamed: self displayString! !
  123514.  
  123515. !WebBrowserShell methodsFor!
  123516.  
  123517. createComponents
  123518.     "Create the presenters contained by the receiver"
  123519.  
  123520.     super createComponents.
  123521.     statusModel := ValueHolder new.
  123522.     browser := self add: URLPresenter new name: 'browser'.
  123523.     address := self add: TextPresenter new name: 'address'.
  123524.     "Share the model to simplify matters, although independent models would allow more control."
  123525.     address model: browser model.
  123526. !
  123527.  
  123528. createSchematicWiring
  123529.     "Create the trigger wiring for the receiver"
  123530.     
  123531.     super createSchematicWiring.
  123532.  
  123533.     address
  123534.         when: #valueChanged send: #invalidateUserInterface to: self.
  123535.  
  123536.     "Automatically update the caption and status bar text on receipt of events from the browser control"
  123537.     browser 
  123538.         when: #StatusTextChange: send: #value: to: statusModel;
  123539.         when: #TitleChange: send: #caption: to: self.
  123540.  
  123541.     "Wire up a few of the events for illustrative purposes - we don't do anything with most of them at present"
  123542.     browser
  123543.         when: #NavigateComplete2:URL: send: #OnNavigateComplete2:URL: to: self;
  123544.         when: #DocumentComplete:URL: send: #OnDocumentComplete:URL: to: self;
  123545.         when: #CommandStateChange:Enable: send: #OnCommandStateChange:Enable: to: self;
  123546.         when: #BeforeNavigate2:URL:Flags:TargetFrameName:PostData:Headers:Cancel:
  123547.             send: #OnBeforeNavigate2:URL:Flags:TargetFrameName:PostData:Headers:Cancel:
  123548.             to: self;
  123549.         when: #NewWindow2:Cancel: send: #OnNewWindow2:Cancel: to: self
  123550. !
  123551.  
  123552. historyBack: delta
  123553.     "Go back the number of positions in the history specified by the <integer> argument."
  123554.  
  123555.     browser view controlDispatch GoBack!
  123556.  
  123557. historyForward: delta
  123558.     "Go forward the number of positions in the history specified by the <integer> argument."
  123559.  
  123560.     browser view controlDispatch GoForward!
  123561.  
  123562. home
  123563.     "Go to the Home page"
  123564.  
  123565.     self openUrl: self homePage!
  123566.  
  123567. homePage
  123568.     "Private - Answer the home page to use for the receiver"
  123569.  
  123570.     ^SessionManager current objectArtsUrl!
  123571.  
  123572. initialize
  123573.     "Private - Initialize the receiver's instance variables."
  123574.  
  123575.     super initialize.
  123576.     commandStates := Array with: false with: false!
  123577.  
  123578. navigate
  123579.     "Navigate to the address in the address bar.
  123580.     We want to by-pass the normal check for the same value here."
  123581.  
  123582.     browser model setValue: address value; notifyChanged!
  123583.  
  123584. OnBeforeNavigate2: anIDispatch 
  123585.         URL: urlVARIANT         "Can be a URL or a PIDL"
  123586.         Flags: flagsVARIANT 
  123587.         TargetFrameName: targetVARIANT
  123588.         PostData: postDataVARIANT
  123589.         Headers: headersVARIANT
  123590.         Cancel: aBooleanValue
  123591.     "Pre-navigation event fired by the control. Can be used to take control of what happens when
  123592.     a link is clicked. Be aware that <IDispatch> argument is not necessarily on a WebBrowser
  123593.     object, since this event is also fired for frames. Note also that programmatic navigations
  123594.     also fire this event, so if you intercept and redirect, this event will be fired again."
  123595.  
  123596.     | url |
  123597.     url := urlVARIANT value.
  123598.     "Set the cancel value holder to true in order to suppress navigation,
  123599.      can then take some other action. Because we have chose to share
  123600.      the model between address bar and URL presenter, we cancel 
  123601.      all navigation requests to new URLs, and instead initiate them
  123602.      by changing the shared URL value model, thus keeping browser
  123603.      and address bar in sync."
  123604.     browser model value = url ifFalse: [
  123605.         aBooleanValue value: true.
  123606.         browser model value: url]!
  123607.  
  123608. OnCommandStateChange: anInteger Enable: aBoolean
  123609.     "Event fired by the control when the enablement of a command changes.
  123610.     This tells us whether the forward/back buttons need to be enabled, and also
  123611.     whether any other toolbar buttons enablement state may have changed."
  123612.  
  123613.     (anInteger between: 1 and: commandStates size) ifTrue: [
  123614.         commandStates at: anInteger put: aBoolean].
  123615.     self invalidateUserInterface.
  123616.         !
  123617.  
  123618. OnDocumentComplete: anIDispatch URL: urlOrPIDL
  123619.     "Event fired by the control when the document download and display has completed."
  123620.  
  123621. !
  123622.  
  123623. OnNavigateComplete2: anIDispatch URL: urlOrPIDL
  123624.     "Event fired by the control when the document being navigated to becomes visible and enters the navigation
  123625.     stack. If we wanted to maintain a history list, this would be the place to do so."
  123626.  
  123627.     "If we had independent models for the address bar and URLPresenter, this would be the place to update
  123628.      the address bar model."
  123629.  
  123630. !
  123631.  
  123632. OnNewWindow2: ppDispOut Cancel: aBooleanValue
  123633.     "Event fired by the control when about to open a new window.
  123634.     N.B. Both parameters are output parameters. See MSDN."
  123635.  
  123636.     !
  123637.  
  123638. onViewOpened
  123639.     "Received when the receiver's view is been connected. "
  123640.  
  123641.     | statusItem |
  123642.     super onViewOpened.
  123643.  
  123644.     statusItem := self view viewNamed: 'status' ifNone: [].
  123645.     statusItem model: statusModel.
  123646. !
  123647.  
  123648. openUrl: url
  123649.     "Browse the specified URL."
  123650.  
  123651.     browser model value: url asString!
  123652.  
  123653. queryCommand: query
  123654.     "Enters details about a potential command for the receiver into the 
  123655.     <CommandQuery>,  query."
  123656.  
  123657.     | cmd |
  123658.     cmd := query commandSymbol.
  123659.  
  123660.     cmd == #historyBack: ifTrue: [
  123661.         query isEnabled: (commandStates at: CSC_NAVIGATEBACK).
  123662.         ^true].
  123663.  
  123664.     cmd == #historyForward: ifTrue: [
  123665.         query isEnabled: (commandStates at: CSC_NAVIGATEFORWARD).
  123666.         ^true].
  123667.  
  123668.     ^super queryCommand: query.
  123669. ! !
  123670.  
  123671. CommandMenuItemDialog comment:
  123672. 'CommandMenuItemDialog is a <dialogPresenter> used to edit the contents of an <CommandMenuItem> model.
  123673.  
  123674. Instance Variables:
  123675.     titlePresenter        <TextPresenter> for the #title aspect.
  123676.     commandPresenter        <TextPresenter> for the #command aspect.
  123677.     acceleratorPresenter        <AcceleratorPresenter> for the #accelerator aspect.
  123678.  
  123679. '!
  123680. !CommandMenuItemDialog class methodsFor!
  123681.  
  123682. defaultModel
  123683.     "Answer a default model to be assigned to the receiver when it
  123684.     is initialized."
  123685.  
  123686.     ^CommandMenuItem new!
  123687.  
  123688. icon
  123689.     "Answers an Icon that can be used to represent this class."
  123690.  
  123691.     ^Menu icon
  123692. ! !
  123693.  
  123694. !CommandMenuItemDialog methodsFor!
  123695.  
  123696. bitmapFromIcon: anIcon
  123697.     | canvas bmp extent |
  123698.     extent := Icon smallExtent.
  123699.     bmp := Bitmap displayCompatibleWithExtent: extent.
  123700.     canvas := bmp canvas.
  123701.     canvas
  123702.         backcolor: Color face3d;
  123703.         erase.
  123704.     (Icon imageManager imageListWithExtent: extent) 
  123705.         draw: anIcon imageIndex
  123706.         on: canvas
  123707.         at: 0 @ 0
  123708.         flags: 0.
  123709.     ^bmp!
  123710.  
  123711. chooseIcon
  123712.     Icon choose ifNotNil: [:icon | imageModel value: icon]!
  123713.  
  123714. createComponents
  123715.     "Create the presenters contained by the receiver"
  123716.  
  123717.     super createComponents.
  123718.     titlePresenter := self add: TextPresenter new name: 'title'.
  123719.     commandPresenter := self add: TextPresenter new name: 'command'.
  123720.     acceleratorPresenter := self add: AcceleratorPresenter new name: 'accelerator'.
  123721.     isRadioButtonStylePresenter := self add: BooleanPresenter new name: 'isRadioButtonStyle'.
  123722.     isDefaultPresenter := self add: BooleanPresenter new name: 'isDefault'.
  123723.     isModalPresenter := self add: BooleanPresenter new name: 'isModal'.
  123724.     iconPresenter := self add: ImagePresenter new name: 'icon'
  123725. !
  123726.  
  123727. model: aCommandMenuItem
  123728.     "Set the model associated with the receiver."
  123729.  
  123730.     | commandDescription aspectBuffer |
  123731.     super model: aCommandMenuItem.
  123732.     aspectBuffer := self model.
  123733.     commandDescription := (aspectBuffer aspectValue: #commandDescription) value.
  123734.     titlePresenter model: (aspectBuffer aspectValue: #description).
  123735.     commandPresenter model: (aspectBuffer aspectValue: #commandString).
  123736.     acceleratorPresenter model: (aspectBuffer aspectValue: #acceleratorKey).
  123737.     isRadioButtonStylePresenter model: (aspectBuffer aspectValue: #isRadioButtonStyle).
  123738.     isDefaultPresenter model: (aspectBuffer aspectValue: #isDefault).
  123739.     isModalPresenter model: (aspectBuffer aspectValue: #isModalCommand).
  123740.     imageModel := aspectBuffer aspectValue: #image.
  123741.     iconPresenter model: (ValueConverter subject: imageModel
  123742.                 typeConverter: (PluggableTypeConverter leftToRight: [:icon | self bitmapFromIcon: icon]
  123743.                         rightToLeft: [:icon | icon]))! !
  123744.  
  123745. CreateSubclassDialog comment:
  123746. 'CreateSubclassDialog subclassOf: Object'!
  123747. !CreateSubclassDialog class methodsFor!
  123748.  
  123749. icon
  123750.     "Answers an Icon that can be used to represent this class."
  123751.  
  123752.     ^Smalltalk developmentSystem icon
  123753. !
  123754.  
  123755. refactoringView
  123756.     ^'Refactoring view'!
  123757.  
  123758. subclassOf: aClassOrNil inPackage: aPackage
  123759.     ^(self on: aClassOrNil asValue)
  123760.         package: aPackage;
  123761.         createView: (Smalltalk developmentSystem canRefactor 
  123762.                     ifTrue: [self refactoringView]
  123763.                     ifFalse: [self defaultView]);
  123764.         showModal;
  123765.         yourself! !
  123766.  
  123767. !CreateSubclassDialog methodsFor!
  123768.  
  123769. canApply
  123770.     ^(self isPackaged not or: [self package notNil]) and: 
  123771.             [| candidateName |
  123772.             candidateName := self subclassName.
  123773.             candidateName notEmpty and: 
  123774.                     [(ClassBuilder isValidClassName: candidateName) 
  123775.                         and: [(self environment includesKey: candidateName asSymbol) not]]]!
  123776.  
  123777. chooseSuperclass
  123778.     (Smalltalk developmentSystem classChooserClass createOn: superclassPresenter model)
  123779.         allowNil: true;
  123780.         showModal!
  123781.  
  123782. createComponents
  123783.     super createComponents.
  123784.     namePresenter := self add: TextPresenter new name: 'className'.
  123785.     superclassPresenter := self add: TextPresenter new name: 'superclass'.
  123786.     packagesPresenter := self add: ((PackageSelector new)
  123787.                         autoSelect: false;
  123788.                         yourself)
  123789.                 name: 'package'.
  123790.     subclassesPresenter := self add: ChoicePresenter new name: 'subclasses'.
  123791.     usePackagePresenter := self add: BooleanPresenter new name: 'setPackage'.
  123792.     usePackagePresenter model: true!
  123793.  
  123794. createSchematicWiring
  123795.     super createSchematicWiring.
  123796.     packagesPresenter 
  123797.         when: #selectionChanged
  123798.         send: #onPackageSelected
  123799.         to: self.
  123800.     usePackagePresenter 
  123801.         when: #valueChanged
  123802.         send: #toggleSetPackage
  123803.         to: self!
  123804.  
  123805. environment
  123806.     "Private - Answer the global environment for which we are defining a subclass."
  123807.  
  123808.     ^superClass isNil ifTrue: [Smalltalk] ifFalse: [superClass environment]!
  123809.  
  123810. isPackaged
  123811.     ^usePackagePresenter model value!
  123812.  
  123813. model: aSubjectModel
  123814.     | aClassOrNil |
  123815.     super model: aSubjectModel.
  123816.     aClassOrNil := aSubjectModel value.
  123817.     package := Smalltalk developmentSystem defaultPackage.
  123818.     self setSuperclass: aClassOrNil.
  123819.     namePresenter model: superClass name asValue!
  123820.  
  123821. onPackageSelected
  123822.     package := packagesPresenter selectionOrNil!
  123823.  
  123824. onViewOpened
  123825.     "Received when the receiver's view has been connected."
  123826.  
  123827.     super onViewOpened.
  123828.     self updatePackage!
  123829.  
  123830. package
  123831.     ^package!
  123832.  
  123833. package: aPackage
  123834.     package := aPackage == Package uncommitted ifFalse: [aPackage].
  123835.     self isOpen ifTrue: [self updatePackage]!
  123836.  
  123837. queryCommand: aCommandQuery
  123838.     "Private - Enters details about a potential command for the receiver into 
  123839.     the <CommandQuery>."
  123840.  
  123841.     aCommandQuery commandSymbol == #ok 
  123842.         ifTrue: 
  123843.             [aCommandQuery isEnabled: self canApply.
  123844.             ^true].
  123845.     ^super queryCommand: aCommandQuery!
  123846.  
  123847. setSuperclass: aClassOrNil
  123848.     superclassPresenter model: aClassOrNil.
  123849.     (superClass := aClassOrNil) isNil 
  123850.         ifFalse: 
  123851.             [subclassesPresenter choices: superClass subclasses.
  123852.             package isNil ifTrue: [package := superClass owningPackage]]!
  123853.  
  123854. subclasses
  123855.     ^subclassesPresenter model value ifNil: [#()]!
  123856.  
  123857. subclassName
  123858.     ^namePresenter value!
  123859.  
  123860. superclass
  123861.     ^superclassPresenter value!
  123862.  
  123863. toggleSetPackage
  123864.     self isPackaged 
  123865.         ifTrue: 
  123866.             [package := packagesPresenter selectionOrNil.
  123867.             packagesPresenter isEnabled: true]
  123868.         ifFalse: 
  123869.             [package := nil.
  123870.             packagesPresenter isEnabled: false]!
  123871.  
  123872. updatePackage
  123873.     package isNil 
  123874.         ifTrue: [usePackagePresenter value: false]
  123875.         ifFalse: 
  123876.             [usePackagePresenter value: true.
  123877.             packagesPresenter selection: package]! !
  123878.  
  123879. DolphinSureTrustWarning comment:
  123880. 'A DolphinSureTrustWarning dialog is used to presenter a publisher''s digital certificate and to prompt the user to see if contents from this publisher should be trusted. The model for this dialog is the certificate itself and, if it is accepted, it is entered into a temporary or permanent trust store as appropriate.  
  123881.  
  123882. DolphinSureTrustWarning showModal
  123883.  
  123884. Instance Variables:
  123885.     certificateImage    <ImagePresenter> used to display the certificate.
  123886.     description        <TextPresenter> used to display a description of the signed class.
  123887.     alwaysTrust    <BooleanPresenter> used to indicate whether the user always wants to trust this certificate.
  123888.  
  123889. '!
  123890. !DolphinSureTrustWarning class methodsFor!
  123891.  
  123892. defaultModel
  123893.     "Answer a default model to be assigned to the receiver when it
  123894.     is initialized. This should be an instance of DolphinSureCertificate"
  123895.  
  123896.     ^ObjectArtsRootCertificate new!
  123897.  
  123898. showModalOn: aDolphinSureCertificate description: aStringDescription
  123899.     "Creates and shows an instance of the receiver on aDolphinSureCertificate and with aStringDescription"
  123900.  
  123901.     ^(self createOn: aDolphinSureCertificate)
  123902.         description: aStringDescription;
  123903.         showModal
  123904. ! !
  123905.  
  123906. !DolphinSureTrustWarning methodsFor!
  123907.  
  123908. alwaysTrust
  123909.     "Answer true if the user has checked the alway trust check box"
  123910.  
  123911.     ^alwaysTrust value!
  123912.  
  123913. createComponents
  123914.     "Create the presenters contained by the receiver"
  123915.  
  123916.     super createComponents.
  123917.     certificateImage := self add: ImagePresenter new name: 'certificateImage'.
  123918.     description := self add: TextPresenter new name: 'description'.
  123919.     alwaysTrust := self add: BooleanPresenter new name: 'alwaysTrust'.
  123920.  
  123921.     certificateImage when: #leftButtonDoubleClicked: send: #onCertificateClicked to: self.
  123922. !
  123923.  
  123924. description: aStringDescription
  123925.     "Private - Sets the usage description for the receiver"
  123926.  
  123927.     description value: aStringDescription
  123928. !
  123929.  
  123930. model: aCertificate
  123931.     "Set the model associated with the receiver."
  123932.  
  123933.     super model: aCertificate.
  123934.     certificateImage value: aCertificate image.
  123935.  
  123936. !
  123937.  
  123938. ok
  123939.     "The user has chose to trust the receiver's certificate so add it to an appropriate trust store"
  123940.  
  123941.     self alwaysTrust 
  123942.         ifTrue: [self model bePermanentlyTrusted]
  123943.         ifFalse: [self model beTemporarilyTrusted].
  123944.     super ok.
  123945. !
  123946.  
  123947. onCertificateClicked
  123948.     "Private - The DolphinSure certificate image has been clicked so bring up some information on the
  123949.     DolphinSure system"
  123950.  
  123951.     ShellLibrary default 
  123952.         shellOpen: self whatIsDolphinSureURL
  123953.         directory: SessionManager current installationDirectory.!
  123954.  
  123955. validateUserInterface
  123956.     "Set the state of the receiver accordingly. "
  123957.  
  123958.     super validateUserInterface.
  123959.     alwaysTrust view isEnabled: self model canBePermanentlyTrusted
  123960. !
  123961.  
  123962. whatIsDolphinSureURL
  123963.     "Private - Answer the URL for a page describing DolphinSure"
  123964.  
  123965.     ^'www.object-arts.com/DolphinSure'! !
  123966.  
  123967. MenuDialog comment:
  123968. ''!
  123969. !MenuDialog class methodsFor!
  123970.  
  123971. defaultModel
  123972.     "Answer a default model to be assigned to the receiver when it
  123973.     is initialized."
  123974.  
  123975.     ^Menu new!
  123976.  
  123977. icon
  123978.     "Answers an Icon that can be used to represent this class."
  123979.  
  123980.     ^Menu icon
  123981. ! !
  123982.  
  123983. !MenuDialog methodsFor!
  123984.  
  123985. createComponents
  123986.     "Create the presenters contained by the receiver"
  123987.  
  123988.     super createComponents.
  123989.     titlePresenter := self add: TextPresenter new name: 'title'.
  123990.     namePresenter := self add: TextPresenter new name: 'name'.!
  123991.  
  123992. model: aMenu 
  123993.     "Set the model associated with the receiver."
  123994.  
  123995.     | aspectBuffer |
  123996.     super model: aMenu.
  123997.     aspectBuffer := self model.
  123998.     titlePresenter model: (aspectBuffer aspectValue: #text).
  123999.     namePresenter model: (aspectBuffer aspectValue: #name)! !
  124000.  
  124001. PersonalAccountTransactionDialog comment:
  124002. 'PersonalAccountTransactionDialog is a <dialogPresenter> used to edit the contents of an <PersonalAccountTransaction> model.
  124003.  
  124004. To see an example operating on a new transaction evaluate:
  124005.  
  124006. PersonalAccountTransactionDialog showModal
  124007.  
  124008. Instance Variables:
  124009.     datePresenter        <DatePresenter> for the #date aspect.
  124010.     amountPresenter        <NumberPresenter> for the #amount aspect.
  124011.     descriptionPresenter        <TextPresenter> for the #description aspect.
  124012.     isDebitPresenter        <BooleanPresenter> for the #isDebit aspect.
  124013.  
  124014. '!
  124015. !PersonalAccountTransactionDialog class methodsFor!
  124016.  
  124017. defaultModel
  124018.     "Answer a default model to be assigned to the receiver when it
  124019.     is initialized."
  124020.  
  124021.     ^PersonalAccountTransaction new
  124022. ! !
  124023.  
  124024. !PersonalAccountTransactionDialog methodsFor!
  124025.  
  124026. createComponents
  124027.     "Create the presenters contained by the receiver"
  124028.  
  124029.     super createComponents.
  124030.     datePresenter := self add: DatePresenter new name: 'date'.
  124031.     amountPresenter := self add: NumberPresenter new name: 'amount'.
  124032.     descriptionPresenter := self add: TextPresenter new name: 'description'.
  124033.     isDebitPresenter := self add: BooleanPresenter new name: 'isDebit'.
  124034.  
  124035. !
  124036.  
  124037. model: aPersonalAccountTransaction
  124038.     "Set the model associated with the receiver."
  124039.  
  124040.     | aspectBuffer |
  124041.     super model: aPersonalAccountTransaction.
  124042.  
  124043.     aspectBuffer := self model.
  124044.     datePresenter model: (aspectBuffer aspectValue: #date).
  124045.     amountPresenter model: (aspectBuffer aspectValue: #amount).
  124046.     descriptionPresenter model: (aspectBuffer aspectValue: #description).
  124047.     isDebitPresenter model: (aspectBuffer aspectValue: #isDebit).
  124048. ! !
  124049.  
  124050. ProgressDialog comment:
  124051. 'ProgressDialog is a <valueDialogPresenter> that can be used to indicate the progress of a background operation. The <valueModel> is used to hold a <number> that describes the current amount of progress through the operation. Typically, with the standard views, this will be an <integer> between 0 and 100%.
  124052.  
  124053. The various [instance creation] methods accept a <monadicValuable> operation which is evaluated in a background process. The parameter passed to the operation is the <valueModel> of the ProgressDialog. It is then the responsibility of the operation, as it progresses, to periodically update this with the state of progress.
  124054.  
  124055. The class includes a number of examples to demonstrate its use:
  124056. ProgressDialog example1.
  124057. ProgressDialog example2.
  124058. ProgressDialog example3.
  124059.  
  124060. Instance Variables:
  124061.     progressPresenter        <NumberPresenter> displaying the current state of progress.
  124062.     operation            <monadicValuable> holding the operation to be performed.
  124063.     process            <Process> evaluating the operation.
  124064.     textPresenter        <TextPresenter> displaying the descriptive text to describe the operation.
  124065.  
  124066.  
  124067. '!
  124068. !ProgressDialog class methodsFor!
  124069.  
  124070. create: viewName operation: operation
  124071.     "Answer a new instance of the receiver with a view identified by viewName
  124072.     to evaluate the monadic valuable argument, operation, when the 
  124073.     instance is subsequently shown (e.g. by sending it #showModal).
  124074.     When the view is shown the operation is evaluated in a background 
  124075.     process, and is passed the progress dialog to be updated with its 
  124076.     progress (#value: 0..100, #text: aString). If the instances cancel button
  124077.     is pressed, then the operation is terminated and the answer is nil. If the operation 
  124078.     runs to completion, then the answer is result of the evaluation."
  124079.  
  124080.     ^(self create: viewName)
  124081.         operation: operation!
  124082.  
  124083. defaultModel
  124084.     "Answer a default model to be assigned to the receiver when it
  124085.     is initialized."
  124086.  
  124087.     ^nil asValue!
  124088.  
  124089. example1
  124090.     "A simple modal progress dialog. Notice how the progress text can also be set within
  124091.     the operation block. Try pressing cancel to see the effect on the answer.
  124092.         ProgressDialog example1
  124093.     "
  124094.  
  124095.     ^self showModalWhile: [:progress | 
  124096.         1 to: 100 do: [:i | Processor sleep: 30. progress value: i; text: i displayString, '%']. 'completed']!
  124097.  
  124098. example2
  124099.     "A simple modeless progress dialog.
  124100.         x := ProgressDialog example2
  124101.     Try evaluating these expressions while the progress dialog is up:
  124102.         x progress.
  124103.         x isConfirmed.
  124104.         x answer.
  124105.     "
  124106.  
  124107.     ^(self operation: 
  124108.             [:progress | 
  124109.             1 to: 100
  124110.                 do: 
  124111.                     [:i | 
  124112.                     Processor sleep: 100.
  124113.                     progress
  124114.                         value: i;
  124115.                         text: i displayString , '%'].
  124116.             'completed'])
  124117.         caption: 'Modeless progress...';
  124118.         show!
  124119.  
  124120. example3
  124121.     "A simple modal progress dialog with an alternative view.
  124122.         ProgressDialog example3
  124123.     "
  124124.  
  124125.     ^(self 
  124126.         create: 'Numeric progress dialog'
  124127.         operation: [:progress | 
  124128.         10 to: 1 by: -1 do: [:i | progress value: i. Processor sleep: 400]. 'completed'])
  124129.             caption: 'Count down ...';
  124130.             allowCancel: false;
  124131.             showModal!
  124132.  
  124133. icon
  124134.     "Answers an Icon that can be used to represent this class."
  124135.  
  124136.     ^Time icon
  124137. !
  124138.  
  124139. operation: operation
  124140.     "Answer a new instance of the receiver with the default view 
  124141.     to evaluate the monadic valuable argument, operation, when the 
  124142.     instance is subsequently shown (e.g. by sending it #showModal).
  124143.     When the view is shown the operation is evaluated in a background 
  124144.     process, and is passed a progress dialog to be updated with its 
  124145.     progress (#value: 0..100, #text: aString). If the instances cancel button
  124146.     is pressed, then the operation is terminated and the answer is nil. If the operation 
  124147.     runs to completion, then the answer is result of the evaluation."
  124148.  
  124149.     ^self create: self defaultView operation: operation!
  124150.  
  124151. showModal: viewName while: operation
  124152.     "Create a new instance of the receiver with a view identified by viewName
  124153.     to evaluate the monadic valuable argument, operation. The view is 
  124154.     displayed modal to the current active window. The operation is evaluated 
  124155.     in a background process, and is passed a progress dialog to be updated with its 
  124156.     progress (#value: 0..100, #text: aString). If the instances cancel button is pressed, then 
  124157.     the operation is terminated and the answer is nil. If the operation 
  124158.     runs to completion, then the answer is result of the evaluation."
  124159.  
  124160.     ^(self create: viewName operation: operation)
  124161.         showModal!
  124162.  
  124163. showModalWhile: operation
  124164.     "Create a new instance of the receiver with its default view,
  124165.     to evaluate the monadic valuable argument, operation. The view is 
  124166.     displayed modal to the current active window. The operation is evaluated 
  124167.     in a background process, and is passed a progress dialog to be updated with its 
  124168.     progress (#value: 0..100, #text: aString). If the instances cancel button is pressed, then 
  124169.     the operation is terminated and the answer is nil. If the operation 
  124170.     runs to completion, then the answer is result of the evaluation."
  124171.  
  124172.     ^self showModal: self defaultView while: operation! !
  124173.  
  124174. !ProgressDialog methodsFor!
  124175.  
  124176. allowCancel
  124177.     "Answer whether the user is permitted to cancel the operation."
  124178.  
  124179.     ^allowCancel!
  124180.  
  124181. allowCancel: aBoolean
  124182.     "Set whether the user is permitted to cancel the operation."
  124183.  
  124184.     allowCancel := aBoolean.
  124185.     self invalidateUserInterface!
  124186.  
  124187. answer
  124188.     "Answer the model if the receiver was confirmed (with #apply, #okay) 
  124189.     or nil otherwise. Dereference the value from the model since this will
  124190.     be most useful"
  124191.  
  124192.     ^self isConfirmed
  124193.         ifTrue: [ self model subject value ]
  124194.         ifFalse: [ nil ]!
  124195.  
  124196. cancel
  124197.     "Cancel the operation and close the receiver."
  124198.  
  124199.     process terminate.
  124200.     process := nil.
  124201.     super cancel!
  124202.  
  124203. createComponents
  124204.     "Create the presenters contained by the receiver"
  124205.  
  124206.     super createComponents.
  124207.     progressPresenter := self add: NumberPresenter new name: 'progress'.
  124208.     textPresenter := self add: TextPresenter new name: 'text'
  124209.  
  124210. !
  124211.  
  124212. forkOperation
  124213.     "Private - Start the receiver's operation at the current priority
  124214.     (the user supplied operation can modify the priority, if desired,
  124215.     by means of a 'Processor activeProces priority: X' expression)."
  124216.  
  124217.     process := [self model subject value: (operation value: self). self ok] forkAt: self priority!
  124218.  
  124219. initialize
  124220.     "Private - Initialize the receiver"
  124221.  
  124222.     super initialize.
  124223.     allowCancel := true.
  124224.     priority := Processor userBackgroundPriority.!
  124225.  
  124226. operation
  124227.     "Answer the value of the receiver's instance variable 'operation'.
  124228.     This method was automatically generated, but may be modified."
  124229.  
  124230.     ^operation!
  124231.  
  124232. operation: anObject
  124233.     "Set the value of the receiver's instance variable 'operation' to anObject.
  124234.     This method was automatically generated, but may be modified."
  124235.  
  124236.     operation := anObject!
  124237.  
  124238. priority
  124239.     "Answer the priority at which the operation was or will be forked."
  124240.  
  124241.     ^priority!
  124242.  
  124243. priority: anInteger
  124244.     "Set the priority at which the operation was or will be forked.
  124245.     This must be a valid process priority level."
  124246.  
  124247.     (priority between: Processor systemBackgroundPriority 
  124248.             and: Processor highIOPriority) ifFalse: [self error: 'Invalid priority'].
  124249.     priority := anInteger
  124250.  
  124251. !
  124252.  
  124253. progress
  124254.     "Answer the current progress value.
  124255.     Useful with modeless progress dialogs."
  124256.  
  124257.     ^progressPresenter value!
  124258.  
  124259. queryCommand: query
  124260.     "Private - Enters details about a potential command for the receiver into the 
  124261.     <CommandQuery>,  query."
  124262.  
  124263.     | cmd |
  124264.     cmd := query commandSymbol.
  124265.  
  124266.     cmd == #cancel ifTrue: [
  124267.         "Note that we need to force ourselves as the command target to disable cancel"
  124268.         query isEnabled: self allowCancel; receiver: self.
  124269.         ^true].
  124270.  
  124271.     ^super queryCommand: query
  124272.  
  124273. !
  124274.  
  124275. show
  124276.     "Start the operation, and show the receiver modelessly.
  124277.     The result of the operation (and the progress) can be queried from
  124278.     the receiver at any time using the messages #isConfirmed, #value, 
  124279.     and #progress.
  124280.     "
  124281.  
  124282.     self forkOperation.
  124283.     ^super show!
  124284.  
  124285. showModal
  124286.     "Start the operation, and show the receiver's view as a modal dialog.
  124287.     Answer the result of the operation if the process runs to completion,
  124288.     or if cancelled or the process experiences an exception."
  124289.  
  124290.     self forkOperation.
  124291.     ^super showModal!
  124292.  
  124293. text: progressText
  124294.     "Set the descriptive text displayed in the receiver to be the <readableString>,
  124295.     progressText."
  124296.  
  124297.     textPresenter model value: progressText!
  124298.  
  124299. value: progressValue
  124300.     "Set the numeric progress displayed in the receiver to be the <Integer>,
  124301.     progressValue."
  124302.  
  124303.     progressPresenter value: progressValue! !
  124304.  
  124305. ResourceIdentifierDialog comment:
  124306. 'ResourceIdentifierDialog is a <dialogPresenter> used to edit the contents of an <ResourceIdentifier> model.
  124307.  
  124308. Instance Variables:
  124309.     classTreePresenter        <TreePresenter> displaying a hierarchy of presenter classes.
  124310.     resourceNamePresenter    <TextPresenter> for the #name aspect.
  124311.     classValue        <ValueAspectAdaptor> for the #owningClass aspect.
  124312.  
  124313. '!
  124314. !ResourceIdentifierDialog class methodsFor!
  124315.  
  124316. defaultModel
  124317.     "Answer a default model to be assigned to the receiver when it
  124318.     is initialized."
  124319.  
  124320.     ^ResourceIdentifier new!
  124321.  
  124322. genNameLike: aString uniqueWithin: aCollection
  124323.     "Private - Answer a String unique within aCollection based on aString."
  124324.  
  124325.     | tryName suffixNo |
  124326.     tryName := aString.
  124327.     suffixNo := 1.
  124328.     [aCollection includes: tryName]
  124329.         whileTrue: [
  124330.             tryName := aString, suffixNo asString.
  124331.             suffixNo := suffixNo + 1].
  124332.     ^tryName!
  124333.  
  124334. icon
  124335.     "Answers an Icon that can be used to represent this class."
  124336.  
  124337.     ^Smalltalk developmentSystem icon
  124338. ! !
  124339.  
  124340. !ResourceIdentifierDialog methodsFor!
  124341.  
  124342. createComponents
  124343.     "Create the presenters contained by the receiver"
  124344.  
  124345.     super createComponents.
  124346.     classTreePresenter := self add: TreePresenter new name: 'classTree'.
  124347.     resourceNamePresenter := self add: TextPresenter new name: 'resourceName'.!
  124348.  
  124349. createSchematicWiring
  124350.     "Create the trigger wiring for the receiver"
  124351.     
  124352.     super createSchematicWiring.
  124353.     classTreePresenter 
  124354.         when: #selectionChanged send: #onClassSelected to: self
  124355. !
  124356.  
  124357. model: aResourceIdentifier
  124358.     "Set the model associated with the receiver."
  124359.  
  124360.     | aspectBuffer |
  124361.     super model: aResourceIdentifier.
  124362.  
  124363.     aspectBuffer := self model.
  124364.     classTreePresenter model: ClassHierarchyModel withAllClasses.
  124365.     resourceNamePresenter model: (aspectBuffer aspectValue: #name).
  124366.     classValue := aspectBuffer aspectValue: #owningClass.
  124367. !
  124368.  
  124369. onClassSelected
  124370.     "Private - The class selected within the receiver has changed."
  124371.  
  124372.     classValue value: classTreePresenter selectionOrNil
  124373. !
  124374.  
  124375. onViewOpened
  124376.     "Received when the receiver's view has been connected. "
  124377.  
  124378.     super onViewOpened.
  124379.     classTreePresenter selection: classValue value.
  124380. ! !
  124381.  
  124382. ValueDialog comment:
  124383. 'ValueDialog is an abstract <valueDialogPresenter> superclass for allowing <valueModel> data to be displayed and edited within a top-level modal dialog window.  When deciding whether to implement a dialog as a plain <dialogPresenter> or as a <valueDialogPresenter> there are a number of considerations to take into account. These are discussed in the comment for the Dialog class.
  124384.  
  124385. For the most part a <valueDialogPresenter> operates in much the same way as any <dialogPresenter>. However, its subject will always be a <valueModel>, although the value that this refers to will obviously be different for each dialog. When the dialog is created, the actual model that is installed is a <ValueBuffer> onto the subject. This is a type of <valueHolder> that is used to buffer any changes to the subject''s value so that they will not be written back to the original model until an explicit #apply request is made.
  124386. '!
  124387. !ValueDialog class methodsFor!
  124388.  
  124389. defaultModel
  124390.     "Answer a default model to be assigned to the receiver when it
  124391.     is initialized."
  124392.  
  124393.     ^nil asValue
  124394. !
  124395.  
  124396. icon
  124397.     "Answers an Icon that can be used to represent this class"
  124398.  
  124399.     ^##(self) defaultIcon!
  124400.  
  124401. publishedEventsOfInstances
  124402.         "Answer a Set of Symbols that describe the published events triggered
  124403.         by instances of the receiver."
  124404.     
  124405.         ^super publishedEventsOfInstances
  124406.             add: #valueChanged;
  124407.             yourself.
  124408.     ! !
  124409.  
  124410. !ValueDialog methodsFor!
  124411.  
  124412. answer
  124413.     "Answer the model if the receiver was confirmed (with #apply, #okay) 
  124414.     or nil otherwise. Dereference the value from the model since this will
  124415.     be most useful"
  124416.  
  124417.     ^self isConfirmed
  124418.         ifTrue: [ self model value ]
  124419.         ifFalse: [ nil ]!
  124420.  
  124421. bufferedModelFor: aSubjectValueModel
  124422.     "Private - Answers a buffer suitable for the receiver on aSubjectValueModel. This will become the
  124423.     actual model to which the receiver is bound."
  124424.  
  124425.     ^(ValueBuffer subject: aSubjectValueModel asValue) comparisonPolicy: SearchPolicy equality!
  124426.  
  124427. model: aValueModel
  124428.     "Set the model of the receiver to be aValueModel. Register with it's #valueChanged
  124429.     event"
  124430.  
  124431.     super model: aValueModel.
  124432.     aValueModel when: #valueChanged send: #onValueChanged to: self!
  124433.  
  124434. onValueChanged
  124435.     "The value held by the receiver's model has changed.
  124436.     The default is to trigger a #valueChanged event off the receiver"
  124437.  
  124438.     self trigger: #valueChanged!
  124439.  
  124440. value
  124441.     "Answer the model value of the receiver"
  124442.  
  124443.     ^self model value!
  124444.  
  124445. value: anObject
  124446.     "Set the model value of the receiver to be anObject. The change
  124447.     will not be flushed back to the original subject model until #apply
  124448.     is received"
  124449.  
  124450.     self model value: anObject.! !
  124451.  
  124452. VideoRecordingDialog comment:
  124453. 'VideoRecordingDialog provides a modal user interface for editing the contents of a VideoRecording object in place. This class is part of the Video Library sample package. Please see the package comment for more details.
  124454.  
  124455. Example:
  124456. self showModalOn: VideoRecording new "Display it"'!
  124457. !VideoRecordingDialog class methodsFor!
  124458.  
  124459. defaultModel
  124460.     "Answer a default model to be assigned to the receiver when it
  124461.     is initialized."
  124462.  
  124463.     ^VideoRecording new
  124464. !
  124465.  
  124466. icon
  124467.     "Answers an Icon that can be used to represent this class"
  124468.  
  124469.     ^VideoRecording icon! !
  124470.  
  124471. !VideoRecordingDialog methodsFor!
  124472.  
  124473. createComponents
  124474.     "Create the presenters contained by the receiver"
  124475.  
  124476.     super createComponents.
  124477.     titlePresenter := self add: TextPresenter new name: 'title'.
  124478.     datePresenter := self add: DatePresenter new name: 'date'.
  124479.     timePresenter := self add: TimePresenter new name: 'time'.
  124480.     lengthPresenter := self add: NumberPresenter new name: 'length'.
  124481.  
  124482.  
  124483.  
  124484. !
  124485.  
  124486. model: aVideoRecording
  124487.     "Set the model associated with the receiver to aVideoRecording."
  124488.  
  124489.     super model: aVideoRecording.
  124490.  
  124491.     "From this point on 'self model' is the buffered version of aVideoRecording"
  124492.     titlePresenter model: (self model aspectValue: #title).
  124493.     datePresenter model: (self model aspectValue: #date).
  124494.     timePresenter model: (self model aspectValue: #time).
  124495.     lengthPresenter model: (self model aspectValue: #length).
  124496.  
  124497. ! !
  124498.  
  124499. AXTypeLibraryPrompter comment:
  124500. 'AXTypeLibraryPrompter is a <valueDialogPresenter> that can be used to prompt for a COM component type library to install into the image. Its displays a list of all the registered type libraries (including those already installed) and also gives the user an opportunity to load a type library directly from a DLL, OCX, EXE, or TLB file. The subject <valueModel> is filled with an instance of AXTypeLibrary representing the chosen library when the dialogue is confirmed.
  124501.  
  124502. Note that the prompter takes care not to actually load the type libraries until the user chooses one.
  124503.  
  124504. Example:
  124505.     AXTypeLibraryPrompter showModal "Display it"
  124506.  
  124507. Instance Variables:
  124508.     typeLibs        <ListPresenter> displaying a list of <AXTypeLibRegistration>s.
  124509.     path        <TextPresenter> displaying the path to the chosen type library.
  124510.  
  124511. '!
  124512. !AXTypeLibraryPrompter methodsFor!
  124513.  
  124514. ΓV"!!=çÇ?9╡ºë$æ,î╛åÄ▌┼┌╘¬≈σGK║√╨iv[S▄É;@äG%`ORb≤à^[f[½yxº¿%≤╚GΩ┌▌≤¥ª çqL@mr▀╜y7ì╞═IG¢¥fα.▄ä∞Tc:≥$┼âÅGx¬@=╫ûÖ╢α⌐`£=ì₧Çy║⌠E¼e;îε>█àáU6▄Z÷±>&╖¬½Ro╘7±å▐g╢ó■╛ß¼« h╝°ª:`UPr7£Jφ'1AQ─ùQ═¡Po.B^├▒.ƒRE╪¥╗╤√tφ╛▒▀ƒ-░φ▌ ▌EmVR╣p·Ou[µδ)⌠hC°6îäÇï╤\₧─àΦGπR>╗fΣiàá ╩B.k#P¢!
  124515.  
  124516. ΓV"!!=ùî:,╖¿ÿ#åΦ╞µ┬∙║╡╝ⁿ╤╖VB½╛Ço{M╞û7UÉZVjyRAb±┴Vtf[½yxº¿%≤╚GΩ┌▌≈ÜÑuéd[.c╚╣l&½·├QMÿçvÖJñt₧▓<%`,°tÜ≥P₧Q4╗9▌╚â╡═úgüæ½ûn    íπZAª ~îδi₧£PΘu6▄Z÷±?`δ▐[╩M}┼1±╚î4á½⌠°«k┬¥tE⌐σ₧vBc<╘Já5}JS▌┬⌐⌐Xc;FHÜÆ*à^X╓│▐╢╚x⌠┐¡─ÿ,┤±╨:╩    2╕<Φ.±┤e╞!
  124517.  
  124518. εOJp\zçâ=:┐Θÿ"Ç≤╤∞╔≈┴┌╟■≤½W╛½╨wjB┌ü~Qƒ^J-kHh⌡ë]&/Aπh[oΓ╣%∙█K¡Ñ≈£÷╠^â{feÜ▒b6½┼é4"°|·
  124519. 5╝F▒=îlû8] ?í>┬₧MàRqÇ    >└╥╨≤└Ñp£Éò╝n!!º²)╚    ~ÄΘs╚▐S≥Duî╚⌠mhΩΘq╬g╞░╨ÉA.≤ò┘╞╘╕±LU╗≥│DHT(ïú"~Bb╠─₧│Xy5LBÇ┴=Ä]?▀╛╝╥òr±¬ä▀┌1╛!
  124520.  
  124521. εJ%=êå0;╗╗ò    ì0≥╤ßíö╛¥σ¼√│RW║√ì;RB╦ö;¢VF8oIJ+≈Æ^[c#Aπ[e▒«.║▄[@╝┐▓▐Γ▄ ╫pQll▀±n>º╩╦PFÆVÆ5½MóoëA⌡_0Σ$ô╫Jê ╞i█¢╨╢┼│3£Ü█Ç}½▒VWΓt~┬└₧▄PΩL.┬[ûV±8u╣╨}éLk┼;±╚î`╢╜∞╛⌠⌐α ╢δ≥    hKTbrçú3eZQ┼╘|α╚\c=A@▀àa╔7h√Ü╕½∙mΓ·ù─ƒ)⌡∞╟*└:
  124522. µ<┤,{R∩░g─I^ îêâÜ╓Gòû╞ΘO∙>╛1íp╩∞▒!
  124523.  
  124524. εJ%=êå0;╗╗òÇ3Σ╫√╔·║╡╝ⁿ┬╖ZU╛»┼;>wÆÉ'BÆH#lIRy╢ëJ&$Jªryºº%∙╩Gµ≈ࢱ▌ƒ4Jk ╙▓k=╝─┴MAÜ╙wíVó·h⌡EI1∩gô╦]òLs∞4╓╥╧ ▀┤3ç ▀Üà}ó≡UHº uûΩ!!╪▐\ΓRaÄ2░{ÖD}╣╒}┼r¡U╪╠éP|≤¡⌠√ßµÖ
  124525. 5╛⌡╗2wCFh&ïú<tNBçzºx┬│\j|Üò6¢_.ƒ≥┬°∩dΦ┐é┘ô1╗╠█'╞    ~K ¿R⌡4VΣà{╒h¼=≤δ·τΣçû┬≤K≡R,╫êZ¼αφ╓3F[8÷wƒ■/lòz≥$╢q(RbÆh ¢·9÷Çï█N!!?f|û ╦╫╦]6ü≈Tp≈°\ûæ≥-╖EQ9)├·+g╤~Æⁿÿ▀ª╡πÇ╬Ö╪VôV═ε,?M╔√é┼%┐8&
  124526. ■╣≡├╠1~à¼)╡¢∙[╔ôÆ@Ω);ä╥∙┘▒~┬╩╫=π≥@╢1æ¼┤─'┼⌡é~ÇåFΣεOc1ú≡ûª p8yè5%Ü≈δx°⌡╥~╣⌠ÄfPΓ╪<R¿n┐₧h%ÇR-æ┴·π╪^═{╬ƒ∙Φ╚═RTÖrWïY╝╕ê#ΣÜ╬¿÷<FBòTG"╫░¢xRº`ï└P/H╠┬╢pƒ┤Ñ5ÿM
  124527. ò╨░║╧~╖iΘ⌐ΘGhâZ2'
  124528. @└(¡a¼▓ö%7╪╥ª¡Lδ≈┘½gJü#F∙Vi¿RKV╟?░ĺ!
  124529.  
  124530. εJ0/ïƒ7'┐¡ß@∞}╤╞µ┌ ├┌ò≤▓ùV@║▓╓~wA┌ü0âWAj|^Pnαä ufY¬yD*½╕`°█GΦ┤╕É∙╩
  124531. Æp@\e▄«h!!ªë╘QM°|·|╜W÷rûA D]=∩p▀╩@îG4á    >┴ô╤ ╔│1σg≥±·o╛⌠E¡n<rç°╬┌QΓEaí5│÷!!g╣╒}─Pk╙7 ▒Θ-`¬╛²╥Θ╗┤sY¡╞╜    v+?!
  124532.  
  124533. εT"!!┤è ╕─µC╟≤█°▀√ù╦▌╗▓úZO║√╙b`\S▀─8]àEjzBCnO·êKg4Vπh\*¡╗%⌠Ém┬┌▌≈δÅçqR    l ╞╤[║╨╨\D£╙L(εbÄIë∙}F *αvå W¥Nm╢.ô¥╙≤┬εΓdïéâyº≤J¡t$rÄ»:╪δM≥Duîd╖|ÜDrⁿ╦~éTo╠*┤å├Pmú½⌠≈ΓH┼₧    5¬⌡ó%I^6 Xπ`!
  124534.  
  124535. ≡Q",½é?(┤¡╓jö*Σ╞÷íö╛¥σ¼√│RW║√ì;VFB╫û~VÆKE#bHj∙ö
  124536. gf_¼hVd╢ó!!÷₧AÑ║╢É≤Åà4Jk ╚╣n7º▀┼K°|·{║L÷iÿ╝l5∞eæ┌hëGf╡^pôâ╓≤▐╣=╩`⌡÷∙ε≥Z@Γ|gδ∞>┌ƒ║>┘Z╚│.n⌠╩y╠F]┘2│╙Å
  124537. ┘╟òöëÑ≡ Σá±    %OS?t'ïPú,]&9╪╚ôßP~MM╪ì*ÅB▐≈─▒°Q÷┐Æ╚ö*░±ë╬    "R
  124538. »W⌡ppΣδ)τXr╚O╨∞∙τ╢vÅ─╨π║Z╫ê╓≥Φ┌xZ[$╥8₧·,kòn▀_╩S[-δ
  124539. !
  124540.  
  124541. ≤A!!0+¼ΓX@°Ö₧#ô>⌡╤»ü╛σ┌╙¼≈╢[½│┼;AE╞─1T╫\Q8|^]O╫╣*@v#c¬~Ak░▓⌠▀N▓▓Ñì╖╞^â|[@gm█╗hp├ú¡3!!ëVürºPóoæ⌡^AxΓqì╠\ÆV@╡9 ¢┴σî╝Γ`⌡≥Éi╝⌠YPûy~«µ1═ƒ║⌠k├÷h√╒y╨[O╬>╜┼ÖAf≤»⌠≥╘╕±LU╗≤≥    iJPrh╬1╣1rG╒W╚ë⌐9DE╔ò=èN Ö■æà▓ Ä╙ô╚¥7ª≈██ 8Cµ!!╝.Lk√íl∞dY■îÿ▓Ç▐Dé╠└⌠α  ┐GΦ1≈Γ ╓    R{N@2 $▌ÜG â1ÿG╠ SCwÅon₧╗o╛J7Y╧½ⁿC#;^q╪    ₧╓╨Bà±Y$┤·▀ûèU╠)6Dt╥⌡
  124542. ?é"·æ▒╞╝┐▌┐╔ÿïSòK┤▐D!!º¢£┘+╣kiΦ■▒▌÷0câƒ(äçⁿXºφ≥&ì]dö╓·û∩ò╖╕xâÖUó*3åÑó┬=╘⌠²T! !
  124543.  
  124544. CategoryPrompter comment:
  124545. 'CategoryPrompter is a <valueDialogPresenter> that can be used to prompt for a <Category>.
  124546.  
  124547. Example:
  124548. (CategoryPrompter list: MethodCategory allMethodCategories 
  124549.     caption: ''Choose a category'') showModal "Display it"
  124550.  
  124551. Instance Variables:
  124552.     treePresenter    <TreePresenter> displaying the hierarchy of categories to choose from.
  124553.     allowIntermediates    <boolean> indicating whether intermediate nodes in the hierarchy are available to be chosen.
  124554.     categoryClass    <Category class> indicating the class of category being displayed.
  124555.  
  124556. '!
  124557. !CategoryPrompter class methodsFor!
  124558.  
  124559. choices: aSequenceableCollection caption: aStringCaption 
  124560.     "Answers a dialog to allow the user to choose from aSequenceableCollection of categories.
  124561.     The dialog is given aStringCaption. There will be no initial list selection when the dialog is
  124562.     displayed"
  124563.  
  124564.     ^self 
  124565.         on: nil asValue
  124566.         choices: aSequenceableCollection
  124567.         caption: aStringCaption!
  124568.  
  124569. defaultModel
  124570.     "Answer a default model to be assigned to the receiver when it
  124571.     is initialized."
  124572.  
  124573.     ^Object methodCategoryClass unclassified asValue!
  124574.  
  124575. icon
  124576.     "Answers an Icon that can be used to represent this class."
  124577.  
  124578.     ^Smalltalk developmentSystem icon
  124579. !
  124580.  
  124581. initialize
  124582.     "Private - Initialize the receiver. Install as a sample application into the
  124583.     system folder
  124584.         self initialize.
  124585.     "
  124586.  
  124587.     AllowIntermediatesMask := 16r1.
  124588.     AllowReadOnlyMask := 16r2!
  124589.  
  124590. on: value choices: list caption: caption
  124591.     "Answers a dialog to allow the user to choose from the <sequencedReadableCollection> of
  124592.     values, list. The initial list selection is the <Category>, value which, if nil, there is no selection.
  124593.     The dialog is given the <readableString> caption, title"
  124594.  
  124595.     ^(self createOn: value asValue)
  124596.         list: list;
  124597.         caption: caption
  124598. ! !
  124599.  
  124600. !CategoryPrompter methodsFor!
  124601.  
  124602. allowIntermediates
  124603.     "Answer whether the selection of intermediate categories is valid."
  124604.  
  124605.     ^flags allMask: AllowIntermediatesMask!
  124606.  
  124607. allowIntermediates: bool
  124608.     "Set whether the selection of intermediate categories is valid."
  124609.  
  124610.     flags := flags mask: AllowIntermediatesMask set: bool!
  124611.  
  124612. allowReadOnly
  124613.     "Answer whether the selection of read-only categories is valid."
  124614.  
  124615.     ^flags allMask: AllowReadOnlyMask!
  124616.  
  124617. allowReadOnly: bool
  124618.     "Set whether the selection of read-only categories is valid."
  124619.  
  124620.     flags := flags mask: AllowReadOnlyMask set: bool!
  124621.  
  124622. categoryClass: anObject
  124623.     "Set the value of the receiver's 'categoryClass' instance variable to the argument, anObject."
  124624.  
  124625.     categoryClass := anObject!
  124626.  
  124627. createComponents
  124628.     "Create the presenters contained by the receiver"
  124629.  
  124630.     super createComponents.
  124631.     treePresenter := self add: TreePresenter new name: 'tree'.
  124632.  
  124633. !
  124634.  
  124635. createSchematicWiring
  124636.     "Create the trigger wiring for the receiver"
  124637.     
  124638.     super createSchematicWiring.
  124639.     treePresenter when: #selectionChanged send: #onCategorySelectionChanged to: self.
  124640.     treePresenter when: #actionPerformed send: #onChoose to: self.!
  124641.  
  124642. initialize
  124643.     "Private - Initialize the receiver"
  124644.  
  124645.     super initialize.
  124646.     categoryClass := Object methodCategoryClass.
  124647.     flags := 0.
  124648.     treePresenter model: CategoryTreeModel new.!
  124649.  
  124650. list: categories
  124651.     "Set the list of categories displayed in the receiver to the <collection>, categories."
  124652.  
  124653.     treePresenter model list: categories.
  124654.     self value notNil ifTrue: [treePresenter selection: self value]!
  124655.  
  124656. newCategory
  124657.     "New Category button selected. Allow a new Category to be created."
  124658.  
  124659.     | chosenCategoryName default |
  124660.     default := treePresenter selectionOrNil.
  124661.     default := default notNil ifTrue: [default name] ifFalse: [''].
  124662.     chosenCategoryName := Prompter 
  124663.                 on: default
  124664.                 prompt: 'Unique ' , categoryClass name , ' name:'
  124665.                 caption: 'New ' , categoryClass name.
  124666.     chosenCategoryName notNil 
  124667.         ifTrue: 
  124668.             [self value: (categoryClass name: chosenCategoryName).
  124669.             self ok]!
  124670.  
  124671. newChoice
  124672.     "New... button selected."
  124673.  
  124674.     self newCategory!
  124675.  
  124676. onCategorySelectionChanged
  124677.     "Private - The selection has been changed in the tree presenter.
  124678.     Transfer the selection to our buffered model's value"
  124679.  
  124680.     self value: treePresenter selectionOrNil!
  124681.  
  124682. onChoose
  124683.     "Private - The user double clicked a category. Route as if a command."
  124684.  
  124685.     self view onCommand: (CommandDescription command: #ok)!
  124686.  
  124687. queryCommand: query
  124688.     "Private - Enter details about a potential command for the receiver 
  124689.     into the <CommandQuery>, query."
  124690.  
  124691.     query commandSymbol == #ok ifTrue: [ | cat |
  124692.         cat := self value.
  124693.         query isEnabled: 
  124694.             (cat notNil and: [
  124695.                 cat isIntermediate 
  124696.                     ifTrue: [self allowIntermediates]
  124697.                     ifFalse: [self allowReadOnly or: [cat acceptsAdditions]]]).
  124698.         ^true].
  124699.  
  124700.     ^super queryCommand: query.
  124701. ! !
  124702.  
  124703. ChoicePrompter comment:
  124704. 'ChoicePrompter is a <valueDialogPresenter> that allows a value to be chosen from a list of alternatives. 
  124705.  
  124706. You can instantiate a single selection ChoicePrompter dialog using the class methods #choices:caption: or #on:choices:caption:. It is also possible to allow multiples selections by using the methods #multipleChoices:caption: and #on:multipleChoices:caption:. Each of these methods answers the model value if Ok (or nil if Cancel) is pressed. When a ChoicePrompter is being used to select multiple choices, the < valueModel> will be used to contain an Array of the selected items.
  124707.  
  124708. Since a ChoicePrompter is really just a dialog wrapper around a <ChoicePresenter> it presents most of the functionality of the latter in an easy to use dialog form. The initial selection of choices in the dialog will match the initial value of the model. The selections made in the choices list will not be transferred to the <valueModel> unless Ok is used confirm the dialog. If Cancel is pressed the model will be left untouched. 
  124709.  
  124710. It is also possible to configure a ChoicePrompter such that new entries may be added dynmaically to the list of choices. This can be done by specifying a <monadicValuable> using #newBlock:. When a #newChoice or #newMultipleChoice command is received from the view, a standard <Prompter> will be displayed and the resultant text from this will be run through the newBlock to determine the choice or choices to be added to the list. In order to enable this functionality it is necessary to explicitly specify the view as "Extensible choice prompter" or "Extensible multi-selection choice prompter", as appropriate.
  124711.  
  124712. Examples:
  124713.  
  124714. "Single Selection"
  124715. ChoicePrompter choices: #[0 1 2 3] caption: ''Please choose''. "Display it"
  124716.  
  124717. model := 2 asValue.
  124718. ChoicePrompter on: model choices: #[0 1 2 3] caption: ''Please choose''.
  124719. model value"Display it"
  124720.  
  124721. "Multiple Selection"
  124722. ChoicePrompter multipleChoices: #[0 1 2 3] caption: ''Please choose''. "Display it"
  124723.  
  124724. model := (Array with: 2) asValue.
  124725. ChoicePrompter on: model multipleChoices: #[0 1 2 3] caption: ''Please choose''.
  124726. model value "Display it"
  124727.  
  124728. Instance Variables:
  124729.     choicesPresenter    <ChoicePresenter> used to make a selection from range of choices.
  124730.     newBlock        <monadicValuable> which is evaluated with a string argument to create a new choice.
  124731.     newCaption    <readableString> holding the caption to use when prompting for a new choice.
  124732.     newPrompt    <readableString> holding the prompt text to use when prompting for a new choice.
  124733.  
  124734.  
  124735.  
  124736.  
  124737. '!
  124738. !ChoicePrompter class methodsFor!
  124739.  
  124740. choices: aSequenceableCollection
  124741.     "Shows a dialog to allow the user to choose from aSequenceableCollection.
  124742.     The dialog is given a default caption.
  124743.  
  124744.     Answer the choice made or nil if the dialog is cancelled"
  124745.  
  124746.     ^self choices: aSequenceableCollection caption: nil.
  124747. !
  124748.  
  124749. choices: aSequenceableCollection caption: aStringCaptionOrNil
  124750.     "Shows a dialog to allow the user to choose from aSequenceableCollection.
  124751.     The dialog is given a caption according to aStringCaptionOrNil. If nil then
  124752.     the default caption is used.
  124753.  
  124754.     Answer the choice made or nil if the dialog is cancelled"
  124755.  
  124756.     | select |
  124757.     select := aSequenceableCollection notEmpty ifTrue: [aSequenceableCollection first].
  124758.     ^self on: select asValue choices: aSequenceableCollection caption: aStringCaptionOrNil
  124759. !
  124760.  
  124761. create: viewName on: aValueModel choices: aSequenceableCollection caption: aStringCaptionOrNil
  124762.     "Answer a dialog capable of allowing the user to choose from aSequenceableCollection.
  124763.     The initial list selection is determined by the value of aValueModel and the
  124764.     list choice made is sent back as this model's value. The dialog is given a caption
  124765.     according to aStringCaptionOrNil. If nil the default caption is used."
  124766.  
  124767.     | prompter |
  124768.     (prompter := self create: viewName)
  124769.         choices: aSequenceableCollection;
  124770.         model: aValueModel.
  124771.     aStringCaptionOrNil notNil ifTrue: [
  124772.         prompter caption: aStringCaptionOrNil ].
  124773.     ^prompter!
  124774.  
  124775. create: viewName on: aValueModel multipleChoices: aSequenceableCollection caption: aStringCaptionOrNil
  124776.     "Answer a new instance of a dialog that allows the user to choose multiple items from 
  124777.     aSequenceableCollection when shown. The initial list selection is determined by the value 
  124778.     of aValueModel and the list choice made is sent back as this model's value. The dialog is 
  124779.     given a caption according to aStringCaptionOrNil. If nil then the default caption is used."
  124780.  
  124781.     | prompter |
  124782.     (prompter := self create: viewName)
  124783.         choices: aSequenceableCollection;
  124784.         model: aValueModel.
  124785.     aStringCaptionOrNil notNil ifTrue: [
  124786.         prompter caption: aStringCaptionOrNil ].
  124787.     ^prompter!
  124788.  
  124789. createOn: aValueModel choices: aSequenceableCollection caption: aStringCaptionOrNil
  124790.     "Answer a new instance of the receiver that when shown allows the the user to 
  124791.     make a single choice from aSequenceableCollection."
  124792.  
  124793.     ^self 
  124794.         create: self defaultView
  124795.         on: aValueModel
  124796.         choices: aSequenceableCollection 
  124797.         caption: aStringCaptionOrNil!
  124798.  
  124799. createOn: aValueModel multipleChoices: aSequenceableCollection caption: aStringCaptionOrNil 
  124800.     "Answer a new instance of a dialog that allows the user to choose multiple items from 
  124801.     aSequenceableCollection when shown. The initial list selection is determined by the value 
  124802.     of aValueModel and the list choice made is sent back as this model's value. The dialog is 
  124803.     given a caption according to aStringCaptionOrNil. If nil then the default caption is used.
  124804.     The default multiple choice view is used."
  124805.  
  124806.     ^self 
  124807.         create: self defaultMultipleChoiceView
  124808.         on: aValueModel
  124809.         multipleChoices: aSequenceableCollection
  124810.         caption: aStringCaptionOrNil!
  124811.  
  124812. defaultAdditionalAccelerators
  124813.     ^#(#(#selectAll 'Ctrl+A'))!
  124814.  
  124815. defaultMultipleChoiceView
  124816.     ^'Multi-selection choice prompter'!
  124817.  
  124818. icon
  124819.     "Answers an Icon that can be used to represent this class"
  124820.  
  124821.     ^Icon fromId: '!!APPLICATION'
  124822.  
  124823. !
  124824.  
  124825. multipleChoices: aSequenceableCollection
  124826.     "Shows a dialog to allow the user to choose multiple items from aSequenceableCollection.
  124827.     The dialog is given a default caption.
  124828.  
  124829.     Answer the choice(s) made or nil if the dialog is cancelled"
  124830.  
  124831.     ^self multipleChoices: aSequenceableCollection caption: nil
  124832. !
  124833.  
  124834. multipleChoices: aSequenceableCollection caption: aStringCaptionOrNil
  124835.     "Shows a dialog to allow the user to choose multiple items from aSequenceableCollection.
  124836.     The dialog is given a caption according to aStringCaptionOrNil. If nil then
  124837.     the default caption is used.
  124838.  
  124839.     Answer the choice(s) made or nil if the dialog is cancelled"
  124840.  
  124841.     ^self 
  124842.         on: OrderedCollection new asValue 
  124843.         multipleChoices: aSequenceableCollection 
  124844.         caption: aStringCaptionOrNil!
  124845.  
  124846. on: aValueModel choices: aSequenceableCollection caption: aStringCaptionOrNil
  124847.     "Shows a dialog to allow the user to choose from aSequenceableCollection.
  124848.     See #create:on:choices:caption: for configuration details.Answer the choice made 
  124849.     or nil if the dialog is cancelled"
  124850.  
  124851.     ^(self 
  124852.         createOn: aValueModel
  124853.         choices: aSequenceableCollection 
  124854.         caption: aStringCaptionOrNil) showModal!
  124855.  
  124856. on: aValueModel multipleChoices: aSequenceableCollection caption: aStringCaptionOrNil
  124857.     "Shows a dialog to allow the user to choose multiple items from aSequenceableCollection.
  124858.     See #create:on:multipleChoices:caption: for further configuration details. Answer the choices made 
  124859.     or nil if the dialog is cancelled."
  124860.  
  124861.     ^(self
  124862.         createOn: aValueModel 
  124863.         multipleChoices: aSequenceableCollection 
  124864.         caption: aStringCaptionOrNil) showModal! !
  124865.  
  124866. !ChoicePrompter methodsFor!
  124867.  
  124868. choices: aSequenceableCollection
  124869.     "Private - Sets the choices to be aSequenceableCollection"
  124870.  
  124871.     choicePresenter choices: aSequenceableCollection.!
  124872.  
  124873. createComponents
  124874.     "Create the presenters contained by the receiver"
  124875.  
  124876.     super createComponents.
  124877.     choicePresenter := self add: ChoicePresenter new name: 'choices'.!
  124878.  
  124879. createSchematicWiring
  124880.     "Create the trigger wiring for the receiver"
  124881.     
  124882.     super createSchematicWiring.
  124883.     choicePresenter when: #actionPerformed send: #ok to: self.!
  124884.  
  124885. getImageBlock: monad
  124886.     "Set the <monadicValuable> used to extract an image from the choices in
  124887.     the receiver for display in the choice list."
  124888.  
  124889.     choicePresenter view getImageBlock: monad!
  124890.  
  124891. getTextBlock: monad
  124892.     "Set the <monadicValuable> used to extract text from the choices in
  124893.     the receiver for display in the choice list to the argument.
  124894.     The default 'block' sends #displayString to the objects, which is satisfactory 
  124895.     for a many uses, but this message allows the same prompter view 
  124896.     to be used in a wider range of circumstances. "
  124897.  
  124898.     choicePresenter view getTextBlock: monad!
  124899.  
  124900. imageManager: anImageManager
  124901.     "Set the <ImageManager> to be used to manage any images displayed in the
  124902.     receiver."
  124903.  
  124904.     choicePresenter view imageManager: anImageManager!
  124905.  
  124906. initialize
  124907.     "Private - Initialize the receiver"
  124908.  
  124909.     super initialize.
  124910.     newBlock := Message selector: #yourself.
  124911.     newPrompt := 'New name:'.
  124912.     newCaption := 'New...'!
  124913.  
  124914. model: aSubjectModel
  124915.     "Connect the receiver to aSubjectModel. The choice presenter shares this
  124916.     same model since it is responsible for editing it's value"
  124917.  
  124918.     super model: aSubjectModel.    
  124919.     choicePresenter model: self model.!
  124920.  
  124921. newBlock: monadicValuable
  124922.     "Set the <monadicValuable> to be evaluated against the string
  124923.     entered by the user to create a new choice to the argument."
  124924.  
  124925.     newBlock := monadicValuable!
  124926.  
  124927. newCaption
  124928.     "Answer the value of the receiver's 'newCaption' instance variable."
  124929.  
  124930.     ^newCaption!
  124931.  
  124932. newCaption: anObject
  124933.     "Set the value of the receiver's 'newCaption' instance variable to the argument, anObject."
  124934.  
  124935.     newCaption := anObject!
  124936.  
  124937. newChoice
  124938.     "New command has been issued. Create a new choice by prompting the user for
  124939.     its name."
  124940.  
  124941.     | default chosenName |
  124942.     default := choicePresenter value.
  124943.     default := default notNil
  124944.         ifTrue: [choicePresenter view getTextBlock value: default]
  124945.         ifFalse: [''].
  124946.     chosenName := Prompter
  124947.             on: default
  124948.             prompt: self newPrompt
  124949.             caption: self newCaption.
  124950.  
  124951.     chosenName notNil ifTrue: [ | new |
  124952.         new := (newBlock value: chosenName).
  124953.         "newBlock answers nil if new 'name' is not valid"
  124954.         new notNil ifTrue: [
  124955.             (choicePresenter viewModel includes: new) ifFalse: [
  124956.                 choicePresenter viewModel add: new ].
  124957.             self value: new.
  124958.             "self ok"]]!
  124959.  
  124960. newMultipleChoice
  124961.     "New command has been issued for a multi-selection prompter. 
  124962.     Create a new choice by prompting the user for    its name."
  124963.  
  124964.     | default chosenName |
  124965.     default := choicePresenter value.
  124966.     default := default notEmpty 
  124967.                 ifTrue: [choicePresenter view getTextBlock value: default first]
  124968.                 ifFalse: [''].
  124969.     chosenName := Prompter 
  124970.                 on: default
  124971.                 prompt: self newPrompt
  124972.                 caption: self newCaption.
  124973.     chosenName notNil 
  124974.         ifTrue: 
  124975.             [| new |
  124976.             new := newBlock value: chosenName.
  124977.             "newBlock answers nil if new 'name' is not valid"
  124978.             new notNil 
  124979.                 ifTrue: 
  124980.                     [(choicePresenter viewModel includes: new) ifFalse: [choicePresenter viewModel add: new].
  124981.                     choicePresenter view addSelection: (Array with: new)]]!
  124982.  
  124983. newPrompt
  124984.     "Answer the value of the receiver's 'newPrompt' instance variable."
  124985.  
  124986.     ^newPrompt!
  124987.  
  124988. newPrompt: anObject
  124989.     "Set the value of the receiver's 'newPrompt' instance variable to the argument, anObject."
  124990.  
  124991.     newPrompt := anObject!
  124992.  
  124993. nilChoice: anObject
  124994.     "Sets the choice that can be used to represent a nil value in the model"
  124995.  
  124996.     choicePresenter nilChoice: anObject! !
  124997.  
  124998. ChooseClassDialog comment:
  124999. ''!
  125000. !ChooseClassDialog class methodsFor!
  125001.  
  125002. icon
  125003.     "Answers an Icon that can be used to represent this class."
  125004.  
  125005.     ^Smalltalk developmentSystem icon
  125006. ! !
  125007.  
  125008. !ChooseClassDialog methodsFor!
  125009.  
  125010. allowNil
  125011.     ^allowNil!
  125012.  
  125013. allowNil: aBoolean
  125014.     allowNil := aBoolean!
  125015.  
  125016. classesPresenterClass
  125017.     ^ClassHierarchySelector!
  125018.  
  125019. createClassesPresenter
  125020.     classesPresenter := self add: self classesPresenterClass new name: 'classSelector'!
  125021.  
  125022. createComponents
  125023.     "Create the presenters contained by the receiver"
  125024.  
  125025.     super createComponents.
  125026.     self createClassesPresenter!
  125027.  
  125028. findClass
  125029.     "Prompts for a class name and finds it within the receiver. Will accept wild
  125030.     carded class name from the user."
  125031.  
  125032.     | class |
  125033.     class := Smalltalk developmentSystem chooseClass.
  125034.     class notNil ifTrue: [classesPresenter actualClass: class].
  125035.     classesPresenter ensureSelectionVisible!
  125036.  
  125037. initialize
  125038.     "Private - Initialize the receiver"
  125039.  
  125040.     super initialize.
  125041.     allowNil := false!
  125042.  
  125043. onClassSelected
  125044.     self value: classesPresenter selectionOrNil!
  125045.  
  125046. onViewOpened
  125047.     "Received when the receiver's view has been connected."
  125048.  
  125049.     super onViewOpened.
  125050.     classesPresenter selectionOrNil: self model value.
  125051.     "We can't wire up to the tree's selection change in #createSchematicWiring because
  125052.      the tree view's behaviour of auto-selecting its first root (i.e. Object) will cause the
  125053.      initial model value to be overwritten"
  125054.     classesPresenter 
  125055.         when: #selectionChanged
  125056.         send: #onClassSelected
  125057.         to: self!
  125058.  
  125059. queryCommand: query
  125060.     "Private - Enters details about a potential command for the receiver into 
  125061.     the <CommandQuery>, query"
  125062.  
  125063.     | cmd |
  125064.     cmd := query commandSymbol.
  125065.     cmd == #ok 
  125066.         ifTrue: 
  125067.             [query isEnabled: (allowNil or: [self value notNil]).
  125068.             ^true].
  125069.     ^super queryCommand: query! !
  125070.  
  125071. CommonDialog comment:
  125072. 'CommonDialog is an abstract <valueDialogPresenter> superclass for all Windows common dialogs.
  125073.  
  125074. Instance Variables:
  125075.     winStruct        <Win32Structure> used to configure the system dialog.
  125076.     unused        <UndefinedObject> reserved for future use.
  125077.  
  125078.  
  125079. '!
  125080. !CommonDialog class methodsFor!
  125081.  
  125082. defaultView
  125083.     "Answer the resource name of the default view for the receiver."
  125084.  
  125085.     self shouldNotImplement!
  125086.  
  125087. showModal
  125088.     "Creates a default instance of the receiver and displays it modal 
  125089.     to the current active window. 
  125090.     Answers the result of the dialog if confirmed or nil otherwise"
  125091.  
  125092.     ^self new showModal!
  125093.  
  125094. showModal: aDialogResourceNameString
  125095.     "Private - Should not implement. CommonDialogs can only use the view provided
  125096.     by the operating system."
  125097.  
  125098.     ^self shouldNotImplement!
  125099.  
  125100. showModal: aDialogResourceNameString on: aModel
  125101.     "Private - Should not implement. CommonDialogs can only use the view provided
  125102.     by the operating system."
  125103.  
  125104.     ^self shouldNotImplement
  125105. !
  125106.  
  125107. showModalOn: aModel
  125108.     "Creates an instance of the receiver connected to aModel. 
  125109.     The view is displayed modal to the current active window. 
  125110.     Answers the result of dialog if confirmed or nil otherwise"
  125111.  
  125112.     ^(self on: aModel) showModal! !
  125113.  
  125114. !CommonDialog methodsFor!
  125115.  
  125116. basicShowModal
  125117.     "Private - Create and show a new instance of this common dialog."
  125118.  
  125119.     ^self subclassResponsibility!
  125120.  
  125121. extractResult: apiResult
  125122.     "Private - Extract and apply the result from the parameter structure 
  125123.     passed to the Win32 API associated with this common dialog, immediately 
  125124.     after the call to that API."
  125125.  
  125126.     ^self subclassResponsibility!
  125127.  
  125128. initialize
  125129.     "Private - Initialize the receiver"
  125130.  
  125131.     winStruct := self winStructClass new.
  125132.     super initialize.
  125133.  
  125134. !
  125135.  
  125136. ownerView: aView
  125137.     "Private - Set the receivers ownerView to aView."
  125138.  
  125139.     super ownerView: aView.
  125140.     self winStruct ownerView: aView.!
  125141.  
  125142. prepareStruct
  125143.     "Private - Initialize the parameter structure to be passed to the Win32
  125144.     API associated with this common dialog, immediately prior to the call
  125145.     to that API."
  125146.  
  125147.     ^self subclassResponsibility!
  125148.  
  125149. setViewIcon: anIcon
  125150.     "Set the icon of a view opened on the receiver.
  125151.     We don't want to foist our icon onto the common dialogs, so override to do nothing."!
  125152.  
  125153. showModal
  125154.     "Create and show the receiver's modal dialog.
  125155.     Answer the 'result' (as defined by the subclass) or nil if no selection was made.
  125156.     Implemenation Note: The common dialogs steal the message loop and send
  125157.     WM_ENTERIDLE messages only erratically. We therefore start up the idle
  125158.     timer to allow us to run background processes now and again."
  125159.  
  125160.     | apiResult owner wasEnabled hitType |
  125161.     self prepareStruct.
  125162.     owner := self ownerView ifNil: [View active].
  125163.     wasEnabled := owner isEnabled.
  125164.     
  125165.     [SessionManager inputState startIdleTimer: owner.
  125166.     apiResult := self basicShowModal] 
  125167.             ensure: [SessionManager inputState stopIdleTimer: owner].
  125168.     hitType := wasEnabled 
  125169.                 ifTrue: [HTCLIENT]
  125170.                 ifFalse: 
  125171.                     [owner isEnabled: false.
  125172.                     HTERROR].
  125173.     "Reset the view's cursor in case control does not return to message loop"
  125174.     UserLibrary default 
  125175.         sendMessage: owner asParameter
  125176.         msg: WM_SETCURSOR
  125177.         wParam: 0
  125178.         lParam: hitType.
  125179.     self extractResult: apiResult.
  125180.     ^self answer!
  125181.  
  125182. updateIcon
  125183.     "Private - Transfer any icon across to the view. The common dialogs do not
  125184.     require icons so do nothing"!
  125185.  
  125186. winStruct
  125187.     "Private - Answer the receiver's associated windows parameter structure."
  125188.  
  125189.     ^winStruct
  125190.  
  125191. !
  125192.  
  125193. winStructClass
  125194.     "Private - Answer the class to use for the receiver's associated windows parameter structure."
  125195.  
  125196.     ^self subclassResponsibility! !
  125197.  
  125198. MenuComposer comment:
  125199. 'MenuComposer is a <valueDialogPresenter> that can be used to edit a <Menu> held in its <valueModel>.
  125200.  
  125201. Instance Variables:
  125202.     arena            <compositeView> which is the arena where the menu is being edited.
  125203.     menuViews        <OrderedCollection> of <MenuComposerView>''s representing the menu(s) being edited.
  125204.     conflictingAccelerators    <Set> of <integer> conflicting accelerator codes.
  125205. '!
  125206. !MenuComposer class methodsFor!
  125207.  
  125208. clipboard
  125209.     "Answer the contents of the private clipboard or nil if there is nothing available.
  125210.     Objects are stored on the clipboard as ByteArrays generated using #binaryStoreBytes"
  125211.  
  125212.     #todo "When OLE clipboard support is added we should use this".
  125213.     ^Clipboard!
  125214.  
  125215. clipboard: aByteArrayOrNil
  125216.     "Sets the contents of the private clipboard to aByteArrayOrNil. 
  125217.     Objects are stored on the clipboard as ByteArrays generated using #binaryStoreBytes"
  125218.  
  125219.     #todo "When OLE clipboard support is added we should use this".
  125220.     Clipboard := aByteArrayOrNil
  125221.  
  125222. !
  125223.  
  125224. defaultModel
  125225.     "Answer a default model to be assigned to the receiver when it
  125226.     is initialized."
  125227.  
  125228.     ^self menuClass new asValue!
  125229.  
  125230. icon
  125231.     "Answers an Icon that can be used to represent this class."
  125232.  
  125233.     ^self menuClass icon
  125234. !
  125235.  
  125236. menuClass
  125237.     "Private - Answer the base menu class that instances of the receiver will edit|"
  125238.  
  125239.     ^Menu! !
  125240.  
  125241. !MenuComposer methodsFor!
  125242.  
  125243. addCommand
  125244.     "Append a new empty command to the current menu."
  125245.  
  125246.     self addItem: self newCommandItem.!
  125247.  
  125248. addItem: menuItem
  125249.     "Private - Add menuItem after the position of the current selection."
  125250.  
  125251.     | selectionView index |
  125252.     selectionView := self selectionView.
  125253.     index := selectionView selectionByIndex.
  125254.     self addItem: menuItem view: selectionView index: index + 1!
  125255.  
  125256. addItem: menuItem view: menuView index: index 
  125257.     "Private - Add a menuItem to the current selectionView."
  125258.  
  125259.     | destinationMenu |
  125260.     destinationMenu := menuView menu.
  125261.     self update: menuView
  125262.         do: 
  125263.             [
  125264.             destinationMenu insertItem: menuItem at: index.
  125265.             self generateMnemonicConflicts: menuView.
  125266.             self generateAcceleratorConflicts]!
  125267.  
  125268. addMenu
  125269.     "Apend a new menu to the current menu."
  125270.  
  125271.     self addItem: self newMenu.!
  125272.  
  125273. addSeparator
  125274.     "Append a new Separator divider to the current menu."
  125275.  
  125276.     self addItem: DividerMenuItem separator
  125277. !
  125278.  
  125279. apply
  125280.     "Apply the changes cached in the receiver back to the model. We strip out
  125281.     any uintitled command items and menus if possible."
  125282.  
  125283.     self stripUntitled: self menu.
  125284.     self menu items isEmpty ifTrue: [ self value: nil ].
  125285.     super apply.!
  125286.  
  125287. arena
  125288.     "Answer the View where the menus are drawn."
  125289.  
  125290.     ^arena!
  125291.  
  125292. clearSelection
  125293.     "Removes the current selections from the receiver"
  125294.  
  125295.     | index selectionView |
  125296.     selectionView := self selectionView.
  125297.     index := selectionView selectionByIndex.
  125298.     self removeItemView: selectionView index: index!
  125299.  
  125300. closeSubmenuViewsOf: aView 
  125301.     "Private - Close any deeper menus than aView."
  125302.  
  125303.     self dragCoordinator hideDragCursor.
  125304.     
  125305.     [| enumerateViews subView |
  125306.     enumerateViews := menuViews copy.
  125307.     [(subView := enumerateViews last) == aView] whileFalse: 
  125308.             [menuViews removeLast.
  125309.             subView parentView removeSubView: subView.
  125310.             enumerateViews removeLast]] 
  125311.             ensure: [self dragCoordinator showDragCursor]!
  125312.  
  125313. collectAcceleratorsOf: menuOrItem into: aBag
  125314.     "Private - Populate aBag with all the accelerator key codes
  125315.     used in the receiver."
  125316.  
  125317.     | accel |
  125318.     menuOrItem items do: [:i | self collectAcceleratorsOf: i into: aBag].
  125319.     accel := menuOrItem acceleratorKey.
  125320.     accel notNull ifTrue: [aBag add: accel]!
  125321.  
  125322. commandItemClass
  125323.     ^CommandMenuItem!
  125324.  
  125325. copySelection
  125326.     "Copies the primary selection to the clipboard"
  125327.  
  125328.     self class clipboard: self selection binaryStoreBytes
  125329. !
  125330.  
  125331. cutSelection
  125332.     "Cuts the current selections to the clipboard"
  125333.  
  125334.     self copySelection; clearSelection
  125335. !
  125336.  
  125337. dragCoordinator
  125338.     "Private - Answer the drag object used to synchronize writing to the receivers view."
  125339.  
  125340.     ^arena!
  125341.  
  125342. ensureMinimumMenuContents: aMenu 
  125343.     "Private - We have to ensure that there is at least one item
  125344.     in a menu for our selection based system to work. Here
  125345.     we ensure that by adding a command entry if need be."
  125346.  
  125347.     aMenu items isEmpty 
  125348.         ifTrue: 
  125349.             [aMenu addItem: (aMenu isMenuBar ifTrue: [self newMenu] ifFalse: [self newCommandItem])]
  125350.         ifFalse: 
  125351.             [aMenu items do: [:item | item hasSubmenu ifTrue: [self ensureMinimumMenuContents: item]]]!
  125352.  
  125353. generateAcceleratorConflicts
  125354.     "Private - Generate the receivers set of conflicting accelerator keys and update
  125355.     all the open menu views to the new state. A conflicting accelerator key is one
  125356.     which is used by more than one menu item across the top level menu and all its
  125357.     sub-menus."
  125358.  
  125359.     | accels |
  125360.     accels := Bag new. 
  125361.     self collectAcceleratorsOf: self menu into: accels.
  125362.     conflictingAccelerators := accels removeAll: accels asSet; yourself asSet.
  125363.     menuViews do: [:menuView |
  125364.         self generateAcceleratorConflicts: menuView.
  125365.         menuView invalidate]!
  125366.  
  125367. generateAcceleratorConflicts: menuView
  125368.     "Private - Update menuView to reflect the current set of conflicting accelerator keys."
  125369.  
  125370.     | conflicts |
  125371.     conflicts := Set new.
  125372.     menuView menu items do: [:item | | acceleratorKey |
  125373.         acceleratorKey := item acceleratorKey.
  125374.         (conflictingAccelerators includes: acceleratorKey) ifTrue: [
  125375.             conflicts add: item]].
  125376.     menuView conflictingAccelerators: conflicts.
  125377. !
  125378.  
  125379. generateMnemonicConflicts: menuView
  125380.     "Private - Generate the set of menu items with conflicting mnemonic keys local to menuView."
  125381.  
  125382.     menuView generateMnemonicConflicts!
  125383.  
  125384. hasClipboard
  125385.     "Private - Answer true if there is an item on the clipboard"
  125386.  
  125387.     ^self class clipboard notNil
  125388. !
  125389.  
  125390. initialize
  125391.     "Private - Initialize the state of the receiver."
  125392.  
  125393.     super initialize.
  125394.     conflictingAccelerators := Set new.
  125395. !
  125396.  
  125397. menu
  125398.     "Answer the top level menu which the receiver is editing. If nil then
  125399.     we create a suitable base menu here."
  125400.  
  125401.     | menu |
  125402.     menu := self value.
  125403.     menu isNil ifTrue: [
  125404.         self value: (menu := self class menuClass new) ].
  125405.     ^menu!
  125406.  
  125407. menuClass
  125408.     "Private - Answer the base menu class that instances of the receiver will edit|"
  125409.  
  125410.     ^self class menuClass!
  125411.  
  125412. model: aSubjectModel
  125413.     "Connect the receiver to aSubjectModel onto a Menu. Since the MenuComposer
  125414.     works by modifying a menu's contents in place we must force a copy to be made here."
  125415.  
  125416.     super model: aSubjectModel.    
  125417.     self value: self value copy.
  125418. !
  125419.  
  125420. mutateIntoCommand
  125421.     "Private - Mutate the selected item into a <CommandMenuItem>."
  125422.  
  125423.     self mutateSelection: 
  125424.             [:item | 
  125425.             | proceed |
  125426.             proceed := true.
  125427.             (item items 
  125428.                 select: [:e | e command notNil and: [e command ~~ #noCommand]]) isEmpty
  125429.                     ifFalse: 
  125430.                         [(MessageBox
  125431.                             confirm: ('The menu ''%1'' has sub-items that will be lost.%n%nAre you sure you want to contine?' 
  125432.                                     formatWith: item description)
  125433.                             caption: 'Mutate Menu into Command...') ifFalse: [proceed := false]].
  125434.             proceed 
  125435.                 ifTrue: [self commandItemClass commandDescription: item commandDescription]]!
  125436.  
  125437. mutateIntoMenu
  125438.     "Private - Mutate the selected item into a <Menu>."
  125439.  
  125440.     self mutateSelection: 
  125441.             [:item | 
  125442.             (self newMenu)
  125443.                 name: item commandDescription commandSymbol;
  125444.                 text: item description;
  125445.                 yourself]!
  125446.  
  125447. mutateSelection: mutateBlock 
  125448.     | menuView index aMenu item newItem |
  125449.     menuView := self selectionView.
  125450.     aMenu := menuView menu.
  125451.     index := menuView selectionByIndex.
  125452.     item := aMenu itemAt: index.
  125453.     newItem := mutateBlock value: item.
  125454.     newItem isNil 
  125455.         ifFalse: 
  125456.             [self update: menuView
  125457.                 do: 
  125458.                     [aMenu
  125459.                         removeItemAt: index;
  125460.                         insertItem: newItem at: index]]!
  125461.  
  125462. newCommandItem
  125463.     "Private - Answer a new CommandItem."
  125464.  
  125465.     | item itemClass |
  125466.     itemClass := self commandItemClass.
  125467.     item := itemClass new.
  125468.     item commandDescription description: self untitledPrefix , 'command'.
  125469.     ^item!
  125470.  
  125471. newMenu
  125472.     "Private - Answer a new <Menu>."
  125473.  
  125474.     | item |
  125475.     "Note we always want a new <Menu> here, never a <MenuBar>."
  125476.     item := Menu new text: (self untitledPrefix, 'menu'); yourself.
  125477.     self ensureMinimumMenuContents: item.
  125478.     ^item!
  125479.  
  125480. onItemFrom: aMenuComposerView at: anInteger droppedBefore: beforeBoolean copy: copyBoolean
  125481.     "Private - Try and move the source item to the curent selection point."
  125482.  
  125483.     | destView destMenu destIndex sourceView sourceMenu sourceItem updateSourceView |
  125484.     destView := self selectionView.
  125485.     destMenu := destView menu.
  125486.     destIndex := destView selectionByIndex.
  125487.     sourceMenu := aMenuComposerView menu.
  125488.     sourceItem := sourceMenu items at: anInteger.
  125489.     (sourceMenu == destMenu and: [anInteger = destIndex]) ifTrue: [^self].
  125490.     menuViews do: 
  125491.             [:menuView | 
  125492.             menuView menu == sourceItem 
  125493.                 ifTrue: 
  125494.                     [Sound warningBeep.
  125495.                     ^self]].
  125496.     self closeSubmenuViewsOf: destView.
  125497.     sourceView := menuViews detect: [:menuView | menuView menu == sourceMenu]
  125498.                 ifNone: [].
  125499.     updateSourceView := sourceView notNil and: [copyBoolean not].
  125500.     copyBoolean 
  125501.         ifTrue: [sourceItem := sourceItem copy]
  125502.         ifFalse: [sourceMenu removeItemAt: anInteger].
  125503.     self ensureMinimumMenuContents: sourceMenu.
  125504.     sourceMenu == destMenu 
  125505.         ifTrue: [anInteger < destIndex ifTrue: [destIndex := destIndex - 1]]
  125506.         ifFalse: 
  125507.             [updateSourceView 
  125508.                 ifTrue: 
  125509.                     [anInteger < sourceView selectionByIndex 
  125510.                         ifTrue: [sourceView selectionByIndex: sourceView selectionByIndex - 1]]].
  125511.     beforeBoolean 
  125512.         ifTrue: 
  125513.             [destMenu insertItem: sourceItem at: destIndex.
  125514.             destView selectionByIndex: destIndex]
  125515.         ifFalse: 
  125516.             [destMenu insertItem: sourceItem at: destIndex + 1.
  125517.             destView selectionByIndex: destIndex + 1].
  125518.     updateSourceView ifTrue: [self generateMnemonicConflicts: sourceView].
  125519.     self generateMnemonicConflicts: destView.
  125520.     self generateAcceleratorConflicts.
  125521.     menuViews inject: nil
  125522.         into: 
  125523.             [:last :this | 
  125524.             last notNil 
  125525.                 ifTrue: 
  125526.                     [this position: (last originForSubmenu: last selectionByIndex).
  125527.                     this updateMenu.
  125528.                     this]
  125529.                 ifFalse: 
  125530.                     [(this == destView or: [updateSourceView and: [this == sourceView]]) 
  125531.                         ifTrue: 
  125532.                             [this updateMenu.
  125533.                             this]]].
  125534.     self openSelectedSubmenuOf: destView!
  125535.  
  125536. onItemIn: aView selectedAtIndex: index 
  125537.     "Private - A menu item has been selected in a menu (either by being clicked
  125538.     over or by having another menu item dragger over it - i.e. this is also used
  125539.     for drag highlighting). Close any deeper menus and hilight the item in its menu.
  125540.  
  125541.     Note that we minimize the invalidating of the menu view to include only the
  125542.     old and new selection rectangles."
  125543.  
  125544.     | currentView |
  125545.     currentView := self selectionView.
  125546.     (currentView ~~ aView or: [currentView selectionByIndex ~= index]) 
  125547.         ifTrue: 
  125548.             [| oldIndex |
  125549.             self closeSubmenuViewsOf: aView.
  125550.             oldIndex := aView selectionByIndex.
  125551.             aView selectionByIndex: index.
  125552.             oldIndex == 0 ifFalse: [aView invalidateRect: (aView itemRect: oldIndex) erase: false].
  125553.             aView invalidateRect: (aView itemRect: index) erase: false.
  125554.             self openSelectedSubmenuOf: aView]!
  125555.  
  125556. onMenuClicked: aMouseEvent
  125557.     | index menu |
  125558.     menu := aMouseEvent window.
  125559.     index := menu itemAt: aMouseEvent position.
  125560.     index == 0 ifTrue: [^0].
  125561.     self arena onItemIn: menu selectedAtIndex: index.
  125562.     menu setFocus.
  125563.     self arena 
  125564.         beginDrag: aMouseEvent
  125565.         of: index
  125566.         in: menu
  125567. !
  125568.  
  125569. onViewOpened
  125570.     "The receiver's view has been connected.
  125571.     Set the menu into the composer."
  125572.  
  125573.     | menuView |
  125574.     super onViewOpened.
  125575.     arena := self view viewNamed: 'arena'.
  125576.     menuViews := OrderedCollection new.
  125577.     (self arena)
  125578.         when: #itemIn:selectedAtIndex:
  125579.             send: #onItemIn:selectedAtIndex:
  125580.             to: self;
  125581.         when: #actionPerformed
  125582.             send: #properties
  125583.             to: self;
  125584.         when: #itemFrom:at:droppedBefore:copy:
  125585.             send: #onItemFrom:at:droppedBefore:copy:
  125586.             to: self.
  125587.     self generateAcceleratorConflicts.
  125588.     self ensureMinimumMenuContents: self menu.
  125589.     menuView := self openMenu: self menu at: self topMenuInset.
  125590.     self onItemIn: menuView selectedAtIndex: 1!
  125591.  
  125592. openMenu: aMenu at: position
  125593.     "Private - Create a new view onto aMenu an open it to the
  125594.     receivers view at position. Answer menuView."
  125595.  
  125596.     self dragCoordinator hideDragCursor.
  125597.     ^
  125598.     [| menuView |
  125599.     menuView := aMenu composerViewClass new.
  125600.     menuViews addLast: menuView.
  125601.     self arena addSubView: menuView.
  125602.     menuView 
  125603.         when: #leftButtonPressed:
  125604.         send: #onMenuClicked:
  125605.         to: self.
  125606.     menuView
  125607.         position: position;
  125608.         model: aMenu asValue.
  125609.     self generateMnemonicConflicts: menuView.
  125610.     self generateAcceleratorConflicts: menuView.
  125611.     menuView zOrderTop.
  125612.     menuView] 
  125613.             ensure: [self dragCoordinator showDragCursor]!
  125614.  
  125615. openSelectedSubmenuOf: aView
  125616.     "Private - Open the submenu of the selected item of aView."
  125617.  
  125618.     | selected |
  125619.     selected := aView selectionOrNil.
  125620.     selected items notEmpty 
  125621.         ifTrue: 
  125622.             [self openMenu: selected
  125623.                 at: (aView originForSubmenu: aView selectionByIndex)]!
  125624.  
  125625. pasteClipboard
  125626.     "Pastes clipboard contents into the primary selection. We can assume that the clipboard
  125627.     contains a single view to paste"
  125628.  
  125629.     | selectionView index |
  125630.     selectionView := self selectionView.
  125631.     index := selectionView selectionByIndex.
  125632.     self
  125633.         addItem: (Object fromBinaryStoreBytes: self class clipboard)
  125634.         view: selectionView
  125635.         index: index
  125636. !
  125637.  
  125638. properties
  125639.     "Open a dialog to allow editing of the selected menu item."
  125640.  
  125641.     | menuView |
  125642.     self selection edit.
  125643.     menuView := self selectionView.
  125644.     self update: menuView
  125645.         do: 
  125646.             [self generateMnemonicConflicts: menuView.
  125647.             self generateAcceleratorConflicts]!
  125648.  
  125649. queryCommand: query 
  125650.     "Private - Enters details about a potential command for the receiver into the 
  125651.     <CommandQuery>,  query."
  125652.  
  125653.     | command |
  125654.     command := query commandSymbol.
  125655.     command == #pasteClipboard 
  125656.         ifTrue: 
  125657.             [query isEnabled: self hasClipboard.
  125658.             ^true].
  125659.     command == #mutateIntoMenu 
  125660.         ifTrue: 
  125661.             [| item |
  125662.             item := self selection.
  125663.             query isEnabled: (item notNil and: [item isKindOf: self commandItemClass]).
  125664.             ^true].
  125665.     command == #mutateIntoCommand
  125666.         ifTrue: 
  125667.             [| item |
  125668.             item := self selection.
  125669.             query isEnabled: (item notNil and: [item isKindOf: self menuClass]).
  125670.             ^true].
  125671.  
  125672.     ^super queryCommand: query!
  125673.  
  125674. removeItemView: menuView index: index 
  125675.     "Private - Removes the current selections from the receiver"
  125676.  
  125677.     self update: menuView
  125678.         do: 
  125679.             [| aMenu |
  125680.             aMenu := menuView menu.
  125681.             aMenu removeItemAt: index.
  125682.             self ensureMinimumMenuContents: aMenu.
  125683.             self generateMnemonicConflicts: menuView.
  125684.             self generateAcceleratorConflicts.
  125685.             menuView selectionByIndex: (index min: aMenu items size)]!
  125686.  
  125687. selection
  125688.     "Answer the selected menu item."
  125689.  
  125690.     ^self selectionView selectionOrNil!
  125691.  
  125692. selectionView
  125693.     "Private - Anser the menu which the current selection can be in.
  125694.  
  125695.     Note that the only case where a menuView does not have a selection and
  125696.     so we return the first view, is during the process of building the top
  125697.     level menuView for the first time."
  125698.  
  125699.     ^menuViews reverse detect: [:menuView | menuView hasSelection] ifNone: [menuViews first]!
  125700.  
  125701. stripUntitled: aMenu
  125702.     "Private - This will strip all untitled commands or untitled menus
  125703.     which only contain no entries.
  125704.     Note how we recurse down through the items."
  125705.  
  125706.     aMenu items copy do: [:item | self stripUntitled: item].
  125707.  
  125708.     aMenu items copy do: [:item |
  125709.         (item items isEmpty and: [item text beginsWith: self untitledPrefix])
  125710.             ifTrue: [aMenu removeItem: item]]!
  125711.  
  125712. topMenuInset
  125713.     "Private - Anser the offset of the top menu from the origin of
  125714.     the receivers client view."
  125715.  
  125716.     ^10@10!
  125717.  
  125718. untitledPrefix
  125719.     "Private - Answer the prefix to be used for as yet untitled menus and items."
  125720.  
  125721.     ^'untitled '!
  125722.  
  125723. update: aMenuComposerView do: operation 
  125724.     self closeSubmenuViewsOf: aMenuComposerView.
  125725.     operation value.
  125726.     aMenuComposerView updateMenu.
  125727.     self openSelectedSubmenuOf: aMenuComposerView! !
  125728.  
  125729. NewVideoTapeDialog comment:
  125730. 'NewVideoTapeDialog provides a modal user interface gathering the necessary information that is required before a new VideoTape can be instantiated. The dialog is somewhat different than many other dialogs because it does not attempt to edit a specialised model (in this case a VideoTape). Since the VideoTape class has a Instance Creation Method, #name:length:, that require name and length parameters, the NewVideoTapeDialog is used only to collect this information prior to the creation of a tape instance. 
  125731.  
  125732. This class is part of the Video Library sample package. Please see the package comment for more details.
  125733.  
  125734. Example usage:
  125735. NewVideoTapeDialog showModal. "Display it"
  125736. '!
  125737. !NewVideoTapeDialog class methodsFor!
  125738.  
  125739. icon
  125740.     "Answers an Icon that can be used to represent this class"
  125741.  
  125742.     ^VideoTape icon! !
  125743.  
  125744. !NewVideoTapeDialog methodsFor!
  125745.  
  125746. apply
  125747.     "Apply the changes cached in the receiver back to the model. "
  125748.  
  125749.     self value: (VideoTape name: self name length: self length).
  125750.     super apply
  125751.  
  125752.     !
  125753.  
  125754. createComponents
  125755.     "Create the presenters contained by the receiver"
  125756.  
  125757.     super createComponents.
  125758.     namePresenter := self add: TextPresenter new name: 'name'.
  125759.     lengthPresenter := (self add: ChoicePresenter new name: 'length').
  125760.     
  125761.  
  125762.  
  125763.  
  125764. !
  125765.  
  125766. length
  125767.     "Answer the <Integer> contents of the length field"
  125768.  
  125769.     ^lengthPresenter value!
  125770.  
  125771. name
  125772.     "Answer the <readableString> contents of the name field"
  125773.  
  125774.     ^namePresenter value!
  125775.  
  125776. onViewOpened
  125777.     "Received when the receiver's view has been connected. "
  125778.  
  125779.     super onViewOpened.
  125780.     namePresenter value: '<New Tape>'.
  125781.     lengthPresenter
  125782.         choices: #(30 60 120 180 240);
  125783.         value: 240.
  125784. ! !
  125785.  
  125786. PackagePrompter comment:
  125787. 'self show'!
  125788. !PackagePrompter class methodsFor!
  125789.  
  125790. icon
  125791.     "Answers an Icon that can be used to represent this class."
  125792.  
  125793.     ^Smalltalk developmentSystem icon
  125794. !
  125795.  
  125796. showModalOn: aModel caption: aString default: aPackage
  125797.     "Creates an instance of the receiver with a default view and connected to aModel
  125798.     and the specified caption <String>. The view is displayed modal to the current 
  125799.     active window. Answers the result of dialog if confirmed or nil cancelled."
  125800.  
  125801.     ^(self createOn: aModel)
  125802.         defaultPackage: aPackage;
  125803.         caption: aString;
  125804.         showModal! !
  125805.  
  125806. !PackagePrompter methodsFor!
  125807.  
  125808. createComponents
  125809.     "Create the presenters contained by the receiver"
  125810.  
  125811.     super createComponents.
  125812.     packagesPresenter := self add: ((PackageSelector new)
  125813.                         autoSelect: false;
  125814.                         yourself)
  125815.                 name: 'packages'.
  125816.     notPackagedPresenter := self add: BooleanPresenter new name: 'unpackaged'!
  125817.  
  125818. createSchematicWiring
  125819.     "Create the trigger wiring for the receiver"
  125820.  
  125821.     super createSchematicWiring.
  125822.     packagesPresenter 
  125823.         when: #selectionChanged
  125824.         send: #onPackageSelected
  125825.         to: self.
  125826.     notPackagedPresenter 
  125827.         when: #valueChanged
  125828.         send: #toggleSetPackage
  125829.         to: self!
  125830.  
  125831. defaultPackage: aPackageOrNil
  125832.     defaultPackage := aPackageOrNil ifNil: [Package uncommitted].
  125833.     notPackagedPresenter view text: ('''%1''?' formatWith: defaultPackage name)!
  125834.  
  125835. onPackageSelected
  125836.     self value: packagesPresenter selectionOrNil!
  125837.  
  125838. onViewOpened
  125839.     "Received when the receiver's view has been connected."
  125840.  
  125841.     super onViewOpened.
  125842.     packagesPresenter selectionOrNil: self model value!
  125843.  
  125844. queryCommand: query
  125845.     "Private - Enters details about a potential command for the receiver into 
  125846.     the <CommandQuery>, query"
  125847.  
  125848.     | cmd |
  125849.     cmd := query commandSymbol.
  125850.     cmd == #ok 
  125851.         ifTrue: 
  125852.             [query isEnabled: self value notNil.
  125853.             ^true].
  125854.     ^super queryCommand: query!
  125855.  
  125856. toggleSetPackage
  125857.     notPackagedPresenter model value 
  125858.         ifFalse: 
  125859.             [self value: packagesPresenter selectionOrNil.
  125860.             packagesPresenter isEnabled: true]
  125861.         ifTrue: 
  125862.             [self value: defaultPackage.
  125863.             packagesPresenter isEnabled: false]! !
  125864.  
  125865. Prompter comment:
  125866. 'Prompter is a <valueDialogPresenter> that can be used to prompt a user to enter a <readableString> response to a question. The <valueModel> initially holds the default response and, if the dialog is confirmed, will hold the actual response from the user.
  125867.  
  125868. Instance Variables:
  125869.     promptPresenter    <TextPresenter> holding the prompt text.
  125870.     replyPresenter    <TextPresenter> holding the reply text.
  125871.  
  125872. '!
  125873. !Prompter class methodsFor!
  125874.  
  125875. createOn: aValueModel prompt: aStringPrompt caption: aStringCaptionOrNil 
  125876.     "Creates an instance of the receiver on aValueModel with and aStringPrompt. 
  125877.     The prompter is given a caption according to aStringCaptionOrNil; if nil
  125878.     a default caption is used. The prompter is displayed modally, prompting 
  125879.     for a String reply. The initial value of the reply field is the original
  125880.     value of aSubjectModel. The dialog is not shown."
  125881.  
  125882.     | prompter |
  125883.     (prompter := self createOn: aValueModel) prompt: aStringPrompt.
  125884.     aStringCaptionOrNil notNil ifTrue: [
  125885.         prompter caption: aStringCaptionOrNil ].
  125886.     ^prompter!
  125887.  
  125888. icon
  125889.     "Answers an Icon that can be used to represent this class"
  125890.  
  125891.     ^Icon fromId: '!!APPLICATION'
  125892.  
  125893. !
  125894.  
  125895. on: aValueModel prompt: aStringPrompt caption: aStringCaptionOrNil 
  125896.     "Creates an instance of the receiver on aValueModel with and aStringPrompt. 
  125897.     The prompter is given a caption according to aStringCaptionOrNil; if nil
  125898.     a default caption is used. The prompter is displayed modally, prompting 
  125899.     for a String reply. The initial value of the reply field is the original
  125900.     value of aSubjectModel.
  125901.  
  125902.     Answer the reply or nil if the dialog is cancelled"
  125903.  
  125904.     ^(self createOn: aValueModel prompt: aStringPrompt caption: aStringCaptionOrNil)
  125905.         showModal
  125906. !
  125907.  
  125908. prompt: aStringPrompt
  125909.     "Creates an instance of the receiver with aStringPrompt and a default caption.
  125910.     The prompter is displayed modally, prompting for a String reply. 
  125911.  
  125912.     Answer the reply or nil if the dialog is cancelled"
  125913.  
  125914.     ^self prompt: aStringPrompt caption: nil
  125915. !
  125916.  
  125917. prompt: aStringPrompt caption: aStringCaptionOrNil 
  125918.     "Creates an instance of the receiver with aStringPrompt.
  125919.     The prompter is given a caption according to aStringCaptionOrNil; if nil
  125920.     a default caption is used. The prompter is displayed modally, prompting 
  125921.     for a String reply. 
  125922.  
  125923.     Answer the reply or nil if the dialog is cancelled"
  125924.  
  125925.     ^self on: String new prompt: aStringPrompt caption: aStringCaptionOrNil ! !
  125926.  
  125927. !Prompter methodsFor!
  125928.  
  125929. createComponents
  125930.     "Create the presenters contained by the receiver"
  125931.  
  125932.     super createComponents.
  125933.     promptPresenter := self add: TextPresenter new name: 'prompt'.
  125934.     replyPresenter := self add: TextPresenter new name: 'reply'.
  125935.  
  125936. !
  125937.  
  125938. initialize
  125939.     "Private - Initialize the receiver"
  125940.  
  125941.     super initialize.
  125942.     validationBlock := [:replyString | true]!
  125943.  
  125944. model: aSubjectModel
  125945.     "Connect the receiver to aSubjectModel. The reply presenter shares this
  125946.     same model since it is responsible for editing it's value"
  125947.  
  125948.     super model: aSubjectModel.    
  125949.     replyPresenter model: self model.!
  125950.  
  125951. prompt: aString
  125952.     "Set the text to use as the description in the dialog box."
  125953.  
  125954.     promptPresenter value: aString
  125955. !
  125956.  
  125957. queryCommand: aCommandQuery 
  125958.     "Private - Enters details about a potential command for the receiver into 
  125959.     the <CommandQuery>."
  125960.  
  125961.     aCommandQuery commandSymbol == #ok 
  125962.         ifTrue: 
  125963.             [aCommandQuery 
  125964.                 isEnabled: (self validationBlock value: replyPresenter value) == true.
  125965.             ^true].
  125966.     ^super queryCommand: aCommandQuery!
  125967.  
  125968. validationBlock
  125969.     ^validationBlock!
  125970.  
  125971. validationBlock: aBlock 
  125972.     "Set the <monadicValuable> used to validate the user's reply. The
  125973.     valuable is passed the current reply text as its argument, and is expected
  125974.     to answer whether it is valid. The OK button is not enabled until the
  125975.     validationBlock answers true."
  125976.  
  125977.     validationBlock := aBlock! !
  125978.  
  125979. BrowseFolderDialog comment:
  125980. 'BrowserFolderDialog is a <valueDialogPresenter> implementing the Windows SHBrowseForFolder common dialog. The associated <valueModel> contains a <readableString> indicating the path of the chosen folder.
  125981.  
  125982. Instance Variables:
  125983.     style    <integer> Windows style flags for the common dialog.
  125984.     callback    <ExternalCallback>. Callback function to receive messages from common control.
  125985.     bfFlags    <integer>. Various flags.
  125986.  
  125987. Class Variables:
  125988.     Handlers        <Array>. Selectors of callback handlers.
  125989.     InitializedMask    <integer>. Bit mask for isInitialized flag.
  125990.  
  125991. Example Usage:
  125992.     BrowseFolderDialog new 
  125993.         caption: ''Please select a folder'';
  125994.         root: ''c:\windows'';            "Root of tree"
  125995.         value: ''c:\windows\system'';        "Initial selection"
  125996.         showModal'!
  125997. !BrowseFolderDialog class methodsFor!
  125998.  
  125999. σA!! 4░ó=-┐Ñß@∞}└┌ⁿ█√┼ƒ╘■÷áUB¬╖╘;~GR╫ê~FÿF/.Z@x±Å]&2@πh[oΓ╣%∙█K¡Ñ≈ë ╩^₧`3ji╔ⁿd<º▌╔XD£ û;∞.▄·h┬b[∩c▀╨\ïu┐6=▀ç╞¢ª!
  126000.  
  126001. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐ì≥├^₧zWga╓╡w7├ú⌐% {∙]»M▓qò∩Tx└vì▀@▄Lq╗Z|å▄«£Ñêrå    ô₧üob─ÿ>E╢:JYñ╔ß÷q╬uφs≤,╓    !!Θ╥lÿ-╔1╕╚èEx║┤²·║
  126002. ÿ⌡r]┤║Θgh /T<r¼,┼:Bj|Ω?∞?¡ä}-,VXÇ┴lÿ_╡°╨╢√dααì²¢,┤εôRóo^bµ<▐)Rr▌çH∞D═2╗º▓º≤m┐≈à÷WαHp∙}α?╠π∙╦`hF
  126003. L9½;ú÷?d£n─#╡q(Cw▄ 4═δ ≈PeR┴«┤:[S#jîZⁿ⌠ i9⌐╓rÖ╨~▒╒ÅR╩vxI╠√* *ƒ6¢╦┘└íα┐█íΓΓQòL⌐àI_>Ñûó╪!!φ8;X¬Φóƒ! !
  126004.  
  126005. !BrowseFolderDialog methodsFor!
  126006.  
  126007. πE46 ¼Ç%╡¡ì&ΦUêû▀▐≈┴▐┴╗▓Φl»╛╬;rU▌ë3]ÖB%b_VyO⌠ôNu#ºuRf¡¼n╕│(m┬▐ë¡ ╩╗}\or├ⁿi7¿╚╒U\╒%╗4gíTÑx╢εw@<Σv┼₧NòLG╕)╨å!
  126008.  
  126009. ΓE7<7¬╒r(ë╜₧#ï8î╛åÄ═╥╦╞■µ¡V╝║╨ozGXÆé1@╫KL/.IVh
  126010.  ùK&2@πh[oΓ≈2 ▀F¬╗▓¡π▌É*|g╧▒h<║ç¡3!!╗ç5║K╖i╨⌠X\I1≥$æ╤M▄Pq¡ 0╩╥╫■╔αpëïÆ£rOí≈P¬eJïε?╤╪σN7î═·.i╣─y╠La╘│┘├G|▓á √ΣO┼₧    ^¼⌠≥%Gt=â≈W4x\@┼╘ÄßPc/JH▀┴;â_BÆ∙╨┤≤f¬°∞º≤S▀è┌ ├wÅhεwKóÑ`╘a^╢Fƒ▓ç£╓F£!
  126011.  
  126012. σA!! 4░╝&0╢¼ß@∞}╤╞µ┌ ├┌ò≤▓ä]P¿╛╥h3\^╫─:Wæ^Q&z@·ä^_i4╖tV*░«# ╫T║∙⌡≤¥óvw⌐Vw&QR êXǵεuq│%╖?G¥¬=▓(┌nk&╒C░ⁿ|░mCê/≥╗φ╢╨αQí+á⌐╢H:£▀qwâN)^▒█∞∞√σyσ#└O▄≡Mδ+,▄ô⌡Ñ{GçÅ╠╦╙2ì╠T!
  126013.  
  126014. Σ\34;░╜7:»Ñÿp┼6σ°µ▀Ω║╡╝ⁿ┬╖ZU╛»┼;>s╩É,SöK+`_jµìr.JπnVy╖º4║╪PÑ≈úû≥Å àuSze╚ⁿ~&╝▄├M]ç╙{╟S╖nâ°[x⌡lÜ₧nòL'■@π╗â≈▀│|ï₧ÅûxO╣°CLΓtræ»0╤╥RΦOo╚V█ⁿ*-╣╬u╧Gj╔>Ñ┘Å]4▐─æ µ¡µ H▒σ≥    iJirÜΓpPyçUá{τ╦0q|SM╬ë!!èW╓∞╝╥òhαûê▐Ä~╝≡τ├    w7«i∙U4d±┤e╞-Mφ
  126015. ïä╔╬╤Aùÿà╪L²⌠ïZ╒µ∞╫GdJF`▒$û√+%ü5ïF∙
  126016. NOJóLi₧∩oú!!p┴▒√\P#[I▀┌▌╬W5êµP&Ü·DÉçå╪>=UQ╦⌠
  126017. .à"╒û▓╗¡«∙╕╩å╬ÆW┤¬LZd⌐ö╗▐/≈"]uæ╫┘▌└3w╫î-½¥⌡Q┤°∩!!ìA}2CΩ╣|òS£φ1╠ª¡Dåézφ!
  126018.  
  126019. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A)b£∞t0u3_ªnc¼ó4≤▀N    ▓▓∙≤¥ª▒x_} Çß-bαñ¬0[ÉòVf║Z║x╩A∩TCxσaÖ▀LÉVG╕0╓▄«£Ñúrä¥ÜÉwO⌠¼a║tiîε?²▐SδC.╧TÜ "b≥¥8∙f≈1╡£┘QYá⌐╕ñ∞Φ«px╕⌠│J,<b[¥∩paJB╧▀╨ßE=MH╓ä=ÿé¬æ¡╤rπ≤┴┌ô*╜╣ë° 3K
  126020. ¿tªOxO▀▄⌐2φÖö₧ï╤\»╧╒πQ«Rw▓j∩7╔Γ╕█I{KFM*■%ù╖)r₧&¢    ▓r!
  126021.  
  126022. ΦJ.<9¿å(,╛≤╠"▓1σöπⁿ ┼▐╪Σ▓½\Wè¿┼"?É┤,[ü^P/.C°à\tfI¼nHäì┼≈l)£₧û▓▐⌡9:╫y[}a▌╣-!!½╟╘\¥£rª╡|£■PLvî÷φ\êa╝@(█ùâ ┬⌐gü ôùè<½²RG╢e;äα?┌┌MºU îK╥│>u°╒l╦LiÇ)░╨ûA4╝¿╕ΩΦΦµe_╝Θñ"Ui6ï¡U]":á ìï╡Q- .&│æ.ƒRB╠¡æ½∙mΓ·ù╠û+░¡ñcªM'
  126023.  ⁿr≤ZVε±h╬i¼=ÄÇçåƒFö┬αδRα ≤+Φ5±⌡φ┌@R"l T─$ûσlô&₧\╞XEGeçulÖ╗XëcL5█ºßS?Y
  126024. ╤äÆ╤säú1@▐û Æåÿ₧vm.±╒0╜I┤╧±² ∞╫¢▀óΓ▄o¥Jíë0▓çèS╩9¥ct÷╗ñ╦╫R■≤E½ÿ└UÑ⌠íiôAd?0╔╛òBƒ╟;ìá«╨╞í>9 é«┤ü$╨π¢d╓«D⌡╜h-░±▄µö
  126025. Z┘??Ü≈╫X)╬Äô ⌡╪╠!
  126026.  
  126027. ΦW<,¡Ä> á¼êG∩VúΣ²┼Φ╓╦╨■┐σrM¼¼┼i3_^╫É6WàP"kWb·Än'\π~Vo¼δ)⌠╫V    ⌐╗╛ä≥╦R\·3j^╪║K>»╬╙IÖ╛fÑ÷T₧ΦXN1√a¢≤XÅI!
  126028.  
  126029. ΦQ);7│ühi▓₧é.┼3╤╒²═≤ìƒ┘Ä≤╖RN╥╤⌐9CZ_─à*W╫oUWg
  126030. Σ┴VtfmàZ~Uï₧╤≡m7å≈║¢Σ▄Æ4M`tÜ¿e í▄╟Qûƒw»@╜3²kò]*αi▀╫J▄V|⌐@µ£╚°├╖}┬æÅûn    »≥R
  126031. α`Φ!
  126032.  
  126033. ±E3*½éûáƒ>▀Φ╨├┼φ├▓┐╫░òAJ⌐║╘~3≤è-EÆM>f^7≤ÇXd*JÉhAc¼¼~║╬Cá≈┤æσ▌ç{Pgn▌ⁿy=ε▌╚\╝2┐?FÜ.▄æ√DB 6⌡*▌│3±(░@,╥å╦°═¡v╚≥±·l║∙YE»eJ!!▀»╫╙ZºQ.╪W°⌡+dδë¿+Pê ╣┘ÅHX║¼Ω ≥Φ≡eZ╕⌡╛BVnrrÅδ1"~Byφ;─₧√d8oE╔òo¢Iª±┼░ª!!⌠╗ò┼ö?╕µÇdÑl^7«i∙U4d≥░}╚cZß▐òüç╥fÄ┌╔⌡!
  126034.  
  126035. ±V"
  126036. 4*í╝&;»¬ÿG∩VúΣ²┼Φ╓╦╨■┐σzM╢»╔zAL╫─*ZÆT+|Z^n≤ô^Jr4ZáhFxºδ4⌡₧@Φº╢ìΣ╩^â{feÜïd<²¢¡3!!┤&║Vt╜P╣~ÖΦTKI/Φpù₧MöKg∞3▐ƒ╠°îñzëÉ£▀<úⁿR@½a~Ä÷s╬═VΦSo╪PÜ√(!!·╞t╬/⌐+╛£ùLuºε┘╬╔HΩÖ
  126037. 1╙ëícBhÜ÷$1":á~╪¼¡Xj/ ╔ä#ìéΘ▌╜º Ä╙Φ┴è8╗╣ë
  126038. ╬    ;    ╖<²D^≡░d┼y^■FçÄå£■Lƒ─└⌡Q!
  126039.  
  126040. ≤K(ox┤Ä&!!╫├σh╢:⌡╟»╪÷╥ƒ╟▒²▒E░⌐Ço{M└ü=W₧IA8.O\+■ä^t#Nº}Qfºÿ4Φ╫L÷√≈Ä÷█P╒4i
  126041. │á-"ºë▄4"ⁿÜV/≤àuò≡}F *αvå₧]ÖDu╣ (ôò╞ΓΦÑ`âÉï╡s¬⌠E
  126042. chçπ5₧╚VΘr;▐J┘│=h²╦J═MzÜ∙╠èd║¬⌠╪≥    Ñ─aH▒║≥qNE XτΩW6cJU!
  126043.  
  126044. ≥A+9=9¬ê7-αΘäï;í╪▀═∞╓╥Å■Γ¼WO╥╤⌐9CZ_─à*W╫oUWg
  126045. Σ┴VtfmàZ~UæÄ ┘÷c.ÅÆô▐·╩ûs[@}e╘¿-&ª█╧LO¥VÉyóA╖~¢Oæ;&(xór₧╥LÖa|¡;╓ûâ≤┌Ñ}£MêƃpO¼⌠P░i|ç²6┌ƒPßGo╪W▀Vß(bⁿ╬n╟P)╙╝╙çAx εδ±á¡┤dS╖ºªgh HPbrÜú"xHW╠ìä╕k)QX╥ä=╦_ô■┼°°h÷┐é┘û'√íñcóo^R╜h⌠Oh2ê╪y┴yS¼\├┴Çï╙N█╞─≥J╥?╖B┼╠⌠∞àZV`K
  126046. P¢^Ç≥!!c╤=îg╤UKbèizê uΩ N▌º╡
  126047. )Oxû ▀▐╠A\└≤]>┐┬≥ ÷yÄ!
  126048.  
  126049. ≥P>0U╬µp┤║¢/ù,í└τ╔╛─╦╠▓≈σUL¡√╘svD╫ç;[üZVd,69b£Φ Jr?Cª!
  126050.  
  126051. ≥P>0bΣÄ<┤╜ë-Ç-î╛åÄ═╥╦ò¬·áP½ó╠~3NY└─*ZÆV/m^Z}
  126052. Σ┴
  126053. V&'AèrGoÑ«2║╔J    ½┐≈ùΣÅäaSj ╬│-1í╟╘XA¢ùVzáF÷réA±^] Uï╜≈úzLö@?▄£╨Γ═«g¢C▌÷∙b─ÿDP╗l;╪▓s▀╤vΘU*╦Z╚!
  126054.  
  126055. ≈E+19░è(│Ñë.▀Θπß╚╛█∩╘¼≤¿    │ï┴irE;╕φ|bàVR+z^&O▐Ç]j#]πz\xΓë▄≤}6ë¢₧║╓√98╢]r%J ╫╣~!!»╬┼[ÉçVaªQ╣hù    ╝RN4πe£╒±(á0=┴ô╬╢┼│3ë    ¢ëûoε■Qªaz┬°;╫▄WºG.┼S▀│;`⌡╬|├Vg╧1±öè
  126056. q²εΦ ⌠ΦτtN░ε╡CL%g[q7£J│W$~":á─ç¿J~|GE█ì îBÿ ▀⌡µd÷╡┴┘ò~╣µ╚╩E8≥>æe5ï¡)┬l_▄èë╙Æ▓"≥╘─Γr⌡8·1╝s÷≤Ω╓A)IF0╨3ùσ(vén▀B∩SCn╚
  126057. Σ┼d!
  126058.  
  126059. ÷M))!!*▒î&
  126060. ╢¿ƒ9ΦUêû▀▐≈┴▐┴╗▓Φb▒¿╫~aB┌ü~Q¢^W9.O\+σä^_i4╖tV*░«# ╫T║≡ñ▐÷▄ö}_kdܽd<¬╞╫Jàüx½W│o╨ΦCZ
  126061. ,⌠vÜɱ(╞i±á∞┴ àZª+░! !
  126062.  
  126063. ColorDialog comment:
  126064. 'ColorDialog is a <valueDialogPresenter> implementing the Windows ChooseColor common dialog. The associated <valueModel> contains the <color> chosen.
  126065.  
  126066. Class Variables:
  126067.     CustomColors    <DWORDArray> of <COLORREFS> holding the current custom colours.
  126068.  
  126069. '!
  126070. !ColorDialog class methodsFor!
  126071.  
  126072. customColors
  126073.     "Answer sufficient static object to hold the 16 COLORREFS to store the custom
  126074.     colours across uses of the color dialog. Note that the 16th custom colour is 
  126075.     used to hold the default colour and will be installed on each invocation."
  126076.  
  126077.     CustomColors isNil 
  126078.         ifTrue: 
  126079.             [| white |
  126080.             CustomColors := DWORDArray new: 16.
  126081.             white := Color white asParameter.
  126082.             1 to: 15 do: [:index | CustomColors at: index put: white]].
  126083.     ^CustomColors!
  126084.  
  126085. defaultModel
  126086.     "Answer a default model to be assigned to the receiver when it
  126087.     is initialized."
  126088.  
  126089.     ^Color black asValue
  126090. !
  126091.  
  126092. resetCustomColors
  126093.     "Reset the stored custom colors."
  126094.  
  126095.     CustomColors := nil! !
  126096.  
  126097. !ColorDialog methodsFor!
  126098.  
  126099. basicShowModal
  126100.     "Private - Create and show a new Colour dialog. Hang it off the receiver's
  126101.     parentView. Answer a Colour based on the dialog selection,
  126102.     or nil if no selection was made.
  126103.         ColorDialog showModal.
  126104.     "
  126105.  
  126106.     ^ComDlgLibrary default chooseColor: self winStruct asParameter.!
  126107.  
  126108. extractResult: result
  126109.     "Private - Extract and apply the result from the parameter structure 
  126110.     passed to the Win32 API associated with this common dialog, immediately 
  126111.     after the call to that API."
  126112.  
  126113.     result ifTrue: [ | color |
  126114.         color :=self winStruct color.
  126115.         color = Color default 
  126116.             ifTrue: [ self value: nil ]
  126117.             ifFalse: [ self value: color ].            
  126118.         self apply ].
  126119.  
  126120. !
  126121.  
  126122. prepareStruct
  126123.     "Private - Initialize the parameter structure to be passed to the Win32
  126124.     API associated with this common dialog, immediately prior to the call
  126125.     to that API."
  126126.  
  126127.     | customColors color |
  126128.     "Install the default color as the last custom value"    
  126129.     customColors := self class customColors.
  126130.     customColors at: customColors size put: Color default asParameter.
  126131.     color := self value isNil
  126132.         ifTrue: [ Color default ]
  126133.         ifFalse: [ self value ].
  126134.  
  126135.     self winStruct
  126136.         hInstance: VMLibrary default applicationHandle;
  126137.         rgbResult: color asRGB asParameter;
  126138.         flags: 1;
  126139.         lpCustColors: customColors.!
  126140.  
  126141. winStructClass
  126142.     "Private - Answer the class to use for the receiver's associated windows parameter structure."
  126143.  
  126144.     ^CHOOSECOLOR! !
  126145.  
  126146. FileDialog comment:
  126147. 'FileDialog is an abstract superclass for <valueDialogPresenter>s implementing the Windows common file dialogs. 
  126148.  
  126149. '!
  126150. !FileDialog class methodsFor!
  126151.  
  126152. allFilesType
  126153.     "Private - Answer a two element array suitable for adding to the FileDialog
  126154.     with the fileTypes: message."
  126155.  
  126156.     ^#('All Files (*.*)' '*.*')!
  126157.  
  126158. defaultModel
  126159.     "Answer a default model to be assigned to the receiver when it
  126160.     is initialized."
  126161.  
  126162.     ^String new asValue
  126163. ! !
  126164.  
  126165. !FileDialog methodsFor!
  126166.  
  126167. allFilesType
  126168.     "Private - Answer a file spec. pair suitable for adding to the FileDialog
  126169.     with the fileTypes: message."
  126170.  
  126171.     ^self class allFilesType!
  126172.  
  126173. basicShowModal
  126174.     "Private - Show a Open File dialog for the receiver."
  126175.  
  126176.     ^ComDlgLibrary default perform: self commonDialogSelector with: winStruct!
  126177.  
  126178. caption: aString
  126179.     "Sets the caption for the receiver to aString"
  126180.     
  126181.     self winStruct title: aString!
  126182.  
  126183. commonDialogSelector
  126184.     "Private - Answer the selector to use to get the result."
  126185.  
  126186.     ^self subclassResponsibility!
  126187.  
  126188. defaultExtension
  126189.     "Answer the default file extension to be used if a filename is entered
  126190.     without one, or nil if there is no default."
  126191.  
  126192.     ^self winStruct defaultExtension
  126193. !
  126194.  
  126195. defaultExtension: aString
  126196.     "Set the receiver's default extension to aString."
  126197.  
  126198.     self winStruct defaultExtension: aString.
  126199. !
  126200.  
  126201. defaultStyle
  126202.     "Answers the default style for the receiver."
  126203.  
  126204.     ^OFN_HIDEREADONLY!
  126205.  
  126206. extractResult: result
  126207.     "Private - Extract and apply the result from the parameter structure 
  126208.     passed to the Win32 API associated with this common dialog, immediately 
  126209.     after the call to that API."
  126210.  
  126211.     result ifTrue: [ 
  126212.         self value: self winStruct lpstrFile.
  126213.         self apply ]
  126214. !
  126215.  
  126216. fileTypes
  126217.     "Answer the file types to be displayed in the drop-down on the dialog. 
  126218.     See #fileTypes: for a description of the format."
  126219.  
  126220.     ^fileTypes!
  126221.  
  126222. fileTypes: stringPairs
  126223.     "Sets the file selection specification to the <sequencedReadableCollection>
  126224.     of pairs of <readableString>s, where the pairs which responds to the 
  126225.     messages #first and #last answering its first and second elements respectively
  126226.     (e.g. an <Array> of 2 element <Array>s of <String>s).
  126227.     The first string from each pair specifies the text that will be displayed
  126228.     to the user, and the second string contains a list of the file types to be displayed in the file
  126229.     open/save dialog box in conjunction with the display string. If the list of file types contains
  126230.     more than one entry, then the specs are separated by semi-colons.
  126231.  
  126232.     eg. #( ('Text Files (*.txt)' '*.txt') 
  126233.         ('Program Files (*.dll,*.exe)' '*.dll;*.exe'
  126234.         ('All Files' '*.*'))"
  126235.  
  126236.     fileTypes := stringPairs!
  126237.  
  126238. fileTypesStringFromSpecs: stringPairs
  126239.     "Private - Answers a String of file types based on the contents of the
  126240.     <sequencedReadableCollection> of file specs pairs, stringPairs. The
  126241.     individual pairs must answer their first and last elements to the #first
  126242.     and #last messages respectively. If fileSpecs is nil, then answer nil.
  126243.  
  126244.     The shape of stringPairs is (for example):
  126245.         #(('Text files' '*.txt;*.rtf') ('All Files' '*.*'))
  126246.     The format of the result <String> is:
  126247.         'Text Files@*.txt;*.rtf@All Files@*.*@@'
  126248.     where @ is a NULL terminator."
  126249.  
  126250.     | stream null |
  126251.  
  126252.     stringPairs isNil ifTrue: [^nil].
  126253.  
  126254.     stream := WriteStream on: (String new: 40).
  126255.     null := Character null.
  126256.     stringPairs do: [:x | 
  126257.         stream
  126258.             nextPutAll: x first;
  126259.             nextPut: null;
  126260.             nextPutAll: x last;
  126261.             nextPut: null ].
  126262.     ^stream
  126263.         nextPut: null;
  126264.         contents!
  126265.  
  126266. filterIndex
  126267.     "Answer the one-based <integer> index of the filter selected by the user."
  126268.  
  126269.     ^self winStruct nFilterIndex
  126270.     !
  126271.  
  126272. filterIndex: anInteger
  126273.     "Set the <integer> index of the filter to be displayed initially."
  126274.  
  126275.     self winStruct nFilterIndex: anInteger
  126276.     !
  126277.  
  126278. initialDirectory: aString
  126279.     "Set the initial directory path name to be opened/saved."
  126280.  
  126281.     self winStruct initialDirectory: aString!
  126282.  
  126283. initialize
  126284.     "Private - Initialize the receiver"
  126285.  
  126286.     super initialize.
  126287.     self fileTypes: (Array with: self allFilesType).
  126288.     style := self defaultStyle
  126289. !
  126290.  
  126291. prepareStruct
  126292.     "Private - Initialize the parameter structure to be passed to the Win32
  126293.     API associated with this common dialog, immediately prior to the call
  126294.     to that API."
  126295.  
  126296.     | buf filename defext |
  126297.  
  126298.     buf := File pathBuffer.
  126299.     filename := self value.
  126300.     filename notNil ifTrue: [
  126301.         buf replaceFrom: 1 to: filename size with: filename ].
  126302.  
  126303.     (self filterIndex = 0 and: [(defext := self defaultExtension) notNil]) ifTrue: [
  126304.         self filterIndex: (self fileTypes findFirst: [:pair | (pair last indexOfSubCollection: defext)~~0])].
  126305.  
  126306.     self winStruct
  126307.         fileTypes: (self fileTypesStringFromSpecs: self fileTypes);
  126308.         nMaxFile: buf size;
  126309.         fileName: buf;
  126310.         flags: self style.!
  126311.  
  126312. style
  126313.     "Answers the style flags to be used when the receiver is opened."
  126314.  
  126315.     ^style!
  126316.  
  126317. style: anInteger
  126318.     "Set the style flags to be used when the receiver is opened."
  126319.  
  126320.     style := anInteger!
  126321.  
  126322. winStructClass
  126323.     "Private - Answer the class to use for the receiver's associated windows parameter structure."
  126324.  
  126325.     ^OPENFILENAME! !
  126326.  
  126327. FindDialog comment:
  126328. 'FindDialog is a <valueDialogPresenter> implementing the Windows FindText common dialog. The dialog must be associated with an owner view capable of responding to the <textFinder> protocol. It will then remain on-screen until dismissed and will forward <FindEvent>s to the owner via its #onFind: event handler.
  126329.  
  126330. Instance Variables:
  126331.     findWhat        <readableString> or nil, specifying the text to search for.
  126332.  
  126333. '!
  126334. !FindDialog class methodsFor!
  126335.  
  126336. ownerView: aView
  126337.     "Create and show a new instance of the receiver with
  126338.     with a aView as the owner."
  126339.  
  126340.     ^self new
  126341.         initialize;
  126342.         ownerView: aView;
  126343.         showModal;
  126344.         yourself!
  126345.  
  126346. ownerView: aView findWhat: findString
  126347.     "Create and show a new instance of the receiver with
  126348.     with a aView as the owner. Pre-populate the dialog with the
  126349.     argument findString."
  126350.  
  126351.     ^self new
  126352.         initialize;
  126353.         ownerView: aView;
  126354.         findWhat: findString;
  126355.         showModal;
  126356.         yourself! !
  126357.  
  126358. !FindDialog methodsFor!
  126359.  
  126360. basicShowModal
  126361.     "Private - Create and show a new FindText dialog."
  126362.  
  126363.     ^ComDlgLibrary default findText: self winStruct asParameter
  126364. !
  126365.  
  126366. extractResult: dialogHandle
  126367.     "Private - Extract and apply the result from the parameter structure 
  126368.     passed to the Win32 API associated with this common dialog, immediately 
  126369.     after the call to that API."
  126370.  
  126371.     self register: dialogHandle.
  126372.  
  126373. !
  126374.  
  126375. findWhat
  126376.     "Private - Answer the receivers findWhat String."
  126377.  
  126378.     ^findWhat!
  126379.  
  126380. findWhat: aString
  126381.     "Private - Set the receivers findWhat String to include aString."
  126382.  
  126383.     | size |
  126384.     size := self findWhat size min: aString size.
  126385.     self findWhat replaceFrom: 1 to: size with: aString startingAt: 1.!
  126386.  
  126387. initialize
  126388.     "Private - Initialize the state of the receiver."
  126389.  
  126390.     super initialize.
  126391.     findWhat := String new: 256.!
  126392.  
  126393. prepareStruct
  126394.     "Private - Initialize the parameter structure to be passed to the Win32
  126395.     API associated with this common dialog, immediately prior to the call
  126396.     to that API."
  126397.  
  126398.     self winStruct
  126399.         lpstrFindWhat: self findWhat;
  126400.         flags: FR_DOWN;
  126401.         wFindWhatLen: self findWhat size.!
  126402.  
  126403. register: dialogHandle
  126404.     "Private - Create and register a DialogView  to represent the receiver."
  126405.  
  126406.     | dialogShell |
  126407.     (dialogShell := DialogView fromHandle: dialogHandle)
  126408.         subclassWindow.
  126409.     self view: dialogShell.
  126410.     SessionManager inputState windowAt: dialogHandle put: dialogShell.
  126411.  
  126412. !
  126413.  
  126414. winStructClass
  126415.     "Private - Answer the class to use for the receiver's associated windows parameter structure."
  126416.  
  126417.     ^FINDREPLACE! !
  126418.  
  126419. FontDialog comment:
  126420. 'FontDialog is a <valueDialogPresenter> implementing the Windows ChooseFont common dialog. The associated <valueModel> contains the <Font> chosen.
  126421.  
  126422. Instance Variables:
  126423.     logFont        <LOGFONT> holding the logical font information for the font chosen.
  126424.  
  126425.  
  126426. '!
  126427. !FontDialog class methodsFor!
  126428.  
  126429. defaultModel
  126430.     "Answer a default model to be assigned to the receiver when it
  126431.     is initialized."
  126432.  
  126433.     ^Font system asValue
  126434. ! !
  126435.  
  126436. !FontDialog methodsFor!
  126437.  
  126438. basicShowModal
  126439.     "Private - Show the common Font dialog."
  126440.  
  126441.     ^ComDlgLibrary default chooseFont: self winStruct asParameter!
  126442.  
  126443. extractResult: result
  126444.     "Private - Extract and apply the result from the parameter structure 
  126445.     passed to the Win32 API associated with this common dialog, immediately 
  126446.     after the call to that API."
  126447.  
  126448.     result ifTrue: [ 
  126449.         self value: (Font fromLogFont: logFont).
  126450.         self apply ].
  126451.  
  126452. !
  126453.  
  126454. initialize
  126455.     "Private - Initialize the receiver"
  126456.  
  126457.     super initialize.
  126458.     self winStruct flags: (CF_SCREENFONTS bitOr: CF_INITTOLOGFONTSTRUCT).
  126459. !
  126460.  
  126461. prepareStruct
  126462.     "Private - Initialize the parameter structure to be passed to the Win32
  126463.     API associated with this common dialog, immediately prior to the call
  126464.     to that API."
  126465.  
  126466.     | font |
  126467.     font := self value isNil 
  126468.         ifTrue: [ Font default ]
  126469.         ifFalse: [ self value ].
  126470.  
  126471.     logFont := font logFont copy.
  126472.     self winStruct lpLogFont: logFont.!
  126473.  
  126474. winStructClass
  126475.     "Private - Answer the class to use for the receiver's associated windows parameter structure."
  126476.  
  126477.     ^CHOOSEFONT! !
  126478.  
  126479. PrintDialog comment:
  126480. 'PrintDialog is a <valueDialogPresenter> implementing the Windows PrintDlg common dialog. The associated <valueModel> contains an <integer> representing the device context handle (HDC) for the chosen printer.'!
  126481. !PrintDialog methodsFor!
  126482.  
  126483. basicShowModal
  126484.     "Private - Create and show a new Print dialog. Hang it off the receiver's parent view.
  126485.     Answer an new hDC on the selected printer. The hDC should be freed using
  126486.     DeleteDC()."
  126487.  
  126488.     ^ComDlgLibrary default printDlg: self winStruct asParameter!
  126489.  
  126490. copies
  126491.     "Answer the number of copies to be printed"
  126492.  
  126493.     ^self winStruct nCopies.!
  126494.  
  126495. copies: anInteger
  126496.     "Set the number of copies to be printed"
  126497.  
  126498.     ^self winStruct nCopies: anInteger.!
  126499.  
  126500. extractResult: result
  126501.     "Private - Extract and apply the result from the parameter structure 
  126502.     passed to the Win32 API associated with this common dialog, immediately 
  126503.     after the call to that API."
  126504.  
  126505.     result ifTrue: [ 
  126506.         self value: self winStruct hDC.
  126507.         self apply ].!
  126508.  
  126509. initialize
  126510.     "Private - Initialize the receiver"
  126511.  
  126512.     super initialize.
  126513.     self winStruct flags: ##(PD_RETURNDC | PD_USEDEVMODECOPIES | PD_COLLATE).
  126514.  
  126515. !
  126516.  
  126517. pageRange: anInterval
  126518.     "Sets aInterval to dicate the page range available"
  126519.  
  126520.     self winStruct 
  126521.         nMinPage: anInterval first;
  126522.         nMaxPage: anInterval last.
  126523. !
  126524.  
  126525. prepareStruct
  126526.     "Private - Initialize the parameter structure to be passed to the Win32
  126527.     API associated with this common dialog, immediately prior to the call
  126528.     to that API."
  126529.  
  126530.     "Nothing to do"!
  126531.  
  126532. printRange
  126533.     "Answers an Interval that dicates the page range to be printed"
  126534.  
  126535.     ^self winStruct nFromPage to: self winStruct nToPage.!
  126536.  
  126537. printRange: anInterval
  126538.     "Sets aInterval to dicate the page range to be printed"
  126539.  
  126540.     self winStruct 
  126541.         nFromPage: anInterval first;
  126542.         nToPage: anInterval last.
  126543. !
  126544.  
  126545. winStructClass
  126546.     "Private - Answer the class to use for the receiver's associated windows parameter structure."
  126547.  
  126548.     ^PRINTDLG! !
  126549.  
  126550. FileOpenDialog comment:
  126551. 'FileOpenDialog is a <valueDialogPresenter> implementing the Windows GetOpenFileName common dialog. The associated <valueModel> contains a <readableString> indicating the path of the chosen file.
  126552. '!
  126553. !FileOpenDialog methodsFor!
  126554.  
  126555. commonDialogSelector
  126556.     "Private - Answer the selector to use to get the result."
  126557.  
  126558.     ^#getOpenFileName:
  126559. !
  126560.  
  126561. defaultStyle
  126562.     "Answers the style for the receiver."
  126563.  
  126564.     ^super defaultStyle bitOr: OFN_FILEMUSTEXIST! !
  126565.  
  126566. FileSaveDialog comment:
  126567. 'FileSaveDialog is a <valueDialogPresenter> implementing the Windows GetSaveFileName common dialog. The associated <valueModel> contains a <readableString> indicating the path of the chosen file.'!
  126568. !FileSaveDialog methodsFor!
  126569.  
  126570. commonDialogSelector
  126571.     "Private - Answer the selector to use to get the result."
  126572.  
  126573.     ^#getSaveFileName:
  126574. ! !
  126575.  
  126576. FindReplaceDialog comment:
  126577. 'FindReplaceDialog is a <valueDialogPresenter> implementing the Windows ReplaceText common dialog. The dialog must be associated with an owner view capable of responding to the <textFinder> protocol. It will then remain on-screen until dismissed and will forward <FindEvent>s to the owner via its #onFind: event handler. 
  126578.  
  126579. Instance Variables:
  126580.     replaceWith    <readableString> specifying the replacement text.
  126581.  
  126582. '!
  126583. !FindReplaceDialog class methodsFor!
  126584.  
  126585. ownerView: aView findWhat: find replaceWith: replace
  126586.     "Create and show a new instance of the receiver with with a aView as the owner."
  126587.  
  126588.     ^self new
  126589.         ownerView: aView;
  126590.         findWhat: find;
  126591.         replaceWith: replace;
  126592.         showModal;
  126593.         yourself! !
  126594.  
  126595. !FindReplaceDialog methodsFor!
  126596.  
  126597. basicShowModal
  126598.     "Private - Create and show a new FindReplace dialog."
  126599.  
  126600.     ^ComDlgLibrary default replaceText: self winStruct asParameter
  126601. !
  126602.  
  126603. initialize
  126604.     "Private - Initialize the state of the receiver."
  126605.  
  126606.     super initialize.
  126607.     replaceWith := String new: 256.!
  126608.  
  126609. prepareStruct
  126610.     "Private - Initialize the parameter structure to be passed to the Win32
  126611.     API associated with this common dialog, immediately prior to the call
  126612.     to that API."
  126613.  
  126614.     self winStruct
  126615.         flags: FR_DOWN;
  126616.         lpstrFindWhat: self findWhat;
  126617.         wFindWhatLen: self findWhat size;
  126618.         lpstrReplaceWith: self replaceWith;
  126619.         wReplaceWithLen: self replaceWith size.!
  126620.  
  126621. replaceWith
  126622.     "Private - Answer the receievrs replceWith String."
  126623.  
  126624.     ^replaceWith!
  126625.  
  126626. replaceWith: aString
  126627.     "Private - Set the receivers replaceWith String to include aString."
  126628.  
  126629.     | size |
  126630.     size := self replaceWith size min: aString size.
  126631.     self replaceWith replaceFrom: 1 to: size with: aString.! !
  126632.  
  126633. MenuBarComposer comment:
  126634. 'MenuComposer is a <valueDialogPresenter> that can be used to edit a <MenuBar> held in its <valueModel>.'!
  126635. !MenuBarComposer class methodsFor!
  126636.  
  126637. menuClass
  126638.     "Private - Answer the base menu class that instances of the receiver will edit|"
  126639.  
  126640.     ^MenuBar! !
  126641.  
  126642. PersonalMoneyShell comment:
  126643. 'PersonalMoneyShell is a <documentPresenter> providing the main user interface for the Personal Money sample system. The interface is displayed in a top level shell window. The model data on which the PersonalMoneyShell operates is an instance of <PersonalMoney>. Since the class conforms to <documentPresenter> it automatically has the ability to save and load the PersonalMoney data to/from disk.
  126644.  
  126645. To create a new Personal Money system evaluate:
  126646.  
  126647. PersonalMoneyShell show.
  126648.  
  126649. Instance Variables:
  126650.     ownerPresenter    <TextPresenter> holding the owners name.
  126651.     accountsPresenter    <ListPresenter> holding a list of <PersonalAccount>s.
  126652.  
  126653. '!
  126654. !PersonalMoneyShell class methodsFor!
  126655.  
  126656. defaultFileExtension
  126657.     "Answer a default extension that will be used for files saved from
  126658.     the receiver"
  126659.  
  126660.     ^'pm'!
  126661.  
  126662. defaultModel
  126663.     "Answer a default model to be assigned to the receiver when it
  126664.     is initialized."
  126665.  
  126666.     ^PersonalMoney new
  126667. !
  126668.  
  126669. fileTypes
  126670.     "Answer an Array of file types that can be associated with this
  126671.     class of document."
  126672.  
  126673.     ^#(    ('Personal Money files (*.pm)' '*.pm') 
  126674.         ('All Files (*.*)' '*.*') )! !
  126675.  
  126676. !PersonalMoneyShell methodsFor!
  126677.  
  126678. createComponents
  126679.     "Create the presenters contained by the receiver"
  126680.  
  126681.     super createComponents.
  126682.     ownerPresenter := self add: TextPresenter new name: 'owner'.
  126683.     accountsPresenter := self add: ListPresenter new name: 'accounts'.
  126684. !
  126685.  
  126686. createSchematicWiring
  126687.     "Create the trigger wiring for the receiver"
  126688.     
  126689.     super createSchematicWiring.
  126690.     accountsPresenter when: #actionPerformed send: #editAccount to: self.
  126691.     !
  126692.  
  126693. editAccount
  126694.     "Edit the selected account"
  126695.  
  126696.     | account index shell |
  126697.     self hasSelectedAccount ifTrue: [    
  126698.         account := self selectedAccountOrNil.
  126699.         shell := PersonalAccountShell showOn: account.
  126700.         shell when: #viewClosed send: #updateAccount: to: self with: account ].
  126701.     !
  126702.  
  126703. hasSelectedAccount
  126704.     "Answer true it there is a currently selected account in the receiver"
  126705.  
  126706.     ^accountsPresenter hasSelection!
  126707.  
  126708. model: aPersonalMoney
  126709.     "Set the model associated with the receiver."
  126710.  
  126711.     super model: aPersonalMoney.
  126712.     ownerPresenter model: (aPersonalMoney aspectValue: #owner).
  126713.     accountsPresenter model: (aPersonalMoney accounts).
  126714.  
  126715. !
  126716.  
  126717. newAccount
  126718.     "Prompt for a new account and add it to the receiver's model"
  126719.  
  126720.     | newAccount |
  126721.     newAccount := self model addAccount: PersonalAccount new.
  126722.     self selectedAccountOrNil: newAccount.
  126723.     self editAccount
  126724.     !
  126725.  
  126726. queryCommand: aCommandQuery
  126727.     "Enters details about a potential command for the receiver into aCommandQuery"
  126728.  
  126729.     super queryCommand: aCommandQuery.
  126730.     (#(editAccount removeAccount) includes: aCommandQuery command) ifTrue: [
  126731.         aCommandQuery isEnabled: self hasSelectedAccount ]!
  126732.  
  126733. removeAccount
  126734.     "Removes the current account from the receiver's model"
  126735.  
  126736.     self hasSelectedAccount ifTrue: [
  126737.         self model removeAccount: self selectedAccountOrNil ]
  126738.     !
  126739.  
  126740. selectedAccountOrNil
  126741.     "Answer the currently selected account or nil if there is none"
  126742.  
  126743.     ^accountsPresenter selectionOrNil!
  126744.  
  126745. selectedAccountOrNil: aPersonalAccountOrNil
  126746.     "Sets the currently selected account to aPersonalAccountOrNil.
  126747.     If nil if there will be no selection"
  126748.  
  126749.     ^accountsPresenter selectionOrNil: aPersonalAccountOrNil!
  126750.  
  126751. updateAccount: aPersonalAccount
  126752.     "Update aPersonalAccount in the accounts list"
  126753.  
  126754.     self model accounts updateItem: aPersonalAccount! !
  126755.  
  126756. SmalltalkWorkspaceDocument comment:
  126757. 'SmalltalkWorkspaceDocument is a <documentPresenter> that can be used for displaying Smalltalk ST and CLS files. It also allows for the evaluation of Smalltalk expressions and the execution of various other commands targeted at the <SmalltalkSystem> singleton instance.
  126758.  
  126759. Instance Variables:
  126760.     workspacePresenter    <SmalltalkWorkspace> holding the workspace text.
  126761.  
  126762. Class Variables:
  126763.     ReuseIfOpen    <boolean> indicating whether an open workspace should be re-used in preference to opening a new one.
  126764.  
  126765. '!
  126766. !SmalltalkWorkspaceDocument class methodsFor!
  126767.  
  126768. defaultAdditionalAccelerators
  126769.     "Private - Answer a collection of additional accelerator definitions for commands not on the menu bar of the receiver's view(s).
  126770.     Each element of the collection should be a two element <Array>, the first element of which is the command symbol
  126771.     and the second the accelerator key string."
  126772.  
  126773.     ^#(#(#inspectIt 'Shift+Ctrl+I'))!
  126774.  
  126775. defaultBackcolor
  126776.     "Answer the default background to use for instances of the receiver"
  126777.  
  126778.     ^SmalltalkWorkspace defaultBackcolor!
  126779.  
  126780. defaultBackcolor: aColorOrNil
  126781.     "Set the default background to use for instances of the receiver"
  126782.  
  126783.     SmalltalkWorkspace defaultBackcolor: aColorOrNil.!
  126784.  
  126785. defaultExtent
  126786.     "Answer a <Point> which is the user's chosen default extent for new instances
  126787.     of the receiver, or nil if left up to Windows."
  126788.  
  126789.     ^DefaultExtent!
  126790.  
  126791. defaultExtent: aPoint
  126792.     "Set the default extent to be used for instances of the receiver to the <Point> argument.
  126793.     If the argument is nil, then let Windows decide."
  126794.  
  126795.     DefaultExtent := aPoint!
  126796.  
  126797. defaultFileExtension
  126798.     "Answer a default extension that will be used for files saved from
  126799.     the receiver"
  126800.  
  126801.     ^'st'!
  126802.  
  126803. defaultFont
  126804.     "Answer the default font to use for instances of the receiver"
  126805.  
  126806.     ^SmalltalkWorkspace defaultFont!
  126807.  
  126808. defaultFont: aFontOrNil
  126809.     "Set the default font to use for instances of the receiver"
  126810.  
  126811.     SmalltalkWorkspace defaultFont: aFontOrNil.!
  126812.  
  126813. defaultModel
  126814.     "Answer a default model to be assigned to the receiver when it
  126815.     is initialized."
  126816.  
  126817.     ^Smalltalk developmentSystem!
  126818.  
  126819. defaultView
  126820.     "Answer the resource name of the default view for the receiver.
  126821.     This is configurable for tool shells so that the developer can easily replace the
  126822.     standard Dolphin views if he or she wishes."
  126823.  
  126824.     DefaultView isNil ifTrue: [DefaultView := super defaultView].
  126825.     ^DefaultView!
  126826.  
  126827. defaultView: aString
  126828.     "Set the default view name."
  126829.  
  126830.     DefaultView := aString!
  126831.  
  126832. displayOn: aStream
  126833.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  126834.     would want to see it."
  126835.  
  126836.     aStream nextPutAll: 'Workspace'!
  126837.  
  126838. fileTypes
  126839.     "Answer an Array of file types that can be associated with this
  126840.     class of document."
  126841.  
  126842.     | domain |
  126843.     domain := self defaultModel.
  126844.     ^OrderedCollection new
  126845.         add: domain smalltalkFilesType;
  126846.         add: domain classFilesType;
  126847.         add: domain packageFilesType;
  126848.         add: #('Rich Text Files (*.rtf)' '*.rtf');
  126849.         add: #('Text Files (*.txt)' '*.txt');
  126850.         add: FileDialog allFilesType;
  126851.         asArray!
  126852.  
  126853. icon
  126854.     "Answers an Icon that can be used to represent this class"
  126855.  
  126856.     ^SmalltalkWorkspace icon!
  126857.  
  126858. initialize
  126859.     "Private - Initialize the receiver. Register with SmalltalkSystem.
  126860.         self initialize
  126861.     "
  126862.  
  126863.     Smalltalk developmentSystem
  126864.         addSystemFolderIcon: self toolsFolderIcon;
  126865.         registerTool: self.
  126866.     self wordWrap: true!
  126867.  
  126868. publishedAspects
  126869.     "Answer a <LookupTable> of the <Aspect>s published by the receiver."
  126870.  
  126871.     ^(super publishedAspects)
  126872.         add: (Aspect boolean: #reuseIfOpen);
  126873.         add: (Aspect boolean: #wordWrap);
  126874.         add: (Aspect color: #defaultBackcolor);
  126875.         add: (Aspect font: #defaultFont);
  126876.         add: (Aspect choice: #defaultView
  126877.                     from: (Smalltalk developmentSystem viewResourcesForClass: self) keys 
  126878.                             asSortedCollection);
  126879.         add: (Aspect name: #defaultExtent);
  126880.         yourself!
  126881.  
  126882. registerAsToolWith: aSmalltalkSystem
  126883.     "The receiver is being registered as a tool with aSmalltalkSystem. Perform any
  126884.     additional registration operations here"
  126885.  
  126886.     !
  126887.  
  126888. reuseIfOpen
  126889.     "Answers true if an already open instance of the receiver should be reused instead of
  126890.     creating additional instances. In fact, it does not always make sense for a system tool
  126891.     to allow re-use. Therefore, although all tools support this functionality, only some
  126892.     expose it as a published aspect so that it may be set as a system option."
  126893.  
  126894.     ReuseIfOpen isNil ifTrue: [ ReuseIfOpen := false ].
  126895.     ^ReuseIfOpen!
  126896.  
  126897. reuseIfOpen: aBoolean
  126898.     "Set the receiver to reuse an already open instance of the receiver instead of
  126899.     creating an additional one according to aBoolean."
  126900.  
  126901.     ReuseIfOpen := aBoolean
  126902. !
  126903.  
  126904. show
  126905.     "Shows an instance of the receiver. If reuseIfOpen has been set to true
  126906.     then an existing instance of the receiver will be answered and shown rather than
  126907.     creating a new instance."
  126908.  
  126909.     self reuseIfOpen 
  126910.         ifTrue: 
  126911.             [| existingInstances |
  126912.             existingInstances := self allInstances.
  126913.             existingInstances notEmpty 
  126914.                 ifTrue: 
  126915.                     [| reuse |
  126916.                     reuse := existingInstances first.
  126917.                     reuse view zOrderTop show.
  126918.                     ^reuse]].
  126919.     ^super show!
  126920.  
  126921. toolsFolderIcon
  126922.     "Answer an instance of SmalltalkSystemIcon suitable for representing the
  126923.     receiver in the system folder."
  126924.  
  126925.     ^SmalltalkSystemIcon show: self description: self displayString!
  126926.  
  126927. uninitialize
  126928.     "Private - Un-register the system tools folder icon for the receiver to allow clean
  126929.     removal of this class from the system.
  126930.         self uninitialize
  126931.     "
  126932.  
  126933.     Smalltalk developmentSystem
  126934.         removeSystemFolderIconNamed: self displayString;
  126935.         unregisterTool: self!
  126936.  
  126937. unregisterAsToolWith: aSmalltalkSystem
  126938.     "The receiver is being unregistered as a tool with aSmalltalkSystem. Perform any
  126939.     additional unregistration operations here"
  126940.  
  126941.     !
  126942.  
  126943. wordWrap
  126944.     "Answer true if instances of the receiver use word wrapping by default."
  126945.  
  126946.     ^SmalltalkWorkspace wordWrap!
  126947.  
  126948. wordWrap: aBoolean
  126949.     "Sets the word wrapping state for instances of the receiver to aBoolean."
  126950.  
  126951.     SmalltalkWorkspace wordWrap: aBoolean! !
  126952.  
  126953. !SmalltalkWorkspaceDocument methodsFor!
  126954.  
  126955. aboutDolphin
  126956.     "Show the About box."
  126957.  
  126958.     self model aboutDolphin!
  126959.  
  126960. basicCaption
  126961.     "Answer a basic caption that can be used to label the receiver's view.
  126962.     Normally this is augmented (in #updateCaption) by appending the document file
  126963.     name"
  126964.  
  126965.     ^'Dolphin Workspace'!
  126966.  
  126967. browsePackages
  126968.     "Open a new package browser."
  126969.     
  126970.     self model browsePackages!
  126971.  
  126972. chooseDefaultFont
  126973.     "Launch a dialog to prompt for a change in the default font used by the system tools."
  126974.     
  126975.     self model chooseDefaultFont!
  126976.  
  126977. createComponents
  126978.     "Create the presenters contained by the receiver"
  126979.  
  126980.     super createComponents.
  126981.     workspacePresenter := self add: SmalltalkWorkspace new name: 'workspace'!
  126982.  
  126983. educationCenter
  126984.     "Open the local Education Centre page"
  126985.  
  126986.     self model educationCenter!
  126987.  
  126988. fileFileIn
  126989.     "The user has selected the standard File/File In command. File in the 
  126990.     current contents of the receiver."
  126991.  
  126992.     self model fileFileIn!
  126993.  
  126994. fileNew
  126995.     "The user has selected the standard File/New command. Use this
  126996.     to create a new workspace"
  126997.  
  126998.     ^self model newWorkspace!
  126999.  
  127000. fileOpen
  127001.     "Create a new workspace window on a file"
  127002.  
  127003.     self model openWorkspace!
  127004.  
  127005. forgetSize
  127006.     "Forget the default size for new instances of this tool."
  127007.  
  127008.     self class defaultExtent: nil!
  127009.  
  127010. getDocumentData
  127011.     "Private - Answer the data for the receiver's document"
  127012.  
  127013.     ^self isRichText
  127014.         ifTrue: [self workspace richText rtf]
  127015.         ifFalse: [self workspace plainText]
  127016. !
  127017.  
  127018. guidedTour
  127019.     "Open the guided tour page"
  127020.  
  127021.     self model guidedTour!
  127022.  
  127023. help
  127024.     "Brings up a help page for the receiver"
  127025.  
  127026.     self model openEducationTopicForTool: self!
  127027.  
  127028. inspectSystemOptions
  127029.     "Open an <AccessorInspector> on the system options."
  127030.  
  127031.     | inspector |
  127032.     inspector := PublishedAspectInspector shellOn: self class.
  127033.     inspector topShell caption: self class name , ' Options'!
  127034.  
  127035. isModified
  127036.     "Answer whether the document in the receiver has been modified."
  127037.  
  127038.     ^workspacePresenter isModified!
  127039.  
  127040. isModified: aBoolean
  127041.     "Set/reset the receiver's dirty flag."
  127042.  
  127043.     workspacePresenter isModified: aBoolean!
  127044.  
  127045. isRichText
  127046.     "Answer true if the receiver is a rich text document. Overriden by subclasses
  127047.     to determine how the document data should be written and read.
  127048.     N.B. If the answer is true, then #isText must also answer true."
  127049.  
  127050.     | fn |
  127051.     fn := self filename.
  127052.     ^fn notNil and: [(File splitExtensionFrom: fn) = 'rtf']!
  127053.  
  127054. isText
  127055.     "Answer true if the receiver is a text document"
  127056.  
  127057.     ^true!
  127058.  
  127059. onViewOpened
  127060.     "Received when the receiver's view has been connected. 
  127061.     Transfer any file contents across to the view"
  127062.  
  127063.     | errorItem |
  127064.     super onViewOpened.
  127065.     errorItem := self view viewNamed: 'errors' ifNone: [].
  127066.     errorItem notNil 
  127067.         ifTrue: 
  127068.             [| errorModel |
  127069.             errorModel := ValueHolder new.
  127070.             errorItem model: errorModel.
  127071.             self workspace errorModel: errorModel].
  127072.     self fileLoad!
  127073.  
  127074. openViewComposer
  127075.     "Open a new view composer"
  127076.     
  127077.     self model openViewComposer!
  127078.  
  127079. rememberThisSize
  127080.     "Record the size of the receiver as the default extent for its tool class."
  127081.  
  127082.     self class defaultExtent: self view extent!
  127083.  
  127084. setDocumentData: text
  127085.     "Private - Set the data for the receiver's document to text (a String or RichText)."
  127086.  
  127087.     self workspace text: text!
  127088.  
  127089. show
  127090.     "Shows the view of the receiver.
  127091.     Pick up the default extent if any."
  127092.  
  127093.     | ext |
  127094.     ext := self class defaultExtent.
  127095.     ext isNil ifFalse: [self view extent: ext].
  127096.     ^super show!
  127097.  
  127098. smalltalkExit
  127099.     "Request system shutdown - may be cancelled by user."
  127100.  
  127101.     self model smalltalkExit!
  127102.  
  127103. systemModel
  127104.     ^SmalltalkSystem current!
  127105.  
  127106. workspace
  127107.     "Answers the SmalltalkWorkspace held by the receiver."
  127108.  
  127109.     ^workspacePresenter! !
  127110.  
  127111. TextDocument comment:
  127112. 'TextDocument is a <documentPresenter> capable of displaying and editing a <readableString> document.
  127113.  
  127114. Instance Variables:
  127115.     documentPresenter    <TextPresenter> holding the document text.
  127116.  
  127117. '!
  127118. !TextDocument class methodsFor!
  127119.  
  127120. defaultFileExtension
  127121.     "Answer a default extension that will be used for files saved from
  127122.     the receiver"
  127123.  
  127124.     ^'txt'!
  127125.  
  127126. defaultModel
  127127.     "Answer a default model to be assigned to the receiver when it
  127128.     is initialized."
  127129.  
  127130.     ^String new asValue!
  127131.  
  127132. fileTypes
  127133.     "Answer an Array of file types that can be associated with this
  127134.     class of document."
  127135.  
  127136.     ^Array
  127137.         with: #('Text Files (*.txt)' '*.txt')
  127138.         with: FileDialog allFilesType! !
  127139.  
  127140. !TextDocument methodsFor!
  127141.  
  127142. createComponents
  127143.     "Create the presenters contained by the receiver"
  127144.  
  127145.     super createComponents.
  127146.     documentPresenter := self add: TextPresenter new name: 'document'!
  127147.  
  127148. fileNew
  127149.     "The user has selected the standard File/New command."
  127150.  
  127151.     self promptToSaveChanges ifTrue: [
  127152.         self filename: nil.
  127153.         self setDocumentData: String new]!
  127154.  
  127155. getDocumentData
  127156.     "Private - Answer the data for the receiver's document."
  127157.  
  127158.     ^self model value!
  127159.  
  127160. isModified
  127161.     "Answer whether the document in the receiver has been modified."
  127162.  
  127163.     ^documentPresenter isModified!
  127164.  
  127165. isModified: aBoolean
  127166.     "Set/reset the receiver's dirty flag."
  127167.  
  127168.     documentPresenter isModified: aBoolean!
  127169.  
  127170. isText
  127171.     "Answer true if the receiver is a text document"
  127172.  
  127173.     ^true!
  127174.  
  127175. model: aStringValueModel
  127176.     "Set the model associated with the receiver."
  127177.  
  127178.     super model: aStringValueModel asValue.
  127179.     documentPresenter model: self model
  127180.     ! !
  127181.  
  127182. Notepad comment:
  127183. 'Notepad is a <topShell> sample application which implements most of the functionality of the familiar Windows utility. The major area of missing functionality is printing. Most of the implementation of the application is actually inherited from Dolphin''s TextDocument framework class.
  127184.  
  127185. Note that some resources are extracted from the Windows executable, but none of the functionality of that executable is reused (or indeed could be, as Notepad.exe doesn''t export any functions).
  127186.  
  127187. Example:
  127188.     Notepad show
  127189.  
  127190. Class Variables:
  127191.     ResourceLib    <ExternalResourceLibrary> for accessing resources within the standard NOTEPAD.EXE.
  127192.  
  127193.  
  127194.  
  127195.  
  127196.  
  127197. '!
  127198. !Notepad class methodsFor!
  127199.  
  127200. about
  127201.     "Private - Pop up a little helpful info. about this sample program."
  127202.  
  127203.     MessageBox new
  127204.         caption: 'About Dolphin Notepad';
  127205.         icon: self icon;
  127206.         text: (self aboutText formatWith: VMLibrary default fullVersion);
  127207.         open!
  127208.  
  127209. aboutText
  127210.     "Private - Answer the text to be used in the receiver's about box"
  127211.  
  127212.     ^'Simple Notepad Sample%n%1%n
  127213. This is a slightly reduced functionality implementation of the standard system utility NOTEPAD.EXE,
  127214. intended to demonstrate the DocumentShell hierarchy of Dolphin''s application framework.%n 
  127215. DISCLAIMER: This software is freely provided purely as an educational sample and as such it
  127216. is provided "as is", WITHOUT ANY WARRANTY; without even the implied warranty of 
  127217. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.'!
  127218.  
  127219. addSamplesFolderIcon
  127220.     Smalltalk developmentSystem addSamplesFolderIconFor: self description: self displayString!
  127221.  
  127222. closeResourceLib
  127223.     ResourceLib isNil ifFalse: [ResourceLib close. ResourceLib := nil].
  127224. !
  127225.  
  127226. icon
  127227.     "Answers an Icon that can be used to represent this class.
  127228.     Use the one from the real Windows Notepad for fun."
  127229.  
  127230.     ^Icon fromId: (OSVERSIONINFO current isWinXP ifTrue: [2] ifFalse: [1])
  127231.         in: self resourceLib!
  127232.  
  127233. initialize
  127234.     "Private - Initialize the receiver's class variables
  127235.         self initialize
  127236.     "
  127237.  
  127238.     self addSamplesFolderIcon.
  127239.     SessionManager current 
  127240.         when: #sessionStarted
  127241.         send: #onStartup
  127242.         to: self!
  127243.  
  127244. onPreStripImage
  127245.     "Private - The image is about to be stripped. Nil any lazily initialized class variables."
  127246.  
  127247.     self closeResourceLib.
  127248.     SessionManager current removeEventsTriggeredFor: self!
  127249.  
  127250. onStartup
  127251.     "Private - The system is starting, perform initialization actions.
  127252.     Implementation Note: We use the icon from the actual system Notepad tool, which is
  127253.     different on Windows XP than other versions of Windows, so we must refresh on 
  127254.     every startup."
  127255.  
  127256.     self addSamplesFolderIcon!
  127257.  
  127258. resourceLib
  127259.     "Answer the registry editor resource library (regedit.exe)"
  127260.  
  127261.     ResourceLib isNil ifTrue: [ResourceLib := ExternalResourceLibrary open: 'notepad.exe'].
  127262.     ^ResourceLib!
  127263.  
  127264. uninitialize
  127265.     "Private - Uninitialize the receiver as it is about to be removed from the system.
  127266.         self uninitialize
  127267.     "
  127268.  
  127269.     self closeResourceLib.
  127270.     Smalltalk developmentSystem removeSystemFolderIconNamed: self displayString.
  127271.     SessionManager current removeEventsTriggeredFor: self! !
  127272.  
  127273. !Notepad methodsFor!
  127274.  
  127275. aboutNotepad
  127276.     "Pop up a little helpful info. about this sample program."
  127277.  
  127278.     self class about!
  127279.  
  127280. chooseFont
  127281.     "Pop the font dialog to allow selection of font for the text in the receiver.
  127282.     Note how we easily we can modify the font simply by opening FontDialog on the
  127283.     font aspect of the view."
  127284.  
  127285.     FontDialog showModalOn: (documentPresenter view aspectValue: #font)
  127286. !
  127287.  
  127288. editTimeStamp
  127289.     | stream |
  127290.     stream := String writeStream.
  127291.     Time now printOn: stream format: 'HH:mm'.
  127292.     stream space.
  127293.     Date today printOn: stream longPicture: false.
  127294.     documentPresenter replaceSelection: stream contents!
  127295.  
  127296. openFile: pathString
  127297.     "Open the file with the <readableString> path, pathString, prompting in the standard Notepad
  127298.     fashion if it doesn't exist."
  127299.  
  127300.     (File exists: pathString)
  127301.         ifTrue: [
  127302.             self filename: pathString; fileLoad]
  127303.         ifFalse: [ | resp |
  127304.             resp := MessageBox new
  127305.                     yesNoCancel;
  127306.                     caption: 'Dolphin Notepad';
  127307.                     warning: ('Cannot find the ''%1'' file.%n%nDo you want to create a new file?'
  127308.                             formatWith: pathString).
  127309.             resp == #yes
  127310.                 ifTrue: [self filename: pathString]
  127311.                 ifFalse: [
  127312.                     resp == #cancel
  127313.                         ifTrue: [self exit]]]!
  127314.  
  127315. streamIn: aStream
  127316.     "Private - Stream the receiver's model contents in from aStream.
  127317.     Implementation Note: Override this purely to exclude RichText and ancillaries from
  127318.     the deployed image. In this case the base class probably attempts to do too much."
  127319.  
  127320.     self setDocumentData: (aStream setToEnd; contents).! !
  127321.  
  127322. AXComponentWizard comment:
  127323. 'AXComponentWizard is a <SmalltalkToolShell> that manages the creation of interface classes for ActiveX components. To bring up an AXComponentWizard, open the appropriate icon in System Folder/Additional Tools/ActiveX Wizards or evaluate:
  127324.  
  127325. AXComponentWizard show
  127326.  
  127327. When initially displayed, the AXComponentWizard presents a list of all of the current instances of <AXTypeLibraryAnalyzer> in the image. Dolphin uses <AXTypeLibraryAnalyzer>s to scan the contents of type libraries and to generate Smalltalk classes for the interfaces they contain. Using the wizard, you can choose to generate (or re-generate) these interface classes at any time. 
  127328.  
  127329. If the particular type library required is not yet installed in this image, it can be added by clicking on the ''Browse...'' button. This will bring up a  prompter allowing you to choose a type library registered on the current machine to be added to the image. An instance of AXTypeLibraryAnalyzer is created and will be assigned to a unique global should you later generate any interfaces or structures from the library.
  127330.  
  127331. Before generating the interface classes, the wizard allows you to choose a prefix that will be applied to the generated class names (the default is the name of the type library) and which package to place the classes into by default. If these interface classes already exist then you may later be prompted as to whether to leave them in their current package or move them. The globals holding the instances of <AXTypeLibraryAnalyzer> are also assigned to packages allowing them to be exported from the image along with the interface classes that they manage.
  127332.  
  127333. The next step is to choose the interfaces and/or structures for which you wish to generate wrapper classes. The wizard displays a list of the available interfaces and structures. Types which already have wrapper classes in the image are ticked with a check mark, but not that these may not be fully generated wrapper classes (the wizard sometimes generates empty stub classes where another wrapper class needs to refer to the type). You may choose a multiple selection of interfaces to be (re-)generated.
  127334.  
  127335. Click ''Generate'' to install the classes for the chosen interfaces. The operation may take some time depending on the complexity of the type library and the interfaces selected.
  127336.  
  127337. Instance Variables:
  127338.     typeLibs        <ListPresenter> holding the list of currently loaded type libraries.
  127339.     interfaces        <ListPresenter> displaying a list of types (not just interfaces) for the currently selected type library.
  127340.     description        <TextPresenter> displaying the description of the currently selected type library.
  127341.     guid        <TextPresenter> displaying the GUID of the currently selected type library.
  127342.     globalName    <TextPresenter> displaying the name of the currently selected typed library.
  127343.     prefix        <TextPresenter> holding a prefix for all generated class names.
  127344.     packageName    <TextPresenter> holding a default package name into which all classes will be generated.
  127345.     forcePackage    <BooleanPresenter> reserved for future use.
  127346.     cards        <WizardCardContainer>. The container of the wizard''s card stack.
  127347.     libraryName    <TextPresenter> displaying the name of the currently selected typlib.
  127348.     libraryVersion    <TextPresenter> displaying the version of the currently selected typelib.
  127349.     libraryPath    <TextPresenter> displaying the location of the currently selected typelib.
  127350.     prefixClasses     <BooleanPresenter>. Whether prefix will be preprended to generated class names.
  127351.     buffer         <AspectBuffer>
  127352.     typelibGlobal     <BooleanPresenter>. Whether a global variable will be generated to represent the typelib.
  127353.     constantsPoolName     <TextPresenter>. Name of the <PoolConstantsDictionary> generated to hold consts from the typelib.
  127354.     highLevelWrappers     <ChoicePresenter>. Verbosity of high-level method wrapper generation.
  127355.     classComments     <ChoicePresenter>. Level of class comment to generate.
  127356.     tracing        <ChoicePresenter>. Tracing level.
  127357.     defineProtocols     <BooleanPresenter>. Whether to generate Dolphin method protocols for COM interfaces.
  127358.     defineFunctionTables    <BooleanPresenter>. Whether to generate #defineFunctions methods to enable Dolphin COM servers
  127359. '!
  127360. !AXComponentWizard class methodsFor!
  127361.  
  127362. σA!! 4░«6-│╜à%ï>φ⌡∞╧√█┌╟┐µ¬AP╥╤⌐E`]F╫û~VÆYE?bOro  òVh'CéPo««2√╩M╗≈┌⌠₧ªP^╘<H-h▀░}rΘ∩æ╒U█Ug½Eñxâ    ╝i\¿$▄ûÅGx⌐(≥₧╧╢ïâgÜ╘║╘5F!
  127363.  
  127364. σM4
  127365. 99╜á<s·¿┐>ù:α┘éªùò■┼«≈½W »╧;r{B└ü?_█Ej]OAb±┴    Qi5Jπ[k░¬#ε█PΦ╢Ñ¢╖╬\ ÆdL}e╘¿l&º╞╬GôVçpεQ│~òΩT]I9≥$₧₧LÅGf┴jU─¥╓·╚αdëï█çsO╜⌠R½tD9∩à^┤╢^╘U=╔^╫V²(yφ≈m╓cb╠e±¢óG`║╕²│╪Fï√mL╢ε╖%q\g èM!
  127366.  
  127367. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  127368. σäM&2G¬oi«¬3ΘÉm┬┌▌≈╔ε$*Äd[,gb╚╜+Å╟┴UQÅüV|¡L╕!
  127369.  
  127370. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A%b£∞t05J»zc¼ó4≤▀N    ▓▓∙≤¥ª^s²4i&S╫╜a>║╚╠RæàyíS╗x₧╧H\=∞-≥┤0⌡Cp¿!!8╫¢╫ ├«rä9Éöƒo)í²SA░I    tî╡sû∞RµM#╪^╓└4rφ┬uδAa╬▄╢Ω-┌╟±²∩≥┤sY╡µ≥jH8a[τcè5bLB└┘à»-{qI▌ê<ƒ_╓─╚¿∙!!╚│â▀¢,¼ññcªl^b{ ¼y≥-xPß║3Ç1ào≈Φ·τΣ¥┘╔ΓGµRj│Σ>à√╕▓p/&o T╨ºε=`╜=¥\▐
  127371. Xcmçlyù■'ú [┴▒√R#S    {·▄£┤.oΘè5C▐∙FôæÜU₧veI╟²dY`╤b₧≈σ¢U┴╨ÿ▀╩Å╧~ÿ\⌐ÉLY*í₧╗─&╛Di ╗óτ╞0═┌döà±X░°≈"░Yc#è·≤N┘î]σ╬╘=πÆD¼6E@ɼ½╟i╪≤ƒ0√φ#oê▌f`!!╣≈╩┬àXK─`kçà╞M5╪╘√X▄╟ƒ}K┤┘ H╦!!:«╠{D¡V.æ¡╙ê┤T═0¡╫£Äó╓E1│g2≈5Å├ÜAµƒ╔╢U∞!!]öZf·╬δb{z╟q£═DV}
  127372. îÄ⌠#▌ⁿ╙>╧    H╟7╙░║╧~╖x`Ω┐ßT<m╫3iO_àu░%º¿¢
  127373. wô½┼╦+¬Σ╘₧k[ÉjD≥Dv¥ZA8@∙$⌡╖ƒl.2│Qⁿkä¿~tΘ±ⁿ√<╫Vn\K°╩⌡╫g╔±8─ ■╢i╙æⁿ(└b31K≡σ≤4û⌡╝²\═╢Γ"
  127374. )╙ÿh°òó∙!
  127375.  
  127376. ±Q%<+¼è6⌐╣ë)æ,î╛åÄ▀┘╠┬╗ασRπù╧tx]Fµà<^Æ%hGc
  127377. ╢▌?Jv#L╖"@*▓╛"÷╫Q¡│≈£εÅÆ4Lme╙¬h αï¡3% ¡^f╗S│o╨ΘSC+Θa¢ JîGw╕u╛°¬ƒ═ñw╥M╫║Çl
  127378. ¡σF¡o~âßi₧£MΓT<╔v▄9π(o░£¿+┘0ñ╬ÉAx╡!
  127379.  
  127380. ≤A &,í¥,¿┐ë8ΦUêû═▐±└╠╨■⌠¬A╛√ΣW_╙è:àZC#}OVyO ò^XufNπ_|GΓ¿/≈╬M¡╣ú≤¥ªuÆxX@|e▌╡~&½█≤\Zâü{╟█²kòM4φt₧╩Q▄Gz╕%├¥╩°╪αoσg÷ƒƒp»σ_°=J3ñµ?█≡OΓO ┼^╓⌠moⁿ╨1»(⌐V╪┌èHqç╖Φ√≤\Φ╖(±ºæuI[h&¥J½]~uC\à]âë╣*|öà#çH╪ ╥á╗(ñ∙╔è╗2╣ú∩├$KZI≥6╡H4¿ #ç$╖k⌠Φ·τ╢L₧╨─≤Nα7(«n∩ ╠Φ÷àZmC
  127381. f£]·₧D é<ÉY≥ECo╚
  127382. Σ 9∩$H└ΓµD3FYw╨.╠╟▄F╗▌R#╗┬≥ ÷B╨8*IP╦■0Cg╠,╘▀╘▐<⌐╜°Ñ▀Ä┘lÖJ╢üWI╩√Γyó▒"j∙■¼ú»V}₧ÿl²╒░q    ░ⁿΘ'éL\>ò╥σû±2é²²PåùWó,Nε├╬¼C╕╦î~¢é^ε░Ot6Ñ≈ÿ╫°s8T╪5(Çφ₧
  127383. 0┬┬╛MÖ≥¼{Mí²7 ·+'⌐ä4MΣ/Vß╘╡Φ╙O░_╩£∙Φ¿█>DO▄j▐1îæ⌐.âá▀í░h$h≡2/O■═çz⌠"╤åG/èöº;╫∩Σ>┘_O└m.¡╤╓µRî1{a≥⌐²l8â@.=I]╨#Θ%º«âw<═å⌐¡WÑΣ₧·a░kB∩|áYKtP▐%≈╝Ä>4ⁿMY╗q £½,eΓ╣░àp▒3z'N!!₧w₧è░┤╘4╫
  127384. ╖Γh═⌐π&╪0H'òè╘0ò⌡╞∩Y▀■G_  316∞çsh╢£8T┌û0│çI╘É╘╩┬ëª└{Γ;}£=─ç'bCb╜╒ßߺ)ÇFKO╧Θy┌╒╔£░X:=αt╩
  127385. ╖Φτ0ª&@N+:⌐∞ Σ7u▒┤/j`ä╣τgëSÖóN₧j╣ *uÅⁿ╜x▄╡╓ñWªφP)c|5¡±αL┬%å┤φªîS╤3≡█v░æàc┤5D₧╒»Ω≈═⌡d²┬Ä╛─╥▄≥[▀²VαXo─@    C#á3├Iæ5U░0;#L⌠úÆ'd²╟╟⌠SµV¥½╧\╚zF.uÆΣ∩W╓#σ╧" ╜ié╫1k.■>─Ω*╨&αuúr┐¬ág│Ñ╣╦pεpτbê╕ª≤$í≈∞φ₧cïdRⁿWùr9p}»ú*¿»nÖ*╬ß«#⌠÷èx╢⌠æ#8∞╕äg├üpäô░>╚ñ`╥ê`@Θw-<·╫ìè0îΣ∙Yt┘ç*Æì≥┐≈8╦■tï╥îöîÑ╒N<'╚L┴@U╠ç╟╨Σ╔-╛gεO!
  127386.  
  127387. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]¡╛╟r`\S└─*ZÆW3}OVfOΓÄUufI¼pWo░δ)∙╤L@«╕Ñ▐π╟^àq]gv▀«-&íë┴UDÜ╙y½B╕·hεTB.αh▀╤_▄V|Ñ|╨₧┬σ▀αuÜÆ█çt
  127388. εΓNW╢e5∩àZ╖╠ZδGo┘Q╙·9h°╦q╪G¬V≤▒Θ)┌¥⌡ ∞
  127389. ╝⌡lW∙Σ╖iIEc<Ü9·$tB=ú~ñżV{9pU╔ò*å|Ü⌠╘¬╒bδ┤»╠ù;▒╣ë╩    1K │p╪
  127390. g\≡╕y╘dTΓ]≤δ·τ╩Fë╙┬∩Qα"Ädε?ƒºδ┌@! !
  127391.  
  127392. !AXComponentWizard methodsFor!
  127393.  
  127394. αT7,U╬µp¿áÜ+æ:íÖ»φε╟╙╠■µ¡V╛»╘izJC╞ü~Qƒ^J-kH)b£∞t0d3IÑyA*ú╗0÷╟/j!
  127395.  
  127396. πV(&=ì½D╨└╬ò:∩öεî≡╥╚ò⌐²╖XP»║├~3XY┬æ2SâZ@jyRGcOΓëOcπz\xΓ┐( ₧A║Ñ▓Éπ├^äqRmt▀╕->º╦╥XZîX╤{├)▀a╨⌡S,∞$â│3⌡N}«@fÄ╥╨≤└ª3£Å₧┐uα£=-▒t;╪▓s∞┌^πv=┼K▀%τ?d°╩8═L4Çwé╚æMz┤ε÷√≈\Φª0ß⌐ⁿgh J\    &"£φUc╟Mì₧¼V*_╬îoÖ_ôΣƒ╒û╫╖Ç┴û*┤∩┬I╦!! ¼q∙`l√ó}┼`√    îèÇ₧▐K₧⌡╔τQτR#▓d÷s╓≤Ω┌K@A\    .σ:!
  127397.  
  127398. πV(&=Éû",ÖÑì9ûRï╜¡πε╥╤ò┐▓½VT ╕╠z`[╨û1EäZVjaU≤┴Ug5\πsU*╢ú%║═G ¡┤ú¢≤ÅçqB
  127399. ╖╓ º╟╘\ZôÉfεP│qòΦX@xτmì═M▄Exú=▀╥┴Σ├╖`ì!
  127400.  
  127401. πV(&=Éû",⌐Ç¿ΦUêû└▄√┘ƒ╘■ⁿáD¿┤╥p`XW╤ü~BÿOQ&oOVoOßê
  127402. Q&2Gª<zNÄδ&⌡╠á▓≈¥Γ▌Ö`R.s▀░h1║╠─\îû;∞.▄·hα\5íx≥┤0ÅVy∞Zaôá╞≈╚ùaüÜ¿çn
  127403. »ⁿK¼:J3▒√!!╫╤XºO*█ÜDúy9░ë¿+g╬+┤╬àEw╢╜╕φσ
  127404. ¡≈tU╢ε≥?nQr+₧ú peV@╠W▌â»MDoc╘█oÿN╪░┬¼±!!τ¿╝â≈T▄≡▌Å2≥ûfGRπ╜e╘lWτFÜäàï╙Gï█└ΦV╟ #«n∞s╥ΦΩ╘    VhLj1≡$Ç╖>m₧#▀]╦
  127405. DCn»n:═Φ!!ε!
  127406.  
  127407. ΓE)04╔σ[kÖÑâ9Ç⌡▄Ωî∞╥▄╨╖ΣáA¿▓╘s|]BÆà.B¢FM$iGc
  127408. ╢éXh!!J░<Qkíá`ε╤á▓≈æσ╞ÖuR@co▐╣ap├ú¡3!!åƒ5╕J│j╨≡^\ vî≥┤!
  127409.  
  127410. ΓL(&=öÄ1"╗«ëG∩VúτΩ╪φù╦▌╗▓╡R@┤║╟~3FW▀ü~TàPIjoPc éi óp_*╢ú%║▀Tí╗╢£√╩\ûwUie╔■X├ú⌐Eû£v½ªvù╝M"cQ±oÿ═╞4┐0╒╥╙≈╧½rÅ▓Ü¥}½πTúczàΩ▀╥Z⌠Bª6╩⌠>!!°├|ÿ~┴<║▌äAZ▓ú²╛÷ñße╘è█    bU
  127411. b6╘J≡<wD╨╚=âúc=NIö∞EΓY
  127412. Ö∙╥╜╝;╣·ó┼ò7╢µ∙└'ⁿûf6φ┐3Ç}Z∩ƒåûá▐E₧û╚ΘF±]╨êZ╞∩≈╓CzFY6÷$╙÷>V₧&ïK█;NNoâctä⌠;Ä`L5ííεG%3E$û]φ╫╒AöúX/▒■\ôü▀W▀/3QGà╛Ii!
  127413.  
  127414. ΓV"!!=çÇ?9╡ºë$æ,î╛åÄ▌┼┌╘¬≈σGK║√╨iv[S▄É;@äG%`ORb≤à^[f[½yxº¿%≤╚GΩ┌▌≤¥ª çqL@mr▀╜y7ì╞═IG¢¥fα.▄╥1²VJIiú    ⌡╖MàRqÇ    >└╥Ö½î│vä ▀ÜùxUε▌^W╢P~æΩ=╩┌MºO*█╘■(;╣Çl█Rk∞6│╧─
  127415. ┘╟ⁿ√≤║²pH░∩╝JX8Fj4╬ τj1{U╤²Å▓\c(F^ÜÅ*£ ù²╘Γ╝&α┐Æ╬ê7Ñ≈└┴Byfxj╗i⌡ 4┐±z┼a]¼Üà╔╬δMâ┬⌡⌠Gτ>«n≤s╦Γ∩ƒGdJ\    z÷"Ü≤j+ⁿ^≥$╢ZqCdâ 2╧û_è,^┌ú²N;G>îG₧┴▄H└ΓX.φ┐}Üìïw╠)+UN╟Γd8å,Ö·╒╫T∞²²┐╔Ö╩Màvíë@j═°µ┬(┐ct╦┐ñ╞àe,╫ë)½Ä░Uáú╗åXdé└≥T£≤wéó¬äÜJªb_GÅáÑ╙(├Θá?éÅHî▐bM║µ▌═£ùz8┼╗┼
  127416. =╧─ñ
  127417. ¿πä}r░┘ µ:1¿₧zM²{J∙╔┐╗¥═'ª≤ÖÖµôr,5╔v ]ùD┼⌠┴T∩êî■H÷;LƒG"ô■┬J½cù±P|
  127418. àôΓ%ÿασ,¥L╪|4∙₧├┤╪xfLΩ║≈Uy$═W'8¼?∞fóáÉ2╔╦¬Γ÷á├║cYJàgOªN¼MZA┌8ⁿ╜Ä{q▓ZKⁿvà½d íε±δ┘]o=O*M░?ⁿ≥╨d╔≈$╙ß½nµ⌐ⁿ%═43x╝≡╕U·▄«ⁿTæ╢?²""!!╠Üuº█Ñ╝W╗òSO┌ÖK╘╫ìÇíK┬ ┼1-ƒ9AQ¼Θc`[xo╕°█║ΩoΣ=═∞lÄ╤▀:├Γz0`f±~╔\v╪ô¬!!╣iJ*6τ⌐¬Γ7[º∩c π╒╔9±-«êo╒-║6*|Ä∞,ü~╟╝?╓Ñs≥φMs&s<²Θ¡%≥ █╪£üæD╞Ωαuñ┬Är∙5▀╚┐ñφ▐ΦeφìΓl├u¥┤▀╔H┴²¿!!)Xo─L    `"W│>°N█e\
  127419. í0vw∩çôrhⁿ═ë,µ}íúεÆ$ñhM4cò╢ΣüXä¼I"╫ Σ╗e&K¢^5─ΩcT÷÷c½7¥ª╡Uh«¿7▒╙&╖"YK÷*ê▒εmCÑ2+░Γ°φπ0╥nX²ùv?va≡τ ⌐╖pà9╒ß~╡YùïδKƒÖ⌠FA⌠úÖ<φ─ñù│X»ùI₧≤A·B╙!!█ï╫x¢╗Ω]{µ╒7┬░≥╛≈~éû<φ╔Yêòìë╚(P>s£ZÇ╠É╟╧╢┴9«4íCQ∩ΓI1Θ┘╓÷τÖα¢tè<ÅΣV\4╞r╜╢▓▀S─uÆ2τ≡P     ║╖»▐0.÷ôC▐O▄¡»]░G⌐≡<ú'W8ÿ╛;z╪Ç J░aòL╕┘$
  127420. j▒z>≥ìæ╟≈ üK║PÑN@╖╕í╟,ä╖}£å╛x▒x╒╓Jì▐>Q╪ü╔ƒHI≈▌∞┌,┬Tå    jtñ ╥ Å▌&-»P B0X▓HlTï√Pßóm'«cÑ╕≡¬}SM┴[╔■üù ╙ï∞PA∩╒≥eÅßkΓfu═║k_╟┌ß[╢┘ù-D^Φ⌠∩|─°«╗6"Äps╬σüF÷¿â╖┬¿-┼²]e╝₧
  127421. :+,öÿ⌠ë╙4ó}£στ∞┘S▒├ê{àσ╣├-M9Γû▒■·╠╕Pⁿµ5▐ä╨÷#Ö≤π╙_µri╪▐ΓvAi*zVN 8S≡╬w╟îf╙iæª/Ω¥·▓╒èê½┤ ä#ü¥»w²y÷╓1çSñb96]HÜ¢t√─¡≤⌠¼Φ≡╪ÿMDD.e!!KóF╩∙Ü≥BìoúĬ│╖┤$Çs{╡═ëα▓G[▀▀#√?ìXjSl0É┬ÿæf╔6"▐·¬`ÑëÉ{üσ«½÷║≥~Aφ}╩    U¥Pß≈8 :µI╗┬ú╖ëæ.╢┘╒╗}êNiσá{qù;╥u&╧N#á&"6
  127422. ¥fò√O¿ï┌~ÇX»"ì∩┐²C└LµÜ⌐¥x|D7ºÜFîäòτî¿<æ@¡°vLÆj├.ôΘ░=╟ïjæ≡Üß╨¡p9▄ñµ│^║╕°┘∞e╢5π├xò3¥h▌KεgvÖ -7(1(m7%«üI∞ │í'├τ1sΩ+ë╝╙≈2G?Φ▓N$ÇäΓ╕∙■|∩g!
  127423.  
  127424. ΓV"!!=ùî:,╖¿ÿ#åΦ╞µ┬∙║╡╝ⁿ╤╖VB½╛Ço{M╞û7UÉZVjyRAb±┴Vtf[½yxº¿%≤╚GΩ┌▌≈ÜÑuéd[.c╚╣l&½·├QMÿçvÖJñt₧▓<%`,°tÜ≥P₧Q4╗9▌╚â╡▀ÑìïÆ£r,ª≡YCºdJhçß7äƒΦO╒O▀:·/s°╒a±Gb┼<Ñ┘ç`╝⌠╕φσ
  127425. «║6╘è█`@\E>Å≡#1XX╠ùQ╔╖Xa)Fo╥Ç!!î_╓π╘╢°;ñ∙ö▌₧?íµΩ╬$;║uΣO`P╕±z┼a]ók⌠Φçù╧Mù▀╟┴N√1╢+÷;└ΘóƒYPhCL∙6¥≡(a╤'Ü@█BvûdaÖ■· P┴á╚[>8K>┬äÆ╩A
  127426. åÄ6G▌Æ#÷!
  127427.  
  127428. σM4
  127429. 99╜ª<:«¿Ç&Ç;╒═ ╔╥▐▌Å■µ╝CF│▓┬!!Γû7DûKAj#cdπìMcf[½yxº¿%≤╚GΦá╛è ÅâuW } ▄«b?ε▌╚\╔7½"l╛FÜtƲCV(6αhå─\Ä8∞%├ù╧ ╬ε1σg≥±·o
  127430. ó≈Q▓d oç█*╬┌L╦H<╪ÜΩ=d⌡╬zî/¡U╪▐ûBr╢╝╕ñ╜FëτpY║⌠ÉcCGKu'îµ$+D╨╚âúV*\╚ä)éBB¢ ╒╜≡;ñ≥â╪£8░±ë▄25╜pΘ
  127431. .íí{┼kR⌠O╨∞∙τ╧Z₧╨╠■a°#⌐n≥s╚Φⁿ┌)\;≈2ü╖,vü1£ZΘMWf▄ #¥Θ0σ={─¡φV=K{┼SÉ┐│-üαW+░·g₧ÿÜ╙#<ULKé╕&;ùià╗┘┴⌐╣σÇ╩ç▐Z╞πöDU/íòè=╩'¿+(uæ╫ñ╫╒:}₧ÿlóåσYΣ≡Φ ÄPd.MΩ╣|òIƒ╒%Öóτ▒ÿH¡+ ì╜┤±&▐ⁿ╛?¢é
  127432. ε░
  127433. h~Ω·╤╟╬YGM╧-k─╛╨K>╟┼├'÷Å⌡`Dä▌?φttü▌{F∙/E÷╨⌐╤╥T╤ó°ò┴¼╥CPâ$FYïZα²╥∙ï╔ºÇ)E£eö½î{║q⌐╬MAåé«lÿ°Θ>╩_H█xl╡▄εΦz┤jv÷╛ΦO~åA8|F╚ Θ`Ñ√╫<▌└⌐ºPδß├»j\▓bGΘ@ ΘI1]┌9°ºƒJ!!╣SU╛_ç¼?l»░¥és╨Smb"^≥}ªè╝░µ/╨Bα¡h─⌐⌐gä:f$H∙±²X∩î¬√D²≈
  127434. ½g`'⌡ÅrJº├ÇεX«ÆS╚▌π²7ëë«Jαwⁿ-3Çp    ─ÅP'ux┐≥≡⌐ºk╖ZB~■ßf█╒ü~┌íB;gu∞v╫\v╬╚ñrN╟=V$:│ε¡Φ4PáΓ5{E∞┼êqÖUâπ╞'╖1|îφ:δ1ïñ╓½╝░YI>╕εá/¡|²╥É
  127435. ▓îM╞RΘ√t│Ä┌7ªw╪├┐∞φF╬≈n²ì╒c█s¿ßHÉπL╩±TπaF!!ó
  127436. uX(B╣>▄Pª0╖v%$]┌ùû&`≈╟τm¼R╜_¡Σª3¡!!S "sü≡∩╓·╓%H¬Sî`╟    ╫S3╟≡7±6╠y»;╛íâFk░┤÷£G─Q13▀`││τE ╝9Γß°φ─7ë7ç]âAprt∙÷*ⁿ√hÖ*─Σx«3Φδåb≈π«;:Σóï`ô½Σ°╦0╘τ÷ÄzφK@û<ôû╔`▓▓⌡Z7┴╞"┌εÜ╞ì>└⌠Tà╞{êï¢Ω╤$Q.x╥    ╘ZMëÅ╦┴U±╠2¿oφ%sΩΦ_åÇ└÷ßà²ÄrUï7╪Uqés:o╗─┌╜▐^ì~Æ-¡ú2z1±÷╠╡.&µÿc┬W■╡╕]Γ½≡(╡n4#îú;x┼.╘G╕w¢ ┴çq_
  127437. bö5_öß√╞εÄ╥v═4:ε├═¿<ô∙z≡π¡!!╪¿║²ºj[V█½└╩
  127438. °£î╜Dª)π<vt√├à╨u#╓a<_Y?O╛Tm^╙¿VAσÑ9fófΘ²°çzW┴¢Φüù½▀ù┐JE⌠ÖÜ ñσkÿ
  127439. ó∙pU┬▄τ\┘ù┐cS∙²╧p┬├í╜#>"ülz!
  127440.  
  127441. τM)&0╔σ[kÖÑâ9Ç⌡▄Ωî∞╥▄╨╖ΣáA╛½╨wjAX╒─*ZÆG"oUTn╢âZmf[¼<Gbºδ/Φ╫E    ª╢╗▐·└¢:m░╒~7ó╧ÇXXàèX─*Ñx£╝GF /ígô╤JÖ ╞mV!
  127442.  
  127443. µA)'9░è_C╙δ¡:ò3°ö√─√ù▐┴¬α¼QV½╛Çx{IX╒ü-ûQ@joOGnµò^MifHªrVxú┐%║╩JΦÑ▓ÅΓ╩
  127444. Æp    `t▀«k3¡╠╙% {∙iεW»mò-⌡S]*°$û╨MÜQ4╝3╘Ç╞σ▀α`£Å█Åe╟ΓRHñ  kÆπ*É▓5ÄU6▄Z÷±?`δ▐8ÿ.╙:╜┌├Pmú½╘≈ΓH┼₧    Há≡╖& gTTr₧µ9i┘╚â╣{=OY▀╧Bß3Åα╘ö⌡c÷╗ô╘┌.┤α┬╚
  127445. µ<∞wTπ╢lεlVΘFêǃ¢┌÷╝¼∩Lα#·1╝s╠Θ∞┌@hLZ}Γ2ƒ≥.qÿ;æ▓r(Qwâp ╫ªu▓ZuçΓµY%<YYm▀█£┤.oɱS-Ñ·Zî╒┼₧*_G╟π7'4É`ÿⁿÿ▌⌐¿≡ó┬ä┼▄c·öJI╩√µ(┬$╣duX≡╗⌐▌Σ1uí¢ ▓ìπp■╣└sè*2 ä█Uαàí'Å│²Hτ±.╩QùΘ²£iÖ∙╨t╓ö^±²Ov+┐·▄╬æW<.úSB╨Ñ╠M.╬╙φ
  127446. êπä}Γ¢µ+&╗╩}Fφ{┤ä┐α▐S¥2»·ÆÇ¡≤KYù    d2≈5π∙├OVφ₧┬í╖<LL⌠1/O■┤┬~
  127447. ½8┘╤AR2╦Ωì^▒ßεa¥0]╨ko¡╨▄¿6▄~l{π┐ë,^ÄA`=q└o±%¼ßâ8
  127448. ┌╟¼º δ⌠╔»jsåqJε\:╗P]1GΓ╖▐≡#│XN╣k ╚¡?p≥≈ µ@ÿZK&[≥1åÖ┤ε¡säLÇ╚╤╖ⁿ ▐=`1∩δ▓N╤ô½∙\à¢wv 3&=·ëyc▒ò▓δ½Æ@╧æoé¢!
  127449.  
  127450. ΦJ4
  127451. 0;░ú;+¿¿₧3ΦUêû└▄√┘ƒ╘░▓¼]P»╛├o|Z▌è~FƒZvOcgr≤¡[t']║]]k«▓: ╠@║▓ºî≥▄â}P.t╥╣-1╗█╥\Füè{╟P│qòΦTKI4Φfì▀Kà 6┴jQ╣√╨≤└ª3£Å₧┐uε°YW▓e    o!
  127452.  
  127453. φM%4*╜ú;:«çë2æα╞δíö╛¥ß╢≈σFP║⌐Çsr[┴ü2WöKA..Zg⌠ôKfN¡xc▒δ$ ═Kºóñ▐°╔\ÿbWi ╬│-&ª╠ÇWMì╙t╝G°?²kæ;&7;αv¢═ÆGl╕#=┴û!
  127454.  
  127455. φK&!!┤è ╕─µC╟≤█Γ▄Ω─ƒ╙▒ασR▒╛╫;gQF╫─2[òME8wGdO·Ä](f{½yxº╕5÷╩    ╗≈úû÷█\╫z[.AΓêt"½σ╔[Zöè7{»O»gò╝X\IUïû╨JêCz╕    =╟ù╟╢╬╡g╚î█¥sε≡DW½g~å»'╤ƒ^ΘXo╦S╒≥!!!!÷╒8╥Cm╦>╢┘═┘├ÆùⁿF╝°bÑì╪gh |u&Å≈1eJ╚W├¥ßxUZ\▀¡&ëHäΘ≡╢²m²⌐ä▀╘~üδ╠I╩>▓∙O{YóÑa╔~ñìÆÜë╤Mƒû╤Θ⌡R$┐f±<╫µΩ╞S+&Z}Γ"ò±$fÿ1æZƒ NbèloÜ╗!!δeN═íΩ^'?XYj┘Z┌█╩T
  127456. ü·>┐·    ô£¥U▀>!!Oé±d8ù~ÆΦ╨£Né╡σ│ïƒ├^êαìC0¿ù╧╬)¿kpΘ╙┌º╠,1öû#┤ì⌠¡φ≤&ûT0ù▀ ⌡N₧í#äó²WéÜIñ= L├╜»─'æΣÿ;╓ïEσ▒ $%ñ⌡╘╥ÅC▌3'╠≈┴O|∞π╣N▄τÆm╡╒?àD]┤╤`δ+T²┼¿í╘U¥&╢≈âä░╚HHÖmMæ_τ∞╔H∙█├óUó LB╕ce)Ü┤ìfεuÉ█CkMµφÄ#╘∞áaÇ_lφMw⌐▄ »╠plv╓⌐δKl#Å\znB]╥Γa¿¡┘ZTí╒¬«Dδ≥╒╣}Zî-&û,i¼YHtG╞;ⁿƒô|]q¿S^≥uß║'pπ╥∙Ω    ÿIoh(KΓb!
  127457.  
  127458. εJ%=êå0;╗╗òÇ3Σ╫√╔·║╡╝ⁿ┬╖ZU╛»┼;>wÆÉ'BÆH#lIRy╢ëJ&$Jªryºº%∙╩Gµ≈ࢱ▌ƒ4Jk ╙▓k=╝─┴MAÜ╙wíVó·h⌡EI1∩gô╦]òLs∞4╓╥╧ ▀┤3ç ▀Üà}ó≡UHº uûΩ!!╪▐\ΓRaÄ2░₧Gσçl█Rk∞6│╬éVm≤▓òöìl┴τeP┐á╗dJ\g&ï?≡"XAD╠╦ëñV*╬ÿ?Äv öΓ╨¬σ!!╛τ┴▐ƒ2│ú▌▀Jⁿu∩!!}SÅ█⌐d]╪ïä╔╬Σ%±┐¼ÅN²"╗y°─≤≡ƒJlNP¢^·₧*pÿ0▀M╙@P^δ
  127459.     Σ≥3┼ )O═°»l\P#p┬╬╫⌡MÆΓN3≈÷Z╢¢îS▀ 4UDQ»ÜMjT°eæ╧╩╟ ÷·╩ê╪Ä╟Y▄\⌐ùUZ%╣╗ü▀+ínc╧ºá╦Θ6s═┌8╛ÿ⌡xªδ·;Ü}]dε║|⌡F┐α;ƒóτ▒÷-╩QviΩ«▓╚-æµæ2âéF⌡¡aú÷╩╩çC▀3/Ç╢╨y(┘╔≡M╥ï÷+╦╡Zß,&╗╠mxδ/L╕╥╗φ╚^çuΣ⌐₧Ä╡¥SN╦aOÆEª±╬Tδù└íΦot?╫6,K²═ïf¿cÜ─QVlÄå⌡y╡äë<╤O╘u@╕╘╓µ╥t}¿╓Ä/x2ÖM(tZF╠ π%¬¡Æ6,å½┼╦R╣σ╓╢w    êfJε ├<^5P╘*■╢┤
  127460. 4ⁿ\P╣y╞├T    Ω≈≥·╩CDC"⌠}öÖ»@═ë!
  127461.  
  127462. εJ0/ïƒ7'┐¡ß@∞}╙╤∞╔≈┴┌╤■σ¡VM »╚~3ZS╤ü7DÆM9.MZn╢êd#J¡<Pe¼Ñ%∙╩Gµ≈ࢱ▌ƒ4Jk░╒a;╜▌ÇVN╒åg½Mó=ä∞T1πv₧╠PÖQ6┴jQ╣√╨π▄Ña╚æ¡ÜyüßRJºdDΦå0▀═[⌠uæ╔ +!!∩╬}╒x╔:ª≥éIq╖⌠╕╣π║≡s≈ì╪c`JSKt7êµ8?":á╘ÅìPo/_▀ò    äYà!
  127463.  
  127464. ≡Q",½é?(┤¡╓jäε┘Γ═≡╙ε└╗α╝.╒╥éKaA@╙É;┌a$z^A+ ≤òPj5ó~\╢δ!!║╬M¡╣úù÷├\ÿyS`dÜ║b ε▌╚\çÉ|╕Fñ=²kòXA7ípù█└a{í=▌û≥π╔▓j╓C▌÷∙e╟φP╗ph┬∞>┌ƒSεCo╨2░≡ e╣¥%éCM╧2╝▌ì@Eª½Ωτáº∙m]╖ΣügIYE XτΩp+┌┴╩╡@}9oE╪╧Bß3AéΘ┴╜╨hµÆä┴è~Φ╛ë
  127465. ┬wfxj╒u·;fJτδ)¡2àoÑÇ░ü╥EÜ╪┴╫W±)·b≥╦µ·╙B3NE4≤w¥°9Kÿ8▀O╤Xèib═≤0∩#U─º»Y>.on┬π¢ù)lΘè5úφ\Ü¿╤*┤E{\I╨±6ÿâ╒▌╩Å╗π▓ï╓ûƒUñ─(<M╔¢ë'┘?¿8&uæ╫┘º■>Rÿù!!ªå⌠eíδΓièSU9 à▀°┘⌐;àѲZàÅi¬4_졲ü▌∙Æ~ƒöc≥áh(»≡σé█t;-úS╘Ñ╓Oà¡ö#╘Ñ╘*A¬╙<φ5╣╒uO∩{·╓╡÷╬^⌠Å╡╙ê»╬C_═HYî]⌠ßëε₧┬░ó1` ÜWS"Æ╖╪(τ"⌠½+f    ┐ò≥2é«ìQ┤v$εxM╢╘▐º┌@kj⌠óñOoäO8qOVƒoßl½ßÖ8*µ╧ú∞/┴ë╣╓QKæfv▓(└AW$V╠kúε┌w    %╣MZ╜{¢ε-eΩ√≤ⁿ╫T$~$N┤9╥ƒ╕ѱ<╫¡ßn╙¬Σ4╔ j2K∩╩Öu╡▄ªⁿU┼Γ ╪) #Θîu°ò│╡╙Φz(╥Æz£é[╨┼┬}0¬vA≡ 2₧1.╘å~~~£·⌠╣δoái╪σyÄ▐╘*╝»^1:;ë│zlv╧ö∩"j├C-M%!!▓■■αM╡δL7 ²├╬*┴└∩ûO▐LWtå╠-ñtÆ≡|╜┴█îo.r;│∞ÿ4¡^÷¥Θo╪Ω(╝≈╤~╖ÇîrΩ/Tû╤úε¿T¥⌠bΣ£ú?è&ⁿ√    ▌πî├N \F&E½W .Ræ>└^╟Q\╗~).e╡╠} [æ≈╟~╗[-αr╩é£%┤kQ`wÆ≤°╡Σ╦!!E║?═m±(NòY2≡∞<╬!
  127466.  
  127467. ≤A!!0+¼ΓX@°¢ë,ù:≥▄»╪÷╥ƒ┘╖ß▒L╣√├naZS▄É~s»k]:kwZi≈ôxh'C║fVx▒δ)⌠₧V¡≈╛ô÷╚\·3jt├¼hº╦╙D£çL5µbÄIë∙}F *αvå W¥Nm╢.ôô╧·π░vå ¥ùûH╛⌠{MásgδåZ╖▐L╘N=╪Z▐5ⁿ!!mⁿ─l╦M`Üèå¢.¬εΣ╛°Fª⌡mY∙╝≥BkGX[{!
  127468.  
  127469. ≥A+6,àâ>┤╜ë8â>Γ╤ⁿíö╛¥ⁿ░▓▒[F ▓╬ovZP╙ç;A╫SM9zx
  127470. ·äM&'C»<Gbºδ)⌠╩G«╢┤¢Σìqt·7    `t▀«k3¡╠╙[ÉûaºL╕Ré/⌡]I1∩pÜ╠_¥Aq┐@0┌ü╫¢ª!
  127471.  
  127472. ≥A+6,ìü!!=╗ÑÇ/ü∩└Ω▐°╓▄╨¡ƒ╧:û╡Ço{M█è*WàYE)kHgσòRu#CªG*╢ú/Θ█    ªú▓î±╬ä4JotÜ┤l$½ë┴UZÉù5¼F│s²kòVJ=≤eï█]▄Kz╕|╟Ü╩σî⌐~ë
  127473. Ü┘■b─ÿ^J╢e}â∞6═ƒLΓM*╧K╙²s╫╬tÿ&╔1Ñ┘æBu░½δ╛∞╗α O╝∞╖    ?nQc3ìú ptNS┴W─ú»Jy=O@▀ào╢L!
  127474.  
  127475. ≥A+6,æü;'⌐╜ì&ë:σ²ß╪√┼┘╘╜≈╢>)╓∙Θu3\^╫─7\âZV,oXVxO·êM*f\ªpVi╢δ4≥╤QΦ╛╣è≥▌öqM@zh█¿-:»▀┼FÜ╙p║┤xòæ;&=∩aì▀MÖF4Ñ(▄╥╫■┼│3ü₧£û>b─£=-½n~ÉΘ2▌┌LºR*└Z┘·"o╓╒V╦N4Çw╕╥ùAf╡»√√≤Fñ²sH∙≥╖fRK]hï αpmU╚┼Qâ▓pc/WM╓ì*Å?▀╛!
  127476.  
  127477. ⌡]71ªΓX@°êé9Æ:≤ö√─√ù▄└¼αá]W ¿┼wvKB╫Ç~FÄOAjbRQyΣÿ^VtfA¬p╚╞JôαV╕▓¢ù⌡▄\Æx[zi╒▓B Ç└╠!
  127478.  
  127479. ⌡]71ª╒r(Ä░£/⌐6π╞ε▐τ÷╤╘▓δ┐VQÉ⌐εr%<╗╞WâL>f^hΣôWrf\ªpVi╢«$║╩[¡≈╗ù⌡▌ Ä4J.aεÑ}7é└┬KIç▓tóZ¼xé.εFzî≥┤0ê[d⌐,5╤üâσ╔¼vïûö¥SÇ°[Γa>bÆΩ╫▌MµS6φQ█Ω7dδΦj∞Kb!
  127480.  
  127481. ⌡]71ªº7%¬─µC╟±╤ßîΩ▀┌ò¡≈⌐V@½╛─;gQF╫╔2[òME8g^@+≤ì`/Cª2╚╞Jô┬¡╗ºÿ■├^ï4ife╓¼k;ó╠Ç╒ûsεW»mò-⌡S=φtÖ╫UÖ ╞i█ù╧·α⌐qÜ ìé╙x
  127482. ¿≡BH╢ sçπ?±╧ZΘo─Z╓⌡$mⁿ!
  127483.  
  127484. ⌠T#!!=çâ3:⌐Ö₧/â6∙╣àÑ╝τ═▄¿≤▒V≥√⌠svC┴ü,ƒ^WjzTTl≤à^Vhi@ÑzmºÑ%Φ▀V    º╣≈æ±ÅÆ4Y ab█░-$»█╔XJÖ╙zεK╣qöAΦYJI;⌠vì█WêNm∞9▀ù└Γ╔ñ3£Å₧╙p¼πVV╗.HΦéY╖ßO⌡D)┼GÜ·(vö¡½Pk╞-┤╧ïg{╜║²≡⌠≤Ö
  127485. 5╨á╗'kGWc6╘J≤5wFHΩ╠ÖñJ-*B@╧ä!
  127486.  
  127487. ⌠T#!!=Éû",╢áÄë0π╒πíö╛¥σ¼√│RW║√ì;G@SÆæ-WàL+}Gd±ì]&)A∞sUlΓ¼%⌠█P╝╛╕É╖└^â|[@il╒╛l>ε▀┴KAöƒ5║L÷uƒ°[=ígè╠KÖL`á|└ù╧≤╧┤vîMïéâyOó°UVúr5└éY│╡6┘F#├]█▌,lⁿçn╦GyÇ6ó∙ìEv┐½ⁿñá▒ΣeP░ΓògGYKp3éµ!
  127488.  
  127489. ⌠T#!!=Éû",⌐àà9æRï╜¡ⁿ∞▐╔╘¬≈σÅ┤╨nIB╫─*ZÆV/m^Z}
  127490. Σ╞j/\╖<\lΓ┐9Ω█Q@╝┐╢è╖╠╫v[@ie╘╣3║╠─
  127491. °|■|▓ódÇ╨XM≤}▀┬4÷/┼    2╟ù╤≡═úv¢MôÆÇhUε╣P╗pWïφ!!▀═FºH!!╪Z╚≥.dΩ≤wσG`┼-░╚å4º╖Φ√╠¬µaNááípEA/rÅ╨"eJTΩ┴ÅóMd3MÜ║uèXö░═°²!!Ω╗î╚┌b⌡ßë╬26[M!
  127492.  
  127493. ⌠T#!!=Éû",⌐àà9æeí└÷▄√█╓╫╙ÿ╠s¡▓╓zgMƒ─]çJH+z^≤┴ \e#F╡yA-▒δ,≤═V@º▒≈èε▀╫`Vz ┘╜cr¼╠Ç^M¢üa½G÷{é±[=í    ⌡╖╜z@╡9 ¢┴Σ═▓j⌐₧ùèf
  127494. ╝»╢y~ĵ1É¥2ì,EÑK├÷!!h√ç{╬Go╥░▀ïApÆá∙≥∙¡µs╘è█ qCGg1ïúb[
  127495. ë_àô▒\a5A ╙Å;ÄHù≤╘½╚n├┐Å╚ê?íµàI█'
  127496. ╛<∩fJßÑzë-Z 5æôçï█kö┌╔πAα?┤1탵╕àu    3≡:û╖q%ôtæO╥| -! !
  127497.  
  127498. AXControlBrowser comment:
  127499. 'AXTestContainer is a simple Active-X control (OCX) browser and test environment.
  127500.  
  127501. AXTestContainer show
  127502.  
  127503. Instance Variables:
  127504.     site        <ActiveXHost> which is hosting the embedded Active-X Control.
  127505.     windowStatus    <ValueHolder>
  127506.     inspector        <AXInspector>. Inspector on the control''s default dispinterface.
  127507.     eventsPresenter    <ListPresenter>. List of events in the control''s default source interface.
  127508.  
  127509. '!
  127510. !AXControlBrowser class methodsFor!
  127511.  
  127512. σM4
  127513. 99╜á<s·¿┐>ù:α┘éªùò■┼«≈½W »╧;r{B└ü?_█Ej]OAb±┴    Qi5Jπ[k░¬#ε█PΦ╢Ñ¢╖╬\ ÆdL}e╘¿l&º╞╬GôVçpεQ│~òΩT]I9≥$₧₧LÅGf┴jU─¥╓·╚αdëï█çsO╜⌠R½tD9∩à^┤╢^╘U=╔^╫V²(yφ≈m╓cb╠e±¢óG`║╕²│╪Fï√nH½∩╛J wIBc ╔!
  127514.  
  127515. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  127516. σäM&2G¬oi«¬3ΘÉm┬┌▌≈╔ε$*Äd[,gb╚╜+Å╟┴UQÅüV|¡L╕!
  127517.  
  127518. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A%O─äPu2J▒<Gbºδ4⌡╤NΦ▒╕Æ≤╩^₧wQ.w╙¿er¥─┴UDüƒF╖Póx¥Oæ;"cQêwÜ╥_▄KzÑ5╥₧╩∞╔εΓd▌÷∙e╟┼EEíe'zæΣsäé╢=¥╖|Ü@ É⌠u├Nb╘>╜╫├@qѽ⌠±≡ ¡·toá≤ª,<bg6è+τ9eF_╟┴%à«U~L@▐ä=óYÿ¬æ≡╧lσ╢ì┘¢2╛╨╨█:" ▓<∩{H╕±z┼a]¼¢ÆÉ£╓XÅ▀╩Φ┤5╢mí7╠⌠Φ╙_Z[@3÷~╚ÜG °&ÜI╓ UGq▓ooüíu≡)Z!
  127519.  
  127520. ±Q%<+¼è6⌐╣ë)æ,î╛åÄ▀┘╠┬╗ασRπù╧tx]Fµà<^Æ%hGc
  127521. ╢▌?Jv#L╖"@*▓╛"÷╫Q¡│≈£εÅÆ4Lme╙¬h αï¡3% ¡^f╗S│o╨ΘSC+Θa¢ JîGw╕u╛°¬ƒ═ñw╥M╫║Çl
  127522. ¡σF¡o~âßi₧£MΓT<╔v▄9π(o░£¿+┴;╡å├ Uá╛²²⌠F½ⁿoU║σΦJAaCS
  127523. s>Ü<Ω'%9á~ñxî│V`fΘî.çVùⁿ┌°°d≥┐ì┬è3░φ▌:╓#C¬u∙FZ±╛|╥n^  æô░é▐[êîà⌡G°y·`Σ*╓ºò╡s/&o T≡$á°?qö0╝A╙DAwÅon─áXëcLE╟╖²D46L!
  127524.  
  127525. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]¡╛╟r`\S└─*ZÆW3}OVfOΓÄUufI¼pWo░δ)∙╤L@«╕Ñ▐π╟^àq]gv▀«-&íë┴UDÜ╙y½B╕·hεTB.αh▀╤_▄V|Ñ|╨₧┬σ▀αuÜÆ█çt
  127526. εΓNW╢e5∩àZ╖╠ZδGo┘Q╙·9h°╦q╪G¬V≤▒Θ)┌¥⌡ ∞
  127527. ╝⌡lW∙Σ╖iIEc<Ü9·$tB=ú~ñżV{9pU╔ò*å|Ü⌠╘¬╒bδ┤»╠ù;▒╣ë╩    1K
  127528. »l≡ml÷ú`╬jül≈ΦåÇ═M£▀╓≥Gµ&?╡g╗s╓Γ⌠┘! !
  127529.  
  127530. !AXControlBrowser methodsFor!
  127531.  
  127532. αF(!!U╬µp╡╣╠?ò⌡▄Ωî²╪╤┴¼²⌐@╛╣╧ngT▌£|?²2.CPHVg    ╢éWr4@»OZ~ºδ!!°╤Wï╕╣èσ└!
  127533.  
  127534. πV(&=ì½D╨└╬ò:∩öεî≡╥╚ò⌐²╖XP»║├~3XY┬æ2SâZ@jyRGcOΓëOcπz\xΓ┐( ₧AªúÑæ√ü^s²4ir ╬╡-&╖┘┼uAùVÅ{╟W┐=╩\╝BJ>ígÉ╨MÄMxƒ    (╓╥└∙┬┤aç╗ÆÇl║≥_╧
  127535. cδå'╟╧Z╬O)├v▄8ⁿ#dúçCⁿqa╒1╡£öEf╜º÷∙┬¡Σ]╘è█uCydr╘Wú91[I┘ßê∩4UPI╓çoëHüπ╘æ╪M╦╝╡╘è;ÖΩ╦SÅ./╡~!
  127536.  
  127537. πV(&=ì½╝¥ò:ÇΦ╓╡î ┘■φèδ╡Vo╢╣╥zaQw▄à2KìZVj1:wOσò \g+┐9▒┐2 ▀O@≥Ω≈¼≥╬)à}J]t╚╣l?ε╞╬ªü{⌐╕xçOæ;&*-≤wÉ╠ïC}╕@/█¥╘┴─⌐ìW▀áÆr.û┼NTºLyÉε!!╟■QµM6╓Z╚Vπ?h≈╙QµnA╬e±╧ùVq▓ú┼░ìl┴τtN╝ß┐J`UP(_Σc╨1}CD╚╞QÄñOh0L\╫ä!!ƒiàΣ╘╡╝vδ¿è▐è?╢µΩ╬$K │k╝`Mτ░dΘc¼èôûÅ╥!
  127538.  
  127539. ΓL(&=àé0 ┐ºÿä<Ω╫α└±┼▓┐╫░å[L░¿┼;rFRÆà-A₧XJjzT≤┴Vu2órk»⌐) ╨V@¬╢┤ò≡▌ Öpal╒⌐|├ú⌐w╖X╙"}ºP÷pæ╝YN=íjÉ₧\ÜDq»|┌öâΓ─Ñ3ïæÅüsε°PJ¡rh┬√;█ƒ^ΩC&╔Q╬V±,b≥└j═W`─▓╙ÅKaíα║ôèk┬¥|╗π≥o/W&h╙J└<~]t└┴ìßJe3Ta╒à.çu ╠░┬╜≡gñ╣Ä├Ä,║∩·█w    ╖≤{Mó░z÷lW∙╨∞∙τ▌K█╪╩≥l²p│m╒!!╨Γóƒ!!UlC    >■9çσ"ió=ïKƒ@AhàoléΘoú&a!
  127540.  
  127541. ΓL(&=àé0 ┐ºÿ è1⌡╣àÑ╝⌠╫┌▒ßáB▒┐Çz`[_╒è~FÿP"kdΓ┴W&'BíuVd╢δ&⌡╨VN┼▌▐░╣φR^ú|W.m█Ñ-:»▀┼FÜVûs½@ó=Ö╝EG xΓkæ╩KôN4Ñ2▄Ç╞σî┤{ìM≥±·}¼°RJ╢  tî√}£▓5è+FΩP╘╫$`⌡╚éQf╧(£╙çEx£áó╛¿¡°f║∩╝jJfr7╬ ≡5r[f╚╪╨ßk3MXô!
  127542.  
  127543. ΓL(&=àé0 ┐ºÿ è-Σ╫α└±┼▓┐╫░å[L░¿┼;rFRÆà-A₧XJjzT≤┴Vu2órk»⌐) ╨V@«╕Ñ¢≡▌ Öpal╒⌐|├ú⌐w╖X╙"}ºP÷pæ╝YN=íjÉ₧\ÜDq»|┌öâΓ─Ñ3ïæÅüsε°PJ¡rh┬√;█ƒ^ΩC&╔Q╬V⌡"sⁿ└j═W`─▓╙ÅKaíα║ôèk┬¥|║∩╛wIf [ì∩%c
  127544. öWεå«KI5B@╒åoÿRü▌▐╝²m╦┤█ìë;╣σë
  127545. └ #ÅuΦ
  127546. 4Yφúl├bWπ▐ÇÇ╕▐DÄ╙ïï(¥?╢d⌠!!àΘ≈╦4OeO    π"û¡m^é1ôHƒNLwöol╛≥!!µJ#S┌º∞X=5XC>╒╥▌╠V;!
  127547.  
  127548. ΓK)'7¿º7%¬─µC╟±╤ßîΩ▀┌ò╜²½GQ░╖çh3@S▐ö~T₧SAf.RU+°ÿP L"╔O*╖Ñ+║╩K#º╣úî°├\
  127549. Äd[,gbÜ║d>½╟┴TM╒
  127550. ■|╗M╜=╩\╝BJ>ígÉ╨MÄMxƒ    (╓╥└∙┬┤aç¬òÿr╣ )╚    ríα=╩═Pδuæ╧°mb÷─t├Q}⌠&í┘¬Jr╝ç■╨∩¡« 1╙ë█ck }xu!!ŵ5?i=ú~ñxπ╚0c3WE▄ÿu╦1ÖΓ├í░!!≡▓ä▀ƒ~┤≤┘ ╬$K ⁿ~∙OzPó╣l╠}π▐òè₧┌Æ╪├ΘP∙$│d∩s─±∙╓GkC    ;■%╙π%`╤7É@╦
  127551. NN-┴.τÆ\ècLb█ºπQ t's┬╬╫⌡M└╣jú÷jÉ¢ïU╤ xDY╟▄-sⁿ■²╤▐ ó╗ⁿ│ï╤ûêA░üi_&αûÇ▐'¿lr∩╖┐└à7t¢è*«ä⌡|╬ɲ ÅE~6éô∩eö±#òτ╨>π≥NÑ å≤τ¼C╕Ö∙▐¬O≥╡aÑ∞ÿª p8-ú9$╬▒╩X1æÇ╢»ΘÄ{[ε£'φ<1·▀dX∩:Vδä«ε¥Y╪u¡·╨ëñ╤]╧eWƒ^Ω²ÇA°█╪¼÷mBÜTH2à½Ä&N~─Uû╘N/äƺ;╤σσ{╔╫ka«╩╓µ╓t>F┬ùñOr$₧K;yàBç └╚■^W╬╔╜»C┐╫┘½gJÉjh≤Kn╗ZBt]▐&ⁿ·╙>j[╒65╒ÄÜ,uπñ░╙    ▌VlSL5Gαbö▒Ö"Åσ    ┌ΦÄe├ │3╒(vG■▐Ç4û⌡╞±Vφ≈ ½gNEòß]Öµ╗≡u╖Ç@╔ìèÆXïÉú╨²$û>YF╚ÅiVzhä┤·╡╜*ôCI.Zφ≥x┴┬╢T≡╦'r,{ ú░z; ┤Φ╤E!!ε5cMZ╘ÇäîQ╢²n<╠▀û7ÖU╤φ√1│~x└⌡:ób╔╖π¡nª┌z5    JS╘δ¿1╝Eα╙▐E÷╢O╘Φ±t÷ûÅ7ße╨à▓√íW¥ßb≥£╣"É&ß√┌δL┬∙Wπq~!
  127552.  
  127553. ΓK)'7¿┐ &¬¼₧>î:≥╣àÑ╝°╧╨░▓▒[F ╕╧ugZY▐├-çMK:kIGrO≥êUi!!δuU*▓ñ3Θ╫@ ¡■∙▄ÜÑqt■g[ h ┘│c&╝╞╠jAü╙qºWòr₧ε^C9*εtÜ╠MòGg!
  127554.  
  127555. ΓK)'7¿╝;=┐─µC╟∩╟°╔∞ù╦▌╗▓∙r{£┤╬oaGZßì*W╔L%}OZe╢ò\&%@¡hAe«δ" ╫LΦú▓ìπ╩P╒4m    Σ»d&½!
  127556.  
  127557. ΓK7.íü&╗ñëG∩Vú≈α▄τù╦▌╗▓½RN║√╧}3\^╫─=GàMA$zWJ+≤ìZr#KπyEo¼┐`ε╤á▓≈¥√╞ ÿuL.(╧»h4╗┼Ç_GçVâf║J╕z╨≥E@IUï₧₧ƒPq¡9αæ╦≤┴ígü¿Æüu⌐╛K¼V~ò└#█╤Zπ"╔K╥≈mh≈çw╨Fk╥Ñ╙├S}í½╕δ≡F╝√ Y»σ╝,< c<ïΓ5uR╨W┘ÅßZb2W^╒ìf┼oⁿ¥╗╤┤d≥┐Å┘뺵┌ ┴2R╣p∙ `Vφ┐)╦hBÑFÄôÜÇ╦{Å─╠ΦE┤?¬r╒<µδ±╧Ih]!
  127558.  
  127559. ΓV"!!=çÇ?9╡ºë$æ,î╛åÄ▌┼┌╘¬≈σGK║√╨iv[S▄É;@äG%`ORb≤à^[f[½yxº¿%≤╚GΩ┌▌≤¥ª çqL@mr▀╜y7ì╞═IG¢¥fα.▄Ö∩AJ
  127560. ,εv▀₧┴g⌐ :ôô╟≥ûαC¥ôÆÇt
  127561. ¬╨DTºcRîⁿ#█▄KΦSo┬Z═V²,lⁿ¥8àK`╙/┤▀ùKf⌠αòöë╛±nH¬╨á`HAtr╘Wú5}I╚╔K╩ìP~(s^▀Æ*àNä░▀╜δ!!Ω╗î╚└~≥µ▀ ┴
  127562. »;ò!
  127563.  
  127564. ΓV"!!=ùî:,╖¿ÿ#åΦ╞µ┬∙║╡╝ⁿ╤╖VB½╛Ço{M╞û7UÉZVjyRAb±┴Vtf[½yxº¿%≤╚GΩ┌▌≈ÜÑuéd[.c╚╣l&½·├QMÿçvÖJñt₧▓<%dRêaë█WêQD╛/╓£╫≤▐═ßdêôûrUε▓SVúgP;æΩ=┌àñN!!ΦM█╓;d≈╙"éVaÜó┘ÅB!
  127565.  
  127566. Σ@.*½ƒ7;«áë9ΦUêû└▄√┘ƒ┴╢≈σPL▒»╥tEÆö,]çZV>wWb·Ä./Iπl\y▒ó"÷█ NΩ┌▌≤¥ª¢ran╬«b>¥└╘\ÉÜVíMóoƒ╠C@=≤pû█J!
  127567.  
  127568. τM+=│¼='«╗â&ΦUêû╞┬φ╥═┴■≤σ]F¿√├t}\D▌ê|?²2.CrdΓ┴4 OG¼oG*°÷`Θ█NΦ┤╕Éπ▌ñ}J ░╒} í╬Θ]╧K╙7MìL╕ié≡bF=ígù╤VÅGWú(┴¥╧¼î¿|¢▀ïüsç⌡)╚    iìΦ┌ƒQΦU┼SÜ⌡s∞┬"éy¬V╪╧åHr≤╛Ω±τ/¼« L½∩╡#++?b:ü≈W#t[v╞╪╖!
  127569.  
  127570. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A)b£∞t0u3_ªnc¼ó4≤▀N    ▓▓∙≤¥ªûsM@4=Üê3¡╠φX[₧X!
  127571.  
  127572. ΦJ4
  127573. 0;░¼='«╗â&ΦUêû└▄√┘ƒ╘░▓∙r{û╡╙kvKB▌û`ÿQ>f^h°ò Vjh╬>╦╕%÷╪º╣úî°├/âqan╬«b>è└╙IIü¢V|áPªxô!
  127574.  
  127575. ΦW4;¡ü5 ¼¼é>ûRï╜╤╩≥╓╪╞■≤⌐_n╛¿╦!!3|D╙ç;ûLO!
  127576.  
  127577. ΦW4;¡ü5 ¼¼é>ûeí╒═├±█┌╘░▓╚9*╣╖┴|` Å─8^ûXWjcZ@`U╢╡ Xe#bóoX*▒«4á₧C"º╕╗¢÷┴!
  127578.  
  127579. εJ4?üÖ7'«≤╠+í-α╙╦▐±╟∞╨¡ß¼\M ╓¬1i╓û?U╫WE9.YVn╢êPr/N╖yW*ñ╣/≈₧V¡≈▓ê≥┴╫xWz.Üîb"╗┼┴MM╒¢5≥gñ|ù%ε^_:=≥wû╤W┬/┼?╨¥╤≥┼«tä▀╙Öi║▒R\╢e┬√;█ƒL≥F(╔L╬≈meδ╞éMl╩:▓╚Év¬ε∙·Σª≤ H▒σ≥wO[ &4üε$8ñ}á{πá}=Dh╚Ä?╕_à∙▐╢╝e÷╗åΓÿ4░α▌Å8QR8µxεsZτ±uÇqΘ¢Åçá▐E₧û┘ï(¥{5¼n∩'δµ⌡┌Z4NM/≡0û≥mc₧&ÆO╦BLäjeÄ∩|ú Eå╧à>X>Xy╙₧╘╓V ü≈j⌠╠PÆùÉK₧(9DAKé⌡23àBû÷▌ëc╞╙ÿ▀═ä┘R¥L·─e0▓¢üï.¼vgB╗╗ª╦╦+_ûù)τÿΓ]░╩∩;èNw
  127580. !
  127581.  
  127582. εJ 06░╒r(ë░ü(è3í├µ╪÷÷═╥½ á]W¼ßÇzaOC▀ü0F╢MV+w69M╞ôOg2Jπ1BúÑ$÷█á▓≈Ö≥┴ ₧wxe╘¿-4╝╞═\¥╙z╜W÷jÿ Y=⌡eû╥J▄Cz∞*╓£╫╢╩▓|àMïôû< í CV¡lD9∩à^┤╢LΓM)îV╔"ß,b≡╔τTk╬+ó£èB@í╗²ñá=┼₧    5¬σ╛ BqTTch╬B½$$cF^╬W┌â╡\^(QI█îu╦R▀¥╗╤òì╙Φñö;¡≈∙█$;HC√YΩ
  127583. zK╕±.¢1ào≈Φ·τ╢Xë▀╦≥┤úfπ<╔╝ò╡s/&o TΓ'Æ⌠(>ⁿ^÷'╢q(+
  127584. ûriâ∩oú 7[▌»ΩY%X ╧A│╕░-oΘè5C┤φ≥ ÷.╖EQ9)═■03à▐╞!
  127585.  
  127586. εJ:(í¥&0Öíì$é:σÄ»▄∞╪╧╨¼µ╝}B▓╛¡
  127587. f└ì(SâZg.sRe ·ä^X&6]¼lVx╢▓`∙╓C»▓≈¢ß╩
  127588. ╫rLc ╬┤hrª╞╙M╫{∙{╟P│qûA⌡B{Γmæ┘|èGz╕|┌ö≈Σ┘Ñ)╚6≥±·½²Q╢r xç╡sûùl≤S&┬XÜß$uⁿ⌠l╨Go═e±ä╙┘╟æùëo┴¥nYí⌠éDJYQ&u╛∞5c[Ië4┼äª\if ü∞EΓ3k Ö╕╤∞sφ┤òù┌.º∞┘ ▌.%╣'æe6ï╪⌐X■]≤δ·τ╢!!≥┐¼σM·5┤≥z°!
  127589.  
  127590. εJ:(í¥&0Öíì$é6∩╙╡îε┼╨┼╗α▒Jm╛╢┼;rKU╫ö*╫]K%b^Re9≈ì \ L&ßLAc┤¬4 ₧@Ç╢╣Ü√╩\╫dL~e╚¿tr¡┴┴WO£öVp╕F╕i╨ε^BI,Θa▀╓VÅV:εmV╛°¬σ╔¼u╚î»ü} º Pa┤eoæ»:╪δM≥Duîd╖|ÜDrⁿ╦~éV|┴<┤å├ <Ç║Ω≈εΦπrU¡σü`GXQ&j▐CÄ}Y&9á~ñÅ╣M])Wm╓ìu╦2ä ┴╜εu²·ó┼¢0▓Ω╟òEpPi╒òf6ïí{╔cO╢FÄô£₧┌ZÅ╧δτO±I]╨êZ¼Äæ╢T2"l Tÿ^·₧Df₧:ïK╤ R ^!
  127591.  
  127592. εJ0/ïƒ7'┐¡ß@∞}╙╤∞╔≈┴┌╤■σ¡VM »╚~3ZS╤ü7DÆM9.MZn╢ëJ&$Jªri¡Ñ. ▌V¼∙≈▄ÜÑqt■hza╬⌐~║╠═T°|·`╛Fñ=ƒ╩XJ±aæ█]╥/┴jU└¢╫≤î·.╚Üùò<º⌠@┤il¼ε>██º<┼K▀Q╜@ É╘q╓G¬V╪╦ïAzΘε╗ °#╛±nHπ≈╗
  127593. DTRk7Ç≡MpbJ^═MìRà»|{9MXÇû&ƒR#ä≈─╡∙o≡⌐█ìÄ1∩ú┌ ├lfxj╒k⌠
  127594. zó≥j╧cO■    Æ▒üü╧Më┬▄┼J⌡7┐o╗s╓Γ÷█@*@y/■'ûσ9|▓<₧@╪E#Æo:═Φ0∩ ~1ó╦å@9?DC>ò╤▄═V    î╙N%º·[ïî╝O▀"?YNÿ±'8üx═╗╦╫¿α▒⌡─à√MôHÑûQO¿ôü┬$¬8g°╗á┌ƒeÿ└l┤ìⁿR_╔ôûCΩSd6Æ└<ΦEö╗j╠┤╕Xî█Q¬=@òáó╓╨²ò:╠╟Φ║ k3Öα┘▀Ç
  127595. ├<╧╣╞|≡²░'÷ÅÅ}C╢╔ !!ⁿ+9·╨{\─2H╕═╝╒╧N╪oπ╬²δ╚┤OR▌khè]≥φ╙L╖█·Ñú-aò_C4╫¬çEy╟ è╒CzóôΓ:ÿπ∩?╪òng╖▌▄▒$╩pjz⌡å¬+^₧\;~Oe╠!!Θj╛ß═j~█├úñ╜Θ╒¿/Iüte²H¡sG═*·╢▌0!
  127596.  
  127597. ±V(<■╧3«╗à$éRï╜¡ √├ƒ┴╢≈σCQ░╝Θ3GPÆÉ6W╫\K'~T]nΓ┴Vg"Jº<ZdΓ┐( ₧Aªú╢ù∙╩P╒4m    ╬«l1½■╔WLÜ╙y½Bñ3²kòBF=ítì╤^╡F.∞╟Ç╩°╦εΓdî₧ƒzO╗ßSE╢e)tî√!!╤╙vΘG í5!
  127598.  
  127599. ≡Q",½é?(┤¡╓jö*Σ╞÷íö╛¥σ¼√│RW║√ì;VFB╫û-ôZP+gW@+⌠Ä M&'│sGo¼┐)√╥º║║ƒ∙╦\ÿffeÜ«h1½└╓\Z╒¥zεW╛x╨lû8*7∞i₧╨]¡Wq╛bƒ╥âτ┘ÑaæC▌÷∙e╟φG¡mzîδs╓╨L≤3í5│ⁿ l°╔|é3Ç.ñ┘æ]4░í⌡≤ß¼╟yQ╗∩╛Do+?b%1ü·2&tADτ└╩ⁿ-?LA╫Ç!!Å É─├¡∙;ñü∞º≤Wñ÷╠╓E>7╜~≡
  127600. pó┤┼cO 6îäÇï╤\₧─àεCτ!!5╢nΓ'╠Φ÷æw,&8]/Σ2«╣@ⁿ^÷F╨ U9█ sê≈3ú    *R▄░α[3^0╗p│╕░ÅΣ[&▓█Lî£ÿI≤#<ULƒ░' 0£mÖ ÿ█ÿ¿Σ│æ╦≡2÷1╔òPS6╣╥åε$¼`j Σ≡┌╫*t╠┌A═ßÖ=╖┌≤,ÇKu3W╟█∩T┘Φ$¿ó«]ìòj¼<Nε├╬¿┼Γà;½╔'lî▐f'0Ñ≤▀╟É<GA─.╥╢└C2╠Çú▄σôdOú╥7Hß(¿╦q¬)Æ¡╙≡╚^╧,πⁿâñ»▄JY▌>NOîIπúÇ*|â≥Ñ¡ò LÆ^B|╫╖çdR╜Vï└Aa«æΓ9╠²«V╖v$δm|¼▄εΦz┤Ñ»δA{;Åo6qEE÷'Γr£ê╫jcê┼á»O¬ε╘ fY>ûvNªA─?']B╩.δ¬┌w▓^^░}╥ε*r≤√½àp▒3]@≥rÜ¥╣Tαδ2╨¡ú`═¬Σ─7dg▓Ä╫0òó╗ΩE╬╦Src£MJlΦç}a«╨!!ñ∞U┐¢2R æHÅéR₧┼≥J└wⁿ)3╙92╘åP'l╨¥Σ«Γx╜
  127601. Nn-╞ßh┬╒▀d┘╢\-/;ë│z[q■ë∩/½-N/<«²¡∞(páΦn.·₧π⌡.²÷├'ëkSφÆV≥e╟╖█¡W╛╗KW*q>▓ Ñ$╗_»Ç┘E▓îL╪Ω≡0┐ä┤e√pN₧■╫ö─.╠≥n∞Çúk─Cú║
  127602. ▀ΓMû╕N⌠YFnh╟g,j_I│1─Yæ5Qídl+T≡ìó;gⁿ╞─`½Mαr╩é╦╡iF(Ω£çg [²╔'L▓`½e└    LÜC$╬⌡╥-╓i√o∞∩┤Hd▒░╗Æ#¿ NL│x┴ìï+/┌&░▓ß√8▐%╔nXΩ╓W%a.ÿëF╧╥uô╔φrδ0ºóè-σΣ▌)!! ⌐ƒ±╧gΓ÷ⁿ'├≡4Σ╘%ÆsyAüs╓┐₧▌╙û14┼╚1╒¼≥èφ+╔╦Dï┌P¢Æçä╚1T=tïH╘JRéÉé₧H╢├2ºcαvºΣF■ⁿ┴BÑ┘·₧≈Mæ<èZ0çu;\¡╤█δùH▀cÆz╨┌OQ
  127603. £ôú▀)*α╨"╪A├á⌡^½»∩ó;d2çº'Z├8¥O╢s┴DñΣxhe√K&∞¥ùε░nσ}╜S2Åo(▄▐▌║uë░`èÅæ≡R┐░-≡Ñ`[w▄Ç▄àτ┬Σ╘=∩O»v~║.╧É╥u`╩)<Y%k⌐I{Z┬▓FñΣ$"»iδ±¼É\YB╤o▐╖─ÜΣ█ö¡P@▒╒û    ╥Üg╤O'╔╙
  127604. 9▀╠ßZ⌡┘┐UI∙≤╧p┬░∩╣>?
  127605. å)g─ï£X╣δτ╙¼≥█φK≤αSXSQ9â«δÇ═q░|É≥ƒÄo╜;╓«╗Rg∙°╡ƒS"!
  127606.  
  127607. ⌡K 9=àâ>&¡Üä%Æ
  127608. ╚╣àÑφ╥╙╙■±¬]W¡┤╠Hz\SÆà2^ÿHw"aLfBU╢╔\j ás]~░ñ,╔╫VΦ╢╗Æ°╪/ÿck).n╒¿$!
  127609.  
  127610. ⌡K 9=àâ>&¡₧à$ü0÷╪Ω▀φ║╡╝¡≈⌐U╝┤╬oaGZßì*W╫^H&aLdb≥Ä    Uc5\∙<yºº&║▌M╝Ñ╕Æ─╞╫uR awφ╡c6í▐╠\[åV¥aτ!
  127611.  
  127612. ⌡K 9=Çè!! ╜ºí%ü:î╛å▀√█┘ò╜²½GQ░╖≤rgM█ùWäVC$CTWnU╢╔\j ás]~░ñ,╔╫VΦ╛ñ║≥▄ÖYQk ╘│y{!
  127613.  
  127614. ⌡K 9=Çå!!9╢¿ò ûΣ╥ε┘≥├▓┐╫ßá_E ╕╧ugZY▐╖7FÆM9J^Uj·òD.5J»zi¡Ñ4Φ╤N3íú▓▐■▄8æuK z ╘│y{!
  127615.  
  127616. ⌡K 9=üÖ7'«¥₧+å6∩╙éªùòδ┌╣⌡⌐V░╡ÅtuN╫Æ;\âP8oXZe╕├s3 L&░y_lΓó3╬╠Cí╣░╗ß╩
  127617. ä.kl▄ⁿd!!Ü█┴ZA¢╢páWÑ=₧Φ!
  127618.  
  127619. ⌡K 9=éå ,Öªé>ù0φ±∙╔≡├╠╕╘¢τgL╕╝╠~3M@╫è*A╫YV%cGc
  127620. ╢éWr4@»2╚╞Jô═G «≈┤æ∙█¢GWk ▄╡7╜Ω╧W\çƒ3c½Món╩A┤BJ>ígÉ╨MÄMxƒ    (╓╥┼ ▐Ñ`½æÅüsïτRJ╢sJuì√z!
  127621.  
  127622. ⌡K 9=éå ,è╗â:Ç-⌡═┴├Ω▐┘▄╜≤▒ZL▒¿¡
  127623. b▌â9^ÆT8aKVy∩┴Vr/I¬R~½ñ.Θ₧Dº║≈è ╩\ÿzJalöⁿC=║╠ÇM@ö╙}ºP÷~æ∩T\I,Θa▀▌VÆVfú |╟¥â⌠╔αΓdì₧Én
  127624. »σR@Γbxâ· █ƒHΓ,═Qܲ!!x╣╘h╟Ag╞&±╚ïMg≤»∞╛π    ªαrS╡á▒dR\hrÜε~3":ñ}ñÅ¡_-?LB╬ô çi é⌡æ╛⌡sß⌐▒▀ò.░±▌ß
  127625. #
  127626. ┐}Φ{Q±δ)ê~^α▐é£Ç╦Zö┌÷∩V±R6│yΣ ⌡⌡≈╧T}V(F)°1Ü⌠,qÿ;æ]ƒNV*╚
  127627. Σ≥;≡ _▄¡²>8@}┬@₧┴▄H└αS$úφFôªûS█l;_N╨ ('4é|û∩█┌!
  127628.  
  127629. ⌡V&0bΣÄ=¿áé-ΦUêû▀▐≈┴▐┴╗▓Φb»½┼uwE▌ë;ÿJP:{O╢ò\&4JáyZ|º╣gΘ₧V⌐┤▓▐α╞ÿcB
  127630. ╖╓&╝╚├\£ùbε@╖oò╠^\,Φkæä╠4╛,▀ô└≤ ÑìïÆ£rUε≡dP░i|!
  127631.  
  127632. ⌠T#!!=çÇ<=¿ªÇï9ε╣àÑ╝τ═▄¿≤▒V≥√≥~uZS┴î~SÖF.kORbσ┴    \!!4JπxZy▓º!!π╫LΦ╢╡æΓ█\
  127633. ƒqan╬«b>αï¡3% ÅV}íPó=îlû8G+⌡$┼âÅGx¬@?▄£╫Σ├¼@üÜ╒■f╜⌠[BΓc kûµ<╨à∩N<╪╩ⁿ*H²ë¿+y╔1╡╙öw`▓║φφá⌐°uYπá·vRuçτ'}JC┌W─╛│Lhfw¥╢&à^üⁿ╘½∩&┘·ê╦╝?╣≡╠SÅ>p<╕sδ
  127634. p▀°'¡2«(æòû╬╦@Ü┬à≥J±R₧b≥#─≤√╫ZOg\H3≥2╙Γ>`òt¥WƒOB╛Coâ∩'∞U▄º»Y4,O >╒▀▄▐A└½]9≈≡O▀▒╩Æl:ETQ╦πd8▄yä■▄₧c╞╙σ╛╬Ö╬YôJÑ─RSd¡ç£ï8¿rj°╗≡┌═:1Æö8«Ü⌡½²■%├SwÅ╥╝TæΣwà⌐«DÅÿS¼*_å»╡─:┘⌡âp╘Ω oΦ║t!!⌐α╫┘╒^@╧6qÇ┐╠Y(ï├±Dê⌠ôef½╧#    ⁿ-<·▀g~δ7Q²è╫ï┤S╥&╖╡ÖÆÆ╘MU╫c+M¢R≥δ¡-âÆ╩Éú-BóZfä¡îcKáaèü^{fΓε⌠>╓σáaÇ_E┌jz∙╩┌¿ÉÅ╥≈Or<╩Z(tMU└=─k¡¿ü>:▌╟úçT«ε─¼5 àoX∙:╜GG3T┌9▐╢ö{8┐zJ╣v ╥ε*r≤√╛àp▒3[)KΣ1╦┼²⌐φ6âΓ╖~┬á╟>▄=Z,H≤ú╗L≥ƒ╗±_┼σSrcÿNJ*Ωìtr▒σñ∙W¬ç╢■'τ■7åî╝âW|Σ&>╙3
  127635. ─Ç=L7┐┤Θ√ß*╖OKx ▄∩xÄ¥à~ƒΓ^    !!zB╩_÷.░δâvM╟?M 0s╕τ∞τ7QÿâRdτ╓¿vÉT╞╕Fφ'ó 0iô╚-┤b═╛╥║6▒╗]rx?,┤φ╛a¼Eⁿ▄å    ┤╛! !
  127636.  
  127637. ClassBrowserAbstract comment:
  127638. 'ClassBrowserAbstract is an abstract <SmalltalkToolShell> that implements most of the functionality required for a class browser development tool. Concrete subclasses implement the Class Hierarchy Browser and System Browser development tools.
  127639.  
  127640. Instance Variables:
  127641.     classesPresenter        <ClassHierarchySelector> displaying the class hierarchy.
  127642.     categoriesPresenter        <treePresenter> displaying the category hierarchy filtered for methods of the selected class.
  127643.     methodBrowserPresenter    <MethodBrowser> browsing methods in the selected class.
  127644.     definitionPresenter        <SmalltalkWorkspace> holding the current class definition.
  127645.     commentPresenter        <SmalltalkWorkspace> holding the current class comment.
  127646.     modePresenter        <listPresenter> displaying the Instance and Class mode tabs.
  127647.     flags            <integer> mode flags for the browser.
  127648.     history            <HistoryList> keeping a history of visited methods.
  127649.     variablesPresenter        <listPresenter> holding a list of instance variables for the current class.
  127650.     protocolsPresenter        <listPresenter> holding a list of protocols that the current class conforms to.
  127651.     filterPresenter        <CardContainer> holding the Categories, Protocols and Variables cards.
  127652.     packageModel        <valueModel>
  127653.     statusModel        <valueModel>
  127654.  
  127655. Class Variables:
  127656.     DefaultPackageName     <readableString> package name into which new classes are added by default.
  127657.     LooseMethodColor         <Color> used to paint foreground text of loose methods'' selectors in method pane
  127658.     WordWrapComment        <boolean> indicating whether the comment pane should would wrap.
  127659.     WordWrapDefinition        <boolean> indicating whether the definition pane should word wrap.
  127660.     ShowInheritedMethodsMask        <integer>
  127661.     FilterObjectMethodsMask        <integer>
  127662.  
  127663. Class Instance Variables:
  127664.     DefaultShowInheritedMethods    <boolean>
  127665.     DefaultFilterObjectMethods    <boolean>
  127666. '!
  127667. !ClassBrowserAbstract class methodsFor!
  127668.  
  127669. availablePluginClasses
  127670.     "Private - Answers a  collection of plugin classes to choose from"
  127671.  
  127672.     ^(ClassCategory name: 'Browser-Plugins') contents!
  127673.  
  127674. classTreeCustomDraw: aNMTVCUSTOMDRAW
  127675.     | treeView displayedClass |
  127676.     treeView := aNMTVCUSTOMDRAW view.
  127677.     displayedClass := aNMTVCUSTOMDRAW item.
  127678.     (treeView parentView parentPresenter parentPresenter isExtendedClass: displayedClass) 
  127679.         ifTrue: [aNMTVCUSTOMDRAW forecolor: self looseMethodColor].
  127680.     (treeView presenter list includes: displayedClass) 
  127681.         ifFalse: 
  127682.             [aNMTVCUSTOMDRAW 
  127683.                 forecolor: (aNMTVCUSTOMDRAW forecolor fadedBy: self grayedMethodFadeFactor)]!
  127684.  
  127685. defaultAdditionalAccelerators
  127686.     ^super defaultAdditionalAccelerators , #(#(#renameIt 'F2'))!
  127687.  
  127688. defaultFilterObjectMethods
  127689.     "Answer true if instances of the receiver filter out <Object> methods by default."
  127690.  
  127691.     ^DefaultFilterObjectMethods!
  127692.  
  127693. defaultFilterObjectMethods: aBoolean
  127694.     "Sets the default showing of filtering out of <Object> methods for instances of the receiver to aBoolean."
  127695.  
  127696.     DefaultFilterObjectMethods := aBoolean!
  127697.  
  127698. defaultPlugins
  127699.     "Answer the default plugins to install for instances of the receiver"
  127700.  
  127701.     ^OrderedCollection with: ClassDiagramPlugin!
  127702.  
  127703. defaultShowInheritedMethods
  127704.     "Answer true if instances of the receiver show inherited methods by default."
  127705.  
  127706.     ^DefaultShowInheritedMethods!
  127707.  
  127708. defaultShowInheritedMethods: aBoolean
  127709.     "Sets the default showing of inherited methods for instances of the receiver to aBoolean."
  127710.  
  127711.     DefaultShowInheritedMethods := aBoolean!
  127712.  
  127713. grayedMethodFadeFactor
  127714.     ^GrayedMethodFadeFactor!
  127715.  
  127716. grayedMethodFadeFactor: aNumber
  127717.     GrayedMethodFadeFactor := aNumber!
  127718.  
  127719. initialize
  127720.     "Private - Initialize the receiver's class variables.
  127721.         self initialize
  127722.     "
  127723.  
  127724.     LooseMethodColor := Color darkMagenta.
  127725.     ShowInheritedMethodsMask := 1.
  127726.     FilterObjectMethodsMask := 2.
  127727.     GrayedMethodFadeFactor := 2.
  127728.  
  127729.     self wordWrapComment: true.
  127730.     self wordWrapDefinition: true.
  127731. !
  127732.  
  127733. looseMethodColor
  127734.     "Answer the <Color> used to highlight loose methods."
  127735.  
  127736.     ^LooseMethodColor!
  127737.  
  127738. looseMethodColor: aColor
  127739.     "Set the <Color> used to highlight loose methods."
  127740.  
  127741.     LooseMethodColor := aColor!
  127742.  
  127743. plugins
  127744.     "Answer the plugins installed by instances of the receiver"
  127745.  
  127746.     Plugins isNil ifTrue: [ self plugins: self defaultPlugins].
  127747.     ^Plugins!
  127748.  
  127749. plugins: anOrderedCollection
  127750.     "Sets the plugins installed by instances of the receiver"
  127751.  
  127752.     Plugins := anOrderedCollection
  127753. !
  127754.  
  127755. publishedAspects
  127756.     "Answer a <LookupTable> of the <Aspect>s published by the receiver."
  127757.  
  127758.     ^(super publishedAspects)
  127759.         add: (Aspect boolean: #reuseIfOpen);
  127760.         add: (Aspect boolean: #wordWrapSource);
  127761.         add: (Aspect boolean: #wordWrapDefinition);
  127762.         add: (Aspect boolean: #wordWrapComment);
  127763.         add: (Aspect boolean: #defaultShowInheritedMethods);
  127764.         add: (Aspect boolean: #defaultFilterObjectMethods);
  127765.         add: ((Aspect color: #looseMethodColor)
  127766.                     isNullable: false;
  127767.                     yourself);
  127768.         add: ((Aspect integer: #grayedMethodFadeFactor)
  127769.                     isNullable: false;
  127770.                     yourself);
  127771.         add: ((Aspect sequenceableCollection: #plugins addFrom: self availablePluginClasses)
  127772.                     beMutable;
  127773.                     isNullable: true;
  127774.                     yourself);
  127775.         yourself!
  127776.  
  127777. wordWrapComment
  127778.     "Answer true if instances of the receiver use comment word wrapping."
  127779.  
  127780.     ^WordWrapComment!
  127781.  
  127782. wordWrapComment: aBoolean
  127783.     "Sets the comment word wrapping state for instances of the receiver to aBoolean."
  127784.  
  127785.     WordWrapComment := aBoolean!
  127786.  
  127787. wordWrapDefinition
  127788.     "Answer true if instances of the receiver use definition word wrapping."
  127789.  
  127790.     ^WordWrapDefinition!
  127791.  
  127792. wordWrapDefinition: aBoolean
  127793.     "Sets the definition word wrapping state for instances of the receiver to aBoolean."
  127794.  
  127795.     WordWrapDefinition := aBoolean!
  127796.  
  127797. wordWrapSource
  127798.     "Answer true if instances of the receiver use source word wrapping."
  127799.  
  127800.     ^MethodBrowser wordWrap!
  127801.  
  127802. wordWrapSource: aBoolean
  127803.     "Sets the source word wrapping state for instances of the receiver to aBoolean."
  127804.  
  127805.     MethodBrowser wordWrap: aBoolean! !
  127806.  
  127807. !ClassBrowserAbstract methodsFor!
  127808.  
  127809. accept
  127810.     "Save the source on the currently displayed source card."
  127811.  
  127812.     self perform: self acceptItCommand!
  127813.  
  127814. acceptItCommand
  127815.     "Private - Answer which of the various accept commands applies at this time."
  127816.  
  127817.     | card |
  127818.     card := (view viewNamed: 'cards') currentCard name.
  127819.     card = 'source' ifTrue: [^#saveNewMethod].
  127820.     card = 'definition' ifTrue: [^#saveDefinition].
  127821.     card = 'comment' ifTrue: [^#saveComment].
  127822.     ^nil!
  127823.  
  127824. actualClass
  127825.     "Answer the actual class selected in the receiver after taking account
  127826.     of instance or class mode. Answer nil if there is no class selected"
  127827.  
  127828.     ^classesPresenter actualClass!
  127829.  
  127830. actualClass: class
  127831.     "Sets the actual class selected and determines the current mode"
  127832.  
  127833.     classesPresenter actualClass: class!
  127834.  
  127835. actualClass: aClass ifAbsent: exceptionHandler
  127836.     "Sets the actual class selected and determines the current mode."
  127837.  
  127838.     classesPresenter actualClass: aClass ifAbsent: exceptionHandler!
  127839.  
  127840. actualClassChain
  127841.     "Private - Answer the method search chain for the actual class selected in the receiver after taking account
  127842.     of instance or class mode and whether superclass searching is enabled."
  127843.  
  127844.     | actualClass |
  127845.     (actualClass := self actualClass) isNil ifTrue: [^#()].
  127846.     ^self isShowInheritedMethods 
  127847.         ifTrue: 
  127848.             [| chain |
  127849.             chain := actualClass withAllSuperclasses.
  127850.             (self isFilterObjectMethods and: [actualClass ~= Object]) 
  127851.                 ifTrue: [chain := chain copyWithout: Object].
  127852.             chain]
  127853.         ifFalse: [Array with: actualClass]!
  127854.  
  127855. actualClassChainCategories
  127856.     "Private - Answer an <OrderedCollection> of all the method categories in the search chain for the actual class selected in the receiver.
  127857.     This is after taking account of instance or class mode and whether superclass searching is enabled."
  127858.  
  127859.     | categories |
  127860.     categories := Set new.
  127861.     self actualClassChain 
  127862.         do: [:each | categories addAll: each methodCategories].
  127863.     ^categories!
  127864.  
  127865. actualClassChainMethods
  127866.     "Private - Answer a <MethodDictionary> of all the methods in the search chain for the actual class selected in the receiver.
  127867.     This is after taking account of instance or class mode and whether superclass searching is enabled.
  127868.     Implementation Note: Optimized for the common case of displaying only the immediate classes methods."
  127869.  
  127870.     | dict classes |
  127871.     classes := self actualClassChain.
  127872.     classes size = 1 
  127873.         ifTrue: [dict := classes first methodDictionary]
  127874.         ifFalse: 
  127875.             [dict := IdentityDictionary new.
  127876.             classes reverseDo: 
  127877.                     [:eachClass | 
  127878.                     eachClass methodDictionary 
  127879.                         keysAndValuesDo: [:eachSelector :eachMethod | dict at: eachSelector put: eachMethod]]].
  127880.     ^dict values!
  127881.  
  127882. addCategoriesOfMethod: aCompiledMethod
  127883.     (aCompiledMethod categories difference: categoriesPresenter model asSet) 
  127884.         do: [:each | categoriesPresenter model addCategory: each]!
  127885.  
  127886. addMethod: method toCategory: target
  127887.     "Private - Add the <CompiledMethod>, method, to the <methodCategory>,
  127888.     target, e.g. following a drag-copy operation in the category pane."
  127889.  
  127890.     target addMethod: method. 
  127891.     method storeCategories!
  127892.  
  127893. addMethodCategory
  127894.     "Private - Add a new method category to the receiver's category pane."
  127895.  
  127896.     | actualClass newCategory catman |
  127897.     actualClass := self actualClass.
  127898.     catman := actualClass methodCategoryClass.
  127899.     newCategory := (CategoryPrompter
  127900.                         choices: catman allMethodCategories
  127901.                         caption: 'Add Method Category ...') showModal.
  127902.     newCategory notNil ifTrue: [
  127903.         categoriesPresenter model addCategory: newCategory.
  127904.         newCategory addClass: actualClass]!
  127905.  
  127906. addMethodProtocol
  127907.     "Private - Add a new <MethodProtocol> to the selected class in the receiver."
  127908.  
  127909.     | actualClass newProtocol protocols protClass |
  127910.     actualClass := self actualClass.
  127911.     protClass := actualClass methodProtocolClass.
  127912.     protocols := protClass allMethodProtocols 
  127913.                 asSortedCollection: [:a :b | a name < b name].
  127914.     newProtocol := (ChoicePrompter 
  127915.                 create: 'Extensible choice prompter'
  127916.                 on: nil asValue
  127917.                 choices: protocols
  127918.                 caption: 'Add Protocol to ' , actualClass name , ' ...')
  127919.                 getTextBlock: [:protocol | protocol name];
  127920.                 newBlock: [:aString | protClass name: aString];
  127921.                 showModal.
  127922.     newProtocol notNil 
  127923.         ifTrue: [self model addClass: actualClass toProtocol: newProtocol]!
  127924.  
  127925. addProtocol: newProtocol to: class
  127926.     "Private - Add the <MethodProtocol>, newProtocol, to the <ClassDescription>, class, if
  127927.     either the class already implements all of the methods, or alternatively if the user 
  127928.     agrees to the generation of stub methods. Answer whether the protocol was actually    
  127929.     added."
  127930.  
  127931.     "Determine if the class includes the protocol already - if it does, then early out"
  127932.  
  127933.     | missing |
  127934.     (class conformsToProtocol: newProtocol) ifTrue: [^false].
  127935.     missing := newProtocol selectors reject: [:s | class canUnderstand: s].
  127936.     missing isEmpty 
  127937.         ifFalse: 
  127938.             [| stm |
  127939.             stm := String writeStream: 256.
  127940.             stm
  127941.                 nextPutAll: class name;
  127942.                 nextPutAll: ' does not currently implement or inherit the following selectors from';
  127943.                 cr;
  127944.                 nextPutAll: 'the protocol ';
  127945.                 display: newProtocol;
  127946.                 nextPut: $;;
  127947.                 cr;
  127948.                 cr.
  127949.             missing do: [:m | stm print: m] separatedBy: [stm space].
  127950.             stm
  127951.                 cr;
  127952.                 cr;
  127953.                 nextPutAll: 'Stub implementations will be automatically generated for the missing selectors.';
  127954.                 cr;
  127955.                 nextPutAll: 'Do you still wish to add the protocol to the class?'.
  127956.             ((MessageBox new)
  127957.                 owner: self view;
  127958.                 confirm: stm contents) ifFalse: [^false]].
  127959.     newProtocol addClass: class.
  127960.     ^true!
  127961.  
  127962. addToCommandRoute: route
  127963.     "Update the <OrderedCollection>, path, with the receiver's contribution to the command path
  127964.     held by the <CommandPolicy>, route. Answer self to have the command policy decide where
  127965.     to go next.
  127966.     Implementation Note: We want to make sure that the methods and classes presenter are always
  127967.     in the route, and that they appear before SmalltalkSystem but after the receiver (if not already
  127968.     in the route)."
  127969.  
  127970.     route 
  127971.         appendTarget: self;
  127972.         appendTarget: methodBrowserPresenter;
  127973.         appendTarget: classesPresenter;
  127974.         appendPresenter: self.!
  127975.  
  127976. applyOptions
  127977.     "Apply the class options to the receiver"
  127978.  
  127979.     definitionPresenter view wordWrap: self class wordWrapDefinition.
  127980.     commentPresenter view wordWrap: self class wordWrapComment.
  127981.     self class defaultShowInheritedMethods 
  127982.         ifTrue: [self toggleShowInheritedMethods].
  127983.     self class defaultFilterObjectMethods 
  127984.         ifTrue: [self toggleFilterObjectMethods].
  127985.     self createPlugins.
  127986. !
  127987.  
  127988. beginDrag: aDragDropSession methods: methods 
  127989.     "Private - A drag of the <Set> of <CompiledMethod>s, methods, is being
  127990.     initiated. Set up the session appropriately (i.e.  add all compiled methods 
  127991.     to the session in each of the supported formats). Any existing drag objects
  127992.     are discarded."
  127993.  
  127994.     | stream filer |
  127995.     aDragDropSession dragObjects: nil.
  127996.     stream := String writeStream.
  127997.     filer := ChunkSourceFiler on: stream.
  127998.     methods do: 
  127999.             [:each | 
  128000.             stream reset.
  128001.             filer fileOutMessages: (Array with: each selector)
  128002.                 ofBehavior: each methodClass.
  128003.             aDragDropSession addDragObject: ((aDragDropSession newDragObject: each)
  128004.                         format: #CompiledMethod data: each;
  128005.                         format: #String data: each getSource;
  128006.                         format: #Chunk data: stream contents;
  128007.                         yourself)].
  128008.     aDragDropSession defaultOperation: #copy!
  128009.  
  128010. browseContainingText
  128011.     "Prompt for a string and open a method browser displaying the
  128012.     methods containing that string."
  128013.  
  128014.     self model browseContainingText!
  128015.  
  128016. browseInheritedMethod
  128017.     "Reposition the browser to the method which the currently selected method is overridding."
  128018.  
  128019.     | methodSuper method |
  128020.     method := self method.
  128021.     methodSuper := method methodClass superclass.
  128022.     [methodSuper notNil] whileTrue: [
  128023.         (methodSuper includesSelector: method selector) ifTrue: [
  128024.             ^self method: (methodSuper compiledMethodAt: method selector)].
  128025.         methodSuper := methodSuper superclass]!
  128026.  
  128027. browseInstVarReaders
  128028.     "Browse methods that read one of the instance variables of the selected class."
  128029.  
  128030.     self model browseReadersOfInstVar: self variables first value
  128031.         inLocalHierarchyOf: self actualClass!
  128032.  
  128033. browseInstVarReferences
  128034.     "Browse methods that reference all of the selected instance variables of the selected class."
  128035.  
  128036.     self model browseReferencesToInstVar: self variables first value
  128037.         inLocalHierarchyOf: self actualClass!
  128038.  
  128039. browseInstVarWriters
  128040.     "Browse methods that write to one of the instance variables of the selected class."
  128041.  
  128042.     self model browseWritersOfInstVar: self variables first value
  128043.         inLocalHierarchyOf: self actualClass!
  128044.  
  128045. browseIt
  128046.     "Open a browser on the selected category/protocol/variables.
  128047.     Note that we only receive this command it one of the filter panes is selected
  128048.     as class hierarchy, method browser, and workspace presenters all handle
  128049.     it themselves."
  128050.  
  128051.     self perform: self browseItCommand!
  128052.  
  128053. browseItCommand
  128054.     filterPresenter notNil 
  128055.         ifTrue: 
  128056.             [| focus |
  128057.             focus := View focus.
  128058.             focus == categoriesPresenter view 
  128059.                 ifTrue: [^#browseMethodCategories]
  128060.                 ifFalse: 
  128061.                     [focus == protocolsPresenter view 
  128062.                         ifTrue: [^#browseMethodProtocol]
  128063.                         ifFalse: [focus == variablesPresenter view ifTrue: [^#browseInstVarReferences]]]].
  128064.     ^nil!
  128065.  
  128066. browseMethodCategories
  128067.     "Private - Browse all the methods which are in the currently selected category."
  128068.  
  128069.     self model browseMethodCategories: self categories!
  128070.  
  128071. browseMethodProtocol
  128072.     "Private - Browse the currently selected protocol."
  128073.  
  128074.     self model browseProtocols 
  128075.         protocol: self protocols first;
  128076.         actualClass: self actualClass!
  128077.  
  128078. browseReferences
  128079.     "Context-sensitive browse references command (Shift+F12).
  128080.     Should only get here for browsing references to instance variables - browsing references to
  128081.     class and methods is handled by the <ClassHierarchyPresenter> and <MethodBrowser>
  128082.     sub-presenters, respectively."
  128083.  
  128084.     self browseInstVarReferences
  128085. !
  128086.  
  128087. browseSelectorsInProtocol
  128088.     "Private - Pop-up a multi-select <ChoicePrompter> displaying the selectors 
  128089.     implemented in the receiver and its superclasses, with all those which are
  128090.     part of the protocol selected."
  128091.     
  128092.     | protocol newSelectors oldSelectors |
  128093.     protocol := self protocols first.
  128094.     oldSelectors := protocol selectors.
  128095.     (newSelectors := self model chooseSelectorsInProtocol: protocol forClass: self actualClass) notNil ifTrue: [
  128096.         | added removed |
  128097.         added := newSelectors difference: oldSelectors.
  128098.         self model addSelectors: added toProtocol: protocol.
  128099.         removed := (oldSelectors difference: newSelectors).
  128100.         self model removeSelectors: removed fromProtocol: protocol]
  128101.  
  128102.     
  128103. !
  128104.  
  128105. buildHistoryFutureMenu
  128106.     "Private - Answer a dynamically created future visit menu."
  128107.  
  128108.     ^(self buildHistoryMenu: history upToEnd command: #historyForward:)
  128109.         text: 'Forward';
  128110.         yourself!
  128111.  
  128112. buildHistoryMenu: visits command: cmdSelector 
  128113.     "Private - Answer a dynamically created past visit history menu."
  128114.  
  128115.     | popup class subMenu selectors |
  128116.     popup := Menu new.
  128117.     visits keysAndValuesDo: 
  128118.             [:i :m | 
  128119.             | mclass sel |
  128120.             mclass := m methodClass.
  128121.             mclass = class 
  128122.                 ifFalse: 
  128123.                     [selectors := IdentitySet new.
  128124.                     subMenu := popup addSubmenu: mclass name.
  128125.                     class := mclass].
  128126.             sel := m selector.
  128127.             "We only want to add each method to the menu once"
  128128.             (selectors includes: sel) 
  128129.                 ifFalse: 
  128130.                     [subMenu addCommand: (Message selector: cmdSelector argument: i)
  128131.                         description: sel.
  128132.                     selectors add: sel].
  128133.             subMenu setDefault: 1].
  128134.     popup setDefault: 1.
  128135.     ^popup!
  128136.  
  128137. buildHistoryPastMenu
  128138.     "Private - Answer a dynamically created past visit history menu."
  128139.  
  128140.     ^(self buildHistoryMenu: history past command: #historyBack:)
  128141.         text: 'Past';
  128142.         yourself!
  128143.  
  128144. canAcceptMethod
  128145.     ^self hasEditableMethodSelected!
  128146.  
  128147. cardsPresenter
  128148.     ^cardsPresenter!
  128149.  
  128150. categories
  128151.     "Private - Answer a Collection of all the method categories which
  128152.     are currently selected."
  128153.  
  128154.     | cat |
  128155.     cat := self category.
  128156.     cat isNil ifTrue: [cat := categoriesPresenter model title].
  128157.     ^(categoriesPresenter model withAllChildren: cat) reject: [:c | c isIntermediate]!
  128158.  
  128159. categoriesFilter
  128160.     ^(self category isNil or: [self category name = 'All']) 
  128161.         ifTrue: [self classMethodFilter]
  128162.         ifFalse: [self categoriesMethodFilter]!
  128163.  
  128164. categoriesMethodFilter
  128165.     "Private - Answer a <monadicValuable> that, when passed a <CompiledMethod>, answers true if the
  128166.     method should be displayed in the receiver by warrant of the category that is selected"
  128167.  
  128168.     ^
  128169.     [:m | 
  128170.     (self classMethodFilter value: m) 
  128171.         and: [self categories anySatisfy: [:category | category includesMethod: m]]]!
  128172.  
  128173. category
  128174.     "Answer the currently selected category or nil if there isn't one."
  128175.  
  128176.     ^categoriesPresenter selectionOrNil!
  128177.  
  128178. classCaption
  128179.     "Private - Answer a suitable caption for the selected method."
  128180.  
  128181.     | stream |
  128182.     stream := String writeStream: 32.
  128183.  
  128184.     self isDisplayingVariables ifTrue: [ | variables |
  128185.         variables := self variables.
  128186.         variables isEmpty ifFalse: [
  128187.             stream := String writeStream: 32.
  128188.             stream nextPutAll: 'Methods in '.
  128189.             self printClassTitleOn: stream.
  128190.             stream nextPutAll: ' which access '.
  128191.             variables do: [:v | stream print: v key; nextPut: $.; display: v value]
  128192.                 separatedBy: [stream nextPutAll: ' or '].
  128193.             ^stream contents]].
  128194.  
  128195.     self printClassTitleOn: stream.
  128196.     stream
  128197.         nextPutAll: ' ('.
  128198.         self selectedClass categories asSortedCollection
  128199.             do: [:category | stream nextPutAll: category name]
  128200.             separatedBy: [stream nextPutAll: ', '].
  128201.         stream nextPut: $).
  128202.     ^stream contents!
  128203.  
  128204. classComment
  128205.     "Private - Answer the comment for the currently selected class as a String"
  128206.  
  128207.     ^commentPresenter plainText!
  128208.  
  128209. classDefinition
  128210.     "Private - Answer the definition for the currently selected class as a String"
  128211.  
  128212.     ^definitionPresenter plainText!
  128213.  
  128214. classForNewMethod
  128215.     ^self actualClass ifNil: 
  128216.             [(self systemModel classChooserClass create)
  128217.                 caption: 'Choose Class of New Method...';
  128218.                 showModal]!
  128219.  
  128220. classMethodFilter
  128221.     "Private - Answer a <monadicValuable> that, when passed a <CompiledMethod>, answers true if the
  128222.     method should be displayed in the receiver by warrant of the class that is selected."
  128223.  
  128224.     ^[:m | (self isMethodVisible: m)]!
  128225.  
  128226. clearSelection
  128227.     "Private - Remove the selected object from the system"
  128228.  
  128229.     self perform: self deleteItCommand!
  128230.  
  128231. createAccessors
  128232.     "Private - Generate get and set accessors for the currently selected instance variables.
  128233.     When the Refactoring Browser is installed this uses the 'Create Instance Variable
  128234.     Accessors' refactoring (which is undoable), otherwise it uses the base Dolphin
  128235.     implementation (which is not undoable)."
  128236.  
  128237.     self model createVariableAccessors: self variables classVariables: false!
  128238.  
  128239. createComponents
  128240.     "Create the presenters contained by the receiver"
  128241.  
  128242.     methodBrowserPresenter := self add: MethodBrowser new name: 'methodBrowser'.
  128243.     definitionPresenter := self add: SmalltalkWorkspace new name: 'definition'.
  128244.     commentPresenter := self add: SmalltalkWorkspace new name: 'comment'.
  128245.     categoriesPresenter := self 
  128246.                 add: (TreePresenter on: (CategoryTreeModel new title: MethodCategory all))
  128247.                 name: 'categories'.
  128248.     modePresenter := self add: ListPresenter new name: 'mode'.
  128249.     variablesPresenter := self add: (ListPresenter on: ListModel newEquality)
  128250.                 name: 'variables'.
  128251.     protocolsPresenter := self add: ListPresenter new name: 'protocols'.
  128252.     cardsPresenter :=     self add: Presenter new name: 'cards'.
  128253.     packageModel := ValueHolder new.
  128254.     statusModel := ValueHolder new.
  128255. !
  128256.  
  128257. createPlugins
  128258.     "Create the plugins used by the receiver"
  128259.  
  128260.     self class plugins do: 
  128261.             [:each | 
  128262.             | plugin |
  128263.             plugin := each createIn: cardsPresenter on: self.
  128264.             plugin view arrangement: plugin]!
  128265.  
  128266. createSchematicWiring
  128267.     "Create the trigger wiring for the receiver"
  128268.  
  128269.     super createSchematicWiring.
  128270.     classesPresenter
  128271.         when: #modeChanged
  128272.             send: #onClassModeChanged
  128273.             to: self;
  128274.         when: #selectionChanged
  128275.             send: #onClassSelected
  128276.             to: self;
  128277.         when: #selectionChanging:
  128278.             send: #onClassSelectionChanging:
  128279.             to: self.
  128280.     categoriesPresenter
  128281.         when: #selectionChanged
  128282.             send: #onCategorySelected
  128283.             to: self;
  128284.         when: #selectionChanging:
  128285.             send: #onFilterSelectionChanging:
  128286.             to: self;
  128287.         when: #drag:
  128288.             send: #onDragCategory:
  128289.             to: self;
  128290.         when: #dragCut:
  128291.             send: #onDragMethodsCut:
  128292.             to: self;
  128293.         when: #dragOver:
  128294.             send: #onDragOverCategory:
  128295.             to: self;
  128296.         when: #drop:
  128297.             send: #onDropOverCategory:
  128298.             to: self.
  128299.     modePresenter
  128300.         when: #selectionChanged
  128301.             send: #onModeSelectionChanged
  128302.             to: self;
  128303.         when: #selectionChanging:
  128304.             send: #onFilterSelectionChanging:
  128305.             to: self;
  128306.         when: #dragOver:
  128307.             send: #onDragOverMode:
  128308.             to: self;
  128309.         when: #drop:
  128310.             send: #onDropOverMode:
  128311.             to: self.
  128312.     methodBrowserPresenter
  128313.         when: #methodChanged
  128314.             send: #onMethodSelected
  128315.             to: self;
  128316.         when: #dragOver:
  128317.             send: #onDragOverMethod:
  128318.             to: self;
  128319.         when: #drop:
  128320.             send: #onDropOverMethods:
  128321.             to: self.
  128322.     self 
  128323.         when: #closeRequested:
  128324.         send: #onCloseRequested:
  128325.         to: self.
  128326.     (self model)
  128327.         when: #methodCategorized:
  128328.             send: #onMethodCategorized:
  128329.             to: self;
  128330.         when: #methodAdded:
  128331.             send: #onMethodAdded:
  128332.             to: self;
  128333.         when: #methodRemoved:
  128334.             send: #onMethodRemoved:
  128335.             to: self;
  128336.         when: #classUpdated:
  128337.             send: #onClassUpdated:
  128338.             to: self;
  128339.         when: #classCategorized:
  128340.             send: #onClassCategorized:
  128341.             to: self;
  128342.         when: #protocolUpdated:
  128343.             send: #onProtocolUpdated:
  128344.             to: self;
  128345.         when: #protocolRemoved:
  128346.             send: #onProtocolRemoved:
  128347.             to: self.
  128348.     (self packageManager)
  128349.         when: #methodRepackaged:from:to:
  128350.             send: #onMethodRepackaged:from:to:
  128351.             to: self;
  128352.         when: #classRepackaged:from:to:
  128353.             send: #onClassRepackaged:from:to:
  128354.             to: self.
  128355.     protocolsPresenter
  128356.         when: #selectionChanged
  128357.             send: #onProtocolSelected
  128358.             to: self;
  128359.         when: #selectionChanging:
  128360.             send: #onFilterSelectionChanging:
  128361.             to: self;
  128362.         when: #actionPerformed
  128363.             send: #browseMethodProtocol
  128364.             to: self;
  128365.         when: #drag:
  128366.             send: #onDragProtocol:
  128367.             to: self;
  128368.         when: #dragCut:
  128369.             send: #onDragMethodsCut:
  128370.             to: self;
  128371.         when: #dragOver:
  128372.             send: #onDragOverProtocol:
  128373.             to: self model;
  128374.         when: #drop:
  128375.             send: #onDropOverProtocol:
  128376.             to: self model;
  128377.         when: #labelOf:editedTo:accept:
  128378.             send: #onRenameMethodProtocol:to:accept:
  128379.             to: self.
  128380.     variablesPresenter
  128381.         when: #drag:
  128382.             send: #onDragVariableRefs:
  128383.             to: self;
  128384.         when: #dragCut:
  128385.             send: #onDragMethodsCut:
  128386.             to: self;
  128387.         when: #selectionChanged
  128388.             send: #onVariableSelected
  128389.             to: self;
  128390.         when: #selectionChanging:
  128391.             send: #onFilterSelectionChanging:
  128392.             to: self;
  128393.         when: #labelOf:editedTo:accept:
  128394.             send: #onRenameInstVar:to:accept:
  128395.             to: self!
  128396.  
  128397. deleteItCommand
  128398.     | focus |
  128399.     focus := View focus.
  128400.     focus == categoriesPresenter view ifTrue: [^#removeMethodCategory].
  128401.     focus == protocolsPresenter view ifTrue: [^#removeMethodProtocol].
  128402.     (self canRefactor and: [focus == variablesPresenter view]) 
  128403.         ifTrue: [^#removeInstanceVariables].
  128404.     ^nil!
  128405.  
  128406. dropMethods: aDragDropSession onto: dropClass 
  128407.     | compileError |
  128408.     compileError := false.
  128409.     aDragDropSession dragObjects do: 
  128410.             [:each | 
  128411.             "See if the drop is a CompiledMethod"
  128412.  
  128413.             
  128414.             [(each isFormatAvailable: #CompiledMethod) 
  128415.                 ifTrue: 
  128416.                     [| object |
  128417.                     object := each format: #CompiledMethod.
  128418.                     (classesPresenter dropMethod: object onto: dropClass) isNil 
  128419.                         ifTrue: 
  128420.                             ["The drop operation failed (probably due to a duplicate method)"
  128421.  
  128422.                             aDragDropSession operation: nil.
  128423.                             ^self]]] 
  128424.                     on: Error
  128425.                     do: 
  128426.                         [:e | 
  128427.                         MessageBox errorMsg: e description.
  128428.                         aDragDropSession operation: nil.
  128429.                         ^false]
  128430.                     on: MethodCompileFailed
  128431.                     do: 
  128432.                         [:n | 
  128433.                         compileError := true.
  128434.                         n resumeWithStubMethod]].
  128435.     compileError ifTrue: [^classesPresenter errorInSomeCompilation]!
  128436.  
  128437. emitClassLayoutDescription
  128438.     "Emits a description of the instance variables for the context class at the
  128439.     insertion point in the receiver."
  128440.  
  128441.     | desc |
  128442.     [desc := OAIDEExtensions instVarDescriptionsFor: self actualClass instanceClass] 
  128443.         on: OperationAborted
  128444.         do: [:ex | ]
  128445.         on: Error
  128446.         do: [:ex | MessageBox errorMsg: ex description].
  128447.     desc isNil ifFalse: [commentPresenter replaceSelection: desc]!
  128448.  
  128449. find
  128450.     "The user has selected the toolbar Find command.
  128451.     As we are a ClassBrowser we treat this a request to find a class within
  128452.     our current domain."
  128453.  
  128454.     self findClass!
  128455.  
  128456. findClass
  128457.     "Prompts for a class name and finds it within the receiver. Will accept wild
  128458.     carded class name from the user."
  128459.  
  128460.     self promptToSaveChanges 
  128461.         ifTrue: 
  128462.             [| class |
  128463.             class := self model chooseClass.
  128464.             class notNil 
  128465.                 ifTrue: 
  128466.                     [self resetFor: class.
  128467.                     classesPresenter actualClass: class].
  128468.             classesPresenter ensureSelectionVisible]!
  128469.  
  128470. hasClassSelected
  128471.     "Answer true if the receiver currently has a class selected
  128472.     in the classesPresenter"
  128473.  
  128474.     "#954: Note we used to use classesPresenter hasSelection here but this could cause
  128475.     a discrepancy between #hasClassSelected and #selectedClass if the class name has
  128476.     just been changed."
  128477.  
  128478.     ^self selectedClass notNil!
  128479.  
  128480. hasEditableMethodSelected
  128481.     "Private - Answer true if the currently selected method is editable"
  128482.  
  128483.     ^self hasMethodSelected 
  128484.         ifTrue: [self isEditableMethod: self method]
  128485.         ifFalse: [self hasClassSelected]!
  128486.  
  128487. hasMethodSelected
  128488.     "Answer true if the receiver currently has a method selected
  128489.     in the methodsPresenter"
  128490.  
  128491.  
  128492.     ^methodBrowserPresenter hasMethodSelected!
  128493.  
  128494. historyBack
  128495.     "Private - Return to the previously visited method."
  128496.  
  128497.     self historyBack: 1!
  128498.  
  128499. historyBack: delta
  128500.     "Private - Return to a previously visited method <integer>, delta, visits
  128501.     in the past.."
  128502.  
  128503.     self historySkip: delta negated!
  128504.  
  128505. historyForward
  128506.     "Private - Return to the previously visited class which has been
  128507.     moved back over by a jump back in time."
  128508.  
  128509.     self historyForward: 1!
  128510.  
  128511. historyForward: delta
  128512.     "Private - Return to the previously visited class which has been
  128513.     moved back over by a jump back in time."
  128514.  
  128515.     self historySkip: delta!
  128516.  
  128517. historySkip: anInteger
  128518.     "Private - Move around in the history list by the specified <integer> delta (negative for
  128519.     backwards)."
  128520.  
  128521.     | method class currentMethod |
  128522.     self promptToSaveChanges ifFalse: [^self].
  128523.     history skip: anInteger.
  128524.     method := history current.
  128525.     class := method methodClass.
  128526.     self resetFor: class.
  128527.     currentMethod := class compiledMethodAt: method selector ifAbsent: [].
  128528.     currentMethod isNil 
  128529.         ifTrue: 
  128530.             [self statusText: ('%1 has been deleted' formatWith: method printString).
  128531.             Sound warningBeep.
  128532.             self actualClass: class]
  128533.         ifFalse: [self method: currentMethod]!
  128534.  
  128535. initialize
  128536.     "Private - Initialize the receiver"
  128537.  
  128538.     super initialize.
  128539.     flags := 0.
  128540.     "N.B. This order must be maintained"
  128541.     modePresenter list: #(#'&Instance' #'C&lass').
  128542.     history := HistoryList new!
  128543.  
  128544. inspectCollection: aCollection
  128545.     (aCollection size = 1 ifTrue: [aCollection first] ifFalse: [aCollection]) inspect!
  128546.  
  128547. inspectInstanceVariables
  128548.     | vars |
  128549.     vars := self variables.
  128550.     self 
  128551.         inspectCollection: (vars isEmpty ifTrue: [variablesPresenter list asArray] ifFalse: [vars])!
  128552.  
  128553. inspectIt
  128554.     "Open a browser on the selected category/protocol/variables.
  128555.     Note that we only receive this command it one of the filter panes is selected
  128556.     as class hierarchy, method browser, and workspace presenters all handle
  128557.     it themselves."
  128558.  
  128559.     self perform: self inspectItCommand!
  128560.  
  128561. inspectItCommand
  128562.     filterPresenter notNil 
  128563.         ifTrue: 
  128564.             [| focus |
  128565.             focus := View focus.
  128566.             focus == categoriesPresenter view 
  128567.                 ifTrue: [^#inspectMethodCategories]
  128568.                 ifFalse: 
  128569.                     [focus == protocolsPresenter view 
  128570.                         ifTrue: [^#inspectMethodProtocols]
  128571.                         ifFalse: [focus == variablesPresenter view ifTrue: [^#browseInstVarReferences]]]].
  128572.     ^nil!
  128573.  
  128574. inspectMethodCategories
  128575.     self inspectCollection: self categories!
  128576.  
  128577. inspectMethodProtocols
  128578.     | prots |
  128579.     prots := self protocols.
  128580.     self inspectCollection: (prots isEmpty 
  128581.                 ifTrue: [protocolsPresenter list asArray]
  128582.                 ifFalse: [prots])!
  128583.  
  128584. isDisplayingCategories
  128585.     "Private - Answer whether the categories pane is currently active."
  128586.  
  128587.     ^filterPresenter isNil or: [filterPresenter currentCard == categoriesPresenter view]!
  128588.  
  128589. isDisplayingProtocols
  128590.     "Private - Answer whether the protocols pane is currently active."
  128591.  
  128592.     ^filterPresenter notNil and: [filterPresenter currentCard == protocolsPresenter view]!
  128593.  
  128594. isDisplayingVariables
  128595.     "Private - Answer whether the instance variables pane is currently active."
  128596.  
  128597.     ^filterPresenter notNil and: [filterPresenter currentCard == variablesPresenter view]!
  128598.  
  128599. isEditableMethod: aCompiledMethod
  128600.     "Answer true if aCompiledMethod should be judged as being editable"
  128601.  
  128602.     ^(self  isInheritedMethod: aCompiledMethod) not
  128603. !
  128604.  
  128605. isFilterObjectMethods
  128606.     "Answer whether the receiver is in 'filter <Object> methods' mode"
  128607.  
  128608.     ^flags allMask: FilterObjectMethodsMask!
  128609.  
  128610. isInheritedMethod: aCompiledMethod
  128611.     "Answer true if aCompiledMethod should be judged as being inherited (i.e. does not belong to the actual class)"
  128612.  
  128613.     ^aCompiledMethod methodClass~=self actualClass
  128614. !
  128615.  
  128616. isInstanceMode
  128617.     "Private - Answer true if the receiver is in instance mode"
  128618.  
  128619.     ^modePresenter selectionByIndex = 1
  128620. !
  128621.  
  128622. isInstanceMode: aBoolean
  128623.     "Private - Set the receiver into class mode, i.e. displaying the class methods
  128624.     on the selected class."
  128625.  
  128626.     modePresenter selectionByIndex: 2 - aBoolean asParameter
  128627. !
  128628.  
  128629. isMethodVisible: aCompiledMethod
  128630.     | actualClass |
  128631.     actualClass := self actualClass.
  128632.     ^aCompiledMethod methodClass == actualClass or: 
  128633.             [self isShowInheritedMethods and: 
  128634.                     [(actualClass lookupMethod: aCompiledMethod selector) == aCompiledMethod 
  128635.                         and: [self isFilterObjectMethods not or: [aCompiledMethod methodClass ~~ Object]]]]!
  128636.  
  128637. isShowInheritedMethods
  128638.     "Answer whether the receiver is in 'show inherited methods' mode"
  128639.  
  128640.     ^flags allMask: ShowInheritedMethodsMask!
  128641.  
  128642. method
  128643.     "Answer the method displayed by the receiver or nil if there is none"
  128644.  
  128645.     ^methodBrowserPresenter method!
  128646.  
  128647. method: method
  128648.     "Set the receiver to browse the <CompiledMethod>, method."
  128649.  
  128650.     ^self method: method ifAbsent: [
  128651.         MessageBox errorMsg: method printString, ' cannot be displayed']!
  128652.  
  128653. method: method ifAbsent: exceptionHandler
  128654.     "Set's the receiver to browse the <CompiledMethod>, method,
  128655.     or, if the method is not found, evalutes the <niladicValuable>,
  128656.     exceptionHandler."
  128657.  
  128658.     | mclass |
  128659.     mclass := method methodClass.
  128660.     classesPresenter actualClass: mclass ifAbsent: [^exceptionHandler value].
  128661.     ^methodBrowserPresenter 
  128662.         selection: method 
  128663.         ifAbsent: [
  128664.             "Not in list, so is it a valid method?"
  128665.             (mclass includesSelector: method selector) ifFalse: [^exceptionHandler value].
  128666.             "Try realigning filter pane to include method"
  128667.             self isDisplayingCategories 
  128668.                 ifTrue: [
  128669.                     "The method exists, but not in the selected category, so we try in the all category"
  128670.                     categoriesPresenter selection: categoriesPresenter model title]
  128671.                 ifFalse: [
  128672.                     self isDisplayingProtocols 
  128673.                         ifTrue: [protocolsPresenter resetSelection]
  128674.                         ifFalse: [
  128675.                             self isDisplayingVariables 
  128676.                                 ifTrue: [variablesPresenter resetSelection]]].
  128677.             "Now try again"
  128678.             methodBrowserPresenter selection: method ifAbsent: exceptionHandler]!
  128679.  
  128680. methodCaption
  128681.     "Private - Answer a suitable caption for the selected method."
  128682.  
  128683.     ^self method infoTip!
  128684.  
  128685. methodsMatching: aMonadicValuable
  128686.     ^self actualClassChainMethods select: aMonadicValuable!
  128687.  
  128688. newMethod
  128689.     "Sets the receiver up for creating a new method"
  128690.  
  128691.     methodBrowserPresenter newMethod
  128692. !
  128693.  
  128694. onCategorySelected
  128695.     "Private - A new category has been selected."
  128696.  
  128697.     (self isDisplayingCategories and: [self category notNil]) ifTrue: [ | method |
  128698.         "Update the method browser to display the new methods"
  128699.         method := self method.
  128700.         self updateMethodsInCategory.
  128701.         self method == method ifFalse: [
  128702.             methodBrowserPresenter selection: method ifAbsent: ["Ignore"]]]!
  128703.  
  128704. onClassCategorized: aClass
  128705.     "Private - A class within the receiver has been recategorized. 
  128706.     Update the caption to match."
  128707.  
  128708.     self selectedClass == aClass ifTrue: [
  128709.         self updateCaption]!
  128710.  
  128711. onClassModeChanged
  128712.     "Private - The user has switched between class and Instance modes, or vice versa,
  128713.     so the method filters list need to be refreshed appropriately."
  128714.  
  128715.     "This may have no effect, but sometimes the classes presenter will change mode, e.g. 
  128716.      due to a history skip, so that our own instance/class mode tab is out of step."
  128717.     self isInstanceMode: classesPresenter isInstanceMode.
  128718.  
  128719.     self updateFilters.
  128720.     self updatePackage.
  128721.     self updateCaption!
  128722.  
  128723. onClassRepackaged: aClass from: source to: destination
  128724.     "Private - A class has been repackaged. If it is currently under scrutiny, refresh the displayed package."
  128725.  
  128726.     aClass == self selectedClass ifTrue: [
  128727.         self updatePackage]!
  128728.  
  128729. onClassSelected
  128730.     "Private - The class selected within the receiver has changed. 
  128731.     Refresh the method browser, etc."
  128732.  
  128733.     "If the selection change is due to a class deletion, for example, then there may be outstanding changes that
  128734.      the user would like to preserve, though our only sensible option is to copy them to the clipboard"
  128735.  
  128736.     | definition comment selection |
  128737.     self promptToCopyChanges.
  128738.     selection := self selectedClass.
  128739.     selection isNil 
  128740.         ifTrue: 
  128741.             [methodBrowserPresenter
  128742.                 filter: [:method | false];
  128743.                 clear.
  128744.             definition := String new asRichText.
  128745.             comment := String new]
  128746.         ifFalse: 
  128747.             [self isInstanceMode: classesPresenter isInstanceMode.
  128748.             definition := selection coloredDefinition.
  128749.             comment := selection comment].
  128750.     self updateFilters.
  128751.     self updatePackage.
  128752.     definitionPresenter
  128753.         text: definition;
  128754.         evaluationContext: selection.
  128755.     (self hasMethodSelected not and: [(view viewNamed: 'cards') currentCard name = 'source']) 
  128756.         ifTrue: [definitionPresenter ensureVisible].
  128757.     commentPresenter
  128758.         text: comment;
  128759.         evaluationContext: selection.
  128760.     methodBrowserPresenter evaluationContext: selection.
  128761.     self updateCaption.
  128762.  
  128763.     self trigger: #classSelected!
  128764.  
  128765. onClassSelectionChanging: aSelectionChangingEvent
  128766.     "Private - A selection is about to change  within the receiver.
  128767.     Prompt to save any outstanding changes"
  128768.  
  128769.     self onPromptToSaveChanges: aSelectionChangingEvent!
  128770.  
  128771. onClassUpdated: aClass
  128772.     "Private - A class within the receiver has changed. 
  128773.     Refresh the definition pane if it is the selected class,
  128774.     and refresh other panes if it is the actual class/metaclass being
  128775.     displayed."
  128776.  
  128777.     | class |
  128778.     class := self actualClass.
  128779.     class isNil ifTrue: [^self].
  128780.     (class instanceClass includesBehavior: aClass instanceClass) 
  128781.         ifTrue: 
  128782.             [(class instanceClass == aClass instanceClass and: [self promptToSaveClassChanges]) 
  128783.                 ifTrue: 
  128784.                     [definitionPresenter text: aClass instanceClass coloredDefinition.
  128785.                     commentPresenter text: aClass comment].
  128786.  
  128787.             "If displaying the actual class or a superclass, then may need to refresh variables"
  128788.             (class includesBehavior: aClass) 
  128789.                 ifTrue: 
  128790.                     [self updateVariables.
  128791.                     self updateCaption]]!
  128792.  
  128793. onCloseRequested: boolValueHolder
  128794.     "A request to close the view onto the receiver as occurred.
  128795.     Prompt to save any outstanding changed"
  128796.  
  128797.     boolValueHolder value: self promptToSaveChanges!
  128798.  
  128799. onDragCategory: session
  128800.     "Private - A drag of a category has been started. Enter details into
  128801.     the <DragDropSession>, session."
  128802.  
  128803.     self beginDrag: session methods: (self methodsMatching: self categoriesFilter)!
  128804.  
  128805. onDragMethodsCut: session
  128806.     "Private - The <DragDropSession>, session, has just completed a successful move operation. 
  128807.     The receiver is now responsible for deleting the drag object from itself."
  128808.  
  128809.     session dragObjects do: [:each | | method |
  128810.         method := each format: #CompiledMethod.
  128811.         method methodClass removeSelector: method selector]!
  128812.  
  128813. onDragOverCategory: session 
  128814.     "Private - The user is dragging over the category hierarchy pane.
  128815.     Set the operation of the <DragDropSession>, session,
  128816.     that would occur if a drop took place now of the objects in that session."
  128817.  
  128818.     (session isTargetSameAsSource not and: [session isFormatAvailable: #CompiledMethod]) 
  128819.         ifTrue: 
  128820.             [| target op |
  128821.             target := session suggestedTarget.
  128822.             op := session intendedOperation.
  128823.             (target notNil and: [target acceptsAdditions]) 
  128824.                 ifTrue: 
  128825.                     [session
  128826.                         supportedOperations: #(#copy #move #link);
  128827.                         operation: op.
  128828.                     ^self]].
  128829.  
  128830.     "Set the operation to nil to signify that we don't want the drop"
  128831.     session operation: nil!
  128832.  
  128833. onDragOverMethod: aDragDropSession 
  128834.     "Private - The user is dragging over the method list pane.
  128835.     Set the operation of the <DragDropSession>, session,
  128836.     that would occur if a drop took place now of the objects in that session."
  128837.  
  128838.     aDragDropSession 
  128839.         operation: ((aDragDropSession dragSource ~= aDragDropSession dropTarget 
  128840.                 and: [aDragDropSession isFormatAvailable: #CompiledMethod]) 
  128841.                     ifTrue: [aDragDropSession intendedOperation])!
  128842.  
  128843. onDragOverMode: aDragDropSession 
  128844.     "Private - The user is dragging over the instance/class mode selection tab.
  128845.     Set the operation of the <DragDropSession> argument that would occur 
  128846.     if a drop took place now of the objects in that session."
  128847.  
  128848.     | allowDrop |
  128849.     allowDrop := false.
  128850.     (aDragDropSession isFormatAvailable: #CompiledMethod) 
  128851.         ifTrue: 
  128852.             [aDragDropSession dragSource topView == self view topView 
  128853.                 ifTrue: 
  128854.                     ["Drag was sourced from this class browser"
  128855.  
  128856.                     allowDrop := aDragDropSession suggestedTarget ~= modePresenter selection]]
  128857.         ifFalse: 
  128858.             ["Drag sourced from another browser"
  128859.  
  128860.             allowDrop := true].
  128861.     aDragDropSession 
  128862.         operation: (allowDrop ifTrue: [aDragDropSession intendedOperation])!
  128863.  
  128864. onDragProtocol: session
  128865.     "Private - A protocol drag has been started. Just extend the available formats
  128866.     to mention the availability of MethodProtocols."
  128867.  
  128868.     session dragObjects do: [:dragee | dragee format: #MethodProtocol data: (dragee format: #Object)].!
  128869.  
  128870. onDragVariableRefs: session
  128871.     "Private - A drag of the methods referencing a particular variable has been started (useful
  128872.     when refactoring and pulling an instance variable up or pushing down). Enter details into
  128873.     the <DragDropSession>, session."
  128874.  
  128875.     self beginDrag: session methods: (self methodsMatching: self variablesFilter)!
  128876.  
  128877. onDropDown: tool 
  128878.     "Private - The receiver's toolbar has sent a notification that one of
  128879.     the forward/back buttons' drop-down arrow has been pressed. 
  128880.     Generate and pop-up the past/future history menus, as appropriate."
  128881.  
  128882.     | popup |
  128883.     popup := tool command asSymbol == #historyBack 
  128884.                 ifTrue: [self buildHistoryPastMenu]
  128885.                 ifFalse: [self buildHistoryFutureMenu].
  128886.     popup showIn: view position: tool screenRectangle bottomLeft.
  128887.     ^0!
  128888.  
  128889. onDropOverCategory: session
  128890.     "Private - The drag operation described by <DragDropSession>, session, would like to do a drop.
  128891.     Override this method to accept the dragObject(s)."
  128892.  
  128893.     | targetCategory |
  128894.     targetCategory := session suggestedTarget.
  128895.     targetCategory isNil 
  128896.         ifTrue: 
  128897.             [Sound errorBeep.
  128898.             ^false].
  128899.     session dragObjects do: 
  128900.             [:each | 
  128901.             "See if the drop is a CompiledMethod"
  128902.  
  128903.             (each isFormatAvailable: #CompiledMethod) 
  128904.                 ifTrue: 
  128905.                     [| method |
  128906.                     method := each format: #CompiledMethod.
  128907.  
  128908.                     "Check for a move to single category"
  128909.                     session operation == #move 
  128910.                         ifTrue: 
  128911.                             ["Don't change the privacy unless the target is public/private"
  128912.  
  128913.                             method
  128914.                                 categories: (targetCategory isPrivacy 
  128915.                                             ifTrue: [Array with: targetCategory]
  128916.                                             ifFalse: [Array with: targetCategory with: method privacyCategory]);
  128917.                                 storeCategories].
  128918.  
  128919.                     "Check for a copy to additional category"
  128920.                     session operation == #copy 
  128921.                         ifTrue: [self addMethod: method toCategory: targetCategory].
  128922.  
  128923.                     "Check for a removal from target category"
  128924.                     (session operation == #link and: [targetCategory includesMethod: method]) 
  128925.                         ifTrue: [self removeMethod: method fromCategory: targetCategory]]].
  128926.     session operation == #move 
  128927.         ifTrue: 
  128928.             ["Operation must never be #move to avoid methods being removed"
  128929.  
  128930.             session operation: #copy].
  128931.     ^true!
  128932.  
  128933. onDropOverMethods: aDragDropSession 
  128934.     "Private - The drag operation described by the <DragDropSession> would like 
  128935.     to do a drop of methods over the receiver's method list.
  128936.     If the drop fails then we must set the operation to nil in order that the drag-drop
  128937.     session can detect the failure (as this is an event handler the return value is ignored)."
  128938.  
  128939.     self dropMethods: aDragDropSession onto: self actualClass!
  128940.  
  128941. onDropOverMode: aDragDropSession 
  128942.     "Private - The drag operation described by the <DragDropSession> would like 
  128943.     to do a drop of methods over the receiver's mode tab.
  128944.     If the drop fails then we must set the operation to nil in order that the drag-drop
  128945.     session can detect the failure (as this is an event handler the return value is ignored)."
  128946.  
  128947.     "See if the drop is a CompiledMethod"
  128948.  
  128949.     "The drop operation failed (probably due to a duplicate method)"
  128950.  
  128951.     | dropClass |
  128952.     dropClass := self selectedClass.
  128953.     (modePresenter list indexOf: aDragDropSession suggestedTarget) > 1 
  128954.         ifTrue: [dropClass := dropClass class].
  128955.     self dropMethods: aDragDropSession onto: dropClass!
  128956.  
  128957. onFilterCardChanged
  128958.     "Private - The method filter card has been changed. Update the method list
  128959.     and dynamic filter accordingly."
  128960.  
  128961.     self actualClass isNil ifTrue: [^self].
  128962.     self isDisplayingCategories 
  128963.         ifTrue: [self updateMethodsInCategory]
  128964.         ifFalse: [
  128965.             self isDisplayingProtocols 
  128966.                 ifTrue: [self updateMethodsInProtocol]
  128967.                 ifFalse: [
  128968.                     self isDisplayingVariables 
  128969.                         ifTrue: [self updateMethodsReferencingVariables]]].
  128970.     self updateCaption!
  128971.  
  128972. onFilterSelectionChanging: aSelectionChangingEvent
  128973.     "Private - The selection of class/instance mode, or in one of the method filters is changing. Note that
  128974.     this can only affect the method source pane, so there is no need to prompt to save changes
  128975.     to definition or comment panes."
  128976.  
  128977.     self onPromptToSaveMethodChanges: aSelectionChangingEvent!
  128978.  
  128979. onMethodAdded: aCompilationResult
  128980.     "Private - The development system has added aCompiledMethod.
  128981.     Implementation Note: Some complexity arises if in 'show inherited methods'
  128982.     mode as the new method may supplant an inherited method that is currently
  128983.     being displayed. We must also ensure that the method's categories are correctly 
  128984.     displayed within the receiver's category presenter, if the method is visible."
  128985.  
  128986.     | method visible actualClass methodClass |
  128987.     method := aCompilationResult method.
  128988.     actualClass := self actualClass.
  128989.     methodClass := method methodClass.
  128990.     (self isShowInheritedMethods and: [actualClass includesBehavior: methodClass])
  128991.         ifTrue: 
  128992.             [| superclass selector |
  128993.             superclass := methodClass superclass.
  128994.             selector := method selector.
  128995.             ((visible := (actualClass lookupMethod: selector) == method) and: [superclass notNil]) 
  128996.                 ifTrue: 
  128997.                     ["The newly added method is the implementation, perhaps inherited, for the 
  128998.                     currently selected class  so we must check to see if it supplants a previous 
  128999.                     implementation, which we will need to remove from the list - note that we start 
  129000.                     the search in the superclass of the method, just like a Smalltalk supersend."
  129001.  
  129002.                     (superclass lookupMethod: selector) ifNotNil: [:overridden | 
  129003.                         methodBrowserPresenter model remove: overridden ifAbsent: []]]]
  129004.         ifFalse: [visible := methodClass == actualClass].
  129005.     visible ifTrue: [self addCategoriesOfMethod: method]!
  129006.  
  129007. onMethodCategorized: aCompiledMethod
  129008.     "Private - The development system has recategorized aCompiledMethod.
  129009.     Check to ensure that the method's categories are correctly displayed within
  129010.     the receiver's category presenter"
  129011.  
  129012.     aCompiledMethod methodClass == self actualClass 
  129013.         ifTrue: 
  129014.             [| isDisplayingMethod |
  129015.             self addCategoriesOfMethod: aCompiledMethod.
  129016.             isDisplayingMethod := self method == aCompiledMethod.
  129017.             self isDisplayingCategories 
  129018.                 ifTrue: 
  129019.                     ["self setCategoriesMethodFilter."
  129020.  
  129021.                     #todo.    "Remove this"
  129022.                     isDisplayingMethod 
  129023.                         ifTrue: 
  129024.                             [(aCompiledMethod categories intersection: self categories) isEmpty 
  129025.                                 ifTrue: [methodBrowserPresenter onMethod: aCompiledMethod updatedTo: aCompiledMethod]
  129026.                                 ifFalse: [self updateCaption]]]
  129027.                 ifFalse: [isDisplayingMethod ifTrue: [self updateCaption]]]!
  129028.  
  129029. onMethodRemoved: aCompiledMethod
  129030.     "Private - The development system has removed aCompiledMethod.
  129031.     Implementation Note: Some complexity arises if in 'show inherited methods'
  129032.     mode as the method may have been hiding a superclass implementation which
  129033.     we now need to add into the browser."
  129034.  
  129035.     | actualClass methodClass |
  129036.     self isShowInheritedMethods ifFalse: [^self].
  129037.     methodClass := aCompiledMethod methodClass.
  129038.     actualClass := self actualClass.
  129039.     (actualClass includesBehavior: methodClass) ifFalse: [^self].
  129040.  
  129041.     "A method has been removed in the selected class' inheritance chain - this may possibly
  129042.      have exposed a method higher up the chain."
  129043.     (actualClass lookupMethod: aCompiledMethod selector) ifNotNil: 
  129044.             [:visibleMethod | 
  129045.             ((methodClass inheritsFrom: visibleMethod methodClass) 
  129046.                 and: [self isFilterObjectMethods not or: [visibleMethod methodClass ~~ Object]]) 
  129047.                     ifTrue: 
  129048.                         [methodBrowserPresenter model add: visibleMethod.
  129049.                         self addCategoriesOfMethod: visibleMethod]]!
  129050.  
  129051. onMethodRepackaged: method from: source to: destination
  129052.     "Private - The <Package>, updatee, has had its contents amended. 
  129053.     Update the package display in case either the selected class or method
  129054.     has been repackaged."
  129055.  
  129056.     self method == method ifTrue: [
  129057.         self updatePackage]!
  129058.  
  129059. onMethodSelected
  129060.     "Private - The method selected within the receiver has changed"
  129061.  
  129062.     | method |
  129063.     method := self method.
  129064.     method notNil ifTrue: [
  129065.         "Add to the visit history - note that the current item is at the top of the history list"
  129066.         (history isEmpty or: [ | cur |
  129067.                 cur := history current.
  129068.                 cur methodClass ~= method methodClass or: [cur selector ~= method selector]])
  129069.             ifTrue: [history addLast: method]
  129070.             ifFalse: [history current: method]].
  129071.  
  129072.     methodBrowserPresenter 
  129073.         enableSource: self hasEditableMethodSelected.
  129074.  
  129075.     self updatePackage.
  129076.     self updateCaption.
  129077.  
  129078.     self trigger: #methodSelected!
  129079.  
  129080. onModeSelectionChanged
  129081.     "Private - The browser has toggled from instance to class mode, or vice versa."
  129082.  
  129083.     classesPresenter isInstanceMode: modePresenter selectionByIndex = 1!
  129084.  
  129085. onPackageDoubleClicked: aPoint 
  129086.     "Private - The receiver's package status item was double clicked at the specified point.
  129087.     Open the package browser on the package."
  129088.  
  129089.     | package |
  129090.     package := packageModel value.
  129091.     package isNil 
  129092.         ifTrue: 
  129093.             [classesPresenter hasSelection 
  129094.                 ifTrue: [classesPresenter classPackage]
  129095.                 ifFalse: [Sound errorBeep]]
  129096.         ifFalse: [Cursor wait showWhile: [packageModel value browse]]!
  129097.  
  129098. onPromptToSaveChanges: aSelectionChangingEvent
  129099.     "Private - Check to see if the source, definition or comment panes have been changed. 
  129100.     If so prompt to see if the changes should be retained and if they should then
  129101.     set the value of the out parameter, aBooleanValue, to false"
  129102.  
  129103.     ^(self onPromptToSaveMethodChanges: aSelectionChangingEvent) 
  129104.         and: [self onPromptToSaveClassChanges: aSelectionChangingEvent]!
  129105.  
  129106. onPromptToSaveClassChanges: aSelectionChangingEvent
  129107.     "Private - Check to see if the class definition or comment panes have been changed. 
  129108.     If so prompt to see if the changes should be retained and if they should then
  129109.     set the value of the out parameter, aBooleanValue, to false"
  129110.  
  129111.     ^(definitionPresenter prompt: 'definition' toSaveChanges: aSelectionChangingEvent) 
  129112.         and: [commentPresenter prompt: 'comment' toSaveChanges: aSelectionChangingEvent]!
  129113.  
  129114. onPromptToSaveMethodChanges: aSelectionChangingEvent
  129115.     ^methodBrowserPresenter onPromptToSaveChanges: aSelectionChangingEvent!
  129116.  
  129117. onProtocolRemoved: aMethodProtocol
  129118.     "Private - The <MethodProtocol>, aMethodProtocol, has been removed from the system.
  129119.     Update the protocols list."
  129120.  
  129121.     (protocolsPresenter model includes: aMethodProtocol) ifTrue: [
  129122.         protocolsPresenter model remove: aMethodProtocol]!
  129123.  
  129124. onProtocolSelected
  129125.     "Private - A new protocol has been selected."
  129126.  
  129127.     self isDisplayingProtocols ifTrue: [ | method |
  129128.         "Update the method browser to display the new methods"
  129129.         method := self method.
  129130.         self updateMethodsInProtocol.
  129131.         self method == method ifFalse: [
  129132.             methodBrowserPresenter selection: method ifAbsent: ["Ignore"]]]!
  129133.  
  129134. onProtocolUpdated: aMethodProtocol
  129135.     "Private - The <MethodProtocol>, aMethodProtcol, has been updated in some manner
  129136.     (normally by having classes/selectors added/removed). Inform interested parties."
  129137.  
  129138.     | class |
  129139.     (class := self actualClass) isNil ifTrue: [^self].
  129140.     (self actualClass conformsToProtocol: aMethodProtocol) 
  129141.         ifTrue: [ | i |
  129142.             "Selected class conforms to the updated protocol, may need to refresh protocol pane
  129143.              or methods list."
  129144.             (i := protocolsPresenter model identityIndexOf: aMethodProtocol) isZero
  129145.                 ifTrue: [
  129146.                     "Protocol has been added to our selected class, so we need to add it in too"
  129147.                     protocolsPresenter model add: aMethodProtocol]
  129148.                 ifFalse: [
  129149.                     "Protocol has been updated, and we already have it in our list, we need to ensure
  129150.                      our protocol list method browser are up-to-date."
  129151.                     protocolsPresenter model updateAtIndex: i.
  129152.                     self onProtocolSelected]]
  129153.         ifFalse: [
  129154.             "Selected class does not conform to the updated protocol. May need to refresh the protocol
  129155.              pane if it did previously. If not present then we obviously don't care about this protocol in this browser."
  129156.             (protocolsPresenter model includes: aMethodProtocol) ifTrue: [
  129157.                 "Protocol has apparently been removed from the selected class (we have it in list,
  129158.                 but class no longer conforms"
  129159.                 protocolsPresenter model remove: aMethodProtocol]]
  129160. !
  129161.  
  129162. onRenameInstVar: anAssociation to: aString accept: aValueHolder
  129163.     "Private - Selection will be lost by #classUpdated: event, unless we explicitly maintain it"
  129164.  
  129165.     | selections |
  129166.     selections := variablesPresenter view selectionsByIndex.
  129167.     (self model 
  129168.         renameInstanceVariable: anAssociation value
  129169.         to: aString
  129170.         in: anAssociation key) ifNotNil: 
  129171.                 [:newName | 
  129172.                 variablesPresenter view selectionsByIndex: selections.
  129173.                 aValueHolder value: true]!
  129174.  
  129175. onRenameMethodProtocol: aMethodProtocol to: aString accept: aValueHolder
  129176.     (self validateProtocol: aMethodProtocol renameTo: aString) 
  129177.         ifTrue: [aMethodProtocol rename: aString]!
  129178.  
  129179. onRepackaged: anObject
  129180.     "Private - The development system has re-packaged anObject.
  129181.     Check to ensure that the package is correctly displayed within
  129182.     the receiver if it is displaying this object"
  129183.  
  129184.     (self selectedClass==anObject or: [self method==anObject]) ifTrue: [
  129185.         self updatePackage]!
  129186.  
  129187. onTipTextRequired: tool
  129188.     "Tool tip text is required for the <ToolbarItem>, tool."
  129189.  
  129190.     | cmd |
  129191.     cmd := tool command asSymbol.
  129192.     cmd == #clearSelection ifTrue: [cmd := self deleteItCommand].
  129193.     cmd == #removeMethodCategory 
  129194.         ifTrue: 
  129195.             [^'Remove category ''%2'' from %1' formatWith: self actualClass name
  129196.                 with: self category name].
  129197.     cmd == #removeInstanceVariables ifTrue: [^'Delete instance variables'].
  129198.     cmd == #removeMethodProtocol ifTrue: [^'Remove method protocol'].
  129199.     cmd == #browseHierarchy ifTrue: [^'Open Hierarchy Browser on ' , self actualClass name].
  129200.     cmd == #browseSystem ifTrue: [^'Open System Browser on ' , self actualClass name].
  129201.     #find == cmd ifTrue: [^'Find class'].
  129202.     cmd == #newClass ifTrue: [^'New subclass of ' , self selectedClass name].
  129203.     cmd == #newMethod 
  129204.         ifTrue: 
  129205.             [| cat |
  129206.             cat := self category.
  129207.             ^cat == categoriesPresenter model title 
  129208.                 ifTrue: ['New unclassified method']
  129209.                 ifFalse: ['New method in ''%1''' formatWith: cat name]].
  129210.     (cmd == #historyBack and: [history hasPast]) 
  129211.         ifTrue: [^'Back to ' , history previous printString].
  129212.     (cmd == #historyForward and: [history hasFuture]) 
  129213.         ifTrue: [^'Forward to ' , history next printString].
  129214.     cmd := tool command asSymbol.
  129215.     cmd == #toggleShowInheritedMethods 
  129216.         ifTrue: 
  129217.             [^self isShowInheritedMethods 
  129218.                 ifTrue: ['Don''t show inherited methods']
  129219.                 ifFalse: ['Show inherited methods']].
  129220.     ^super onTipTextRequired: tool!
  129221.  
  129222. onVariableSelected
  129223.     "Private - A new instance variable has been selected."
  129224.  
  129225.     self isDisplayingVariables ifTrue: [ | method |
  129226.         "Update the method browser to display the new methods"
  129227.         method := self method.
  129228.         self updateMethodsReferencingVariables.
  129229.         self updateCaption.
  129230.         self method == method ifFalse: [
  129231.             methodBrowserPresenter selection: method ifAbsent: ["Ignore"]]]!
  129232.  
  129233. onViewOpened
  129234.     "Received when the receiver's view is been connected. "
  129235.  
  129236.     | statusItem toolbar packageItem |
  129237.     super onViewOpened.
  129238.     methodBrowserPresenter beSorted: [:a :b | a selector <= b selector].
  129239.     statusItem := self view viewNamed: 'message' ifNone: [].
  129240.     statusItem notNil 
  129241.         ifTrue: 
  129242.             [statusItem model: statusModel.
  129243.             methodBrowserPresenter errorModel: statusModel.
  129244.             definitionPresenter errorModel: statusModel].
  129245.     packageItem := self view viewNamed: 'packageOfSelection' ifNone: [].
  129246.     packageItem notNil 
  129247.         ifTrue: 
  129248.             [packageItem 
  129249.                 when: #doubleClicked:
  129250.                 send: #onPackageDoubleClicked:
  129251.                 to: self.
  129252.             packageItem model: packageModel].
  129253.     toolbar := self view viewNamed: 'classBrowserTools'.
  129254.     toolbar presenterConnectionPoint 
  129255.         when: #dropDown:
  129256.         send: #onDropDown:
  129257.         to: self.
  129258.  
  129259.     "Really a CardContainer view, but we treat as if a presenter"
  129260.     filterPresenter := self view viewNamed: 'filters' ifNone: [].
  129261.     filterPresenter notNil 
  129262.         ifTrue: 
  129263.             [filterPresenter
  129264.                 when: #currentCardChanged
  129265.                     send: #onFilterCardChanged
  129266.                     to: self;
  129267.                 when: #currentCardChanging:
  129268.                     send: #onFilterSelectionChanging:
  129269.                     to: self].
  129270.  
  129271.     self applyOptions.
  129272.     definitionPresenter ensureVisible!
  129273.  
  129274. packageForNewMethod
  129275.     "Private - Answer the <Package> into which newly defined methods should be saved, or 
  129276.     nil to use the default (the owning class' package)."
  129277.  
  129278.     ^nil!
  129279.  
  129280. printClassTitleOn: target
  129281.     "Private - Print the 'title' of the currently selected class onto the <puttableStream>, target.
  129282.     This includes a prefix for the package."
  129283.  
  129284.     target nextPutAll: self actualClass name!
  129285.  
  129286. promptToCopyChanges
  129287.     "Private - If there are any changes, prompt the user as to whether they wish to copy them
  129288.     to the clipboard because a class selection change has occurred that is not preventable."
  129289.  
  129290.     ^self onPromptToSaveChanges: (SelectionChangedEvent forSource: self)!
  129291.  
  129292. promptToSaveChanges
  129293.     "Private - If there are any changes, prompt the user as to whether they wish to save them,
  129294.     and answer a <Boolean> indicating the response."
  129295.  
  129296.     ^self onPromptToSaveChanges: ((SelectionChangingEvent forSource: self)
  129297.                 oldSelection: self selectedClass;
  129298.                 yourself)!
  129299.  
  129300. promptToSaveClassChanges
  129301.     | class |
  129302.     class := self actualClass.
  129303.     ^self onPromptToSaveClassChanges: ((SelectionChangingEvent forSource: self)
  129304.                 oldSelection: class;
  129305.                 newSelection: class;
  129306.                 yourself)!
  129307.  
  129308. protocols
  129309.     "Answer a Collection of all the method protocols which
  129310.     are currently selected."
  129311.  
  129312.     ^protocolsPresenter hasView
  129313.         ifTrue: [protocolsPresenter selectionOrNil]
  129314.         ifFalse: [#()]!
  129315.  
  129316. protocols: protocols
  129317.     "Set the currently selected method protocols the <collection> of protocols"
  129318.  
  129319.     self hasClassSelected ifTrue: [
  129320.         protocolsPresenter selectionOrNil: protocols; ensureVisible ]!
  129321.  
  129322. protocolsMethodFilter
  129323.     "Private - Answer a <monadicValuable> that, when passed a <CompiledMethod>, answers true if the
  129324.     method should be displayed in the receiver by warrant of the protocol that is selected"
  129325.  
  129326.     ^
  129327.     [:m | 
  129328.     (self classMethodFilter value: m) and: 
  129329.             [self protocols 
  129330.                 anySatisfy: [:protocol | protocol includesSelector: m selector]]]!
  129331.  
  129332. queryCommand: aCommandQuery
  129333.     "Private - Enter details about a potential command for the receiver 
  129334.     into the <CommandQuery>."
  129335.  
  129336.     | selector |
  129337.     selector := aCommandQuery commandSymbol.
  129338.     #accept == selector 
  129339.         ifTrue: 
  129340.             [selector := self acceptItCommand.
  129341.             selector isNil 
  129342.                 ifTrue: 
  129343.                     [aCommandQuery isEnabled: false.
  129344.                     ^true]].
  129345.     #renameIt == selector 
  129346.         ifTrue: 
  129347.             [selector := self renameItCommand.
  129348.             selector isNil 
  129349.                 ifTrue: 
  129350.                     [aCommandQuery isEnabled: false.
  129351.                     ^true]].
  129352.     #browseIt == selector 
  129353.         ifTrue: 
  129354.             [selector := self browseItCommand.
  129355.             selector isNil 
  129356.                 ifTrue: 
  129357.                     [aCommandQuery isEnabled: false.
  129358.                     ^true]].
  129359.     #inspectIt == selector 
  129360.         ifTrue: 
  129361.             [selector := self inspectItCommand.
  129362.             selector isNil 
  129363.                 ifTrue: 
  129364.                     [aCommandQuery isEnabled: false.
  129365.                     ^true]].
  129366.     #clearSelection == selector 
  129367.         ifTrue: 
  129368.             [selector := self deleteItCommand.
  129369.             selector isNil 
  129370.                 ifTrue: 
  129371.                     [aCommandQuery isEnabled: false.
  129372.                     ^true]].
  129373.     #saveNewMethod == selector 
  129374.         ifTrue: 
  129375.             [aCommandQuery isEnabled: self canAcceptMethod.
  129376.             ^true].
  129377.     (#(#saveComment #saveDefinition) identityIncludes: selector) 
  129378.         ifTrue: 
  129379.             [aCommandQuery isEnabled: self hasClassSelected.
  129380.             ^true].
  129381.     #toggleShowInheritedMethods == selector 
  129382.         ifTrue: [aCommandQuery isChecked: self isShowInheritedMethods].
  129383.     #toggleFilterObjectMethods == selector 
  129384.         ifTrue: 
  129385.             [aCommandQuery
  129386.                 isChecked: self isFilterObjectMethods;
  129387.                 isEnabled: self isShowInheritedMethods.
  129388.             ^true].
  129389.     #toggleProtocolReadOnly == selector 
  129390.         ifTrue: 
  129391.             [| prots |
  129392.             prots := self protocols.
  129393.             prots size == 1 
  129394.                 ifTrue: 
  129395.                     [| prot |
  129396.                     prot := prots first.
  129397.                     aCommandQuery
  129398.                         isChecked: prots first isReadOnly;
  129399.                         isEnabled: prots first isANSI not]
  129400.                 ifFalse: [aCommandQuery isEnabled: false].
  129401.             ^true].
  129402.     (#(#browseSelectorsInProtocol #renameMethodProtocol) identityIncludes: selector) 
  129403.         ifTrue: 
  129404.             [aCommandQuery 
  129405.                 isEnabled: (self protocols size == 1 and: [self protocols first isReadOnly not]).
  129406.             ^true].
  129407.     (#(#removeMethodProtocol #removeMethodsInProtocol) identityIncludes: selector) 
  129408.         ifTrue: 
  129409.             [| prots |
  129410.             prots := self protocols.
  129411.             "Can only remove selected protocols if this is the first implementor in the superclass chain"
  129412.             aCommandQuery 
  129413.                 isEnabled: (prots notEmpty and: 
  129414.                             [selector == #removeMethodsInProtocol 
  129415.                                 or: [(prots difference: self actualClass protocols) isEmpty]]).
  129416.             ^true].
  129417.     (#(#browseInstVarReferences #browseInstVarReaders #browseInstVarWriters #browseReferences) 
  129418.         identityIncludes: selector) 
  129419.             ifTrue: 
  129420.                 [| vars |
  129421.                 vars := self variables.
  129422.                 aCommandQuery isEnabled: (vars notNil and: [vars size = 1]).
  129423.                 ^true].
  129424.     #browseInheritedMethod == selector 
  129425.         ifTrue: 
  129426.             [aCommandQuery isEnabled: (self hasMethodSelected and: [self method isOverride]).
  129427.             ^true].
  129428.     #browseMethodProtocol == selector 
  129429.         ifTrue: 
  129430.             [aCommandQuery isEnabled: self protocols notEmpty.
  129431.             ^true].
  129432.     (#(#reformatAccept #reformatSource) identityIncludes: selector) 
  129433.         ifTrue: 
  129434.             [aCommandQuery isEnabled: self hasEditableMethodSelected.
  129435.             ^true].
  129436.     (#(#newMethod #browseHierarchy #addMethodProtocol #addMethodCategory) 
  129437.         identityIncludes: selector) 
  129438.             ifTrue: 
  129439.                 [aCommandQuery isEnabled: self hasClassSelected.
  129440.                 ^true].
  129441.     #historyBack: == selector 
  129442.         ifTrue: 
  129443.             [| dist |
  129444.             dist := aCommandQuery command arguments first.
  129445.             aCommandQuery isEnabled: history pastSize >= dist.
  129446.             ^true].
  129447.     #historyForward: == selector 
  129448.         ifTrue: 
  129449.             [| dist |
  129450.             dist := aCommandQuery command arguments first.
  129451.             aCommandQuery isEnabled: history futureSize >= dist.
  129452.             ^true].
  129453.     selector == #historyForward 
  129454.         ifTrue: 
  129455.             [history hasFuture 
  129456.                 ifTrue: 
  129457.                     [aCommandQuery
  129458.                         isEnabled: true;
  129459.                         text: (aCommandQuery commandDescription menuText formatWith: history next printString)]
  129460.                 ifFalse: 
  129461.                     [aCommandQuery
  129462.                         isEnabled: false;
  129463.                         text: 'Forward'].
  129464.             ^true].
  129465.     selector == #historyBack 
  129466.         ifTrue: 
  129467.             [history hasPast 
  129468.                 ifTrue: 
  129469.                     [aCommandQuery
  129470.                         isEnabled: true;
  129471.                         text: (aCommandQuery commandDescription menuText formatWith: history previous printString)]
  129472.                 ifFalse: 
  129473.                     [aCommandQuery
  129474.                         isEnabled: false;
  129475.                         text: 'Back'].
  129476.             ^true].
  129477.     #browseMethodCategories == selector 
  129478.         ifTrue: 
  129479.             [| cat |
  129480.             cat := self category.
  129481.             aCommandQuery isEnabled: (cat notNil and: [cat ~= categoriesPresenter model title]).
  129482.             ^true].
  129483.     (#(#removeMethodCategory #renameMethodCategory) identityIncludes: selector) 
  129484.         ifTrue: 
  129485.             [| cat |
  129486.             cat := self category.
  129487.             "Virtual categories are permanent/calculated and cannot be removed"
  129488.             aCommandQuery isEnabled: (cat notNil and: [cat isVirtual not]).
  129489.             ^true].
  129490.     #removeMethodsInCategory == selector 
  129491.         ifTrue: 
  129492.             [| cat |
  129493.             aCommandQuery isEnabled: ((cat := self category) notNil 
  129494.                         and: [(cat methodsInBehavior: self actualClass) notEmpty]).
  129495.             ^true].
  129496.     #createAccessors == selector 
  129497.         ifTrue: 
  129498.             [aCommandQuery isEnabled: self variables notEmpty.
  129499.             ^true].
  129500.     #renameInstanceVariable == selector 
  129501.         ifTrue: 
  129502.             [aCommandQuery isEnabled: self variables size = 1.
  129503.             ^true].
  129504.     ^super queryCommand: aCommandQuery!
  129505.  
  129506. reformatAccept
  129507.     "Invoke the Smalltalk formatter to automatically reformat the 
  129508.     selected method, and save the result."
  129509.  
  129510.     (methodBrowserPresenter reformattedMethodSourceIn: self actualClass) 
  129511.         ifNotNil: [:formatted | self saveNewMethod: formatted]!
  129512.  
  129513. reformatSource
  129514.     methodBrowserPresenter reformatSourceIn: self actualClass!
  129515.  
  129516. removeMethod: method fromCategory: targetCategory
  129517.     "Private - Remove the <CompiledMethod>, method, from the <MethodCategory>,
  129518.     targetCategory, e.g. following a drag-link operation in the category pane."
  129519.  
  129520.     targetCategory removeMethod: method.
  129521.     method storeCategories!
  129522.  
  129523. removeMethod: method fromProtocol: target
  129524.     "Private - Remove the <CompiledMethod>, method, from the <MethodProtocol>,
  129525.     target, e.g. following a drag-link operation in the category pane.
  129526.     Implementation Note: We can't be sure if the user wishes to remove the selector 
  129527.     from the protocol or the protocol from class of the method, so we must ask. In
  129528.     any case this is a much more important operation than simple method recategorization
  129529.     so we need to warn the user anyway."
  129530.  
  129531.     | response |
  129532.     response := MessageBox new
  129533.         defaultButton: 3;
  129534.         confirmOrCancel: 
  129535. ('Are you sure that you would like to remove the selector %2 from the protocol <%1>?%n%n
  129536. Press Yes to remove %2 from the list of selectors required by the <%1> protocol.
  129537. (May affect other conforming classes or the users of those classes)%n
  129538. Press No to remove <%1> from the set of protocols to which %3 conforms.
  129539. (May affect the users of %3 or its subclasses)%n
  129540. Press Cancel to abort the operation (recommended).'
  129541.             formatWith: target asSymbol
  129542.                 with: method selector printString
  129543.                 with: method methodClass name).
  129544.     response == #cancel ifTrue: [^self].
  129545.     response == #yes
  129546.         ifTrue: [
  129547.             target removeSelector: method selector ifAbsent: []]
  129548.         ifFalse: [
  129549.             target removeClass: method methodClass.
  129550.             protocolsPresenter model remove: target]!
  129551.  
  129552. removeMethodCategory
  129553.     "Private - Remove the currently selected category without deleting any
  129554.     of the methods."
  129555.  
  129556.     | actualClass |
  129557.     actualClass := self actualClass.
  129558.     (MessageBox confirm: (
  129559. 'Are you sure you would like to remove the method category ''%2''
  129560. and its subcategories from %1?
  129561. (No methods will be deleted)'
  129562.                         formatWith: actualClass name with: self category displayString))
  129563.         ifTrue: [ | catModel |
  129564.             self categories do: [:category | category removeClass: actualClass].
  129565.             catModel := categoriesPresenter model.
  129566.             catModel remove: self category.
  129567.             categoriesPresenter selection: catModel title]!
  129568.  
  129569. removeMethodProtocol
  129570.     "Private - Remove the currently selected protocols from the class."
  129571.  
  129572.     self protocols do: [:p |
  129573.         self model removeClass: self actualClass fromProtocol: p ].
  129574. !
  129575.  
  129576. removeMethodsInCategory
  129577.     "Private - Remove all of the methods in the currently selected category.
  129578.     As this is rather drastic we give the user a second chance."
  129579.  
  129580.     | actualClass |
  129581.     actualClass := self actualClass.
  129582.     (MessageBox confirm: (
  129583. 'Are you sure you would like to remove all the methods of %1%nthat are in the ''%2'' category and its subcategories?'
  129584.                         formatWith: actualClass name with: self category displayString))
  129585.         ifTrue: [
  129586.             self categories do: [:category |
  129587.                 self actualClass removeCategory: category]]!
  129588.  
  129589. removeMethodsInProtocol
  129590.     "Private - Remove all of the methods in the currently selected protocol.
  129591.     As this is pretty drastic we give the user a second chance."
  129592.  
  129593.     | actualClass |
  129594.     actualClass := self actualClass.
  129595.     self protocols do: [:p | 
  129596.         (MessageBox new
  129597.                 defaultButton: 2;
  129598.                 owner: self view;
  129599.                 confirm: ('Are you sure you would like to remove the protocol %2 and all of its methods from %1?'
  129600.                         formatWith: actualClass name with: p displayString))
  129601.         ifTrue: [
  129602.             actualClass removeSelectors: (    (p methodsInBehavior: actualClass) 
  129603.                                                     collect: [:m | m selector])]]!
  129604.  
  129605. renameInstanceVariable
  129606.     "Private - Initiate a rename of the  first selected instance variable."
  129607.  
  129608.     variablesPresenter view editSelectionLabel!
  129609.  
  129610. renameIt
  129611.     self perform: self renameItCommand!
  129612.  
  129613. renameItCommand
  129614.     "Private - Answer the appropriate rename command for the context sensitive 'Rename It' command, given
  129615.     the current focus in the receiver."
  129616.  
  129617.     | focus |
  129618.     focus := View focus.
  129619.     focus == categoriesPresenter view ifTrue: [^#renameMethodCategory].
  129620.     focus == protocolsPresenter view ifTrue: [^#renameMethodProtocol].
  129621.     focus == variablesPresenter view ifTrue: [^#renameInstanceVariable].
  129622.     ^nil!
  129623.  
  129624. renameMethodCategory
  129625.     "Private - Rename the current category. This is complicated by the pseudo category hierarchy which
  129626.     is built up - if a branch category is renamed, then we need to rename all its sub-categories."
  129627.  
  129628.     | originalCategory actualClass originalSubNames newName catman |
  129629.     originalCategory := self category.
  129630.     actualClass := self actualClass.
  129631.     originalSubNames := originalCategory subNames.
  129632.     catman := actualClass methodCategoryClass.
  129633.     newName := (CategoryPrompter createOn: originalCategory asValue)
  129634.                 list: catman allMethodCategories;
  129635.                 caption: 'Rename  ' , originalCategory name printString , ' within ' , actualClass name;
  129636.                 allowIntermediates: originalCategory isIntermediate;
  129637.                 showModal.
  129638.     (newName notNil and: [newName ~= originalCategory]) 
  129639.         ifTrue: 
  129640.             [| rootSubNames catClass |
  129641.             catClass := actualClass methodCategoryClass.
  129642.             rootSubNames := newName subNames.
  129643.             self categories do: 
  129644.                     [:category | 
  129645.                     | methods subNames newSubNames name newCategory |
  129646.                     subNames := category subNames.
  129647.                     newSubNames := rootSubNames copy , (subNames copyFrom: originalSubNames size + 1).
  129648.                     name := String new.
  129649.                     newSubNames do: [:subName | name := name , subName]
  129650.                         separatedBy: [name := name copyWith: catClass separator].
  129651.                     newCategory := catClass name: name.
  129652.  
  129653.                     "Ensure it is in the category tree"
  129654.                     categoriesPresenter model addCategory: newCategory.
  129655.                     methods := category methodsInBehavior: actualClass.
  129656.                     category removeClass: actualClass.
  129657.                     methods do: [:m | newCategory addMethod: m]].
  129658.             self actualClass: actualClass.
  129659.             categoriesPresenter selection: newName
  129660.                 ifAbsent: [categoriesPresenter selection: (IntermediateCategory name: newName name)].
  129661.             categoriesPresenter model remove: originalCategory]!
  129662.  
  129663. renameMethodProtocol
  129664.     "Private - Rename the current method protocol."
  129665.     
  129666.     protocolsPresenter view editSelectionLabel!
  129667.  
  129668. resetFor: aClass 
  129669.     "Reset the receiver to place it into a state required to display aClass"
  129670.  
  129671.     !
  129672.  
  129673. saveComment
  129674.     "Private - Save the class comment currently in the comment window"
  129675.  
  129676.     commentPresenter isModified: false.
  129677.     self selectedClass comment: self classComment.
  129678. !
  129679.  
  129680. saveDefinition
  129681.     "Private - Save the class definition currently in the definition window"
  129682.  
  129683.     "Compile the class definition"
  129684.  
  129685.     definitionPresenter isModified: false.
  129686.     
  129687.     [| aClass |
  129688.     aClass := definitionPresenter evaluateRange: (1 to: definitionPresenter textLength)
  129689.                 ifFail: [^self]] 
  129690.             on: Error
  129691.             do: [:e | e okCancel]!
  129692.  
  129693. saveNewMethod
  129694.     "Private - Save the text of the method source as a new method in the current category
  129695.     or leave unclassified if no suitable category is selected."
  129696.  
  129697.     self saveNewMethod: methodBrowserPresenter source!
  129698.  
  129699. saveNewMethod: aString
  129700.     | method newMethod |
  129701.     method := self method.
  129702.     newMethod := method isNil 
  129703.                 ifTrue: 
  129704.                     [| cat class categories |
  129705.                     cat := self category.
  129706.                     categories := (cat notNil and: [cat acceptsAdditions]) 
  129707.                                 ifTrue: [Array with: cat]
  129708.                                 ifFalse: [self model defaultMethodCategories].
  129709.                     class := self classForNewMethod.
  129710.                     class isNil ifTrue: [^self].
  129711.                     methodBrowserPresenter 
  129712.                         saveMethod: aString
  129713.                         in: class
  129714.                         categories: categories
  129715.                         package: self packageForNewMethod]
  129716.                 ifFalse: [newMethod := methodBrowserPresenter saveMethod: aString fromOriginal: method].
  129717.     "When a method is saved it may no longer match the filter. If this is the case we reselect method
  129718.      causing the filter to be reset, preserving the status model value in case there were any compilation
  129719.      warnings."
  129720.     (newMethod notNil and: [self method ~~ newMethod]) 
  129721.         ifTrue: 
  129722.             [| status |
  129723.             status := statusModel value.
  129724.             self method: newMethod.
  129725.             statusModel value: status]!
  129726.  
  129727. selectedClass
  129728.     "Private - Answer the class selected in the classes tree (or nil if there is no selection)."
  129729.  
  129730.     ^classesPresenter selectionOrNil!
  129731.  
  129732. selectMethod: aCompiledMethod 
  129733.     "Refine the browser's selection to be browsing the <CompiledMethod> argument."
  129734.  
  129735.     "Note that we check to see if aCompiledMethod is a valid method, this
  129736.     is because the hidden UndefinedObject>>doIt method may be supplied
  129737.     or some other problem with the method may have ensued. There is a chance
  129738.     this may hide some problems so beware."
  129739.  
  129740.     | selector class |
  129741.     class := aCompiledMethod methodClass.
  129742.     selector := aCompiledMethod selector.
  129743.     (class includesSelector: selector) 
  129744.         ifTrue: [self method: (class compiledMethodAt: selector)]
  129745.         ifFalse: [self actualClass: class]!
  129746.  
  129747. setMethodsFilter: aMonadicValuable
  129748.     methodBrowserPresenter
  129749.         list: (self methodsMatching: aMonadicValuable) asOrderedCollection;
  129750.         filter: aMonadicValuable!
  129751.  
  129752. showMethodsInClasses
  129753.     "Private - Answer a collection of classes to search for the methods to display in the receiver"
  129754.  
  129755.     ^self actualClass withAllSuperclasses!
  129756.  
  129757. statusText: aString 
  129758.     statusModel 
  129759.         value: (aString isNil ifFalse: [Notification new messageText: aString])!
  129760.  
  129761. toggleFilterObjectMethods
  129762.     "Toggle between showing <Object> methods or not"
  129763.  
  129764.     (flags := flags mask: FilterObjectMethodsMask set: self isFilterObjectMethods not).
  129765.     self onClassSelected!
  129766.  
  129767. toggleProtocolReadOnly
  129768.     "Toggle the currenty method protocol between read-only and updatable status."
  129769.  
  129770.     | prot |
  129771.     prot := self protocols first.
  129772.     prot isReadOnly: prot isReadOnly not!
  129773.  
  129774. toggleShowInheritedMethods
  129775.     "Toggle between showing inherited methods or not"
  129776.  
  129777.     (flags := flags mask: ShowInheritedMethodsMask set: self isShowInheritedMethods not).
  129778.     self onClassSelected!
  129779.  
  129780. updateCaption
  129781.     "Private - The receiver has changed in such a way that the caption may need to be refreshed.
  129782.     Do this here"
  129783.  
  129784.     | text |
  129785.     text := self method notNil 
  129786.                 ifTrue: [self methodCaption]
  129787.                 ifFalse: 
  129788.                     [| class |
  129789.                     class := self actualClass.
  129790.                     class isNil ifTrue: [self class displayString] ifFalse: [self classCaption]].
  129791.     self caption: text!
  129792.  
  129793. updateCategories
  129794.     "Private - Update the tree of method categories, attempting to maintain
  129795.     the current selection."
  129796.  
  129797.     | class |
  129798.     class := self actualClass.
  129799.     class isNil
  129800.         ifTrue: [categoriesPresenter model clear]
  129801.         ifFalse: [ | last |
  129802.             last := self category.
  129803.             "Set up the category tree for the class"
  129804.             categoriesPresenter model list: self actualClassChainCategories asOrderedCollection.
  129805.             categoriesPresenter expand: categoriesPresenter model title.
  129806.             (last isNil or: [(categoriesPresenter selection: last ifAbsent: []) ~= last])
  129807.                 ifTrue: [ | allCategory |
  129808.                     allCategory := categoriesPresenter model title.
  129809.                     categoriesPresenter selection: allCategory]]
  129810. !
  129811.  
  129812. updateFilters
  129813.     "Private - Update the various filter lists displayed in the middle pane of the
  129814.     browser."
  129815.  
  129816.     self updateCategories; updateProtocols; updateVariables
  129817. !
  129818.  
  129819. updateMethodsInCategory
  129820.     "Private - Set the methods of the receivers methodBrowserPresenter so it
  129821.     only shows methods of the selected class and any selected categories."
  129822.  
  129823.     self setMethodsFilter: self categoriesFilter!
  129824.  
  129825. updateMethodsInProtocol
  129826.     "Private - Set the methods of the receivers methodBrowserPresenter so it
  129827.     only shows methods of the selected class and any selected protocols."
  129828.  
  129829.     | filter |
  129830.     filter := self protocols isEmpty 
  129831.                 ifTrue: [self classMethodFilter]
  129832.                 ifFalse: [self protocolsMethodFilter].
  129833.     self setMethodsFilter: filter!
  129834.  
  129835. updateMethodsReferencingVariables
  129836.     "Private - Set the methods of the receivers methodBrowserPresenter so it
  129837.     only shows methods of the selected class which reference any of the 
  129838.     selected instance variables."
  129839.  
  129840.     self setMethodsFilter: self variablesFilter!
  129841.  
  129842. updatePackage
  129843.     "Private - Update the currently displayed package to reflect the package which owns
  129844.     either the current method or class."
  129845.  
  129846.     | package |
  129847.     self hasMethodSelected ifTrue: [package := self method owningPackage].
  129848.     (package isNil and: [self hasClassSelected]) ifTrue: [
  129849.         package := self selectedClass owningPackage].
  129850.     packageModel value: package.
  129851. !
  129852.  
  129853. updateProtocols
  129854.     "Private - Update the list of protocols implemented by the class, attempting to maintain
  129855.     the current selection."
  129856.  
  129857.     | class |
  129858.     protocolsPresenter hasView ifFalse: [^self].
  129859.     (class := self actualClass) isNil
  129860.         ifTrue: [protocolsPresenter clear]
  129861.         ifFalse: [ | last |
  129862.             last := self protocols.
  129863.             protocolsPresenter model list: (class allProtocols asSortedCollection: [:a :b | a name < b name]).
  129864.             "If there was previously no selection, then the list view won't issue a selection change
  129865.              event, so we must forcibly refresh the methods list"
  129866.             last isEmpty
  129867.                 ifTrue: [self onProtocolSelected]
  129868.                 ifFalse: [protocolsPresenter selection: last ifAbsent: []]]!
  129869.  
  129870. updateVariables
  129871.     "Private - Update the list of instance variables in this class and its superclasses."
  129872.  
  129873.     | class |
  129874.     variablesPresenter hasView ifFalse: [^self].
  129875.     (class := self actualClass) isNil 
  129876.         ifTrue: [variablesPresenter clear]
  129877.         ifFalse: 
  129878.             ["Construct a list associating each class with each of its instance variables"
  129879.             | vars |
  129880.             vars := OrderedCollection new: 20.
  129881.             class withAllSuperclasses reverseDo: 
  129882.                     [:eachClass | 
  129883.                     eachClass instVarNames do: [:eachInstVar | vars addLast: eachClass -> eachInstVar]].
  129884.             variablesPresenter model list = vars 
  129885.                 ifFalse: 
  129886.                     [| selectedVars |
  129887.                     selectedVars := variablesPresenter selection.
  129888.                     variablesPresenter model list: vars.
  129889.                     selectedVars := selectedVars intersection: vars.
  129890.                     selectedVars isEmpty 
  129891.                         ifFalse: 
  129892.                             [variablesPresenter selection: selectedVars.
  129893.                             ^self]].
  129894.             "If there will be no selection, then the list view won't issue a selection change
  129895.              event, so we must forcibly refresh the methods list"
  129896.             self onVariableSelected]!
  129897.  
  129898. validateProtocol: targetProtocol renameTo: newName 
  129899.     "Private - Warn that renaming a protocol is not wise, especially if it already has conforming
  129900.     classes."
  129901.  
  129902.     | otherClasses msg |
  129903.     msg := String writeStream.
  129904.     (Object methodProtocolClass exists: newName) 
  129905.         ifTrue: 
  129906.             [msg
  129907.                 nextPutAll: 'You cannot rename ';
  129908.                 display: targetProtocol;
  129909.                 nextPutAll: ' to ';
  129910.                 print: newName;
  129911.                 nextPutAll: ' because a protocol with that name already exists'.
  129912.             MessageBox errorMsg: msg contents.
  129913.             ^false].
  129914.     otherClasses := (targetProtocol baseBehaviors)
  129915.                 remove: self actualClass ifAbsent: [];
  129916.                 yourself.
  129917.     otherClasses isEmpty 
  129918.         ifTrue: 
  129919.             [msg
  129920.                 nextPutAll: 'The protocol ';
  129921.                 display: targetProtocol;
  129922.                 nextPutAll: ' is not currently implemented by any other class hierarchies.';
  129923.                 cr;
  129924.                 nextPutAll: 'Even so are you sure that you would like to rename it to ';
  129925.                 print: newName;
  129926.                 nextPut: $?]
  129927.         ifFalse: 
  129928.             [msg
  129929.                 nextPutAll: 'The protocol ';
  129930.                 display: targetProtocol;
  129931.                 nextPutAll: ' is also implemented by unrelated or superclass hierarchies';
  129932.                 cr;
  129933.                 nextPutAll: 'with the following roots:';
  129934.                 cr.
  129935.             otherClasses asSortedCollection do: 
  129936.                     [:c | 
  129937.                     msg
  129938.                         crtab;
  129939.                         display: c].
  129940.             msg
  129941.                 cr;
  129942.                 cr;
  129943.                 nextPutAll: 'If this protocol is renamed these classes or their clients may be adversely affected.';
  129944.                 cr;
  129945.                 nextPutAll: 'Are you sure that you would like to proceed (not recommended)?'].
  129946.     ^(MessageBox new)
  129947.         defaultButton: 2;
  129948.         caption: 'Renaming protocol ' , targetProtocol displayString;
  129949.         confirm: msg contents!
  129950.  
  129951. variables
  129952.     "Private - Answer a <collection> of all the instance variables names
  129953.     which are currently selected."
  129954.  
  129955.     ^variablesPresenter hasView 
  129956.         ifTrue: [variablesPresenter selectionOrNil]
  129957.         ifFalse: [#()]!
  129958.  
  129959. variablesFilter
  129960.     ^self variables isEmpty 
  129961.         ifTrue: [self classMethodFilter]
  129962.         ifFalse: [self variablesMethodFilter]!
  129963.  
  129964. variablesIndices
  129965.     "Private - Answer an <Array> of indices of the selected instance variable"
  129966.  
  129967.     | varNames |
  129968.     varNames := self actualClass allInstVarNames.
  129969.     ^self variables collect: [:iv | varNames indexOf: iv value].
  129970. !
  129971.  
  129972. variablesMethodFilter
  129973.     "Private - Answer a <monadicValuable> that, when passed a <CompiledMethod>, answers true if the
  129974.     method should be displayed in the receiver by warrant of the variable that is selected"
  129975.  
  129976.     | indices |
  129977.     indices := self variablesIndices.
  129978.     ^
  129979.     [:m | 
  129980.     (self classMethodFilter value: m) 
  129981.         and: [m interpreter accessesInstVarAtAnyOf: indices]]! !
  129982.  
  129983. ClassHierarchyDiagram comment:
  129984. 'ClassHierarchyDiagram is a <SmalltalkToolShell> that displays the current class hierarchy in a graphical format using a <MoenTreeView>.
  129985.  
  129986. Instance Variables:
  129987.     classesPresenter    <TreePresenter> displaying the class hierarchy.
  129988.     commentPresenter    <SmalltalkWorkspace> displaying the comment of the selected class.
  129989.  
  129990. '!
  129991. !ClassHierarchyDiagram class methodsFor!
  129992.  
  129993. σA!! 4░«6-│╜à%ï>φ⌡∞╧√█┌╟┐µ¬AP╥╤⌐E`]F╫û~VÆYE?bOro  òVh'CéPo««2√╩M╗≈┌⌠₧ªP^╘<H-f╙▓ió╚╙J╥5çyσp╛tû╖w@xó,▄▄KôUg⌐#0╥ü╨─╔ªvÜæÿûoOΘ┬_MñtA]╙╜tùƒ»-▐P═÷u╣Ç[╓Pbï÷ò├<≡º÷φ≡½αIH∙ºæi|L/{!
  129994.  
  129995. σM4
  129996. 99╜á<s·¿┐>ù:α┘éªùò■┼«≈½W »╧;r{B└ü?_█Ej]OAb±┴    Qi5Jπ[k░¬#ε█PΦ╢Ñ¢╖╬\ ÆdL}e╘¿l&º╞╬GôVçpεQ│~òΩT]I9≥$₧₧LÅGf┴jU─¥╓·╚αdëï█çsO╜⌠R½tD9∩à^┤╢^╘U=╔^╫V²(yφ≈m╓cb╠e±¢áHuá╜╕┌Θ»µaQ■!
  129997.  
  129998. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  129999. σäM&2G¬oi«¬3Θ£/j┼▌▐á┤îTÆxXI.d▀║l'ó▌ΘZG¢!
  130000.  
  130001. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A,╢éXu5╡}Acú⌐, ═ m┬▐▐ì≥├^₧zWga╓╡w7├ú⌐% {∙FúB║qä≡Z=≈aô╤IæGz╕3%└å╞√í╩ß ¢ƒáe║⌠Zb¡l~É╞0╤╤ºR*└YÜⁿ"mΩßw╬Fk╥▓╙ì┘╟æ∞σíτtY½╘╜?Fj4└gë~#tCVë╚ÖñpkSI╘█oƒHô!
  130002.  
  130003. ±Q%<+¼è6⌐╣ë)æ,î╛åÄ▀┘╠┬╗ασRπù╧tx]Fµà<^Æ%hGc
  130004. ╢▌?Jv#L╖"@*▓╛"÷╫Q¡│≈£εÅÆ4Lme╙¬h αï¡3% ¡^f╗S│o╨ΘSC+Θa¢ JîGw╕u╛°¬ƒ═ñw╥M╫║Çl
  130005. ¡σF¡o~âßi₧£MΓT<╔v▄9π(o░£¿+┘0ñ╬ÉAx╡!
  130006.  
  130007. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]J▒▓╘rrD_╚ü~FƒZ8kXVb≤ô^It/@▒<GeΓ╣%≈╤TΦ▒Ñæ·ÅÆ4M}t▀▒#_─á⌐JMÖ╙{ºM┐iÖ≡XU Uï▌│3±(ƒ=▀₧╫≈└½3îë₧ƒsú⌠YPæyoçΓ^┤╢6⌡D"├I▀%Ω>uⁿ╩^═Nj┼-ÿ▀îJZ▓ú²·║F╗±lZ∙⌠╜ACFt;₧Ω>*":á~╪ÿñ^d/WI╚╡ äVX╓π╘┤·! !
  130008.  
  130009. !ClassHierarchyDiagram methodsFor!
  130010.  
  130011. ΓV"!!=çÇ?9╡ºë$æ,î╛åÄ▌┼┌╘¬≈σGK║√╨iv[S▄É;@äG%`ORb≤à^[f[½yxº¿%≤╚GΩ┌▌≤¥ª çqL@mr▀╜y7ì╞═IG¢¥fα.▄ô²B\ +╤vÜ═\ÆVq╛@fÄ╥╨≤└ª3ë    ¢┴╙_»ΓDl½ezÉ∞;╟∞ZδD,╪P╚V²(v╣╔y╧G4Çx▓╨éWg╢╜┐░ìl┴≈oQ┤σ╝2wCFh&ïúMm1\U┼ìÄÑ-NM╓ì;èV    í ├│∩qσ╣äìö;óú╟┬mKU│q±
  130012. zKÑ!
  130013.  
  130014. ΓV"!!=ùî:,╖¿ÿ#åΦ╞µ┬∙║╡╝ⁿ╤╖VB½╛Ço{M╞û7UÉZVjyRAb±┴Vtf[½yxº¿%≤╚GΩ┌▌≈ÜÑuéd[.c╚╣l&½·├QMÿçvÖJñt₧▓<%dRêgô▀JÅGg£9└ù═Γ╔▓3σg÷≥ät
  130015. á½úcrìß█═YΦS"╔[Ü÷#eúç;└Pa╫,┤⌡ù`╝⌠╕²∞╗τeOë≥╖kRP=_Σcè8tA
  130016. ëT▐åñZy5LB∙ë.à]Æ░┬╜≥e╛·┬┬ö╣Γ┌ⁿ;╣x╝{óól╠k!
  130017.  
  130018. τM)4Ñ£!!D╨└╬ù0∞─√▀╛╤╨╟■≤σPO╛¿╙;}I[╫─?\ôB#`_@+Γ┴    Pr.F¡<Gbºδ2 ▌G    ╛▓Ñ╨╖°¢4_me╩¿-%º┼─4"ⁿÆq½G÷~£∩B9∞a▀╪KôO4╕9ôç╨≤▐ε1σg÷÷∙ε≥[E▒sJg∩àZ▌╙^⌠RoûÜ÷!!g╣╩w╞GbÇ<╣╙îWqÉó∙φ≤H┼₧    _╡ßíBkIA%o>╬σ#"dJ
  130019. ë,╬ï▓Jh/s^▀Æ*àNä░┬╜≡dτ«ê┬öd⌡α┼▄
  130020. !
  130021.  
  130022. εJ4+╖╝7%┐¬ÿ/üRï╜¡φ╛┘┌┬■±⌐RP¼√╚z`T╫ü0äZH/mOVoA╢│_t#\½<Gbºδ#⌡╙Oªú≈Ä÷┴\·3jc╒▒`7á▌≡KMå¥p╝╡qòε"cQΓh₧═JÖQD╛/╓£╫≤▐α{ë¼₧ƒy ║°XJΓi OÉ·6äƒdè+FÑ\╒■(oφ≈j╟Qk╬+┤╬├Pq½║ó╛π
  130023. ⌐τsY¬╨á`HAtr¥∩3eF_╟W╬ç¼\c(q!
  130024.  
  130025. εJ0/ïƒ7'┐¡ß@∞}╙╤∞╔≈┴┌╤■σ¡VM »╚~3ZS╤ü7DÆM9.MZn╢êd#J¡<Pe¼Ñ%∙╩Gµ≈äù∙╠^â|[@mo╫¼a7║╠ÇQAÉÆvªZ█∙∩C*µa╙₧UÖV3┐@3╨æ╓µ╒α~çï█£zO║∙Rúv rÄε1╥┌⌠B=╔Z╘V≥?d°ë:»(¬Vó╔ôAf≤í÷╚Θ┐█pY╖σ╢Do/Fj4╬Ω'1]U╩╠ì¡\7| z╙ä8╦^à√┼╖∞!!≤╡ô╞╗,░Γë┴20µ<⌐_=Å█├aZ ¢Æú£┌[₧╪╤πP┤(¬j∩7Σδ⌠àZH`C! !
  130026.  
  130027. Debugger comment:
  130028. 'Debugger is a <SmalltalkToolShell> that implements the standard debugging tool. The debugger is usually invoked from a walkback dialog by pressing the Debug button. Walkbacks are displayed in the development environment when a breakpoint (''self halt'') is encountered, or when an unhandled exception occurs. It is also possible to configure the system so that debuggers are opened automatically when breakpoints are encountered or errors occur (see the Debugger options in Dolphin Options), though this is not particularly recommended as it can make the system crash if the error or breakpoint is in some code that is itself used by the Debugger.
  130029.  
  130030. Dolphin''s Debugger does not simulate execution as in some Smalltalk''s, but instead uses the VM''s built-in debugging event generation to run the code and interrupt it at appropriate points. This results in more consistent and faster execution, although note that the debugger will recompile methods being stepped through to insert breakpoints and this may cause some peephole compiler optimizations to be lost.
  130031.  
  130032. The protocol <debugEventHandler> shows the messages sent (indirectly via Processor) by the VM when debug events occur such as breakpoints and single-steps. These debug events could quite easily be used for other purposes such as profiling tools. However note that this protocol is private, and may change in future versions. It is worth noting that single-step events are generated by hooking into the message dispatch mechanism in such a way that has no measurable effect on the speed of normal operation, and breakpoints are generated by inserting a breakpoint instruction rather than by performing conditional tests (i.e. the VM does not contain any code to support debugging which would slow down normal operation, and hence there is no separate debug/release build).
  130033.  
  130034. Dolphin serializes callback returns to maintain LIFO order on the machine stack even in the presence of multiple threads of execution (Smalltalk Processes) and thus it is quite feasible to debug into callbacks which route through external code such as parts of the OS, for example one can step into a SendMessage call and break in the Dolphin window procedure. One can also debug through COM method invocations, even back into Dolphin, and set breakpoints in COM method implementations that will be actioned even when the COM object is being hosted by an external client such as VB. However this is a Smalltalk debugger, and one cannot use it to debug into external code written in other languages.
  130035.  
  130036. Caution: Although modifying the Debugger can be fun it is quite easy to crash the system if a mistake is made. You should also note that if you develop your own custom view the use of a virtual ListView for the stack presenter is not recommended since the stack may change dynamically and become momentarily invalid at just the point that the control requests display details.
  130037.  
  130038. Instance Variables:
  130039.     process            <Process> being debugged.
  130040.     topFrame            <StackFrame> which is at the top of the debugger''s stack.
  130041.     temp            <Object> the contents of the currently selected instance variable.
  130042.     tempCount        <integer> count of temporaries in the currently selected stack frame.
  130043.     depth            <integer> count of stack frames currently listed.
  130044.     flags            <integer> flags controlling the debugger''s behaviour.
  130045.     breakWhen        <monadicValuable> used to determine the next execution should be interrupted.
  130046.     stackPresenter        <ListPresenter> used to display the stack frames.
  130047.     sourcePresenter        <SmalltalkWorkspace> holding the source/this assembly of the selected frame.
  130048.     tempsPresenter        <ListPresenter> holding the list of temporaries in the selected frame.
  130049.     inspectorPresenter        <SmalltalkWorkspace>  holding the value of the selected temporary variable.
  130050.     breakAction        <niladicValuable>. The second half of a composite action to be performed after an unwind.
  130051.     suspendingList        <Semaphore> on which debugged process was suspended when interrupted (or nil if none).
  130052.  
  130053. Class Variables:
  130054.     AnimateMask        <integer> bit-mask for testing/setting the animation flag
  130055.     AnimatePause        <integer> delay between steps when animating.
  130056.     DefaultStackDepth         <integer> initial depth of the process stack display
  130057.     DisassemblyMask        <integer> bit-mask for testing/setting the disassembly view flag
  130058.     EnableDynamicMenus    <boolean> option controlling whether dynamic menus are build and displayed or not.
  130059.     MainMask            <integer> bit-mask for testing/setting the main Process flag
  130060.     RestartOnMethodSave    <boolean> option controlling whether saving a modified method restarts the frame
  130061.     ResumableMask        <integer> bit-mask for testing/setting the resumable Process flag
  130062.     RunMask             <integer> bit-mask for testing/setting the running flag.
  130063.     ShowWalkbacks        <boolean> option controlling whether walkback dialogs are displayed or not
  130064.     SkipMethods        <LookupTable> of methods not to break in.
  130065.     StackDepthIncrement    <integer> number of frames by which to increase the depth of the stack on request.
  130066.     TerminateOnClose        <Symbol>. Option controlling action on closing debugger in respect of the debugged process.
  130067. '!
  130068. !Debugger class methodsFor!
  130069.  
  130070. animatePause
  130071.     "Answer the number of milliseconds that instances of the receiver will pause between each step when 
  130072.     animating debugged processes."
  130073.  
  130074.     ^AnimatePause!
  130075.  
  130076. animatePause: milliseconds
  130077.     "Set the number of milliseconds that instances of the receiver will pause between each step when 
  130078.     animating debugged processes."
  130079.  
  130080.     AnimatePause := milliseconds!
  130081.  
  130082. debugPrintStringFor: anObject
  130083.     "Private - Answer the debugging string representation of the argument."
  130084.  
  130085.     ^[anObject debugPrintString] on: Error
  130086.         do: [:ex | 'an invalid ' , anObject basicClass name , ' {' , ex description , '}']!
  130087.  
  130088. defaultStackDepth
  130089.     ^DefaultStackDepth!
  130090.  
  130091. defaultStackDepth: anInteger
  130092.     DefaultStackDepth := anInteger!
  130093.  
  130094. displayOn: aStream
  130095.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  130096.     would want to see it."
  130097.  
  130098.     aStream nextPutAll: 'Debugger'
  130099. !
  130100.  
  130101. enableDynamicMenus
  130102.     "Answer whether dynamic menus can be used in instances of the receiver. These can be
  130103.     disabled to allow the dynamic menu framework to be debugged more easily."
  130104.  
  130105.     ^EnableDynamicMenus!
  130106.  
  130107. enableDynamicMenus: aBoolean
  130108.     "Set whether dynamic menus can be used in instances of the receiver. These can be
  130109.     disabled to allow the dynamic menu framework to be debugged more easily."
  130110.  
  130111.     EnableDynamicMenus := aBoolean!
  130112.  
  130113. icon
  130114.     "Answers an Icon that can be used to represent this class"
  130115.  
  130116.     ^##(self) defaultIcon!
  130117.  
  130118. initialize
  130119.     "Initialize the class variables of the receiver
  130120.  
  130121.         self initialize
  130122.     "
  130123.  
  130124.     StackDepthIncrement := 10.
  130125.     DefaultStackDepth := 40.
  130126.     MainMask := 16r1.
  130127.     RunMask := 16r2.
  130128.     DisassemblyMask := 16r4.
  130129.     ResumableMask := 16r8.
  130130.     AnimateMask := 16r10.
  130131.     
  130132.     AnimatePause := 200.
  130133.  
  130134.     self restartOnMethodSave: true.
  130135.     self enableDynamicMenus: true.
  130136.     self showWalkbacks: true.
  130137.     "The behaviour in versions of Dolphin prior to 4.0 was to always terminate processes on closure of the debugger"
  130138.     self terminateOnClose: #yes.
  130139.  
  130140.     Smalltalk developmentSystem registerTool: self.
  130141.     
  130142.     self initializeSkipTable!
  130143.  
  130144. initializeSkipTable
  130145.     "Initialize the table of methods to be skipped (in one way or another) when debugging.
  130146.         Debugger initializeSkipTable
  130147.  
  130148.     The idea of the skip table is to prevent the implementation of certain parts of the system
  130149.     (e.g. exception handling) from surfacing unduly when debugging - i.e. one doesn't want
  130150.     to repeatedly step through system code. The debugger may be instructed to step over
  130151.     individual methods in one of several ways according to the skip type, which is a bit mask:
  130152.  
  130153.         0    - Does not break in the method itself, but will step into subsidiary methods.
  130154.         1     - Does not break in the method or any of its subsidiary methods.
  130155.         2    - The method is a critical section and cannot be safely debugged. Do not stop regardless of mode.
  130156.         3    - Combination of 1 and 2.
  130157.     "
  130158.  
  130159.     SkipMethods := LookupTable new.
  130160.     self
  130161.         skipSelector: #critical:
  130162.             of: Mutex
  130163.             type: 3;
  130164.         skipSelector: #at:
  130165.             of: ObjectRegistry
  130166.             type: 0;
  130167.         skipSelector: #ifCurtailed:
  130168.             of: BlockClosure
  130169.             type: 0;
  130170.         skipSelector: #on:do:
  130171.             of: BlockClosure
  130172.             type: 0;
  130173. "        skipSelector: #on:do:on:do:
  130174.             of: BlockClosure
  130175.             type: 0;"
  130176.         skipSelector: #ensure:
  130177.             of: BlockClosure
  130178.             type: 0;
  130179.         skipSelector: #on:do:
  130180.             of: ExceptionHandlerAbstract class
  130181.             type: 0;
  130182.         skipSelector: #on:do:
  130183.             of: ExceptionHandler
  130184.             type: 0;
  130185.         skipSelector: #try:
  130186.             of: ExceptionHandlerAbstract
  130187.             type: 0;
  130188.         skipSelector: #markAndTry
  130189.             of: ExceptionHandlerAbstract
  130190.             type: 0;
  130191.         skipSelector: #new
  130192.             of: ExceptionHandlerSet class
  130193.             type: 1;
  130194.         skipSelector: #on:do:
  130195.             of: ExceptionHandlerSet
  130196.             type: 1;
  130197.         skipSelector: #exceptionEnvironment:
  130198.             of: Process
  130199.             type: 0;
  130200.         skipSelector: #noEventsDo:
  130201.             of: Object
  130202.             type: 0;
  130203.         skipSelector: #trigger:
  130204.             of: Object
  130205.             type: 0;
  130206.         skipSelector: #trigger:with:
  130207.             of: Object
  130208.             type: 0;
  130209.         skipSelector: #trigger:with:with:
  130210.             of: Object
  130211.             type: 0;
  130212.         skipSelector: #trigger:withArguments:
  130213.             of: Object
  130214.             type: 0;
  130215.         skipSelector: #triggerEvent:
  130216.             of: EventsCollection
  130217.             type: 0;
  130218.         skipSelector: #triggerEvent:with:
  130219.             of: EventsCollection
  130220.             type: 0;
  130221.         skipSelector: #triggerEvent:with:with:
  130222.             of: EventsCollection
  130223.             type: 0;
  130224.         skipSelector: #triggerEvent:withArguments:
  130225.             of: EventsCollection
  130226.             type: 0;
  130227.         skipSelector: #do:
  130228.             of: EventMessageSequence
  130229.             type: 0;
  130230.         skipSelector: #valueWithArguments:
  130231.             of: EventMessageSend
  130232.             type: 0    ";
  130233.         skipSelector: #at:ifAbsent: of: SharedLookupTable type: 0"!
  130234.  
  130235. publishedAspects
  130236.     "Answer a <LookupTable> of the <Aspect>s published by the receiver."
  130237.  
  130238.     ^(super publishedAspects)
  130239.         add: (Aspect boolean: #showWalkbacks);
  130240.         add: (Aspect boolean: #restartOnMethodSave);
  130241.         add: (Aspect boolean: #enableDynamicMenus);
  130242.         add: (Aspect choice: #terminateOnClose from: #(#yes #no #prompt));
  130243.         add: ((Aspect integer: #animatePause)
  130244.                     isNullable: false;
  130245.                     yourself);
  130246.         add: ((Aspect integer: #defaultStackDepth)
  130247.                     isNullable: false;
  130248.                     yourself);
  130249.         yourself!
  130250.  
  130251. restartOnMethodSave
  130252.     "Answer true if instances of the receiver automatically restart a stack frame when
  130253.     the method is saved in that frame."
  130254.  
  130255.     ^RestartOnMethodSave!
  130256.  
  130257. restartOnMethodSave: aBoolean
  130258.     "Sets whether instances of the receiver automatically restart a frame in which
  130259.     the method is modified and saved."
  130260.  
  130261.     RestartOnMethodSave := aBoolean!
  130262.  
  130263. show: titleString process: aProcess topFrame: aStackFrame resumable: aBoolean
  130264.     "Private - Show an instance of the receiver on the <Process>, aProcess, configured appropriately
  130265.     for the other arguments."
  130266.  
  130267.     Cursor wait showWhile: [
  130268.         self create
  130269.             caption: titleString;
  130270.             process: aProcess topFrame: aStackFrame;
  130271.             resumable: aBoolean;
  130272.             show]!
  130273.  
  130274. showWalkbacks
  130275.     "Answer true if a walkback is brought up before the debugger"
  130276.  
  130277.     ^ShowWalkbacks!
  130278.  
  130279. showWalkbacks: aBoolean
  130280.     "Set the option indicating whether a walkback is brought up before the debugger to aBoolean"
  130281.  
  130282.     ShowWalkbacks := aBoolean!
  130283.  
  130284. skipSelector: selector of: behavior type: typeMask
  130285.     "Private - Add the specified method to the set of those skipped by the debugger
  130286.     The typeMask specifies what type of skip-over the Debugger will perform when
  130287.     encountering a debug halt/step in the method:
  130288.         0    - Does not break in the method itself, but will step into subsidiary methods.
  130289.         1     - Does not break in the method or any of its subsidiary methods.
  130290.         2    - The method is a critical section and cannot be safely debugged. Do not stop regardless of debug mode."
  130291.  
  130292.     (SkipMethods at: behavior ifAbsentPut: [IdentityDictionary new]) at: selector put: typeMask!
  130293.  
  130294. terminateOnClose
  130295.     "Answer a <Symbol> which indicates whether instances of the receiver will terminate 
  130296.     the debugged process when closed (one of #yes, #no, and #prompt)."
  130297.  
  130298.     ^TerminateOnClose!
  130299.  
  130300. terminateOnClose: aSymbol
  130301.     "Set whether instances of the receiver will terminate the debugged process when closed."
  130302.  
  130303.     TerminateOnClose := aSymbol!
  130304.  
  130305. uninitialize
  130306.     "Private - Uninitialize the receiver prior to remove from the system."
  130307.  
  130308.     Smalltalk developmentSystem unregisterTool: self!
  130309.  
  130310. unskipSelector: selector of: behavior
  130311.     "Private - Remove the specified method to the set of those skipped by the debugger."
  130312.  
  130313.     (SkipMethods at: behavior ifAbsent: [^self]) removeKey: selector ifAbsent: []!
  130314.  
  130315. unskipSelectorsOf: behavior
  130316.     "Private - Remove any methods of the <Behavior>, behavior, from the
  130317.     set of those skipped by the debugger."
  130318.  
  130319.     SkipMethods removeKey: behavior ifAbsent: []! !
  130320.  
  130321. !Debugger methodsFor!
  130322.  
  130323. accept
  130324.     "Private - Saves the current method source, restarting the method frame if
  130325.     the system options so indicate.
  130326.     Implementation Note: Because we don't employ a separate presenter for the
  130327.     inspector text pane, we need to test the focus to see how to act on the command."
  130328.  
  130329.     inspectorPresenter hasFocus 
  130330.         ifTrue: [self acceptVariableValue]
  130331.         ifFalse: 
  130332.             [self accept: self class restartOnMethodSave methodSource: self source]!
  130333.  
  130334. accept: aBoolean methodSource: aString 
  130335.     "Private - Saves the current method source, optionally restarting the frame depending on the
  130336.     value of the <Boolean> argument.."
  130337.  
  130338.     | method originalSelection hadErrors |
  130339.     originalSelection := sourcePresenter view selectionRange.
  130340.     method := self method.
  130341.     hadErrors := false.
  130342.     
  130343.     [| newMethod |
  130344.     newMethod := method methodClass 
  130345.                 compile: aString
  130346.                 categories: method categories
  130347.                 package: method owningPackage] 
  130348.             on: CompilerWarningNotification
  130349.             do: [:cw | cw okCancel]
  130350.             on: CompilerErrorNotification
  130351.             do: 
  130352.                 [:ce | 
  130353.                 hadErrors 
  130354.                     ifFalse: 
  130355.                         [hadErrors := true.
  130356.                         sourcePresenter
  130357.                             text: (method getColoredSource: aString);
  130358.                             selectionRange: ce range].
  130359.                 ce okCancel].
  130360.     hadErrors 
  130361.         ifFalse: 
  130362.             [sourcePresenter view selectionRange: originalSelection.
  130363.             aBoolean ifTrue: [self restartMethod] ifFalse: [sourcePresenter isModified: false]]!
  130364.  
  130365. acceptNoRestart
  130366.     "Private - Saves the current method source without restarting the frame (i.e. the debugged
  130367.     process becomes out of sync. with the current method)."
  130368.  
  130369.     self accept: false methodSource: self source!
  130370.  
  130371. acceptVariableValue
  130372.     "Private - Evaluate an expression in the inspectorPresenter and save the result
  130373.     as the new value of the selected variable in the temps list."
  130374.  
  130375.     | newValue |
  130376.  
  130377.     "If there is no selection then the entire workspace is selected for consistency
  130378.     with saving method source. This also works rather better with word wrap too."
  130379.     inspectorPresenter view hasSelection ifFalse: [inspectorPresenter view selectAll].
  130380.  
  130381.     "Evaluate the new value and keep a copy of the old value for undo purposes"
  130382.     newValue := inspectorPresenter evaluateItIfFail: [^self].
  130383.  
  130384.     self setSelectedVariableTo: newValue!
  130385.  
  130386. allFrames
  130387.     "Private - Include all stack frames in the call stack. There cannot possibly be 
  130388.     any more than the size of the process."
  130389.  
  130390.     self depth: process size!
  130391.  
  130392. animatePause
  130393.     "Answer the number of milliseconds to pause between each step when 
  130394.     animating the debugged process."
  130395.  
  130396.     ^self class animatePause
  130397. !
  130398.  
  130399. beAnimated: aBoolean
  130400.     "Private - Set/reset the animation flag."
  130401.  
  130402.     flags := flags mask: AnimateMask set: aBoolean!
  130403.  
  130404. beBroken
  130405.     "Private - Set the break flag."
  130406.  
  130407.     flags := flags maskClear: RunMask.    "no longer running"
  130408.     Processor enableInterrupts.
  130409.     self mainView enable
  130410.  
  130411.     !
  130412.  
  130413. beDisassembled: aBoolean
  130414.     "Private - Set/reset the receiver's disassembly flag."
  130415.  
  130416.     flags := flags mask: DisassemblyMask set: aBoolean!
  130417.  
  130418. beRunning
  130419.     "Private - Put the debugger and process into debug run mode."
  130420.  
  130421.     process debugger: self.
  130422.     flags := flags maskSet: RunMask!
  130423.  
  130424. blockedRestartWarning: message
  130425.     "Private - There seems to be a later callback  from the outside world which needs to return before 
  130426.     the debugged process can unwind an earlier callback. Refresh the display to show where 
  130427.     it is blocked, and then warn the user, giving them the opportunity to bang out."
  130428.  
  130429.     | resp |
  130430.     topFrame := process topFrame.
  130431.     self populateStackModel.
  130432.     resp := MessageBox new
  130433.             okCancel;
  130434.             caption: ('Restarting %1>>%2...' formatWith: message receiver class name with: message selector);
  130435.             warning:
  130436. 'The stack unwind required to restart this frame is currently blocked, probably due to a Debugger or dialog opened after this one.
  130437.  
  130438. To allow the restart to complete, you will need to find and close any such windows, in the meantime this debugger will be disabled.
  130439. Alternatively you can cancel this operation, which will stop this debugging session.'.
  130440.     resp == #cancel ifTrue: [self terminateProcess]!
  130441.  
  130442. break: interruptFrame 
  130443.     "Private - Break the debugged process at the specified break, and refresh the
  130444.     receiver's display (unless updates are deferred, i.e. the debugger is performing
  130445.     a composite operation which is only partially completed)."
  130446.  
  130447.     self beBroken.
  130448.     self isInCompositeOp 
  130449.         ifTrue: 
  130450.             [topFrame := interruptFrame.
  130451.             "Complete the composite op, but not in the debugged process"
  130452.             breakAction postToInputQueue.
  130453.             breakAction := nil]
  130454.         ifFalse: 
  130455.             ["Update the display if not part way through a composite operation"
  130456.  
  130457.             (topFrame = interruptFrame and: [self frame index <= interruptFrame index]) 
  130458.                 ifTrue: [self refreshFrame]
  130459.                 ifFalse: 
  130460.                     [topFrame := interruptFrame.
  130461.                     self populateStackModel]].
  130462.     self suspend
  130463.     "N.B. There must be no further code after this point"!
  130464.  
  130465. breakFrame: aStackFrame
  130466.     "Private - Set the frame on which to break."
  130467.  
  130468.     self makeDebugFrame: aStackFrame.
  130469.     self breakWhen: [:iFrame | iFrame index <= aStackFrame index]!
  130470.  
  130471. breakWhen: discriminator
  130472.     "Private - Set the break decision test to the monadic valuable, discriminator.
  130473.     The argument to the valuable is the StackFrame interrupted by a soft-breakpoint.
  130474.     If the discriminator answers false, then execution will continue to the next
  130475.     soft-breakpoint.
  130476.     Implementation Note: The discriminator should complete its operation as quickly    
  130477.     as possible, because it is evaluated with async. events disabled, and because
  130478.     the debugger will run debugged processes at a snail like pace at times."
  130479.  
  130480.     breakWhen := discriminator!
  130481.  
  130482. browseDefinitions
  130483.     "Private - Open a new method browser on the definitions of the
  130484.     of the currently selected stack frame's selector."
  130485.  
  130486.     self model browseDefinitionsOf: self method selector!
  130487.  
  130488. browseHierarchy
  130489.     "Private - Open a new class browser on the currently selected method
  130490.     or the system classes if there is no selection."
  130491.  
  130492.     "If we are attempting to browse a #doesNotUnderstand: method then
  130493.     we want to browse the original receiver's class since that's where we'll
  130494.     most likely want to implement the method."
  130495.  
  130496.     self method selector = #doesNotUnderstand: 
  130497.         ifTrue: [self systemModel browseHierarchy: self frame receiver class]
  130498.         ifFalse: [self systemModel browseMethodHierarchy: self method]!
  130499.  
  130500. browseIt
  130501.     "Open a default browser on the current method"
  130502.  
  130503.     tempsPresenter hasFocus ifTrue: [self browseVariableClass] ifFalse: [self browseHierarchy]!
  130504.  
  130505. browseMessages
  130506.     "Private - Browse the definitions of one of the messages sent within
  130507.     the method of the currently selected stack frame. Prompt for which message 
  130508.     to actually browse."
  130509.  
  130510.     self model browseMessagesIn: self method!
  130511.  
  130512. browseMethodInheritanceChain
  130513.     "Private - Open a method browser displaying the definitions of the 
  130514.     currently selected stack frame's method's selector in its
  130515.     superclass chain."
  130516.  
  130517.     self model browseMethodHierarchyFrom: self method!
  130518.  
  130519. browseReferences
  130520.     "Private - Open a new method browser on the references to the
  130521.     selector of the currently selected stack frame's method."
  130522.  
  130523.     self model browseReferencesTo: self method selector!
  130524.  
  130525. browseVariableClass
  130526.     temp browse!
  130527.  
  130528. buildParseTree
  130529.     ^self method ifNotNil: 
  130530.             [:method | 
  130531.             method isExpression 
  130532.                 ifTrue: [SmalltalkParser parseExpression: method getSource in: method methodClass]
  130533.                 ifFalse: [SmalltalkParser parseExistingMethodNoError: method]]!
  130534.  
  130535. canImplementMessage
  130536.     "Private - Answer whether the receiver can implement a stub for the message associated with 
  130537.     the current stack frame."
  130538.  
  130539.     | frame selector method |
  130540.     frame := self frame.
  130541.     method := frame method.
  130542.     selector := method selector.
  130543.     selector == #doesNotUnderstand: 
  130544.         ifTrue: [selector := frame arguments first selector].
  130545.     ^(Compiler isValidSelector: selector) 
  130546.         and: [method methodClass ~= frame receiver class]!
  130547.  
  130548. canSaveMethod
  130549.     "Private - Answer whether the text of the method displayed in the receiver can be saved."
  130550.  
  130551.     ^(self isRunning or: [self isAnimating]) not 
  130552.         and: [self isDisassembled not and: [self method isExpression not]]!
  130553.  
  130554. clearMethodInfo
  130555.     "Private - Set the parse tree cache for the current method to the DeafObject to distinguish the case 
  130556.     where the method has not yet been parsed from the case where the method failed to compile 
  130557.     (in which case methodAST will have the value nil)."
  130558.  
  130559.     _method := nil.
  130560.     methodAST := DeafObject current!
  130561.  
  130562. continue: aProcess with: anObject
  130563.     | frame |
  130564.     process debugger: nil.
  130565.     frame := aProcess suspendedFrame.
  130566.     self
  130567.         beBroken;
  130568.         caption: aProcess printString;
  130569.         process: aProcess topFrame: frame;
  130570.         return: anObject toFrame: frame!
  130571.  
  130572. createComponents
  130573.     "Create the presenters contained by the receiver"
  130574.  
  130575.     super createComponents.
  130576.     stackPresenter := self add: ListPresenter new name: 'stack'.
  130577.     tempsPresenter := self add: ListPresenter new name: 'temps'.
  130578.     inspectorPresenter := self add: SmalltalkWorkspace new name: 'inspector'.
  130579.     sourcePresenter := self add: SmalltalkWorkspace new name: 'source'.
  130580. !
  130581.  
  130582. createSchematicWiring
  130583.     "Create the trigger wiring for the receiver"
  130584.  
  130585.     super createSchematicWiring.
  130586.     self 
  130587.         when: #closeRequested:
  130588.         send: #onCloseRequested:
  130589.         to: self.
  130590.     stackPresenter
  130591.         when: #selectionChanging:
  130592.             send: #onFrameSelectionChanging:
  130593.             to: self;
  130594.         when: #selectionChanged
  130595.             send: #onFrameSelected
  130596.             to: self;
  130597.         when: #actionPerformed
  130598.             send: #browseIt
  130599.             to: self.
  130600.     tempsPresenter
  130601.         when: #selectionChanged
  130602.             send: #onTempSelected
  130603.             to: self;
  130604.         when: #actionPerformed
  130605.             send: #inspectIt
  130606.             to: self.
  130607.     sourcePresenter 
  130608.         when: #expressionEvaluated:
  130609.         send: #onExpressionEvaluated:
  130610.         to: self.
  130611.     inspectorPresenter 
  130612.         when: #expressionEvaluated:
  130613.         send: #onExpressionEvaluated:
  130614.         to: self.
  130615.     (self model)
  130616.         when: #methodUpdated:
  130617.             send: #onMethodUpdated:
  130618.             to: self;
  130619.         when: #methodRemoved:
  130620.             send: #onMethodRemoved:
  130621.             to: self!
  130622.  
  130623. cursorIPRange
  130624.     "Private - Answer the IP range which includes the current cursor position
  130625.     in the source pane."
  130626.  
  130627.     | pos map i start end frame |
  130628.     frame := self frame.
  130629.     self makeDebugFrame: frame.                "first make sure it is a debug frame."
  130630.     pos := sourcePresenter view caretPosition.
  130631.     map := frame textMap.
  130632.     i := map findFirst: [:a | a value includes: pos].
  130633.     i == 0 
  130634.         ifTrue: [
  130635.             pos < map first value first
  130636.                 ifTrue: [
  130637.                     start := 1.
  130638.                     end := map first key]
  130639.                 ifFalse: [
  130640.                     start := map last key.
  130641.                     end := self method byteCodes size]]
  130642.         ifFalse: [
  130643.             start := (map at: i) key.
  130644.             end := i == map size 
  130645.                     ifTrue: [self method byteCodes size]
  130646.                     ifFalse: [(map at: i+1) key]].
  130647.     ^start to: end!
  130648.  
  130649. debugState: aString
  130650.     "Private - Set the subcaption for the debugger which displays something about the state
  130651.     of the debugger."
  130652.  
  130653.     self caption: process name printString, ' [', aString, ']'!
  130654.  
  130655. depth
  130656.     "Private - Answer the requested stack depth to be displayed by the receiver
  130657.     (the actual stack depth may be less if there are insufficient frames)."
  130658.  
  130659.     ^depth!
  130660.  
  130661. depth: anInteger 
  130662.     "Private - Set the stack depth displayed by the receiver.
  130663.  
  130664.     Note the use of #selectionByIndex rather than #selection, this is
  130665.     because the identity relationship between the existing values frames
  130666.     and those present after populateStackModel may not hold."
  130667.  
  130668.     depth := anInteger.
  130669.     process isNil 
  130670.         ifFalse: 
  130671.             [| selectionIndex |
  130672.             selectionIndex := stackPresenter view selectionByIndex.
  130673.             self populateStackModel.
  130674.             (selectionIndex between: 1 and: depth) 
  130675.                 ifTrue: [stackPresenter view selectionByIndex: selectionIndex]]!
  130676.  
  130677. displayFrame
  130678.     "Private - Update the receiver to reflect the selected stack frame, aStackFrame."
  130679.  
  130680.     self displaySource.
  130681.     self updateTemporaries.!
  130682.  
  130683. displaySource
  130684.     "Private - Refresh the receiver's source display to reflect a newly selected frame."
  130685.  
  130686.     | method |
  130687.     sourcePresenter evaluationContext: self frame receiver.
  130688.     method := self method.
  130689.     sourcePresenter
  130690.         text: (self isDisassembled 
  130691.                     ifTrue: [method disassembly]
  130692.                     ifFalse: [method debugInfo coloredSource]);
  130693.         isModified: false.
  130694.     self setSourceSelection!
  130695.  
  130696. displayTemp
  130697.     "Private - Inspect the selected temporary, anObject."
  130698.  
  130699.     inspectorPresenter text: (self class debugPrintStringFor: temp)
  130700.  
  130701.     "Rather than change the context to the temp, I think I prefer it to remain as the frame receiver.
  130702.     The temp can be accessed by name"
  130703.     "inspectorPresenter evaluationContext: temp."!
  130704.  
  130705. findHomeFrame: aStackFrame 
  130706.     ^aStackFrame homeFrame!
  130707.  
  130708. findIP: anIP inTextMap: aTextMap
  130709.     "Private - Answer the index of the source map entry corresponding to the
  130710.     specified IP. The index is 0 if not found.
  130711.     Note that this uses only the IP from aTextMap, it doesn't care about the
  130712.     source interval."
  130713.  
  130714.     | i size |
  130715.     i := 1.
  130716.     size := aTextMap size.
  130717.     [i <= size and: [(aTextMap at: i) key < anIP]]
  130718.         whileTrue: [i := i + 1].
  130719.     ^i!
  130720.  
  130721. frame
  130722.     "Private - Answer the currently selected stack frame."
  130723.  
  130724.     ^stackPresenter selectionOrNil!
  130725.  
  130726. frameCalledFrom: frame
  130727.     "Private - Answer the frame called from the <StackFrame>, frame, which 
  130728.     must not be the top frame. This is done by a sequential search from the top frame."
  130729.  
  130730.      | calledFrame nextFrame |
  130731.     nextFrame := topFrame.
  130732.     [    calledFrame := nextFrame.
  130733.         nextFrame := calledFrame sender.
  130734.         nextFrame = frame] whileFalse.
  130735.     ^calledFrame!
  130736.  
  130737. frames
  130738.     "Private - Answer the list of stack frames"
  130739.  
  130740.     ^stackPresenter list!
  130741.  
  130742. generateStubFor: aMessage inClass: aClass 
  130743.     | source keywords selector args argc |
  130744.     source := String writeStream: 128.
  130745.     selector := aMessage selector.
  130746.     args := aMessage arguments.
  130747.     keywords := selector keywords.
  130748.     (argc := args size) == 0 
  130749.         ifTrue: [source nextPutAll: selector]
  130750.         ifFalse: 
  130751.             [(argc == 1 and: [selector isInfix]) 
  130752.                 ifTrue: 
  130753.                     [source
  130754.                         nextPutAll: selector;
  130755.                         space;
  130756.                         nextPutAll: (self nameForArgument: args first)]
  130757.                 ifFalse: 
  130758.                     [| argNames |
  130759.                     argNames := Set new.
  130760.                     argNames addAll: aClass allInstVarNames.
  130761.                     keywords with: args
  130762.                         do: 
  130763.                             [:keyword :arg | 
  130764.                             | x argName argNameStem |
  130765.                             source
  130766.                                 nextPutAll: keyword;
  130767.                                 space.
  130768.                             argName := argNameStem := self nameForArgument: arg.
  130769.                             x := 1.
  130770.                             [argNames includes: argName] 
  130771.                                 whileTrue: [argName := argNameStem , (x := x + 1) displayString].
  130772.                             argNames add: argName.
  130773.                             source
  130774.                                 nextPutAll: argName;
  130775.                                 space]]].
  130776.     source
  130777.         crtab;
  130778.         nextPutAll: '^Error notYetImplemented'.
  130779.     ^(aClass compile: source contents) notNil!
  130780.  
  130781. infoTipForTemp: aString 
  130782.     "Private - The user is hovering over the temporaries list. Answr the bubble help to be displayed
  130783.     for the temporary he is over."
  130784.  
  130785.     | list idx |
  130786.     list := tempsPresenter view.
  130787.     ^(idx := list itemFromPoint: list cursorPosition) isNil 
  130788.         ifTrue: ['']
  130789.         ifFalse: [self debugPrintStringFor: (self variableAtIndex: idx)]!
  130790.  
  130791. initialize
  130792.     "Private - Initialize the receiver"
  130793.  
  130794.     super initialize.
  130795.     depth := DefaultStackDepth.
  130796.     flags := 0.
  130797.     breakWhen := [:iFrame | true]!
  130798.  
  130799. inspectIt
  130800.     "Private - Open an inspector on the currently selected temporary."
  130801.  
  130802.     temp inspect!
  130803.  
  130804. inspectReferences
  130805.     "Private - Open a new Inspector on all the objects which references the currently selected temporary."
  130806.  
  130807.     | refs |
  130808.     refs := temp allReferences copyWithout: self.
  130809.     refs isEmpty 
  130810.         ifTrue: 
  130811.             [MessageBox notify: ('There are no additional references to:%n    %1' 
  130812.                         formatWith: self variable printString)]
  130813.         ifFalse: [refs inspect]!
  130814.  
  130815. isAnimating
  130816.     "Private - Answer whether the receiver is in 'Animate' mode
  130817.     (i.e. repeatedly single-stepping through the debugged code)."
  130818.  
  130819.     ^flags anyMask: AnimateMask!
  130820.  
  130821. isDisassembled
  130822.     "Private - Answer whether the receiver is in disassembly mode."
  130823.  
  130824.     ^flags anyMask: DisassemblyMask
  130825. !
  130826.  
  130827. isFrameRestartable
  130828.     "Private - Answer whether the selected frame is restartable. Some methods, such as
  130829.     callback entry points, cannot be restarted at all, others not reliably."
  130830.  
  130831.     ^self frame isRestartable!
  130832.  
  130833. isInCompositeOp
  130834.     "Private - Answer whether the receiver is performing a composite operation
  130835.     (if so then display updates should be deferred)."
  130836.  
  130837.     ^breakAction notNil!
  130838.  
  130839. isMain: aBoolean
  130840.     "Private - Set the isMain flag."
  130841.  
  130842.     flags := flags mask: MainMask set: aBoolean!
  130843.  
  130844. isResumable
  130845.     "Private - Answer whether the process the receiver is debugging is resumable."
  130846.  
  130847.     ^flags anyMask: ResumableMask
  130848. !
  130849.  
  130850. isRunning
  130851.     "Private - Answer whether the process the receiver is debugging is currently running."
  130852.  
  130853.     ^flags anyMask: RunMask!
  130854.  
  130855. killProcess
  130856.     "Private - Kill the debugged process, if the user confirms that that is his wish."
  130857.  
  130858.     ^((MessageBox new)
  130859.         okCancel;
  130860.         warning: 'Process will be terminated without unwinding') == #ok 
  130861.         ifTrue: 
  130862.             ["Killing process will not run the unwind blocks, so the debugger will not
  130863.         get closed, we must therefore force that here."
  130864.  
  130865.             process
  130866.                 debugger: nil;
  130867.                 kill.
  130868.             self view close]!
  130869.  
  130870. mainView
  130871.     "Private - Answer the debuggers main composite view which contains all the views
  130872.     which display something about the current execution state."
  130873.  
  130874.     ^self view viewNamed: 'main'!
  130875.  
  130876. makeDebugFrame: aStackFrame
  130877.     "Private - Mutate the specified stack frame into a debug stack
  130878.     frame with a debug method and suitably modified IP."
  130879.  
  130880.     aStackFrame isNil ifFalse: [aStackFrame makeDebug]!
  130881.  
  130882. markMethodAsUnbound: oldMethod
  130883.     | list selector methodClass |
  130884.     self isRunning ifTrue: [^self].
  130885.     list := stackPresenter model.
  130886.     selector := oldMethod selector.
  130887.     methodClass := oldMethod methodClass.
  130888.     list keysAndValuesDo: 
  130889.             [:eachIndex :eachFrame | 
  130890.             | eachMethod |
  130891.             eachMethod := eachFrame method.
  130892.             (eachMethod selector == selector and: [eachMethod methodClass == methodClass]) 
  130893.                 ifTrue: [list updateAtIndex: eachIndex]]!
  130894.  
  130895. method
  130896.     "Private - Answer the method in the currently selected stack frame, or nil if none."
  130897.  
  130898.     _method isNil 
  130899.         ifTrue: [_method := self frame ifNotNil: [:frame | frame method]].
  130900.     ^_method!
  130901.  
  130902. moreFrames
  130903.     "Private - Increase the number of stack frames displayed in the call stack."
  130904.  
  130905.     self depth: depth + StackDepthIncrement!
  130906.  
  130907. nameForArgument: anObject 
  130908.     ^anObject class isMeta 
  130909.         ifTrue: ['aClass']
  130910.         ifFalse: [anObject basicPrintString copyWithout: Character space]!
  130911.  
  130912. nilVariable
  130913.     "Private - Nil the currently selected variable or stack slot."
  130914.  
  130915.     self setSelectedVariableTo: nil!
  130916.  
  130917. onAboutToDisplayMenu: aMenu
  130918.     "The system is about to display the <Menu>, popup, this is our chance
  130919.     to fiddle with it."
  130920.  
  130921.     super onAboutToDisplayMenu: aMenu.
  130922.     self class enableDynamicMenus 
  130923.         ifTrue: 
  130924.             [aMenu name == #implementDNUMenu 
  130925.                 ifTrue: 
  130926.                     [self populateImplementMenu: aMenu.
  130927.                     ^self].
  130928.             (self model canRefactor and: [self populateRefactoringMenu: aMenu]) 
  130929.                 ifTrue: [^self].
  130930.             "Otherwise pass on to the dev. system model to populate message menus"
  130931.             self model populateMessagesMenus: aMenu fromMethod: self method]!
  130932.  
  130933. onBreak: pFrame
  130934.     "Private - A break interrupt has been intercepted, take control once more.
  130935.     The argument is the process frame address.
  130936.     N.B. This method is entered with async events disabled, and it is important
  130937.     not to attempt anything which will cause a callback with interrupts disabled."
  130938.  
  130939.     | interruptFrame |
  130940.     self assert: [Processor activeProcess == process].
  130941.     process size.
  130942.     interruptFrame := process frameAtAddress: pFrame.
  130943.     (breakWhen value: interruptFrame)
  130944.         ifFalse: [^Processor enableInterrupts]. "re-enable further debug events"
  130945.     
  130946. "    Transcript nextPutAll: 'Break in '; print: interruptFrame; nextPutAll: ' at '; display: interruptFrame ip; cr."
  130947.  
  130948.     "We can now safely update the windows (with interrupts re-enabled)"
  130949.     self break: interruptFrame.
  130950.     "N.B. There must be no further code after this point"
  130951. !
  130952.  
  130953. onCloseRequested: boolValueHolder
  130954.     "Private - A request to close the view onto this presenter has occurred.
  130955.     The close will proceed unless we set the value holder argument to false.
  130956.     The debugged process will be terminated depending on the setting of
  130957.     the #terminateOnClose Debugger option."
  130958.  
  130959.     boolValueHolder value: self promptToSaveChanges.
  130960.     (boolValueHolder value not or: [process isNil]) ifTrue: [^self].
  130961.     process debugger == self 
  130962.         ifTrue: 
  130963.             [| response |
  130964.             response := self terminateOnClose.
  130965.             response == #yes 
  130966.                 ifTrue: [self terminateProcess]
  130967.                 ifFalse: 
  130968.                     [response == #no ifTrue: [self resumeProcess] ifFalse: [boolValueHolder value: false]]]!
  130969.  
  130970. onExpressionEvaluated: result 
  130971.     "Private - An expression has been evaluated in one of the receiver's
  130972.     workspace panes. Copy back the values from the workspace variable pool
  130973.     into same named temporaries in case they have been assigned."
  130974.  
  130975.     | frame pool |
  130976.     frame := self frame.
  130977.     pool := inspectorPresenter workspacePool.
  130978.     frame tempNames keysAndValuesDo: [:i :t | frame at: i put: (pool at: t ifAbsent: [])]!
  130979.  
  130980. onFrameSelected
  130981.     "Private - The selected stack frame/method has changed. Refresh the other models
  130982.     appropriately"
  130983.  
  130984.     | frame |
  130985.     self clearMethodInfo.
  130986.     frame := self frame.
  130987.     frame notNil 
  130988.         ifTrue: [self displayFrame]
  130989.         ifFalse: 
  130990.             [sourcePresenter clear.
  130991.             tempsPresenter clear]!
  130992.  
  130993. onFrameSelectionChanging: aSelectionChangingEvent
  130994.     self onPromptToSaveChanges: aSelectionChangingEvent!
  130995.  
  130996. onHalt: aStackFrame
  130997.     "Private - A hard coded breakpoint has been hit in the process being debugged by
  130998.     the receiver, so take control. The argument is the stack frame containing
  130999.     the halt."
  131000.  
  131001.     self assert: [aStackFrame process == process].
  131002.     self beBroken.
  131003.     self beAnimated: false.
  131004.     self debugState: 'Hard breakpoint'.
  131005.     topFrame := aStackFrame.
  131006.     self populateStackModel.
  131007.     process debugger: self.
  131008.     self suspendProcess!
  131009.  
  131010. onMethodRemoved: aCompiledMethod 
  131011.     self markMethodAsUnbound: aCompiledMethod!
  131012.  
  131013. onMethodUpdated: aCompilationResult
  131014.     "Private - The development system has updated or removed aCompiledMethod.
  131015.     Refresh any relevant stack frames to indicate that they are now unbound
  131016.     if they use the old method."
  131017.  
  131018.     | oldMethod |
  131019.     oldMethod := aCompilationResult oldMethod.
  131020.     self markMethodAsUnbound: oldMethod!
  131021.  
  131022. onPromptToSaveChanges: aSelectionChangingEvent
  131023.     ^sourcePresenter prompt: 'source' toSaveChanges: aSelectionChangingEvent!
  131024.  
  131025. onStep: pFrame 
  131026.     "Private - A step interrupt has been intercepted, take control once more.
  131027.     The argument is the process frame 'address'. This event will only occur after the
  131028.     the activation of a new method or block. Most 'step's actually result in a break
  131029.     interrupt when the next soft breakpoint is hit.
  131030.     N.B. This method is entered with async events disabled.
  131031.     Implementation Note: There are a sequence of early out tests we perform to avoid
  131032.     breaking to early, or in the wrong place:
  131033.         -    the debugger is already at a breakpoint (i.e. the interrupt arrived after a hard break)
  131034.         -    an attempt is being made to step into a method which may, for example, cause
  131035.             a deadlock by hogging a global critical section, or which is configured to be
  131036.             skipped for some other reason.
  131037.         -    the stepped into frame has been interrupted before any instructions are run (i.e
  131038.             it is not a debug frame), so we want to continue to run to the first breakpoint."
  131039.  
  131040.     | interruptFrame method |
  131041.     self assert: [Processor activeProcess == process].
  131042.     self isRunning ifFalse: [^Processor enableInterrupts].    "already broken"
  131043.     process size.
  131044.     interruptFrame := process frameAtAddress: pFrame.
  131045.     method := interruptFrame method.
  131046.     SkipMethods at: method methodClass
  131047.         ifPresent: 
  131048.             [:selectors | 
  131049.             selectors at: method selector
  131050.                 ifPresent: 
  131051.                     [:type | 
  131052.                     (type anyMask: 1) 
  131053.                         ifTrue: 
  131054.                             ["break on return from the method"
  131055.                             self breakWhen: [:iFrame | iFrame index < interruptFrame index].
  131056.                             ^Processor enableInterrupts]
  131057.                         ifFalse: 
  131058.                             [^process
  131059.                                 step;
  131060.                                 suspend]]].
  131061.     interruptFrame method isDebugMethod 
  131062.         ifFalse: 
  131063.             ["Convert to a debug frame and continue to the first breakpoint"
  131064.             self breakFrame: interruptFrame.
  131065.             ^Processor enableInterrupts].
  131066.     self break: interruptFrame
  131067.     "N.B. There must be no further code after this point"!
  131068.  
  131069. onTempSelected
  131070.     "Private - A selection has been made in the temporaries list, update the inspector model."
  131071.  
  131072.     (temp := tempsPresenter selectionOrNil) isNil 
  131073.         ifFalse: 
  131074.             [temp := temp second.
  131075.             self displayTemp.
  131076.             inspectorPresenter view enable]
  131077.         ifTrue: 
  131078.             [(inspectorPresenter view)
  131079.                 clear;
  131080.                 disable]!
  131081.  
  131082. onTerminate
  131083.     "Private - The debugged process is about to terminate, so if this is the 
  131084.     receiver's process, close the receiver."
  131085.  
  131086.     process debugger: nil.
  131087.     self view close!
  131088.  
  131089. onViewClosed
  131090.     "Private - Sent by the receiver's view when it has been closed.
  131091.     Disconnect from any events triggered by the devlopment system"
  131092.  
  131093.     super onViewClosed.
  131094.     self model removeEventsTriggeredFor: self!
  131095.  
  131096. onWalkback: titleString topFrame: aStackFrame resumable: aBoolean
  131097.     "Private - Bring up a walkback window on the receiver with the specified title
  131098.     and with aStackFrame as the top frame of the stack trace."
  131099.  
  131100.     self beBroken.
  131101.     self beAnimated: false.
  131102.     self caption: titleString.
  131103.     topFrame := aStackFrame.
  131104.     self populateStackModel.
  131105.     self resumable: aBoolean.
  131106.     self assert: [process debugger == self].
  131107.     self suspendProcess!
  131108.  
  131109. parseTree
  131110.     methodAST == DeafObject current ifTrue: [methodAST := self buildParseTree].
  131111.     ^methodAST!
  131112.  
  131113. populateImplementMenu: popup 
  131114.     "Private - Build the menu which lists the classes into which a stub can be generated
  131115.     for messages which were either not understood, or not implemented directly by the receiver's
  131116.     class. The receiver's class is the first, default, item on the menu, and is separated from the superclasses 
  131117.     that also don't implement the message (if any) by a divider."
  131118.  
  131119.     | frame method selector superclasses receiver msg class current |
  131120.     frame := self frame.
  131121.     method := frame method.
  131122.     self assert: [method methodClass ~= frame receiver class].
  131123.     selector := method selector.
  131124.     msg := selector == #doesNotUnderstand: 
  131125.                 ifTrue: [frame arguments first]
  131126.                 ifFalse: [Message selector: selector arguments: frame arguments].
  131127.     receiver := frame receiver.
  131128.     class := receiver class.
  131129.     popup clear.
  131130.     popup addCommand: (MessageSend 
  131131.                 receiver: self
  131132.                 selector: #restartWithStubFor:inClass:
  131133.                 arguments: (Array with: msg with: receiver class))
  131134.         description: class name.
  131135.     superclasses := OrderedCollection new.
  131136.     
  131137.     [current := class superclass.
  131138.     class := current.
  131139.     current notNil 
  131140.         and: [selector == #doesNotUnderstand: or: [(current includesSelector: selector) not]]] 
  131141.             whileTrue: [superclasses addLast: current].
  131142.     superclasses notEmpty 
  131143.         ifTrue: 
  131144.             [popup addSeparator.
  131145.             superclasses do: 
  131146.                     [:each | 
  131147.                     | cmd |
  131148.                     cmd := MessageSend 
  131149.                                 receiver: self
  131150.                                 selector: #restartWithStubFor:inClass:
  131151.                                 arguments: (Array with: msg with: each).
  131152.                     popup addCommand: cmd description: each name]].
  131153.     popup setDefault: 1!
  131154.  
  131155. populateStackModel
  131156.     "Private - Create and set the stack model list from the first 'depth' frames
  131157.     below the current topFrame of the current process."
  131158.  
  131159.     stackPresenter 
  131160.         list: (process stackFramesFrom: topFrame depth: depth);
  131161.         selectionOrNil: topFrame.
  131162.     !
  131163.  
  131164. prevIPOfFrame: frame
  131165.     "Private - Answer the IP of the instruction before that at which the 
  131166.     IP of the <StackFrame>, frame, is currently pointing."
  131167.  
  131168.     ^frame method interpreter prevIP: frame ip!
  131169.  
  131170. process: aProcess topFrame: aStackFrame
  131171.     "Private - Sets the process being debugged and the top stack frame (of interest).
  131172.     The stack frame list is populated."
  131173.  
  131174.     topFrame := aStackFrame.
  131175.     self isMain: aProcess isMain.
  131176.     process := aProcess.
  131177.     process debugger: self.
  131178.     self populateStackModel!
  131179.  
  131180. promptToSaveChanges
  131181.     "Private - Hook for prompting the user if the method text has been modified."
  131182.  
  131183.     ^self onPromptToSaveChanges: (SelectionChangingEvent forSource: self)!
  131184.  
  131185. queryCommand: aCommandQuery 
  131186.     "Private - Enter details about a potential command for the receiver into the 
  131187.     <CommandQuery>."
  131188.  
  131189.     | selector running runnable animating |
  131190.     selector := aCommandQuery commandSymbol.
  131191.     animating := self isAnimating.
  131192.     running := self isRunning or: [animating].
  131193.     runnable := running not and: [self isResumable].
  131194.     #nilVariable == selector 
  131195.         ifTrue: 
  131196.             [aCommandQuery isEnabled: tempsPresenter selectionByIndex > 1.
  131197.             ^true].
  131198.     #accept == selector 
  131199.         ifTrue: 
  131200.             [inspectorPresenter hasFocus 
  131201.                 ifTrue: [aCommandQuery isEnabled: tempsPresenter selectionByIndex > 1]
  131202.                 ifFalse: [aCommandQuery isEnabled: self canSaveMethod].
  131203.             ^true].
  131204.     #browseVariableClass == selector 
  131205.         ifTrue: 
  131206.             [aCommandQuery isEnabled: tempsPresenter selectionByIndex > 0.
  131207.             ^true].
  131208.     (#(#acceptNoRestart #reformatAccept #reformatSource) identityIncludes: selector) 
  131209.         ifTrue: 
  131210.             [aCommandQuery isEnabled: self canSaveMethod.
  131211.             ^true].
  131212.     selector == #userBreak 
  131213.         ifTrue: 
  131214.             [aCommandQuery isEnabled: (running and: [animating not]).
  131215.             ^true].
  131216.     selector == #stepInto 
  131217.         ifTrue: 
  131218.             ["Can only step-into in the top stack frame"
  131219.  
  131220.             aCommandQuery isEnabled: (runnable and: [self frame = topFrame]).
  131221.             ^true].
  131222.     selector == #runToCursor 
  131223.         ifTrue: 
  131224.             ["Can run to cursor if not in disassembly view"
  131225.  
  131226.             aCommandQuery isEnabled: (runnable and: [self isDisassembled not]).
  131227.             ^true].
  131228.     (#(#resumeProcess #runProcess #stepOver #stepOut) identityIncludes: selector) 
  131229.         ifTrue: 
  131230.             [aCommandQuery isEnabled: runnable.
  131231.             ^true].
  131232.     selector == #returnFromMessage 
  131233.         ifTrue: 
  131234.             [aCommandQuery isEnabled: (running not and: [self frame sender notNil]).
  131235.             ^true].
  131236.     selector == #restartFrame 
  131237.         ifTrue: 
  131238.             [aCommandQuery isEnabled: (running not and: [self isFrameRestartable]).
  131239.             ^true].
  131240.     selector == #toggleDisassembly 
  131241.         ifTrue: 
  131242.             [aCommandQuery
  131243.                 isEnabled: true;
  131244.                 isChecked: self isDisassembled.
  131245.             ^true].
  131246.     selector == #toggleAnimation 
  131247.         ifTrue: 
  131248.             [aCommandQuery
  131249.                 isEnabled: (runnable or: [animating]);
  131250.                 isChecked: animating.
  131251.             ^true].
  131252.     (selector == #moreFrames or: [selector == #allFrames]) 
  131253.         ifTrue: 
  131254.             [aCommandQuery isEnabled: (running not and: [self depth <= self frames size]).
  131255.             ^true].
  131256.     #showNextStatement == selector 
  131257.         ifTrue: 
  131258.             [aCommandQuery isEnabled: running not.
  131259.             ^true].
  131260.     "Note that the implement menu is not just for DNUs any more, but any message which is not directly
  131261.      implemented by its receiver."
  131262.     selector == #implementDNUMenu 
  131263.         ifTrue: 
  131264.             [| frame |
  131265.             frame := self frame.
  131266.             aCommandQuery isEnabled: (running not 
  131267.                         and: [self class enableDynamicMenus and: [self canImplementMessage]]).
  131268.             ^true].
  131269.     #browseMethodInheritanceChain == selector 
  131270.         ifTrue: 
  131271.             [aCommandQuery isEnabled: (self method notNil and: [self method isOverride]).
  131272.             ^true].
  131273.     (#(#definitionsMenu #referencesMenu #localDefinitionsMenu #localReferencesMenu) 
  131274.         identityIncludes: selector) 
  131275.             ifTrue: 
  131276.                 [aCommandQuery isEnabled: (self class enableDynamicMenus and: [self method notNil]).
  131277.                 ^true].
  131278.     ^super queryCommand: aCommandQuery!
  131279.  
  131280. reformatAccept
  131281.     "Invoke the Smalltalk formatter to automatically reformat the 
  131282.     selected method."
  131283.  
  131284.     | reformatted |
  131285.     
  131286.     [reformatted := (SmalltalkParser parseMethod: self source
  131287.                 in: self method methodClass) formattedCode] 
  131288.             on: SmalltalkCompilerError
  131289.             do: 
  131290.                 [:err | 
  131291.                 sourcePresenter selectionRange: err range.
  131292.                 err okToContinue.
  131293.                 ^self].
  131294.     self accept: self class restartOnMethodSave methodSource: reformatted!
  131295.  
  131296. reformatSource
  131297.     "Reformat and syntax colour the current contents of the method source pane, but do not accept it.
  131298.     This is linked to the source pane's Edit/Reformat context menu command, but is invoked only when
  131299.     there is no selection in the source pane itself."
  131300.  
  131301.     | class |
  131302.     class := self method methodClass.
  131303.     (self reformattedMethodSourceIn: class) ifNotNil: 
  131304.             [:formatted | 
  131305.             | colored |
  131306.             colored := self syntaxColorOfMethod: formatted in: class.
  131307.             self source: colored]!
  131308.  
  131309. reformattedMethodSourceIn: aClass
  131310.     "Private - Reformat the and answer the current method source, compiling it in the context of the 
  131311.     <ClassDescription> argument."
  131312.  
  131313.     | reformatted source |
  131314.     source := self source.
  131315.     sourcePresenter clearErrors.
  131316.     [reformatted := (SmalltalkParser parseMethod: source
  131317.                 in: self method methodClass) formattedCode] 
  131318.             on: SmalltalkCompilerError
  131319.             do: 
  131320.                 [:e | 
  131321.                 sourcePresenter
  131322.                     selectionRange: e range;
  131323.                     compilerNotification: e offset: 0.
  131324.                 e okToContinue].
  131325.     ^reformatted!
  131326.  
  131327. refreshFrame
  131328.     "Private - Update the receiver's display of the existing frame."
  131329.  
  131330.     self clearMethodInfo.
  131331.     self isDisassembled
  131332.         ifTrue: [self displaySource]
  131333.         ifFalse: [self setSourceSelection].
  131334.     self updateTemporaries.!
  131335.  
  131336. restartBlock: block inFrame: frame
  131337.     "Private - Restart the block frame argument, which is now atop the stack, so that it is broken on 
  131338.     its first breakpoint."
  131339.     
  131340.     | ip interp sp |
  131341.     "Reset to the block's initial IP so that we are ready to start again, but skip the initial 
  131342.      store-down of the arguments into the method context."
  131343.     ip := block initialIP.
  131344.     interp := block method interpreter.
  131345.     interp ip: ip.
  131346.     block argumentCount timesRepeat: [
  131347.         interp nextInstructionDo: [:sel :x | self assert: [sel == #shortPopStoreTemp: or: [sel = #popStoreTemp:]]]].
  131348.     frame ip: interp ip.
  131349.  
  131350.     "Now reset the blocks SP so that any extraneous crud is removed when we return to it. Note that
  131351.      because a blocks arguments have been copied to the method context, they are no longer on the
  131352.      stack."
  131353.     sp := frame sender sp + frame frameSize.
  131354.     frame sp: sp.
  131355.  
  131356.     "Step to the first breakpoint in the block as otherwise user will need to do a redundant step operation"
  131357.     self stepInFrame: frame!
  131358.  
  131359. restartBlockFrame: frame 
  131360.     "Private - Unwind to the <BlockFrame>, frame, of the debugged process and reset 
  131361.     to the block's initial IP so that the block starts executing from its beginning again.
  131362.     Note that temporaries in the block may have previously set values, since these are
  131363.     stored in the home method context, and there is no practical way to distinguish those
  131364.     which should be re-initialized to nil, or whatever they were set to before the block
  131365.     was last started.
  131366.     Implementation Note: This is somewhat easier that restarting a method, since blocks
  131367.     are designed to be restarted easily, and because we can't restart a modified block anyway
  131368.     (we have to restart the block's home method). This will have to be revisited when
  131369.     block arguments are left on the stack to support proper block closures."
  131370.  
  131371.     | method block |
  131372.     block := frame block.
  131373.     self assert: [block isKindOf: BlockClosure].
  131374.     method := block method.
  131375.     (method isUnbound and: [method isExpression not]) 
  131376.         ifTrue: 
  131377.             [| home prompt title |
  131378.             home := self findHomeFrame: frame.
  131379.             prompt := 'The home method of the block would appear to have been modified%1'.
  131380.             title := 'Restarting a block in ' , method displayString , ' ...'.
  131381.             (home notNil and: [home isRestartable]) 
  131382.                 ifTrue: 
  131383.                     [(MessageBox 
  131384.                         confirm: (prompt formatWith: '
  131385.  
  131386. Would you like to restart the entire method instead?')
  131387.                         caption: title) ifTrue: [^self restartMethodFrame: (self findHomeFrame: frame)]]
  131388.                 ifFalse: [MessageBox notify: (prompt formatWith: ', but is not restartable.')]].
  131389.     frame makeDebug.
  131390.     frame = topFrame 
  131391.         ifTrue: [self restartBlock: block inFrame: frame]
  131392.         ifFalse: 
  131393.             ["We need to unwind any frames above the selected one"
  131394.             | calledFrame priority |
  131395.             calledFrame := self frameCalledFrom: frame.
  131396.             self breakWhen: [:iFrame | iFrame index <= calledFrame index].
  131397.             priority := process priority.
  131398.             breakAction := 
  131399.                     [process priority: priority.
  131400.                     self restartBlock: block inFrame: frame.
  131401.                     self populateStackModel].
  131402.             process
  131403.                 priority: Processor highIOPriority;
  131404.                 interruptWith: [calledFrame return: nil]]!
  131405.  
  131406. restartFrame
  131407.     "Private - Unwind the currently selected frame and reset the IP so that the method
  131408.     starts executing from its beginning again."
  131409.  
  131410.     self restartFrameWithFocus: false!
  131411.  
  131412. restartFrame: frame 
  131413.     "Private - Unwind the <StackFrame>, frame, of the debugged process and reset the IP 
  131414.     so that the method starts executing from its beginning again.
  131415.     Implementation Note: Generally this is fairly simple - we just save the receiver and args,
  131416.     unwind the stack back to the sender (i.e. one below selected frame), wind back the
  131417.     sender's ip so that the next thing it does will be a debug break immediately before
  131418.     the pertinent send, push the receiver and args back on the stack, and then step into
  131419.     the method again. Complications arise where the restarted frame resulted from a
  131420.     special control primitive such as #perform:, since we then need to redo the perform
  131421.     which requires that we push the selector and possibly that we push the arguments
  131422.     as an array (in the case of #perform:withArguments:)."
  131423.  
  131424.     self debugState: 'Restart ' , frame displayString.
  131425.     self resumable: true.    "override any non-resumable error"
  131426.     (self findHomeFrame: frame) = frame 
  131427.         ifTrue: [self restartMethodFrame: frame]
  131428.         ifFalse: [self restartBlockFrame: frame]!
  131429.  
  131430. restartFrameWithFocus: aBoolean 
  131431.     | frame |
  131432.     frame := self frame.
  131433.     "Restart requiring an unwind may be blocked by another debugger, so disable view until completed"
  131434.     self mainView disable.
  131435.     "We must allow the command msg to return before processing the restart as otherwise
  131436.      the debugged process may get blocked when attempting to unwind an earlier
  131437.      callback"
  131438.     
  131439.     [self restartFrame: frame.
  131440.     aBoolean ifTrue: [sourcePresenter setFocus]] postToInputQueue!
  131441.  
  131442. restartMethod
  131443.     | home |
  131444.     home := self findHomeFrame: self frame.
  131445.     (home notNil and: [home isRestartable]) ifTrue: [self restartMethodFrame: home]!
  131446.  
  131447. restartMethodFrame: frame 
  131448.     "Private - Unwind the <StackFrame>, frame, of the debugged process and resend the
  131449.     message which caused the method to be activated, breaking at the start of the method.
  131450.     Implementation Note: Generally this is fairly simple - we just save the receiver and args,
  131451.     unwind the stack back to the sender (i.e. one below selected frame), wind back the
  131452.     sender's ip so that the next thing it does will be a debug break immediately before
  131453.     the pertinent send, push the receiver and args back on the stack, and then step into
  131454.     the method again. Complications arise where the restarted frame resulted from a
  131455.     special control primitive such as #perform:, since we then need to redo the perform
  131456.     which requires that we push the selector and possibly that we push the arguments
  131457.     as an array (in the case of #perform:withArguments:)."
  131458.  
  131459.     | sender args receiver class ip interp sent received argArray isPerform priority |
  131460.     self assert: [frame isRestartable].
  131461.     self debugState: 'Restart ' , frame displayString.
  131462.     self resumable: true.    "override any non-resumable error"
  131463.  
  131464.     "Save the receiver and arguments as we'll need to re-push these for the resend"
  131465.     args := frame arguments.
  131466.     receiver := frame receiver.
  131467.     class := receiver class.
  131468.     received := frame method selector.
  131469.     sender := frame sender.
  131470.     self makeDebugFrame: sender.
  131471.  
  131472.     "Locate the actual message send instruction"
  131473.     interp := sender method interpreter.
  131474.     ip := sender ip.
  131475.     
  131476.     [ip := interp prevIP: ip.
  131477.     interp ip: ip.
  131478.     "Interpret the instruction to find the actual selector sent (might be #perform:, etc)"
  131479.     (sent := interp peekForSelector) isNil] 
  131480.             whileTrue.
  131481.  
  131482.     "Was it a special message, like #perform, which adjusts the stack in some way?"
  131483.     argArray := isPerform := false.
  131484.     "To avoid penalizing ordinary selectors starting with #perform:, etc, we don't do anything special unless the selector
  131485.      executed was different from that sent."
  131486.     sent ~~ received 
  131487.         ifTrue: 
  131488.             [(sent beginsWith: #perform:) 
  131489.                 ifTrue: 
  131490.                     ["One of the #perform: family of methods..., so need to push the selector to be performed"
  131491.                     isPerform := true.
  131492.                     sent == #perform:withArgumentsAt:descriptor: ifTrue: [^Sound warningBeep].
  131493.                     argArray := sent == #perform:withArguments:.
  131494.                     received == #doesNotUnderstand: 
  131495.                         ifTrue: 
  131496.                             [| msg |
  131497.                             msg := args first.
  131498.                             received := msg selector.
  131499.                             args := msg arguments]]
  131500.                 ifFalse: 
  131501.                     [received == #doesNotUnderstand: 
  131502.                         ifTrue: 
  131503.                             [self assert: [sent == args first selector].
  131504.                             args := args first arguments]
  131505.                         ifFalse: 
  131506.                             [sent == #value:withArguments: 
  131507.                                 ifTrue: 
  131508.                                     [args := (Array new: 2)
  131509.                                                 at: 1 put: receiver;
  131510.                                                 at: 2 put: args;
  131511.                                                 yourself.
  131512.                                     receiver := frame method]
  131513.                                 ifFalse: 
  131514.                                     ["Some other control message which we haven't catered for yet (please report)"
  131515.                                     self mainView enable.
  131516.                                     ^self 
  131517.                                         error: 'Sorry, it is not currently possible to restart this frame. Please report to Dolphin support']]]].
  131518.  
  131519.     "After this point we start to modify the process state, and so there is no going back..."
  131520.  
  131521.     "Note: Deduct 1 to get back to the soft breakpoint which always immediately precedes a message send"
  131522.     sender ip: ip - 1.
  131523.     self assert: [(sender method byteCodes at: sender ip) == 0].
  131524.     priority := process priority.
  131525.  
  131526.     "Set the action to be performed on next break to be the operations needed to resend"
  131527.     breakAction := 
  131528.             [| sp |
  131529.             process priority: priority.
  131530.             "Push back the receiver and args (note that this may corrupt the frames above, so they must be 
  131531.          removed)"
  131532.             sp := sender sp.
  131533.             process at: sp put: receiver.
  131534.  
  131535.             "If a perform then we need to push the actual selector"
  131536.             isPerform ifTrue: [process at: (sp := sp + 1) put: received].
  131537.  
  131538.             "Push the arguments to the previously sent selector, either individually or as an array (e.g. for 
  131539.          #perform:withArguments:)"
  131540.             argArray 
  131541.                 ifTrue: [process at: (sp := sp + 1) put: args]
  131542.                 ifFalse: [args do: [:arg | process at: (sp := sp + 1) put: arg]].
  131543.             sender sp: sp.
  131544.  
  131545.             "Now resize the proc to remove any extraneous crud and set up the suspended frame to be the sender"
  131546.             process
  131547.                 resize: sp;
  131548.                 suspendedFrame: sender.
  131549.  
  131550.             "And step back into the method again"
  131551.             self stepInFrame: sender].
  131552.  
  131553.     "Unwind any frames above and including the selected one - running the breakAction when finished.
  131554.      Note that we temporarily boost the priority of the process to ensure it runs."
  131555.     process priority: Processor highIOPriority.
  131556.     self return: nil fromFrame: frame.
  131557.     process isWaiting 
  131558.         ifTrue: 
  131559.             ["The unwind appears to be blocked, give it a little more time..."
  131560.             Processor sleep: 100.
  131561.             process isWaiting 
  131562.                 ifTrue: 
  131563.                     [self blockedRestartWarning: (MessageSend 
  131564.                                 receiver: receiver
  131565.                                 selector: sent
  131566.                                 arguments: args)]]!
  131567.  
  131568. restartWithStubFor: message inClass: behaviour
  131569.     "Private - Generate a simple stub implementation for the specified <Message> in the specified class,
  131570.     and restart the frame."
  131571.  
  131572.     (self generateStubFor: message inClass: behaviour) 
  131573.         ifTrue: [self restartFrameWithFocus: true]!
  131574.  
  131575. resumable: aBoolean
  131576.     "Private - Set the receiver's resumable flag."
  131577.  
  131578.     flags := flags mask: ResumableMask set: aBoolean!
  131579.  
  131580. resume
  131581.     "Private - Restart the debugged process from the point at which it was last
  131582.     suspended. This might involve being resuspended on a Semaphore."
  131583.  
  131584.     | list |
  131585.     list := suspendingList.
  131586.     suspendingList := nil.
  131587.     "isMain ifTrue: [ SessionManager inputState main: process ]."
  131588.     process resume: list!
  131589.  
  131590. resumeProcess
  131591.     "Private - Restart the debugged process from the point at which it was last
  131592.     suspended. This might involve being resuspended on a Semaphore."
  131593.  
  131594.     process debugger: nil.
  131595.     self view close.
  131596.     "isMain ifTrue: [ SessionManager inputState main: process ]."
  131597.     self resume!
  131598.  
  131599. return: anObject fromFrame: aStackFrame 
  131600.     "Private - Return the specified value to the sender of the specified <StackFrame>
  131601.     (assumed to be in the process being debugged)."
  131602.  
  131603.     suspendingList := nil.
  131604.     self makeDebugFrame: aStackFrame sender.
  131605.     self breakWhen: [:iFrame | iFrame index < aStackFrame index].
  131606.     process interruptWith: [aStackFrame return: anObject]!
  131607.  
  131608. return: anObject toFrame: aStackFrame 
  131609.     "Private - Return the specified value to the specified <StackFrame>
  131610.     (assumed to be in the process being debugged)."
  131611.  
  131612.     suspendingList := nil.
  131613.     self makeDebugFrame: aStackFrame sender.
  131614.     self breakWhen: [:iFrame | iFrame index <= aStackFrame index].
  131615.     process interruptWith: [Processor returnValue: anObject toFrame: aStackFrame index]!
  131616.  
  131617. returnFromMessage
  131618.     "Private - Step out of the currently selected frame (i.e. return to its sender) answering
  131619.     a return value for which the user is prompted (may be any expression). Also resets
  131620.     the non-resumable flag allowing debugging to continue after a non-continuable error."
  131621.  
  131622.     | frame expression returnValue receiver loopCookie |
  131623.     frame := self frame.
  131624.     receiver := frame receiver.
  131625.     expression := String new.
  131626.     returnValue := loopCookie := Object new.
  131627.     [
  131628.         (expression := Prompter on: expression prompt: 'Please enter return value expression:' caption: 'Return from...')
  131629.             isNil ifTrue: [^self].        "cancelled"
  131630.         expression isEmpty 
  131631.             ifTrue: [returnValue := receiver]
  131632.             ifFalse: [
  131633.                 [ 
  131634.                     returnValue := receiver basicClass compilerClass
  131635.                         evaluate: expression 
  131636.                         for: receiver 
  131637.                         evaluationPools: inspectorPresenter allPools
  131638.                         logged: false]
  131639.                 on: CompilerErrorNotification do: [:cn |
  131640.                     MessageBox
  131641.                         errorMsg: cn text, String lineDelimiter, String lineDelimiter,
  131642.                                 'Please try again.'
  131643.                         caption: 'Error in expression...']].
  131644.         returnValue == loopCookie
  131645.     ] whileTrue.
  131646.  
  131647.     self debugState: 'Return from...'.
  131648.     self resumable: true.                                "override any non-resumable error"
  131649.     self return: returnValue fromFrame: frame!
  131650.  
  131651. runDebuggedProcess
  131652.     "Private - Run the debugged process to the next breakpoint or step interrupt."
  131653.  
  131654.     self beRunning.
  131655.     self resume!
  131656.  
  131657. runProcess
  131658.     "Private - Run the debugged process to the next breakpoint or step interrupt."
  131659.  
  131660.     self debugState: 'Run to Next Breakpoint'.
  131661.     self breakWhen: [:iFrame | false].
  131662.     self mainView disable.
  131663.     self runDebuggedProcess!
  131664.  
  131665. runToCursor
  131666.     "Private - Step to the last breakpoint immediately before the current
  131667.     caret position in the source pane."
  131668.  
  131669.     | ipInterval method frame |
  131670.     self debugState: 'Run to Cursor'.
  131671.     ipInterval := self cursorIPRange.
  131672.     frame := self frame.
  131673.     (self findHomeFrame: frame) ifNotNil: [:home | frame := home].
  131674.     method := frame method.
  131675.     "More useful to run to next frame with same method than same frame, as then works
  131676.     nicely with blocks (which we would otherwise not run into). This may however
  131677.     prevent running to cursor in a block further down the stack."
  131678.     self breakWhen: 
  131679.             [:iFrame | 
  131680.             iFrame index < frame index 
  131681.                 or: [iFrame method = method and: [ipInterval includes: iFrame ip]]].
  131682.     self mainView disable.
  131683.     self runDebuggedProcess!
  131684.  
  131685. selectedNode
  131686.     | range |
  131687.     range := sourcePresenter selectionRange.
  131688.     range isEmpty ifTrue: [range := range start to: range start].
  131689.     ^self parseTree ifNotNil: 
  131690.             [:tree | 
  131691.             | node |
  131692.             node := tree whichNodeIsContainedBy: range.
  131693.             node isNil ifTrue: [node := tree bestNodeFor: range].
  131694.             node]!
  131695.  
  131696. selectionIP
  131697.     "Private - Answer the IP of the expression to select in the workspace.
  131698.     This will be the ip of the next instruction for the top frame (so that
  131699.     the code which is about to be executed is selected) and the ip of
  131700.     last executed instruction in frames below that."
  131701.     
  131702.     | frame |
  131703.     frame := self frame.
  131704.     ^(self isDisassembled and: [frame = topFrame])
  131705.         ifTrue: [frame ip]
  131706.         ifFalse: [self prevIPOfFrame: frame]!
  131707.  
  131708. setSelectedVariableTo: anObject
  131709.     | index varName info |
  131710.     index := tempsPresenter selectionByIndex.
  131711.     info := tempsPresenter list at: index.
  131712.     info at: 2 put: anObject.
  131713.     temp := self variableAtIndex: index put: anObject.
  131714.     varName := info first trimBlanks.
  131715.     varName notEmpty ifTrue: [inspectorPresenter workspacePool at: varName put: anObject].
  131716.     tempsPresenter model updateAtIndex: index.
  131717.     self displayTemp!
  131718.  
  131719. setSourceSelection
  131720.     "Private - Refresh the receiver's source selection to reflect the current IP in the
  131721.     selected frame."
  131722.  
  131723.     | ip |
  131724.     ip := self selectionIP.
  131725.     ip isNil ifTrue: [^self].
  131726.     self isDisassembled 
  131727.         ifTrue: 
  131728.             ["There are two lines of header text before the bytecode disassembly starts"
  131729.  
  131730.             sourcePresenter selectLine: (self method indexOfIP: ip) + 2]
  131731.         ifFalse: 
  131732.             [sourcePresenter selectionRange: (self sourceRangeAt: ip inTextMap: self method textMap)]!
  131733.  
  131734. setVariablesList: anOrderedCollection
  131735.     "Private - Set the temporary variables list to an <OrderedCollection> of name-value pairs.
  131736.     Attempt to maintain any existing temporary selection by name."
  131737.  
  131738.     | selection |
  131739.     selection := tempsPresenter selectionOrNil 
  131740.                 ifNil: [1]
  131741.                 ifNotNil: [:name | anOrderedCollection indexOf: name ifAbsent: [1]].
  131742.     tempsPresenter list: anOrderedCollection.
  131743.     tempsPresenter selectionByIndex: selection!
  131744.  
  131745. showNextStatement
  131746.     self frame = topFrame 
  131747.         ifTrue: [self setSourceSelection]
  131748.         ifFalse: [stackPresenter selection: topFrame]!
  131749.  
  131750. source
  131751.     "Private - Answer the source definition for the currently selected variable
  131752.     of the receivers object."
  131753.  
  131754.     ^sourcePresenter plainText!
  131755.  
  131756. source: aString 
  131757.     "Replace the method source with the <readableString> argument."
  131758.  
  131759.     ^sourcePresenter text: aString; isModified: true!
  131760.  
  131761. sourceRangeAt: anIP inTextMap: aTextMap
  131762.     "Private - Answer the source range of anIP in aTextMap."
  131763.  
  131764.     ^(aTextMap at: (self findIP: anIP inTextMap: aTextMap) 
  131765.         ifAbsent: [^1 to: 0]) value!
  131766.  
  131767. stackWorkspace
  131768.     "Private - Answer the number of additional stack temps currently in use
  131769.     (i.e. the depth of stack above the last named temporary currently being
  131770.     used for working space)."
  131771.  
  131772.     | frame working |
  131773.     frame := self frame.
  131774.     working := frame stackWorkspace.
  131775.  
  131776.     "The topFrame is not really the top frame, but we'd like to show the TOS, so we
  131777.     must adjust for the fact that the TOS has received further messages (i.e. debug
  131778.     interrupts) and thus the SP of the topFrame is under by 1 until we resume."
  131779.     ^(topFrame = frame and: [process topFrame ~= frame])
  131780.          ifTrue: [working+1] 
  131781.         ifFalse: [working]!
  131782.  
  131783. step
  131784.     "Private - Step into the next message send. This involves resuming for a 
  131785.     single message send or until a breakpoint is hit."
  131786.  
  131787.     self stepInFrame: self frame!
  131788.  
  131789. stepInFrame: frame
  131790.     "Private - Step into the next message send in the specified <StackFrame>. 
  131791.     This involves resuming for a single message send or until a breakpoint is hit.
  131792.     Note that we don't actually step if the process was suspended while waiting
  131793.     on a Semaphore. Instead we just return to waiting on the Semaphore."
  131794.  
  131795.     self breakWhen: [:iFrame | true].            "break on the first opportunity"
  131796.     self makeDebugFrame: frame.
  131797.     self makeDebugFrame: frame sender.
  131798.     self beRunning.
  131799.     suspendingList class == Semaphore
  131800.         ifTrue: [self resume]
  131801.         ifFalse: [
  131802.             suspendingList := nil.
  131803.             process step]!
  131804.  
  131805. stepInto
  131806.     "Private - Process a command to step into the next message send. This can only be done from the top
  131807.     stack frame."
  131808.  
  131809.     self debugState: 'Step Into'.
  131810.     self step!
  131811.  
  131812. stepOut
  131813.     "Private - Step out of the currently selected frame (i.e. return to its sender)."
  131814.  
  131815.     | frame |
  131816.     self debugState: 'Step Out'.
  131817.     frame := self frame.
  131818.     self makeDebugFrame: frame sender.
  131819.     self breakWhen: [:iFrame | iFrame index < frame index].        "break on the first opportunity"
  131820. "    self breakFrame: self frame sender."
  131821.     self runDebuggedProcess!
  131822.  
  131823. stepOver
  131824.     "Private - Step to the next expression in the currently selected frame.
  131825.     Note that this should not stop on a breakpoint in any block homed lower
  131826.     in the stack."
  131827.  
  131828.     | frame |
  131829.     self debugState: 'Step over'.
  131830.     frame := self frame.
  131831.     self breakFrame: frame.
  131832.     self makeDebugFrame: frame sender.
  131833.     self runDebuggedProcess!
  131834.  
  131835. suspend
  131836.     "Private - Suspend the process being debugged following a debug event."
  131837.  
  131838.     self isAnimating
  131839.         ifTrue: [
  131840.             [KernelLibrary default sleep: self animatePause. self step] forkAt: Processor userSchedulingPriority.
  131841.             process suspend]
  131842.         ifFalse: [
  131843.             self debugState: 'break'.
  131844.             self suspendProcess]!
  131845.  
  131846. suspendProcess
  131847.     "Private - Suspend the process being debugged."
  131848.  
  131849.     "Record the process' suspending list before suspending it so that we can restore it later on resume"
  131850.     suspendingList := process suspendingList.
  131851.     process isTerminated ifFalse: [process suspendUnconditionally]
  131852.     "N.B. There must be no further code after this point
  131853.     or the receiver will end up stepping through it for ever."
  131854. !
  131855.  
  131856. syntaxColorOfMethod: source in: class 
  131857.     ^class compilerClass syntaxColorOfMethod: source in: class!
  131858.  
  131859. terminateOnClose
  131860.     "Private - Answer on of #yes, #no, or #cancel to indicate whether the debugged 
  131861.     process will be terminated when the receiver is closed."
  131862.  
  131863.     | terminate |
  131864.     process isTerminated ifTrue: [^#yes "Terminating a process which is already dead is benign"].
  131865.     terminate := self class terminateOnClose.
  131866.     terminate == #prompt ifTrue: [
  131867.         terminate := MessageBox new
  131868.                     confirmOrCancel: 'Terminate debugged process?'].
  131869.     ^terminate!
  131870.  
  131871. terminateProcess
  131872.     "Private - Terminate the debugged process.
  131873.     Note that terminating a process will close any attached debugger, so we don't need to
  131874.     do anything other than just request the process terminate."
  131875.  
  131876.     self beAnimated: false.
  131877.     process terminate
  131878. !
  131879.  
  131880. toggleAnimation
  131881.     "Private - Start/stop animating the debugged process.
  131882.     At the moment this is mainly a bit of fun, rather than anything
  131883.     of serious utility. It is also handy for stress testing the debugger."
  131884.  
  131885.     | newState |
  131886.     newState := self isAnimating not.
  131887.     self beAnimated: newState.
  131888.     newState
  131889.         ifTrue: [
  131890.             self debugState: 'Animate'.
  131891.             self step]!
  131892.  
  131893. toggleDisassembly
  131894.     "Private - Switch between source/disassembly modes"
  131895.  
  131896.     self beDisassembled: self isDisassembled not.
  131897.     self displayFrame!
  131898.  
  131899. updateTemporaries
  131900.     "Private - Refresh the receiver's temporaries list model."
  131901.  
  131902.     | temps pool frame receiver varList extra class base |
  131903.     frame := self frame.
  131904.     temps := frame tempNames asOrderedCollection.
  131905.     tempCount := temps size.
  131906.     receiver := frame receiver.
  131907.     extra := frame stackWorkspace.
  131908.     class := receiver basicClass.
  131909.     varList := OrderedCollection new: 1 + class instSize + tempCount + extra.
  131910.     varList addLast: (Array with: 'self' with: receiver).
  131911.     class allInstVarNames 
  131912.         keysAndValuesDo: [:i :each | varList add: (Array with: '  ' , each with: (receiver instVarAt: i))].
  131913.     inspectorPresenter evaluationContext: receiver.
  131914.     pool := inspectorPresenter
  131915.                 newVariablePool;
  131916.                 workspacePool.
  131917.     "Copy out the temporaries into the workspace variable pools so that they
  131918.     can be used in expressions in the source and inspector panes, and add them
  131919.     into the temps list."
  131920.     temps keysAndValuesDo: 
  131921.             [:i :each | 
  131922.             | tempValue |
  131923.             tempValue := frame at: i.
  131924.             pool at: each put: tempValue.
  131925.             varList addLast: (Array with: each with: tempValue)].
  131926.     "Finally any extra stack slots are added to the temps list"
  131927.     base := frame sp - extra + 1.
  131928.     0 to: extra - 1
  131929.         do: [:i | varList addLast: (Array with: '_stack' , i displayString with: (process at: base+i))].
  131930.     frame method evaluationPools ifNotNil: 
  131931.             [:evalPools | 
  131932.             evalPools notEmpty 
  131933.                 ifTrue: 
  131934.                     [evalPools first ifNotNil: [:firstPool | pool addAll: firstPool associations].
  131935.                     inspectorPresenter 
  131936.                         evaluationPools: (evalPools copyFrom: 2) , inspectorPresenter evaluationPools]].
  131937.  
  131938.     "Source presenter should share the same pools"
  131939.     sourcePresenter
  131940.         workspacePool: pool;
  131941.         evaluationPools: inspectorPresenter evaluationPools;
  131942.         evaluationContext: receiver.
  131943.     self setVariablesList: varList!
  131944.  
  131945. userBreak
  131946.     "Private - The user deliberately broke a process running in the debugger from the menu."
  131947.  
  131948.     self assert: [process ~~ Processor activeProcess].
  131949.     self beAnimated: false.
  131950.     self beBroken; suspend.
  131951.     topFrame := process topFrame.
  131952.     self populateStackModel
  131953.     
  131954.     !
  131955.  
  131956. variableAtIndex: anInteger put: anObject 
  131957.     "Private - Set the value of the temporary at the specified <integer> index in the temporaries
  131958.     list."
  131959.  
  131960.     | frame receiver tempsOffset pool index |
  131961.     anInteger < 2 ifTrue: [self errorSubscriptBounds: anInteger].
  131962.     index := anInteger - 1.
  131963.     frame := self frame.
  131964.     receiver := frame receiver.
  131965.     tempsOffset := receiver basicClass instSize.
  131966.     pool := inspectorPresenter workspacePool.
  131967.     ^index <= tempsOffset 
  131968.         ifTrue: 
  131969.             [receiver instVarAt: index put: anObject]
  131970.         ifFalse: 
  131971.             [| offset |
  131972.             offset := index - tempsOffset.
  131973.             offset <= tempCount 
  131974.                 ifTrue: 
  131975.                     [frame at: offset put: anObject]
  131976.                 ifFalse: 
  131977.                     ["Stack working value selected"
  131978.                     offset := frame sp - offset + tempCount + 1.
  131979.                     "If on the topFrame, then break before message send not in it"
  131980.                     frame = topFrame ifTrue: [offset := offset + 1].
  131981.                     process at: offset put: anObject]]! !
  131982.  
  131983. FlipperInspector comment:
  131984. ''!
  131985. !FlipperInspector class methodsFor!
  131986.  
  131987. defaultModel
  131988.     "Answer a default model to be assigned to the receiver when it
  131989.     is initialized."
  131990.  
  131991.     ^nil asValue
  131992. !
  131993.  
  131994. defaultRenderers
  131995.     "Private - Answers a <Array> of default  classes that will be used to render views onto an inspected object"
  131996.  
  131997.     ^OrderedCollection 
  131998.         with: PublishedAspectInspector
  131999.         with: InstVarInspector
  132000.         with: VisualObjectFinder!
  132001.  
  132002. displayOn: aStream
  132003.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  132004.     would want to see it."
  132005.  
  132006.     aStream nextPutAll: 'Flipper Inspector'!
  132007.  
  132008. icon
  132009.     "Answers an Icon that can be used to represent this class"
  132010.  
  132011.     ^BasicInspector icon!
  132012.  
  132013. initialize
  132014.     "Private - Initialize the receiver's class variables.
  132015.         self initialize
  132016.     "
  132017.  
  132018.     (Smalltalk developmentSystem)
  132019.         registerTool: self;
  132020.         addSystemFolderIcon: self toolsFolderIcon.
  132021.     self renderers: self defaultRenderers!
  132022.  
  132023. publishedAspects
  132024.     "Answer a <LookupTable> of the <Aspect>s published by the receiver."
  132025.  
  132026.     ^(super publishedAspects)
  132027.         add: ((Aspect sequenceableCollection: #renderers) isNullable: false; yourself);
  132028.         add: (Aspect boolean: #reuseIfOpen);
  132029.         yourself!
  132030.  
  132031. renderers
  132032.     "Answer an <OrderedCollection> of classes that will be used to render views of an inspected object"
  132033.  
  132034.     ^Renderers!
  132035.  
  132036. renderers: anOrderedCollection
  132037.     "Sets classes that will be used to render views of an inspected object to anOrderedCollection"
  132038.  
  132039.     Renderers := anOrderedCollection!
  132040.  
  132041. shellOn: anObject
  132042.     "Open an instance of the receiver displaying anObject. 
  132043.     Answer the new inspector."
  132044.  
  132045.     ^(self show)
  132046.         value: anObject;
  132047.         yourself!
  132048.  
  132049. uninitialize
  132050.     "Private - Un-register the system tools folder icon for the receiver to allow clean
  132051.     removal of this class from the system.
  132052.         self uninitialize
  132053.     "
  132054.  
  132055.     Smalltalk developmentSystem
  132056.         removeSystemFolderIcon: self toolsFolderIcon;
  132057.         unregisterTool: self! !
  132058.  
  132059. !FlipperInspector methodsFor!
  132060.  
  132061. addToCommandRoute: route
  132062.     "Update the <OrderedCollection>, path, with the receiver's contribution to the command path
  132063.     held by the <CommandPolicy>, route. Answer self to have the command policy decide where
  132064.     to go next."
  132065.  
  132066.     route
  132067.         appendTarget: self systemModel;
  132068.         appendPresenter: cards view currentCard;
  132069.         appendPresenter: self!
  132070.  
  132071. createComponents
  132072.     "Private - Create the presenters contained by the receiver"
  132073.  
  132074.     super createComponents.
  132075.     cards := self add: Presenter new name: 'cards'.
  132076. !
  132077.  
  132078. createRenderers
  132079.     "Private - Create the presenters used to render view of the receiver's model"
  132080.  
  132081.     | firstRendition |
  132082.     self class renderers do: 
  132083.             [:each | 
  132084.             | presenter |
  132085.             presenter := each createIn: cards on: self model.
  132086.             firstRendition isNil ifTrue: [firstRendition := presenter].
  132087.             presenter view arrangement: presenter ].
  132088.     firstRendition notNil ifTrue: [firstRendition ensureVisible]!
  132089.  
  132090. model: anObject
  132091.     "Set the model of the receiver to be a value model on anObject. Usually anObject is expected
  132092.     to be a ValueModel itself. If not, it is automatically wrapped in a valueHolder. 
  132093.     Register with it's #valueChanged event"
  132094.  
  132095.     | valueModel |
  132096.     valueModel := anObject asValue.
  132097.     super model: valueModel.
  132098.     valueModel when: #valueChanged send: #onValueChanged to: self!
  132099.  
  132100. object
  132101.     "Answer the object inspected by the receiver."
  132102.  
  132103.     ^self model value!
  132104.  
  132105. object: anObject
  132106.     "Set the object which is inspected by the receiver."
  132107.  
  132108.     self value: anObject
  132109. !
  132110.  
  132111. onValueChanged
  132112.     "The value held by the receiver's model has changed.
  132113.     The default is to trigger a #valueChanged event off the receiver"
  132114.  
  132115.     self trigger: #valueChanged.
  132116.     self updateCaption!
  132117.  
  132118. onViewOpened
  132119.     super onViewOpened.
  132120.     self createRenderers!
  132121.  
  132122. renderers
  132123.     "Answers the <OrderedCollection> of renderers held by the receiver"
  132124.     
  132125.     ^cards subPresenters!
  132126.  
  132127. setValue: anObject
  132128.     "Private - Set the model data of the receiver to be anObject but without propagating
  132129.     any change triggers"
  132130.  
  132131.     self model setValue: anObject.
  132132. !
  132133.  
  132134. updateCaption
  132135.     "Private - The receiver has changed in such a way that the caption may need to be refreshed.
  132136.     Do this here"
  132137.  
  132138.     | text |
  132139.     text := 'Flipper Inspector'.
  132140.     self value notNil ifTrue: [ text := text , ' on ', self value basicPrintString].
  132141.     self caption: text!
  132142.  
  132143. value
  132144.     "Answer the model value of the receiver. 
  132145.     Any view changes may first need to be flushed"
  132146.  
  132147.     self view notNil ifTrue: [ self view updateModel ].
  132148.     ^self model value!
  132149.  
  132150. value: anObject
  132151.     "Set the model value of the receiver to be anObject"
  132152.  
  132153.     self model value: anObject.
  132154. ! !
  132155.  
  132156. InspectorShell comment:
  132157. 'InspectorShell is a <SmalltalkToolShell> that implements the various inspector tools. Note that this is really just a "shell" around the real functionality which is obtained by embedding one of a number of <Inspector> presenters. The particular <Inspector> subclass chosen is determined by the type of the object being inspected.
  132158.  
  132159.  
  132160. '!
  132161. !InspectorShell class methodsFor!
  132162.  
  132163. displayOn: aStream
  132164.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  132165.     would want to see it."
  132166.  
  132167.     aStream nextPutAll: 'Inspector'
  132168. !
  132169.  
  132170. icon
  132171.     "Answers an Icon that can be used to represent this class"
  132172.  
  132173.     ^BasicInspector icon! !
  132174.  
  132175. !InspectorShell methodsFor!
  132176.  
  132177. initialize
  132178.     "Private - Initialize the receiver"
  132179.  
  132180.     super initialize.
  132181.     self hasCommandHistory: true! !
  132182.  
  132183. LiveUpdate comment:
  132184. 'LiveUpdate is a <topPresenter> used by the development system to install live updates (patches) into the image.
  132185.  
  132186. Instance Variables:
  132187.     updates        <ListPresenter> holding <Associations> describing the updates available for this image.
  132188.     status        <TextPresenter> describing the current state of the Live Update process.
  132189.     isOnline        <boolean> indicating whether the update site can be contacted.
  132190.     connectionIcon    <ImagePresenter> holding an icon that indicates the connection state.
  132191. '!
  132192. !LiveUpdate class methodsFor!
  132193.  
  132194. αR&99ªâ7╗╜Å"Ç,î╛åÄ▀┘╠┬╗ασRô┤╧pfXb╙å2W╫PBjzSV+αÇUg$Cª<Ck╢¿( ═ºÑ≈è ╞^òuM.v▀«~;í╟ÇVN╒£eªJ╕1²kòEN1∩c▀╫WêM4¡?▄ç═Γî┤{ìMÅÜç½ΓP¬a;èε%█ƒ^δS*═[├V±(d≈çy╥Rb╔:╡Æ├mr≤║≡√á╗±r║ß╝    iUn7π`è t]Q▌┬╩╡Qh2M╘Æ8ÄHBÿ∙▌÷╛ Ä╫δñå~ÑΓ▌
  132195. ╟$K¬y≡OdMφ╢{┼~H¼≤δ·₧▐\ÿ▐└⌡«Opûdε8╨≈╠▐JlL*┐Z∙₧!!`ç1ôàEqnçllÖ·9Φ9<O▄ºΓ2/X {╪₧┬╪Pê╧Y<▓≤≥ ÷W╠#?BE╤░~^}í~ÿⁿ╩╫┐₧°╖╟ä╠ƒJÑàQS~αó¥╠8¿qu<≥┐╝┴┬uÆ£-▓äΣbíεûCΩ)^ù╓²TÉε9╓τ╨>π≥.╩Q$Zô╗¿╞;╘πâÿâCαávd╢┤╡íⁿp8-úWA⌐▐¬#U≡▄╛^ö∩ÅYC╢▀;H⌠C^╙╖!!â7Aε┴╢íç¥9ªπòìßû_┤g2≈5ÅΦ╥H°₧▀╖<╕,@ÿOI4╫▓âdIεn£╫G/J╦╘ºxÿ╜áq¥Nà7╙░║╧~╖al`ß⌐ßUow₧K"ié∙q¼¼ç#7╞┴∩ªM╝ε▄░n[Jïe ╗6Θ]1_┘kΘ▓Ä}╡SY▓yìê1r╝╛ⁿφ ▌V#]#M!!₧°±⌐⌐≡┬ε¬,¢°│4╔4ub^²≈╛Q┌ô╜ó╟≤ ┐JIFòß╢▌     ç²M╜èSO╘Ç`ç¢ââ¢L╞E:╩8<É8_└ùP'[r{╝°╡½≥~■
  132196. Su█╨k┌╙╙╫╧$rA?èK╚Qg╬Æσd╜%A 7i²╕╜╡u9╧çRdç─å~Åw┬÷▐b║**Së⌠±ó┘x╛┴█▐Ti/z»²¼o┼&å┤φl╪ô@┴∞±cï╠φçK╠╩╜∞¿T╬ºx÷û⌠O╪b¼╖!
  132197.  
  132198. πE4=╢£;&┤─µC╟≤▌∙═Ω╥ƒÿ■╙½@T║⌐Ço{M╨à-W╫IA8}R\eO≡Ä q.Fátzú┐#≥█Q@╗┐╕ï√╦\Æ4_~l╙╣ip├ú¡3!!½%ûfºL╕Pæ²VJxΓqì╠\ÆV4╝3╫ç└Γ·Ña¢Éò!
  132199.  
  132200. σM4
  132201. 99╜á<s·¿┐>ù:α┘éªùò■┼«≈½W »╧;r{B└ü?_█Ej]OAb±┴    Qi5Jπ[k░¬#ε█PΦ╢Ñ¢╖╬\ ÆdL}e╘¿l&º╞╬GôVçpεQ│~òΩT]I9≥$₧₧LÅGf┴jU─¥╓·╚αdëï█çsO╜⌠R½tD9∩à^┤╢^╘U=╔^╫V²(yφ≈m╓cb╠e±¢ºKxúª±≡á*íΓeî≡╢ `!
  132202.  
  132203. σK+
  132204. =1¬║"-╗╜ëè<α└µ├≡║╡╝ⁿ┬╖ZU╛»┼;>w▄ù)WàP"kfY#╢çK&2Gª<_c┤«`∩╬F╝▓≈Ä÷█Æg3j
  132205. │»h>¿ë─VDàÜ@╛G╖iò-≤RN1εj≥┤±(╞iö╫Æ╣α⌐q╟8ŃÆh
  132206. ß╒XH▓hu═¬aæÜ á)├M╫τhφ╧"éQk╠9±╪îHd╗º÷╦≡⌐αeo░⌠╖gh /Br:╘J≡<wR╚╚'Å│Jd3M ╩ô&àN1éΓ╪╢√ Ä╙Φ┌ô*╜╣ë:╩$æ}≥sZ≡±j╒IΘè┴Æ₧╧DÆ╒─≥K√▓d≤'δµ⌡┌w,!
  132207.  
  132208. σK+
  132209. =1¬║"-╗╜ëî+Σ╣àÑ╝τ═▄¿≤▒V≥√ßu`_S└─*ZÆW#z^^=┌┴Vtf[½yf½╜%║╦R⌐ú▓▐τ╬ƒqMB
  132210. │╤[É·┼J[£¥;táB▒xéA D]=∩p▀╤[ûGw╕!!.╟ü÷Σ└═σg!
  132211.  
  132212. ΘA+
  132213. 1¿è<(╖¼¬%ùeí╒ßσ≡├┌╥╗αòRW╝│∞~eMZ┐εWºMM<oOV+B╢áJq#]πh[oΓú%÷╬í╗▓É÷┬^æ{L@on≤▓y7⌐╠╥iIü¢:p╕F║?²kæ;&7╤H╪Æ¥L]ó9╘ù╤╞═┤pÇ!!ÜìûpO¬°DT«aHû²:╨╪ºa─K╫Q!
  132214.  
  132215. ΘA+
  132216. 7ºÄ& ╡º¬%ùeí╒ßσ≡├┌╥╗αòRW╝│∞~eMZ┐εWºMM<oOV+B╢áJq#]πh[oΓ¡5÷╥¡╗º▐┬²0^æ{L@on≤▓y7⌐╠╥iIü¢:p╕F║?²kæ;&7+ΣhÖ₧I¥Vwñ/ ¥└≈╪⌐|åM╙██o
  132217. ó≈Lºl]ïπ6╨▐RΓg ▐ܲoφ┬╟P^┴+▓╘»Ab╢ó▒!
  132218.  
  132219. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  132220. σäM&2G¬oi«¬3Θ£/j┼▌▐á┤îTÆxXI.d▀║l'ó▌ΘZG¢!
  132221.  
  132222. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A%b£∞t05J»zc¼ó4≤▀N    ▓▓∙≤¥ª^s²4i]m█░a&»┼╦LÉûz╛N│sä2σB[ 5î÷╖XÿFG╡(╓ƒσ∙└ñvÜ$£ö¥&O╜⌠[BΓttÄⁿ╤╙[ΓS╧P╘M₧GÉ╒}┼K}╘:úΦîKxΘεδ√∞µÖ
  132223. !
  132224.  
  132225. ΦJ444¿┐3*▒¿ï/▀±╒∞╟ ╨┌σ┐µ¡.╒╥éKaA@╙É;┌m$}ORgσ┴v'L¿}ToΓ╝)ε╓\║▓╢Ü÷═ñ`L    `gäⁿ}3¡┬┴^MÑç5¿Q╣p╨⌠T9⌡gù₧JòVq∞    2╟¥âΓ─⌐`╚ÆÜöyM├¢:.╦|Jkâ∞8▀╪Z╔@"╔╞{ÖDq°─s├Ekε>╝┘├)≤ê±≥σF╗ΣlU¡╙ªCTZ<r₧ α1vJ`╚┼_τ╦0% BO╤Ç(Äwÿ±╓╜ε!!τ»ô▀ƒ0íú└╠    "î} uXτƒh═h_╢FÄÇÉà▐O₧°─δG╜R]╨ê:├┴∙╙    C3k#Tÿ^¿δmi₧7₧B∩UJ#òouƒ°0╙ 1Tê▓εT:;M>╩w┤╗░-Å÷N)▓╧Hï¥▀âlYLé¥NjT°■Æ█▌╝╡Γ│√è▀W╞îìSS░ûÄ╬j╜cr≤╗úΓ╩<pâô#⌐σÜ=x═ÉÆ@ÉTu:W╟├ Kÿµ2óª░Qτ±.╩QviΩ¼┐╒,▀πÖ1ÿ▌
  132226. Aπ╜#j╟₧▒óⁿ^G╦6┴ú╦
  132227. fûÇ╦x░╦ôgn½▐!!    ·7t╛█rI 7P╕╤¿φ∙T╩;»·æàò╥<G_╤a(RÆY╝╕╙H°ÿ╔öó o≤2/OçÑüc
  132228. ε8─ürlèÇΓ┘αß<╪╓l|½▄▌▓W╫m{τ╖Φ<;àM;qzS╤'ú├╚■^╔┼ñúE«═╤▒nXû#HΘWh¼[ZtA┌%°╛ƒN2╖^[╣"_ÿ»=kτ∙⌡¿╫*O$C÷vö¿╝¿▐!
  132229.  
  132230. ∩A0,0*╖å='ûªÅ+æ6ε┌éªùò∩╟╖ΣñGF ÷ÇZ}[A╫û~FƒZ\wmΣ┴
  132231. QcfKªoPx½╗4≤╤L@º▒≈ƒ╖┴    Æfkr╔╡b<ε╞╞lÜâ|á█²kòo\ 4τ$Å▀MƒJq┐,3╨ô╫ ├«3─M╪╡ûk9½πDM¡nDsûΓt!
  132232.  
  132233. ±E3==╖ú=*╗╜à%ïRï╜¡ⁿ∞▐╔╘¬≈σ₧╡╙lvZ╞î;ómhjhTA+■ä^Uo0JπiCnú┐%║╬C½┐▓ì╖╔ ╫`V    } ╠╣!!º╞╬GôV╖y╛K┐s╥lû<%`≥aô╪ÿMx╝5▌º╙≥═┤vñ£Üçuá╜φ'!
  132234.  
  132235. ±E3=¡â7'╗ñë è-╗öε┬╫┘╦╨╣≈╖cB½╕╚Wv^S▐ΘT;╒oV#xZGnO╗┴?Wu1J▒<Gbºδ&≤╥G⌐║▓▐±└^ûzwze▌╣»▌├QdÉû7├)█∙?╗acNtíeæ≈WêGs⌐ ╥å└■αÑeì▀ƒÜoó≡Nw╢ruàúsÖæL≤!
  132236.  
  132237. ±E3=½¥hi╗ºÑ$æ:µ╤²ⁿ ├▄▌Æ≈│VO╥╤⌐9CZ_─à*W╫ `HDn╢ò\&'Yóu_káº%║╬C½┐≈╓■╔\Öm@ho╚ⁿl<ç╟╘\OÉúa¡KÜxå≡"cUïíσJÖNr∞.▀▒╠°╪Ñ}£┼██o
  132238. ó≈Tút    s«α0▀╦VΦO    ├MÇV│,o╨╔l╟Ek╥░╚ÇLX╢╕²≥⌐;Φ√n∙┼áwQ<r╡P√W,1AY┼*á{τ╦!
  132239.  
  132240. ±E3=½î3=│ªé è-╗öε┬╫┘╦╨╣≈╖cB½╕╚Wv^S▐ΘT;╒oV#xZGnO╗┴?Wu1J▒<Gbºδ&∩╥N@╕╢ú¥ Å),╗4X| █▓D<║╠╟\ZÑç}éFáx£Cæ;"cQ▀wÜ╥_▄Ru╕4╓ü∩∙╧ígüæ█▀<G╜⌠[BΓp oüτ╫╙ZΘ@"╔y╒⌐m`≈εv╓Gi┼-ü▌ùG|ƒ½ε√∞O!
  132241.  
  132242. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]¡╛╟r`\S└─*ZÆW3}OVfOΓÄUufI¼pWo░δ)∙╤L@«╕Ñ▐π╟^àq]gv▀«-&íë┴UDÜ╙y½B╕·hεTB.αh▀╤_▄V|Ñ|╨₧┬σ▀αuÜÆ█çt
  132243. εΓNW╢e5∩àZ╖╠ZδGo┘Q╙·9h°╦q╪G¬V≤▒Θ)┌¥⌡ ∞
  132244. ╝⌡lW∙Σ╖iIEc<Ü9·$tB=ú~ñżV{9pU╔ò*å|Ü⌠╘¬╒bδ┤»╠ù;▒╣ë╩    1K │p╪
  132245. g\≡╕y╘dTΓ]≤δ·τ╩Fë╙┬∩Qα"Ädε?ƒºδ┌@!
  132246.  
  132247. ⌠T#!!=Æó&¿≤╠+ï∩└Ω╦√┼∩╘¬±¡F⌐╛╠;"?É┤,[ü^P/.OßÅVg"\π}dº╝`╠≤ºÑ≈ƒ∙µ
  132248. Æs[^a╬┐e½▀┼U╒"¢5áFí=ª,╝WF=ímî₧]ôUzá=╫ù╟¢ª╔zåÉ█çt
  132249. ε≥BV░eo┬╦<╥╧WεOo┼Q╔≥!!m°╙q═L.─6ú┘ÇP{í╖╕ΘΘá┤fU╡σ≥qC[o=ÇJ┴>?e╟╚╩Åm-=MHÜ╢&àR╞á╝╥òu∞│Æì£7╣µë▄E&╣x╝{α┤)├bKσÜ┴£ÿ┌Z█┬═π±
  132250. 9⌐Φ=┬º╬≥Z@fC
  132251. F*°9ö╖,%â1¥A╨ Vêdeƒ╗Ω|    ç√╖8.'s▀    ₧▄▄Gô≡]8«┐OÉç▀S╓)xES╨░0 }öt₧∩ÿ÷á¬∙┐┼╦╩Qÿ▓æK0¿ù╧╩>«j&≥▓╡Äé
  132252. aô¢8ó╛▌Ñφ╝gε*]dª▌δEïí#₧▓╕â¥╖0@î╣ó╙(┼∙ƒ0╓ö_Γ▒
  132253. `7Σ╢╡í°s8Xè,&⌠▓╬Z2╩═√
  132254. èδ║`Nº╥2φn6ú╩q[¬+E∞╟▓═╪M╪9πⁿúò│╪K╒eH▐O≥²═°ö┴┤÷4$h≡Ru2àíâe(╜q┘¢V\èïδ#┘Γδ{▄ ò:Gè═┴ú╙?ŽσR?ªK,xFƒr¡"Öáâ46êΩ¬┤Gºáù # èJEΦ@}¼G~5G▄#╒╢î{ q╕VO¼tæ¥*r∩≡≈ªw▓3yK*¡,╤ï╕ªú+╬$Σ«i╥▒÷*éUK╤µ«J²¢¬┌_╙╢pu`ÿ$,!!·ühk°òB.┐⌡J■ÆU╪£çÖM₧äúJâ: -*B╖?╚ìJQ^ey¼⌡∙√╩kºBNsê∩d┌▀¢'û╖\[+{[≤n╬@,¥╡Γd»9T(#»α∞±>úτc>M∙┘é{▄E╞ó┘2╜ :=åΩ0╝1▄╕ùüxª▓Re73z«τΘ8ºY²¥ç
  132255. ╝ôT┴÷┤}úæö7∞pT╤╦╢≈úB¥ßd∞┘≈j╥&ó½┴µ]┼≈TªXLu╕FHié:╩(µ5J¿ul#K╝âà fα└▐m║[╖_±╜≥ú7SW(cò≤∞ä⌐╥(N■lâ╞)OòC?╬≈y╓:én║9┤∩╢o╣ªV▓█$╗,YJ÷&äªπOB║9\¡ ▓ⁿαÉ7█gXΩÖ)k`τú,⌐╡rà9╒ß~átÉê∩H╥ ▌6'°∞¢'φ╔3Γ║┌>╚Ω)∙Åw∞S]╙r█çÉy╣¡ΦY{▌╞"█»∙∞δ?î∩^ì┘Öçè⌐╧zVß ├BMÿè══O╢╨<╛mΘ'w±ΦL{¼α┬>Σεä±─&g║?ÖOcï[qX7╞═╦┤─ù+╫i¢╣*m ║ܽ£OEìπ ╣A▐ε⌡½4╛ε8▒9W;öá-4├"í j∩2¥aóⁿ oåprΦà┤┌≥ü┌?\├5s₧╨╞ç;ƒºhï║╣%▀É║5ß╗&2│σѼa±╩⌡ìi╩A¡a8÷    ╔ ö╓ow╤'Tu9'V¥OgZ╫╢╖∙mçK÷·¬êgJ┴m┌ßÉ┘φ▀ò⌐pE⌡É╤bîßd┐
  132256. ┤╖b]╦Ö╛¼┐┐u√∙┬{┴∩⌡Θ<*Älg╩
  132257. á╒Q∩┐Å╖╓Æ6ô╕    '┤â~{TRn╪¥≥ë┌╡{É
  132258. µⁿûp╣.▌≡í{╪τ╝▀?E0¡▓▓■¥á╔-OÇⁿ╫äò≡'ëíÇ╛q┴║ºÄ<)d    4miQ8⌐Pé#ªû5û,½ì/φÉÑ▓┐└╓Θ│äZ╙É╜a│o÷ÿÆ    ⌐f0sCæ▐k²▀║â┬¼≡√▐ÜQ
  132259. K[¿R┌H╝êΦ ûk╝î5┐┤√»aÜ'5╡▄â¼óJæ╜5√&YüCIU)&ì┼▌º)╦#=ù·τ-│╥╞5ïτΦ╗≈¬╞+Fπh─L¥Pß≈8 :µ_╡çe∙∙¥äUτO┘╬╖.æu≈áemè ,öue╚\{π+v3AⁿhOê·╜ƒ═`╬ΩqÄΩw■≡╤X╦ç┐╦Kxƒ½q¡φ┤╠%VñåqôN╔ΣpLÄxé$à═■}≤┤Gû≤▒«╠┐Q9╠ß⌐α6%╛╗°Σ Hsú⌠═!!~äp╧;£Uε+l┤gm@}&u7í"ÉD±$░░bX▐⌐9/?ßYKµÅ·┘]!!DΦ╕s5ÿÇ╒╝¬╕5V╩+/e ┌%[#íx┐íß░AÉXüàE▌▄╙ûèL▓w(N╨uΦl:Tπ±|.■s▐┤8┌P┌XsH#O¥Y{£[É≥≡0▓╛kÉ\ê¼}3⌐║╞ü╛{çc╩┬7≈╨&E┬]╣9_~Ko-)j┬nÄ:|84±╔Fåm6¥⌡â2│╕÷GZ▓
  132260. æî<5;{2q╝,6╞╘H¡o ╪ⁿVå╓∩÷U√ëÄ(q╓░>g╛╟BÆ U|RM├C v╠B▐╕ôX∩J╗t╒«╩Ç█╕ï¬T╥2Cz¬╫╫bn^ºEΣ ÷wƒ╕j·ö≤ú< -Y╚/╪-╗╢╖Fvò≈»╡½⌐t¼:╨"ó`₧Hƒ┼i∩W╢╬oI-_╗ⁿSP╒╟╛v 3·áñR¥U-    ╙┘∙4d5o╔=~RûD╧/┬φ╙9 çkK⌡ÉæHΣ╦╢O╧░ºr(╡≡δ_£Qì▐~>FuΣ²\╥▄╤wnîk⌠ô÷]╦@M╙R.^+ª╘ü7;. ·#;p1M>ßj0Å#$EIº√9?D _åR1µ£╠B╚─╔40h╠▀║F▓Θÿ⌐├    x┐_╬╤dú├╧δ&=╢╤8`ûiS1l¿Ü#µåí    üD┬╣Ñ╡b^0r[0Beä┤└áªò3]wç g╒:=òWRM⌡╘m£>╟    jeäâ%ΣùNR~└éÆ┌x■∩╧─⌐┌║╛₧╜(¢╪ºçDßOêyΦå║öτ çÅ▒C┐\ΦFU╕╕8àµ<φ┴ùφQY╓Öê╚Ω║╙⌡6U]⌠-&X│╕`û╢?π^â∞±T¥Φ▌╗XSÇÆLKº2Çz≥å¬H»ågvy╘┤╘ì└ïQ1ë¿╩⌠ⁿ¡╜╤:xPfâº)╩Ωαφ    lµπδ ╢█
  132261. W╩û½└*╓:ⁿ▌bG╫Gñdű%ép╛N+mL`Ö¥F┌É"ß[¬√ñâ╦¬îÜ£αùw≈ⁿ╦"≥maæâGτ╩_\∩t2?cù╗RS')p╣⌠4a║$Ä░U6gå¡╧≥sH┐;.ô@#ë╗z±║ôvƒs±8u┴┼æ▀╥┘:εR─≤HI
  132262. █bæj<╛ƒπ▒s╦╦╚┼╓b&∞Qí(┐V¢╒ⁿUGô╧m3±╗Saª"%p*│Q║KτÉn)ƒà'tcß≈û÷$(íxÇÿå■O╜Rfa\ù┼à!
  132263.  
  132264. ⌠V+9:6░è<=⌐≤╠+╢+≤▌ß╦╦σ≤╕╘¢τcQ╢¡┴ovÆÑ0AÇZVjzSV+ ∙Å
  132265. \h2\πsU*úÿ4Φ╫L¥à¢▄ÜÑqt■h    ]t╚╣l?ì┼┴J[╒
  132266. ■|ºpóoò±rC+≥$┼â»Ouá (╥₧╚╢═┤)╚N╢¿çn
  132267. »ⁿ)╚    4Xù² ╤═≡@&╪╔ⁿ:V±╬t╟.√∙·èHqÇ║Ω√ß Φ√n∙¿╗9wCTE>Å≡W?zbσMì╣╡Kd2DyΦ¡f╦NÄΣï°Φs±┐╚ìÖ1╗≈╠█w6i!
  132268.  
  132269. ⌠V+?-1╖¢!!s·¿┐>ù6∩╙┌■╥║╡╝ⁿ┬╖ZU╛»┼;>w▄ù)WàP8{^b    ╢Ç-Mt/AñIaFΓ«8≤═VΩ┌▌≤¥ª"%╫g[ h ╧«aí╟╘\Fü╔Vt¥Wñt₧╔ccGx⌡vè█í{óZ|÷Ç╤∙▐αwçW▀á╔dO▓▒iBúl~┐í^┤!
  132270.  
  132271. ≈I9=¬Ä?,£ª₧p┼>∩²ß╪√╨┌╟Ä≤▒PKô╛╓~%<╗╞@₧IE>k+.°Æ    \tf[½yl½º%⌠▀OΦ▒╕î╖╬\Æc6C ╙▓~&»┼╠\L╒èVtáj╕iò∙C,Γl│█OÖN6┴jQ╣√▀╢┌¡]ëÜ█Åe╟τZjúm;╪▓s═┌Sß9┴y╙÷>uⁿ╩6»(■,┤╨àd▓║√÷σä√c]¡Θ╜N%e'!!~╬ φ>>eJW╠²₧óQA9UI╓┴+éIܱ╚ïΦsφ┤åü┌yâ╬åNâE!!<▒y░O3α╕gç!
  132272.  
  132273. ≈I9=╖¢7$╫├σh╡-Φ┬ε╪√ùÆòƒⁿ╢DF¡√╘svP█ê;\ûRAj}OVfO∙ç^Mn#òQ(╧┴MÉ╖|&í╗▓▐Σ▀âGJcF╚│`hε φuAùÆlεG│{æ≡E1φa▒▀TÖ! !
  132274.  
  132275. !LiveUpdate methodsFor!
  132276.  
  132277. ΓK)0;░ΓX@°êÿ>Ç2±└»╪±ù▄┌░ⁿáPW »╧;g@SÆá1^çWM$.nCoΓä^Jo2Jφ<zlΓ╝%║▀PΦ╣╕è╖╬Æ4J.d╒ⁿ~=ε▌╚\F╒{∙b½╖nâ±T0αp▀╔\█Pq∞3╟╥╠°└⌐}ìC▀▓ò<╗≥TA▒s nÄús╩╫ZΘ+├H╘ⁿ,e╣╞v█o╓>╕╨éFx╢├Æù≡╝≈hY¬á┤%R]urÿ±9~Aïzº|α╚E-)Q@Ü¥Bß3Ö■▀╜ uφ╡ÅΣÖ1╗ú▀├2QRKò≤4Y≡╛dΘi¼A▓êàïΩXƒ╫╤πm≥~│hεtî⌐ò╡sEfAL>σ>£∙f₧:▀X╓VvûdaÖ■{Ä`LI┌«»lzYr╨Z▌▐╪W└τS&º≈@æáÅC▀8=|O├Σ- 3▀²Æ╡╕gù⌐⌠║═╦╚PÆVÑçQb+·╥Ü╟d└ ■▓╢Ä┴0fÖû#ªî└Uº±■:┘e%╔╛æ*≡úäó╛_╩¥H▒x@ç¼┤┬;╪αä7Öë
  132278.     τ⌠$*»πÿ╔ö
  132279. T▄?9╙╛╠D|─╞╛nôΩîaK¼₧^büf'┐╥rΘ7Eδ╫·⌠╧W°-¬µäÆ√¥ CP▀$WƒO⌡╕╬B▄₧▐╖╣&eÜZR/ÿ¬╦(fxz╟kƒ⌡PjU╦╝╘:┘Γ∞/▄Fµ`}¡▄▐µ╦cljΦ»ñIl2ä{(q╓*ßcΘó¢6-█åíºU¥σ┬¼fP¿lH²Qsª[s    ▓AÉ┌≤q    kⁿpL╣j£º1n╟ⁿ ·▌^y'N!!≤~╦╪åTÑ√}▀B╨∞½╠═.▀}.G≥µ!
  132280.  
  132281. ΓK)0;░╗=s·¿┐>ù6∩╙»íö╛╠╨▓⌠σ@W╛»╒h)±ï0\Æ\P#`\╢╞^&'|╖nZdÑσMÉ│(iΩçÑæ·▀^â{a ╒▓a;á╠é4"ⁿÇ9{óJ╕x╨[íx6╚jÜ╩uò@f¡%ôû╞≡═╡£M≥±·f╟°YPºr~û╚<±╤SεO*û█%τ?h≈└¿+⌐V╣╦ì@D▓╝²≡⌠\ΦτeP┐áñr]
  132282. h6éÄ}Y&9═ ÖñK{9GÜ╤aµ0kƒπ■╢≡hΩ┐┴á≡W▄Ω╧/╬    $HC╤òfd±┤e╞-H°èöÇ╘ƒ╕┘╨ΩF┤?«+Γ<╦Θ²▄}@F}╜wÆ─9wÿ:ÿ▓r(+
  132283. ½es₧·2µ(*Dê╧à>XS#q┬╪╦âA┤δYjô≡EÅ¥ûI₧1FEQ≈α )ö,æ·██Ñ«Φ÷┘Ä┌JòJÑùWdú¥ü╬)╣ki╗¬┐Ä╤7t╫│"│ìΓZ░╖╗DΘey#é┴U²Üε9éó╛@âöIπ1 @ìª│ü(╟±Ö2ùàFí╗$0ó±ÿ∩ÜAL├4k⌡º╟K(╬ÇφCêπ▄jM╖╨7Hµ!! ·▄qΘ4J∞┼╣⌡╪_ôu╬ƒáìñ▄ C╧aRÿEª∞╚F¬é├▒÷+FëNR#àΣï{Kókù─a ╦ù⌡2╦²á/╒÷v`╖▄╨▓W▄dj{Θ╡ñRsw₧\#=KU─&π+ε╠²^Wí»¼úR┐Θ▀▒5MálG∞Msºb=E┌k╠ú₧4µi¼|£½~s∩Ω⌡¿╫Of)Gπ1ô¥²»φ)┬∙ºhåδ₧MÑQ^∙±╝M⌡ôí┘R─Σ    ▒4*(≥ëv[∞╕os┤≤W░çU╥¢@ºöQä┼╣U╓ ▒;8òp
  132284. ╧!
  132285.  
  132286. ΓV"!!=çÇ?9╡ºë$æ,î╛åÄ▌┼┌╘¬≈σGK║√╨iv[S▄É;@äG%`ORb≤à^[f[½yxº¿%≤╚GΩ┌▌≤¥ª çqL@mr▀╜y7ì╞═IG¢¥fα.▄à°P[ +í>┬₧JÖNr∞8╫╚â┌┼│g╕Üêûr½πJºwJuâΓ6äƒ≥Q+═K▀┤c ô«k╓Cz╒,±å▐g╢ó■╛ß¼« h╝°ª:`UPr7£Jφ'1AQ─ùQ═▓Ml(V_¥╧Bß3Ö■▀╜ uφ╡ÅΣÖ1╗úôTÅ2C╜x°U4v∩░n┼]IΘ¢Åçï═ò╙╥ªL⌡5α+ª0╩Θ÷┌R`@`>■9╘╣@ⁿ^!
  132287.  
  132288. σK097Ñï(«¬ä/ûeí╒▄╪∞▐╤╥■ƒ╧:_ ½┴op@S┴─"?²6W/b]x≈ò J<fçsDd«ñ!!■╫LΦóºÜ÷█╫rLc ¥ⁿ!!r»·╘KA¢▌{╟S╖iô    ∙BSeíwÜ╥_▄Ax¡/ôô╒≈┼¼rèܽÆh ª⌠D
  132289. ckâ√0╓┌LºH<ΓV╓V·+Uδ╥}ÿU■,┤╨ày:▐─æεß½ⁿeO∙Θí/uRLK XτcΩcZUôW÷Å¡_-/WM╬ö<╤Eó°╘¬∙!!σ¿äìö1⌡φ╠Å'╣o╝b^δ╜h┬a^¼æô╙Ü╫Aêû╙πPτ?┤+ε5à├≈╙
  132290. N`AH£]·₧$c╖5ô]┌B/    ∩        ╢Φ0∩ eO▄ú√B"`
  132291. ^Z┘╨▐╓Eàτ?º√HïÉî╪>7]Vé¥NjT°■ÆöÆF┐┐²░ïê╟^ÅKαÇJZ4¿¢ü&█.¼vc4⌠╜▒┌╠0▐ºb╩ΓÖ%¼ⁿ╗9éTs?öôΘSìí5ëτ┤Z╩ÜTá=èºáü&├⌠ò,╘Ω o⌠ñ e0»τÿ╟£
  132292. Eè**╘┤╦O/ï┴φYôσòhV½╙=¿/'ë╤f\∩?g≈╚╢Σ▐O╘:¡!
  132293.  
  132294. τM+(íü_C╙δú:Ç1í╒»█±┼╘╞«≤ªV╗▓╙kQ_▄â~FƒZ){IAnΓìu#CªGoªδ0√╩Aµ⌡┌⌠ÜÑuÆxX@co▐╣ará╠╫nGçÇt¡F÷jƒ≈B_;Σ$ï█Aê4╣8╥å╞σî│vä£ÅÜsετVH╖e!
  132295.  
  132296. ΘE4)04íî&,╛Öì>å7î╛åÄ╬┼╓├┐µá Ü╬hdMDÆÉ,GÆM,.LV+≈ùgf_óhPbΓ╕%÷█A¡│⌡≤¥óvw⌐aNot▀»-:»┌≤\DÉçzá!
  132297.  
  132298. ΘA+
  132299. XR══ ⌐╣Ç+£α┌÷î ┴▐▄▓≤º_F │┼wcP▌û~FƒZ){IAnΓìu#CªGoªδ0√╩Aµ⌡┌⌠ÜÑuÆxX@fa╔Åh>½╩╘\LÑç}ε.▄∙·e]=╗$ñ₧jæCxá=▀Ö≡∩▀┤vàM£Äün
  132300. áσK▓eNÉπi₧ùLΓM)î\╓α>!!±┬t╥na├>Ñ╒îJR╝╝ó╛⌡¼⌡tY¬áí`EAi<╬µy1r=ú~ñîçXa/FÜ║oÿOôΓæ░∙m⌠·╝!
  132301.  
  132302. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A)b£∞t0u3_ªnc¼ó4≤▀N    ▓▓∙≤¥ª╕zR    `eܵ0r¿╚╠JM!
  132303.  
  132304. ΦJ444¿ΓX@°Çé9æ>φ╪ⁿîΩ▀┌ò╜τ╖AF▒»╠b3[S▐ü=FÆ[:oOPcO≈Åg*CπlAo∩╣%δ╦Kíú▓ì╣ìqt·7.p█¿n:½┌ÇIZÜüf╜Ñx£ EJαp£╓\Åh┴jU├ô╫⌡─Ñ`╚W┬█ål »σRWΓmçπ}│╡6⌠D#╔\╬≈`φ─p╟Q.Üb±╠éPw╗½δ╛π    ╕φFN╢φΦJS%RZQ&'₧Γ5bC╠╚₧¿VcZe╘à*ôoⁿÖ┴¬≤f÷┐Æ▐┌dΦú∙└%ÿu²{Xó╛y┼Z°æÅ╔╬▓"≥┐¼Å+╧H ¿dµ!!└⌠δ÷B`L]2πwÅ╖@°]÷'╢SMdöes₧╥;τ&]▄¡²';F {îZÅéù)lΘè5C▐─ZÜÖÖ╫"+DA╬└%>Öiäíÿ┴ á┐≥ó╬Å√^ê[¿üV*»åå╥#úe<Xδ¼┐╔╫:bä│"úü≤U½δ╞iîN*w#ê╟!!εUè⌡2êé»Fàë*╔QviΩ└╬┼&ï░½dÄ╟VF±ªc6»τ╦Γ¢XG╦.$╥≈╞R5▀²├±î⌡yP¡█!!√=t⌐╓{_╟4@∙╚⌠î╖6╖\ß╟òî«╦U╫wZÆPπⁿÇW■ÿ─í÷.[öR.ÆΣÄaQ├≡╘RnÄöº:╫Ωσ7¥D╞m4∙æ├º▌y{|ª¿ßJy4₧zFW─,σ%╡ßÆ6=└åñº[δ╛ɼjS ─nD°@vΘEO P╫ⁿуr:x≥26╤v╩£;sπΩ░ⁿ╒JeO5Q╖eâì«α≡)╠Φα½╠▌(╪ z%@∙τ₧\εêª■Y╚≈    I "4o■ìTi╢ßñΦ\║!
  132305.  
  132306. ΦJ444¿┐3=╣í╓jä ⌡╞µ┬∙ù▓┐╫εσ]L½╛ÇhgZS╙ë~N·5-9zIVj╢█Cg[▒u]mΓ╣%√┌q║▓╢ô╣óvw╒GU    ~ ▄╡!!║ë├VEÿ¥5¡Kús¢A·C@x±eï▌Q▐/┼3╟ùâ¼æα;½èòÿO╗πTAäi~É»<╨à⌠U=╔^╫_│#dß╙[╩W`╦q▄╢ΩWq┐¿╕²∞╗τ O╢⌡á    HG[
  132307. a7£J≡3d]U∩┴ú»3NÜÆ;Ö_¢!
  132308.  
  132309. ΦJ444¿┐3=╣íë9▀ατΩ▌δ╥╤╓╗≤º_F£┤╠wvKB█ï0ÖPP#hBZe¼┴it)H▒y@yåó!!÷╤E@┼▌▐é╖┌ƒuPkdÜáX╟▄╬Z@ööqεδ=á ZN=íi₧╨X¢Gf∞0▀í╠π▐úvºò₧ÉhεΓRHºc!!┬╘i█▐\∩3îZ█√mhΩΣp├Li┼;±╥îPI²├Æùìl┴╧ao╝±º fCT    j7¡∩r[Y╞ìÅ╕JL2Gz█ì:ÄI&Ö¬æ╒ûì╙║ùô~∩µ╚
  132310. ╟E+Ki╒òDMφ╢{┼~H╚ƒì£ëƒ\₧╬╤╝│;>⌐α?╔ε÷╪Z)F.⌠;ò╖.iÉ'î╧UAkáilê⌡4εS┌°»R09BYu╙ù£┤.oΘèO/╗∙    û¢îS▀ 4`A┴°~C8Éoƒ╗╬╙╣┐┐█íΓó6¥h▓ïBD!!│ü½╩&óe&·▓Ñ╦ƒx╫╒lª╗⌡Eí≈°,éB|2.ê▀∙CìΦ8éτ«]É₧ΘxNP╙τ╩½@╕Öá,ÖäO≥╗$7ª±▌█╧YÜÇ┌⌐#Uó┼≡Yë⌠Ö3Ö╔= α/:╜█pε4╕ αΣ▄X╒u┐╡òÇó╒_OO·lUÖYΓóÇAµê╔Ö(!
  132311.  
  132312. ΦW91¬è_C╙δ¡$û(Σ╞»╪∞┬┌ò╖⌠σGK║√╥~pM_─ü,ö^JjmT]⌡ò^Mn#çs_z¬ó.║δR⌐ú▓▐Σ╞╒4i
  132313. │éd!!ü╟╠PFÉ{∙{!
  132314.  
  132315. εJ0/ïƒ7'┐¡ß@∞}╙╤∞╔≈┴┌╤■σ¡VM »╚~3ZS╤ü7DÆM9.MZn╢êd#J¡<Pe¼Ñ%∙╩Gµ≈⌡≤¥óvwäaN| ╒▓[;½▐∩IM¢ùX─*Ñx£╝GF /íwù╤N╥/┼39└ü╩∙┬ìrå ÿ₧ü< ╗πEA¼tJrî &╩∞KµU*îN╧µ(Eⁿ┴}╨Pk─▓╚èKzΘε├╛≤ñ≥ _╢ε╝qhf !
  132316.  
  132317. ≡Q",½é?(┤¡╓jö*Σ╞÷íö╛¥σ¼√│RW║√ì;VFB╫û-ôZP+gW@+⌠Ä M&'│sGo¼┐)√╥º║║ƒ∙╦\ÿffeÜ«h1½└╓\Z╒¥zεW╛x╨lû8*7∞i₧╨]¡Wq╛bƒ╥âτ┘ÑaæC▌÷∙e╟φG»dJg∩àZ▌╥[ºrîN╧ß4!!·╚u╧C`─ ¿╤üKx²├Æôèoα╖(U╖≤ª iSj7íµpwF\╠$╠ÅΦd2@@╧à*ÿBò²╒±╝hΓÄô╪ƒd⌡╪ñcªl&Ñ<⌡QQπ│e┼i¼¢ìò╬╫Iêσ└ΩG≈5╛[α'╞∩╢▓p/q[(⌠
  132318. ▌ÜG√]╫ùNLmâct─╗<φ    )I╠ºⁿq9G7û╪µ╦Q┌úgG▌û ÄÇÜU╟l1Ce├≥(9╦,ä■╘╘NÑ⌐▐╕╟é┼Z▄V»É ;N╔√▒┘?¿_(uæ╙┌º√,dçƒ>τÖσQ╜┌⌠$ÄA~3W╟┬∙RÇî]!
  132319.  
  132320. ≥P& +■╧3«╗à$éRï╜¡■√╟╨╟¬▓ñ`W¡▓╬|3IEÆÉ6W╫\Q8|^]OσòMs5╬>╦╕4√╩WΦí╢ÆΓ╩F^ûGJgn▌≥X╟┌┼UN╒ÜbεVªyæ∙! !
  132321.  
  132322. MethodBrowserShell comment:
  132323. 'MethodBrowserShell is a <SmalltalkToolShell> that implements a method browser tool in a top-level window. Note that this is really just a "shell" around the real functionality which is obtained by embedding a <MethodBrowser> presenter. 
  132324.  
  132325. Instance Variables:
  132326.     browserPresenter        <MethodBrowser> browsing the list of methods.
  132327.  
  132328.  
  132329. '!
  132330. !MethodBrowserShell class methodsFor!
  132331.  
  132332. defaultAdditionalAccelerators
  132333.     ^super defaultAdditionalAccelerators , #(#(#renameIt 'F2'))!
  132334.  
  132335. displayOn: aStream
  132336.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  132337.     would want to see it."
  132338.  
  132339.     aStream nextPutAll: 'Method Browser'!
  132340.  
  132341. icon
  132342.     "Answers an Icon that can be used to represent this class"
  132343.  
  132344.     ^MethodBrowser icon!
  132345.  
  132346. publishedAspects
  132347.     "Answer a <LookupTable> of the <Aspect>s published by the receiver."
  132348.  
  132349.     ^(super publishedAspects)
  132350.         add: (Aspect boolean: #reuseIfOpen);
  132351.         yourself! !
  132352.  
  132353. !MethodBrowserShell methodsFor!
  132354.  
  132355. accept
  132356.     "Saves the current method source. Answer true if the save is successful,
  132357.     false otherwise. Attempt to preserve existing method categories even
  132358.     if actually saving a new method."
  132359.  
  132360.     | browser originalMethod |
  132361.     browser := self browser.
  132362.     originalMethod := browser selection.
  132363.     ^self browser saveMethod: browser source fromOriginal: originalMethod!
  132364.  
  132365. browseMethod
  132366.     "Private - Open a browser on the currently selected method."
  132367.  
  132368.     self browser selectionOrNil ifNotNil: [:method | method browse]!
  132369.  
  132370. browser
  132371.     "Answer the <MethodBrowser> held by the receiver"
  132372.  
  132373.     ^browserPresenter!
  132374.  
  132375. createComponents
  132376.     "Create the presenters contained by the receiver"
  132377.  
  132378.     super createComponents.
  132379.     browserPresenter := self add: MethodBrowser new name: 'browser'!
  132380.  
  132381. createSchematicWiring
  132382.     "Create the trigger wiring for the receiver"
  132383.  
  132384.     super createSchematicWiring.
  132385.     self 
  132386.         when: #closeRequested:
  132387.         send: #onCloseRequested:
  132388.         to: self browser.
  132389.     (self browser)
  132390.         when: #methodChanged
  132391.             send: #onMethodSelected
  132392.             to: self;
  132393.         when: #actionPerformed
  132394.             send: #browseIt
  132395.             to: self!
  132396.  
  132397. onMethodSelected
  132398.     "Private - The browserPresenter has selected a method.
  132399.     Ensure that the browserPresenter selects the appropriate text."
  132400.  
  132401.     self browser findNextMatch!
  132402.  
  132403. onViewOpened
  132404.     "Received when the receiver's view is been connected. 
  132405.     Transfer the caption across to the view"
  132406.  
  132407.     | errorItem |
  132408.     super onViewOpened.
  132409.     errorItem := self view viewNamed: 'errors' ifNone: [].
  132410.     errorItem notNil 
  132411.         ifTrue: 
  132412.             [| error |
  132413.             error := ValueHolder new.
  132414.             errorItem model: error.
  132415.             self browser errorModel: error]!
  132416.  
  132417. queryCommand: aCommandQuery
  132418.     "Private - Enters details about a potential command for the receiver into aCommandQuery.
  132419.     In the case of accept, we enable the command if there is a method selected, if there isn't
  132420.     we pass on the oppurtunity."
  132421.  
  132422.     (#(#accept #reformatAccept) identityIncludes: aCommandQuery commandSymbol) 
  132423.         ifTrue: 
  132424.             [aCommandQuery isEnabled: self browser hasMethodSelected.
  132425.             ^true].
  132426.     ^super queryCommand: aCommandQuery!
  132427.  
  132428. reformatAccept
  132429.     "Invoke the Smalltalk formatter to automatically reformat the 
  132430.     selected method, and then accept the result."
  132431.  
  132432.     | browser originalMethod |
  132433.     browser := self browser.
  132434.     originalMethod := browser selection.
  132435.     (browser reformattedMethodSourceIn: originalMethod methodClass) 
  132436.         ifNotNil: [:reformatted | browser saveMethod: reformatted fromOriginal: originalMethod]! !
  132437.  
  132438. PackageBrowserShell comment:
  132439. 'PackageBrowserShell is a <SmalltalkToolShell> that implements the Package Browser tool. This provides a user interface onto all the <Package>s held by the current <PackageManager>. 
  132440.  
  132441. Instance Variables:
  132442.     packagesPresenter        <ListPresenter> holding the list of currently loaded packages.
  132443.     classesPresenter        <ListPresenter> displaying the list of classes in the selected package.
  132444.     methodsPresenter        <ListPresenter> displaying the list of explicit methods in the selected package.
  132445.     globalsPresenter        <ListPresenter> displaying the list of globals in the selected package.
  132446.     resourcesPresenter        <ResourceListPresenter> displaying the list of resources in the selected package.
  132447.     scriptsPresenter        <ListPresenter> displaying a list of scripts for the selector package.
  132448.     sourceMode        <Symbol> indicating the current source mode, #class, #method, #global, #resource, #script.
  132449.     sourcePresenter        <SmalltalkWorkspace> displaying the source for the currently selected package object.
  132450.     commentPresenter        <SmalltalkWorkspace> displaying the package comment.
  132451.     inspectorPresenter        <PublishedAspectInspector> inspecting the selected package.
  132452.     cardPresenter        <CardContainer>. Package content cards.
  132453.     updatedFlags        <integer>. Flags indicating which of the source panes have been updated.
  132454.     namePresenter        <TextPresenter> displaying package name.
  132455.     pathPresenter        <TextPresenter> displaying package path.
  132456.  
  132457. Class Variables:
  132458.     OperationAborted         <Signal> raised when a long running operation (e.g install/uninstall) is aborted by the user.
  132459.     UpdateMap 
  132460.     WordWrapComment        <boolean> indicating that the comment pane should word wrap.
  132461. '!
  132462. !PackageBrowserShell class methodsFor!
  132463.  
  132464. displayOn: aStream
  132465.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  132466.     would want to see it."
  132467.  
  132468.     aStream nextPutAll: 'Package Browser'
  132469. !
  132470.  
  132471. icon
  132472.     "Answers an Icon that can be used to represent this class"
  132473.  
  132474.     ^Package icon!
  132475.  
  132476. initialize
  132477.     "Private - Register the receiver with SmalltalkSystem.
  132478.  
  132479.         self initialize.
  132480.     "
  132481.  
  132482.     (Smalltalk developmentSystem)
  132483.         addSystemFolderIcon: self toolsFolderIcon;
  132484.         registerTool: self.
  132485.     self reuseIfOpen: true.
  132486.     self wordWrapComment: true.
  132487.     UpdateMap := (IdentityDictionary new)
  132488.                 at: #classes put: #(1 #updateClasses #clearClasses);
  132489.                 at: #methods put: #(2 #updateMethods #clearMethods);
  132490.                 at: #globals put: #(4 #updateGlobals #clearGlobals);
  132491.                 at: #scripts put: #(8 #updateScriptNames #clearScriptNames);
  132492.                 at: #resources put: #(16 #updateResources #clearResources);
  132493.                 at: #prerequisites put: #(32 #updatePrerequisites #clearPrerequisites);
  132494.                 at: #comment put: #(64 #updateComment #clearComment);
  132495.                 shrink;
  132496.                 yourself!
  132497.  
  132498. publishedAspects
  132499.     "Answer a <LookupTable> of the <Aspect>s published by the receiver."
  132500.  
  132501.     ^(super publishedAspects)
  132502.         add: (Aspect boolean: #reuseIfOpen);
  132503.         add: (Aspect boolean: #wordWrapComment);
  132504.         yourself!
  132505.  
  132506. uninitialize
  132507.     "Private - Uninitialize the receiver prior to remove from the system.
  132508.         self uninitialize
  132509.     "
  132510.  
  132511.     Smalltalk developmentSystem
  132512.         removeSystemFolderIconNamed: self toolDescription;
  132513.         unregisterTool: self!
  132514.  
  132515. wordWrapComment
  132516.     "Answer true if instances of the receiver use comment word wrapping."
  132517.  
  132518.     ^WordWrapComment!
  132519.  
  132520. wordWrapComment: aBoolean
  132521.     "Sets the comment word wrapping state for instances of the receiver to aBoolean."
  132522.  
  132523.     WordWrapComment := aBoolean! !
  132524.  
  132525. !PackageBrowserShell methodsFor!
  132526.  
  132527. accept
  132528.     "Accept the changes to any of the panes in the receiver"
  132529.  
  132530.     currentCard = #comment ifTrue: [^self saveComment].
  132531.     currentCard = #scripts ifTrue: [currentCard == #scripts ifTrue: [^self saveScript]].
  132532.     Sound errorBeep!
  132533.  
  132534. addToCommandRoute: route
  132535.     "Update the <OrderedCollection>, path, with the receiver's contribution to the command path
  132536.     held by the <CommandPolicy>, route. Answer self to have the command policy decide where
  132537.     to go next.
  132538.     Implementation Note: We want to make sure that the packages presenter is always
  132539.     in the route, and that it appears before SmalltalkSystem but after the receiver (if not already
  132540.     in the route)."
  132541.  
  132542.     route
  132543.         appendTarget: self;
  132544.         appendTarget: packagesPresenter;
  132545.         appendPresenter: self!
  132546.  
  132547. applyOptions
  132548.     "Apply the class options to the receiver"
  132549.  
  132550.     commentPresenter view wordWrap: self class wordWrapComment.!
  132551.  
  132552. browseClass
  132553.     ^self selectedClass browse!
  132554.  
  132555. browseClassReferences
  132556.     "Browse all the methods which refer to the class selected in
  132557.     the receiver."
  132558.  
  132559.     self model browseClassReferences: self selectedClass!
  132560.  
  132561. browseDefinitions
  132562.     ^self browseMessageDefs!
  132563.  
  132564. browseGlobalReferences
  132565.     "Browse all the methods which refer to the global selected in
  132566.     the receiver."
  132567.  
  132568.     self model browseGlobalReferences: self global!
  132569.  
  132570. browseHierarchy
  132571.     "Private - Open a hierarchy browser on the currently selected class or method."
  132572.  
  132573.     (self method notNil and: [currentCard = #methods]) 
  132574.         ifTrue: [^self systemModel browseMethodHierarchy: self method].
  132575.     (self selectedClass notNil and: [currentCard = #classes]) 
  132576.         ifTrue: [^self systemModel browseHierarchy: self selectedClass].
  132577.     self systemModel browseHierarchy!
  132578.  
  132579. browseIt
  132580.     "Open a default browser on the currently selected class or method."
  132581.  
  132582.     self perform: self browseItCommand!
  132583.  
  132584. browseItCommand
  132585.     "Private - Answer the command that the context-sensitive 'Browse-It' command would be linked
  132586.     to if sent to the receiver at this moment."
  132587.  
  132588.     | focus |
  132589.     focus := View focus.
  132590.     focus == packagesPresenter packagesPresenter view ifTrue: [^#browsePackages].
  132591.     focus == classesPresenter view ifTrue: [^#browseClass].
  132592.     focus == methodsPresenter view ifTrue: [^#browseMethods].
  132593.     "focus == globalsPresenter view ifTrue: [^#browseGlobals]."
  132594.     ^nil!
  132595.  
  132596. browseMessageDefs
  132597.     "Open a method browser displaying the implementors of the current selector"
  132598.  
  132599.     self model browseDefinitionsOf: self method selector!
  132600.  
  132601. browseMessageRefs
  132602.     "Open a method browser displaying the implementors of the current selector"
  132603.  
  132604.     self model browseReferencesTo: self method selector!
  132605.  
  132606. browseMethodClass
  132607.     "Open a default browser on the currently selected method."
  132608.  
  132609.     ^self method browse!
  132610.  
  132611. browseMethods
  132612.     "Open a default browser on the currently selected method or methods."
  132613.  
  132614.     | methods |
  132615.     methods := self methods.
  132616.     methods size == 1 
  132617.         ifTrue: [self browseMethodClass]
  132618.         ifFalse: 
  132619.             [| packages |
  132620.             packages := self packages.
  132621.             caption := String writeStream.
  132622.             caption nextPutAll: 'Loose methods in package(s): '.
  132623.             packages do: [:each | caption display: each]
  132624.                 separatedBy: [caption nextPutAll: ', '].
  132625.             self model 
  132626.                 browseMethods: methods
  132627.                 caption: caption contents
  132628.                 findString: nil
  132629.                 filter: [:m | m isLoose and: [packages includes: m owningPackage]]]!
  132630.  
  132631. browsePackages
  132632.     ^packagesPresenter browsePackageSources!
  132633.  
  132634. browseReferences
  132635.     (self method notNil and: [currentCard = #methods]) ifTrue: [^self browseMessageRefs].
  132636.     (self selectedClass notNil and: [currentCard = #classes]) 
  132637.         ifTrue: [^self browseClassReferences].
  132638.     (self global notNil and: [currentCard = #globals]) ifTrue: [^self browseGlobalReferences].
  132639.     Sound warningBeep!
  132640.  
  132641. cacheCurrentCard
  132642.     currentCard := cardsPresenter currentCard name asSymbol!
  132643.  
  132644. clearCard: aSymbol
  132645.     self perform: (UpdateMap at: aSymbol) third!
  132646.  
  132647. clearClasses
  132648.     "Private - Clear the classes list."
  132649.  
  132650.     classesPresenter clear!
  132651.  
  132652. clearComment
  132653.     "Private - Clear down the comment presenter"
  132654.  
  132655.     commentPresenter clear!
  132656.  
  132657. clearGlobals
  132658.     "Private - Clear the Globals list."
  132659.  
  132660.     globalsPresenter clear!
  132661.  
  132662. clearMethods
  132663.     "Private - Clear the methods list."
  132664.  
  132665.     methodsPresenter clear!
  132666.  
  132667. clearPrerequisites
  132668.     "Private - Clear the prerequisites list."
  132669.  
  132670.     prerequisitesPresenter clear!
  132671.  
  132672. clearResources
  132673.     "Private - Clear the resources list."
  132674.  
  132675.     resourcesPresenter filterBlock: (Message selector: #isNil)!
  132676.  
  132677. clearScriptNames
  132678.     "Private - Clear the scripts list."
  132679.  
  132680.     scriptNamesPresenter clear.
  132681.     self onScriptSelected!
  132682.  
  132683. createComponents
  132684.     "Create the presenters contained by the receiver"
  132685.  
  132686.     super createComponents.
  132687.     packagesPresenter := self add: PackageSelector new name: 'packages'.
  132688.     classesPresenter := (self add: ListPresenter new name: 'classes') beSorted.
  132689.     methodsPresenter := self add: (ListPresenter on: ListModel new) name: 'methods'.
  132690.     methodsPresenter beSorted: self methodSortBlock.
  132691.     globalsPresenter := (self add: ListPresenter new name: 'globals') beSorted.
  132692.     resourcesPresenter := self add: ResourceListPresenter new name: 'resources'.
  132693.     scriptNamesPresenter := self add: ListPresenter new name: 'scriptNames'.
  132694.     commentPresenter := self add: SmalltalkWorkspace new name: 'comment'.
  132695.     scriptTextPresenter := self add: SmalltalkWorkspace new name: 'scriptText'.
  132696.     prerequisitesPresenter := self add: PackagePrerequisites new name: 'prerequisites'!
  132697.  
  132698. createSchematicWiring
  132699.     "Create the trigger wiring for the receiver"
  132700.  
  132701.     super createSchematicWiring.
  132702.     "We don't listen for #classAdded: events, as we pick up the addition of new classes to
  132703.      a package through the PackageManager's #classRepackaged:from:to: event"
  132704.     (self model)
  132705.         when: #classRemoved:
  132706.             send: #onClassRemoved:
  132707.             to: self;
  132708.         when: #methodAdded:
  132709.             send: #onMethodAdded:
  132710.             to: self;
  132711.         when: #methodUpdated:
  132712.             send: #onMethodUpdated:
  132713.             to: self;
  132714.         when: #methodRemoved:
  132715.             send: #onMethodRemoved:
  132716.             to: self;
  132717.         when: #globalRemoved:
  132718.             send: #onGlobalRemoved:
  132719.             to: self;
  132720.         when: #globalRenamed:from:
  132721.             send: #onGlobalRenamed:from:
  132722.             to: self.
  132723.     "Note that as we are using the ResourceListPresenter, which keeps in sync. by itself,
  132724.      we don't need (or want) to hook any resource related events"
  132725.     (self packageManager)
  132726.         when: #classRepackaged:from:to:
  132727.             send: #onClassRepackaged:from:to:
  132728.             to: self;
  132729.         when: #methodRepackaged:from:to:
  132730.             send: #onMethodRepackaged:from:to:
  132731.             to: self;
  132732.         when: #globalRepackaged:from:to:
  132733.             send: #onGlobalRepackaged:from:to:
  132734.             to: self;
  132735.         when: #packageChanged:
  132736.             send: #onPackageChanged:
  132737.             to: self.
  132738.     packagesPresenter 
  132739.         when: #selectionChanged
  132740.         send: #onPackageSelected
  132741.         to: self.
  132742.     classesPresenter
  132743.         when: #actionPerformed
  132744.             send: #browseClass
  132745.             to: self;
  132746.         when: #drag:
  132747.             send: #onDragClasses:
  132748.             to: self;
  132749.         when: #drop:
  132750.             send: #onDropOverPackage:
  132751.             to: self;
  132752.         when: #dragEnter:
  132753.             send: #onDragOver:type:
  132754.             to: self
  132755.             withArguments: #(nil #Class);
  132756.         when: #dragOver:
  132757.             send: #onDragOver:type:
  132758.             to: self
  132759.             withArguments: #(nil #Class).
  132760.     methodsPresenter
  132761.         when: #actionPerformed
  132762.             send: #browseIt
  132763.             to: self;
  132764.         when: #drag:
  132765.             send: #onDragMethods:
  132766.             to: self;
  132767.         when: #drop:
  132768.             send: #onDropOverPackage:
  132769.             to: self;
  132770.         when: #dragEnter:
  132771.             send: #onDragOver:type:
  132772.             to: self
  132773.             withArguments: #(nil #CompiledMethod);
  132774.         when: #dragOver:
  132775.             send: #onDragOver:type:
  132776.             to: self
  132777.             withArguments: #(nil #CompiledMethod).
  132778.     globalsPresenter
  132779.         when: #actionPerformed
  132780.             send: #inspectGlobals
  132781.             to: self;
  132782.         when: #drag:
  132783.             send: #onDragGlobal:
  132784.             to: self;
  132785.         when: #drop:
  132786.             send: #onDropOverPackage:
  132787.             to: self;
  132788.         when: #dragEnter:
  132789.             send: #onDragOver:type:
  132790.             to: self
  132791.             withArguments: #(nil #GlobalSymbol);
  132792.         when: #dragOver:
  132793.             send: #onDragOver:type:
  132794.             to: self
  132795.             withArguments: #(nil #GlobalSymbol).
  132796.     resourcesPresenter
  132797.         when: #drag:
  132798.             send: #onDragResource:
  132799.             to: self;
  132800.         when: #drop:
  132801.             send: #onDropOverPackage:
  132802.             to: self;
  132803.         when: #dragEnter:
  132804.             send: #onDragOver:type:
  132805.             to: self
  132806.             withArguments: #(nil #ResourceIdentifier);
  132807.         when: #dragOver:
  132808.             send: #onDragOver:type:
  132809.             to: self
  132810.             withArguments: #(nil #ResourceIdentifier).
  132811.     scriptNamesPresenter 
  132812.         when: #selectionChanged
  132813.         send: #onScriptSelected
  132814.         to: self!
  132815.  
  132816. global
  132817.     | globals |
  132818.     globals := self globals.
  132819.     ^globals size = 1 ifTrue: [globals first]!
  132820.  
  132821. globalNames
  132822.     ^globalsPresenter selections!
  132823.  
  132824. globals
  132825.     ^self globalNames collect: [:each | self class environment associationAt: each]!
  132826.  
  132827. hasPackages
  132828.     "Private - Answer whether one or more packages are currently selected."
  132829.  
  132830.     ^self packages notEmpty!
  132831.  
  132832. initialize
  132833.     "Private - Initialize the state of the receiver"
  132834.  
  132835.     super initialize.
  132836.     updateFlags := 0.
  132837.     self caption: 'Package Browser'
  132838.  
  132839. !
  132840.  
  132841. inspectCollection: aCollection
  132842.     (aCollection size = 1 ifTrue: [aCollection first] ifFalse: [aCollection]) inspect!
  132843.  
  132844. inspectGlobals
  132845.     "Open an inspector on the currently selected globals."
  132846.  
  132847.     self inspectCollection: self globals!
  132848.  
  132849. inspectIt
  132850.     "Open a browser on the selected category/protocol/variables.
  132851.     Note that we only receive this command it one of the filter panes is selected
  132852.     as class hierarchy, method browser, and workspace presenters all handle
  132853.     it themselves."
  132854.  
  132855.     self perform: self inspectItCommand!
  132856.  
  132857. inspectItCommand
  132858.     "Private - Answer the command that the context-sensitive 'Inspect-It' command would be linked
  132859.     to if sent to the receiver at this moment."
  132860.  
  132861.     | focus |
  132862.     focus := View focus.
  132863.     focus == packagesPresenter packagesPresenter view ifTrue: [^#inspectPackages].
  132864.     focus == classesPresenter view ifTrue: [^#inspectClasses].
  132865.     focus == methodsPresenter view ifTrue: [^#inspectMethods].
  132866.     focus == globalsPresenter view ifTrue: [^#inspectGlobals].
  132867.     ^nil!
  132868.  
  132869. inspectMethods
  132870.     "Open an inspector on the currently selected methods."
  132871.  
  132872.     self inspectCollection: self methods!
  132873.  
  132874. isCardUpToDate: aSymbol
  132875.     ^updateFlags allMask: (UpdateMap at: aSymbol) first!
  132876.  
  132877. looseResourceIdentifiers
  132878.     "Answer a <Collection> of <ResourceIdentifier>s for resources that are 'loose', in the sense
  132879.     that they do not reside in the package of their owning class, but rather in another extending
  132880.     package."
  132881.  
  132882.     | packages |
  132883.     packages := self packages.
  132884.     ^self resourceIdentifiers 
  132885.         select: [:eachRId | packages anySatisfy: [:eachPkg | eachPkg includesResourceIdentifier: eachRId]]!
  132886.  
  132887. markCardDirty: aSymbol
  132888.     | updateInfo |
  132889.     updateInfo := UpdateMap at: aSymbol.
  132890.     updateFlags := updateFlags maskClear: updateInfo first.
  132891.     self perform: updateInfo third!
  132892.  
  132893. method
  132894.     "Answer the currently selected method if there is exactly one selection, otherwise answer nil."
  132895.  
  132896.     | methods |
  132897.     methods := self methods.
  132898.     ^methods size == 1 ifTrue: [methods first]!
  132899.  
  132900. methods
  132901.     "Answer a <collection> of the currently selected loose methods."
  132902.  
  132903.     ^methodsPresenter selectionOrNil
  132904. !
  132905.  
  132906. methodSortBlock
  132907.     "Private - Answer a default sort block to use when the receiver is sorted"
  132908.  
  132909.     ^[:x :y | x selector <= y selector ] receiver: nil; yourself!
  132910.  
  132911. objectRepackaged: anObject from: oldPackage to: newPackage card: cardSymbol list: aListModel
  132912.     | packages displayingNewPackage |
  132913.     currentCard == cardSymbol ifFalse: [^self markCardDirty: cardSymbol].
  132914.     packages := self packages.
  132915.     displayingNewPackage := packages includes: newPackage.
  132916.     (packages includes: oldPackage) 
  132917.         ifTrue: 
  132918.             [displayingNewPackage 
  132919.                 ifTrue: [aListModel updateItem: anObject]
  132920.                 ifFalse: [aListModel remove: anObject]]
  132921.         ifFalse: [displayingNewPackage ifTrue: [aListModel add: anObject]]!
  132922.  
  132923. objectRepackaged: anObject from: oldPackage to: newPackage type: aSymbol list: aListPresenter
  132924.     currentCard == aSymbol 
  132925.         ifTrue: 
  132926.             [| packages displayingNewPackage |
  132927.             packages := self packages.
  132928.             displayingNewPackage := packages includes: newPackage.
  132929.             (packages includes: oldPackage) 
  132930.                 ifTrue: 
  132931.                     [(displayingNewPackage and: [anObject isLoose]) 
  132932.                         ifFalse: 
  132933.                             ["If the object was not loose (i.e. in its owning classes package) then it will not be in the list"
  132934.  
  132935.                             aListPresenter model remove: anObject ifAbsent: []]]
  132936.                 ifFalse: 
  132937.                     [(displayingNewPackage and: [anObject isLoose]) 
  132938.                         ifTrue: [aListPresenter model add: anObject]]]
  132939.         ifFalse: [self markCardDirty: aSymbol]!
  132940.  
  132941. onAboutToDisplayMenu: aMenu
  132942.     "Private - The pop-up <Menu>, popup, is about to be displayed.
  132943.     This is our opportunity to update it, e.g. to add/remove items."
  132944.  
  132945.     super onAboutToDisplayMenu: aMenu.
  132946.     (self model canRefactor and: [self populateRefactoringMenu: aMenu]) 
  132947.         ifTrue: [^self]!
  132948.  
  132949. onCardChanged
  132950.     "Private - The source object card has been changed. Update the source pane
  132951.     accordingly."
  132952.  
  132953.     self cacheCurrentCard.
  132954.     (self isCardUpToDate: currentCard) ifFalse: [self updateCardNow: currentCard]!
  132955.  
  132956. onClassRemoved: aClass
  132957.     "Private - The <Behavior>, aClass, has been deleted. Update the receiver's
  132958.     cards as necessary to reflect the classes removal."
  132959.  
  132960.     currentCard == #classes 
  132961.         ifTrue: [classesPresenter model remove: aClass ifAbsent: []]
  132962.         ifFalse: [self markCardDirty: #classes].
  132963.     currentCard == #methods 
  132964.         ifTrue: 
  132965.             [(methodsPresenter list select: [:each | each methodClass == aClass]) 
  132966.                 do: [:each | methodsPresenter model remove: each]]
  132967.         ifFalse: [self markCardDirty: #methods]!
  132968.  
  132969. onClassRepackaged: aClass from: oldPackage to: newPackage
  132970.     "The class, aClass, has been repackaged, moving it from the <Package> or nil, oldPackage
  132971.     to the <Package>, or nil, newPackage. Note that we only bother attempting any
  132972.     kind of update if the classes card is actually displayed. If not we just mark the classes
  132973.     card as dirty to reduce overhead."
  132974.  
  132975.     self 
  132976.         objectRepackaged: aClass
  132977.         from: oldPackage
  132978.         to: newPackage
  132979.         card: #classes
  132980.         list: classesPresenter model.
  132981.     #(#methods #resources) do: [:each | self refreshCard: each]!
  132982.  
  132983. onDragClasses: session
  132984.     "Private - A drag of one or more classes has been started. Populate the 
  132985.     <DragDropSession>, session, with the objects to be dragged."
  132986.  
  132987.     | ddObjects |
  132988.     ddObjects := OrderedCollection new.
  132989.     self selectedClasses do: [:e |
  132990.         ddObjects add: ((session newDragObject: e)
  132991.                         format: #Class data: e;
  132992.                         format: #String data: e definition;
  132993.                         format: #Chunk data: e definitionChunk;
  132994.                         yourself)].
  132995.     session dragObjects: ddObjects!
  132996.  
  132997. onDragGlobal: aDragDropSession 
  132998.     "Private - A Global drag has been started. Populate the <DragDropSession>, 
  132999.     session with the objects to be dragged."
  133000.  
  133001.     | dragGlobal |
  133002.     aDragDropSession dragObjects: nil.
  133003.     dragGlobal := aDragDropSession suggestedSource.
  133004.     aDragDropSession 
  133005.         addDragObject: ((aDragDropSession newDragObject: dragGlobal)
  133006.                 format: #GlobalSymbol data: dragGlobal;
  133007.                 yourself).
  133008.     aDragDropSession defaultOperation: #copy!
  133009.  
  133010. onDragMethods: session 
  133011.     "Private - A drag has been started. Drag the currently selected method"
  133012.  
  133013.     | ddObjects filer stream |
  133014.     ddObjects := OrderedCollection new.
  133015.     stream := String writeStream.
  133016.     filer := ChunkSourceFiler on: stream.
  133017.     self methods do: 
  133018.             [:each | 
  133019.             stream reset.
  133020.             filer fileOutMessages: (Array with: each selector)
  133021.                 ofBehavior: each methodClass.
  133022.             ddObjects add: ((session newDragObject: each)
  133023.                         format: #CompiledMethod data: each;
  133024.                         format: #String data: each getSource;
  133025.                         format: #Chunk data: stream contents;
  133026.                         yourself)].
  133027.     session
  133028.         dragObjects: ddObjects;
  133029.         defaultOperation: #copy!
  133030.  
  133031. onDragOver: session type: format
  133032.     "Private - A drag session is passing over one of the receiver's panes.
  133033.     Update the <DragDropSession>, session, with the drop operation supported
  133034.     (if any)."
  133035.  
  133036.     session operation: nil.
  133037.     (session isFormatAvailable: format) 
  133038.         ifTrue: 
  133039.             [self singlePackage ifNotNil: 
  133040.                     [:package | 
  133041.                     session
  133042.                         suggestedTarget: package;
  133043.                         operation: #move.
  133044.                     ^true]]!
  133045.  
  133046. onDragOverPackage: session
  133047.     "Private - A drag session is passing over the receiver's package list pane.
  133048.     Update the <DragDropSession>, session, with the drop operation supported
  133049.     (if any)."
  133050.  
  133051.     session operation: nil.
  133052.     (session suggestedTarget notNil and: [
  133053.             #(CompiledMethod Class ResourceIdentifier GlobalSymbol) 
  133054.                 anySatisfy: [:e | session isFormatAvailable: e]])
  133055.         ifTrue: [session operation: #move. ^true]!
  133056.  
  133057. onDragResource: aDragDropSession 
  133058.     "Private - A drag has been initiated of a resource, populate the <DragDropSession>, session,
  133059.     accordingly."
  133060.  
  133061.     | resId ddObject |
  133062.     resId := aDragDropSession suggestedSource.
  133063.     ddObject := aDragDropSession newDragObject: resId resource copy.
  133064.     ddObject format: #ResourceIdentifier data: resId.
  133065.     aDragDropSession
  133066.         dragObjects: (OrderedCollection with: ddObject);
  133067.         defaultOperation: #copy!
  133068.  
  133069. onDropDown: tool 
  133070.     "Private - The receiver's toolbar has sent a notification that the Views
  133071.     button drop-down arrow has been pressed. Generate and pop-up the
  133072.     Views menu."
  133073.  
  133074.     | popup |
  133075.     popup := tool command asSymbol == #viewModeSelect 
  133076.                 ifTrue: [classesPresenter view buildViewsPopup].
  133077.     popup handle.
  133078.     popup queryAllFromView: self view.
  133079.     popup showIn: self position: tool screenRectangle bottomLeft.
  133080.     ^0!
  133081.  
  133082. onDropOverPackage: session
  133083.     "Private - The drag operation described by session would like to do a drop.
  133084.     Override this method to accept the dragObject(s)."
  133085.  
  133086.     | targetPackage packageManager |
  133087.  
  133088.     targetPackage := session suggestedTarget.
  133089.     targetPackage isNil ifTrue: [ Sound errorBeep. ^false ].
  133090.  
  133091.     packageManager := Package manager.
  133092.  
  133093.     Cursor wait showWhile: [
  133094.         session dragObjects do: [:each |
  133095.             "See if the drop is a CompiledMethod"
  133096.             (each isFormatAvailable: #CompiledMethod) ifTrue: [ | method |
  133097.                 method := each format: #CompiledMethod.
  133098.                 packageManager addMethod: method to: targetPackage ].
  133099.     
  133100.             (each isFormatAvailable: #ResourceIdentifier) ifTrue: [ | resource |
  133101.                 resource := each format: #ResourceIdentifier.
  133102.                 packageManager addResourceIdentifier: resource to: targetPackage ].
  133103.  
  133104.             (each isFormatAvailable: #GlobalSymbol) ifTrue: [ | global |
  133105.                 global := each format: #GlobalSymbol.
  133106.                 packageManager addGlobalNamed: global to: targetPackage ].
  133107.  
  133108.             (each isFormatAvailable: #Class) ifTrue: [ | class |
  133109.                 class := each format: #Class.
  133110.                 packageManager addClass: class to: targetPackage ]]].
  133111.     
  133112.     "Operation must never be #move to avoid methods being removed"
  133113.     session operation: #copy.
  133114.         
  133115.     ^true!
  133116.  
  133117. onGlobalRemoved: anAssociation
  133118.     "Private - The global with the specified binding has been removed from the system.
  133119.     The globals pane must be kept up to date."
  133120.  
  133121.     currentCard == #globals 
  133122.         ifTrue: [globalsPresenter model remove: anAssociation key ifAbsent: []]
  133123.         ifFalse: [self markCardDirty: #globals]!
  133124.  
  133125. onGlobalRenamed: anAssociation from: aSymbol
  133126.     "Private - The global with the specified binding has been renamed, the <Symbol>
  133127.     argument being its original name. The globals pane must be kept up to date."
  133128.  
  133129.     currentCard == #globals 
  133130.         ifTrue: 
  133131.             [(globalsPresenter model remove: aSymbol ifAbsent: []) notNil 
  133132.                 ifTrue: [globalsPresenter model add: anAssociation key]]
  133133.         ifFalse: [self markCardDirty: #globals]!
  133134.  
  133135. onGlobalRepackaged: aSymbol from: oldPackage to: newPackage
  133136.     self 
  133137.         objectRepackaged: aSymbol
  133138.         from: oldPackage
  133139.         to: newPackage
  133140.         card: #globals
  133141.         list: globalsPresenter model!
  133142.  
  133143. onMethodAdded: aCompilationResult
  133144.     currentCard == #methods 
  133145.         ifTrue: 
  133146.             [| method |
  133147.             method := aCompilationResult method.
  133148.             (method isLoose and: [self packages includes: method owningPackage]) 
  133149.                 ifTrue: [methodsPresenter model add: method]]
  133150.         ifFalse: [self markCardDirty: #methods]!
  133151.  
  133152. onMethodRemoved: aCompiledMethod
  133153.     currentCard == #methods 
  133154.         ifTrue: 
  133155.             ["By this time, the package's may have been updated, so we may not be able to tell
  133156.              if the method was originally loose, therefore we must just attempt to remove it regardless."
  133157.  
  133158.             methodsPresenter model remove: aCompiledMethod ifAbsent: []]
  133159.         ifFalse: [self markCardDirty: #methods]!
  133160.  
  133161. onMethodRepackaged: aCompiledMethod from: oldPackage to: newPackage
  133162.     | packages displayingNewPackage |
  133163.     currentCard == #methods ifFalse: [^self markCardDirty: #methods].
  133164.     packages := self packages.
  133165.     displayingNewPackage := packages includes: newPackage.
  133166.     (packages includes: oldPackage) 
  133167.         ifTrue: 
  133168.             [| wasLoose |
  133169.             wasLoose := methodsPresenter model indexOf: aCompiledMethod.
  133170.             (displayingNewPackage and: [aCompiledMethod isLoose]) 
  133171.                 ifTrue: 
  133172.                     [wasLoose ~= 0 
  133173.                         ifTrue: [methodsPresenter model updateAtIndex: wasLoose]
  133174.                         ifFalse: [methodsPresenter model add: aCompiledMethod]]
  133175.                 ifFalse: [wasLoose ~= 0 ifTrue: [methodsPresenter model removeAtIndex: wasLoose]]]
  133176.         ifFalse: 
  133177.             [(displayingNewPackage and: [aCompiledMethod isLoose]) 
  133178.                 ifTrue: [methodsPresenter model add: aCompiledMethod]]!
  133179.  
  133180. onMethodUpdated: aCompilationResult 
  133181.     "Private - A method has been updated in the system. Ensure that the methods presenter
  133182.     is updated if necessary."
  133183.  
  133184.     currentCard == #methods 
  133185.         ifTrue: 
  133186.             [| method oldMethod |
  133187.             method := aCompilationResult method.
  133188.             oldMethod := aCompilationResult oldMethod.
  133189.             (methodsPresenter list identityIncludes: oldMethod) 
  133190.                 ifTrue: 
  133191.                     [| sel |
  133192.                     sel := methodsPresenter selection copyReplacing: oldMethod withObject: method.
  133193.                     (methodsPresenter model)
  133194.                         remove: oldMethod;
  133195.                         add: method.
  133196.                     sel notEmpty ifTrue: [methodsPresenter selection: sel]]]
  133197.         ifFalse: [self markCardDirty: #methods]!
  133198.  
  133199. onPackageChanged: aPackage
  133200.     "Private - The specified <Package> has moved from changed to not-changed state, or vice versa.
  133201.     Repaint the current card to ensure that any change markers are added/removed."
  133202.  
  133203.     cardsPresenter currentCard invalidate!
  133204.  
  133205. onPackageSelected
  133206.     "Private - A package has been selected. Update the receiver's display
  133207.     to show the package contents."
  133208.  
  133209.     self updateContents!
  133210.  
  133211. onPackagesUpdated
  133212.     "Private - Set the receivers packagesModel to the current set of packages known by
  133213.     the PackageManager."
  133214.  
  133215.     | selected |
  133216.     selected := self packages.
  133217.     packagesPresenter refresh.
  133218.     self packages: selected!
  133219.  
  133220. onScriptSelected
  133221.     "Private - A script has been selected. Fill and show the source view with a
  133222.     definition of the script."
  133223.  
  133224.     | script |
  133225.     currentCard == #scripts ifFalse: [^self].
  133226.     script := self scriptName.
  133227.     script notNil 
  133228.         ifTrue: 
  133229.             [| pkg |
  133230.             pkg := self singlePackage.
  133231.             self scriptText: (pkg sourceManager syntaxColorOfScript: (pkg scriptAt: script)).
  133232.             scriptTextPresenter ensureVisible]
  133233.         ifFalse: [self scriptText: '']!
  133234.  
  133235. onViewClosed
  133236.     "Sent by the receiver's view when it has been closed.
  133237.     Disconnect from any events triggered by the devlopment system"
  133238.  
  133239.     super onViewClosed.
  133240.     self release
  133241. !
  133242.  
  133243. onViewOpened
  133244.     "Received when the receiver's view is been connected. "
  133245.  
  133246.     | statusItem toolbar |
  133247.     super onViewOpened.
  133248.     statusItem := self view viewNamed: 'errors' ifNone: [].
  133249.     statusItem notNil 
  133250.         ifTrue: 
  133251.             [statusModel := ValueHolder new.
  133252.             statusItem model: statusModel.
  133253.             scriptTextPresenter errorModel: statusModel].
  133254.  
  133255.     "Enable view mode pulldown"
  133256.     toolbar := self view viewNamed: 'viewTools'.
  133257.     toolbar presenterConnectionPoint 
  133258.         when: #dropDown:
  133259.         send: #onDropDown:
  133260.         to: self.
  133261.  
  133262.     "Really a CardContainer view, but we treat as if a presenter"
  133263.     cardsPresenter := self view viewNamed: 'ownedCards'.
  133264.     cardsPresenter 
  133265.         when: #currentCardChanged
  133266.         send: #onCardChanged
  133267.         to: self.    ";
  133268.         when: #currentCardChanging: send: #onSelectionChanging: to: self"
  133269.     self applyOptions.
  133270.  
  133271.     "Make sure the classes tab is visble"
  133272.     classesPresenter ensureVisible.
  133273.     self packageManager youShouldBeProcessingEvents.!
  133274.  
  133275. packages
  133276.     "Answer the collection of currently selected packages"
  133277.  
  133278.     ^packagesPresenter selection
  133279. !
  133280.  
  133281. packages: aPackageCollection
  133282.     "Set the selected packages."
  133283.  
  133284.     packagesPresenter
  133285.         selections: aPackageCollection;
  133286.         ensureSelectionVisible;
  133287.         synchronizeFilter!
  133288.  
  133289. queryCommand: aCommandQuery 
  133290.     "Private - Enters details about a potential command for the receiver into 
  133291.     the <CommandQuery>, query"
  133292.  
  133293.     | selector |
  133294.     selector := aCommandQuery commandSymbol.
  133295.     selector == #browseIt 
  133296.         ifTrue: 
  133297.             [selector := self browseItCommand.
  133298.             selector isNil 
  133299.                 ifTrue: 
  133300.                     [aCommandQuery isEnabled: false.
  133301.                     ^true]].
  133302.     selector == #inspectIt 
  133303.         ifTrue: 
  133304.             [selector := self inspectItCommand.
  133305.             selector isNil 
  133306.                 ifTrue: 
  133307.                     [aCommandQuery isEnabled: false.
  133308.                     ^true]].
  133309.     selector == #browsePackages 
  133310.         ifTrue: 
  133311.             [aCommandQuery 
  133312.                 isEnabled: ((packagesPresenter respondsTo: selector) and: [self packages notEmpty]).
  133313.             ^true].
  133314.     (#(#browseHierarchy #browseReferences) identityIncludes: selector) 
  133315.         ifTrue: 
  133316.             [aCommandQuery 
  133317.                 isEnabled: (self selectedClass notNil or: [self method notNil or: [self global notNil]]).
  133318.             ^true].
  133319.     (#(#browseMethodClass #browseMessageDefs #browseMessageRefs #browseDefinitions) 
  133320.         identityIncludes: selector) 
  133321.             ifTrue: 
  133322.                 [aCommandQuery isEnabled: (self method notNil and: [currentCard == #methods]).
  133323.                 ^true].
  133324.     (#(#browseClass #browseClassReferences) identityIncludes: selector) 
  133325.         ifTrue: 
  133326.             [aCommandQuery isEnabled: self selectedClass notNil.
  133327.             ^true].
  133328.     #accept == selector 
  133329.         ifTrue: 
  133330.             [packagesPresenter hasSinglePackage 
  133331.                 ifTrue: 
  133332.                     [aCommandQuery
  133333.                         isEnabled: true;
  133334.                         isDefault: true]
  133335.                 ifFalse: [aCommandQuery isEnabled: false].
  133336.             ^true].
  133337.     (#(#removeClasses #inspectClasses) identityIncludes: selector) 
  133338.         ifTrue: 
  133339.             [aCommandQuery isEnabled: self selectedClasses notEmpty.
  133340.             ^true].
  133341.     (#(#removeLooseMethods #browseMethods #inspectMethods) identityIncludes: selector) 
  133342.         ifTrue: 
  133343.             [aCommandQuery isEnabled: self methods notEmpty.
  133344.             ^true].
  133345.     #browseGlobalReferences == selector 
  133346.         ifTrue: 
  133347.             [aCommandQuery isEnabled: self global notNil.
  133348.             ^true].
  133349.     (#(#inspectGlobals #browseGlobals #removeGlobals) identityIncludes: selector) 
  133350.         ifTrue: 
  133351.             [aCommandQuery isEnabled: self globalNames notEmpty.
  133352.             ^true].
  133353.     selector == #removeResources 
  133354.         ifTrue: 
  133355.             [aCommandQuery isEnabled: self looseResourceIdentifiers notEmpty.
  133356.             ^true].
  133357.     selector == #upgradeResources 
  133358.         ifTrue: 
  133359.             [aCommandQuery isEnabled: self viewResourceIdentifiers notEmpty.
  133360.             ^true].
  133361.     ^super queryCommand: aCommandQuery!
  133362.  
  133363. refreshCard: aSymbol
  133364.     currentCard == aSymbol 
  133365.         ifTrue: [self updateCardNow: aSymbol]
  133366.         ifFalse: [self markCardDirty: aSymbol]!
  133367.  
  133368. release
  133369.     "Remove references to objects that may refer back to the receiver. 
  133370.     Remove the event registrations we have lodged with the package manager and
  133371.     system dictionary."
  133372.  
  133373.     super release.
  133374.     self packageManager removeEventsTriggeredFor: self.
  133375.     self class environment removeEventsTriggeredFor: self.
  133376. !
  133377.  
  133378. removeClasses
  133379.     "Private - Remove the currently selected classes from the package."
  133380.  
  133381.     self selectedClasses do: [:e | e owningPackage removeClass: e]!
  133382.  
  133383. removeGlobals
  133384.     "Private - Remove the currently selected global from its package."
  133385.  
  133386.     self globalNames do: [:each | Package manager addGlobalNamed: each to: nil]!
  133387.  
  133388. removeLooseMethods
  133389.     "Private - Remove the currently selected method(s) from their packages.
  133390.     Note that the methods are not actually removed from the system (i.e.
  133391.     ownership is transferred to the package of their method class)."
  133392.  
  133393.     self methods do: [:m | m owningPackage removeMethod: m]!
  133394.  
  133395. removeResource
  133396.     "Private - Remove the currently selected resource identifier from the package."
  133397.  
  133398.     self resourceIdentifier owningPackage removeResourceIdentifier: self resourceIdentifier!
  133399.  
  133400. removeResources
  133401.     "Private - Remove the currently selected resource identifier from the package."
  133402.  
  133403.     self resourceIdentifiers do: [:each | each owningPackage removeResourceIdentifier: each]!
  133404.  
  133405. resourceIdentifier
  133406.     "Private - Answer the currently selected <ResourceIdentifier>, or nil if there not exactly one selection."
  133407.  
  133408.     | rids |
  133409.     rids := self resourceIdentifiers.
  133410.     ^rids size = 1 ifTrue: [rids first]!
  133411.  
  133412. resourceIdentifiers
  133413.     "Private - Answer a <Collection> of the <ResourceIdentifier>s in the package which are currently
  133414.     selected."
  133415.  
  133416.     ^resourcesPresenter selections!
  133417.  
  133418. saveComment
  133419.     "Private - Save the comment from the source text."
  133420.  
  133421.     self singlePackage comment: commentPresenter plainText.
  133422.     commentPresenter isModified: false!
  133423.  
  133424. saveScript
  133425.     "Private - Save the script from the source text."
  133426.  
  133427.     self singlePackage scriptAt: self scriptName put: self scriptText.
  133428.     self updateScriptNames.
  133429. !
  133430.  
  133431. scriptName
  133432.     "Answer the currently selected script name."
  133433.     
  133434.     ^(scriptNamesPresenter selectionIfNone: [^nil]) key!
  133435.  
  133436. scriptText
  133437.     "Private - Answer the text for the currently selected script as a String"
  133438.  
  133439.     ^scriptTextPresenter plainText!
  133440.  
  133441. scriptText: text 
  133442.     "Private - Set the text of the receivers scriptPresenter to the argument,
  133443.     text (either plain or rich text)."
  133444.  
  133445.     scriptTextPresenter text: text
  133446. !
  133447.  
  133448. selectedClass
  133449.     "Answer the currently selected class if there is exactly one selection, otherwise answer nil."
  133450.  
  133451.     | classes |
  133452.     classes := self selectedClasses.
  133453.     ^classes size == 1 ifTrue: [classes first]!
  133454.  
  133455. selectedClasses
  133456.     "Answer the currently selected class, or and empty collection if none."
  133457.  
  133458.     ^classesPresenter selectionOrNil!
  133459.  
  133460. showPrerequisitesFor: aPackage
  133461.     "Private - Set the receiver to display aPackage and show the Prerequisites card for this"
  133462.  
  133463.     self singlePackage: aPackage.
  133464.     prerequisitesPresenter ensureVisible!
  133465.  
  133466. singlePackage
  133467.     "Answer the single selected package."
  133468.  
  133469.     ^packagesPresenter singlePackage
  133470. !
  133471.  
  133472. singlePackage: aPackage
  133473.     "Set the receiver to be displaying a single package, aPackage"
  133474.  
  133475.     self packages: (Array with: aPackage)!
  133476.  
  133477. source
  133478.     "Private - Answer the source for the currently selected method as a String"
  133479.  
  133480.     ^scriptTextPresenter plainText!
  133481.  
  133482. statusText: aString
  133483.     statusModel 
  133484.         value: (aString isNil ifFalse: [Notification new messageText: aString])!
  133485.  
  133486. updateCaption
  133487.     "Private - The receiver has changed in such a way that the caption may need to be refreshed.
  133488.     Do this here"
  133489.  
  133490.     | text |
  133491.     text := 'Package Browser'.
  133492.     self hasPackages 
  133493.         ifTrue: 
  133494.             [| title |
  133495.             title := self singlePackage 
  133496.                         ifNil: [' - Multiple Packages']
  133497.                         ifNotNil: [:package | ' - %1 %2' formatWith: package displayString with: package packageVersion].
  133498.             text := text , title].
  133499.     self caption: text!
  133500.  
  133501. updateCardNow: aSymbol
  133502.     | updateInfo |
  133503.     updateInfo := UpdateMap at: aSymbol.
  133504.     self perform: updateInfo second.
  133505.     updateFlags := updateFlags maskSet: updateInfo first!
  133506.  
  133507. updateCards
  133508.     "Private - Update the source object cards for the currently selected package(s).
  133509.     Implementation Note: It takes quite a bit of effort to update some of the cards, so we only 
  133510.     truly update the one which is actually displayed. We do this by clearing all models,
  133511.     except for the current card (to avoid flicker), and reset the update flags so that
  133512.     panes get refreshed on demand as they are displayed. Then we refresh the current card."
  133513.  
  133514.     UpdateMap keysDo: 
  133515.             [:each | 
  133516.             (each ~~ currentCard and: [self isCardUpToDate: each]) ifTrue: [self clearCard: each]].
  133517.     updateFlags := 0.
  133518.     self updateCardNow: currentCard!
  133519.  
  133520. updateClasses
  133521.     "Private - Update the classes list for this package."
  133522.  
  133523.     | classes |
  133524.     classes := OrderedCollection new: 64.
  133525.     self packages 
  133526.         do: [:each | each classesDo: [:eachClass | classes addLast: eachClass]].
  133527.     classesPresenter list: classes!
  133528.  
  133529. updateComment
  133530.     "Private - Update the comment for a single package."
  133531.  
  133532.     commentPresenter view forecolor: Color darkGreen.
  133533.     self singlePackage 
  133534.         ifNil: 
  133535.             [commentPresenter text: ''.
  133536.             commentPresenter view disable]
  133537.         ifNotNil: 
  133538.             [:package | 
  133539.             commentPresenter text: package comment.
  133540.             "#642: Note must enable after setting text, or view may not display scrollbar correctly"
  133541.             commentPresenter view enable]!
  133542.  
  133543. updateContents
  133544.     "Private - Fill the contents presenters based on the currently selected package."
  133545.  
  133546.     currentCard isNil ifTrue: [self cacheCurrentCard].
  133547.     self
  133548.         updateComment;
  133549.         updateCards;
  133550.         updateCaption;
  133551.         updateStatus;
  133552.         updatePrerequisites!
  133553.  
  133554. updateGlobals
  133555.     "Private - Update the Globals list for this package."
  133556.  
  133557.     | globals |
  133558.     globals := OrderedCollection new.
  133559.     self packages do: [:each | globals addAll: each globalNames].
  133560.     globalsPresenter list: globals!
  133561.  
  133562. updateMethods
  133563.     "Private - Update the methods list for the selected package."
  133564.  
  133565.     | methods |
  133566.     methods := OrderedCollection new.
  133567.     self packages do: [:each | methods addAll: each methods].
  133568.     methodsPresenter list: methods!
  133569.  
  133570. updatePrerequisites
  133571.     "Private - Update the prerequisites list for this package."
  133572.     
  133573.     prerequisitesPresenter packages: self packages
  133574.  
  133575. !
  133576.  
  133577. updateResources
  133578.     "Private - Update the resources list for this package."
  133579.  
  133580.     resourcesPresenter showResourcesOwnedByPackages: self packages!
  133581.  
  133582. updateScriptNames
  133583.     "Private - Update the scripts list for a single package."
  133584.  
  133585.     | scriptSelected |
  133586.     scriptSelected := scriptNamesPresenter selectionByIndex.
  133587.     scriptNamesPresenter clear.
  133588.     self singlePackage 
  133589.         ifNil: [scriptTextPresenter view isEnabled: false]
  133590.         ifNotNil: 
  133591.             [:package | 
  133592.             #(#preinstall #postinstall #preuninstall #postuninstall) 
  133593.                 do: [:each | scriptNamesPresenter model add: each -> (package scriptAt: each) notEmpty].
  133594.             scriptNamesPresenter 
  133595.                 selectionByIndex: (scriptSelected = 0 ifTrue: [1] ifFalse: [scriptSelected]).
  133596.             scriptTextPresenter view isEnabled: true]!
  133597.  
  133598. updateStatus
  133599.     "Private - The receiver has changed in such a way that the caption may need to be refreshed.
  133600.     Do this here"
  133601.  
  133602.     self statusText: (self singlePackage ifNotNil: [:package | package packageFileName])!
  133603.  
  133604. upgradeResources
  133605.     "Private - Uprade & resave the selected resources, by loading them into a ViewComposer."
  133606.  
  133607.     | vc |
  133608.     vc := Smalltalk developmentSystem openViewComposerEmpty.
  133609.     self viewResourceIdentifiers do: 
  133610.             [:each | 
  133611.             vc
  133612.                 openOn: each;
  133613.                 fileSave].
  133614.     vc exit!
  133615.  
  133616. viewResourceIdentifiers
  133617.     ^self resourceIdentifiers select: [:each | each resource isViewResource]! !
  133618.  
  133619. ProtocolBrowserShell comment:
  133620. 'ProtocolBrowserShell is a <SmalltalkToolShell> that implements the Protocol Browser tool. This displays a list of all the <MethodProtocol>s known to the system. Selecting a protocol displays the selectors within it and the classes that conform to it. From within the Protocol Browser it is possible to perform a wide range of protocol housekeeping activities.
  133621.  
  133622. Instance Variables:
  133623.     protocolsPresenter        <ListPresenter> holding the list of installed protocols.
  133624.     selectorsPresenter        <ListPresenter> holding a list of messages for the selected protocol.
  133625.     classesPresenter        <ListPresenter> holding a list of classes conforming to be selected protocol.
  133626.  
  133627.  
  133628. '!
  133629. !ProtocolBrowserShell class methodsFor!
  133630.  
  133631. σM4
  133632. 99╜á<s·¿┐>ù:α┘éªùò■┼«≈½W »╧;r{B└ü?_█Ej]OAb±┴    Qi5Jπ[k░¬#ε█PΦ╢Ñ¢╖╬\ ÆdL}e╘¿l&º╞╬GôVçpεQ│~òΩT]I9≥$₧₧LÅGf┴jU─¥╓·╚αdëï█çsO╜⌠R½tD9∩à^┤╢^╘U=╔^╫V²(yφ≈m╓cb╠e±¢│V{ºí√±∞FèµoK¬σáM!
  133633.  
  133634. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  133635. σäM&2G¬oi«¬3Θ£/j┼▌▐á┤îTÆxXI.d▀║l'ó▌ΘZG¢!
  133636.  
  133637. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A%b£∞t05J»zc¼ó4≤▀N    ▓▓∙≤¥ª^s²4i]m█░a&»┼╦LÉûz╛N│sä2σB[ 5î÷╖XÿFG╡(╓ƒσ∙└ñvÜ$£ö¥&O╜⌠[BΓttÄⁿ╤╙[ΓS╧P╘M₧GÉ╒}┼K}╘:úΦîKxΘεδ√∞µÖ
  133638. 5¬σ╛ BwC@cê%≤>+D█╚_τ╦0/B_▀«!!çC/ùπ┌°ª<ñδ├á≡!
  133639.  
  133640. ±Q%<+¼è6⌐╣ë)æ,î╛åÄ▀┘╠┬╗ασRπù╧tx]Fµà<^Æ%hGc
  133641. ╢▌?Jv#L╖"@*▓╛"÷╫Q¡│≈£εÅÆ4Lme╙¬h αï¡3% ¡^f╗S│o╨ΘSC+Θa¢ JîGw╕u╛°¬ƒ═ñw╥M╫║Çl
  133642. ¡σF¡o~âßi₧£MΓT<╔v▄9π(o░£¿+┘0ñ╬ÉAx╡!
  133643.  
  133644. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]¡╛╟r`\S└─*ZÆW3}OVfOΓÄUufI¼pWo░δ)∙╤L@«╕Ñ▐π╟^àq]gv▀«-&íë┴UDÜ╙y½B╕·hεTB.αh▀╤_▄V|Ñ|╨₧┬σ▀αuÜÆ█çt
  133645. εΓNW╢e5∩àZ╖╠ZδGo┘Q╙·9h°╦q╪G¬V≤▒Θ)┌¥⌡ ∞
  133646. ╝⌡lW∙Σ╖iIEc<Ü9·$tB=ú~ñżV{9pU╔ò*å|Ü⌠╘¬╒bδ┤»╠ù;▒╣ë╩    1K │p╪
  133647. g\≡╕y╘dTΓ]≤δ·τ╩Fë╙┬∩Qα"Ädε?ƒºδ┌@! !
  133648.  
  133649. !ProtocolBrowserShell methodsFor!
  133650.  
  133651. αG344çâ3:⌐─µC╟∩╟°╔∞ù╦▌╗▓ªFQ¡╛╬oQ┴ü2WöKA..x_jσ┴W&2Gª<Aoí«)∞█PLΦ╕Ñ≤¥ª¢4W.t╥╣7ε└╙FÜûT─.▄«≡P\=≥Tì█JÖL`⌐|└ù╧≤╧┤zç░ë╜u!
  133652.  
  133653. αG344çâ3:⌐≤╠+ª3α╟ⁿíö╛¥µ╗■áPW »╚~3u▐à-A╔E    bZ@xO Å^Mn#▒yPo½╜%Φ£/j┼▌▐á⌠├äqM0|e╔╣c&½█ÇJMÖÉ|íMÖo╛≡ φeî═!
  133654.  
  133655. α@#999╖£_C╙δ¡.ü,í└τ╔╛─┌┘╗±▒VG ╕╠z`[╞ï~FƒZ){IAnΓìu#CªGoªδ0Φ╤V½╕╗▄ÜÑqt■hfo╔╣có╚╙Jë{∙=¡K╣nò▀]N+í>┬₧zöM}» ┴¥╬µ╪Ña╚`⌡≥·í°TA▒:JXÄε ═ƒ^δM╔W█·"sΩçy╤qa╥+┤╪áKx┐½√ΩΘ    ªÖ
  133656. 5╨π│lI[Q&u¡∞#tQë4┴Ö▓y3M▐àoƒUE┌░┬╜≡gñ¬ô┬Ä1╢∞┼I╦ $ÑOΦ}Qσ°)╬bO┬Æ┴ÜêδZÄ╙ƒªyÖxY╙xΣ?├º⌡╨CeM9╥;ÆΣ>?╤7ùA╠Oaoçss═∩:╙*H╟íα[kzYr╨Z╬└╓P    â∞PjèÆ#≥ !
  133657.  
  133658. α@#*'7░Ç1&╢─µC╟≤█Γ▄Ω─ƒ╙▒ασR▒╛╫;cZY╞ï=]¢P%.YV+≥à]&2@πh[oΓ╕9Θ╩GΩ┌▌≤¥ª^ÖuS.|╖╓zá╚═\╧K╙&gíNªiò╝A]5±p┼₧¼P{╕?▄₧â°═¡v╥J╓█¥sÇ°[╧
  133659. cïΘ╠╩Z╜Bª6│╚1!!≈┬o≥Pa╘0▓╙Åh▐─æùë¡πPN╢⌠╜    iV&îµ$1BU▌┬║│Vy3@C╓ó#èI╓■╨╡∙;ñ┤Ç└ƒp╪ëá`ª2n╓òfMτ╖{┼~S▄æò£ì╨Dêì¿î+¥{Y¬yε'╩Σ≈╙@gJy/■#£⌠"i¼!
  133660.  
  133661. α@#)04íî&&¿─µC╟≤█Γ▄Ω─ƒ╙▒ασR▒╛╫;`MZ╫ç*]àP%.YV+≥à]&2@πh[oΓ¿5Φ╠G╝╗«▐Σ╩ö`[.p╚│y=¡╞╠% {∙iε@╛râ≥bJ=ΓpÉ╠E±(Σ4▄ü╞° Ñìïöü<U≤▒gV¡moç²s╬═PΩQ;û¥7≈)!!╩┬t╟Az╧-δ¢╩z╝║╓≈∞Fí≥TN¼σΦJ9,<be:üµtCU╩┬╩√-?KC╔ä!!╕_ô≤┼╖ε!!σ⌐▓╘ù<║∩çdÑl^C1 ▒l⌡qMó╕z÷lWσ¡äƒï▄\ö─ƒªAⁿ#┐e╥6╔Γ√╦T O≡;Ç≥w%¬Y⌡'╢qlGpòagê┘:√J N┌¡²z"=Y6æ)╤└╦]J└ßI>≈╕┌─╪₧%+N╓░%C+É`₧ ÿ┴ á┐≥ó─ÖîÜW▓ëDB⌐åçIï)Ñmu⌡ì╡┬└<eÿêeΘσÜ=x═╟Φ,ÅFMy`φ║|∩Eòτwü¿╣Qå█Fº<,żñ╒&├π╩~▐ªXα¡Os-╛ⁿéïû^W╧4┼╗╞I(─╥╛KÅ╒àd@¡╨zHⁿ!!¿╤`GΘ4Hóä⌐Σ╤]¥%▒·äÄó╥{┤!
  133662.  
  133663. α@#)04íî&&¿║ß@∞}╤╞α┴ε├╠ò╕²╖B ╕╧wMU╞ì1\╫PBj}^_n ΓÄ r)íykª»%■₧VΦú┐¢╖╠     àqPbyÜ»h>½╩╘\L╒üaí@╣q▐Cæ;"cQ²$Å╠VêMwú |▌ù╘┼╔¼vïÉëÇ<ó⌡dA«e    oì² ₧├2ì(?▐P╬≡"m╣¥%éQk╠9±╠æK`╝¡≈≥«k┬¥oP╜╙╖fRZur╘Wú"~[_╩┴QÖñUh?WC╚Æaµ0k▐■╘»╧dΦ┐é┘ò,ªúôTÅ2C▒s°
  133664. xß╣f╧~^▀ÆäÉÜ╨Zê ╦╓P√?╣dφià≈Ω╨Ij@
  133665.     ;■%░√,vén▀]┌Gbàtuî≈∩ 6OüΓé=XSDj°╥Æ┤.oΘèU,âφ\Ü╧▀*┤EQ9)*▐░%9öh╫Θ▌▀║┐⌡÷╫µí6⌡1╔àAR!!ñ╥╒Nï$¿uU≈╗│┌╩-b╫₧%íÄ⌡F¬·■s├O|3>é▀ Tû≤$┬╩╫=π≥.░=├ñ¿┼,▌░æ:Æ┤O
  133666. Σ╖k6╣«ÿ╩æT@è.$≡Ñ╠^3╚╧≥▄÷ÄfV¡▀<ªC^╙╖!!°>I≈╥┐σ¥Çu¼∙ö▓ñ╤EH╓vÜUα■┼UΣÿ╔■U╕-^1£WC%â½É{Ey╟ ≡¿Qc    ╦èΦ3▌Γá)╪B├|]╝╒╓Ñ╤cm5ª⌐ßKs!!ÅJz{X]╚ j╜«ö82Æå┐░M┐∩╙░cb!
  133667.  
  133668. πV(&=ëè&!!╡¡ƒG∩Vú÷²├Θ─┌ò┐■⌐W╖╛Çvv\^▌Ç-ÇWM)fRy
  133669. ╢êr.JπFx░«.ε╥[@╗▓╗¢⌠█╫dLzo┘│a!!αï¡3% Çy¿╗rö≡M÷wÜ≤\êJ{¿0.▄å╠⌡├¼`╥M╫║ün╖▒@M╢hP;æΩ?╪ƒO⌡N;├\╒║!
  133670.  
  133671. ΓV"!!=çÇ?9╡ºë$æ,î╛åÄ▌┼┌╘¬≈σGK║√╨iv[S▄É;@äG%`ORb≤à^[f[½yxº¿%≤╚GΩ┌▌≤¥ª çqL@mr▀╜y7ì╞═IG¢¥fα.▄Ç≤E@
  133672. 7φw»╠\ÅGz╕.ô╚₧╢▀ÑÄM₧ƒù&Oé°DPÆrhçß'█═ΘD8î]▀%ⁿ?uⁿ├¿+⌐V┐▌ÄA.≤ΘΦ∞∩º≈oP¬ºⁿgh UPc1ܱcJC╠┘ÿß0|PI╓çoè^╠░²▒∩u╘¿ä▐ƒ0íµ█I┴ KÅsεq[Å█⌐2Γôä╔╬ÿ[₧┌└σV√#²%îY¼Σ⌠▐    Ul\6[8Γ2¥π(w╤n┬╠MD#çdd╫╗∩ 6Oα½ΩE0(Igσ╥╫┌P    ÆúR/á┐G₧ÿÜ₧k;\A╤⌡7D!
  133673.  
  133674. ΓV"!!=ùî:,╖¿ÿ#åΦ╞µ┬∙║╡╝ⁿ╤╖VB½╛Ço{M╞û7UÉZVjyRAb±┴Vtf[½yxº¿%≤╚GΩ┌▌≤¥ª çqL@mr▀╜y7¥╩╚\EöÜBºQ┐sùOæ;&*εpÉ▌VÉQD╛/╓£╫≤▐═ßdêôûrUε▓DA«e    oïα=²╫^ΘF*╚2░ÜDrⁿ╔|ÿ-╧1ü╬îP{░í⌠═σ
  133675. ¡≈tY╜ì╪ck RZQ&!!ïσL]&9▐╚╨ßi.BK⌡ù*ÖoⁿÖ╕╤∩dΩ╛█ì┘1╗╟█╚*!!3«sΦwPεδ¬2àæ█╙¥┌D¥û╚ΘF±k╫êZ╥∩²╤@*KF-½Z∙₧D é1æJàXMmóro¥╘#µN╟╢αT>6t┐s╖╞╓FôµP,≈≥F¢Éô│FQ9W╟■~C~ò~ûⁿé┐d┼╙ÿÑ╬à╧▄»èaD%ºó¥▀%«mjBû╘┘º¼+~═┌?óä÷|╬ÉΦ,ÅEs#ò└%εEèΣ9ÿó»τ±.╩/ì≤τé:╘ⁿò=éÄE┬╝j#»≡╡íⁿpBA─>qÇ⌠╠D╬╠√IêΘÄZG«┘0φ*Y╨╖\σaδ┴╢τô6╖\á∙æÆ▓╪ vN▄w UèY⌠╕¡-âî─í∞h
  133676. ÜOO)Ööçzúg¥¼(Äëπmÿ¡Γ)╥^╨Pz╘│║╧╤+>lΩ║≈Uy$║\?nO\╤* +─╦■-═╩⌐ΓOñΣ╒│&2`φ
  133677. \⌠@t≤$A╨?÷░òr2!!╕^H╣|Eσ─W    Åφ⌡µé)@Z°e₧¢▓ò≤9┬Φª6¼╧ÜNÑ,|x∩µ▒_º±┼æ9▄■S▒d3=≤£ue¡┘7║≤O╗åI,▒²'τä[äü⌡W╠Jπ')É?4╠îbS-╙¥£╥≤e■
  133678. Tx╬!
  133679.  
  133680. ΘE4;6,▒Ä>
  133681. ╢¿ƒ9ΦUêû╬┬φ└┌╟■µ╖FF ▓╞;g@SÆû;QÆVR/|j╢Ç^Zj'\░<@o««#ε█FB┼▌┌⌠₧±¢rmt╧╜aó╚╙J¢ç8|ó!
  133682.  
  133683. ΘE4*'7░Ç1&╢─µC╟∩╟°╔∞ù╦╟½≈σZE »╚~3ZS╤ü7DÆM"oHjOµôMi%@»<@o««#ε█FB┼▌┌⌠₧±¢r|o╬│n=óë╬V\╗ƒ!
  133684.  
  133685. ΘE4)04íî&&¿║ß@∞}└┌ⁿ█√┼ƒ┴¼τáJ╣√╘svD╫ç;[üZVjfZ@+°ä^VtfB¼nV*▒«, ▌V║ñ≈ì≥├âqZB
  133686. ╖╓ ╜╠╠_åƒv║Lñn╨≤Ej(⌡}!
  133687.  
  133688. εJ4?ö¥==╡¬â&▀≥╤ⁿ▀≈╪╤╕╘¢τcQ╢¡┴ovÆÑ~BàPP%mT_+ ΣÇn'\π~Vo¼δ3ε▀P¡│∙▐▌┌
  133689. ╫qFkn▐ⁿy:½ë┴OI£Æy½░ré ²E\dRêpÉ₧TÖL`Ñ2ôå╦≤îíeëôÜæuºσN¡fJVç√;╤█o⌡N;├\╒αc#ö¡¿+}┼,ó╒îJ4╖╝∙∙╧ó±cH¬á╢X%}t3ëµW,1KB╚╚╩ºV1BXÇ┴lª_₧ ╒êεn≡╡é┬û~▒Γ▌òE╗y∙OrP≡╝h╘7»)£ïûì╦ªÿ!
  133690.  
  133691. εJ:,½î=%ê¼ü%ô:σÄ»═╙╥╦▌▒÷òAL½┤├t%<╗╞@₧IE>k+;■ä^K#[½sWZ░ñ4⌡▌M ÷√≈ƒ┌╩ÿpnat╒┐b>Γë╚X[╒û{εQ│pƒ∙U*εi▀╩QÖg╡(╓ƒì¢ª╔Fÿ    ₧Åû<ª⌠T░otüα?═ƒSεR;é╖|₧GΘ╒w╓Mm╧3ó∞æAg╢á∞√≥FÑ√dY╡áájPPQ&3ú≈?uB╞┬à¡!
  133692.  
  133693. εJ:,½î=%ë¼Ç/å+Σ╨éªùò∩╟╖ΣñGF ÷ÇZ3FS┼─.@ÿKK)aWcσ┴\c(░y_oí┐%■Ém┬┌▌≈Σ╩ö`Q}P╚╣~7á▌┼Kûûgα.▄?∙≡P\=≥Tì█JÖL`⌐Q╣√¬√├ñväW▀╙░p╜ΓMºr iüτ*≤╨[ΓMo█V╬┴"nφ╘"é+¬V╪┌èH`╢╝ó╛█\░┤|┐ß╛XI XτµGQ┌'▀₧«Zb0E▄╡=₧_X╓╦æ╒ûì⌐ä┴ƒ=í∞█ 2¿yεOxV±Ñ3Ç~^α▐æüü╦Gÿ┘╔ªQ±5╣ε!!╓⌐ò╡s/zJ
  133694. O}■9á≥!!`Æ É\∞MG`Æed═╞XëcLU╬äε["?YE╒▀┴╩A░±Y9▓±]Üç▀J╤(=\Q÷Γ!!₧hÆ≈ÿ▄ ╗ç┐█íΓ╪ZÉ^αæUR%┤ù¼█>ñmhuæ╙┌!
  133695.  
  133696. εJ:,½î=%Å╣ê+æ:σÄ»═╙╥╦▌▒÷òAL½┤├t%<╗╞@₧IE>k+;■ä^K#[½sWZ░ñ4⌡▌M ÷√≈ƒ┌╩ÿpnat╒┐b>Γë╚X[╒û{εVªyæ∙U6íwÉ╙\▄Ouó9┴ ⌐ƒä«|Ü₧ùƒeO¼ΦLúvuà»0╥▐L⌠D<âL▀÷.u÷╒kéCj─:╡ôæAy╝╕²·⌐HΦ▌nZ╢≥┐J kRPc!!ÜτW p]D└▐_╚╠3V*PÜæ=äNò ▌ö⌡r≡·ê╔é~⌐Äú`▀8│p╨gKóδ4Ç}Iπæé£é╠xë╙╓πLα"·fε7└δ╢▓p/`K    g¼wâσ"q₧7ÉB≤RV#ÅndêπσPe]σº√_>>z q┬▌▌╒
  133697. kΩèU.»┐@î»ÜU╤AR9)──68╦,¼δ╩▌ú╣■║τé╪K▄YñÇ%ìù¢─.¥pi ⌠╜┐┬°R■≤%í«±Xíú╗ε*^dù┴ΦOÜε;á««@╩ÄWº9 ó╜Ä╧-╘Φ╩~ƒâRHî▐fM╣±╘═╒    CK▐5(╧╗₧=µ┼ΩBôΓ¼{M╢╙0Σn=╝Ωf]∩a├⌐╨ê┤2┤&ª∙û┴«╙/TS═kTÆoπ⌠┼D∩ƒ±Ö[!
  133698.  
  133699. εJ9=º¢=;ë¼Ç/å+Σ╨éªùò∩╟╖ΣñGF ÷ÇZ3[S▐ü=FÿM"oHi
  133700. ≤Å^Jc*JáhVn∞ΘMÉ│(i┤≈┤æ∙╔ Ü}PMl█»~7╜ë╨KGüÉyεP│qòΦ^]xΘa₧┌\Äh┴jQ╣√╙Σ├┤|ïô█╔!!O╜⌠[BΓptûα0╤╙è+F▀Z╓≡9nδ╘8ÿ.╙:╜┌├Wq┐½√Ω∩╗║6╘è█    k@Zk;Ç└b\U┌WùL╩éUl/Pd╙ä=èH₧Θⁿ╖°dΦ·û─Ä6ç∞╞▄_w ¿s xα░z┼O^Σê꣣╠÷╝¿î+τ<┐h⌡<╫⌠╕╤RLB]$£]·₧$cÑ&èKàXz/    ∩        à■4τ7Æ »7Z{█╨╞╨J└└P+ñ∞Lî╥╤*┤EQ9C╠÷+0ÿbÉ╪╘╙┐┐Γ÷═é╟KÖJ·─~ '¼ô£ï6φ*e·¡úÄ╓:}ÆÖ8¿Üπ¬φ■;ÉEs#ê▌O╝S£φ2Å│▓FÖ╥¡7 %Ä╣│╪∞¥·W ÄL α╕a~Ω╧╨╬öTVè`vÇ≡αE2═╧∞GòΦ¢)a«▌ φ=sçÉ"çQ-√╚╗≥╬^╬▒≡âä»╔T╘k
  133701. ^ƪ√╧Iσë┴¡▒ EèHC5┘╔ΦC½u┘╫Kx!!èèΓ3髺8╤^╞|}Ü╪├▓╤9&ª»ß^hm╩F?|NW╫!
  133702.  
  133703. εJ% íù&┐╕Ö#ù:σÄ»╪±╪╙╕╘¢τgL░╖ÇozX╞ü&F╫VWj|^B~Σä`)]πh[oΓ≈⌡╤N⌐Ñ₧è≥┬BR╫`Qb.ÿ╤_─á▄Kÿ╙gíW÷a²kòRBx╗9▀╩VôN4»1▐ô═≥îí`╗ÆÖ£pA├¢>T░o;╪▓s═┌Sß?▐P╬≡"m╖¬½Ac─∞ü├`╝⌐ ≥σ'å╟I░µå`0 Xτc▌PpDUëR£QïΣ LpeÜæ=äNò ▌ æ ì╙Φ╦ò,╕Γ▌>╞?QR«sΦOpV±íe┴th°ùÅöπ╡!!≥┐¼±Kαj·#±!!╩≤╕╓    gG|/    4≈üΓ(?╤╪╤O$╗ iï▌4∩ êÖ¿Yq}wPCÿw┤╗┌I└╛j⌠δFÿÆôB∞)9To╬Θd
  133704. ;Ñ~é■éÆ5┴╨ÿ▀⌡╠Ä▄≥├P+▓ƒÄⁿ#╣j<X│«ó┴╤xä¿)ªî▀Z╜╣≥/╖Re2W╟ΦR╔Nòε4çαÇâ¥aó4 ┘Θ£å▐≤¢y½╬'lê▌fs-╛ⁿéïà ^Pè>"╙º╧K%°╘∞CÆßí'/╚▒Ya╓=!!¬█fσ5p±╘ÄΣ┼O∩0▓αÖôñ┘EH╓k!
  133705.  
  133706. εJ0/ïƒ7'┐¡ß@∞}╙╤∞╔≈┴┌╤■σ¡VM »╚~3ZS╤ü7DÆM9.MZn╢êd#J¡<Pe¼Ñ%∙╩Gµ≈⌡≤¥óvwäaN| ╒▓[;½▐∩IM¢ùX─*Ñx£╝CJ*ΣwùεKôV{»0└ ⌐!
  133707.  
  133708. ±V(:;½â_C╙δ¡$û(Σ╞»╪÷╥ƒ╓½α╖VM½╖┘;`MZ╫ç*WôI/zS\oOµôMi%@»<ZdΓ┐( ₧P½▓╛ê≥▌P^ÿf3jn╙░-;¿ë╘QMç╙fεM╣sòCæ;"cQ▀tì╤MôA{á ┴ù╨≤┬┤vÜMî₧ƒy ║°XJìr$rÄ!
  133709.  
  133710. ±V(:;½âhi╗äë>ì0σΣ²├Ω╪▄┌▓ƒ╧:î╛╘h3\^╫─=GàMA$zWJ+≤ìZr#KπqV~¬ñ$║╬P╝╕┤æ√Å╫`V.r▀┐h;╕╠╥\ÜVÆ;p║K╣yá≤E@
  133711. 7φ&≥┤4÷+J╝3╟¥└∙└│CÜî₧¥h
  133712. ╝▒DA«e    oïα=±═qεMuî^≈τ%n²≈j═Va├0╜!
  133713.  
  133714. ±Q50¬Ü!!,╛─µC╟⌠╞Φ╔╛╓╙┘■τ½FP║┐ÇkaGB▌ç1^äB8aV≤┴@u2J«>>╧┴I╒▄H½ú≈ô≥█ôDLzo┘│aó╚╙Jàüp¢Múnò▓<%`+ΣhÖ₧KÖDf⌐4πÇ╠Γ├ú|ä!
  133715.  
  133716. ≡Q",½é?(┤¡╓jö*Σ╞÷îô╜╢ùÄα¼EB½╛Ç63mX╞ü,A╫[A>oR_xO≈âLrfNπl\~ºÑ4≤▀N@½╕║ô÷┴^æ{L@zh▀ⁿ7¡╠╔OMçVÜaí█∙⌠TUεiÆ▀Wÿsa⌐%ì▐âτ┘ÑaæO≥±■f▓▒TIª Φå0╙█╜o▌J▀Ωmb÷╩u├LjÄR█╡└P{┤⌐⌠√┴(¢▌ Σá▒%+?b;ê>±5+=ú~ñx▒▓\a:D█ÆÖUÖ≤▐┤╝ Ä╙Φñ≤7│╫█╩_wfxj╒òfON≈┤{┘1ào≈Φ·τ╓[╕▐└σI±j·xΣ?├ºΦ═RfL    E}°$▓┘L╩Y⌡'╢q(+
  133717. ÅsEâ·7∩!!ê╢²B4's┐s╖█▀bî≡Yp≈Æ#÷ⁿ÷.╖)EE█¥NjT°■Æ╤┴-ñ┐≥╜╬ÅæÜY¼ù@I╩√µzóC─ku=⌡┐▓┬└;+╫£-½¢⌡i_╔ôÆ@Ω~d%éε[æ*≡ó#âá║XÅ⌐Bó<0Å░τ£tæ≤¥:╓Ω oê╜    P6┐±éï°s8-ú8┼╗┼
  133718. 4╩╙╬Xô≥ôjM«£^büG]╙╫r|°.Aóä╫ï┤2┤\╩╬üöñ╧+6░g2≈5∩δπOΘÉ╔áO÷;LƒV4ÿ░ìkSºq½─C@ç₧╝Z▓çëR┤v$▄jK╖╪╤¬┌+>{⌠«ß{]π'SCTπ.ßv¼√╫ZTí»╞╦+ɱ┼║}Fgε
  133719. "ò,└\][┌(≥╢₧$G7╜SO╣#rΓ╟W    ÅùÖß    ²TkB"L¡1ùÖ▒Ñ▐s«hä╦ ▒ß2╔=O$òá╣\≡Ö╗²`┘∙    
  133720. ■+crí╚ykªòhp▐òP╕╢T▐╬π²7π∞öL╞c▒EWk·Yj Σì e[riπ┤╜¿Γfó
  133721. O|°≥e┌▀╪1òΓO,.╪h▀T"═ôσ +¡&HN%2«∞╧α3U│τ`)«┘¥RæW╫√;ƒl┘OWΘ╞+úd═ì_║┬·⌠Xa'{▒Θ║2Φφ╧ïóål╨∞√tÑ╦└~Ωp╩╠«τäI▐δ~·£≡8ùeá┐Aôè#ÑæSαxQ ≈N(ih%Nzº'╩Nï|J=╝q.&]°╪På7e■ë█m╜ní »Φ¡:∩y*I╣Γ°ô%º½J"÷&┼/╙!!pæ[3┬φ6ù`├~┐┤ú▓D}│ú÷Æ#¬=RM┐6ÿƒΦBJª3°E±σ∞TÉIí 4τ\óP5>5ÿëF╧╥Gæ/─·hSτ'╪∞â ·⌡ÖuhÑ┐ë"°ü{■╩╦>╥±#°û2N⌡¿u╓Ä╓0º¼≤Lx╥╚:Æ⌐Σ₧ß8╚╘Xê╙çëèùÄk0Qß ■WOÖå ìx£⌐uΘ&ówΩΓV7▀∞╚µ÷ÿµì/ì=¥Mdçr&S¼┴█┤─ìuÜ%⌠≡KQv╣»┤╔'uñτ╣'╣ÅñMº│╝4úz6ù┐;pûl▄C╣tòE¬∙(3    
  133722. måz φ╚ ╣ùjµy╛S{┬#s₧Ω█½9ìΓgè║¬>╚┐░/ñ╢aSÖ╖▀└┤┬≤╪=├C«$xÑ8├äⁿoo█)7D f≥5g┐╥(A ▒(Σ
  133723. òæ≡╩=WHK╔d═╬êÿ°┼┐╛QI╚çÉΘï}┬Oá╝mD╟═²aΓÜ║tBδ½âv╦εµΘk[QJïo]┘á╧Ü┴π╨¼á(    ╠ΩWe┤₧;8: ò┐í┼╠4¡o╒Ω»áañ/┘ª┬w ñ┴╗W!!\┌╦b╬Æ«δ╝S½√!!▐Wäåß0â┘Γ┘⌐∩⌠ÜgAy!
  133724.  
  133725. ≤A!!0+¼┐ &«ªÅ%ë,î╛åÄ╬┼╓├┐µá ¥╔wB┌ü~BàPP%mT_xO·êM&1F╖t~¬«`√╚C    ñ╢╡Æ≥Å1â|Q^r╒¿b1í┼╙
  133726. °|■|╛Q╣iƒ≤]\9*ΣwÜ╨MÖP4á    /╟╚â╛πóyìï█₧yª■St░otüα?²╙^⌠Ro═S╓;÷9i÷├H╨Mz╧<╛╨É:▐─æφσ
  133727. «┤oRë≥╜fIY8c>ï    ≈4!
  133728.  
  133729. ≤A*#=çâ3:⌐Å₧%ê≤█√├²╪╙╕╘¢τaF▓┤╓~`B┌ü~QéMV/`Oh≈Æ`4@«<Gbºδ3 ╥G╝▓│▐τ▌
  133730. ÿwQ ,░╤[╜╠╠_ÿùyεQ│pƒ∙rC+≥>▀═\ÉD4¡(╞ô╧╒└í`¢MÖë£q?╝■CKío!!┬ⁿ6╥┘≈S ╪P┘ !
  133731.  
  133732. ≤A*#=ö¥==╡¬â&ΦUêû▌╔≤╪╔╨¡▓▒[F ╕╒iaMX╞ê'äZH/mOVoOµôMi%@»<Ux¡ª`ε╓G@╗«ñè≥┬R\·3jO╪╢h1║ë═\\¥ù&gíW╣~ƒ▀]N+ívÜ╙VèGD╛(▄æ╠·ûα`ìÖ█ân║■TK«`!
  133733.  
  133734. ≤A*#=ùè>,╣╜â8ûRï╜¡■√┌╨├╗ßσGK║√├naZS▄É~AÆSA)zTAxO≡ôT&2Gª<@o««#ε█F@╕Ñ╕è°╠╒4m    ╔╣a4ε─╧]MÖVüxíU│Nò∙R[*≥>▀═\ÉD4┐0╓æ╫∙▐│3ÄÉûún║■TK«:Jhçπ5₧╧MΦU ╧P╓{Ö@ !
  133735.  
  133736. ≥A+6,½¥_C╙δ¡$û(Σ╞»╪÷╥ƒ╓½α╖VM½╖┘;`MZ╫ç*WôW/b^PΣ┴Bj+M¼p*½Ñ`ε╓G@║▓┤¢■┘ ╫{Lm    ╘╡arº╧ÇM@ÉûV|╜╕r₧╛<%dRêZî█UÖA`ú/πÇ╞σ╔«gì▀êûp
  133737. ¡σ^K¼OUïπ!
  133738.  
  133739. ≥A+6,½¥!!D╨└╬ ï,÷╤²îΩ▀┌ò╜τ╖AF▒»╠b3[S▐ü=FÆ[9kWVh∙ô^U?Bís_4▒δ)⌠₧V¡≈Ñ¢⌠╩Æf|░╒c;óë╔_üûpεJÑ=₧≥TdRî÷αJÖNq»3┴ü≤Σ╔│våÜë╙o
  133740. ó⌠TP½oTÉ┴:╥!
  133741.  
  133742. ⌡K 9=àí╫├σh╡-Φ┬ε╪√ùÆòè²óTO║√╘svE╫ê;QâZ@j~I\⌡Äd#[┤yVdΓè╔≈ª│≈É°┴Q?╣Gw@co▐╣~|∞ñ¬4"ⁿ
  133743. ╙gíW÷a²kòA],í>┬₧JÖNr∞.▄å╠⌡├¼=σg÷ïüsε°DeîS#!!┬ !!╤╦εRΓl≤V²"u!
  133744.  
  133745. ⌡K 9=ûè3-òºÇ3ΦUêû▀▐≈┴▐┴╗▓Φw░╝╟wvB┌ü~AÆSA)z^W+ΣÄ
  133746. Ve)Cπ~V~╡«%⌠₧p⌐│≈▒∙├^ûzZ@\e█╕"╝└╘\ÿùfα█²kòM*εp▀┬4÷+d╛(ô╚₧╢▀ÑÄMÅë£h¡■[
  133747. ckÉα'₧╓L╒D.╚p╘Ωw!!Θ╒w╓g╙┤▌çkz┐╖╕≡∩!
  133748.  
  133749. ⌠T#!!=çÄ"=│ªéG∩VúΣ²┼Φ╓╦╨■┐σgK║√╥~pM_─ü,ƒ^WjmSRe≤à^Phf\╢[*úδ7√╟á╢ú▐π╟^öuNgo╘ⁿ`3╖ë╬\MæVç5¼F÷oòεT\=σ*≥┤0╕M4╕5└╥╦≤▐Ñ1σg≥±·`O║⌠OPΓ|gδ√6╞╦╜o▀Z╓│.m°╘kéFg╙/╜▌Üw`íº÷∙«k┬¥sY╡µ≥vvGr=ì∩W9w{B▄ùQ▒ß4U*X▀Ö;╦_╓Σ╘áΦ!!¿·╞ìò0⌡ñàI▄;R«sΦwPε±m╔~Kαç▓ç£╓F£û°¿/₧{#┐gτs╞µΦ╦IgF]8Θ#! !
  133750.  
  133751. ResourceBrowser comment:
  133752. 'ResourceBrowser is a <SmalltalkToolShell> that implements the Resource Browser tool. This provides an interface onto all the <Resource>s held by the current <ResourceManager>.
  133753.  
  133754. Instance Variables:
  133755.     resourceListPresenter        <ResourceListPresenter> displaying the current list of resources.
  133756.     resourceTree            <UndefinedObject> not used.
  133757.     packagesPresenter            <ListPresenter> displaying a list of all the current packages.
  133758. '!
  133759. !ResourceBrowser class methodsFor!
  133760.  
  133761. displayOn: aStream
  133762.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  133763.     would want to see it."
  133764.  
  133765.     aStream nextPutAll: 'Resource Browser'
  133766. !
  133767.  
  133768. icon
  133769.     "Answers an Icon that can be used to represent this class"
  133770.  
  133771.     ^Resource icon!
  133772.  
  133773. initialize
  133774.     "Private - Register the receiver with SmalltalkSystem.
  133775.         self initialize
  133776.     "
  133777.  
  133778.     Smalltalk developmentSystem
  133779.         addSystemFolderIcon: self toolsFolderIcon;
  133780.         registerTool: self.
  133781.     self reuseIfOpen: true.!
  133782.  
  133783. publishedAspects
  133784.     "Answer a <LookupTable> of the <Aspect>s published by the receiver."
  133785.  
  133786.     | aspects |
  133787.     aspects := super publishedAspects.
  133788.     aspects add: (Aspect boolean: #reuseIfOpen).
  133789.     ^aspects!
  133790.  
  133791. show
  133792.     "Shows the view of the receiver.
  133793.     Pick up the default extent if any."
  133794.  
  133795.     | browser |
  133796.     browser := super show.
  133797.     browser showAllResources.
  133798.     ^browser!
  133799.  
  133800. showAsToolboxFor: aView at: aPoint
  133801.     "Creates an instance of the receiver in a toolbox view attached to aView
  133802.     and displayed at aPoint relative to the origin of this view"
  133803.  
  133804.     | toolbox toolboxView position |
  133805.     toolboxView := (self loadViewResource: 'Toolbox' inContext: View desktop) bePopupFor: aView.
  133806.     position := aView mapPoint: aPoint to: View desktop.
  133807.     toolboxView position: position.
  133808.  
  133809.     toolbox := self new.
  133810.     toolbox view: toolboxView.
  133811.  
  133812.     ^toolbox show!
  133813.  
  133814. showResourcesReferencing: anObject
  133815.     | browser |
  133816.     browser := self show.
  133817.     browser showResourcesReferencing: anObject.
  133818.     ^browser!
  133819.  
  133820. uninitialize
  133821.     "Private - Un-register the system tools folder icon for the receiver to allow clean
  133822.     removal of this class from the system.
  133823.         self uninitialize
  133824.     "
  133825.  
  133826.     Smalltalk developmentSystem
  133827.         removeSystemFolderIconNamed: self toolDescription;
  133828.         unregisterTool: self! !
  133829.  
  133830. !ResourceBrowser methodsFor!
  133831.  
  133832. createComponents
  133833.     "Create the presenters contained by the receiver"
  133834.  
  133835.     super createComponents.
  133836.     resourceListPresenter := self add: ResourceListPresenter new name: 'resources'!
  133837.  
  133838. newView
  133839.     "Open the ViewComposer on an new default view resource for the
  133840.     selected class. If there are several possibilities allow the user to select
  133841.     the one to edit"
  133842.  
  133843.     | selection |
  133844.     (selection := self resource) notNil 
  133845.         ifTrue: [self model openViewComposerOnNewViewFor: selection owningClass]
  133846.         ifFalse: [self model openViewComposer]
  133847.  !
  133848.  
  133849. onViewOpened
  133850.     "Received when the receiver's view is been connected. "
  133851.  
  133852.     super onViewOpened.
  133853.  
  133854.     "Enable view mode pulldown"
  133855.     (self view viewNamed: 'viewTools' ifNone: []) ifNotNil: 
  133856.             [:toolbar | 
  133857.             toolbar presenterConnectionPoint 
  133858.                 when: #dropDown:
  133859.                 send: #onDropDown:
  133860.                 to: resourceListPresenter view]!
  133861.  
  133862. resource
  133863.     "Answer the selected resource identifier in the receiver or nil if there
  133864.     is none"
  133865.  
  133866.     ^resourceListPresenter selectionOrNil!
  133867.  
  133868. showAllResources
  133869.     "Configure the receiver to display a list of all resources in the system."
  133870.  
  133871.     resourceListPresenter showAllResources.
  133872.     self updateCaption!
  133873.  
  133874. showResourcesReferencing: anObject
  133875.     "Configure the receiver to display only those resources that reference the specified <Object>."
  133876.  
  133877.     resourceListPresenter showResourcesReferencing: anObject.
  133878.     self updateCaption!
  133879.  
  133880. updateCaption
  133881.     "Private - The receiver has changed in such a way that the caption may need to be refreshed."
  133882.  
  133883.     | strm |
  133884.     strm := String writeStream.
  133885.     strm
  133886.         display: self class;
  133887.         nextPutAll: ' -  ';
  133888.         nextPutAll: resourceListPresenter caption.
  133889.     self caption: strm contents! !
  133890.  
  133891. SmalltalkSystemShell comment:
  133892. 'SmalltalkSystemShell is a <SmalltalkToolShell> that implements the user interface onto theDolphin Smalltalk system folder. This an iconic daunting point for all of the installed tools, sample applications etc.
  133893.  
  133894. Instance Variables:
  133895.     systemFolderPresenter        <FolderPresenter> displaying the system folder hierarchy.
  133896.  
  133897. Class Variables:
  133898.     Default                <SmalltalkSystemShell> which is the singleton instance.
  133899.     DefaultBackcolor            <color> for the background of the folder.
  133900.  
  133901.  
  133902.  
  133903.  
  133904. '!
  133905. !SmalltalkSystemShell class methodsFor!
  133906.  
  133907. applyOptions
  133908.     self allSubinstances do: [:each | each applyOptions]!
  133909.  
  133910. default
  133911.     "Answer the default instance of the receiver
  133912.  
  133913.     SmalltalkSystemShell default
  133914. "
  133915.  
  133916.     Default isNil ifTrue: [
  133917.         Default := self show ].
  133918.     ^Default!
  133919.  
  133920. defaultBackcolor
  133921.     "Answe the default background to use for instances of the receiver"
  133922.  
  133923.     ^DefaultBackcolor!
  133924.  
  133925. defaultBackcolor: aColorOrNil
  133926.     "Set the default background to use for instances of the receiver"
  133927.  
  133928.     DefaultBackcolor := aColorOrNil.
  133929.     self applyOptions!
  133930.  
  133931. defaultPosition
  133932.     "Private - Answer the default location of the receiver"
  133933.  
  133934.     ^22@22!
  133935.  
  133936. displayOn: aStream
  133937.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  133938.     would want to see it."
  133939.  
  133940.     aStream nextPutAll: 'System Folder'!
  133941.  
  133942. free
  133943.     "Close and release the current system shell (e.g. to create a runtime image).
  133944.     Also close the associated Transcript"
  133945.  
  133946.     Default notNil ifTrue: [ 
  133947.         TranscriptShell free.
  133948.         Default view destroy ].
  133949.     Default := nil!
  133950.  
  133951. icon
  133952.     "Answers an Icon that can be used to represent this class"
  133953.  
  133954.     ^Smalltalk developmentSystem icon!
  133955.  
  133956. initialize
  133957.     "Private - Initialize the receiver's class variables.
  133958.         self initialize
  133959.     "
  133960.  
  133961.     Smalltalk developmentSystem registerTool: self.
  133962.     self defaultBackcolor: (RGB 
  133963.                 red: 20
  133964.                 green: 104
  133965.                 blue: 194) faded.
  133966.     self viewMode: #tileIcons.
  133967.     self playSystemSounds: true!
  133968.  
  133969. onStartup
  133970.     "Private - The development system is starting, perform initialization actions.
  133971.     Sent after windows are restored."
  133972.  
  133973.     "Cause the desktop icon title font to be picked up correctly"
  133974.     SmalltalkSystem current defaultFont isNil ifTrue: [SmalltalkSystem current defaultFont: nil].
  133975.  
  133976.     "Update the SmalltalkSystemShell caption to show current image file name. This
  133977.     may have changed if the .img/.exe has been copied outside of Dolphin.
  133978.     Have to perform this after windows have been recreated or else they
  133979.     will just show the caption when the image was saved."
  133980.     self default updateCaption.
  133981.  
  133982.  
  133983. !
  133984.  
  133985. playSystemSounds
  133986.     "Answer true if the IDE sounds are turned on"
  133987.  
  133988.     ^PlaySystemSounds
  133989.         
  133990. !
  133991.  
  133992. playSystemSounds: aBoolean
  133993.     "Sets wherher the IDE sounds are turned on"
  133994.  
  133995.     PlaySystemSounds := aBoolean
  133996.         
  133997. !
  133998.  
  133999. publishedAspects
  134000.     "Answer a <LookupTable> of the <Aspect>s published the receiver."
  134001.  
  134002.     ^super publishedAspects
  134003.         add: (Aspect color: #defaultBackcolor);
  134004.         add: (Aspect choice: #viewMode from: #(#smallIcons #largeIcons #tileIcons #list #report));
  134005.         add: (Aspect boolean: #playSystemSounds);
  134006.         yourself!
  134007.  
  134008. reset
  134009.     "Private - Reset the class. 
  134010.     Force the creation of an new default instance of the receiver"
  134011.  
  134012.     self free; default!
  134013.  
  134014. uninitialize
  134015.     "Private - Uninitialize the receiver as it is about to be removed from the system."
  134016.  
  134017.     self free.
  134018.     Smalltalk developmentSystem unregisterTool: self.
  134019. !
  134020.  
  134021. viewMode
  134022.     "Answer the view mode of the reciver.
  134023.     This can be one of:
  134024.         #smallIcons
  134025.         #largeIcons
  134026.         #tileIcons
  134027.         #list
  134028.         #report"
  134029.  
  134030.     ^ViewMode
  134031.         
  134032. !
  134033.  
  134034. viewMode: aSymbol
  134035.     "Sets the view mode of the reciver to aSymbol.
  134036.     This can be one of:
  134037.         #smallIcons
  134038.         #largeIcons
  134039.         #tileIcons
  134040.         #list
  134041.         #report"
  134042.  
  134043.     ViewMode := aSymbol.
  134044.     self applyOptions! !
  134045.  
  134046. !SmalltalkSystemShell methodsFor!
  134047.  
  134048. applyOptions
  134049.     "Apply the class options to the receiver"
  134050.  
  134051.     systemFolderPresenter view 
  134052.         backcolor: self class defaultBackcolor.
  134053.  
  134054.     systemFolderPresenter view 
  134055.         viewMode: self class viewMode
  134056.     !
  134057.  
  134058. createComponents
  134059.     "Create the presenters contained by the receiver"
  134060.  
  134061.     super createComponents.
  134062.     systemFolderPresenter := (self 
  134063.                             add: (FolderPresenter new 
  134064.                                 beSorted: [:a :b | 
  134065.                                                         (a isFolder == b isFolder) 
  134066.                                                             ifTrue: [a description < b description]
  134067.                                                             ifFalse: [a isFolder not]]) 
  134068.                             name: 'systemFolder')
  134069.                         openBlock: (Message selector: #openItem:);
  134070.                         yourself
  134071. !
  134072.  
  134073. createSchematicWiring
  134074.     "Create the trigger wiring for the receiver"
  134075.  
  134076.     super createSchematicWiring.
  134077.     self 
  134078.         when: #closeRequested:
  134079.         send: #onCloseRequested:
  134080.         to: self.
  134081.     (SessionManager current)
  134082.         when: #imageSaveCompleted
  134083.             send: #updateCaption
  134084.             to: self
  134085. !
  134086.  
  134087. initialize
  134088.     "Private - Initialize the receiver. 
  134089.     Ensure the Transcript is available"
  134090.  
  134091.     super initialize.
  134092.     TranscriptShell current.
  134093. !
  134094.  
  134095. inspectSystemOptions
  134096.     "Open a <PublishedAspectInspector> on the system options."
  134097.     
  134098.     self model inspectSystemOptions!
  134099.  
  134100. model: aSmalltalkSystem
  134101.     "Connects the receiver to aSmalltalkSystem.
  134102.     The systemFolderPresenter displays the contents of the #systemFolder
  134103.     aspect of the model"
  134104.  
  134105.     super model: aSmalltalkSystem.
  134106.     systemFolderPresenter model: aSmalltalkSystem systemFolder!
  134107.  
  134108. onCloseRequested: aBooleanValue
  134109.     "Request to shut the session down. If the request is unacceptable then
  134110.     set the value of the out parameter, aBooleanValue to false"
  134111.  
  134112.     self == self class default ifTrue: [
  134113.         "This is the root system shell closing then shut down system"
  134114.         self model smalltalkExit.
  134115.         aBooleanValue value: false ]!
  134116.  
  134117. onPositionChanged: aPositionEvent
  134118.     "Handler for a change in position (resize or move) of the receiver's view."
  134119.  
  134120.     aPositionEvent isResize 
  134121.         ifTrue: 
  134122.             ["There appears to be a redraw problem when redrawing in icon modes under Windows XP"
  134123.  
  134124.             systemFolderPresenter view invalidate.
  134125.             self rememberThisSize].
  134126.     ^super onPositionChanged: aPositionEvent!
  134127.  
  134128. onViewModeChanged
  134129.     "Event handler for view mode changed. Save the new mode to the user preferences"
  134130.  
  134131.     self class viewMode: systemFolderPresenter view viewMode!
  134132.  
  134133. onViewOpened
  134134.     "Received when the receiver's view is been connected. "
  134135.  
  134136.     | toolbar |
  134137.  
  134138.     super onViewOpened.
  134139.     self applyOptions.
  134140.     systemFolderPresenter selectionByIndex: 1.
  134141.     self view position: self class defaultPosition.
  134142.  
  134143.     toolbar := self view viewNamed: 'systemShellTools'.
  134144.     toolbar presenterConnectionPoint 
  134145.         when: #dropDown:
  134146.         send: #onDropDown:
  134147.         to: systemFolderPresenter view.
  134148.  
  134149.     systemFolderPresenter view when: #viewModeChanged send: #onViewModeChanged to: self
  134150.  
  134151.  
  134152. !
  134153.  
  134154. panic
  134155.     "Forcibly close all views to clean up if necessary"
  134156.  
  134157.     (MessageBox new taskModal; confirm: 
  134158. 'Are you sure you wish to forcibly close all open windows?
  134159. If so, all windows will be destroyed and a new System Folder will be opened.
  134160.  
  134161. You should do this only if you believe you may have hidden or partially
  134162. composed windows in your image that are preventing some objects from 
  134163. otherwise being garbage collected.')
  134164.         ifTrue: [[View destroyAll] on: Error do: [:x | x notify]]!
  134165.  
  134166. resetSelection
  134167.     "Private - Reset any selection in the receiver."
  134168.  
  134169.     systemFolderPresenter selectionByIndex: 1
  134170. !
  134171.  
  134172. updateCaption
  134173.     "The receiver has changed in such a way that the caption may need to be refreshed.
  134174.     Do this here"
  134175.  
  134176.     | sesh |
  134177.     sesh := SessionManager current.
  134178.     self caption: ('%1 - %2' formatWith: sesh applicationName with: (File splitFilenameFrom: sesh imageFileName))! !
  134179.  
  134180. SUnitAbsBrowser comment:
  134181. ''!
  134182. !SUnitAbsBrowser class methodsFor!
  134183.  
  134184. initializeToolClass: aClass
  134185.  
  134186.     Smalltalk developmentSystem 
  134187.         addAdditionalToolsFolderIcon: self toolsFolderIcon; 
  134188.         registerTool: aClass.
  134189.  
  134190.     self reuseIfOpen: true!
  134191.  
  134192. publishedAspects
  134193.     "Answer a Set of the aspects published by instances of the receiver"
  134194.  
  134195.     | aspects |
  134196.     aspects := super publishedAspects.
  134197.     aspects 
  134198.         add: (Aspect boolean: #reuseIfOpen);
  134199.         add: (Aspect boolean: #useDisplayNames).
  134200.     ^aspects!
  134201.  
  134202. toolsFolderIcon
  134203.     "Answer an instance of SmalltalkSystemIcon suitable for representing the
  134204.     receiver in the system folder."
  134205.  
  134206.     ^SmalltalkSystemIcon 
  134207.         icon:  self icon
  134208.         description: self displayString
  134209.         openBlock: [:folder :item | self show. folder:=item:=nil]!
  134210.  
  134211. uninitializeToolClass: aClass
  134212.     "Private - Uninitialize the receiver as it is about to be removed from the system.
  134213.     Un-register the system tools folder icon for the receiver.
  134214.     Note: This method is in the 'must strip' category so that it is removed in the early
  134215.     stages of image stripping. It is not required during stripping, because the system
  134216.     folders are cleared down anyway, and it may generate an error if required parts
  134217.     of the development system have already been removed."
  134218.  
  134219.     Smalltalk developmentSystem 
  134220.         removeSystemFolderIcon: self toolsFolderIcon; 
  134221.         unregisterTool: aClass!
  134222.  
  134223. useDisplayNames
  134224.  
  134225.     ^self  defaultModelClass useDisplayNames!
  134226.  
  134227. useDisplayNames: aBoolean
  134228.  
  134229.     ^self  defaultModelClass useDisplayNames: aBoolean! !
  134230.  
  134231. !SUnitAbsBrowser methodsFor!
  134232.  
  134233. addToCommandRoute: route
  134234.     "Update the <OrderedCollection>, path, with the receiver's contribution to the 
  134235.     command path held by the <CommandPolicy>, route. Answer self to have the command 
  134236.     policy decide where to go next. 
  134237.  
  134238.     Implementation Note: We want to include the development system if it is present." 
  134239.  
  134240.     super addToCommandRoute: route.
  134241.  
  134242.     route appendTarget: Smalltalk developmentSystem
  134243.  
  134244.  
  134245.  
  134246.  
  134247. !
  134248.  
  134249. callbackResetList
  134250.  
  134251.     self 
  134252.         resetListFromModel;
  134253.         setResultDisplay!
  134254.  
  134255. callbackSelectedItems: aCollection!
  134256.  
  134257. callbackToggledUseDisplayNames
  134258.  
  134259.     self refreshList!
  134260.  
  134261. createComponents
  134262.     "Create the presenters contained by the receiver. At this stage
  134263.     the receiver has not yet been initialized."
  134264.  
  134265.     super createComponents.
  134266.  
  134267.     self labelTextPresenter: (
  134268.         self 
  134269.             add: TextPresenter new 
  134270.             name: 'label').
  134271.  
  134272.     self listPresenter: (
  134273.         self 
  134274.             add: ListPresenter new 
  134275.             name: 'list').
  134276.  
  134277.     self statusTextPresenter: (
  134278.         self 
  134279.             add: TextPresenter new 
  134280.             name: 'status')
  134281.  
  134282. !
  134283.  
  134284. createSchematicWiring
  134285.     "Create the trigger wiring for the receiver. At this stage the initialization
  134286.     is complete and the view is open"
  134287.  
  134288.     super createSchematicWiring.
  134289.  
  134290.     self listPresenter 
  134291.         when: #selectionChanged 
  134292.             send: #selectionChanged 
  134293.             to: self;
  134294.         when: #actionPerformed
  134295.             send: #browseHierarchy
  134296.             to: self!
  134297.  
  134298. delete
  134299.  
  134300.     self model removeSelectedInList!
  134301.  
  134302. helpAbout
  134303.  
  134304.     MessageBox 
  134305.         notify: self helpString
  134306.         caption: 'About ', self browserName!
  134307.  
  134308. helpString
  134309.  
  134310.     | stream|
  134311.  
  134312.     stream := WriteStream on: (String new: 50).
  134313.  
  134314.     ^stream
  134315.         nextPutAll: self browserName;
  134316.         nextPutAll: ' for Dolphin Smalltalk 4.0/5.0';
  134317.         cr;
  134318.         cr;
  134319.         nextPutAll: 'Version 3.1 PR14';
  134320.         contents
  134321. !
  134322.  
  134323. label
  134324.  
  134325.     ^self labelTextPresenter view!
  134326.  
  134327. labelTextPresenter
  134328.     "Private - Answer the value of the receiver's ''labelTextPresenter'' instance variable."
  134329.  
  134330.     ^labelTextPresenter!
  134331.  
  134332. labelTextPresenter: anObject
  134333.     "Private - Set the value of the receiver's ''labelTextPresenter'' instance variable to the argument, anObject."
  134334.  
  134335.     labelTextPresenter := anObject!
  134336.  
  134337. listModel
  134338.  
  134339.     ^listModel!
  134340.  
  134341. listModel: anObject
  134342.  
  134343.     listModel := anObject!
  134344.  
  134345. listPresenter
  134346.  
  134347.     ^listPresenter!
  134348.  
  134349. listPresenter: anObject
  134350.  
  134351.     listPresenter := anObject!
  134352.  
  134353. queryCommand: aCommandQuery
  134354.     "Enters details about a potential command for the receiver into aCommandQuery"
  134355.  
  134356.     super queryCommand: aCommandQuery.
  134357.  
  134358.     (aCommandQuery command = #delete)
  134359.          ifTrue: [aCommandQuery isEnabled: self model canRemove].
  134360.  
  134361.     (aCommandQuery command = #useDisplayNames)
  134362.          ifTrue: [aCommandQuery isChecked: self model useDisplayNames].
  134363.  
  134364.  
  134365.  
  134366. !
  134367.  
  134368. refreshItemAtIndex: anIndex
  134369.  
  134370.     listModel updateAtIndex: anIndex
  134371. !
  134372.  
  134373. refreshList
  134374.  
  134375.     1 
  134376.         to: self listModel size 
  134377.         do: [:index | self refreshItemAtIndex: index].
  134378.  
  134379.     self view update !
  134380.  
  134381. refreshList: aCollection 
  134382.  
  134383.     self view update !
  134384.  
  134385. reset
  134386.  
  134387.     self model buildList!
  134388.  
  134389. selectionChanged 
  134390.  
  134391.     self setModelWithSelectedItems
  134392. !
  134393.  
  134394. setDetailState
  134395.  
  134396.     | wrapper |
  134397.  
  134398.     wrapper := 
  134399.         SUnitStatusTextWrapper 
  134400.             newOn: self model detailState
  134401.             model: self model.
  134402.  
  134403.     self statusTextPresenter value: wrapper  !
  134404.  
  134405. setResultDisplay
  134406.  
  134407.     self
  134408.         setLabelState;
  134409.         setDetailState!
  134410.  
  134411. setStatusColorsOn: aWidget
  134412.  
  134413.     | labelColor |
  134414.  
  134415.     labelColor := Color perform: self model resultStateColorSymbol.
  134416.  
  134417.     "a little hack - green on Dolphin is pretty yucky"
  134418.     labelColor index = 16777230
  134419.         ifTrue: [labelColor := IndexedColor darkGreen].
  134420.  
  134421.     self model showStatusBackgroundColors
  134422.         ifTrue: [
  134423.             aWidget
  134424.                 backcolor: labelColor;
  134425.                 forecolor: Color white]
  134426.         ifFalse: [
  134427.             aWidget
  134428.                 backcolor: Color white;
  134429.                 forecolor: labelColor]!
  134430.  
  134431. status
  134432.  
  134433.     ^self statusTextPresenter view!
  134434.  
  134435. statusTextPresenter
  134436.     "Private - Answer the value of the receiver's ''statusTextPresenter'' instance variable."
  134437.  
  134438.     ^statusTextPresenter!
  134439.  
  134440. statusTextPresenter: anObject
  134441.     "Private - Set the value of the receiver's ''statusTextPresenter'' instance variable to the argument, anObject."
  134442.  
  134443.     statusTextPresenter := anObject!
  134444.  
  134445. testCaseSelectionChanged 
  134446.  
  134447.     self setModelWithSelectedTestCases
  134448. !
  134449.  
  134450. useDisplayNames
  134451.  
  134452.     self model toggleUseDisplayNames! !
  134453.  
  134454. TipOfTheDay comment:
  134455. 'TipOfTheDay is a <SmalltalkToolShell> that implements a window displaying helpful usage tips about Dolphin Smalltalk. The tips are taken from a number of .tip files found in the Resources directory. Addtional tip files can be added if necessary; the files contain one tip per line and each tip may have HTML formatting if desired.
  134456.  
  134457. The development system is initially configured to display the TipOfTheDay window at image startup (after the splash screen has been dismissed). This can be turned on or off from within the TipOf TheDay window or by using the system options for this tool. A TipOfTheDay is also available at any time from the Help/Tip of the Day menu command.
  134458.  
  134459. Instance Variables:
  134460.     tipText        <URLPresenter> displaying the current tip as HTML.
  134461.     showTipsAtStartup    <BooleanPresenter> indicating whether the tip window should appear at startup.
  134462.     tipsFile        <ChoicePresenter> indicating the name of the tips file to use.
  134463.  
  134464. Class Variables:
  134465.     TipsFile        <readableString> indicating the name of the current tips file.
  134466.     ShowTipsAtStartup    <boolean> indicating whether the tip window will appear at startup.
  134467.     TipIndex        <SmallInteger> holding the index of the current tip within tips file.
  134468.  
  134469. '!
  134470. !TipOfTheDay class methodsFor!
  134471.  
  134472. αH+.<(╖ΓX@°Ö₧#ô>⌡╤»ü╛÷╤╞⌐≈╖B▒√∩iwMD╫Ç]¢SA)zR\eO∙ç^Xj*╖tV*╢ó0Θ₧KΦú┐¢╖╠     àqP.t╙¼~r¿└╠\°|■|╜F║{╨≡]{(≥    ⌡£4÷+h∞5▀ù═≈┴Ñ3ö`⌡≥òu½ VIº P&┬╔:╥┌sΦB.╪P╚V·#rφ╞t╬pk╠>Ñ╒òA4┐í√ ∞ í°eo⌐σ▒,wC@;éú5wNE┼ùQ═ô\~3V^┘ä<╖N╓π╘┤·!!≡│æ▐╝7╣µë ╫2
  134473. │rªO3Kδí.ë#6åoá╔╡ç╙M¿┬╫πC∙R"┐jσiàß±╙HhB}≥8¥π(kà'▀]╩rVqÅng₧íu╨7U╞Ñ»[84O={┌╙█═AΘ!
  134474.  
  134475. αH+.<(╖⌐;%┐║ß@∞}╤╞µ┌ ├┌ò≤▓ä]P¿╛╥;re╫É~]æE&bGc
  134476. ╢òI& F»ydúª%Θ₧C⌐╛╗ƒ⌡├P·3js▀░kr»┼╠mAà╡y½P°·Cæ;"cQ²$₧╥U║Kx⌐|─¢╧≥╧íaîMâ÷∙ó²qM«e;╪▓sφ┌KºO*█╖|Ü:h⌡├{├PjÇe∞£ÑMx╢é≈²ßºµ U╖≤ª itPg&çµW<~LQ┼1─ÅÆIh?eC╚█o╠hà ─¬ d≈å╞â≈T▄┼└╩EZa{j║sεU4¿ }╔}ül≈ΦÜÇàî▀╔ΓA⌡4╫êZ┴Φóƒ!!lNA}φwÆ√!!Cÿ8Ü]ƒEF9╞(Fä≈0ú5P┴╢▄C47l q█@₧╫╪G└σU&▓╤HÆÉ╓zÉAR9~╬ⁿ
  134477. 1ö!
  134478.  
  134479. πE46 ¡ƒ,ó╜ß@∞}╤╞µ┌ ├┌ò≤▓ä]P¿╛╥h3IÄû;Sô^F&khGy°å@e)A╖}Zd½Ñ'║╩JΦ┤óîσ╩
  134480. ╫`W.i╘ⁿy:½ë├LZç¥5║Jªn╨⌡]JKUï    ⌡╖gºQqá|╥₧╧┬┼░`╚ ï┴╙H╛╪Y@ºx7;ìßi₧·M⌡N=î[╒L│;ßçdéZ╚:ú┘├Ef╢ε÷±áíΣs╕÷│dDY!!π`Ä}!
  134481.  
  134482. σA!! 4░ó=-┐Ñß@∞}└┌ⁿ█√┼ƒ╘■÷áUB¬╖╘;~GR╫ê~FÿF/.Z@x±Å]&2@πh[oΓ╣%∙█K¡Ñ≈ë ╩^₧`3ji╔ⁿd<º▌╔XD£ û;∞.▄·h┬BJ>!
  134483.  
  134484. ΦG(XR══'⌐╛ë8ûα┌»σ²╪╤ò¬·ñG╝║╬;qM╟ù;V╫KKj|^Cy
  134485. σäM&2G¬oi«¬3Θ£/j┼▌▐á┤îTÆxXI.d▀║l'ó▌ΘZG¢!
  134486.  
  134487. ΦJ.<9¿å(,╫├σh╡-Φ┬ε╪√ùÆòùⁿ¼GJ╛╖╔avB┌ü~@Æ\A#x^A%b£∞t05J»zc¼ó4≤▀N    ▓▓∙≤¥ª^s²4i]m█░a&»┼╦LÉûz╛N│sä2σB[ 5í    ⌡╖0¥Fpì8┌å╩∙┬í╝ÉùÇZó⌡RVïcu╪» █╙YºU ├S╔0ⁿ!!eⁿ╒Q┴M`¢R█╡ΩVq┤ºδΩσ£√oPπáíc8a!!ïσW"tZC╠>╦>ÜñW7|W^╧äaµ0kà⌡▌╛╝r∞╡û∙ô.ª┬▌:█%µ<ΦaZ¼▄⌐YRⁿ╕êƒïƒ╞ûé─G≤>┤n≤s╤εΦ╠]%o}4ߥ≤(}╤n┬Ä!
  134488.  
  134489. ∩A?1┤ΓX@°ïÖ'ò,í└τ╔╛┼┌╓╗√│VQ »╧;g@SÆè;JâP#~ZeOΓëe3]▒y]~Γ┐)Ω═í╗▓▄ÜÑqt■@WGn▐╣ur⌠öÇmAà?¥p╢τ3²kòeF∩`Ü╞┬g⌐ :ôô╧·°⌐c¢MîÆëyOº≈cV╖eP;╣█:╬÷QπD7îçVó/ö¡╤Gb╞Ñ╬èCs╢╝ó╛úíΣTYí⌠ækAP(_ΣgëzZ":ázº|α╚!
  134490.  
  134491. ±Q%<+¼è6⌐╣ë)æ,î╛åÄ▀┘╠┬╗ασRπù╧tx]Fµà<^Æ%hGc
  134492. ╢▌?Jv#L╖"@*▓╛"÷╫Q¡│≈£εÅÆ4Lme╙¬h αï¡3% ¡^f╗S│o╨ΘSC+Θa¢ JîGw╕u╛°¬ƒ═ñw╥M╫║Çl
  134493. ¡σF¡o~âßi₧£L∩N8°V╩╥9Rφ╞j╓W~ëd▄╢Ω-u╖¬ó╛¿'╗Σe_¡á▒lEPQ&qÜ≤xCUë▀ç√~9OJÜÇ#çn åπ≈▒≡d≈·Ç▐⌐1º≈╠∞
  134494. ;¿u≤=Å█⌐tT∙ìäƒê!
  134495.  
  134496. ≤A &,í¥:Īâ&▓6⌡▄╡î Σ╥╘▓■▒RO┤ê┘hgM[┐εWúWAj|^Pnαä o5íyZdÑδ2 ┘K╝▓Ñ¢≤Å╫uao╓ⁿz;║┴ÇX{ÿƒa»O╜NëΦTBGx╤aì╪VÄO4¡%╛°¬≈╚ñz£ÉòÆpO╝⌠PM▒tzûµ<╨ƒP≈D=═K╙²>!!±┬j╟¬R█╡éwy▓ó⌠Ωß
  134497. ú╟yO¡σ┐JpTGh&╬Ωw{X╠3╠⌐¡X~/ ╔ä#ì7h√Ü╕!
  134498.  
  134499. ≤A4!! ¡ƒ!!D╨└╬Ç,Σ└ⁿîΩ▀┌ò╜τ╖AF▒»ÇozXEÆé7^ÆP%.HGjΓ┴^g/AπzAe»δ4≥█¡░╛É∙╞╒4m    ε╡}á═┼A╧K╙F;├)▀nò·A  ⌡Pû╬4÷/┼mV╛°¬!
  134500.  
  134501. ≥L(1┤£=ë╜ì8æ*±╣àÑ╝÷╤╞⌐≈╖W¡«┼;zN╞î;úVTho[n+≈ÿ^No(K¼ky¬ñ5÷┌╕º▓ƒσÅ ÆzfeÜ╡`3⌐╠ÇJ\öç7├)█∙?╧Y@ Φtî M»Vu╛)├ ⌐ƒí╩Γd!
  134502.  
  134503. ≥L(1┤£=ë╜ì8æ*±Ä»═▄╪╨┘╗≤½>)╓∙≤~gA┌ü*ZÆM>f^_µ«mn#kóe}½Ñ$⌡╔á╕óÆ≤Åçq_.w╥╣cr║┴┼Aÿö5╜W╖oä╝PL
  134504. 7≤`û╨^▄V{∞▄¥╧≤═«1σg≥±·OíµcM▓s+o▒√2╠╦J≈uæ█4ⁿ"mⁿ╞v»(¡U▄╢Ω!
  134505.  
  134506. ⌡A*
  134507. 99░è_C╙δ╝8î)α└Ωî│ù■█¡σáA½│┼;A|pÆÉ;_çSE>kGdOπÆ`)]πh[oΓ╣%∙█K¡Ñ≡ì╖█â:3jN╒¿hr║┴┴MüûVaíW╖q╨∙_H0íkÖ₧MöG4╕    ,ôà╩Γ─αrä▀¥£n»σCM¼gJræ»fÅìΣI.▐^┘÷?r╣┼}┴C{╙:±╦åuí½╕δ≤ª≤ H▒σ≥ jSAQ&╝&¡U]":á)èê«Lyf╥ò"ç^ö ╒íó=∞Φ▀æ£1╗≈ë╞2VPW■"╪p√╛|ÇfUπ┴▌▄åì╟╨╩ΦV┤9án╝qûѪÜT;r≤8ùεs9▐<ïC╙F/    !
  134508.  
  134509. ⌡M7    1¿è_C╙δ¡$û(Σ╞»╪÷╥ƒë¼≈ñWB╜╖┼HgZ_▄â`æVH/.O\+σä^_i4╖tV*╢ó0Θ₧D    ñ▓⌡≤¥óvw⌐@W}F╙░h_─ñ¬0!
  134510.  
  134511. ⌡M7    1¿èhi╗Üÿ8î1µ╣àÑ╝Σ┌┴■µ¡Vπ⌐┼zwIT▐üFàVJ-0Ub≤┴
  134512. V&3\ª<Ue░δ4≥█íºñ▐±╞╫`Q@oS╬«d<⌐ï¡3% ºe╜e┐qòAª  ⌡vû╨^╥/┼9▀öâΣ╔│v£9ûïÇe├¢>)╚`!
  134513.  
  134514. ⌡M7.0 ░ΓX@°êé9Æ:≤╟»═╛ï═╨┐÷ñQO║ê╘izFQî─=]ÖKE#`R]lOΓëNbÅ<Ue░δ4≥█╜ÑÑ¢∙█\
  134515. ₧d    ` ╬┤hr¡▄╥KM¢╙|╛P÷{Ö∙"cUïâ₧MÖZ`∞Q╣√╫≤╘┤3╥P▀êûp    εσRI▓l oç» ╬═VΘU)√V╬⌐mrⁿ╦~é@o╙6▓ΦèT@╢╢∞░ìl┴τeP┐á│`TAQ&    Ü√pbFJ╠WæL╩⌠    5!!░Φƒ_é¥╗╒û Ä!
  134516.  
  134517. ⌠J.<,¡Ä> á¼ß@∞}╤╞µ┌ ├┌ò≤▓É]¡╛╟r`\S└─*ZÆW3}OVfOΓÄUufI¼pWo░δ)∙╤L@«╕Ñ▐π╟^àq]gv▀«-&íë┴UDÜ╙y½B╕·hεTB.αh▀╤_▄V|Ñ|╨₧┬σ▀αuÜÆ█çt
  134518. εΓNW╢e5∩àZ≡╨KΓoφLܲm`⌡╦8µGx┼3╛╠ÄAzºε√≥ß╗±s∙⌠║%KPn=èJε#eR╠W▐ÿ¿I}9G ╬Äo¢HÇ⌡▀¼æ ì│òì¥;╗µ██ 9 R▓<∙fP≡±~╚hU¼ûêÇ╬▄DÜ┼╓ªKτR"┐fε%└π╢¥w,%oz0≡;ƒπ,iÜt¢K╔MMsïenÖ╚,≡ QÑ╚å>#?Gh╙)╟┴═A ª∞P.▓φ`£Üæi▀!!=TQ╤⌡(}àcÿ≈ⁿ╫»¿°ª▀é─Q╟5╩φ,C*▓ùê╪>¿pR⌠▓ΩÄ╓:}æ!
  134519.  
  134520. ⌠J521╖¢7;¢║╕%è3╓▌√─ñù▐µ│≤⌐_W╛╖╦Hj[B╫ëS8■p"kAn ≤ê\tfF░<Qo½Ñ'║╦L¡░╛ìπ╩ô4_.aÜ¿b=óë╫P\¥VÆ%x»O║iæ≈bV,Σi╤₧iÖPrú1ôô═∩í╩ë    ¢Æçuá≡[╖n~ൠ╩═^≤H ┬╒÷?`φ╬w╠Q.╚:ú┘┴)▐─æ ╙ ⌐°lH╕∞╣9vRP&1¢±>eD└Γ╛⌐\I=Zo╓Ç<ÿBÿ∙▌! !
  134521.  
  134522. !TipOfTheDay methodsFor!
  134523.  
  134524. ΓV"!!=çÇ?9╡ºë$æ,î╛åÄ▌┼┌╘¬≈σGK║√╨iv[S▄É;@äG%`ORb≤à^[f[½yxº¿%≤╚GΩ┌▌≤¥ª çqL@mr▀╜y7ì╞═IG¢¥fα.▄ä∞eJ,í>┬₧JÖNr∞8╫╚â├■îCÜî₧¥h
  134525. ╝▒YA╡ zÅΩi₧ÿKεQ╔G╬Q╜@ É╙q╥QH╔3┤£┘4á½⌠°á¼≡:±├║ fCec!!ï≈"1AU▐W╬à¿Zh/ ╔ä#ìܱ┬½╝`Φ╢╡─è-ôΩ┼ ▄E6!! «h∙ WPε╜l├yRπ╫┴¥Å╥M┴ûé≥KΣ│gΣtïèÆ╢    NfX2@-Γç─9dâ è^ƒBpâlf═·1τPe~╟¡πR04z {┼╨╞▄VFĵKj╣■DÜ╧▀═$7Gt╥πàmà∩═┬IΓ╫¢█í!
  134526.  
  134527. ΓV"!!=ùî:,╖¿ÿ#åΦ╞µ┬∙║╡╝ⁿ╤╖VB½╛Ço{M╞û7UÉZVjyRAb±┴Vtf[½yxº¿%≤╚GΩ┌▌≈ÜÑuéd[.c╚╣l&½·├QMÿçvÖJñt₧▓<%`+ΣhÖ₧TôFqá@+█ù═¼îπgü½₧ïh,ª≡YCºdJhçß7äƒ≥Q+═K▀5≥=u≡╚véVaÜó┘ÅB:▐─!
  134528.  
  134529. ∞K#9bΣ¢;9⌐äâ.Ç3î╛åÄ═╥╦ò¬·áN░┐┼w3IE┴ï=[ûKA..LZ╢ò\&4JáyZ|º╣n╕│(m┬▐ñïτ╩^Ü{Zb:Ü¿d"╜Σ╧]MÖX■|─*Ñuƒ╚X_⌡Wï▀KêWd∞3╫ù╧¼îΦgüî╢£x
  134530. ó▒VW▓e    o┤ε?╦┌º<─P═"·=r╪╙K╓C|╘*íò═)┌║±ε╘░α Q╢Σ╖X%o"¥'∞5}Q┌╚₧ùXa)FÜ┬;éJ6ôΦ┼±╝`≈¬ä╬Ä
  134531. ºΩ╬╩$QR@¿u∞;qG÷Æa┴c\Θ╫╧■Σ╢\Æ╞╓└K°p╖dσ6╔╜╕ùOy\+F9⌠;╙÷>uö7ïx▐TG9╞#täδ&┼)Yü∞é=\P!
  134532.  
  134533. ∩A?1┤ΓX@°äâ<Çε┌»╪±ù╦▌╗▓½V[½√┴mrAZ╙å2W╫KM:,69eƒÆU`fB¼xVfΓÑ%Γ╩v    ╕∙┌⌠!
  134534.  
  134535. εJ0/çâ=:┐¡ß@∞}╙╤∞╔≈┴┌╤■σ¡VM »╚~3ZS╤ü7DÆ[#}Pgσä L"╔@o«¡`⌠█Z£╛º╨ÜÑuéd[.o╘èd7╣Ω╠V[É!
  134536.  
  134537. ⌠T#!!=çÄ"=│ªéG∩VúΣ²┼Φ╓╦╨■┐σgK║√╥~pM_─ü,ƒ^WjmSRe≤à^Phf\╢[*úδ7√╟á╢ú▐π╟^öuNgo╘ⁿ`3╖ë╬\MæVç5¼F÷oòεT\=σ*≥┤0╕M4╕5└╥╦≤▐Ñ1σg≥±·o
  134538. ó≈Gúprìßi₧ÿkεQo├YÜ√(!!▌╞aé)îà╒ômz╖½α╛Σ╗Σl]á╙ª kAf ! !
  134539.  
  134540. ViewComposer comment:
  134541. 'ViewComposer is a <SmalltalkToolShell> that enables the graphical creation of both <view>s and <compositeView>s.
  134542.  
  134543.  
  134544. Instance Variables:
  134545.     toolbox            <ResourceBrowser> to use as the toolbox.
  134546.     status            <ValueHolder> for presenting status information.
  134547.     arena            <ViewComposerArena> in which the composing takes place.
  134548.     shield            <Shield> covering the arena to intercept mouse down events.
  134549.     inspector            <PublishedAspectInspector> inspecting the current primary view selection.
  134550.     composingView        <view> being composed.
  134551.     resourceIdentifier        <ResourceIdentifier> or nil, where the view being composed will be saved.
  134552.     addPositionOffset        <Point> offset for each paste operation.
  134553.     grabbers            <IdentitySet> of current <Grabber>s surrounding the currently selected views.
  134554.     selections            <OrderedCollection> of <views> which are currently selected.
  134555.     grid            <Grid> indicating snap points for use when dragging.
  134556.     viewHierarchy        <TreePresenter> displaying be hierarchy of the view being composed.
  134557.     adornmentRegion        <Region> occupied by the current grabbers.
  134558.     toolboxPosition        <Point> or nil, indicating the position of the toolbox relative to the View Composer.
  134559.     primarySelection        <view> that is the main selection.
  134560.     vcFlags            <integer> mode flags for the operation of the View Composer.
  134561.  
  134562. Class Variables:
  134563.     AdornmentModifiedFlag    <integer> bit mask for the flag indicating that the adornment has been modified.
  134564.     ModifiedFlag        <integer> bit mask for the flag indicating that the composing view has been modified.
  134565.     MouseClickFlag        <integer> bit mask for the flag indicating that the mouse is currently down.
  134566.     PositionImage        <integer> image index of the position indicator icon.
  134567.     ExtentImage        <integer> image index of the extent indicator icon.
  134568.  
  134569. '!
  134570. !ViewComposer class methodsFor!
  134571.  
  134572. displayOn: aStream
  134573.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  134574.     would want to see it."
  134575.  
  134576.     aStream nextPutAll: 'View Composer'!
  134577.  
  134578. extentImage
  134579.     "Private - Lazily answer the ExtentImage."
  134580.  
  134581.     ExtentImage isNil ifTrue: [ExtentImage := (Icon fromId: 'EXTENT.ICO') imageIndex].
  134582.     ^ExtentImage!
  134583.  
  134584. icon
  134585.     "Answers an Icon that can be used to represent this class"
  134586.  
  134587.     ^##(self) defaultIcon!
  134588.  
  134589. initialize
  134590.     "Private - Initialize the receiver's class variables and register to receive the
  134591.     #onStartup event from the SessionManager."
  134592.  
  134593.     SessionManager current when: #sessionStarted send: #onStartup to: self.
  134594.     Smalltalk developmentSystem
  134595.         addSystemFolderIcon: self toolsFolderIcon;
  134596.         registerTool: self.
  134597.     ModifiedFlag := 16r1.
  134598.     MouseClickFlag := 16r2.
  134599.     AdornmentModifiedFlag := 16r4.!
  134600.  
  134601. onStartup
  134602.     "Clear the cached image indices."
  134603.  
  134604.     ExtentImage := nil.
  134605.     PositionImage := nil
  134606. !
  134607.  
  134608. openOn: aResourceIdentifier
  134609.     ^self show openOn: aResourceIdentifier!
  134610.  
  134611. positionImage
  134612.     "Private - Lazily answer the PositionImage."
  134613.  
  134614.     PositionImage isNil ifTrue: [PositionImage := (Icon fromId: 'POSITION.ICO') imageIndex].
  134615.     ^PositionImage!
  134616.  
  134617. publishedAspects
  134618.     "Answer a <LookupTable> of the <Aspect>s published by the receiver."
  134619.  
  134620.     | aspects |
  134621.     aspects := super publishedAspects.
  134622.     aspects add: (Aspect boolean: #reuseIfOpen).
  134623.     ^aspects!
  134624.  
  134625. uninitialize
  134626.     "Private - Uninitialize the receiver prior to remove from the system."
  134627.  
  134628.     SessionManager current removeEventsTriggeredFor: self.
  134629.     Smalltalk developmentSystem
  134630.         removeSystemFolderIconNamed: self toolDescription;
  134631.         unregisterTool: self! !
  134632.  
  134633. !ViewComposer methodsFor!
  134634.  
  134635. addGrabberFor: aGrabAspectSymbol of: aView
  134636.     "Private - Create a new Grabber for aGrabAspectSymbol of our associated view and add it to
  134637.     our collection of active grabbers. Answer the new grabber"
  134638.  
  134639.     | grabber |
  134640.     grabber := self createGrabberFor: aGrabAspectSymbol of: aView.
  134641.     ^self grabbers add: grabber.
  134642.     !
  134643.  
  134644. addGrabbers
  134645.     "Private - Put up grabbers to manipulate the size of the primary selection"
  134646.  
  134647.     | primaryView |
  134648.     primaryView := self primarySelection.
  134649.     (primaryView isNil or: [(self canSize: primaryView) not])
  134650.         ifTrue: [ ^self ].
  134651.  
  134652.     "Corners first"
  134653.     self addGrabberFor: #bottomRight of: primaryView.
  134654.     self addGrabberFor: #topLeft of: primaryView.
  134655.     self addGrabberFor: #topRight of: primaryView.
  134656.     self addGrabberFor: #bottomLeft of: primaryView.
  134657.  
  134658.     "Now centres"
  134659.     (self addGrabberFor: #leftCenter of: primaryView) beHorizontalOnly.
  134660.     (self addGrabberFor: #rightCenter of: primaryView) beHorizontalOnly.
  134661.     (self addGrabberFor: #topCenter of: primaryView) beVerticalOnly.
  134662.     (self addGrabberFor: #bottomCenter of: primaryView) beVerticalOnly
  134663. !
  134664.  
  134665. addSelectionFor: aView
  134666.     "Private - Adds a new selection"
  134667.  
  134668.     self selections remove: aView ifAbsent: [].
  134669.     self selections addFirst: aView.
  134670.     self updatePrimarySelection.
  134671.     self updateAdornment!
  134672.  
  134673. adjustScroll
  134674.     "Private - Ensure the shieldAndArena CompositeView adopts scroll bars if required."
  134675.  
  134676.     | shieldAndArena |
  134677.  
  134678.     (shieldAndArena := self view viewNamed: 'shieldAndArena')
  134679.         preferredExtent: self composingView rectangle bottomRight + self arenaBorderSize.
  134680.  
  134681.     shieldAndArena parentView
  134682.         invalidateLayout;
  134683.         validateLayout!
  134684.  
  134685. adornmentRectanglesFor: aView 
  134686.     "Private - Answer a collection of rectangles that mark the edges of the secondary
  134687.     selection adornments of aView."
  134688.  
  134689.     | aspects viewRects |
  134690.     aspects := #(#topLeft #bottomRight #topRight #bottomLeft #topCenter #bottomCenter #leftCenter #rightCenter).
  134691.     viewRects := aspects collect: 
  134692.                     [:eachAspect | 
  134693.                     | center extent |
  134694.                     extent := Grabber defaultExtent.
  134695.                     center := (aView rectangle insetBy: extent // 2 negated) perform: eachAspect.
  134696.                     center := aView parentView mapPoint: center to: self arena.
  134697.                     Rectangle center: center extent: extent].
  134698.     ^viewRects!
  134699.  
  134700. adornmentRegion
  134701.     "Private - Answers a Region occupied by all the selection adornments"
  134702.  
  134703.     ^self selections inject: Region empty into: [:region :each | 
  134704.         region union: (self adornmentRegionFor: each) ].
  134705.  
  134706.  
  134707. !
  134708.  
  134709. adornmentRegionFor: aView 
  134710.     "Private - Answers a Region occupied by the selection adornments for aView"
  134711.  
  134712.     | region1 |
  134713.     region1 := Region empty.
  134714.     (self adornmentRectanglesFor: aView) do: 
  134715.             [:each | 
  134716.             | region2 temp |
  134717.             region2 := Region rectangle: (each insetBy: -1).
  134718.             temp := region1 union: region2.
  134719.             region1 free.
  134720.             region2 free.
  134721.             region1 := temp].
  134722.     ^region1!
  134723.  
  134724. alignBottoms
  134725.     "Aligns the bottom edges of all the selections to match that of the
  134726.     primary selection"
  134727.  
  134728.     self matchGeometryAspect: #bottomAlign.!
  134729.  
  134730. alignCenters
  134731.     "Aligns the vertical centres of all the selections to match that of the
  134732.     primary selection"
  134733.  
  134734.     self matchGeometryAspect: #centerX.!
  134735.  
  134736. alignLefts
  134737.     "Aligns the left edges of all the selections to match that of the
  134738.     primary selection"
  134739.  
  134740.     self matchGeometryAspect: #leftAlign.!
  134741.  
  134742. alignMiddles
  134743.     "Aligns the horizontal centres of all the selections to match that of the
  134744.     primary selection"
  134745.  
  134746.     self matchGeometryAspect: #centerY.!
  134747.  
  134748. alignRights
  134749.     "Aligns the right edges of all the selections to match that of the
  134750.     primary selection"
  134751.  
  134752.     self matchGeometryAspect: #rightAlign.!
  134753.  
  134754. alignTops
  134755.     "Aligns the top edges of all the selections to match that of the
  134756.     primary selection"
  134757.  
  134758.     self matchGeometryAspect: #topAlign.!
  134759.  
  134760. areDragObjects: aCollection acceptableFor: operationSymbol inView: aView
  134761.     "Private - Answer whether aDragDropObjectCollection are all acceptable for the operation described by
  134762.     operationSymbol."
  134763.  
  134764.     | dragDropObject object |
  134765.     "Can aView currently accept a new view?"
  134766.     aView canAcceptSubViews
  134767.         ifFalse: [^false].
  134768.     
  134769.     "Does the receiver support the intended operation?"
  134770.     (#(copy link) includes: operationSymbol)
  134771.         ifFalse: [^false].
  134772.  
  134773.     "Is the drag object a ViewResource?"
  134774.     dragDropObject := aCollection first.
  134775.     object := dragDropObject objectIfAbsent: [^false].
  134776.     (object isKindOf: ViewResource)
  134777.         ifFalse: [^false].
  134778.  
  134779.     (operationSymbol == #link and: [(dragDropObject isFormatAvailable: #ResourceIdentifier) not])
  134780.         ifTrue: [^false].
  134781.  
  134782.     ^true!
  134783.  
  134784. arena
  134785.     "Private - Answer the arena view where the shell being composed is displayed"
  134786.  
  134787.     ^arena
  134788. !
  134789.  
  134790. arenaBorderSize
  134791.     "Private - Answer a number of pixels border size for the arena"
  134792.  
  134793.     ^20!
  134794.  
  134795. basicCaption
  134796.     "Answer a basic caption that can be used to label the receiver's view.
  134797.     Normally this is augmented (in #updateCaption) by appending the document file
  134798.     name"
  134799.  
  134800.     ^'View Composer'!
  134801.  
  134802. basicPasteResource: aViewResourceOrResourceIdentifier context: contextView 
  134803.     "Private - Pastes aViewResourceOrResourceIdentifier into contextView.
  134804.     Answers the pasted view.
  134805.     Generally, #pasteResource:context:position: should be used instead, as
  134806.     that will take care of selection etc."
  134807.  
  134808.     ^(aViewResourceOrResourceIdentifier isKindOf: ViewResource) 
  134809.         ifTrue: [self loadViewResource: aViewResourceOrResourceIdentifier inContext: contextView]
  134810.         ifFalse: 
  134811.             [contextView 
  134812.                 addSubView: (ReferenceView resourceIdentifier: aViewResourceOrResourceIdentifier)]!
  134813.  
  134814. browseIt
  134815.     "Open a new class browser on the hierarchy at the same point as the receiver."
  134816.     
  134817.     self composingView browse!
  134818.  
  134819. calculatePositionOf: aView offsetBy: pointOffset
  134820.     "Private - Answers the constrained position in the arena of aView when offset by pointOffset."
  134821.  
  134822.     | newPosition arenaPosition constrainedPosition parent parentArenaRect |
  134823.     parent := aView parentView.
  134824.     newPosition := aView position + pointOffset.
  134825.     constrainedPosition := self constrainPoint: newPosition.
  134826.     arenaPosition := parent mapPoint: constrainedPosition to: self arena.
  134827.  
  134828.     "Ensure aView stays within its parent rectangle."
  134829.     parentArenaRect := parent mapRectangle: parent clientRectangle to: self arena.
  134830.     arenaPosition := arenaPosition max: parentArenaRect origin.
  134831.     ^arenaPosition!
  134832.  
  134833. cancelSelectionFor: aView
  134834.     "Private - Removes the selection for aView"
  134835.  
  134836.     (self isSelected: aView) ifTrue: [
  134837.         self invalidateAdornmentFor: aView.
  134838.         self selections remove: aView.
  134839.         self updateAdornment.
  134840.         self updatePrimarySelection ]
  134841. !
  134842.  
  134843. cancelSelections
  134844.     "Private - Removes all selections and grabbers"
  134845.  
  134846.     self eraseAdornment.
  134847.     grabbers := nil.
  134848.     selections := OrderedCollection new.
  134849.     self primarySelection: nil.
  134850. !
  134851.  
  134852. cancelTrackingAt: aPoint 
  134853.     self eraseTrackingAt: aPoint.
  134854.     self updateAdornment!
  134855.  
  134856. canMove: aView
  134857.     "Private - Answer true if aView can be moved around by the receiver"
  134858.  
  134859.     ^true
  134860. !
  134861.  
  134862. canPaste
  134863.     "Private - Answer whether the ResourceManager clipboard can be pasted into the receiver."
  134864.  
  134865.     | dragObjects |
  134866.     (dragObjects := self resourceManager clipboard) isNil
  134867.         ifTrue: [^false].
  134868.     self composingView isNil
  134869.         ifTrue: [^true].
  134870.     self primarySelection isNil
  134871.         ifTrue: [^false].
  134872.     ^self areDragObjects: dragObjects acceptableFor: #copy inView: self primarySelection
  134873. !
  134874.  
  134875. canSize: aView
  134876.     "Private - Answer true if aView can be sized by the receiver"
  134877.  
  134878.     ^true
  134879.  
  134880. !
  134881.  
  134882. chooseBackgroundColor
  134883.     "Set the background color of all selected objects to the users choice from a ColorDialog."
  134884.  
  134885.     | color |
  134886.     color := Color choose.
  134887.     color notNil ifTrue:
  134888.         [self selections do: [:v | v backcolor: color]].
  134889. !
  134890.  
  134891. chooseFont
  134892.     "Set the font of all selected objects to the users choice from a FontDialog."
  134893.  
  134894.     | font |
  134895.     font := Font choose.
  134896.     font notNil ifTrue:
  134897.         [self selections do: [:v | v font: font]].
  134898. !
  134899.  
  134900. chooseForegroundColor
  134901.     "Set the foreground color of all selected objects to the users choice from a ColorDialog."
  134902.  
  134903.     | color |
  134904.     color := Color choose.
  134905.     color notNil ifTrue:
  134906.         [self selections do: [:v | v forecolor: color]].
  134907. !
  134908.  
  134909. clearSelection
  134910.     "Removes the current selections from the receiver"
  134911.  
  134912.     | whatString selCount |
  134913.     selCount := self selections size.
  134914.     whatString := selCount > 1 
  134915.                 ifTrue: [selCount displayString , ' selected views']
  134916.                 ifFalse: ['selected ' , self selections first class displayString].
  134917.     (MessageBox confirm: ('Are you sure you wish to remove the %1?' formatWith: whatString)) 
  134918.         ifTrue: 
  134919.             ["Hand off back to the main UI process to avoid race condition repainting PAI as it is rebuilt"
  134920.  
  134921.             [self deleteSelections] postToInputQueue]!
  134922.  
  134923. composingView
  134924.     "Private - Answers the View that is currently being composed by the receiver"
  134925.  
  134926.     ^composingView
  134927. !
  134928.  
  134929. composingView: aViewOrNil
  134930.     "Private - Sets the View that is currently being composed by the receiver.
  134931.     If nil then we are not editing any view"
  134932.  
  134933.     | hierarchy |
  134934.     self isModified: false.
  134935.     composingView := aViewOrNil.
  134936.     hierarchy := viewHierarchy model.
  134937.     hierarchy clear.
  134938.     composingView notNil 
  134939.         ifTrue: 
  134940.             [composingView position: self defaultComposingPosition.
  134941.             hierarchy addRoot: composingView].
  134942.     self updateCaption!
  134943.  
  134944. constrainPoint: aPoint
  134945.     "Private - Answers the position for aPoint after any view constraints have been taken 
  134946.     into consideration"
  134947.  
  134948.     ^grid constrainPoint: aPoint!
  134949.  
  134950. continueTrackingAt: pointOffset from: previousPointOffset
  134951.     "Private - Continue selection tracking at pointOffset when the previous tracking 
  134952.     was at previousPointOffset. Part of the <MouseTracker> target protocol. 
  134953.     Answers the actual position achieved after any view constraints
  134954.     have been applied"
  134955.  
  134956.     self eraseTrackingAt: previousPointOffset.
  134957.     self drawTrackingAt: pointOffset.
  134958.     ^pointOffset!
  134959.  
  134960. copyAspectsFrom: aSourceView to: aDestView 
  134961.     "Private - Transfer all the understood published     aspects from
  134962.     aSourceView to aDestView. Also transfers certain aspects that are
  134963.     held by the parent."
  134964.  
  134965.     | originalName originalPreviousSibling |
  134966.     aSourceView publishedAspects do: 
  134967.             [:each | 
  134968.             | putSymbol |
  134969.             putSymbol := (each name , ':') asSymbol.
  134970.             (aDestView respondsTo: putSymbol) 
  134971.                 ifTrue: 
  134972.                     [[aDestView perform: putSymbol with: (aSourceView perform: each name)] on: Error
  134973.                         do: [:e | ]]].
  134974.     originalName := aSourceView name.
  134975.     originalPreviousSibling := aSourceView previousSiblingView.
  134976.     aSourceView name: nil.
  134977.     aDestView
  134978.         name: originalName;
  134979.         zOrderAfter: originalPreviousSibling!
  134980.  
  134981. copySelection
  134982.     "Copies the selections to the View Composer clipboard.
  134983.     Note that we do not currently integrate with the real Windows
  134984.     clipboard"
  134985.  
  134986.     #todo "Use the Clipboard class".
  134987.     ViewResource copyAllToClipboard: self selections.
  134988. !
  134989.  
  134990. createComponents
  134991.     "Create the presenters contained by the receiver"
  134992.  
  134993.     super createComponents.
  134994.     inspector := self add: PublishedAspectInspector new name: 'inspector'.
  134995.     viewHierarchy := self add: (TreePresenter on: ViewHierarchyModel new) name: 'viewHierarchy'.
  134996. !
  134997.  
  134998. createGrabberFor: aGrabAspectSymbol of: aView
  134999.     "Private - Answer a new Grabber for aGrabAspectSymbol of our associated view"
  135000.  
  135001.     ^Grabber
  135002.         view: aView
  135003.         aspect: aGrabAspectSymbol
  135004.         arena: self arena
  135005.         grid: self grid
  135006.         status: self status.!
  135007.  
  135008. createSchematicWiring
  135009.     "Create the trigger wiring for the receiver"
  135010.     
  135011.     super createSchematicWiring.
  135012.     inspector when: #inspecteeChanged send: #onInspecteeChanged to: self.
  135013.     viewHierarchy
  135014.         when: #selectionChanged send: #onHierarchySelection to: self;
  135015.         when: #dragOver: send: #onDragOverHierarchy: to: self;
  135016.         when: #drop: send: #onDropOverHierarchy: to: self;
  135017.         when: #dragCut: send: #onDragCutHierarchy: to: self;
  135018.         when: #drag: send: #onDragHierarchy: to: self.
  135019.  
  135020.     viewHierarchy model 
  135021.         when: #item:addedInParent: send: #setModified to: self;
  135022.         when: #item:movedToParent: send: #setModified to: self.
  135023.     self when: #closeRequested: send: #onCloseRequested: to: self.
  135024. !
  135025.  
  135026. cursor
  135027.     "Answers the cursor to be used.
  135028.     If the mouse position is over a Grabber, then
  135029.     answer the appropriate cursor."
  135030.  
  135031.     | position grabberHit |
  135032.     position := DesktopView current mapPoint: Cursor position to: self arena.
  135033.     grabberHit := self grabberHitBy: position.
  135034.     ^grabberHit isNil
  135035.         ifTrue: [nil]
  135036.         ifFalse: [grabberHit cursor]
  135037.  
  135038. !
  135039.  
  135040. cutSelection
  135041.     "Cuts the current selections to the clipboard"
  135042.  
  135043.     self copySelection; clearSelection
  135044. !
  135045.  
  135046. defaultComposingPosition
  135047.     "Answer aPoint used to offset the composing view within the arena when first shown"
  135048.  
  135049.     ^5@5!
  135050.  
  135051. defaultGridResolution
  135052.     "Answers the default grid resolution to use in the receiver."
  135053.  
  135054.     ^5!
  135055.  
  135056. defaultOffset
  135057.     "Answer aPoint used to offset objects that are added into a parent"
  135058.  
  135059.     ^10@10!
  135060.  
  135061. defaultSelectionWidth
  135062.     "Private - Answer the default width of the selection border"
  135063.  
  135064.     ^UserLibrary default getSystemMetrics: SM_CXSIZEFRAME
  135065.  
  135066. !
  135067.  
  135068. defaultToolboxPosition
  135069.     "Answer aPoint used to offset the toolbox when first shown"
  135070.  
  135071.     ^self arena clientRectangle center!
  135072.  
  135073. deleteSelections
  135074.     self selections copy do: [:each | self removeView: each].
  135075.     self setModified.
  135076.     self arena invalidate.
  135077.     self hasComposingView 
  135078.         ifTrue: [composingView validateLayout]
  135079.         ifFalse: [self isModified: false]!
  135080.  
  135081. dereference
  135082.     "Private - Dereference the primary selection which is an instance of ReferenceView."
  135083.  
  135084.     | referenceView dereferencedView |
  135085.     referenceView := self primarySelection.
  135086.     (MessageBox 
  135087.         confirm: ('This reference to ''%1'' will be replaced by a copy%n%nAre you sure you want to continue?' 
  135088.                 formatWith: referenceView resourceIdentifier displayString printString)
  135089.         caption: 'Dereference to copy...') ifFalse: [^self].
  135090.     self eraseAdornment.
  135091.     dereferencedView := self basicPasteResource: referenceView resource
  135092.                 context: referenceView parentView.
  135093.     self copyAspectsFrom: referenceView to: dereferencedView.
  135094.     self pastedView: dereferencedView context: referenceView parentView.
  135095.     self removeView: referenceView!
  135096.  
  135097. drawAdornment
  135098.     "Private - Draws the adornment for the receiver on the associated view. It
  135099.     must be painted after all child windows of the view have been drawn, 
  135100.     so that it appears on top of them"
  135101.  
  135102.     self arena update.
  135103.     self secondarySelections do: [:each | self drawSelectionFor: each ].
  135104.     self grabbers do: [:each | each draw].
  135105.     self saveAdornmentRegion.
  135106.  
  135107. !
  135108.  
  135109. drawSelectionFor: aView
  135110.     "Private - Paint the selection border for aView."
  135111.  
  135112.     | canvas |
  135113.     canvas := self arena canvas.
  135114.     canvas pen: (Pen color: Color highlight).
  135115.     (self adornmentRectanglesFor: aView) do: [:each | canvas rectangle: each].
  135116.     canvas free.
  135117. !
  135118.  
  135119. drawTrackingAt: pointOffset 
  135120.     "Private - Draws the tracking for the current selections when offset by pointOffset."
  135121.  
  135122.     self moveableSelections do: 
  135123.             [:each | 
  135124.             | newPosition focusRect |
  135125.             newPosition := self calculatePositionOf: each offsetBy: pointOffset.
  135126.             focusRect := Rectangle origin: newPosition extent: each extent.
  135127.             self arena drawFocusRect: focusRect.
  135128.  
  135129.             "For the primary selection, we show the position and size in the statusbar."
  135130.             each = self primarySelection 
  135131.                 ifTrue: 
  135132.                     [| positionInParent |
  135133.                     positionInParent := self arena mapPoint: newPosition to: each parentView.
  135134.                     status value: (Rectangle origin: positionInParent extent: focusRect extent)]]!
  135135.  
  135136. dropIncrement
  135137.     "Private - Answers a Point that is the incremental position between multiple dropped object"
  135138.     
  135139.     ^10@10!
  135140.  
  135141. dropTargetFromSession: session 
  135142.     "Determine where the view should be dropped."
  135143.  
  135144.     | viewHit arenaPoint |
  135145.     arenaPoint := session dragPointInView: self arena.
  135146.     viewHit := self viewHitBy: arenaPoint.
  135147.     viewHit isNil ifTrue: [^self arena].
  135148.     [viewHit canAcceptSubViews] whileFalse: [viewHit := viewHit parentView].
  135149.     ^viewHit!
  135150.  
  135151. dropView: aView onto: aTargetView at: aPoint 
  135152.     "Private - Handle the drop of aView on aTargetView in the receiver.
  135153.     Answer true if the operation succeeds, false otherwise"
  135154.  
  135155.     | originalParent |
  135156.     originalParent := aView parentView.
  135157.     originalParent == aTargetView 
  135158.         ifFalse: 
  135159.             ["Only need to do anything if the view is not already in place"
  135160.             | resource name |
  135161.             resource := ViewResource defaultWritable save: aView.
  135162.             name := aView parentView notNil ifTrue: [aView name].
  135163.             ^self 
  135164.                 dropViewResource: resource
  135165.                 onto: aTargetView
  135166.                 at: aPoint
  135167.                 named: name].
  135168.     ^false!
  135169.  
  135170. dropViewResource: aViewResource onto: aTargetView at: aPoint named: aNameStringOrNil 
  135171.     "Private - Handle the drop of aViewResource  on aTargetView in the receiver.
  135172.     Answer true if the operation succeeds, false otherwise"
  135173.  
  135174.     | dropee position |
  135175.     dropee := self loadViewResource: aViewResource inContext: aTargetView.
  135176.     position := (aTargetView clientRectangle containsPoint: aPoint) 
  135177.                 ifTrue: [aPoint]
  135178.                 ifFalse: [self dropIncrement].
  135179.     dropee
  135180.         position: position;
  135181.         show.
  135182.  
  135183.     "Both the target and the view under composition may need laying out"
  135184.     self forceLayoutFor: aTargetView.
  135185.     [dropee name: aNameStringOrNil] on: Error do: [:x | ].
  135186.     viewHierarchy model add: dropee asChildOf: aTargetView.
  135187.     ^true!
  135188.  
  135189. editContextMenu
  135190.     "Invoke the MenuComposer on the context menu of the primarySelection."
  135191.  
  135192.     | menuValue editor edited |
  135193.     edited := self primarySelection.
  135194.     menuValue := edited aspectValue: #contextMenu.
  135195.     menuValue 
  135196.         when: #valueChanged
  135197.         send: #setModified
  135198.         to: self.
  135199.     editor := MenuComposer createOn: menuValue.
  135200.     editor showModal.
  135201.     editor isConfirmed ifTrue: [inspector aspectChanged: #contextMenu of: edited]!
  135202.  
  135203. editMenuBar
  135204.     "Invoke the MenuComposer on the menu bar of the composingView."
  135205.  
  135206.     | menuValue editor edited |
  135207.     edited := self composingView.
  135208.     menuValue := edited aspectValue: #menuBar.
  135209.     menuValue 
  135210.         when: #valueChanged
  135211.         send: #setModified
  135212.         to: self.
  135213.     editor := MenuBarComposer createOn: menuValue.
  135214.     editor showModal.
  135215.     editor isConfirmed ifTrue: [inspector aspectChanged: #menuBar of: edited]!
  135216.  
  135217. editReference
  135218.     "Private - Edit the primary selection which is an instance of ReferenceView."
  135219.  
  135220.     self primarySelection resourceIdentifier edit!
  135221.  
  135222. endComposition
  135223.     "Close the existing shell in use by the receiver"
  135224.  
  135225.     self composingView notNil ifTrue: [
  135226.         self cancelSelections.
  135227.         self removeView: self composingView.
  135228.         self composingView: nil ]!
  135229.  
  135230. endTrackingAt: pointOffset 
  135231.     "Private - End selection tracking at aPoint."
  135232.  
  135233.     self eraseTrackingAt: pointOffset.
  135234.     self moveableSelections do: 
  135235.             [:each | 
  135236.             | parentLayoutManager newPosition positionInParent |
  135237.             newPosition := self calculatePositionOf: each offsetBy: pointOffset.
  135238.             positionInParent := self arena mapPoint: newPosition to: each parentView.
  135239.             parentLayoutManager := each parentView layoutManager.
  135240.             parentLayoutManager isNil 
  135241.                 ifTrue: 
  135242.                     [each
  135243.                         position: positionInParent;
  135244.                         invalidate]
  135245.                 ifFalse: 
  135246.                     [parentLayoutManager reposition: each to: positionInParent.
  135247.                     parentLayoutManager layoutContainer: each parentView].
  135248.             self setModified].
  135249.     self updateAdornment!
  135250.  
  135251. eraseAdornment
  135252.     "Private - Erases the adorment of selections."
  135253.     
  135254.     self arena invalidateRgn: adornmentRegion; update.
  135255.     self isAdornmentModified: false
  135256.     
  135257.     
  135258. !
  135259.  
  135260. eraseTrackingAt: aPoint
  135261.     "Private - Erases the tracking for the current selection when the primary selection is
  135262.     moved to aPoint. Since tracking is drawn with an Xor pen mode we can redraw
  135263.     it once more to erase it"
  135264.  
  135265.     self drawTrackingAt: aPoint    
  135266. !
  135267.  
  135268. fileNew
  135269.     "Create a new Shell view to edit."
  135270.  
  135271.     self newShellView!
  135272.  
  135273. fileOpen
  135274.     "Open the view from a resource."
  135275.  
  135276.     self viewOpen!
  135277.  
  135278. fileSave
  135279.     "Save the view as a resource."
  135280.  
  135281.     self viewSave!
  135282.  
  135283. forceLayoutFor: aContainerView
  135284.     "Private - Forces the relaying out of aContainerView, presumably because its contents have changed"
  135285.  
  135286.     aContainerView invalidateLayout.
  135287.     self composingView notNil ifTrue: [
  135288.         self composingView invalidateLayout; validateLayout ]!
  135289.  
  135290. getAdornmentRegion
  135291.     "Private - Answers a Region occupied by all the selection adornments"
  135292.  
  135293.     ^self selections inject: Region empty into: [:region :each | 
  135294.         region union: (self adornmentRegionFor: each) ].
  135295.  
  135296.  
  135297. !
  135298.  
  135299. grabberHitBy: aPoint
  135300.     "Private - Answer the grabber under aPoint or nil otherwise"
  135301.  
  135302.     ^self grabbers detect: [ :each | each containsPoint: aPoint ] ifNone: []
  135303.  
  135304. !
  135305.  
  135306. grabbers
  135307.     "Private - Answers the collection of grabbers currently in operation"
  135308.  
  135309.     grabbers isNil ifTrue: [ grabbers := IdentitySet new ].
  135310.     ^grabbers
  135311. !
  135312.  
  135313. grid
  135314.     "Private - Answers the Grid associated with the receiver."
  135315.  
  135316.     ^grid!
  135317.  
  135318. grid: aGrid
  135319.     "Private - Sets the Grid associated with the receiver to aGrid."
  135320.  
  135321.     grid := aGrid!
  135322.  
  135323. hasClipboard
  135324.     "Private - Answer true if there is an item on the clipboard"
  135325.  
  135326.     ^self resourceManager clipboard isKindOf: ViewResource
  135327. !
  135328.  
  135329. hasComposingView
  135330.     "Private - Answer true if we are actually composing a view"
  135331.  
  135332.     ^self composingView notNil
  135333. !
  135334.  
  135335. hasPreferredExtent
  135336.     "Answers true if the primary selection is set to use a preferred extent"
  135337.  
  135338.     ^self primarySelection preferredExtent notNil!
  135339.  
  135340. hasResource
  135341.     "Private - Answer true if the receiver has a full resource identifier"
  135342.  
  135343.     ^resourceIdentifier notNil and: [resourceIdentifier name notNil ]!
  135344.  
  135345. hasSelection
  135346.     "Private - Answer true if there are any selections"
  135347.  
  135348.     ^self selections notEmpty
  135349.  
  135350. !
  135351.  
  135352. incrementAddPositionOffset
  135353.     "Private - Increments the position offset within a parent where
  135354.     a new child view should be added. Answers the new position"
  135355.     
  135356.     ^addPositionOffset := addPositionOffset + self defaultOffset
  135357.  
  135358. !
  135359.  
  135360. initialize
  135361.     "Private - Initialize the receiver"
  135362.  
  135363.     super initialize.
  135364.  
  135365.     self grid: (Grid resolution: self defaultGridResolution).
  135366.     selections := OrderedCollection new.
  135367.     vcFlags := 0.
  135368.     self resetAddPositionOffset.
  135369. !
  135370.  
  135371. inspector
  135372.     "Private - Answer the published aspect inspector of the receiver"
  135373.  
  135374.     ^inspector!
  135375.  
  135376. invalidateAdornmentFor: aView
  135377.     "Private - Invalidates the region occupied by the adornments for aView 
  135378.     and causes it to be repainted"
  135379.  
  135380.     self arena invalidateRgn: (self adornmentRegionFor: aView)
  135381.  
  135382.  
  135383. !
  135384.  
  135385. isAdornmentModified
  135386.     "Private - Answer whether the adornments required updating."
  135387.  
  135388.     ^vcFlags allMask: AdornmentModifiedFlag
  135389. !
  135390.  
  135391. isAdornmentModified: aBoolean
  135392.     "Private - Update the isAdornmentModified flag."
  135393.  
  135394.     vcFlags := vcFlags mask: AdornmentModifiedFlag set: aBoolean
  135395. !
  135396.  
  135397. isModified
  135398.     "Answer true if the view being composed has been modified"
  135399.  
  135400.     ^vcFlags allMask: ModifiedFlag
  135401. !
  135402.  
  135403. isModified: aBoolean
  135404.     "Private - Set the modifiaction flag for the view being composed to aBoolean"
  135405.  
  135406.     vcFlags := vcFlags mask: ModifiedFlag set: aBoolean.
  135407.     self invalidateUserInterface!
  135408.  
  135409. isMouseClick
  135410.     "Private - Answer whether the Mouse Click flag is set."
  135411.  
  135412.     ^vcFlags allMask: MouseClickFlag
  135413. !
  135414.  
  135415. isMouseClick: aBoolean
  135416.     "Private - Set/reset the mouse click flag."
  135417.  
  135418.     vcFlags := vcFlags mask: MouseClickFlag set: aBoolean!
  135419.  
  135420. isMouseTarget
  135421.     "Private - Answer true if the receiver wants mouse events that would otherwise
  135422.     go to the window under the mouse pointer"
  135423.  
  135424.     ^true
  135425. !
  135426.  
  135427. isSelected: aView
  135428.     "Private - Answer true if the aView is selected"
  135429.  
  135430.     ^self selections includes: aView
  135431. !
  135432.  
  135433. loadViewResource: aViewResourceOrResourceIdentifier inContext: contextView 
  135434.     ^aViewResourceOrResourceIdentifier loadWithContext: contextView!
  135435.  
  135436. matchBackgroundColors
  135437.     "Matches the background colors of all the selections to that of the primary selection."
  135438.  
  135439.     | color |
  135440.     color := self primarySelection backcolor.
  135441.     (self selections reject: [:v | v == self primarySelection]) do:
  135442.         [:v | v backcolor: color].
  135443.     self setModified
  135444. !
  135445.  
  135446. matchFonts
  135447.     "Matches the fonts of all the selections to that of the primary selection."
  135448.  
  135449.     | font |
  135450.     font := self primarySelection font.
  135451.     (self selections reject: [:v | v == self primarySelection]) do:
  135452.         [:v | v font: font].
  135453.     self setModified
  135454. !
  135455.  
  135456. matchForegroundColors
  135457.     "Matches the foreground colors of all the selections to that of the primary selection."
  135458.  
  135459.     | color |
  135460.     color := self primarySelection forecolor.
  135461.     (self selections reject: [:v | v == self primarySelection]) do:
  135462.         [:v | v forecolor: color].
  135463.     self setModified
  135464. !
  135465.  
  135466. matchGeometryAspect: anAspectSymbol 
  135467.     "Private - Matches the geometry aspect in anAspectSymbol (#x, #y, #width, #height etc) of the 
  135468.     selections to that of the primary selection"
  135469.  
  135470.     self safetyWrap: 
  135471.             [| aspectSetSymbol primaryRectangle |
  135472.             aspectSetSymbol := (anAspectSymbol , ':') asSymbol.
  135473.             primaryRectangle := self primarySelection parentView 
  135474.                         mapRectangle: self primarySelection rectangle
  135475.                         to: self primarySelection topView.
  135476.             self selections do: 
  135477.                     [:each | 
  135478.                     | rectangle selectionRectangle |
  135479.                     rectangle := each topView mapRectangle: primaryRectangle to: each parentView.
  135480.                     selectionRectangle := each rectangle.
  135481.                     selectionRectangle perform: aspectSetSymbol with: (rectangle perform: anAspectSymbol).
  135482.                     each rectangle: selectionRectangle]]!
  135483.  
  135484. matchHeights
  135485.     "Matches the heights of all the selections to that of the primary selection"
  135486.  
  135487.     self matchGeometryAspect: #height.!
  135488.  
  135489. matchWidths
  135490.     "Matches the widths of all the selections to that of the primary selection"
  135491.  
  135492.     self matchGeometryAspect: #width.!
  135493.  
  135494. moveableSelections
  135495.     "Private - Answer an OrderedCollection of selections which can be
  135496.     moved during a positioning operation. We remove all subViews that
  135497.     are having their parents moved"
  135498.     
  135499.     | moveableSelections |
  135500.     moveableSelections := self selections select: [ :each | self canMove: each ].
  135501.     ^moveableSelections select: [ :each | 
  135502.         (each allParents intersection: moveableSelections) isEmpty ]
  135503. !
  135504.  
  135505. mutate
  135506.     "Mutate the primary selection to a user's choice of view"
  135507.  
  135508.     (ChoicePrompter choices: View allSubclasses asSortedCollection caption: 'Mutate to') 
  135509.         ifNotNil: [:viewClass | self mutateTo: viewClass]!
  135510.  
  135511. mutateTo: aViewClass 
  135512.     "Mutate the primary selection to an instance of aViewClass."
  135513.  
  135514.     | selectedView newView |
  135515.     selectedView := self primarySelection.
  135516.     newView := selectedView parentView addSubView: aViewClass new.
  135517.     self copyAspectsFrom: selectedView to: newView.
  135518.     selectedView subViews reverse copy do: 
  135519.             [:each | 
  135520.             | name |
  135521.             name := each name.
  135522.             each
  135523.                 parentView: newView;
  135524.                 recreate.
  135525.             each name: name].
  135526.     self pastedView: newView context: newView parentView.
  135527.     self removeView: selectedView.
  135528.     "Ensure any refs to old view (such as from a layout manager) are now to the new view"
  135529.     selectedView oneWayBecome: newView!
  135530.  
  135531. newDialogView
  135532.     "Prepare the receiver to edit a new Dialog default view."
  135533.  
  135534.     | rid |
  135535.     rid := ResourceIdentifier class: Dialog name: Dialog defaultView.
  135536.     self openOnCopyOf: rid.!
  135537.  
  135538. newShellView
  135539.     "Prepare the receiver to edit a new Shell default view."
  135540.  
  135541.     | rid |
  135542.     rid := ResourceIdentifier class: Shell name: Shell defaultView.
  135543.     self openOnCopyOf: rid.
  135544. !
  135545.  
  135546. onCloseRequested: boolValueHolder
  135547.     "A request to close the view onto the receiver as occurred.
  135548.     Prompt to save any outstanding changed"
  135549.  
  135550.     self onPromptToSaveChanges: boolValueHolder!
  135551.  
  135552. onDragCutHierarchy: session
  135553.     "The DragDropSession, session, has just completed a successful 
  135554.     move operation.  The receiver is now responsible for deleting the 
  135555.     dragged object s) from itself."
  135556.  
  135557.     session dragObjects do: [:each | | draggedView |
  135558.         draggedView := each object.
  135559.         viewHierarchy model remove: draggedView.
  135560.         draggedView parentView removeSubView: draggedView ]!
  135561.  
  135562. onDragEnterShield: session
  135563.     "The drag operation described by the <DragDropSession>, session,
  135564.     has entered the receiver's shield window.
  135565.     Note that we don't worry about setting up the drop operation just yet,
  135566.     as we'll soon be getting an #onDragOverShield: message."
  135567.  
  135568.     self eraseAdornment!
  135569.  
  135570. onDragHierarchy: session
  135571.     "A drag has been started. Drag the currently selected view hierarchy."
  135572.  
  135573.     | dragDropObject draggingView |
  135574.     draggingView := session suggestedSource.
  135575.     dragDropObject := session newDragObject: session suggestedSource.
  135576.     session
  135577.         dragObjects: (OrderedCollection with: dragDropObject);
  135578.         defaultOperation: #move!
  135579.  
  135580. onDragLeaveShield: session
  135581.     "The drag operation described by the <DragDropSession>, session,
  135582.     has left the receiver's window."
  135583.  
  135584.     session suggestedTarget notNil ifTrue: [
  135585.         self invalidateAdornmentFor: session suggestedTarget].
  135586.     self drawAdornment.!
  135587.  
  135588. onDragOverHierarchy: session
  135589.     "Answer the operation that would occur if a drop took place now
  135590.     from the <DragDropSession>, session.
  135591.     Basically the suggested target will allow a #copy or #link operation
  135592.     of a ViewResource provided it is able to accept subviews"
  135593.  
  135594.     | targetView op |
  135595.     op :=session intendedOperation.
  135596.  
  135597.     "Default is to do nothing."
  135598.     session operation: nil.
  135599.  
  135600.     session isTargetSameAsSource ifTrue: [^self].
  135601.     targetView := session suggestedTarget.
  135602.     (targetView isNil or:  [targetView canAcceptSubViews]) 
  135603.         ifFalse: [^self].
  135604.  
  135605.     (session isObjectKindAvailable: ViewResource) ifTrue: [
  135606.         (session intendedOperation==#move) ifFalse: [session operation: op. ^self]].
  135607.     
  135608.     (session isObjectKindAvailable: View) ifTrue: [
  135609.         (session intendedOperation==#link) ifFalse: [session operation: op. ^self]].!
  135610.  
  135611. onDragOverShield: session
  135612.     "Answer the operation that would occur if a drop took place now."
  135613.  
  135614.     | op dropTarget |
  135615.     op := session intendedOperation.
  135616.     session operation: nil.
  135617.  
  135618.     "Determine where the view should be dropped. Make a note of this in the session."
  135619.     dropTarget := self dropTargetFromSession: session.
  135620.     dropTarget ~~ session suggestedTarget 
  135621.         ifTrue: 
  135622.             [session suggestedTarget notNil 
  135623.                 ifTrue: [self invalidateAdornmentFor: session suggestedTarget].
  135624.  
  135625.             "Don't allow a drop outside of the composingView (unless the arena is empty."
  135626.             (dropTarget == arena and: [self composingView notNil]) 
  135627.                 ifTrue: [^session suggestedTarget: nil].
  135628.             session hideDragImage.
  135629.             self drawSelectionFor: dropTarget.
  135630.             self arena update.
  135631.             session showDragImage.
  135632.             session suggestedTarget: dropTarget].
  135633.     (self 
  135634.         areDragObjects: session dragObjects
  135635.         acceptableFor: op
  135636.         inView: dropTarget) ifFalse: [^self].
  135637.     session operation: op!
  135638.  
  135639. onDropOverHierarchy: session 
  135640.     "The drag operation described by the <DragDropSession>, session,
  135641.     would like to do a drop."
  135642.  
  135643.     | op parent ok position |
  135644.     op := session operation.
  135645.     (parent := session suggestedTarget) notNil 
  135646.         ifFalse: 
  135647.             [session operation: nil.
  135648.             Sound errorBeep.
  135649.             ^self].
  135650.     position := self dropIncrement.
  135651.     session dragObjects do: 
  135652.             [:dropObject | 
  135653.             (dropObject isObjectKindAvailable: View) 
  135654.                 ifTrue: 
  135655.                     ["A view has been dropped onto the receiver"
  135656.                     ok := self 
  135657.                                 dropView: dropObject object
  135658.                                 onto: parent
  135659.                                 at: dropObject object position].
  135660.             (dropObject isObjectKindAvailable: ViewResource) 
  135661.                 ifTrue: 
  135662.                     ["A view resource has been dropped onto the receiver"
  135663.                     op == #copy 
  135664.                         ifTrue: 
  135665.                             [ok := self 
  135666.                                         dropViewResource: dropObject object
  135667.                                         onto: parent
  135668.                                         at: position
  135669.                                         named: nil].
  135670.                     op == #link 
  135671.                         ifTrue: 
  135672.                             [| rid dropee |
  135673.                             rid := dropObject format: #ResourceIdentifier.
  135674.                             dropee := ReferenceView resourceIdentifier: rid.
  135675.                             ok := self 
  135676.                                         dropView: dropee
  135677.                                         onto: parent
  135678.                                         at: position].
  135679.  
  135680.                     "Bump position"
  135681.                     position := position + self dropIncrement].
  135682.  
  135683.             "Terminate early if operation fails"
  135684.             ok 
  135685.                 ifFalse: 
  135686.                     [session operation: nil.
  135687.                     ^self]]!
  135688.  
  135689. onDropOverShield: session 
  135690.     "The drag operation described by the <DragDropSession>, session, has 
  135691.     culminated in a drop over the Shield, which we handle here."
  135692.  
  135693.     | op dropObject dropTarget dropPosition pastee |
  135694.     op := session operation.
  135695.     dropObject := session dragObjects first.
  135696.     dropTarget := self dropTargetFromSession: session.
  135697.     dropPosition := session dragPointInView: dropTarget.
  135698.     op == #copy ifTrue: [pastee := dropObject object].
  135699.     op == #link ifTrue: [pastee := dropObject format: #ResourceIdentifier].
  135700.     session suggestedTarget notNil 
  135701.         ifTrue: [self invalidateAdornmentFor: session suggestedTarget].
  135702.     self 
  135703.         pasteResource: pastee
  135704.         context: dropTarget
  135705.         position: dropPosition!
  135706.  
  135707. onHierarchySelection
  135708.     "The selection has changed in the view hierarchy presenter so
  135709.     alter the primary selection"
  135710.  
  135711.     self isMouseClick 
  135712.         ifFalse: 
  135713.             [| v |
  135714.             v := viewHierarchy selectionOrNil.
  135715.             v isNil ifTrue: [self cancelSelections] ifFalse: [self selection: v]].
  135716.     inspector model: primarySelection!
  135717.  
  135718. onIdleEntered
  135719.     "Idle has been entered. Ensure the adornment is displayed correctly"
  135720.  
  135721.     super onIdleEntered.
  135722.     self isAdornmentModified ifTrue: [
  135723.         self eraseAdornment.
  135724.         self drawAdornment.
  135725.         self primarySelection notNil ifTrue: [
  135726.             status value: self primarySelection rectangle ].
  135727.         self isAdornmentModified: false ].
  135728. !
  135729.  
  135730. onInspecteeChanged
  135731.     "Private - The primary selection (i.e. the view being inspected) has been updated.
  135732.     Refresh the receiver appropriately. We also create a dummy command that can be
  135733.     added to the command history so that the change can be undone/redone."
  135734.  
  135735.     viewHierarchy model refresh: self primarySelection.
  135736.     self isModified: true.!
  135737.  
  135738. onPromptToSaveChanges: aBooleanValue
  135739.     "Private - Check to see if the composing view has been changed. 
  135740.     If so prompt to see if the changes should be retained and if they should then
  135741.     set the value of the out parameter, aBooleanValue, to false"
  135742.  
  135743.     self isModified 
  135744.         ifTrue: 
  135745.             [(MessageBox confirm: 'There are unsaved changes. Do you wish to retain them?') 
  135746.                 ifTrue: [aBooleanValue value: false]
  135747.                 ifFalse: [self isModified: false]].
  135748.     ^aBooleanValue value!
  135749.  
  135750. onRequestDropOpsForShield: session
  135751.     "Private - An extended drop has been initiated over the shield by the <DragDropSession>,
  135752.     session. Specify the set of permitted drop operations."
  135753.  
  135754.     session supportedOperations: #(copy link)!
  135755.  
  135756. onSelectionPositioned: aPositionEvent 
  135757.     "Private - The selection has been resized or moved.
  135758.     Refresh the receiver appropriately"
  135759.  
  135760.     | updatedAspect |
  135761.     aPositionEvent isMove ifTrue: [updatedAspect := #position].
  135762.     aPositionEvent isResize ifTrue: [updatedAspect := #extent].
  135763.     updatedAspect notNil ifTrue: [[inspector aspectChanged: updatedAspect] postToInputQueue].
  135764.     self updateAdornment!
  135765.  
  135766. onToolboxClosed
  135767.     "Private - The toolbox has been closed. Remember it's last location and that it's
  135768.     no longer associated with the receiver"
  135769.  
  135770.     toolboxPosition := toolbox view position.
  135771.     toolbox := nil!
  135772.  
  135773. onViewOpened
  135774.     "The receiver has just been connected to its view.
  135775.     Now we also connect locate the shield and arena subViews."
  135776.  
  135777.     | myView |
  135778.     super onViewOpened.
  135779.     myView := self view.
  135780.     (shield := Shield target: self)
  135781.         isDropTarget: true;
  135782.         when: #dragEnter:
  135783.             send: #onDragEnterShield:
  135784.             to: self;
  135785.         when: #dragOver:
  135786.             send: #onDragOverShield:
  135787.             to: self;
  135788.         when: #dragLeave:
  135789.             send: #onDragLeaveShield:
  135790.             to: self;
  135791.         when: #drop:
  135792.             send: #onDropOverShield:
  135793.             to: self;
  135794.         when: #requestDropOperations:
  135795.             send: #onRequestDropOpsForShield:
  135796.             to: self.
  135797.     (arena := ViewComposerArena new)
  135798.         hasBorder: true;
  135799.         backcolor: (Color systemColor: COLOR_APPWORKSPACE);
  135800.         exStyleMask: WS_EX_CONTROLPARENT set: false;
  135801.         isTabStop: false.
  135802.     (myView viewNamed: 'shieldAndArena')
  135803.         usePreferredExtent: true;
  135804.         addSubView: shield name: 'shield';
  135805.         addSubView: arena name: 'arena'.
  135806.     status := ValueHolder new.
  135807.     (myView viewNamed: 'positionStatus') model: status.
  135808.     (myView viewNamed: 'extentStatus') model: status.
  135809.     modificationStatus := ValueHolder new.
  135810.     (myView viewNamed: 'modificationStatus') model: modificationStatus!
  135811.  
  135812. openOn: aResourceIdentifier 
  135813.     "Private - Open the ViewResource identified by aResourceIdentifier for editing and record its
  135814.     identity so we know how to save it back."
  135815.  
  135816.     self viewClose ifFalse: [^self].
  135817.     (aResourceIdentifier resource isViewResource) 
  135818.         ifFalse: [^self error: 'Unable to load ' , aResourceIdentifier printString].
  135819.     self 
  135820.         pasteResource: aResourceIdentifier resource
  135821.         context: arena
  135822.         position: self incrementAddPositionOffset.
  135823.  
  135824.     "The paste will have set the modified flag. We clear it here,
  135825.     because we know the view has simply been opened."
  135826.     self isModified: false.
  135827.     resourceIdentifier := aResourceIdentifier.
  135828.     self
  135829.         updateCaption;
  135830.         setInitialFocus!
  135831.  
  135832. openOnCopyOf: aResourceIdentifier
  135833.     "Private - Open the ViewResource identified by aResourceIdentifier for editing but don't save
  135834.     this identifier so that we are effectively editing a copy. Not that this is subtly different from
  135835.     #openOn:"
  135836.  
  135837.     | resource |
  135838.     
  135839.     self viewClose ifFalse: [^self].
  135840.     [ resource := aResourceIdentifier searchForResource ] on: Error do: [:x | ].
  135841.  
  135842.     (resource notNil and: [resource isViewResource]) ifTrue: [
  135843.         "Only if we find a matching view resource do we paste it
  135844.         into the receiver's arena"
  135845.         self 
  135846.             pasteResource: resource
  135847.             context: self pasteContext
  135848.             position: self incrementAddPositionOffset.
  135849.  
  135850.         "The paste will have set the modified flag. We clear it here,
  135851.         because we know the view has simply been opened."
  135852.         self isModified: false ].
  135853.  
  135854.     resourceIdentifier := aResourceIdentifier copy.
  135855.     resourceIdentifier name: nil.
  135856.     self updateCaption.!
  135857.  
  135858. pasteClipboard
  135859.     "Pastes the DragDropObject(s) held on the clipboard into the primary selection."
  135860.  
  135861.     | pasteContext |
  135862.     pasteContext := self pasteContext.
  135863.     self resourceManager clipboard do: [:each |
  135864.         self
  135865.             pasteResource: each object
  135866.             context: pasteContext
  135867.             position: self incrementAddPositionOffset]
  135868. !
  135869.  
  135870. pasteContext
  135871.     "Private - Answers the context where the object on the clipboard should be pasted."
  135872.  
  135873.     ^self composingView isNil
  135874.         ifTrue: [arena]
  135875.         ifFalse:
  135876.             [self primarySelection isNil
  135877.                 ifTrue: [self composingView]
  135878.                 ifFalse: [self primarySelection]].
  135879. !
  135880.  
  135881. pastedView: aView context: contextView
  135882.     "Private - aView has been pasted into contextView.
  135883.     Perform post-paste operations."
  135884.  
  135885.     aView show.
  135886.     contextView == arena 
  135887.         ifTrue: 
  135888.             [self composingView: aView.
  135889.             self adjustScroll]
  135890.         ifFalse: 
  135891.             [contextView validateLayout.
  135892.             viewHierarchy model add: aView asChildOf: aView parentView].
  135893.  
  135894.     "Both the context and the view under composition may need laying out"
  135895.     self forceLayoutFor: contextView.
  135896.     self selection: aView.
  135897.     self drawAdornment.
  135898.     self setModified!
  135899.  
  135900. pasteResource: aViewResourceOrResourceIdentifier context: contextView position: aPoint
  135901.     "Private - Paste aViewResourceOrResourceIdentifier into contextView at position aPoint.
  135902.     Answers the pasted View."
  135903.  
  135904.     | pastedView |
  135905.     pastedView := self basicPasteResource: aViewResourceOrResourceIdentifier
  135906.                 context: contextView.
  135907.     pastedView position: (self snapPoint: aPoint context: contextView).
  135908.     self pastedView: pastedView context: contextView.
  135909.     ^pastedView!
  135910.  
  135911. performCommand: aCommand
  135912.     "Performs aCommand on the receiver and answer the result"
  135913.  
  135914.     | result |
  135915.     self eraseAdornment.
  135916.     result := super performCommand: aCommand.
  135917.     self validateLayout.
  135918.     self drawAdornment.
  135919.     ^result
  135920. !
  135921.  
  135922. primarySelection
  135923.     "Private - Answer the primary selection or nil if there is none."
  135924.  
  135925.     ^primarySelection!
  135926.  
  135927. primarySelection: aViewOrNil
  135928.     "Private - Set the primary selection to aViewOrNil."
  135929.  
  135930.     primarySelection == aViewOrNil 
  135931.         ifFalse: 
  135932.             ["The selection has changed"
  135933.  
  135934.             "First remove event triggers for the old selection"
  135935.  
  135936.             primarySelection removeEventsTriggeredFor: self.
  135937.             primarySelection := aViewOrNil.
  135938.             primarySelection notNil 
  135939.                 ifTrue: 
  135940.                     [primarySelection 
  135941.                         when: #positionChanged:
  135942.                         send: #onSelectionPositioned:
  135943.                         to: self].
  135944.             self removeGrabbers.
  135945.             self addGrabbers.
  135946.             self resetAddPositionOffset.
  135947.             primarySelection notNil 
  135948.                 ifTrue: 
  135949.                     ["Update the viewHierarchy."
  135950.  
  135951.                     primarySelection ensureVisible.
  135952.                     viewHierarchy selection: primarySelection]]!
  135953.  
  135954. queryCommand: aCommandQuery
  135955.     "Private - Enter details about a potential command for the receiver into the 
  135956.     <CommandQuery> argument."
  135957.  
  135958.     | command |
  135959.     command := aCommandQuery commandSymbol.
  135960.  
  135961.     (#(#copySelection #cutSelection #clearSelection #mutate #toggleGroupStop #toggleTabStop) 
  135962.         identityIncludes: command) 
  135963.             ifTrue: 
  135964.                 [aCommandQuery isEnabled: self hasSelection.
  135965.                 ^true].
  135966.     #viewSave == command 
  135967.         ifTrue: 
  135968.             [aCommandQuery isEnabled: (self hasComposingView 
  135969.                         and: [self hasResource and: [resourceIdentifier canSave]]).
  135970.             ^true].
  135971.     #viewRevert == command 
  135972.         ifTrue: 
  135973.             [aCommandQuery isEnabled: (self hasComposingView and: [self hasResource]).
  135974.             ^true].
  135975.     (#(#referenceViewMenu #dereference #editReference) 
  135976.         identityIncludes: command) 
  135977.             ifTrue: 
  135978.                 [aCommandQuery isEnabled: (self primarySelection isKindOf: ReferenceView).
  135979.                 ^true].
  135980.     (#(#viewExport #viewSaveAs #viewClose #viewTest) includes: command) 
  135981.         ifTrue: 
  135982.             [aCommandQuery isEnabled: self hasComposingView.
  135983.             ^true].
  135984.     (#(#zFront #zForward #zBackward #zBack) includes: command) 
  135985.         ifTrue: 
  135986.             [aCommandQuery isEnabled: self primarySelection notNil.
  135987.             ^true].
  135988.     (#(#matchWidths #matchHeights #matchFonts #matchForegroundColors #matchBackgroundColors #alignLefts #alignMiddles #alignRights #alignTops #alignCenters #alignBottoms) 
  135989.         includes: command) 
  135990.             ifTrue: 
  135991.                 [aCommandQuery isEnabled: self selections size > 1.
  135992.                 ^true].
  135993.     command == #editMenuBar 
  135994.         ifTrue: 
  135995.             [aCommandQuery 
  135996.                 isEnabled: (self composingView class conformsToProtocol: #topView).
  135997.             ^true].
  135998.     command == #editContextMenu 
  135999.         ifTrue: 
  136000.             [aCommandQuery isEnabled: self primarySelection notNil.
  136001.             ^true].
  136002.     command == #toggleTabStop 
  136003.         ifTrue: 
  136004.             [self hasSelection 
  136005.                 ifTrue: 
  136006.                     [aCommandQuery
  136007.                         isEnabled: true;
  136008.                         isChecked: (self selections detect: [:v | v isTabStop not] ifNone: []) 
  136009.                                     isNil].
  136010.             ^true].
  136011.     command == #toggleGroupStop 
  136012.         ifTrue: 
  136013.             [self hasSelection 
  136014.                 ifTrue: 
  136015.                     [aCommandQuery
  136016.  
  136017.                         isEnabled: true;
  136018.                         isChecked: self primarySelection isGroupStop].
  136019.             ^true].
  136020.     command == #pasteClipboard 
  136021.         ifTrue: 
  136022.             [aCommandQuery isEnabled: self canPaste.
  136023.             ^true].
  136024.     ^super queryCommand: aCommandQuery!
  136025.  
  136026. refreshPublishedAspects
  136027.     inspector refresh!
  136028.  
  136029. removeGrabbers
  136030.     "Private - Destroy all the grabbers"
  136031.  
  136032.     self grabbers do: [ :each | each invalidate ].
  136033.     grabbers := nil.
  136034.  
  136035. !
  136036.  
  136037. removeView: aView
  136038.     "Removes aView from the receiver."
  136039.  
  136040.     (self selections includes: aView) ifTrue:
  136041.         [self cancelSelectionFor: aView.
  136042.         self primarySelection isNil ifTrue:
  136043.             [aView ~~ self composingView
  136044.                 ifTrue: [self selection: aView parentView]]].
  136045.  
  136046.     aView == self composingView ifTrue: [
  136047.         composingView:= nil.
  136048.         resourceIdentifier := nil.
  136049.         self isModified: false.
  136050.         self updateCaption ].
  136051.  
  136052.     viewHierarchy model remove: aView.
  136053.     aView parentView removeSubView: aView.
  136054.     self forceLayoutFor: aView parentView!
  136055.  
  136056. resetAddPositionOffset
  136057.     "Private - Resets the position offset within a parent where
  136058.     a new child view should be added. Answers the new position"
  136059.     
  136060.     ^addPositionOffset := Point new.
  136061.  
  136062. !
  136063.  
  136064. resourceIdentifier
  136065.     "Answers the ResourceIdentifier of the current view under composition"
  136066.  
  136067.     ^resourceIdentifier.!
  136068.  
  136069. resourceManager
  136070.     "Answers the instance of ResourceManager with which we are associated."
  136071.  
  136072.     ^SessionManager current resourceManager!
  136073.  
  136074. safetyWrap: aBlock
  136075.     "Private - Executes aBlock which may cause some aspect of the adornment to change.
  136076.     We wrap the block inside some safe redrawing of the adornment"
  136077.  
  136078.     aBlock value.
  136079.     self setModified.
  136080.     self updatePrimarySelection.
  136081.     self updateAdornment.
  136082.  
  136083. !
  136084.  
  136085. saveAdornmentRegion
  136086.     "Private - Make a note of the selection region in case we have to invalidate it later"
  136087.  
  136088.     adornmentRegion := self getAdornmentRegion.
  136089. !
  136090.  
  136091. secondarySelections
  136092.     "Private - Answer a collection of selected views that doesn't contain
  136093.     the primary selection"
  136094.  
  136095.     ^self selections reject: [:each | each==self primarySelection]
  136096.     !
  136097.  
  136098. selection: aView
  136099.     "Private - Sets the primary (and only selection) to be aView"
  136100.  
  136101.     "If this view is already the primary and only selection then do nothing."
  136102.     (self primarySelection == aView and: [ self selections size = 1 ]) ifTrue: [
  136103.         ^self ].
  136104.     self cancelSelections.
  136105.     self addSelectionFor: aView !
  136106.  
  136107. selections
  136108.     "Private - Answer an OrderedCollection of selections within the receiver's jurisdiction"
  136109.  
  136110.     ^selections
  136111.  
  136112. !
  136113.  
  136114. selections: anOrderedCollection
  136115.     "Private - Sets the current selections from an OrderedCollection of views
  136116.     within the receiver's jurisdiction"
  136117.  
  136118.     self cancelSelections.
  136119.     anOrderedCollection do: [:each | 
  136120.         self selections addLast: each ].
  136121.     self updatePrimarySelection!
  136122.  
  136123. setInitialFocus
  136124.     "Set focus to the class hierarchy pane so that the user can choose a class to browse."
  136125.  
  136126.     viewHierarchy setFocus
  136127. !
  136128.  
  136129. setModified
  136130.     "Private - Sets the modification flag for the receiver"
  136131.  
  136132.     self isModified: true!
  136133.  
  136134. shield
  136135.     "Private - Answer the Shield view"
  136136.  
  136137.     ^shield!
  136138.  
  136139. shieldMouseLeftDown: aMouseEvent 
  136140.     "Private - Handles mouse down event. First check to see if it is within
  136141.     any sizing grabber; if so perform the sizing operation.
  136142.     Next see if it is within a selection border or a view; if so
  136143.     drag all the selections."
  136144.  
  136145.     "Create the mouse tracker now, just in case it's needed later.
  136146.     This ensures that it tracks from the CURRENT mouse location"
  136147.  
  136148.     | position grabberHit viewHit screenPosition mouseTracker |
  136149.     screenPosition := aMouseEvent screenPosition.
  136150.     mouseTracker := MouseTracker forPresenter: self startingAt: screenPosition.
  136151.  
  136152.     "Has the mouse hit a Grabber ?"
  136153.     position := aMouseEvent position - 1.
  136154.     grabberHit := self grabberHitBy: position.
  136155.     grabberHit notNil 
  136156.         ifTrue: 
  136157.             [self trackGrabber: grabberHit from: screenPosition.
  136158.             ^nil].
  136159.  
  136160.     "Has the mouse hit a selection border ?"
  136161.     self primarySelection notNil 
  136162.         ifTrue: 
  136163.             [| region |
  136164.             region := self adornmentRegionFor: self primarySelection.
  136165.             (region containsPoint: position) ifTrue: [viewHit := self primarySelection]].
  136166.     viewHit isNil 
  136167.         ifTrue: 
  136168.             ["Has the mouse hit a view ?"
  136169.             viewHit := self viewHitBy: position.
  136170.             (viewHit isNil or: [viewHit == self arena]) 
  136171.                 ifTrue: 
  136172.                     [mouseTracker := nil.
  136173.                     viewHit := self composingView]].
  136174.     viewHit isNil ifTrue: [^nil].
  136175.     self isMouseClick: true.
  136176.     aMouseEvent isCtrlDown 
  136177.         ifTrue: 
  136178.             [(self selections includes: viewHit) ifTrue: [mouseTracker := nil].
  136179.             self toggleSelectionFor: viewHit]
  136180.         ifFalse: 
  136181.             [aMouseEvent isShiftDown 
  136182.                 ifTrue: [self addSelectionFor: viewHit]
  136183.                 ifFalse: [self primarySelection == viewHit ifFalse: [self selection: viewHit]]].
  136184.     self isMouseClick: false.
  136185.     mouseTracker notNil 
  136186.         ifTrue: 
  136187.             [mouseTracker startTracking: self.
  136188.             viewHit == composingView ifTrue: [self adjustScroll]].
  136189.     ^nil!
  136190.  
  136191. shieldPaint: aPaintEvent
  136192.     "Private - Paint the adornment for the receiver on the Shield"
  136193.  
  136194.     self drawAdornment.
  136195. !
  136196.  
  136197. showToolbox
  136198.     "Show the toolbox. Create a new one if there isn't currently one available"
  136199.     
  136200.     toolbox isNil ifTrue: [
  136201.         toolbox := Smalltalk developmentSystem resourceBrowserClass showAsToolboxFor: self arena at: self toolboxPosition.
  136202.         toolbox when: #viewClosed send: #onToolboxClosed to: self ]!
  136203.  
  136204. snapPoint: aPoint context: contextView
  136205.     "Private - Answers an instance of Point which is aPoint snapped
  136206.     to the grid. Both the argument aPoint and the answer are in the
  136207.     coordinate space of the argument contextView."
  136208.  
  136209.     ^self arena
  136210.         mapPoint: (self constrainPoint: (contextView
  136211.             mapPoint: aPoint
  136212.             to: self arena))
  136213.         to: contextView.
  136214. !
  136215.  
  136216. startTrackingAt: pointOffset
  136217.     "Private - Start selection tracking at pointOffset. Part of the <MouseTracker> 
  136218.     target protocol. Answers the actual position achieved after any  
  136219.     constraints have been applied"
  136220.  
  136221.     self eraseAdornment.
  136222.     Cursor sizeAll setCursor.
  136223.     self drawTrackingAt: pointOffset.
  136224.     ^pointOffset!
  136225.  
  136226. state
  136227.     "Answers an object which encapsulates the current state of the receiver and its composing
  136228.     view. This can be restored into the receiver by submitting it to the #state: method. In this
  136229.     implementation we answer an STB byte stream of an Array with the following format:
  136230.  
  136231.     1. The composing view
  136232.     2. An OrderedCollection of the current selections."
  136233.  
  136234.     | state stream stbOut viewProxy |
  136235.     state := Array new: 2.
  136236.     state at: 1 put: self composingView.
  136237.     state at: 2 put: self selections.
  136238.  
  136239.     stream := WriteStream with: ByteArray new.
  136240.     stbOut := STBOutFiler on: stream.
  136241.     (viewProxy := self composingView filerProxy) beTopView; beNotChild.
  136242.     stbOut
  136243.         override: self composingView with: viewProxy;
  136244.         nextPut: state.
  136245.  
  136246.     ^stream contents!
  136247.  
  136248. state: anObject
  136249.     "Sets the current contents of the receiver from the state information saved in anObject.
  136250.     The saved state was originally generated by sending #state to the receiver."
  136251.  
  136252.     | state |
  136253.     self endComposition.
  136254.     state := Object fromBinaryStoreBytes: anObject context: self arena.
  136255.     self composingView: (state at: 1).
  136256.     self selections: (state at: 2).!
  136257.  
  136258. status
  136259.     "Private - Answer the receiver's status model."
  136260.  
  136261.     ^status
  136262. !
  136263.  
  136264. toggleGroupStop
  136265.     "Toggles the WS_GROUP style of the selected items."
  136266.  
  136267.     | gs |
  136268.     gs := self primarySelection isGroupStop not.
  136269.     self selections do: [ :v | v isGroupStop: gs ].
  136270. !
  136271.  
  136272. toggleSelectionFor: aView
  136273.     "Private - Toggles the selection state for aView"
  136274.  
  136275.     (self selections includes: aView) 
  136276.         ifTrue: [ self cancelSelectionFor: aView ]
  136277.         ifFalse: [ self addSelectionFor: aView ]
  136278.  
  136279. !
  136280.  
  136281. toggleTabStop
  136282.     "Toggles the WS_TABSTOP style of the selected items."
  136283.  
  136284.     | ts |
  136285.     ts := self primarySelection isTabStop not.
  136286.     self selections do: [ :v | v isTabStop: ts ].
  136287. !
  136288.  
  136289. toolboxPosition
  136290.     "Answer the current toolbox position relative to the receiver"
  136291.  
  136292.     toolboxPosition isNil ifTrue: [ toolboxPosition := self defaultToolboxPosition ].
  136293.     ^toolboxPosition!
  136294.  
  136295. trackGrabber: aGrabber from: aScreenPoint
  136296.     "Private - Track aGrabber which has been hit with the mouse at aScreenPoint."
  136297.  
  136298.     self eraseAdornment.
  136299.     aGrabber cursor setCursor.
  136300.     aGrabber trackMouseFrom: aScreenPoint.
  136301.     (aGrabber view == composingView) ifTrue: [
  136302.         self adjustScroll ].
  136303.     self updateAdornment.
  136304.     self setModified.
  136305. !
  136306.  
  136307. updateAdornment
  136308.     "Private - Update the adornment of the current selections"
  136309.  
  136310.     self isAdornmentModified: true
  136311. !
  136312.  
  136313. updateCaption
  136314.     "Private - The receiver has changed in such a way that the caption
  136315.     may need to be refreshed."
  136316.  
  136317.     | stream |
  136318.     stream := String writeStream: 128.
  136319.     stream nextPutAll: self basicCaption.
  136320.     stream nextPutAll: ' - '.
  136321.     stream nextPutAll: (resourceIdentifier notNil
  136322.         ifTrue: [resourceIdentifier displayString]
  136323.         ifFalse: ['untitled']).
  136324.     self composingView notNil ifTrue: [
  136325.         stream 
  136326.             nextPut: $(; 
  136327.             nextPutAll: self composingView class displayString;
  136328.             nextPut: $) ].
  136329.     self caption: stream contents!
  136330.  
  136331. updatePrimarySelection
  136332.     "Private - The primary selection may have changed. Update it if necessary."
  136333.  
  136334.     | actualPrimarySelection |
  136335.     actualPrimarySelection := self selections notEmpty ifTrue: [self selections first ].
  136336.     self primarySelection: actualPrimarySelection!
  136337.  
  136338. validateLayout
  136339.     "Private - Validate the layout for the view being composed"
  136340.  
  136341.     self composingView notNil ifTrue: [
  136342.         self composingView validateLayout ]
  136343. !
  136344.  
  136345. validateUserInterface
  136346.     "Validates the user interface for the receiver. Usually performed at idle time
  136347.     when the  UI has been flagged as being invalid"
  136348.  
  136349.     | myView |
  136350.     myView := self view.
  136351.     myView validateUserInterface.
  136352.     modificationStatus value: self isModified.
  136353.     self hasComposingView ifTrue: [
  136354.         self composingView needsValidateLayout ifTrue: [
  136355.             self composingView validateLayout ]].
  136356. !
  136357.  
  136358. viewClose
  136359.     "Close the view being composed by the receiver"
  136360.  
  136361.     "Are there outstanding changes?"
  136362.  
  136363.     (self onPromptToSaveChanges: true asValue) ifFalse: [^false].
  136364.     self composingView notNil ifTrue: [self endComposition].
  136365.     resourceIdentifier := nil.
  136366.     self updateCaption.
  136367.     ^true!
  136368.  
  136369. viewExport
  136370.     "Saves the view being composed to a file selected by the user."
  136371.  
  136372.     | filename viewResource path |
  136373.     path := self hasResource ifTrue: [resourceIdentifier exportedFileName].
  136374.     filename := FileSaveDialog new
  136375.         fileTypes: #( ('View Files (*.vu)' '*.vu') );
  136376.         value: path;
  136377.         defaultExtension: '*.vu';
  136378.         showModal.
  136379.     filename isNil ifTrue: [^nil].
  136380.  
  136381.     viewResource := ViewResource inSTBFileWithName: filename.
  136382.     viewResource save: self composingView.!
  136383.  
  136384. viewHitBy: aPoint 
  136385.     "Private - Answers the view that can be hit by a mouse action at aPoint. "
  136386.  
  136387.     | viewHit |
  136388.     self primarySelection notNil 
  136389.         ifTrue: 
  136390.             [| lookInView |
  136391.             lookInView := self primarySelection.
  136392.             
  136393.             [| position |
  136394.             position := self arena mapPoint: aPoint to: lookInView.
  136395.             viewHit := lookInView subViewFromPoint: position.
  136396.             viewHit notNil] 
  136397.                     whileFalse: [lookInView := lookInView parentView]].
  136398.     ^viewHit!
  136399.  
  136400. viewImport
  136401.     "Load the ViewResource from a file selected by the user."
  136402.  
  136403.     | filename viewResource |
  136404.     filename := FileOpenDialog new
  136405.         fileTypes: #( ('View Files (*.vu)' '*.vu') );
  136406.         showModal.
  136407.     filename isNil ifTrue: [^nil].
  136408.  
  136409.     viewResource := ViewResource inSTBFileWithName: filename.
  136410.     self
  136411.         pasteResource: viewResource
  136412.         context: self pasteContext
  136413.         position: self incrementAddPositionOffset.
  136414.  
  136415.     self updateCaption!
  136416.  
  136417. viewOpen
  136418.     "Prompt for a ViewResource and open it"
  136419.  
  136420.     self viewClose 
  136421.         ifTrue: 
  136422.             [| rid viewResources |
  136423.             viewResources := SessionManager current resourceManager allResourceIdentifiers 
  136424.                         select: [:each | each resource isViewResource].
  136425.             (rid := ChoicePrompter choices: viewResources caption: 'Open') notNil 
  136426.                 ifTrue: [self openOn: rid]]!
  136427.  
  136428. viewRevert
  136429.     "Revert the contents of the receiver's document to those in the
  136430.     associated file"
  136431.  
  136432.     | rid |
  136433.     rid := resourceIdentifier.
  136434.     (MessageBox confirm: 'Are you sure you wish to revert to the previously saved copy?') ifTrue: [ 
  136435.         self endComposition; openOn: rid ].!
  136436.  
  136437. viewSave
  136438.     "Save the view as a resource."
  136439.  
  136440.     | resource |
  136441.     self hasResource ifFalse: [^self viewSaveAs].
  136442.     resource := ViewResource defaultWritable.
  136443.     "We must save the view before inserting into the resource manager so that any observers of
  136444.      the resource manager see the saved view rather than an old or empty copy"
  136445.     resource save: self composingView.
  136446.     self resourceManager resourceAt: resourceIdentifier put: resource.
  136447.  
  136448.     "Log to the change log so the change can be restored if necessary"
  136449.     SourceManager default logChanged: resourceIdentifier.
  136450.     self isModified: false!
  136451.  
  136452. viewSaveAs
  136453.     "Saves the current view to its Resource."
  136454.  
  136455.     | rid res |
  136456.     resourceIdentifier isNil 
  136457.         ifTrue: [rid := ResourceIdentifier class: Presenter name: Presenter defaultView]
  136458.         ifFalse: 
  136459.             [rid := resourceIdentifier copy.
  136460.             rid name isNil ifTrue: [rid name: Presenter defaultView]].
  136461.     (rid := rid prompt) isNil ifTrue: [^false].
  136462.     (res := rid resourceOrNil) notNil 
  136463.         ifTrue: 
  136464.             [| message |
  136465.             message := '%1 is an existing %2. Do you wish to replace it?' 
  136466.                         formatWith: rid displayString
  136467.                         with: res class name asString.
  136468.             (MessageBox confirm: message) ifFalse: [^false]].
  136469.     resourceIdentifier := rid.
  136470.     self
  136471.         updateCaption;
  136472.         fileSave!
  136473.  
  136474. viewTest
  136475.     "Load the resource (being edited by the ViewComposer) in a test mode."
  136476.  
  136477.     | testView parentView |
  136478.     parentView := (self composingView isKindOf: ShellView) 
  136479.                 ifTrue: [View desktop]
  136480.                 ifFalse: 
  136481.                     [(ShellView show)
  136482.                         layoutManager: GridLayout new;
  136483.                         yourself].
  136484.     testView := (ViewResource inSTBByteArray)
  136485.                 save: self composingView;
  136486.                 loadWithContext: parentView.
  136487.     testView show!
  136488.  
  136489. zBack
  136490.     "Send the primary selection to the back of the Z-order."
  136491.  
  136492.     | editee |
  136493.     editee := self primarySelection.
  136494.     editee zOrderBottom.
  136495.     self zOrderChangedFor:  editee.
  136496. !
  136497.  
  136498. zBackward
  136499.     "Move the primary selection down one place in the Z-order."
  136500.  
  136501.     | nextSibling editee |
  136502.     editee := self primarySelection.
  136503.     nextSibling := editee nextSiblingView.
  136504.     nextSibling notNil ifTrue:
  136505.         [editee zOrderAfter: nextSibling].
  136506.     self zOrderChangedFor:  editee.
  136507. !
  136508.  
  136509. zForward
  136510.     "Move the primary selection up one place in the Z-order."
  136511.  
  136512.     | sibling editee |
  136513.  
  136514.     "We can only Zposition a view AFTER a specified sibling.
  136515.     So, locate the sibling two places in front and Zposition
  136516.     the receiver after it."
  136517.     editee := self primarySelection.
  136518.     sibling := editee previousSiblingView.
  136519.     sibling notNil ifTrue:
  136520.         [sibling := sibling previousSiblingView.
  136521.         sibling notNil ifTrue:
  136522.             [editee zOrderAfter: sibling]].
  136523.  
  136524.     sibling isNil ifTrue:
  136525.         [editee zOrderTop].
  136526.  
  136527.     self zOrderChangedFor:  editee!
  136528.  
  136529. zFront
  136530.     "Bring the primary selection to the front of the Z-order."
  136531.  
  136532.     | editee |
  136533.     editee := self primarySelection.
  136534.     editee zOrderTop.
  136535.     self zOrderChangedFor:  editee.
  136536. !
  136537.  
  136538. zOrderChangedFor: aView
  136539.     "Private - The ZOrder position of aView has been changed. Inform the 
  136540.     view hierarchy model so that its views update appropriately"
  136541.  
  136542.     viewHierarchy model move: aView asChildOf: (viewHierarchy model parentOf: aView).
  136543. ! !
  136544.  
  136545. ClassBrowserShell comment:
  136546. 'ClassBrowserShell is a <SmalltalkToolShell> implementing the Class Hierarchy Browser development tool.
  136547.  
  136548. ClassBrowserShell has two views:
  136549.  
  136550. 1. ''Default view'' which is the standard view and is aware of new features such as method protocols. It can also filter methods by the instance variables they reference. It has dynamic menus for browsing references and definitions and certain other useful features.
  136551.  
  136552. 2. ''Basic class browser'' which is similar to the pre-3.0 CHB (but supporting history buttons). If you have a slow machine, or one with limited screen area (e.g. 640x480), you may want to use this browser. It can be started from an icon in the Additional Tools folder or from the Tools menu.
  136553.  
  136554. [ClassBrowserShell formerly had a ''Moening class browser'' view, which was the same as the ''Default view'', but with the standard Windows <TreeView> control replaced by a <MoenTreeView>. This has been superceded by the Class Diagram plugin]
  136555.  
  136556. Note that this is a rather good example of the flexibility of MVP. All views are supported by the same <presenter> class, with very little conditional code (what little there is is required for the Basic class browser because it does not have all of the sub-views present in the other two browsers). Another interesting property of the CHB is that it shares the <MethodBrowser> presenter with the <MethodBrowserShell>, and yet you will note that the CHB interpretation of this view is quite a different shape.
  136557.  
  136558. Instance Variables:
  136559.     None.
  136560.  
  136561. Class Variables:
  136562.     LocalHierarchyMask        <integer> mask flag for the local hierarchy mode.
  136563. '!
  136564. !ClassBrowserShell class methodsFor!
  136565.  
  136566. displayOn: aStream
  136567.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  136568.     would want to see it."
  136569.  
  136570.     aStream nextPutAll: 'Class Browser'!
  136571.  
  136572. icon
  136573.     "Answers an Icon that can be used to represent this class"
  136574.  
  136575.     ^##(self) defaultIcon!
  136576.  
  136577. initialize
  136578.     "Private - Initialize the receiver's class variables.
  136579.         self initialize
  136580.     "
  136581.  
  136582.     LocalHierarchyMask := 16r10.
  136583.  
  136584.     self defaultShowInheritedMethods: false.
  136585.     self defaultFilterObjectMethods: false.
  136586.  
  136587.     (Smalltalk developmentSystem)
  136588.         addSystemFolderIcon: self toolsFolderIcon;
  136589.         registerTool: self;
  136590.         addAdditionalToolsFolderIcon: (SmalltalkSystemIcon 
  136591.                     icon: self icon
  136592.                     description: 'Simple Class Browser'
  136593.                     openBlock: 
  136594.                         [:folder :item | 
  136595.                         self show: 'Basic class browser'.
  136596.                         folder := item := nil])!
  136597.  
  136598. uninitialize
  136599.     "Private - Uninitialize the receiver prior to remove from the system.
  136600.         self uninitialize
  136601.     "
  136602.  
  136603.     Smalltalk developmentSystem
  136604.         removeSystemFolderIconNamed: self toolDescription;
  136605.         removeSystemFolderIconNamed: 'Simple Class Browser';
  136606.         removeSystemFolderIconNamed: 'Moen Tree Browser';
  136607.         unregisterTool: self! !
  136608.  
  136609. !ClassBrowserShell methodsFor!
  136610.  
  136611. createComponents
  136612.     "Create the presenters contained by the receiver"
  136613.  
  136614.     super createComponents.
  136615.     classesPresenter := self add: ClassHierarchySelector new name: 'classes'.
  136616. !
  136617.  
  136618. displayLocalHierarchyOf: class
  136619.     "Private - Update the receiver to display only the local hierarchy of the <ClassDescription>, class."
  136620.  
  136621.     | instClass |
  136622.     instClass := class instanceClass.
  136623.     classesPresenter
  136624.         model: (ClassHierarchyModel withAllClasses    
  136625.                 filter: [:x | (instClass allSuperclasses includes: x) or: [instClass withAllSubclasses includes: x]]).
  136626. !
  136627.  
  136628. isLocalHierarchyMode
  136629.     "Private - Answer whether the receiver is in 'local hierarchy' mode displaying a subset of the entire
  136630.     class hierarchy."
  136631.  
  136632.     ^flags allMask: LocalHierarchyMask!
  136633.  
  136634. onTipTextRequired: tool
  136635.     "Tool tip text is required for the <ToolbarItem>, tool."
  136636.  
  136637.     | cmd |
  136638.     cmd := tool command asSymbol.
  136639.     cmd == #toggleLocalHierarchy ifTrue: [
  136640.         ^(self isLocalHierarchyMode 
  136641.                 ifTrue: ['Browse entire hierarchy']
  136642.                 ifFalse: ['Browse local hierarchy of ', self selectedClass name])].
  136643.     ^super onTipTextRequired: tool!
  136644.  
  136645. queryCommand: aCommandQuery 
  136646.     "Private - Enter details about a potential command for the receiver 
  136647.     into the <CommandQuery>."
  136648.  
  136649.     | cmd |
  136650.     cmd := aCommandQuery commandSymbol.
  136651.     #toggleLocalHierarchy == cmd 
  136652.         ifTrue: 
  136653.             [self isLocalHierarchyMode 
  136654.                 ifTrue: 
  136655.                     [aCommandQuery
  136656.                         isEnabled: true;
  136657.                         isChecked: true]
  136658.                 ifFalse: 
  136659.                     [aCommandQuery
  136660.                         isEnabled: (self hasClassSelected and: [self actualClass superclass notNil]);
  136661.                         isChecked: false].
  136662.             ^true].
  136663.     ^super queryCommand: aCommandQuery!
  136664.  
  136665. resetFor: aClass 
  136666.     "Reset the receiver to place it into a state required to display aClass"
  136667.  
  136668.     (self isLocalHierarchyMode 
  136669.         and: [(classesPresenter model filter value: aClass instanceClass) not]) 
  136670.             ifTrue: [self displayLocalHierarchyOf: aClass]!
  136671.  
  136672. toggleLocalHierarchy
  136673.     "Toggle between the entire hierarchy and showing only the current class and its subclasses."
  136674.  
  136675.     | instClass actualClass |
  136676.     self promptToSaveChanges ifFalse: [^self].
  136677.  
  136678.     "Use the selected class rather than the actual class, so always follows instance hierarchy"
  136679.     instClass := self selectedClass.
  136680.     actualClass := self actualClass.
  136681.     flags := flags mask: LocalHierarchyMask set: self isLocalHierarchyMode not.
  136682.     self isLocalHierarchyMode 
  136683.         ifTrue: 
  136684.             ["Toggle into local hierarchy mode"
  136685.  
  136686.             self displayLocalHierarchyOf: instClass.
  136687.             self actualClass: actualClass]
  136688.         ifFalse: 
  136689.             ["Toggle out of local hierarchy mode..."
  136690.  
  136691.             classesPresenter model: self model classHierarchy.
  136692.             actualClass notNil ifTrue: [self actualClass: actualClass]].
  136693.     self validateUserInterface! !
  136694.  
  136695. SUnitBrowser comment:
  136696. ''!
  136697. !SUnitBrowser class methodsFor!
  136698.  
  136699. defaultModel
  136700.  
  136701.     ^self defaultModelClass
  136702.         newForUI: nil
  136703.         builder: TestCase!
  136704.  
  136705. defaultModelClass
  136706.  
  136707.     ^SUnitBrowserModel!
  136708.  
  136709. displayOn: aStream
  136710.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  136711.     would want to see it."
  136712.  
  136713.     aStream nextPutAll: 'SUnit Browser'!
  136714.  
  136715. initialize
  136716.  
  136717.     self initializeToolClass: self!
  136718.  
  136719. openOnTestCase: aTestCase
  136720.     | model reuseInstance |
  136721.     model := SUnitBrowserModel newForUI: nil builder: aTestCase.
  136722.     self reuseIfOpen ifFalse: [^self showOn: model].
  136723.     reuseInstance := self showExistingInstance.
  136724.     ^reuseInstance isNil 
  136725.         ifTrue: [self showOn: model]
  136726.         ifFalse: 
  136727.             [reuseInstance
  136728.                 model: model;
  136729.                 yourself]!
  136730.  
  136731. publishedAspects
  136732.     "Answer a Set of the aspects published by  instances of the receiver"
  136733.  
  136734.     | aspects |
  136735.     aspects := super publishedAspects.
  136736.     aspects 
  136737.         add: (Aspect boolean: #showAll);
  136738.         add: (Aspect boolean: #showStatusBackgroundColors).
  136739.  
  136740.     ^aspects!
  136741.  
  136742. showAll
  136743.  
  136744.     ^self defaultModelClass showAll!
  136745.  
  136746. showAll: aBoolean
  136747.  
  136748.     ^self  defaultModelClass showAll: aBoolean!
  136749.  
  136750. showStatusBackgroundColors
  136751.  
  136752.     ^self  defaultModelClass showStatusBackgroundColors!
  136753.  
  136754. showStatusBackgroundColors: aBoolean
  136755.  
  136756.     ^self defaultModelClass showStatusBackgroundColors: aBoolean!
  136757.  
  136758. sunitbShow: aTestCase
  136759.  
  136760.     ^self openOnTestCase: aTestCase!
  136761.  
  136762. sunitbShowAndRun: aTestCase
  136763.  
  136764.     (self openOnTestCase: aTestCase) runAll!
  136765.  
  136766. uninitialize
  136767.     "Private - Uninitialize the receiver as it is about to be removed from the system.
  136768.     Un-register the system tools folder icon for the receiver.
  136769.     Note: This method is in the 'must strip' category so that it is removed in the early
  136770.     stages of image stripping. It is not required during stripping, because the system
  136771.     folders are cleared down anyway, and it may generate an error if required parts
  136772.     of the development system have already been removed."
  136773.  
  136774.     self uninitializeToolClass: self! !
  136775.  
  136776. !SUnitBrowser methodsFor!
  136777.  
  136778. browseHierarchy
  136779.     | currentClass compiledMethod |
  136780.  
  136781.     self model selectedItem canBrowse
  136782.         ifFalse: [^self].
  136783.  
  136784.     currentClass := self model selectedItem class.
  136785.  
  136786.     compiledMethod := currentClass definitionOf: self model selectedItem selector.
  136787.  
  136788.     compiledMethod isNil 
  136789.         ifTrue: [^self].
  136790.  
  136791.     compiledMethod browse
  136792.      !
  136793.  
  136794. browseResources
  136795.  
  136796.     SUnitResourceBrowser show!
  136797.  
  136798. browserName
  136799.  
  136800.     ^'SUnit Browser'!
  136801.  
  136802. callbackResetResults: aCollection
  136803.  
  136804.     self 
  136805.         refreshList:  aCollection;
  136806.         setDetailState!
  136807.  
  136808. callbackResetRunningStatus
  136809.  
  136810.     self setLabelState!
  136811.  
  136812. callbackSetRunningStatus: aString
  136813.  
  136814.     self setRunningLabel: aString.
  136815.     self setStatusColorsOn: self label!
  136816.  
  136817. callbackToggledShowAll
  136818.  
  136819.     self setShowAllLabel!
  136820.  
  136821. callbackToggledShowBackgroundColors
  136822.  
  136823.     self refreshList!
  136824.  
  136825. callbackToggledShowIcons
  136826.  
  136827.     self refreshList!
  136828.  
  136829. callbackToggledShowStatusBackgroundColors
  136830.  
  136831.     self setResultDisplay!
  136832.  
  136833. callbackToggledShowToolbar
  136834.  
  136835.     self setToolbarState!
  136836.  
  136837. callbackToggledUseDisplayNames
  136838.  
  136839.     super callbackToggledUseDisplayNames.
  136840.     self refreshTestCaseList!
  136841.  
  136842. callbackUpdateTestCaseStatus: aTestCase withResult: aTestResult
  136843.  
  136844.     self setDetailState. 
  136845.  
  136846.     (self model showAll or: [aTestResult hasPassed not])
  136847.         ifTrue: [ | index |
  136848.             index := 
  136849.                 self listModel 
  136850.                     findFirst: [ :each | 
  136851.                         each 
  136852.                             isFor: aTestCase
  136853.                             withResult: aTestResult].
  136854.              index > 0 ifTrue: [
  136855.                 self listModel updateAtIndex: index.
  136856.                 self listPresenter view ensureVisible: index].
  136857.             self refreshTestCaseList: aTestCase].
  136858.  
  136859.     self view update!
  136860.  
  136861. createComponents
  136862.     "Create the presenters contained by the receiver. At this stage
  136863.     the receiver has not yet been initialized."
  136864.  
  136865.     super createComponents.
  136866.  
  136867.     self testCaseListPresenter: (
  136868.         self 
  136869.             add: ListPresenter new 
  136870.             name: 'testCaseList').
  136871.  
  136872.     self showAllTextPresenter: (
  136873.         self 
  136874.             add: TextPresenter new 
  136875.             name: 'showAll')!
  136876.  
  136877. createSchematicWiring
  136878.     "Create the trigger wiring for the receiver. At this stage the initialization
  136879.     is complete and the view is open"
  136880.  
  136881.     super createSchematicWiring.
  136882.  
  136883.     self testCaseListPresenter
  136884.         when: #selectionChanged 
  136885.             send: #setModelWithSelectedTestCases
  136886.             to: self;
  136887.         when: #actionPerformed
  136888.             send: #browseHierarchy
  136889.             to: self!
  136890.  
  136891. debug
  136892.  
  136893.     self model debugSelected!
  136894.  
  136895. inspectSelected
  136896.  
  136897.     self model inspectSelected!
  136898.  
  136899. model: anSUnitBrowserModel
  136900.     "Set the model of the receiver to be anObject"
  136901.  
  136902.     | allTests |
  136903.  
  136904.     super model: anSUnitBrowserModel.
  136905.     anSUnitBrowserModel browser: self.
  136906.  
  136907.     self listModel: (ListModel on: self wrapAllTestsFromModel).
  136908.     listPresenter model: self listModel.
  136909.  
  136910.     self testCaseListModel: (ListModel on: OrderedCollection new).
  136911.     testCaseListPresenter model: self testCaseListModel.
  136912.  
  136913.     self 
  136914.         setShowAllLabel;
  136915.         setResultDisplay!
  136916.  
  136917. queryCommand: aCommandQuery
  136918.     "Enters details about a potential command for the receiver into aCommandQuery"
  136919.  
  136920.     super queryCommand: aCommandQuery.
  136921.  
  136922.     (aCommandQuery command = #runSelected)
  136923.          ifTrue: [^aCommandQuery isEnabled: self model canRun].
  136924.  
  136925.     (aCommandQuery command = #debug)
  136926.          ifTrue: [^aCommandQuery isEnabled: self model canDebug].
  136927.  
  136928.     (aCommandQuery command = #step)
  136929.          ifTrue: [^aCommandQuery isEnabled: self model canAnalyze].
  136930.  
  136931.     (aCommandQuery command = #inspect)
  136932.          ifTrue: [^aCommandQuery isEnabled: self model canInspect].
  136933.  
  136934.     (aCommandQuery command = #showAll)
  136935.          ifTrue: [^aCommandQuery isChecked: self model showAll].
  136936.  
  136937.     (aCommandQuery command = #showStatusPaneBackgroundColors)
  136938.          ifTrue: [^aCommandQuery isChecked: self model showStatusBackgroundColors].
  136939.  
  136940.     (aCommandQuery command = #browseHierarchy)
  136941.          ifTrue: [aCommandQuery isEnabled: self model isOneBrowsableItemSelected]
  136942. !
  136943.  
  136944. refreshTestCaseItemAtIndex: anIndex
  136945.  
  136946.     self testCaseListModel updateAtIndex: anIndex.
  136947.     self testCaseListPresenter view ensureVisible: anIndex!
  136948.  
  136949. refreshTestCaseList
  136950.  
  136951.     1 
  136952.         to: self testCaseListModel size 
  136953.         do: [:index | self refreshTestCaseItemAtIndex: index].
  136954.  
  136955.     self view update !
  136956.  
  136957. refreshTestCaseList: aTestCase
  136958.  
  136959.     | index |
  136960.  
  136961.     index := self testCaseIndexOf: aTestCase.
  136962.     index = 0 
  136963.         ifTrue: [^self].
  136964.  
  136965.     self refreshTestCaseItemAtIndex: index!
  136966.  
  136967. remove
  136968.  
  136969.     self model removeSelectedInList!
  136970.  
  136971. resetListFromModel
  136972.  
  136973.     self listModel 
  136974.         removeAll; 
  136975.         addAll: self wrapAllTestsFromModel.
  136976.  
  136977.     self model selectItems: #().
  136978.  
  136979.     self resetTestCaseListFromModel
  136980.  
  136981.  
  136982. !
  136983.  
  136984. resetTestCaseListFromModel
  136985.  
  136986.     self testCaseListModel 
  136987.         removeAll; 
  136988.         addAll: self wrapAllSelectedTestsFromModel
  136989.  
  136990.  
  136991. !
  136992.  
  136993. runAll
  136994.  
  136995.     self model runAll!
  136996.  
  136997. runSelected
  136998.  
  136999.     self model runSelected!
  137000.  
  137001. setLabelState
  137002.  
  137003.     self labelTextPresenter value: self model resultStateString.
  137004.     self setStatusColorsOn: self label
  137005. !
  137006.  
  137007. setModelWithSelectedItems
  137008.  
  137009.     | testCase wrappedTestCases |
  137010.  
  137011.     self model selectItems: (self listPresenter selection asOrderedCollection collect: [:eachWrapper | eachWrapper testCase]).
  137012.  
  137013.     self resetTestCaseListFromModel
  137014.  
  137015. "    wrappedTestCases :=  OrderedCollection new.
  137016.  
  137017.     self model selectedItems do: [:eachSuite |
  137018.         wrappedTestCases addAll: (
  137019.             eachSuite allTests collect: [:each | SUnitTestCaseWrapper newOn: each model: self model])].
  137020.  
  137021.     self testCaseListModel 
  137022.         removeAll; 
  137023.         addAll: wrappedTestCases "!
  137024.  
  137025. setModelWithSelectedTestCases
  137026.  
  137027.     self model selectItems: (self testCaseListPresenter selection asOrderedCollection collect: [:each | each testCase])
  137028. !
  137029.  
  137030. setRunningLabel: aString
  137031.  
  137032.     self labelTextPresenter value: aString!
  137033.  
  137034. setShowAllLabel
  137035.  
  137036.     self showAllTextPresenter value: self model showAllLabel.!
  137037.  
  137038. setToolbarState!
  137039.  
  137040. showAll
  137041.  
  137042.     self model toggleShowAll.
  137043.     self setModelWithSelectedItems
  137044. !
  137045.  
  137046. showAllTextPresenter
  137047.     "Private - Answer the value of the receiver's ''showAllTextPresenter'' instance variable."
  137048.  
  137049.     ^showAllTextPresenter!
  137050.  
  137051. showAllTextPresenter: anObject
  137052.     "Private - Set the value of the receiver's ''showAllTextPresenter'' instance variable to the argument, anObject."
  137053.  
  137054.     showAllTextPresenter := anObject!
  137055.  
  137056. showBackgroundColors!
  137057.  
  137058. showIcons!
  137059.  
  137060. showStatusPaneBackgroundColors
  137061.  
  137062.     self model toggleShowStatusBackgroundColors!
  137063.  
  137064. showToolBar!
  137065.  
  137066. step
  137067.  
  137068.     self model stepSelected!
  137069.  
  137070. testCaseIndexOf: aTestCase
  137071.  
  137072.     | index |
  137073.  
  137074.     index := 0.
  137075.  
  137076.     self testCaseListModel do: [:each | 
  137077.         index := index + 1. 
  137078.         each testCase = aTestCase 
  137079.             ifTrue: [^index]].
  137080.  
  137081.     ^0
  137082. !
  137083.  
  137084. testCaseListModel
  137085.     "Private - Answer the value of the receiver's ''testCaseListModel'' instance variable."
  137086.  
  137087.     ^testCaseListModel!
  137088.  
  137089. testCaseListModel: anObject
  137090.     "Private - Set the value of the receiver's ''testCaseListModel'' instance variable to the argument, anObject."
  137091.  
  137092.     testCaseListModel := anObject!
  137093.  
  137094. testCaseListPresenter
  137095.     "Private - Answer the value of the receiver's ''testCaseListPresenter'' instance variable."
  137096.  
  137097.     ^testCaseListPresenter!
  137098.  
  137099. testCaseListPresenter: anObject
  137100.     "Private - Set the value of the receiver's ''testCaseListPresenter'' instance variable to the argument, anObject."
  137101.  
  137102.     testCaseListPresenter := anObject!
  137103.  
  137104. wrapAllSelectedTestsFromModel
  137105.  
  137106.     | items |
  137107.  
  137108.     self model selectedItems isEmpty
  137109.         ifTrue: [^#()].
  137110.  
  137111.     items := OrderedCollection new.
  137112.  
  137113.     self model selectedItems do: [:each | items addAll: each allTests].
  137114.  
  137115.     self model showAll
  137116.         ifFalse: [
  137117.             items := 
  137118.                 items select: [:each | 
  137119.                     (self model numberCorrectFor: each) = 0]].
  137120.  
  137121.     ^self wrapAllTests: items !
  137122.  
  137123. wrapAllTests: testCases
  137124.  
  137125.     | allTests |
  137126.  
  137127.     allTests :=  OrderedCollection new.
  137128.  
  137129. "    testCases do: [:each | allTests addAll: each allTests]."
  137130.     testCases do: [:each | allTests add: each].
  137131.     ^allTests collect: [:each | SUnitTestCaseWrapper newOn: each model: self model].
  137132. !
  137133.  
  137134. wrapAllTestsFromModel
  137135.  
  137136.     ^self wrapAllTests: self model listItems! !
  137137.  
  137138. SUnitResourceBrowser comment:
  137139. ''!
  137140. !SUnitResourceBrowser class methodsFor!
  137141.  
  137142. defaultModel
  137143.  
  137144.     ^self defaultModelClass
  137145.         newForUI: nil
  137146.         builder: TestResource!
  137147.  
  137148. defaultModelClass
  137149.  
  137150.     ^SUnitResourceBrowserModel!
  137151.  
  137152. displayOn: aStream
  137153.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  137154.     would want to see it."
  137155.  
  137156.     aStream nextPutAll: 'SUnit Resource Browser'!
  137157.  
  137158. initialize
  137159.  
  137160.     self initializeToolClass: self!
  137161.  
  137162. openOnTestResource: aTestResource
  137163.  
  137164.     | model |
  137165.  
  137166.     model :=
  137167.         SUnitResourceBrowserModel
  137168.             newForUI: nil
  137169.             builder: aTestResource.
  137170.  
  137171.     self showOn: model !
  137172.  
  137173. uninitialize
  137174.     "Private - Uninitialize the receiver as it is about to be removed from the system.
  137175.     Un-register the system tools folder icon for the receiver.
  137176.     Note: This method is in the 'must strip' category so that it is removed in the early
  137177.     stages of image stripping. It is not required during stripping, because the system
  137178.     folders are cleared down anyway, and it may generate an error if required parts
  137179.     of the development system have already been removed."
  137180.  
  137181.     self uninitializeToolClass: self! !
  137182.  
  137183. !SUnitResourceBrowser methodsFor!
  137184.  
  137185. browserName
  137186.  
  137187.     ^'SUnit Resource Browser'
  137188. !
  137189.  
  137190. browseTestCases
  137191.  
  137192.     SUnitBrowser show!
  137193.  
  137194. callbackStartedTestResource: aTestResource
  137195.  
  137196.     self 
  137197.         refreshList; 
  137198.         setDetailState!
  137199.  
  137200. callbackStoppedTestResource: anTestResource 
  137201.  
  137202.     self 
  137203.         refreshList; 
  137204.         setDetailState!
  137205.  
  137206. model: anSUnitResourceBrowserModel
  137207.     "Set the model of the receiver to be anObject"
  137208.  
  137209.     | allTests |
  137210.  
  137211.     super model: anSUnitResourceBrowserModel.
  137212.     anSUnitResourceBrowserModel browser: self.
  137213.  
  137214.     self listModel: (ListModel on: self wrapAllTestResourcesFromModel).
  137215.     listPresenter model: self listModel.
  137216.  
  137217.     self setResultDisplay!
  137218.  
  137219. queryCommand: aCommandQuery
  137220.     "Enters details about a potential command for the receiver into aCommandQuery"
  137221.  
  137222.     super queryCommand: aCommandQuery.
  137223.  
  137224.     (aCommandQuery command = #startAll)
  137225.          ifTrue: [^aCommandQuery isEnabled: self model canStartAll].
  137226.  
  137227.     (aCommandQuery command = #stopAll)
  137228.          ifTrue: [^aCommandQuery isEnabled: self model canStopAll].
  137229.  
  137230.     (aCommandQuery command = #startSelected)
  137231.          ifTrue: [^aCommandQuery isEnabled: self model canStart].
  137232.  
  137233.     (aCommandQuery command = #stopSelected)
  137234.          ifTrue: [^aCommandQuery isEnabled: self model canStop].
  137235.  
  137236.     (aCommandQuery command = #showStatusPaneBackgroundColors)
  137237.          ifTrue: [aCommandQuery isChecked: self model showStatusBackgroundColors]!
  137238.  
  137239. resetListFromModel
  137240.  
  137241.     self listModel 
  137242.         removeAll; 
  137243.         addAll: self wrapAllTestResourcesFromModel
  137244.  
  137245.  
  137246. !
  137247.  
  137248. setLabelState
  137249. !
  137250.  
  137251. setModelWithSelectedItems
  137252.  
  137253.     self model selectItems: (self listPresenter selection asOrderedCollection collect: [:each | each testResource])
  137254. !
  137255.  
  137256. startAll
  137257.  
  137258.     self model startAll!
  137259.  
  137260. startSelected
  137261.  
  137262.     self model startSelected!
  137263.  
  137264. stopAll
  137265.  
  137266.     self model stopAll!
  137267.  
  137268. stopSelected
  137269.  
  137270.     self model stopSelected!
  137271.  
  137272. wrapAllTestResourcesFromModel
  137273.  
  137274.     ^self model listItems collect: [:each | SUnitTestResourceWrapper newOn: each model: self model].
  137275. ! !
  137276.  
  137277. ValueWorkspace comment:
  137278. 'ValueWorkspace is a <valuePresenter> for displaying the contents of a <valueModel> using a <TextEdit> workspace view. ValueWorkspace allows Smalltalk expressions to be entered and, when Accepted,  the result of the evaluation is stored back to the model. ValueWorkspace is used as a fundamental part of the PublishedAspectInspector.
  137279.  
  137280. Note that this is a somewhat unusual MVP triad; the ValueWorkspace model is not connected directly to the view. Instead, the view is redirected (via #viewModel) to another model that holds the textual rendition of the actual model.
  137281.  
  137282. Instance Variables:
  137283.     textModel        <ValueHolder> holding the textual rendition of the model''s value.
  137284.  
  137285. '!
  137286. !ValueWorkspace class methodsFor!
  137287.  
  137288. defaultModel
  137289.     "Answer a default model to be assigned to the receiver when it
  137290.     is initialized."
  137291.  
  137292.     ^nil asValue!
  137293.  
  137294. initialize
  137295.     "Private - Initialize the receiver's class variables.
  137296.         self initialize
  137297.     "
  137298.  
  137299.     ValueIsSelfCookie := Object new! !
  137300.  
  137301. !ValueWorkspace methodsFor!
  137302.  
  137303. accept
  137304.     "Accept changes to the receiver by evaluating it, and setting the result into
  137305.     the associated model. If there is no selection, then the entire contents of the
  137306.     workspace are accepted."
  137307.  
  137308.     self view hasSelection ifFalse: [self view selectAll].
  137309.     self value: (self evaluateItIfFail: [^self])!
  137310.  
  137311. displayValue
  137312.     | value |
  137313.     value := self value.
  137314.     ^[value printString] on: Error
  137315.         do: 
  137316.             [:ex | 
  137317.             self unableToDisplayVariableErrorFormatString 
  137318.                 formatWith: 'self'
  137319.                 with: value class name
  137320.                 with: ex description]!
  137321.  
  137322. evaluationContext
  137323.     "Answers the evaluation context for this workspace which is in fact
  137324.     the model's value"
  137325.  
  137326.     | ctx |
  137327.     ctx := super evaluationContext.
  137328.     ^ctx == ValueIsSelfCookie
  137329.         ifTrue: [self value]
  137330.         ifFalse: [ctx]
  137331.         !
  137332.  
  137333. initialize
  137334.     "Private - Initialize the receiver's instance variables."
  137335.  
  137336.     super initialize.
  137337.     textModel := String new asValue.
  137338.     self evaluationContext: ValueIsSelfCookie!
  137339.  
  137340. model: aValueModel
  137341.     "Set the model of the receiver to be a value model on anObject."
  137342.  
  137343.     super model: aValueModel.
  137344.     aValueModel when: #valueChanged send: #onValueChanged to: self.
  137345.     self onValueChanged!
  137346.  
  137347. onValueChanged
  137348.     "The receiver's model has changed. Transfer the text representation of the new value
  137349.     to the textModel"
  137350.  
  137351.     textModel value: self displayValue!
  137352.  
  137353. queryCommand: query
  137354.     "Private - Enters details about a potential command for the receiver into the 
  137355.     <CommandQuery>,  query."
  137356.  
  137357.     | cmd |
  137358.     cmd := query commandSymbol.
  137359.  
  137360.     cmd == #accept ifTrue: [
  137361.         query isEnabled: self model canSet.
  137362.         ^true].
  137363.  
  137364.     ^super queryCommand: query!
  137365.  
  137366. unableToDisplayVariableErrorFormatString
  137367.     "Private - Answer the format string used to construct the error message text to be
  137368.     displayed in place of a variable value when a variable is selected that cannot be
  137369.     printed."
  137370.  
  137371.     ^'an invalid %2 [%3]%n%nEvaluate the following expression to debug:%n%tself printString'
  137372. !
  137373.  
  137374. value
  137375.     "Answer the model value of the receiver. 
  137376.     Any view changes may first need to be flushed"
  137377.  
  137378.     self view notNil ifTrue: [ self view updateModel ].
  137379.     ^self model value!
  137380.  
  137381. value: anObject
  137382.     "Set the model value of the receiver to be anObject"
  137383.  
  137384.     self model value: anObject.
  137385. !
  137386.  
  137387. viewModel
  137388.     "Private - Answer the model that is to be connected to the view. It is actually
  137389.     connected to the receiver's textModel - not the receiver's value model"
  137390.  
  137391.     ^textModel! !
  137392.  
  137393. AcceleratorPresenter comment:
  137394. 'AcceleratorPresenter is a <valuePresenter> that displays a <valueModel> onto an <integer> key code that represening an accelerator key depression. Normally, an AcceleratorPresenter is connected to a <HotKey> view.'!
  137395. !AcceleratorPresenter class methodsFor!
  137396.  
  137397. defaultModel
  137398.     "Answer a default model to be assigned to the receiver when it
  137399.     is initialized."
  137400.  
  137401.     ^0 asValue!
  137402.  
  137403. icon
  137404.     "Answers an Icon that can be used to represent this class"
  137405.  
  137406.     ^##(self) defaultIcon! !
  137407.  
  137408. BasicInspector comment:
  137409. 'BasicInspector is a <compositePresenter> that implements a generic inspect facility onto any <Object>.
  137410.  
  137411. Example:
  137412. SmalltalkSystem current basicInspect
  137413.  
  137414. Instance Variables:
  137415.     variableNamesPresenter    <ListPresenter> presenting the instance variables of the inspected object.
  137416.     sourcePresenter        <SmalltalkWorkspace> for displaying the selected variable values.
  137417.  
  137418.  
  137419. '!
  137420. !BasicInspector class methodsFor!
  137421.  
  137422. headerList
  137423.     "Answer an OrderedCollection of associations between prefix attributes and selectors
  137424.     to be sent to instances of the receiver to access those attributes."
  137425.  
  137426.     ^##(OrderedCollection with: 'self' -> #selfField)
  137427. !
  137428.  
  137429. icon
  137430.     "Answers an Icon that can be used to represent this class"
  137431.  
  137432.     ^##(self) defaultIcon!
  137433.  
  137434. publishedEventsOfInstances
  137435.     "Answer a Set of Symbols that describe the published events triggered
  137436.     by instances of the receiver."
  137437.  
  137438.     ^super publishedEventsOfInstances
  137439.         add: #inspecteeChanged;
  137440.         yourself.
  137441. !
  137442.  
  137443. shellOn: anObject
  137444.     "Open an Inspector shell displaying on anObject. 
  137445.     Answer the new Inspector."
  137446.  
  137447.     | inspector shell |
  137448.     shell := InspectorShell create.
  137449.     shell caption:  self displayString , ' on ',  anObject basicPrintString.
  137450.     inspector := self createIn: shell on: (ValueHolder with: anObject).
  137451.     inspector view arrangement: #center.
  137452.     shell view validateLayout.
  137453.     shell show setInitialFocus.
  137454.     ^inspector! !
  137455.  
  137456. !BasicInspector methodsFor!
  137457.  
  137458. accept
  137459.     "Saves the current source as the value of the selected variable of the
  137460.     receivers object."
  137461.  
  137462.     variableNamesPresenter hasSelection 
  137463.         ifTrue: 
  137464.             ["If there is no selection then the entire workspace is selected for consistency
  137465.         with saving method source. This also works rather better with word wrap too."
  137466.             | newObject oldObject |
  137467.             sourcePresenter view hasSelection ifFalse: [sourcePresenter view selectAll].
  137468.  
  137469.             "Evaluate the new value and keep a copy of the old value for undo purposes"
  137470.             newObject := sourcePresenter evaluateItIfFail: [^self].
  137471.             oldObject := self getField: self currentField.
  137472.             self setField: self currentField to: newObject.
  137473.             Command current undoWith: 
  137474.                     [self
  137475.                         setField: self currentField to: oldObject;
  137476.                         onVariableNameSelected].
  137477.             self onVariableNameSelected.
  137478.             self trigger: #inspecteeChanged]!
  137479.  
  137480. browseClass
  137481.     "Private - Open a new default browser on the class of the object being inspected."
  137482.  
  137483.     self systemModel browseClass: self browseObject!
  137484.  
  137485. browseHierarchy
  137486.     "Private - Open a new class browser on the class of the object being inspected."
  137487.  
  137488.     self systemModel browseHierarchy: self browseObject!
  137489.  
  137490. browseIt
  137491.     "Open a default browser on the current object"
  137492.  
  137493.     self browseClass!
  137494.  
  137495. browseObject
  137496.     "Private - Answer the object from the receiver that should be browsed"
  137497.     ^(variableNamesPresenter hasSelection 
  137498.         ifTrue: [self variable]
  137499.         ifFalse: [self object]) class!
  137500.  
  137501. createComponents
  137502.     "Create the presenters contained by the receiver"
  137503.  
  137504.     super createComponents.
  137505.     variableNamesPresenter := self add: ListPresenter new name: 'variablenames'.
  137506.     sourcePresenter := self add: SmalltalkWorkspace new name: 'source'.
  137507. !
  137508.  
  137509. createSchematicWiring
  137510.     "Create the trigger wiring for the receiver"
  137511.  
  137512.     super createSchematicWiring.
  137513.     variableNamesPresenter
  137514.         when: #selectionChanged
  137515.             send: #onVariableNameSelected
  137516.             to: self;
  137517.         when: #actionPerformed
  137518.             send: #inspectIt
  137519.             to: self!
  137520.  
  137521. currentField
  137522.     "Private - Answers the offset of the current field within the receiver"
  137523.  
  137524.     ^self fieldIndexFromVariableIndex: self variableIndex!
  137525.  
  137526. errorModel: aValueModel
  137527.     "Set the errorModel used to collect notifications from the Compiler."
  137528.  
  137529.     sourcePresenter errorModel: aValueModel!
  137530.  
  137531. extraFields
  137532.     "Private - Answer the number of extra fields in the field list, which appear after the instance
  137533.     variables, but before the indexed instance variables. Extra fields are inserted in
  137534.     inspectors to allow additional calculated information to be presented by performing
  137535.     accessor methods. This method will work except where the subclass does not include
  137536.     all its indexed instance variables in the field list it reports"
  137537.  
  137538.     ^self variableNamesList size - self fields!
  137539.  
  137540. fieldIndexFromVariableIndex: index
  137541.     "Private - Answers the offset of the field within the receiver at the specified
  137542.     variable index."
  137543.  
  137544.     ^index - self headerSize!
  137545.  
  137546. fields
  137547.     "Private - Answer the list of fields in the field list (named and indexable instance variables), which appear 
  137548.     after the inspectors header fields (accessors implemented by the inspector itself), and before
  137549.     any extra fields (accessors implemented by the inspected object). Must be overridden by subclasses
  137550.     which do not include all their indexable variables in the field list."
  137551.  
  137552.     ^self selfField class instSize + self selfField size!
  137553.  
  137554. getField: anInteger
  137555.     "Private - Answer the field of the receiver's object which has the key at index
  137556.     anInteger in the field list (1 based)"
  137557.  
  137558.     ^self selfField instVarAt: anInteger!
  137559.  
  137560. getFieldExtra: anInteger 
  137561.     "Private - Answer the field of the receiver's object which has the key at index
  137562.     anInteger in the field list (1 based), by using the basic accessor
  137563.     mechanism if the field represents an instance variable, or the accessor 
  137564.     method if it is an 'extra' field. This is used by many subclasses."
  137565.  
  137566.     | instSize |
  137567.     instSize := self selfField class instSize.
  137568.     ^anInteger <= instSize 
  137569.         ifTrue: [self selfField instVarAt: anInteger]
  137570.         ifFalse: 
  137571.             ["Must be in range of indexed and extra fields"
  137572.             | extra |
  137573.             extra := self extraFields.
  137574.             anInteger <= (instSize + extra) 
  137575.                 ifTrue: 
  137576.                     [self selfField perform: (self variableNamesList at: anInteger + self headerSize) asSymbol]
  137577.                 ifFalse: [self selfField at: anInteger - instSize - extra]]!
  137578.  
  137579. getFieldList
  137580.     "Private - Answer an OrderedCollection of instance variable keys (string names for
  137581.     named instance variables, and numeric indices for indexed instance variables)"
  137582.  
  137583.     ^self selfField class allInstVarNames , (1 to: self selfField basicSize)!
  137584.  
  137585. headerList
  137586.     "Private - Answer an ordered collection of Associations. The key is the String variable
  137587.     entry in the variablesList model. The value is the symbol which is perform'ed
  137588.     to find the value to display in the sourceModel when the variables is selected."
  137589.  
  137590.     ^self class headerList
  137591. !
  137592.  
  137593. headerSize
  137594.     "Private - Answer the number of extra fields in the field list which appear at the
  137595.     top of the list. They are used for special access to the receivers object,
  137596.     for example the '-Self-' field allows access to the object itself."
  137597.  
  137598.     ^self headerList size
  137599. !
  137600.  
  137601. infoTipForVariable: variableName
  137602.     "Answer the info. tip (bubble help) to be displayed when the user hovers over a variable
  137603.     in the variables list."
  137604.  
  137605.     | list idx |
  137606.     list := variableNamesPresenter view.
  137607.     idx := list itemFromPoint: list cursorPosition.
  137608.     ^idx isNil 
  137609.         ifTrue: ['']
  137610.         ifFalse: [
  137611.             [(self variableAtIndex: idx) printString]
  137612.                 on: Error do: [:e | 'Value unavailable: ', e description]]!
  137613.  
  137614. inspectIt
  137615.     "Open a new Inspector on the variable selected in variablesModel."
  137616.  
  137617.     variableNamesPresenter hasSelection
  137618.         ifTrue: [self variable inspect]
  137619. !
  137620.  
  137621. inspectReferences
  137622.     "Open a new Inspector on all the objects which references the variable
  137623.     selected in variablesModel."
  137624.  
  137625.     variableNamesPresenter hasSelection 
  137626.         ifTrue: 
  137627.             [| refs |
  137628.             refs := self variable allReferences copyWithout: self.
  137629.             refs isEmpty 
  137630.                 ifTrue: 
  137631.                     [MessageBox notify: ('There are no additional references to:%n    %1' 
  137632.                                 formatWith: self variable printString)]
  137633.                 ifFalse: [refs inspect]]!
  137634.  
  137635. model: aValueModel
  137636.     "Set the model of the receiver to be aValueModel. We intercept a change
  137637.     notification so that the list selection can track this value."
  137638.  
  137639.     super model: aValueModel.
  137640.     self onValueChanged
  137641. !
  137642.  
  137643. nilVariable
  137644.     "Private - Nil the currently selected variable."
  137645.  
  137646.     | oldObject |
  137647.     oldObject := self getField: self currentField.
  137648.     self setField: self currentField to: nil.
  137649.     Command current undoWith: [self setField: self currentField to: oldObject; onVariableNameSelected].
  137650.     self onVariableNameSelected.
  137651.     self trigger: #inspecteeChanged!
  137652.  
  137653. object
  137654.     "Answer the object inspected by the receiver."
  137655.  
  137656.     ^self model value!
  137657.  
  137658. object: anObject
  137659.     "Set the object which is inspected by the receiver."
  137660.  
  137661.     self value: anObject
  137662. !
  137663.  
  137664. onValueChanged
  137665.     "The object which is inspected by the receiver has been changed."
  137666.  
  137667.     | variableNamesList |
  137668.     super onValueChanged.
  137669.     variableNamesList := (self headerList collect: [:anAssociation | anAssociation key]), self getFieldList.
  137670.     variableNamesPresenter list: variableNamesList.
  137671.     sourcePresenter evaluationContext: self object.
  137672.     variableNamesPresenter view selectionByIndex: 1.
  137673.  
  137674. !
  137675.  
  137676. onVariableNameSelected
  137677.     "Private - The selection in the variablesModel has changed. Update the sourceModel
  137678.     to show the value stored in the object at the selected variable."
  137679.  
  137680.     | var |
  137681.     sourcePresenter text: (
  137682.             [var := self variable.
  137683.             var printString] on: Error
  137684.                     do: 
  137685.                         [:e | 
  137686.                         | name |
  137687.                         name := self variableName.
  137688.                         self unableToDisplayVariableErrorFormatString 
  137689.                             formatWith: self variableName
  137690.                             with: var class name
  137691.                             with: e description
  137692.                             with: (name isInteger 
  137693.                                     ifTrue: ['self at: ' , name displayString]
  137694.                                     ifFalse: [self variableName , ' printString'])])!
  137695.  
  137696. onViewOpened
  137697.     "Now run through all our sub-presenters and connect them in turn
  137698.     to same named sub-views within aCompositeView"
  137699.  
  137700.     super onViewOpened.
  137701.     (variableNamesPresenter view)
  137702.         getInfoTipBlock: [:v | self infoTipForVariable: v];
  137703.         selectionByIndex: 1!
  137704.  
  137705. queryCommand: query 
  137706.     "Private - Enter details about a potential command for the receiver into the 
  137707.     <CommandQuery>, query."
  137708.  
  137709.     | cmd hasSel |
  137710.     super queryCommand: query.
  137711.     cmd := query commandSymbol.
  137712.     hasSel := variableNamesPresenter hasSelection.
  137713.     (#(#inspectReferences #basicInspectIt) includes: cmd) 
  137714.         ifTrue: 
  137715.             [query isEnabled: hasSel.
  137716.             ^true].
  137717.     #inspectIt == cmd 
  137718.         ifTrue: 
  137719.             [query
  137720.                 isEnabled: hasSel;
  137721.                 isDefault: hasSel.
  137722.             ^true].
  137723.     (#(#accept #nilVariable) includes: cmd) 
  137724.         ifTrue: 
  137725.             [query isEnabled: (hasSel and: [self variableIndex > self headerSize]).
  137726.             ^true].
  137727.     (#(#browseHierarchy #browseSystem #browseClass) 
  137728.         identityIncludes: query command) 
  137729.             ifTrue: 
  137730.                 [| class |
  137731.                 [hasSel ifTrue: [class := self variable class]] on: Error do: [:e | ].
  137732.                 class isNil 
  137733.                     ifFalse: 
  137734.                         [query
  137735.                             isEnabled: (self respondsTo: #browseSystem);
  137736.                             text: 'Browse ' , class name.
  137737.                         ^true]
  137738.                     ifTrue: 
  137739.                         [query
  137740.                             isEnabled: false;
  137741.                             text: query commandDescription menuText]].
  137742.     cmd == #undo 
  137743.         ifTrue: 
  137744.             [query
  137745.                 beDisabled;
  137746.                 text: (query commandDescription menuText formatWith: '').
  137747.             ^true].
  137748.     ^false!
  137749.  
  137750. refresh
  137751.     "Private - The fields of the receivers object have been modified so update
  137752.     our model of it while keeping the original selection if possible."
  137753.  
  137754.     | oldSelection |
  137755.     oldSelection := self variableName.
  137756.     self model notifyChanged.
  137757.     variableNamesPresenter selection: oldSelection ifAbsent: []!
  137758.  
  137759. selfField
  137760.     "Private - Answer the receivers object for displaying in the sourceModel."
  137761.  
  137762.     ^self object!
  137763.  
  137764. setField: anInteger to: anObject
  137765.     "Private - Determine the field of the receiver's object which has the key at index
  137766.     anInteger in the field list, and set its value to anObject."
  137767.  
  137768.     ^self selfField instVarAt: anInteger put: anObject!
  137769.  
  137770. source
  137771.     "Answer the source definition for the currently selected variable
  137772.     of the receivers object."
  137773.  
  137774.     ^sourcePresenter value asString!
  137775.  
  137776. systemModel
  137777.     ^SmalltalkSystem current!
  137778.  
  137779. unableToDisplayVariableErrorFormatString
  137780.     "Private - Answer the format string used to construct the error message text to be
  137781.     displayed in place of a variable value when a variable is selected that cannot be
  137782.     printed."
  137783.  
  137784.     ^'an invalid %2 [%3]%n%nEvaluate the following expression to debug:%n    %4'
  137785. !
  137786.  
  137787. variable
  137788.     "Answer the variable associated with the currently selected
  137789.     variable name of the receivers object or nil if there is no selection."
  137790.  
  137791.     ^self variableAtIndex: self variableIndex!
  137792.  
  137793. variableAtIndex: index
  137794.     "Private - Answer the value of the variable at the specified <integer> index in the receiver's
  137795.     variable list."
  137796.  
  137797.     ^index isZero ifFalse: [
  137798.         index <= self headerSize
  137799.             ifTrue: [self perform: (self headerList at: index) value]
  137800.             ifFalse: [self getField: (self fieldIndexFromVariableIndex: index)]]!
  137801.  
  137802. variableIndex
  137803.     "Private - Answer the index of the variable associated with the curently
  137804.     selected variable name of the receivers object or 0 if there is no selection."
  137805.  
  137806.     ^variableNamesPresenter selectionByIndex!
  137807.  
  137808. variableName
  137809.     "Private - Answer the selected variable name of the receivers object."
  137810.  
  137811.     ^variableNamesPresenter selectionOrNil!
  137812.  
  137813. variableName: name
  137814.     "Private - Select the variable name of the receivers object."
  137815.  
  137816.     variableNamesPresenter selection: name!
  137817.  
  137818. variableNamesList
  137819.     "Answer an OrderedCollection of all the names of the currently
  137820.     inspected objects variables."
  137821.  
  137822.     ^variableNamesPresenter list! !
  137823.  
  137824. BooleanPresenter comment:
  137825. 'BooleanPresenter is a <valuePresenter> that displays a <valueModel> onto a <boolean> value. A BooleanPresenter can be connected to any <valueView> capable of displaying <boolean> values.  Often, this will be a <CheckBox> although alternative views may be chosen with the installation of an appropriate <typeConverter>.'!
  137826. !BooleanPresenter class methodsFor!
  137827.  
  137828. defaultModel
  137829.     "Answer a default model to be assigned to the receiver when it
  137830.     is initialized."
  137831.  
  137832.     ^false asValue!
  137833.  
  137834. icon
  137835.     "Answers an Icon that can be used to represent this class"
  137836.  
  137837.     ^##(self) defaultIcon! !
  137838.  
  137839. ChoicePresenter comment:
  137840. 'ChoicePresenter is <valuePresenter> which allows a value to be chosen from a list of alternatives. The range of choices may be supplied as any <sequencedCollection> by using the #choices: method once the ChoicePresenter has been instantiated. The initial selection in the visible list will match the initial value in the ChoicePresenter''s <valueModel>. As different selections are made in list they are transferred directly into the associated model.
  137841.  
  137842. By default, a ChoicePresenter allows single selection choices to be made. It is also possible, however, to allow multiple selections by attaching an appropriate <listView> supporting the <multipleSelectableItems> protocol. In this case, the value held by the model will be an <Array> of the chosen items.
  137843.  
  137844. It is also sometimes useful to specify one of the supplied choices as being able to represent a nil value in the model. This can be done by using the #nilChoice: method.
  137845.  
  137846. Examples:
  137847.  
  137848. "Single Selection"
  137849. model := 2 asValue.
  137850. (ChoicePresenter showOn: model) choices: #[0 1 2 3]; nilChoice: 0.
  137851. model value "Display it"
  137852.  
  137853. "Multiple Selection"
  137854. model := (Array with: 2) asValue.
  137855. (ChoicePresenter show: ''Multi-selection list box'' on: model) choices: #[0 1 2 3]; nilChoice: (Array with: 0).
  137856. model value "Display it"
  137857.  
  137858. Instance Variables:
  137859.     choicesModel    <listModel> containing the value choices.
  137860.     nilChoice        <Object> specifying the object in list that can be used to represent a nil. value.
  137861.  
  137862. '!
  137863. !ChoicePresenter class methodsFor!
  137864.  
  137865. defaultModel
  137866.     "Answer a default model to be assigned to the receiver when it
  137867.     is initialized."
  137868.  
  137869.     ^nil asValue comparisonPolicy: SearchPolicy equality!
  137870.  
  137871. icon
  137872.     "Answers an Icon that can be used to represent this class"
  137873.  
  137874.     ^##(self) defaultIcon! !
  137875.  
  137876. !ChoicePresenter methodsFor!
  137877.  
  137878. choices: aSequenceableCollection
  137879.     "Sets the choice list to choose from to be aSequenceableCollection"
  137880.  
  137881.     self noEventsDo: [ 
  137882.         choicesModel list: aSequenceableCollection.
  137883.         self updateChoice ]!
  137884.  
  137885. createSchematicWiring
  137886.     "Create the trigger wiring for the receiver. At this stage the initialization
  137887.     is complete and the view is open"
  137888.  
  137889.     self when: #selectionChanged send: #onChoiceChanged to: self!
  137890.  
  137891. initialize
  137892.     "Private - Initialize the receiver"
  137893.  
  137894.     super initialize.
  137895.     choicesModel := ListModel newEquality!
  137896.  
  137897. model: aValueModel
  137898.     "Set the model of the receiver to be aValueModel."
  137899.  
  137900.     self noEventsDo: [ super model: aValueModel ].
  137901.     self updateChoice!
  137902.  
  137903. nilChoice: anObject
  137904.     "Set the choice that will be used to represent nil in the receiver to be
  137905.     anObject."
  137906.  
  137907.     nilChoice := anObject
  137908.     !
  137909.  
  137910. onChoiceChanged
  137911.     "Handler for a choice change in the receiver's view"
  137912.  
  137913.     | choice |
  137914.     choice := view selectionOrNil.
  137915.     self value: (choice = nilChoice ifFalse: [choice])!
  137916.  
  137917. onSelectionChanged
  137918.     "Private - Handler for a selection change in the receiver's view"
  137919.  
  137920.     self view onSelectionChanged!
  137921.  
  137922. onSelectionChanging: aSelectionChangingEvent
  137923.     "Private - Handler to indicate that the receiver's selection is about to change.
  137924.     To prevent the proposed change under certain circumstances a handler
  137925.     can set the value of aValueHolder to false."
  137926.  
  137927.     self view onSelectionChanging: aSelectionChangingEvent!
  137928.  
  137929. onValueChanged
  137930.     "The receiver's value has changed. Ensure that we update the list selection to match"
  137931.  
  137932.     self updateChoice.
  137933.     super onValueChanged
  137934.     !
  137935.  
  137936. updateChoice
  137937.     "Private - The value has been changed in the receiver's model.
  137938.     Transfer the value to the list view's selection."
  137939.  
  137940.     self view selectionOrNil: (self value ifNil: [nilChoice])!
  137941.  
  137942. view: aView
  137943.     "Set the view for the receiver to aView. This should be overidden for composites
  137944.     to also connect up any sub-views"
  137945.  
  137946.     super view: aView.
  137947.  
  137948.     "Transfer the choice selection across to the associated list. Beware though;
  137949.     under some circumstances the choices model may not yet have been filled."
  137950.     choicesModel notEmpty ifTrue: [
  137951.         self updateChoice ]!
  137952.  
  137953. viewModel
  137954.     "Private - Answer the model that is to be connected to the view. It is actually
  137955.     connected to the receiver's choicesModel - not the receiver's value model"
  137956.  
  137957.     ^choicesModel! !
  137958.  
  137959. CollectionPresenter comment:
  137960. 'CollectionPresenter is a <valuePresenter> that presents a <Collection> accessed via its <valueModel>. It provides a number of [operations]for editing the list. As changes are made to the list it is applied back to the presenter''s <valueModel>.
  137961.  
  137962. Instance Variables:
  137963.     listPresenter    <ListPresenter> presenting the list accessed as the value of the presenter''s model.
  137964. '!
  137965. !CollectionPresenter class methodsFor!
  137966.  
  137967. defaultModel
  137968.     "Answer a default model to be assigned to the receiver when it
  137969.     is initialized."
  137970.  
  137971.     ^OrderedCollection new asValue!
  137972.  
  137973. icon
  137974.     "Answers an Icon that can be used to represent this class"
  137975.  
  137976.     ^##(self) instanceClass defaultIcon! !
  137977.  
  137978. !CollectionPresenter methodsFor!
  137979.  
  137980. addItem
  137981.     "Uses the receiver's addItemBlock to answer a new item to add to the collection"
  137982.  
  137983.     self canGrow 
  137984.         ifTrue: 
  137985.             [| item |
  137986.             item := addItemBlock notNil ifTrue: [addItemBlock value] ifFalse: [self defaultAddItem].
  137987.             item notNil ifTrue: [self addItem: item]]
  137988.         ifFalse: [Sound errorBeep]!
  137989.  
  137990. addItem: anObject
  137991.     "Add anObject into the receiver's list"
  137992.  
  137993.     self listModel add: anObject
  137994.     !
  137995.  
  137996. canGrow
  137997.     "Private - Answer true if it is valid to add and remove elements of the receiver's collection"
  137998.  
  137999.     ^self model canSet 
  138000.         and: [self model value class conformsToProtocol: #sequencedContractibleCollection]!
  138001.  
  138002. createComponents
  138003.     "Create the presenters contained by the receiver"
  138004.  
  138005.     super createComponents.
  138006.     listPresenter := self add: ListPresenter new name: 'list'.
  138007. !
  138008.  
  138009. createSchematicWiring
  138010.     "Create the trigger wiring for the receiver"
  138011.  
  138012.     super createSchematicWiring.
  138013.     listPresenter model
  138014.         when: #itemUpdatedAtIndex: send: #onListChanged to: self;
  138015.         when: #itemRemovedAtIndex: send: #onListChanged to: self;
  138016.         when: #item:addedAtIndex: send: #onListChanged to: self;
  138017.         when: #listChanged send: #onListChanged to: self.
  138018. !
  138019.  
  138020. defaultAddItem
  138021.     "Private - Prompts to add an item to the receiver. Used if no addItemBlock has been specified"
  138022.  
  138023.     ^self promptForExpression: 'Evaluate:' caption: 'Add Item'!
  138024.  
  138025. listModel
  138026.     "Private - Answers the model for the associated list"
  138027.  
  138028.     ^listPresenter model!
  138029.  
  138030. model: aValueModel
  138031.     "Set the model of the receiver to be aValueModel. We intercept a change
  138032.     notification so that the list selection can track this value."
  138033.  
  138034.     super model: aValueModel.
  138035.     self model when: #valueChanged send: #onValueChanged to: self.
  138036.     self onValueChanged
  138037. !
  138038.  
  138039. onListChanged
  138040.     "The internal collection has been changed so update the receiver's model."
  138041.  
  138042.     self value: listPresenter list.
  138043. !
  138044.  
  138045. onValueChanged
  138046.     "Private - The value has been changed in the receiver's model.
  138047.     Transfer the value to the listModel"
  138048.  
  138049.     listPresenter list: self value asOrderedCollection
  138050. !
  138051.  
  138052. promptForExpression: promptString caption: captionString
  138053.     | result |
  138054.     result := nil.
  138055.     
  138056.     [| expression |
  138057.     expression := Prompter prompt: promptString caption: captionString.
  138058.     expression notNil 
  138059.         and: 
  138060.             [| error |
  138061.             
  138062.             [result := Compiler evaluate: expression logged: false.
  138063.             error := nil] 
  138064.                     on: CompilerErrorNotification , Error
  138065.                     do: 
  138066.                         [:ex | 
  138067.                         error := ex.
  138068.                         ex return: nil].
  138069.             error notNil and: 
  138070.                     [((MessageBox new)
  138071.                         yesNo;
  138072.                         caption: 'Error evaluating expression...';
  138073.                         errorMsg: ('%1%n%nTry again?' formatWith: error description)) == #yes]]] 
  138074.             whileTrue.
  138075.     ^result!
  138076.  
  138077. queryCommand: query
  138078.     "Private - Enters details about a potential command for the receiver into 
  138079.     the <CommandQuery>, query"
  138080.  
  138081.     | command |
  138082.     command := query commandSymbol.
  138083.     (#(#addItem) identityIncludes: command) 
  138084.         ifTrue: 
  138085.             [query isEnabled: self canGrow.
  138086.             ^true].
  138087.     (#(#removeItem) identityIncludes: command) 
  138088.         ifTrue: 
  138089.             [query isEnabled: (self canGrow and: [listPresenter hasSelection]).
  138090.             ^true].
  138091.     ^super queryCommand: query!
  138092.  
  138093. removeItem
  138094.     "Removes the current selection from the receiver's list"
  138095.  
  138096.     | index |
  138097.     index:= listPresenter selectionByIndex.
  138098.     self listModel removeAtIndex: index.
  138099.     listPresenter selectionByIndex: (index min: listPresenter model size)!
  138100.  
  138101. setAddItemBlock: aNiladicValuable
  138102.     "Set the block to evaluate when adding new items to the receiver's collection"
  138103.  
  138104.     addItemBlock := aNiladicValuable! !
  138105.  
  138106. ColorPresenter comment:
  138107. 'ColorPresenter is a <valuePresenter> that displays a <valueModel> onto a <color> value. A ColorPresenter can be connected to any <valueView> capable of displaying <color> values. Normally, this will be a <ColorView> although alternative views may be chosen with the installation of an appropriate <typeConverter>.'!
  138108. !ColorPresenter class methodsFor!
  138109.  
  138110. defaultModel
  138111.     "Answer a default model to be assigned to the receiver when it
  138112.     is initialized."
  138113.  
  138114.     ^Color black asValue!
  138115.  
  138116. icon
  138117.     "Answers an Icon that can be used to represent this class"
  138118.  
  138119.     ^##(self) defaultIcon! !
  138120.  
  138121. DatePresenter comment:
  138122. 'DatePresenter is a <valuePresenter> that displays a <valueModel> onto a <Date> value. A DatePresenter can be connected to any <valueView> capable of displaying <Date> values. Normally, this will be a <DateTimePicker> although alternative views may be chosen with the installation of an appropriate <typeConverter>.'!
  138123. !DatePresenter class methodsFor!
  138124.  
  138125. defaultModel
  138126.     "Answer a default model to be assigned to the receiver when it
  138127.     is initialized."
  138128.  
  138129.     ^Date today!
  138130.  
  138131. icon
  138132.     "Answers an Icon that can be used to represent this class"
  138133.  
  138134.     ^##(self) defaultIcon! !
  138135.  
  138136. FontPresenter comment:
  138137. 'FontPresenter is a <valuePresenter> that displays a <valueModel> onto a <Font> value. A FontPresenter can be connected to any <valueView> capable of displaying <Font> values. Normally, this will be a <FontView> although alternative views may be chosen with the installation of an appropriate <typeConverter>.'!
  138138. !FontPresenter class methodsFor!
  138139.  
  138140. defaultModel
  138141.     "Answer a default model to be assigned to the receiver when it
  138142.     is initialized."
  138143.  
  138144.     ^Font system asValue!
  138145.  
  138146. icon
  138147.     "Answers an Icon that can be used to represent this class"
  138148.  
  138149.     ^##(self) defaultIcon! !
  138150.  
  138151. ImagePresenter comment:
  138152. 'ImagePresenter is a <valuePresenter> that displays a <valueModel> onto an <image> value. A ImagePresenter can be connected to any <valueView> capable of displaying <image> values. Normally, this will be an <ImageView> or <StaticImage>, although alternative views may be chosen with the installation of an appropriate <typeConverter>.'!
  138153. !ImagePresenter class methodsFor!
  138154.  
  138155. icon
  138156.     "Answers an Icon that can be used to represent this class"
  138157.  
  138158.     ^##(self) defaultIcon! !
  138159.  
  138160. InspectorAbstract comment:
  138161. ''!
  138162. !InspectorAbstract class methodsFor!
  138163.  
  138164. icon
  138165.     "Answers an Icon that can be used to represent this class"
  138166.  
  138167.     ^BasicInspector icon!
  138168.  
  138169. imageForAspect: anAspectAccessor
  138170.     ^([anAspectAccessor valueIcon] on: Error do: [:ex | ex icon]) imageIndex!
  138171.  
  138172. textForAspect: anAspectAccessor
  138173.     | aStream |
  138174.     aStream := String writeStream: 40.
  138175.     [anAspectAccessor displayOn: aStream] on: Error do: [:ex | 
  138176.         aStream basicPrint: ex].
  138177. "        ex displayOn: aStream]."
  138178.     ^aStream contents! !
  138179.  
  138180. !InspectorAbstract methodsFor!
  138181.  
  138182. browseClass
  138183.     "Private - Open a new default browser on the class of the object being inspected."
  138184.  
  138185.     self systemModel browseClass: self browseObject!
  138186.  
  138187. browseHierarchy
  138188.     "Private - Open a new class browser on the class of the object being inspected."
  138189.  
  138190.     self systemModel browseHierarchy: self browseObject!
  138191.  
  138192. browseIt
  138193.     "Open a default browser on the current object"
  138194.  
  138195.     self browseClass!
  138196.  
  138197. browseObject
  138198.     "Private - Answer the object from the receiver that should be browsed"
  138199.     
  138200.     ^self inspecteeSelection class!
  138201.  
  138202. inspecteeSelection
  138203.     "Private - Answer the value associated with the currently selected object"
  138204.  
  138205.     ^self subclassResponsibility!
  138206.  
  138207. inspectIt
  138208.     "Open a new Inspector on the variable selected in variablesModel."
  138209.  
  138210.     self inspecteeSelection inspect!
  138211.  
  138212. systemModel
  138213.     ^SmalltalkSystem current! !
  138214.  
  138215. NumberPresenter comment:
  138216. 'NumberPresenter is a <valuePresenter> that displays a <valueModel> onto a <number> value. A NumberPresenter can be connected to any <valueView> capable of displaying <number> values. Often, this will be a <TextEdit> with a <NumberToText> converter installed although alternative views may be chosen after the installation of an appropriate <typeConverter>.'!
  138217. !NumberPresenter class methodsFor!
  138218.  
  138219. defaultModel
  138220.     "Answer a default model to be assigned to the receiver when it
  138221.     is initialized."
  138222.  
  138223.     ^0 asValue!
  138224.  
  138225. icon
  138226.     "Answers an Icon that can be used to represent this class"
  138227.  
  138228.     ^##(self) defaultIcon! !
  138229.  
  138230. TextPresenter comment:
  138231. 'TextPresenter is a <valuePresenter> that displays a <valueModel> onto a <readableString> value. A TextPresenter can be connected to any <valueView> capable of displaying <readableString> values. Often, this will be a <TextEdit> although alternative views may be chosen with the installation of an appropriate <typeConverter>.'!
  138232. !TextPresenter class methodsFor!
  138233.  
  138234. defaultModel
  138235.     "Answer a default model to be assigned to the receiver when it
  138236.     is initialized."
  138237.  
  138238.     ^String new asValue!
  138239.  
  138240. icon
  138241.     "Answers an Icon that can be used to represent this class"
  138242.  
  138243.     ^##(self) defaultIcon! !
  138244.  
  138245. !TextPresenter methodsFor!
  138246.  
  138247. clear
  138248.     "Remove all contents in the receiver's view"
  138249.  
  138250.     self value: ''!
  138251.  
  138252. dragOver: session
  138253.     "The drag operation described by the <DragDropSession>, session,
  138254.     has moved to a new position over the receiver's window. Use the session 
  138255.     to provide feedback to the user about allowable operations etc.
  138256.     Implementation Note: Override this message to suggest a default drop action of 
  138257.     pasting in the String at the drop position."
  138258.     
  138259.     session operation: ((session isFormatAvailable: #String) ifTrue: [session intendedOperation]).
  138260.     "Superclass triggers event to allow observers to override."
  138261.     super dragOver: session!
  138262.  
  138263. drop: session
  138264.     "The drag operation described by the <DragDropSession>, session, has culminated
  138265.     in a drop over the receiver.
  138266.     Implementation Note: Override this message to implement default action of 
  138267.     pasting in the String or Chunk at the drop position. However any observers of the
  138268.     #drop: trigger of the receiver get first crack - they should set the suggested target to 
  138269.     nil in order to pre-empt the default action."
  138270.  
  138271.     | targetPos answer |
  138272.     answer := super drop: session.
  138273.     targetPos := session suggestedTarget.
  138274.     targetPos isNil ifFalse: [
  138275.         self view caretPosition: targetPos.
  138276.         session dragObjects do: [:each | | text |
  138277.             text := each format: #String.
  138278.             self replaceSelection: text]].
  138279.     ^answer!
  138280.  
  138281. findDetails
  138282.     "Answers the findDetails instance variable. The Array has four elements:
  138283.     (findWhatString, isForwardsBoolean, isCaseSensitiveBoolean, isWholeWordBoolean)."
  138284.  
  138285.     ^findDetails!
  138286.  
  138287. findDetails: anArray
  138288.     "Sets the findDetails instance variable to anArray. The Array has four elements:
  138289.     (findWhatString, isForwardsBoolean, isCaseSensitiveBoolean, isWholeWordBoolean)."
  138290.  
  138291.     findDetails := anArray
  138292. !
  138293.  
  138294. hasSelection
  138295.     "Answer true if the receiver has a current selection"
  138296.  
  138297.     ^self view hasSelection!
  138298.  
  138299. isModified
  138300.     "Answer whether the text in the receiver's model has been modified."
  138301.  
  138302.     ^self view isModified!
  138303.  
  138304. isModified: aBoolean
  138305.     "Set/reset the receiver's dirty flag."
  138306.  
  138307.     self view isModified: aBoolean!
  138308.  
  138309. onTextOverflow
  138310.     "Default handler for EN_MAXTEXT notification. Can be overridden, but the
  138311.     preferred customization route is to observe the #textOverflow event."
  138312.  
  138313.     ^self view onTextOverflow!
  138314.  
  138315. replaceSelection: aString
  138316.     "Replace the current selected range of text with aString"
  138317.     
  138318.     ^self view replaceSelection: aString!
  138319.  
  138320. selectionRange
  138321.     "Answers an interval identifying the selected range of text"
  138322.     
  138323.     ^self view selectionRange!
  138324.  
  138325. selectionRange: anInterval
  138326.     "Sets anInterval to be the selected range of text"
  138327.     
  138328.     ^self view selectionRange: anInterval
  138329. ! !
  138330.  
  138331. TimePresenter comment:
  138332. 'TimePresenter is a <valuePresenter> that displays a <valueModel> onto <Time> value. A TimePresenter can be connected to any <valueView> capable of displaying <Time> values. Normally, this will be a <DateTimePicker> although alternative views may be chosen with the installation of an appropriate <typeConverter>.'!
  138333. !TimePresenter class methodsFor!
  138334.  
  138335. icon
  138336.     "Answers an Icon that can be used to represent this class"
  138337.  
  138338.     ^##(self) defaultIcon! !
  138339.  
  138340. URLPresenter comment:
  138341. ''!
  138342. !URLPresenter class methodsFor!
  138343.  
  138344. defaultModel
  138345.     "Answer a default model to be assigned to the receiver when it
  138346.     is initialized."
  138347.  
  138348.     ^'about:blank' copy asValue!
  138349.  
  138350. defaultView
  138351.     "Answer the resource name of the default view for the receiver."
  138352.  
  138353.     ^'Internet Explorer'! !
  138354.  
  138355. AXInspector comment:
  138356. 'AXInspector is a <compositePresenter> that implements a specialised inspect facility onto a <IDispatch>. This attempts to display the IDispatch properties.
  138357.  
  138358. '!
  138359. !AXInspector methodsFor!
  138360.  
  138361. ΓK2!!U╬µp¿áÜ+æ:íÖ»φ≡─╚╨¼▓▒[F ╡╒vqMDÆï8₧Q@/v^W+≈ôXd*J░<ZdΓ┐( ₧P½▓╛ê≥▌R\·3jc╒░a7¡▌╔VF╒Ç8|ó█∙h⌡W{-Σ>▀σZôNx⌐(┌¥═╢û²3│Üùò<½²Qb½e┬∞<╨╦ZΘU<±╒⌐mDδ╒w╨j╧e±τ┘A4»ε╗╢⌐;ò║6╨▐▒iCVo=ÇJ≡*t!
  138362.  
  138363. µA3<<=¿ïhi╗ºÑ$æ:µ╤²íö╛¥σ¼√│RW║√ì;RFE┼ü,âWAjhRVg ╢Är.JπnViºó6 ╠Φ╕╡ö≥╠^Ç|Wf ╥╜~r║┴┼CÉ╙aεJ╕yòæ;&6╚jï█^ÖP4Ñ|╟Ü╞╢╩⌐vä    ▀ùÜoε╣áa~åª}£▓5è+F╨╙α9R≡▌}é^¬V╕╥ÉPG║┤²╛║[ΦτeP┐áíc`\j6╬    ∩#bY╟┘"â╗\#Q)%ΣÇ!!óTô≈╘¬╝?ñ│Å▐Ä╝∙╠Ióo^bênΘ
  138364. .Å█⌐`≡FêÇü╬├%±┐¼Å
  138365. Γ"·1╝s╓Γ⌠┘ZPh]H?²2╜÷ `éû]╦X@V9╞anñ⌡!!µ NêΘ»xzC
  138366. W╪█╒▄VFφë5C▐û@Ö│₧K═)b{╟ⁿ"C.ö`æ▌╤╫¿·÷│▀╗┘Pî]▓É\ d╢ô¥.ª@─ q≥╕ä▄╨:+╫í/¿äⁿQ░≡⌠'├AdmMæ╥┴}⌠ï^σ«╗rïùTªb_;ɼ½╟i┬⌡£8░ÄO
  138367. σ⌠j7╛┬┘┘┤ ╦4╬ú╞M9┘²!
  138368.  
  138369. µA3<<=¿ï ⌐╜ß@∞}╤╞µ┌ ├┌ò≤▓ä]P¿╛╥;g@SÆê7AâK,.]Zn≥Æ^MifMª<Wc▒╗,√╟GΦ╛╣▐π╟^₧zMon┘╣-$»█╔XJÖ╙|╜W█∙·[=íMæ═IÖA`ú█ù╧·éα]¥ÜëÜOº SMíe;äα!!₧╦WΓ*└Z╫²9r╣╚~éVf┼▄╢Ωkf╖½Ω√Σ%º°lY║⌠╗ %GG&3Ç⌠"tKñ}á{π╜y5P╖δFÿ_É░┬╜≡g┬│ä┴₧~╝≡τ├E>&⌐yªOOaí∙ ²#6åoèê╙╘éê╙╔ατ<╝MΦ6╔π╕╦VlfO2╪1╜°#`╦tñsæu++]òelï╗&µ#z┴ºπSq9Fm┼Z▀▐╒mô≈j+Ñ╤HÆÉî│FQ9 Qè╕71ù,ä■╘╘(Ñ┐²▓ïé╪qëT¼─JD~α⌐¢ï#╛Lo╞≈≡ú»V■≤%í╝ΓA■╣└j╦    MZgε║|òIƒ╟6Ç┤╕╩áS¬xÉ╣ó┬=╨≥£;ªòEΣªm!!╣┤█─ÖTG▐`k√φ╩
  138370.  ï╔╛D¥δÖTδ£^büG]÷₧<¬/Kóä⌐Σ╤]¥6¼α₧òΦ!
  138371.  
  138372. ≥A3<<=¿ïhi╗ºÑ$æ:µ╤²îΩ╪àò┐ⁿèQI║╕╘!!Γû7DûKAj#wn≤ôPh#╖tV*ñó%÷┌«≈úû≥ÅöqWkr¥»-=¼├┼Z\╒¢vª╛|âAΦYJI3Σ}▀▀M▄Kz¿$╛°¬≈┬ë}£ÿ₧ü<á▒CLº  rçπ7₧╙V⌠Ucî^╘│>dφçq╓Q.╓>╜╔å`╝ε∙≡╧ó±cH≈ó▀`o/TO<ÜΣ"1┌┴╩▓\a:eE▀ì+╦Yùπ┬°⌡o≈«▓─Ç;⌡Äú`ª 1?╣&╝b6ï╪R▄-Mφ▐¥■Σ╢!!≥₧╙τP┤Hm·xΣ?├ºε▐OhM
  138373. L≡:ûΣlé ▀O╦BCm»ntêⁿ0±JnÖδ»^"D{╤╠Æ┤.oΘè5#▒╦[èÉ┼σ7ENéτ%3ÿbÉ┘▌╫æ╫¢▀óΓóVÜ~íêVS~α⌐£╟,φqc²ÿ╣╦╔;1äƒ8ùÜ D╢φΓs├Vq%Mæ╥ΘE├í6éê┐^ÅÿS₧rjΩ└«╟╨ⁿâ;╠╟q⌠ñ
  138374. vd╣±╠φ£]@Éz*╬₧═^9╠┼∞
  138375. êΘ╞)C¼≤1φ- ç!
  138376.  
  138377. ⌠J&9=ÉÇ ⌐╣Ç+£    α╞µ═ⁿ█┌≡¼α¬Ae░⌐═zg{B└ì0U·5-h^IZ}Γä^&A░kVxΓ┐( ₧D║║╢è╖▄ ₧zY@{s▀╕-&íë├VFåüv║óuòA∙C]*íiÜ═J¥Eq∞9╦åâΓ├αqì`⌡≥ùu╛²V]ºdJrî»#╥▐\Γ ╩█Vσ,s≡╞z╬G.╓>╜╔åc╗½÷╛ßF╛⌡rU╕Γ╛BlUc>ï    ≈41[X╚ìï»Wb(N▀∞EΓJƒ■┼╜°/ª╫δá≡Wïñⁿ╬;R│<² wZ±ó)╧ΦìæƒÅ╞▐çà▌º/w! !
  138378.  
  138379. CompiledMethodInspector comment:
  138380. 'CompiledMethodInspector is a <compositePresenter> that implements a specialised inspect facility onto a <CompiledMethod>. This provides additional functionality to view the source, and the decompiled bytecodes.'!
  138381. !CompiledMethodInspector class methodsFor!
  138382.  
  138383. headerList
  138384.     "Answer an OrderedCollection of associations between prefix attributes and selectors
  138385.     to be sent to instances of the receiver to access those attributes."
  138386.  
  138387.     ^##(self instanceClass superclass headerList, 
  138388.             (OrderedCollection
  138389.                     with: ' - source' -> #sourceText
  138390.                     with: ' - disassembly' -> #disassemblyText))!
  138391.  
  138392. initialize
  138393.     "Private - Initialize the receiver's class variables.
  138394.         self initialize
  138395.     "
  138396.  
  138397.     MethodTypes := #(
  138398.         'Normal'
  138399.         'Return nil'
  138400.         'Return true'
  138401.         'Return false'
  138402.         'Return literal constant 0'
  138403.         'Return self'
  138404.         'Return instance variable'
  138405.         'Set instance variable').
  138406. ! !
  138407.  
  138408. !CompiledMethodInspector methodsFor!
  138409.  
  138410. disassemblyText
  138411.     "Private - Answer a text decoding of the receivers byte codes."
  138412.  
  138413.     ^self selfField disassembly!
  138414.  
  138415. source
  138416.     "Answer the text source of the receiver."
  138417.  
  138418.     ^self selfField getSource!
  138419.  
  138420. sourceText
  138421.     "Private - Answer the text source of the receiver."
  138422.  
  138423.     ^self selfField getSource!
  138424.  
  138425. text
  138426.     "Private - Answer the text to be displayed for the selected field."
  138427.  
  138428.     | field index |
  138429.     field := self variable.
  138430.     index := self variableIndex.
  138431.     ^(index between: 2 and: self headerSize)
  138432.         ifTrue: [ field ]
  138433.         ifFalse: [ field printString ]! !
  138434.  
  138435. DictionaryInspector comment:
  138436. 'DictionaryInspector is a <compositePresenter> that implements a specialised inspect facility onto a <Dictionary>. This provides additional functionality to inspect the dictionary via its keys and also to allow the user to add new keys and values.'!
  138437. !DictionaryInspector methodsFor!
  138438.  
  138439. addField
  138440.     "Request a new key to add to the inspected object. If no matching key exists
  138441.     in the object add the key with a value of nil, else just hilight the existing
  138442.     matching key."
  138443.  
  138444.     | newField command |
  138445.     command := Command current.
  138446.     newField := Prompter prompt: 'Key expression:' caption: 'Add Field'.
  138447.     newField notNil 
  138448.         ifTrue: 
  138449.             [| newKey |
  138450.             newKey := self selfField class compilerClass 
  138451.                         evaluate: newField
  138452.                         for: self selfField
  138453.                         logged: false.
  138454.             newKey notNil 
  138455.                 ifTrue: 
  138456.                     [(self selfField includesKey: newKey) 
  138457.                         ifFalse: 
  138458.                             ["Add the new key and an undo action to remove the new key on #undo"
  138459.                             command undoWith: [self removeKey: newKey].
  138460.                             self addKey: newKey put: nil].
  138461.                     self variableName: newKey]].
  138462.     #todo    "Add compiler notification handling (message box). See Debugger>>returnFromMessage"!
  138463.  
  138464. addKey: aKey put: anObject
  138465.     "Private - Adds a key to the receiver and refreshes the displayed variables"
  138466.  
  138467.     self selfField at: aKey put: anObject.
  138468.     self refresh!
  138469.  
  138470. getField: anInteger
  138471.     "Private - Answer the field of the receiver's object which has the key at index
  138472.     anInteger in the field list."
  138473.  
  138474.     ^self selfField 
  138475.         at: (self variableNamesList at: anInteger + self headerSize)!
  138476.  
  138477. getFieldList
  138478.     "Private - Answer the an OrderedCollection of keys for filling the inspector instance
  138479.     variable list. For a Dictionary ordering is not important, but the Inspector
  138480.     is much easier to use if we can sort the keys."
  138481.  
  138482.     | fields |
  138483.     fields := self selfField keys.
  138484.     [^fields asSortedCollection] on: Error
  138485.         do: 
  138486.             [:e | 
  138487.             "Keys not directy sortable"
  138488.  
  138489.             ].
  138490.     "The keys could not be sorted, so just answer them in arbitrary order"
  138491.     ^fields asOrderedCollection!
  138492.  
  138493. hasKeySelection
  138494.     "Private - Answer whether the currently selected variable is a dictionary key of the object."
  138495.  
  138496.     ^variableNamesPresenter hasSelection and: [self variableIndex > self headerSize]!
  138497.  
  138498. inspectKey
  138499.     "Private - Open a new Inspector on the selected key."
  138500.  
  138501.     variableNamesPresenter hasSelection
  138502.         ifTrue: [self variableName inspect]
  138503. !
  138504.  
  138505. queryCommand: query
  138506.     "Private - Enters details about a potential command for the receiver into the 
  138507.     <CommandQuery>,  query."
  138508.  
  138509.     | cmd |
  138510.     cmd := query commandSymbol.
  138511.  
  138512.     #removeField == cmd ifTrue: [
  138513.         query isEnabled: self hasKeySelection.
  138514.         ^true].
  138515.  
  138516.     ^super queryCommand: query.
  138517. !
  138518.  
  138519. removeField
  138520.     "Remove the selected key in the variablesModel from the receivers object."
  138521.  
  138522.     | selected value command |
  138523.     command := Command current.
  138524.     selected := self variableName.
  138525.     value := self selfField at: selected.
  138526.     self variableIndex > self headerSize 
  138527.         ifTrue: 
  138528.             [(MessageBox confirm: ('Remove %1 field?' formatWith: selected printString)) 
  138529.                 ifTrue: 
  138530.                     [command undoWith: [self addKey: selected put: value].
  138531.                     self removeKey: selected]]!
  138532.  
  138533. removeKey: aKey
  138534.     "Private - Removes a key in the receiver and refreshes the displayed variables"
  138535.  
  138536.     self selfField removeKey: aKey.
  138537.     self refresh!
  138538.  
  138539. setField: anInteger to: anObject
  138540.     "Private - Determine the field of the receiver's object which has the key at index
  138541.     anInteger in the field list, and set its value to anObject."
  138542.  
  138543.     ^self selfField 
  138544.         at: (self variableNamesList at: anInteger + self headerSize)
  138545.         put: anObject! !
  138546.  
  138547. SequenceableCollectionInspector comment:
  138548. 'SequenceableCollectionInspector is a <compositePresenter> that implements a specialised inspect facility onto a <SequenceableCollection>. This allows the collection to be inspected via its integer indices.'!
  138549. !SequenceableCollectionInspector methodsFor!
  138550.  
  138551. getField: anInteger
  138552.     "Private - Answer the field of the receiver's object which has the key at index
  138553.     anInteger in the field list (1 based)."
  138554.  
  138555.     | instSize |
  138556.     instSize := self selfField class instSize.
  138557.     ^anInteger > instSize 
  138558.         ifTrue: [self selfField at: anInteger - instSize]
  138559.         ifFalse: [self selfField instVarAt: anInteger]!
  138560.  
  138561. getFieldList
  138562.     "Private - Answer the list of fields to be displayed in the instance variable list
  138563.     of the inspector. Numeric indices for the elements of the collection are answered."
  138564.  
  138565.     | size |
  138566.     size := [self selfField size] on: Error do: [:e | 0].
  138567.     ^self selfField class allInstVarNames , (1 to: size)!
  138568.  
  138569. setField: anInteger to: anObject
  138570.     "Private - Determine the field of the receiver's object which has the key at index
  138571.     anInteger in the field list, and set its value to anObject."
  138572.  
  138573.     | instSize |
  138574.     instSize := self selfField class instSize.
  138575.     anInteger > instSize 
  138576.         ifTrue: [self selfField at: anInteger - instSize put: anObject]
  138577.         ifFalse: [self selfField instVarAt: anInteger put: anObject]! !
  138578.  
  138579. StructureInspector comment:
  138580. 'StructureInspector is a <compositePresenter> that implements a specialised inspect facility onto a <ExternalStructure>. This allows the structure to be inspected via its name fields.'!
  138581. !StructureInspector methodsFor!
  138582.  
  138583. fields
  138584.     "Private - Answer the of fields in the field list (named and indexable instance variables), which appear 
  138585.     after the inspectors header fields (accessors implemented by the inspector itself), and before
  138586.     any extra fields (accessors implemented by the inspected object). Overridden because structure
  138587.     inspectors do not include the raw data bytes."
  138588.  
  138589.     ^self selfField class instSize!
  138590.  
  138591. getField: anInteger
  138592.     "Private - Answer the field of the receiver's object which has the key at index
  138593.     anInteger in the field list (0 based)."
  138594.  
  138595.     ^self getFieldExtra: anInteger    !
  138596.  
  138597. getFieldList
  138598.     "Private - Answer the list of fields to be displayed in the instance variable list
  138599.     of the InspectorShell. Numeric indices for the elements of the 
  138600.     OrderedCollection are answered"
  138601.  
  138602.     ^self selfField class allInstVarNames , self selfField getValidFields!
  138603.  
  138604. setField: anInteger to: anObject
  138605.     "Private - Determine the field of the receiver's object which has the key at index
  138606.     anInteger in the field list, and set its value to anObject."
  138607.  
  138608.     anInteger > self selfField class instSize 
  138609.         ifTrue: 
  138610.             [self selfField 
  138611.                 setField: (self variableNamesList at: anInteger + self headerSize)
  138612.                 value: anObject]
  138613.         ifFalse: [super setField: anInteger to: anObject]! !
  138614.  
  138615. HashedCollectionPresenter comment:
  138616. ''!
  138617. !HashedCollectionPresenter methodsFor!
  138618.  
  138619. addElement: anObject
  138620.     self value: ((self value)
  138621.                 add: anObject;
  138622.                 yourself)!
  138623.  
  138624. addItem: anObject
  138625.     "Add anAssociation into the receiver's model"
  138626.  
  138627.     self addElement: anObject.
  138628.     self onValueChanged.
  138629.     listPresenter selection: anObject!
  138630.  
  138631. canGrow
  138632.     "Private - Answer true if it is valid to add and remove elements of the receiver's collection"
  138633.  
  138634.     ^self model canSet !
  138635.  
  138636. elements
  138637.     ^self value asSortedCollection: [:x :y | x displayString < y displayString]!
  138638.  
  138639. onListChanged
  138640.     "The list of keys has been changed so update the receiver's model."
  138641.  
  138642.     "Do nothing. Updates are handled by #addItem and #removeItem"
  138643. !
  138644.  
  138645. onValueChanged
  138646.     "Private - The value has been changed in the receiver's model.
  138647.     Transfer the value to the listModel"
  138648.  
  138649.     listPresenter model: ListModel newEquality.
  138650.     listPresenter list: self elements!
  138651.  
  138652. removeElement: anObject
  138653.     self value: ((self value)
  138654.                 remove: anObject;
  138655.                 yourself)!
  138656.  
  138657. removeItem
  138658.     "Removes the current selection from the receiver's list"
  138659.  
  138660.     | item |
  138661.     item := listPresenter selection.
  138662.     self removeElement: item.
  138663.     self onValueChanged! !
  138664.  
  138665. SequenceableCollectionPresenter comment:
  138666. 'SequenceableCollectionPresenter is a <valuePresenter> that presents a <sequencedCollection> accessed via its <valueModel>. It provides a number of [operations]for editing the list. As changes are made to the list it is applied back to the presenter''s <valueModel>.
  138667.  
  138668. '!
  138669. !SequenceableCollectionPresenter methodsFor!
  138670.  
  138671. canReorder
  138672.     "Private - Answer true if it is valid to reorder the receiver's collection"
  138673.  
  138674.     ^self model canSet and: [self model value class conformsToProtocol: #sequencedCollection]!
  138675.  
  138676. moveDown
  138677.     "Moves the current selection closer to the end of the receiver's list"
  138678.  
  138679.     | index list |
  138680.     index := listPresenter selectionByIndex.
  138681.     list := self listModel.
  138682.     list swap: index with: index + 1.
  138683.     listPresenter selectionByIndex: index + 1!
  138684.  
  138685. moveFirst
  138686.     "Moves the current selection to be the first item in the receiver's list"
  138687.  
  138688.     | list index |
  138689.     index := listPresenter selectionByIndex.
  138690.     list := self listModel.
  138691.     list noEventsDo: 
  138692.             [| item |
  138693.             item := list at: index.
  138694.             list replaceFrom: 2 to: index with: list startingAt: 1.
  138695.             list at: 1 put: item].
  138696.     list notifyListChanged.
  138697.     listPresenter selectionByIndex: 1!
  138698.  
  138699. moveLast
  138700.     "Moves the current selection to be the last  item in the receiver's list"
  138701.  
  138702.     | list index last |
  138703.     index := listPresenter selectionByIndex.
  138704.     list := self listModel.
  138705.     last := list size.
  138706.     list noEventsDo: 
  138707.             [| item |
  138708.             item := list at: index.
  138709.             list 
  138710.                 replaceFrom: index
  138711.                 to: last - 1
  138712.                 with: list
  138713.                 startingAt: index + 1.
  138714.             list at: last put: item].
  138715.     list notifyListChanged.
  138716.     listPresenter selectionByIndex: last!
  138717.  
  138718. moveUp
  138719.     "Moves the current selection closer to the head of the receiver's list"
  138720.  
  138721.     | index list |
  138722.     index := listPresenter selectionByIndex.
  138723.     list := self listModel.
  138724.     list swap: index with: index - 1.
  138725.     listPresenter selectionByIndex: index - 1!
  138726.  
  138727. onValueChanged
  138728.     "Private - The value has been changed in the receiver's model.
  138729.     Transfer the value to the listModel"
  138730.  
  138731.     listPresenter list: self value!
  138732.  
  138733. queryCommand: query
  138734.     "Private - Enters details about a potential command for the receiver into 
  138735.     the <CommandQuery>, query"
  138736.  
  138737.     | command |
  138738.     command := query commandSymbol.
  138739.     (#(#moveUp #moveFirst) identityIncludes: command) 
  138740.         ifTrue: 
  138741.             [query isEnabled: (self canReorder and: [listPresenter selectionByIndex > 1]).
  138742.             ^true].
  138743.     (#(#moveDown #moveLast) identityIncludes: command) 
  138744.         ifTrue: 
  138745.             [query 
  138746.                 isEnabled: (self canReorder and: 
  138747.                             [| selected |
  138748.                             selected := listPresenter selectionByIndex.
  138749.                             selected > 0 and: [selected < self listModel size]]).
  138750.             ^true].
  138751.     ^super queryCommand: query! !
  138752.  
  138753. DictionaryPresenter comment:
  138754. ''!
  138755. !DictionaryPresenter methodsFor!
  138756.  
  138757. defaultAddItem
  138758.     "Private - Prompts to add an item to the receiver. Used if no addItemBlock has been specified"
  138759.  
  138760.     ^(self promptForExpression: 'Key expression:' caption: 'Add Field...') ifNotNil: 
  138761.             [:newKey | 
  138762.             | newValue |
  138763.             newValue := self promptForExpression: 'Value expression:' caption: 'Add Field...'.
  138764.             newKey -> newValue]!
  138765.  
  138766. elements
  138767.     ^self value associations 
  138768.         asSortedCollection: [:x :y | x key displayString < y key displayString]!
  138769.  
  138770. removeElement: anAssociation
  138771.     self value: ((self value)
  138772.                 removeKey: anAssociation key;
  138773.                 yourself)! !
  138774.  
  138775. AspectInspector comment:
  138776. ''!
  138777. !AspectInspector class methodsFor!
  138778.  
  138779. publishedAspects
  138780.     "Answer a <LookupTable> of the <Aspect>s published by the receiver."
  138781.  
  138782.     ^(super publishedAspects)
  138783.         add: (Aspect choice: #treeUpdateMode from: TreeView updateModes);
  138784.         yourself!
  138785.  
  138786. registerAsToolWith: aSmalltalkSystem
  138787.         "The receiver is being registered as a tool with aSmalltalkSystem. Perform any
  138788.         additional registration operations here. Part of the <installableSystemTool>
  138789.         protocol, and implemented at this level so that 3.0 tools can be installed
  138790.         without amendment."!
  138791.  
  138792. treeUpdateMode
  138793.     "Answer the symbolic name of the TreeView refresh mode to be used in the inspector's 
  138794.     aspect tree. This is one of:
  138795.         static    - The tree is fully populated with all display information on opening
  138796.         lazy - The tree enquires display information as required, but only once
  138797.         dynamic - The tree enquires display information on every repaint.
  138798.     The recommended mode is #lazy (at least for the PAI), since this will work best for potentially 
  138799.     slow access     to aspect text and images."
  138800.  
  138801.     ^treeUpdateMode!
  138802.  
  138803. treeUpdateMode: aSymbol
  138804.     treeUpdateMode := aSymbol! !
  138805.  
  138806. !AspectInspector methodsFor!
  138807.  
  138808. aspectAccessor
  138809.     "Private - Answer the <InstVarAccesor> for the selected variable"
  138810.  
  138811.     ^aspectTreePresenter selectionOrNil!
  138812.  
  138813. aspectValue
  138814.     "Private - Answer the value associated with the currently selected
  138815.     aspect variable name or nil if there is no selection."
  138816.  
  138817.     ^(aspectTreePresenter selectionIfNone: [^nil]) value!
  138818.  
  138819. beLargeIcons
  138820.     "Sets the receiver to display large icons"
  138821.  
  138822.     aspectTreePresenter view viewMode: #largeIcons!
  138823.  
  138824. beSmallIcons
  138825.     "Sets the receiver to display small icons"
  138826.  
  138827.     aspectTreePresenter view viewMode: #smallIcons!
  138828.  
  138829. canNilAspect
  138830.     "Private - Answer true if the currently selected aspect can be set"
  138831.  
  138832.     ^self aspectAccessor ifNil: [false] ifNotNil: [:accessor | accessor canNil]!
  138833.  
  138834. canSetAspect
  138835.     "Private - Answer true if the currently selected aspect can be set"
  138836.  
  138837.     ^self aspectAccessor ifNil: [false] ifNotNil: [:accessor | accessor canSet]!
  138838.  
  138839. copyAspect
  138840.     "Copy the value of the currently selected aspect to the clipboard as an object."
  138841.  
  138842.     Clipboard current 
  138843.         setObject: (self copyOfAccessorValue: self aspectAccessor)!
  138844.  
  138845. copyOfAccessorValue: anAccessor
  138846.     "Private - Answers a copy of the value in anAccessor. This should be suitable for transferring
  138847.     to other locations using the clipboard or drag and drop. To this end we make an attempt
  138848.     to isolate the aspect value from it's surroundings, i.e. the current model object."
  138849.  
  138850.     "Unfortunately we must make sure that we isolate the aspect value
  138851.     from the current model. This means we can't just use #binaryStoreBytes
  138852.     but rather we have to set up the STB operation manually."
  138853.  
  138854.     | object stream |
  138855.     object := anAccessor value.
  138856.     stream := WriteStream with: ByteArray new.
  138857.     (STBOutFiler on: stream)
  138858.         override: self model value with: nil;
  138859.         nextPut: object.
  138860.     ^[Object fromBinaryStoreBytes: stream contents] on: Error
  138861.         do: [:error | self error: 'It is not possible to copy this aspect']!
  138862.  
  138863. createComponents
  138864.     "Create the presenters contained by the receiver. At this stage
  138865.     the receiver has not yet been initialized."
  138866.  
  138867.     aspectTreePresenter := self add: TreePresenter new name: 'aspects'!
  138868.  
  138869. createSchematicWiring
  138870.     "Create the trigger wiring for the receiver"
  138871.  
  138872.     super createSchematicWiring.
  138873.     aspectTreePresenter
  138874.         when: #drag:
  138875.             send: #onDragObjectRef:
  138876.             to: self;
  138877.         when: #selectionChanged
  138878.             send: #onAspectSelected
  138879.             to: self!
  138880.  
  138881. expandBatchAccessor: batchAccessor 
  138882.     | newAccessors |
  138883.     newAccessors := batchAccessor getBatchAccessors.
  138884.     newAccessors notEmpty 
  138885.         ifTrue: 
  138886.             [| variableNamesTree parentAccessor |
  138887.             variableNamesTree := aspectTreePresenter model.
  138888.             parentAccessor := variableNamesTree parentOf: batchAccessor.
  138889.             "We disable events from the model while adding the next batch of accessors as otherwise
  138890.              the updating of the tree can make things very slow as it gets larger"
  138891.             variableNamesTree noEventsDo: 
  138892.                     [variableNamesTree remove: batchAccessor.
  138893.                     newAccessors do: [:each | variableNamesTree add: each asChildOf: parentAccessor]].
  138894.             variableNamesTree refreshTree: parentAccessor.
  138895.             aspectTreePresenter selection: newAccessors first].
  138896.     ^self!
  138897.  
  138898. inspecteeSelection
  138899.     "Private - Answer the value associated with the currently selected object"
  138900.  
  138901.     ^(aspectTreePresenter selectionIfNone: [self]) value!
  138902.  
  138903. inspectReferences
  138904.     "Open a new Inspector on all the objects which references the variable
  138905.     selected in variablesModel."
  138906.  
  138907.     | refs |
  138908.     refs := self aspectValue allReferences copyWithout: self.
  138909.     refs isEmpty 
  138910.         ifTrue: 
  138911.             [MessageBox notify: ('There are no additional references to:%n    %1' 
  138912.                         formatWith: self aspectValue printString)]
  138913.         ifFalse: [refs inspect]!
  138914.  
  138915. model: aValueModel
  138916.     "Set the model of the receiver to be aValueModel. We intercept a change
  138917.     notification so that the list selection can track this value."
  138918.  
  138919.     super model: aValueModel.
  138920.     self onValueChanged
  138921. !
  138922.  
  138923. nilAspect
  138924.     "Clears the currently selected aspect to nil"
  138925.  
  138926.     (MessageBox confirm: 'Are you sure you wish to set this item to nil?') 
  138927.         ifTrue: [self setAspectValue: nil]!
  138928.  
  138929. onAspectSelected
  138930.     "Private - An aspect accessor has been selected within the aspect tree."
  138931.  
  138932.     ^self subclassResponsibility!
  138933.  
  138934. onDragObjectRef: session
  138935.     "Private - An object drag has been started. Populate the <DragDropSession>, 
  138936.     session, with the objects to be dragged."
  138937.  
  138938.     | dragDropObject dragAspect ref |
  138939.     dragAspect := session suggestedSource.
  138940.     ref := dragAspect objectRef.
  138941.     dragDropObject := session newDragObject: ref value.
  138942.     dragDropObject format: #ObjectRef data: ref.
  138943.     session dragObjects: (OrderedCollection with: dragDropObject)!
  138944.  
  138945. onViewAvailable
  138946.     "A new view is available, but has not yet been connected to the receiver, i.e.
  138947.     the view will not yet be aware of this presenter or its model.
  138948.     This is an appropriate point for subclasses to apply any dynamic view 
  138949.     configuration that the application may require."
  138950.  
  138951.     aspectTreePresenter view updateMode: self class treeUpdateMode!
  138952.  
  138953. onViewOpened
  138954.     super onViewOpened.
  138955.     self onValueChanged!
  138956.  
  138957. pasteAspect
  138958.     "Paste a copy of the currently clipboard object to the current aspect"
  138959.  
  138960.     | objectCopy |
  138961.     objectCopy := Object fromBinaryStoreBytes: Clipboard current getObjectBinaryStoreBytes.
  138962.     self setAspectValue: objectCopy!
  138963.  
  138964. queryCommand: query 
  138965.     "Private - Enters details about a potential command for the receiver into the 
  138966.     <CommandQuery>,  query."
  138967.  
  138968.     | command accessor |
  138969.     command := query commandSymbol.
  138970.     accessor := self aspectAccessor.
  138971.     (#(#copyAspect #inspectAspect #inspectIt #browseIt #inspectReferences) 
  138972.         identityIncludes: command) 
  138973.             ifTrue: 
  138974.                 [query isEnabled: accessor notNil.
  138975.                 ^true].
  138976.     #nilAspect == command 
  138977.         ifTrue: 
  138978.             [query isEnabled: (accessor notNil and: [accessor canNil]).
  138979.             ^true].
  138980.     #pasteAspect == command 
  138981.         ifTrue: 
  138982.             [| text |
  138983.             text := 'nil'.
  138984.             Clipboard current isObjectAvailable 
  138985.                 ifTrue: 
  138986.                     [| class |
  138987.                     class := Clipboard current getObjectClass.
  138988.                     text := class printString.
  138989.                     query isEnabled: accessor notNil].
  138990.             query text: (query commandDescription description formatWith: text).
  138991.             ^true].
  138992.     ^super queryCommand: query!
  138993.  
  138994. refresh
  138995.     ^self subclassResponsibility!
  138996.  
  138997. setAspectValue: anObject
  138998.     "Private - Set the value associated with the currently selected
  138999.     instance variable name to anObject."
  139000.  
  139001.     ^self subclassResponsibility! !
  139002.  
  139003. VisualObjectFinder comment:
  139004. ''!
  139005. !VisualObjectFinder class methodsFor!
  139006.  
  139007. findNonDolphinWindows
  139008.     ^FindNonDolphinWindows!
  139009.  
  139010. findNonDolphinWindows: aBoolean
  139011.     FindNonDolphinWindows := aBoolean!
  139012.  
  139013. initialize
  139014.     FindNonDolphinWindows := false.
  139015.     Smalltalk developmentSystem registerTool: self!
  139016.  
  139017. publishedAspects
  139018.     "Answer a <LookupTable> of the <Aspect>s published by the receiver."
  139019.  
  139020.     | aspects |
  139021.     aspects := super publishedAspects.
  139022.     aspects add: (Aspect boolean: #findNonDolphinWindows).
  139023.     ^aspects!
  139024.  
  139025. registerAsToolWith: aSmalltalkSystem!
  139026.  
  139027. uninitialize
  139028.     Smalltalk developmentSystem unregisterTool: self!
  139029.  
  139030. unregisterAsToolWith: aSmalltalkSystem
  139031. ! !
  139032.  
  139033. !VisualObjectFinder methodsFor!
  139034.  
  139035. browseObject
  139036.     "Private - Answer the object from the receiver that should be browsed"
  139037.  
  139038.     ^self value class!
  139039.  
  139040. cancelTrackingAt: arg1
  139041.     "This is an auto-generated target implementation for the protocol <mouseTrackerTarget>
  139042.     and remains to be correctly implemented."
  139043.  
  139044. !
  139045.  
  139046. continueTrackingAt: aPoint from: aPreviousPoint
  139047.     | foundObject |
  139048.     foundObject := self visualObjectAt: aPoint.
  139049.     foundObject notNil 
  139050.         ifTrue: [heading list: (Array with: foundObject)]
  139051.         ifFalse: [heading clear]!
  139052.  
  139053. createComponents
  139054.     "Create the presenters contained by the receiver"
  139055.  
  139056.     super createComponents.
  139057.     workspace := self add: ValueWorkspace new name: 'workspace'.
  139058.     heading := self add: ListPresenter new name: 'heading'.
  139059.     finderIcon := (self add: ImagePresenter new name: 'finderIcon') value: self icon.
  139060.      
  139061. !
  139062.  
  139063. createSchematicWiring
  139064.     "Create the trigger wiring for the receiver"
  139065.  
  139066.     super createSchematicWiring.
  139067.     finderIcon when: #leftButtonPressed: send: #findObject to: self.
  139068.     self model 
  139069.         when: #valueChanged
  139070.         send: #onValueChanged
  139071.         to: self
  139072.  
  139073. !
  139074.  
  139075. displayOn: aStream
  139076.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  139077.     would want to see it. This will be used as the label for the tab when the receiver is being displayed
  139078.     within the Flipper Inspector"
  139079.  
  139080.     aStream nextPutAll: 'Visual Object Finder'!
  139081.  
  139082. endTrackingAt: aPoint
  139083.     | foundObject |
  139084.  
  139085.     foundObject := self visualObjectAt: aPoint.
  139086.     self value: foundObject.
  139087. !
  139088.  
  139089. findObject
  139090.     "Start a mouse tracker to find objects beneath the mouse cursor"
  139091.  
  139092.     mouseTracker := MouseTracker forPresenter: self startingAt: 0@0.
  139093.     Cursor help showWhile: [mouseTracker startTracking: self]!
  139094.  
  139095. inspecteeSelection
  139096.     "Private - Answer the value associated with the currently selected object"
  139097.  
  139098.     ^self value.!
  139099.  
  139100. model: aValueModel
  139101.     "Connects the receiver to aValueModel"
  139102.  
  139103.     super model: aValueModel.
  139104.     workspace model: aValueModel.!
  139105.  
  139106. onValueChanged
  139107.     "Private - The receiver's value has changed; refresh our heading"
  139108.  
  139109.     heading list: (Array with: self value)!
  139110.  
  139111. onViewOpened
  139112.     super onViewOpened.
  139113.     self onValueChanged!
  139114.  
  139115. startTrackingAt: arg1
  139116. !
  139117.  
  139118. viewFromPoint: aPoint
  139119.     | under child clientPoint desktop lastDolphin |
  139120.     clientPoint := aPoint.
  139121.     under := desktop := View desktop.
  139122.     
  139123.     [child := UserLibrary default 
  139124.                 childWindowFromPointEx: under asParameter
  139125.                 pt: clientPoint asParameter
  139126.                 uFlags: CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT.
  139127.     child isNil or: [child = under asParameter]] 
  139128.             whileFalse: 
  139129.                 [clientPoint := desktop mapPoint: aPoint to: child.
  139130.                 under := View fromHandle: child.
  139131.                 (SessionManager inputState isDolphinWindow: under asParameter) 
  139132.                     ifTrue: [lastDolphin := under]].
  139133.     ^(under isDolphinWindow or: [self class findNonDolphinWindows]) 
  139134.         ifTrue: [under]
  139135.         ifFalse: [lastDolphin]!
  139136.  
  139137. visualObjectAt: aPoint
  139138.     "Private - Answer the visual object found under aPoint (in desktop coordinates) or nil if none"
  139139.  
  139140.     ^(self viewFromPoint: aPoint) 
  139141.         ifNotNil: 
  139142.             [:viewUnderCursor | 
  139143.             | localPoint |
  139144.             localPoint := View desktop mapPoint: aPoint to: viewUnderCursor.
  139145.             viewUnderCursor visualObjectAtPoint: localPoint]! !
  139146.  
  139147. InstVarInspector comment:
  139148. ''!
  139149. !InstVarInspector class methodsFor!
  139150.  
  139151. initialize
  139152.     "Private - Initialize the receiver's class variables.
  139153.         self initialize
  139154.     "
  139155.  
  139156.     Smalltalk developmentSystem registerTool: self.
  139157.     treeUpdateMode := #dynamic! !
  139158.  
  139159. !InstVarInspector methodsFor!
  139160.  
  139161. accept
  139162.     "Saves the current source as the value of the selected variable of the
  139163.     receivers object."
  139164.  
  139165.     "If there is no selection then the entire workspace is selected for consistency
  139166.     with saving method source. This also works rather better with word wrap too."
  139167.  
  139168.     | newObject oldObject |
  139169.     sourcePresenter view hasSelection ifFalse: [sourcePresenter view selectAll].
  139170.  
  139171.     "Evaluate the new value and keep a copy of the old value for undo purposes"
  139172.     newObject := sourcePresenter evaluateItIfFail: [^self].
  139173.     oldObject := self aspectValue.
  139174.     self setAspectValue: newObject.
  139175.     Command current undoWith: [self setAspectValue: oldObject]!
  139176.  
  139177. createComponents
  139178.     "Create the presenters contained by the receiver"
  139179.  
  139180.     super createComponents.
  139181.     sourcePresenter := self add: SmalltalkWorkspace new name: 'source'!
  139182.  
  139183. defaultBatchSize
  139184.     "Answers the default batch size of the receiver, i.e. the number of keyed elements to return at a time"
  139185.  
  139186.     ^500
  139187. !
  139188.  
  139189. displayOn: aStream
  139190.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  139191.     would want to see it. This will be used as the label for the tab when the receiver is being displayed
  139192.     within the Flipper Inspector"
  139193.  
  139194.     aStream nextPutAll: 'Instance Variables'!
  139195.  
  139196. getInstVarAccessorsOf: anInstVarAccessor
  139197.     "Private - Answers an <Array> of  <InstVarAccessors> to show as children of anInstVarAccessor"
  139198.  
  139199.     | fixedPart indexedPart inspectee batchAccessor |
  139200.     inspectee := [anInstVarAccessor value] on: Error do: [:ex | ex].
  139201.     fixedPart := (1 to: inspectee class instSize) collect: 
  139202.                     [:each | 
  139203.                     | value aspect |
  139204.                     value := inspectee instVarAt: each.
  139205.                     aspect := value class newAspect: InstVarAspect name: each.
  139206.                     aspect accessorFor: inspectee].
  139207.     batchAccessor := IndexedInstVarBatchAccessor subject: inspectee
  139208.                 batchSize: self defaultBatchSize.
  139209.     indexedPart := batchAccessor getBatchAccessors.
  139210.     ^fixedPart , indexedPart!
  139211.  
  139212. inspecteeChanged
  139213.     "Private - The receiver's model has had the currently inspected instance variable updated. 
  139214.     Force the receiver to update the variableNamesPresenter appropriately and 
  139215.     trigger an #inspecteeChanged to inform our interested parties"
  139216.  
  139217.     self instVarUpdated: self aspectAccessor.
  139218.     self trigger: #inspecteeChanged!
  139219.  
  139220. inspectIt
  139221.     "Open a new Inspector on the variable selected in variablesModel."
  139222.  
  139223.     self aspectValue inspect!
  139224.  
  139225. instVarUpdated: anInstVarAccessor
  139226.     "Private - The instance variable identified by anInstVarAccessor has been updated. 
  139227.     Ensure that our aspect tree model is refreshed appropriately"
  139228.  
  139229.     aspectTreePresenter model collapse: anInstVarAccessor!
  139230.  
  139231. object
  139232.     "Answer the object inspected by the receiver."
  139233.  
  139234.     ^self model value!
  139235.  
  139236. onAspectSelected
  139237.     "Private - The selection in the variablesModel has changed. Update the source presenter
  139238.     to show the value stored in the object at the selected variable."
  139239.  
  139240.     (aspectTreePresenter selectionIfNone: [^self]) selectIn: self!
  139241.  
  139242. onValueChanged
  139243.     "The object which is inspected by the receiver has been changed."
  139244.  
  139245.     self refresh!
  139246.  
  139247. queryCommand: query
  139248.     "Private - Enters details about a potential command for the receiver into the 
  139249.     <CommandQuery>,  query."
  139250.  
  139251.     | command accessor |
  139252.     command := query commandSymbol.
  139253.     accessor := self aspectAccessor.
  139254.     #accept == command 
  139255.         ifTrue: 
  139256.             [query isEnabled: (accessor notNil and: [accessor canSet]).
  139257.             ^true].
  139258.     ^super queryCommand: query!
  139259.  
  139260. refresh
  139261.     | instVarTreeModel inspectee accessor |
  139262.     inspectee := self object.
  139263.     accessor := (inspectee class newAspect: InstVarAspect name: 0) accessorFor: inspectee.
  139264.     instVarTreeModel := (ExpandingTreeModel withRoots: (Array with: accessor)) 
  139265.                 getChildrenBlock: [:x | self getInstVarAccessorsOf: x].
  139266.     aspectTreePresenter
  139267.         model: instVarTreeModel;
  139268.         expand: accessor;
  139269.         selectionOrNil: accessor!
  139270.  
  139271. selectAspect: anAspectAccessor
  139272.     | var |
  139273.     var := [anAspectAccessor value] on: Error do: [:ex | ex].
  139274.     sourcePresenter evaluationContext: var.
  139275.     sourcePresenter text: ([var printString] on: Error
  139276.                 do: 
  139277.                     [:e | 
  139278.                     | name |
  139279.                     name := anAspectAccessor name.
  139280.                     self unableToDisplayVariableErrorFormatString 
  139281.                         formatWith: name
  139282.                         with: var class name
  139283.                         with: e description
  139284.                         with: (name isInteger ifTrue: ['self basicAt: ' , name displayString] ifFalse: [name])])!
  139285.  
  139286. setAspectValue: anObject
  139287.     "Private - Set the value associated with the currently selected
  139288.     instance variable name to anObject."
  139289.  
  139290.     self aspectAccessor value: anObject.
  139291.     self inspecteeChanged!
  139292.  
  139293. unableToDisplayVariableErrorFormatString
  139294.     "Private - Answer the format string used to construct the error message text to be
  139295.     displayed in place of a variable value when a variable is selected that cannot be
  139296.     printed."
  139297.  
  139298.     ^'an invalid %2 [%3]%n%nEvaluate the following expression to debug:%n    self printString'
  139299. ! !
  139300.  
  139301. PublishedAspectInspector comment:
  139302. 'PublishedAspectInspector is a <compositePresenter> that displays, and allows the modification of, a hierarchy of the published <Aspect>s for its model. 
  139303.  
  139304. In order that the PublishedAspectInspector can display the aspects of a particular object, they must first be published by the object''s class. This is generally done by implementing the class side method, #publishedAspectsOfInstances, to add each of the <Aspect>s that need to be published to a <Set>. In certain specialised cases it may also be necessary to override the instance side method, #publishedAspects, in order to adjust this set by adding or removing aspects that are not discernible on the class side alone. If no aspects are explicitly published by the above means then any
  139305. public instance variable accessor methods are published by default (see Object>>publicAccessorAspect).
  139306.  
  139307. Typically, a PublishedAspectInspector is used as one of the renditions in the FlipperInspector and the main attribute editor in the View Composer. However, you''ll find it used in other places in the development image, such as for editing "Pool Dictionaries" and "Dolphin Options" within the main system folder.
  139308.  
  139309. Example (to browse the system options):
  139310. PublishedAspectInspector showOn: SmalltalkSystem registeredTools asOrderedCollection.
  139311.  
  139312. Instance Variables:
  139313.     aspectTreePresenter    <TreePresenter> holding the aspect hierarchy.
  139314.     aspectValueModel    <valueModel> holding the current value for the selected aspect.
  139315.     displayPresenter    <compositePresenter> where the selected aspect value will be presented.
  139316.     aspectPresenter    <presenter> used to display the selected aspect in its recommended format.
  139317.     workspacePresenter    <presenter> used to display the selected aspect in a <ValueWorkspace>
  139318. '!
  139319. !PublishedAspectInspector class methodsFor!
  139320.  
  139321. initialize
  139322.     "Private - Initialize the receiver's class variables.
  139323.         self initialize
  139324.     "
  139325.  
  139326.     Smalltalk developmentSystem registerTool: self.
  139327.     treeUpdateMode := #lazy!
  139328.  
  139329. shellOn: anObject
  139330.     "Open an Inspector shell displaying on anObject. 
  139331.     Answer the new Inspector."
  139332.  
  139333.     | inspector shell |
  139334.     shell := InspectorShell create.
  139335.     shell caption: 'Inspecting ', anObject basicPrintString.
  139336.     inspector := self createIn: shell on: (ValueHolder with: anObject).
  139337.     inspector view arrangement: #center.
  139338.     shell view validateLayout.
  139339.     shell show setInitialFocus.
  139340.     ^inspector! !
  139341.  
  139342. !PublishedAspectInspector methodsFor!
  139343.  
  139344. addToCommandRoute: route
  139345.     "Update the <OrderedCollection>, path, with the receiver's contribution to the command path
  139346.     held by the <CommandPolicy>, route. Answer self to have the command policy decide where
  139347.     to go next."
  139348.  
  139349.     route appendPresenter: self.
  139350.     aspectPresenter notNil ifTrue: [route appendPresenter: self currentCard].
  139351. !
  139352.  
  139353. aspectChanged: aSymbol
  139354.     "Inform the receiver that its model has had an aspect or aspects with the
  139355.     <Symbol> name, aSymbol, externally updated. Update all displayed aspects 
  139356.     with this name, if any."
  139357.  
  139358.     | accessors |
  139359.     accessors := aspectTreePresenter view displayedContents 
  139360.                 select: [:each | each aspectDescriptor name == aSymbol].
  139361.     accessors isEmpty 
  139362.         ifFalse: 
  139363.             [accessors do: [:each | aspectTreePresenter model collapse: each].
  139364.             self onAspectSelected]!
  139365.  
  139366. aspectChanged: aSymbol of: anObject
  139367.     "Inform the receiver that its model has had the aspect named by the <Symbol,
  139368.     aSymbol, and <Object> subject, anObject, externally updated.
  139369.     Force the tree to update if it is displaying this aspect."
  139370.  
  139371.     | aspect |
  139372.     aspect := aspectTreePresenter view displayedContents 
  139373.                 detect: [:each | each aspectDescriptor name == aSymbol and: [each subject == anObject]]
  139374.                 ifNone: [].
  139375.     aspect isNil 
  139376.         ifFalse: 
  139377.             [aspectTreePresenter model collapse: aspect.
  139378.             self onAspectSelected]!
  139379.  
  139380. aspectTree
  139381.     ^aspectTreePresenter model!
  139382.  
  139383. createAspectPresenters: anAspectAccessor
  139384.     "Private - Create the Workspace and Value presenters for the currently selected aspect"
  139385.  
  139386.     aspectPresenter := anAspectAccessor aspectDescriptor presenterFor: aspectValueModel
  139387.                 in: displayPresenter.
  139388.     (aspectPresenter isKindOf: ValueWorkspace) 
  139389.         ifTrue: 
  139390.             ["This is a workspace anyway so no need to create another"
  139391.  
  139392.             aspectPresenter view arrangement: aspectPresenter]
  139393.         ifFalse: 
  139394.             ["Add a separate workspace onto the same model"
  139395.  
  139396.             workspacePresenter := ValueWorkspace createIn: displayPresenter on: aspectValueModel.
  139397.             workspacePresenter view arrangement: workspacePresenter.
  139398.             (aspectPresenter view)
  139399.                 arrangement: aspectPresenter;
  139400.                 zOrderTop].
  139401.     aspectPresenter ensureVisible!
  139402.  
  139403. createComponents
  139404.     "Create the presenters contained by the receiver"
  139405.  
  139406.     super createComponents.
  139407.     displayPresenter := self add: Presenter new name: 'display'!
  139408.  
  139409. createSchematicWiring
  139410.     "Create the trigger wiring for the receiver"
  139411.  
  139412.     super createSchematicWiring.
  139413.     aspectTreePresenter 
  139414.         when: #actionPerformed
  139415.         send: #editAspect
  139416.         to: self.
  139417. !
  139418.  
  139419. currentCard
  139420.     "Answers the aspect presenter card that is current visible"
  139421.  
  139422.     ^displayPresenter view currentCard presenter!
  139423.  
  139424. displayOn: aStream
  139425.     "Append, to aStream, a String whose characters are a representation of the receiver as a user
  139426.     would want to see it. This will be used as the label for the tab when the receiver is being displayed
  139427.     within the Flipper Inspector"
  139428.  
  139429.     aStream nextPutAll: 'Published Aspects'!
  139430.  
  139431. editAspect
  139432.     "Edit the currently selected aspect using the current aspect presenter"
  139433.  
  139434.     self aspectAccessor editUsing: aspectPresenter!
  139435.  
  139436. getSubAspectAccessorsFor: anAspectAccessor
  139437.     "Private - Answer a <sequencedReadableCollection> of the <AspectAccessor> child nodes 
  139438.     below the <AspectAccessor> argument."
  139439.  
  139440.     | subValue subject |
  139441.     
  139442.     [subValue := anAspectAccessor value.
  139443.     subject := anAspectAccessor isMutable ifTrue: [subValue] ifFalse: [subValue copy]] 
  139444.             on: Error
  139445.             do: [:ex | subValue := subject := ex].
  139446.     ^(self getSubAspectsFor: subValue) collect: [:each | each accessorFor: subject]!
  139447.  
  139448. getSubAspectsFor: anObject
  139449.     "Private - Answer a <sequencedReadableCollection> of the Aspects below anAspectAccessor"
  139450.  
  139451.     | aspects |
  139452.     aspects := #().
  139453.     
  139454.     [aspects := anObject publishedAspects reject: [:each | each name == #yourself].
  139455.     aspects := aspects asSortedCollection] 
  139456.             on: MessageNotUnderstood
  139457.             do: 
  139458.                 [:ex | 
  139459.                 "Some KeyedAspects may have keys that don't respond to #<=. In such cases return an unsorted collection"
  139460.  
  139461.                 ]
  139462.             on: Error
  139463.             do: 
  139464.                 [:ex | 
  139465.                 "If an error occurs attempting to access publishedAspects of the object, answer an empty collection"
  139466.  
  139467.                 ex toTrace].
  139468.     ^aspects!
  139469.  
  139470. modelAspect
  139471.     "Private - Answer an AspectAccessor for the receiver's model"
  139472.  
  139473.     ^(self value class newAspect: Aspect name: #yourself) beMutable beReadOnly 
  139474.         accessorFor: self value!
  139475.  
  139476. newAspectValue: anAspectAccessorOrNil
  139477.     anAspectAccessorOrNil isNil 
  139478.         ifTrue: [aspectValueModel := nil]
  139479.         ifFalse: 
  139480.             [aspectValueModel := ValueHolder comparisonPolicy: SearchPolicy never.
  139481.             aspectValueModel 
  139482.                 when: #valueChanged
  139483.                 send: #onAspectValueChanged:
  139484.                 to: self
  139485.                 with: anAspectAccessorOrNil]!
  139486.  
  139487. onAspectSelected
  139488.     "Private - An aspect accessor has been selected within the aspect tree. Transfer the new aspect value
  139489.     to our local aspectValueModel buffer and then create the appropriate aspect presenters."
  139490.  
  139491.     self aspectAccessor 
  139492.         ifNil: 
  139493.             [self removeAspectPresenters.
  139494.             "Replacing the entire value model avoids any chance of any old observers seeing future change events"
  139495.             self newAspectValue: nil.
  139496.             displayPresenter view invalidate]
  139497.         ifNotNil: [:accessor | accessor selectIn: self]!
  139498.  
  139499. onAspectValueChanged: anAspectAccessor
  139500.     "Private - The currently inspected aspect value has been updated."
  139501.  
  139502.     anAspectAccessor name == #yourself 
  139503.         ifFalse: 
  139504.             ["If the accessor cannot be set, warn the user and restore the original value"
  139505.  
  139506.             anAspectAccessor canSet 
  139507.                 ifFalse: 
  139508.                     [MessageBox 
  139509.                         errorMsg: ('The %1 aspect of the %2 is read-only, or the object does not understand the setter message.' 
  139510.                                 formatWith: anAspectAccessor name printString
  139511.                                 with: anAspectAccessor subject class name)
  139512.                         caption: 'Inspector cannot set this value'.
  139513.                     self onAspectSelected.
  139514.                     ^self].
  139515.             anAspectAccessor editedValue: aspectValueModel value.
  139516.             self propagate: anAspectAccessor].
  139517.     self refreshAccessor: anAspectAccessor.
  139518.     self trigger: #inspecteeChanged!
  139519.  
  139520. onValueChanged
  139521.     "Private - The root object being inspected has changed so initialize the tree appropriately.
  139522.     We use an ExpandingTreeModel that asks the receiver for the children of an aspect as it
  139523.     is dynamically expanded."
  139524.  
  139525.     super onValueChanged.
  139526.     self refresh!
  139527.  
  139528. propagate: anAspectAccessor
  139529.     "Private - Sets aspectAccessor with the given value. For non-mutable aspects the change is propagated
  139530.     up the aspect parent chain"
  139531.  
  139532.     | aspectTree thisAccessor parentAccessor propagateValue |
  139533.     aspectTree := self aspectTree.
  139534.     (aspectTree includes: anAspectAccessor) ifFalse: [^self].
  139535.     thisAccessor := anAspectAccessor.
  139536.     propagateValue := true.
  139537.     
  139538.     [parentAccessor := aspectTree parentOf: thisAccessor.
  139539.     parentAccessor notNil] whileTrue: 
  139540.                 [propagateValue 
  139541.                     ifTrue: 
  139542.                         [parentAccessor canSet 
  139543.                             ifTrue: 
  139544.                                 [parentAccessor isMutable 
  139545.                                     ifFalse: 
  139546.                                         ["Note that we don't want to store back the actual subject, as that might result
  139547.                                  in the parent object referencing the same object as the accessor, which would
  139548.                                  mean the next modification in the inspector would update it internally"
  139549.  
  139550.                                         parentAccessor value: thisAccessor subject copy]]
  139551.                             ifFalse: [propagateValue := false]].
  139552.                 "Each parent is instructed to refresh regardless of whether actually updated, as its display value may have changed"
  139553.                 aspectTree refresh: parentAccessor.
  139554.                 thisAccessor := parentAccessor]!
  139555.  
  139556. queryCommand: query
  139557.     "Private - Enters details about a potential command for the receiver into the 
  139558.     <CommandQuery>,  query."
  139559.  
  139560.     | command accessor |
  139561.     command := query commandSymbol.
  139562.     accessor := self aspectAccessor.
  139563.     (#(#editAspect) includes: command) 
  139564.         ifTrue: 
  139565.             [query isEnabled: (accessor notNil and: [accessor canEdit]).
  139566.             ^true].
  139567.     ^super queryCommand: query!
  139568.  
  139569. refresh
  139570.     | aspectTreeModel rootAspect selectionPath |
  139571.     rootAspect := self modelAspect.
  139572.     selectionPath := self isOpen ifTrue: [self selectionPath] ifFalse: [#()].
  139573.     aspectTreeModel := (ExpandingTreeModel withRoots: (Array with: rootAspect)) 
  139574.                 getChildrenBlock: (MessageSend 
  139575.                         receiver: self
  139576.                         selector: #getSubAspectAccessorsFor:
  139577.                         arguments: #(nil)).
  139578.     aspectTreePresenter
  139579.         model: aspectTreeModel;
  139580.         expand: rootAspect.
  139581.     self selectionPath: selectionPath!
  139582.  
  139583. refreshAccessor: anAspectAccessor 
  139584.     "Private - The value of aspectAccessor has been changed so refresh the receiver's display to reflect this"
  139585.  
  139586.     | aspectTree selectionPath |
  139587.     aspectTree := self aspectTree.
  139588.     (aspectTree includes: anAspectAccessor) ifFalse: [^self].
  139589.     selectionPath := self selectionPath.
  139590.     aspectTreePresenter noEventsDo: 
  139591.             [| parentAspect |
  139592.             parentAspect := aspectTree parentOf: anAspectAccessor.
  139593.             aspectTreePresenter view noRedrawDo: 
  139594.                     [parentAspect isNil 
  139595.                         ifTrue: [aspectTree collapse: anAspectAccessor]
  139596.                         ifFalse: 
  139597.                             [#todo.
  139598.                             "I think we may need to collapse the parent in case siblings change shape (e.g. ToolbarSystemButton),
  139599.                         but if we do that then aspectPresenter's get recreated and selection is lost, a problem, e.g., when 
  139600.                         rearranging the elements of a sequenceable collection."
  139601.                             false 
  139602.                                 ifTrue: 
  139603.                                     [aspectTree collapse: parentAspect.
  139604.                                     aspectTreePresenter expand: parentAspect]
  139605.                                 ifFalse: [(aspectTree childrenOf: parentAspect) do: [:each | aspectTree collapse: each]]
  139606.                             "Refresh is necessary if not using dynamic tree update mode"
  139607.                             "aspectTree refresh: parentAspect"].
  139608.                     "Always keep the aspect expanded"
  139609.                     aspectTreePresenter expand: anAspectAccessor]].
  139610.     self selectionPath: selectionPath!
  139611.  
  139612. removeAspectPresenters
  139613.     "Private - Remove any existing presenters. Note that the act of removing an aspectPresenter
  139614.     may cause modified data to be flushed back to the aspect. This in turn may cause
  139615.     the aspect to be reselected in the aspectTreePresenter (depending on the nature
  139616.     of the aspect being flushed. To avoid receiving a recursive change notification we
  139617.     protect the removal code within a #noEventsDo: block"
  139618.  
  139619.     displayPresenter view noRedrawDo: 
  139620.             [aspectTreePresenter noEventsDo: 
  139621.                     [displayPresenter subPresenters shallowCopy do: [:each | displayPresenter remove: each].
  139622.                     aspectPresenter := workspacePresenter := nil]]!
  139623.  
  139624. selectAspect: anAspectAccessor
  139625.     | aspectValue errorOccurred |
  139626.     self removeAspectPresenters.
  139627.     errorOccurred := false.
  139628.     "Replacing the entire value model avoids any chance of any old observers seeing future change events"
  139629.     self newAspectValue: anAspectAccessor.
  139630.     aspectValue := [anAspectAccessor editableValue] on: Error
  139631.                 do: 
  139632.                     [:ex | 
  139633.                     errorOccurred := true.
  139634.                     aspectValue := ex].
  139635.     "Set the value without triggering a change event"
  139636.     aspectValueModel setValue: aspectValue.
  139637.     errorOccurred 
  139638.         ifFalse: 
  139639.             [displayPresenter view noRedrawDo: 
  139640.                     [[self createAspectPresenters: anAspectAccessor] on: Error
  139641.                         do: 
  139642.                             [:ex | 
  139643.                             Notification 
  139644.                                 signal: ('Error inspecting %1: ''%2''' formatWith: aspectValue basicPrintString
  139645.                                         with: ex description)]]].
  139646.     displayPresenter view invalidate!
  139647.  
  139648. selectionPath
  139649.     "Private - Answer a path of the names of the aspects from the root to the currently 
  139650.     selected aspect."
  139651.  
  139652.     | answer current aspectTree |
  139653.     answer := OrderedCollection new.
  139654.     current := self aspectAccessor.
  139655.     aspectTree := self aspectTree.
  139656.     [current isNil] whileFalse: 
  139657.             [answer addFirst: current name.
  139658.             current := aspectTree parentOf: current].
  139659.     ^answer!
  139660.  
  139661. selectionPath: aSequencedReadableCollection 
  139662.     "Private - Re-establish a selection at an arbitrary depth in the tree
  139663.     by walking a path of aspect names."
  139664.  
  139665.     | aspectTree current i last newSelection |
  139666.     current := nil.
  139667.     aspectTree := self aspectTree.
  139668.     i := 1.
  139669.     last := aSequencedReadableCollection size.
  139670.     [i > last] whileFalse: 
  139671.             [| name |
  139672.             name := aSequencedReadableCollection at: i.
  139673.             newSelection := (aspectTree childrenOf: newSelection) 
  139674.                         detect: [:eachAspect | eachAspect name = name]
  139675.                         ifNone: 
  139676.                             [i := last.
  139677.                             newSelection].
  139678.             i := i + 1].
  139679.     aspectTreePresenter selectionOrNil: newSelection!
  139680.  
  139681. setAspectValue: anObject
  139682.     aspectValueModel value: anObject! !
  139683.  
  139684. RichTextPresenter comment:
  139685. 'RichTextPresenter is a <valuePresenter> that displays a <valueModel> onto a <richString> value. A RichTextPresenter can be connected to any <valueView> capable of displaying <richString> values. Often, this will be a <RichTextEdit> although alternative views may be chosen with the installation of an appropriate <typeConverter>.'!
  139686. !RichTextPresenter class methodsFor!
  139687.  
  139688. defaultModel
  139689.     "Answer a default model to be assigned to the receiver when it
  139690.     is initialized."
  139691.  
  139692.     ^String new asRichText asValue! !
  139693.  
  139694. !RichTextPresenter methodsFor!
  139695.  
  139696. alignParagraphCenter
  139697.     "Align the receiver's paragraph selection to centre"
  139698.  
  139699.     self view paragraphAlignment: #center!
  139700.  
  139701. alignParagraphLeft
  139702.     "Align the receiver's selection paragraph to the left"
  139703.  
  139704.     self view paragraphAlignment: #left!
  139705.  
  139706. alignParagraphRight
  139707.     "Align the receiver's paragraph selection to the right"
  139708.  
  139709.     self view paragraphAlignment: #right!
  139710.  
  139711. bePlain
  139712.     "Set the selection in the receiver to plain text"
  139713.  
  139714.     self view bePlain!
  139715.  
  139716. chooseSelectionColor
  139717.     "Choose the color for the selection in the receiver"
  139718.  
  139719.     ColorDialog showModalOn: (self view aspectValue: #selectionColor)
  139720. !
  139721.  
  139722. chooseSelectionFont
  139723.     "Choose the font for the selection in the receiver"
  139724.  
  139725.     FontDialog showModalOn: (self view aspectValue: #selectionFont)
  139726. !
  139727.  
  139728. queryCommand: query
  139729.     "Private - Enters details about a potential command for the receiver into 
  139730.     the <CommandQuery>, query"
  139731.  
  139732.     | cmd answer |
  139733.     answer := super queryCommand: query.        "Supersend to get enablement of understood selectors"
  139734.     cmd := query commandSymbol.
  139735.  
  139736.     cmd == #toggleBold ifTrue: [
  139737.         query isChecked: self view isBold.
  139738.         ^true].
  139739.     cmd == #toggleItalic ifTrue: [
  139740.         query isChecked: self view isItalic.
  139741.         ^true].
  139742.     cmd == #toggleUnderlined ifTrue: [
  139743.         query isChecked: self view isUnderlined.
  139744.         ^true].
  139745.  
  139746.     cmd == #alignParagraphLeft ifTrue: [
  139747.         query isChecked: self view paragraphAlignment == #left.
  139748.         ^true].
  139749.     cmd == #alignParagraphCenter ifTrue: [
  139750.         query isChecked: self view paragraphAlignment == #center.
  139751.         ^true].
  139752.     cmd == #alignParagraphRight ifTrue: [
  139753.         query isChecked: self view paragraphAlignment == #right.
  139754.         ^true].
  139755.  
  139756.     ^answer!
  139757.  
  139758. toggleBold
  139759.     "Toggle bold mode for the selection in the receiver"
  139760.  
  139761.     self view isBold: self view isBold not!
  139762.  
  139763. toggleItalic
  139764.     "Toggle italic mode for the selection in the receiver"
  139765.  
  139766.     self view isItalic: self view isItalic not!
  139767.  
  139768. toggleUnderlined
  139769.     "Toggle underline mode for the selection in the receiver"
  139770.  
  139771.     self view isUnderlined: self view isUnderlined not! !
  139772.  
  139773. StringResource comment:
  139774. ''!
  139775. !StringResource class methodsFor!
  139776.  
  139777. defaultWritable
  139778.     "Answer a writable resource suitable for containing a StringResource.
  139779.     By default, StringResources are stored in a dummy accessor."
  139780.  
  139781.     ^self dummy! !
  139782.  
  139783. !StringResource methodsFor!
  139784.  
  139785. edit: aResourceIdentifier
  139786.         "Invoke a suitable editor to edit the receiver with the given identity."
  139787.     
  139788.         | string |
  139789.         string := Prompter
  139790.             on: self load
  139791.             prompt: 'Value:'
  139792.             caption: aResourceIdentifier displayString.
  139793.     
  139794.         string notNil
  139795.             ifTrue: [self save: string].! !
  139796.  
  139797. ViewResource comment:
  139798. ''!
  139799. !ViewResource class methodsFor!
  139800.  
  139801. fileExtension
  139802.     "Private - Answer the file extension associated with resources of this type when
  139803.     stored in files."
  139804.  
  139805.     ^'vu'!
  139806.  
  139807. icon
  139808.     "Answers an Icon that can be used to represent this class"
  139809.  
  139810.     ^View icon!
  139811.  
  139812. save: aView toFiler: anSTBOutFiler
  139813.     "Save aView to the STBOutFiler provided."
  139814.  
  139815.     | viewProxy hadVisibleStyle |
  139816.     hadVisibleStyle := aView hasVisibleStyle: false.
  139817.  
  139818.     (viewProxy := aView filerProxy)    
  139819.         beTopView.
  139820.  
  139821.     aView hasVisibleStyle: hadVisibleStyle.
  139822.  
  139823.     (aView isKindOf: ShellView)
  139824.         ifTrue: [viewProxy beNotChild].
  139825.  
  139826.     anSTBOutFiler
  139827.         override: aView with: viewProxy;
  139828.         nextPut: aView! !
  139829.  
  139830. !ViewResource methodsFor!
  139831.  
  139832. defaultContext
  139833.     "Private - Answer the default context to use when one is not provided."
  139834.  
  139835.     ^DesktopView current!
  139836.  
  139837. edit: aResourceIdentifier
  139838.         "Invoke a suitable editor to edit the receiver with the given identity."
  139839.     
  139840.         Smalltalk developmentSystem openViewComposerEmpty openOn: aResourceIdentifier!
  139841.  
  139842. isViewResource
  139843.     "Answer whether the receiver represents a View resource."
  139844.  
  139845.     ^true!
  139846.  
  139847. show: aResourceIdentifier
  139848.     "Display the receiver in a suitable manner with the given identity."
  139849.  
  139850.     ^aResourceIdentifier owningClass show: aResourceIdentifier name! !
  139851.  
  139852. ResourceDummyAccessor comment:
  139853. ''!
  139854. !ResourceDummyAccessor class methodsFor!
  139855.  
  139856. stbVersion
  139857.     "Answer the current binary filer version number for instances of the receiver."
  139858.  
  139859.     ^1! !
  139860.  
  139861. !ResourceDummyAccessor methodsFor!
  139862.  
  139863. loadWithContext: context
  139864.     "Answer an instance of the resource held in the receiver.
  139865.     If the new instance requires a context in which to live, this is provided by context."
  139866.  
  139867.     ^object!
  139868.  
  139869. object: anObject
  139870.     "Set the receiver's object inst var to anObject. This will be answered directly on load."
  139871.  
  139872.     object := anObject!
  139873.  
  139874. save: anObject as: aResourceClass
  139875.     "Save out anObject in the format dictated by aResourceClass."
  139876.  
  139877.     self object: anObject.
  139878.     self isChanged: true! !
  139879.  
  139880. ResourceGeneratorAccessor comment:
  139881. ''!
  139882. !ResourceGeneratorAccessor class methodsFor!
  139883.  
  139884. class: aClass selector: aSelector
  139885.     "Answer a new instance of the receiver initialized from the parameters."
  139886.  
  139887.     ^self new
  139888.         class: aClass selector: aSelector;
  139889.         yourself!
  139890.  
  139891. stbVersion
  139892.     "Answer the current binary filer version number for instances of the receiver."
  139893.  
  139894.     ^1! !
  139895.  
  139896. !ResourceGeneratorAccessor methodsFor!
  139897.  
  139898. canSave
  139899.     "Answer whether the receiver is capable of saving a resource."
  139900.  
  139901.     ^false!
  139902.  
  139903. class: aClass selector: aSelector
  139904.     "Set the receiver's inst vars from the parameters."
  139905.  
  139906.     class := aClass.
  139907.     selector := aSelector!
  139908.  
  139909. loadWithContext: context
  139910.     "Answer an instance of the resource held represented by the receiver.
  139911.     The new instance requires a context in which to live, this is provided by context."
  139912.  
  139913.     ^class perform: selector with: context!
  139914.  
  139915. save: anObject as: aResource
  139916.     "Save out anObject in the format dictated by aResourceClass."
  139917.  
  139918.     ^self shouldNotImplement! !
  139919.  
  139920. ResourceSTBByteArrayAccessor comment:
  139921. ''!
  139922. !ResourceSTBByteArrayAccessor class methodsFor!
  139923.  
  139924. onByteArray: aByteArray
  139925.     "Answer a new instance of the receiver capable of loading instances from the
  139926.     data in STB format in aByteArray."
  139927.  
  139928.     ^self new
  139929.         byteArray: aByteArray
  139930.         yourself!
  139931.  
  139932. stbConvertFromVersion1: version1Array
  139933.     "Private - Convert version1Array to version 2 format and answer the new Array.
  139934.  
  139935.     instVarAt:    Version 2        Version 1
  139936.     ----------    ---------        ---------
  139937.         1        flags        flags
  139938.         2        classLocator    byteArray
  139939.         3        byteArray"
  139940.  
  139941.     ^Array
  139942.         with: (version1Array at: 1)
  139943.         with: ClassLocator new
  139944.         with: (version1Array at: 2)!
  139945.  
  139946. stbVersion
  139947.     "Answer the current binary filer version number for instances of the receiver."
  139948.  
  139949.     ^2! !
  139950.  
  139951. !ResourceSTBByteArrayAccessor methodsFor!
  139952.  
  139953. byteArray
  139954.     "Private - Answer the receiver's byteArray inst var."
  139955.  
  139956.     ^byteArray!
  139957.  
  139958. byteArray: aByteArray
  139959.     "Private - Set the receiver's byteArray inst var to aByteArray. This is the STB format
  139960.     data file from which the receiver will load instances of the resource."
  139961.  
  139962.     byteArray := aByteArray!
  139963.  
  139964. classLocator
  139965.     "Private - Answer the class locator used to import referenced classes into the image"
  139966.  
  139967.     ^classLocator!
  139968.  
  139969. classLocator: aClassLocator
  139970.     "Private - Set the receiver's classLocator inst var to aClassLocator.
  139971.     This will be injected into the filer used to load the resource so that
  139972.     any references to remote classes can be resolved."
  139973.  
  139974.     classLocator := aClassLocator!
  139975.  
  139976. copy
  139977.     "Private - Answer a copy of the reciever suitable for putting on the ResourcManager clipboard."
  139978.  
  139979.     ^super copy
  139980.         byteArray: byteArray copy;
  139981.         yourself!
  139982.  
  139983. hiddenObjects
  139984.     "Private - Answers a <collection> of the <Object>s that are contained in the receiver's resource
  139985.     Implementation note. This is not particularly fast since it loads the resource and any external
  139986.     classes it needs into the image. View resources will not be realized as windows however."
  139987.  
  139988.     ^(STBInFiler on: byteArray readStream)
  139989.         basicNext;
  139990.         readMap!
  139991.  
  139992. initialize
  139993.     "Private - Initialize the receiver."
  139994.  
  139995.     super initialize.
  139996.     self classLocator: ClassLocator new!
  139997.  
  139998. loadWithContext: context
  139999.     "Answer an instance of the resource held in the STB format ByteArray associated with the receiver.
  140000.     If the new instance requires a context in which to live, this is provided by context."
  140001.  
  140002.     | stream |
  140003.     stream := ReadStream on: byteArray.
  140004.     ^(STBInFiler on: stream)
  140005.         classLocator: classLocator copyWithCodeBase;
  140006.         context: context;
  140007.         next!
  140008.  
  140009. makeByteArrayClass: aResourceClass usingContext: context
  140010.     "Private - Mutate the receiver to a ResourceSTBByteArrayAccessor using the context to load
  140011.     the resource (if required), and the resources class aResourceClass to resave it."!
  140012.  
  140013. makeFile: aString class: aResourceClass usingContext: context
  140014.     "Private - Mutate the receiver to a ResourceSTBFileAccessor using the context to load
  140015.     the resource (if required), and the resources class aResourceClass to resave it into
  140016.     an STB file named aString."
  140017.  
  140018.     | stream |
  140019.     stream := FileStream write: aString text: false.
  140020.     [
  140021.         stream nextPutAll: byteArray
  140022.     ] ensure: [stream close].
  140023.  
  140024.     self become: (ResourceSTBFileAccessor onFileName: aString)
  140025. !
  140026.  
  140027. save: anObject as: aResourceClass
  140028.     "Save out anObject in the format dictated by aResourceClass."
  140029.  
  140030.     | stream |
  140031.     stream := ByteArray writeStream: 256.
  140032.     aResourceClass save: anObject toFiler: (STBOutFiler on: stream).
  140033.     byteArray := stream contents.
  140034.     self isChanged: true!
  140035.  
  140036. stbSaveOn: anSTBOutFiler
  140037.     "Output the receiver to anSTBOutFiler.
  140038.     The proxy is required so that we can propagate the codebase of the loading
  140039.     STBInFiler into the reconstituted accessor thus allowing us to resolve remote
  140040.     class references within a resource."
  140041.  
  140042.     anSTBOutFiler saveObject: self as: (STBResourceSTBByteArrayAccessorProxy for: self)! !
  140043.  
  140044. ResourceSTBFileAccessor comment:
  140045. ''!
  140046. !ResourceSTBFileAccessor class methodsFor!
  140047.  
  140048. onFileName: aString
  140049.     "Answer a new instance of the receiver capable of loading instances of the contents
  140050.     of the STB file named aString."
  140051.  
  140052.     ^self new
  140053.         fileName: aString;
  140054.         yourself!
  140055.  
  140056. stbConvertFromVersion1: version1Array
  140057.     "Private - Convert version1Array to version 2 format and answer the new Array.
  140058.  
  140059.     instVarAt:    Version 1        Version 0
  140060.     ----------    ---------        ---------
  140061.         1        flags        flags
  140062.         2        classLocator    fileName
  140063.         3        fileName"
  140064.  
  140065.     ^Array
  140066.         with: (version1Array at: 1)
  140067.         with: ClassLocator new
  140068.         with: (version1Array at: 2)!
  140069.  
  140070. stbVersion
  140071.     "Answer the current binary filer version number for instances of the receiver."
  140072.  
  140073.     ^2! !
  140074.  
  140075. !ResourceSTBFileAccessor methodsFor!
  140076.  
  140077. asInternalAccessor
  140078.     "Private - Answer the receiver or a new resource accessor whose resources data is
  140079.     held entirely within the image."
  140080.  
  140081.     ^ResourceSTBByteArrayAccessor onByteArray: self byteArray!
  140082.  
  140083. byteArray
  140084.     "Private - Answer a ByteArray of the contents of the receivers file."
  140085.  
  140086.     | stream |
  140087.     stream := FileStream read: fileName text: false.
  140088.     ^[stream contents] ensure: [stream close]!
  140089.  
  140090. classLocator
  140091.     "Private - Answer the class locator used to import referenced classes into the image"
  140092.  
  140093.     ^classLocator!
  140094.  
  140095. classLocator: aClassLocator
  140096.     "Private - Set the receiver's classLocator inst var to aClassLocator.
  140097.     This will be injected into the filer used to load the resource so that
  140098.     any references to remote classes can be resolved."
  140099.  
  140100.     classLocator := aClassLocator!
  140101.  
  140102. copy
  140103.     "Private - Answer a copy of the reciever suitable for putting on the ResourcManager clipboard."
  140104.  
  140105.     | stream |
  140106.     stream := FileStream read: fileName text: false.
  140107.     ^[ResourceSTBByteArrayAccessor onByteArray: stream contents] ensure: [stream close]!
  140108.  
  140109. fileName
  140110.     "Private - Answer the receiver's fileName inst var to aString. This is the name
  140111.     of the STB file from which the receiver will load instances of the resource."
  140112.  
  140113.     ^fileName!
  140114.  
  140115. fileName: aString
  140116.     "Private - Set the receiver's fileName inst var to aString. This is the name
  140117.     of the STB file from which the receiver will load instances of the resource."
  140118.  
  140119.     fileName := aString!
  140120.  
  140121. hiddenObjects
  140122.     "Private - Answers a <collection> of the <Object>s that are contained in the receiver's resource
  140123.     Implementation note. This is not particularly fast since it loads the resource and any external
  140124.     classes it needs into the image. View resources will not be realized as windows however."
  140125.  
  140126.     | stream |
  140127.     stream := FileStream read: fileName text: false.
  140128.     ^
  140129.     [(STBInFiler on: stream)
  140130.         basicNext;
  140131.         readMap] ensure: [stream close]!
  140132.  
  140133. initialize
  140134.     "Private - Initialize the receiver."
  140135.  
  140136.     super initialize.
  140137.     self classLocator: ClassLocator new!
  140138.  
  140139. isInternalAccessor
  140140.     "Answer true if the receiver denotes a resource that is held internal to the image"
  140141.  
  140142.     ^false!
  140143.  
  140144. loadWithContext: context
  140145.     "Answer an instance of the resource held in the STB file associated with the receiver.
  140146.     If the new instance requires a context in which to live, this is provided by context."
  140147.  
  140148.     | stream |
  140149.     stream := FileStream read: fileName text: false.
  140150.     ^
  140151.     [(STBInFiler on: stream)
  140152.         classLocator: classLocator copyWithCodeBase;
  140153.         context: context;
  140154.         next] 
  140155.             ensure: [stream close]!
  140156.  
  140157. makeByteArrayClass: aResourceClass usingContext: context
  140158.     "Private - Mutate the receiver to a ResourceSTBByteArrayAccessor using the context to load
  140159.     the resource (if required), and the resources class aResourceClass to resave it."
  140160.  
  140161.     self become: self asInternalAccessor!
  140162.  
  140163. makeFile: aString class: aResourceClass usingContext: context
  140164.     "Private - Mutate the receiver to a ResourceSTBFileAccessor using the context to load
  140165.     the resource (if required), and the resources class aResourceClass to resave it into
  140166.     an STB file named aString."
  140167. !
  140168.  
  140169. save: anObject as: aResourceClass
  140170.     "Save out anObject in the format dictated by aResourceClass."
  140171.  
  140172.     | stream |
  140173.     stream := FileStream write: fileName text: false.
  140174.     [
  140175.         aResourceClass save: anObject toFiler: (STBOutFiler on: stream)
  140176.     ] ensure: [stream close]!
  140177.  
  140178. stbSaveOn: anSTBOutFiler
  140179.     "Output the receiver to anSTBOutFiler.
  140180.     If anSTBOutFiler has a non-nil context we assume this to be a Boolean
  140181.     that identifies whether resources should be saved as a single file. If so, we
  140182.     store the receivers resource file data inline, and regenerate the file on load.
  140183.     Also, the proxy is required so that we can propagate the codebase of the loading
  140184.     STBInFiler into the reconstituted accessor thus allowing us to resolve remote
  140185.     class references within a resource."
  140186.  
  140187.     | singleFile proxy |
  140188.     singleFile := anSTBOutFiler context.
  140189.  
  140190.     proxy := (singleFile notNil and: [singleFile])
  140191.         ifTrue: [STBResourceSTBFileAccessorProxy withEmbeddedFile: self]
  140192.         ifFalse: [STBResourceSTBFileAccessorProxy withExternalFile: self].
  140193.  
  140194.     anSTBOutFiler saveObject: self as: proxy! !
  140195.  
  140196. AlwaysSearchPolicy comment:
  140197. ''!
  140198. !AlwaysSearchPolicy methodsFor!
  140199.  
  140200. compare: operand1 with: operand2
  140201.     "Answer whether the <Object>, operand1, is considered equivalent to the <Object> argument,
  140202.     operand2, by this search policy."
  140203.  
  140204.     ^true!
  140205.  
  140206. hash: operand
  140207.     "Answer a suitable hash value for the <Object>, operand, under this search policy.
  140208.     Implementation Note: Since the objects compared are always considered equal, 
  140209.     we must use the same hash value for all objects."
  140210.  
  140211.     ^1!
  140212.  
  140213. stbSaveOn: anSTBOutFiler 
  140214.     "Output the singleton receiver to anSTBOutFiler."
  140215.  
  140216.     anSTBOutFiler saveObject: self as: (STBSingletonProxy for: SearchPolicy using: #always)! !
  140217.  
  140218. CaseInsensitiveSearchPolicy comment:
  140219. 'CaseInsensitiveSearchPolicy is for configuring pluggable collections and models of strings to use case-insensitive equality based search and comparisons, i.e. using #sameAs: and the #hash of the lowercased equivalent of the string.
  140220.  
  140221. N.B. Unlike other SearchPolicy classes, instances of this class are only appropriate for comparing and searching collections of strings, or objects which can be represented as strings (i.e. implementors of #asString).
  140222. '!
  140223. !CaseInsensitiveSearchPolicy methodsFor!
  140224.  
  140225. compare: operand1 with: operand2
  140226.     "Answer whether the <Object>, operand1, is considered equivalent to the <Object> argument,
  140227.     operand2, by this search policy."
  140228.  
  140229.     ^operand1 asString sameAs: operand2 asString!
  140230.  
  140231. hash: operand
  140232.     "Answer a suitable hash value for the <Object>, operand, under this search policy."
  140233.  
  140234.     ^operand asString asLowercase hash!
  140235.  
  140236. keyAtValue: value in: collection ifAbsent: operation
  140237.     "Answer the <Object> key of the <Object> argument, value in the keyed
  140238.     collection, collection, using the receiver's search policy. If there is no such 
  140239.     value, answer the result of evaluating the <niladicValuable>, operation.
  140240.     The reverse mapping identity search operation is used: The collection argument
  140241.     must respond to #keysAndValuesDo: (there is no keyedCollection protocol
  140242.     defined at present)."
  140243.  
  140244.     | comperand |
  140245.     comperand := value asString.
  140246.     collection keysAndValuesDo: [:k :v | (self compare: v asString with: comperand) ifTrue: [^k]].
  140247.     ^operation value
  140248. !
  140249.  
  140250. stbSaveOn: anSTBOutFiler 
  140251.     "Output the singleton receiver to anSTBOutFiler."
  140252.  
  140253.     anSTBOutFiler saveObject: self
  140254.         as: (STBSingletonProxy for: SearchPolicy using: #caseInsensitive)! !
  140255.  
  140256. CompiledMethodSearchPolicy comment:
  140257. 'CompiledMethodSearchPolicy is a specialised <searchPolicy> to be used in conjunction with collections of <CompiledMethod>s where one wishes to compare by class and selector only. This is used in the development system for most method lists.'!
  140258. !CompiledMethodSearchPolicy class methodsFor!
  140259.  
  140260. current
  140261.     "Answer the singleton instance of the receiver."
  140262.  
  140263.     Current isNil ifTrue: [Current := self new].
  140264.     ^Current!
  140265.  
  140266. onPreStripImage
  140267.     "Private - Tidy up the receiver's lazily initialized class vars in preparation for image stripping."
  140268.  
  140269.     self uninitialize!
  140270.  
  140271. uninitialize
  140272.     "Private - Tidy up the receiver in preparation for removal from the system."
  140273.  
  140274.     Current := nil! !
  140275.  
  140276. !CompiledMethodSearchPolicy methodsFor!
  140277.  
  140278. compare: operand1 with: operand2
  140279.     "Answer whether the <CompiledMethod>, operand1, is considered equivalent to the 
  140280.     <CompiledMethod> argument, operand2, by this search policy (which considers two
  140281.     method to be the same if they are for the same class and have the same selector)."
  140282.  
  140283.     ^operand1 == operand2 or: [
  140284.         operand1 methodClass == operand2 methodClass
  140285.             and: [operand1 selector == operand2 selector]]!
  140286.  
  140287. stbSaveOn: anSTBOutFiler 
  140288.     "Output the singleton receiver to anSTBOutFiler."
  140289.  
  140290.     anSTBOutFiler saveObject: self as: (STBSingletonProxy for: self class)! !
  140291.  
  140292. EqualitySearchPolicy comment:
  140293. 'EqualitySearchPolicy is for configuring pluggable collections and models to use equality based search and comparisons, i.e. using #= and #hash, etc. Using an instance of this search policy a <PluggableSet> will behave in the same way as a <Set>.'!
  140294. !EqualitySearchPolicy methodsFor!
  140295.  
  140296. compare: operand1 with: operand2
  140297.     "Answer whether the <Object>, operand1, is considered equivalent to the <Object> argument,
  140298.     operand2, by this search policy."
  140299.  
  140300.     ^operand1 = operand2!
  140301.  
  140302. hash: operand max: maximum
  140303.     "Answer a suitable hash value for the <Object>, operand, under this search policy, 
  140304.     between 1 and the <integer>, maximum.
  140305.     Implementation Note: Override to avoid a message send (seems trivial but performance
  140306.     of search policies can be important)."
  140307.  
  140308.     ^operand hash \\ maximum + 1!
  140309.  
  140310. keyAtValue: value in: collection ifAbsent: operation
  140311.     "Answer the <Object> key of the <Object> argument, value in the keyed
  140312.     collection, collection, using the receiver's search policy. If there is no such 
  140313.     value, answer the result of evaluating the <niladicValuable>, operation.
  140314.     The reverse mapping equality search operation is used: The collection argument
  140315.     must respond to #keyAtEqualValue:ifAbsent: (there is no keyedCollection protocol
  140316.     defined at present)."
  140317.  
  140318.     ^collection keyAtEqualValue: value ifAbsent: operation!
  140319.  
  140320. nextIndexOf: anElement in: collection from: start to: stop
  140321.     "Answer the index of the next occurrence of anElement in the <sequencedReadableCollection>
  140322.     argument,  collection, between startIndex and stopIndex inclusive. If there are no such occurrences, 
  140323.     answer 0."
  140324.  
  140325.     ^collection nextIndexOf: anElement from: start to: stop!
  140326.  
  140327. stbSaveOn: anSTBOutFiler 
  140328.     "Output the singleton receiver to anSTBOutFiler."
  140329.  
  140330.     anSTBOutFiler saveObject: self as: (STBSingletonProxy for: SearchPolicy using: #equality)! !
  140331.  
  140332. IdentitySearchPolicy comment:
  140333. 'IdentitySearchPolicy is for configuring pluggable collections and models to use identity based search and comparisons, i.e. using #== and #identityHash, etc. Using an instance of this search policy a <PluggableSet> will behave in the same way as an <IdentitySet>.'!
  140334. !IdentitySearchPolicy methodsFor!
  140335.  
  140336. compare: operand1 with: operand2
  140337.     "Answer whether the <Object>, operand1, is considered equivalent to the <Object> argument,
  140338.     operand2, by this search policy."
  140339.  
  140340.     ^operand1 == operand2!
  140341.  
  140342. hash: operand
  140343.     "Answer a suitable hash value for the <Object>, operand, under this search policy."
  140344.  
  140345.     ^operand identityHash!
  140346.  
  140347. hash: operand max: maximum
  140348.     "Answer a suitable hash value for the <Object>, operand, under this search policy, 
  140349.     between 1 and the <integer>, maximum.
  140350.     Implementation Note: The identityHash range is limited to 16-bits, so we must scale for large 
  140351.     collections to avoid excessive collisions causing a dramatic fall off in performance."
  140352.  
  140353.     ^maximum < 8192
  140354.         ifTrue: [operand identityHash \\ maximum + 1]
  140355.         ifFalse: [(operand identityHash * (maximum bitShift: -12)) \\ maximum + 1]!
  140356.  
  140357. keyAtValue: value in: collection ifAbsent: operation
  140358.     "Answer the <Object> key of the <Object> argument, value in the keyed
  140359.     collection, collection, using the receiver's search policy. If there is no such 
  140360.     value, answer the result of evaluating the <niladicValuable>, operation.
  140361.     The reverse mapping identity search operation is used: The collection argument
  140362.     must respond to #keyAtValue:ifAbsent: (there is no keyedCollection protocol
  140363.     defined at present)."
  140364.  
  140365.     ^collection keyAtValue: value ifAbsent: operation!
  140366.  
  140367. mapClass
  140368.     "Private - Answer the class of <LookupTable> which has a compatible search policy."
  140369.  
  140370.     ^IdentityDictionary!
  140371.  
  140372. nextIndexOf: anElement in: collection from: start to: stop
  140373.     "Answer the index of the next occurrence of anElement in the <sequencedReadableCollection>
  140374.     argument,  collection, between startIndex and stopIndex inclusive. If there are no such occurrences, 
  140375.     answer 0."
  140376.  
  140377.     ^collection nextIdentityIndexOf: anElement from: start to: stop!
  140378.  
  140379. stbSaveOn: anSTBOutFiler 
  140380.     "Output the singleton receiver to anSTBOutFiler."
  140381.  
  140382.     anSTBOutFiler saveObject: self as: (STBSingletonProxy for: SearchPolicy using: #identity)! !
  140383.  
  140384. NeverSearchPolicy comment:
  140385. ''!
  140386. !NeverSearchPolicy methodsFor!
  140387.  
  140388. compare: operand1 with: operand2
  140389.     "Answer whether the <Object>, operand1, is considered equivalent to the <Object> argument,
  140390.     operand2, by this search policy."
  140391.  
  140392.     ^false!
  140393.  
  140394. stbSaveOn: anSTBOutFiler 
  140395.     "Output the singleton receiver to anSTBOutFiler."
  140396.  
  140397.     anSTBOutFiler saveObject: self as: (STBSingletonProxy for: SearchPolicy using: #never)! !
  140398.  
  140399. PluggableSearchPolicy comment:
  140400. 'PluggableSearchPolicy is for configuring pluggable collections and models to use pluggable search and comparison operations, i.e. one can define new search policies as instances of this class without writing a new <SearchPolicy> class, however performance will suffer slightly.'!
  140401. !PluggableSearchPolicy class methodsFor!
  140402.  
  140403. new
  140404.     "Instances of the receiver require that hashing and comparison valuables
  140405.     be supplied - use newCompareBlock:hashBlock:"
  140406.  
  140407.     ^self shouldNotImplement!
  140408.  
  140409. newCompareBlock: discriminator hashBlock: hasher
  140410.     "Answer a new instance of the receiver configured with the <dyadicValuable comparison block,
  140411.     discriminator, and the <monadicValuable> hashing block, hasher."
  140412.  
  140413.     ^super new
  140414.         compareBlock: discriminator hashBlock: hasher! !
  140415.  
  140416. !PluggableSearchPolicy methodsFor!
  140417.  
  140418. compare: operand1 with: operand2
  140419.     "Answer whether the <Object>, operand1, is considered equivalent to the <Object> argument,
  140420.     operand2, by this search policy."
  140421.  
  140422.     ^compareBlock value: operand1 value: operand2
  140423. !
  140424.  
  140425. compareBlock: discriminator hashBlock: hasher
  140426.     "Set the <dynadicValuable> used by receiver to compare object to the
  140427.     argument, discriminator. The discriminator should answer true if its two
  140428.     arguments are considered equivalent under this search policy, else false.
  140429.     Also set the <monadicValuable> used by the receiver to calculate hash values to the
  140430.     argument, hasher. Answer the receiver."
  140431.  
  140432.     compareBlock := discriminator.
  140433.     hashBlock := hasher.
  140434.     ^self!
  140435.  
  140436. hash: operand
  140437.     "Answer a suitable hash value for the <Object>, operand, under this search policy."
  140438.  
  140439.     ^hashBlock value: operand!
  140440.  
  140441. mapClass
  140442.     "Private - Answer the class of <LookupTable> which has a compatible search policy."
  140443.  
  140444.     ^PluggableLookupTable!
  140445.  
  140446. newLookupTable
  140447.     "Answer a new <LookupTable> with the receiver as its search policy."
  140448.  
  140449.     ^self mapClass searchPolicy: self! !
  140450.  
  140451. SymbolStringSearchPolicy comment:
  140452. 'SymbolStringSearchPolicy is for configuring pluggable collections and models of <String>s or <Symbol>s such that the same sequence of characters compare as equal, regardless of whether the sequence is stored in a Symbol or a String. Normally Symbols are not considered equal to Strings even when they contain the same characters.
  140453.  
  140454. N.B. Unlike most other SearchPolicy classes, instances of this class are only appropriate for comparing and searching collections of Symbols and Strings (the objects to be compared must implement #hashCharacters and #trueCompare:).'!
  140455. !SymbolStringSearchPolicy class methodsFor!
  140456.  
  140457. current
  140458.     "Answer the singleton instance of the receiver."
  140459.  
  140460.     Current isNil ifTrue: [Current := self new].
  140461.     ^Current!
  140462.  
  140463. onPreStripImage
  140464.     "Private - Tidy up the receiver's lazily initialized class vars in preparation for image stripping."
  140465.  
  140466.     self uninitialize!
  140467.  
  140468. uninitialize
  140469.     "Private - Tidy up the receiver in preparation for removal from the system."
  140470.  
  140471.     Current := nil! !
  140472.  
  140473. !SymbolStringSearchPolicy methodsFor!
  140474.  
  140475. compare: operand1 with: operand2
  140476.     "Answer whether the <Object>, operand1, is considered equivalent to the <Object> argument,
  140477.     operand2, by this search policy."
  140478.  
  140479.     ^(operand1 trueCompare: operand2) == 0
  140480. !
  140481.  
  140482. hash: operand
  140483.     "Answer a suitable hash value for the <Object>, operand, under this search policy."
  140484.  
  140485.     ^operand hashCharacters!
  140486.  
  140487. stbSaveOn: anSTBOutFiler 
  140488.     "Output the singleton receiver to anSTBOutFiler."
  140489.  
  140490.     anSTBOutFiler saveObject: self as: (STBSingletonProxy for: self class)! !
  140491.  
  140492. AssociationSearchPolicy comment:
  140493. 'AssocationSearchPolicy is a specialized <EqualitySearchPolicy> for searching homogeneous collections of Associations by equality.
  140494.  
  140495. Association has traditionally implemented #hash as the has of its key only, and this leads to poor lookup performance in a standard <Set> where there are a lot of Associations with equal keys. This search policy can be used with <PluggableSet> and <PluggableLookupTable> to ameliorate this problem.'!
  140496. !AssociationSearchPolicy class methodsFor!
  140497.  
  140498. current
  140499.     "Answer the singleton sub-instance of the receiver which supports a search policy
  140500.     based on equality."
  140501.  
  140502.     Current isNil ifTrue: [Current := super new].
  140503.     ^Current!
  140504.  
  140505. onPreStripImage
  140506.     "Private - Tidy up the receiver's lazily initialized class vars in preparation for image stripping."
  140507.  
  140508.     self uninitialize!
  140509.  
  140510. uninitialize
  140511.     "Private - Tidy up the receiver in preparation for removal from the system."
  140512.  
  140513.     Current := nil! !
  140514.  
  140515. !AssociationSearchPolicy methodsFor!
  140516.  
  140517. hash: operand
  140518.     "Answer a hash value for the <Assocation>, operand, which takes account
  140519.     of the value as well as the key (historically Association>>hash has answered the
  140520.     hash of its key only, which makes it a poor Set element if a lot of the keys are the
  140521.     same)."
  140522.  
  140523.     ^operand key hash bitXor: operand value hash!
  140524.  
  140525. hash: operand max: maximum
  140526.     "Answer a suitable hash value for the <Object>, operand, under this search policy, 
  140527.     between 1 and the <integer>, maximum. If maximum is a significant proportion
  140528.     of the range of hash values generated, then the result should be scaled to distribute
  140529.     evenly between 1 and maximum in order to avoid generating excessive collisions at
  140530.     the low end of the range."
  140531.  
  140532.     ^(operand key hash bitXor: operand value hash) \\ maximum + 1!
  140533.  
  140534. stbSaveOn: anSTBOutFiler 
  140535.     "Output the singleton receiver to anSTBOutFiler."
  140536.  
  140537.     anSTBOutFiler saveObject: self as: (STBSingletonProxy for: self class)! !
  140538.  
  140539. BootSessionManager comment:
  140540. 'BootSessionManager is the class of <SessionManager>s installed when the Dolphin image is booting from sources.'!
  140541. !BootSessionManager class methodsFor!
  140542.  
  140543. imageExtension
  140544.     "Answer the suffix for an executable image file"
  140545.  
  140546.     ^'img'! !
  140547.  
  140548. !BootSessionManager methodsFor!
  140549.  
  140550. basicTertiaryStartup
  140551.     "Perform tertiary system startup operations."
  140552.  
  140553.     "Nothing to do - this SessionManager should never be installed on startup anyway?"!
  140554.  
  140555. keepAlive
  140556.     !
  140557.  
  140558. logError: anException
  140559.     "Append details about the unhandled exception, anException, to the session error log.
  140560.     Ignored for runtime systems, but it is suggested that subclasses perform some appropriate
  140561.     form of error logging. Here we are using the VM's dump facility to append a short
  140562.     but informative log each time an error occurs, to <exe name>.ERRORS."
  140563.  
  140564.     VMLibrary default dump: anException description path: nil stackDepth: -1 walkbackDepth: -1!
  140565.  
  140566. main
  140567.     self stdout 
  140568.         nextPutAll: 'Dolphin Smalltalk Boot'; cr; 
  140569.         nextPutAll: 'Copyright (c) Object Arts Ltd, 1997-2002.'; cr; cr;
  140570.         nextPutAll: 'Loading boot part 2 script...'; cr; flush.
  140571.  
  140572.     self class sourceManager fileIn: 'Boot Part 2.st'.
  140573. !
  140574.  
  140575. openConsoleStreams
  140576.     "Private - Open the standard console I/O streams. Note that the actual
  140577.     C-runtime library stdin/stdout/stderr streams will be correctly set up so
  140578.     that it is possible to use the CRT stdio functions such as puts(), printf(), etc.
  140579.     Implementation Note: A boot session is run by the GUI stub and therefore
  140580.     the CRT streams will not have been initialized."
  140581.  
  140582.     stdioStreams isNil ifTrue: [ | crt |
  140583.         crt := CRTLibrary default.
  140584.         stdioStreams := Array 
  140585.             with: (StdioFileStream fromHandle: (CRTLibrary default 
  140586.                     connectDescriptor: 0
  140587.                     toWinStdHandle: STD_INPUT_HANDLE
  140588.                     mode: 'rt'))
  140589.             with: (StdioFileStream fromHandle: (CRTLibrary default 
  140590.                     connectDescriptor: 1 
  140591.                     toWinStdHandle: STD_OUTPUT_HANDLE
  140592.                     mode: 'wt'))
  140593.             with: (StdioFileStream fromHandle: (CRTLibrary default 
  140594.                     connectDescriptor: 2
  140595.                     toWinStdHandle: STD_ERROR_HANDLE
  140596.                     mode: 'wt'))]!
  140597.  
  140598. openSources
  140599.     "Private - Open the source files with names derived from the current image path."
  140600.  
  140601.     self class sourceManager openSources: self imagePath!
  140602.  
  140603. primaryStartup
  140604.     "Private - Perform very early startup actions.
  140605.     We must initialize the source manager fairly early on so that we can use the change log."
  140606.  
  140607.     self basicPrimaryStartup.
  140608.     self openSources!
  140609.  
  140610. productDetails
  140611.     "Private - Answers a five element<Array> describing this version of the development environment
  140612.  
  140613.     1. <readableString> Product name 
  140614.     2. <readableString> Short product name
  140615.     3. <Float> Version number
  140616.     4. <readableString> Version special
  140617.     5. <Integer> Image patch level"
  140618.  
  140619.     productDetails isNil ifTrue: [
  140620.         productDetails := VMLibrary default defaultProductDetails ].
  140621.     ^productDetails!
  140622.  
  140623. productDetails: anArray
  140624.     "Private - Sets the receiver's product details to a five element<Array> 
  140625.     describing this version of the development environment"
  140626.  
  140627.     productDetails := anArray!
  140628.  
  140629. productVersion
  140630.     "Answers the <Float> version of this product"
  140631.     
  140632.     ^VMLibrary default defaultProductDetails at: 3
  140633. !
  140634.  
  140635. saveImageDefault
  140636.     "Save an image of the current session to the default persistant store (whatever that is)."
  140637.  
  140638.     self class sourceManager flushChanges.
  140639.     self snapshot.!
  140640.  
  140641. shellClosed: aShell
  140642.     "Inform the receiver that aShell has been closed"
  140643. !
  140644.  
  140645. shellOpened: aShell
  140646.     "Inform the receiver that aShell has been opened"
  140647.  
  140648.  
  140649. !
  140650.  
  140651. shutdown
  140652.     "Perform shutdown operations before the VM puts out the lights."
  140653.  
  140654.     self trace: 'Shutting down boot session', String lineDelimiter.
  140655.     super shutdown!
  140656.  
  140657. snapshot
  140658.     "Private - Performs a snapshot of the current image."
  140659.     
  140660.     Notification signal: 'Saving booted image to ', self imageFileName.
  140661.     self snapshot: self imageFileName!
  140662.  
  140663. startUI
  140664.     "Start up the input loop/message loop (instruct InputState appropriate depending on whether
  140665.     this is a GUI or console session)."
  140666.  
  140667.     self inputState consoleStartup!
  140668.  
  140669. trace: aString
  140670.     "Append aString to the trace device.
  140671.     Use the stderr stream if available, otherwise the OS debug trace device (implemented in superclass)"
  140672.  
  140673.     stdioStreams isNil
  140674.         ifTrue: [super trace: aString]
  140675.         ifFalse: [self stderr nextPutAll: aString; flush]!
  140676.  
  140677. unhandledException: anException
  140678.     "Private - Pop-up a walkback with details from the argument, anException."
  140679.  
  140680.     | title topFrame |
  140681.  
  140682.     "Attempt to log the error, but don't allow it to become recursive (#logError: does not
  140683.     raise an exception if it fails)"
  140684.     self logError: anException.
  140685.  
  140686.     [title := anException description] 
  140687.         on: Error do: [:e | title := anException class name].
  140688.  
  140689.     topFrame := anException raisingFrame.
  140690.  
  140691.     "In a development session, we'll be wanting a walkback..."
  140692.     topFrame process walkback: title topFrame: topFrame resumable: anException isResumable
  140693. ! !
  140694.  
  140695. ConsoleSessionManager comment:
  140696. 'ConsoleSessionManager is the class of <SessionManager>s used to manage the life-cycle of a deployed console, or command-line, application.
  140697.  
  140698. The main entry point hook is the #main method. The program logic can be implemented entirely in #main in the case of simple applications, but it is recommended that a separate application class be constructed, with additional support classes as required. A console application normally exits when the #main method returns.
  140699.  
  140700. The standard C I/O streams, stdin/stdout/stderr, can be accessed by sending the #stdin, #stdout, and #stderr messages to the session. The resulting streams implement the full Smalltalk Stream protocols, and can be used interchangeably with normal streams. Furthermore these are connected to the actual C runtime library streams of the same name, and so calling C runtime library functions such as printf() (either from within Dolphin, or a DLL called from Dolphin) will result in output to the same console window. Note that these streams (and the console) are actually usable from <GUISessionManager>s too, which is useful for testing and debugging console applications from within the develoopment environment. The class side #run method provides a simple way to fire up a console application in the development environment, although the session manager is not actually installed.
  140701.  
  140702. A simple example of a console application is the command line version of the Hello World sample. Try it out be evaluating:
  140703.  
  140704.     CommandLineHelloWorld run    "Watch out for the appearance of the console, and press ENTER to continue"
  140705. '!
  140706. !ConsoleSessionManager class methodsFor!
  140707.  
  140708. icon
  140709.     "Answers an Icon that can be used to represent this class"
  140710.  
  140711.     ^Icon fromId: 3 in: ShellLibrary default!
  140712.  
  140713. isRuntime
  140714.     "Answer whether the sessions managed by instances of the receiver are for a run-time applications 
  140715.     (as opposed to development, or abstract)."
  140716.  
  140717.     ^true!
  140718.  
  140719. new
  140720.     "Answer a new instance of the receiver. This is permited for ConsoleSessionManagers in order
  140721.     to facilitate testing."
  140722.  
  140723.     ^self basicNew initialize;
  140724.         initializeFromSessionManager: self current;
  140725.         yourself!
  140726.  
  140727. run
  140728.     "Test this console program.
  140729.         self run
  140730.     "
  140731.     | consoleAlreadyOpen |
  140732.  
  140733.     "As this is used from the development environment, we must make sure that a console has been allocated.
  140734.      If we opened it just for this test, then we want to close it before finishing"
  140735.     consoleAlreadyOpen := self current openConsole.
  140736.     self new main.
  140737.     consoleAlreadyOpen ifFalse: [self current closeConsole]! !
  140738.  
  140739. !ConsoleSessionManager methodsFor!
  140740.  
  140741. allocConsole
  140742.     "Private - Open a console for this session."
  140743.  
  140744.     "We already have one"!
  140745.  
  140746. basicTertiaryStartup
  140747.     "Perform fundamental tertiary system startup operations."
  140748.  
  140749.     self embeddedStartup!
  140750.  
  140751. freeConsole
  140752.     "Private - Close (actually detach from) the console for this session.
  140753.     In the case of a console app, we didn't allocate the console, so we don't
  140754.     free it (even though to do so would be harmless)."
  140755.  
  140756.     self assert: [consoleHandler isNil]!
  140757.  
  140758. isEmbedded
  140759.     "Answer whether the session is running, or should be started, in 'embedded' 
  140760.     mode (i.e. headless). This is an embedded session in so far as it has no GUI."
  140761.  
  140762.     ^true!
  140763.  
  140764. logError: anException
  140765.     "Append details about the unhandled exception, anException, to the session error log.
  140766.     Ignored for runtime systems, but it is suggested that subclasses perform some appropriate
  140767.     form of error logging. The VM crash dump is one such facility (it doesn't cause a crash and
  140768.     can be used for generating a VM walkback to the crash dump file at any time)"
  140769.  
  140770.     | stderrBad |
  140771.     stderrBad := false.
  140772.     [ | target |
  140773.         target := self stderr.
  140774.         target
  140775.             next: 40 put: $-;
  140776.             nextPutAll: 'Unhandled exception - '.
  140777.         anException printTraceOn: target.
  140778.         target next: 40 put: $-; cr; cr
  140779.     ] on: Error do: [:e | stderrBad := true].
  140780.  
  140781.     "If we were unable to write to stderr for some reason, then produce a crash dump"
  140782.     (stderrBad 
  140783.             or: [false])     "Enable this to record a detailed stack trace for every error that occurs (not just crashes)"
  140784.         ifTrue: [VMLibrary default crashDump: anException description]!
  140785.  
  140786. onCloseConsole
  140787.     "The user is attempting to close the console window. Act accordingly (by shutting
  140788.     down the application)."
  140789.  
  140790.     self quit: -1!
  140791.  
  140792. openConsoleStreams
  140793.     "Private - Open the standard console I/O streams.
  140794.     In this case we attach to pre-existing C run-time library stdio streams, as they
  140795.     will be correctly set up."
  140796.  
  140797.     stdioStreams isNil ifTrue: [ | crt |
  140798.         crt := CRTLibrary default.
  140799.         stdioStreams := Array new: 3.
  140800.         0 to: 2 do: [:i | stdioStreams at: i+1 put: (StdioFileStream fromHandle: (crt getStdHandle: i))]].
  140801.  
  140802.     "Note that all the above streams should be in text/translating mode"!
  140803.  
  140804. startUI
  140805.     "Start up the input loop/message loop (instruct InputState appropriate depending on whether
  140806.     this is a GUI or console session)."
  140807.  
  140808.     self inputState consoleStartup!
  140809.  
  140810. unhandledException: anException
  140811.     "Private - The unhandled Exception, anException, occurred in the active Process.
  140812.     Depending on the user response and the resumability of the exception, either 
  140813.     resume or terminate the process.
  140814.     Note: The exception response protocol (#resume, #pass, #outer, #exit, etc)
  140815.     can only be sent to an Exception inside a handler block (i.e. the second
  140816.     argument to BlockClosure>>on:do:)."
  140817.  
  140818.     self logError: anException.
  140819.     "Note that unlike a GUI session (which is event driven), we kill the entire session in the event
  140820.       of an unhandled Error. If you are writing a multi-threaded, headless, server then you may 
  140821.       want to override this behaviour to just #terminate the faulting <Process>."
  140822.     anException isUserResumable ifFalse: [
  140823.         self quit: -1].
  140824.     ^anException! !
  140825.  
  140826. GUISessionManager comment:
  140827. 'GUISessionManager is the class of <SessionManager>s used to manage the life-cycle of a graphical (as opposed to command line, or console) application.
  140828.  
  140829. Note that Dolphin GUI applications can access the console and standard I/O streams, but a separate console window will be opened.
  140830.  
  140831. Instance Variables:
  140832.     savedWindows    <UndefinedObject>, or <Array> of <ViewState>. Saved state of open windows (image save/load)
  140833.  
  140834. '!
  140835. !GUISessionManager class methodsFor!
  140836.  
  140837. icon
  140838.     "Answers an Icon that can be used to represent this class"
  140839.  
  140840.     ^Icon window!
  140841.  
  140842. isConsoleApplication
  140843.     "Answer whether the sessions managed by instances of the receiver are for a console application 
  140844.     (as opposed to a GUI application, which is a completely separate thing under Windows)."
  140845.  
  140846.     ^false! !
  140847.  
  140848. !GUISessionManager methodsFor!
  140849.  
  140850. basicShutdown
  140851.     "Private - Perform basic system shutdown operations, just prior to the VM putting
  140852.     out the lights."
  140853.  
  140854.     self windowSystemShutdown.
  140855.     super basicShutdown!
  140856.  
  140857. basicTertiaryStartup
  140858.     "Perform tertiary system startup operations."
  140859.  
  140860.     self logComment: self applicationName, ' started'.
  140861.  
  140862.     [self isEmbedded
  140863.         ifTrue: [self embeddedStartup]
  140864.         ifFalse: [self restoreWindowState]
  140865.     ] ensure: [self clearWindowState]!
  140866.  
  140867. clearSessionState
  140868.     "Clear any state saved down for a image save which is will not be required until that saved image is
  140869.     rehydrated."
  140870.  
  140871.     self clearWindowState!
  140872.  
  140873. clearWindowState
  140874.     "Private - Clear the state of the top-level windows."
  140875.  
  140876.     savedWindows := nil!
  140877.  
  140878. openConsoleStreams
  140879.     "Private - Open the standard console I/O streams. Note that the actual
  140880.     C-runtime library stdin/stdout/stderr streams will be correctly set up so
  140881.     that it is possible to use the CRT stdio functions such as puts(), printf(), etc."
  140882.  
  140883.     stdioStreams isNil ifTrue: [ | crt |
  140884.         crt := CRTLibrary default.
  140885.         stdioStreams := Array 
  140886.             with: (StdioFileStream fromHandle: (CRTLibrary default 
  140887.                     connectDescriptor: 0
  140888.                     toWinStdHandle: STD_INPUT_HANDLE
  140889.                     mode: 'rt'))
  140890.             with: (StdioFileStream fromHandle: (CRTLibrary default 
  140891.                     connectDescriptor: 1 
  140892.                     toWinStdHandle: STD_OUTPUT_HANDLE
  140893.                     mode: 'wt'))
  140894.             with: (StdioFileStream fromHandle: (CRTLibrary default 
  140895.                     connectDescriptor: 2
  140896.                     toWinStdHandle: STD_ERROR_HANDLE
  140897.                     mode: 'wt'))]!
  140898.  
  140899. restoreWindowState
  140900.     "Private - Restore the state of the persistant top-level windows."
  140901.  
  140902.     savedWindows notNil ifTrue: [
  140903.         savedWindows do: [:each | 
  140904.             [each restore] on: ProcessTermination do: [:e |]]]!
  140905.  
  140906. saveSessionState
  140907.     "Save down any session state that needs to be preserved and which is not automatically
  140908.     preserved by a normal image save. Examples would be externally managed resources
  140909.     such as Windows."
  140910.  
  140911.     self saveWindowState!
  140912.  
  140913. saveWindowState
  140914.     "Private - Save the state of the top-level windows."
  140915.  
  140916.     savedWindows := self topLevelWindows reverse collect: [ :w | ViewState recordStateOf: w forRecreate: false]!
  140917.  
  140918. showSplash
  140919.     "Show a splash screen for this session. Can be overidden in subclasses to bring up
  140920.     an appropriate splash." 
  140921.  
  140922.  
  140923. !
  140924.  
  140925. startUI
  140926.     "Start up the input loop/message loop (instruct InputState appropriate depending on whether
  140927.     this is a GUI or console session)."
  140928.  
  140929.     self windowSystemStartup.
  140930.     self inputState guiStartup
  140931. !
  140932.  
  140933. tertiaryStartup
  140934.     "Perform GUI  system tertiary startup"
  140935.  
  140936.     "Pop-up the splash screen before the windows are restored"
  140937.     (self cmdLineFlags includes: 'nosplash') ifFalse: [ self showSplash ].
  140938.  
  140939.     super tertiaryStartup.
  140940. !
  140941.  
  140942. topLevelWindows
  140943.     "Answer a collection of the top-level windows which are currently open."
  140944.  
  140945.     ^self inputState topLevelWindows select: [:w | w isPersistentView]!
  140946.  
  140947. windowSystemShutdown
  140948.     "Private - Terminate the window system to releave resources prior to exit.
  140949.     Much of this isn't strictly necessary in a 32-bit application, but it's nice
  140950.     to wipe."
  140951.  
  140952.     | env |
  140953.     env := self class environment.
  140954.     #(View Canvas GraphicsTool) do: [:s |
  140955.         env at: s ifPresent: [:c | c onExit]]!
  140956.  
  140957. windowSystemStartup
  140958.     "Private - Perform window system startup operations."
  140959.  
  140960.     | env |
  140961.     env := self class environment.
  140962.     #(Canvas GraphicsTool Clipboard View RichText) do: [:s |
  140963.         env at: s ifPresent: [:c | c onStartup]]! !
  140964.  
  140965. DevelopmentSessionManager comment:
  140966. ''!
  140967. !DevelopmentSessionManager class methodsFor!
  140968.  
  140969. icon
  140970.     "Answer an icon for the receiver and its instances."
  140971.  
  140972.     ^Icon fromId: '!!APPLICATION'!
  140973.  
  140974. imageExtension
  140975.     "Answer the suffix for an image file"
  140976.  
  140977.     ^'img'!
  140978.  
  140979. new
  140980.     "The receiver is a singleton class, so the new instance is assigned as the current
  140981.     singleton, and answered."
  140982.  
  140983.     self current: self basicNew.
  140984.     ^self current! !
  140985.  
  140986. !DevelopmentSessionManager methodsFor!
  140987.  
  140988. advanceImageVersionMinor
  140989.     "Advance the minor component of the images version number."
  140990.  
  140991.     self imageVersionMinor: self imageVersionMinor + 1.!
  140992.  
  140993. allowDuplicate
  140994.     "It would appear that the image associated with this session is already open. Take action
  140995.     appropriate to the policies of the receiver. Ask the user whether to continue the session."
  140996.  
  140997.     ^MessageBox new taskModal;
  140998.         caption: self applicationName;
  140999. "        icon: self icon;"
  141000.         warning;
  141001.         defaultButton: 2;
  141002.         confirm: 
  141003. ('The image %1 is already open. You can continue, but you risk corrupting the change log.%n 
  141004. Are you sure that you really want to open the same image again?' formatWith: self imageFileName)
  141005. !
  141006.  
  141007. applicationName
  141008.     "Answers the <readableString> name of this Dolphin product"
  141009.     
  141010.     ^self productDetails at: 1
  141011.  
  141012. !
  141013.  
  141014. applicationShortName
  141015.     "Answer a <readableString> which is the abbreviated application name."
  141016.  
  141017.     ^self productDetails at: 2!
  141018.  
  141019. backupOnImageSave
  141020.     "Answer whether the image should be backed up (i.e. the old .img file is renamed to .bak when the new .img
  141021.     file is successfully written). Note that this will slow down the operation quite a bit, as the OS has to do a lot
  141022.     more juggling."
  141023.  
  141024.     backupOnImageSave isNil ifTrue: [backupOnImageSave := super backupOnImageSave].
  141025.     ^backupOnImageSave!
  141026.  
  141027. backupOnImageSave: aBoolean
  141028.     "Set whether the image should be backed up (i.e. the old .img file is renamed to .bak when the new .img
  141029.     file is successfully written)."
  141030.  
  141031.     backupOnImageSave := aBoolean!
  141032.  
  141033. canPlaySounds
  141034.     ^SmalltalkSystemShell playSystemSounds!
  141035.  
  141036. closeAllHelp
  141037.     "Close all HTML Help windows"
  141038.  
  141039.     HTMLHelpLibrary htmlHelpCloseAll!
  141040.  
  141041. defaultEducationCentreContentsTopic
  141042.     "Private - Answer the default contents topic for the web based Education Centre"
  141043.  
  141044.     ^'helpcontents1'.!
  141045.  
  141046. defaultEducationCentreRootUrl
  141047.     "Private - Answer the default web-based root URL of the Education Centre"
  141048.  
  141049.     ^'%1/Lib/EducationCentre%2!!d!!/htm' formatWith: self objectArtsUrl with: self productVersion truncated.!
  141050.  
  141051. educationCentreContentsTopic
  141052.     "Private - Answer the contents URL of the Education Centre"
  141053.  
  141054.     ^self educationCentreKeyValue isNil
  141055.         ifTrue: [ self defaultEducationCentreContentsTopic ]
  141056.         ifFalse: [ 'helpcontents1' ].
  141057.  
  141058. !
  141059.  
  141060. educationCentreKeyValue
  141061.     "Private - Answer the value the Education Centre registry key (or nil if there is none)"
  141062.  
  141063.     ^(RegKey localMachineRoot: #read)
  141064.         at: (self productRegistryKey , '\EducationCentre')
  141065.         ifPresent: [:key | key value].
  141066. !
  141067.  
  141068. educationCentreRootUrl
  141069.     "Private - Answer the root URL of the Education Centre"
  141070.  
  141071.     | rootUrl |
  141072.     rootUrl := self educationCentreKeyValue.
  141073.     rootUrl isNil ifTrue: [
  141074.         "No Education Centre has been installed use default on OA site"
  141075.         rootUrl := self defaultEducationCentreRootUrl ].            
  141076.     ^rootUrl.
  141077.  
  141078. !
  141079.  
  141080. expiredImageTextId
  141081.     "Answer the resource ID of the expired image text."
  141082.  
  141083.     ^516!
  141084.  
  141085. free
  141086.     "Free any artifacts of the current session.
  141087.     WARNING: This may disable the development system, so use carefully."
  141088.  
  141089.     self mainShellClass free.
  141090. !
  141091.  
  141092. getInstallationDirectory
  141093.     "Private - Determine and answer the installation directory."
  141094.  
  141095.     | folder |
  141096.     Smalltalk developmentSystem isOAD ifTrue: [^self imageBase].
  141097.     "Note we use a read-only key because some users do not have the rights to open a read/write key under HKLM"
  141098.     folder := (RegKey localMachineRoot: #read) at: self productRegistryKey
  141099.                 ifPresent: [:key | key value].
  141100.     folder isNil 
  141101.         ifTrue: 
  141102.             ["Otherwise try the path to the VM"
  141103.  
  141104.             folder := File splitPathFrom: VMLibrary default fileName].
  141105.     ^File appendPathDelimiter: folder!
  141106.  
  141107. handleOpenArguments
  141108.     "Private - Handle any -open command line arguments"
  141109.  
  141110.     (self cmdLineFlags select: [:each | each beginsWith: 'open']) do: [:each |
  141111.         self open: (each rightString: each size-'open' size) ]!
  141112.  
  141113. imageStamp
  141114.     "Answer the TimeStamp at which the image was saved."
  141115.  
  141116.     ^imageStamp!
  141117.  
  141118. imageStamp: aTimeStamp
  141119.     "Private - Set the TimeStamp marking the date and time of the image."
  141120.  
  141121.     imageStamp := aTimeStamp!
  141122.  
  141123. imageVersionMinor: anInteger
  141124.     "Private - Set the minor component of the image's version Integer."
  141125.  
  141126.     ^VMLibrary default registryAt: #ImageVersionMinor put: anInteger!
  141127.  
  141128. initializeFromSessionManager: oldSessionManager
  141129.     "Private - The receiver has taken take over as the current session
  141130.     manager from oldSessionManager. This is an opportunity to transfer
  141131.     state information from the replaced manager."
  141132.  
  141133.     super initializeFromSessionManager: oldSessionManager.
  141134.     self productDetails: oldSessionManager productDetails!
  141135.  
  141136. installationDirectory
  141137.     "Answer the directory String of the directory the Dolphin development system is installed.
  141138.         SessionManager current installationDirectory.
  141139.     "
  141140.  
  141141.     installationDirectory isNil 
  141142.         ifTrue: [installationDirectory := self getInstallationDirectory].
  141143.     ^installationDirectory!
  141144.  
  141145. isBinaryLooseMethodInstallationAllowed
  141146.     "Private - Answer true if loose method can be installed into the image by a BinaryPackage.
  141147.     By default the development environment does not allow this to avoid the development
  141148.     browsers becoming confused by such methods. 
  141149.  
  141150.     If you wish to debug BinaryPackages that make contain loose methods you may temporarily
  141151.     change this method to answer true but BEWARE; the loose methods will appear to be owned
  141152.     by the normal source packages. If you accidentally save these source packages they will
  141153.     contain these methods"
  141154.  
  141155.     ^false!
  141156.  
  141157. isDLL
  141158.     "Private - Answer whether the receiver is a shared library, as opposed to an application.
  141159.     Implementation Note: The development image may be started under the control of another
  141160.     application (e.g. the browser plug-in, or as in-proc COM component) and so we must
  141161.     dynamically decide whether we are a DLL or not."
  141162.  
  141163.     ^self outer notNull!
  141164.  
  141165. isEmbedded
  141166.     "Answer whether the session is running, or should be started, in 'embedded' 
  141167.     mode (i.e. headless). In the case of a development session we only want to
  141168.     do this if the /Embedding flag was specifically used, since in other cases we
  141169.     want to display the UI regardless in order that the development tools are
  141170.     available for debugging, etc."
  141171.  
  141172.     ^self isEmbedding!
  141173.  
  141174. keepAlive
  141175.     "The inputState has determined that there are no live windows.
  141176.     For safety, we bring up a new system shell in a development session, as this
  141177.     will help to recover (in particular) from situations where a bad image has been
  141178.     saved down. Even this may not work if insufficient Session startup was achieved
  141179.     before the error occurred."
  141180.  
  141181.     self isEmbedded 
  141182.         ifTrue: [super keepAlive]
  141183.         ifFalse: [self mainShellClass reset]!
  141184.  
  141185. logComment: aString
  141186.     "Append the informational message, aString, to the development change log."
  141187.  
  141188.     self class sourceManager logComment: aString!
  141189.  
  141190. logError: anException 
  141191.     "Append details about the unhandled exception, anException, to the session error log.
  141192.     N.B. MUST NOT RAISE ANY EXCEPTIONS OTHERWISE RECURSIVE WALKBACK MAY RESULT."
  141193.  
  141194.     
  141195.     [| f |
  141196.     f := FileStream write: self errorLogName mode: #append.
  141197.     f
  141198.         print: TimeStamp current;
  141199.         nextPutAll: ': Unhandled exception - '.
  141200.     anException printTraceOn: f.
  141201.     f
  141202.         next: 100 put: $-;
  141203.         cr;
  141204.         cr;
  141205.         close] 
  141206.             on: Error
  141207.             do: 
  141208.                 [:e | 
  141209.                 [e toTrace    "Suppress errors writing to log"] on: Error
  141210.                     do: 
  141211.                         [:e2 | 
  141212.                         "Couldn't even write a trace message"
  141213.  
  141214.                         ]]!
  141215.  
  141216. main
  141217.     "Handle any open requests from the command line."
  141218.  
  141219.     self handleOpenArguments!
  141220.  
  141221. mainShellClass
  141222.     "Answer the class of the application's main window (a <Shell> presenter)."
  141223.  
  141224.     ^Smalltalk at: #SmalltalkSystemShell ifAbsent: [TranscriptShell]!
  141225.  
  141226. objectArtsUrl
  141227.     "Private - Answer the URL of the Object Arts home page"
  141228.  
  141229.     ^'http://www.object-arts.com'.!
  141230.  
  141231. onExit
  141232.     "Perform pre-termination actions."
  141233.  
  141234.     "Close any outstanding help windows"
  141235.     self closeAllHelp.
  141236.  
  141237.     ^super onExit!
  141238.  
  141239. onQuit: anInteger
  141240.     "Handle a request to exit - the argument is the exit code.
  141241.     Answer whether the quit request is accepted."
  141242.  
  141243.     #todo. "This should probably be generic for all session managers"
  141244.     self trigger: #aboutToEndSession.
  141245.  
  141246.     (anInteger < 0 or: [self isEmbedded])
  141247.         ifFalse: [
  141248.             MessageBox new
  141249.                 taskModal;
  141250.                 confirm: 
  141251. 'You are about to exit Dolphin Smalltalk
  141252. Do you wish to save the image?'
  141253.                 onYes: [self saveImage]
  141254.                 onNo: []
  141255.                 onCancel: [^false].
  141256.             "This would be the point to get Views to prompt to save changes in
  141257.             session which was not able to save the image."
  141258.         ].
  141259.  
  141260.     "If the user is agreed, go ahead and commit suicide"
  141261.     ^super onQuit: anInteger!
  141262.  
  141263. onUnhandledWarning: aWarning
  141264.     "The unhandled Warning, aWarning, occurred in the active Process.
  141265.     Override the superclass implementation in order to give the user
  141266.     the opportunity to bring up a walkback and go into the debugger."
  141267.  
  141268.     | response |
  141269.     response := aWarning abortRetryOrIgnore.
  141270.     response == #retry
  141271.         ifTrue: [self unhandledException: aWarning]
  141272.         ifFalse: [
  141273.             response == #abort ifTrue: [Processor activeProcess terminate]].
  141274.     "ignore - Resume execution"!
  141275.  
  141276. open: filename
  141277.     "Private - Opens a file identified by the <readableString> filename in this instance of
  141278.     the development environment"
  141279.  
  141280.     | openMsg ext |
  141281.     ext := (File splitExtensionFrom: filename) asUppercase.
  141282.     openMsg := ##(LookupTable new
  141283.         at: 'PAC' put: #openPackage:;
  141284.         at: 'PAX' put: #openPackage:;
  141285.         at: 'CLS' put: #openWorkspace:;
  141286.         at: 'ST' put: #openWorkspace:;
  141287.         yourself) at: ext ifAbsent: [
  141288.             ^MessageBox notify: 'Unable to open ', filename ].
  141289.     self perform: openMsg with: filename 
  141290. !
  141291.  
  141292. openPackage: filename
  141293.     "Private - Opens a file identified by the <readableString> filename as a package file"
  141294.  
  141295.     | package name devsys |
  141296.     devsys := Smalltalk developmentSystem.
  141297.     name := File splitStemFrom: filename.
  141298.     package := devsys packageManager packageNamed: name
  141299.                 ifNone: [devsys packageManager install: filename].
  141300.     package browse!
  141301.  
  141302. openSources
  141303.     "Private - Open the source files with names derived from the current image path."
  141304.  
  141305.     self class sourceManager openSources: self imagePath!
  141306.  
  141307. openWorkspace: filename
  141308.     "Private - Opens a file identified by the <readableString> filename as a workspace file"
  141309.     
  141310.     Smalltalk developmentSystem workspaceClass filename: filename
  141311.     !
  141312.  
  141313. patchLevel
  141314.     "Answer the current patch level of this image"
  141315.  
  141316.     ^self productDetails at: 5!
  141317.  
  141318. patchLevel: anInteger
  141319.     "Private - Set the current patch level of this image to anInteger"
  141320.  
  141321.     anInteger > self patchLevel ifTrue: [
  141322.         self productDetails at: 5 put: anInteger.
  141323.         Notification signal: 'Image now at Patch Level ', anInteger displayString ] !
  141324.  
  141325. playImageSaveSound
  141326.     self canPlaySounds 
  141327.         ifTrue: 
  141328.             [(Sound fromFile: 'Resources\ImageSave.wav' usingLocator: FileLocator installRelative) woof]!
  141329.  
  141330. playStartupSound
  141331.     self canPlaySounds 
  141332.         ifTrue: 
  141333.             [(Sound fromFile: 'Resources\Startup.wav' usingLocator: FileLocator installRelative) woof]!
  141334.  
  141335. preStart
  141336.     "Private - Sent before the secondary level startup code has a chance to run.
  141337.     This allows us to user-defined actions after the system source is available,
  141338.     but before the windowing and process systems, etc, have been started."
  141339.  
  141340.     (File exists: PreStartFile) ifTrue: [
  141341.         (MessageBox new taskModal; confirm: 'File in "', PreStartFile, '"?')
  141342.             ifTrue: [self class sourceManager fileIn: PreStartFile]]!
  141343.  
  141344. primaryStartup
  141345.     "Private - Perform very early startup actions.
  141346.     We must initialize the source manager fairly early on so that we can use the change log."
  141347.  
  141348.     installationDirectory := nil.
  141349.     self basicPrimaryStartup.
  141350.     self openSources!
  141351.  
  141352. productDetails
  141353.     "Private - Answers a five element<Array> describing this version of the development environment
  141354.  
  141355.     1. <readableString> Product name 
  141356.     2. <readableString> Short product name
  141357.     3. <Float> Version number
  141358.     4. <readableString> Version special
  141359.     5. <Integer> Image patch level"
  141360.  
  141361.     productDetails isNil ifTrue: [
  141362.         productDetails := VMLibrary default defaultProductDetails ].
  141363.     ^productDetails!
  141364.  
  141365. productDetails: anArray
  141366.     "Private - Sets the receiver's product details to a five element<Array> 
  141367.     describing this version of the development environment"
  141368.  
  141369.     productDetails := anArray.
  141370.     installationDirectory := nil!
  141371.  
  141372. productMajorVersion
  141373.     "Answers the <Integer> major version number of this development image."
  141374.     
  141375.     ^self productVersion truncated
  141376. !
  141377.  
  141378. productRegistryKey
  141379.     "Private - Answers the <readableString> registry key of this product"
  141380.     
  141381.     ^'Software\Object Arts\Dolphin Smalltalk %1' formatWith: self productRegistryVersion printString
  141382. !
  141383.  
  141384. productRegistryVersion
  141385.     "Private - Answers the <Float> version this product suitable for looking up our
  141386.     installation in the registry. Currently we drop hundreths in the version number."
  141387.     
  141388.     "Note: we don't use #roundTo: because of <Float>rounding errors"
  141389.     ^((self productVersion *10) truncated / 10) asFloat
  141390. !
  141391.  
  141392. productVersion
  141393.     "Answers the <Float> version of this product"
  141394.     
  141395.     ^self productDetails at: 3
  141396. !
  141397.  
  141398. productVersionSpecial
  141399.     "Answers the <readableString> special version of this product"
  141400.     
  141401.     ^self productDetails at: 4
  141402. !
  141403.  
  141404. registeredSerialNumber
  141405.     "Private - Answers the primary <readableString> registered serial number for this product. If the serial number cannot
  141406.     be found or if the serial number data found in the registry was written for a different machine then signal an
  141407.     InvalidInstallationError."
  141408.  
  141409.     ^self registeredSerialNumbers at: 1.!
  141410.  
  141411. registeredSerialNumbers
  141412.     "Private - Answers the two element array of  <readableString> registered serial numbers for this product. 
  141413.     If the serial numbers cannot be found or if the serial number data found in the registry was written for a different machine then signal an
  141414.     InvalidInstallationError."
  141415.  
  141416.     "Win95 cannot have binary default values"
  141417.     | snRegKey snData snKey |
  141418.     snKey := OSVERSIONINFO current isWin95 ifTrue: ['Win95'] ifFalse: [''].
  141419.     [snRegKey := (RegKey userRoot at: self serialNumberRegistryKey) valueAt: snKey] 
  141420.         on: NotFoundError
  141421.         do: [:x | InvalidInstallationError signal].
  141422.     snRegKey isEmpty ifTrue: [InvalidInstallationError signal].
  141423.     
  141424.     [| snTrustedData |
  141425.     snTrustedData := Object fromBinaryStoreBytes: snRegKey.
  141426.     snData := Object fromBinaryStoreBytes: (snTrustedData 
  141427.                         validDataPublishedBy: ObjectArtsInstallerCertificate new)] 
  141428.             on: TrustedDataError
  141429.             do: [:x | InvalidInstallationError signal].
  141430.     (snData at: 3) = VMLibrary default getMachineId 
  141431.         ifFalse: [InvalidInstallationError signal].
  141432.     ^snData copyFrom: 1 to: 2!
  141433.  
  141434. ≤A &,í¥7-ë¼₧#ä3╧┴Γ╬√┼╠Å■≤½rQ¡║┘!!Γû7DûKAj#an Æ
  141435. \tf[½y6░«!!■▀@ ¡äúî■┴@╫um|i╘╗-3╜ë╘QM╒û|»O÷sà ■T]I>εv▀╩QòQ4╝3╫ç└ΓÄ═σg÷ç╙n
  141436. ⌐┌R]Γs_â√2₧╠Q╙S:▀K▀╫,u°çk╠ik┘¡▒Θ)┌∞╧≈ε_²┤c]╖ε╜BmGC&0çΓ)1KU╧╪₧ßOl0VI╔├Bß3ÿ█╘í╝;╣·«■¼ç╨α&ß,-=C┐iεqQ÷±`╙ZRΓ_╦┴ÜêδZÄ╙ƒªy│%9┤2┤t°º±┘<Ge\}╩p╘╩c√Y⌡'═Fifƒ :╨╗µY╤Γ·D4(xq┬Z▌└▄Eà╚Y3φ┐ZÜÖÖ═)*YA∞σ)8â^Æⁿ╤┴╛ú┌│╥┼ª5⌡K«áDB%α╚╥SΩ8┐cX∞╖ñ╞ƒ9ûö╡ܱMQÑφíi╥    0 ô█O╝ÿ∩₧╡╝M╩ÜS∙xMI├╛«╒!!ï░ª║ÄHαª$ »≥┘▐ÖC╧.┴┤╦C2╬Θ·±î⌡zLû╬&ⁿ+0₧▀`I¬a╕α╡φ═S╘;Éαéäò╧
  141437. UH▄`*Zè]ªⁿ┴S░█▀¬1╖<HB¢RH'à╜▒|î{ì─Q{fΓâΓ$█ⁿΘ+╔B█#.■≡▌╡▀}rn≥▓δH<Å\3|Fδ:αg¼│╨ZTí»┐╖@ºΘ├╖jM)üq_⌡Cs¬TZ1    ƒ√╣ƒ}«KOòv £»2lπ∞╙φ╠SlM&\≥1ƒ¥¬c╩èT╙Σ┤m╒á╪"╒b3L÷µ╛M▌Ä╗δy┼σ    ²"1 ∙Ünoñ▄ú∙«ÉW┌ÇKÑÆG─Φ┼~K╞Q⌠1}Æ<>╒┘JtY\há┤σ«≤0ΣYII▌≤~╦╘ ?ìú!!zW±bΘ]p╪ú≤ !!╜D.!
  141438.  
  141439. resetPatchLevel
  141440.     "Private - Set the current patch level of this image to 0"
  141441.  
  141442.     self productDetails at: 5 put: 0.
  141443. !
  141444.  
  141445. saveImageDefault
  141446.     "Private - Snapshot the running image to the path from which it was started,
  141447.     marking the log with a timestamp.
  141448.  
  141449.     If the source files are available then we can just flush the changes and write the
  141450.     image. If we do not have the source files then we have to call the full
  141451.     saveImage: method which will create these files."
  141452.  
  141453.     self class sourceManager hasSources
  141454.         ifTrue: [
  141455.             self class sourceManager flushChanges.
  141456.             self snapshot; logComment: 'Image saved']
  141457.         ifFalse: [self saveImageTo: self imageFileName]!
  141458.  
  141459. saveImageTo: filePath
  141460.     "Private - Snapshot to filePath.img, marking the log with a timestamp and
  141461.     copying sources files.
  141462.     N.B. Use the public entry point #saveImage: to save an image to a new path.
  141463.  
  141464.     Take a special interest if we do not currently have the source files available.
  141465.     This will be the case when we load from a .exe. In this case we generate some
  141466.     suitable empty source files. We also have to mark methods so that they know
  141467.     they have lost any reference to information in a .sml file."
  141468.  
  141469.     | oldImagePath |
  141470.     oldImagePath := self imagePath.
  141471.  
  141472.     "Now save image and swap over sources. Take care to end up with a good sources and imagePath"
  141473.     
  141474.     [self imagePath: filePath.
  141475.     self class sourceManager copyAndReopenSources: filePath.
  141476.     self
  141477.         snapshot: self imageFileName;
  141478.         logComment: 'Image saved to ' , filePath] 
  141479.             ifCurtailed: 
  141480.                 ["Attempt to return to the old state so sources & stuff are intact before showing
  141481.         the user the problem."
  141482.  
  141483.                 
  141484.                 [self
  141485.                     imagePath: oldImagePath;
  141486.                     openSources] on: Error
  141487.                         do: [:anError | anError resignalAsWarning]]!
  141488.  
  141489. saveSessionState
  141490.     "Save down any session state that needs to be preserved and which is not automatically
  141491.     preserved by a normal image save. Examples would be externally managed resources
  141492.     such as Windows."
  141493.  
  141494.     self imageStamp: TimeStamp current.
  141495.     super saveSessionState.!
  141496.  
  141497. serialNumberRegistryKey
  141498.     "Private - Answers the <readableString> registry key of this serial number for this product"
  141499.  
  141500.     ^'%1\%2\Serial Number' formatWith: self productRegistryKey with: self applicationShortName !
  141501.  
  141502. showSplash
  141503.     "Show a splash screen for this session."
  141504.  
  141505.     | splashClass |
  141506.     (splashClass := self splashShellClass) isNil ifFalse: [
  141507.          (splashClass new) 
  141508.             when: #viewClosed send: #tipOfTheDayAtStartup to: Smalltalk developmentSystem;
  141509.             showTimed]
  141510. !
  141511.  
  141512. shutdown
  141513.     "Perform development system shutdown actions."
  141514.  
  141515.     super shutdown.
  141516.     self class sourceManager onExit!
  141517.  
  141518. snapshot
  141519.     "Private - Performs a snapshot of the current image."
  141520.     
  141521.     self snapshot: self imageFileName!
  141522.  
  141523. snapshot: fileName
  141524.     "Save the current image to fileName. Advance the minor component of
  141525.     the image version."
  141526.  
  141527.     ^self
  141528.         advanceImageVersionMinor;
  141529.         primSnapshot: fileName
  141530.             backup: self backupOnImageSave
  141531.             type: 0!
  141532.  
  141533. splashShellClass
  141534.     "Private - Answer the class of splash shell to display on startup, or nil for no splash."
  141535.  
  141536.     ^Smalltalk at: #DolphinSplash ifAbsent: []!
  141537.  
  141538. tertiaryStartup
  141539.     "Perform development system tertiary startup (e.g. ensure 
  141540.     SmalltalkSystemShell is available)."
  141541.  
  141542.     super tertiaryStartup.
  141543.  
  141544.     "Flush any output accumulated in the transcript buffer during startup."
  141545.     TranscriptShell current flush.
  141546.  
  141547.     self mainShellClass onStartup.!
  141548.  
  141549. trace: aString
  141550.     "Append aString to the trace stream."
  141551.  
  141552.     (self traceStream)
  141553.         nextPutAll: aString;
  141554.         flush!
  141555.  
  141556. traceStream
  141557.     ^(self isHeadless not and: [Transcript notNil]) ifTrue: [Transcript] ifFalse: [Trace]!
  141558.  
  141559. unhandledException: anException
  141560.     "Private - Pop-up a walkback with details from the argument, anException."
  141561.  
  141562.     | title topFrame |
  141563.  
  141564.     "Attempt to log the error, but don't allow it to become recursive (#logError: does not
  141565.     raise an exception if it fails)"
  141566.     self logError: anException.
  141567.  
  141568.     [title := anException description] 
  141569.         on: Error do: [:e | title := anException class name].
  141570.  
  141571.     topFrame := anException raisingFrame.
  141572.  
  141573.     "In a development session, we'll be wanting a walkback..."
  141574.     topFrame process walkback: title topFrame: topFrame resumable: anException isResumable
  141575. !
  141576.  
  141577. versionInfo
  141578.     "Answer the <VersionInfo> for this session, extracted from the host executable."
  141579.  
  141580.     ^VMLibrary default versionInfo
  141581. !
  141582.  
  141583. versionString
  141584.     "Answers a String containing the current version of the system"
  141585.  
  141586.     | patch verString special |
  141587.     verString := '%1 %2' formatWith: self applicationShortName with: self productVersion displayString.
  141588.     patch := self patchLevel.
  141589.     patch = 0 ifFalse: [
  141590.         verString := verString, '.', patch displayString ].
  141591.     special := self productVersionSpecial.
  141592.     special isEmpty ifFalse: [verString := verString, ' ', special].
  141593.     ^verString! !
  141594.  
  141595. RuntimeSessionManager comment:
  141596. 'RuntimeSessionManager is the class of <SessionManager>s used to manage the life-cycle of a deployed graphical application.
  141597.  
  141598. The main entry point hook is the #main method, and typically one opens one''s main application window there, processing any command line arguments held in the receiver''s ''argv'' instance variable. See one of the samples such as Notepad for an example.
  141599.  
  141600. '!
  141601. !RuntimeSessionManager class methodsFor!
  141602.  
  141603. deploy: fileName
  141604.     "Create an application image with a new instance of this class installed as
  141605.     its <RuntimeSessionManager>. For example:
  141606.  
  141607.         HelloWorldSessionManager deploy: 'HelloWorld'
  141608.     or
  141609.         RegEditSessionManager deploy: 'DRegEdit'
  141610.  
  141611.     The image can be run by Dolphin.exe (e.g. by double-clicking the .img file).
  141612.     Note that because the application is started by Dolphin.exe the first command
  141613.     line argument will be the image path.
  141614.  
  141615.     N.B. The resulting image is for personal use only as it will include all the 
  141616.     development system classes, which must NOT be shipped to third parties.
  141617.     Dolphin Professional has the ability to create true executable (.EXE) applications 
  141618.     which are of a minimal size (<500Kb for Hello World) that can be legally 
  141619.     shipped to third parties. Dolphin Pro can also create console (command line)
  141620.     applications."
  141621.  
  141622.     | sesh path devSesh |
  141623.     SessionManager current saveImage.
  141624.     self inputState destroyAllWindows; pumpMessages; processDeferredActions; purgeDeadWindows.
  141625.     devSesh := self installNew.
  141626.     sesh := SessionManager current.
  141627.     path := File fullPathOf: (File default: fileName extension: devSesh imageExtension).
  141628.     sesh saveImage: path.
  141629.     MessageBox 
  141630.         notify: ('%1 application image saved to ''%2''. The image can be launched by Dolphin.exe.
  141631.  
  141632. N.B. The resulting application is for personal use only and must NOT be shipped to third parties because it contains the development classes.'
  141633.                         formatWith: sesh applicationName with: path)
  141634.         caption: self name.
  141635.     sesh quit.
  141636. !
  141637.  
  141638. icon
  141639.     "Answers an Icon that can be used to represent this class"
  141640.  
  141641.     ^self mainShellClass icon!
  141642.  
  141643. isRuntime
  141644.     "Answer whether the sessions managed by instances of the receiver are for a run-time applications 
  141645.     (as opposed to development, or abstract)."
  141646.  
  141647.     ^true!
  141648.  
  141649. mainShellClass
  141650.     "Answer the class of the application's main window (a <Shell> presenter).
  141651.     This should be overridden by subclasses, and would be a subclass responsibility
  141652.     method if it were not for the need to support instance based deployment."
  141653.  
  141654.     ^Smalltalk at: #Shell!
  141655.  
  141656. new
  141657.     "Private -  Use #createExecutable:"
  141658.  
  141659.     self shouldNotImplement! !
  141660.  
  141661. !RuntimeSessionManager methodsFor!
  141662.  
  141663. initializeFromSessionManager: oldSessionManager
  141664.     "Private - The receiver has taken take over as the current session
  141665.     manager from oldSessionManager. This is an opportunity to transfer
  141666.     state information from the replaced manager."
  141667.  
  141668.     super initializeFromSessionManager: oldSessionManager.
  141669.     ResourceAccessor ensureAccessorsAreInternal.
  141670.     resourceManager := oldSessionManager resourceManager.!
  141671.  
  141672. mainShellClass
  141673.     "Answer the class of the application's main window (a <Shell> presenter)."
  141674.  
  141675.     ^self class mainShellClass! !
  141676.  
  141677. CalculatorSessionManager comment:
  141678. ''!
  141679. !CalculatorSessionManager class methodsFor!
  141680.  
  141681. mainShellClass
  141682.     "Answer the class of the application's main window (a <Shell> presenter)."
  141683.  
  141684.     ^Calculator! !
  141685.  
  141686. !CalculatorSessionManager methodsFor!
  141687.  
  141688. main
  141689.     "Start up the Dolphin Calculator sample application"
  141690.  
  141691.     self mainShellClass show! !
  141692.  
  141693. HelloWorldSessionManager comment:
  141694. 'A session manager to illustrate how to start an application within #tertiaryStartup processing. This is part of the Application Deployment Kit tutorial.'!
  141695. !HelloWorldSessionManager class methodsFor!
  141696.  
  141697. mainShellClass
  141698.     "Answer the class of the application's main window (a <Shell> presenter)."
  141699.  
  141700.     ^HelloWorld! !
  141701.  
  141702. !HelloWorldSessionManager methodsFor!
  141703.  
  141704. main
  141705.     "Start up the Hello World application"
  141706.  
  141707.     self mainShellClass new 
  141708.         show position: 0@0! !
  141709.  
  141710. NotepadSessionManager comment:
  141711. ''!
  141712. !NotepadSessionManager class methodsFor!
  141713.  
  141714. mainShellClass
  141715.     "Answer the class of the application's main window (a <Shell> presenter)."
  141716.  
  141717.     ^Notepad! !
  141718.  
  141719. !NotepadSessionManager methodsFor!
  141720.  
  141721. main
  141722.     "Start the Notepad application."
  141723.  
  141724.     | pad |
  141725.     pad := self mainShellClass show.
  141726.     self argc > 1 ifTrue: [pad openFile: (self argv at: 2)]! !
  141727.  
  141728. RegEditSessionManager comment:
  141729. ''!
  141730. !RegEditSessionManager class methodsFor!
  141731.  
  141732. mainShellClass
  141733.     "Answer the class of the application's main window (a <Shell> presenter)."
  141734.  
  141735.     ^RegEdit! !
  141736.  
  141737. !RegEditSessionManager methodsFor!
  141738.  
  141739. main
  141740.     "Start up the Dolphin Registry Editor sample application"
  141741.  
  141742.     self mainShellClass show! !
  141743.  
  141744. SlidingBallSessionManager comment:
  141745. ''!
  141746. !SlidingBallSessionManager class methodsFor!
  141747.  
  141748. mainShellClass
  141749.     "Answer the class of the application's main window (a <Shell> presenter)."
  141750.  
  141751.     ^SlidingBallDemo! !
  141752.  
  141753. !SlidingBallSessionManager methodsFor!
  141754.  
  141755. main
  141756.     "Start up the sample application"
  141757.  
  141758.     self mainShellClass new show! !
  141759.  
  141760. VideoLibrarySessionManager comment:
  141761. ''!
  141762. !VideoLibrarySessionManager class methodsFor!
  141763.  
  141764. mainShellClass
  141765.     "Answer the class of the application's main window (a <Shell> presenter)."
  141766.  
  141767.     ^VideoLibraryShell! !
  141768.  
  141769. !VideoLibrarySessionManager methodsFor!
  141770.  
  141771. main
  141772.     "Start up the Dolphin Registry Editor sample application"
  141773.  
  141774.     self mainShellClass show! !
  141775.  
  141776. WebBrowserSessionManager comment:
  141777. ''!
  141778. !WebBrowserSessionManager class methodsFor!
  141779.  
  141780. mainShellClass
  141781.     "Answer the class of the application's main window (a <Shell> presenter)."
  141782.  
  141783.     ^WebBrowserShell! !
  141784.  
  141785. !WebBrowserSessionManager methodsFor!
  141786.  
  141787. main
  141788.     "Start the WebBrowser application."
  141789.  
  141790.     | pad |
  141791.     pad := self mainShellClass show.
  141792.     self argc > 1 ifTrue: [pad openUrl: (self argv at: 2)]!
  141793.  
  141794. objectArtsUrl
  141795.     "Private - Answer the URL of the Object Arts home page"
  141796.  
  141797.     ^'http://www.object-arts.com'.! !
  141798.  
  141799. NotificationSignal comment:
  141800. ''!
  141801. !NotificationSignal class methodsFor!
  141802.  
  141803. icon
  141804.     "Answers an Icon that can be used to represent this class"
  141805.  
  141806.     ^Notification icon! !
  141807.  
  141808. !NotificationSignal methodsFor!
  141809.  
  141810. defaultAction: exception
  141811.     "Private - Perform the default action for the raised incarnation of the receiver,
  141812.     exception, as it has not been handled.
  141813.     Implementation Note: forward to the SessionManager for application specific handling."
  141814.  
  141815.     ^SessionManager current onUnhandledNotification: exception!
  141816.  
  141817. defaultResumption
  141818.     "Private - Answer the default setting for the receiver's resumable flag."
  141819.  
  141820.     ^true!
  141821.  
  141822. exceptionClass
  141823.     "Private - Answer the class of Exception to be raised when the receiver
  141824.     is signalled."
  141825.  
  141826.     ^RaisedNotificationSignal! !
  141827.  
  141828. WarningSignal comment:
  141829. ''!
  141830. !WarningSignal class methodsFor!
  141831.  
  141832. icon
  141833.     "Answers an Icon that can be used to represent this class"
  141834.  
  141835.     ^Warning icon! !
  141836.  
  141837. !WarningSignal methodsFor!
  141838.  
  141839. defaultAction: exception
  141840.     "Private - Perform the default action for the raised incarnation of the receiver,
  141841.     exception, as it has not been handled.
  141842.     Implementation Note: forward to the SessionManager for application specific handling."
  141843.  
  141844.     ^SessionManager current onUnhandledWarning: exception! !
  141845.  
  141846. SmalltalkSystemFolder comment:
  141847. ''!
  141848. !SmalltalkSystemFolder class methodsFor!
  141849.  
  141850. description: aStringDescription
  141851.     "Answers an instance of the receiver with a default icon and aStringDescription"
  141852.     
  141853.     ^self icon: self icon description: aStringDescription
  141854.     !
  141855.  
  141856. icon
  141857.     "Answers an Icon that can be used to represent this class"
  141858.  
  141859.     ^##(self) defaultIcon!
  141860.  
  141861. icon: anIcon description: aStringDescription
  141862.     "Answers an instance of the receiver with anIcon and aStringDescription.
  141863.     Implementation Note: Use a message to avoid holding onto the problem
  141864.     of a block continuing to reference the last pair of arguments."
  141865.     
  141866.     ^super icon: anIcon description: aStringDescription 
  141867.         openBlock: (Message selector: #expand:)
  141868.     ! !
  141869.  
  141870. !SmalltalkSystemFolder methodsFor!
  141871.  
  141872. isFolder
  141873.     "Answers true if the receiver can hold contents"
  141874.  
  141875.     ^true! !
  141876.  
  141877. AMLSourceFiler comment:
  141878. ''!
  141879. !AMLSourceFiler methodsFor!
  141880.  
  141881. emitCategoriesOfClass: aClass 
  141882.     "Private - Emit a chunk to source stream to reclassify the <Class>, aClass, in all its existing 
  141883.     categories."
  141884.  
  141885.     self shouldNotImplement!
  141886.  
  141887. emitCategoriesOfMethod: aCompiledMethod 
  141888.     "Private - Append an entry to the source stream to reclassify the <CompiledMethod>, 
  141889.     aCompiledMethod, in all its current method categories."
  141890.  
  141891.     stream nextPutAll: '<Method categories for '; 
  141892.         print: aCompiledMethod; 
  141893.         nextPutAll: ' would go here if I knew how to emit them>'; cr
  141894. !
  141895.  
  141896. emitCategoriesOfMethods: methods 
  141897.     "Emit source that associates the <CompiledMethod>s in the <collection>, methods, with their
  141898.     current categories."
  141899.  
  141900.     "Do nothing - the categories are output with the rest of the method definition in AML"!
  141901.  
  141902. emitCommentOfClass: aClass 
  141903.     "Private - Emit a chunk which defines the comment for the <Class>, aClass, to source stream."
  141904.  
  141905.     | comment |
  141906.     comment := aClass comment.
  141907.     comment isEmpty ifTrue: [^self].
  141908.     stream 
  141909.         nextPut: $".
  141910.     (comment identityIncludes: $") 
  141911.         ifTrue: 
  141912.             [comment do: 
  141913.                     [:character | 
  141914.                     stream nextPut: character.
  141915.                     "Double up embedded chunk markers"
  141916.                     character == $" ifTrue: [stream